2007-11-11 Wataru MIYAGUNI * redit-client-sm.el: redit-*-command REPcommand では 「insert」 なのに ここでは 「write」 なので、時々混乱する。insert に変更。 それに総じて、write-* 関数を insert-* 関数にリネーム。 あと、redit-*-command を使うときに、文字列で定義されてるので (string-to-number redit-read-command) とかやらないといけない。今日の話し合いで 「別に文字列である必要はないぜ」ってことで 全て数値に変更。こっちの方が楽だし、きっと速い。 2007-11-10 Wataru MIYAGUNI * redit-client-sm.el: set-process-coding-system 送受信するパケットは binary の方が良いと指摘。 そう言われれば確かにそうでした。pack/unpackの意味なす ってことで 'utf-8 から 'binary に変更しました。 * redit-client-sm.el: process-send-string 関連 process-send-string で、以前までは、送るコマンドを (format "%10d%10d" sid eid) って感じの文字列を生成して出力してましたが、 これは、通信用の Perl スクリプトに送るためのものでした。 今は既に、lispから直接 SessionManager にコマンドを送るので、これではだめ。 前々から使ってたけど、(redit-pack sid eid...) ってのに変更しました。 引数を何にするかって参考で、一応 obsolete な記述も残してはいますが。 * redit-client-sm.el: redit-select-command (obsolete) editor側では select 要らないってことで。 これで、editor側で必要なのは join, put, quit, その他編集コマンド。 * add: translate.el translate のテストルーチン。使い方は M-x load-file RET [translate.el] M-x translate-test ってやると、*Message* バッファに、 translateの結果が出力されます。きっと。 * redit-client-sm.el:unpack-int < (setq num (* byte 4)) < (string-to-char (substring pkt num (+ num 1))))) ---------- > (setq num (* byte 4)) > (string-to-char (substring pkt (- num 1) num)))) 通りで、SMからのACKにある eid や sid を取得できない訳だ。 * error: redit-put-command cmd(redit-put-command, 0, 0, 0, 0, str-length, str) みたいに送ると、GUI SessionManager で受け取る文字列が化ける。 emacs || GUI SessionManager ------++------------------- gongo -> 杯湧 どっちが原因なのか・・・ * TODO 送信文字数がバイトとかになるんで (length str) ぐらいでいけると思ったけど、SMで文字化け。ずれてるんだろうか、 もしくは単に文字コードの問題?でも送ったの "hoge" なんだわ。 ま、それは明日にして寝よう (現在AM2:16) 2007-11-09 Wataru MIYAGUNI * redit-client-sm.el: TCP/IP通信の実装、それに伴うpack/unpack 久々の更新ですわ。 open-network-stream を追加してみた。 redit-join-command() < (setq redit-client-process < (start-process "reditclient" nil redit-client-program host)) ----- > (setq redit-client-process (open-network-stream > "redit-client" > nil > "localhost" > 8766)) nil は buffer なんだけど、よくわからんので nil 。多分使わない。きっと。 localhost/8766 は、何か仕様変更で SM はデーモンで持つらしいので、 ホスト名/ポート番号 決めうちで。 ここ変えるだけで、後はプロセスを同じように使えます。 Perlスクリプトを使わなくなったので、変更点としては 以前:lisp からREPコマンド"っぽい文字列" -> Perl で文字列受け取って ここでpack->SessionManager へ 現在:lisp から直接 REPコマンドを -> SessionManagerへ ってことで lisp 内で pack/unpack を実装。 (defun pack-int) (defun pack-int-loop) (defun unpack-int) です。 もう少しちゃんとやるべきなんだろうか。 ちゃんと SessionManager で反映されてるので 成功はしてるみたい。偶然? 2006-12-26 Wataru MIYAGUNI * 独り言 うん、やっぱりpack/unpackの処理はアホだな。 暫定版で出したんだからしょうがない、って言い訳をしておこう。 今のところ0〜255までしかできないので、以下のように変更 ;; num : packする整数 ;; count : byte length (defun pack-int-loop (num count) (if (> count 0) (concat (pack-int-loop (/ num 256) (- count 1)) (char-to-string (% num 256))))) (defun pack-int (num) (pack-int-loop num 4)) ex. num が 30000、byte length が4(32bit)の時 ('X'=不定) ;; loop start count 4 -> (% num 256) => 48 を1バイト目 (/ num 256) => 117 を2バイト目 XXXXXXXX XXXXXXXX XXXXXXXX 00110000 (0 0 0 48) count 3 -> (% num 256) => 117 を2バイト目 (/ num 256) => 0 を3バイト目 XXXXXXXX XXXXXXXX 01110101 00110000 (0 0 117 48) count 2 -> (% num 256) => 0 を3バイト目 (/ num 256) => 0 を4バイト目 XXXXXXXX 00000000 01110101 00110000 (0 0 0 48) count 1 -> (% num 256) => 0 を4バイト目 (/ num 256) => 0 を5バイト目 00000000 00000000 01110101 00110000 (0 0 117 48) ;; loop end これでおkでした。Perl側の unpack でデータ取得できました こんな感じでいいのかな。packソース見たい。 あ〜あとはunpackか。まあ簡単かなpackと同じことすればいいのか。 int だけでいいのかな。浮動小数とかいやですね。 2006-12-24 Wataru MIYAGUNI * redit-client-sm.el - redit-client-after-change-function () < (progn (redit-client-write-line beginl nil) ;; t) ----- > (progn (redit-client-write-line currline nil) ;; t) while でループしてるのに ずっとbeginlってのはおかしいかな〜と思った * 独り言 pack/unpackもどきができた。まだ使用段階なので組み込んでません。 - pack (defun pack (num) ;; num=42 (concat (char-to-string 0) ;; 4バイト目 (char-to-string 0) ;; 3バイト目 (char-to-string 0) ;; 2バイト目 (char-to-string num))) ;; 1バイト目 => 00000000 00000000 00000000 00101010 lispでバイト列を扱うやりかたがよくわからなかったけど これでなんとかrep_manager.plが unpack できてました。 エンディアンとか考える必要あるかな。 - unpack 受け取ったデータから、各値(command、eid 、etc...)を取り出す。 1〜4、5〜8、9〜12、13〜16、17〜20、21〜24 cmd sid eid seq line t_siz 下位1バイト目(?)に値が入ってるので (substring pkt 3 4) => "*" ;; (char-to-string 42) => "*" なので (string-to-char "*") => 42 ・・・ 値取得成功!! まだまだ見直す所ありそうだけど、 うまくいけば完全に lisp だけで REP できますね 2006-12-15 Wataru MIYAGUNI * 独り言 open-network-stream で rep_manager.pl に接続できた。 だけど、lisp 側で送信データがうまく作れてない。 (format "%4d%4d%4d%4d%4d%4d" 41 0 0 1 0 0) だと、なんかうまくいかない。 pack/unpackないかな・・・ 2006-12-14 Wataru MIYAGUNI * 独り言 なんか lisp から network に TCP 接続する方法があるっぽい (open-network-stream NAME BUFFER HOST SERVICE) まだ実証してませんが、なんか使えるっぽいです。(ex. navi-2ch) うまくいけば、redit_client.pl はいらなくなるかも。 文字コード関係はどうしよう。decode-coding-* ぐらいで どうにかならないかな。ならないかも。無駄なヘッダ付加される・・・ * redit-client-sm.el - redit-client-close () linenum が定義されてなかったので、 0 にしました。 別に0で大丈夫ですよね?close だし。多分。。。 * redit-client-sm.el - redit-client-exec-write-line (string) なんか Warning でてたので < (end-of-buffer) ----- > (call-interactively 'end-of-buffer) end-of-buffer は interactive 関数以外で 呼び出したら駄目らしいです。 いろいろ調べてたらこれで Warning 出ないので落ち着きました。 いいのかなこれで。。。 2006-12-12 Wataru MIYAGUNI * redit-client-sm.el obsolete function を変更 since Emacs 22.1 < (process-kill-without-query redit-client-process) ----- > (set-process-query-on-exit-flag redit-client-process nil) 第2引数が non-nil だと、emacs終了時に 「`Active processes exist; kill them and exit anyway?' 」 って聞いてきます。process は redit_client.pl のことです。 多分いらないので nil を入れました。 since Emacs 21.1 < (make-local-hook 'before-change-functions) ;; afterも ----- > ;; (make-local-hook 'before-change-functions) not necessary らしいです。21.1以前だと必須みたいですが。 * 独り言 defstruct を使うときは (eval-when-compile (require 'cl)) を加えた後に byte-compile-file してからやると使える。