Hatena::Grouprubyist

雲雀は高く空を舞い RSSフィード

2007-07-01

HakimHakim2012/10/16 11:04Thanks guys, I just about lost it loionkg for this.

ieapgszieapgsz2012/10/16 22:12TqIKcJ <a href="http://lobhczogvdqk.com/">lobhczogvdqk</a>

psgpusybpsgpusyb2012/10/19 14:28pDmZgb , [url=http://iaccybzwlvml.com/]iaccybzwlvml[/url], [link=http://bbvoyprbzgil.com/]bbvoyprbzgil[/link], http://nkpfyvdsrdlk.com/

cgkgmjkcgkgmjk2012/10/20 02:01vPN4QI <a href="http://pcuygdxcyvdz.com/">pcuygdxcyvdz</a>

dexpmnmdexpmnm2012/10/20 22:30SUoXsx , [url=http://ptasxhuugkij.com/]ptasxhuugkij[/url], [link=http://urssleuhzglj.com/]urssleuhzglj[/link], http://fpvxcwuriqlx.com/

2007-06-19

[]Yahoo! テキスト解析のリファレンス 13:18 Yahoo! テキスト解析のリファレンス - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - Yahoo! テキスト解析のリファレンス - 雲雀は高く空を舞い Yahoo! テキスト解析のリファレンス - 雲雀は高く空を舞い のブックマークコメント

あった。とりあえず次は、テキストを送って結果を得る、を目標にしよう。

JLPはJapanese Language Parsing、なのかな?

Yahoo!テキスト解析に挑戦 (1) 07:28  Yahoo!テキスト解析に挑戦 (1) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  Yahoo!テキスト解析に挑戦 (1) - 雲雀は高く空を舞い  Yahoo!テキスト解析に挑戦 (1) - 雲雀は高く空を舞い のブックマークコメント

Yahoo 日本語形態素解析Webサービスを使ってみる - 酒日記 はてな支店」を見て、挑戦。


REST初体験、実際やってる事はXMLの解析、どちらにしても初体験。とりあえずは、xmlファイルの解析にはrexml::documentを使うみたい。


使ったxmlファイルは「ページが表示できません - Yahoo! JAPAN」で挙げられてる '庭には二羽ニワトリがいる。'という文を形態素解析する場合の例をローカルに保存したもの。以下のアドレスで入手できる。

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の使い方を勉強しよう。

ここら辺を斜め読みしました。後でちゃんと読む

きょうはここまで。

2007-06-15

文字列にアクセス 11:40  文字列にアクセス - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  文字列にアクセス - 雲雀は高く空を舞い  文字列にアクセス - 雲雀は高く空を舞い のブックマークコメント

文字列の末尾 - 只今Ruby勉強中 - Rubyistより

文字列の末尾を取得するのってこんな感じでいいのかな?

irb(main):001:0> str = 'hogefuga'
=> "hogefuga"
irb(main):002:0> str[-1, 1]
=> "a"
文字列の末尾 - 只今Ruby勉強中 - Rubyist

str[-1,1]が分からなかったので調べてみた。

楽しいRuby pp.185-186より

a[n,length]で配列aの要素a[n]からlength個の要素を取り出して新しい配列を作りそれを返す。

インデックスの値がマイナスの数の場合、先頭からではなく、末尾から数えます。とのこと。

じゃあ、nがマイナスでlenが2以上の場合は?

str(-2,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"

gan2gan22007/12/29 02:34決まった回数の繰り返しをしたいときは Integer#times が便利ですよ。

class String
def last(n, len)
ret = ""
len.times{|i| ret << self[-n-i]}
ret
end
end

str = "hogefuga"
p str.last(5, 3) #=> "ego"

2007-06-14

SAKURAエディタRubyのSyntax Highlightをする。 17:27  SAKURAエディタでRubyのSyntax Highlightをする。 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  SAKURAエディタでRubyのSyntax Highlightをする。 - 雲雀は高く空を舞い  SAKURAエディタでRubyのSyntax Highlightをする。 - 雲雀は高く空を舞い のブックマークコメント

こちら>

no title

からRubyDef.lzhを落としてきて、後はReadMeを参考に。

YAML::Store (1) 17:58 YAML::Store (1) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - YAML::Store (1) - 雲雀は高く空を舞い YAML::Store (1) - 雲雀は高く空を舞い のブックマークコメント

目的

YAML形式でデータファイルに残したい。

背景


ではどうもうまく書き込みがなされなかった。YAML::Storeがあるとか。YAML::StorePStoreYAML版。

というわけでまずはPStoreから調べてみる。

PStore

Rubyオブジェクトを外部ファイルに格納するためのクラス内部Marshalを使ってバイナリ化したデータを保存する、とか。

参考になるところ


以下「Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore」を写経。正確な情報はそちらを参照のこと。

基本的な使い方

使い方は基本的には Hashと類似。

PStore#[]= で値を保存して、PStore#[] を使って値を取り出す。

また、Hash#keysHash#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>

続く!

つぎこそYAML::Store

YAML::Store (2) 19:51  YAML::Store (2) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  YAML::Store (2) - 雲雀は高く空を舞い  YAML::Store (2) - 雲雀は高く空を舞い のブックマークコメント

PStoreで書いたことでほとんど全部だったのかも。

Method

Rubyist Magazine - プログラマーのための YAML 入門 (中級編)」より

 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


YAMLドキュメントからRubyオブジェクトへの変換 19:51  YAMLドキュメントからRubyオブジェクトへの変換 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  YAMLドキュメントからRubyオブジェクトへの変換 - 雲雀は高く空を舞い  YAMLドキュメントからRubyオブジェクトへの変換 - 雲雀は高く空を舞い のブックマークコメント


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

YAML ストリーム 19:51  YAML ストリーム - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  YAML ストリーム - 雲雀は高く空を舞い  YAML ストリーム - 雲雀は高く空を舞い のブックマークコメント

Rubyist Magazine - プログラマーのための YAML 入門 (中級編)」より

複数の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 19:51 sqlite - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - sqlite - 雲雀は高く空を舞い sqlite - 雲雀は高く空を舞い のブックマークコメント

データの格納・検索・処理をしたいのだったらデータベース仕様を検討してもいいのかも?ということでsqliteについて後で調べてみようかしら。。」


SQLiteMySQLやPostgreSQLと同じDBMSデータベース管理ソフト)であるが、サーバとしてではなくアプリケーションに組み込まれて利用される軽量データベースである。

SQLite - Wikipedia

後で読む


今日のまとめ的な例 19:51 今日のまとめ的な例 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - 今日のまとめ的な例 - 雲雀は高く空を舞い 今日のまとめ的な例 - 雲雀は高く空を舞い のブックマークコメント

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

2007-06-13

メールの送信 (3) 17:54  メールの送信 (3) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  メールの送信 (3) - 雲雀は高く空を舞い  メールの送信 (3) - 雲雀は高く空を舞い のブックマークコメント

むぅ、文字化けが直らない。

irb(main):024:0> mail.subject = NKF.nkf('-j', subject)
irb(main):024:0> mail.body = NKF.nkf('-j', body)

としてるんだけど、件名がEUCできて、本文がSJISで来たりする。むーん。どうなってんだ。


メールの送信 (2) 11:51  メールの送信 (2) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  メールの送信 (2) - 雲雀は高く空を舞い  メールの送信 (2) - 雲雀は高く空を舞い のブックマークコメント

TMailTMailリードミーなどを見ながら。

とりあえずは

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。

メールの送信 (1) 11:51 メールの送信 (1) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - メールの送信 (1) - 雲雀は高く空を舞い メールの送信 (1) - 雲雀は高く空を舞い のブックマークコメント

ActiveMail。できんかった。あとでかく。