2019年4月15日月曜日

pythonの環境管理

取り急ぎ、メモだけ。
$ pyenv versions
* system (set by /Users/hisawo/.pyenv/version)
$ pyenv install anaconda3-5.3.1
Installing Anaconda3-5.3.1-MacOSX-x86_64.sh...
Installed Anaconda3-5.3.1-MacOSX-x86_64.sh to /Users/hisawo/.pyenv/versions/anaconda3-5.3.1

$ pyenv versions
* system (set by /Users/hisawo/.pyenv/version)
  anaconda3-5.3.1
$
[続きを読む]
取り急ぎ、メモだけ。
$ pyenv versions
* system (set by /Users/hisawo/.pyenv/version)
$ pyenv install anaconda3-5.3.1
Installing Anaconda3-5.3.1-MacOSX-x86_64.sh...
Installed Anaconda3-5.3.1-MacOSX-x86_64.sh to /Users/hisawo/.pyenv/versions/anaconda3-5.3.1

$ pyenv versions
* system (set by /Users/hisawo/.pyenv/version)
  anaconda3-5.3.1
$
$ pyenv activate anaconda3-5.3.1
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(anaconda3-5.3.1) $ export PYENV_VIRTUALENV_DISABLE_PROMPT=1
(anaconda3-5.3.1) $
(anaconda3-5.3.1) $ conda create -n pythonstan
Solving environment: done


==> WARNING: A newer version of conda exists. <==
  current version: 4.5.11
  latest version: 4.6.11

Please update conda by running

    $ conda update -n base -c defaults conda



## Package Plan ##

  environment location: /Users/hisawo/.pyenv/versions/anaconda3-5.3.1/envs/pythonstan


Proceed ([y]/n)? y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate pythonstan
#
# To deactivate an active environment, use
#
#     $ conda deactivate

(anaconda3-5.3.1) $ conda info -e
# conda environments:
#
base                     /Users/hisawo/.pyenv/versions/anaconda3-5.3.1
pythonstan               /Users/hisawo/.pyenv/versions/anaconda3-5.3.1/envs/pythonstan

(anaconda3-5.3.1) $
(anaconda3-5.3.1) $ conda activate pythonstan
(pythonstan) (anaconda3-5.3.1) $ conda install -c conda-forge pystan
Solving environment: done


==> WARNING: A newer version of conda exists. <==
  current version: 4.5.11
  latest version: 4.6.11

Please update conda by running

    $ conda update -n base -c defaults conda



## Package Plan ##

  environment location: /Users/hisawo/.pyenv/versions/anaconda3-5.3.1/envs/pythonstan

  added / updated specs:
    - pystan


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    llvm-lto-tapi-4.0.1        |       h6701bc3_0        11.7 MB  conda-forge
    xz-5.2.4                   |    h1de35cc_1001         268 KB  conda-forge
    wheel-0.33.1               |           py37_0          34 KB  conda-forge
    compiler-rt-4.0.1          |       h5487866_0         963 KB  conda-forge
    clangxx-4.0.1              |       hc9b4283_0          10 KB
    cython-0.29.6              |   py37h0a44026_0         2.0 MB  conda-forge
    python-3.7.3               |       h0d93f26_0        20.7 MB  conda-forge
    sqlite-3.26.0              |    h1765d9f_1001         2.4 MB  conda-forge
    pystan-2.17.1.0            |py37h1702cab_1003        14.2 MB  conda-forge
    setuptools-41.0.0          |           py37_0         620 KB  conda-forge
    libgfortran-3.0.1          |                0         495 KB  conda-forge
    cctools-895                |       h7512d6f_0         1.5 MB  conda-forge
    tk-8.6.9                   |    ha441bb4_1001         3.2 MB  conda-forge
    zlib-1.2.11                |    h1de35cc_1004         101 KB  conda-forge
    clangxx_osx-64-4.0.1       |      h22b1bf0_11           7 KB
    pip-19.0.3                 |           py37_0         1.8 MB  conda-forge
    cycler-0.10.0              |             py_1           8 KB  conda-forge
    libffi-3.2.1               |    h6de7cb9_1006          43 KB  conda-forge
    freetype-2.10.0            |       h24853df_0         881 KB  conda-forge
    tornado-6.0.2              |   py37h01d97ff_0         635 KB  conda-forge
    clang_osx-64-4.0.1         |      h1ce6c1d_11           7 KB
    python-dateutil-2.8.0      |             py_0         219 KB  conda-forge
    libpng-1.6.36              |    ha441bb4_1000         306 KB  conda-forge
    ncurses-6.1                |    h0a44026_1002         1.3 MB  conda-forge
    kiwisolver-1.0.1           |py37h04f5b5a_1002          56 KB  conda-forge
    six-1.12.0                 |        py37_1000          22 KB  conda-forge
    clang-4.0.1                |       h662ec87_0        73.7 MB  conda-forge
    llvm-4.0.1                 |       hc748206_0       136.7 MB  conda-forge
    bzip2-1.0.6                |    h1de35cc_1002         148 KB  conda-forge
    pyparsing-2.4.0            |             py_0          55 KB  conda-forge
    readline-7.0               |    hcfe32e1_1001         393 KB  conda-forge
    ld64-274.2                 |       h7c2db76_0         2.6 MB  conda-forge
    ------------------------------------------------------------
                                           Total:       276.8 MB

The following NEW packages will be INSTALLED:

    bzip2:           1.0.6-h1de35cc_1002        conda-forge
    ca-certificates: 2019.3.9-hecc5488_0        conda-forge
    cctools:         895-h7512d6f_0             conda-forge
    certifi:         2019.3.9-py37_0            conda-forge
    clang:           4.0.1-h662ec87_0           conda-forge
    clang_osx-64:    4.0.1-h1ce6c1d_11
    clangxx:         4.0.1-hc9b4283_0
    clangxx_osx-64:  4.0.1-h22b1bf0_11
    compiler-rt:     4.0.1-h5487866_0           conda-forge
    cycler:          0.10.0-py_1                conda-forge
    cython:          0.29.6-py37h0a44026_0      conda-forge
    freetype:        2.10.0-h24853df_0          conda-forge
    kiwisolver:      1.0.1-py37h04f5b5a_1002    conda-forge
    ld64:            274.2-h7c2db76_0           conda-forge
    libblas:         3.8.0-4_openblas           conda-forge
    libcblas:        3.8.0-4_openblas           conda-forge
    libcxx:          4.0.1-h579ed51_0
    libcxxabi:       4.0.1-hebd6815_0
    libffi:          3.2.1-h6de7cb9_1006        conda-forge
    libgfortran:     3.0.1-0                    conda-forge
    liblapack:       3.8.0-4_openblas           conda-forge
    libpng:          1.6.36-ha441bb4_1000       conda-forge
    llvm:            4.0.1-hc748206_0           conda-forge
    llvm-lto-tapi:   4.0.1-h6701bc3_0           conda-forge
    matplotlib:      3.0.3-py37_0               conda-forge
    matplotlib-base: 3.0.3-py37hf043ca5_0       conda-forge
    ncurses:         6.1-h0a44026_1002          conda-forge
    numpy:           1.16.2-py37hbb3c62a_1      conda-forge
    openblas:        0.3.5-h436c29b_1001        conda-forge
    openssl:         1.1.1b-h01d97ff_2          conda-forge
    pip:             19.0.3-py37_0              conda-forge
    pyparsing:       2.4.0-py_0                 conda-forge
    pystan:          2.17.1.0-py37h1702cab_1003 conda-forge
    python:          3.7.3-h0d93f26_0           conda-forge
    python-dateutil: 2.8.0-py_0                 conda-forge
    readline:        7.0-hcfe32e1_1001          conda-forge
    setuptools:      41.0.0-py37_0              conda-forge
    six:             1.12.0-py37_1000           conda-forge
    sqlite:          3.26.0-h1765d9f_1001       conda-forge
    tk:              8.6.9-ha441bb4_1001        conda-forge
    tornado:         6.0.2-py37h01d97ff_0       conda-forge
    wheel:           0.33.1-py37_0              conda-forge
    xz:              5.2.4-h1de35cc_1001        conda-forge
    zlib:            1.2.11-h1de35cc_1004       conda-forge

Proceed ([y]/n)? y


Downloading and Extracting Packages
llvm-lto-tapi-4.0.1  | 11.7 MB   | ##################################### | 100%
xz-5.2.4             | 268 KB    | ##################################### | 100%
wheel-0.33.1         | 34 KB     | ##################################### | 100%
compiler-rt-4.0.1    | 963 KB    | ##################################### | 100%
clangxx-4.0.1        | 10 KB     | ##################################### | 100%
cython-0.29.6        | 2.0 MB    | ##################################### | 100%
python-3.7.3         | 20.7 MB   | ##################################### | 100%
sqlite-3.26.0        | 2.4 MB    | ##################################### | 100%
pystan-2.17.1.0      | 14.2 MB   | ##################################### | 100%
setuptools-41.0.0    | 620 KB    | ##################################### | 100%
libgfortran-3.0.1    | 495 KB    | ##################################### | 100%
cctools-895          | 1.5 MB    | ##################################### | 100%
tk-8.6.9             | 3.2 MB    | ##################################### | 100%
zlib-1.2.11          | 101 KB    | ##################################### | 100%
clangxx_osx-64-4.0.1 | 7 KB      | ##################################### | 100%
pip-19.0.3           | 1.8 MB    | ##################################### | 100%
cycler-0.10.0        | 8 KB      | ##################################### | 100%
libffi-3.2.1         | 43 KB     | ##################################### | 100%
freetype-2.10.0      | 881 KB    | ##################################### | 100%
tornado-6.0.2        | 635 KB    | ##################################### | 100%
clang_osx-64-4.0.1   | 7 KB      | ##################################### | 100%
python-dateutil-2.8. | 219 KB    | ##################################### | 100%
libpng-1.6.36        | 306 KB    | ##################################### | 100%
ncurses-6.1          | 1.3 MB    | ##################################### | 100%
kiwisolver-1.0.1     | 56 KB     | ##################################### | 100%
six-1.12.0           | 22 KB     | ##################################### | 100%
clang-4.0.1          | 73.7 MB   | ##################################### | 100%
llvm-4.0.1           | 136.7 MB  | ##################################### | 100%
bzip2-1.0.6          | 148 KB    | ##################################### | 100%
pyparsing-2.4.0      | 55 KB     | ##################################### | 100%
readline-7.0         | 393 KB    | ##################################### | 100%
ld64-274.2           | 2.6 MB    | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(pythonstan) (anaconda3-5.3.1) $
2020-05-11追記:
home brew でインストールしておくパッケージ
  • python
  • python@2
  • python@3.8
  • pyenv
  • pyenv-virtualenv

2013年12月10日火曜日

2013年の #mercurialjp ツイートを解析する

このエントリは Mercurial Advent Calendar 2013 の10日目です。

Mercurialの素晴らしいところの一つは「困ったことがあってもハッシュタグ #mercurialjp をつけてツイートすればすぐに的確なアドバイスをいただける」というコミュニティの強力さだと思ってます。何かあってもすぐにフォローしてもらえる上、内容によっては対応してパッチを本家に投げてもらえるというのは本当に心強い限りです。

そこで『今年の #mercurialjp を振り返る』ということで (「Mercurial Advent CalendarのエントリなのにMercurial自体に触れないなんて、変化球を通り越して敬遠じゃないのか?」という一抹の不安を抱えつつ)、2013年のMercurialトピックを #mercurialjp ツイートを解析*1することで探ってみたいと思います。

まずは前処理から

まずは前処理、元となるデータの作成です。実はこれがデータ解析で一番のキモであり、かつ一番手間のかかるところなのですが、今回は件数もたかが知れているので TwitterのWebページでの検索結果をコピペでテキストファイルに落とし、Emacsの編集機能やキーボードマクロでCSVファイルに加工することにしました。そうやって出来たのがこのファイルです。ちなみに12月に入ってからはAdvent Calendarに関するツイートが多いこともあり、データは1月〜11月で作成しました。これを元に解析していきます。

早速データファイルを R に読み込んで、まずはヒストグラムを作成して月毎のツイート数の推移を見てみましょう。

> data <- read.csv("2013mercurialjp.csv")
> colnames(data)
[1] "name"  "month" "day"   "tweet"
> nrow(data)
[1] 804
> hist(data$month, xlim=c(1,12), breaks=c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5))

総計804ツイート、月によって流量の変化はあるものの、概ね "70ツイート/月" くらいでしょうか。これが今回の材料の全てです。さて、この804ツイートの中にどんなドラマが秘められているのか、探検を始めましょう。

単語の出現頻度を計測する

それではデータを単語に切り分けて*2、出現頻度を集計しましょう。使用するツールは R と、MeCab および RMeCabパッケージ です。名詞、形容詞、動詞で意味を持ちそうな語を抽出し、上位20件を見てみます。

> library(RMeCab)
> mercurialjp <- RMeCabFreq("2013mercurialjp.csv")
file = 2013mercurialjp.csv 
length = 4309 
> 
> words <- mercurialjp[((mercurialjp$Info1 == "名詞" |
+                        mercurialjp$Info1 == "形容詞" |
+                        mercurialjp$Info1 == "動詞") &
+                       (mercurialjp$Info2 != "非自立" &
+                        mercurialjp$Info2 != "数")), ]
> freq = words[ rev(order(words$Freq)), ]
> freq[1:20, ]
            Term Info1    Info2 Freq
627          ","  名詞 サ変接続 1752
612            "  名詞 サ変接続 1465
708            /  名詞 サ変接続 1400
705            .  名詞 サ変接続 1394
283         する  動詞     自立  992
638            #  名詞 サ変接続  886
755             ‏@  名詞 サ変接続  798
2073 mercurialjp  名詞     一般  764
1828 flyingfoozy  名詞     一般  600
632         ","@  名詞 サ変接続  565
1351   Katsunori  名詞     一般  559
1288    FUJIWARA  名詞     一般  559
702            -  名詞 サ変接続  496
720          ://  名詞 サ変接続  444
746            _  名詞 サ変接続  404
2072   mercurial  名詞     一般  259
255         れる  動詞     接尾  249
1971          jp  名詞     一般  248
1886          hg  名詞     一般  231
1930        http  名詞     一般  200
> 

おっと、記号やアクティブユーザのアカウントなどが入ってしまいました……。さてどうやって取り除くかですが、うまい方法が思いつかなないので地道に抽出条件に書き加えました。

> words <- mercurialjp[((mercurialjp$Info1 == "名詞" |
+                        mercurialjp$Info1 == "形容詞" |
+                        mercurialjp$Info1 == "動詞") &
+                       (mercurialjp$Info2 != "非自立" &
+                        mercurialjp$Info2 != "数") &
+                       (mercurialjp$Term != "\",\"" &
+                        mercurialjp$Term != "\"" &
+                        mercurialjp$Term != "/" &
+                        mercurialjp$Term != "." &
+                        mercurialjp$Term != "#" &
+                        mercurialjp$Term != "@" &
+                        mercurialjp$Term != "mercurialjp" &
   :
 (snip)
   :
+                        mercurialjp$Term != ")\"" &
+                        mercurialjp$Term != "?")), ]
> freq = words[ rev(order(words$Freq)), ]
> freq[1:100,]
                 Term  Info1          Info2 Freq
283              する   動詞           自立  992
755                  ‏@   名詞       サ変接続  798
2072        mercurial   名詞           一般  259
255              れる   動詞           接尾  249
1886               hg   名詞           一般  231
300              なる   動詞           自立  194
257              ある   動詞           自立  173
2718         ファイル   名詞           一般  154
1391        Mercurial   名詞           一般  132
3322             場合   名詞       副詞可能  120
1125             設定   名詞       サ変接続  105
294            できる   動詞           自立  105
2805       リビジョン   名詞           一般   94
988              指定   名詞       サ変接続   92
3795               的   名詞           接尾   84
2289          selenic   名詞           一般   83
2055           manual   名詞           一般   79
1105             表示   名詞       サ変接続   78
3643             可能   名詞   形容動詞語幹   74
1513       TortoiseHg   名詞           一般   74
3800               等   名詞           接尾   73
3126             環境   名詞           一般   73
1036             機能   名詞       サ変接続   70
2734         ブランチ   名詞           一般   69
2809       リポジトリ   名詞           一般   66
2577 エクステンション   名詞           一般   64
929              変更   名詞       サ変接続   64
2996             履歴   名詞           一般   63
855              作業   名詞       サ変接続   63
1198             問題   名詞 ナイ形容詞語幹   62
334              使う   動詞           自立   62
2777           マージ   名詞           一般   58
794          コミット   名詞       サ変接続   58
858              使用   名詞       サ変接続   57
4174             無い 形容詞           自立   56
3045             文字   名詞           一般   52
3729               上   名詞           接尾   51
3790               版   名詞           接尾   50
3745               化   名詞           接尾   50
2987             対象   名詞           一般   50
910              参照   名詞       サ変接続   50
3663             必要   名詞   形容動詞語幹   49
3774               時   名詞           接尾   47
2611         コマンド   名詞           一般   47
911              参考   名詞       サ変接続   47
3025             情報   名詞           一般   45
820          リリース   名詞       サ変接続   45
3739               側   名詞           接尾   44
2624           コード   名詞           一般   44
940              実施   名詞       サ変接続   44
419              思う   動詞           自立   44
3767               性   名詞           接尾   42
2896             内容   名詞           一般   42
1864           google   名詞           一般   42
3661             幸い   名詞   形容動詞語幹   41
3088               梱   名詞           一般   41
2233                r   名詞           一般   41
3741               先   名詞           接尾   40
2207             push   名詞           一般   40
2607           ケース   名詞           一般   39
1873           groups   名詞           一般   39
3748               名   名詞           接尾   38
1629        bitbucket   名詞           一般   38
893              利用   名詞       サ変接続   38
4145             ない 形容詞           自立   37
2240           rebase   名詞           一般   37
2102              msg   名詞           一般   37
258              いう   動詞           自立   37
3249             領域   名詞           一般   36
2483             wiki   名詞           一般   36
3398        Mercurial   名詞       固有名詞   35
1021             更新   名詞       サ変接続   35
867              修正   名詞       サ変接続   35
2712           パッチ   名詞           一般   34
1074             確認   名詞       サ変接続   34
1150             追加   名詞       サ変接続   33
3674             有効   名詞   形容動詞語幹   32
2753           ヘッド   名詞           一般   32
3058           日本語   名詞           一般   31
2583         エントリ   名詞           一般   31
1166             選択   名詞       サ変接続   30
1081             管理   名詞       サ変接続   30
3475               hg   名詞       固有名詞   29
3030               手   名詞           一般   29
1163             運用   名詞       サ変接続   29
3120             現状   名詞           一般   28
3116             状態   名詞           一般   28
3093             標準   名詞           一般   28
3040             挙動   名詞           一般   28
2422          twitter   名詞           一般   28
1040             注意   名詞       サ変接続   28
878              共有   名詞       サ変接続   28
3052             方法   名詞           一般   27
2444           update   名詞           一般   27
2381              thg   名詞           一般   27
1893             hgrc   名詞           一般   27
1564                a   名詞           一般   27
2253             repo   名詞           一般   26
3735             付き   名詞           接尾   25
3608               笑   名詞       固有名詞   25
> 

上位100件を見みたところ、一般的な単語で占められて特徴的なものは見い出しにくいものの、やはりTortoiseHgが上位にあること (SourceTreeは見当たりませんね) と、あと目に留まるのは rebase あたりでしょうか。

単語の共起関係を調査する

さらなる解析を、と月毎の出現頻度や推移を調べたりなどいろいろやってみたものの、意味のありそうな結果が得られません。元々データの母数が少ない上、ツイッターという字数の少ないメディアなので省略も多いでしょうから、傾向を出すのは無理があるようです。

と、ここで「あれ、そういえば Git って単語が出てこないな」ということに気付きました。早速、出現頻度データフレームから Git という語だけを抜き出して、出現頻度を調べてみましょう。『敬遠と思って安心してたら危険球』になりかけてますが、大丈夫でしょうか? 頭部への危険球は一発退場です。

> freqGit <- subset(freq, subset = (Term == "git" | Term == "Git"), select = c(Term, Info1, Info2, Freq))
> freqGit
     Term Info1    Info2 Freq
1302  Git  名詞     一般   13
3379  Git  名詞 固有名詞    8
1855  git  名詞     一般    5
3468  git  名詞 固有名詞    2
> 

なるほど、トータルでは28回現れていたものの、大文字小文字の表記揺れと、おそらく出現の仕方による構文解析の揺れで、数値が分散して上位には上がって来なかったようです。

では、「#mercurialjp のハッシュタグ付きツイートでは、『Git』という単語はどのような文脈で現れたのか?」を調べてみましょう。

ある単語が別の単語と隣接して現れることを『共起』と言い、RMeCabパッケージでは collocate()関数で求めることができます。collocate()関数の引数はファイルなので、ツイートを一度 tweet.txt というテキストファイルに落としてから喰わせ、出現頻度(Span)順に並べ替えた上で、頻度2以上を見てみます。

> mercurialjp <- read.csv("2013mercurialjp.csv")
> write.table(mercurialjp$tweet, "tweet.txt", quote=F, col.names=F)
> Git <- collocate("tweet.txt", node="Git")
file = tweet.txt 
length = 4635 
> 
> GitOrderBySpan = Git[ rev(order(Git$Span)), ]
> GitOrderBySpan <- subset(GitOrderBySpan, subset = Span > 1,
+                          select = c(Term, Before, After, Span, Total))
> GitOrderBySpan
           Term Before After Span Total
54   [[TOKENS]]     84    63  147 44084
53 [[MORPHEMS]]     30    22   52  4635
6           Git     21     0   21    21
30           の      3     7   10  1482
37     ブランチ      1     6    7    69
25           と      0     7    7   394
17           『      4     3    7   244
10  mercurialjp      7     0    7   806
1             #      7     0    7   962
31           は      3     3    6   825
15           、      5     1    6  1075
49           的      0     5    5    84
24           で      2     3    5   694
22           だ      0     5    5   590
2             (      4     1    5   194
46         比較      1     2    3     6
21         する      1     2    3   968
7     Mercurial      0     3    3   167
38       ユーザ      1     1    2    22
35           を      0     2    2   646
16           。      2     0    2   497
3             )      1     1    2   188
> 

どうやら2013年の #mercurial ツイートでは『Git』という単語は『ブランチ』という単語と一緒に語られたことが多かった*3ようです。検索してみるとこんな感じです。

個人的には、ここで先の「rebase」が出てくるのでは?と予測していたので、この結果は意外でした。

それでは出現回数37回を誇る「rebase」は、どんな文脈で現れたのか? 調べてみましょう。

> rebase <- collocate("tweet.txt", node="rebase")
file = tweet.txt 
length = 4635 
> rebaseOrderBySpan = rebase[ rev(order(rebase$Span)), ]
> rebaseOrderBySpan <- subset(rebaseOrderBySpan, subset = Span > 1, 
+                             select = c(Term, Before, After, Span, Total))
> rebaseOrderBySpan
                Term Before After Span Total
123       [[TOKENS]]    188   141  329 44084
122     [[MORPHEMS]]     60    61  121  4635
35            rebase     47     0   47    47
61                で      5    11   16   694
79                を      1    10   11   646
46                、      9     1   10  1075
2                  #     10     0   10   962
7                 --      1     7    8    56
69                の      1     6    7  1482
44                …      1     6    7   474
33       mercurialjp      7     0    7   806
9                  /      5     2    7  1389
81  エクステンション      0     6    6    64
75                も      4     2    6   274
56              する      4     2    6   968
28              html      6     0    6   129
8                  .      6     0    6  1367
60                て      4     1    5   590
54                が      1     4    5   882
31              keep      2     3    5    12
71                は      3     1    4   825
58                た      3     1    4   449
117               等      0     3    3    76
107             有効      0     3    3    32
74              ます      2     1    3   544
59                だ      1     2    3   590
49                『      1     2    3   244
39             strip      1     2    3    21
29              http      0     3    3   359
24             graft      3     0    3    23
17                MQ      2     1    3    26
16                 @      0     3    3   682
15               ://      0     3    3   444
4                  (      3     0    3   194
121               &      0     2    2     9
113             無し      2     0    2     8
104             改変      1     1    2    13
101             完了      1     1    2     5
100             契機      1     1    2    16
99              場合      1     1    2   120
97                化      1     1    2    50
92              使用      0     2    2    57
76                や      0     2    2    53
70              ので      2     0    2   204
67              なり      1     1    2    10
65                と      1     1    2   394
62            できる      0     2    2   106
53              から      2     0    2   123
47                。      1     1    2   497
43            update      0     2    2    29
26          histedit      1     1    2    16
25                hg      2     0    2   260
20             abort      1     1    2     8
6                  )      1     1    2   188
1                  "      1     1    2   128
> 

「rebase」は「エクステンション」と併せて語られています。そして「Git」という単語は見当たりません。ということで『Git には rebase があるけど、Mercurial には……』というのは、もう過ぎ去りし日というわけですね。グッバイ・フォーエバー。

結論: ハッシュタグ #mercurialjp ツイートから見る2013年の考察

以上の結果より、2013年の #mercurialjp ツイートからは以下の傾向が見られました。

  • やはり TortoiseHg はアクティブ (さすが西原さん*4!)。
  • Mercurial の機能では、rebase についての話題が多く見受けられた。
  • その場合、Git との比較ではなく、rebaseエクステンションについて語られている。
  • Git との比較では、むしろブランチについての話題が上がっていた。

どうなることかと思ったのですが、なんとかそれらしい結果が得られ、また危険球にもならなかったようで胸をなでおろしています。*5

落穂拾いと謝辞と年末のごあいさつ

と、綺麗にまとまったところを混ぜ返してしまいますが、実はこの結論には不備があります。

#mercurialjp rebase エクステンション」で検索するとわかるのですが、実際には誰かの『mercurial に git の rebase に相当するものってあるのかなあ?』というツイートを拾って『rebase エクステンションが標準で同梱されてますよ』と #mercurialjp ハッシュタグをつけてメンションを投げているケースが少なからずあり、その前段を取りこぼしてるんですね (#mercurialjp ハッシュタグで収集したツイートのみを解析しているので)。冒頭で「前処理がデータ解析で一番のキモ、そして一番手間のかかるところ」と書いた、そのままです……。会話を全て拾って解析できればいいのですが、それは来年への課題*6とさせてください。

なお、今回のデータ解析の手法は Rによるテキストマイニング入門 (伊藤基広 著) を全面的に参考にさせて頂きました。また解析に使用したRMeCabパッケージも同氏による開発です。ありがとうございます。

また、Mercurial日本語ユーザ会の皆様には、今年も大変お世話になりました。ありがとうございます。今年は勉強会(TokyoMercurial)に参加できなかったのが残念ですが、次回はぜひ参加させてください。

来年も、どうぞよろしくお願いします。



*1 このエントリは厳密な技術文書でなく、あくまで『データ解析をネタにしたMercurialに関する面白よみもの』であることを第一義にしていますので、必ずしも内容が正しくないことをご了承ください。意図的に簡略化した箇所につきましては脚注などでフォローを入れましたが、興味がなければ読み飛ばしていただいて結構です。また基本的な理解の誤りがありましたら、ご指摘いただければ幸いです。

*2 正しくは「単語」でなく「形態素」ですが、このエントリでは平易な「単語」という言葉を使用します。ちなみに出現頻度を求める RMeCabFreq()関数は、単純な単語のカウントではなく、活用形を原型に変換した上でカウントします。

*3 本来は「その出現が有意であるか (偶然でなく意味を持っていると見なせるか)」の検証 (統計的検定) が必要ですが、このエントリの趣旨により省略しています。

*4 TortoiseHgのコミッタとしてアクティブに活動されてるのは存じていましたが、まさかここまでとは……。

*5 実はデータ解析で一番大切なことは『その解析結果からPDCAサイクルを構築できるか?』ということです。と偉そうに言ってますが、つい数日前にJapan.R 2013で教わったことだったりします。というわけで2014年へのアクションプランですが……えーっと……えーっと……。

*6 来年もやる気か!? という冷静なツッコミはご遠慮ください ;-)

2013年9月23日月曜日

Ubuntu12.04LTSにR3.0.1をインストールする

LaunchPad PPA を使用して Mercurial を最新版にしたので、R も Ubuntu12.04LTS 標準の 2.14 系から最新の 3.0 系にアップデートしてみます。CRANAPT ラインを提供していますが、今回はより多くのパッケージをサポート *1 している RutteR を使用します。

LaunchPad PPA リポジトリの追加とインストールの実行

RutteR のページで、登録する APT ラインを確認します。

今回は 12.04LTS なので、以下の2行です。

deb http://ppa.launchpad.net/marutter/rrutter/ubuntu precise main 
deb-src http://ppa.launchpad.net/marutter/rrutter/ubuntu precise main 

以降、Mercurial のインストールと同様の手順で APT ラインの追加およびインストールを実行します。

synapticの「セクション」表示の「GNU R言語」には今回 LaunchPad PPA で追加したパッケージは表示されないようなので、「由来」表示で操作するのが良いでしょう。

これで R3.0.1 および種々のパッケージがインストール出来ました。

*1 例えば Python から R を使うためのライブラリ rpy2 などもサポートしています。ちなみに CRAN の APT ラインがサポートしているパッケージは README で確認できます。

2013年9月22日日曜日

Mercurial:Ubuntu12.04LTSに最新のリリース版をインストールする

生活環境を MacBook から Ubuntu@ThinkPad に切り替えて半年ほど経ちます。Mercurial は、MacOSX では homebrew で最新版を追えていたのですが、Ubuntu 12.04LTS の標準のリポジトリは 2.0 系です。普段の使用では差し迫っての必要はない *1 のですが、活発な開発の恩恵を受けられないのはもったいないので、最新版を追ってみることにしました。

LaunchPad PPAからのインストール

Ubuntu で Mercurial の最新版を追う場合、LaunchPad PPA からのインストールと pip を使用する方法の二通り *2 がありますが、今回は LaunchPad PPA を選びました。*3

apt-get でのインストールは、基本的には /etc/apt/sources.list にリポジトリを追記すればよいのですが、今回は GUI のインターフェースである synaptic を使用します。

イントール済みパッケージの削除

バージョンの確認を兼ねて、インストールされている標準パッケージを削除しておきます。

LaunchPad PPA リポジトリの追加

"Mercurial PPA Packagers" team のリリース版ページで、登録する APT ラインを確認します。

今回は12.04LTS なので、以下の2行です。

deb http://ppa.launchpad.net/mercurial-ppa/releases/ubuntu precise main 
deb-src http://ppa.launchpad.net/mercurial-ppa/releases/ubuntu precise main 

synaptic の [設定] - [リポジトリ] でソフトウェアソースのウインドウを開き、「他のソフトウェア」タブを選択します。

追加ボタンをクリックし、APT ラインを登録します。

sources.list を確認すると、確かに追加されています。

$ grep "mercurial" /etc/apt/sources.list
deb http://ppa.launchpad.net/mercurial-ppa/releases/ubuntu precise main
deb-src http://ppa.launchpad.net/mercurial-ppa/releases/ubuntu precise main
$ 

最新リリース版インストールの実行

「再読込」ボタンでパッケージ情報を更新すると、最新リリース版の Mercurial が表示されます。必要なパッケージを選択して「適用」ボタンでインストールします。

これで最新のリリース版である 2.7 *4 が使用できるようになりました。
$ hg --version
Mercurial - 分散構成管理ツール(バージョン 2.7)
(詳細は http://mercurial.selenic.com を参照してください)

Copyright (C) 2005-2013 Matt Mackall 他
本製品はフリーソフトウェアです。
頒布条件に関しては同梱されるライセンス条項をお読みください。
市場適合性や特定用途への可否を含め、 本製品は無保証です。
$ 

拡張機能を使用する場合の注意

LaunchPad PPA から Mercurial をインストールした場合、拡張機能の apt-get インストールに失敗することがあります。これは標準パッケージとの依存関係を解決できないためです。下記は hgsubversion をインストールしようとした場合のエラーメッセージです。

今回は LaunchPad PPA からインストールしましたが、必要な拡張機能が pip で提供されている場合、Mercurial も含めて全て pip でのインストールを検討した方が良さそうです。


*1 藤原克則氏による「妥当」な Mercurial バージョンの情報によると、2.0.x は『現状でそこそこ妥当な Mercurial の版』であるようです。

*2 もちろん過去エントリのようにソースからの make install も可能です。本気で最新版を追うのであればパッケージ化を待つよりソースからの方が早いですね。

*3 後述のように、Mercurial を LaunchPad PPA からインストールした場合、拡張機能の apt-get インストールに失敗する場合があります。

*4 これを書いている 2013/09/22 時点で既に 2.7.1 がリリースされていますが、LaunchPad PPA には反映されていません。mercurial-ja によると「月例のバグ修正版」とのことなので反映して欲しいところですが、障害修正は2件のみなので必ずしも必要でないかもしれません。

2012年4月29日日曜日

emacs/mewのキーバインド覚え書き

普段emacsのキーバインドは意識せずに使用していますが、ふとわからなくなった時に思い出すのに苦労するので、よく使用するものをまとめました。

emacsでよく使用するキーバインド

キーボードマクロ

キーボードマクロの定義開始
C-x (
キーボードマクロの定義終了
C-x )
キーボードマクロの実行
C-x e
(n)回の繰り返し実行
C-u (n) C-x e

インデント

領域をインデント
領域を指定し、C-M-\ *1

文字コードを指定してファイルを開く

文字コードを指定して開く
C-x RET c 文字コードを入力 RET C-x C-f
文字コードを指定して開き直す
C-x RET c 文字コードを入力 RET C-x C-v RET

分割ウィンドウの幅を変更

縦幅を拡げる
C-x ^
縦幅を縮める
M-x shrink-window [return]
横幅を拡げる
C-x }
横幅を縮める
C-x {
各ウィンドウを均等にする
C-x +

mewでよく使用するキーバインド

マルチパートの編集

編集領域と添付領域の移動
C-M-n
添付ファイルの削除
該当のパートで d
マルチパートの破棄
マルチパート編集領域のパート番号で d

pgp公開鍵の送付/登録

メールにpgp公開鍵を添付する
マルチパートを作成し、挿入するパートにカーソルを合わせて p
メール添付で受け取った公開鍵の登録:自動認識された場合
C-c C-e → 登録後、gpgコマンドで署名する
メール添付で受け取った公開鍵の登録:自動認識されなかった場合
C-u C-c C-e で Application/Pgp-Keys

メールをpgpで暗号化する

メールに署名
C-c C-s (メールは +queue に移動します)
メールの暗号化
C-c C-e (メールは +queue に移動します)
メールに署名して暗号化
C-c C-s (メールは +queue に移動します)
パートに署名
署名するパートにカーソルを合わせて S
パートの暗号化
暗号化するパートにカーソルを合わせて E

サマリ操作

不要になったディレクトリの削除
ディレクトリを消して,Summary バッファ で C-u Z
サマリのソート(6.x以降)
M-x mew-summary-sort
サマリのパック(6.x以降)
C-u O

その他

文字化けメールに文字セットを再解釈
C-c C-l 文字セット指定 RET
保存したドラフトの再編集
再編集したいメールを選択して E


*1 通常 Meta は "Esc" キーに割り振られていますが、私は移動の少ない "C-[" を使用しています。その場合 "C-[ C-\" です。

2011年5月31日火曜日

mltermの設定

VineLinuxを端末にしていたときは愛用 *1 していた mlterm ですが、MacBookがメイン端末になってからはご無沙汰していました。iTerm2で一通りの用が足りている *2 のですが、ふと思い立って調べたら MacPorts に入っていたので、インストールして以前使用していた設定をまとめてみました。

設定ファイルのひな形をコピーする

VineLinuxでパッケージでインストールした場合、/etc/mlterm/ に設定ファイルの雛形がインストールされましたが、MacPortsも同様でした (ただし MacPorts は /opt/local/ 配下にインストールされるので、/opt/local/etc/mlterm/ です)。ホームディレクトリに .mlterm/ の名前でコピーした後、編集します。

$ sudo port install mlterm
$ cp -r /opt/local/etc/mlterm ~/.mlterm

設定例:.mlterm/main

種々の設定を .mlterm/main に記述します。

# -- Encoding 関連 --
# エンコーディングの指定
# (ISO-8859-[1-11], ISO-8859-[13-16], TIS-620 (same as ISO-8859-11),
#  KOI8-[RUT], ISCII, VISCII, TCVN5712, GEORGIAN_PS, CP1251, CP1255,
#  EUC-JP, EUC-JISX0213, Shift_JIS, Shift_JISX0213, ISO-2022-JP[1-3],
#  EUC-KR, UHC, JOHAB, ISO-2022-KR, GB2312 (EUC-CN), GBK, GB18030,
#  ISO-2022-CN, HZ, EUC-TW, BIG5, BIG5HKSCS, UTF-8, AUTO)
ENCODING = auto

# -- Font 関連 --
# デフォルトフォントサイズ
fontsize = 14

# 変更可能なフォントサイズの範囲
font_size_range = 6-30

# larger,smaller ボタンでのフォントサイズの変化量(*1*)      
step_in_changing_font_size = 1

# 可変長コラム幅を使用する
use_variable_column_width = false 

# アンチエイリアスフォントを使用する
use_anti_alias = false

# アンチエイリアス(Xft)時、JISX0208 の Unicode 変換に CP932 の変換テーブル
# を使う
use_cp932_ucs_for_xft = true

# UNICODE を適当な文字集合にmapして、UNICODE フォントを使わずに表示する
not_use_unicode_font = true

# すべての文字を UNICODE フォントだけを使って表示する
only_use_unicode_font = false

# US_ASCII の表示には、必ず ISO8859-1 フォントを使用する
iso88591_font_for_usascii = false

# -- Appearance 関連 --
# スクロールバーをつける
use_scrollbar = true

# スクロールバーのつけ方
scrollbar_mode = right

# 使いたいスクロールバーの名前
# (simple,sample,sample2,sample3,next,motif,athena,mozmodern)
scrollbar_view_name = athena

# 端末画面の前景色
fg_color = black

# 同背景色
bg_color = white

# -- その他 --
# XIM を使う
use_xim = true

# インプットメソッド
# (xim,uim,iiimf,scim,m17n-lib,none)
input_method = xim

# タブ幅
tabsize = 4

# ログの行数 
logsize = 1024

# GUI 設定コマンドのパス
# (controll+button{1|2|3} を押した時起動するツール)
conf_menu_path_1 = mlterm-menu
conf_menu_path_2 = mlterm-zoom
conf_menu_path_3 = mlconfig

# バックスクロール時に端末出力があっても画面が流れないようにする。
static_backscroll_mode = true

設定例:.mlterm/font

フォントの設定は .mlterm/font に記述します。

DEC_SPECIAL = 10,a10;12,6x12;14,7x14;16,8x16;
ISO8859_1 = -kochi-mincho-medium-*--%d-*-iso8859-1;10,a10;12,6x12;
ISO8859_1_BOLD = 10,a10B;14,7x14bold;
JISX0201_KATA = 10,r10;12,r12;14,r14;16,r16;
JISX0201_KATA_BOLD = 10,r10;
JISX0201_ROMAN = 10,r10;12,r12;14,r14;16,r16;
JISX0208_1983 = 10,k10;12,k12;14,k14;16,kanji16;
JISX0208_1983_BOLD = 10,k10B;
TCVN5712 = 14,-*-.vntime-*--14-*-iso8859-1;

上記はVineLinuxで使用していた設定ですが、MacOSXには東風フォントが入っていないため、2行目の -kochi-mincho-medium- はエラーになります。これは要変更ですが、monacoあたりを指定すればよいのでしょうか?。検討中です。


*1 gnome-terminalなどのアンチエイリアスがかかった表示では 「;」と「:」、「.」と「,」などが分かりにくくて困るので、アンチエイリアスをOFFにできるのが高評価でした。

*2 UTF-8をはじめとする多言語に対応し、ウィンドウごとに文字コードを設定できるので、EUCなサーバやSJISのインターフェースファイルを扱うときに重宝します。というか MacOSX 標準のターミナルはそれができないのでサーバ管理に使うのは厳しいですね。

2011年5月29日日曜日

yumのオプション

いつも使い方がわからなくなるので、メモっておきます。

ダウンロードしたパッケージやキャッシュの削除

# yum clean オプション名

オプション名には、以下を使用可能です。

headers
パッケージのヘッダーのクリア
packages
ダウンロードしたパッケージのクリア
cache
キャッシュのクリア
metadata
メタデータのクリア
all
上記全てのクリア

便利なサブコマンド

パッケージ情報の表示

# yum info パッケージ名

キーワードによるパッケージの検索

# yum search キーワード

アップデート可能なパッケージの表示

# yum list updates

インストール済のパッケージの表示

# yum list installed

特定のパッケージのアップデートを無視する

特定のパッケージのみアップデートしたくない場合は /etc/yum.conf に exclude=パッケージ名 の記述を追加します。例えば、カーネルのみアップデータしたくない場合 *1 は以下のように記述します。

exclude=kernel*

期待通り kernel を除外できているか、確認します。

# yum list updates | grep kernel

*1 Xen環境を構築しているサーバでは、安全のためにこのように設定しています(実際にはアップデートしようとするとエラーになるようですが)。

2011年4月17日日曜日

各種コマンドの ssh オプションの指定

私の管理するサーバの ssh 接続はキーペア認証のみ許可し、また念のためにポート番号を22以外に変更しています。外部からは smtp や http 以外は全て ssh 経由のみで接続していますが、コマンドによって ssh のオプション指定が異なり、いつも man 等を調べ直していますのでまとめました。

rsync -e ssh のオプション

ダブルクォートを使用して、-e ssh のオプションを指定します。下記の例でははポートを9999に変更し、また秘密鍵を ~/.ssh 配下以外の秘密鍵を指定 *1 しています。

$ rsync -av -e "ssh -p 9999 -i /path/to/private/key/id_rsa" \
   username@host:source destination

scp の ssh オプション

scp では -i で秘密鍵、-P でポートを指定します (-p は cp コマンドと同様に、ファイル属性の保持です)。下記の例でははポートを9999に変更し、また秘密鍵を ~/.ssh 配下以外の秘密鍵を指定しています。

$ scp -pr -P 9999 -i /path/to/private/key/id_rsa \
   username@host:source destination

また、-o で ssh のオプションを指定することも可能です。上記と同様の内容を -o で指定する場合、以下となります。

$ scp -pr -o Port=9999 -o IdentityFile=/path/to/private/key/id_rsa \
   username@host:source destination

FUSE sshfs の ssh オプション

sshfs では、scp と同様に -o で ssh オプションを指定します。下記の例でははポートを9999に変更し、また秘密鍵を ~/.ssh 配下以外の秘密鍵を指定しています。

$ scp -pr -o Port=9999 -o IdentityFile=/path/to/private/key/id_rsa \
   username@host:/directory mountpoint

Mercurial の ssh オプション

(2012/05/05 追記)

Mercurial では、-e で ssh コマンドを指定します。下記の例でははポートを9999に変更し、秘密鍵を ~/.ssh 配下以外の秘密鍵を指定しています。また、リモートリポジトリの指定はURI形式 *2 を使用します。

$ hg clone -e "ssh -p 9999 -l username -i /path/to/private/key/id_rsa" \
   ssh://host//absolute/path/to/repository

*1 特に laptop 機では、秘密鍵などの重要なファイルは TrueCrypt の暗号化ボリューム内に置いているためです。

*2 URI は "スキーム名://ホスト名/パス" なので、リモートリポジトリへのパス指定に絶対パスを使用した場合は上記の例のように (ホスト名とパスの間の "/" は2つに) になります。当然ながらログインディレクトリからの相対パスで指定する場合 *3 は ssh://host/relative/path/to/repository です。

*3 通常は絶対パスで指定すると思いますが、ホームディレクトリ配下にリポジトリを置いている場合など、こちらの方が便利なケースもあります。

2011年3月1日火曜日

GNU Screen の設定

一年ほど前に emobile の Pocket-WiFi を導入して以来、GNU Screen (以下screen) は必須*1です。当初はエスケープキーを変更する程度だったのですが、便利な設定を公開している方のサイトを読んではその機能に驚き、拾わせていただいてます。以下、現在の設定メモです。

.screenrc

デフォルトのエスケープキー "ctrl-a" は bash/emacs とバッティングするので、"ctrl-z" に変更します

escape ^Zz

デフォルトで UTF-8 を使用します

defencoding UTF-8
encoding UTF-8 UTF-8

画面下部にスクリーン名とロードアベレージを表示します

hardstatus alwayslastline "%{= Gk} %-Lw%40L>%{b kg} %n %t %{-}%+Lw%-020=%{b km} %l"

よく使用するエンコーディングを切り替えます

bind "u" encoding UTF-8
bind "e" encoding eucJP
bind "s" encoding SJIS

emacsライクなスクリーンの分割です

bind "2" split
bind "o" focus
bind "1" only
bind "0" remove

スクリーンのリサイズ関係です

bind "=" resize =
bind "_" resize max
bind "r" eval 'echo "Resize window"' 'command -c resize'
bind -c resize ^]  command
bind -c resize j eval 'resize +1' 'command -c resize'
bind -c resize k eval 'resize -1' 'command -c resize'

screen を exit した後、Esc キーを押下するまで screen を終了しません(最後の実行結果の表示が残ります)

zombie ^[

manページについて

screen は非常に多機能である上、man ページが非常に充実していて読み応えがあります。そして、最後の2行がステキです。(括弧内は日本語manページの翻訳)

A weird imagination is most useful to gain full advantage of all the features.
(全機能を最大限に生かすためには、おかしな想像力が非常に有用となる。)

Send bug‐reports, fixes, enhancements, t‐shirts, money, beer & pizza to screen@uni-erlangen.de.
(バグ報告、修正、改良、Tシャツ、お金、ビール、ピザ等 は screen@uni-erlangen.de まで送ってほしい。)


*1 emobileは6時間ごとに接続を切ってipアドレスを振り直します。以前はサイトFAQに「サービス仕様」と明記されていた記憶があるのですが、今は探しても見つかりません。この辺りの仕様をご存知の方、ご教示いただければ幸いです。

2011年2月27日日曜日

Mercurial:MacOSXでGUIのdiff/mergeツールを使用する

MacOSX の開発環境 "XCode" には GUI の diff/merge ツールである FileMerge が含まれています。これを Mercurial の外部ツールとして使用するよう設定してみました。

コマンドラインからの FileMerge の起動指定

コマンドラインから FileMerge を起動するには opendiff というコマンドを使用します。.hgrc に、  

[extensions]
hgext.extdiff =

[extdiff]
cmd.opendiff =

と指定することで opendiff というサブコマンドが使用できるようになるので、それを指定すると

$ hg opendiff
FileMerge が起動します。

FileMergeで日本語を使用する

FileMerge は日本語の対応に問題があり UTF-8 等の文字コードを使用した場合に文字化けしてしまいますが、環境設定でフィルタを指定して変換することで正しく表示することが可能です。標準でインストールされている /usr/bin/iconv は文字コードの指定が必要で使いにくいため、ここでは自動で判定/変換してくれる nkf を MacPorts でインストールして使用しました。

$ sudo port install nkf
環境設定でフィルタに nkf を指定します。FileMerge は Shift-JIS は文字化けせずに表示できるので出力指定を -s とします。 これで FileMerge で日本語を使用できるようになりました。

2009年11月25日水曜日

vsftpd設定メモ

いつも設定がわからなくなるので、メモっておきます。

umaskの設定

groupに書き込み権限を与える場合

file_open_mode=0666
local_umask=002

chrootの設定

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
/etc/vsftpd.chroot_list に、chroot しない ユーザを列挙する

2009年11月8日日曜日

Trac:ポップアップカレンダーで日付を入力

TracDecoratorPluginでポップアップカレンダー入力

TracDecoratorPluginを使用することで、ポップアップカレンダーからの入力ができるようになります。

TracDecoratorPlugin のインストール

インストールはプロジェクトページのインストール方法どおりでOKです。ここでは trac0.11.5ja を使用していますので、trunk を取得します。インストール後に httpd を再起動すると、プラグインが有効になります。

$ svn co http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/decoratorplugin/trunk
$ cd trunk/
$ python setup.py bdist_egg
# cp dist/TracDecoratorPlugin-0.3.1-py2.4.egg /home/trac/test/plugins/
# /usr/local/apache2/bin/apachectl restart
0.11系ではデフォルトで TracGanttCalenderPlugin の開始日/終了日(due_assign, due_close)のポップアップカレンダー入力が有効になりますので、設定は不要です。それ以外のカスタムフィールドに使用するには、以下の書式で trac.ini に指定します。

[decorator]
calendar_fields=due_assign,due_close

2009年10月25日日曜日

MySQLのインストール

MySQL5.xのインストール

いつもインストールのやり方を忘れてしまうので、メモしておきます。ここではコンパイル済みバイナリを使用し、CentOS5 にインストールしています。

インテルのCPUで実行する場合は、gccよりもインテルCコンパイラでコンパイルされたバイナリ *1 の方が速い、といわれてますので、それを使用します。

# groupadd mysql
# useradd -g mysql mysql
# cd /usr/local
# tar zxvf /path/to/mysql-VERSION-OS.tar.gz
# ln -s full-path-to-mysql-VERSION-OS mysql
# cd mysql
# chown -R mysql .
# chgrp -R mysql .
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
4.1まではバイナリを展開するだけだったのですが、5.xからは "scripts/mysql_install_db --user=mysql" を実行するようになったようです。

参考URL: http://dev.mysql.com/doc/refman/5.0/en/installing-binary.html

my.cnf の設定

my.cnfを作成し、default-character-set を設定します。my.cnf は同梱のものを利用し、必要に応じて変更します。ここではアプリケーションのインストールテスト *2 という小規模な用途でしたので、my-small.cnf を使用しました。

# cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
# vi /etc/my.cnf

 -----------------------------------
 [mysqld]
 default-character-set=utf8  ←追加
 -----------------------------------

# /etc/init.d/mysqld restart
# 
$ su - mysql
$ mysql -uroot --default-character-set utf8 -p

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql>

キャラクタセットの指定

ターミナルから mysql コマンドで接続して sql を実行すると、日本語が文字化けします *3。これは、mysql のキャラクタセットが指定されてないからです。デフォルトでは、以下のような感じです。

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | utf8   |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.01 sec)

mysql> select entry_id, entry_class, entry_text from mt_entry where entry_class = 'page';
+----------+-------------+--------------------+
| entry_id | entry_class | entry_text         |
+----------+-------------+--------------------+
|        4 | page        | ?????????????????  |
+----------+-------------+--------------------+
1 row in set (0.01 sec)

mysql> 

キャラクタセットを指定すると、OK。

mysql> SET CHARACTER SET utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_results    | utf8   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.00 sec)

mysql> select entry_id, entry_class, entry_text from mt_entry where entry_class = 'page';
+----------+-------------+------------------------------------------------------+
| entry_id | entry_class | entry_text                                           |
+----------+-------------+------------------------------------------------------+
|        4 | page        | 地震だ。でかいぞ。もうだめだ。><                   |
+----------+-------------+------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

また、起動時に指定することもできます。

$ mysql -uroot --default-character-set utf8

マニュアルだと、このあたりです。
http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html


*1 ファイル名に -icc- が入っているやつです。たとえば mysql-5.0.51a-linux-i686-icc-glibc23.tar.gz とか。
*2 下の例でおわかりのように、MovableType のインストールテストです。
*3 LANGやターミナルのエンコーディングを合わせているのは前提とします。

2009年10月24日土曜日

mew+pgpで暗号化メモ

サーバや端末の各種パスワードとかの管理って面倒ですよね。メモするのは危険だし、かといって記憶するのも大変。同じのを使い回すのも気持良くないし。他にもアマゾンのようなECとか銀行とかクレジット会社とかのサイトのログインアカウントなど、とても覚えきれません。

というわけで、僕は mew + pgp(gnupg) で自分宛にメールを出すことで記録しています。

mew は pgp と非常に相性が良く、またパスワードをキャッシュしておくことで、メールを開けば自動的に復号化してくれるので、まさに手間イラズです。というわけで、ここでは各種コマンドやセットアップ手順を記録しておきます。

メール署名/暗号化の手順

メールに署名する
C-c C-s (メールは +queue に移動します)
メールを暗号化する
C-c C-e (メールは +queue に移動します)
メールに署名して暗号化する
C-c C-s (メールは +queue に移動します)

gnupgの設定

gnupg を使用した設定のメモです。

鍵の作成

$ gpg --keygen
コマンド実行の一回目は辞書などの設定ファイルがつくられるだけで、鍵は作成されません。もう一度、同じコマンドを実行することで、対話式で鍵作成が始まります。

鍵の一覧表示

$ gpg --list-key

公開鍵のインポートと編集(信頼度の設定)

$ gpg --import <鍵ファイル名>
$ gpg --edit-key 

mewの設定

gnupgを使用し、またパスワードのキャッシュを設定しました。ここではキャッシュの有効期限を5分にしています。

(setq mew_prog-pgp "gpg")
(setq mew-use-cached-passwd t)
(setq mew-passwd-timer-unit 300) ; timer-unit x lifetime
(setq mew-passwd-lifetime 1)     ;    = interval(sec) of flushing cache.

2009年10月19日月曜日

PostgreSQL:バージョンアップ時の仕様変更

PostgreSQLは、バージョンアップの際に互換性のない仕様変更が発生する場合があります。

ただし、元々アバウトであったデータ型の扱いが厳密になることが多いようで「本来エラーになるべきものが何故か動いていた」すなわち「期待される動作へと改善された」と言えるかもしれません。ここでは、特にSQL文の変更が発生したものを記録しておきます。

7.4 以降の int 型カラムの扱い

バージョン7.4以降では、int型カラムに対して「長さ0の文字列 ''」を格納することが出来なくなりました。not null 制約が付いてなければ、nullはOKです。

test=# \d inttest
    Table "public.inttest"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 value  | text    | 

test=# insert into inttest (id, value) values (null, 'text');
 |=!|INSERT 0 1
test=# insert into inttest (id, value) values ('', 'text');
ERROR:  invalid input syntax for integer: ""
test=# 

8.3 以降の char 型カラムの扱い

char型カラムに対して数字で比較した際に、8.1.4ではエラーにならなかったSQL文が、8.3.0では(正しく)エラーになるようになりました。

test=# \d chartest
      Table "public.chartest"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | integer      |
 value  | text         |
 flag   | character(1) |

test=#  select * from chartest where flag = 1;
ERROR:  operator does not exist: character = integer
LINE 1: select * from chartest where flag = 1;
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
test=#
8.1.4では、上記SQLがエラーにならず実行されます。

なお、私がこの仕様に気付いたのは環境を 8.1.4 から 8.3.0 にバージョンアップした際ですので、変更は 8.2 で加わったのかもしれません。しかしながら、その変更のタイミングを追う理由は特にありませんので「8.1.4 -> 8.3.0」として記録しておくことにします。

2009年10月18日日曜日

PostgreSQL8.4.1のインストール

最新版の PostgreSQL (8.4.1) をソースコードからインストールする機会がありましたので、手順を記録しておきます。基本的に、ドキュメント「第15章ソースコードからインストール」の手順にしたがって進めています。

必要なライブラリのインストール

今回は CentOS 5.3 を使用しました。configure 時に下記のライブラリを要求されますので、事前にインストールしておきます。

  • readline-devel
  • zlib-devel

postgresユーザとインストール先ディレクトリの作成

管理者アカウントであるpostgresユーザと、インストール先ディレクトリを作成します。ここでは gid, uid の指定はしませんでしたが、既存環境と合わせる必要がある場合は、-g, -u オプションで明示的に指定します。また、インストール先は /usr/local/pgsql とします。

# useradd postgres
# mkdir /usr/local/pgsql
# chown postgres. /usr/local/pgsql

インストールの実行

ここでは、ソースをビルドする作業ディレクトリを /usr/local/src/postgresql/ として作業します。confugure オプションは特に指定せず、デフォルトでインストールしました。

# mkdir /usr/local/src/postgresql/
# chown postgres. /usr/local/src/postgresql/
# su - postgres

$ cd /usr/local/src/postgresql/
$ wget http://www.ring.gr.jp/pub/misc/db/postgresql/source/v8.4.1/postgresql-8.4.1.tar.gz
$ tar zxvf postgresql-8.4.1.tar.gz
$ cd postgresql-8.4.1
$ ./configure
$ make
$ make install

環境変数の設定

postgres ユーザの .bashrc に、環境変数を設定します。

$ vi ~/.bashrc

 以下を記述:
 export PATH=$PATH:/usr/local/pgsql/bin:/usr/local/pgsql/lib
 export POSTGRES_HOME=/usr/local/pgsql
 export PGLIB=$POSTGRES_HOME/lib
 export PGDATA=$POSTGRES_HOME/data
 export MANPATH=$MANPATH:$POSTGRES_HOME/man
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGLIB

$ source ~/.bashrc

また、 ldconfig コマンドで実行時リンクの結合関係を設定しておくことで、パフォーマンスの改善が期待できます。CentOS5の場合、root 権限で以下を実行します。

# /sbin/ldconfig /usr/local/pgsql/lib

データベースクラスタの作成

postgres ユーザにて、データベースクラスタの作成を実行します。作成の実行後にデータベースの起動を確認します。

$ initdb
$ pg_ctl start
$ psql -l
        List of databases
     Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
  -----------+----------+----------+-------------+-------------+-----------------------
   postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
   template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
   template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
  (3 rows)
起動を確認したら、pg_ctl stop で停止しておきます。

起動スクリプトの設置

同梱の起動スクリプトを設置し、起動の設定をしておきます。

# cp /usr/local/src/postgresql/postgresql-8.4.1/contrib/start-scripts/linux /etc/init.d/postgresql
# chmod +x /etc/init.d/postgresql
# chkconfig --add postgresql
# chkconfig postgresql on
# chkconfig --list | grep postgresql

 postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off
これでインストールが完了しました。

クライアント側のみのインストール

アプリケーションサーバとデータベースサーバを分離した構成にする場合、いままで私はクライアント側は通常インストールを実行していました(データベースクラスタは作成しない)。が、今回の作業でマニュアルに「クライアント側のみのインストール」の方法が記述してあることに気付きましたので、メモしておきます。

gmake -C src/bin install
gmake -C src/include install
gmake -C src/interfaces install
gmake -C doc install
http://www.postgresql.jp/document/pg841doc/html/install-procedure.html

2009年10月17日土曜日

trac:担当者をドロップダウンリストで選択

trac の担当者をドロップダウンリストで選択する

trac の担当者 (Owner) はデフォルトでテキスト入力ですが、trac.ini を以下のように記述することで、ドロップダウンリストからの選択ができるようになります。

[ticket]
restrict_owner = true
このリストは session テーブルから取得しているようです。そのためアカウントを作成してログインした後に、選択できるようになります。

ドロップダウンリストから担当者を削除する

ドロップダウンリストから担当者 (Owner) を削除するには、session テーブルからレコードを削除すればよいようです。Primary Key は "sid" で、担当者を指定します。

PostgreSQLの例: (psqlを使用)

foo=# delete from session where sid = '担当者名';

2009年10月16日金曜日

Mercurial:Keyword Extension の利用

Keyword Extension の利用

同梱されている keyword extention を有効にすることで、CVSのタグ展開的な用法が可能となります。

設定例:

[extensions]
hgext.keyword =

[keyword]
**.txt =
**.php =
**.py =

[keywordmaps]
Id = {file|basename} {node|short} {date|utcdate} {author|user}
上記設定で、「$Id: 20091010mercurialtips.txt afa0ad358888 2009/10/10 02:20:48 hisawo $」というキーワードがCVSライクに展開されます。

注意:Keyword Extension は、checkout や update 時にキーワードを展開するのみで、リポジトリの書き換えは行いません。

2009年10月15日木曜日

Mercurial:CVSと連携利用の例

作業用CVSブランチの代わりにMercurial

残念ながら開発現場では Mercurial はまだ一般的でなく、CVS や subversion といった構成管理ツールを使用しているケースが多いようです。しかしながら現場で例えば CVS が使用されていたとしても「分散型」という Mercurial の特徴を生かして協調利用が可能です。例えば、CVSリポジトリに作業履歴を残す必要ない場合には、個人作業用としての構成管理として手軽に利用できます。

  1. CVSやの管理情報格納ファイルを無視するために、以下のような".hgignore"ファイルを記述します。".hgignore"ファイルは、ワーキングディレクトリの最上位ディレクトリに配置します。
       syntax: re
       ^CVS/
       /CVS/
       
  2. CVSリポジトリから foo モジュールをチェックアウトします。
       $ cvs -d :pserver:username@server:/path/to/cvsroot co foo
       
  3. ローカルの Mercurial リポジトリを作成し、foo モジュールをコミットします。
       $ cd foo
       $ hg init
       $ hg add
       $ hg commit
       
    これで、foo モジュールの全ファイルが登録されました。随時 Mercurial に登録/参照しながら作業を進めます。作業ディレクトリをコピーする場合には、hg clone コマンドでコピーします。
  4. 一連の作業が完了したら、CVSリポジトリにコミットします。
       $ cvs -d :pserver:username@server:/path/to/cvsroot commit
       

これで、CVSブランチ代りに Mercurial を使用した作業が完了しました。

2009年10月14日水曜日

東京藝大のスケッチブック

24x7エンジニアリング (勤務先に8x5、残りは個人プロジェクト *1) の僕らにとって、メモ帳と多色ボールペンは片時も手放せない補助記憶装置ですが、自分にピッタリくるものを見つけるのは意外と難しいのではないでしょうか。

僕は、しばらく前から東京藝大スケッチブックの一番小さいヤツをメモ帳に使ってて、なかなかのお気に入りです。

RHODIAなんかもいいんですが平綴じなのが好みに合わず、その点藝大スケッチブックはリング綴じなので使いやすいし、大きすぎず小さすぎず、いい感じです。

紙質はツルツルしすぎないサラリとした薄手の紙で書きやすく、お値段も確か100円台だったので気兼ねなく使えます。去年のGWに藝大美術館にバウハウス・デッサウ展を見に行ったときにミュージアムショップで見つけて、何冊か買ったものの買い置きが切れ、これが最後の一冊です。

上野方面に行ったら補充しようと思うんですが、なかなかそちら方面に行く用事がなく、敢えて言うなら、その補充の難しさが僕的な唯一の短所かも。


*1 あくまでマインドとして、です(笑)。