Your SlideShare is downloading. ×
20090704rubyist九州
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

20090704rubyist九州

1,295
views

Published on

Rubyist九州7月定例会発表した初心者向けネタのスライドです。

Rubyist九州7月定例会発表した初心者向けネタのスライドです。

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,295
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Rubyを使って まとめサイトをさくっと作ろう (2009年7月Rubyist九州初心者向けコーナー) 橋本 幸樹(koki-h) http://d.hatena.ne.jp/koki-h @20090704 Rubyist九州 定例会
  • 2. 今日のお題 ● フィジカルコンピューティングモジュール ”Pepper” のまとめサイトを先日作ったので その作業でいかにRubyを利用して楽をしたか、 についてお話します。 ● 上記の話題を通してRuby初心者の方にRubyの便 利な機能やよく使われるライブラリについて情 報をご提供できたらうれしいです。 ● まあいろいろツッコミどころはあると思いま す。
  • 3. ”Pepper”とは ● フィジカルコンピューティングモジュール (Gainer互換) ● パソコンと電子部品の橋渡しをする機器 ● これがあれば以下のようなプログラムを各種の 言語で作成できます。 – たとえばパソコンの画面をクリックしたらLED点灯 (PCからLEDを制御) – たとえば警告通知メール(「サーバが止まっ た!」)が到着したら回転灯点灯(PCから回転灯を 制御) – たとえば大統領スイッチをおしたらWEBサイトで声 明(大統領スイッチからPCを制御)
  • 4. 大統領スイッチ カバーを.. カパッとして ぐっと押す! 「シリコンハウス共立」 のブログより引用 http://blog.siliconhouse.jp/archives/51572333.html
  • 5. Pepperのデモ ● 画面をクリックするとLED点灯 ● 今回はProcessingという言語で実装していま す。 ● Rubyを使うことも出来ます。(が、まだ試して いません)
  • 6. 私とPepper ● Make: Tokyo Meeting 03 でキットを販売して いたのを購入 ● マニュアルなし(「ネットでわかりますよ」) ● そこで検索 ● 雑誌「エレキジャック」のサイトでの作者の方 が書いた入門記事の連載を発見! ● ただ、ちょっと読みにくい。。。(記事自体は とても良い記事です)
  • 7. エレキジャックの記事の ここが読みにくい ● 前回、次回へのリンクがない ● 連載のインデックスページがない ● なので、第1回を読んだあと、第2回を読みたく ても時間をかけて探さなければならない。 そうだ。自分でまとめサイトを作ろ う!
  • 8. サイト内検索は? キーワード“ Pepper”で検索した結 果
  • 9. サイト内検索は? ● "Pepper”で検索すると他の記事が上位に来る ● 掲載日順のソートが出来ない 検索結果から必要なリンクを抜き出 し、 並べ替えれば読みやすくなる。 抜き出しや並べ替えは Rubyで自動化できる!(ある程度)
  • 10. まとめサイト製作の手順 ※赤文字のところをRubyでやります 1.エレキジャックのサイトを検索し、検索結果か らPepperに関する記事のリンクだけを抜き出 し、URL順(大体日付順になる)にソートする 2.日付順になっていないところをエディタで直す 3.抜き出したURLを使って記事ページ取得し、サ ブタイトルの部分を抜き出す 4.サブタイトルが取得できていないところをエディタで 直す 5.URL、ページタイトル、サブタイトルを整形 し、HTML化する 6.整形したHTMLを適当なWEBページに貼り付ける
  • 11. 1.検索→リンク抜き出し→ソート # fetch_link.rb require 'rubygems' require 'mechanize' url = "http://search.cqpub.co.jp/cgi-bin/searchej.cgi?q=pepper&o=" url2= "http://search.cqpub.co.jp/cgi-bin/searchej.cgi?q=pepper&qxpnd=0&pagenum=2" Linktext_contains = /Pepper/ Agent = WWW::Mechanize.new Links = {} def fetch_link(url) #Mechanizeで検索結果ページを取得 page = Agent.get(url) page.links_with(:text => Linktext_contains).each do |l| #Pepper関連の<a>タグのみ Links[l.href] = l.text #URLをキーにリンク文字を格納 end end fetch_link(url) fetch_link(url2) Links.keys.sort.each do |k| #URL順にソートしてタブ区切りで出力 printf "%st%sn", Links[k], k end
  • 12. 1.検索→リンク抜き出し→ソート (解説) ● WWW::Mechanizeというライブラリを使用してい ます。 ● WWW::Mechanizeはブラウザの代わりにスクリプ トでWEBにアクセスするためのライブラリです ● WWW::Mechanizeは 最近のRubyが入っていて、 ネットにつながっている環境ならコマンドライ ンから “gem install mechanize” とやると入ります ※gemコマンドは”RubyGems”というRuby用のライブラリやRubyで書かれたアプリを 管理するソフトウェアです。Ruby1.9系には標準添付ですが、Ruby1.8系だと別途イ ンストールしなければならない場合があります。(1.8系でもパッケージ作者さんが 添付している場合が多いようです。) 前のスライドに戻ってソースを見直してみましょう
  • 13. 出力結果(イメージ) 記事タイトルに"Pepper”を含むものだけが抜き出されました Ginger/Pepper/Sugarでフィジカル・コンピューティング(1) - フィジカル・ コンピュー...http://www.eleki-jack.com/FC/2008/11/post.html Ginger/Pepper/Sugarでフィジカル・コンピューティング(2) - フィジカル・ コンピュー...http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar2.html Ginger/Pepper/Sugarでフィジカル・コンピューティング(3) - フィジカル・ コンピュー...http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar3.html Ginger/Pepper/Sugarでフィジカル・コンピューティング(4) - フィジカル・ コンピュー...http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar4.html Ginger/Pepper/Sugarでフィジカル・コンピューティング(5) - フィジカ ル・コンピュー...http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar.html Ginger/Pepper/Sugarでフィジカル・コンピューティング(6) - フィジカル・ コンピュー...http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar6.html ※プログラムの実行結果をエディタで修正したものの一部 Ginger/Pepper/Sugarでフィジカル・コンピューティング(7) - フィジカル・ です。 コンピュー...http://www.eleki-jack.com/FC/2008/11/7.html
  • 14. 3.記事ページ取得して サブタイトル抜き出し #fetch_subtitle.rb require 'rubygems' require 'csv' require 'open-uri' require 'nokogiri' file = './url_list.txt' #前工程の出力結果(タブ区切りテキスト(TSV)) CSV.open(file,"r","t") do |row| #TSVの読み込み title = row[0] #各カラムが自動的に配列に入ってくれる url = row[1] page = open(url) #ページを取得 doc = Nokogiri::HTML(page) #HTMLをnokigiriで解析 subtitle = doc.css(".asset-body b")[0] #CSSセレクタでサブタイトル抜き出し subtitle = subtitle.text if subtitle printf "%st%st%sn",url, title.sub(/ - .*$/,''), subtitle #サブタイトル付きで出力(TSV) end
  • 15. 3.記事ページ取得して サブタイトル抜き出し(解説) ● タブ区切りテキストの読み込みにCSVライブラ リを使っています。自動で行区切り、列区切り をやってくれるので便利です。 ● ページ取得はここではMechanizeの代わりに open-uriライブラリを使っています。 ● CSVライブラリとopen-uriライブラリはRubyに 標準添付です。 ● HTMLを解析してサブタイトルを抜き出すのには Nokogiri を使っています。”gem install nokogiri”で入ります。CSSセレクタパターン で抜き出せます。
  • 16. 出力結果(イメージ) 記事のサブタイトルが追加されました http://www.eleki-jack.com/FC/2008/11/post.html Ginger/Pepper/Sugarでフィジカル・ コンピューティング(1) はじめに http://www.eleki-jack.com/FC/2008/11/gingerpeppersugar2.html Ginger/Pepper/Sugar でフィジカル・コンピューティング(2) 第2回 Pepperを組み立てよう-1 http://www.eleki-jack.com/FC/2008/11/gingerpeppersugar3.html Ginger/Pepper/Sugar でフィジカル・コンピューティング(3) 第2回 Pepperを組み立てよう-2 http://www.eleki-jack.com/FC/2008/11/gingerpeppersugar4.html Ginger/Pepper/Sugar でフィジカル・コンピューティング(4) 第3回 Pepperの動作を確認しよう-1 http://www.eleki-jack.com/FC/2008/11/gingerpeppersugar.html Ginger/Pepper/Sugarで フィジカル・コンピューティング(5) 第3回 Pepperの動作を確認しよう-2  (Processingのインストール編) http://www.eleki-jack.com/FC/2008/11/gingerpeppersugar6.html Ginger/Pepper/Sugar でフィジカル・コンピューティング(6) 第4回 PepperでHello World http://www.eleki-jack.com/FC/2008/11/7.htmlGinger/Pepper/Sugarでフィジカル・コン ピューティング(7) (前回からの続き) ※プログラムの実行結果をエディタで修正したものの一部 です。
  • 17. 5.整形、HTML化 #make_html.rb require 'rubygems' require 'csv' require 'erb' TEMPLATE =<<TEMPLATE #出力結果のテンプレート <p> <a href=<%= url %>><%= title %></a><br /> <span style="font-size:85%"><%= subtitle %></span> </p> TEMPLATE FORMATTER = ERB.new(TEMPLATE) file = './subtitles.txt' #前工程の出力結果(タブ区切りテキスト (TSV)) CSV.open(file,"r","t") do |row| #TSV読み込み url = row[0] title = row[1] subtitle = row[2] puts FORMATTER.result(binding) #erbでフォーマットして出力 end
  • 18. 5.整形、HTML化(解説) ● TSV読み込みのところは前の工程と一緒です。 ● HTMLに整形する部分はERBを使っています。 ● ERBはRubyに標準添付のテンプレートエンジン です。(Ruby on Railsでも使われていま す。) ● ERBを使うと書式の中にテキストを埋め込むこ とが簡単にできます。
  • 19. 出力結果(部分) これを適当なWEBページに貼り付ければ完成です! <p> <a href=http://www.eleki-jack.com/FC/2008/11/post.html>Ginger/Pepper/Sugarで フィジカル・コンピューティング(1)</a><br /> <span style="font-size:85%">はじめに</span> </p> <p> <a href=http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar2.html>Ginger/Pepper/Sugarでフィジカル・ コンピューティング(2)</a><br /> <span style="font-size:85%">第2回 Pepperを組み立てよう-1</span> </p> <p> <a href=http://www.eleki- jack.com/FC/2008/11/gingerpeppersugar3.html>Ginger/Pepper/Sugarでフィジカル・ コンピューティング(3)</a><br /> <span style="font-size:85%">第2回 Pepperを組み立てよう-2</span> </p>
  • 20. まとめ ● WEBから何かを取得して抜き出すときは WWW::Mechanizeが便利 ● 単純なWEBアクセスにはopen-uriが便利 ● CSVの読み込みにはCSVライブラリが便利 ● HTMLを解析して特定の要素を抜き出すには Nokigiriが便利 ● テンプレート出力にはERBが便利 ● 似たような機能を持つライブラリは他にもあり ます。慣れてきたらもっと自分好みのものを探 してみるのもいいかと思います。
  • 21. リンク ● WWW::Mechanize – http://d.hatena.ne.jp/kitamomonga/20081209/kai setsu_for_ver_0_9_ruby_www_mechanize ● open-uri – http://www.ruby- lang.org/ja/man/html/open_uri.html ● CSV – http://www.ruby-lang.org/ja/man/html/CSV.html ● Nokogiri – http://mono.kmc.gr.jp/~yhara/rubyscraping/? Nokogiri
  • 22. リンク(2) ● ERB – http://www.ruby-lang.org/ja/man/html/erb.html ● RubyGems – http://www.ruby- lang.org/ja/man/html/RubyGems.html ● Pepperまとめサイト – http://pepper.gohannnotomo.org ● 雑誌「エレキジャック」 – http://www.eleki-jack.com/
  • 23. 質疑応答
  • 24. ご清聴ありがとうございました