Perl Image::Imlib2 を CentOS6 にインストールする

手順

 

RPMforgeレポジトリをインストールします。

$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.0-1.el5.rf.i386.rpm

$ sudo rpm -ivh rpmforge-release-0.5.0-1.el5.rf.i386.rpm

 

RPMforgeのdefaultを無効化します。

 $ less rpmforge.repo
### Name: RPMforge RPM Repository for Red Hat Enterprise 5 - dag
### URL: http://rpmforge.net/
[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
baseurl = http://apt.sw.be/redhat/el5/en/$basearch/rpmforge
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 1
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

$ sudo sed -e 's/^enabled = 1/enabled = 0/' -i.orig rpmforge.repo

$ grep enabled rpmforge.repo
enabled = 0

 

imlib2 をRPMforge からインストールします。

 $ sudo yum install --enablerepo=rpmforge perl-Image-Imlib2

このとき、インストールされるパッケージを依存とともにメモしておきます。

Installing for dependencies に imlib2 があることを確認して下さい。

 

確認します。

 $ echo `perl -MImage::Imlib2 -e 'print $Image::Imlib2::VERSION'`
2.03

$ perl -MImage::Imlib2 -e '
my $image = Image::Imlib2->new(200, 200);
$image->set_color(255, 127, 0, 127);
$image->draw_rectangle(50, 50, 50, 50);
$image->save("out.png");
'

 

rpmyum について

YUMRPM システムに自動更新機能と、依存関係の管理を含めたパッケージ管理機能を追加しています。 よって YUM が使えるシーンではこちらを利用するのがよいです。 ただし、決め打ちで RPM がほしい時には rpm 経由でパッケージをインストールすることもあります。

 

参考

 

Perl で2つのテキストファイルの差分をみるには

UNIX のコマンドでテキストファイルの差分箇所を抽出するには diff が便利です。 そしてこれはもちろん Perl でも行うことができます。 以下に3通りのdiffに対応したPerlコードを示します。

 

一致しているかどうかだけ分かればよい場合

  • Digest::MD5 もしくは
  • Digest::SHA1

を使います。

 例:

diff_digest_hd5.pl

 

実行結果:
$ cat A
Boys
Hello,
and Boys

$ cat B
Boys
Hello,
and Girls

$ perl digest_hd5.pl --f1 A --f2 B
Files do not match.

 

差分も含め抽出したいとき

Text::Diff を使います。 このモジュールは Algorithm::Diff を利用して作成されています。

例:

text_diff.pl

 

実行結果:
$ perl text_diff.pl --f1 A --f2 B
*** DIFF ***
*** A Tue Oct 7 12:46:37 2014
--- B Tue Oct 7 12:46:37 2014
***************
*** 1,4 ****
 Boys
 Hello,
! and Boys

--- 1,4 ----
 Boys
 Hello,
! and Girls

 

改行単位で順不同でファイル間に差分があるかを表示したいとき

Tie::File を使ってファイルを配列にすることでこの差分を見ることができます。

 

例:

text_diff_with_tie.pl

 

実行結果:
# A, B は改行単位で順不同ではファイル間に差分はない

$ cat A
Boys
Hello,
and Boys

$ cat B
Boys
Hello,
and Boys

$ perl text_diff.pl --f1 A --f2 B
Files match!!!

 

参考

memcached の Slab Allocator について理解する

Slab Allocator とは

従来の memcached のではすべてのレコードに対して malloc と free を行うというものでした. しかしこの方法では memory の fragmentation (断片化) を発生させてしまい, OS の memory manager に負荷をかけてしまいます.

この問題を解消するために作成されたものが Slab Allocator です.

Slab Allocator は確保したメモリを最初に設定したサイズのクラスに応じた固定長memory chunkに分割することで framgmentation 問題を克服します.

 

Slab Allocator の弱点

端的に言えば、確保したメモリをフルフルまで使い切ることができない, ということです.

Slab Allocator はサイズクラスに応じて固定長メモリの固まりに分けているのでした. よって, 確保したメモリをすべて使い切ることはできません. 例えば100バイトのデータを128バイトのchunkにキャッシュすると, 余りの28バイトが無駄になってしまいます.

 

Slab Allocator の弱点を補うために

Growth Factor (-f) という因子を指定することで slab間のサイズの幅を制御することができるようになっています. 例えば 2 に設定すると, 固定メモリサイズchunkは 2 の累乗で確保されていきます. (なおGrowth Factorが開発された現在default値は 1.25 のようです.)

この Growth Factor をチューニングすることで無駄を小さくすることができるのです.

  • -p は TCPポート(memcachedのdefaultは11211)
  • -vv は -v(verbose) を更に verbose にするオプションです.
-f が 2 の時
$ memcached -p 11211 -vv -f 2
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 192 perslab 5461
slab class 3: chunk size 384 perslab 2730
slab class 4: chunk size 768 perslab 1365
slab class 5: chunk size 1536 perslab 682
slab class 6: chunk size 3072 perslab 341
slab class 7: chunk size 6144 perslab 170
slab class 8: chunk size 12288 perslab 85
slab class 9: chunk size 24576 perslab 42
slab class 10: chunk size 49152 perslab 21
slab class 11: chunk size 98304 perslab 10
slab class 12: chunk size 196608 perslab 5
slab class 13: chunk size 393216 perslab 2
slab class 14: chunk size 1048576 perslab 1

クラスのサイズが2倍づつ大きくなっているのがわかります. f:2 だとslab間の差が比較的に大きいため, ユースケース次第で相当なメモリが無駄に消費されてしまいます.

 

次に -f 1.25 を設定してみます.

$ memcached -p 11211 -vv -f 1.25
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
slab class 5: chunk size 240 perslab 4369
slab class 6: chunk size 304 perslab 3449
slab class 7: chunk size 384 perslab 2730
slab class 8: chunk size 480 perslab 2184
slab class 9: chunk size 600 perslab 1747
slab class 10: chunk size 752 perslab 1394
slab class 11: chunk size 944 perslab 1110
slab class 12: chunk size 1184 perslab 885
slab class 13: chunk size 1480 perslab 708
slab class 14: chunk size 1856 perslab 564
slab class 15: chunk size 2320 perslab 451
slab class 16: chunk size 2904 perslab 361
slab class 17: chunk size 3632 perslab 288
slab class 18: chunk size 4544 perslab 230
slab class 19: chunk size 5680 perslab 184
slab class 20: chunk size 7104 perslab 147
slab class 21: chunk size 8880 perslab 118
slab class 22: chunk size 11104 perslab 94
slab class 23: chunk size 13880 perslab 75
slab class 24: chunk size 17352 perslab 60
slab class 25: chunk size 21696 perslab 48
slab class 26: chunk size 27120 perslab 38
slab class 27: chunk size 33904 perslab 30
slab class 28: chunk size 42384 perslab 24
slab class 29: chunk size 52984 perslab 19
slab class 30: chunk size 66232 perslab 15
slab class 31: chunk size 82792 perslab 12
slab class 32: chunk size 103496 perslab 10
slab class 33: chunk size 129376 perslab 8
slab class 34: chunk size 161720 perslab 6
slab class 35: chunk size 202152 perslab 5
slab class 36: chunk size 252696 perslab 4
slab class 37: chunk size 315872 perslab 3
slab class 38: chunk size 394840 perslab 2
slab class 39: chunk size 493552 perslab 2
slab class 40: chunk size 616944 perslab 1
slab class 41: chunk size 771184 perslab 1
slab class 42: chunk size 1048576 perslab 1

~100byte単位のレコードをキャシュするのに適していることがわかります.

 

次にあまり用いないようですが, f:8 を設定してみます.
$ memcached -p 11211 -vv -f 8
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 768 perslab 1365
slab class 3: chunk size 6144 perslab 170
slab class 4: chunk size 49152 perslab 21
slab class 5: chunk size 1048576 perslab 1

この設定だと slab 間の差が大きく, 相当量のメモリが無駄に消費されてしまうことが予想されます.

 

参考

Unable to find the chromedriver executable 対応

capybara を使った自動テストを実行しようとした時に下記のエラーが発生してこけました.

/Users/${YOUR_NAME}/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/chrome/service.rb:20:in `executable_path': Unable to find the chromedriver executable. Please download the server from http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH. More info at http://code.google.com/p/selenium/wiki/ChromeDriver. (Selenium::WebDriver::Error::WebDriverError)

メッセージに書いてあるとおり, chromedriver のページにいってドライバーをダウンロード&解凍し, 任意のパスに配備. そしてそこにPATHを通すことで解消しました.

手順

 

1. chromedriver をダウンロード, 解凍

Macなので mac32 を選択

(64bit環境なのですが32bitでも問題なかったです.)

http://chromedriver.storage.googleapis.com/2.9/chromedriver_mac32.zip

 

2. ${HOME}/bin/chromedriver など任意のパスに配備

 

3. bashrc に export PATH="$HOME/bin:$PATH" などとしてパスを通す.

 

参考

ログインシェルを変更する

Mac OS X ではdefaultのログインシェルは/bin/bashです。

これをhomebrewなどで入れた他のシェルに切り替えたい場合にはchshを使います。

 

zshに切り替える。
$ chsh -s /usr/local/bin/zsh

 

bashに切り替える。
% chsh -s /bin/bash

 

see also

  • man chsh

revealjsで作成したスライドをpdfに出力する方法

web serverが立ち上がっていない場合、まずweb serverを起動します。

$ grunt server

 

http://localhost:9000/ にスライドが表示されますね。 そうしたら、このURLに ?print-pdf を追加します。

 

Mac OSX かつ Chrome なら ⌘ (cmd) + p で印刷モードになるので「PDF に保存」を選択し保存を押します。

これでpdfとして書き出すことができます。

 

ちなみにrevealjsのコード的には下記箇所でこの処理を行っています。 リンクが表示されていない等表示がおかしい場合は下記箇所を修正すると良いかもです。

index.html L.22 あたり。

<!-- If the query includes 'print-pdf', use the PDF print sheet -->
<script>
if( window.location.search.match( /print-pdf/gi ) ) {
    var link = document.createElement( 'link' );
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = 'bower_components/reveal.js/css/print/pdf.css';
    document.getElementsByTagName( 'head' )[0].appendChild( link );
}
</script>

 

参考

hubotをインストールする

MacOS X にインストール

 

まずはnodeをインストールします。

#node
$ PREFIX=$(brew --prefix)
$ sudo mkdir -p $PREFIX/{share/man,bin,lib/node,include/node}
$ sudo chown -R $USER $PREFIX/{share/man,bin,lib/node,include/node}
$ brew install node

 

npm もインストールします。

#npm
$ curl https://www.npmjs.org/install.sh | sh

 

npm を使って、hubot coffee-script をインストールします。

$  npm install -g hubot coffee-script

 

CentOS にインストール

 

nodeのインストールをします。

echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
echo 'export npm_config_userconfig=$HOME/.config/npmrc' >> ~/.bashrc
. ~/.bashrc
mkdir ~/.local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/.local
make install

 

npmのインストールをします。

curl https://www.npmjs.org/install.sh | sh

 

npm経由でhubot, coffee-scriptをインストールします。

$ npm install -g hubot coffee-script

 

redis もインストールしておきます。

$ npm install redis

 

IRCサーバ に接続できるように設定します。

このcentosサーバのポートがircサーバのポートに転送できる設定がなされていない場合には、 centosサーバ上のポートがircサーバのポートに転送されるように設定して上げる必要があります。

ssh -C -N -f -R ポート:ホスト:ホスト側ポート

 

参考

SQLite GUI クライアント "SQLite Database Browser" のインストール手順

公式に書いてあるとおりなのですが備忘録ということでここにも書いておきます。

gitからソースを取得してきて自分でコンパイルする方法でインストールしてみました.

 

手順

homebrew を使って sqlite 及び qt をインストールします.

$ brew install sqlite --with-functions --without-readline
$ brew install qt
$ brew link sqlite3 --force

 

あとはgithubからソースを取得してコンパイルするだけです.

$ git clone https://github.com/sqlitebrowser/sqlitebrowser.git

$ cd sqlitebrowser
$ qmake
$ make
$ brew unlink sqlite3
$ mv src/sqlitebrowser.app /Applications/

 

UI は下記のような感じです.

sqlitebrowser_2014-10-11_17.24.51

 

参考

sqlite3 の exit コマンド

おもむろに sqlite3 と打ち込んだら exit の仕方がわからなかったので。

SQLite ではすべてのコマンドに prefix "." をつけます。

 

よって、exit するには prefix として "." をつけて

sqlite> .exit

などとします。

 

ちなみにその他の特殊コマンド一覧を見たいときには .help で

sqlite> .help

などとすればみることができます。

 

参考

MySQL のパスワードを変更する方法

背景

プロジェクトで MySQL w/rails を使う事になったが, development のパスワードが config/database.yml に固定で記載されていたため, localの mysql のパスワードを変更する必要があった.

 

手順

mysql に入ります.

mysql -u root -p

 

user:Password を新しいパスワードに更新します.

root@localhost[(none)]:3> use mysql;

root@localhost[mysql]:3> select * from user where Host='localhost' and User = 'root';

root@localhost[mysql]:2> update user set Password=password('新しいパスワード') where Host='localhost' and User = 'root';

root@localhost[mysql]:3> select * from user where Host='localhost' and User = 'root';

root@localhost[mysql]:4> flush privileges;

INSERT, UPDATE, DELETE などで権限テーブルを変更した場合, サーバを再起動するかテーブルのリロードを行うまでは権限チェックは施行されません. これを更新するために FLUSH PRIVILEGES を発行しています.

 

ちなみに MySQL のパスワードを ~/.my.cnf に下記の要領で記載することで, 接続時の入力が不要になります.

$ tail -n2 $HOME/.my.cnf
[client]
password="foobar"

 

 

参考

 

個人的に memcached を使うべきと思うシーン

memcached をどういう場面で使用するべきかについて、

現時点での考えをまとめておきます。

 

キャッシュすべきなのは "レコードユーザの閲覧履歴などユーザに紐づくレコード" だと思います.

RDBからレコードを取得するには selectをかけた時に対象レコードが分散しているため, メモリから引くことができずディスクIOが発生する可能性が大きいためです.

 

一方で, マスタテーブルから引いたレコードを保持することはあまり行わないと思います. これはマスタレコードは正しくindexが配備されていればメモリに乗り切らないサイズになることは稀であるし, またユーザごとに必要なレコードは不変であることが多いため, fcgi などのプロセスにキャッシュしておくことが可能であるためです.

 

参考

sleepimage肥大化に伴う領域削除とhibernatemodeの設定変更

経緯

HDD内の"その他"領域肥大化が発覚。対象ディレクトリを調べる。

基本的に

$ sudo du -h -x -d 1 /

で調べていく。

今回は原因が /private/var//vm/sleepimage っぽい。

$ sudo du -h -x -d 1 /private/var//vm
8.1G /private/var//vm

$ ls -l /private/var//vm
total 16908288
-rw------T 1 root wheel 8589934592 4 15 11:50 sleepimage
-rw------- 1 root wheel 67108864 4 15 07:29 swapfile0

sleepimage とは?

sleepにはsleep, safe sleep, deep sleep と3種類あり、deep sleepのときにRAM領域のデータをディスク領域に書き込まれる領域がsleepimage領域のよう。

つまりRAM領域が大きいほど、ディスク容量も取られてしまう。

SSD領域がもったいないので、このモードを変更することとした。

 

対応

pmset でsleepモード変更

$ pmset -g
Active Profiles:
Battery Power -1
AC Power -1*
Currently in use:
standbydelay 4200
standby 0
womp 1
halfdim 1
hibernatefile /var/vm/sleepimage
gpuswitch 2
sms 1
networkoversleep 0
disksleep 10
sleep 30
hibernatemode 3
ttyskeepawake 1
displaysleep 30
acwake 0
lidwake 1

今回は safe sleep モード( hibernatemode 3 )設定になっていて、長時間スリープでdeep sleepするというモードだった。

これを通常スリープしかしないモードに変更する。

$ sudo pmset -a hibernatemode 0 # Sleep

こんなかんじで設定完了。

$ pmset -g
Active Profiles:
Battery Power -1
AC Power -1*
Currently in use:
standbydelay 4200
standby 0
womp 1
halfdim 1
hibernatefile /var/vm/sleepimage
gpuswitch 2
sms 1
networkoversleep 0
disksleep 10
sleep 30
hibernatemode 0
ttyskeepawake 1
displaysleep 30
acwake 0
lidwake 1

RAMディスク分だけ取られていた領域を削除し完了。

$ sudo rm /private/var/vm/sleepimage

 

参考

Pig で 2 つのカラムを outer join する

Pig ではレコードA, B に対して id で left outer join するときには下記のようにします。

result = JOIN A by id LEFT OUTER, B by id;

これを例えば id, log_date という2つのカラムで left outer join をしたいときには、そのカラム群を () で囲んむことで実現できます。

result = JOIN A by (id, log_date) LEFT OUTER JOIN, B by (id, log_date)

参考

chrome で cookie の内容を編集する方法

Chromecookie を確認したり削除したりすることがあると思いますので、 GUI操作手順を載せておきます。

  1. まず "設定" に行きます (⌘ + , とかでもいけます)
  2. 下の方にリンクしてある "詳細設定" にいきます。
  3. "コンテンツの設定" を押します。
  4. "すべての Cookie とサイトデータ" を押します。 スクリーンショット 2014-10-25 23.50.13
  5. cookie を見たい host 名を検索します。
  6. Cookie Name をクリックすることで閲覧したり編集したりできます。 スクリーンショット 2014-10-25 23.49.46

ag は EUC-JP や Shift-JIS のファイルが検索対象からはずされてしまう

EUC-JP や Shift-JIS がてんこ盛りなリポジトリでおもむろに ag で検索をかけてもスキップされるファイルがあることを発見しました。 調べてみると、どうやら ag では EUC-JP や Shift-JIS のファイルがバイナリファイルとみなされ、検索対象からはずされてしまうらしいです。

これを回避するためのパッチ を作成してくださっている方がいらっしゃるので、これを使ってもいいと思いますし、 速度的に問題がないのであれば ack を使っておく、という判断もできるかと思います。

この辺りはおこのみで。

参考