Pythonスクリプトのデーモン化

ホッタラカシのSenseHATを動かしてみる。

LEDへ時計を上3段に表示、2進数表示なので可読性は全くなし。
4段目はメモリ使用率、残り4段をCPUコアの使用率を表示してみました。

Rasbian StreachにはSenseHAT用Pythonモジュールも既にインストールされている状態なので、難しい設定は無し。APIリファレンスを読めば特に難しいところもなく、、、

それだけでは面白くないのでsystemdによるデーモン(サービス)化もしてみました。十分な理解は出来てませんが、以下Pythonスクリプトです。

続きを読む “Pythonスクリプトのデーモン化”


Maya:ノードタイプの階層構造を取得する

記事投稿の頻度が少ないせいで、いつも記事の書き始めに困ります。一か月ぶりのくせして唐突に天気の話は無いし同じ理由で時事から始めるのもね。かといっていきなり本題から切り出すのも冷たい感じがします。

日を置かずに書くのが一番なんですけどね。

それでは本題、

containerBaseノードタイプをルートとした階層構造

Mayaのノードタイプの階層いわゆる上の図のような継承関係を知るには以下の2つがあります。(スクリプトはMaya2017で検証したものです)

一つ目、下は「mesh」ノードの継承元を調査します。

import pymel.core as pm
print pm.nodeType('mesh', inherited=True, isTypeName=True)

結果は、

[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh']

「containerBase」ノードをルートとして機能やアトリビュートを継承していることが分かります。(ホントのルートは「node」というノードタイプのはずなのですが、何故かここでは得られません)

二つ目は逆、「deformableShape」ノードを継承しているノードを調査します。

import pymel.core as pm
pm.nodeType( typeName, derived=True, isTypeName=True )

結果は(長いので適当に改行します)

[u'nParticle', u'nRigid', u'nCloth', u'nBase', u'particle',
u'motionTrailShape', u'snapshotShape', u'bezierCurve', u'nurbsCurve', u'curveShape',
u'gpuCache', u'aiVolume', u'aiStandIn', u'VRayMetaball', u'VRayFurPreview',
u'VRayVolumeGrid', u'VRayPlane', u'VRayMeshPreview', u'VRayClipperShape', u'xgmSplineDescription',
u'xgmSplineGuide', u'xgmSphereGuide', u'xgmCardGuide', u'xgmArchiveGuide', u'xgmSubdPatch',
u'xgmNurbsPatch', u'xgmSplineGuide', u'xgmSphereGuide', u'xgmCardGuide', u'xgmArchiveGuide',
u'xgmGuide', u'xgmSubdPatch', u'xgmNurbsPatch', u'xgmPatch', u'xgmDescription',
u'bifrostShape', u'THsurfaceShape', u'fluidTexture2D', u'fluidTexture3D', u'fluidShape',
u'subdiv', u'nurbsSurface', u'greasePlaneRenderShape', u'mesh', u'heightField',
u'surfaceShape', u'lattice', u'controlPoint', u'deformableShape']

2つ組み合わせると、例えば「deformableShape」を継承するノードタイプの継承元をすべて知る事が出来ます。

import pymel.core as pm
nodetypes = pm.nodeType( 'deformableShape', derived=True, isTypeName=True )
for nodetype in nodetypes:
    print pm.nodeType( nodetype, inherited=True, isTypeName=True )

結果は(前半略)、

[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'subdiv']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'nurbsSurface']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh', u'greasePlaneRenderShape']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'heightField']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'lattice']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape'] 

のようになります。ひとくちに「deformableShape」ノードと言っても上のように継承したノードタイプがたくさんあることが分かります。

さてここからが本題、上記をもってある程度継承関係を知ることはできますがこれを木構造(階層)構造で取得したい場合は残念ながらコマンド一発でとはいきません。

続きを読む “Maya:ノードタイプの階層構造を取得する”

USBホストシールド

USBホストシールド 2.0 for Arduino (compatible with Google Android ADK)[amazon.co.jp]を購入して半田付けせんと動かんかったちゅー話。

商品画像は半田でブリッジしてあるんですけどね。矢印の箇所を3点、半田でくっつけてやると動きます。

Duemilanoveで無事動きました

で何する?会社にPS3やXbox、Wiiコントローラが結構余ってるのでなんぞできないかと。

昨年はAltJSの入り口を覗きました。今年はハードウェアの勉強をちょこちょこやって行く感じです。


Three.js on Electron + Typescript

Three.jsを動かして見た。ついでに今回はTypescript、あといらんかったけどgulpでトランスパイルの実行。

ビルドタスク(タスクランナー)の事とか、今回は使ってませんがBrowserify(tsify)とかimportとかrequireとかmoduleだの、exportだの、、、何から理解していけばよいやらなかなかはかどりません。UnityとかFlashの開発の容易さを改めて思い知らされました。

ダウンロード: threejs_test2

npm install してnpm run build && start で実行できるハズ。

ところでElectronのダウンロードってやたら時間がかかる事がありますね。> node install.js から止まったまま動いてるのかどうかわからないのが不安なんですが、例えば

$ npm install electron@^1.6.15 --save-dev --loglevel verbose

とすると、詳細な進捗を出力してくれるので、ちょい安心できます。


p5.js on Electron

ActionScriptの代替としてElectronの勉強をと言いつつ、仕事が忙しくなり全く手を付けていませんでしたが、ちょっと再開。

なにせ「Electronではじめるアプリ開発[Amazon.co.jp]」の敷居が高い!第3章の「チャットアプリケーションを作ろう」からES6(ES2015)のJavascriptで書き始めて、「import?」さっきまでの「require」はどこいったの?からのReactの浅ーい説明と、Webアプリの開発経験が無いと読み進めるのは難しい内容です。

てなことで、横道にそれて(逃げて?)「Electron上でProcessingを動かしてみる」です。

正確にはそのJavascript実装版の「p5.js」を動かしてみた!です。

Processing-Javaよりかなり重い

 

いままで作ってきたProcessingのスケッチには追加のライブラリが必要なものばかりでしたので使用せず、p5js.orgのFlockingを移植してみました。移植と言っても、p5をインスタンスモードで動かす事とFlockとBoidをモジュール化したってだけです。

モジュール化と読込はnode.jsのrequireで実装しています。ES2016ならimportやclassが使えるので書きやすいんですが、トランスパイルを挟む事になりp5が動かない時に問題の切り分けが今は上手くできそうにないので後回しです。今回書いたのはNode IntegrationなJavascriptという事になります。

つまづいた所が何点か、

いきなりElectromパッケージのインストールができませんでした。セキュリティソフトの「ESET Endpoint Antivirus」が邪魔をしていたらしく一時的にオフにする事で「npm install」を通すことができました。

あと、指定サイズぴったりのコンテンツサイズを用意したかったのですが、

win = new BrowserWindow({"width":800,"height":600,"resizable": false});

とするだけではウィンドウタイトルやウィンドウの枠、いわゆるクロームも含めたサイズのウィンドウが作成されます。

win = new BrowserWindow({"width":800,"height":600,"resizable": false,"useContentSize": true});

とすることでコンテンツサイズが800×600のウィンドウを作ってくれるのですが、Windowsで実行する場合に出るメニューバーを消したい場合、

win = new BrowserWindow({"width":800,"height":600,"resizable": false,"useContentSize": true});
win.setMenu(null);

とするとメニューバーの高さ分隙間が出来てしまいました。これは以下のようにウィンドウを作る前にメニューを消すことで対処しました。

Menu.setApplicationMenu(null);
win = new BrowserWindow({"width":800,"height":600,"resizable": false,"useContentSize": true});

複数のウィンドウを持ったアプリの場合は問題が出るかもしれません。

今回の成果物~electron_test_p5

展開したフォルダへシェルで移動して、$ npm install で必要なパッケージのインストールし、$ npm run start で実行できます。と思います。

道のり長いなー。