Paradigm Shift Design

ISHITOYA Kentaro's blog.

iPhoneSDKのsqlite3でユーザー定義関数を使えるようにする

sqlite3にはlog関数がない。


ただ、SQLite3 Contributionsというのがあって、そこにextension-functions.cがある。これを使えればlog/log10だけじゃなくて、

Provide mathematical and string extension functions for SQL queries using the loadable extensions mechanism. Math: acos, asin, atan, atn2, atan2, acosh, asinh, atanh, difference, degrees, radians, cos, sin, tan, cot, cosh, sinh, tanh, coth, exp, log, log10, power, sign, sqrt, square, ceil, floor, pi. String: replicate, charindex, leftstr, rightstr, ltrim, rtrim, trim, replace, reverse, proper, padl, padr, padc, strfilter. Aggregate: stdev, variance, mode, median, lower_quartile, upper_quartile.

とか色々使えるようになるらしいんだけど、iphoneSDK上でdylib作ってインクルードする方法がいまさんくらい分からない*1ので、あきらめて、
Distance function for sqlite | This Much I KnowのDaveさんがやっている方法で行く。


とりあえず、てきとうなC言語のヘッダファイルとソースファイルに、目的の関数を作る。
logとlog10が必要なだけなので、ヘッダファイルは以下の通り

//  sqlite3_extension_functions.h
#ifndef SQLITE3_EXTENSION_FUNCTIONS
#define SQLITE3_EXTENSION_FUNCTIONS
void sqlite3_extension_log(sqlite3_context *context, int argc, sqlite3_value **argv);
void sqlite3_extension_log10(sqlite3_context *context, int argc, sqlite3_value **argv);
#endif


実装は引数のチェック後に、標準関数を呼び出しているだけ。

//  sqlite3_extension_functions.c

#include "sqlite3.h"
#include "sqlite3_extension_functions.h"
#include "math.h"
#include "assert.h"

void sqlite3_extension_log(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    assert(argc == 1);
    if (sqlite3_value_type(argv[0]) == SQLITE_NULL){
        sqlite3_result_null(context);
        return;
    }
    double value = sqlite3_value_double(argv[0]);
    sqlite3_result_double(context, log(value));
}

void sqlite3_extension_log10(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    assert(argc == 1);
    if (sqlite3_value_type(argv[0]) == SQLITE_NULL){
        sqlite3_result_null(context);
        return;
    }
    double value = sqlite3_value_double(argv[0]);
    sqlite3_result_double(context, log10(value));
}


で、sqlite3_openの直後に、sqlite3_create_functionを呼び出して関数を登録する。

int err = sqlite3_open([databasePath fileSystemRepresentation], &db );
if(err != SQLITE_OK) {
    NSLog(@"error opening!: %d", err);
    return NO;
}

//functionの読み込み
sqlite3_create_function(db, "log", 1, SQLITE_UTF8, NULL, &sqlite3_extension_log, NULL, NULL);
sqlite3_create_function(db, "log10", 1, SQLITE_UTF8, NULL, &sqlite3_extension_log10, NULL, NULL);


第2引数が、SQL内での関数名。第3引数が引数の数。
あとは特に気にしなくていいのでは。


で、

SELECT log(1), log10(1)

とかできる。


まぁ、できればextension-functions.c使いたいけど、あまりがんばるところじゃないので保留。技術力が足りない…orz

*1:sqlite_load_extensionでライブラリのエラーが出る。コンパイルオプションの問題だとは思うのだけど

リュックサックからメッセンジャーバッグへ。Mr.Bikeさようなら、Timbuk2こんにちは!

バッグを買い替えました。
17年ぶりに。


これまで使っていたリュックサックはJack Wolfskinというドイツのメーカが昔出していたMr. Bikeという、その名の通り自転車用のリュックサック。
最近はもう売っていないようで、オークションで時々出回っているくらい。


ちょうどイギリスから帰ってきたばかりの12歳のときに自転車を買ってもらい、遠出をしたくて輪行をくわだてて、父親に買ってもらったのだったと思います。
たしか、父親がイギリスに単身赴任になった次の年、社内規定で1年に1回家族を呼び寄せることができて、それでイギリスへ行って、さらに旅行でドイツかどこかへ行って、狼の足跡のマークに一目惚れして買ってもらったんじゃないかなぁ。
うろおぼえ。


それから、17年。
途中途中、いくつかのバッグを持っていましたが、輪行のときは必ずこのバッグだったし、高専に行くのにもwakhokに行くのにも名大に行くのにも、リオに行くのにもずーっとずーっと使い続けてきました。


「それはもうバッグがかわいそうだよ」
といわれてはや3年。
f:id:kent013:20110519214644j:image:medium:left
f:id:kent013:20110519214654j:image:medium:left
f:id:kent013:20110519214700j:image:medium:left
f:id:kent013:20110519214707j:image:medium:left
f:id:kent013:20110519214715j:image:medium


さすがに、チャックが両方とも壊れてしまって、ボロボロで、持ち歩くのも少し恥ずかしいくらいになってしまい。
17年使い続けると、というか使い続けられたことが驚異だけど、自分の半生をともに生きたわけで、そう軽々しく買い替えることができなくて。


でも、遂に、さようならをする時が来ました。
MacBook 15inchがきたので、それを持ち運ぶために新しいバッグの購入を決意。


条件は、

  1. MacBook 15inchが入ることがユーザーレビューで確認できるまたは公式対応をうたっているもの
  2. メッセンジャーバッグであること
  3. もろもろ込みで2万円以下

というくらい。


色々探すとあるものでメッセンジャーバッグ業界は、ニッチなわりに案外活発なことが分かりました。


最終的に候補としたのが、

  1. ChromeCitizen Buckle Bag Medium
  2. The North FaceBasecamp MessengerBag L
  3. Timbuk2D-Lux Messenger Bag M


の3種類。
1は、ユーザーレビューをみるにいいらしいけどPCスリーブがついているわけではないし、本国だと$140なのに日本だと2万円弱で、国際発送もないようなので却下。
2は、最後まで迷ったけど、uzullaさんの色違いというのも悔しいので却下
3は、PCスリーブがついていること、日本では人気色が売り切れてて買えないのだけれど、本国で買えばカスタマイズし放題なこと、国際発送を$30でしていること、円安なことなどが決め手になり、ここで買うことに決定。


日本の代理店で買うと1万5千円弱。
カスタマイズてんこもりで$220プラス送料$30で$250、81円換算で20,250円。ちいとばかし予算オーバーだけど、許容範囲なので脳内財務省からGoサインがでました。


カスタマイズはサンプルのようにできて、

  1. バッグの種類
  2. サイズ
  3. 外側の色と素材
  4. 外側のエッジの色
  5. ロゴの色
  6. インナーの色
  7. 肩当ての色と素材

を選ぶことができます。
ただ…、選べ過ぎてだんだんどれがいいのかわからなくなってきますのでご注意を。


僕は結局、色々選んだけど無難な青と白の組み合わせです。
…手元にきてもう少し遊べばよかったとちょっと後悔。
まぁケリーバッグ買うこと考えたら10じゃきかないぐらい買えちゃうわけだし。
もうあのリュックサックとはおさらばするわけだし、欲しければいくつも買えばいいよね*1


で、5月10日に注文し、UPSからの出荷通知が5月12日にあり、5月16日月曜日は会議にいっていたので不在票が入っていて。


5月17日、やった!届いた!


と思ったら、なんかお兄さんの持っている袋がやたらと小さくて…
Timbuk2からきたメールを読み返すと…

Note: Your order may arrive in two separate shipments. Why? Because we ship custom orders from our San Francisco factory and ready-made orders from our warehouse north of the city. We know. Nothing we do is normal. Rest assured this will not impact your total shipping cost or associated duties but may incur additional brokerage fees in your country.

つまり、できあいの肩当ては先に送るよ。でもカスタムメイドのやつはそのあと送るよ。だから荷物は二つに分かれるよ。だ、そうで。


超ヌカヨロコビ。
f:id:kent013:20110519213732j:image:medium
これ、肩当て。



で本体は5月17日の朝、出荷通知がきて、5月19日、今日の朝ようやく届きました。
f:id:kent013:20110519111012j:image:medium
届きましたが、今日は京都出張!
うぐぐぅとかぬぐぐぅとか言いながら、京都へ行って先ほど帰ってきて記事を書いています。


で、感想としてはデカイ!
そして、15inchはメッセンジャーバッグにいれるのどうなの!?
という根本的な問題にぶちあたっています。
15inchでメッセンジャーバッグに入れて自転車に乗ると、僕が乗っている自転車はMTBなのでロードと比べると背中が立っているために、背中に全然フィットしない*2
そして、Right Handedで注文したけど、どうやら僕はLeft Handedのバッグが体にしっくりくるらしい…


さらに、サイトと微妙に色味が違ってて、灰色のメッシュかと思ったらキラキラ素材だった…
f:id:kent013:20110519214128j:image


とまぁ色々後悔はありますが、
大きくて、とりあえずその辺にあった本とMacBook17inchとiPad2とGilbey's Ginのボトルとマヨネーズの大きいやつがスッポリ入っちゃうくらいデカイ。
何なら余裕あるくらい。
f:id:kent013:20110519214546j:image


それにMacBookがしっかり固定できるし、専用のモコモコがついててちゃんと保護されてる。備え付けのサイドポケットも充実していて小物がさくさく入る。
f:id:kent013:20110519214204j:image


まぁそんなわけで、17年間お世話になったリュックサックは押し入れの中で眠ってもらって、これからはまだ勝手のわからないTimbuk2と付き合っていくことになります。


Mr.Bikeありがとう、そしてさようなら。


メッセンジャーバッグの購入記でした。

せんでん

1タップで写真共有tottepost
カメラのついたiPad/iPhoneで撮った写真を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

*1:性格的に買わないと思うけど

*2:板を背中に乗せてバランスとっている感じ

iTermでscreen上のemacsを256色表示

ここのところ連続で3回ほど同じ設定をして、その度にあれどこで見たっけなぁ、と探しているので、メモ。


参考にしたのは

上記二つを見れば特に問題はないのだけれど、やり方のみ列挙しておきます。


1, screenをインストールする。
gitの最新バージョンをインストールするとdefloginがどうの言われるので、それがなおるまではとりあえず以下のコマンドで。

svn co http://svn.macports.org/repository/macports/trunk/dports/sysutils/screen/ -r 45522
sudo port install


2, iTerm2をインストール
まぁよくわからないけど、iTerm2にしてみればいいのではないか
http://code.google.com/p/iterm2
で、Preferences->Terminal->Terminal Emulationをxterm-256colorにする


3, .screenrcの編集

defbce "on"
term xterm-256color
termcapinfo xterm-256color 'is=^[r^[mJ^[H^[?7h^[?1;4;6l'

と追記する。^[はエスケープなので注意。貼付けても意味ない。
エスケープ文字の入力方法 - nelnalog.note


4, 256色になっているかどうかの確認
The 256 color mode of xtermから256colors2.plをDLして

perl 256colors2.pl

でなんかカラフルならOK


あとはemacsなりvimなりでカラーテーマの設定をすると完璧。

RJBが[BUG] cross-thread violation on rb_gc()で落ちる

もういっちょエラーエントリ。

英語の文章を形態素解析するために、The Stanford NLP (Natural Language Processing) Groupを使ってみたいなと思った訳ですよ。で、リンクにruby bindingというのがあったから、お、gemあんじゃんと思ったら、単にjar呼んでるだけなのね。

で、Ruby Java Bridgeをgemでインストールする訳だけど、

gem install rjb

して、bindingにあった、

equire 'rjb'

Rjb::load('stanford-postagger.jar:stanford-ner.jar', ['-Xmx200m'])
MaxentTagger = Rjb::import('edu.stanford.nlp.tagger.maxent.MaxentTagger')
tagger = MaxentTagger.new("models/left3words-wsj-0-18.tagger")
sent = 'Rails3 / Ryan\'s Scraps: What\'s New in Edge Rails: Cleaner RESTful Controllers w/ respond_with'
puts tagger.tagString( sent )

な、サンプルコードを動かすと、見事に

bash-3.2$ ruby tagger.rb 
[BUG] cross-thread violation on rb_gc()
(null)

Abort trap

なエラーが。OSX+Ruby一筋縄ではいかないね…
で、エラーでググってもよくわからなかったけど OSX, RubyGems and cross-thread violations in rb_gcによれば、別環境用のバイナリがあるとこのエラーが出るみたいなことが書いてある。

ふむ、と思って

gem list rjb

すると、

rjb (1.3.4 universal-darwin-10)

とのこと。よくわからん。darwin先生はuniversalなのにだめらしい。
とりあえず、rjbをアンインストールして、

gem install rjb --platform=ruby

再度インストール。

gem list rjb
rjb (1.3.4)

環境の指定がとれた。


気を取り直して再実行。

bash-3.2$ ruby tagger.rb
Loading default properties from trained tagger models/left3words-wsj-0-18.tagger
Reading POS tagger model from models/left3words-wsj-0-18.tagger ... done [0.9 sec].
Rails3/NNP \//NNP Ryan/NNP 's/POS Scraps/NNS :/: What/WP 's/VBZ New/NNP in/IN Edge/NNP Rails/NNPS :/: Cleaner/NNP RESTful/NNP Controllers/NNPS w/VBD \//CD respond_with/NN

動いた!
どうでもいいけど、エラーメッセージって大事ですね…。

OSX+PostgreSQL+Railsな環境でhttpsにアクセスするとSegmentation Faultする

前回のエントリではWindowsがどうのと言っていましたが、TestやWEBrickの起動が遅すぎて話にならないのでMacに環境を再構築しました。
PHPもとても遅いのだけれど、それはOSのFile I/Oの速度が大きく影響しているっぽいです。


それはさておき、OSXでWEBrickを立ち上げてTwitterにアクセスしたところ、

/Users/kent/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:678: [BUG] Segmentation fault


というエラーが出てきました*1。ソースをみるとhttpsソケットを作ってconnectしようとして落ちているようです。Windowsでは正しく動作していたプログラムだったので、理由がわからず。Rubyの所為かと思ってp0からheadリビジョンまで入れて試してみましたが何も変わらず。むしろ何も変わらないので、ほかに原因があるんだなとおもって探していると、
[Ruby 1.9-Bug#4373][Open] http.rb:677: [BUG] Segmentation fault - Ruby Forum
に行き当たりました。というか、これしか情報源ないの?的な。


結論から言うと、
portsやOne Click InstallerでインストールしたPostgreSQLが使っているOpenSSLのバージョンが、Rubyの使っているものよりも古くてかつ先に読み込まれているので、RubyからTwitterHTTPSで提供されているサービスにアクセスしようとしたときに、落ちる。
ということのようです。


上のサイトにあるようにして、使っているライブラリを確認してみると

rails console
ruby-1.9.2-p180 :001 > require 'openssl'
 => nil 
ruby-1.9.2-p180 :002 > system "otool -L #{$LOADED_FEATURES.grep(/openssl.bundle/).join (' ')}"

とするとRubyで利用しようとしている読み込まれているopensslのバージョンがわかります。結果は

/Users/kent/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/x86_64-darwin10.7.0/openssl.bundle:
        /Users/kent/.rvm/rubies/ruby-1.9.2-p180/lib/libruby.1.9.1.dylib (compatibility version 1.9.1, current version 1.9.1)
        /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
        /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
 => true

とでて、0.9.8を読み込もうとしています。

対するPostgreSQLは、

bash-3.2$ otool -L /Library/PostgreSQL/9.0/lib/libpq.dylib 
/Library/PostgreSQL/9.0/lib/libpq.dylib:
  libpq.5.dylib (compatibility version 5.0.0, current version 5.3.0)
  /usr/lib/libssl.0.9.7.dylib (compatibility version 0.9.7, current version 0.9.7)
  /usr/lib/libcrypto.0.9.7.dylib (compatibility version 0.9.7, current version 0.9.7)
  /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 5.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

で、0.9.7でした。この違いがエラーを引き起こしているようです。


で、解決策ですが、

  1. developmentではsqlite3を使う
  2. 自分でPostgreSQLソースコードを持ってきてインストールする

1は後ろ向きですが、まぁSQLのチューニングが必要だとかの特段の理由がなければ開発環境でPostgreSQLを使う理由はないですし。それでもいいかなと思います。
2はPostgreSQLのサイトからtarボールを持ってきてconfigure/make/make installで、デフォルトの位置にインストールされたなら

gem install pg -- --with-pg-dir=/usr/local/pgsql/

とすればいいです。デフォルトでconfigureするとwithout opensslなので、opensslサポートが必要ならそのようにconfigureすればいいです。
ただ、localhostとの通信にopenssl使う理由もわからないので、必要ないでしょう。


しかし、本当にRuby界隈のみなさんは、PostgreSQL使ってないんだなと感じた出来事でした。
いや、前回の記事ではWindowsが悪いんだ!って言ってたけど、PostgreSQLが過疎ってるだけでした。PostgreSQLいいよ!Postgre!


という訳で、エラーエントリでした。

*1:少し前のバージョンのRubyだとhttp.rb:677、いずれにしてもconnectメソッド内

WindowsでRailsの開発環境を準備する

2年前くらいにすこしだけ触って、それから放置していたRailsを仕事で使うことになったので、今回再度、環境を構築しようと思ったのだけれど、備忘録がなくて少し苦労しました。
後輩たちも使うそうなのでまとめて備忘録をつけておこうと思います。

RubyRailsと書籍

あー、RubyはMatzさんが開発したスクリプト言語です。Ruby - Wikipediaとか読んだらいいと思う。
Railsは、言語ではなくてRubyで書かれたWebアプリケーションフレームワークです。まぁRuby on Rails - Wikipediaを読めばいいんじゃないか。
Webアプリケーションフレームワークが何をするかわからないなら[ThinkIT] 第1回:Webアプリケーションフレームワークとは (1/4)とか読んでください。


Rubyの本は、

プログラミングRuby 1.9 −言語編−

プログラミングRuby 1.9 −言語編−


でいいのではないかと思う。Rails
RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版


で、両方ともオーム社eStore(β)から電子書籍で買える。こういうリファレンス本こそ電子書籍の価値がある。検索できるってことがどれだけ効率に影響するか…。iPadで読むときはi文庫HDがよろしかろうと思います。PDF が読める iPad アプリ 10個を比較してみたよ - 彼女からは、おいちゃんと呼ばれていますで比較されているけれど、goodiware.com :: products :: GoodReaderBookmanについて(日本語) « Bookman Labは次ページに進んだ時に、そのページのレンダリングを始めるので、表示が遅くてイラッとくる。
i文庫HDは、あの格好いい*1ページめくりエフェクトのおかげで次のページをキャッシュしているから、ページめくりが軽快でよろしい。
iPadの話で、iPad2だとどうなのかわからないけど。

構築する環境

普通Railsを使う場合はNetBeansMySQLな感じみたいだけど、うちの研究室も会社もPostgreSQLなので、

  1. Ruby 1.9.2-p180
  2. Rails 3.0.6
  3. PostgreSQL
  4. Windows XP

な開発環境をWindows上に構築します。

Rubyのインストール

オブジェクト指向スクリプト言語 Rubyのダウンロードページに各環境用バイナリへのリンクが張ってあって、Windowsのバイナリへのリンクがいくつかあるけれども、RubyInstaller for Windowsをインストールすればいいみたい。One-Clickじゃねぇじゃないかと何度も言われましたが、知りません。なんとなく日本語の取り扱いが微妙なので、できればドライブ直下とか、インストールディレクトリにスペースが入らないようなところへインストールするといいかと思います。

C:\ruby\1.9.2-p180

とかね。

環境変数の追加

#One-Clickだと最初にチェックボックスを選択すればやってくれます。

rubyのインストールが終わったら、環境変数RUBY_HOMEを作成して、PATHに%RUBY_HOME%/binを追加してください。最近は環境変数もいじらなくてよくなってきたのかなとも思うけど、rubyはgemをコマンドプロンプトでよく使うみたいなので。

環境変数の追加・変更は、システムのプロパティからやるのもいいけど、窓の杜 - Rapid Environment Editor(About - Rapid Environment Editor)あたりがいいらしい*2ですよ。

RUBY_HOME=C:\ruby\1.9.2-p180
PATH=%PATH%;%RUBY_HOME%\bin

的なことを追加してください。Pathの通し方くらいはGoogle先生が答えてくれます。
で、コマンドプロンプトを立ち上げて、

ruby --version

と打って

ruby 1.9.2p180 (2011-02-18) [i386-mingw32]

とか返事が返ってきたらOKです。
ちなみにコマンドプロンプトはデフォルトでは範囲指定やコピペができないので簡易編集の設定をしておくといいです。@IT:Windows TIPS -- Knowledge:これだけは覚えておきたい、コマンド・プロンプトの使い方あたりを読んでください。因みにコピーはCtrl+Cじゃなくて選択してEnterですよ。

gemのアップデートとrailsのインストール

で、ここまで来たらRubyGemsをアップデートします。しなくてもいいかもしれないけど。RubyGemsRuby用のパッケージ管理システムです。javaでいうmavenのdependency mechanizmだし、PHPPEARだし、Linuxのyumやrpmやapt-getです。まぁRubyGems - Wikipediaを読んでください。

gemをアップデートするには

gem update --system
gem update

してください。上の行はgem自体のアップデート、下はgemでインストールされているパッケージのアップデートです。gemでエラーが出る場合は環境変数の設定とか見直してください。あとcygwinからcmdって打ってコマンドプロンプトを使わないように。なんか変になることがあります。

これが終わったらいよいよrailsのインストール。
…まぁ

gem install rails

って打てば終わりだし、NetBeansとかだとボタンがついてたりもするけど。インストールが終わったら

rails --version

と打って

Rails 3.0.6

とか言われればOKです。

PostgreSQLのインストール

ここはMySQLな人は飛ばせばいいと思います。MySQLとかPostgreSQLとかOracleとかのRDBMSがわかんねぇって人はグーグル先生に聞けばいいと思います。

PostgreSQLは何も考えずに、Download PostgreSQL | EnterpriseDBからDLしてインストールしてください。途中で聞かれるパスワードを覚えておいてください。あとインストール後に聞かれるStack Builderは立ち上げなくていいです。

pgパッケージのインストールとDevKitのインストール

で、rubyからpostgreSQLにアクセスするためのpgというパッケージをインストールします。

以下、インストール時にはまった項目を列挙していますから、普通のインストールの仕方は
ged / ruby-pg / wiki / Win32Instructions — Bitbucket
を見てください。

Visual StudioのExpressEditionをインストールしたり、VSについてるVisualStudioコマンドプロンプトを使わないといけないとかいうのは、省いていいよね?

pgパッケージのインストールの仕方、正解

正解は、PostgreSQLのbinに入っているpg_config.exeを直接実行したときに出てくる、

BINDIR = C:/PROGRA~1/POSTGR~1/9.0/bin

C:/PROGRA~1/POSTGR~1/9.0

というショートネームを--with-pg-dirに渡せばいい。
ショートネームって何ぞ、という人は@IT:Windows TIPS -- Tips:8.3形式の短いファイル名を表示させるを読んでください。

デフォルトだと、

C:\Program Files\PostgreSQL\9.0

とかにインストールされてるので、同じ場所なら

gem install pg -- --with-pg-dir=C:/PROGRA~1/POSTGR~1/9.0

でインストールできます。

DevKitのインストール

でまぁ、これが厄介で、
何も考えずに

gem install pg

とかやると

Fetching: pg-0.10.1.gem (100%)
ERROR:  Error installing pg:
        The 'pg' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

とまぁ、Windows上でビルドしようとしたけど環境がないから失敗したよ、DevKit入れてねって言われます。素直に従ってDownloadsからDevelopment Kitをダウンロードします。
DLしたファイルはただの7zipファイルなので、ダブルクリックするとインストールする場所を聞かれますが、これもまたスペースが入っていたり日本語が入っていたりすると微妙なので、

C:\languages\ruby\DevKit

的な場所に解凍します。Development Kit · oneclick/rubyinstaller Wiki · GitHubを読めばインストールできると思うのですが、

cd C:\languages\ruby\DevKit
ruby dk.rb init
ruby dk.rb install

すればいいです。initした時にごにょごにょ言われる場合、cygwinでやらないように。素のWindowsのコマンドプロンプトでやってください。

試行錯誤

そして、DevKitもインストールできたからpgインストールできるだろ!と思って、再度

gem install pg

とやると、

Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

        D:/languages/ruby/1.9.2-p180/bin/ruby.exe extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
--snip--
        --with-pg-dir
--snip--

とか言いやがります。pg_configが見つからないからlibpq-fe.hが見つからないとな。--with-pg-configつけろとかいうので、

gem install pg --with-pg-dir="C:\Program Files\PostgreSQL\9.0"

とすると、今度は

ERROR:  While executing gem ... (OptionParser::InvalidOption)
    invalid option: --with-pg-dir=C:\Program Files\PostgreSQL\9.0

とかなります。オプションつけろって言ったくせに。コマンドの追加の仕方は、

gem install pg -- --with-pg-dir="C:\Program Files\PostgreSQL\9.0"

です。で、これでも通らなくて、

Using config values from D:\Program

とかいうので、PathにPostgreSQLのbinを追加して解決しようとすると

checking for pg_config... yes

とpg_configは見つかっているのに

extconf.rb:13:in ``': No such file or directory - D:\Program Files\PostgreSQL\9.
0\\bin/pg_config.exe --includedir (Errno::ENOENT)
        from extconf.rb:13:in `<main>'

とか言われて半狂乱になります。The Evelotuion of a Programmar - けむしろうwebのChief Executiveを思い出します。最近のネット企業では、こんなジョーク通じないかもね。

で、繰り返しになりますが正解は、pg_config.exeを直接実行したときに出てくる、

BINDIR = C:/PROGRA~1/POSTGR~1/9.0/bin

C:/PROGRA~1/POSTGR~1/9.0

というショートネームを--with-pg-dirに渡せばいい。デフォルトだと、

C:\Program Files\PostgreSQL\9.0

とかにインストールされてるので、同じ場所なら

gem install pg -- --with-pg-dir=C:/PROGRA~1/POSTGR~1/9.0

とすると

Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
Successfully installed pg-0.10.1
1 gem installed
Installing ri documentation for pg-0.10.1...
Installing RDoc documentation for pg-0.10.1...

と、無事インストールできます。
っつか、めんでぇ!って方はruby+PostgreSQLを使わないといいと思います。

参考:

WindowsのIDE*3

で、Windowsの開発環境はNetBeansを使おうと思います。
ただ、NetBeansは神託によってRubyサポートが打ち切られるらしい(NetBeans 7.0ではRuby on Railsのサポートを停止する方針 - SourceForge.JP Magazine : オープンソースの話題満載)ので、他のIDEも検討したほうがいいみたいです。Emacs大好きなのでこの界隈詳しくないのだけれど、Ruby on Rails用 統合開発環境(IDE) 比較レポート(1/3):CodeZineという記事にあるように、

  1. Aptana
  2. NetBeans
  3. Eclipse

Ruby開発環境として有力みたいで、AptanaEclipseに関してはAptana単体のものとEclipseプラグインとしてのAptanaがあるそう。使うならどっち?Eclipse or Aptana | Technolog.jp - ICTウェブマガジンを読むに、まぁEclipseでいいみたいです。

記事書き始めて調べたので、今はNetBeansってことで…。
で、【ハウツー】NetBeansでRuby on Rails開発 (1) 開発を始める前に | エンタープライズ | マイナビニュース読めばOK。

まとめ

あとは本読んで。

所感

いや、PostgreSQLRuby界隈でこんなに冷遇されているなんて。
本当はサーバーのほうも書こうと思ったけど、もうめんどいのでこれで終わり。


せんでん

1タップで写真共有tottepost
カメラのついたiPad/iPhoneで撮った写真を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

*1:無駄な

*2:スキンの変更とか言語の変更とかが簡単にできるのにキーや値の検索ができないという不思議なアプリケーションですが

*3:Integrated Development Environment/統合開発環境

CentOS5.5にPostgreSQL9.0をインストールする時の注意点

さくらのVPS*1を借りたので何も考えずにPostgreSQL9.0を入れようとしたらはまったという話。


#追記、下記現象はデフォルトの環境では起きないみたいです。
#私の環境がおかしかったらしい。
#けどま、はまった人が1人いたら30人はいるはずなので残しておきます。


さくらのVPSはCentOS5.5なのだけれど、契約してログインした直後はほとんど何もインストールされていない。


PostgreSQL9.0をインストールするときにはまる方法は以下の通り。
まず、

wget http://www.pgrpms.org/reporpms/9.0/pgdg-centos-9.0-2.noarch.rpm
rpm -ivh pgdg-centos-9.0-2.noarch.rpm

としてリポジトリの情報をとってくる。で、
PostgreSQL RPM Repository (with Yum)

の中段にある「Important note」にあるように、

vi /etc/yum.repos.d/CentOS-Base.repo

として、baseセクションとupdateセクションに

exclude=postgresql*

とかいておもむろに

yum install httpd postgresql-server

とかやると、

Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.2.3-43.el5.centos.3 set to be updated
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd
--> Running transaction check
---> Package apr-util.x86_64 0:1.2.7-11.el5_5.2 set to be updated
--> Processing Dependency: libpq.so.4()(64bit) for package: apr-util
--> Finished Dependency Resolution
apr-util-1.2.7-11.el5_5.2.x86_64 from updates has depsolving problems
  --> Missing Dependency: libpq.so.4()(64bit) is needed by package 
                            apr-util-1.2.7-11.el5_5.2.x86_64 (updates)
Error: Missing Dependency: libpq.so.4()(64bit) is needed by package 
                            apr-util-1.2.7-11.el5_5.2.x86_64 (updates)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest

と、libpq.so.4への参照がないとか言って怒られる。PostgreSQL8系のいつごろからかlibpq.so.4ではなくlibpq.so.5がインストールされるようになっているから怒られるのだけれど、PostgreSQL8.4とかでは怒られなかったし、ほかのサーバーでインストールしたときは怒られなかったのに、何で・・・?


と思ってググってみると、libpq.so.4を提供しているパッケージは

compat-postgresql-libs

というパッケージらしい。ほう、と思って

yum search compat-postgresql-libs

するも

Warning: No matches found for: compat-postgresql-libs
No Matches found


Fxxk!


というわけで、見事にはまれます。



pg_config, ruby pg, postgresql 9.0 problem after upgrade, centos 5 - Stack OverflowCentOS5.5へPostgreSQL9.0をyumでインストールする - bose999の試験管の中の話でも触れられているけど、そもそも、PostgreSQL9.0のリポジトリには、compat-postgresql-libsパッケージがないのが問題。8.4のリポジトリにはあるのに。


なわけで、解決方法としては

rpm -e pgdg-centos
wget http://www.pgrpms.org/reporpms/8.4/pgdg-centos-8.4-2.noarch.rpm
rpm -ivh wget pgdg-centos-8.4-2.noarch.rpm
yum install compat-postgresql-libs

としてcompatライブラリ*2を入れたのち、

rpm -e pgdg-centos
rpm -ivh pgdg-centos-9.0-2.noarch.rpm

として、

yum install httpd postgresql-server

とすると、

Complete!

となり、ヒャッハーです。

せんでん

1タップで写真共有tottepost
カメラのついたiPad/iPhoneで撮った写真を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

*1:プラン増えてる!

*2:別にpgdg使って入れなくても探してくればいいのだけど、こっちのほうが簡単