豊満な脳みそ←わがままブレーン

ただただ、暗号文をつくりたいがため・・・・・・ 専用の復号プログラムとパスナンバーが9つあれば読めるブログ。さもなければ、ある程度正確に暗号化の仕組みを理解したうえで、総当たり(brute attack)で最大約6,631,300,125,000,000通りの試行が解読に必要です。

100本ノック 第64問目

(正解にやっとこさ辿り着いた。[2017/09/30 12:18])

 

言語処理100本ノック 2015 の64問目

 

64. MongoDBの構築
アーティスト情報(artist.json.gz)をデータベースに登録せよ.
さらに,次のフィールドでインデックスを作成せよ: name, aliases.name, tags.value, rating.value

 

 

試行錯誤:

ここまでの100本ノックの問題で、日を跨いだことはなかった。この問題は危うく断念して翌日に持ち越しかけたけれども、性格上それは無理で。64問目は今までの設問の中で一番調べものをしたかもしれない。これからもっと増えるだろうけど(汗)

 

最初に遭遇したのがプロセスのタイムアウト。その原因は:

 

encoding with 'idna' codec failed (UnicodeError: label empty or too long)

 

URI(Uniform Resource Identifier)の文字列を'IDNA'でバイト列にエンコーディングする際、Python上で"too long"と叱られてしまう。確かに最初に試していた文字列が長大で。

 

試行錯誤の末に、ここに助けられた:

PyMongo 3.5.1 Documentation — PyMongo 3.5.1 documentation

ここの<Authentication Examples>という項目を読んで解決にたどり着いた。

 

(結局、日を改めて問題と答えを照らし合わせてみると、問題文を正確に理解していなかったことがわかった。ついに日を跨がされたね。)

さらに問題は"insert_one( )"をイテレータで操作するとあまりにも時間がかかることが発覚したこと。もっともこの解決は簡単で、"insert_many( )"に切り替えて、長大なリストを一発放り込めば良いのだった。

そして、インデックスを作るという点が最大の誤解で、これをやり直しする必要があった。

 

答:

「アーティスト情報(artist.json.gz)をデータベースに登録せよ.」

f:id:DWJEqxs2G0:20170930122400p:plain

 

 

MongoDBをシェルで開いてデータベースの中身を一部表示させると:

 

f:id:DWJEqxs2G0:20170930122533p:plain

 

成功している・・

 

さらに、答:

「さらに,次のフィールドでインデックスを作成せよ: name, aliases.name, tags.value, rating.value

f:id:DWJEqxs2G0:20170930122639p:plain

 

インデックスを登録する際に"sparse"(まばら)を"True"としておくのがポイント。

 

指定したインデックスを使っていくつか検索してみると:

 

f:id:DWJEqxs2G0:20170930122804p:plain

 

f:id:DWJEqxs2G0:20170930122831p:plain

 

 

MongoDMにログインしてモニターを見ながら操作の進行を視覚化できるのが楽しかった。

f:id:DWJEqxs2G0:20170930123701p:plain

 

 

お世話になったページ:

Tutorial — PyMongo 3.5.1 documentation

Indexes — MongoDB Manual 3.4

Compound Indexes — MongoDB Manual 3.4

mongo Shell Quick Reference — MongoDB Manual 3.4