TortoiseSVNをMac OSXで使う

ニーズは結構あるんですよね。デザイナとかMacユーザ多いし。Macユーザに聞くとMacのSubversionクライアントには決定打がないとも。

TortoiseSVN for Apple OSX

Wineとかで何とかTortoiseSVNをMac上で動くようにしてしまおうという記事。まだ試してないですが、時間があるときにMac miniにインストールしてみよう。


PythonでWebカメラから静止画を撮影してみる

あ、Windows Live Writer新しくなってから始めて使ったわ…

VideoCapture(名前ないのか…)を使うと楽にカメラが扱える。

PILをインストールしてから、VideoCaptureの当該バージョンを自分のPythonインストールディレクトリに上書きすればいいだけ。

実行環境はWindows Vista Ultimate+Qcam Pro for notebook+Python 2.5

ソースは以下。超簡単。

import re
import time
from VideoCapture import Device

def main():
    t = time.time()
    cam = Device(devnum=0,showVideoWindow=1)
    print time.time() - t
    cam.setResolution(640,480)
    print time.time() - t
    for i in xrange(100):
        print time.time() - t
        cam.saveSnapshot('testtestimage%d.jpg' % i)
    print time.time() - t

if __name__ == '__main__':
    main()

実行結果は以下の通り。わりと早いし安定してる気がする。初回のsaveSnapshotで時間がかかるのか。以降は0.02秒程度なので余裕。今後実用してみて耐久性を見る予定。

0.680999994278
0.891999959946
0.891999959946
2.18300008774
2.20499992371
2.22799992561
2.25200009346
2.27399992943
2.29699993134
2.33400011063
2.35700011253
2.38000011444
2.40300011635
2.42499995232
2.4470000267
2.46900010109
2.49099993706
2.5150001049
2.53699994087
2.56100010872
2.58599996567
2.60800004005
2.63100004196
2.65700006485
2.6779999733
2.70199990273
2.72499990463
2.74699997902
2.77200007439
2.79399991035
2.81900000572
2.84200000763
2.86400008202
2.88800001144
2.9240000248
2.94600009918
2.96900010109
2.992000103
3.01399993896
3.03900003433
3.06399989128
3.08800005913
3.11100006104
3.132999897
3.15499997139
3.18700003624
3.20900011063
3.23200011253
3.25699996948
3.27999997139
3.30500006676
3.32699990273
3.34899997711
3.37199997902
3.39299988747
3.41400003433
3.43600010872
3.45900011063
3.48000001907
3.50300002098
3.52500009537
3.54600000381
3.56900000572
3.59100008011
3.61299991608
3.63499999046
3.65799999237
3.68000006676
3.70300006866
3.72399997711
3.7460000515
3.76900005341
3.79099988937
3.81299996376
3.83500003815
3.8599998951
3.88199996948
3.90599989891
3.92700004578
3.9470000267
3.97799992561
4.0
4.02200007439
4.04500007629
4.06699991226
4.09100008011
4.11500000954
4.13599991798
4.15899991989
4.1819999218
4.20399999619
4.22600007057
4.24900007248
4.27200007439
4.29299998283
4.31699991226
4.33899998665
4.36299991608
4.38400006294
4.40499997139
4.42499995232
4.44900012016
4.47000002861

ちなみにshowVideoWindow=1はカメラのウィンドウを表示するモードなので、0にしてテストもしてみたが、時間の増加量は大差ない模様。

あと、Qcamのオートフォーカスを効かせるためには一度saveSnapshotしてから、しばらくおかないとダメらしい。試してないけど、getImageでも多分平気。

キャプチャボードとかのソースでもいけるっぽいので、何かできそう。というか、DirectShowソースか。画面キャプチャで何かできるかな…


Pythonで書かれたDLNAサーバ

Coherence – a DLNA/UPnP Framework for the Digital Living – Trac

こんなものがあったのかー。Pythonで書かれたDLNAのサーバ/クライアント。多分。

MIT Licenseだし、活発に動いているようだし、期待できる。何かに使えるかも。

例えば…何だろう。DLNA Gateway?

あ、Milestone見るとflv→mp4の変換が予定されてて、YouTubeが見られるようになるらしい。ということはちょっとプラスアルファで頑張ればニコ動も行ける可能性ありでは?トランスコードの合間に字幕突っ込んで。

映像だけじゃなく、Webの文字コンテンツとかとの連動も楽しいかもしれない。


PythonでHIDからiSerialNumberを取得

USBデバイスからiSerialNumberを取得するべく悪戦苦闘していた。

kernelのDeviceIoControlで何とか取得することには成功したのだけど、さらに調べてみるとhid.dllにHidD_GetSerialNumberStringという関数があるのを発見。

hid = windll.hid
buf = c_ubyte * 0xff
buf = buf()
print hid.HidD_GetSerialNumberString(handle, byref(buf), 0xff)
print buf[0:]

こんな感じでOK。Pythonの場合。バッファは適当。最大128ワイドキャラクタとか書いてあったけど。

HidD_GetSerialNumberString(MSDN)


PyUSBがVistaで使えないという話。

libusbをWindows Vistaに入れるとUSB機器全般使えなくなるらしい。

Pythonで開発中のUSBデバイスの操作に、PyUSB使おうと思っていただけに非常に残念。しかもlibusb-win32のこの更新頻度では対応の見込みは厳しそうだなぁ…

PyUSBがVistaではhid.dllを使うようになってくれたりしたらいいのかも。

調べてる最中に見つけた面白そうなものをメモ。

八角研究所 : レゴマインドストームNXTをPythonから操作するNXT_Pythonを使ってみる(1) – とりあえず走らせてみよう

独学Linux:WiiリモコンでBerylを動かす方法《実践編No.1》 – livedoor Blog(ブログ)

しかしPythonのライブラリの豊富さは何なの?

[追記]

libusb-win32のバックエンドにWinUSBを使う開発が進行中らしい。

LibUsb-Win32 – osdev-j (MMA) 

SourceForge.net: libusb-win32-devel

ちゃんと進行してるっぽい。2009年くらいのリリースとか。

でも自分の用途には間に合わないけどね!


Visual Studio 2005でIronPython

IronPythonで.NETでMONOでWindowsもMacOSXもまとめてヒャッハーしたくなったのでとりあえず導入してみた。

こちらのサイトがわかりやすい。
もう何時でもリリース出来るのでは? IronPython for Visual Studio 2005の9月版 – ふにゃるん

導入した時点のバージョンは「Visual Studio 2005 SDK Version 4.0」

ダウンロードはこちらから。
Download details: Visual Studio 2005 SDK Version 4.0

2007年2月版だったけど、インストール作業自体は上記と何も変わらず。

さっくり動いて超便利。

ところで、IronPythonって2.4系なのかー。

[追記]
と思ったらIronPython2.0のStableが4日前に来てたー!

http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=8365

こっちは2.5 compatibleでっす。

あぁ…VS2008を買おうか迷う。


iPhone SDKと"A signing identity matching this profile could not be found in your keychain."

iPhone SDK 2.2が出たタイミングで、そろそろ開発をしようと思い、ひとまず環境を構築中…

Xcodeのオーガナイザで、PROVISIONING PROFILESに「A signing identity matching this profile could not be found in your keychain.」と表示されて実機に転送できない現象があった。

色々調べて見たら、Developer ProgramのCertificatesから、自分で登録したキーをダウンロードしてキーチェーンに取り込まないといけなかったらしい。

登録してXcode再起動したら見事に実機に転送できるようになりました。

自分のところで作ったキーだからと油断してたわ…うぁー。


CakePHP 1.2でオーバーライドが効かなくなる

レアケースだし、何かしらのミスだと思うのだけど一応。

app_controller.phpをはじめ、app/側に何を置いてもcake/側のファイルが優先されてしまって処理が効かないという現象があった。

app/tmp/cache/以下のキャッシュファイルを全部消したら直った。

直らなくて数時間無駄にしてしまった…


CakePHP 1.2でXML-RPCサーバを作る

CakePHPでXML-RPCを受取る方法を調べていたら、タイムリーに超便利な方法が紹介されていた。

How to create an XML-RPC server with CakePHP (Articles) | The Bakery, Everything CakePHP

やることは2つ。

  1. xmlrpc.zipをダウンロードして、解凍してapp/vendorsに置く
  2. コントローラを書く

てっとり早く、上記サイトからxml_rpc_controller.phpをコピーして作成すると、設置も簡単に行える。

メソッドごとにコールバックを定義していけばOK。

前回のエントリ[Pythonで簡単にXML-RPCクライアント : blog.loadlimits – digital matter –]で書いたPython版のクライアントの場合はこんな感じで受け取れる。

<?phpApp::import('Vendor', 'xmlrpc');
class AddController extends AppController {
var $name = 'Add';
var $uses = array();
// The XML-RPC server object
var $server = null;
function index() {
// Disable debug information
// Required to generate valid XML output
Configure::write('debug', 0);
// Avoids render() call
$this->autoRender = false;
// XML-RPC callbacks settings
// Use this parameter to map XML-RPC methods to your protected or private controller methods
$callbacks = array();
$callbacks['sample.hogehogeAPI'] = array(&$this, '_saveData');
// Handle XML-RPC request
$this->server = new IXR_Server($callbacks);
}
function _saveData($data = array()) {
ob_start();
var_dump($data);
$str = ob_get_contents();
ob_end_clean();
return $str;
}
}
?>

結果はこんな感じ。

array(6) {
  [0]=>
  array(1) {
    ["image"]=>
    string(4) "hoge"
  }
  [1]=>
  array(1) {
    ["username"]=>
    string(4) "name"
  }
  [2]=>
  array(1) {
    ["title"]=>
    string(10) "item title"
  }
  [3]=>
  array(1) {
    ["mail"]=>
    string(11) "user e-mail"
  }
  [4]=>
  array(1) {
    ["comment"]=>
    string(12) "item comment"
  }
  [5]=>
  array(1) {
    ["itemlist"]=>
    array(4) {
      [0]=>
      int(3)
      [1]=>
      int(2)
      [2]=>
      int(3)
      [3]=>
      int(1)
    }
  }

非常に便利。


Pythonで簡単にXML-RPCクライアント

Pythonでxmlrpclib使うと、簡単にXML-RPCが扱える。

FlashとサーバサイドでXML-RPC使おうとしたときに、サーバ側のAPIのテストと、XMLのサンプルをFlash作る人に渡したりするのだけど、それがちょこっと書くだけでできるので便利。何せ2行で済む。

# -*- encoding: utf-8 -*-
import xmlrpclib

print xmlrpclib.dumps(
    (
        {'image':xmlrpclib.Binary('hoge')},
        {'username':u'name'},
        {'title':u'item title'},
        {'mail':u'user e-mail'},
        {'comment':u'item comment'},
        {'itemlist':[3,2,3,1]}
    ), 'sample.hogehogeAPI')

結果はこんな感じに。

<?xml version='1.0'?>
<methodCall>
<methodName>sample.hogehogeAPI</methodName>
<params>
<param>
<value><struct>
<member>
<name>image</name>
<value><base64>
aG9nZQ==
</base64></value>
</member>
</struct></value>
</param>
<param>
<value><struct>
<member>
<name>username</name>
<value><string>name</string></value>
</member>
</struct></value>
</param>
<param>
<value><struct>
<member>
<name>title</name>
<value><string>item title</string></value>
</member>
</struct></value>
</param>
<param>
<value><struct>
<member>
<name>mail</name>
<value><string>user e-mail</string></value>
</member>
</struct></value>
</param>
<param>
<value><struct>
<member>
<name>comment</name>
<value><string>item comment</string></value>
</member>
</struct></value>
</param>
<param>
<value><struct>
<member>
<name>itemlist</name>
<value><array><data>
<value><int>3</int></value>
<value><int>2</int></value>
<value><int>3</int></value>
<value><int>1</int></value>
</data></array></value>
</member>
</struct></value>
</param>
</params>
</methodCall>

簡単すぎる…

んで、この結果をFlashの人に渡して、こんな感じで送ってくれと言える。

サーバのAPIをテストする場合は

# -*- encoding: utf-8 -*-
import xmlrpclib

server_url = 'http://sample.dev/add';
server = xmlrpclib.Server(server_url);

result = server.sample.hogehogeAPI(
        {'image':xmlrpclib.Binary('hoge')},
        {'username':u'name'},
        {'title':u'item title'},
        {'mail':u'user e-mail'},
        {'comment':u'item comment'},
        {'itemlist':[3,2,3,1]}
    )

こんな感じで書き換えてやればOK