シグナルというのは、どんなものなのか..?

linuxに明るくないので、これも調べてみた。

signalについて(@CodeZine)
シグナルとコールバック(@Super Technique 講座)

とりあえず大雑把な概要は、”割り込み処理を実現する機能のこと” だった。(プロセス間で非同期に割り込み処理を発生させるのが主な目的。)
Python使っていてなじみ深い割り込みっぽい動作というと例外処理だけど、シグナルはホントに処理中になんの脈絡もなく(いや..実際はちゃんと脈絡はあるんだけど。処理的にはコードの実行順序に全く関係ないタイミングで)他の処理を割り込ませることができる。

例外処理は、あくまでも実行している処理に問題があった場合に特別な分岐を発行できるだけなので、”割り込み処理”ではない。
割り込み処理は字面通り、今行われている作業を中断して別の処理を行わせるもので、仕事の最中に電話が割り込みで掛かってきたので電話を受けた、みたいな感じ。このなんの脈絡もなく電話が掛かってくる、というのがシグナル処理のイメージ。
※電話を受けるには、机に電話があり、掛けてくる相手も必要。シグナルを準備する部分(図の”生成”)は、電話を受ける為の下準備としてそういうものを用意していると考えれば判る?
※実装上は、どういう種類のシグナルが上がった場合にどのハンドラ関数が呼ばれるか、を記述する。

シグナル

シグナルの方は、何秒後に自動的に発行とか、子プロセスにシグナルを送るとか、そういう感じで使われる。
昔のTVゲームでは(ハードウェア)割り込み処理というのは頻繁に使われていた。
※割り込み発行することで、音源モジュールを叩いて一定のテンポでBGM再生させたり、画面の垂直同期を拾って一定のfpsで画面の書き換えを促したり。主に速度調停用に使っていた。

最近のPCは処理速度がやたら早く待ち時間の方が多くなっているので、昔のように目の前の処理でいっぱいいっぱいにはならず、むしろポーリングで次のタイミングをひたすら待つ感じ?? あまり馴染みのない機能かもしれない..
自分は、linuxのようなOSレベルの割り込み処理も使ったことがないので、そっちのほうに具体的なイメージがわかなくて、まだいまひとつピンときていない。

Pythonのシグナルの例は、タイムアウト処理を実現していた。(⇒例)
※普通にファイルをopenすると応答なしになってしまう場合を想定して、事前のシグナル設定で「(タイムアウト処理として)5秒後に、例外を発生させる割り込みが起こる」というもの。

subprocessで生成した子プロセスをterminateする場合に、ファイルハンドルを掴んだままにならないのか?

特にWindowsを使っている場合の話だけど、疑問だったのでググってみた。

これは「subprocess.Popen(.., Shell=True) で掴みっぱなしになるのは何故?」という質問と回答
Python subprocess kill doesn’t release the file handle

どうもShell=Trueにした場合は、直接のプロセス起動じゃなくShellを挟む形なんで動作が違うよ、ってことが言いたいらしい。
※要約すると、Windows環境の場合子プロセスの子プロセスは止まってない。だから掴みっぱなしになっている。という感じ。
※Shell=Trueの場合、subprocess.Popenすると、子プロセスはコマンドプロンプトのプロセスで、孫プロセスが実際のコマンドのプロセスになる。子プロセスを止めても孫は残るのでそこでファイルを開いていると、孫が終了しない限り孫プロセスがファイルを掴んだまま居座り続ける。

で、細かいことは ↓ を見てね、と。

こっちは、「子プロセスを止めたハズなのにまだ動いてる。これは何故?」という疑問と回答。
subprocess: deleting child processes in Windows

根本的には、多重にプロセス起動が起こっているので自分の注目しているプロセスだけを止めても、その他に作られたプロセスが動きっぱなしになってしまう。それらを再帰的に収集して止める方法や、taskkillコマンドを使う方法などの回答や考察が書かれている。

どうも、デフォルト設定では Shell=Falseだし、基本的にはそんなに心配しなくても良いってことなんだろうか?

で、その安全性の根拠..

Windowsの場合は、”プロセス終了時にすべてのオブジェクトハンドルが開放される”。
TerminateProcess(@MSDN)

プロセスを終了させると、次のことが発生します。

1.このプロセスが開いたすべてのオブジェクトハンドルが閉じられます。

2.プロセス内のすべてのスレッドが動作を終了します。

3.プロセスオブジェクトがシグナル状態になり、そのプロセスが終了するのを待っていたすべてのスレッドの条件を満たします。

4.プロセス内のすべてのスレッドがシグナル状態になり、それらのスレッドが終了するのを待っていたすべてのスレッドの条件を満たします。

5.プロセスの終了ステータスは、STILL_ACTIVE から、そのプロセスの終了コードへ変化します。

プロセスを終了させても、その子プロセスが終了することはありません。

プロセスを終了させても、必ずしもそれに対応するプロセスオブジェクトがシステムから削除されるわけではありません。プロセスに 1 つまたは複数のハンドルが割り当てられている場合、最後のハンドルを閉じると、プロセスオブジェクトが自動的に削除されます。

Raspberry Pi で sidplay2を使うには

めも。

http://www.tomconte.fr/post/45585760299/transforming-your-raspberry-pi-into-a-retro-c64-juke

手順的には、以下の通り。(apt-cache search sidplay の行は要らないかも..)

$ sudo apt-get update
$ apt-cache search sidplay
$ sudo apt-get install sidplay

演奏しようとして以下のようなメッセージが出る場合は、サウンドドライバがロードされていない。

$ sidplay2 hoge.sid
/dev/dsp: No such file or directory

サウンドドライバのロードを行うには、以下を実行する。

$ sudo modprobe snd_pcm_oss

※modprobeは、カーネルモジュールのload/unloadコマンド。
※snd_pcm_ossは、ALSAのOSSエミュレーション用ドライバ。
※⇒http://manual.atmark-techno.com/armadillo-500/armadillo-500-dev_startup_guide_ja-1.3.2/ch11.html

MScriptUtilによる 引数(C形式のポインタ)の取り扱い

ここ、ちゃんと読めっちゅう話ですが。。
MScriptUtil Class Reference

たとえば、OpenMaya.MTransformationMatrix.setShear関数に値を設定する場合。
関数定義は、以下の通り。

Pythonで設定するには、 以下のように記述。

逆に、受け取る場合。

じゃあ、こんな関数の場合は..というと。

こんなふうに書くと。

でも、いちいち maya.OpenMaya.MScriptUtil()を受けて、.createFromDouble(0.0)で .asFloatPtr()の.. とか無駄なので、一連の処理は関数化しようね。というのが、以下の説明。

またこの時、『以下のようには書かないからね!』..と書かれています。

これは..
・『u_ptr = u_util.asFloatPtr()』と処理された後、u_utilは関数を抜けると破棄される。
・そうなっらた u_ptrも使えなくなるよ!
・なので、ポインタと生成オブジェクトは対にして扱ってね。
..ってことです。(説明では、u_utilが定義されたスコープを外れて破棄されたら、u_ptrも無効になる..というようなことが書かれてる。)

実際にはC向けの型定義は以下の種類があるので、暇な時にちまちま書き足すなり一気に書く下すとかして、get~Ptr関数を用意しておくと便利っぽいです。

Pythonモジュールのインストールで ValueError: [u’path’] で止まる場合

めも。

http://blog.loadlimits.info/2012/03/installing-hg-git-for-windows7-x64/

PhotoShopファイルの仕様について

めも。

http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/

TIFFもついでに。
http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf

【補足】

pythonを使っていて、モジュールのインストールにも困らなければ、以下のモジュールを利用する方が手っ取り早いかも..

https://pypi.python.org/pypi/psd-tools
https://pypi.python.org/pypi/tifffile/0.3.3

シーン上のネームスペースを取得するには

そんなに必要になる場面はないけど、たまーに欲しいなーという状況はある。
melコマンドでも再帰的に収集すれば可能だけど、OpenMayaの MNamespace.getNamespaces関数なら関数1発で終わる。

>Return a list of all namespaces in the current namespace.
ということなので、シーン上のすべてのネームスペースを取得するには、カレントのネームスペースをルート階層に設定してから関数を呼び出す必要がある。

正しくないジオメトリの判断基準

 そもそも「”正しくないジオメトリ”とは、なにか」という話が先にあって、一概に “正しいもの・正しくないもの” という線引きが出来ないのですが…

 自動判定を実装しようとすると、どうしても判定基準が必要なのです。
 それでググってみたら下記のサイトが出てきた、という話。

 FIXに関しては人によるので、判定だけ参考にしたい。(機械でやっても一意に求まるようなものはFIX機能も便利だと思うけども、勝手に弄られるとどうなるか予測できないのは気持ち悪いと感じる人も居るので)

Tutorial: Bad Geometry – How to find and fix it

グレーのコネクション

メニュー Show > Show Auxilialy Node で、グレー表示部分を編集可能に。
グレーのコネクション_1 グレーのコネクション_2
グレーのコネクション_3
そういえば、groupId, groupPartsの編集ができるかどうかは謎のままだった。
現状この手の話は、このサイトこのサイトくらいしか知らない..全くもって別件のネタだけど。

maファイルを見る限り、groupPartsノードにフェースとかどのコンポーネントが属すのかって情報が記憶されて、groupIdはgroupPartsで定義された範囲をID管理してるって感じですかね。

groupPartsで記憶してる範囲を再選択・再登録みたいな機能はどっかにあるのかしら?