Rubyでトライ!
                株式会社クルウィット
                井澤 志充

                Kanazawa.rb #7




                 「安心・安全・安定・信頼」できるインターネットサービスを

13年3月31日日曜日
じこしょうかい




              「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
じこしょうかい

    •   井澤  志充  (いざわゆきみつ)




                       「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
じこしょうかい

    •   井澤  志充  (いざわゆきみつ)




                       「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
じこしょうかい

    •   井澤  志充  (いざわゆきみつ)



   •    (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長




                         「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
じこしょうかい

    •   井澤  志充  (いざわゆきみつ)



   •    (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長
   •    博⼠士(情報科学)




                         「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
じこしょうかい

    •   井澤  志充  (いざわゆきみつ)



   •    (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長
   •    博⼠士(情報科学)


    •   ネットワークの委託研究・⾃自社サービス開発など




                         「安心・安全・安定・信頼」できるインターネットサービスを   2
13年3月31日日曜日
Rubyで一番嫌いなエラーメッセージ




              「安心・安全・安定・信頼」できるインターネットサービスを   3
13年3月31日日曜日
Rubyで一番嫌いなエラーメッセージ




  NoMethodError: undefined method `XXX' for nil:NilClass




                           「安心・安全・安定・信頼」できるインターネットサービスを    3
13年3月31日日曜日
Rubyで一番嫌いなエラーメッセージ




  NoMethodError: undefined method `XXX' for nil:NilClass




    目的1: こいつを消してやりたい!


                           「安心・安全・安定・信頼」できるインターネットサービスを    3
13年3月31日日曜日
なんで?


   オブジェクトが入ってると思ったら入ってなかったのにメ
   ソッド呼んでたわ…




               「安心・安全・安定・信頼」できるインターネットサービスを   4
13年3月31日日曜日
なんで?


   オブジェクトが入ってると思ったら入ってなかったのにメ
   ソッド呼んでたわ…



   あーありがち。




               「安心・安全・安定・信頼」できるインターネットサービスを   4
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。




               「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。

   不定入力を整形処理したあとに、




               「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。

   不定入力を整形処理したあとに、
   特定のオブジェクトが存在するかどうかをチェックしてから




               「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。

   不定入力を整形処理したあとに、
   特定のオブジェクトが存在するかどうかをチェックしてから
   methodを呼ぶよね。




                  「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。

   不定入力を整形処理したあとに、
   特定のオブジェクトが存在するかどうかをチェックしてから
   methodを呼ぶよね。

   このチェックの記述が冗長になりがち。




                  「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
なんで?



   入力を元にしたオブジェクトって不定じゃないですか。

   不定入力を整形処理したあとに、
   特定のオブジェクトが存在するかどうかをチェックしてから
   methodを呼ぶよね。

   このチェックの記述が冗長になりがち。

   目的2:チェックの記述をシンプルに!
                  「安心・安全・安定・信頼」できるインターネットサービスを   5
13年3月31日日曜日
XML入力

 <?xml version="1.0" encoding="UTF-8"?>
 <kzrb>
   <!--member= handle: required, role: optional -->
   <member handle="wtnabe" role="staff"></member>
   <member handle="libero" role="staff"></member>
   <member handle="kiyohara"></member>
 </kzrb>
      handleは必須で、role はオプショナル


    このXMLをパースして表示するプログラムを作ってみる。



                           「安心・安全・安定・信頼」できるインターネットサービスを   6
13年3月31日日曜日
Nokogiri


   •   http://nokogiri.org/

   •   XML/HTMLパーサ・ビルダ
   •   XPATH/CSS3  セレクタサポート

   •   インストール方法
        •   gem install nokogiri

   •   詳しくはおググりください。



                                   「安心・安全・安定・信頼」できるインターネットサービスを   7
13年3月31日日曜日
パーサ その1

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role").value == "staff"
         puts " =>staff"
   end
 }



                           「安心・安全・安定・信頼」できるインターネットサービスを   8
13年3月31日日曜日
xmlを切り出すとこんな感じで出てくる
 members (一部省略)
 => [#<Nokogiri::XML::Element
         name="member"
         attributes=[ #<Nokogiri::XML::Attr
                           name="handle" value="wtnabe">,
                       #<Nokogiri::XML::Attr
                           name="role" value="staff"> ] >,
     #<Nokogiri::XML::Element
          name="member"
          attributes=[ #<Nokogiri::XML::Attr
                           name="handle" value="libero">,
                        #<Nokogiri::XML::Attr
                           name="role" value="staff"> ] >,
     #<Nokogiri::XML::Element
          name="member"
          attributes=[ #<Nokogiri::XML::Attr
                           name="handle" value="kiyohara"> ] >]
                                             ←Role オブジェクトが無い!

                                「安心・安全・安定・信頼」できるインターネットサービスを      9
13年3月31日日曜日
パーサ その1

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role").value == "staff"
         puts " =>staff"
   end
 }



                           「安心・安全・安定・信頼」できるインターネットサービスを   10
13年3月31日日曜日
実行結果 その1

 % ruby xml.rb
 wtnabe
   =>staff
 libero
   =>staff
 kiyohara
 xml.rb:9:in `block in <main>': undefined method `value'
 for nil:NilClass (NoMethodError)
        from /Users/izawa/.rvm/gems/ruby-2.0.0-p0/gems/
 nokogiri-1.5.9/lib/nokogiri/xml/node_set.rb:239:in
 `block in each'
                    :
                    :


                           「安心・安全・安定・信頼」できるインターネットサービスを    11
13年3月31日日曜日
パーサ その2

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role") && ←オブジェクトの存在チェック
       member.attribute("role").value == "staff"
          puts " =>staff"
   end
 }


                           「安心・安全・安定・信頼」できるインターネットサービスを   12
13年3月31日日曜日
実行結果 その2

 % ruby xml.rb
 wtnabe
   =>staff
 libero
   =>staff
 kiyohara
 %




                 「安心・安全・安定・信頼」できるインターネットサービスを   13
13年3月31日日曜日
tryを使ってみる
   •   Object#try  NilClass#try
   •   active_̲supportで定義されているメソッド。
   •   argumentやblockを与えることができる。
        •   Person.try(:find,  1)
        •   @people.try(:collect)  {|p|  p.name}
        •   @person.try  {  |p|  
              p  "#{p.first_̲name#{p.last_̲name}"
            }
   •   Object#send  に似てるけど、NoMethodError  
       exception  が上がる代わりにnil  が返る。
                                    「安心・安全・安定・信頼」できるインターネットサービスを   14
13年3月31日日曜日
tryをつかうと…

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role") &&
       member.attribute("role").value == "staff"
          puts " =>staff"
   end
 }


                           「安心・安全・安定・信頼」できるインターネットサービスを   15
13年3月31日日曜日
tryをつかうと…

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role").try(:value) == "staff"
         puts " =>staff"
   end
 }



                           「安心・安全・安定・信頼」できるインターネットサービスを   15
13年3月31日日曜日
tryをつかうと…

 require 'nokogiri'

 xml = Nokogiri::XML(open("kzrb.xml"))

 members = xml.xpath("//member")

 members.each { |member|
   puts member.attribute("handle").value
   if member.attribute("role").try(:value) == "staff"
         puts " =>staff"
   end
 }
               すっきりした!!
                           「安心・安全・安定・信頼」できるインターネットサービスを   15
13年3月31日日曜日
注意点

   •     active_̲support  2.x  系
                       require 'active_support'

   •     active_̲support  3.x  系
                       require 'active_support/core_ext'  
                       (または  'active_support/all')




                                     「安心・安全・安定・信頼」できるインターネットサービスを   16
13年3月31日日曜日
•   Thank  You!
        •   If  you  have  any  comments,
              •   please  send  to:
                   •   Mail:  izawa@izawa.org  /  izawa@clwit.co.jp
                   •   Twitter:  @Yukimitsu_̲Izawa




                                          「安心・安全・安定・信頼」できるインターネットサービスを   17
13年3月31日日曜日

Try

  • 1.
    Rubyでトライ! 株式会社クルウィット 井澤 志充 Kanazawa.rb #7 「安心・安全・安定・信頼」できるインターネットサービスを 13年3月31日日曜日
  • 2.
    じこしょうかい 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 3.
    じこしょうかい • 井澤  志充  (いざわゆきみつ) 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 4.
    じこしょうかい • 井澤  志充  (いざわゆきみつ) 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 5.
    じこしょうかい • 井澤  志充  (いざわゆきみつ) • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 6.
    じこしょうかい • 井澤  志充  (いざわゆきみつ) • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長 • 博⼠士(情報科学) 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 7.
    じこしょうかい • 井澤  志充  (いざわゆきみつ) • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長 • 博⼠士(情報科学) • ネットワークの委託研究・⾃自社サービス開発など 「安心・安全・安定・信頼」できるインターネットサービスを 2 13年3月31日日曜日
  • 8.
    Rubyで一番嫌いなエラーメッセージ 「安心・安全・安定・信頼」できるインターネットサービスを 3 13年3月31日日曜日
  • 9.
    Rubyで一番嫌いなエラーメッセージ NoMethodError:undefined method `XXX' for nil:NilClass 「安心・安全・安定・信頼」できるインターネットサービスを 3 13年3月31日日曜日
  • 10.
    Rubyで一番嫌いなエラーメッセージ NoMethodError:undefined method `XXX' for nil:NilClass 目的1: こいつを消してやりたい! 「安心・安全・安定・信頼」できるインターネットサービスを 3 13年3月31日日曜日
  • 11.
    なんで? オブジェクトが入ってると思ったら入ってなかったのにメ ソッド呼んでたわ… 「安心・安全・安定・信頼」できるインターネットサービスを 4 13年3月31日日曜日
  • 12.
    なんで? オブジェクトが入ってると思ったら入ってなかったのにメ ソッド呼んでたわ… あーありがち。 「安心・安全・安定・信頼」できるインターネットサービスを 4 13年3月31日日曜日
  • 13.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 14.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 不定入力を整形処理したあとに、 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 15.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 不定入力を整形処理したあとに、 特定のオブジェクトが存在するかどうかをチェックしてから 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 16.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 不定入力を整形処理したあとに、 特定のオブジェクトが存在するかどうかをチェックしてから methodを呼ぶよね。 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 17.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 不定入力を整形処理したあとに、 特定のオブジェクトが存在するかどうかをチェックしてから methodを呼ぶよね。 このチェックの記述が冗長になりがち。 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 18.
    なんで? 入力を元にしたオブジェクトって不定じゃないですか。 不定入力を整形処理したあとに、 特定のオブジェクトが存在するかどうかをチェックしてから methodを呼ぶよね。 このチェックの記述が冗長になりがち。 目的2:チェックの記述をシンプルに! 「安心・安全・安定・信頼」できるインターネットサービスを 5 13年3月31日日曜日
  • 19.
    XML入力 <?xml version="1.0"encoding="UTF-8"?> <kzrb> <!--member= handle: required, role: optional --> <member handle="wtnabe" role="staff"></member> <member handle="libero" role="staff"></member> <member handle="kiyohara"></member> </kzrb> handleは必須で、role はオプショナル このXMLをパースして表示するプログラムを作ってみる。 「安心・安全・安定・信頼」できるインターネットサービスを 6 13年3月31日日曜日
  • 20.
    Nokogiri • http://nokogiri.org/ • XML/HTMLパーサ・ビルダ • XPATH/CSS3  セレクタサポート • インストール方法 • gem install nokogiri • 詳しくはおググりください。 「安心・安全・安定・信頼」できるインターネットサービスを 7 13年3月31日日曜日
  • 21.
    パーサ その1 require'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role").value == "staff" puts " =>staff" end } 「安心・安全・安定・信頼」できるインターネットサービスを 8 13年3月31日日曜日
  • 22.
    xmlを切り出すとこんな感じで出てくる members (一部省略) => [#<Nokogiri::XML::Element name="member" attributes=[ #<Nokogiri::XML::Attr name="handle" value="wtnabe">, #<Nokogiri::XML::Attr name="role" value="staff"> ] >, #<Nokogiri::XML::Element name="member" attributes=[ #<Nokogiri::XML::Attr name="handle" value="libero">, #<Nokogiri::XML::Attr name="role" value="staff"> ] >, #<Nokogiri::XML::Element name="member" attributes=[ #<Nokogiri::XML::Attr name="handle" value="kiyohara"> ] >] ←Role オブジェクトが無い! 「安心・安全・安定・信頼」できるインターネットサービスを 9 13年3月31日日曜日
  • 23.
    パーサ その1 require'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role").value == "staff" puts " =>staff" end } 「安心・安全・安定・信頼」できるインターネットサービスを 10 13年3月31日日曜日
  • 24.
    実行結果 その1 %ruby xml.rb wtnabe =>staff libero =>staff kiyohara xml.rb:9:in `block in <main>': undefined method `value' for nil:NilClass (NoMethodError) from /Users/izawa/.rvm/gems/ruby-2.0.0-p0/gems/ nokogiri-1.5.9/lib/nokogiri/xml/node_set.rb:239:in `block in each' : : 「安心・安全・安定・信頼」できるインターネットサービスを 11 13年3月31日日曜日
  • 25.
    パーサ その2 require'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role") && ←オブジェクトの存在チェック member.attribute("role").value == "staff" puts " =>staff" end } 「安心・安全・安定・信頼」できるインターネットサービスを 12 13年3月31日日曜日
  • 26.
    実行結果 その2 %ruby xml.rb wtnabe =>staff libero =>staff kiyohara % 「安心・安全・安定・信頼」できるインターネットサービスを 13 13年3月31日日曜日
  • 27.
    tryを使ってみる • Object#try  NilClass#try • active_̲supportで定義されているメソッド。 • argumentやblockを与えることができる。 • Person.try(:find,  1) • @people.try(:collect)  {|p|  p.name} • @person.try  {  |p|    p  "#{p.first_̲name#{p.last_̲name}"  } • Object#send  に似てるけど、NoMethodError   exception  が上がる代わりにnil  が返る。 「安心・安全・安定・信頼」できるインターネットサービスを 14 13年3月31日日曜日
  • 28.
    tryをつかうと… require 'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role") && member.attribute("role").value == "staff" puts " =>staff" end } 「安心・安全・安定・信頼」できるインターネットサービスを 15 13年3月31日日曜日
  • 29.
    tryをつかうと… require 'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role").try(:value) == "staff" puts " =>staff" end } 「安心・安全・安定・信頼」できるインターネットサービスを 15 13年3月31日日曜日
  • 30.
    tryをつかうと… require 'nokogiri' xml = Nokogiri::XML(open("kzrb.xml")) members = xml.xpath("//member") members.each { |member| puts member.attribute("handle").value if member.attribute("role").try(:value) == "staff" puts " =>staff" end } すっきりした!! 「安心・安全・安定・信頼」できるインターネットサービスを 15 13年3月31日日曜日
  • 31.
    注意点 •  active_̲support  2.x  系                require 'active_support' •  active_̲support  3.x  系                require 'active_support/core_ext'                  (または  'active_support/all') 「安心・安全・安定・信頼」できるインターネットサービスを 16 13年3月31日日曜日
  • 32.
    Thank  You! • If  you  have  any  comments, • please  send  to: • Mail:  izawa@izawa.org  /  izawa@clwit.co.jp • Twitter:  @Yukimitsu_̲Izawa 「安心・安全・安定・信頼」できるインターネットサービスを 17 13年3月31日日曜日