プログラマでありたい

おっさんになっても、プログラマでありつづけたい

作って覚える転置インデックス、「検索エンジン自作入門」

 先行発売で、検索エンジン自作入門を購入しました。まだペラペラと眺めている状況ですが、これが非常に面白いです。
 「検索エンジン自作入門」は、集めた文章をいかに整理するかをテーマとして扱っている本です。整理するという意味は、検索エンジンを利用するというライフハック的な意味ではありません。整理する為の検索エンジン自体を自分で作ることで理解するという、極めて硬派な本です。
f:id:dkfj:20140920155244j:plain

「検索エンジン自作入門」とは?



 「検索エンジン自作入門」は、未踏IT人材発掘・育成事業にスーパークリエータに認定された山田浩之氏と、Senna/groongaの開発者の末永匡氏の共著です。検索エンジンについて語らせたら、日本でこれ以上の人たちはいないだろうという組み合わせです。ということで、内容は非常に濃いのですが、難しい内容を解りやすく解説されています。
 一方で、扱っている内容は非常にマニアックです。下に目次付けておくので見て頂きたいのですが、紙面の5割以上が転置インデックス(Inverted index)についてです。つまり1つのアルゴリズムについて、100ページ以上を割いていることになります。こんな有難い本は、なかなかないですね。

 そして、それを学ぶ為に、必要最小限の機能を実装した検索エンジン「wiser」を開発し、ダウンロードできるようにしているという力の入れっぷりです。この本を大学の授業なので、1年間通して教えたらかなり面白いのではないでしょうか?

転置インデックスは、検索エンジンの肝



 検索エンジン本に関わらず、ここまで転置インデックスの話しかしていません。では何故「検索エンジン」についての本の中身が、転置インデックスになるのでしょう?それは、検索エンジンの肝が全文検索であり、全文検索の実装の1つが転置インデックスであるためです。
 転置インデックスの概念は、書籍の索引と同じです。目的のページに早く辿り着く為の方法です。それをコンピュータが実行できるようにしているのが、転置インデックスです。リレーショナル・データベースにも、検索を早くする為に幾つかインデックスがありますが、基本的には一緒ですね。文章に対して比較的適しているのが、転置インデックスです。また転置インデックスの中身の技術については、RDBMSのインデックスと同じものを使っているものもあります。

 以前、Mecabの開発者の工藤拓さんの講演を聞いていたところ、「Double Array TRIEのの実装が、Mecabだ」といった趣旨のことを話されていました。その一言が非常に印象的でした。もちろんDouble Array TRIEだけが、Mecabを構成している要素ではないでしょう。しかし、どの技術がMecabの本質的な特徴かと突き詰めたら、Double Array TRIEだということと理解しました。プロダクトの優位性を決定づけるものが何か、考えさせられたものです。

転置インデックスを知ると、何が嬉しいの?



 実際のところ、9割のITエンジニアにとっては、転置インデックスなんて自分に関係ないというと思います。私も、詳しく調べて使っていた時がありましたが、直接的に関係していたのは一時期だけです。
 では、何の役にたつのか?検索エンジンであったり転置インデックスは、わりと根源的な技術の1つです。システムを設計する上で、こういった知識があるかないかで、自ずと結果が違ってきます。
 また、毎年いろいろなプロダクトやサービスが出てきますが、どういった仕組みで作られているか理解できると、その製品の将来性が解ります。技術の引き出しをつくる為にも、こういった要素技術を抑えておく必要があります。

検索エンジン自作入門と、Rubyによるクローラー開発技法。或いは感想



 自著の宣伝になりますが、最近「Rubyによるクローラー開発技法」という本を書きました。この本のテーマは、いかに文章やデータを集めるかです。文章やデータを集めているだけなので、次はどうするのというのが出てきています。本の中ではあまり書けませんでしたが、その次の技術としては、文章を整理する為の検索エンジンや、データマイニング、あるいは可視化などで、情報を整理して活用することがあります。
 そんな意味で、ちょうど良いタイミングで良い本が出たなぁと思います。また、少し前に「手を動かしながら学ぶ ビジネスに活かすデータマイニング」という本も出ています。データを集めて検索したり分析したりの学習の敷居が、ずいぶん低くなって楽しいなぁと思います。ぜひぜひ、一緒に読んで頂ければと思います。


検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例


2014/9/25追記
Kindle版も出ている模様です。ちょっと待てば良かったw

検索エンジン自作入門?手を動かしながら見渡す検索の舞台裏

検索エンジン自作入門?手を動かしながら見渡す検索の舞台裏



See Also:
『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次

検索エンジン自作入門の目次


第1章 検索エンジンはいかにして動くのか

1-1 検索エンジンの構成を理解する

検索エンジンとは
検索エンジンを構成するコンポーネント
検索エンジンに関連するコンポーネント
1-2 高速な全文検索を実現するインデックスの仕組み

全文検索の2つの方法
転置インデックスの仕組み
転置インデックスの作り方
転置インデックスで用いられる用語
1-3 転置インデックスを深く知る

転置インデックス=辞書+転置リスト
転置インデックスから単語を探す
転置リストに単語の位置情報を加える
転置インデックスからフレーズを探す
1-4 日本語文書から転置インデックスを作る

日本語の文を分割する方法
分割方法のトレードオフ
1-5 転置インデックスの実装

辞書の実装
転置リストの実装
1-6 転置インデックスを用いて検索する

ブーリアン検索
転置インデックス用いた検索処理の流れ
関連度の計算方法
情報検索における検索
1-7 転置インデックスを構築する

メモリを用いた転置インデックスの構築
二次記憶を用いた転置インデックスの構築
静的なインデックス構築と動的なインデックス構築
1-8 検索したい文書を用意する

データを集める
データを整形する
第2章 全文検索エンジンのサンプルを準備する

2-1 全文検索エンジンwiserの概要

wiserの構成
検索用の文書を用意する
2-2 wiserをセットアップする

wiserをビルドする
wiserを起動する
Wikipediaデータを展開する
2-3 wiserを動かす

転置インデックスを構築する
転置インデックスを用いて検索する
grepとwiserの実行速度を比較する
第3章 転置インデックスを作ろう

3-1 転置インデックスのおさらい

トークンを抽出する
トークンごとにポスティングリストを作る
3-2 転置インデックスを構築する

ストレージ上でポスティングリストを作る
ポスティングリストと転置リストのデータ構造
転置インデックスの構築手順をソースコードレベルで追う
ソースコードをより詳細に見る
コラム 要件に応じた検索エンジン(システム)の設計
第4章 検索しよう

4-1 検索処理のおおまかな流れ

検索処理の流れを把握する
4-2 転置インデックスを用いて検索を行う

検索処理をソースコードレベルで追う
関数split_query_to_tokens()の内部を読み解く
具体例を用いて検索処理の流れをより深く理解する
関数search_docs()の内部を読み解く
関数search_phrase()の内部を読み解く
コラム タグ検索はどのように実現されるか
第5章転置インデックスを圧縮しよう

5-1 圧縮の基本

転置インデックスにおける圧縮のメリット
コラム 圧縮の目的
転置インデックスの圧縮方法
転置リストの圧縮方法
なぜ圧縮できるのか
5-2 wiserにおける圧縮機能の実装

圧縮機能のソースコードの概要
圧縮しない場合の動作を見る
Golomb符号の概要を把握する
Golomb符号における符号化の処理を読み解く
Golomb符号における復号の処理を読み解く
第6章 wiserの改良やパラメータの調整に挑戦してみよう

6-1 検索処理を効率化する

改善のポイント
検索クエリを重複しないトークンに分割する
6-2 フレーズ検索をやめてみる

2文字の文字列を検索したときの挙動を調べる
3文字の文字列を検索したときの挙動を調べる
6-3 検索結果の出力順序を変更する

検索結果の並び替えの軸となる指標
検索結果を文書サイズの大きい順に出力する
コラム ランキングSPAM
6-4 1文字の検索クエリで検索できるようにする

特定の文字を接頭辞に持つトークンの一覧を取得する
検索して結果をマージする
コラム 類似文書検索を実現するには
6-5 転置インデックスの更新バッファ量を変えてみる

バッファサイズの違いによる効果の差を確認する
sarコマンドで負荷を調べる
6-6 英字アルファベットだけトークンの分割方法を変えてみる

英単語の検索で適合率が下がる問題を避けるには
インデックスの対象にする文字をどう判定しているか
トークンの分割を行う関数を修正する
6-7 圧縮の効果を確認する

Golomb符号の効果を見る
非圧縮時と圧縮時のインデックスサイズを比較する
コラム 全文検索エンジンの安易な利用を避ける
第7章 これからより深く学ぶために

7-1 wiserでは扱えなかったテーマ

転置インデックス以外の全文検索インデックス
大規模なデータを効率よく扱えるストレージ
キャッシュを利用した高速化
さまざな圧縮方法の利用
ランキングの改良
適合率と再現率の調整
検索結果の並び替え処理の負荷を減らす
並列処理
属性による絞り込みとの併用
ファセット検索
コラム レイテンシとスループット
7-2 全文検索エンジンGroongaでの工夫

トークンの部分一致検索による再現率の向上
メモリマップトファイルの利用
スニペット
コラム 広報活動の大切さ
7-3 利用者の意図を考慮した検索エンジンを目指して

ストップワードを導入する
形態素解析のミスに対処する
コラム ぎなた読み
組文字・全半角を扱う
ひらがな・カタカナを同一視するどうか判断する
表記のゆれを考慮する
検索クエリを正規化する
ブーリアン検索の解釈に気をつける
検索クエリを形態素解析器により適切に解析する
誤り訂正を行う
入力を補完する
関連する検索キーワードを提案する
7-4 文書の収集・抽出におけるポイント

クローラを作るうえで対処すべきポイント
テキストの抽出で対処すべきポイント
Appendix

A-1 高度な話題

近年の圧縮手法
動的なインデックス構築
インデックスの分散
A-2 wiserのテキスト抽出・保存処理

XMLを扱う2種類のAPI ~DOMとSAX
文書のタイトルと本文を取り出す
状態を把握する
文書データベースを構築する

Amazonで在庫がないので、それ以外の書籍ネット販売を見てみた

 先週の金曜日から、Amazonでは「Rubyによるクローラー開発技法」が売り切れ状態です。Amazonの予想を超えてやったぜといい気になっている反面、数少ない売れるチャンスを逃し機会損失ではないかと、喜んだり落ち込んだりしています。いつになったら入荷されるのでしょうか?ちなみに、一般の書店でも殆ど見たことがないので、ツチノコ状態なのではと気を揉んでおります。
 そんな折りにふと、他の書籍のネット通販ではどういう状態なのか気になり、ざっと見てみました。そもそも殆ど使ったことがないので、わりと新鮮な驚きがありました。

Amazon以外の書籍のネット通販



 一昔前は、Amazonと楽天だけという印象だったのですが、今はいろいろあるのですね。ざっと検索掛けただけでも、5〜6個出てきました。特化型のものを合わせれば、もっともっとあるでしょう。主なものをリストアップすると、次のとおりです。リンク先は察してください。


 各サイトを数分だけ触っただけでも、実装レベルの差を感るものがあります。例えば、検索機能のサジェストの有無。日常的にGoogleやAmazonを使っていると当たり前のように感じるこのUIも、自分で実装しようとするとそれなりに面倒くさいものがあります。サジェスト先のデータをどうするのかとか、サジェストのタイミングとか。昔に悩んだなぁとか思い出しました。単純に本だけでよければ、書誌データのタイトルを使えばよいですが、複数のカテゴリの製品を検索できる場合は、邪魔にならないサジェストするのは難しいんですよね。あと、英語日本語の問題とか。

 逆に面白いのが、ヨドバシカメラの在庫のある店舗機能。その名のとおり、店舗ごとの在庫状況を見せてくれるのですが、東京近郊で複数の店舗によれるという選択肢がある場合は便利です。私も以前出張時に、ノートパソコンのACアダプタを忘れた時に重宝したことがあります。
f:id:dkfj:20140916221526p:plain

 あとは、セブンネットやTSUTAYAのように店舗連動を前提としたものとかをみると、なるほどなと思います。Amazonと楽天の2強と戦うには、同じ土俵に乗ったら負けですね。また微妙に気になったのが、丸善&ジュンク堂とhontoの関係。トップページの説明を読むと、"hontoは丸善、ジュンク堂、文教堂などの店舗とネット通販、電子書籍が連動したハイブリッド総合書店。"とのことです。ジュンク堂にしたら、重複のチャネルじゃないかと気がしますが、書籍の流通の世界はややこしそうなので気にしないておきます。

 余計なことをつらつら書いていて、当初の目的を忘れていました。結論的には、Amazon以外全て在庫がありそうです。「Amazonでみんな買うのかすげーな」と感じるべきなのか、他の店舗を褒め称えるのかよく解りませんが、結果としてはそういう状況です。

実店舗の状況



 それでは、実店舗ではどうなのでしょうか。大型店以外は、基本的に見かけることはないです。発売以来いろいろな規模の本屋さんで探してみましたが、大型店以外無いです。その辺りは別エントリーに素人推測を書いているので、興味があれば読んでください。
 しかし、そんな中で圧倒的な存在感を放っているのが、ジュンク堂です。私の観測範囲は池袋店ですが、圧倒的な在庫量を誇っています。ついつい寄って状況をみてしまうのですが、在庫たっぷりです。発売後、半月以上経つのに未だに平置きしてくれるという有り難さです。元々好きな本屋でしたが、一気に大好きになってしまいました。

f:id:dkfj:20140916230657j:plain
f:id:dkfj:20140916230720j:plain

感想



 Amazonさん、早く在庫復活してくれ。知れば知るほど、街の本屋で普通に本が並んでいるという状況が、どれほど凄いことなのか解るようになりました。一度どこかで本屋の流通の仕組みについて、調べてみたいですね。

See Also:
『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次
個人ブログの存在感は、自分が思っているより大きいのかもしれない。或いは書籍の流通の話
『Rubyによるクローラー開発技法』の増刷決定しました
本を書く前に準備したこと、執筆中にしていたこと


Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

東芝REGZA 47Z7を買って修理した話と、テレビガードと火災保険の関係

 先日の引っ越しのタイミングで、新しいテレビを買いました。東芝REGZAのZ7シリーズの47インチです。ヤマダ電機で2代前の型落ちを店頭で安く買いました。今まで録画の設備も持っていなかったのに、いきなりテレビ一体型の録画機能とタイムシフト機能がついて、非常に快適です。もっぱら、3歳の息子のYoutube鉄道映像のシアターと化してしまっていますが。

サポートセンターへ電話。修理の手配



 しかし、設置早々に壊れてしましました。電源が全く入らないので、電源系の故障の模様です。どうしようもないので、東芝さんのサポートに電話しました。すると、電話で訪問修理の予定日を確認して、2日後に来てくれました。ただ、交換部品がないということで、その日は代替のテレビを置いていってお終いです。何でも、今のテレビは、モジュール単位に交換で、部品がないと何ともしようがないとのことです。1週間後に再度部品を持ってくるとのことです。

今どきのテレビの構成と修理の現実



 初回の訪問から1週間後くらいで、交換の部品を持って修理の人が来ました。修理の途中で聞かせて貰った話が、なかなか面白かったです。まず、最近のテレビの構造です。パネルと電源系、パソコンでいうところのマザーボード的な存在くらいです。思った以上にシンプルな構造でした。
f:id:dkfj:20140915152307j:plain

 写真中央あたりの部分が、電源制御系のようです。右の方がマザーボード的な存在の模様です。部品を見ていると、パネルはLG製、メモリはSamson製でした。修理の人曰く、国産テレビの中身の多くが、輸入の部品で構成されているようです。一方で、マザーボード的な物の中の黒い部分、映像処理の中心的なモジュールらしいですが、ここの部分は独自に作っているようです。パソコンで言うところの、CPUだけ自作しているようなイメージでしょうか。

 さて修理ですが、モジュールごとの交換となります。そのモジュールの単位ですが、何と電源ボードであったり、マザーボード的な物が1つの単位となっているようです。今回の場合は、電源系の故障だったので、中央の山吹色のボードを丸ごと交換していました。個々の部品のチェックなどはしないのか聞いてみると、もう製品が電子化し過ぎていて個別のチェックが出来ないようになっているようです。

テレビガードと火災保険の免責の関係



 少し話それますが、今回テレビを買ったタイミングで、テレビの液晶ガードを購入して付けていました。上の子が小さい時に、テレビをバンバン叩いていたからです。もうだいぶ分別がつくようになってきたので、上の子については心配していないのですが、今度は下の子の番です。と言う事で、付けていました。
 修理屋さん曰く、これは中々お勧めな模様です。子供がらみの液晶関係の故障は、月に1〜2件は必ず出会す程の頻度ということです。テレビも極限まで薄くなって、もろくなっているのでしょうかね。

 また意外な話も聞けました。火災保険の種類によっては、液晶の破損等に対応できるようです。その際に画面保護パネルをつけておけば免責になりやすいなりにくいようです。これは話を聞いただけなので裏はとっていませんが、何かあった場合はダメ元で保険の交渉をしてみるのもよいのではないでしょうか。
※2014/09/16追記 免責の意味が逆だとの指摘を受けました。免責は保険会社側のものとのこと。逆の意味でつかっていました。

感想



 今回、テレビを修理してみて色々勉強になりました。簡単にまとめると、次の3点です。

  • 今のテレビは完全にデジタルの産物。パソコンとほぼ同じ構造になっている。
  • テレビの中身の共通化は進んでいる。国産・海外の製品の区別はなくなっているのでは。
  • 差があるとすると、サポートや保証の差だけでは

 結論的には、テレビを作っていると赤字になる構造が理解できたような気がします。ユーザーとしては、国産製品の販売後の手厚いサポートは有難い限りです。一方で、2世代前の型落ちのテレビが10万円以下で叩き売られて、かつ同じようなサポートが必要な状況は、メーカーにとっては悪夢ではないのでしょうか。また、価格下落に対応する為に、調達コストを下げようと今の構造のように部品の汎用化が進みます。国産だから品質が高いとか、海外のものだから品質が低いという時代ではなくなりつつあるのでしょうね。
 品質の話になると、汎用化が進むほど品質のコントロールが難しくなるでしょう。徐々にサポートコストが重荷になるという構造になっていくのではないでしょうか。

 修理の様子を見聞きしながら、30分くらい考えただけなので見当違いの部分も多いと思います。ただ、デジタル化というものがどういうことなのか、少し垣間見えたような気がします。


See Also:
AirPlayを使って、AppleTV+AVアンプでホームオーディオ・システムを構築する話
Apple TVを出すアップルがiTVを出さないと思う理由
笑える程の凄さ!未来のテレビがここに Apple TV


グリーンハウス 47インチTVガード 薄型テレビ用 AGタイプ GH-TVG47AG

グリーンハウス 47インチTVガード 薄型テレビ用 AGタイプ GH-TVG47AG

Spidering hacksと私

 知っている人は気がついていると思いますが、「Rubyによるクローラー開発技法」は、「Spidering hacks」を意識して書かれています。この本はクローラーやWebスクレイピングに関して、非常に広範囲に取り扱っています。ツールの話からスクレイピングの仕方まで、ひと通り学べる内容となっています。

 私が最初にSpidering hacksを読んだのは、いつの時かはっきり覚えていません。もともと独自にスクレイピングのまね事のような事をしている時に、この本に出会ったのだと思います。当時は、クローラーやスクレイピングというものの概念をあまり持っていませんでした。ただただ単純にWebからデータを抜き出したくて、自分の持っている知識を組み合わせて力ずくで取得していました。
 そんな時にこの本に出会って、一気に世界が広がりました。定番のツールや定石の方法を知り、欲しければ何でも取得しようという貪欲さを学びました。


 一方で2004年発売なので内容としてはだいぶ古く、次のような問題があります。

  • 利用しているモジュールが古い
  • 対象となるサイト・サービスが既に存在していないものが多い
  • そもそも対象サイトが米国のものが多く、日本の読者には必要としないことが多い

 クローラー本の宿命として、陳腐化しやすいという問題があります。取得の対象が実際にあるサイトじゃないと誰も喜ばないという現実があります。しかし、そのサイトは当然変更されるし、もっと言うとサイト自体がなくなるという可能性もあります。つまりサンプルプログラムが動かなくなるということです。またこの本は、主にPerlを前提にスクレイピングするという構成です。LWPやMechanizeなどを駆使するというパターンですね。最近では、PythonやRubyのシェアが上がってきているので、相対的にPerlの利用者が減っているのかなぁという現状です。その辺り考えると、技術本の中でも特にクローラーというのは難しいよなぁと思います。


 そんなこんなを漠然と思っていたのですが、まさか自分が同じような本を書くことになるとは、夢にも思っていなかったです。自分の本の寿命がどれくらいなのか解りませんが、同じように誰かの参考になってくれれば幸いです。そして誰か、Python版を書いてくれないかなぁと思います。


Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例


See Also:
『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次
本を書く前に準備したこと、執筆中にしていたこと
オープンソースのRubyのWebクローラー"Anemone"を使ってみる

大人の歯磨き。Panasonic ジェットウォッシャー 白 EW-DJ10-W

 30代後半で二児の父ですが、未だに歯医者に行くと懇切丁寧に歯の磨き方の指導を受けます。20代の若い歯科衛生士に、ここを丁寧に磨くんですよと諭されると、「恥の多い生涯を送って来ました」と懺悔せねばならぬ気持ちになってきます。
 もともと私は顎が小さく、歯の間隔が非常に狭いです。その為、歯を磨くだけでは、歯の間の詰まったものが取れないことが多く、歯間ブラシ等を併用していました。また歯並びが悪いため、死角も多く磨きにくいという難点がありました。そこで、評判の良い水圧で歯を綺麗にする機器を買ってみました。

購入の経緯



 製品のカテゴリ名はよく解りませんが、パナソニックのジェットウォッシャー EW-DJ10-Wを購入しました。このジャンルの製品に興味を持ったのは、たぶん4〜5年前にネットで話題になって、かなり楽と聞いていたからです。うろ覚えですが、当時は海外製が主流で国内製品も成熟しておらず、1万円以上という値段だったような気がします。
 それが最近では、4,000〜5,000円くらいで買えるようになりました。この値段であれば、上手くいけば歯医者で定期的に検査や掃除をして貰う必要がなくなるので、直ぐに元が取れると思い購入してみました。それ以来、大体1ヶ月くらいたったので感想載せてみます。

ジェットウォッシャーは、何があって何でないのか



 購入前だとジェットウォッシャーは万能の機器で、歯ブラシによる歯磨き自体不要になると思っていました。その考えは、恐らく100%間違いです。歯ブラシと補完するものであって、どちらか一方で済むものではないです。少なくとも私の場合は、そう感じました。
 それでは、ジェットウォッシャーのメリットは何なのでしょうか?歯ブラシと組み合わせると、歯磨きの総合時間が短縮できます。最初にジェットウォッシャーを使い、歯間の汚れを一気に掃除してしまいます。だいたい10〜20秒くらいで、ひと通り掃除できます。その後に歯ブラシで、歯の表面などの汚れを落としますと効率的です。また副次効果として、歯ブラシの間に食べかすがつくことが無いので衛生的です。
 一方で、私の場合だけかもしれませんが、歯間ブラシ不要ということにならずに、相変わらず歯ブラシの後で歯間ブラシも利用しています。肉の筋などが歯の間に挟まると、どうしても取れない時があります。ただし、ここは個人差があると思います。

ジェットウォッシャーの水圧



 ちなみにジェットウォッシャーですが、かなりの水圧です。初めてやった時は、びっくりして洗面所中水浸しにしてしまいました。歯茎に直接当たると、結構痛いです。威力のほどは、動画をみてください。恐らく果物くらいであれば、穴があくのではないでしょうか?


Panasonic ジェットウォッシャー 白 EW-DJ10-W - YouTube



感想



 30年以上、歯磨きといえば歯ブラシだけを使うものと思っていました。一方で世の中いろいろな器具があるので、自分に最適なものをちょっと試してみるのもよいのではと思います。最近は、電動歯ブラシでも、音波振動歯ブラシなどもあるようです。ちょっと評判聞いて試してみたいと思います。
 歯磨きは、1日2〜3回3分くらいを一生涯続けていく必要があります。80年間磨き続けるとなると、4380時間です。(3分×3回×365日×80年=26,280分)こんなに時間を掛けるのであれば、その質をよくすれば投資効果としてかなり大きな分野ではないでしょうか?

Panasonic ジェットウォッシャー 白 EW-DJ10-W

Panasonic ジェットウォッシャー 白 EW-DJ10-W

『Rubyによるクローラー開発技法』の増刷決定しました

 少し遅くなりましたが、ご報告です。先月末(8/23)に発売した「Rubyによるクローラー開発技法」ですが、発売10日程で何と増刷決定しました!!
 発売前から、テーマがマニアック過ぎるとか、値段が高過ぎると、主に私の中で心配していましたが、想定外の好調さに驚いています。たくさんの方に買っていただき、本当にありがとうございます。Amazonの方でも売上げ好調で、「本 > コンピュータ・IT > プログラミング > Ruby」では、1週間1位を継続、1つ上の、「本 > コンピュータ・IT > プログラミング」でも、わりと1位を継続していて、「本 > コンピュータ・IT」でも、ランクインしています。

どういった層が買うのか



 発売後、TwitterやGoogleでつぶさに観察しています。「Rubyによるクローラー開発技法」の購入者層は、Rubyやクローラーをバリバリやっているという人よりは、どちらも、もしくはどちらかが初めてで、本を読みながら学んでいくというスタイルの人が多いようです。そういった人には、Rubyの概要から、クローラーの概念まで、細かく解説しているこの本はマッチするようです。特にRubyの説明については、Ruby技術本の第一人者の一人である、るびきちさんの解説なので勉強になると思います。(私も勉強させて頂きました)
 一方で、タイトルからして中上級者向けと思って買った人に対しては、少し物足りないのかもしれません。クローラーを作ってスクレイピングをしていると、必然的に可視化や統計処理、自然言語処理に向かうことになると思います。そこに対する足がかりの記述をもう少しすれば良かったと思います。
 実は企画段階で、その辺りも少し書きたいと考えていました。しかし、色々話しあう上で、テーマがぶれすぎるので削っていきました。結果的には良かったと思いますが、巻末インデックスか何かで文献や参考リンクでも書いておけばよかったと思います。その点は、いずれブログか何かで補完しようと思います。

イベント



 出版社の方に聞いたのですが、RubyKaigiでジュンク堂さんが販売会をするそうです。予定があえば私も参加して、サイン会になるようです。正式に決まり次第、改めて連絡させて頂きます。しかし実際にするとなると、私は字が汚いので、小学生が教科書に名前を書いたみたいになるので、本にサインすることに躊躇します。でも、買ってくれる人に直接あって、話を聞いてみたいというのはあります。
 またググっていて発見したのですが、「Rubyによるクローラー開発技法 読書会」なるものが、9/27(土)に兵庫県尼崎市で開催されるようです。どんな会まったく知りませんが、光栄です。いつか読書会に参加してみたいですね。

See Also:
『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次
本を書く前に準備したこと、執筆中にしていたこと


参照:
『Rubyによるクローラー開発技法』増刷決定!Amazon 1位なう!!個人用即席クローラーの作り方 | るびきち×Emacs
9月27日 Rubyによるクローラー開発技法 読書会 第1回(兵庫県)

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

本を書く前に準備したこと、執筆中にしていたこと

 「Rubyによるクローラー開発技法」は、2013年12月に話を頂き、2月くらいまで企画を検討し、2月〜7月の約5ヶ月間で執筆しました。役に立つかどうか解らないけど、本を書く前に準備したことと、執筆中にしたことを残していこうと思います。次回があれば、もう少し上手くできるようにしたいですね。

事前に準備したこと


執筆環境を構築した

 執筆環境は、いの一番で用意しました。具体的には、下記の2つです。

  • GitHubの有料版アカウントを作成し、プライベートリポジトリを作った
  • MarkDown記法を覚えて、MarkDownから各種フォーマットに変換できる環境を作った

 GitHubのプライベートリポジトリを作ったのは正解でした。これが無ければ、いろいろ事故も起こったと思います。反面、Markdownの環境はメインのMacにしか作らなかったのが失敗でした。意外に色々な端末で書くことになったので、CIツールも用意してクラウド上でビルド出来る環境を作るべきでした。後は、表現力というところでは、Markdownは少し物足りません。この点は、ReVIEWの方に分があります。一方で、MarkdownであればGithubでほぼそのまま見ることが出来るので、悩ましいところです。

Markdown記法+Git+md2review+ReVIEWで原稿・ドキュメント管理

文章を書く技術の本を読んだ

 体系的な文章の書き方について学んだことがなかったので、文章術の本を何冊も買い込んで読んでみました。その効果で文章力が上がったのか自分では解りませんが、下記の2つのことを心がけるようになりました。

  • 一文一文を短くなるように心がける
  • できるだけ断定調にする

 幾つか読んだ中で、技術書を書くという観点では、「理科系の作文技術」が一番役にたちました。テクニカルな文章を書く場合には、参考になります。
 また、物事を一番解りやすく伝える作家として、私の中では、阿刀田高さんが一番です。氏の数あるエッセイの1つに、「日本語を書く作法・読む作法」という本があったので、これも読みました。勉強になった反面、他の阿刀田さんの本を無限に読み続けるというループに陥ってしましました。目的意識をしっかりですね。

Rubyの勉強をした

 あまりRuby力に自信がないので、共著者のるびきちさんの本をよんでRubyの勉強をしました。正直勉強に充てられる時間が足りなかったので、今後精進します。

対象読者の想定をした

 Rubyでクローラーというお題を頂いた時に、直感的にムリだろうと思いました。国内のRubyのエンジニアの数と、クローラーに興味がある割合。その二つを仮定して掛けあわせた結果、茨の道が見えました。そこで、勝手にターゲットを下記に設定しました。

  • 統計や自然言語処理に興味を持ちだして、その為のデータを収集しようとしている学生(学部3〜4年生)
  • SEOやWebマーケティングをしている人
  • ツールを使って作業を楽にしたいITエンジニア

 あまりRubyもクローラーも知らない人を想定し、入門書的な位置づけにしています。その意図通りになっているか、まだ解りません。ぜひ感想を聞かせて頂ければと思います。

執筆中にしていたこと



マイクロレベルでの執筆時間の管理をした

 パソコンで執筆すると、予想以上に誘惑が多いです。調べ物しているうちに、面白いページを見つけて、ずっと読み続けているということもありました。それを防止する為に、マイクロレベルで、時間を管理するようにしました。具体的にはポモドーロ・テクニックですね。これが中々良くて、普段の仕事をする上でも取り入れるようにしています。

パソコンで作業する際は、ポモドーロ・テクニック(Pomodoro Techinique)を使うとよい

ニーズの調査をしながら執筆した

 ターゲットは決めたものの、内容についてはどの辺に需要があるのか正直サッパリ解りませんでした。だから、書こうかなと思ったテーマについては、ブログで事前に記事にして反応を確かめることにしました。反応が大きかったものについては分量を多めにし、反応が無かったものは扱いを小さく、もしくは削りました。
 自画自賛ですが、これは割と良かったです。本来であれば、色々な人に査読をお願いするのがよいのでしょうが、客観的かつ的確な指摘を得るのは難しいのが実際のところです。ブログの場合、ブコメ等でストレートな感想を頂けるので、かなり参考になりました。また、間違っている部分も指摘されることもあり、大変助かりました。
 執筆前や執筆中に書いた記事は、次のようなものがあります。ブクマとTwitter、後は暫くしてのGoogleからの検索の流入を、反応の指標としました。

JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる
複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた
あらためてRuby製のクローラー、"anemone"を調べてみた
Capybara-DSLのはなし
Ruby2.0の文字エンコーディングの簡単なまとめ。KconvとM17N
Ruby製のクローラー Anemoneの文字化け対策
Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath
FireFoxやChromeを使って任意のノードのXPathを簡単に抽出する方法について
Ruby製のクローラー Anemoneでストレージをファイルに変更する
RubyでYahoo! キーフレーズ抽出APIを使ってテキストマイニング
Ruby製のクローラー AnemoneでストレージをSQLite3, MongoDBに変更する
開発用プロキシ、「CocProxy」が便利
RubyでAmazon Product Advertising APIを再び使ってみる
RubyのHTTPS通信で、OpenSSL::SSL::SSLErrorが出たら?
Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた

執筆後にしたこと



 せっかく書いたのだから、誰も読んでくれないと悲しいです。ということで、自分で出来る範囲で宣伝をしてみました。

勉強会で宣伝

 幾つかの勉強会で機会を頂いて、クローラー関係の発表をさせて頂きました。登壇しなかった勉強会でも、懇親会なので今こんな本を書いているんですよと宣伝してました。

62nd Ruby/Rails勉強会@関西に参加してきた
RubyでWebスクレイピングの話をしてきました。第1回Webスクレイピング勉強会@東京
「第2回Webスクレイピング勉強会@東京」に参加&発表してきました

 今後も機会があれば、勉強会で発表していきたいです。日程があえばどこでも行きますので、お気軽にTwitter等でご連絡いただければと思います。

ブログで宣伝

 効率としては、何気に一番よかったです。一方で、色々な勉強会で話していたこともあって、注目してもらえる下地があったのかもしれません。

『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次

 ブログ書いて、はてなのホットエントリーに載って、各種SNSでシェアされました。結果、Amazonの順位が一気にあがり、多くの人の目につくようになりました。正直な所、ビギナーズラックでしょうが、今後の参考にしようと思います。
f:id:dkfj:20140904092520p:plain

エゴ・サーチ

 ほぼ毎日、書名でGoogleやTwitterを検索して、反応を探しています。心折れることを覚悟してたのですが、今のところ好意的な反応が多くて嬉しい限りです。しかし、今後の糧に厳しいご意見もお待ちしております。
 ちなみに今や、関係する呟きやブログを見つけると、即TweetするBot状態になっております。「Rubyによるクローラー開発技法」という単語があれば反応しますので、興味がある人は試してみてください。

まとめ



 寝不足で死にそうになった半年でしたが、なかなか得がたい経験を積ませて貰いました。もう少し上手くやる方法は幾らでもありそうなので、その辺り今後も考えていこうと思います。


Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例