最強のAnki用単語学習Cardを作った

はじめに 皆さん、Ankiは使っていますか? Ankiは、間隔反復学習システム(SRS)を採用した、非常に強力な暗記ツールです。 私も長年Ankiを愛用しており、特に語学学習には欠かせない存在となっています。 今回、私がAnkiで英語の語彙学習をするにあたり、「こんな機能があったら最高なのに…」と思う理想のカードタイプを形にし、 GitHubで公開しました。 この記事では、そのカードタイプ「Super Vocab」の紹介と、開発の経緯、そしてAnki/Emacsユー ザーには嬉しい、 anki-editor を使ったカード作成方法について解説します。 理想の単語カードに求める機能 私が単語学習用のフラッシュカードに求める機能は、以下の5点です。 双方向学習: 単語を見て意味を答えるだけでなく、意味を見て単語を答える、両方向の学習ができること。 意味→単語カードでの例文表示: 意味から単語を答えるカードでは、定義だけでなく、例文や用例も表示すること。 理由: 単語は例文や構文とセットで覚えることで、記憶に定着しやすくなる。 同義語の微妙なニュアンスの違いを理解し、区別して覚えられる。 ただし、例文中のターゲット単語は隠したい (ここがポイント!) 理由: 答えが見えてしまうとフラッシュカードの意味がないからカードの意味がないから。 単語→意味はシンプルに: 単語から意味を答えるカードでは、単語以外の情報は極力表示しないこと。 理由: 例文などがあると、単語の意味を推測できてしまい、フラッシュカード本来の目的(想起訓練)が損なわれるため。 簡単に単語を追加でき、経験と結びつけられる: 読書などで出会った単語を、その文脈(例文)ごと簡単にカードに追加できること。 理由: 自分の経験と単語を結びつけることで、より深く記憶に刻み込むため。 柔軟な情報追加: 発音記号、品詞、関連語、語源、メモ、ヒント画像など、単語に関するあらゆる情報を簡単に追加できること。 既存のカードとの比較、そしてSuper Vocab誕生へ AnkiWebを探しても、上記の機能を全て満たすカードタイプは見つかりませんでした。 特に、2番目と3番目の要件(文脈付きの意味→単語カードで、ターゲット単語を自動的に隠す)を満たすものは皆無でした。 Ankiの標準機能であるクローズ削除(穴埋め問題)を使えば、この要件に近いものは作れます。 しかし、例文が増えるほど手作業でのクローズ削除は大変です。 「JavaScriptなどを使って、自動的に単語を隠せないか?」 そう考えていた時、English vocab (note type) という素晴らしいカードタイプに出会いました。 このカードタイプは、まさに私が求めていた自動クローズ削除機能を備えていました! しかし、惜しいことに、上記の要件を全て満たしているわけではありません。 そこで、私はこの「English vocab (note type)」をベースに、自分の理想とする機能を全て盛り込んだ、究極の単語カード「Super Vocab」を作ることにしました。 anki-editorとEmacs、立ちはだかる壁、そしてPull Requestへ 私は普段、Ankiのカード作成にanki-editorというEmacs packageを使っています。 org-modeで構造化されたノートをAnkiに簡単に取り込める、非常に便利なツールです。 Super Vocabのカードタイプも、anki-editorを使ってEmacsからAnkiに送信しようとしました。 しかし、ここで問題が発生しました。 通常、anki-editorはorg-modeのノートをHTMLに変換してAnkiに送信します。 しかし、HTMLに変換してしまうと、Super VocabのJavaScriptによる自動クローズ削除機能が動作しなくなってしまうのです。 anki-editorには :ANKI_FORMAT: nil というオプションがあり、これを使うとHTML変換を無効にできます。 しかし、このオプションは全てのフィールドに適用されてしまい、カードの見た目(HTML/CSSによる装飾)も失われてしまいます。...

3月 17, 2025 · 1 分 · Kaoru Babasaki

emacs起動時の、 Project … cannot be read

問題 先日、いつものようにEmacsを起動すると、mini bufferに Project <プロジェクト名> at <プロジェクトのパス> cannot be read. と表示され、emacsがただの白い画面を写すソフトウェアになってしまいました。 少し前にこのプロジェクトのパスを変更したので、そのせいかと思い、 projectile-known-projects-file にあるプロジェクトのパスを変更/削除してみましたが、状況は変わりませんでした。 doom sync や doom upgrade なども試しても、解決しませんでした。 解決策 試行錯誤の結果、原因はなんと、treemacs にあることがわかりました。 treemacsは、セッション情報を、 treemacs-persist-file (通常は user-emacs-directory/.cache/treemacs-persist)に保存するのですが、 その名の通り、treemacs_persistがpesistしていたのが原因だったようです。 そのため、 rm ~/.config/emacs/.cache/treemacs-persist # pathは環境によって異なる で解決することができます。 自分はtreemacsを入れておきながら、全然使ってなかったので、treemacsをinitファイルから削除しました。 今回は以上です。 参考 Project .emacs.d at User/x.emacs.d cannot be read. · Issue #586 · Alexander-Miller/treemacs

2月 23, 2025 · 1 分 · Kaoru Babasaki

Server julia-ls starting exited (check corresponding stderr buffer for details). Do you want to restart it? (y or n) の解決策

問題 先日久々にemacsでjuliaを使おうとしたら、 Server julia-ls:50759/starting exited (check corresponding stderr buffer for details). Do you want to restart it? (y or n) のようなmessageが(y を押しても繰り返し)出てきて、lspが起動しませんでした。 これを直すのにそこそこ時間がかかったので、emacsでjuliaを使っている方 (果たして日本に何人いるのか…) のために解決策をメモしておきます。 解決策 lsp-julia のビルド済みファイルが格納されているディレクトリの中にある Project.toml (自分の環境では ~/.config/emacs/.local/straight/build-29.4/lsp-julia/languageserver/Project.toml ) が実体のあるファイルではなく、シンボリックリンクであることが原因でした。(理由はよくわからない) そのため、シンボリックリンク先のファイル(自分の場合は /.config/emacs/.local/straight/repos/lsp-julia/languageserver/Project.toml)をコピーして、直接のファイルを同じ場所に作成することで解決しました。 参考 language server crashes · Issue #66 · gdkrmr/lsp-julia

1月 29, 2025 · 1 分 · Kaoru Babasaki

『Pythonではじめる時系列分析入門』のorg version repoを作ったよ

最近、 馬場 真哉 (著) 『Pythonではじめる時系列分析入門』という本を読みました。 この本はpythonのコードを手で動かしながら時系列分析の基礎を学ぶことができる本で、とてもためになりました。 特にsktimeという、トレンド・季節性の除去などの前処理や予測モデルをsklearnのように簡単にpipeline化できるライブラリを知ることができた点がよかったです。 馬場先生はこの本の公式リポジトリを公開されているのですが、pythonコードがjupyter notebook形式で書かれているため、heavy emacserの私としてはどうしてもorg-modeを使いたくなってしまいました。 そこで、この本のコードをorg-mode形式に変換したリポジトリを作成しました。 リポジトリのリンク このリポジトリを使って、emacsユーザーの方々がこの本を読む際に、jupyter notebookを使わずにorg-modeでコードを実行できるようになればと思います。 特にないと思いますが、このリポジトリを使って何か問題が発生した場合は、pull requestやissueを送っていただけると助かります。 時系列分析勉強中のemacsユーザーは私に感謝したうえで今年のクリスマスは家族と過ごしてください。 読んでいただきありがとうございました。

12月 22, 2024 · 1 分 · B.Kaoru

emacsをupgradeしたらankiの数式が汚くなったので直した

導入 こんにちは。 私は日頃からanki-editor を使ってAnkiのカードを作成しているのですが、 Emacsをupgradeすると、数式が汚く表示されるようになってしまいました。 症状としては、 デスクトップ版のAnkiのBrowserで各Fieldのプレビューで数式が数式として表示されない (plain latex codeとして表示される) 数式がpng画像として表示される (もともとはMathJax inlineで表示されていた) というものでした。 デスクトップ版のAnkiでcardを編集することはほぼないので、1の症状についてはまだ許容範囲でしたが、 2のほうについては、数式の解像度だけ低くなったり、他の文字とのサイズが合わなくなったりして、かなり気になりました。 解決策 以下を config.org に追加することで解決しました。 (use-package! anki-editor :after org :init (setq-default anki-editor-latex-style 'mathjax)) この解決策に至った背景 anki-editor でpushされたカードは、HTMLに変換された状態でカードとして保存されます。 うまく数式が表示されるカードのHTMLを見ると、数式は以下のように anki-mathjax というタグで囲まれていました。 <anki-mathjax block="true">1 + 1 = 3</anki-mathjax> 一方、今回の問題が発生したカードのHTMLを見ると、数式は以下のように p タグと [$$] で囲まれていました。 <p>[$$] 1 + 1 = 3 [/$$]</p> したがって、anki-editorがorgテキストをHTMLに変換する部分で、問題が発生していることがわかりました。 anki-editor.el の中を見てみると、以下のように anki-editor-latex-style という変数によって、latexのスタイルを変更できるようになっており、今回の解決策に至りました。 (defun anki-editor--translate-latex-env (latex-code) (setq latex-code (replace-regexp-in-string "\n" "<br>" (org-html-encode-plain-text latex-code))) (cl-ecase anki-editor-latex-style (builtin (concat "[latex]<br>" latex-code "[/latex]")) (mathjax (concat "\\[<br>" latex-code "\\]")))) 読んでいただきありがとうございました。...

11月 24, 2024 · 1 分 · Kaoru Babasaki

ox-htmlで\bmなどのlatexマクロを使う方法

問題 \bm{a} 上の数式を書いたorg fileは、latex(pdf)へのexportであれば \usepackage{bm} とセットで斜体太字になるところ、 ox-html で単にHTMLとして exportしただけではlatexマクロとして認識されなかったので、その対処法を解説します。 latexによる数式をHTML上で表示する場合、MathJaxというライブラリを使うことが一般的であり、今回の問題も \bm をMathJaxでマクロとして認識させることで解決できます。 このQiita記事がまさにそれをやっていたので、それを参考にまず以下の方法を試してみました。 最初に試した方法 以下のブロックをorg fileに追加しました。 #+BEGIN_EXPORT html <script> MathJax = { tex: { macros: { bm: ["\\boldsymbol{#1}", 1], }, } }; </script> #+END_EXPORT 結果、 \bm はうまく斜体太字になったが、 \eqref{} など他のlatexマクロが逆にうまく表示されなくなってしまうという問題が発生しました。 解決策 よく調べてみると、 ox-html の変数に、 org-html-mathjax-template というものがあり、そこにMathJaxの設定を書き込むことで、latexマクロをHTML上で認識させることができることがわかりました。 テコちゃんのconfigを参考に、以下の設定config.orgに追加することで解決しました。 (setq org-html-mathjax-template "<script> window.MathJax = { loader: { load: ['[tex]/mathtools'], }, tex: { ams: { multlineWidth: '%MULTLINEWIDTH' }, tags: '%TAGS', tagSide: '%TAGSIDE', tagIndent: '%TAGINDENT', packages: {'[+]': ['mathtools']}, macros: { RR: ['\\\\ifstrempty{#1}{\\\\mathbb{R}}{\\\\mathbb{R}^{#1}}', 1, ''], NN: ['\\\\ifstrempty{#1}{\\\\mathbb{N}}{\\\\mathbb{N}^{#1}}', 1, ''], ZZ: ['\\\\ifstrempty{#1}{\\\\mathbb{Z}}{\\\\mathbb{Z}^{#1}}', 1, ''], QQ: ['\\\\ifstrempty{#1}{\\\\mathbb{Q}}{\\\\mathbb{Q}^{#1}}', 1, ''], CC: ['\\\\ifstrempty{#1}{\\\\mathbb{C}}{\\\\mathbb{C}^{#1}}', 1, ''], bm: ['\\\\boldsymbol{#1}', 1], ;; <- ここに\bmの設定を追加 EE: '\\\\mathbb{E}', Lap: '\\\\operatorname{\\\\mathcal{L}}', Var: '\\\\operatorname{Var}', Cor: '\\\\operatorname{Cor}', E: '\\\\operatorname{E}', }, mathtools: { pairedDelimiters: { abs: ['\\\\lvert', '\\\\rvert'], norm: ['\\\\lVert', '\\\\rVert'], ceil: ['\\\\lceil', '\\\\rceil'], floor: ['\\\\lfloor', '\\\\rfloor'], round: ['\\\\lfloor', '\\\\rceil'], } } }, chtml: { scale: %SCALE, displayAlign: '%ALIGN', displayIndent: '%INDENT' }, svg: { scale: %SCALE, displayAlign: '%ALIGN', displayIndent: '%INDENT' }, output: { font: '%FONT', displayOverflow: '%OVERFLOW' } }; </script> <script id=\"MathJax-script\" async src=\"%PATH\"> </script>") これでどんなlatexマクロもHTML上で認譫させることができますね!...

11月 18, 2024 · 1 分 · Kaoru Babasaki

ox-hugoのreferenceがうまく表示されない問題

問題 Org Cite Citationsを使って #+print_bibliography: でreferenceを表示しようとしたが、“References"というヘッダのみが表示され、referenceのリストが表示されなかった。 content/ の中のmdファイルを見ると、htmlとして、referenceのリストが書き出されていたが、 public/ の中のhtmlファイルを見ると、referenceのリストが表示されていなかった。 よって、 org -> md -> html という変換の md -> html の部分で問題があると考え、調べてみると、同じ問題についてのissueが立っており、以下の解決策にたどり着いた。 解決策 config.tomlに [markup.goldmark.renderer] unsafe = true を追加することで解決できる 自分の場合はymlを使っていたので、以下のように設定した。 markup: goldmark: renderer: unsafe: true 解説 Goldmark — ox-hugo - Org to Hugo exporter で書かれているように、 Hugo v0.60.0以降、デフォルトのMarkdownパーサーはCommonMark準拠のGoldmarkに変更された。 以前のデフォルトパーサーであるBlackfridayは、仕様に準拠しておらず、多くのバグを抱えていたらしく、ox-hugoを使い続ける場合は、特別な理由がない限り、Goldmarkに移行することが推奨されている。 ただし、Goldmark/Hugoには、Blackfridayと比較してMarkdownのパース方法にいくつかの問題があり、 その一つが、今回の問題である、インラインHTMLがうまく表示されないというものっぽい。 この解決策によって、Markdown内でインラインHTML を使用できるようになるということらしい。

11月 12, 2024 · 1 分 · Kaoru Babasaki