SlideShare a Scribd company logo
1 of 32
Download to read offline
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日日曜日

More Related Content

More from Yukimitsu Izawa

最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とはYukimitsu Izawa
 
RubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をするRubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をするYukimitsu Izawa
 
Octopress簡単スタートガイド
Octopress簡単スタートガイドOctopress簡単スタートガイド
Octopress簡単スタートガイドYukimitsu Izawa
 
RubyからFFIを使ってみた
RubyからFFIを使ってみたRubyからFFIを使ってみた
RubyからFFIを使ってみたYukimitsu Izawa
 
NTPを使ったDDoSについて
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについてYukimitsu Izawa
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Yukimitsu Izawa
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server EnvironmentYukimitsu Izawa
 
rvm でbundlerと仲良くする
rvm でbundlerと仲良くするrvm でbundlerと仲良くする
rvm でbundlerと仲良くするYukimitsu Izawa
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディングYukimitsu Izawa
 
MacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみたMacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみたYukimitsu Izawa
 

More from Yukimitsu Izawa (14)

最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは
 
RubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をするRubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をする
 
Ghissuesのご紹介
Ghissuesのご紹介Ghissuesのご紹介
Ghissuesのご紹介
 
Octopress簡単スタートガイド
Octopress簡単スタートガイドOctopress簡単スタートガイド
Octopress簡単スタートガイド
 
RubyからFFIを使ってみた
RubyからFFIを使ってみたRubyからFFIを使ってみた
RubyからFFIを使ってみた
 
NTPを使ったDDoSについて
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについて
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 
テストとは
テストとはテストとは
テストとは
 
RubyでDSL
RubyでDSLRubyでDSL
RubyでDSL
 
Pow
PowPow
Pow
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server Environment
 
rvm でbundlerと仲良くする
rvm でbundlerと仲良くするrvm でbundlerと仲良くする
rvm でbundlerと仲良くする
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
 
MacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみたMacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみた
 

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日日曜日