CaboCha/Rubyで、入力形式等を指定する

形態素解析ツールのCaboChaにはRubyで使うためのラッパーが付属していて、require 'CaboCha'とすることで色々と使えるようになるわけですが、それについての説明書きがどう頑張ってもなかったのでメモ。
cabocha - Yet Another Japanese Dependency Structure Analyzer - Google Project Hosting

因みに、SWIGをいれないとインストールできない、みたいな情報が検索すると沢山出てきますが、最新版(ver 0.68)ではそんなことはないようです。
CaboChaをインストールした後に、

ruby extconf.rb
make
make install

でOKでした。

基本は同梱されているtest.rbの通り。
test.rb - cabocha - Yet Another Japanese Dependency Structure Analyzer - Google Project Hosting

CaboChaをコマンドラインで使う場合は、色々オプションをつけられます。
例えば入力形式を変更する時にはIオプションだとか。
CaboCha::Parser.newする時に、オプションでそのまま引数を渡してやればいいらしい。
例えば、

CaboCha::Parser.new("-I1 -n0")

だとか。

Windowsへのboost ver1.55.0のビルド -失敗-

なんやかんやでまだboostをインストールしていなかったのでWindows機に入れてみようとしている。OSはVista
Boostライブラリのビルド方法 - boostjpを参考にしながら実行。
何故かzipファイルを展開する時に+Lhacaが止まったりしたのだが、これは別の問題だと思われる。

で、b2.exeを実行している最中に大量に次のwarningが出た。

(ファイル展開場所)\boost_1_55_0\boost/log/detail/header.hpp : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

よもやUnicodeで保存していないとは思えないため、warning C4819でググった。
https://www.google.co.jp/#q=warning+C4819
Visual C++コンパイラを使っているのが原因、というような記述が多数見受けられるのだが、私のWindows機に入っているのはMinGWで配布されているgccとcc。
ビルド自体は正常に行われているように見受けられるだけに、この警告が謎。

埒が明かなくなったため、一旦中断してchcp 65001を行いプロンプトの文字コードUnicodeに変更。
途中まで行われていたものをとりあえず消してみてb2.exeを実行すると今度はpython.exeが応答しなくなるというエラー。呼ばれてた事にも気がつかなかった。
無視して実行させてみたところ、別の要因で異常終了。

その上chcp 65001にするとbootstrap.batが稼働しない。

で、悩んでいたらこんなページを見つけた。
[C++] Windows での Boost 環境構築まとめ (Visual Studio 2012, MinGW) - つるぺたょぅι゛ょ ロコリン研究しろ
どうやらMinGWではコンパイルオプションが異なるらしい。
whereコマンドではしっかりMinGWのほうを指していたのだけれど、どうなっていたのやら。

Railsのインストール

で、詰まったのでメモ書き。
ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
gem 2.0.14
rails-4.0.2

Rails 3.2.2のインストール - Railsインストールを参考にしながらインストールしていたのだが、詰まること詰まること。

DevKitのインストール

まず、DevKitをインストールしてなかった。
Rails自体には使わない(?)らしいのだが、そのインストール段階でatomicというgemをインストールする際に必要。

DevKitのインストール - Railsインストールを参考にインストール。
コマンドは

>ruby dk.rb init
>ruby dk.rb install

の2つ。
でもインストールでこける。

Rubyのインストール場所

ruby - Error "invalid switch in RUBYOPT: -F (RuntimeError)" is shown while install gems by gem install mechanize - Stack Overflow
Program Filesの下に置いていたのがどうやらまずかった様子。
つまり、PATHにスペースが入っているとダメ。この位直してと言いたくなるけどまあ我慢。
インストール場所を直して再チャレンジしたら無事railsがインストールできた。

for文をwhile文に書き換える

可読性の面から言うとメリットはあまりない。
ただ、while文を習いたての人とか初心者向けの参考書には問題として設定されているっぽい。

for文はC言語では、
for(初期化式; 継続条件式; 再初期化式){
繰り返しブロック;
}
で書き表し、

初期化式

継続条件式
=true→(1)
   →繰り返しブロック
   →再初期化式
   →継続条件式
    =true→(1)に戻る
    =false→終了
=false→終了

というように推移する。
継続条件式はwhile文の継続条件式と同様にかけますので、for文と同等になるようなwhile文は、

初期化式;
while(継続条件式){
繰り返しブロック;
再初期化式;
}

で書くことができる。
注意すべきは再初期化式が繰り返しブロックの後に来ること。

具体例

int i;
for(i=0;i<10;i++){
printf("%d ",i);
}
printf("\n");

というプログラムは

int i;
i = 0;
while(i<10){
printf("%d ",i);
i++;
}
printf("\n");

とwhile文で書き直すことができる。
通常はfor文の方が読みやすい。

Project Euler 2

明日から帰省するので部屋の掃除などしてたら時間がない。

Project Euler Problem2。
問題文はここからProblem 2 - PukiWiki

このフィボナッチ数列の初項から第3項までは1,2,3となっている。
奇数と偶数の性質として、

  • 奇数+奇数=偶数
  • 奇数+偶数=奇数
  • 偶数+奇数=奇数

というのがある。この性質とフィボナッチ数列の定義より、フィボナッチ数列においては偶数の項が2つおきにしか現われないということが分かる。*1
一般項はフィボナッチ数 - Wikipediaにある通りで、便宜的に初項から1,1,2とすると
\sum_{i=1}^{\inf}\delta\left( F_{3i} < 4,000,000 \right)F_{3i}
となる。

変形してみる。
\sum F_{3i}=\sum \frac{\phi^{3i}-(-\phi)^{-3i}}{\sqrt{5}}
=\frac{1}{\sqrt{5}}\sum \phi^{3i}-\frac{1}{\sqrt{5}}\sum (-\phi)^{-3i}
F_{n}<4,000,000となる最大のnをNとすると、それぞれ等比数列の和となるので
\frac{1}{\sqrt{5}}\left(\frac{1-\phi^{3N}}{1-\phi^3}-\frac{1-(-\phi)^{-3N}}{1-(-\phi)^{-3}}\right)
どうしてもNが必要なので結局フィボナッチ数を逐次計算した方が早そう。誤差も怖いし。

てなわけで

fib1, fib2, fib3 = 1, 2, 3
sum = 0
while fib2 <= 4000000
  sum += fib2
  fib1 = fib2 + fib3
  fib2 = fib3 + fib1
  fib3 = fib1 + fib2
end
puts sum #=> 4613732

床関数を使って、\lfloor \frac{\phi^n}{\sqrt{5}}+\frac{1}{2} \rfloorでも表せるそうだが、普通に足した方が計算は速そう。

*1:と自力で考えてからWikipediaの同項に書かれてる事を知った。

Project Euler 1

ブログのネタがない時に一題ずつ解いていこうかなと。

問題はProblem 1 - PukiWikiより。

疑似的に
\sum_{i=1}^{(1000-1)/3}3i + \sum_{j=1}^{(1000-1)/5}5j - \sum_{k=1}^{(1000-1)/15}15k
というわけで、偉大なるオイラー先生の逸話より
3*((1000-1)/3)*((1000-1)/3+1)/2 + 5*((1000-1)/5)*((1000-1)/5+1)/2 - 15*((1000-1)/15)*((1000-1)/15)/2

後は計算のするのみ。

MAX = 1000-1
N = 3
M = 5

nm = N*M
result = N*(MAX/N)*(MAX/N+1)/2 + M*(MAX/M)*(MAX/M+1)/2 - nm*(MAX/nm)*(MAX/nm+1)/2
print result #=> 233168

MechanizeでSSLの証明書確認を無暗にオフにすると警告がでた話

Ruby(2.0.0-p195)でMechanize(gemでインストールした2.7.3)を使ってがりがり書いてた。
ら、案の定SSLで詰まった。証明書確認できてないからエラー吐いた様子。

F:\hoge>ruby mechanize-warning.rb
C:/***/Ruby-200-p195/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL
_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify fail
ed (OpenSSL::SSL::SSLError)
from C:/***/Ruby-200-p195/lib/ruby/2.0.0/net/http.rb:918:in `
block in connect'

以下略。

RubyのMechanizeがSSLエラーになる。 - それマグで!を参考に、

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

を追加。open-sslはmechanizeですでにreuireされている模様。

すると、

mechanize-warning.rb:4: warning: already initialized constant OpenSSL::SSL::VERIFY_PEER
                             !!!SECURITY WARNING!!!

The SSL HTTP connection to:

  hoge.jp:443

                           !!!MAY NOT BE VERIFIED!!!

On your platform your OpenSSL implementation is broken.

There is no difference between the values of VERIFY_NONE and VERIFY_PEER.

This means that attempting to verify the security of SSL connections may not
work.  This exposes you to man-in-the-middle exploits, snooping on the
contents of your connection and other dangers to the security of your data.

To disable this warning define the following constant at top-level in your
application:

  I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG = nil

という警告が。
指定通りにI_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG = nilをすると警告なしに。

また、代わりに

agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE

を指定しても警告なしに。

恐らくOpenSSLモジュール(だっけか)側の話だと思われるが、片方警告出してもう片方は警告なしというのは気持ち悪いなぁ。