AB Lab

プログラミング備忘録

Seleniumのインストールと簡単な使い方

参考サイト

gemをインストールする。

gem install selenium-webdriver

起動と終了

driver = Selenium::WebDriver.for :firefox # ブラウザ起動

driver.quit # ブラウザ終了

:firefox のところは :ieとか:chromeとか:operaとか好きなのを

ページ、フレーム移動

driver.navigate.to 'http://example.com' # URLを開く
driver.switch_to.frame(1)               # 1つめの子フレームに移動
driver.switch_to.frame("frameid")       # フレームのnameを指定して移動

要素を指定

element = driver.find_element(:name, 'calendar')        # nameで指定
element = driver.find_element(:id, 'calendar')          # idで指定
element = driver.find_element(:class, 'right_box')      # classで指定
element = element.find_element(:tag_name, 'table')      # 要素名で指定
element = element.find_element(:xpath, 'tr[2]/td[3]/a') # XPathで指定
element = driver.find_element(:class, 'body').find_element(:name, 'form').find_elements(:xpath, './/input')[2] # メソッドチェーン

DriverとElementがどちらもfind_element・find_elementsメソッドを持っている。

入力

# テキストフィールドへ入力・削除
element = driver.find_element(:name, 'userId')
element.send_keys('username')
element.clear

# ドロップダウンリスト選択
select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, 'dropdown'))
select.select_by(:value, 'item1')       # valueの値で選択
select.select_by(:text, 'どちらでもない') # 表示テキストで選択
select.select_by(:index, 2)             # インデックス(0始まり)で選択

# ラジオボタン選択
driver.find_elements(:name, 'selectOne')[2].click

# リンクやボタンを押す
driver.find_element(:xpath, '//table[2]/tr[3]/td[1]/a').click

情報取得

# 要素の内容テキスト
puts element.text

# Firefoxでダウンロードのリンクを踏んだとき保存確認ダイアログを出さずに指定のフォルダに保存
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.folderList'] = 2
profile['browser.download.useDownloadDir'] = true
profile['browser.download.dir'] = 'path/to/downloadFolder'
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
driver = Selenium::WebDriver.for :firefox, :profile => profile

# スクリーンショットを撮る
driver.save_screenshot('path/to/filename.png')

chomeのプロフィール設定

prefs = {
  :download => {
    :prompt_for_download => false, 
    :default_directory => "/path/to/dir"
  }
}

driver = Selenium::WebDriver.for :chrome, :prefs => prefs

macchromeを指定するとエラーが出たので対応

ドライバーをダウンロードしてくる

http://chromedriver.storage.googleapis.com/index.html

ドライバにバスを通す

ln -s /path/to/chromedriver /usr/bin/chromedriver

とりあえず /user/bin/にシンボリックリンクを貼った 直接パス通す方法でもOK

フォルダを圧縮して自動バックアップするスクリプト

スクリプトを作成

vim images_backup.sh
images_backup.sh
#!/bin/sh

# バックアップファイルを何日分残しておくか
period='+7'
# バックアップファイルを保存するディレクトリ
dirpath='/path/to/backup/images'

#バックアップ元フォルダ
backupfolder="/path/to/from"

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
mydate=`date +%y%m%d%H%M%S`
filename="images_$mydate.tar.gz"
#backup実行
tar -zcvf $dirpath/$filename $backupfolder

# パーミッション変更
chmod 700 $dirpath/$filename

# 古いバックアップファイルを削除
find $dirpath -type f -daystart -mtime $period -exec rm {} \;

SSH接続の公開鍵認証

参考サイト

秘密鍵と公開鍵を作成

ssh-keygen -t rsa

公開鍵を転送

scp id_rsa.pub user@hostname/.ssh

公開鍵を設定

mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys 
chmod 600 ~/.ssh/authorized_keys

SSHで公開鍵認証を設定

sudo vim /etc/ssh/sshd_config
/etc/ssh/sshd_config
PubkeyAuthentication yes

sshdを再起動

sudo service sshd restart

公開鍵でSSH接続する

ssh user@hostname

FTPサーバーの設定

参考サイト

FTPサーバー導入の経緯

最近は、GitもしくはSFTPでのファイルのやりとりが多く、

普段、FTPってあんまり使わないのでFTPサーバーをインストールしていなかったのだが、

FTPを利用したいとのご要望があったので設定した。

折角なので、備忘録として記載しておくことに

vsftpd のインストール

sudo yum -y install vsftpd

sudo service vsftpd start

sudo chkconfig vsftpd on

で、後はポート開放して完了。

結構あっさりですね。

ただ、このまま使うにはあまりにも無防備すぎるのと、

今回のご要望は、SSL通信での利用を想定との事だったため、もう少し設定する。

一般設定

sudo vim /etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd.conf
anonymous_enable=NO
# Anonymous FTP接続の禁止。

local_enable=YES
# ローカルユーザのログインを許可。

write_enable=YES
# 書き込み(Upload)許可。公開専用の場合はNOにすると書き込み禁止にできる。

local_umask=022
# ローカルユーザのumask値。

listen_port=21
# FTP制御チャンネルの接続待ち受けポートの指定。
# デフォルトポートの利用には抵抗がある

connect_from_port_20=NO
# Activeモード時のデータコネクションポートの指定。
# 今回はpasv接続にするのでNO。

nopriv_user=ftp
# vsftpが利用する非特権ユーザ名の指定を ftp に指定。

chroot_local_user=YES
# ローカルユーザの操作範囲を自身のホームディレクトリ内のみに行動を制限(chroot)する。

chroot_list_enable=NO
# 「chroot_local_user=YES」とした場合にchrootしない例外ユーザを許可しないに指定。
# YESにした場合「chroot_list_file=/etc/vsftpd.chroot_list」を登録

ftpd_banner=Welcome to blah FTP service.
# クライアントソフト名が表示されるのを変更

SSL関係設定

sudo vim /etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd.conf
rsa_cert_file=/etc/ssl/certs/vsftp.pem
# vsftpd用の証明書ファイルの指定。SSL証明書の発行方法は省略

rsa_private_key_file=/etc/ssl/certs/vsftp.key
# vsftpd用の秘密鍵ファイル

rsa_cert_file=/etc/ssl/certs/ftp.pem
# vsftpd用の証明書ファイルの指定。SSL証明書の発行方法は省略

use_localtime=YES
# 時刻の扱いをローカルタイムにする。

userlist_enable=YES
# ユーザリストによる規制をかける。

userlist_deny=YES
# ユーザリストをログイン不可ユーザの一覧とする。(NOだとログイン可のユーザ一覧になる)

userlist_file=/etc/ftpusers
# ユーザリストの指定。

pasv_min_port=30000
# Pasv接続で外部からのコネクション利用を許可するポート範囲の最小値。

pasv_max_port=30100
# Pasv接続で外部からのコネクション利用を許可するポート範囲の最大値。

ssl_enable=YES
# SSL接続の有効化

ssl_tlsv1=YES
# vsftpd はSSLのプロトコルとして、SSL v2(ssl_sslv2)、SSL v3(ssl_sslv3)、TLS v1(ssl_tlsv1)の3種類をサポートしているが、デフォルトはTLS v1であり、多くの場合、この設定で問題ないのでデフォルトのままとする。

force_local_logins_ssl=YES
# 制御チャンネル(ログイン等)でSSL接続しか許可しない。

force_local_data_ssl=YES
# データチャンネルでSSL接続しか許可しない。

再起動で反映

sudo service vsftpd restart

net/http/response.rbのバグ修正

参考サイト

概要

Rubyでブログ投稿しようと頑張っていたら、ハマった。

xml-rpcで投稿していた所、

jugemseesaaは問題なく投稿や情報の取得ができていたのだが、

FC2に投稿しようとするとエラーが出る。

Wrong size. Was 31564, should be 1501

いろいろ調べてみたらどうやらRubyの標準ライブラリの

net/http/response.rb

のバグらしい

https://github.com/ruby/ruby/pull/308/files

で修正パッチが記載してあったので、こちらを利用することに

他の対応方法

response.rb を書き換える方法ではなく、

libxml というライブラリを使う方法でも大丈夫なのだが、

今回は修正パッチの方法で対応

railsxml/libxml がないとか言われたり、関数の表現変わったりで面倒だったので

修正方法

rbenv version

で現在利用しているrubyのバージョンと場所を確認

.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/net/http

内の

response.rbを書き換える

修正箇所は参考URLを参照

rbenvでRubyをインストール

参考サイト

依存ライブリをインストール

sudo yum -y install gcc
sudo yum -y install make
sudo yum -y install openssl
sudo yum -y install openssl-devel
sudo yum -y install gcc-c++
sudo yum install -y mysql-devel

全ユーザーで共通のrbenvを利用

rubyグループを作成

sudo groupadd ruby
sudo usermod -G wheel,ruby myuser
sudo groups myuser

rbenvをインストール

cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
mkdir rbenv/shims rbenv/versions rbenv/plugins

cd rbenv/plugins 
git clone git://github.com/sstephenson/ruby-build.git ruby-build
cd ruby-build
./install.sh

cd /usr/local

chgrp -R ruby rbenv
chmod -R g+rwxX rbenv
 
echo 'export RBENV_ROOT="/usr/local/rbenv"'     >> /etc/profile.d/rbenv.sh
echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"'                   >> /etc/profile.d/rbenv.sh

source /etc/profile.d/rbenv.sh

echo $PATH

rubyをインストール

rbenv install --list

rbenv install -v 2.0.0-p353

rbenv versions

rbenv global 2.0.0-p353

rbenv rehash

rbenv versions

ruby -v

折角なのでgemをアップデート

gem update

ユーザー別のインストールする場合

rbenvをインストール

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

exec $SHELL -l

確認

rbenv -v

nodebrewでNode.jsをインストール

curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup

# ユーザーディレクトリにインストールされるので、全ユーザーで利用する場合はrootでインストールして共通パス通すのがいいかも
# ノードユーザー作って権限渡したほうが良い気がする

useradd node

cd /home/node

chmod -R 777 /home/node

echo 'export PATH="/home/node/.nodebrew/current/bin:$PATH"'     >> /etc/profile.d/nodebrew.sh
# echo 'export PATH="/home/node/.nodebrew/current/bin:$PATH"'     >> /etc/profile.d/nodebrew.sh

source /etc/profile.d/nodebrew.sh

echo $PATH

# ユーザー権限でも実行したい場合は実行グループ作って登録すれば大丈夫。

nodeグループを作成

groupadd node
usermod -G wheel,node shuhei
# usermod -G wheel,node,ruby shuhei
groups shuhei

.nodebrewの所有グループを変更

cd /home/node
chgrp -R node .nodebrew
chmod -R g+rwxX .nodebrew

/home/nodeへの閲覧権限がなかったのでグループをwheelに変更

sudo chgrp wheel /root

インストール可能なバージョンの確認

nodebrew ls-all
# 奇数バージョンは開発版、偶数バージョンが安定版らしい

インストール(バイナリからインストールしたほうが速い)

nodebrew install-binary v0.10.20
# インストールはユーザーディレクトリにされるっぽいのでノードユーザーでインストールする

利用するバージョンを変更

nodebrew use v0.10.20

現在のバージョンを確認

node -v