Sinatraのあらかると

記録することで、環境構築で悩まない。

Rubyで調べ物検索ツールを作成。検証してみます。

お気に入りのフレーズをみつけることがたまにある。
たとえば、英語の授業で覚えたフレーズ
「歴史は繰り返す」「2度あることは3度ある」。
ヘビーWindowserだったのにビルゲイツが退いてからは、
アップル信者に返り咲いてしまったので、
ジョブズ氏の「ステイハングリーステイフーリッシュ」などが印象に残る。遺産のようなMacの技術は個人的にすごいと思う。
ほかにも尊敬する人の格言は世に数多とある。

過去の作成したファイルや新規で作成したファイルなどに存在している単語を正規表現を使って簡単にあるかないか、あるなら何行目かを知りたいじゃないか。作ってみよう。Rubyにて。

Rubyのバージョン:ruby-1.9.3-p0

さきに実行の仕方は、
/Users/ユーザ名/のカレントディレクトリ内にCompanyなどとフォルダを作ると、
/Users/ユーザ名/Company/となる。このCompany内にREAD.txt(検索するファイル。コード内にあわせる。)、search.rb(Rubyファイル)を作る。
(構成)
Company
∟ READ.txt、seach.rb

search.rb(記述)


#coding: utf-8

#比較したい正規表現を書く。ただの単語でもいい。
re = /^ai(?#ue)ue o$/

#ファイルを読み込み正規表現と評価する。

puts "正規表現にあった単語にヒットするのは何行目?"

#"READ.txt"は任意のファイルに変更できる。
open("READ.txt") { |f|
while line = f.gets
line.chomp!
printf("%4d 行目 : %s ",f.lineno,line)
print " "
if line =~ re
puts ": HIT!"
else
puts ": Miss"
end
end
}
#reにマッチする正規表現を書く。
#lineにファイル文字列を。
#同一ディレクトリ内のREAD.txtには評価させる単語を。
#linenoを使うことで行番号を認識させた。


同フォルダ内に次は、READ.txtを作成する。
たとえば、上記の正規表現は「aiue o」にマッチするので、


aiue o
ka ki ku ke ko
sa si su se so
ta ti tsu te to
na ni nu ne no


READ.txtとして保存後、Rubyを走らせるコマンドを。


ruby search.rb


とすれば正規表現にマッチする単語がある行番号には「HIT!」と。それ以外には、「Miss」と表示される。
出力結果↓


正規表現にあった単語にヒットするのは何行目?
1 行目 : aiue o : HIT!
2 行目 : ka ki ku ke ko : Miss
3 行目 : sa si su se so : Miss
4 行目 : ta ti tsu te to : Miss
5 行目 : na ni nu ne no : Miss


パフォーマンスを測定してみよう。


ruby-prof search.rb


出力結果↓

正規表現にあった単語にヒットするのは何行目?
1 行目 : aiue o : HIT!
2 行目 : ka ki ku ke ko : Miss
3 行目 : sa si su se so : Miss
4 行目 : ta ti tsu te to : Miss
5 行目 : na ni nu ne no : Miss
Thread ID: 70358837448000
Total: 0.001120

%self total self wait child calls name
41.25 0.00 0.00 0.00 0.00 1 Kernel#load
17.86 0.00 0.00 0.00 0.00 1 File#initialize
10.54 0.00 0.00 0.00 0.00 22 IO#write
8.04 0.00 0.00 0.00 0.00 1 Kernel#open
3.84 0.00 0.00 0.00 0.00 6 IO#gets
3.39 0.00 0.00 0.00 0.00 5 Kernel#printf
3.12 0.00 0.00 0.00 0.00 5 String#=~
2.32 0.00 0.00 0.00 0.00 1 IO#close
2.14 0.00 0.00 0.00 0.00 2 Global#[No method]
1.61 0.00 0.00 0.00 0.00 6 IO#puts
1.61 0.00 0.00 0.00 0.00 2 IO#set_encoding
1.25 0.00 0.00 0.00 0.00 6 Kernel#puts
1.25 0.00 0.00 0.00 0.00 5 Kernel#print
0.71 0.00 0.00 0.00 0.00 5 IO#lineno
0.54 0.00 0.00 0.00 0.00 5 String#chomp!
0.36 0.00 0.00 0.00 0.00 1 Kernel#respond_to_missing?
0.18 0.00 0.00 0.00 0.00 1 #allocate

とても簡単なコードなのでパフォーマンスもなかなかいい。

挨拶が遅れましたが、24年度までもう少し。年を追うごとにスキルも、人情もより深くなっていけたらいいですね。そして、インターネットに流れた情報をうまく活用してみなさんが楽しい時間を過ごせますように。

追記:「正規表現」についてふれている記事をトラックバック
http://d.hatena.ne.jp/emerald00/searchdiary?word=%C0%B5%B5%AC%C9%BD%B8%BD&.submit=%B8%A1%BA%F7&type=detail
これをもとに、re = /この部分/
この部分を変更して、READ.txt内をその題名の、IPアドレスなら「255.255.255.0」(IPv4)サブネットマスクのようにヒットするものと、255以上のものを交えてヒットしないもので評価することができるはず。しかし、このままでは正規表現そのものを評価するコードではないので、任意のものを評価する場合自分で正規表現を組立ないといけない。以上、考察終わり。

Copyright © 2007-2017 Takayuki Kamiyama. All Rights Reserved.