PythonからRを利用

PythonからRを利用する。

ライブラリはPypeR(PYthon-piPE-R), RPy2がメジャーなようだが、Google Trendsによると下図の状態なのでPypeRを使う。

スクリーンショット 2014-12-13 21.57.23

 

1. インストール

公式サイトに従って行う。

$ pip3 install PypeR

公式サイトの記述はいたってシンプル。同梱のtest.pyを見ろとのこと。

 

2. 基本的な連携

準備

from pyper import *
r = R()

Rコード実行

r('a <- 1; b <- 2; a + b')

or

r(['a <- 1'], ['b <- 2'], ['a + b'])

値の設定

r['a'] = x

or

r.a = x

値の取得

x = r['a']

or

x = r.b

少し複雑なコードの実行。

val = r['(2*pi + 3:9)/5']

3. 実践

Rのnnet(ニューラルネットワーク)を使ってXOR問題を解く。

from pyper import *
import numpy
r = R()
r('library(nnet)')
data = [[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]]
r['xor.data'] = numpy.array(data)
r('xor.data <- data.frame(xor.data)')
r('xor.nnet <- nnet(X3~., size = {size}, decay = {decay}, data = xor.data)'.format(size = 2, decay = 0))
r('xor.pred <- predict(xor.nnet, xor.data)')
result = r['xor.pred']
# 必要に応じてオブジェクトの保存
r('save(xor.nnet, file = "xor.dat")')
# 次回利用時(nnetの読み込みは再度必要)
r('load(file = "xor.dat")')

XORの場合、過学習を考えるとsoftmaxの方がいい。

上記と同様のRコードは下記。

library(nnet)
xor.data = data.frame(matrix(c(0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0), 4, 3))
xor.nnet <- nnet(X3~., size = 2, decay = 0, data = xor.data)
xor.pred <- predict(xor.nnet, xor.data)
xor.pred

参考

Pylearn2でニューラルネットワーク(python3 + mac)

Pybrainのニューラルネットワークが遅すぎたので(Cで実装されたR nnetの100倍くらい?)、Deep learningで有名なPylearn2を使う。(CやGPU利用で高速化されている)

 

1. 依存ライブラリのインストール

Theano, Cythonをインストール。Theanoはpip3でインストールするとpython3かCコンライラ関連でエラーになるので、gitから直接インストール。

$ pip3 install --upgrade --no-deps git+git://github.com/Theano/Theano.git
$ pip3 install Cython

 

2. Pylearn2のインストール

公式ドキュメントに従って進める。

$ git clone git://github.com/lisa-lab/pylearn2.git
$ cd pylearn2
$ python setup.py develop

 

3. ニューラルネットワーク

Pylearn2は通常YAML形式で構造などを記述するが、慣れないのでここGist)を参考に普通のPythonコードっぽく構築する。

print文だけ、python3の形式に変更する必要がある。

 

参考

Vimのカラースキーマを変更する

画像

Vimのカラーを変更する。

 

1. カラースキーマのダウンロード

ここで紹介されている人気のmolokaiをダウンロード。

 

2. スキーマの設定

$ mkdir ~/.vim/colors
$ mv molokai.vim ~/.vim/colors/

~/.vimrcに以下を記載

colorscheme molokai

3. 設定後

スクリーンショット 2014-12-08 0.03.58

参考

Vimでpython開発環境を準備する

mac + vimでpython3の開発環境を準備する。(python3自体のインストールは$ brew install python3)

1. vimのインストール

macにデフォルトでインストールされているvimはクリップボード連携がサポートされていないため、homebrewでvimをインストールする。

この際、単純brew install vimだとpythonがサポートされていない(jedi-vimで必要な)ため、以下のオプションでインストール。すでにbrewでインストール済みの場合は事前にbrew remove vimする。

$ brew install vim install --enable-interp=python,python3

pythonをサポートしていることを確認。+pythonならサポート。-pythonだとサポートしていない。

$ vim --version | grep python
+python

 

2. プラグインのインストール

このエントリーのNeoBundleで下記のプラグインをインストールする。

  • quickrun → コードの簡易実行
  • jedi-vim → 入力補完
  • syntastic → 文法チェック
  • unite → unite-outlineに必要
  • unite-outline → アウトライン表示(originalの’h1mesukeha’はメンテナンスされていないためuniteのauthorのShougo/unite-outlineを使用)

3. quickrunの設定

.vimrcに下記を記載。実行時に縦分割でなく、横分割する。

let g:quickrun_config = {}
let g:quickrun_config = {'*': {'split': ''}}

4. jedi-vimの設定

mac + brewインストールのpython3を使用している場合、jedi-vimから呼び出されるpythonがdefaultのpython2.xを利用していることがあるのため、~/.vim/bundle/jedi-vim配下で以下を実行。

$ git submodule update --init

5. unite-outlineの設定

unite-outlineをctrl + oで実行できるようにする。.vimrcに以下を記載。

nnoremap <C-o> :Unite -vertical -no-quit -winwidth=32 outline<Esc>

6. 設定後

スクリーンショット 2014-12-08 0.06.58

参考

Vim PluginをNeobundleで管理する

Vimの管理にVundleを導入して、管理を容易にする。

1. インストール

公式のマニュアルに従って行う。

$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

~/.vimrcに以下を追記。今回は、quickrun, jedi-vim, syntastic, unite-outline(requiring unite)を管理対象にする。

" Note: Skip initialization for vim-tiny or vim-small.
if !1 | finish | endif

if has('vim_starting')
  set nocompatible               " Be iMproved

  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" My Bundles here:
" Refer to |:NeoBundle-examples|.
" Note: You don't set neobundle setting in .gvimrc!
" Run commands quickly
NeoBundle 'thinca/vim-quickrun'
" autocompletion
NeoBundle 'davidhalter/jedi-vim'
" syntax checking plugin
NeoBundle 'scrooloose/syntastic'
" Outline plugin
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/unite-outline'

call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck

2. 実行

vimを起動するか、起動時にインストールNoにした場合は起動後に以下のインストールコマンドでインストール可能。

操作 コマンド 備考
インストール :NeoBundleInstall
アップデート :NeoBundleUpdate
アンインストール :NeoBundleClean .vimrcの記述削除後に実行

 

参考

カテゴリー: Vim

Pybrainでニューラルネットワーク

Python3、ニューラルネットワークで機械学習する。
ニューラルネットワーク自体は古い手法だが仕組みは簡単なので、ざっとした手元検証用。

1. インストール
ニューラルネットワークでメジャーなPybrainをインストール。

pip3だとpython2対応のpybrainになるため、gitからコピーしてインストールする。

$ git clone git://github.com/pybrain/pybrain.git
$ cd pybrain
$ python3 setup.py install

あとは公式のdocに従って下記の通り進める。

# 公式ドキュメントがpythonコマンドを使っているところはpython3を使用する。

2-a. シンプルな方法でバックプロパゲーション

xor問題を説く。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, TanhLayer, SoftmaxLayer, BiasUnit
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# 入力ユニット2、隠れユニット2、出力ユニット1、隠れと出力にバイアス入力有り。
nn = buildNetwork(2, 2, 1, bias=True)
# 訓練データ
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# バックプロパゲーションをセット。学習係数と安定化係数を設定。
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
# 1,000回繰り返し訓練
trainer.trainEpochs(1000)
# 結果出力
print(nn.activateOnDataset(ds))

結果は以下で、正しくパターン認識できている。

[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]

 

2-b. 柔軟な方法でバックプロパケーション

ユニットの接続などを柔軟に行える方法で、2-aと同じネットワークを作る。

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, SoftmaxLayer, BiasUnit
from pybrain.structure import FullConnection
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# ベースとなるフィードフォワードネットワークを作成
nn = FeedForwardNetwork()
# 入力、バイアス、隠れ、出力レイヤーを作成
input = LinearLayer(2)
bias = BiasUnit()
hidden = SigmoidLayer(2)
output = SigmoidLayer(1)
# ネットワークにレイヤーを追加。
nn.addInputModule(input)
nn.addModule(bias)
nn.addModule(hidden)
nn.addOutputModule(output)
# レイヤーを接続。バイアスは隠れ層と出力層両方に接続。
nn.addConnection(FullConnection(input, hidden))
nn.addConnection(FullConnection(bias, hidden))
nn.addConnection(FullConnection(hidden, output))
nn.addConnection(FullConnection(bias, output))
# 学習前の準備
nn.sortModules()
# 学習データの作成
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# 学習
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
trainer.trainEpochs(1000)
# テスト
print(nn.activateOnDataset(ds))

結果は2-aと同様。

 

参考

ログ分析ツールLogwatchのインストール

サーバログを解析してレポートを作成、送信してくれるLogwatchを導入する。デフォルトで解析対象外のnginxまで対応で行う。

 

1. インストール

# yum install logwatch

 

2. 初期設定

デフォルトの設定ファイル/usr/share/logwatch/default.conf/logwatch.confからの変更点のみ/etc/logwatch/conf/logwatch.confに記載すればよいが、DailyReportパラメータのみはデフォルトファイルを変更する必要がある(cronが直接確認しているため)。面倒なのでデフォルトを変更することにする。

# cp /usr/share/logwatch/default.conf/logwatch.conf /usr/share/logwatch/default.conf/logwatch.conf.old
# vim /usr/share/logwatch/default.conf/logwatch.conf
# レポートメールの送信先
MailTo = hoge@hoge.com

レポート内容をコンソールに出力して確認。

# logwatch --print

一部の設定を一時的に変更して確認するには、例えば、sshdサービスの全ての期間のログを詳細レベルで出力する場合は以下。

# logwatch --service sshd --range all --detail high --print

logwatchの定期実行はdaily cronで行われる。実行内容のテスト。

# /etc/cron.daily/0logwatch

先ほど設定したメールにレポートが届いていればOK。CentOSでの日次、週次cronの設定は/etc/anacrontabに記載されている。

3. nginxのログ

ここを参考に進める。httpdの設定をそのまま流用できるため、関連ファイルを複製。

# cp /usr/share/logwatch/scripts/services/http /etc/logwatch/scripts/services/nginx
# cp /usr/share/logwatch/default.conf/services/http.conf /etc/logwatch/conf/services/nginx.conf
# cp /usr/share/logwatch/default.conf/logfiles/http.conf /etc/logwatch/conf/logfiles/nginx.conf
# vim /usr/share/logwatch/default.conf/services/nginx.conf
Title = "nginx" # httpdから変更
LogFile = nginx # httpから変更
# vim /etc/logwatch/conf/logfiles/nginx.conf

apacheの記述は全てコメントアウトして、必要なのは以下のみ。

LogFile = nginx/access*.log
Archive = nginx/access*.log-*.gz
*ExpandRepeats
*ApplyhttpDate

リポート内容の確認。

# logwatch --service nginx --range today  --print

 

■参考

 

Procmail(Postfix + Virtual Host/Domain)で迷惑メールをフィルタする

PostfixとProcmailを連携させて、迷惑メールをフィルタリングする。Postfixでは、header_checks, body_checksを使って簡単なフィルタリングはできるが、Base64エンコードされたメールに対応できない。

1. Procmailのインストール

# yum install procmail

 

2. レシピ(フィルタ)の設定

拒否ワードが本文に含まれるメールを削除する。まずは、拒否ワードリストの作成。

# mkdir /etc/procmail
# vim /etc/procmail/spamwords

上記ファイルにスパムワードを1行に1つずつ記載。スパムワードは、本文中に記載されているドメイン名がよい。迷惑サイトに誘導するために有害なドメインを記載している可能性が高い。

続いて、/etc/procmailrcを作成し、レシピを記載する。

SHELL=/bin/bash
PATH=/usr/bin:/bin
MAILDIR=/var/spool/mail/vhosts/$DOMAIN/$USER/Maildir
# Maildir形式で運用している場合、最後のスラッシュが必須
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log

SPAMWORDS=/etc/procmail/spamwords

# Base64エンコードされたメール
:0 B
*? test -s $SPAMWORDS
*? nkf -wmB | fgrep -iqf $SPAMWORDS
#$MAILDIR/trash/. → 削除でなくゴミ箱に移動する場合は下行ではなくこちら
/dev/null

# Base64エンコードされていないメール
:0 B
*? test -s $SPAMWORDS
*? nkf -w | fgrep -iqf $SPAMWORDS
#$MAILDIR/trash/.
/dev/null

3. Postfixの設定変更

postfixからprocmailに処理を渡すために、/etc/postfix/main.cfの最後に以下を追加。

# virtualhostを利用している場合、mailbox_commandは呼び出されないので注意。

local_transport = virtual
virtual_transport = procmail

続いて/etc/postfix/main.cfの最後に以下を追加。

procmail  unix  -       n       n       -       -       pipe
  flags=R user=vmailuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

vmailuserはpostfixのvirtual hostで利用しているユーザを指定する。ユーザをmain.cfで下記のようにuidで指定している場合、実際のユーザとグループを作成する必要がある。

virtual_uid_maps = static:5000

ユーザとグループの作成。

# groupadd -g 5000 vmailuser
# useradd -u 5000 -g vmailuser -s /sbin/nologin vmailuser

postfixを再起動して設定完了。

# service postfix restart

 

■参考

Nagiosのインストール(Nginx + CentOS)

CentOS 6.5 + Nginx環境にOSSの監視ツールNagiosをインストールする。

公式サイトではソースコードからインストール方法が記載されているが、メンテが面倒なのでyumでインストールする。

1. インストール

公式リポジトリにはないため、epelを利用する。

# yum install --enablerepo=epel nagios nagios-plugins

nagiosユーザ、グループも追加される。

nginxがnagios関連ファイルにアクセスできるようにnginxユーザをnagiosグループに追加する。

# usermod -Ga nagios nginx

 

2. BASIC認証の設定

# htpasswd -bc /etc/nagios/passwd id password

idとpasswordは任意の値を設定。

 

3. 通知先を設定

/etc/nagios/objects/contacts.cfg

email nagios@localhot → 通知先に変更

Nagiosの自動起動の設定と、サービスの起動。

# chkconfig nagios on
# service nagios start

この時点で監視が開始されるが、NagiosのWebインタフェース(例えばTactical View)はCGIの設定が完了するまで利用できない。

 

4. CGIの設定

NagiosのWebインタフェース(管理画面)では、PHPとCのCGIを利用するため、php-fpmとfgiwrap + spawn-fcgiをインストールする。php-fpmの設定はこのエントリーで実施済みなので、fcgiwrap + spawn-fcgiの設定をこの記事を参考に行う。

まずはfcgiwrapのインストール。

# cd /usr/local/src/
# git clone git://github.com/gnosek/fcgiwrap.git
# cd /usr/local/src/fcgiwrap
# autoreconf -i
# ./configure
# make
# mv fcgiwrap /usr/local/bin/

initスクリプトを上記サイトのものをそのまま作成する。

/etc/init.d/fcgiwrap

fcgiwrapが自動起動するように/etc/rc.localの最後へ下記を追記する。

sudo -u nginx /etc/init.d/fcgiwrap

fcgiwrapの設定が終わった時点で単純なCGIは動作するが、NagiosのWebインタフェースはうまく動作せず、以下のようなエラーが表示される。おそらく認証周りの問題。

Whoops!

Error: Could not read object configuration data!

Here are some things you should check in order to resolve this error:

Verify configuration options using the -v command-line option to check for errors.
Check the Nagios log file for messages relating to startup or status data errors.

よって、spawn-fcgiを導入する

# yum install spawn-fcgi

ここを参考に、/etc/sysconfig/spawn-fcgiへ以下を記載。最初から記載していある項目はコメントアウト。

CGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/bin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

起動と自動起動の設定。

# chkconfig spawn-fcgi on
# service spawn-fcgi start

 

5. Pluginの設定

この時点でWebインタフェースのServiceを確認すると全ての監視項目がNGになっている。監視を行うにはplug-inのインストールが必要。

今回は、デフォルトの8つに加えて、smtp, popのplug-inをインストールする。

yum install --enablerepo=epel nagios-plugins-ping nagios-plugins-load nagios-plugins-users nagios-plugins-http nagios-plugins-disk nagios-plugins-ssh nagios-plugins-swap nagios-plugins-procs nagios-plugins-smtp nagios-plugins-pop

smtp, popの設定を行う。smtpはsmtp over SSLでポート番号465を利用する場合下記。

/etc/nagios/objects/localhost.cfg

# smtp(abeerforyou's original)
define service{
    use                     local-service
    host_name               localhost
    service_description     SMTP
    check_command           check_smtp!'-P 465 -w 60 -c 300'
    notifications_enabled   1
}

# pop(abeerforyou's original)
define service{
    use                     local-service
    host_name               localhost
    service_description     POP
    check_command           check_pop!'-w 60 -c 300'
    notifications_enabled   1
}

以上で、監視が開始される。

nagios_status

Webインタフェースで確認できるReportの値をリセットするには/var/log/nagios/archives配下で該当日付のログを消去すればよい。

例えば3日より古いデータを消すには以下。

find /var/log/nagios/archives/ -mtime +3 | xargs rm -f

■参考