Webサイトをselenium + Xvfb + sshでpythonから操作する

SeleniumのWebDriverを使って、webページをpythonプログラム内から操作する。

SSH先のサーバでディスプレイがない環境を想定。

1. Seleniumのインストール

公式サイトに従ってSeleniumをインストール。

$ pip3 install -U selenium

 

2. Xvfbのインストール

仮想ディスプレイのXvfbをインストールする。

$ sudo yum install xorg-x11-server-Xvfb
$ sudo yum -y groupinstall "X Window System"
$ sudo yum -y groupinstall "Japanese Support"

~/.bashrcに以下を追記。

export DISPLAY=:1

Xvfbを起動。nohubしなくてもssh終了時に強制終了しない。

$ Xvfb :1 -screen 0 1024x768x24 &

上記Xvfbコマンドでmachine-idなしエラーが発生する場合は下記。

$ su -
# dbus-uuidgen > /var/lib/dbus/machine-id

 

3. サンプル実行

# 日本語環境
fp = webdriver.FirefoxProfile()
fp.set_preference('intl.accept_languages', 'ja-JP, ja')
# ドライバ取得
browser = webdriver.Firefox(firefox_profile=fp)
# javascriptなどの動的ページで要素がない場合5秒待つ。
browser.implicitly_wait(5)
# Yahooを表示してから、天気のページへ。
browser.get('https://yahoo.co.jp/')
browser.find_element_by_xpath('//*[@id="yahooservice"]/ul/li[6]/a').click()
# 画面キャプチャー
browser.save_screenshot(file_name)
# 終了(ブラウザを閉じる)
browser.close()

 

参考

Mac, HomebrewでPL/Pythonを利用する

Mac OS 10 Yosemite + HomebrewでPostgreSQLを利用する。

Pythonは、python3をhomebrewでインストール済みとする。

1. PostgreSQLのインストール

$ brew install --with-python postgres

postgresでPL/Pythonを利用するために–with-pythonオプションを付加する。

以前の設定が残っている場合削除する。

$ rm -rf /usr/local/var/postgres

データベースの初期化。

-Uオプションでしていしたユーザ名がスーパーユーザとして追加される。

指定しない場合、ログインユーザ名が使われる。

$ initdb -U postgres /usr/local/var/postgres

起動。

$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

psqlできることの確認とユーザが作られていることの確認。

$ psql -U postgres
postgres=# \du

以下のエラーがでてpsqlできない場合は、古いpostgresプロセスが生きている可能性があるのでkillしてから再トライ。

psql: FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory

データベースの作成。

$ createdb -U postgres -E utf-8 hoge_db

終了。

$ pg_ctl stop

 

2. PL/Pythonの設定

現在使えるPL一覧を確認。通常PL/PgSQLのみ。

$ createlang -U postgres --list hoge_db
 Name | Trusted?
 ---------+----------
 plpgsql | yes

PL/Pythonを追加する。

$ createlang -U postgres plpython2u hoge_db

あとは言語としてpythonが使える。

 

参考

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

 

■参考