2010年12月2日木曜日

内骨格 サブプロセス処理をキューイング

内骨格は、サブプロセスの処理を同期的に処理するための window.subProcessCall() を提供している。
また、サブスレッド処理を、キューイングして処理するための window.taskEnqueue() を提供している。

サブプロセス処理を、同期的に処理するのではなく、キューイングして処理するにはどうしたらよいか。
subProcessCall()は、メインスレッドの中で呼ばれることを想定しているので、サブスレッドの中で
subProcessCall()を呼ぶことはできない。そのかわりに、以下のように SubProcess クラスを直接
使用しよう。

    def command_SubProcessQueuingTest(args):
       
        def jobSubProcess( job_item ):
       
            cmd = [ "ipconfig", "/all" ]
            p = cfiler_subprocess.SubProcess( cmd, cwd=None, env=None )
            p()

        job_item = ckit.JobItem( jobSubProcess, None )
        window.taskEnqueue( job_item, u"SubProcess" )


近いうちに、cfiler_subprocess.SubProcess のように、わざわざ cfiler_subprocess名前空間を
明示しなくても、 SubProcess を使えるようにしておこうと思う。

2010年11月2日火曜日

CraftLaunchで、スタートメニューのアイテムをコマンドに登録する

CraftLaunchで、以下のようにconfig.pyを記述すると、
スタートメニューのアイテムをコマンドに登録することができる。

    # --------------------------------------------------------------------
    # スタートメニューの中のショートカットをコマンドとして登録する
    if 1:
        startmenu_items = []

        MAX_PATH = 260
        CSIDL_PROGRAMS = 2
        CSIDL_COMMON_PROGRAMS = 23

        buf = ctypes.create_unicode_buffer(MAX_PATH)

        ctypes.windll.shell32.SHGetSpecialFolderPathW( None, buf, CSIDL_PROGRAMS, 0 )
        programs_dir = buf.value

        ctypes.windll.shell32.SHGetSpecialFolderPathW( None, buf, CSIDL_COMMON_PROGRAMS, 0 )
        common_programs_dir = buf.value
       
        startmenu_dirs = [
            programs_dir,
            common_programs_dir
        ]
       
        for startmenu_dir in startmenu_dirs:
            for location, dirs, files in os.walk( startmenu_dir ):
                for filename in files:
                    if not filename.lower().endswith(".lnk"):
                        continue
                    name, ext = os.path.splitext(filename)   
                    item = ( name, window.command_ShellExecute( None, os.path.join(location,filename), u"", u"" ) )
                    startmenu_items.append(item)
                   
        startmenu_items.sort()
       
        window.launcher.command_list += startmenu_items
   

2010年10月31日日曜日

CraftLaunch のテーマ [dark]

CraftLaunchのテーマ [dark] を公開した。

http://clnch.googlecode.com/files/dark.zip

非アクティブ時と、アクティブ時の色調を合わせて、
全体的に、暗い背景になっている。

dark テーマ

2010年10月6日水曜日

CraftLaunchでディレクトリを入力したらファイラで開く方法

CraftLaunchには、コマンドの補完処理や解釈や実行処理をカスタマイズする機能がついている。


それが window.commandline_list だ。

下のように、ある決まった名前のメソッドを持つオブジェクトを、commandline_list の先頭に追加してみよう。
入力したコマンドは、commandline_list に登録されている順番に評価され、最初に成功した時点で
評価は終了する。

下の例では、以下のような処理を行っている。

  - 入力された文字列を、区切り文字 ; で分解して、最初の引数が
    ディレクトリ名かどうかチェック。
    ディレクトリではなかったら、Falseを返す。(次の評価へ)

  - ディレクトリ名なら、ファイラで開く。

  - コマンド履歴に追加


2010年10月5日火曜日

内骨格 テーマ機能

内骨格のバージョン 2.00 を公開した。

テーマ切り替え機能を追加した。
CraftLaunchに追加したものと同じような機能だ。




これが、[ white ] というテーマ。
(壁紙は付属していない。)

2010年10月3日日曜日

CraftLaunch テーマ選択機能

CraftLaunch の 3.17 で、テーマ選択機能を追加した。

これまでは、skinというディレクトリはあったものの、
ユーザがカスタマイズする正式な方法はなかった。

今回追加したテーマ選択機能は、
ユーザがテーマを作成することができる。。

theme/black
theme/white

にように、同梱されている2つのテーマを参考に。

あわせて、これまで存在していた色設定機能は廃止し、
テーマごとにある theme.ini に色を定義するようにした。

2010年9月22日水曜日

MonoDevelop つかってみる

オープンソースなIDE MonoDevelop を使ってみる。

http://monodevelop.com/

使ったバージョンは 2.4。
まだWindows版は不安定な印象を受けるが、
補完入力などもVisualStudioと同じようにきっちり動くし、
一通りの機能がそろっているように見える。

改善に貢献できるかもしれないので、
気づいたところをメモしていこう。

- 日本語翻訳が中途半端。
- テキストエディタで日本語をインライン入力できない (IMEのウインドウが出てしまう)
- コンソールアプリケーションを作ってみたけど、実行してもコンソールが出ない。

2010年8月22日日曜日

pymono で CPython と C# を組み合わせる

pymono という Python拡張モジュールを作ってみた。
これは、Pythonから.NET Frameworkの仮想マシンを呼び出したり、C#からPythonの関数を呼び出したり
するモジュールだ。

Mono をアプリへの組み込み用仮想マシンとして使う可能性を検討するための学習課題として
作ってみただけ。

.NETとPythonといえば、IronPythonがあって、
pymonoのほうはジョーク&実験用という位置づけだ。

2010年8月14日土曜日

keyhac で Winキー

keyhacの1.24で、Winキーをモディファイアとして使えるようにした。

1.23以前では、たとえば "Win-H" のように、 Winキーをモディファイアとして使ったときに、
Winキーは、スルーするけど、Hキーは、keyhacが処理してスルーしないので、
OSには、Winキー単体として処理されてしまい、スタートメニューが出てしまっていた。

1.22でAltキーに対して対策したように、Winキーにも単体押しをキャンセルする (Ctrlキーを
押したことにする) 処理を追加して、一見うまくいっているようだ。

2010年8月13日金曜日

keyhac で Emacs 風キーバインド

keyhacのマルチストロークなキーカスタマイズ機能をつかって、
メモ帳をEmacs風に操作できるようにしてみよう。

とくに、僕がEmacsを常用しているわけではないが、
マルチストロークがうまくいくかどうかの実験だ。

------------------------------------------------------------------------------------

    # Editボックスで、C-Dを削除に当てるなど
    if 1:
        keymap_edit = keymap.defineWindowKeymap( class_name=u"Edit" )

        keymap_edit[ "C-D" ] = "Delete"              # 削除
        keymap_edit[ "C-H" ] = "Back"                # バックスペース
        keymap_edit[ "C-K" ] = "S-End","C-X"         # 行末まで切り取り

   
    # メモ帳を Emacs 風にカスタマイズする
    # keymap_edit の条件と重複するため、keymap_editの設定と混ざって機能する。
    if 1:
        keymap_notepad = keymap.defineWindowKeymap( exe_name=u"notepad.exe", class_name=u"Edit" )
   
        # Ctrl-X を マルチストロークの1段目として登録
        keymap_notepad[ "C-X" ] = keymap.defineMultiStrokeKeymap("C-X")

        keymap_notepad[ "C-P" ] = "Up"                  # カーソル上
        keymap_notepad[ "C-N" ] = "Down"                # カーソル下
        keymap_notepad[ "C-F" ] = "Right"               # カーソル右
        keymap_notepad[ "C-B" ] = "Left"                # カーソル左
        keymap_notepad[ "C-A" ] = "Home"                # 行の先頭
        keymap_notepad[ "C-E" ] = "End"                 # 行の末尾
        keymap_notepad[ "A-F" ] = "C-Right"             # 単語右
        keymap_notepad[ "A-B" ] = "C-Left"              # 単語左
        keymap_notepad[ "C-V" ] = "PageDown"            # ページ下
        keymap_notepad[ "A-V" ] = "PageUp"              # ページ上
        keymap_notepad[ "A-Comma" ] = "C-Home"          # バッファ先頭
        keymap_notepad[ "A-Period" ] = "C-End"          # バッファ末尾
        keymap_notepad[ "C-X" ][ "C-F" ] = "C-O"        # ファイルを開く
        keymap_notepad[ "C-X" ][ "C-S" ] = "C-S"        # 保存
        keymap_notepad[ "C-X" ][ "C-W" ] = "A-F","A-A"  # 名前を付けて保存
        keymap_notepad[ "C-X" ][ "U" ] = "C-Z"          # アンドゥ
        keymap_notepad[ "C-S" ] = "C-F"                 # 検索
        keymap_notepad[ "A-X" ] = "C-G"                 # 指定行へ移動
        keymap_notepad[ "C-X" ][ "H" ] = "C-A"          # 全て選択
        keymap_notepad[ "C-W" ] = "C-X"                 # 切り取り
        keymap_notepad[ "A-W" ] = "C-C"                 # コピー
        keymap_notepad[ "C-Y" ] = "C-V"                 # 貼り付け
        keymap_notepad[ "C-X" ][ "C-C" ] = "A-F4"       # 終了
------------------------------------------------------------------------------------



ここで、A-F など、Altキーを使ったキーのカスタマイズに問題があることが分かり、
keyhac 1.22 で修正を行った。Altキーは、CtrlやShiftと違って、単体で押して離すと、
メニューバーにフォーカスが行ってしまうから、特別な対応が必要なのだ。

対策として、A-Fのようなキーバインドでは、仮想的にCtrlキーを押して離す処理を実行する
ようにした。もっと自然な対策をご存知の方がいたら、教えてもらいたい。

2010年7月25日日曜日

CraftLaunch チラつき対策

CraftLaunch 3.15 のアップデート内容は、
  • 補完候補リストがチラつかないように調整
これは、コマンド入力によって、補完候補リストの位置が右側に移動するとき、
リストのウインドウがチラつくケースがあったというものだ。

機能追加でも、不具合修正でもなく、どうでもいい変更のように思われるかもしれないが、
CraftLaunchや内骨格では、描画のチラつきが発生しないように、こだわって対策を行っている。


内骨格で、ディレクトリの移動や、ファイルリストのスクロール時、ファイルリストがチラつくことなく
描画される。履歴リストを左右で切り替えたときも同様だ。

こういったところが、アプリケーションのシッカリ感、ミッシリ感の重要なポイントだと思うのだ。

2010年7月19日月曜日

keyhac で キーボードマクロ や マルチストローク

keyhac の 1.20 でキーボードマクロ機能を追加してみた。

        keymap_global[ "U0-1" ] = keymap.command_RecordStart
        keymap_global[ "U0-2" ] = keymap.command_RecordStop
        keymap_global[ "U0-3" ] = keymap.command_RecordPlay
        keymap_global[ "U0-4" ] = keymap.command_RecordClear

のように、キーボードマクロの記録開始、終了、再生、クリアに、キーを割り当てて使う。


あと、1.18 で マルチストロークなキー割り当てができるようにした。


    keymap_notepad_ctrl_x = keymap.defineMultiStrokeKeymap()
    keymap_notepad_ctrl_x[ "C-F" ] = "C-O"
    keymap_notepad[ "C-X" ] = keymap_notepad_ctrl_x
記述の仕方がちょっと複雑だが、defineMultiStrokeKeymap() で生成した "2段目のキーマップ" を、
1つ目のキー入力のコマンドとして割り当てる、といった具合だ。
 

2010年5月17日月曜日

ckw : VistaでもDOS窓が一瞬出ないように

先の投稿にMichiruさんからいただいて、
VistaでもDOS窓が一瞬出ないようになった。
(どうもありがとうございます)

http://sites.google.com/site/craftware/ckw/download

__readfsdword って使ったことがなくて、いまでも
良く理解していないけど、、、
まだ修行が足りんなあ。と。

2010年5月10日月曜日

ckw で cygwin

ckwでcygwinを実行するには以下のように設定する。

Ckw*title: ckw[cygwin]
Ckw*exec:  c:\cygwin\bin\bash --login -i
Ckw*chdir: c:\cygwin\bin



Cygwin.bat を実行するようにしても、一見うまくいくが、
なぜか、ckwのウインドウを閉じた後も、
bash.exe プロセスが残存してしまうようだ。

2010年5月8日土曜日

IPythonとckwの組み合わせがナイス

Pythonを使ったアプリケーションを開発中、
新しいライブラリの使い方などを理解するために、
対話的にライブラリを使ってみることがある。

そんな時に便利なのがIPythonだ。
http://ipython.scipy.org/moin/

全体的に、IDLEよりも、よくできている。
メンバの補完などの挙動は、IDLEは今一つだ。

ひとつIPythonの問題が、DOS窓で動くということだが、
ckwを使えば解決する。
http://sites.google.com/site/craftware/ckw

そんなわけで、僕は普段、IPythonとckw を組み合わせて使っている。
IPython用のckwの設定ファイルを公開しておこう。

--------------------------------------------

!
! ckw setting
!

Ckw*foreground: white
Ckw*background: black
!Ckw*cursorColor:     green
!Ckw*cursorImeColor:  red
!Ckw*backgroundBitmap: ckw_background.bmp

Ckw*title: ckw[IPython]
Ckw*exec:  c:\python26\python.exe c:\python26\Scripts\ipython
Ckw*chdir: c:\

Ckw*scrollHide:  no
Ckw*scrollRight: yes
Ckw*internalBorder: 1
Ckw*lineSpace: 0
Ckw*topmost: no
!Ckw*transp: 220
!Ckw*transpColor: #000000

Ckw*font: MS Gothic
Ckw*fontSize: 12

Ckw*geometry:  80x26
Ckw*saveLines: 10000

Ckw*color0:  #000000
Ckw*color1:  #0000FF
Ckw*color2:  #00FF00
Ckw*color3:  #00FFFF
Ckw*color4:  #FF0000
Ckw*color5:  #FF00FF
Ckw*color6:  #FFFF00
Ckw*color7:  #FFFFFF

Ckw*color8:  #FFFFFF
Ckw*color9:  #8080FF
Ckw*color10: #80FF80
Ckw*color11: #80FFFF
Ckw*color12: #FF8080
Ckw*color13: #FF80FF
Ckw*color14: #FFFF80
Ckw*color15: #FFFFFF


--------------------------------------------

ckw改造のマージ、DOS窓が一瞬出ないように

ckwの起動時に、DOS窓が一瞬表示されないようにする修正を
おこなった。

http://sites.google.com/site/craftware/ckw


以下のサイトのnocd5さんの修正を取り込んだ。
http://nocd5.blog59.fc2.com/blog-entry-402.htmlありがとうございます。

2010年5月1日土曜日

ckw 改造その2 [CopyAll]

ckw に CopyAll 機能を追加した。

http://sites.google.com/site/craftware/ckw

Alt + Space や、タイトルバー右クリックなどで
表示される、システムメニューの [Copy All]
という項目をクリックすることで、コンソール中の
全てのテキストを、クリップボードに格納する機能だ。

コンソールに出力された、大量のログを、
ファイルに保存したいときや、特定のエラーメッセージを
検索したい時などに重宝するはずだ。

2010年4月26日月曜日

ckw 改造版 つくってみた

ckw の操作を、より自分好みにするために、改造版 つくってみた。

そして、ここにおいてみることにした。
http://sites.google.com/site/craftware/ckw


変更点は以下のとおり:


・マウスによるテキスト選択中に、マウスがウインドウの上下外側に行ったときに、
  自動的にスクロールするようにしました。

・VC2008を使うようにしました。ckw.sln と ckw.vcproj を VC2008の形式に変換しました。


あと、バイナリパッケージの中にソースも入れちゃうことにした。
(2つパッケージ作るのが面倒なので。)


今度、テキスト全体をコピーするメニューを追加しようと思う。

とりあえず、ログ全部をコピーして、テキストエディタに貼り付け、エディタの中で検索するなどの用途で便利なはずだ。

2010年4月22日木曜日

CraftMemoの同期機能がGoogle側の変更で動かなくなった

ここ数日、CraftMemoのメモの同期機能が、Googleのサーバ側の変更によって
動かなくなったようだ。

オンラインのドキュメントが、APIで見つからなくなってしまっている。

Google Data APIのサポートフォーラムでも、
話題になっていた。


http://www.google.com/support/forum/p/apps-apis/thread?tid=3c192492c93467ed&hl=en

さて、どんな風に対処しようかな、、、

2010年3月28日日曜日

CraftLaunch 10進 と 16進 を気軽に変換

CraftLaunch ver3.10 を公開した。

3.10
  • アンドゥがいまいちだったのを修正。
  • 32 bit の 符号付整数を、10進 16進 の間で相互変換する機能を追加

コマンド入力欄に、0x80010002 のような16進表記の整数を入力してEnterすると、
-2147418110 という 10進表記に変換される。

また、逆に、1234 のような 10進表記 で入力すると、0x000004d2 という 16進表記
に変換される。

16進と10進の変換は、プログラミングをしていると度々必要になるものだ。

CraftLaunchでは、こういったコマンドの解釈方法自体をカスタマイズするための
仕組みが実装されている。

        self.commandline_list = [
            self.launcher,
            clnch_commandline.commandline_ExecuteURL(self),
            clnch_commandline.commandline_ExecuteFile(self),
            clnch_commandline.commandline_Int32Hex(self),
            clnch_commandline.commandline_Calculator(self),
        ]

このように MainWindowのcommandline_listに、オブジェクトを列挙することで、
コマンドラインの解釈ルールを追加することができるのだ。

2010年3月27日土曜日

keyhac 1.16 格納するけど貼り付けない

keyhac 1.16 を公開した。


1.16
  • クリップボード履歴を、Shiftを押しながら決定したときは、クリップボードの内容を更新した後の貼り付けを行わないようにした。
操作は、QTClip といっしょに。



じつは、現在のkeyhac には、コピーをしても、クリップボードの履歴が更新されなくなる場合がある、という
不具合が存在する。その場合には、keyhac を再起動するか、keyhac のコンソールウインドウのテキストを
コピー操作してやると復帰するようだ。ここは、早めに修正したいところ。原因もよく分かってない。

2010年3月21日日曜日

CraftLaunch 3.08 と 3.09

ひさしぶりに CraftLaunch を更新した。



なかでも、何人かの方から要望を受けていたのが、TABの動作の改善。

自動補完がOFFでも、TABをつかって補完&確定処理を行うようにした。



3.09
  • コマンド入力欄の左右のスクロールの挙動を調整。右側の余白が大きくなりすぎないようにした。
  • コマンド入力欄がスクロールしたときに、補完候補リストの位置がおかしかったのを修正。
3.08
  • JobQueue.defaultQueue() を追加
  • テキストエディタの呼び出し時に、引数のファイル名が引用符で括られていなかった のを修正。
  • 計算機で、long 型の整数を扱えるようにした。
  • Ctrl-K で 履歴を削除する機能を追加
  • 補完候補リストがポップアップするとき、現在入力中の文字列が変更されない項目をデフォルトで選択しておくようにした。
  • TABを使った確定操作の改善。自動補完がOFFの場合でも確定が動作するようにした。
  • ホットキーをトグル動作できるようにした。

2010年3月14日日曜日

内骨格 1.95 アーカイブ関連のいくつかの修正

内骨格の 1.95 を公開した。
アーカイブの扱い周りの、いくつかの修正だ。

うち2つは、1.90 と 1.91 で行った修正によるエンバグだった。(恥、、、省略)

もうひとつは、Tar系のアーカイブに、シンボリックリンクのような、Windowsでサポートできない
形式のファイルが含まれていたときの挙動に関するものだ。

シンボリックリンクが含まれている場合の、書庫の展開の仕方を、
2~3個のアプリに関して見てみたのだが、
0byteのファイルを作るだけのものが多いようだった。
というわけで、内骨格についても、0byteのファイルを作ることにした。

2010年2月27日土曜日

内骨格 1.94 - UNLHA32.DLLの使い方

内骨格の 1.94 を公開した。
  • LZH の仮想ディレクトリの中のルートディレクトリのファイルを開くときに、間違って他のディレクトリの同じ名前のファイルを開いてしまうケースがあったのを修正。
  • コマンドラインの計算機で、long 型の整数を扱えるようにした。
  • W キーによる、ファイル名比較選択で、ファイル名の大文字小文字を区別せずに比較するようにした。

内骨格では、Pythonから、ctypes をつかって、統合アーカイバのDLLを使うようにしている。
(ただし、zip や tgz については、Pythonの標準ライブラリを使っているので、統合アーカイバを使用しない。)

    http://www.csdinc.co.jp/archiver/

"統合"といっても、アーカイブからファイルを1つ取り出すための処理は、DLLの種類ごとに
ことなっている。


内骨格のなかでは、 以下のようにしてアーカイバDLLに対応する。

-----------------------------------------------

class LhaArchiver(Archiver):
  
    def __init__(self):
        Archiver.__init__( self, "unlha32.dll", "Unlha", True )
      
    def extract( self, hwnd, filename, dst_dirname, name ):
  
        if type(filename)==type(''):
            filename = unicode(filename,'mbcs')

        if type(dst_dirname)==type(''):
            dst_dirname = unicode(dst_dirname,'mbcs')

        if type(name)==type(''):
            name = unicode(name,'mbcs')

        dst_dirname = os.path.normpath(dst_dirname)
        if dst_dirname[-1]!="\\":
            dst_dirname += "\\"

        cmdline = u'e -+1 -n1 "%s" "%s" "%s" -p' % ( filename, dst_dirname, name )
        #print cmdline
      
        buf = ctypes.create_unicode_buffer(1024)
        ret = self._call( None, cmdline, buf, 1024 )
        if ret : raise ArchiverError(ret)

-----------------------------------------------


今回の修正は、cmdline の文字列に、-p を付け加えた、というものだ。

UNLHA32.DLLのドキュメントを見たら、コマンドのオプションがたくさんあって、
正直、使い方が正しいのか自信がない。
 

2010年2月14日日曜日

INFAMOUS クリア

INFAMOUSやっとクリアした。
善人プレイだ。

ビルをよじ登ったり、ワイヤーの上を滑り降りたり、
といった超人アクションと、

敵との戦闘の自由度の高さ、

それに、ヘリコプターの追跡や囚人の移送などの
バリエーションに富んだミッション、

バランスの取れた良質なゲームだ。
日本ではそれほどセールスが振るわなかったようだが、
海外では割と売れたみたい。

2010年2月13日土曜日

内骨格 1.92 タイムスタンプがおかしくなる問題を修正

ファイルコピー時に、タイムスタンプがおかしくなる場合があるのを修正した。

SYSTEMTIME に時刻をセットして
SystemTimeToFileTime に渡す際、SYSTEMTIMEの wMilliseconds が
初期化されていなかった、という初歩的なミスだった。

Cの構造体は、とにかく memset しておけということだ。

2010年2月12日金曜日

内骨格 1.91

内骨格 1.91 を公開した。

アーカイブが開かれっぱなしになってしまう現象を修正したつもりだ。

Pythonのような、ガーベージコレクタを搭載した言語では、
ファイルのクローズ処理も、オブジェクトの自動的な破棄に
任せてしまいがちだが、ファイルのクローズ処理のような、
アプリケーションの利用者に影響の大きい処理については、
ガベージコレクタに任せず、close() を明示的に呼ぶほうがよい。

2010年2月11日木曜日

keyhac 1.13 Altキー単体押し、など

keyhac 1.13 を公開した。

以前から、ユーザさんからレポートを受けたりして
気になっていた問題を修正した。

keyhac を使用すると、
Altキーを単体で押したときに、メニューバーにフォーカスが移動しなくなったり、
秀丸 や Apsaly といったテキストエディタの、ファンクションキーの表示が、
Shift や Ctrl を押したときに切り替わらなくなったり、、、
といった、問題だ。

しばらくは、まったく理由が分からなかったが、
結局、pyauto.Window.getFocus のなかで、win32の GetFocus() を呼ぶ前後で、
AttachThreadInput を呼び出して、スレッドのインプット状態を結び付ける処理を
行っているのが影響していることがわかった。

ややこしかった!

あと、WH_KEYBOARD_LL で設定するプロシージャが、フックDLLのなかにないといけないという
勘違いをしていて、プロセス間通信を行うような実装になっていたけど、
そんな必要はないことが分かった。

2010年1月31日日曜日

内骨格 1.90

内骨格の 1.90 を公開した。

1 .90 - 2010/01/31
  • Tar系アーカイブの展開で失敗するケースがあったのを修正
  • アーカイブファイルがオープンされっぱなしになってしまう問題の調査のために "_RefererTree"コマンドを追加。
  • ネイティブライブラリを Cygwin の 1.7.1(0.218/5/3) を使ってビルドするようにした。
  • アップデートパッケージのZIPファイルによっては、ネットワークアップデートできないケースがあるのを修正。
1.89 以前のバージョンの、ネットワークアップデート機能に問題があって、今回はネットワークアップデートに失敗してしまう。
フリーソフトなので、割り切って、手でアップデートしてもらうことにした。( お手数おかけします。 )

また、ずっと気になっていながら、なかなか修正できていなかった、[アーカイブファイルオープンされっぱなし問題]の調査のために 、こんかい _RefererTree というコマンドを追加した。

python の gc モジュールを使って、特定のクラスのオブジェクトが残存しているか、残存しているならどのオブジェクトから参照されているのか、を探索するためのデバッグ用の機能だ。

内骨格のコマンド入力欄で、_RefererTree;ZipInfo;5 のように入力すると、ZipInfoクラスの残存具合が以下のように出力される。





ソースは以下のような感じだ。

    def command_RefererTree( self, args ):
   
        kwd = args[0]
   
        max_depth = 5
        if len(args)>1:
            max_depth = int(args[1])
   
        known_id_table = {}
       
        gc.collect()
        objs = gc.get_objects()
       
        def isRelatedObject(obj):
            if type(obj).__name__ == kwd:
                return True
            if type(obj).__name__ == 'instance':
                if obj.__class__.__name__ == kwd:
                    return True
            return False           
           
       
        def dumpReferer(obj,depth):
           
            if known_id_table.has_key(id(obj)):
                return
            known_id_table[id(obj)] = True
           
            str_type = str(type(obj))
           
            if str_type.find("'instance'")>=0:
                str_type += " " + str(obj.__class__)
            print "   " * depth, str_type

            if depth==max_depth: return

            referers = gc.get_referrers(obj)
            for referer in tuple(referers):
                dumpReferer(referer,depth+1)
           
       
        print "---- referer --------"
       
        for obj in tuple(objs):
            if isRelatedObject(obj):
                dumpReferer(obj,0)

        print "-----------------------------"

2010年1月24日日曜日

CraftMemo 1.07 で プロキシ越しの同期に対応

CraftMemo 1.07 で プロキシ越しの同期に対応した。

会社と自宅の両方のPCに、プライベートなメモを共有するのに便利だ。

あとは、自動同期機能かな、、、

gdata API の プロキシ設定

CraftMemo で使用している Google Data API では、プロキシの設定に環境変数を利用するようだ。

CraftMemoでは、以下のようにして IEの設定を利用しながら、Google Docsにアクセスしている。

        try:
            proxy_setting = cmemo_misc.getIEProxySetting()
        except:
            proxy_setting = None
           
        if proxy_setting:
            http_proxy = "http://"  + proxy_setting
            https_proxy = "https://"  + proxy_setting
            os.environ['http_proxy']  = http_proxy
            os.environ['https_proxy'] = https_proxy

Pythonで IE のプロキシ設定を取得する

 IEのプロキシ設定は、レジストリに保存されている。
Python の _winreg モジュールを使えば、レジストリにアクセスできる。

import _winreg

## IEのプロキシ設定を取得する
#
#  @return IEのプロキシ設定 ( "proxy.server.net:8080" のような形式 ) または プロキシ設定が無効な場合は None
#
def getIEProxySetting():

    proxy_setting = None

    reg_handle = None
    try:
        reg_handle = _winreg.OpenKeyEx( _winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", 0, _winreg.KEY_READ )
        proxy_enable, reg_type = _winreg.QueryValueEx( reg_handle, "ProxyEnable" )
        if proxy_enable:
            proxy_setting, reg_type = _winreg.QueryValueEx( reg_handle, "ProxyServer" )
    finally:
        if reg_handle:
            reg_handle.Close()

    return proxy_setting

2010年1月23日土曜日

keyhac 定型文や日時の貼り付け機能

keyhac の 1.12 をリリースした。

定型文や日時などを貼り付ける機能を追加した。




以下のように、 config.py に記述することで、定型文を追加することが可能だ。
クリップボード履歴リストのウインドウで、カーソルキーの ← →を押すことで、
keymap.cblisters に与えたリスト機能が切り替わるようになっている。

        # 定型文
        fixed_items = [
            ( u"name@server.net",     u"name@server.net" ),
            ( u"住所",                u"〒東京都品川区123-456" ),
            ( u"電話番号",            u"03-4567-8901" ),
            ( u"config.pyを編集",     keymap.command_EditConfig ),
            ( u"config.pyをリロード", keymap.command_ReloadConfig ),
        ]
       
        # 日時をペーストする機能
        def dateAndTime(fmt):
            def _dateAndTime():
                return datetime.datetime.now().strftime(fmt)
            return _dateAndTime   

        # 日時
        date_and_time_items = [
            ( u"YYYY/MM/DD HH:MM:SS",   dateAndTime("%Y/%m/%d %H:%M:%S") ),
            ( u"YYYY/MM/DD",            dateAndTime("%Y/%m/%d") ),
            ( u"HH:MM:SS",              dateAndTime("%H:%M:%S") ),
            ( u"YYYYMMDD_HHMMSS",       dateAndTime("%Y%m%d_%H%M%S") ),
            ( u"YYYYMMDD",              dateAndTime("%Y%m%d") ),
            ( u"HHMMSS",                dateAndTime("%H%M%S") ),
        ]

        keymap.cblisters += [
            ( u"定型文",         cblister_FixedPhrase(fixed_items) ),
            ( u"日時",           cblister_FixedPhrase(date_and_time_items) ),
            ]


ポイントは、決まった文字列だけでなく、呼び出し可能なオブジェクトを渡すことが出来るというところだ。
関数からペーストする瞬間の日時をテキストとして返すと、その文字列がペーストされる。

2010年1月20日水曜日

keyhac クリップボードからの引用貼り付け

クリップボード履歴の機能で入れ忘れていたのが、
引用貼り付けと、定型文の機能。

keyhac の 1.11 では、引用貼り付けを追加した。

Ctrl + Enter で、クリップボード履歴リストを選択すると、

> 引用記号の設定
>
>     引用記号の設定例::
>         keymap.quote_mark = "> "
>
>     keymap.quote_markに、クリップボードからの引用貼り付け時の記号を設定します。

こんなふうに、引用記号つきでペーストされる。

keymap.quote_markを設定することで、引用記号をカスタマイズ可能だ。

2010年1月18日月曜日

keyhac 1.10 で クリップボード履歴機能を追加

kayhac に クリップボード履歴機能を追加した。




クリップボード履歴ソフトとして、これまで QTClip を愛用していたのだけど、
クリップボードの履歴の中から、目的のアイテムを探し出すのが難しいことがあった。

今回 kayhac に追加したクリップボード履歴機能では、履歴リストをインクリメンタルサーチで検索することが出来る。また、Migemo をつかった日本語のローマ字検索も可能だ。





テキストのみ対応。

2010年1月16日土曜日

Google Docs Drive

Google Docs に、任意のファイルを添付できるようになるらしい。

http://internet.watch.impress.co.jp/docs/news/20100113_342025.html

そうなったら、きっと誰かが、Google Docs Drive を作るんだろうな。

Gmail Drive みたいに、時々使えなくなるような、アンダーグラウンドっぽい
ものではなくて、gdata API をつかって、堂々と利用できるはずだ。(たぶん。)

内骨格でも、gdata API をつかえば、、、、

PS3 地デジ録画キット torne

PS3の地デジ録画キット torne が話題になっている。



http://www.jp.playstation.com/ps3/torne/
http://av.watch.impress.co.jp/docs/news/20100114_342212.html

ヨーロッパで発売された、PlayTV という、録画キットがあったのだけど、
Torneでは、ユーザインターフェイスも 一新されて、明るい印象に。
WEBでは、おおむね好評みたい。
ゲーム中でも録画されるしね。

リビングに浮いているPS3があるので、それ用に買おうかな、、、と。


ちなみにPlayTVの動画はこちら。

PS3navi.com

2010年1月11日月曜日

SkyDrive に Python からアクセスする


Pythonスクリプトから SkyDrive を読み書きしたいと思って、
以下のような作戦を考えた。

  1. SkyDrive Explorer をインストール
  2. Python と comtypes も、未だならインストール
  3. COMをつかって、SkyDrive Explorer のアイテムを取得する

Gmail Drive の場合はこれでうまくいくのだけれど、
SkyDriveの場合は、なぜかうまくいかない。

-----------------------------------------------------------------------------
import comtypes.client

skydrive_item_name = u"SkyDrive Explorer"

def listSkyDriveItems():

    shell_app = comtypes.client.CreateObject("Shell.Application")
    my_computer = shell_app.NameSpace(0x11)

    skydrive_item = None
    for item in my_computer.Items():
        if item.Name==skydrive_item_name:
            skydrive_item = item
   
    if not skydrive_item:
        print "skydrive not found."
        return
   
    folder_obj = skydrive_item.GetFolder
   
    # FIXME : ここで、なぜかaccess violationが発生する
    for i in folder_obj.Items():
        print i.Name
   
    print "finished"   

listSkyDriveItems()
-----------------------------------------------------------------------------
 Traceback (most recent call last):
  File "skydrive.py", line 27, in
    listSkyDriveItems()
  File "skydrive.py", line 22, in listSkyDriveItems
    for i in folder_obj.Items():
  File "c:\python26\lib\site-packages\comtypes\automation.py", line 507, in next

    item, fetched = self.Next(1)
  File "c:\python26\lib\site-packages\comtypes\automation.py", line 528, in Next

    self.__com_Next(celt, v, fetched)
WindowsError: exception: access violation writing 0x00000000


-----------------------------------------------------------------------------
 さて、、、

インファマス ~悪名高き男~ (PS3)

ビルによじ登ったり、高いところからジャンプしたり。

PS2のスパイダーマンとか、Xboxのライオットアクトが好きな人なら、
このゲームも気に入ると思う。