Perl製の自作暗記ツール「Carvo」のアップデート

Perlで書いた英単語学習ツール「Carvo(カルボ)」を久しぶりにアップデートしました。
GitHub - note103/carvo

README.mdおよびデモもようやく新しく。
carvo/README.md at master · note103/carvo · GitHub

gyazo.com

Carvoについてはこのブログでは、以前にこの辺に書いていますが(執筆順に)、
英単語学習ツール "Carvo" - 機能拡張&モジュール化してGitHubに公開しました - the code to rock
英単語学習ツール "Carvo" に得点加算機能を付けました - the code to rock
Carvo2の作成 / Perl入学式 in YAPC::Asia2014 - the code to rock
自作英単語学習ツール: "Carvo2" の最近の様子 - the code to rock

ようはゲーム感覚で英単語&その和訳にセットで触れてどんどん暗記していこう、みたいなやつです。
で、その際に一石二鳥的にというか、二兎追うものは一兎をも得ず的にというか、Perlの勉強も兼ねよう的な、というかどちらかと言うと8割型Perlの勉強になっているような感じですが、そういうものです。

さてしかし、久しぶりに、とは言ったものの何気に前回の更新は8月半ばぐらいで、直近の主要な変更はすでに反映され済みだったので、今回はそれ以降の掃除・整理的な作業というか、ここもうちょっと何とかしたい……みたいな課題をちょっとずつ解消した、みたいな感じではありました。

具体的には、勢いで作ってみたもののほとんど使ってない&使ってみるとバグだらけ、みたいなのが結構あって、そういう要素の棚卸しというか、不要な機能やコードを削って、必要なものは修正して、とかそういう。

大きめのところでは、以前にセーブ機能というのを付けて、これは単語リストが膨大な場合、それまではプログラムを終了するごとに記録がリセットされていたのを、セーブ&その時点から再開できるようにしたもので、それ自体は悪いものではないのだけど、ただそれは直近のセーブ記録しか残せない作りだったので、新たに個別に記録&再開時に指定すれば好きな途中経過からリスタートできる、という機能を付けてみたのだけど、やってみると普通にそんなの別に使わないというか、にもかかわらずえらい煩雑なコードになってしまったのでこれを外したり。

ちなみに、直近の変更のうち個人的にヒットだったのは、以前には日本語の語句だけが出てきて、それに対応する英単語を打ち込む、というスタイルだったのだけど、それだと同じ和訳に対して考えられる英単語が複数あった場合に、意味が合っててもカード上に設定している解答とズレていたら正解にはならない、という不毛さがよく生じたので、カード上の解答はこれですよ、ということを示す英単語の最初の数文字を問題文(和訳)と一緒に出るようにしたのだけど、これ凄い良かったなと。

で、今回の変更においては、そのヒント的な文字数を回答中でも自由に変更できる、としたり。そういう地味なのが多いですね。

地味といえばヘルプも作りまして。なぜと言って、けっこうその頭文字数設定変更も含めて、これまでの改造でいろいろできるコマンドを増やしすぎて自分でも何ができるのか忘れがちになってきたので、主に自分がすぐ思い出せるように、ということで。
f:id:note103:20151128032453g:plain

副次効果としては、それをREADMEにも丸コピ的に流用できて、README読むだけでも何ができるのか、そこそこわかりやすくなった感じがするので良かったなと。

ということで、概要はそんな感じですが具体的に何ができるのか以下に動画GIFを貼りつつ解説したいと思います。

自作解題

まずインストールから。今回はホームディレクトリに入れてみます。

$ cd
$ git clone git@github.com:note103/Carvo.git

ディレクトリに入って、carvo.plを実行。

$ cd Carvo
$ perl carvo.pl

cardディレクトリに入ってるサンプルデータがあるので、そこからs1というのを選択して、後は回答を打ち込んでいくだけです。
f:id:note103:20151128024802g:plain

sを押すと、一つ前の単語が出てきます。
f:id:note103:20151128024819g:plain

fを押すと、誤答した単語だけのモードに入ります。で、bで元の通常モードへ戻る。
f:id:note103:20151128024850g:plain

前述の、ヒントの文字数を減らすのはx+文字数で指定します。
f:id:note103:20151128024927g:plain

一旦抜けだして、もう一つのサンプルファイルへ。
f:id:note103:20151128024952g:plain

成績(hits & errors)も引き継いでいます。

セーブして(sv)、しばらく経った後にセーブ箇所へ復帰(rv)してみます。
f:id:note103:20151128025022g:plain

記録を残して終了するには、qqまたは、qでコース選択画面に戻ってからもう一度qで終わらせます。
ここではqqで終了してみましょう。
f:id:note103:20151128025044g:plain

23問に回答して、21問正解、2問間違えたようです。ちなみに、レッスン中に回答を打ち込まずにエンターで次へ進んだ場合には無回答とし、それらのカウントには含めていません。
これは積極的な誤答、つまり手を動かしてリスクを取っていくことに価値を見出したいという作者の意図によるもので、勉強において重要なのは間違える可能性を飲み込みながらトライを続けることなので、正答も誤答もカウント1。無回答はカウント無しです。

成績はdataディレクトリのlogs.txtとresult.txtに書き込まれます。
前者には回答内容を含む全ログ。後者には日時と正誤カウントのみが記録されています。

単語カードについて

上述のとおり、単語カードはcardディレクトリに入っていて、JSONで書かれています。
最初はPerlのハッシュで記述していましたが、JSONの方が汎用性はあるかな、と。ただJSONコメントアウトができないのがちょっとツライですね。yamlとかでもいいのかな……。

カードの内容について、実際に自分で使ってるやつはもっと何百語という多めの語句セットが入っているのですが、それはあちこちの書籍等から手作業で写して作ったものなので、著作権的にどうなのか、とか、自作なだけに間違いもあるだろうとか、いろいろ考えて簡便なサンプルのみ公開しています。

ただ、カードを作ることがまた勉強になる、とは言えるとしても、やはり必ずしも楽しい作業ではない(かもしれない)ので、そのうちしれっと手元にあるやつも公開しておくかもしれませんが。

また、最近ちょっと試しているのは、単に英単語&和訳を淡々と並べるのではなく、特定の書籍とか、映画とか、あるいは好きな洋楽の歌詞とか、そういう1テーマに沿ってカードを作るというもので。
とりあえず僕はここ数年のバイブル的な本、ダニエル・カーネマンの『ファスト&スロー』の原書から、自分の好きなチャプターの中の馴染みのない語句をピックアップして、カードにして最近繰り返しています。

ファスト&スロー (上)

ファスト&スロー (上)

連想記憶というかエピソード記憶的に、「あの話の中の単語だ」とか頭の中で結びつくので、なかなか記憶に定着しやすい効果があるのではないか、と思っています。(といってもまだそんなに実践していないので、後からやっぱり駄目だったとかなるかもしれませんが)

簿記編

英単語用Carvoについてはひとまず以上ですが、このコードを利用して、今年の4月から勉強を始めている簿記学習のための用語暗記ツールも作ってみました。
GitHub - note103/Carvo-bookkeeping-Oldie

gyazo.com

これはこれで、まだ作ったばかりで穴だらけというか隙だらけの代物ではあるのですが、簡単に説明すると、簿記では「売上」「仕入」「未払金」「法定福利費」のような勘定科目というのがあって、同時にそれらが属する「資産勘定」「費用勘定」といった勘定名があって、これらの組み合わせをちゃんと理解できているか(たとえば「売上」は「収益勘定」、「未払金」は「負債勘定」)、というのが前提的な基礎知識として必要だったりして、それを確実に自分の頭と体に染み込ませるために、上記のCarvoを部分的に書き換えてみました。

最初は単純に、英単語カードのバリエーションの一つとして簿記用の単語カードを作るだけで済むかなと思っていたのですが、けっこう微妙に仕様を変えざるを得ないところがあって、結局コード自体にやや互換性を損なう手を入れつつ別々のレポジトリで制作・公開しています。
が、今後の技術向上の次第によっては、もしかしたら上手く統合できることもある……かな……どうかな、とおぼろげに期待しています。(自分に)

まとめ&展望

上の説明は英単語編にしても簿記編にしても、考えていることややったことややりたいことのごく一部に過ぎないので(文字コードで何がどんだけハマったのか、とかのネタにも一切触れていない)、その辺についてはまた時間のあるときに&タイミングがあればまとめてみたいと思います。
というか本当に文字コードの処理とJSONモジュール、大変だった……。

あと、やればやるほどPerl、すでに基礎は押さえたつもりだったけど全然難しい……わからん……という瞬間もあれば、あれやっぱり結構理解できてるかも? とか思ったり、気分の浮き沈みが激しくてそれもなかなか相変わらず、つらくも楽しいものでした。
それであちこち検索して辿りついたのが僕にPerlを教えてくれたPerl入学式の方々(@xtetsuji さんや京都のあずまさん @azumakuniyuki など)の記事だったりして、とにかくPerl入学式の皆さんには普段からお付き合い頂いて仕事の長期超ピーク期を挟んでもモチベーションが保ててるという意味でも本当に感謝です。
Perl入学式 プログラミング初心者のためのPerl入門講座

そういえばそろそろPerl入学式Advent Calendarもスタートしますね。
qiita.com

それから一点、言い訳ですが上記レポジトリではいずれもテストがむちゃくちゃで……これは僕がテストをまだほとんど勉強してない(した記憶はあるのだけどほぼすっぽり頭から抜けた&身についてない)からで、今後の勉強にともないイイ感じにしていければ……と思っています。

Aftershow

今回のアップデートに際して繰り返し開いた本3冊。いつもお世話になっています。

Perl CPANモジュールガイド

Perl CPANモジュールガイド

kazhiramatsu.hatenablog.com

岡部先生のこれも少し。けど本書はまだ読みかけなのでとりあえず続き読まないと……。(現在指向している検定向きではないので後回しにしていた)

素人が書いた複式簿記

素人が書いた複式簿記

しかしプログラミング学習に際しては、専門書や入門書や各種ブログ記事も役立つけど、やっぱりマニュアルやドキュメントをきっちり読み込むことが何より第一ですね……文字コードやIOレイヤー周りでハマってそれを痛感した……。