Upload
toruby
View
1.391
Download
3
Embed Size (px)
Citation preview
王子様本のRuby1.9対応を
調べるつぼい
@tsuboi
自己紹介• 名前
o つぼいo twitter: @tsuboi
• すみかとかつどうo 某社 R&Dセンター(最近は傭兵として地方遠征中)o 平日のネットは某社内 IRCo とちぎ Rubyは拡大会には参加(欠席一回)o Rubyはほそぼそと 10年(反省:使い方が変わってない)
• お仕事o 新しめのファイル共有とか文書管理とかメッセージ交換なシステムを考えたり作ったり
• 最近のトピックo 好き勝手にクラウドとか言うやつは死んでしまえo 先週、自由な生活を手放してしまいました
ある日の某IRC• Seki
「だれか幸福の王子様本が 1.9で動くか、調べてほしい!」
(そうすれば初刷脱出だ!)
幸福の王子様本
要件の確認• 顧客要件
o 「 dRubyによる分散・Webプログラミング」の売り上げを増やすこと
• とちぎ的な要件o Seki節を布教し、とちぎRuby会議の次回参加者を増やすこと
• 次の戦いのために。次の次の戦いのために。
よろしい、では作戦開始だ• 方法
o 幸福の王子様本のサンプルコードを Ruby1.9で動かしてまわる
• 妥協点o 本文中の自然言語上の非対応やスニペットが動かないのは目をつぶる
• 完全な検証は要件でないことに注意
• 課題o どうやってサンプルコードを入手するか?
• 賢者さまから直接もらうo ×紳士はそんな無粋なことはしない
• ひたすら手入力o ×ネタにならないo (学習としてはこれがベターではある)
• 最新でじたるテクノロジーでなんとかする
Buy
Split
スーパーファイン (白黒 600dpi )白黒両面読み込みOCR なし、自動傾き補正なし
Scan
ScanSnap標準添付読み取り精度は悪くない程度 コストパフォーマンスでは国内最強
(東芝製は精度高いけど値段も高い)ダウンロード価格 4800円
OCR
英語モードか日本語モードかはプログラムが対象の場合は微妙(大文字小文字変換を後処理で行うなら、日本語モードの方が分がいいことも)
PDFからのテキスト抽出• Rubyな人なら rroongaの ChupaText を使う
o http://groonga.rubyforge.org/#about-chupatext
• Macな人なら OS-Xの PDFKitを使うo OSX::PDFDocument.alloc.initWithURL(file_url).string.scan(/doi[\.|:].*/i)
[0]].join("")
• 手っ取り早くいくなら xdoc2txto http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html
I) A "2.4 reminder cuiO.rbclass ReminderCUIdef initialize(reminder)@model = reminderend
def [email protected]_a.each do Ik, viputs format_item(k, v)endnilend
def add(str)@model.add(str)End
def show (key)puts format_item (key, @model[key])end
def delete(key)puts ツキ [delete? (Yin)]: #{@model[key]}”if l ツ・ s*n ツ・ s*1 =- getsputs "canceled”returnend
@model.delete(key)listendprivatedef format_item (key, str)sprintf("%3d: %s ツ・ n", key, str)endend
9 - ~ -t Iv 3 "f
I) A "2.4 reminder cuiO.rbclass ReminderCUIdef initialize(reminder)@model = reminderend
def [email protected]_a.each do Ik, viputs format_item(k, v)endnilend
def add(str)@model.add(str)End
def show (key)puts format_item (key, @model[key])end
def delete(key)puts ツキ [delete? (Yin)]: #{@model[key]}”if l ツ・ s*n ツ・ s*1 =- getsputs "canceled”returnend
@model.delete(key)listendprivatedef format_item (key, str)sprintf("%3d: %s ツ・ n", key, str)endend
9 - ~ -t Iv 3 "f
(唯一の)まじめな話• RubyコードをOCRする際にぶつかる壁
o ダブルクォートが認識にしくいo パイプ「|」の認識精度が極めて悪い ←かなりどうしようもないo 辞書に存在しない単語がひどいことに(変数や関数名)o 英語モードで認識すると、「¥」が認識できない
• 王子本はこの点がつらい
• 意外と大丈夫な点o Rubyはスペースの有無に対して比較的ロバスト
• 王子本も実はけっこうばらばらo インデントがなくなっても大丈夫
• 一般的な問題(ポストフィルタで対応)o ページ境界o ページヘッダ、フッダの除去o 半角、全角がばらばらになる(特に日本語モード)
このままでは
調査ができません!!
大丈夫だ
http://estore.ohmsha.co.jp電子書籍として買えるようにしておいた!
わかっていると思いますが買うのはこれです。
一緒に買うと 960円もお得です(お支払いは PayPalで)
リスト 2.4 reminder_cui0.rbclass ReminderCUI def initialize(reminder)@model = reminder enddef list @model.to_a.each do |k, v|puts format_item(k, v) endnil enddef add(str) @model.add(str)enddef show(key) puts format_item(key, @model[key])enddef delete(key) puts" [delete? (Y/n)]: #{@model[key]}" if /¥s*n¥s*/ =~ getsputs "canceled"return [email protected](key)list endprivate def format_item(key, str)sprintf("%3d: %s¥n", key, str) endendターミナル 3 て ReminderCUI を起動して実験しましょう ( 図 2.4) 。
さすがにほぼOK!しかし、よくわからないルールで改行が落ちる( Privateなどが単独行にならない)
ひとまずの要約• Ruby 関係の書籍に掲載されているサンプルコードを
OCRする際に遭遇する課題を、簡単にまとめてみました
• 結論:
ためらいなく、容赦なく、電子書籍版を買え(時は金なり)
o ただし、完全ではない。ポストフィルタを書く必要はありそう。• 改行が怪しい(これは PDF ビューア/ツールの問題かもしれない)• 見やすさ優先でダブルクォートが全角になっている本もある
o なお、インデントが重要な言語の場合は、手打ちかダウンロードサイトがある書籍を選びましょう
で、 Ruby1.9で動いたの?
• ハァ、まぁ賢者さまがすでに確認済じゃないんですか?
• 4 章までは動きました(ちなみに 5 章はスレッドネタ)
問題が出たらWebへ改訂版に備えて加筆中らしい
http://d.hatena.ne.jp/m_seki+b/
まとめ:要件の確認• とちぎ Ruby会議 LT CM 枠(?)で王子本を紹介
o Amazonでの王子本の買い方の紹介o オーム社 eStore(β)での王子本の買い方の紹介
• さらに、王子のサイトを紹介o +b を紹介
• なにより、 Ustreamで全世界に露出o スタッフの皆さんに感謝
• すくなくとも、私が2冊買いました