2010年12月17日

検索エンジン改造して遊ぼう!

Clothing Manufacturer
by efilpera under CC BY-NC-SA

tk0miyaさんから、Python Web フレームワークアドベントカレンダーのパスが回ってきました。ちなみに当方、現在、The Art of Communityの翻訳直しが佳境なのと、本田技術研究所を辞めて転職することにしたのと、それに伴って引っ越しの準備やらで首がまったく回っていません。Pythonのアドベントカレンダーは、なぜか遅れるとバリカンという殺伐した話になっていて、恐怖で禿げそうです。あ、退職の話は年末に落ち着いたら書くかも。

今回のネタは、僕がユーザグループの会長をやっている、Sphinxのお話にしようと思います。Sphinxに関しては、@r_rudiさんが実用系の話を既に書いてくださっていますので、僕はハック方面で話をします。ちょうど冬休みですし、Pythonを使った入門 自然言語処理の本が最近出たり、前にも集合知プログラミングという面白い本が出ていたりして、空前の検索エンジン自作ブームが訪れようとしているのかもしれないけど、やっぱり自分でゼロから作るのはなぁ・・・という人向けのエントリーです。はい。読者少なそうですね。気にせずに進んで行きましょう。

Sphinxの検索の仕組み

もしかしたら、Sphinxというツールについて知らない方もいるかもしれないので、軽く紹介しておくと、ファラオのピラミッドパワーのご加護によってモテモテ間違いなし品質の高いドキュメントが素早く作成できるようになる、ドキュメントジェネレータです。PDFやHTMLで出力できますし、ePub出力や、清水川先生の開発中のWord2007出力、僕が作成中のKindleファイル出力など、夢がいくらあっても足りない!というステキツールです。「ステキすぎる!今年のクリスマスにはSphinxが欲しいわ!」と思われた方も片手で数えられないぐらいいると思いますが、サンタさんにお願いする必要はありません。なんとタダでダウンロードできます!BSDライセンスです。すばらしいですね!

SphinxではHTML出力ができるということは紹介しました。静的HTMLが出ますが、なんと検索窓が付いています。通常は、検索を実現するには、ウェブサーバ上で、CGIなりウェブアプリケーションサーバを動かし、検索して結果をHTMLで整形して返す、といったことが行われていますが、Sphinxは単なる静的ファイルのみが出てきます。どのように動作しているのでしょうか?

ヒミツはsearchindex.jsというファイルにあります。これは、make htmlを実行したときに生成されるファイルです。中には何が書かれているんでしょうか?一部抜粋してみます。

Search.setIndex({
   terms:{
    jsmath_path:38,
    autoclass_cont:[36,21],
    get_object:39,
    sourcelink:16,
    four:[0,1,26],
    objtyp:39,
    prefix:[0,7,36,30,8,39,22,35,16,27,6,17]},
  filenames: 
    ["templating","markup/para","rest","intro","examples",
     "ext/refcounting","tutorial","ext/tutorial","ext/extlinks",
     "ext/coverage","ext/graphviz","ext/autosummary"]})

Search.setIndex()という関数に、何やらオブジェクトを渡しています。オブジェクトには、termsfilenamesというキーがありますね!感の鋭い方は気づかれたかもしれませんが、termsは、キーワードから、指定されたドキュメントのインデックスをマッピングする辞書になっています。filenamesが、そのIDに該当する、ファイル名の一覧です。SphinxのHTMLフォームで検索をかけると、そのキーワードから、そのキーワードが含まれるドキュメントのIDを見つけて、そのページを表示する、という仕掛けです。実際には、単語はもっと大量にありますし、単語以外にもtitlesや、objnamesといった、グループで、単語とドキュメントIDへのマッピングが何種類か登録されています。

もうちょっと詳しい検索の流れは次の通りです。

1. 検索キーワードのステミング処理をかける

例えば、 books と入れました。本の複数形です。ステミング処理というのは、現在形など、辞書に載っている形式に戻す処理です。辞書には特殊な単語意外は複数形では載っていませんよね?ここではbookに変わります。ちなみに、Sphinxがオフラインで作成したインデックスのsearchindex.jsにも、ステミングされた処理が入っています。つまり、原文がbooksで、検索ワードがbookでも、両方ともステミングされた後の状態で比較されるため、マッチします。

ちなみにこのステミングアルゴリズムは「ポーターステマー」という名前のアルゴリズムが使われていますが、ここの処理は結構重い処理らしく、Pythonのドキュメント1つ分をまるごとビルドすると、ここがボトルネックになってしまいます。エキスパートPythonプログラミングを一緒に翻訳した稲田さんが、ここのパッチをSphinxに送って組み込まれているのですが、現在では、もしポーターステマーのC言語の拡張モジュールがあれば、高速化のためにそれを呼ぶようになっています。

2. searchindex.jsを検索する

辞書が入っていますので、ステミングした単語を入れて検索します。このbookが含まれているドキュメントのID一覧がゲットできました。ドキュメントIDがゲットできたら、今度は実際のファイル名を調べます。

3. source/XXX.txtを調べる

目的の単語が入っているファイルが分かりました。次に、このドキュメントのソースのreSTファイルを調べに行きます。SphinxはHTMLを見るときに「ソースを見る」で、ビルドしたソースのreSTファイルが読めるようになっています。検索の詳細表示では、このファイルを利用するようになっています。このソースコードを読み込み、目的の単語を探し、その前後のテキストをくりぬいてきて、検索したファイル情報と一緒にユーザに表示します。見た目はこんな感じになります。

Screen shot 2010-12-16 at 22.35.31

これらは全部JavaScriptで記述されており、クライアントのブラウザ上で検索機能が動作しています。ちょっと検索とかやったことがある方は、これだけでもビックリですよね?

検索機能をパワーアップしてみる

さてさて、単にSphinxの実装の紹介では、バリカンで襲われてしまう恐れがあるので、ちょっと手を加えてみます。文章の重要度が高いほど、上位に表示されるようにしてみます。

検索のランクを計算する方法は色々あります。表題に使われた場合には重みを増やすとか、多くのページからリンクされたら、などなど。とりあえず、今回は簡単な方法として、たくさん単語が表示されているページほどランクが高くなる、というルールを設定します。

まずはsphinx/search.pyを見てみましょう。HTMLにビルドすると、IndexBuilderクラスのfeedメソッドが呼ばれ、単語が登録されていきます。今までは単なるドキュメントのリストだったのを、単語数の重み情報つきの情報にしなければなりません。

        # 変更前。feedの内部関数のadd_term。
        def add_term(word, stem=self._stemmer.stem):
            word = stem(word)
            if len(word) < 3 or word in stopwords or word.isdigit():
                return
            self._mapping.setdefault(word, set()).add(filename)

self._mappingというのが、単語をキーにして、ファイル名のセット型を値に持つ辞書になっているようです。重要度を保持するということで、単語の出現回数を保持したいと思います。そこで、セット型の代わりに辞書型を持たせて、カウンタとします。

        # 変更後。feedの内部関数のadd_term。
        def add_term(word, stem=self._stemmer.stem):
            word = stem(word)
            if len(word) < 3 or word in stopwords or word.isdigit():
                return
            files = self._mapping.setdefault(word, {})
            files[filename] = files.get(filename, 0) + 1

次に、出力部をいじります。freeze()メソッドの結果が、JavaScriptのコードに埋め込まれますが、この中で、get_terms()メソッドを呼び出し、単語とドキュメントIDの辞書を出力しています。

    # 変更前
    def get_terms(self, fn2index):
        rv = {}
        for k, v in self._mapping.iteritems():
            if len(v) == 1:
                fn, = v
                if fn in fn2index:
                    rv[k] = fn2index[fn]
            else:
                rv[k] = [fn2index[fn] for fn in v if fn in fn2index]
        return rv

forループの行を書き換えます。本来はセット型だったのですが、今は辞書が入っています。これを単語出現数でソートして、キーだけの配列を生成するようにしました。試しに、この周辺にprint文でも仕込んでみると、動きが良く観察できるでしょう。

        for k, v_with_rank in self._mapping.iteritems():
            sorted_v = sorted(v_with_rank.items(), key=lambda i: -i[1])
            v = [i[0] for i in sorted_v]

さて、make htmlしてみると・・・エラーが出ました。Sphinxは複数のソースをまとめてビルドしますが、余計なファイルを削除するコードがあり、現在のドキュメントのsetと積集合をとることでゴミを削除しています。ただ、このメソッドはセット型のメソッドで、辞書にはないので、なんとなく動きをエミュレートします。

    def prune(self, filenames):
        """Remove data for all filenames not in the list."""
        new_titles = {}
        for filename in filenames:
            if filename in self._titles:
                new_titles[filename] = self._titles[filename]
        self._titles = new_titles
        for wordnames in self._mapping.itervalues():
            # 変更前はこの一行
            # wordnames.intersection_update(filenames)
            for filename, rank in list(wordnames.iteritems()):
                if filename not in filenames:
                    del wordnames[filename]

とりあえず、一番最初にあげたサンプルでは、prefixという単語がいっぱい使われているようです。実際にこのコードを走らせて、prefixという単語の出現数とファイル名のペアの配列を表示してみると、次のような感じです。

prefix [('domains', 8), ('ext/extlinks', 7), ('ext/intersphinx', 2), ('markup/inline', 2), ('templating', 2), ('markup/toctree', 1), ('ext/tutorial', 1), ('changes', 1), ('ext/appapi', 1), ('ext/inheritance', 1), ('config', 1), ('tutorial', 1)]

domainsという所にいっぱいあるみたいですね。ノーマル状態のSphinxで検索をかけてみると、changes、ext/appapi, tutorialという順番に表示されます。ここで、手を加えたエンジンを使って検索をかけてみると・・・・

緊急事態発生

あれ?ノーマルのSphinxと同じ順序で表示される(汗・・・現在23:53。調査突入・・・あ、日付変更線が頭を越えた。

その後、調査した結果、JavaScript側で、ファイル名でソートをかけている、ということが判明。敵はJavaScriptにあり。ということでごにょごにょ修正した結果は↓ここに置いておきます。JavaScript側の修正と、それ以外の修正のdiffはまとめてこちらに掲示しましたので、参照してください。

簡単に書くと、検索結果のファイル一覧を辞書に格納しているので、キーの順番を保持する配列を用意(351行目のfileMapKey)して、検索時の単語数順の配列の順序を保持するようにしたのと、ファイル名でのソートの行を消しました。これで、希望通りの順番で表示されるようになりました。一時間のタイムロス・・・すみませんすみません。

今後の遊び方

さて、トラブルはありましたが、検索機能のハックが完了しました。登場単語の多い順で検索ができるようになりました。ブラウザで検索するため、インデックスが巨大になってしまうn-gram方式はSphinxではちょっと難しかったり、さまざまな制約はあります。ですが、今回みたいにインデックスされる順番を工夫することで検索の性能を上げることができます。集合知プログラミングを読んだけど、検索インデックス作る材料がないなぁ、という人は、ぜひSphinxの検索機能をネタにハックしてみてください。

例えば、多くのページから参照されている場合にはランクを上げる(ページランク)、同じ単語が集中的に表示されるパラグラフのスコアを上げるなど、少ないデータながら、工夫のしがいはあります。また、同じようなページベクトルを持つ単語は類似の単語として、ユーザにリコメンドしたりできるする余地もあります。

Sphinxは文章を書くツールとしても優秀ですが、文章情報をプログラム的にさまざまに加工する、文書プロセッサとしても利用可能です。今後はこのあたりのノウハウも増やしていきたいと思います。

え?どこがウェブのフレームワークだって?

SphinxはHTMLが生成できて、ブラウザ側で検索もできちゃうんですよ。静的ファイルだけを配布するサーバを用意すればそれでOK。パフォーマンスなんてそんなにいらないです。なんか、CO2を25%減らすとか外に約束してしまった政治家の先生とかいるし、SphinxをCMSとして使ってCO2削減!と売り込めないかなぁ、と画策中。ストレージが全部メモリで、CPUがARMとかで、静的ファイル配信専用のウェブサーバーとかってないんですかね?

次は@RyoAbeさんにバトンを渡したいと思います。

posted by @shibukawa at 01:10 | Comment(42) | TrackBack(0) | 日記 はてなブックマーク - 検索エンジン改造して遊ぼう! このWebページのtweets
この記事へのコメント
Posted by cinderalla23 at 2011年01月03日 14:51

エドハーディー http://www.edhardyshop.jp
ミュウミュウ http://www.miumiu.ne.jp
モンクレール http://www.moncler.ne.jp
モンクレール http://www.monclerstore.jp
モンクレール http://www.monclershop.jp
Posted by ミュウミュウ at 2011年04月26日 14:38

ずっと、お世話になっております。lvの専門店に包まれていた

http://www.goodlv.org
歓迎客たちに感謝の気持ちを込めて、販促活動を行って大きい。
4月9日から5月9日まで、全ての商品を&#38381;めた35 %だった。

(特別品以外のホームページhttp://www.goodlv.org
詳しいことは私たちのサイトで&#35265;てくださいぜひお願いします。
毎日大量の新作入荷!!
ご愛顧だった。
http://www.goodlv.org
よろしくお愿いします。

本店のurl: http://www.goodlv.org/
電子メールのアドレス:sales@goodlv.org
Posted by ルイ ヴィトン バッグ at 2011年05月12日 10:35





Posted by 液体媚薬 at 2011年09月23日 10:22

ティファニー ネックレス:http://www.tiffanytojp.com/c-83-b0.html
ティファニー アトラス:http://www.tiffanytojp.com/c-36-b0.html
ティファニー 1837:http://www.tiffanytojp.com/c-29-b0.html
ティファニー リング:http://www.tiffanytojp.com/c-84-b0.html
Posted by ティファニー ネックレス at 2011年09月26日 23:23

ティファニー:http://www.tiffanytojp.com
ティファニー ネックレス:http://www.tiffanytojp.com/c-83-b0.html
ティファニー アトラス:http://www.tiffanytojp.com/c-36-b0.html
ティファニー 1837:http://www.tiffanytojp.com/c-29-b0.html
ティファニー リング:http://www.tiffanytojp.com/c-84-b0.html
ティファニー クロス:http://www.tiffanytojp.com/c-42-b0.html
ティファニー ブレスレット:http://www.tiffanytojp.com/c-82-b0.html
ティファニー コレクション:http://www.tiffanytojp.com/c-30-b0.html
Posted by ティファニー at 2011年09月26日 23:30




媚薬,バイアグラ,シアリス,レビトラ,精力剤の個人輸入代行!
正規品100%保障!お届け100%保障!ご注文いただいた商品は、海外よりお客様のお手元に中身がわからないようにしっかりと
どうぞ安心してご利用くださいませ。
正規品100%保障!お届け100%保障!ご注文いただいた商品は、海外よりお客様のお手元に中身がわからないようにしっかりと梱包してお届けいたします。
ですので、中身が家族などに知られることもありません。さらに、商品名も記載せずにお届けいたしますので、安心です。また、現在、高い効果や低価格などを謳った偽者なども蔓延しておりますが、当店のものは、100%純正品ですので、安全にご購入いただき、納得の効果が得ることができます。
連絡メールアドレス:brandshop9@gmail.com
ホームページー:http://www.kanpou-energy.com
媚薬,バイアグラ
Posted by 媚薬,バイアグラ at 2011年10月19日 13:00

紅蜘蛛
コメント: "紅蜘蛛(液体)は、無色無味の液体で、飲料、酒類にすぐに溶けます。女性が飲用すると
飲用後、数分間で情熱が溢れ出てきて、愛情の欲求が強くなります。
連絡メールアドレス:kanpouenergy@gmail.com
ホームページー:http://www.kanpou-energy.com
Posted by 紅蜘蛛 at 2011年10月26日 16:50

さて、make htmlしてみると・・・エラーが出ました。Sphinxは複数のソースをまとめてビルドしますが、余計なファイルを削除するコードがあり、現在のドキュメントのsetと積集合をとることでゴミを削除しています。ただ、このメソッドはセット型のメソッドで、辞書にはないので、なんとなく動きをエミュレートします。
Posted by ファー付きブーティ at 2011年11月03日 18:27




いう面白い本が出ていたりして、空前の検索エンジン自作ブームが訪れようとしているのかもしれないけど、やっぱり自分でゼロから作るのはなぁ・・・という人向けのエントリーです。はい。読者少なそうですね。気にせずに進んで行きましょう。
Posted by モンクレール at 2011年11月15日 17:36

これは良いインターネットのマーケティングおよび広報です。4
Posted by christian louboutin at 2011年11月23日 06:49

素敵〜♪はじめてのモンクレールです。昨年買い逃して今年は買うぞと決めてました。とはいえ高価な買い物なので数週間悩んでしまいました(笑)情報量が他店より少なかったので心配でしたが、サイズのことで問い合せした際には、丁寧に返事をいただけたので安心して購入できましたし、また発送も迅速でした。ありがとうございました。冬はモノトーンになりがちなのでこのカラーで正解でした大事に着ます。
Posted by モンクレール 店舗 at 2011年11月25日 10:55



素敵〜♪はじめてのモンクレールです。昨年買い逃して今年は買うぞと決めてました。とはいえ高価な買い物なので数週間悩んでしまいました(笑)情報量が他店より少なかったので心配でしたが、
satibo online:http://www.naturalpills2u.com/satibo.html
Wodibo:http://www.naturalpills2u.com/wodibocapsule.html
sex medicine:http://www.naturalpills2u.com/
vigrx:http://www.naturalpills2u.com/vigrx.html
Posted by satibo online at 2011年12月13日 17:35

素敵〜♪はじめてのモンクレールです。昨年買い逃して今年は買うぞと決めてました。とはいえ高価な買い物なので数週間悩んでしまいました(笑)情報量が他店より少なかったので心配でしたが、
woman:http://www.specialitybrand.com/category/60.html
satibo online:http://www.specialitybrand.com/tags/satibo-capsule.html
Mojo Warrior:http://www.specialitybrand.com/product/mojowarrior.html
Satibo:http://www.specialitybrand.com/product/satibo.html
sex medicine:http://specialitybrand.com/
Posted by woman at 2011年12月13日 17:36

Posted by シューズメンズ at 2012年01月07日 15:50

ん中に、毎日実行されるまで10分の屋内競技場は、ウィンブルドンのセンターコートで
Posted by モンクレール at 2012年01月18日 12:42



あなたはこの寒い冬に着る必要のある衣類を考え出すの悩みはまだですか?回答はモンクレールが、それは着やすいだけでなく、シンプルなスタイルです。あなたがモンクレールを着ることを選択した場合、どんなにそれがモンクレールセーターやモンクレールブーツがない、あなたは誰もあなたのような優しいことになることはできないでしょうし、またこの冬の寒さからあなたを守ります。
http://www.moncler-down-japan.com
Posted by モンクレール ベスト at 2012年02月20日 15:08

モンクレールのデザイナー、魅力的な色を使用して、ジャケットが美しい作ることができるようなになり

ました。モンクレール レディースコートはとても品質が良くて、糸の密度に依存しています。だから、

先にこのブランドを購入するのに十分得ではないでしょうか?今寒い冬が近づいています。モンクレール

は冬の時に不可欠なものです。衣類のモンクレールのこのタイプは、世界のモンクレールの豪華さ、快適

さとモードに同時に存在する機会を与えなければならないです。一般にこの降雪のような状況の下、多く

の人々は彼らが"ローリングボール"のように見えるように、通常の体温を、維持するために、重い、重い

オーバーコートを着用する必要があります。
http://www.moncler-down-japan.com/モンクレール-レディースコート-c-6.html
Posted by モンクレール レデイースコート at 2012年02月22日 17:48

シューズ レディース http://www.ninkishop.co
シューズ メンズ http://www.ninkishop.co/6-men-shoes
レディース 靴 http://www.ninkishop.co/7-women-shoes
パンプス http://www.ninkishop.co/17--
靴 紳士 http://www.ninkishop.co/16--
ウェッジソール http://www.ninkishop.co/20--
Posted by シューズ メンズ at 2012年02月23日 17:20

モンクレールは、山と容易に摩耗を愛している誰にも有名です。モンクレール製品は、特にモンクレール

ジャケット、世界中で非常に人気があります。
http://www.moncler-down-japan.com/モンクレール-レディースコート-c-6.html
Posted by モンクレール レデイースコート at 2012年02月28日 17:55




セールブランド激安店
ブランド品のインターネット販売!
ブランド品 腕時計 飾り物などの買取紹介サイトです!
ヴィトン 、グッチ 、エルメス、 シャネル、コーチ 、ブルガリ、クロエ 、 プラダ 、カルティエ などの9種類が大激売中!
*“信用一”は弊店のサービス趣旨となっております!
*第一時間で最新作を手に入れること!
*商品を発送した後、EMS番号とEMS会社のホームページをご連絡させていただ きます。
*ごほしい物を見つけない場合、弊店を任せて探すことが可能!
*ごほしい商品の情報を提供していただきました後、すぐお探し致します。手 に入れた次第、ご連絡致します。
★ URL: http://www.bluekkk.com/
★ 店長: 赤石聡子
★ 連絡先:info@bluekkk.com
Posted by ブランド 時計 コピー at 2012年03月15日 15:01

セールブランド激安店
ブランド品のインターネット販売!
ブランド品 腕時計 飾り物などの買取紹介サイトです!
ヴィトン 、グッチ 、エルメス、 シャネル、コーチ 、ブルガリ、クロエ 、 プラダ 、カルティエ などの9種類が大激売中!
*“信用一”は弊店のサービス趣旨となっております!
*第一時間で最新作を手に入れること!
*商品を発送した後、EMS番号とEMS会社のホームページをご連絡させていただ きます。
*ごほしい物を見つけない場合、弊店を任せて探すことが可能!
*ごほしい商品の情報を提供していただきました後、すぐお探し致します。手 に入れた次第、ご連絡致します。
★ URL: http://www.watch-n.com/
★ 店長: 岡田 一郎
★ 連絡先:info@watch-n.com
Posted by ブランド 腕時計 通販 at 2012年03月19日 15:55

弊社の偽物 ブランド 財布は激安販売し、ルイヴィトン 財布偽物、激安 ブランド バッグなど幅広く取り揃えています。完璧な品質を維持するために ブランド コピー 代引き、ベルト通販、ブランド コピー エルメスがございます。ブランド コピー 財布通販専門店!
Posted by ヴィトン 長財布 at 2012年03月28日 16:43


本田芽衣
超人気質屋【copytojp.com】
★最高等級財布大量入荷!
▽◆▽世界の一流ブランド品N級の専門ショップcopytojp.com★
注文特恵中-新作入荷!-価格比較.送料無料!
◆主要取扱商品バッグ、財布!
◆全国送料一律無料
◆オークション、楽天オークション、売店、卸売りと小売りの第一選択のブランドの店。
■信用第一、良い品質、低価格は 私達の勝ち残りの切り札です。
◆ 当社の商品は絶対の自信が御座います。
おすすめ人気ブランド腕時計,最高等級時計大量入荷!
◆N品質シリアル付きも有り 付属品完備!
☆★☆━━━━━━━━━━━━━━━━━━━☆★☆
以上 宜しくお願い致します。
★URL:http://www.copytojp.com/
★店長:本田芽衣
★連絡先:sales@copytojp.com
Posted by 激安ブランドバッグ at 2012年03月29日 17:05


セールブランド激安店
ブランド品のインターネット販売!
ブランド品 腕時計 飾り物などの買取紹介サイトです!
ヴィトン 、グッチ 、エルメス、 シャネル、コーチ 、ブルガリ、クロエ 、 プラダ 、カルティエ などの9種類が大激売中!
*“信用一”は弊店のサービス趣旨となっております!
*第一時間で最新作を手に入れること!
*商品を発送した後、EMS番号とEMS会社のホームページをご連絡させていただ きます。
*ごほしい物を見つけない場合、弊店を任せて探すことが可能!
*ごほしい商品の情報を提供していただきました後、すぐお探し致します。手 に入れた次第、ご連絡致します。
★ URL: http://www.lovinglv.com/
★ 店長:坂上 村
★ 連絡先:sales@lovinglv.com
Posted by 激安 ブランド 財布 at 2012年04月02日 12:46

超楽天人気ブランド大特価
★2012年最高財布等級時計大量入荷超人気!!!★
超人気のブランド店→http://www.n-saifu.com/←実物写真ブランド店
■2012年の超人気ブランド新品■
┏━━━━豪華贅沢品━━━━┓
◎━バッグ :ブラダ、イースト、アウトドア、コーチ、ディーゼル
◎━財 布:カルティエ、ブルガリ、グッチ、ブラダ、コーチ
◎━時 計:ロレックス、パネライ、シャネル
■◎━━◎低価格 低価格◎━━◎■
■◎━━◎年末引割り◎━━◎ ■
☆●●●●●運賃無料実施中●●●●●☆
*----*━━━━━━━━━━━━━━━━━━━━*----*
┃超人気新作N品登場☆注文を期待:http://www.n-saifu.com/
*----*━━━━━━━━━━━━━━━━━━━━*----*
┓┏┓┏┓
┻┗┛┗┛%品質保証 満足保障。
信用第一、高品質 安心 最低価格保証
■担当者:上田
当社URL:http://www.n-saifu.com/
連絡先:info@n-saifu.com
Posted by ルイヴィトン ランキング at 2012年05月18日 15:57

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/42122645
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索ボックス

読書記録

Counter

Profile by iddy

www.flickr.com
This is a Flickr badge showing public photos and videos from shibukawa.yoshiki. Make your own badge here.
<< 2012年05月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
最近の記事
最近のコメント
RPythonを使ってechoサーバを作る by グッチバッグコピー (05/18)
RPythonでスレッド-RPythonで何ができるかを知るには?- by ルイヴィトン ランキング (05/18)
検索エンジン改造して遊ぼう! by ルイヴィトン ランキング (05/18)
Pythonって何?という人のためのSphinxチュートリアル[2] by ルイヴィトン 長財布 新作 (05/18)
「いつもの朝ご飯」 by Windows XP プロダクトキー (05/17)
最近のトラックバック
カテゴリ
過去ログ
Powered by さくらのブログ