Hakim2012/10/16 11:04Thanks guys, I just about lost it loionkg for this.
ieapgsz2012/10/16 22:12TqIKcJ <a href="http://lobhczogvdqk.com/">lobhczogvdqk</a>
psgpusyb2012/10/19 14:28pDmZgb , [url=http://iaccybzwlvml.com/]iaccybzwlvml[/url], [link=http://bbvoyprbzgil.com/]bbvoyprbzgil[/link], http://nkpfyvdsrdlk.com/
cgkgmjk2012/10/20 02:01vPN4QI <a href="http://pcuygdxcyvdz.com/">pcuygdxcyvdz</a>
dexpmnm2012/10/20 22:30SUoXsx , [url=http://ptasxhuugkij.com/]ptasxhuugkij[/url], [link=http://urssleuhzglj.com/]urssleuhzglj[/link], http://fpvxcwuriqlx.com/
あった。とりあえず次は、テキストを送って結果を得る、を目標にしよう。
JLPはJapanese Language Parsing、なのかな?
「 Yahoo 日本語形態素解析Webサービスを使ってみる - 酒日記 はてな支店」を見て、挑戦。
REST初体験、実際やってる事はXMLの解析、どちらにしても初体験。とりあえずは、xmlファイルの解析にはrexml::documentを使うみたい。
使ったxmlファイルは「no title」で挙げられてる '庭には二羽ニワトリがいる。'という文を形態素解析する場合の例をローカルに保存したもの。以下のアドレスで入手できる。
http://api.jlp.yahoo.co.jp/MAService/V1/parse?appid=YahooDemo&results=ma,uni q&uniq_filter=9|10&sentence=%E5%BA%AD%E3%81%AB%E3%81%AF%E4%BA%8C%E7%BE%BD%E3 %83%8B%E3%83%AF%E3%83%88%E3%83%AA%E3%81%8C%E3%81%84%E3%82%8B%E3%80%82
まずはともあれ、.new。
require 'rexml/document' doc = REXML::Document.new(File.open('parse.xml'))
puts doc.root
で中身が色々見れる。(略)
puts doc.root.elements[1].elements[1] # => <total_count>9</total_count>
これで各種の要素にアクセスできる、みたい。とりあえず、色々アクセスしてみる。
p doc.root.elements[1].elements[1] #=> <total_count> ... </> p doc.root.elements[1].elements[2] #=> <filtered_count> ... </> p doc.root.elements[1].elements[3] #=> <word_list> ... </> p doc.root.elements[1].elements[3].elements[1] #=> <word> ... </> p doc.root.elements[1].elements[3].elements[2] #=> <word> ... </> puts doc.root.elements[1].elements[3].elements[1].elements[1] #=> <surface>庭</surface> puts doc.root.elements[1].elements[3].elements[1].elements[2] #=> <reading>にわ</reading> puts doc.root.elements[1].elements[3].elements[1].elements[3] #=> <pos>名詞</pos>
これを利用して、要素を列記。
doc.root.elements[1].elements[3].elements.each do |item| item.elements.each do |elem| p elem.text end puts end
庭
にわ
に
に
助詞
は
は
助詞
二
2
羽
わ
接尾辞
にわとり
が
が
助詞
いる
いる
。
。
特殊
スマートなやり方じゃない様な、気がする。rexmlの使い方を勉強しよう。
ここら辺を斜め読みしました。後でちゃんと読む
きょうはここまで。
文字列の末尾 - 只今Ruby勉強中 - Rubyistより
文字列の末尾を取得するのってこんな感じでいいのかな?
irb(main):001:0> str = 'hogefuga' => "hogefuga" irb(main):002:0> str[-1, 1] => "a"文字列の末尾 - 只今Ruby勉強中 - Rubyist
じゃあ、nがマイナスでlenが2以上の場合は?
p str[-2, 2]#=> "ga" p str[-2, 3]#=> "ga" p str[-2, -2]#=> nil
との事で、後ろから2番目の文字から末尾に向かって二文字取り出されるのでした。
last(n, len)とした時に、後ろからn番目の文字を起点として頭の方にlen文字取り出す様なメソッドを作ってみた。
class String def last(n,len) n = -n len = -len ind = n out = "" while ind > n+len out<< self[ind].chr ind = ind-1 end p out end end str.last(5,3) # =>"ego"
ではどうもうまく書き込みがなされなかった。YAML::Store
があるとか。YAML::Store
はPStoreのYAML版。
というわけでまずはPStoreから調べてみる。
Rubyのオブジェクトを外部ファイルに格納するためのクラス。内部でMarshalを使ってバイナリ化したデータを保存する、とか。
参考になるところ
以下「no title」を写経。正確な情報はそちらを参照のこと。
使い方は基本的には Hashと類似。
PStore#[]= 値
で値を保存して、PStore#[]
を使って値を取り出す。
また、Hash#keysとHash#key?に相当するのはそれぞれPstore#rootsとPStore#root?。
データ操作はtransaction中のみ。データを参照するのみの場合は引数にtrueを指定することで、読み込み専用のtransactionとなる。
require 'pstore' db = PStore.new('PStoretest') db.transaction do p db.roots ary = db['root'] = [1,2,3,4] # 配列を db に設定 ary[0] = [1,1.5] # 破壊的に変更 end # 保存は transaction を抜けるときなので変更された結果が保存される db.transaction(true) do # 読み込み専用モード p db.root?('root') p db['root'] end begin db.transaction(true) do db['root'] = 'hoge' # 書き込もうとすると PStore::Error end rescue PStore::Error p $! end
実行結果 (1回目)
[] true [[1, 1.5], 2, 3, 4] #<PStore::Error: in read-only transaction>
実行結果 (2 回目以降):
["root"] true [[1, 1.5], 2, 3, 4] #<PStore::Error: in read-only transaction>
続く!
「no title」より
require 'yaml' require 'yaml/store' ## YAML::Store オブジェクトを作成 filename = "store.yaml" store = YAML::Store.new(filename) ## データの読み出しと格納 store.transaction do |hash| ## データの読み出し count = hash["count"] count = 0 if count == nil puts "count = #{count}" ## データの格納 hash["count"] = count + 1 end
require 'yaml' hashlist = [ { 'name' => 'Shiina', 'age' => 6, 'birth' => Date.new(1999, 1, 1), 'favorite' => ['Thomas', 'Pokemon'], }, { 'name' => 'Sumire', 'age' => 4, 'birth' => Date.new(2001, 2, 2), 'smoker' => false, }, ] hashyaml = hashlist.to_yaml yamlhash = YAML.load(hashyaml) p hashyaml p yamlhash
「no title」より
複数のYAMLドキュメントを含むデータを、YAMLではストリームという。個々のYAMLドキュメントは「---」で区切る。
ストリームの読み込みには以下を用いる。引数 input には文字列または IO オブジェクト(File オブジェクトを含む)が指定できる。
## YAML データ (「---」で区切って複数のデータを記述している) str = <<END --- name: Ruby url: http://www.ruby-lang.org --- name: Python url: http://www.python.org --- name: PHP url: http://www.php.net END ## YAML ドキュメントをひとつずつ読み込む require 'yaml' YAML.load_documents(str) do |doc| p doc end ## または複数の YAML ドキュメントをまとめて読み込む stream = YAML.load_stream(str) ## stream は YAML::Stream オブジェクト stream.documents.each do |doc| p doc end
実行結果
{"name"=>"Ruby", "url"=>"http://www.ruby-lang.org"} {"name"=>"Python", "url"=>"http://www.python.org"} {"name"=>"PHP", "url"=>"http://www.php.net"}
ひとつのファイルに複数の YAML ドキュメントを書き込むには、YAML.dump_stream() または YAML::Stream#emit() を用いる。
例
## 複数のデータ hash_list = [ { "lang"=>"Ruby", "url"=>"http://www.ruby-lang.org" }, { "lang"=>"Python", "url"=>"http://www.python.org" }, { "lang"=>"PHP", "url"=>"http://www.php.net" }, ] ## ひとつのファイルに複数の YAML ドキュメントを出力する require 'yaml' str = YAML.dump_stream(*hash_list) print str ## または YAML::Stream を使って次のようにする stream = YAML::Stream.new() hash_list.each { |hash| stream.add(hash) } str = stream.emit() print str
実行結果
--- url: http://www.ruby-lang.org lang: Ruby --- url: http://www.python.org lang: Python --- url: http://www.php.net lang: PHP
データの格納・検索・処理をしたいのだったらデータベースの仕様を検討してもいいのかも?ということでsqliteについて後で調べてみようかしら。。」
SQLite はMySQLやPostgreSQLと同じDBMS(データベース管理ソフト)であるが、サーバとしてではなくアプリケーションに組み込まれて利用される軽量データベースである。
SQLite - Wikipedia
後で読む
require 'time' class Person def initialize( name, mail, objective ) # @id = Guid.new.to_s @name = name @mail = mail @update = Time.now # @objective = objective end # attr_reader :id, :update # attr_accessor :name, :mail attr_accessor :name, :mail, :update def to_s "person[ @id=#{@id}, @name=#{@name}, @mail=#{@mail}, @update=#{@update.xmlschema} ]" end def to_h {"name"=>@name, "mail"=>@mail, "update"=>@update} end end
p1 = Person.new('person1','person1@ruby.org') p2 = Person.new('person2','person2@ruby.org') h = [p1.to_h,p2.to_h] h.to_yaml
--- - name: person1 mail: person1@ruby.org update: 2007-06-14 19:44:35.120682 +09:00 - name: person2 mail: person2@ruby.org update: 2007-06-14 19:26:20.372198 +09:00
むぅ、文字化けが直らない。
irb(main):024:0> mail.subject = NKF.nkf('-j', subject) irb(main):024:0> mail.body = NKF.nkf('-j', body)
としてるんだけど、件名がEUCできて、本文がSJISで来たりする。むーん。どうなってんだ。
とりあえずは
wget http://i.loveruby.net/archive/tmail/tmail-0.10.8.tar.gz tar xvf tmail-0.10.8.tar.gz cd tmail ruby setup.rb config ruby setup.rb setup sudo ruby setup.rb install
んでもって、サンプルのsendmail.rbを参考に、
irb(main):017:0> require 'tmail' irb(main):017:0> require 'net/smtp' irb(main):017:0> smtphost = "めーるさーばー" irb(main):017:0> subject = "だいめい" irb(main):017:0> from = "ふろむあどれす" irb(main):017:0> to = "とぅーあどれす" irb(main):016:0* mail = TMail::Mail.new irb(main):017:0> mail.date = Time.now irb(main):018:0> mail.from = from irb(main):019:0> mail.to = to irb(main):020:0> mail.subject = subject irb(main):021:0> mail.mime_version = '1.0' irb(main):022:0> body = "おげんきですか" irb(main):024:0> mail.body = NKF.nkf('-j', body) irb(main):031:0> msg =mail.encoded irb(main):040:0> host = smtphost irb(main):041:0> smtp = Net::SMTP.new(host,25) irb(main):043:0> smtp.start { irb(main):044:1* smtp.send_mail msg, mail.from_address, mail.destinations irb(main):045:1> } => "250 Ok: queued as B9D38525A9¥n"
これでオK。
RubyKaigiが行なわれていた模様。
JRubyは、手を出してみ…うーん。