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
リュックサックからメッセンジャーバッグへ。Mr.Bikeさようなら、Timbuk2こんにちは!
バッグを買い替えました。
17年ぶりに。
これまで使っていたリュックサックはJack Wolfskinというドイツのメーカが昔出していたMr. Bikeという、その名の通り自転車用のリュックサック。
最近はもう売っていないようで、オークションで時々出回っているくらい。
ちょうどイギリスから帰ってきたばかりの12歳のときに自転車を買ってもらい、遠出をしたくて輪行をくわだてて、父親に買ってもらったのだったと思います。
たしか、父親がイギリスに単身赴任になった次の年、社内規定で1年に1回家族を呼び寄せることができて、それでイギリスへ行って、さらに旅行でドイツかどこかへ行って、狼の足跡のマークに一目惚れして買ってもらったんじゃないかなぁ。
うろおぼえ。
それから、17年。
途中途中、いくつかのバッグを持っていましたが、輪行のときは必ずこのバッグだったし、高専に行くのにもwakhokに行くのにも名大に行くのにも、リオに行くのにもずーっとずーっと使い続けてきました。
さすがに、チャックが両方とも壊れてしまって、ボロボロで、持ち歩くのも少し恥ずかしいくらいになってしまい。
17年使い続けると、というか使い続けられたことが驚異だけど、自分の半生をともに生きたわけで、そう軽々しく買い替えることができなくて。
でも、遂に、さようならをする時が来ました。
MacBook 15inchがきたので、それを持ち運ぶために新しいバッグの購入を決意。
条件は、
- MacBook 15inchが入ることがユーザーレビューで確認できるまたは公式対応をうたっているもの
- メッセンジャーバッグであること
- もろもろ込みで2万円以下
というくらい。
色々探すとあるものでメッセンジャーバッグ業界は、ニッチなわりに案外活発なことが分かりました。
- メッセンジャーバッグ.jp | messengerbag.jp
- このたびMacBook Pro15インチを最近購入しました。 そこで最適な.. - 人力検索はてな
- Best Messenger Bags for a Macbook Pro (15) - with Room for textbooks - MacRumors Forums
最終的に候補としたのが、
- ChromeのCitizen Buckle Bag Medium
- The North FaceのBasecamp MessengerBag L
- Timbuk2のD-Lux Messenger Bag M
の3種類。
1は、ユーザーレビューをみるにいいらしいけどPCスリーブがついているわけではないし、本国だと$140なのに日本だと2万円弱で、国際発送もないようなので却下。
2は、最後まで迷ったけど、uzullaさんの色違いというのも悔しいので却下
3は、PCスリーブがついていること、日本では人気色が売り切れてて買えないのだけれど、本国で買えばカスタマイズし放題なこと、国際発送を$30でしていること、円安なことなどが決め手になり、ここで買うことに決定。
日本の代理店で買うと1万5千円弱。
カスタマイズてんこもりで$220プラス送料$30で$250、81円換算で20,250円。ちいとばかし予算オーバーだけど、許容範囲なので脳内財務省からGoサインがでました。
カスタマイズはサンプルのようにできて、
- バッグの種類
- サイズ
- 外側の色と素材
- 外側のエッジの色
- ロゴの色
- インナーの色
- 肩当ての色と素材
を選ぶことができます。
ただ…、選べ過ぎてだんだんどれがいいのかわからなくなってきますのでご注意を。
僕は結局、色々選んだけど無難な青と白の組み合わせです。
…手元にきてもう少し遊べばよかったとちょっと後悔。
まぁケリーバッグ買うこと考えたら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.
つまり、できあいの肩当ては先に送るよ。でもカスタムメイドのやつはそのあと送るよ。だから荷物は二つに分かれるよ。だ、そうで。
で本体は5月17日の朝、出荷通知がきて、5月19日、今日の朝ようやく届きました。
届きましたが、今日は京都出張!
うぐぐぅとかぬぐぐぅとか言いながら、京都へ行って先ほど帰ってきて記事を書いています。
で、感想としてはデカイ!
そして、15inchはメッセンジャーバッグにいれるのどうなの!?
という根本的な問題にぶちあたっています。
15inchでメッセンジャーバッグに入れて自転車に乗ると、僕が乗っている自転車はMTBなのでロードと比べると背中が立っているために、背中に全然フィットしない*2。
そして、Right Handedで注文したけど、どうやら僕はLeft Handedのバッグが体にしっくりくるらしい…
さらに、サイトと微妙に色味が違ってて、灰色のメッシュかと思ったらキラキラ素材だった…
とまぁ色々後悔はありますが、
大きくて、とりあえずその辺にあった本とMacBook17inchとiPad2とGilbey's Ginのボトルとマヨネーズの大きいやつがスッポリ入っちゃうくらいデカイ。
何なら余裕あるくらい。
それにMacBookがしっかり固定できるし、専用のモコモコがついててちゃんと保護されてる。備え付けのサイドポケットも充実していて小物がさくさく入る。
まぁそんなわけで、17年間お世話になったリュックサックは押し入れの中で眠ってもらって、これからはまだ勝手のわからないTimbuk2と付き合っていくことになります。
Mr.Bikeありがとう、そしてさようなら。
メッセンジャーバッグの購入記でした。
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からTwitterのHTTPSで提供されているサービスにアクセスしようとしたときに、落ちる。
ということのようです。
上のサイトにあるようにして、使っているライブラリを確認してみると
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でした。この違いがエラーを引き起こしているようです。
で、解決策ですが、
- developmentではsqlite3を使う
- 自分で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!
という訳で、エラーエントリでした。
WindowsでRailsの開発環境を準備する
2年前くらいにすこしだけ触って、それから放置していたRailsを仕事で使うことになったので、今回再度、環境を構築しようと思ったのだけれど、備忘録がなくて少し苦労しました。
後輩たちも使うそうなのでまとめて備忘録をつけておこうと思います。
RubyとRailsと書籍
あー、RubyはMatzさんが開発したスクリプト言語です。Ruby - Wikipediaとか読んだらいいと思う。
Railsは、言語ではなくてRubyで書かれたWebアプリケーションフレームワークです。まぁRuby on Rails - Wikipediaを読めばいいんじゃないか。
Webアプリケーションフレームワークが何をするかわからないなら[ThinkIT] 第1回:Webアプリケーションフレームワークとは (1/4)とか読んでください。
Rubyの本は、
- 作者: Dave Thomas with Chad Fowler and Andy Hun,まつもとゆきひろ,田和勝
- 出版社/メーカー: オーム社
- 発売日: 2010/05/26
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 168回
- この商品を含むブログ (23件) を見る
でいいのではないかと思う。Railsは
RailsによるアジャイルWebアプリケーション開発 第3版
- 作者: Sam Ruby,David Heinemeier Hansson,Dave Thomas,前田修吾
- 出版社/メーカー: オーム社
- 発売日: 2009/12/01
- メディア: 単行本
- 購入: 16人 クリック: 291回
- この商品を含むブログ (39件) を見る
で、両方ともオーム社eStore(β)から電子書籍で買える。こういうリファレンス本こそ電子書籍の価値がある。検索できるってことがどれだけ効率に影響するか…。iPadで読むときはi文庫HDがよろしかろうと思います。PDF が読める iPad アプリ 10個を比較してみたよ - 彼女からは、おいちゃんと呼ばれていますで比較されているけれど、goodiware.com :: products :: GoodReaderやBookmanについて(日本語) « Bookman Labは次ページに進んだ時に、そのページのレンダリングを始めるので、表示が遅くてイラッとくる。
i文庫HDは、あの格好いい*1ページめくりエフェクトのおかげで次のページをキャッシュしているから、ページめくりが軽快でよろしい。
iPadの話で、iPad2だとどうなのかわからないけど。
構築する環境
普通Railsを使う場合はNetBeansでMySQLな感じみたいだけど、うちの研究室も会社もPostgreSQLなので、
- Ruby 1.9.2-p180
- Rails 3.0.6
- PostgreSQL
- 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をアップデートします。しなくてもいいかもしれないけど。RubyGemsはRuby用のパッケージ管理システムです。javaでいうmavenのdependency mechanizmだし、PHPのPEARだし、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という記事にあるように、
がRuby開発環境として有力みたいで、AptanaとEclipseに関してはAptana単体のものとEclipseプラグインとしてのAptanaがあるそう。使うならどっち?Eclipse or Aptana | Technolog.jp - ICTウェブマガジンを読むに、まぁEclipseでいいみたいです。
記事書き始めて調べたので、今はNetBeansってことで…。
で、【ハウツー】NetBeansでRuby on Rails開発 (1) 開発を始める前に | エンタープライズ | マイナビニュース読めばOK。
まとめ
あとは本読んで。
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 OverflowやCentOS5.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!
となり、ヒャッハーです。