Rubyで子プロセス監視

Rubyで子プロセス監視

Ruby1.9系だと
Process.spawnが一番簡単みたい。

クローラーなんかだと、相手側のサーバーの都合とか、回線の都合とかで
rescue書いておいてもエラー落ちしてたり。
なんで、もし終了してたら再度実行させるみたいなのを簡単に書いておきたかった。

例えば以下のコードをクローラーとして(エラー落ちする可能性ありコードって事で)

2.times{
  puts "test"
  sleep 1
       }

監視コードはこんな感じで書いておけば、エラー落ちしても再起動かけれる
ラクチンだー

def foo
  return Process.spawn("ruby 2times.rb")
end

pid = foo

loop do
  check = Process.waitpid(pid)
  unless check == nil
     pid = foo
  end
  sleep 60
 end

ruby 1.8から1.9への移行その他

Rubyでrbファイルをrequireするときはドットを打つと良さそう
http://d.hatena.ne.jp/ruedap/20110531/ruby_require_load_path


UbuntuRubyをインストールしてMySQLPostgreSQLのライブラリを入れる
http://d.hatena.ne.jp/is0me/20100523/1274593171


ソースコード中に ASCII 以外の文字を含めるときはマジックコメントが必要となりました。UTF-8 の場合でも必要です。
http://d.hatena.ne.jp/ruby191changes/20090207/1234024879

Google chromeのお勧めextension(アドオン)

Google chromeのベータバージョンでextension(アドオン)対応となったので、早速使ってます。
Firefoxなどで良く使用されてるアドオンはそこそこ揃ってるので、中々快適。
と言うわけでメモメモ。

まずはchrome本体。エクステンション対応のバージョンは、まだベータテスト中なのでそこだけ注意。
英語ページですが、chromeのメニュー等は日本語表示されました。
http://www.google.com/intl/en/landing/chrome/beta/index.html


エクステンションのページ。
chrome extensions
https://chrome.google.com/extensions


説明の必要も無いものばかりなので、特にエクステンションの説明はしてません。


まずはマウスジェスチャー
Chrome Guestures
https://chrome.google.com/extensions/detail/jpkfjicglakibpenojifdiepckckakgk
(今のところ、LinuxMacでは動作しないようですが、mouseで検索すると他にもマウスジェスチャーエクステンションが見つかるので適当なのを)


AutoPagerize for Chrome
https://chrome.google.com/extensions/detail/igiofjhpmpihnifddepnpngfjhkfenbp


hatena-bookmark
http://hatena.g.hatena.ne.jp/hatenabookmark/20091209/1260314705


IE Tab
https://chrome.google.com/extensions/detail/hehijbfgiekmjfkfjpbkbammjbdenadd


Firebug Lite
https://chrome.google.com/extensions/detail/bnbbfjbeaefgipfjpdabmpadaacmafkj


Firefoxで使える機能がほとんど使えませんでしたけどアップデートに期待して。
Web Developer Mini
https://chrome.google.com/extensions/detail/dgmkbanfcdlllkbohlekikkgfbmkfolh


あんまり広告気にならないのでアンインストール候補ですが
AdBlock+
https://chrome.google.com/extensions/detail/aihgcejnnbjfnembkdhdebjhbjkmafaf


Google Mail Checker
https://chrome.google.com/extensions/detail/mihcahmgecmbnbcchbopgniflfhgnkff


PageRank Display
https://chrome.google.com/extensions/detail/mmhofljhcphkbkjmhaiagmbajikkfnep


chromeって多段タブ使えないんですかね?
沢山タブを開くと不便なので、このエクステンションで対応してます。
TooManyTabs for Chrome
https://chrome.google.com/extensions/detail/amigcgbheognjmfkaieeeadojiibgbdp


それでもタブ開きすぎると一覧性が悪くなるので、Session Manager というエクステンションを入れて、ブクマするまでも無いけどとりあえず保存といった感じで使ってます。
Session Manager
https://chrome.google.com/extensions/detail/bbcnbpafconjjigibnhbfmmgdbbkcjfi

Twitterのお隣さん発見サービス「となりったー」作りました。

となりったー
http://otonari.in/


このウェブサービスは〜ナンタラカンタラ


とかいうエントリを書いて、正式公開する予定でしたが、どこからかURLが漏れて広まってしまったのでもうグダグダです。


現在アクセス過多で非常に繋がりにくくなっています。
下記のようなメッセージに対して質問が来たのでここで説明しておきます。

このユーザーはクロール対象ではない、もしくはTweetが50未満、バグ等の理由分析出来ませんでした。

このエラーは、入力されたIDに間違いが無い場合、となりったーがそのユーザのデータを収集できていません。
Twitterで@makura宛にリプライを飛ばしていただくか、まったりとお待ちください。
(メッセージの通りTweetが50未満の場合はクローリングの対象になりません。)

また、

Can't connect to MySQL server on (4) in /var/www/users.php on line 32

といったエラーも出ていますが、これもアクセス過多の影響です。
このエラーが出た場合はきちんと分析結果が出ていない可能性があるので、しばらくしてまた試してみてください。


フレーズの抽出方法など、細かいアルゴリズムはまた後でエントリをアップします。
とりあえず今回は報告まで。

Twitterのふぁぼのもう一つの意味

Twitterのふぁぼって、「そのつぶやき凄く面白いよね!」とか、
「その考えに同意!」とか、逆に
「これは酷い発言!」


みたいなものに付けられるものなんだろうけども、
「貴方の発言ちゃんと見てますよ」って意味でもふぁぼる事はあると思う。
それを凄い勢いで実行してるのは @katoyuu1 だし、俺も最近そういう意味でふぁぼる事がたまにある。


返信あんまりしない人って、淡々と自分のつぶやきを流してるだけで、他人から見たら一体どんなTLを見てるのかよくわからない。このふぁぼはそれに対する答え。


他には、全く別の話で盛り上がってて、TLの隣で話してる話題には一切絡まなかったけども、そっちのTLも見てましたよ。楽しそうだったなー。とかいう意味でふぁぼったりとか。


ああ、そういう使い方してたなーそういえば。ってさっきふと思った。

Mysqlの文字化け問題 - 文字コードを後から変更するのに手こずる

MySQLのDBは、デフォルトの状態だとlatin1という文字コードになっているようだ。
日本人で少しでもプログラムを触った事がある人なら、文字コードの問題はもう関わるのも嫌なはず。
私もそのくちで、MySQLに日本語文字列を突っ込むときは、全てUTF8にしていた。
しかし今になって気づいてしまった。
show status hogetblをしても、show create table hogetblをしても、出てくるのはlatin1の文字。
いまのところ問題は表面化していないが、いずれそのツケはどこかで回ってくるはず。
それならば今のうちにUTF8にしておけと。

まずは復習がてら、読んでおくべきなのは以下のサイト。


文字化け問題を本気で直す
http://wota.jp/ac/?date=20061011


my.cnfに以下のように追記。
/etc/my.cnf

[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

[mysqld]に加え、 [mysql] にも書いておいた方が良いのかな。良く分からない。
この設定をしておけば、今後はデフォルトのcharsetがUTF8になる。
では、既にDBに大量のデータを突っ込んでしまった人はどうすればいいのか。


MySQL文字コード設定を後から変えるには
http://kzworks.at.webry.info/200903/article_14.html


このサイトや、他のサイトでもdumpに一旦書き出す手法を取っているが、dumpするのにもの凄い時間がかかるので、
ここではdumpせずに文字コードを変換しようと思う。

例えば、latin1(char50)で定義されたカラムに、latin1の文字コードで文字列が入っているレコードをutf8に変換するには以下のコマンドでできる。
ALTER TABLE hogetbl MODIFY column CHAR(50) CHARACTER SET utf8;


しかし、今の私の状況は、latin1で定義されたカラムに、UTF8の文字コードで文字列が入っているのだ。
これはやっかい。
この場合は、一旦バイナリに変換してから、再度UTF8に変換する必要があるそうだ。


以下のようにしてバイナリのデータ型に変換。バイナリならBLOBじゃなくてBINARY(50)とかでも良いけど、収まり切らない分のデータが消える可能性があるので注意。
私の場合、問題のカラムはTEXT型だったのでBLOBを使用しました。
ALTER TABLE hogetbl MODIFY column BLOB;

その後、改めてTEXT型にし、文字コードもUTF8に変換
ALTER TABLE hogetbl MODIFY column text CHARACTER SET utf8;

これでめでたくUTF8になりました。

参考:MySQLリファレンス - カラムキャラクタセット変換
http://dev.mysql.com/doc/refman/5.1/ja/charset-conversion.html

Ubuntu Server 8.04にTritonnをインストール

MySQLを万全の体制に整えてから作業始めたんだけど、Tritonn入れるにはMySQLごと入れる必要があるみたい(?)なので結局
apt-get remove mysql
してからの作業になりました。


Tritonnのビルド方法 - qwik.jp/tritonn

基本的には上記URLで。
ただし、Mecabの辞書にはnaist-jdicを使用しました。


Mecab
wget http://nchc.dl.sourceforge.net/sourceforge/mecab/mecab-0.98pre3.tar.gz
tar xzvf mecab-0.98pre3.tar.gz
cd mecab-0.98pre3
./configure
make
sudo make install


naist-jdic
wget http://iij.dl.sourceforge.jp/naist-jdic/40117/mecab-naist-jdic-0.6.0-20090616pre3.tar.gz
tar xzvf mecab-naist-jdic-0.6.0-20090616pre3.tar.gz
cd mecab-naist-jdic-0.6.0-20090616pre3
./configure --with-charset=utf8
make
sudo make install


使用辞書の変更
sudo vim /usr/local/etc/mecabrc
dicdir = /usr/local/lib/mecab/dic/naist-jdic

参考:http://d.hatena.ne.jp/code46/20090531/p1


Senna
./configure --prefix=/usr
make
sudo make install


Toritonn


Tritonnはそのままだと、configure する時にライブラリが無いとか怒られるので、
sudo apt-get install ncurses-dev


通常のconfigureだと、どうも上手くいかない。
MySQL公式バイナリのconfigureオプションを付けてやらないと、色々面倒な事になるそうだ。

CC='gcc' CFLAGS='-g' CXX='gcc' CXXFLAGS='-g' LDFLAGS='' ASFLAGS='' ./configure '--prefix=/usr/local/mysql' '--localstatedir=/usr/local/mysql/data' '--libexecdir=/usr/local/mysql/bin' '--with-comment=MySQL Community Server (GPL)' '--with-server-suffix=' '--enable-thread-safe-client' '--enable-local-infile' '--enable-assembler' '--with-pic' '--with-fast-mutexes' '--with-client-ldflags=-static' '--with-mysqld-ldflags=-static' '--with-zlib-dir=bundled' '--with-big-tables' '--with-yassl' '--with-readline' '--with-archive-storage-engine' '--with-blackhole-storage-engine' '--with-ndbcluster' '--with-csv-storage-engine' '--with-example-storage-engine' '--with-federated-storage-engine' '--with-innodb' '--with-extra-charsets=all' '--with-senna' '--with-mecab'


make
sudo make install
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf.d/tritonn.conf
ldconfig


groupadd mysql
useradd -g mysql mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql


cd /tritonn-1.0.10-mysql-5.0.51a/support-files
cp mysql.server /etc/init.d/tritonn
chmod +x /etc/init.d/tritonn
update-rc.d tritonn start 93 2 3 4 5 . stop 20 0 1 6 .
mkdir /var/lock/subsys
cp my-medium.cnf /etc/my.cnf
vim /etc/my.cnf

[mysqld]以下に追加
default-character-set=utf8
skip-character-set-client-handshake

/etc/init.d/tritonn start

show variables like "char%";
で、文字コードの確認

参考:http://d.hatena.ne.jp/takehikom/20080807/1218059835
  :http://d.hatena.ne.jp/hayori/20080508/1210210580