2016年2月18日木曜日

中国語をpythonで形態素解析(PyNLPIR)する

このエントリーをはてなブックマークに追加
春節の折、去年あたりから中国から観光客の方が来られてるので、ここで中国語の形態素解析をしてみたいと思った。
中国語の形態素解析器はNLPIR / ICTCLASにあったのでこれを用いてみることにする。


できればこの辺の解析はpythonで実行したいのでPyNLPIRをpipでインストールする。
# pip install pynlpir
Collecting pynlpir
  Downloading PyNLPIR-0.4.2.tar.gz (13.1MB)
    100% |████████████████████████████████| 13.1MB 3.1kB/s
Installing collected packages: pynlpir
  Running setup.py install for pynlpir
Successfully installed pynlpir-0.4.2
インストールされて動くか試してみる。PyNLPIRのページを参考にした。

まずはpythonのデフォルトエンコーディングをUTF8にしておく。/usr/lib/python2.7/site-packages/sitecustomize.pyを作成する。
import sys
sys.setdefaultencoding('utf-8')
インタラクティブモードでpythonを起動しpynlpirを試す。文章はweiboから適当に引っ張ってきた。
>>> import pynlpir
>>> pynlpir.open()
>>> s = '大阪最后一夜 关西机场附近最高建筑俯瞰大阪湾'
>>> pynlpir.segment(s)
[(u'\u5927\u962a', u'noun'), (u'\u6700\u540e', u'noun of locality'), (u'\u4e00', u'numeral'), (u'\u591c', u'classifier'), (u' ', None), (u'\u5173\u897f', u'noun'), (u'\u673a\u573a', u'noun'), (u'\u9644\u8fd1', u'noun of locality'), (u'\u6700\u9ad8', u'adjective'), (u'\u5efa\u7b51', u'noun'), (u'\u4fef\u77b0', u'verb'), (u'\u5927\u962a', u'noun'), (u'\u6e7e', u'noun')]
漢字が読めない。。。リストをタプルに分解してencodeして表示させる。
>>> words = pynlpir.segment(s)
>>> for w in words:
...     if w[0] != ' ':
...             print '単語:' + w[0].encode('utf-8') + ', 品詞:' + w[1].encode('utf-8')
...
表示結果はこんな感じ。
単語:大阪, 品詞:noun
単語:最后, 品詞:noun of locality
単語:一, 品詞:numeral
単語:夜, 品詞:classifier
単語:关西, 品詞:noun
単語:机场, 品詞:noun
単語:附近, 品詞:noun of locality
単語:最高, 品詞:adjective
単語:建筑, 品詞:noun
単語:俯瞰, 品詞:verb
単語:大阪, 品詞:noun
単語:湾, 品詞:noun
noun:名詞
noun of locality:方位詞
classifier:分類辞
numeral:数詞
adjective:形容詞
verb:動詞

あってるんかなぁ。。。中国語全然分からんけど。。。まぁ、とっかかりにはなるかなと。

2016年2月17日水曜日

VMWareFusionで仮想マシンのHDDを拡張した時にしたこと

このエントリーをはてなブックマークに追加
VMWareFusionで作った仮想マシンのHDDを60GBから150GBへ拡張した。そのままでは仮想マシン側のFedora23では拡張されたことは認識されないので、HDD拡張を認識させるためにやったことをまとめておく。


まずはfdisk -lで認識されているディスク情報を確認する。

# fdisk -l
ディスク /dev/sda: 150 GiB, 161061273600 バイト, 314572800 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x4c356fd6

デバイス   起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sda1  *        2048   1026047   1024000   500M 83 Linux
/dev/sda2        1026048 125829119 124803072  59.5G 8e Linux LVM


ディスク /dev/mapper/fedora-root: 38.7 GiB, 41490055168 バイト, 81035264 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト


ディスク /dev/mapper/fedora-swap: 2 GiB, 2147483648 バイト, 4194304 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト


ディスク /dev/mapper/fedora-home: 18.9 GiB, 20254294016 バイト, 39559168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

/dev/sda2を拡張させればいいと分かった。ここからはpartedで実施する。

# parted
GNU Parted 3.2
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

素直にhelpを実行する
(parted) help
  align-check TYPE N            パーティション N のアライメント(TYPE: min|opt)をチェックする
  help [コマンド]               ヘルプ表示。コマンド指定でそのヘルプを表示
  mklabel,mktable ラベルの種類  新しいラベル(パーティションテーブル)を作る
  mkpart パーティションの種類 [ファイルシステムの種類] 開始 終了
                    パーティションを作る
  name NUMBER 名前              パーティションに名前をつける
  print [devices|free|list,all|NUMBER]
                     パーティションテーブルや、利用可能なデバイス、空き領域、
                     見つかった全てのパーティション、あるいは特定のパーティションについて表示する
  quit                          プログラムを終了する
  rescue 開始 終了              開始、終了で指定した範囲付近にあるパーティションを復活させる
  resizepart NUMBER END         パーティション NUMBER を END にリサイズする
  rm NUMBER                     パーティションを削除する
  select デバイス               操作するデバイスを選択
  disk_set FLAG STATE           選択したデバイスの FLAG を変更
  disk_toggle [FLAG]            選択したデバイスの FLAG の状態をトグル
  set NUMBER フラグ 状態        ファイルシステムのフラグと状態を設定する
  toggle [NUMBER [FLAG]]        パーティションのフラグの状態を反転する
  unit UNIT                     デフォルトの単位を UNIT にする
  version                       GNU Parted のバージョンと著作権情報を表示

念のためもう1回ディスク情報を確認する。
(parted) print all
モデル: VMware, VMware Virtual S (scsi)
ディスク /dev/sda: 161GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  525MB   524MB   primary  ext4              boot
 2    525MB   64.4GB  63.9GB  primary                    lvm

パーティション番号の2を変更したいのでresizepart [partition number]を利用する。
(parted) resizepart 2
終了?  [64.4GB]? 150GB
(parted) p
モデル: VMware, VMware Virtual S (scsi)
ディスク /dev/sda: 161GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了   サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  525MB  524MB   primary  ext4              boot
 2    525MB   151GB  150GB   primary                    lvm

これでパーティションが変更された。次に物理ボリュームを変更する。
現在の情報を確認する。
# pvscan
  PV /dev/sda2   VG fedora   lvm2 [59.51 GiB / 4.00 MiB free]
  Total: 1 [59.51 GiB] / in use: 1 [59.51 GiB] / in no VG: 0 [0   ]
物理ボリュームを変更する。
# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
変更されたか確認する。
# pvscan
  PV /dev/sda2   VG fedora   lvm2 [149.45 GiB / 89.95 GiB free]
  Total: 1 [149.45 GiB] / in use: 1 [149.45 GiB] / in no VG: 0 [0   ]

次は論理パーティションを変更する
# lvextend -L +90G /dev/mapper/fedora-root
  Insufficient free space: 23040 extents needed, but only 23026 available

そのまま拡張したサイズを指定しても1GB=1024KBの関係で拡張できないので少し小さくする。

# lvextend -L +89G /dev/mapper/fedora-root
  Size of logical volume fedora/root changed from 38.64 GiB (9892 extents) to 127.64 GiB (32676 extents).
  Logical volume root successfully resized.

ファイルシステムを最後に変更して完了。

# resize2fs /dev/mapper/fedora-root
resize2fs 1.42.13 (17-May-2015)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/fedora-root
Couldn't find valid filesystem superblock.

怒られた。

調べたらxfsのアイルシステムではresize2fsは使えないようなのでxfs_growfsを利用する。
# xfs_growfs /dev/mapper/fedora-root
meta-data=/dev/mapper/fedora-root isize=512    agcount=4, agsize=2532352 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1
data     =                       bsize=4096   blocks=10129408, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=4946, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10129408 to 33460224

再起動してdf -hなどで確認しておく。


2016年2月16日火曜日

Ansibleを使ってFedora23にサーバを構築していく〜playbookでApacheのconfig編集

このエントリーをはてなブックマークに追加

まず今回はAnsibleでのconfファイルの編集手段の具体的な方法論の前に思いの丈からまとめておくことにする。

導入の目的を考える

先に行っておくがAnsibleで全てを自動で要件に合わせて編集するのは無理。この辺りのAnsible導入の焦点は2つあると思う。

  1. サーバ構築の手順をある程度標準化して自動化したい。環境依存、運用修正部分は直接編集
  2. サーバ構築(環境依存)〜運用修正までの手順をAnsibleのフォーマットに則ってInfrastructure as Codeしたい

この辺、きちんと目的をメンバー(プロジェクト関係者も含む)と共有しておかないと、「コマンド1つで誰でもすぐにサーバ構築できるようになったんじゃなかったの?」になっちゃうので要注意かなと思う。

#自分も含めて後でごっちゃになってきて、目的なんだったっけ?になりかねない。

2つに完全に分けるんじゃなくて導入する際のフェーズとして1→2を踏むというのはありかなと思うけど。

まずは導入の標準化を行おう


標準の/etc/httpd/conf/httpd.confを編集する。今回はだいたいいつも変えないといけないところを変えていこうかと思ったんだけど、でもAllowOverrideぐらいしかデフォルトでは変えない気がするので、そこだけ。

# DocumentRootも変えないし、変えるとしたらVirtualHost切る時だし。

あとは/etc/httpd/conf.d/welcome.confをリネームしておく。これらをInstallHttpd.ymlに書き加える。
---
- hosts: ChildServers
  gather_facts: no
  tasks:
    - name: install httpd by dnf
      dnf: name=httpd state=latest
      register: results
    - debug: var=results
    - name: Replace "AllowOverride None" in httpd.conf
      replace: dest=/etc/httpd/conf/httpd.conf regexp='AllowOverride None' replace='AllowOverride All' backup=yes
    - name: Replace "AllowOverride none" in httpd.conf
      replace: dest=/etc/httpd/conf/httpd.conf regexp='AllowOverride none' replace='AllowOverride All' backup=yes
    - name: rename welcome.conf
      shell: 'mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org'
    - name: Auto Start httpd daemon
      service: name=httpd state=started enabled=yes
      register: results
    - debug: var=results

'None'と'none'が初めから混じっているのでめんどくさい。。。

でも結果としてはこれで実行したら成功した。無事にhttpd.confも書き換わってwelcome.confもリネームされていた。実際にこれぐらいであれば例となるhttpd.confを用意してcopyモジュールでコピーするのもありだと思う。
TASK: [Replace "AllowOverride None" in httpd.conf] ****************************
changed: [172.16.33.175]

TASK: [Replace "AllowOverride none" in httpd.conf] ****************************
changed: [172.16.33.175]

TASK: [rename welcome.conf] ***************************************************
changed: [172.16.33.175]

実際の運用を考えるとdnfでインストール後、テンプレートで初期起動までを作成。そのあとは環境に応じて編集および新規設定ファイルを作成した上で.confファイルはsvnやgitで管理し、メンテナンス後もリスタートをかけたトリガーでリポジトリにコミットする。そのあとは障害時にここからansibleでもってくるなど下ほうがいいのかもしれない。