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を生成)するために、Firefox と Selenium 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点のうち、どちらかの問題である。
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 のスクリーンショットを撮る
以下のパッケージを導入する
- xwd (パッケージとしては xorg-x11-apps に包含される) ⇒ スクリーンショット取得
- ImageMagick ⇒ xwdで取得したdumpファイルを画像形式に変換
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:~>