pyenv のインストール

複数バージョンのPythonの使い分けを支援する pyenv のインストール。 yyuu/pyenv · GitHub

ここでは Linux に一般アカウント(bashを利用する環境)で導入。

事前準備

事前に以下のパッケージは導入しておく。

インストール

bash

# pyenv インストール
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
 
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
bash -l

pyenv install -l # インストール可能なバージョンを確認

# Python (2.7.8) を pyenv を利用してインストール
pyenv install 2.7.8
# "subprocess.CalledProcessError: Command '[curl]', 'https://pypi.pytho.org/...
# などといったエラーで失敗する場合は、そのサーバのCA情報が古い可能性がある。
# その場合は一旦以下で回避。
# cd
# wget http://curl.haxx.se/ca/cacert.pem
# wget --no-check-certificate https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
# wget http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt
# export CURL_CA_BUNDLE=~/cacert.pem
# export CURL_CA_BUNDLE=~/ca-bundle.crt
# export CURL_CA_BUNDLE=~/DigiCertSHA2ExtendedValidationServerCA.crt
# echo "insecure" >> ~/.curlrc
# pyenv install 2.7.8

pyenv global 2.7.8
pyenv rehash

# 確認
python -v

http://curl.haxx.se/docs/caextract.html https://www.digicert.com/digicert-root-certificates.html http://blog.livedoor.jp/sonots/archives/32432400.html

他のバージョンのPythonをpyenv経由でインストール

pyenv install -l # インストール可能なバージョンを確認
pyenv install 2.6.9
pyenv rehash

# 利用する python を 2.6.9 へ切り替える
pyenv global 2.6.9
pyenv rehash
 
# 確認
python -v
pyenv versions

ndenv のインストール

複数バージョンのNodeの使い分けを支援する ndenv のインストール。 riywo/ndenv · GitHub

ここでは Linux に一般アカウント(bashを利用する環境)で導入。

事前準備

事前に以下のパッケージは導入しておく。

  • git

インストール

# ndenv インストール
git clone https://github.com/riywo/ndenv ~/.ndenv
echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(ndenv init -)"' >> ~/.bash_profile
#exec $SHELL -l
bash -l

# ndenv-build インストール
git clone https://github.com/riywo/node-build.git ~/.ndenv/plugins/node-build

ndenv install -l # インストール可能なバージョンを確認

# Node (0.10.12) を ndenv を利用してインストール
ndenv install v0.10.12
ndenv global v0.10.12
ndenv rehash

# 確認
node -v

他のバージョンのNodeをndenv経由でインストール

ndenv install -l # インストール可能なバージョンを確認
ndenv install v0.8.22
ndenv rehash

# 利用する Node を v0.8.22 へ切り替える
ndenv global v0.8.22
 
# 確認
node -v
ndenv versions 

npmパッケージをインストール

# npm package (ローカル(カレントパス)へインストール)
npm install HOGE
ls -al ./node_modules/HOGE
 
# Install npm package (グローバル環境へインストール)
npm install -g HOGE

# "packages.json" がカレントディレクトリにあるなら、その内容にしたがってパッケージ導入できます
npm install 

参考

他のnpmコマンド

# npmパッケージの検索
npm find HOGE
 
# npm パッケージのアンインストール
npm uninstall HOGE # もしグローバル環境から削除する場合は "-g" オプションをつける

Elasticsearch / Indexが作成されない (Too many open files)

DEBUGレベルでログを出力していると、エラーのなかで「Too many open files」のエラーメッセージを確認することがあります。

[2014-09-28 01:23:45,678][DEBUG][action.bulk              ] [Maverick] [hoge-2014.09.28][3] failed to execute bulk item (index) index {[hoge-2014.09.28][access][k_0ABC3KrXCC7sv006eW9a], source[{"host":"192.168.0.1","user":"-","method":"GET","path":"/","status":"200","size":"3006","referer":"http://example.com/","agent":"Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0","track-cookie":"-","request-time":"4102","x-forwarded-for":"192.168.0.2","@log_name":"hoge.access","@timestamp":"2014-09-28T01:23:45+09:00"}]}
org.elasticsearch.index.engine.CreateFailedEngineException: [hoge-2014.09.28][3] Create failed for [access#k_0ABC3KrXCC7sv006eW9a]
        at org.elasticsearch.index.engine.internal.InternalEngine.create(InternalEngine.java:389)
        at org.elasticsearch.index.shard.service.InternalIndexShard.create(InternalIndexShard.java:382)
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardIndexOperation(TransportShardBulkAction.java:401)
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:153)
        at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:556)
        at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:426)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Caused by: java.io.FileNotFoundException: /usr/local/elasticsearch/data/hoge/nodes/0/indices/hoge-2014.09.28/3/index/_9.fdx (Too many open files)
        at java.io.RandomAccessFile.open(Native Method)
        at java.io.RandomAccessFile.<init>(RandomAccessFile.java:241)
...

ファイルディスクリプタが上限に達してしまっている可能性が高いので、「ulimit -n」で現在の「open files」上限値を確認し、必要に応じて拡張します(root作業)。

具体的には ulimit コマンドでの変更(即時反映・サーバ再起動までは有効)、必要に応じて /etc/security/limits.conf(サーバ起動時の初期値)の変更を実施します。

Selenium (Firefox on Linux with xvfb)

主に、Webアクセスの自動化(管理画面からのダウンロードなど)を目的として Selenium の利用してみる。 (Linux(CentOS5.7+FireFox+Xvfb))

実行環境(サーバ)側の事前準備

CentOS 5.7 では以下の環境を整える必要がある (yum install)

  • Xvfb
  • firefox (24.8)
  • fonts-japanese

また、WebDriver は Ruby を利用するため、Rubyのランタイムを導入しておく。 (yum install ruby や rbenv による導入など)

作業用PCへ Selenium Builder を導入

通常作業を行う環境(WindowsPCなど)で、ブラウザ操作を記録(Selenium Webdriverで実行可能なTestCaseを生成)するために、FirefoxSelenium Builder を導入する。

  • FireFox をインストールし、さらに http://sebuilder.github.io/se-builder/ へアクセスし「Install」をクリック ⇒ Add-on として「Selenium Builder」を導入する
  • ブラウザ(Firefox)上で右クリックし、表示されたコンテキストメニューから「Launch Selenium Builder」を選択 ⇒ 別ウィンドウで Selenium Builder が起動される
  • 「Start recording at」に、操作の基点となるURLを入力し「Selenium 2」をクリックすると、操作(テストケース)の記録が開始される ⇒ その後、元のウィンドウ側で操作を続ける。操作が完了したら、Selenium Builder ウィンドウ側の「Stop recording」をクリック ⇒ 「File」 >「Export」>「Ruby」をクリックし、テストケースをファイル(Ruby Script)としてを保存する

Linux上で Selenium WebDriver 経由でFireFoxを操作する準備

WebDriver (Ruby / FireFox) を実行するために gem を導入しておく

gem install selenium-webdriver

例えば、以下のようなテストケースを準備してみる (proxy.local:80 というプロキシを利用してWebアクセスする場合)

require 'rubygems'
require 'selenium-webdriver'
 
### FireFoxの設定 (Proxy, Language, Locale)
profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new(
  :http => 'proxy.local:80',
  :ssl => 'proxy..local:80',
  :no_proxy => nil
)
profile['intl.accept_languages'] = "ja"
profile['general.useragent.locale'] = "ja-JP"
 
wd = Selenium::WebDriver.for :firefox, :profile => profile
 
### 以下、テストケース
wd.get "http://www.yahoo.co.jp/"
wd.find_element(:id, "srchtxt").click
wd.find_element(:id, "srchtxt").clear
wd.find_element(:id, "srchtxt").send_keys "昇龍拳"
wd.find_element(:id, "srchbtn").click
wd.find_element(:link_text, "昇龍拳ってこんなに怖いのか! ストリートファイターをキャラの視点で再現 ").click
wd.quit

テストケースが「testcase1.rb」というファイル名であった場合、以下のようにテストケースを実行する

/usr/bin/Xvfb :1 -ac -screen 0 1024x768x16 &
DISPLAY=:1 ruby ./testcase1.rb
# この場合 WebDriver が 6001 ポート経由で Xvfb に接続してFireFoxを操作

ちなみに、以下のようなエラー出力があるが、現時点では気にしない

FreeFontPath: FPE "built-ins" refcount is 2, should be 1; fixing.
error opening security policy file /usr/lib64/xserver/SecurityPolicy
Could not init font path element unix/:7100, removing from list!

Selenium WebDriver でファイルのダウンロードを自動化

WebDriver 経由でファイルのダウンロードを実行した場合、例えば以下のようなテストケースとする

require 'rubygems'
require 'selenium-webdriver'
 
### FireFoxの設定 (Proxy, Language, Locale)
profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new(
  :http => 'proxy.local:80',
  :ssl => 'proxy.local:80',
  :no_proxy => nil
)
profile['intl.accept_languages'] = "ja"
profile['general.useragent.locale'] = "ja-JP"

 
### ダウンロード先を「/tmp/selenium-webdriver」に指定
profile['browser.download.dir'] = "/tmp/selenium-webdriver"
### (folderList=2) ダイアログを出さずにダウンロードを実行する
profile['browser.download.folderList'] = 2
### ダイアログを出さずにダウンロードを実行するcontent-typeを指定
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/plain, application/vnd.ms-excel, text/csv, application/zip, text/comma-separated-values, application/octet-stream'

wd = Selenium::WebDriver.for :firefox, :profile => profile
 
### 以下、テストケース
wd.get "http://www.post.japanpost.jp/zipcode/dl/oogaki/zip/13tokyo.zip"
wd.quit

トラブルシューティング

FireFoxを上手く操作できない

以下のようなエラーがでるケースがある

Selenium::WebDriver::Error::WebDriverError:
  unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)

これは、Selenium の WebDriver からFireFoxを上手く操作できない(WebDriver::FireFoxは7054/7055ポートを使用)状況で発生する。 このエラーが出現する場合、多くの場合は以下の2点のうち、どちらかの問題である。

  • そもそも FireFox が正しく実行できない(FireFox実行に必要な依存ライブラリがインストールされていない、など)
  • Xvfbへ接続する際のディスプレイ番号(環境変数 DISPLAY)が不一致

cygwin (64bit) で selenium-webdriver の gemが上手くインストールできない

上述のLinux環境を Cygwin で実現したい場合に、selenium-webdriver の gem インストールが上手くいかないケースがある。 これは WebDriverのgemがNativeCompileを必要とすることと関連しているらしいので、以下のページを参考に「export PKG_CONFIG_PATH="/lib/pkgconfig"」を行ったうえで再度 gem install を実行して暫定回避。 http://d.hatena.ne.jp/msfukui/20140205/1391560822

その他

Xvfb のスクリーンショットを撮る

以下のパッケージを導入する

Xvfbが起動している状態で、以下のコマンドを実行することでキャプチャ画像を取得できる

# DISPLAY=:1 で Xvfb が起動している場合
 
# スクリーンショットを取得
xwd -root -out -display :1 screen.xwd
# 取得したデータを画像形式に変換
convert screen.xwd screen.gif
 
# 以下でも同様
xwd -root -display :1 | convert screen.gif

jenv のインストール

jdk複数バージョンを使い分けることを支援する jenv のインストール。 ここでは Linux に一般アカウント(bashを利用する環境)で導入。

事前準備

まず以下にアクセスして、利用するjdkをダウンロードして対象ホスト上に配置しておく。 (ここでは jdk-8u20-linux-x64.gz を利用 し、~/jdk/ 以下へ配置)

Java SE - Downloads | Oracle Technology Network | Oracle

インストール

mkdir ~/jdk
# 今回はここにjdkのアーカイブを配置
cd ~/jdk
tar zxf ./jdk-8u20-linux-x64.gz
# jdk1.8.0_20 が作成されます

cd ~
 
# jenv インストール
git clone https://github.com/gcuisinier/jenv.git ~/.jenv
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
bash -l

# ローカルに配置したjdkを jenv管理対象に追加
jenv add ~/jdk/jdk1.8.0_20
# oracle64-1.8.0.20 added と表示されます

jenv versions
# 「oracle64-1.8.0.20」が表示されます

jenv global oracle64-1.8.0.20
jenv rehash
 
# 確認
java -version

参考

# jdkをjenvの管理対象から除外
jenv remove oracle64-1.8.0.20

vim のローカルインストール

ユーザ権限で個人用にvim/NeoBundleをインストールしてみます。

参考: さくらインターネット共用サーバにvimをインストール、ログインシェルをbashに変更 - my scratch pad

インストール

インストール先は「~/local/bin」としている。

mkdir -p ~/local/bin
mkdir -p ~/src
 
cd ~/src
wget http://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
bzip2 -d ./vim-7.4.tar.bz2
tar xf ./vim-7.4.tar
cd ./vim74
 
./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local
make
make install

既存のvi/vimとは設定ファイルを分けてみる

既存の設定ファイルは ~/.vimrc 、今回インストールするものは ~/.vimrc-local としてみる

echo "set number" >> ~/.vimrc-local

# vi でローカルインストールしたvimが起動するようにaliasを追加
echo 'alias vi="~/local/bin/vim -u ~/.vimrc-local"' >> ~/.bashrc
 
. ~/.bashrc
# ローカルインストールしたvimが起動することを確認
vi YOURFILE.txt

NeoBundleを利用してみる

参考: Vimプラグインの管理にNeoBundleを使う - weblog of key_amb

NeoBundle ダウンロード

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

NeoBundle を有効にする ~/.vimrc-local

set number
syntax on
set paste
set nocompatible               " Be iMproved
if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#rc(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
filetype plugin indent on     " Required!
 
" Highlight by suffix
autocmd BufNewFile,BufRead Capfile set filetype=ruby
autocmd BufNewFile,BufRead *.cap set filetype=ruby
NeoBundleCheck

vim起動後、以下で NeoBundle を呼び出す

:NeoBundleInstall # インストール
:NeoBundleUpdate  # アップデート

git で "error: gnutls_handshake() failed:..." が出る場合

古いgitを使っていると、httpsでの通信時にエラーが出ることが。 例えば Debian5.0.4 / git-v1.7.12-315 source compiled の環境で以下のようなエラーが発生。

server01:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/doracat/.rbenv'...

error: gnutls_handshake() failed: An unexpected TLS packet was received. while accessing https://github.com/sstephenson/rbenv.git/info/refs
fatal: HTTP request failed

server01:~$

新しいバージョンのgitをパッケージ導入できればそれが早いですが、ソースコンパイルして入れなおすとすればこんな感じ。 ちなみに libcurl4-openssl-dev 等の依存ライブラリは事前に導入しておく。

# gitのソースは /usr/local/src 以下に展開済み
server01:# cd /usr/local/src/git-v1.7.12-315
server01:# make clean
server01:# make configure
server01:# ./configure --prefix=/usr/local --with-openssl --with-curl
server01:# make
server01:# make install

無事に git clone 成功。

server01:~> git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/doracat/.rbenv/plugins/ruby-build'...
remote: Reusing existing pack: 2793, done.
remote: Counting objects: 25, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 2818 (delta 12), reused 15 (delta 2)
Receiving objects: 100% (2818/2818), 478.64 KiB | 217 KiB/s, done.
Resolving deltas: 100% (1222/1222), done.
server01:~>