d.sunnyone.org
sunnyone.org

ページ

2013-10-14

PSWFWeb (PowerShell Workflow WebConsole) v0.0.1 をリリース

PSWFWeb (PowerShell Workflow WebConsole) version 0.0.1 をリリースしました。こんな感じで、ブラウザからPSWorkflowを走らせたり状態が見られたりするソフトです。


ダウンロードはこちらから。使い方は、READMEを見てください。


途中で挫折しかけてお蔵入りになるところだったのですが、スクリーンショットで反響を頂いたので、仕様を絞って最低限試せるレベルまで作ってみました。とはいえ自分でもあまり試せていないレベルなので、アグレッシブなことをすると、なにが起きるかはわかりません :)

ただでさえPowerShellはユーザーが多くないと思われるのに、PowerShell Workflowを使う人はさらに少ないと思いますが、ピンと来た人はぜひ使ってみてください。


造りとしては、Nancy という.NET向けのSinatraライクなフレームワークを使っています。これは主に、自身でWindowsサービスとなってWebをホストする(self-hosting)ためです。動作ユーザーを好きにさせるためと、将来(があれば)たぶん状態を持ってポーリングとかするだろうなと思ってWindowsサービスにするためにしています。

実際使ってみると、ASP.NET MVC (空)よりずっと依存関係が少なく、Sinatraの感覚がわかる人にはけっこうおすすめで使える感じです。内蔵のSuper Simple View Engineは、かなーりシンプルなのでRazorを持ってきたほうがいいかもしれませんが。

画面のほうは、PureというYahooが出しているWebフレームワークを使ってみました。Emailというレイアウトサンプルをほぼそのままの感じです。

ちなみに、Runtimeをhostingするわけではなく、Get-Job等々をPowerShellで呼び出しています。ほんとに*-Jobのwrapperというかんじ。

2013-09-25

AndroidからBluetooth機器にSPP (Serial Port Profile) で接続する

作ったデバイスにAndroidからつないでみようと思ってやってみた。まっとうに使ってもらおうとすると、他にもけっこういろいろ必要なのだけど、自分で使うくらいならわりと簡単にできる。

やりかた

  1. BluetoothAdapter.getDefaultAdapter()を使って、アダプタを得る。
  2. アダプタにisEnabled()を呼び出して、Bluetooth設定が有効なことを確認する。
    • インテントを出してユーザーに有効にしてもらうことも可能だけど、ここではしない。
  3. アダプタにgetBondedDevices()を呼び出して、ペアリングされたデバイスの一覧を得る。
    • 探索してペアリングされたデバイス以外から探すことも可能だけど、ここではしない。
  4. デバイスのプロパティを見て、欲しいデバイスを探し出す。
    • 本当はUI出して選んでもらうのがいいと思うけど、ここではしない。
  5. 欲しいデバイスにcreateRfcommSocketToServiceRecord()を呼び、必要なサービスのBluetoothSocketを得る。
    • SPP (Serial Port Profile)のUUID(00001101-0000-1000-8000-00805F9B34FB)を渡す必要があるので、定数定義しておく。
  6. BluetoothSocketにconnect()を呼ぶ。
  7. BluetoothSocketにgetInputStream() / getOutputStream()を呼んで、適当に操作する。
  8. BluetoothSocketにclose()を呼ぶ。


このへんのページのほうが詳しいので、「ここではしない」ことがしたければこちらを参考に...

罠

罠1) getDefaultAdapter()は、Gingerbread (2.3)では、UIスレッドでしか呼べない。


いかにもUIなんか関係なさげなメソッドなのに、Handlerが取れなくて例外が出る。4.1では起きないらしいけど、2.3じゃダメだと…ねぇ?
cf: https://groups.google.com/forum/#!msg/android-developers/wFbD5V2DWRc/gv0VF4Y6ICwJ

罠2) BluetoothSocket#connect()は「Service discovery failed」でたまに失敗する

Webを見るとよくある話のようで、ウエイトを入れたり、アダプタにcancelDiscoveryをさせろとか、リフレクションで中のメソッドを呼び出せとか、いろいろある。どうにもすっきりしないし、時間がかかってNGなので、何かのタイムアウトなんだと思う。なので、とりあえずリトライすることにした(リトライの条件はもう少ししっかりしたほうがいいかも)
cf:  http://stackoverflow.com/questions/3397071/service-discovery-failed-exception-using-bluetooth-on-android

コード

ASCIIで1行書き込むと、1行返ってくる感じのサンプル。

本当はすべてUIじゃないスレッドの中でのコードにしたかったのだけど、上述の罠があって、getDefaultAdapter()だけUIスレッドで渡すようにしているので、コピペでは現実的に動かない。

close()漏れとかあるので、ためしに書いてみるてな感じの参考程度に。sendLogMessage()は、適当なTextViewにログを出すためのメソッドなので、Log.dとかでよいです。


2013-09-21

Arduino + USB ホストシールド + BTドングルでBluetooth Lチカ

このあたりを参考にしたら、思ったよりも圧倒的に簡単にできたので、思わず記事にする。ArduinoとUSBホストシールドにBluetoothドングルを使うと、SPP (Serial Port Profile)を使って簡単にLEDチカチカできちゃう。

1. 機器を準備する

必要なものは、ArduinoとUSBホストシールド2.0とBluetoothドングル。今回は、以下を使った。
最後のBluetoothドングルはもう売ってないと思うけど、似たようなやつが千円くらいで買えると思う。だいたい使えそうな気がするけど、Linuxで使える報告があがってるやつとかが無難なのかな?

USBホストシールドは2.0なものを選ばないとたいへんらしい。

2. つなぐ

USBホストシールドにBluetoothドングルを差して、Arduino Unoに重ねて、適当なデジタルピンにLEDと抵抗のセットをつなげばいい。ただし、デジタル8~13は使っているらしいので注意。今回は6番を使った。

3. Arduino IDEの所定のディレクトリにzipを展開する

https://github.com/felis/USB_Host_Shield_2.0 から、zipアーカイブをダウンロードして、/usr/share/arduino/libraries/USB_Host_Shield_20 に展開する。

4. SPPサンプルを開く

Arduino IDEのメニューからUSB_Host_Shield_20のBluetoothのSPPのサンプルを開く。

5. ちょちょいと書き換えて転送する

サンプルはSerialとSerialBTでお互いにechoする感じなので、適当にif文を書き換えてdigitalWrite(ピン, HIGH/LOW); でチカチカさせるようにする。

変更した部分はこんなかんじ(全体は最後に)。
if (SerialBT.available()) {
  char c = SerialBT.read();
  if (c == '1') {
    digitalWrite(6, HIGH);
  } else {
    digitalWrite(6, LOW);
  }
  Serial.write(c);
}

あとは転送する。

6. ペアリングして通信する


ターミナル的なソフトが使えれば、WindowsでもLinuxでもなんでもいいと思うけど、今回はAndroidとS2 Terminal for Bluetooth Free を使った。1とか0とか送ってチカチカすれば成功!

ソース全体でもこれだけ。eneloop スティックブースターで動くし、お手軽にライトな無線機器を作るのにいいと思う。



2013-09-16

照明On/OffのAndroidクライアントを作った

前に自室の照明をスマートフォンからOn/Offする CGI を作ったのだけど、ブラウザで見ると不便な点がいくつかあったので、このくらいならすぐできるだろうとAndroidクライアントを作った。実行すると以下の絵のようなダイアログがポップアップする。


ダウンロードはこちらから→https://github.com/sunnyone/LightControllerAndroid/releases/tag/release-0-0-1 (GitHubのリリース機能をはじめて使ってみた。)

十中八九この環境でしか使われないくせに設定画面(メニューから呼び出し)がついてるので、URLは設定でコントロールできる。ただ、認証とかには対応してないので、secureなLANで使ってください。

本当はウィジットで作りたかったんだけど、1x1じゃ使いづらそうな割に2x1や1x2は場所取り過ぎなのと、ウィジットでのクリックと処理実装が(やりたいことのわりに)面倒そうだったので、ダイアログテーマのアクティビティで実装した。本当は文字列をリソースから引いたりしないといけないんだけど、自分の中でAndroidのHello, World的位置付けなのでとりあえずここまで。

このシンプルなアプリですらかなりはまったので、はまったポイントを環境構築編のみダイジェストでお届け。Androidがもし無名の環境であれば、このシンプルな画面すらたどりついていなかった。

ウィンドウ>Android SDKマネージャーが表示されない

 パースペクティブのカスタマイズのコマンド・グループ可用性で「Android SDK および AVD マネージャー」をチェックすること。参考:http://www.devlog.alt-area.org/?p=547

SDK マネージャーが起動しない(C:\Windows\system32\java.exeを使おうとする)

Windows 64bitの問題らしい? がんばってjavaを探そうとしている adt-bundle-windows-x86_64-20130729\sdk\tools\lib\find_java.batの先頭を以下のように書き換え(path-to-javaは自分用に)
@echo off
set java_exe="path-to-java\bin\java.exe"
set javaw_exe="path-to-java\bin\javaw.exe"
goto :EOF

参考:http://d.hatena.ne.jp/thinkAmi/20120730/1343600121

Emulatorがメモリ確保に失敗して起動しない

AVDの設定画面を見ると、Windowsで768MB以上だと失敗するかもみたいなことが書いてある。とりあえず512MBにしてようやく起動。



2013-09-14

LibreOffice Calcの選択セルをMediaWiki表形式に変換するBasicマクロを作った

MediaWikiで表を書くとき、最初に作るときにフォーマットを思い出すのが辛いので、LibreOffice Calcの選択セルをMediaWikiの表形式に変換するマクロを書いてみた。ずっと書こうと思っていたのだけど、ようやく書けた。LibreOfficeにしておけば、気兼ねなくインストールして使えるので。



使い方は簡単で、選択してこのマクロを実行するだけ。そうするとメッセージボックスが出てくるので、このボックスはテキスト選択可能なのでコピペすればOK。ツールバーの空き部分にでもボタンを貼っておけばいいと思う。MediaWikiの表は、もっと高機能だけど、ひとまずプレーンな形に整形するだけ。

これがマクロ。

全然エレガントじゃない。

書くときのポイント

  • LibreOfficeについているマクロエディタは補完もないので、最初はNotepad++でVBモードで書くのがおすすめ。

参考にしたもの

辛かったこと

  • 流儀がわからない
    • プロパティ?の参照は .Abc = "ABC" だったり、setAbc("ABC") だったり書いてある場所によってぶれぶれ。変数名の命名はoから?とか。まぁ最初は動けばいいんだろうけど、結局すっきり書けなかった。
  • クリップボードがめちゃくちゃつらい。Win32 APIプログラミングですかっていう低レベルさ。
 プログラミングを始めたときのようなもどかしさを味わうことができた。



2013-07-28

「仕組み」の名前の考え方

名前に関する記事のタイトルがいまいちなのはさすがによくないので、タイトルを直した(2013/7/29)
---

最近ちょっと近くで話題になっていた「名前」の考えていきかたについて整理してみた。

ブランド名のように、独自性を持たせることを目的とするのではなく、後で呼びやすく混乱しないための名前付け。主に「それ」を知る人間同士がその物を識別するために使うための名前のガイドライン。「わかりやすい」「混乱しにくい」名前をつけるにはどう考えていけばいいか、というお話。

自分の立ち位置的に、ソフトウェア設計の視点が強くなってしまうが、仕組みを作る立場であれば似たような話になると思う。

経験がたまれば、更新するかも。

1) 文をそのまま使う

「これは何ですか?(何をするものですか?何をすることですか?)」と聞かれたと想定して、それで出てきた説明文をそのまま呼び名にすることを検討する。「何ですか?」の回答そのものなので、意図が伝わりやすい。長くなりがちだが、明快な説明ができる人間の命名であれば、短いことを上回るメリットがあることが多い。

確認ポイント

使う頻度は高くないか?
使う頻度が少ない(例えば、個別の機能のいちモジュール名だったり、年一回の事務処理の細かい手順のひとつだったり)のであれば、意図が伝わりやすいことのメリットが大きい。 しかし、毎日呼び合うような名前だと、短い名前をつけることを検討したあと、決定したほうがよい。 なぜかというと、ただ呼びやすいだけのあまり考えられていない(混乱しやすい・わかりにくい)名前で呼ばれてしまいやすくなるから。
一部の単語だけピックアップして呼び続けられたりしないか?ピックアップされても混乱はないか?
ピックアップしても区別できないから、本当に汎用な言葉がピックアップされることは少ない。例えば「顧客情報データ」を「データ」と略して呼び続けることは少ない。 しかし、文脈を共有すると選んで呼びやすくなってしまう語がある。例えば「クライアント」とか。 混乱がなければそれでもいいのだけど、混乱することがすでに想定できるのであれば、別の名前をつけてあげるのがよい。
そこから頭字語・略語はできるか?
これでつけてみた名前で、頭文字を取ったらいい感じに呼べる名前だったとか、略したら呼びやすかったりしたら、最初から略はこうです、という形で 明示しておくと混乱がない。一方で、その略語が他と同じ場合、かえって混乱を招くので、そもそも略していない状態でも他の呼び名を検討する。

2) 同じジャンルの意図することそのものの単語を使う

1) のそのまま使うパターンにマッチせず、意図した内容が既に一般的な名前として決まっている場合(「一般的に決まった名前」は以後、「定義された名前」とする)は、それを使うことを検討する。ずばりそのものということなので、ほとんどの場合良いが、安易に使うと大混乱を招くケースがある。

確認ポイント

元の語と明白に異なる意図を持っていないか?
新しくつける名前側が従で、定義された名前のほうが先に来ているようなケースでは、それが前提である以上、異なる意図は存在しにくいので、この名前付けパターンは良い選択である。 例えば、定義された名前が何かの規格で、その規格に乗ることこそ意図されたような場合であれば、それを名前につけるのは、受け取る側の意識付けの意味としても、非常に有効である。 しかし、定義された名前が従の場合、注意が必要である。「これこれはAで、あれそれはB…これってXYZって名前ついてるじゃん!」というケース。 こういった場合、一部の重要な部分が異なる場合がある。例えば、「定義された名前ではそれそれはCなんだけど、自分が考えるのはそれそれはDなんだよね…」といった感じ。 このようなことが名前付けの段階で明らかに分かっている場合は、その名前は使うべきではないことが多い。 なぜかというと、聞いた側は、名前が既に定義されているが故、その定義側の意図のほうを名前に感じてしまうから。 「俺のXYZはそうじゃないんだ!」といっても、最初はいいかもしれないが、よっぽどの強さがないと、元の語の意図を書き換えるのは難しいので、どんどんその意図は薄れて行ってしまう。
元の語に付加したい強い意図は持っていないか?意図を狭めたくはないか?
定義された名前は確かにずばりなんだけれど、もっと範囲を狭めておきたいという意図がある場合は、言葉を付加するなり、別の名前付けをするなりを検討すべき。 そうしておけば、広すぎて何を言っているかわからないという事態を避けられる。

3) 別ジャンルの意図することと関係のある単語を使う

文そのものでも、既存の言葉もない場合は、別ジャンルの近そうな言葉がないかを考える。メタファー/こじつけの世界。
一回目は聞いてもわからないが、わからない故、確認が必要となる。ゆえに、混乱を招きにくい。比喩になっているので、一回認識してしまえば、覚えやすい。

確認ポイント

選んだ言葉から受ける意図が、他の一面と衝突しないか?
単語の持つ意味は一面ではないことがあるので、ある面を見て比喩を選んでも、別の面で衝突している可能性がある。 例えば、固いイメージを与えたいからといって「フライパン」と名付けたとしても、冷たいという意図を併せ持つものだったりすると、「フライパン」の持つ熱せられそうなイメージと衝突するので、混乱を招く。
元のジャンルでその言葉は別の意味を持っていたりしないか?
比喩として使われていたりなどで、すでに使われていないか。強い意図を持ってジャンルの壁を越えてきているので、うっかりこの ケースで意図がバッティングすると、大混乱を招く。

4) 別ジャンルの全く関係ない単語を使う

3)に近いが、名前付けに意図がないので、さらにぱっと見/ぱっと聞きでわかりにくくなるが、混乱も小さくなる。
数が必要な場合に選ぶとよい。

5) 新単語を作る

どうしても困る場合は、新しい言葉を作ってしまうのもひとつ(文を略語化するのもこのパターンの一つなんだけど)。

決めた後の確認

似たような意図の語がすでに用意されていないか?それとの違いは何か?
最初にやるべきだけど、名前をつけることで明確になることもあるので、再度確認する。
似たような単語が既に使われていないか?
別の意図なのに、同じあるいは同じような用語が使われていないか確認する。

2013-07-12

Azure WebRole開発で使われるIIS Expressの設定(applicationHost.config)を変更する

Azure WebRole開発で(設定で選択した場合)利用されるIIS Expressの設定を変更する方法がちょっとトリッキーなので記録しておく(Azure SDK 2.0向け…Azureはどんどん変わるので)。このブログでAzureが登場するのは初めてかも。

結論

c:\Program Files\IIS Express\AppServer\applicationHost.configを変更する。

うまくいかなかったら、下に書いた方法で調べるといいかも。

詳細

Web Roleのアプリケーションを開発する際は、開発環境でIIS Expressを使うかIISを使うかをクラウドサービスプロジェクトの設定で選べる。
この設定でIIS Expressを使用するを選んだ場合、IIS Expressが利用される。AzureのIISの設定は、 startup taskでappcmd.exeを叩く(いつもお世話になっているブチザッキさんのブログ)とか、Microsoft.Web.Administartion(NuGet)を使ってC#から変更するといった方法が使えるのだけど、IIS Expressの場合はIISではないので、この方法では設定が反映されない。

IIS Expressの設定ファイルはDocuments\IIS Express\config\applicationHost.config をいじれという情報がWebにある(例えばいつもお世話になっているブチザッキさんのブログ)ので、「これだ!」と思って変更するものの、反映されない。

そこで、Process Explorerでiisexpress.exeのコマンドラインを調べてみると、applicationHost.configの場所が明示的に指定されていることがわかった。

指定されているのがどう見ても一時的なパスなので、もしかして埋め込まれてたりして変えられないのかなーと思ってProcess Monitorで見たら、WaHostBootstrapper.exeがc:\Program Files\IIS Express\AppServer\applicationHost.config を読んで、上記の一時的なパスに書き込んでいることがわかったので、元のファイルを書き換えてみると無事反映された。


めでたしめでたし。
(自分の環境で、「IIS Web サーバーを使用する」で動くようにしろという話ではあるが)