gem install mysqlしてみた

ここを参考にしました↓

gemのインストールは成功したが・・・

riとRDocはエラー出まくり。ドキュメントだし、時間ないし放置プレーします。orz

[root@babydaemons /export/redmine-0.9.5]# gem install mysql -- --with-mysql-dir=/usr/local/lib/mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed
Installing ri documentation for mysql-2.8.1...

No definition for next_result

No definition for field_name

No definition for field_table

No definition for field_def

No definition for field_type

No definition for field_length

No definition for field_max_length

No definition for field_flags

No definition for field_decimals

No definition for time_inspect

No definition for time_to_s

No definition for time_get_year

No definition for time_get_month

No definition for time_get_day

No definition for time_get_hour

No definition for time_get_minute

No definition for time_get_second

No definition for time_get_neg

No definition for time_get_second_part

No definition for time_set_year

No definition for time_set_month

No definition for time_set_day

No definition for time_set_hour

No definition for time_set_minute

No definition for time_set_second

No definition for time_set_neg

No definition for time_set_second_part

No definition for time_equal

No definition for error_errno

No definition for error_sqlstate
Installing RDoc documentation for mysql-2.8.1...

No definition for next_result

No definition for field_name

No definition for field_table

No definition for field_def

No definition for field_type

No definition for field_length

No definition for field_max_length

No definition for field_flags

No definition for field_decimals

No definition for time_inspect

No definition for time_to_s

No definition for time_get_year

No definition for time_get_month

No definition for time_get_day

No definition for time_get_hour

No definition for time_get_minute

No definition for time_get_second

No definition for time_get_neg

No definition for time_get_second_part

No definition for time_set_year

No definition for time_set_month

No definition for time_set_day

No definition for time_set_hour

No definition for time_set_minute

No definition for time_set_second

No definition for time_set_neg

No definition for time_set_second_part

No definition for time_equal

No definition for error_errno

No definition for error_sqlstate
[root@babydaemons /export/redmine-0.9.5]#

hashtagsjpをスクレイピングしてはてダ用に変換するスクリプト

概要

Google Chrome 5.0 betaを騙って、hashtagsjpからつぶやきを取ってきて1行1tweetに変換します。
XPathを使ってるのでとっても見通しが良い実装だと自画自賛w

はてダに直接張れるHTMLを標準出力に吐き出しますが、cssは出力結果に合わせていぢって下さい。

ソースを晒しておく

#!/usr/bin/ruby

require 'net/http'
require 'rexml/document'
include REXML

class HashtagsJP
  attr_reader :timelines

  HTTP_HEADERS = {
    'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2',
    'Accept' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
    'Accept-Charset' => 'Shift_JIS,utf-8;q=0.7,*;q=0.3',
    'Accept-Language' => 'ja,en-US;q=0.8,en;q=0.6',
  }

  HOST = "hashtagsjp.appspot.com"
  URI_ROOT = "http://" + HOST
  DIR = "/tweets/"
  XPATH_EXPR = '//html/' +
                 'body/' +
                 'div[@id="wrap"]/' +
                 'div[@id="main"]/' +
                 'div[@id="main_l"]/' +
                 'div[@class="box_body"]/' +
                 'div[@class="tl clearfix"]'

  def initialize(tag)
    @server = Net::HTTP.new(HOST, 80)
    @tag_path = DIR + tag
    @timelines = []
  end
 
  def parse(html)
    html.delete!("\r\n\t")
    html.gsub!(%r|<script.+?</script>|m, "")
    html.gsub!(%r|<OBJECT.+?</OBJECT>|m, "")
    html.gsub!('<a href="/', '<a href="' + URI_ROOT + "/")
    html.gsub!("&nbsp;", " ")
    html.gsub!("&", "&amp;")
    doc = Document.new html

    count = @timelines.count
    XPath.each(doc, XPATH_EXPR) do |element|
      tl = element.to_s
      tl.gsub!('</a></strong>', '</a></strong>&nbsp;')
      tl.gsub!(%r|> +<|, "><")
      @timelines.push tl
    end
    tweets = @timelines.count - count
    STDERR.puts "parsed " + tweets.to_s + " tweet(s)."
  end

  def fetch(page)
    path = @tag_path.dup
    path << "/" + page.to_s if page != 1
    html = self.get(path)
    self.parse(html)
  end

  def fetch_all(pages)
    1.upto(pages) do |page|
      self.fetch(page)
    end
  end

  def get(path)
    req = Net::HTTP::Get.new(path)
    HTTP_HEADERS.each do |key, value|
      req[key] = value
    end
    STDERR.print "fetching: " + URI_ROOT + path + " ..."
    res = @server.request(req)
    STDERR.puts " done."
    res.body
  end
end

paegs = 1
begin
  raise "arguments error" if ARGV.count != 1 && ARGV.count != 2
  tagname = ARGV[0]
  pages = ARGV[1].to_i if ARGV.count == 2
rescue
  STDERR.puts "usage: " + $0 + " hashtag [pages]"
  exit 1
end
  
hashtag = HashtagsJP.new(tagname)
hashtag .fetch_all(pages)
timelines = hashtag.timelines

while timelines.count > 0 do
  tl = timelines.pop.to_s
  puts tl
end

使い方

例えば、#flosssハッシュタグを2ページ分抜き出すには、下記のように実行します。

shingo@shingo-server:~$ ./tweet-format.rb flosss 2 > flosss.txt
fetching: http://hashtagsjp.appspot.com/tweets/flosss ... done.
parsed 20 tweet(s).
fetching: http://hashtagsjp.appspot.com/tweets/flosss/2 ... done.
parsed 9 tweet(s).
shingo@shingo-server:~$ 

これからの勉強会は

事前のhashtagsjpへの公式ハッシュタグの登録と、帰宅してからのまとめエントリをお忘れなくw*1

以前C#スクレイピングやりましたが

前のサイトと比べて綺麗なXHTMLだったので、Tidyのお世話にならなくて良かったです。というか脊髄反射的にTidyを通したらハマったというのはここだけのヒミツw

*1:先週金曜日の分を纏めようとしたら、もう無かった。orz

Python東海・Ruby勉強会hashtagまとめ

Ruby東海第5回ハンズオンの作品

#!/usr/bin/ruby

require 'rss/1.0'
require 'rss/2.0'
require 'open-uri'

require 'twitter'

# url or local file
source = "http://groups.google.co.jp/group/ruby-tokai/feed/rss_v2_0_msgs.xml"
content = "" # raw content of rss feed will be loaded here
open(source) do |s| content = s.read end
rss = RSS::Parser.parse(content, false)

twit = Twitter::Base.new("babydaemons@gmail.com", "rubytokai123")
print "RSS title: ", rss.channel.title, "\n"
print "RSS link: ", rss.channel.link, "\n"

print "title of first item: ", rss.items[0].title, "\n"
print "link of first item: ", rss.items[0].link, "\n"
print "description of first item: ", rss.items[0].description, "\n"
print "date of first item: ", rss.items[0].date, "\n"

message = rss.items[0].title + ' ' + rss.item[0].link
p message
twit.post message

結局お買い上げ「基礎Ruby on Rails (IMPRESS KISO SERIES)」

教育訓練感想文で必要なので、結局Amazonで発注しました。読んだ感じでは環境が古いため絶対お勧めという訳ではないのですが、実運用されている架空の*1コミュニティ(草野球チーム)のサイトの実装を一から十まで見せてくれるので、持っていて損は無い1冊だと思います。ちなみにRubyについても一通り解説があるので、とりあえずRailsだけはできるRubyistになりたい方にはお勧めです。

基礎Ruby on Rails (IMPRESS KISO SERIES)

基礎Ruby on Rails (IMPRESS KISO SERIES)

「持っていて損は無い1冊」というのをマーケットプレースで中古で手頃な価格で注文できるのがAmazonの良いところですよね。

(2009/12/03追記)
本書のサポートサイトでフォローがあるようです。hostingしてるのは監修のオイアクスさん。*2

また、題材に取り上げられているサイトのRails-2.2対応の作業記録が著者によってなされています。ちょっとでも実力がある方なら紙媒体でなくてもフォローがあるので大丈夫でしょう。i18nネタもやってるようです。*3

それから、ActiveRecord#validation_eachの例で271ページにちょっとしたネタが載ってます。「ぷぷぷっ」って感じw

という訳で良書なんですが…

正誤表ですが、じっくり読まなくてもtypoが見つかったので出版社のインプレスジャパンは何やってるんだろうって感じですけどね。spell checkerくらい掛ければいいのに。*4

同僚が買ったPDF版では正誤表の反映がされてないとのこと。改訂版はRails-2.x対応しないと出せないかもしれないけど現行版のPDFバージョンくらい正誤表の反映をやっといて欲しいというのが正直なところ。
正誤表の反映くらい、多く見積もっても契約社員で5人日くらいでできるでしょ?はっきり言って出版社の姿勢を疑います。*5

インプレスジャパンはアレなので…

オイアクスさんの読者サポートにメールを投げてみました。どんな回答が来るか楽しみww

From	babydaemons@(snip)
To	kiso-rails@oiax.jp
日付	2009年12月3日14:50
件名	『基礎Ruby on Rails』 初版第1刷 正誤表について

『基礎Ruby on Rails』読者サポートご担当様

(snip)と申します。お世話になります。

http://www.oiax.jp/books/kiso_rails/errata-1-1.html
から正誤表を印刷しようとしたのですが、ブラウザの
画面イメージどおりの印刷が不可能なので断念しました。

正誤表をモノクロプリンタでの印刷を考慮したPDFで
作成していただけると幸いです。

また、可能であればPDF形式で印刷可能なA4シール用紙に
訂正文章を印刷して切り貼りして書籍に物理的にパッチを
当てれるような仕組みを用意していただけると本当に助かります。
#紙テープ時代のパッチみたいですが。

お忙しいとは存じますが、ご検討頂けると幸いです。
宜しくお願いいたします。

P.S.
本書についてブログを書きましたので、よろしければご覧下さい。

http://d.hatena.ne.jp/babydaemons/20091202/1259738528

それで回答をいただきました

それもわずか16分後です!速いっっっっ!!!(from 株式会社オイアクス代表取締役黒田努様)

さすがはWeb系業界人。でも代表取締役なのにこのスピード感は尋常じゃないです。

PDF版正誤表についてはComming Soon!ということでした。

さらにReplyいただきました

ブログのご指摘はもっともです。できれば、<del> ~ </del> せずに、そのまま掲載を続けていただきたく思います。

という訳なので取り消し線は削除しました。

#もし、このエントリが勝手mirrorされててgitやSubVersion
リポジトリ管理されてたりしてたら履歴が相当楽しいことになってるなw

*1:裏を取ってないので釣りかもしれませんが釣りというか教材では定番のフィクションですね。(汗)

*2:出版社インプレスジャパンはやる気なし。

*3:まだ、タイトルしか読んでませんが。

*4:メールで株式会社オイアクス代表取締役黒田努様から「本書における誤記の多さは基本的には私たち著者の責任です。私の入稿遅れなどの事情もありますので、あまり出版社のことを厳しく書かないでいただければと思います。」とご回答をいただきました。

*5:それが出来ないくらい出版不況は深刻なんだよという意見があるかもしれませんが、それって負のスパイラルですよね。

確認画面を作ってDBに登録してみた

もう1ヶ月ほど昔になってしまいましたが、確認画面を作ってみた - babydaemonsの日記のあとで確認画面の後でDBに登録する例を作ってみました。

お題はお問い合わせフォーム(メール送信なし)です。

お持ち帰りはこちらからどうぞ。

たぶん、つっこみどころ満載ですので、コメント・トラバよろしくお願いします。m(_ _)m