Skip to content

Instantly share code, notes, and snippets.

@rubyu
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rubyu/ae5525b4c8d22fe8d093 to your computer and use it in GitHub Desktop.
Save rubyu/ae5525b4c8d22fe8d093 to your computer and use it in GitHub Desktop.

Ankiのデッキを作るツール(概案)

この文書は、現在私が設計しているソフトウェアについての概案です。現在のところ架空のプログラムですので、雲をつかむような話ではありますが、ご意見ご感想、ご指摘、あるいはバグ報告(!)など頂けたら大変嬉しいです。

@ruby_U

名前

ad-update

概要

任意の外部プログラムを実行した結果を、tsvファイルの任意の列に書き込むツールです。 例えば、語学学習向けのデッキを構築する場合、単語を改行で区切ったテキストファイルから出発して、 語義 音声 画像 頻度順位 関連語 関連語の語義 ... などからなるフィールドを追加して、Ankiのテンプレートでビューに合成して使用することを想定しています。

使用例

ファイル、出力列、コマンドを指定して、デッキを作る

指定されたdecknameの0番目の列のデータをソースとして、commandを実行し、結果をcolumnのデータとして保存します。

deckname = デッキ名

column = 出力先の列番号

row = 出力先の行番号(optional)

--exec = ここから後ろを実行するコマンドだと認識するフラグ

command = 外部コマンド

ad-update deckname column [row] --exec command

出力フォーマット(html, image, audio)を指定して、デッキを作る

htmlならばデータをそのままutf-8のテキストデータとして保存し、imageまたはaudioなら、データはdeckname.mediaディレクトリに書き込み、そのファイルを参照するhtmlを保存します。

--output-format format = 出力のフォーマット{html, image, audio}(default=html)

ad-update [--output-format format] deckname column --exec command

####必要があれば拡張子を指定できる

出力フォーマットがimageまたはaudioの場合、拡張子を自動判別しようと試みます。失敗した場合、データは保存されません。拡張子は明示的に指定することができます。

--output-ext ext = 出力の拡張子(default=自動検出)

ad-update [--output-format format] [--output-ext ext] deckname column --exec command

入力ソース(デッキの指定列)を指定して、デッキを作る

デフォルトのソース(列番号0)以外の列をソースとして指定します。語の揺らぎを吸収したり、あるいは語とその関連語からデッキを生成する場合に便利です。

--source column = 列番号(default=0)

ad-update [--source column] deckname column --exec command

問い合わせなしに実行する

--yes = 全ての問い合わせにyesと答えるフラグ

ad-update --yes deckname column --exec command

既にデータが存在する場合に上書きを行う

既にそのセルにデータが存在する場合、デフォルトではデータは上書きされません。このフラグを指定することで、既にデータがセルに存在するかどうかに関わらず、全てのセルにデータを書き込みます。

--overwrite = セルにデータを上書きするフラグ

ad-update --overwrite deckname column --exec command

外部プログラム

外部プログラムは任意のものです。外部プログラムは標準入力からデータを受け取り、処理をして、標準出力にデータを出力する必要があります。

ソースがあるリスト内の何番目に位置するかを返す

語の頻度順位などをデッキに追加できると便利です。

rank = grep -Fc -f list | sed -e "s/:.*//"

ad-update deckname column --exec rank some.txt

ソースの関連語をWordNetから取得してN番目のデータを返す

ある語の関連語が取得できれば、さらに強力なデッキが作成できます。(英和辞典などから取得するよりはこちらのほうが簡単で精度が高そうです)

wordnet = WordNet(http://ja.wikipedia.org/wiki/WordNet)のデータを検索するプログラム

ad-update deckname column --exec wordnet  ...  --type syn n

ソースのタグ情報をリストから生成する

タグA.txt = 単語を列挙したリスト

タグB.txt = 単語を列挙したリスト

tags-from-list = 単語を列挙したリストからタグ情報を返す

ad-update deckname column --exec tags-from-list タグA.txt タグB.txt ...

ソースを引数で与える

標準入力に対応しないプログラムにも対応できます。

{{source}} = ソース

ad-update --source none deckname column --exec command {{source}}

その他の情報を引数で与える

{{dir}} = デッキが存在するディレクトリ

{{media-dir}} = デッキの.mediaディレクトリ

ad-update --source none deckname column --exec command {{dir}}
ad-update --source none deckname column --exec command {{media-dir}}

標準入力を使用しない

標準入力を無効にしたい場合、複数の外部プログラムを組み合わせて実現できます。複数の外部プログラムについては後述します。

mute = 何もしないコマンド

ad-update none deckname column --exec mute ^| command

複数の外部プログラムを組み合わせて出力を生成する

|によるパイプ(以下ではWindows環境でのエスケープを含めて^|と表記)をサポートするので、複数の外部プログラムを組み合わせて出力を生成できます。例えば、grep, sed, awk などを使って、既存のCUIツールによる、出力の柔軟な加工が可能になります。

コマンドAの出力をコマンドBにパイプする

ad-update deckname column --exec command-A ^| command-B

ソースがあるリスト内に存在するときだけ処理を行う

ある語について、なにか特別な処理をしたい場合に便利です。

filter = grep -F -f list

ad-update deckname column --exec filter some.txt ^| command

EpwingのHTMLを変換して出力する

ad-update deckname column --exec ebquery ... ^| sed ...

Epwingの音声を変換して出力する

wavからmp3に変換したり。

ad-update --output-format audio deckname column --exec ebquery ... ^| xmllint ... ^| base64 ...  ^| ffmpeg ...

Epwingの画像を変換して出力する

画像のクオリティ・サイズを変更したり。

ad-update --output-format image deckname column --exec ebquery ... ^| xmllint ... ^| base64 ...  ^| convert ...

テスト

出力を確認する

commandを実行した結果は保存されず、コンソールに出力されます。

--test = コマンドを実行した結果を標準出力にバイパスするフラグ

ad-update --test deckname column [row] --exec command

テストする

test-equal = 与えられた値と、入力が一致してしない場合にエラーメッセージを出力する

test-match = 与えられたパターンに、入力が一致してしない場合にエラーメッセージを出力する

ad-update --test ... --exec ... ^| test-equal value
ad-update --test ... --exec ... ^| test-match pattern

あるいは、エラーを集約しておいて、エラーが無ければテストをパスしたと判断したり?

FOR %I in (errors) DO (IF %~zI EQU 0 ECHO Test Passed!)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment