2013年2月16日土曜日

mozcユーザー辞書エディターとか作ってデータ構造とアルゴリズムをがさごそっと勉強しようか

このところ基本情報処理技術者とかC++の勉強をしているらしいでしへ。

ごちゃごちゃ前置きを書いても眠くなるので、まずはお題を置いておく。これから実際に取り組んで欲しい。


  • お題1: mozcのユーザー辞書バイナリーデータを解析せよ。
    • ヒント1-1: どうやら文字列はUTF-8で格納されている様だ
    • ヒント1-2: どうやら基本的には行構造のテキスト形式に何やらくっついている程度の様だ
    • ヒント1-3: ユーザー辞書ファイルは ~/.mozc/user_dictionary.db にあった。
      (但しWindowsで何処にあるかは知らない。)
    • ヒント1-4: バイナリーデータ解析はとりあえずVimなどのデータに堅牢なテキストエディターで開いてみたり(開いたあとに :e ++enc=utf-8 とするとUTF-8で表示できるし、Vinariseプラグインを導入すればバイナリーエディターとしても実用できるかもしれない)。
    • ヒント1-5: Windowsにもバイナリーエディター専用のソフトがあるので、何か適当に使ってみるのも良いかもしれない。
    • ヒント1-6: どんなデータがどんなセパレーターでどんなパターンで連続して格納されているのかを解析してプログラムで読み出したりして利用可能にできれば良いだろう。
  • お題2: mozcのユーザー辞書の内容を簡単で良いからとりあえずすべてコンソールに表示できるだけのアプリを作る。
    • ヒント2-1: このお題の目的はC++による文字列操作ファイル操作に慣れる事。
      • <string> std::string
      • <fstream> std::ifstream
      • <sstream> std::stringstream ※これはどちらかというとstreamの仲間である
      • <iostream> std::cout
    • ヒント2-2: このアプリは次に繋げる際に作りなおした方が楽なくらい大改修する事になるだろうから、ノウハウを得てこのソースは捨てるつもりで本当に簡単で必要最小限の表示に留めると良い。下手に凝っても後で面倒になるだろう。
  • お題3: 解析したmozcのユーザー辞書の内容をオブジェクト指向に基づいて保持できるデータ構造をC++で設計し、それを扱う為のライブラリーを"mozc_user_dictionary.hpp"などとして作成せよ。
    • ヒント3-1: mozcのユーザー辞書ファイルにありそうなオブジェクト
      • ユーザー辞書オブジェクト
      • エントリーオブジェクト
      • ほか
    • ヒント3-2: これは実際にこの後も使うからできるだけ綺麗な設計と実装を心掛ける事。
  • お題4: 先に作成したライブラリーを応用した素敵な実用アプリを開発せよ。コマンドラインでオプションを指定し、オプションに基づいて単発の仕事をする設計が良いだろう。
    • ヒント4-1: mozc辞書 --> TSV 標準出力
    • ヒント4-2: mozc辞書 <-- TSV 標準入力(挿入or更新)
    • ヒント4-3: std::sort アルゴリズムの応用
      (適用するだけなんだけど安定ソートについて学ぶこと)
    • ヒント4-4: std::unique アルゴリズムの応用
      (重複を除去する操作)
    • ヒント4-5: std::remove_if アルゴリズムの応用
      (条件を指定して除去する操作)
      • ある品詞だけ対象にするオプションの実装とか
さて、突然のお題だが、実際にやってみれば数日で何かしら得られるだろう。より具体的な助言などは取り組む様子などを見てまた書くとしよう。

なお、C++標準ライブラリーのSTLコンテナー群のデータ構造らと、<algorithm>に含まれるアルゴリズム群について、お題に実際に使うかは別としてもすべて最低でも1度は試したり比べたりして使ってみる事。その際、データ構造によって要素の挿入や削除や参照について、なぜそのデータ構造が生まれ、どうしてその様な特性が現れ、どういったアルゴリズムを多様する場合に適すだろうか考える事

0 件のコメント:

コメントを投稿