英単語学習ツール "Carvo" - 機能拡張&モジュール化してGitHubに公開しました

少し前にこのようなブログ記事を書きました。
英単語の学習用スクリプトを作った - the code to rock

Perlでif文とかfor文とかを使って英単語の学習用プログラム作れるんじゃないか、やってみよう、という風に作ったものですが、これちょっとパッケージ化というかモジュール化してみたいな、なんならテストとかも作ってみたいな、と思って、作ってみました。
note103/Carvo · GitHub

で、READMEにも載せましたが、動画キャプチャも作ってみました。
f:id:note103:20140606231022g:plain

この動画はあれですね、ひとつ前の記事でもチラッと書きましたが、先日の GitHub Kaigi のRebuild.fm の生放送で @miyagawa さんが紹介されていた LICEcap をそのままさっそく(たぶん翌日の深夜ぐらいに文字通り目をこすりながら)使ってやってみたもの。
GitHub Kaigi の感想 #githubkaigi - the code to rock
Cockos Incorporated | LICEcap

何回ぐらいだろう、とりあえず10回ぐらいは撮り直したんだけど、それでもけっこう粗いですが。あと、その後にもソースコード手直ししているので実際には今実行するとところどころ出てくる文言(もんごん)とか違うと思うのですが、まあ、ヨシとします。

詳細については、README.mdけっこう頑張って作ったので(それでも同じ深夜に作ったので粗いですが)そちらで。
https://github.com/note103/Carvo/blob/master/README.md

今後こんなふうに展開したい、みたいのはTODOにまとめてみました。
最初はIssuesに入れていたのですが、基本サムデイリストみたいな感じだったので、これIssue一生閉じないんじゃ・・みたいになってふさぎ込みそうだったのでそれはやめて。
https://github.com/note103/Carvo#todo

最初に、「こんなことできたらいいな」と思ったことは結構あっさりできて、そうするとでも、「これじゃ不便だ、この方がいい」とか、なんというか自分で自分にさらなる試練を課す、みたいになって、でもそれもなんか知らんけどクリアできてしまったりして(ランダムで語句を出すとか、エンターで次の語に行くとか、英語から日本語を当てるだけだったのが逆もできるようになるとか、たぶん次には得点を加算するとかやりたいしできそう)、あれ・・俺、作れてるじゃん、みたいになってそれが嬉しいです。
自分で立てたハードルを自分で飛ぶ、というのは何だかよいものです。

名前について

このプログラムの名前、最初は、「EnglishWordsLesson.pm」とかにしていました。
それでしばらくやってて、まあでもそれだといろいろコマンドなど打ちづらいので「EWL.pm」にしたりとか。
で、そのうちに、そろそろできた感じだからじゃあGitHubにあげるかーとかなったときに、でもリポジトリ名どうしようか、と、他の先輩たちの例を見ると、なんか「EWL」とか「EnglishWordsLesson」とかはナイ感じだよなあ・・と。まあ、多少無難に倒して「english-words-lesson」とか・・?

たしかに、それならまだ周りに迷惑とかはかけない感じもしたけど、んー、でもそれって面白いのか?? とか、あとなんか先人の活動を見ていると、こういうのってもしかして、なんというかツールの名前を、その機能を象徴するようなところも絡めて造語的に作ってしまう、とかのほうがいいのかな? と思って(Carton とか Starman とか Yomico とか Otogiri とか kaminari とか idobata とか)、んーだったらなにがあるかな・・このツールって何なんだそもそも・・と考えて。

元々の「English Words Lesson」っていうのは、自分の意図としてはまったくそのとおりなんだけど、よくよく考えると、このツールって別に英単語&その和訳に限らなくて、スペイン語→中国語とかでも全然使えるんだよなあ、と。
中学生のときとかに、リングの付いた単語帳をペラペラめくっていたみたいな、ああいう単語帳のイメージだよなあ、と思って、だからEnglishとかはとりあえずナシで(そこに限定せず)、語彙のカードたち。Cards of vocabulary だなと。そっから造語的な何か・・ちょっとPOPな感じの・・とかで、おお「Carvo」いいじゃん、なんかクルマの名前みたいで。手触り感ヨイ!と思ってそれにしました。

展望

地味なTODOとしては、これ2〜3階層ぐらいのwhile文を回しているので、深いところから抜け出るにはその旨のコマンドを最大3回叩かなきゃいけなかったり、それが面倒なら < C-c > しなきゃいけないので、qqとかで一発で抜けれるようにしたいな、とか、
あとはちょっと先の話かもしれないけど、ターミナルで起動したらそのままローカルなブラウザでどんどん出来るとか、それがデータベースに記録されるとか複数マシンでもその記録が共有できるようになるとか、あとはもちろんモバイルデバイスからもできるとか、だったらSwiftの勉強もかねてそれやるか、とか展開はいろいろ考えられそうです。

ただまあそれ以前の問題というか何というか、テストもモジュールのあり方も現状はあくまで「ごっこ」的というかナンチャッテな感じなので、その辺も洗練させていきたいところですが。なんというか・・ハリボテ感すごいので。でもまあ、それでも書きなぐりGist(ジストと読むらしいfrom GitHub Kaigi知見)からこうして機能拡張&展開させたのは我ながらいいじゃん、とも思っています。

以上です。

英単語の学習用スクリプトを作った

はじめに

最近は仕事、家事、プログラミング関連の読書、英単語、という四重奏で毎日が過ぎていきます。
なかでも仕事は心身ともにそれなりにハードで(当社比)、とくにメンタル的にきついのをプログラミングとか英語とかの全然関係ないことをすることでバランスとってる感じです。

そんな中、上記のように英単語を覚える、というのをダラダラやっていますが、ターミナル(というかiTerm2)に英単語が出てきて、それに回答を入れると正誤を判定してくれる、というスクリプトを、書こうと思えばif文とかで普通にできるんじゃないか、と思って英語の勉強よりそちらをやりたくなったので作ってみました。

久しぶりにGistに上げてみました。
英単語学習用のPerlスクリプト

すごいイナたい感じですが、一応用は足りてるのでまあヨシとしています。

使い方

任意のディレクトリで実行します。

$ perl english_words_lesson.pl

すごい長いファイル名ですが、手元ではewl.plとかにしています。

実行すると、こんなのが出てきます。
f:id:note103:20140527231940p:plain

Input a number or a word.

ということなので、番号を入れます。「55」とか。
f:id:note103:20140527232048p:plain
エンターを押すと単語が出てきます。これは単語リストのハッシュ「%english」の55行目ぐらいにあたります。(実際は多分56行目)
f:id:note103:20140527232630p:plain
「apologize」が出てきました。これって・・「謝罪」とかだっけ、と思って書き込みます。
f:id:note103:20140527232110p:plain
エンター!
f:id:note103:20140527232740p:plain
「NG!」だそうです。何だろ・・わからないな、ギブ!と思って今度は何も入力せずにエンター。
f:id:note103:20140527232749p:plain
「謝る、弁明する」か・・って合ってるじゃん!と思いますが、まあ一語一句合ってないと駄目、という仕様なので。

次、単語を入れてみます。「add」とか。
f:id:note103:20140527232803p:plain
エンター!
f:id:note103:20140527234548p:plain
「add」はここにあります(Here is 'add')、と出ます。つまり登録していない単語もあるので、そういう流れにしています(非登録の単語を入力するとその旨のエラーメッセージを出す)。

日本語で何? と出ているので(この英語も微妙ですが)「追加」と入れてみましょう。
f:id:note103:20140527232937p:plain
エンター!!
f:id:note103:20140527233111p:plain
またも「NG」です。いや、「追加」だと思うけど・・しょうがないのでギブします。
カラでエンター。
f:id:note103:20140527233002p:plain
「を加える」だそうでした。まあ、だから近い言葉とかは拾いません。

ということで、これを延々と繰り返します。
Gistには10語ぐらいしか載せていませんが、実際には現状1016語の英語&日本語の組み合わせを登録してあるので、けっこう楽しいです。

上では説明していませんが、数字(番号)の代わりに「s」を入力すると直近の単語がもう一度現れて復習できますし(sameのs)、「r」を押すとランダムな単語が出てきます。
「n」を押すと直近で出てきた次の番号のもの(next)が出てくるようにしていますが、基本的に番号順に出てきてほしいことが多いので答え合わせが終わった後にはわざわざ「n」を入力しなくてもエンターでどんどん次の登録単語が出てくるようにしています。(79行目あたり)

飽きた、疲れた、等でやめたいときには「q」か「d」を入力して、エンターします。(qは「quit」、dは押しやすいのと Ctrl+d のイメージで)
f:id:note103:20140527233126p:plain
Bye! と出ます。

展望

今後の目標というか楽しみとしては、今はひとつのPerlスクリプト(.pl)に単語のデータもコードも一緒くたにしてるので、これは分けた方がいいんじゃないか、とか。
あとは瑣末なことですが現状、日本語から英単語を逆引きできないとか(ハッシュのkeyからvalueを特定することはできるけどvalueからkeyを引っ張る方法がわからない)、あるいはさらに瑣末なことに、単語からそれに紐付いた番号を抽出できない(配列の添字から値を特定することはできるけど値から添字を抽出する方法がわからない)とかあるので、その辺も実装できると良さそうです。

ゆくゆくはデータベースを使ってWebアプリにするとか、あるいはiOSアプリにしてモバイル環境でも使えたりするとさらに楽しそうですが、ターミナルでサクサク動かせる楽しさを損なわずにそこまで出来たら大したものですね。できたら良いのですが。

そういえばその後、似たような方式で、日付を入れたらその曜日が出てくる、というスクリプトも作りました。
日付を入れて曜日を出すPerlスクリプト

これもまた単語同様、日付&曜日をハッシュのキー&バリューで設定していますが、このデータをどう扱えばカッコよくなるのか、というのが洗練のしどころの初めの一歩では、と考えています。