できる事は少ないけど、粛々とやっていこう。
やったこと
- 環境整備
- 開発用Emacs Lispの改善
- データチェック用スクリプトの実装
- タグファイルの更新
- フレームワークについて調べる レポートを提出する。
MySQL Clientをインストールする
フレームワークの確認のためには、先に環境を整備する必要がありそう。まずは、nativeな環境を整備していく。
brew install [email protected]
MySQL Clientがなかったので、それらを整備した。まずはmysqlclientを探す。
brew search mysqlclient
必要そうなパッケージを入れる。
brew install [email protected]
環境変数などを設定する。
export LDFLAGS="-L/opt/homebrew/opt/[email protected]/lib"
export CPPFLAGS="-I/opt/homebrew/opt/[email protected]/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/[email protected]/lib/pkgconfig"
PATHの設定もしておく。
export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
org-modeのコードブロックのインデント
org-modeのコードブロック内の先頭にはインデントを含めるべきなんだろうか。勝手にインデントが入るものもあれば、入らないものもある。しかも、その設定がどこにあるのかもよくわからない。org-modeはとてもよく作り込まれているけれど、実装のシンプルさという点では改善の余地はあると思う。
制御コードを除去するフィルターを実装する
Emacsでmake-processでプロセスを起動した時、プロセスが制御文字を出力してくる事がある。この制御文字をバッファに反映させないフィルターを実装して。ターミナルに出力される色をつけたりするような制御文字も除去したい。ChatGPTに要件を指示して実装させ、上手く動かない所を手直しした。
(defun split-shell-line (line)
"Split a shell-like command line into arguments."
(string-split line))
(defun remove-quotes (str)
"Remove surrounding quotes from a string if they exist."
(if (and (>= (length str) 2)
(or (and (eq (aref str 0) ?\")
(eq (aref str (1- (length str))) ?\"))
(and (eq (aref str 0) ?')
(eq (aref str (1- (length str))) ?'))))
(substring str 1 (1- (length str)))
str))
(defun parse-shell-line (line)
"Parse a shell-like command line into a list of arguments, handling quotes."
(mapcar 'remove-quotes (split-shell-line line)))
virtualとバーチャルと仮想
以下の記事や動画ではvirtualという単語の誤訳について解説している。
「virtual」とは、「実際の」「事実上の」といったような意味合いがあるらしい。また、「虚」というのもvirtualらしい。動画では、virtualはもはや無理に訳さず片仮名でバーチャルと表現した方がいいとまで言っている。なるほど、そういう考え方もあるのか。
僕自身は、ここで少し蔑まれているような"かなりいい加減な人達"な部類だ。ただ、それは"いい加減"でいたいわけではなくて、"いい加減"ではいたくないけれど"いい加減"になってしまう人だと思う。折角なので仮想という言葉について、自分なりに意味を考えてみた。
本当にそこにあるかは分からないけれど、そこにあるかのように思い込む事で、目的を果たすためのもの。
どうだろうか。言葉の正解は辞書に書かれているかもしれないけれど、辞書が正しいなんて誰が決めたか分からない。こうやって、自分の中でひっかかった物を取り上げて、考えてみるもの良い暇潰しになる。
あくまでここは個人のブログであり、こういうどうでも良い事を考える場所だ。またブログ本来の役割を一つ果たしたな。
Pythonのvenvのユーティリティを書いた
同じような実装は以前も書いたけど、今回はそれをもっとシンプルにした。僕の実装ポリシーとして「本当に必要なもの以外は作らない」というのがある。大抵のツールは自分一人で保守する事を前提としている。だから、ほとんど手がかけられない。たくさんの機能、たくさんのコードがあると、その分面倒を見ないといけない量は増える。それを減らすために、本当に必要なもの以外は作らない。また「本当に必要なライブラリ以外は使わない」というのもある。ライブラリを使うという事は、そのコードを抱えるという事だと思う。ライブラリはいろんな機能を実装している事が多い。ライブラリを使うという事は管理するコードの量が増えるという事と同じ意味と考えている。だから、ライブラリも本当に必要なもの以外は使わない。
(defvar python-venv-real-python-list nil)
"Installed python path list")
(defvar python-venv-directory "~/.cache/python-venvs")
(defvar python-venv-process-buffer-name "*Python venv*")
(defvar python-venv-bash-executable "bash")
(defun python-venv-create (name python-executable)
(interactive
(list (read-string "venv name: ")
(completing-read "select to use python: " python-venv-real-python-list)))
(make-directory (expand-file-name python-venv-directory) t)
(async-shell-command (format "%s -m venv %s"
python-executable
(expand-file-name (file-name-concat python-venv-directory name)))))
(defun python-venv-bash (venv-directory)
(interactive (list (read-directory-name "venv dir: " python-venv-directory)))
(async-shell-command (format "%s --init-file %s/bin/activate"
python-venv-bash-executable
venv-directory)))
(provide 'python-venv)