2009年4月19日日曜日

GitHubアカウントをとりました

いくつかファイルを置いておいたので、よかったらどうぞ。

GitHubアカウント - github.com/kosh04

  • xyzzy/
    • etc/
      • newLISP - newlisp-mode用キーワードファイル
    • site-lisp/
      • cl.l - xyzzyにないCL関数の移植のようなもの
      • corman_search.l - CLのsearch関数移植
      • cygwin.l - 主にmanコマンドを利用するため
      • newlisp.l - newLISP編集用メジャーモード
      • redef.l - xyzzy組み込み関数を再定義したもの
      • util.l - 自作関数など
  • emacs-lisp/
    • xyzzy.el - xyzzy/CommonLisp/SLIMEの便利そうな関数を色々移植したもの
  • newlisp-files/
    • init.lsp - CLっぽい関数とか
    • newlisp.el - newLISP編集用メジャーモード

真面目にファイルの配布するならライセンスやマニュアルも考えるべきなんだろ うけど、今日はとりあえずここまで。gitに慣れるのに手間取って疲れた…

[追記]

GitHubのwebページがUTF-8らしいので、それに伴いファイルの文字コードも一部 UTF-8になっています。で、xyzzyだとファイルのコンパイル・ロード用の関数が デフォルトではShift_JISしか対応しないようなので、compile-file/loadの代わ りにmc-compile-file/mc-load-file関数などを使って明示的に文字コードを指定 してくだしあ。

後でREADMEくらいは作ろう。

[追記 (2009-12-08)]

ブラウザの文字化けよりもライブラリを実際に使う時の利便を考慮して、元のsjisに戻しました。

今日の無題

2009年4月16日木曜日

参考にならないmanコマンドの文字化けについてのメモ

配属先研究室の端末Emacsのマニュアルコマンドの文字化けが気持ち悪い
ので、文字コードにはあまり知識がないけど、ない脳みそこねこね考えて
みる。あれはDebianだっかかな。

manプロセス側でなく、なるべくEmacs側で処理出来るようにするのが目的です。

---

うちのubuntu環境の文字コードは標準でUTF-8

(getenv "LANG")                         ; "ja_JP.UTF-8"
default-process-coding-system           ; (mule-utf-8 . mule-utf-8)
locale-coding-system                    ; utf-8


(1) manプロセスが処理した文字列をそのまま表示すると(つまりエスケー
    プシーケンス処理しない)と、こんな感じ。

(shell-command "man man") または
M-x: shell-command[RET] man

---

MAN(1)                        Manual pager utils                        MAN(1)


\345\220名\345\211前
       man - オンラインリファレンスマニュアルのインターフェース

\346\233書\345\274式
       man  [-c|-w|-tZT  device]  [-adhu7V]  [-m system[,...]] [-L locale] [-p
       string] [-M path] [-P pager]  [-r  prompt]  [-S  list]  [-e  extension]
       [[section] page ...] ...
       man -l [-7] [-tZT device] [-p string] [-P pager] [-r prompt] file ...
       man -k [apropos options] regexp ...
       man -f [whatis options] page ...

---

(2) 一方、Emacsのmanコマンドを介すると、こんな感じ。
    文字化け悪化

(man "man") または
M-x: man[RET] man

---

MAN(1)                                Manual pager utils                                MAN(1)

\345\220\345\220\215-\345\211\345\211\215-
       man - \343\202�\203潟\203�\202ゃ\203潟\203�\203\225\343\202<\203�\203潟\202鴻\203\236\343\203\213\343\203ャ\202≪\203�\201�\202ゃ\203潟\203帥\203若\203\225\343\202с\203若\202\271

\346\233\346\233後弱\274\217
       man  [-c|-w|-tZT  device] [-adhu7V] [-m system[,...]] [-L locale] [-p string] [-M path]
       [-P pager] [-r prompt] [-S list] [-e extension] [[section] page ...] ...
       man -l [-7] [-tZT device] [-p string] [-P pager] [-r prompt] file ...
       man -k [apropos options] regexp ...
       man -f [whatis options] page ...

---

ここでEmacsの文字のエンコード、デコード関数を使ってみる。
伝統的なLinuxならば文字コードはeuc-jpだろう。

(encode-coding-string "書式" 'euc-jp)   ; "\275\361\274\260"
(encode-coding-string "書式" 'utf-8)    ; "\346\233\270\345\274\217"


UTF-8エンコードした文字列の方が(1)の"書式"の文字付近のものと一致し
ている気がする。

---

自分の仮定が正しければマニュアル自体はUTF-8で通っていると思う。

問題なのは、

Emacsはmanプロセスと通信してバッファにその文字列をUTF-8で流してい
る。が、その文字列にはエスケープシーケンスも含まれていて、【本来日本
語文字になるはずのバイト列とマニュアル整形のためのエスケープシーケ
ンスが運悪く被ってしまっているのではないか?】

だから、Emacsのman関数側が処理の時にバイト列を解釈できずに文字化け
するのかもしれない。

自信ないがここまで書いた。一旦寝て後で考え直そう。

またEmacs改悪の悪い癖がでてきたなあ…

2009年4月7日火曜日

ubuntu インストール

windows と併用している linux を vine4.2 から ubuntu-ja-8.10 に変えてみた。

  • linux のインストールは何度かやったことがあるのでパーティション操作などは特に 苦労なし。ubuntu(と言うより GUI)楽だなあ。 以前に入れたもといえば opensuse,fedora,vine (LiveCD も含めれば slax,knoppix) …ディスクへのインストールは4度目か。苦労はしなくなったが上達した気がしないなあ。
  • インストールは windows とのデュアルブート。 windows 領域に ubuntu をインストールすることも可能なのだが、 以前に knoppix でそれを試した時は、あまり操作感がよろしくなかった印象だったので。マシンスペック が貧弱でなかったら仮想化なんかも出来そうなものだが...

  • SLIME の設定楽。 asdf も ubuntu の標準インストールで出来るみたい。まだ入れてない。 デフォルトでは sbcl がインストールされる。これは入れた。

  • バックアップをとったつもりがドットファイル(.bashrc とか)がなくなってた事に気づい て凹んだ。

  • emacs 周りはやっぱり面倒。 .emacs の微妙な違いとか、ライブラリとか。 こういう時にバージョン管理システムが役に立つのだろうかね。

  • root パスワードが分からなくて焦った。 (ubuntu では管理者権限の必要なコマンドは sudo が標準)

  • anthy(日本語入力)の以降もすべきだったかも。 そこまで使い込んでいないけど。

  • firefox の flash-plugin が adobe 純正のものでなかったので差し替え。 swfdec-mozzila -> adobe-flashplugin 単にインストールするだけだと swfdec が優先されるらしいので、これは削除する。

  • いつぞや作った Linux From Scratch がインストール時のパーティション操作のおかげで 起動できなくなった。後で直そう (-> /boot/grub/menu.lst)

このメモを次回につなげよう。 でも次回っていつだろうか?

2009年4月6日月曜日

[Gmail]既読ボタンを有効にする

Google Japan Blog: Gmail Labs が日本語に対応しました

らしい。ちょっと見てみると「既読ボタン」なんてものがあったので早速導入。 これは重宝しそうな予感。

Gmail -> 設定 -> Labs -> 既読ボタンの項目を有効にする

あと「酒気帯びテスト」ってこれか。

Google、「真夜中のラブレター」を防ぐ「Mail Goggles」 - ITmedia News 実験サービス「Gmail Labs」が日本語化 送信取り消しや「酒気帯びテスト」も - ITmedia News

[Emacs] シンボルから info を呼び出す

指定したシンボルに対応した Info を表示するには `info-lookup-symbol' を使えばいいのか。なるほど。

Elisp 用の Info は標準で入っているので、とりあえず C ライブラリのだけでも入れて おくことにする。以下、その手順。

  1. libc の info を持ってくる
    http://www.gnu.org/software/libc/manual/
    http://www.gnu.org/software/libc/manual/info/libc-info.tar.gz
  2. 適当なディレクトリに解凍する
    $ mkdir -p ~/info/libc
    $ tar xzvf libc-info.tar.gz.tar -C ~/info/libc
  3. .emacs に追加
    (require 'info)
    (add-to-list 'Info-additional-directory-list "~/info/libc/")
    ;; 標準では C-h S, <f1> S または M-x help S
    (global-set-key "\C-ch" 'info-lookup-symbol)
  4. Info-directory-list のディレクトリ内にあるファイル dir に以下の一行追加
    * libc: (libc).         The GNU C Library
  5. 各モードで info-lookup-symbol を呼び出して ウマー (゜Д゜)
    # c-mode では初回関数呼び出し時に明示的にモードを指定する必要あり

特に c-mode と libc-info の関連付けを指定してないけど、 Emacs 側で勝手にマー ジしてくれるらしくこのままで使えるみたい。

でも、もっと多機能なものが既にあるからこのメモはあんまり当てにならないかもね。

2009年4月3日金曜日

[LISP]マクロのエイリアス

マクロ名の定義にも setf が使えるらしいことに気づいたのでメモ。 ついでに xyzzy だと macro-function に setf 出来ないので定義しておく。 たぶん間違ってるけど。 # xyzzy, CLISP-2.44 で確認
#+xyzzy (defsetf macro-function si:*fset)

(progn
  (setf (macro-function 'if-progn)
        (macro-function 'when))
  (list (if-progn t "てー")
        (if-progn nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function '&&)
        (macro-function 'and))
  (list (&& t "てー")
        (&& nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function 'mvbind)
        (macro-function 'multiple-value-bind))
  (mvbind (a b c)
      (values 1 2 3)
    (list a b c)))
;=> (1 2 3)
; #+xyzzy だと (macro-function 'multiple-value-bind) => nil となりエラー

(progn
  (setf (macro-function 'defconst)
        (macro-function 'defconstant))
  (defconst e (exp 1))
  (list e (multiple-value-list
           (ignore-errors (let ((e pi)) e)))))
;=> (2.7182817 (NIL #<SYSTEM::SIMPLE-SOURCE-PROGRAM-ERROR #x19EE7919>))

(progn
  (setf (macro-function '++)
        (macro-function 'incf))
  (let ((n 1))
    (list n (++ n) (++ n))))
;=> (1 2 3)

(progn
  (setf (macro-function 'fn)
        (macro-function 'lambda))
  (remove-if (fn (x) (zerop (mod x 3)))
             '(0 1 2 3 4 5 6 7 8 9)))
;-> *** - FUNCTION: (FN (X) (ZEROP (MOD X 3))) is not a function name; try using a symbol instead
; #+GCL ではエラーにならずに (1 2 4 5 7 8) を返す。…なんでだ?