2010-05-07

Python

最近Pythonいじってます。偶然別個の二つの用途で使う機会があったもので。PythonをやるのはPygameをいじったとき以来なのですが、そのときも大して勉強しなかったので、いろいろとわからないところがあって難儀しています。

条件演算子の構文キモ! と、思ったのですが、確かにCよりも書きやすくなるケースがある気がします。先に正常値を書いてから、後ろに付け足す形で条件と異常値を書けばいいわけですね。Cで言うところの(cond1 ? value1 : cond2 ? value2 : cond3 ? value3 : value_default)みたいなのは、(value1 if cond1 else value2 if cond2 else value3 if cond3 else value_default)みたいに書けばいいっぽい。

インデントだけでブロックを表すというアイデアは一見良さそうに思えるのですが、書いてみるといろいろと問題が多いことに気づかされます。まず、目で見てブロック終端が認識できません。慣れれば見えない終端が見えるようになってくるのでしょうか。Python-eye発動! あと、自分のところのMeadowだとC-M-fやC-M-bでブロック前後へ移動できません。python-end-of-block関数はあるみたいなのですが、キーに割り当てていません。割り当てたとしても、期待した動作にはならなそう。あと、コードを整理するときに気をつけないとブロック構造が破壊されてしまうのも困ります。indent-regionもなかなか思うとおりに動いてくれないし。

2010-05-01

四畳半神話体系的な何か

四畳半神話体系的な何か(wonderfl)

wonderflを見ていて、ふと目に入ったので開いてみたら、確かに「四畳半神話体系」的な何か、だった。

「四畳半神話大系」は最近ようやく録画を見たのだけど、今一番興味を引かれているアニメかもしれない。最近は小説原作もので主人公がやたら文語調でくどくど説明するようなアニメが多く、うんざりさせられていたのだけど、これは割と素直に受け入れられた。不思議。

2010-04-27

プリムスランチジャグ0.5l

口が広いボトルが欲しくて前々から探していたのだけれど、やっといいのが見つかった。

最低限ペットボトルと同じ0.5Lは入ること、手やスポンジが楽に入れられるようマグカップくらいの口径があること、という条件だとどこに行ってもなかなか無くて、諦めかけたときに売り場の端に置いてあるのを見つけた。

2010-04-27

すかいらーくは独身独り暮らし男性を救うか

ついこの間知ったすかいらーく通販ストアを利用してみた。

20100427_skylark_frozen_dishes.jpg

電子レンジで温めるだけ。大変手軽。ただし、ご飯は別途用意すること。味の方は、うーん……、店で食べた方が美味しい、かな。けど、時間を節約したいときには良いかもしれない。あ、別に不味いってほどではないですよ?

2010-04-26

Magitのエラー

よく、次のようなエラーで動作が止まる。何だろう。

Spawning child process: no such file or directory

magitを導入したときからmagit-status時などでたまに起きてた。もう一度やると普通に動くので気にしていなかったんだけど。

そのうち調べよう。

2010-04-26

Gitで同じ行を別の目的で変更してしまった場合

Magitで部分的なstageができるようになったのはいいんだけど、同じ行を別な目的で修正してしまった場合はどうすればいいんだろう。行をコピーして、一方をコメントで残し、一方をstageしたい内容にすればいいのかな。で、コミットしたらコメントで残したほうだけにする、と。

2010-04-24

Meadow上でMagitを使う設定(git-encwrapper使用)

言語まわりの方針・設定はこの前のままで。

.emacs

; *Meadowとgitとの間はutf-8にする。
;  コミットログをutf-8で記録したい。
;  i18n.commitEncodingはコミット時に変換してくれるわけではないっぽい。
;  また、magit.el内でgit log --format %sを使っている場所があるので、
;  どうしてもutf-8でやりとりせざるを得ない。
;  この設定はshell-file-name経由でgitを呼ぶ場合には適用されないので注意。
(modify-coding-system-alist 'process "git" '(utf-8-dos . utf-8-unix))

; magitを使えるようにする。
(cond ((locate-library "magit")
       (require 'magit)

       ;; git diffとgit applyの文字エンコーディングを
       ;; .gitattributesのencoding属性に合わせて調整するラッパーを使う。
       ;; git-encwrapperをコンパイルしてパスの通ったところに置くこと。
       (setq magit-git-executable "git-encwrapper")

       ;; magitがshell-file-name(sh.exe)経由でgitを呼ぶとき、utf-8で入出力する。
       ;; magitがshell-file-nameを使ってprocess-fileやcall-processする関数には次のものがある(magit-0.7では)。
       ;; - magit-shell-command-to-string
       ;; - magit-git-exit-code
       ;; - magit-run-shell
       ;; これらの呼び出し時、一時的にprocess-coding-system-alistを書き換える。
       ;;
       ;; shに対するprocess-coding-system-alistをutf-8にしている人は不要。
       (defun add-sh-utf8-process-coding-system-alist ()
         (cons (cons shell-file-name '(utf-8-dos . utf-8-unix)) process-coding-system-alist))

       (defadvice magit-shell-command-to-string (around magit-shell-command-to-string-proc-coding activate)
         (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist)))
           ad-do-it))

       (defadvice magit-git-exit-code (around magit-git-exit-code-proc-coding activate)
         (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist)))
           ad-do-it))

       (defadvice magit-run-shell (around magit-run-shell-proc-coding activate)
         (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist)))
           ad-do-it))

 ))

2010-07-07追記: magit-0.8.1ではshell-file-name経由でgitを呼ぶ箇所は無くなったので、上記のdefun~defadvice部分は削除してよい。

2010-04-24

エンコーディングを調整するラッパーを使ってMeadow上のMagitで部分的なstage(apply)をする

2013-08-12追記: elisp側で何とかするコードを書きました。複数の文字符号化方式が混在しているときのmagit文字化け対策コード

結局gitのラッパーを書いた。git-encwrapper(GitHubを初めて利用してみた)。

このラッパーは標準入出力を通過するパッチテキストのファイルヘッダーを認識して、ファイル名に対応するgitattributesのencoding属性を取得し、そのエンコーディングを元に、パッチテキストのファイル内容部分を再エンコードする。

このラッパーのおかげで、エンコーディングを統一するためにexternal diffとnkfを使う必要はなくなった。ただ、nkfのように自動でエンコーディングを判定しないので、.gitattributesファイルに「*.txt encoding=utf-8」のように記述しないといけない。

apply時にはdiffの逆変換を行うので、Magitが(エンコーディングが)統一されたdiffの出力を元に部分適用のパッチを作成して(標準入力経由で)gitに送り返してきても、先にラッパーが(エンコーディングが)バラバラの状態に戻すので、gitは正しくパッチを適用することが出来る。

これで、今度こそようやくまともに使えるようになったと思う。マージ操作のやり方とかまだ学んでいないから、また動かないケースに遭遇するかもしれないけど……。

それにしても、何でこんなに苦労しなければならないのかさっぱり分からない。Meadow、Emacs、Windows、Linux、どこで使うにしてもいろいろな文字エンコーディングを柔軟に使いたい場合、素のgitでは使い物にならないと思う。こういう要求ってそれほど特殊なのものだろうか? 誰も気がつかないはず無いんだけど。現にgit-guiではそれなりに対応しているわけだし。git自体にエンコーディングに関する処理を入れたくない方針なのであれば(ログについてはすでに処理してるけどね。それも中途半端に)、git-cui(guiではなく)みたいなフロントエンドが必要なんじゃないんだろうか。私が知らないだけで、すでに何らかの対処がされていてもおかしくないと思う。いや、そうであってほしい。

2010-04-20

Magitからstageに失敗する 日本語編

うーん、やっぱりexternal diffでnkfをかけているせいで、日本語部分の部分的なstageがうまくいかない。どうすれば良いんだろう。

gitはファイル毎に文字エンコーディングメタ情報を持って、適切に変換処理を行うべきだと思うんだけど、その辺はどうなってるのよ。

git-guiだと.git/info/attributesに「ファイル名 encoding=utf-8」みたいに書けば適切に表示してくれるようになっている(gitattributes(5) Manual Page)。また、.gitconfigのgui.encodingによって、デフォルトの解釈も指定できる。でもさ、これってguiの問題なのかね? コマンドラインで表示するときだって、適切に変換してエンコーディングを統一してから標準出力へ流すべきなんじゃないの?

まあとにかく、gitの方でやってくれないのであれば、magitの方で何とかしないといけないんだろうな。