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"); '
rpm と yum について
YUM は RPM システムに自動更新機能と、依存関係の管理を含めたパッケージ管理機能を追加しています。 よって YUM が使えるシーンではこちらを利用するのがよいです。 ただし、決め打ちで RPM がほしい時には rpm 経由でパッケージをインストールすることもあります。
参考
- 下記サイトを参考に、CentOS5.5でPerlのImage::Imlib2モジュールをインストールしようとしましたが、うまくいきませんでした。
- Linux の 101 試験対策: RPM および YUM によるパッケージ管理
Perl で2つのテキストファイルの差分をみるには
UNIX のコマンドでテキストファイルの差分箇所を抽出するには diff が便利です。 そしてこれはもちろん Perl でも行うことができます。 以下に3通りのdiffに対応したPerlコードを示します。
一致しているかどうかだけ分かればよい場合
を使います。
例:
実行結果:
$ 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 を利用して作成されています。
例:
実行結果:
$ 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 を使ってファイルを配列にすることでこの差分を見ることができます。
例:
実行結果:
# 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 をチューニングすることで無駄を小さくすることができるのです.
-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" などとしてパスを通す.
参考
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 は下記のような感じです.
参考
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"
参考
- Setting the MySQL root user password on OSX
- 4.7.5. パスワードの設定
- 4.6.7. 権限の変更が反映するタイミング
- PostgreSQL, MySQLにパスワード入力なしで接続する方法
- MySQLのrootのパスワードを初期化する
個人的に 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)
参考
ag は EUC-JP や Shift-JIS のファイルが検索対象からはずされてしまう
EUC-JP や Shift-JIS がてんこ盛りなリポジトリでおもむろに ag で検索をかけてもスキップされるファイルがあることを発見しました。 調べてみると、どうやら ag では EUC-JP や Shift-JIS のファイルがバイナリファイルとみなされ、検索対象からはずされてしまうらしいです。
これを回避するためのパッチ を作成してくださっている方がいらっしゃるので、これを使ってもいいと思いますし、 速度的に問題がないのであれば ack を使っておく、という判断もできるかと思います。
この辺りはおこのみで。