キャッシュ生成フェイズのコードを読んでみよう
まずは、キャッシュ生成フェイズのコードリーディングを始めましょう。
キャッシュファイルとメタ情報の生成は、Webからの操作でなく、定期的に実行されるRubyプログラムなので、libディレクトリ配下に配置されています。
Rubyプログラムを実行されると呼び出される部分のソースコードです。このプログラムの構造として、このメソッドを起点にして記事や共有ファイルごとのキャッシュを生成するメソッドを呼び出します。
23 def self.execute options 24 cache_path = get_cache_path 25 26 maker = self.new() 27 maker.public_methods.each do |method| 28 if method.index("make_caches_") == 0 29 contents_type = method.gsub("make_caches_", "") 30 maker.send(method, contents_type, cache_path, options[:time]) 31 end 32 end 33 File.symlink( SkipEmbedded::InitialSettings['share_file_path'],"#{cache_path}/share_file" ) unless FileTest.symlink?("#{cache_path}/share_file") 34 end
24行目で、キャッシュを出力するパスを取得しています。これは設定ファイルの内容を基に別のメソッドで取得されています。26行目で、このクラスのオブジェクトをインスタンス化しています。
27行目から32行目のブロックでは、そのオブジェクトに存在するパブリックなメソッドすべての中で「make_caches_」で始まるメソッドを探し、30行目のsendメソッドで見つかったメソッドを呼びだしています。こうすることで、キャッシュを生成するオブジェクトが増加したとしても、メソッドを規約どおりに増やすだけでほかの部分への影響を考えずに追加できます。
33行目では、共有ファイルの実体ファイルはファイルとして全文検索の対象としたいので、シンボリックリンクをキャッシュの領域に作成することでキャッシュの生成の変わりとしています。
次に、先ほどのsendメソッドから呼びだされるキャッシュファイルを実際に作成するメソッドを見ていきましょう。
44 # entry用 45 def make_caches_entry(contents_type, cache_path, border_time) 46 entries = load_not_cached_entries(border_time) 47 entries.each do |entry| 48 contents = create_contents(:title => entry.title, 49 :body_lines => entry_body_lines(entry) ) 50 51 publication_symbols = entry.entry_publications.map{|publication| publication.symbol}.join(',') 52 meta = create_meta(:contents_type => contents_type, 53 :title => entry.title, 54 :publication_symbols => publication_symbols, 55 :link_url => "/page/#{entry.id}", 56 :icon_type => 'report' ) 57 58 output_file(cache_path, contents_type, entry.id , contents, meta) 59 end 60 end
46行目では、対象となる記事一覧を取得しています。このバッチファイルは、指定なしで実行すると過去15分に更新された情報のキャッシュファイルを生成するようになっているため、対象となるのはデフォルトでは15分以内に更新のあった記事一覧になります。
47行目からは、それぞれの記事について、キャッシュを生成していく処理に入っていきます。48、49行目は、キャッシュのHTMLの本文(検索対象となる部分)を取得しています。
entry_body_linesメソッドにより、記事本文の内容だけでなくコメントの内容も含めて検索対象となる文字列を生成していきます。記事だけに対して検索すると記事の内容のみを検索することになるのですが、キャッシュを生成して全文検索を行うことにより、記事にひも付いた情報も検索対象に含むことができます。
51行目では、記事の閲覧権限を取得しています。52行目から56行目では、メタ情報を取得・設定しています。58行目では、output_fileメソッドに、これまで収集した情報を引き渡しファイルへの出力を行ないます。
この処理は画面ではなく、Rubyプログラムで実行される部分ですので、デモサイトでは操作できません。試す場合は、実際にソースコードをDLして実行してみてください。
収集フェイズのコードを読んでみよう
実は、このフェーズでSKIPのコードはありません。すべてHyperEstraierのみで完結します。しかし、利用する上で1点ポイントがあるので、少し紹介しておきます。
キャッシュファイルをクロールする際に、HyperEstraierに付属しているWebのクローラを利用しています。このクローラがデータを収集するためには、収集対象であれるキャッシュをHTTPで配信する必要があります。
しかし、ここで配信している情報が誰でも閲覧できるようになっていると、誰でもすべての情報にアクセスできるため情報が漏えいしてしまいます。
そこで、われわれは配信に軽量WebサーバであるLihgttpdを利用し、HyperEstraierのクローラのIPからしかアクセスを許可しないようにしました。そのための設定方法のサンプルが、config/lighttpd.confとして同梱されているので、全文検索を利用される場合は参考にしてください。
3/4 |
Index | |
全文検索を実装したソースコードを読もう | |
Page1 全文検索機能で情報の収集を便利に実現 SKIPの全文検索のアーキテクチャ 全文検索エンジン「HyperEstraier」 |
|
Page2 全文検索キャッシュの仕組み 全文検索の動作の流れ SKIPのソースコード入手方法 |
|
Page3 キャッシュ生成フェイズのコードを読んでみよう 収集フェイズのコードを読んでみよう |
|
Page4 検索フェイズのコードを読んでみよう |
Railsコードリーディング 〜scaffoldのその先へ〜 |
Ruby/Rails関連記事 |
プログラミングは人生だ まつもと ゆきひろのコーディング天国 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる |
|
生産性を向上させるRuby向け統合開発環境カタログ Ruby on Rails 2.0も強力サポート 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる |
|
かんたんAjax開発をするためのRailsの基礎知識 Ruby on RailsのRJSでかんたんAjax開発(前編) 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう |
|
Praggerとnetpbmで作る画像→AA変換ツール Rubyを使って何か面白いものを作ってみよう! 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう |
|
コードリーディングを始めよう Railsコードリーディング〜scaffoldのその先へ〜(1) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|