Hatena::Grouptemtan

End of Dary

2012-07-29

[]toxyzzy その9 00:56 toxyzzy その9 - End of Dary を含むブックマーク はてなブックマーク - toxyzzy その9 - End of Dary

続き

xyzzy と直接通信する部分は応用が利いて使い回せるように汎用的に作れば便利なのかなーって思ったのだけど、二度と使わない可能性があって無駄な努力になったり、そもそも汎用的にするとちゃんと理解しないと行けないのだけど、そこまで理解していないので今回は toxyzzy 専用に作る事に。

ということで、xyzzycli の xyzzy との通信部分を自分流に書いて 一部を toxyzzy 用に改造して実装して完成。一通りテストしてみて意図した動作になったので非常に満足。xyzzycli を経由するやりかただと toxyzzy を起動した際に必ず xyzzy が前面に出てきてしまうのがあったのだけど、直接 xyzzy と通信する方法にしたのでそれも無くなり本当に不満なし。これはうれしい。

と、ソフトウェア開発の作業はここでは終わらない。リリース用の作業があって、要するにダウンロード用に圧縮ファイルの用意と説明書とか web ページとかいろいろあるわけで、これがとにかくめんどい。まあ人につかってもらうには絶対に必要な作業なんだけどさ…。

ということでリリース作業をいろいろ。今までやってた圧縮ファイルを作るスクリプトが毎回いろいろ適当に作っていたので、その辺をちゃんと枠組みを作ろうとスクリプトを組み始める。ちょっと手間取ったがまあ大まかなのは出来たので今までのとか、今後はこれを使うようにすることに。

とまあリリース作業もそこそこ出来たので明日あたりに正式公開しようかなと思ってまする。

2012-07-28

[]toxyzzy その8 01:34 toxyzzy その8 - End of Dary を含むブックマーク はてなブックマーク - toxyzzy その8 - End of Dary

続き

前回までで下地はできていたので、lisp 側、C 側共に設計した通りにコードを書いていく。まあ、機能的にはシンプルなのでコード量は多くない感じなのですぐに出来るけど、この界隈のプログラミングは慣れていないので、細かい部分で結構思い通りに動かない感じなので適宜修正して詰めていく感じ。手動で動かしながら動作確認していって最終的には予定したとおりに完成。

…だった予定だったのだけど、完成目前でまたもアイデアが湧く。現在は toxyzzy.exe → xyzzycli.exexyzzy.exe といった感じで動作が連係しているのだけど、 toxyzzy.exe が xyzzycli.exe の動作で遣っていることをやれば toxyzzy.exexyzzy.exe という一番シンプルな動作になるのではないだろうか?と考えて xyzzycli.exe のソースは公開されてるし、実装可能じゃね?と思い xyzzycli.exe のソースをざっと見ると実装可能っぽい。むむむ、これはこっちで実装できないと完成と呼べねー(自分の矜恃としてね)。

ということで xyzzycli.exe のソースを読んでみて、部分的にコピペして目的の lisp を実行できるかどうか確認。テストプログラムを作ってやってみたら上手くいったので、あとはこの辺のソースを自分流に書いて実装すれば行けるわわわ。ということで自分なりに色々書き始めた感じ。

今日あたりで終わると思ったんだけどね。なかなか終わらないですわねー。

2012-07-25

[]toxyzzy その7 00:40 toxyzzy その7 - End of Dary を含むブックマーク はてなブックマーク - toxyzzy その7 - End of Dary

続き。

コードを書く前段階は大詰め。機能インターフェイスに関しては結局のところ、出力するバッファはどこにするのかということで、ぐるぐるまわって整理して結局以下のような感じに

な感じ。

そのへん固まったので、ちびちびと下地固めのコード書く作業に入る。今日は lisp 側で使う Win32API の定義、指定したストリームハンドルからデータを取り出してバッファに書き込む関数Windowsシステムエラーメッセージ取得用の関数を書いた感じ。lispFFI 関連のチャンクとか勉強したなり。

次は下地ができあがり始めたのでそれらをまとめ上げるメインの関数を書くかなーって感じ。

2012-07-23

[]toxyzzy その6 23:46 toxyzzy その6 - End of Dary を含むブックマーク はてなブックマーク - toxyzzy その6 - End of Dary

続き。

休日中、車で移動中に色々と実装方法について考えていたのだが、元々はデータ出すプロセス匿名パイプ→toxyzzy→名前付きパイプ→xyzzy というデータの流れが当初の考えであった。けれども、このパイプが 2 つあって一度バッファにするの無駄じゃねー?って思うようになって xyzzy に直接この匿名パイプをつなげる事ができればいいんじゃね?って思いついた。確か、ハンドルを他のプロセスにうつす関数が DuplicateHandle ってあって以前それを(別の目的で)使った時にそういう仕様があったのを思い出したので実現できそう。

ということで、実際にテストプログラムを組んでみてやってみたら、ちょいと試行錯誤はあったけど、大体思ったとおりに出来ることが判明。これにより、今まで想定していたのよりもかなり効率や手間自体が良い感じのプログラムになった感じ。この前書いた lisp の半分以上が無駄になったけど、まあいいでしょう。名前付きパイプ用の待ち受け同期やエラー時のめんどくささが無くて、かなりベストに近い実装になると思う。

ということで、あと懸念事項は、toxyzzy から xyzzyプロセスハンドルを取得する方法。ちょこちょこっと調べてみると CreateToolhelp32Snapshot 関数を使うと良いみたいで、Windowsタスクマネージャもこの関数を使ってるっぽい。ちょいとプログラムを組んで使ってみるとあっさりと xyzzyプロセスIDが取得できるみたいなので、これでほぼ懸念事項は無い感じかな。設計に関しても、プログラムの構造自体が相当簡単になったので、もうここらで直接コードを書き始める感じで OK でしょう。それは明日かなー。

2012-07-21

[]toxyzzy その5 14:22 toxyzzy その5 - End of Dary を含むブックマーク はてなブックマーク - toxyzzy その5 - End of Dary

続き。

ということで、lisp 上で使う win32api の宣言をする lisp を書き始める。この辺からコードを書き始める感じなのだけど、まだ設計はしていない事になる。といっても頭の中ではもう大体設計してるので、まだちゃんと整理して過不足なく網羅できてるかどうかをしてないという意味ではある。

んで、書いた lisp はこんな感じ。

;; toxyzzy

(provide "toxyzzy")
(in-package "winapi")

(require "wip/winapi")

;; typedef -----
(c:define-c-type (DWORD *) LPDWORD)
(c:define-c-type ULONG ULONG_PTR)

;; struct -----
(c:define-c-struct SECURITY_ATTRIBUTES
  (DWORD  nLength)
  (LPVOID lpSecurityDescriptor)
  (BOOL   bInheritHandle))
(c:define-c-type (SECURITY_ATTRIBUTES *) LPSECURITY_ATTRIBUTES)

(c:define-c-struct OVERLAPPED
  (ULONG_PTR Internal)
  (ULONG_PTR InternalHigh)
  (DWORD   Offset)
  (DWORD   OffsetHigh)
  (HANDLE  hEvent)
  )
(c:define-c-type (OVERLAPPED *) LPOVERLAPPED)

;; function -----
(c:define-dll-entry
  HANDLE
  CreateNamedPipeA
  (LPCSTR
   DWORD
   DWORD
   DWORD
   DWORD
   DWORD
   DWORD
   LPSECURITY_ATTRIBUTES
   )
  "kernel32.dll"
  )

(c:define-dll-entry
  BOOL
  ConnectNamedPipe
  (HANDLE
   LPOVERLAPPED
   )
  "kernel32.dll"
  )

(c:define-dll-entry
  DWORD
  WaitForSingleObject
  (HANDLE
   DWORD
   )
  "kernel32.dll"
  )

(c:define-dll-entry
  BOOL
  ReadFile
  (HANDLE
   LPVOID
   DWORD
   LPDWORD
   LPOVERLAPPED
   )
  "kernel32.dll"
  )

(c:define-dll-entry
  BOOL
  CloseHandle
  (HANDLE)
  "kernel32.dll"
  )

これを書く過程で、provide とか in-package について調べたりした。調べてから以前調べたような覚えがあったけど忘れてたので、また調べてる感覚が出てきた。

と、この辺が出来た所で設計的なのを始める。処理の大まかな流れとポイントとなる関数を紙に書いて整理する。まあ今回はかなり小さいプログラムなのですぐに終わったわけで。まあこんなもん。あと、ついでと言ってはアレだけど、機能とかオプションのバリエーションを色々と考えてメモもしておく。出力するバッファを事前に設定しておくとか、起動する度に新しいバッファを作る設定とか色々。

その辺整理が終わったので本格的にコードを書くことに。とりあえずは C 側の main 関数のベースの定型的なセット、要するにプロジェクトファイルとかその設定を色々したり、自作の汎用ライブラリを用意したりとね。今日はそこまでーって感じ。