2017年9月10日日曜日

Python3からChaSenを使う@CentOS 7


ChaSenは奈良先端科学技術大学院大学松本研究室で開発された日本語の形態素解析システムです。2000年ころに松本教授自ら書かれた記事が公開されていました。

今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • ChaSen 2.4.5
  • Python 3.4
  • CentOS 7.3
今回もコンパイルして入れます・・・が、Python 3から呼び出せるバインディングが見つかりませんでしたので、プロセスを呼んで結果を取得します。

準備

nkfとgcc、gcc-c++をインストールします。
yum install nkf gcc gcc-c++

Dartsのインストール

ChaSenを入れる前にDartsというライブラリが必要になりますので、インストールします。
cd ~/download
wget http://chasen.org/~taku/software/darts/src/darts-0.32.tar.gz
cd ~/src
tar xzvf ../download/darts-0.32.tar.gz
cd darts-0.32/
./configure
make
make install

ChaSen本体のインストール

本体をインストールします。
cd ~/download
wget 'https://ja.osdn.net/frs/redir.php?m=jaist&f=%2Fchasen-legacy%2F56305%2Fchasen-2.4.5.tar.gz' -O chasen-2.4.5.tar.gz
cd ~/src
tar xzvf ../download/chasen-2.4.5.tar.gz
cd chasen-2.4.5/
./configure
make
make install

chasen辞書のインストール

辞書は別途用意されているので、ダウンロードしてインストールします。
wget 'https://ja.osdn.net/frs/redir.php?m=ymu&f=%2Fipadic%2F24435%2Fipadic-2.7.0.tar.gz' -O ipadic-2.7.0.tar.gz
cd ~/src/
tar xzvf ../download/ipadic-2.7.0.tar.gz
cd ipadic-2.7.0/
./configure
make
make install
chasen自体はEUCをベースにしていますので、そのままだと文字化けします。
echo "これは、テストです。"|nkf -e|chasen|nkf -w
これ    コレ    これ    名詞-代名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS
仕方ないので、nkfを両端に挟んでみましたが、たぶんコストも大きくなりますし、見た目が悪いw

辞書をutf-8に変更

なんとか、utf-8に変更したいと思って方法を探していたところ、Qiitaにいい記事がありましたので、参考にしつつut-8に変更を行いました。
cd ~/src/ipadic-2.7.0/
make clean
find -name '*.dic' | xargs nkf --overwrite -w
find -name '*.cha' | xargs nkf --overwrite -w
`chasen-config --mkchadic`/makemat -i w
`chasen-config --mkchadic`/makeda -i w chadic *.dic
./configure
make
make install
nkf -w --overwrite /usr/local/etc/chasenrc
この状態でテストを行います。chasenには-iwのオプションを付けて呼び出します。
echo 'これは、テストです。'|chasen -iw
これ    コレ    これ    名詞-代名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS
ちなみに、ChaSenの辞書も古いためそのままでは、新しめの単語には対応できません。
echo 'クラウド'|chasen -iw
クラ    クラ    クラ    名詞-固有名詞-一般
ウド    ウド    ウド    名詞-一般
EOS

Python3から呼び出す

これは、wrapperが見つかりませんでしたので、プロセスを呼び出す要領で標準出力を配列に格納します。 ほかに何か良い方法があれば、だれか教えてください。
ファイル: chasen.py
import subprocess

def strip_cmd_injection(instr):
    inj = [";", "|", "&", "`", "(", ")", "$", "<", ">", "*", "?", "{", "}", "[", "]", "!", "\n"]
    for s in inj:
        instr = instr.replace(s,"")
    return instr

def chasen(arg):
    arg = strip_cmd_injection(arg)
    cmd = "echo {0} | chasen -iw".format(arg)
    proc = subprocess.Popen(
        cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    if stderr != b'':
        raise(Exception(stderr.decode("utf-8")))

    for line in stdout.decode('utf-8').split("\n"):
        if (line == "EOS"):
            break
        yield line.split("\t")

if __name__ == '__main__':
    import sys
    for line in sys.stdin:
        for cha in chasen(line):
            print (cha)
実行すると、下記のような結果が得られます。各要素が配列になっているので、取り出して使うことを想定しています。
echo "これはてすとです。" | python3 sample.py
['これ', 'コレ', 'これ', '名詞-代名詞-一般', '', '']
['はて', 'ハテ', 'はて', '副詞-一般', '', '']
['す', 'ス', 'す', '名詞-一般', '', '']
['と', 'ト', 'と', '助詞-格助詞-一般', '', '']
['で', 'デ', 'で', '助詞-格助詞-一般', '', '']
['す', 'ス', 'する', '動詞-自立', 'サ変・スル', '文語基本形']
['。', '。', '。', '記号-句点', '', '']

2017年9月9日土曜日

Python3からJUMAN++を使う@CentOS7



JUMAN++は、京都大学黒橋・河原研究室で開発されている日本語の形態素解析システムです。RNNを使った言語モデルを使用しているとのことで、MecabやJUMANより自然な感じの形態素解析ができるらしいです。(雑な説明でごめんなさい)
今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • JUMAN 1.02
  • Python 3.4
  • CentOS 7.3
今回もコンパイルして入れます・・・が、Boost C++ Libraryというものが必要です。 CentOS 7のリポジトリにはJUMAN++に要求されるバージョン(1.58)より古いバージョン(1.53)しかないので、仕方がないのでこちらも最新のもの(1.65)をコンパイルしてインストールします。
とても時間がかかりました。

準備

とりあえず、gccとc++が必要ですのでインストールします。それとPython-develが必要になりますので、インストールします。 (Python3-develでは、boostのコンパイル時にエラーが出るようです。)
yum install gcc gcc-c++ python-devel
yum install epel-release
yum install python34 python34-devel python34-pip

Boost C++ Libraries のインストール

Boostの公式サイトからソースをダウンロードします。
インストール方法は公式サイトの5.2.1に書いてあるみたいです。
なお、Boost C++ Librariesのインストールに当たっては、「boostjp : Boost日本語情報サイト」が大変参考になりました。
mkdir download
mkdir src
cd download
wget https://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_65_1.tar.gz
cd ~/src
tar xzvf ../download/boost_1_65_1.tar.gz

cd boost_1_65_1/
./bootstrap.sh

./b2 install -j2

-j2の部分はコア数に応じて増やした方が、コンパイルが早く終わると思います。

JUMAN++のインストール

長いコンパイルが終わるとやっとJUMAN++のインストールに入れます。 JUMAN++自体は、コンパイルしてインストールするだけです。
cd ~/download/
wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz&name=jumanpp-1.02.tar.xz' -O jumanpp-1.02.tar.xz
cd ~/src
tar Jxfv ../download/jumanpp-1.02.tar.xz
cd jumanpp-1.02/

./configure
make
make install
正常に動作するか確認します。
echo "これは、テストです。" | jumanpp

これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
テスト てすと テスト 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習"
です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS
上記のような表示されれば、インストールは成功です。

Pythonバインディングのインストール

PyKNPはJUMANをインストールした際に合わせてインストールしている場合は、読み飛ばしてください。
pip3 install six
cd ~/download/
wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz' -O pyknp-0.3.tar.gz
cd ~/src/
tar xzvf ../download/pyknp-0.3.tar.gz
cd pyknp-0.3/
python3 setup.py install



テストプログラムを書いて実行してみます。
ファイル: test.py
from pyknp import Jumanpp

j = Jumanpp()
r = j.analysis('これは、テストです。')
for m in r.mrph_list():
    print (m.midasi, m.yomi, m.genkei, m.hinsi, m.bunrui, m.katuyou1, m.katuyou2, m.imis, m.repname)
下記のように表示されれば、成功です。
python3 test.py 
これ これ これ 指示詞 名詞形態指示詞 * * NIL 
は は は 助詞 副助詞 * * NIL 
、 、 、 特殊 読点 * * NIL 
テスト てすと テスト 名詞 サ変名詞 * * 代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習 テスト/てすと
です です だ 判定詞 * 判定詞 デス列基本形 NIL 
。 。 。 特殊 句点 * * NIL

Python3からJUMANを使う@CentOS7


JUMANは、京都大学黒橋・河原研究室で開発されている日本語の形態素解析システムです。これを入れると、日本語の形態素解析ができます。(雑な説明でごめんなさい)
今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • JUMAN 7.01
  • Python 3.4
  • CentOS 7.3

準備

コンパイルしてインストールしますので、gccを入れておいてください。
yum install bzip2 gcc
yum install epel-release
yum install python34 python34-devel python34-pip

JUMANのインストール

ダウンロードしてコンパイルしてインストールするだけです。あまり迷うところもないような気がします。
mkdir download
mkdir src cd download/ wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2&name=juman-7.01.tar.bz2' -O juman-7.01.tar.bz2 cd ~/src tar xvf ../download/juman-7.01.tar.bz2 cd juman-7.01/ ./configure make make install
実行すると下記のような出力を得ることができます。
echo "これは、テストです。" | juman
これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
テスト てすと テスト 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習"
です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS

Pythonバインディングのインストール

あとは、Pythonから呼び出せるようにWrapperをインストールするだけです。PyKNPというPythonバインディングをインストールすることになりますが、pipでは入りませんので、京都大学からダウンロードして、インストールします。また、Pythonのsixというライブラリも必要になりますので、あらかじめインストールしておきます。(sixはPython2とPython3の互換ライブラリです)
pip3 install six
cd ~/download/
wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz' -O pyknp-0.3.tar.gz
cd ~/src/
tar xzvf ../download/pyknp-0.3.tar.gz
cd pyknp-0.3/
python3 setup.py install
テストプログラムを作ります。
ファイル: test.py
from pyknp import Juman

j = Juman()
r = j.analysis('これは、テストです。')
for m in r.mrph_list():
    print (m.midasi, m.yomi, m.genkei, m.hinsi, m.bunrui, m.katuyou1, m.katuyou2, m.imis, m.repname)
無事動作することが確認できました。
python3 test.py 
これ これ これ 指示詞 名詞形態指示詞 * * NIL
は は は 助詞 副助詞 * * NIL
、 、 、 特殊 読点 * * NIL
テスト てすと テスト 名詞 サ変名詞 * * 代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習 テスト/てすと
です です だ 判定詞 * 判定詞 デス列基本形 NIL
。 。 。 特殊 句点 * * NIL
JUMANは、Wikipediaから辞書を持ってきているようですので、MeCabと違って辞書などを登録しなくとも新しめの単語を認識することができます。
echo "クラウド"|juman

クラウド クラウド クラウド 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipedia多義"
EOS

Python3からMeCabを使う@CentOS7


MeCabをソースからインストールします。
groongaのリポジトリ追加に抵抗がない場合は、そちらでも良いと思います。

今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • CentOS 7.3
  • Python 3.4
  • mecab 0.996
  • ipadic 2.7.0-20070801

準備

Python3.4を入れるためにEPELのリポジトリを入れます。 あと、gcc-c++が入っていないと、./configureした際に「configure: error: Your compiler is not powerful enough to compile MeCab.」とエラーが出ますので、gcc-c++もインストールしておきます。
yum install epel-release
yum install python34 python34-devel python34-pip
yum install gcc gcc-c++
yum install wget

MeCab本体のインストール

まずは、本体のインストールを行います。ついでに辞書もダウンロードしてきます。configureのオプションでutf-8を入れるのを忘れないようにします。
mkdir download
mkdir src
cd download
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM' -O mecab-ipadic-2.7.0-20070801.tar.gz
cd ~/src
tar xzvf ../download/mecab-0.996.tar.gz
cd mecab-0.996/
./configure --with-charset=utf8
make
make install
辞書を入れる前に実行してみるとエラーが出ます・・・。
mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc

MeCab辞書のインストール

辞書のconfigureオプションにもutf-8を指定します。
cd ..
tar xvzf ../download/mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801/
./configure --with-charset=utf8
make
sudo make install
とりあえず実行してみて、下記のように分解されればインストールは終了です。
echo "これは、テストです。"|mecab
これ    名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
、      記号,読点,*,*,*,*,、,、,、
テスト  名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
EOS

Pythonバインディングのインストール

次にPython3から呼び出せるように環境を整えていきます。pipでmecab-python3というライブラリを入れます。
pip3 install mecab-python3
ld.so.confを編集して2行目を加えます。
ファイル: /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib/ # この行を追加
ldconfigで共有ライブラリの依存関係を更新します。
ldconfig
/usr/local/lib/をld.so.confに書く前に実行すると下記のエラーが表示されます。
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
適当なプログラムを書いてみます。
ファイル: test.py
import MeCab

mecab = MeCab.Tagger("-Ochasen")
print(mecab.parse("これは、テストです。"))
実行して、先ほどと同様の結果が得られれば、成功です。
python3 test.py
これ    コレ    これ    名詞-代名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS
Pythonから呼び出した結果は、Tabでsplitして変数に格納して使うか、-Ochasenを-Owakachiにして空白などで結合して使うことが多いようです。 また、プログラムが古めですので、実際に使うには辞書が不足しているため、辞書を追加したほうがいいです。
echo "クラウド"|mecab
クラ    名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド    名詞,一般,*,*,*,*,ウド,ウド,ウド
EOS
wikipediaの見出しを使うことが多いみたいです。

mecab-ipadic-NEologdの追加

辞書が古いので、新しい辞書を追加します。gitとpatchが必要になりますので入れておきます。
yum install git patch
mecab-ipadic-neologdをダウンロードしてインストールします。途中で、インストールするか聞かれますので、「yes」と入力してください。辞書は「/usr/local/lib/mecab/dic/mecab-ipadic-neologd」にインストールされます。
cd ~/src
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd/
./bin/install-mecab-ipadic-neologd -n
#長々とメッセージが流れた後にインストールするか聞かれます。
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
yes 
インストールが完了したら、先ほどは認識できなかった「クラウド」という単語が登録されているか確認してみます。
echo "クラウド"|mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
クラウド        名詞,固有名詞,人名,一般,*,*,CLOUD,クラウド,クラウド
EOS
Pythonから呼び出すときもこのディレクトリを含めて呼び出すことを忘れないようにしてください。
mecab = MeCab.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
なお、NEologdのGitHUBのページには正規化の方法が詳しく書いてあり、正規化用のPythonのコードもついていて大変参考になります。なお、この正規化をやったうえで、個人的にさらに気になる点があるとすれば、下記の部分です。
  • 数字と数字の間のカンマの削除(12,345,678とか)
  • カタカナの単位(メートルとか)
  • 100mm以上のミリメートル
  • 漢数字(11兆9000億円→11900000000000円)

2017年8月16日水曜日

Apacheで特定の国からのアクセスを拒否する


for CentOS7.x

GCEの利用料金を抑えるため、1パケット目から料金の発生する中国とオーストラリアからのHTTPリクエストに拒否応答(403)を返すApacheの設定です。

完全に遮断したいのであれば、GCEのFWでブロックしたほうがいいのですが、中国もオーストラリアもとなると対象IPが多すぎるのと一つ一つ登録するのが面倒なので・・・

まずは、mod_geoipをインストールします。
sudo yum install mod_geoip
次にGeoIPのデータベースをmaxmind社からダウンロードして配置しておきます。
Licenseは CC BY-SA 3.0で、下記の文章を製品などに含むことでライセンスを満たすことになるようです。
この製品には MaxMind が作成した GeoLite2 データが含まれており、
<a href="http://www.maxmind.com">http://www.maxmind.com</a> から
入手いただけます。
mkdir geoip
cd geoip/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
sudo mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat.bak
sudo mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
httpdのconfを変更します。mod_geoipのconfigは/etc/httpd/conf.d/geoip.confに配置されますので、若干の修正を加えます。
sudo vi /etc/httpd/conf.d/geoip.conf

<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat

  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
</IfModule>
あとは、httpd.confでCountry Codeをブラックリストとして登録して拒否します。
sudo vi /etc/httpd/conf/httpd.conf

<Location "/">
  Order allow,deny
  SetEnvIf GEOIP_COUNTRY_CODE CN BLACKLIST_COUNTRY
  SetEnvIf GEOIP_COUNTRY_CODE AU BLACKLIST_COUNTRY

  Allow from all
  Deny from env=BLACKLIST_COUNTRY
</Location> 
ログにCountry Codeを追加したい場合は"%{GEOIP_COUNTRY_CODE}e"を追加すると、下図のようにJPとかUSとかがログに記載されるようになります。
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e" combined
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e"
あと、403を返す時に少しでもサイズを減らすため、最小の文字列を返すように設定しておきます。まぁ、1文字でもいいと思いますが、E403とだけ返すように設定してみました・・・。
ErrorDocument 403 "E403"
最後にhttpdを再起動して設定を反映させてください。
sudo systemctl restart httpd
以上ですー。

2017年8月7日月曜日

顔を認識してモザイクをかける@OpenCV3 + Python3

USBカメラなどから画像を取り込んで、顔と認識した部分にモザイクを掛けます。 都度顔認識していますので、物体追跡させて方が効率がいいのかも。

# -*- coding: utf-8 -*-
# for Python 3.4, 3.5
import cv2

def mozaic(cascade, image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = cascade.detectMultiScale(
        gray, scaleFactor=1.11, minNeighbors=4, minSize=(5, 5))

    # 検出した部分を縮小して、拡大(最近傍補間)する
    for [x, y, w, h] in faces:
        face = image[y:(y + h), x:(x + w)]
        face_tmp = cv2.resize(face, (int(w/20),int(h/20)))
        face = cv2.resize(
            face_tmp, (w,h), interpolation=cv2.INTER_NEAREST)
        image[y:(y + h), x:(x + w)] = face
    return image

# デバイスは固定
cap = cv2.VideoCapture(0)
if cap.isOpened() is False:
        raise("IO Error.")

# haarcascade_frontalface_alt.xmlは下記から持ってくる
# https://github.com/opencv/opencv/tree/master/data/haarcascades
cascade_path = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

while True:
    ret, frame = cap.read()
    frame = mozaic(cascade, frame)
    cv2.imshow('image', frame)
    k = cv2.waitKey(1)
    if k == 27:
        break;
        
cap.release()
cv2.destroyAllWindows()

Python3 IPアドレスから国の情報を取得

geolite2とかはPython3では使えなくなっているので注意が必要。

コード:

# -*- coding: utf-8 -*-
# for Python 3.4, 3.5
import geoip2.database as geodb
import geoip2.errors as geoerr

rec_city = geodb.Reader('GeoLite2-City.mmdb')
try:
    rec = rec_city.city("23.44.226.40")
    if rec:
        print(rec.country.iso_code)
        print(rec.country.names["ja"])
        print(rec.country.name)
        print(rec.city.names["ja"])
        print(rec.city.name)

except geoerr.AddressNotFoundError as anfe:
    print (anfe)



実行結果:
 US
 アメリカ合衆国
 United States
 ケンブリッジ
 Cambridge

GeoLite2-City.mmdbは下記のURLからダウンロード
https://dev.maxmind.com/ja/geolite2/
Licenseは CC BY-SA 3.0
下記の文章を製品などに含むことでライセンスを満たすことになるようです。
この製品には MaxMind が作成した GeoLite2 データが含まれており、
<a href="http://www.maxmind.com">http://www.maxmind.com</a> から
入手いただけます。

2017年7月5日水曜日

PostfixLogParser

Postfixのログすごく読みやすいのですが、集計とかしたいときに結構困ります。
pflogsummも使ってみたのですが、いまいち思ったような解析ができません。
できれば、1行1ログにしたいが思ったようなツールがなくて・・・

仕方ないので作ってみましたー

PostfixLogParser
https://github.com/umiushi-zn/PostfixLogParser/

動作確認は 、下記の環境で行ってます。
CentOS6 + Python 3.4
CentOS7 + Python 3.4
Postfixのバージョンは2.6.6です。

GitHubなんて素敵なものを初めて使ってみましたが、こんな感じで良いのでしょうかね。
一応GPLv3にしておきましたので、間違っていたら修正して頂けるとありがたいですー

これで出力したものをFluentdやSplunkで読み出して集計できるといいなぁ


2016年7月12日火曜日

Pythonで大きいファイルのMD5を計算する

Python 2.7, 3

本当はSHAの256がほしかったんだけど、
ダウンロード元のメーカーが提供しているSHA256が間違っていて使えないことが判明したので・・・;;
MD5で我慢してみる。

import hashlib

BUFFER=4096

def md5sum( filepath ):
    hasher = hashlib.md5()
    with open( filepath, "rb" ) as f:
        for chunk in iter( lambda: f.read( BUFFER * hasher.block_size ), b'' ):
            hasher.update( chunk )
    return hasher.hexdigest()

print (md5sum("./md5sum.py"))


md5となっているところをsha256に変更すればSHA256でも動く


SHA1なら下記のような感じで・・・
import hashlib

BUFFER=4096

def sha1sum( filepath ):
    hasher = hashlib.sha1()
    with open( filepath, "rb" ) as f:
        for chunk in iter( lambda: f.read( BUFFER * hasher.block_size ), b'' ):
            hasher.update( chunk )

    return hasher.hexdigest()

print sha1sum("./sha1sum.py")
ファイルサイズが小さいと、本家sha1sumより2桁くらい遅いけど
ファイルが300Mくらいまで大きくなると逆転する。

意外と効率良いのかも?


hashlibが対応している暗号化方式は下記で確認できる。

print hashlib.algorithms


2016年6月25日土曜日

NOOBSでRaspberry PiにRaspbianをインストール(2016/06/25版)

準備編

まず、パソコンなどからRaspberry Pi財団のサイトに行きNoobsをダウンロードします。

Download NOOBS for Raspberry Pi

NOOBS と NOOBS LITEがありますが、
OSのイメージを含んでいるのはNOOBSのほうなのでNOOBSをダウンロードします。
# LITEはインストール中にダウンロードを行うようです。



まぁ、普通に[Download ZIP]を選択すればいいでしょう

ダウンロードしている間にSDカードをフォーマットします。
SDカードはFAT32でフォーマットされていればOKです。
ちなみにSDカードはTOSHIBAの32GBの800円くらいのものを使いました。
若干相性などもあるようですので、購入時は注意したほうがいいです。

ダウンロードが完了したらZIPファイルをまるっと選択してSDカードにコピーします。


これで準備完了。

インストール編

SDカードを取り出して、Raspberry Piに差し込みます。
モニタはあらかじめ繋げておたほうがいいです。

起動後は、[Raspbian]を選択し、[Install]をクリックします。
 

SDカードのデータはすべて上書きされる旨の警告が表示されますが、[Yes]を選択します。


インストールが始まります。30分くらいはかかるので、気長に待ちます。


"OS(es) Installed Successfully"というメッセージが表示されたら、インストール完了です。[OK]をクリックして再起動してください。


再起動すると、Raspbianが起動してきます。

いじょうでーす。