かおるのブログへようこそ

emacs, julia, ベイズ統計などについて書いてくよ

Hoff解答例サイト、軽量化したら(?)検索順位が上がった話🚀

TL;DR (要約) 修士のときに作り、今もめちゃくちゃスローペースで更新している A First Course in Bayesian Statistical Methods/標準 ベイズ統計学 の章末問題解答サイト。 先日、サイトを少しアップデートだけで、 Google検索で全くヒットしなかった状態から上位に出てくるようになった ので、やったことをメモします📝 サイト改善のきっかけ: 「検索結果に全く出ない」 このサイト、修士時代に修士論文の次に力を入れて作ったもので、標準ベイズ統計学の読者からの需要はそこそこにあるんじゃないかと思っていました。 ところが どんなキーワードで検索しても、 全く ヒットしませんでした😭 例えば… hoff bayes exercise 標準ベイズ 解答 などでGoogle検索しても、検索結果の 最後のページ にすら出てこない…。 図1: Google検索結果のナビゲーションバー。oの数がページ数を表すっぽい…知らなかった 順位が低いならまだしも、候補にすら挙がらないのは流石におかしいのでは?と思い、「もしかしてサイトが重すぎる…?」 と仮説を立て、軽量化してみることにしました やったことリスト🛠️ 具体的にやったことは以下の通りです。 サイト構造の大幅変更 (軽量化) Before: トップページに全章(2~10章、当時54問!)の解答を掲載 After: 各演習問題ごとにページを分割 SEO基本対策 各ページに keyword, description を追加 robots.txt を設置 (クローラーに対する指示🤖) sitemap.xml を生成・設置 (サイトの地図🗺️) 結果発表!劇的ビフォーアフター✨ サイト改善の効果は、PageSpeed Insights のスコアに如実に現れました 指標 Before 😱 After 🚀 改善度 Performance 51 97 +46 ポイント Largest Contentful Paint 1....

5月 3, 2025 · 1 分 · Kaoru Babasaki

Doom Emacs & Mac へのSKK導入ガイド

この記事で分かること SKKとは何か AquaSKKのインストールと設定方法 Doom EmacsでのSKK(ddskk)の導入方法 SKK導入における障壁とその解決方法 SKKを長期間使用した感想と評価 SKKとは SKK(Simple Kana to Kanji conversion program)は、日本語入力システムの一種です。 一般的なIMEとは異なり、入力モードの切り替えが明示的で、変換候補を選ぶ際にも独特の操作方法を持っています。 特徴として: 変換時に送り仮名を明示的に指定する 辞書が自己学習し、使うほど自分専用の辞書になっていく キーボードから手を離さずに日本語入力ができる が挙げられます。 SKKとわたし 昨年8月に参加した東京Emacs勉強会 サマーフェスティバル2024 でSKKの存在を知り、そこでSKKをちょっと使ってみるも、何が良いのかわからず、いつのまにか存在を忘れる 約2ヶ月後の東京Emacs勉強会 オクトーバーフェスティバル2024 で再度SKKの話題になる。 参加者の過半数がSKKを使用しており、その空間ではSKKを使っていない方がマイノリティであることを知り、すぐにSKKを導入。全然思うように使えず、生産性が爆下がりする しかし、日本のEmacser多くの方々が使っているからには、何かしら良いところがあるはずだと考え、キーボード自体の設定を変えたりしながら、徐々にSKKに適応していく 使い始めてから5ヶ月ほど経ち、SKK関連の設定も安定。試行錯誤の結果の設定を共有したいと思いこの記事を書くに至る AquaSKKの導入 インストール Homebrewを使って簡単にインストールできます: brew install --cask aquaskk です。 nix&flake&home-managerを使っている方は、以下を適切にimportするとインストールできます: homebrew.casks = [ "aquaskk" ]; 基本設定 こういうのは基本的にデフォルトのままで使いたい派の自分ですが、日本語入力の切り替えキーだけは変えました。 AquaSKK/keymap.conf: - SKK_JMODE ctrl::j + SKK_JMODE ctrl::shift::j (理由は後述します) 設定の同期 複数のデバイス間で辞書やキーマップの設定を同期させるために、AquaSKKのディレクトリをDropboxに配置し、 ~/Library/Application Support/ 内にシンボリックリンクを作成しました: ln -s ~/Dropbox/AquaSKK ~/Library/Application\ Support/AquaSKK Macのデフォルト入力切替キー無効化 以下の記事で解説されているように、MacのデフォルトのIME切り替えキーを無効化することを強くお勧めします。 SKKを使う上で非常に重要な設定です: Mac で AquaSKK を Ctrl+Space で切り替えなくても良くする方法...

4月 12, 2025 · 2 分 · Kaoru Babasaki

emacs の indirect buffer が便利だった

Emacsを使っていると、「このファイルの一部だけを別のウィンドウで編集したい…」「同じ内容だけど、表示モードを変えて見比べたい…」と思うことはありませんか? 自分は、よくありました。 そんな時に発見して感動した機能が、 Indirect Buffer です! この記事では、Indirect Bufferの基本的な概念から、使い方、注意点までを解説します。 Indirect Bufferとは? Indirect Bufferは、Emacsの特殊なバッファの一種で、別のバッファ(ベースバッファ と呼ばれます)の内容を「共有」するものです。 ファイルシステムのシンボリックリンクのようなもの、と言えばイメージしやすいかもしれません。 内容の共有: Indirect Bufferは、ベースバッファのテキスト内容(文字だけでなく、文字の色やフォントなどの テキストプロパティ も含む)を完全に共有します。一方での変更は、もう一方に即座に反映されます。 独立性: 内容は共有しますが、それ以外の点(バッファ名、カーソル位置、表示モードなど)は、Indirect Bufferとベースバッファでそれぞれ独立して設定できます。 ファイルとの関連: Indirect Buffer自体はファイルを直接開きませんが、ベースバッファはファイルを開くことができます。Indirect Bufferを保存しようとすると、実際にはベースバッファが保存されます。 Indirect Bufferの作り方 自分が調べた限りでは、 Indirect Bufferを作成する方法は、以下の3つでした。 M-x make-indirect-buffer: より汎用的な作成方法です。 ミニバッファを使って、ベースバッファとIndirect Bufferの名前を指定します。 M-x clone-indirect-buffer またはdoom emacs で SPC B c (clone-indirect-buffer-other-window または SPC B c): 現在開いているバッファをベースバッファとするIndirect Bufferを、素早く作成する方法です。 SPC B c は、新しいウィンドウでIndirect Bufferを開きます。 (org-mode内で) M-x org-tree-to-indirect-buffer (z n): 現在の subtree をIndirect Bufferとして開きます。 M-x doom/widen-indirectly-narrowed-buffer (z N)で、元のバッファに戻る 個人的には、1の方法は全く使わず、 2と3をよく使います。 手軽にIndirect Bufferを作れて、とても便利です!...

3月 28, 2025 · 1 分 · Kaoru Babasaki

最強の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

Hoffの解答例のサイトのソースコードを公開しました

Hoffの演習問題の解答例のソースコードを公開しました: GitHub このサイトはちょうど2年前に公開し、少しずつアップデートしてきたものです 今までは、間違いやtypoを見つけたらメールで連絡して欲しいとサイトに書いていましたが、結局そのような連絡は2年間で1度も来たことがありませんでした😭 (海外の研究者の方から感謝のメールをいただいたことはあり、それはとても嬉しかったです) なので、もしかしたらgithubのissueやPRだと気軽に連絡してもらえるかもしれないと思い、公開しました これからは 11章以降の演習問題の解答例を追加 日本語と英語が混在しているので、英語版と日本語版をちゃんと分ける julia で書いた教科書本文中のコードをrepoに追加 などをしていきたいと思います

1月 28, 2025 · 1 分 · Kaoru Babasaki

Advent of Code 2023 1日目

明けましておめでとうございます。 昨年の年末、とある理由で2023 のAdvent of Code をちょっとずつ解いていたので、自分の解答や、ちょっとしたメモを残していこうと思います。 なお、全部pythonで書いています。 全部解き終わったタイミングで、まとめてgithubにあげようかなと考えていますが、いつになるかはわかりません。 それでは、早速Day 1 の解答を書いていきます。 Part a 問題の概要 数字と文字が混ざった文字列が与えられる。 この文字列のそれぞれの行に含まれる最初の数字と最後の数字を取り出し、それらを結合した数値を求める。 例: 1abc2 → 12 pqr3stu8vwx → 38 a1b2c3d4e5f → 15 treb7uchet → 77 課題は、与えられた入力ファイルの全ての行について、この方法で校正値を求めて合計することである。 この例では、4つの行の校正値(12 + 38 + 15 + 77)を合計すると142になる。 My solution from fastcore.utils import L from aocd import get_data, submit import re, regex from regex import findall def get_calibration_value(x:str): digits = re.findall(r"\d", x) return int(digits[0]+digits[-1]) def solve1a(inp:str): lines = L(inp.splitlines()) return lines.map(get_calibration_value).sum() Part b 問題の概要...

1月 7, 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