.NETラボ勉強会7月で Windows IoT on RPi のデモ

Windows 10 直前ということで、Windows 10 IoT Core on Raspberry Pi2 の発表を、.NETラボ勉強会でしてきました。2か月前のハンズオン(もどき)では、到底ロボットアームを動かすところまでいかなかったので、今回はデモで動かすところを中心に。

DSC02614

IoT ということで、クラウドに接続する話が巷では多いのですが、ロボットアームやら戦車を動かすことが主目的なので、ネットにつなげることは一切せずに(笑)やっています。現状の Win IoT on RPi の制限で、Bluetooth やら WiFi やらが繋がらないので、有線LAN オンリーになり無線でうろがしたいのに有線LANが必要という妙なスタイルになっていますが、このあたりはいずれリリースされる正式な Windows IoT で解消される予定です。

 

DSC02616

Windows IoT の概要とロボットアーム/戦車を動かすところまでで、詳細は省いてしまっています。中身のほうはぼちぼちとブログにアップしていきますね。

発表資料

Windows IoT on Raspberry Pi で ロボットアームを動かそう

動きもの

以下は、ソースコードも含めてぼちぼちと上げていきます。

グリッパーアーム

イスペット社 グリッパーアームを動かします。普通のブラシモーター5個をつかっているので、TA8428K モータードライバーを5個使って動かします。GPIO を制御するだけなので、比較的簡単なやつですね。

IMG_0173

タミヤギアーボックスを使った戦車

変速ギアのタミヤギアーボックスを使った戦車の例です。モーターが2個なので、L293D モータードライブを1個使って制御します。コントローラーには、xbox 360 コントローラーが使えます。そのうち、Bluetooth が使えるようになったら、xbox one コントローラーでも動かせるかもしれません。

IMG_0179

下に写っているのは、車軸付モーターギヤボックス です。低速ギアがすでに入っているので、ゆっくり動かすのには便利です。

meArm

phenoptix 社から購入した meArm を使ったロボットアームです。サーボモーター4個を、PCA9685 で制御します。Arduino だと PWM 制御が簡単なのですが、Raspberry Pi だとちょっとやりづらいので、I2C 対応の基板を買って作成します。Adafruit 16-Channel 12-bit PWM/Servo Driver – I2C interface – PCA9685 を使っています。

IMG_0175

という訳で、Raspberry Pi で色々動かせることが分かったところで、次回はどうやって動かすのかという具体的なコードを紹介…ってのを作成中。

カテゴリー: RaspberryPi, Win IoT | .NETラボ勉強会7月で Windows IoT on RPi のデモ はコメントを受け付けていません

小5の夏休みにチケット駆動を再び

小4の夏休みの宿題をチケット駆動で乗り切る方法を模索 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6049

去年、試してみたチケット駆動ですが、結局のところ「監視作業」を1週間やりました。今年も同じで夏休み前の連休に計画を立てたのですが、初日からムリ…だったので、再び監視してます。「監視」とは言いますが、脇で仕事をやっているわけで、そのあたりは「習慣づけ」の問題です。ある程度「習慣化」してしまえば、習慣自体が苦にならなくなるので、本人的にもそれほど大変になりません。これは諸刃の剣で、将来的に、無意識に誰かの監視下で習慣化させてしまう危険もあるので、ほどほどにしておきましょう。

その日のチケットを作る

いくつかの宿題(公文とかも含めて)があるので、箇条書きとして書き出します。ただし、1枚に箇条書きにするのではなくて、付箋を使います。今回は、大き目の付箋にひとつひとつ書き出し。

慣れてくると、箇条書きにチェックマークを入れるだけでも進むのですが、チケット駆動の良いところは、

  • チケット=作業単位の順序をさっと入れ替えられる。
  • 終わった作業(チケット)をチェックすると達成感を得られる。

という2点があります。カード的に並べた付箋のチケットを、「これからどれをやるのか?」と1枚選んでやり始めます。PSP(Personal Software Process)を兼ねて、開始時刻と終了時刻を書いて集計してもよいでしょう(今回はやってません)。夏休みの宿題にせよ、仕事の作業単位にせよ、時間制約(締切)があるので、掛かる時間を意識しておくことは悪くはありません。そのあたりは、ほどよく時間を気にしながら(進捗状態を気にしながら)作業を進めるというのがポイントですね。ええ、外側から「進捗どうですか?」と短期的なポーリングを掛けるのは論外です。見ればわかるのですから。デマルコ著「ピープルウェア」の第20章の「チーム殺し、7つの秘訣」を避ければ十分です。

カテゴリー: 雑談 | 小5の夏休みにチケット駆動を再び はコメントを受け付けていません

計画を見直せない病、という点で国立競技場の件を考える

すわ、例の中抜き構造ですか?と思っていた国立競技場の予算超過の件ですが、新国立競技場の工事費が下がらない理由|建築エコノミスト 森山のブログ を通読していくと(「~めぐる議論について」も全て読む)、概算をせずに決定をしているのではなく、コンペの後に概算が来るというコンペ後の決定プロセスの問題みたいです。まともに作ろうと思えば 3,000億円、という価格(?)は正当なもののようです。ちなみに、森山さんのブログは進撃の巨人あたりから読んでいるので、読者としては古参です。

コンペをした頃の予算が不明なのですが、新国立競技場 – Wikipedia によれば、当初見込みが 1,300億円となっています。他競技場が500億円ぐらいなので、見込自体も高いし、その後の全部のせ状態で3,000億円という見込みも相当高いです。高いです…が、これは中抜き構造ではなくて、先のブログにあるように正当に建設したときの価格なので、それだけ掛かるということですよね。それはそれでokです。というところから議論をスタートさせます。

私としては「福島原発は完全にコントロールされている」という首相の言葉が嘘っぱちで、その後の招聘云々も全然嘘っぱちなので、国立競技場が建つとか建たないとかには興味ありません。あくまで「当初の計画/予算を大幅にオーバーしているときに、それを見直せないのは何故か?」に焦点をあてて考えます。まあ、内実は見栄とか誰かが得をしているとか、そういう問題に帰着することが多いので国立競技場そのものに関してはパス。都民なので、都民投票があったら行くぐらいのことはしますが(それくらいの権利はあると思う。都民税を払っている身だし)。

関連図を作る

本来はもっと複雑ですが、簡略化させます。

image

  • 国/都から計画者(コンペ主催とか有識者会議とか)に予算を割り当てる。
  • コンペなり試算をして施工者に発注する。
  • 施工者が立てた国立競技場を国民なりが利用する。
  • 国民なり都民なりは、国に税金を支払う。

と考えます。内情は色々あるのですが、モデル化するとこんな感じでしょう。ツイッターなどを見ると(テレビはあまり見ないので、あとは新聞とかWEBサイトの諸々ぐらい)、色々どうすればいいという意見がありますが、その意見は「立場」によって違ってきます。国の立場なのか、国民の立場なのか、実施者の立場なのか、計画者の立場なのかということですね。それぞれ相手のことを慮ったり全体最適化を考えれば、そんなことが言えないはずなのに、そういうことを言ってしまうのも「立場」の問題です。でもって、立場から出てくるさまざまな「?」な発言は、立場の違いもあり「当事者」ではない(それぞれの立ち位置にいない)ことから、行動経済学的にもそういう思いに動くでしょう、って感じです。例えば、

  • 国や都の立場からすると、納税分でつくるので「お金」を自分で払うわけではなく、「予算」としての数字でしかない。
  • 計画者にとって予算を割り当てられた場合、「予算内」では自由に利用できる。予算超過分を「国/都」に出すのは難しい(国立競技場に関しては、コンペ→予算の順で決定するので、現在は予算計画の段階、予算が決まってしまうと、後からの修正は難しい)。
  • 実施者にとっては、実際に材料費、人件費等がかかるので、赤字にならないように注意する。よって、ある程度の「保険」を見込む必要がある。
  • 国民にとっては、税金を支払い、利用をする立場ではあるものの「税金」と「利用」の間は遠い。

というそれぞれの立場があるので、立場ごとに語っても立場ごとの効率を最大化するだけで、全体の効率は良くなりません(一瞬、良くなるように見える場合もあるけど)。そこには、全体の計画を見直す必要があるのですが、大抵の場合は「計画を見直さない」ことになります。何故か?

計画を見直すコストを考える

ITプロジェクトでは、よく計画を見直さずに突き進んでデスマーチ化するプロジェクトが多いのです。経済的な理由もありますが、大抵の場合は「交渉コスト」の増加のため、計画を見直しません。交渉コストというのは「行動経済学」でいう、人と人とのか関わりです。相手を説得するとか、相手に自分の意図を伝えるとかいうコストです。例えば、ジュースを買うときに、お店で買うのと自動販売機で買うのと、どちらが楽かというのが交渉コストです。ちょっと位、送料がかかっても Amazon のほうが便利ですよね、というアレです。

計画を立てたときに、後から計画を立て直すのが大変なのは、「計画が変更になった理由を相手に伝えなければいけない」というプレッシャーです。プレッシャー≒交渉コストですね。心理的であれ経済的であれ(飛行機で行かないと駄目とか、大勢集めないといけないとか)、「交渉コスト」が実際の負のコスト(予算の超過等)を上回ると、交渉しなくなります。つまり計画を見直さなくなります。「日本が戦争に負けた~」構造が今にも伝わっている、ような日本特有の構造に帰着させる意見もありますが、私から言えば「交渉コスト」の問題です。風土ではなくて、人と人との関係の構造ですよね。

アジャイル開発が一般的にきっちとした計画を立てない(チケット駆動を使うとか、スクラムを使うとか)のは、計画の変更コストが高いためです。変更コストは、時には M$ Project を使ったときに見直しが大変、という理由もあります。特に Excel で計画表を立てている場合、この変更コストが増大して、Excel の表を変更するのが面倒だから計画を変更しない、という巨大な「交渉コスト」が発生することがあります。

そんな訳で、計画自体にコストをかけてしまうと、計画を変更すること自体のコストが「モッタイナイ」ことになります。変更するコスト≒交渉コストが、当初の計画コストを上回るためです。

交渉コストを考えるときに重要な法則として、人は時間的に遠くのものはコストを低く見積もるという法則があります。時間によるバイアス効果なのですが、同じ利得であれば、遠くの利得よりも直近の利得のほうを好みます。これは損失の場合でも同じで、遠くの損失よりも直近の損失を強く感じます。逆に言えば、直近の損失よりも遠くの損失を弱く感じるわけです。過去に大きな損失があっても過去が過去であれば忘れてしまうし、遠くの未来に損失があっても直近のわずかな損失に目を取られます。これは交渉コストにも適用できるので、過去の計画コストは時間的に遠くであるがゆえに、低く見積もられがちになり、相対的に再計画を立てるときの交渉コストを高めてしまいます。これが、計画を見直したくない病の主な原因です。

このあたり、遺伝子的な進化論的にも同じで、環境に順応するために脳の効率的な活用をするときには、直近の減少に対して「習慣的」に効率よく対処する必要があります。このため、過去の成功体験(生き延びた経験)に準じて、現状に対処します。つまり過去の計画に沿って、現状に沿わずに再計画せずに進むほうが楽なんですよね。これは、個々の生物にとっては不利な状況(死んでしまうとか)に陥ることになりますが、群全体にとっては有利に働きます。一部が残って「遺伝子」を伝えていけばよいわけです。これが国レベル、民族レベルで起こっていると考えればokです。

計画自体のコストを下げる

  • 計画を見直すための交渉コストが高い
  • 時間的に遠くのコストは逓減される

という2つの現象を組み合わせると、計画を見直したい場合には、そもそもの計画を立てるコストを下げるという方法が良さそうです。きっちり細かく計画を立ててしまうと、現状でそれに従うほうが交渉コスト(実行コスト)が下がるので、自然と「計画通り」に進めることが一番の効率化になります。そうです。計画駆動が一番効率が良い状態は、「まったく変更がない」ときに効率が良くなるという現象です。となれば、未知数がないときには、緻密な計画を立ててそれに沿って進めるとコストが低くなります。実は、プロダクト=製品開発、ベルトコンベア生産の場合には、これが当てはまります。それぞれの作業を最大化することで、効率があがるので、それぞれの場所で考えることはせずにあらかじめ計画を立てて作業手順を決めておきます。

逆に、実行時に計画にはずれることが多いことが予見できたならば、計画自体に大きなコストをかける必要はありません。その都度、計画を見直すコストを下げるように、大計画≒大き目な方針、と小計画≒それぞれの現場の作業とを分ける必要があります。労働集約的にアジャイル開発やセル生産などは個々の力量/能力に追うことが前提となっていますが、それは個々の力量/能力が、最初の計画では推し量れない≒変数だからです。

逆説的ではありますが、時間によるコストの低減効果に従えば、

  • 「作業ごとに計画を立てるコスト」<「過去の計画に従うコスト」

となるようにすれば良いわけです。綿密な計画を立ててしまうと、過去の計画に従うほうがコストを下げるので、無駄な計画に従っているほうが楽、という状態に陥ります。良くも悪くも、隷属化しているほうが楽というのがこの状態ですよね。「作業ごとに計画を立てる」というのは、個々が作業に対してコストを下げるように努力をするということです。イコール楽をしようとすることですね。楽をするためには、頭を使って無駄な作業をしないようにしないといけません。このあたりはセル生産に詳しいですね。

小規模の計画は個々にまかせて、全体の計画(全体の予算)等の大枠だけ決める方法をとってみましょう。

  • 国や都としての「出せる予算/工期」を決める。
  • 計画者では「出せる予算/工期」内かを見積もることに集中する。
  • 実施者は「出せる予算/工期」内で実施する。

という予算と工期の大枠を決めます。予算の大枠が決まれば、そのうちで高いかどうかは別な話です。それがザハ案であろうと、別の案であろうと、他の競技場の500億円という予算内で収まれば、何でもいいでしょう。逆に言えば、大幅に予算や工期を超えると想定された時点で、それはアウトです。

再計画のコストを下げる

計画変更のストを考えるためには、2つの視点が必要です。

  • 過去の計画に従うよりも、再計画をしたほうがコストが安くなる
  • 再計画するときの交渉コストを下げる

誤った(と思われる)過去の計画を捨てて、やり直す場合には、先の国立競技場の予算組みのように「大幅な予算超過」が効率的です。3,000億円としたり、ちまちま削減したりせずに、「ザハ案にすると5,000億円超かかります。だから見直しましょう」で有無を言わせずですよね。駄目なものは駄目なんだから、前計画がどれだけコストがかかるか(駄目さ加減)を強調すれば、再計画のコストは相対的に下がります。かつ、前計画を進めたときに、超過する金額が膨大になります。ちなみに、国立競技場の場合は、国民/都民からの税金なので、このあたりの手法がとりにくいのですが、ソフトウェア開発の場合、「代案」を出すときにはこの手法が使えます。このままいくと、これだけ超過します、という場合には「大幅に超過する」ことを強調した後に「代案」を出すというテクニックですね。

  • 「前計画を見直さないときのコスト」>>「再計画したときのコスト」

もうひとつ、再計画自体の交渉コストを下げておきます。これの主な手法がアジャイル開発にあります。綿密な計画を立てるのではなく、おおざっぱな計画に沿うようにして変更しやすくします。変更しやすくする手段としては、きっちりとした計画表を作るのではなく、チケット駆動などを利用します。勿論、将来的に「計画駆動」の計画自体が流動的に変更可能になれば、話は別なのですが、現状のところ計画を変更する≒計画表を変更するコストが高いために、このような現象になっています。

国立競技場の件で交渉コストを下げる(この場合は、「予算が超過してしまうから、ザハ案を捨てて別の案にする。あるいは、旧国立競技場をそのまま再現する」等の提案)ためには、交渉コストより将来的に得られる利得が上回ればよいのです。

  • 「将来的な利得」>「計画を見直す時の交渉コスト」

ただし、将来的な利得は時間的な低減効果があるので、それなりに見合うだけの大きな利得(想像ではあっても)が必要です。このあたりは、損失ではなくて利得にしないと駄目です。損失の場合は、やはり時間的な低減効果が働いてしまって、先行きの赤字(国立競技場の年間赤字)が低く見積もられてしまって(実際、0.4億円プラスという試算が出てきてしまう始末)、相対的に現在の交渉コスト≒再計画のコストが高くなってしまいます。よって、計画を見直したときの「利得」がより多いことを前面に押し出すとよいのです。ソフトウェア開発で言えば、現状の実装が難しいものや、危うい動作を削除してしまい何か別のものを付け足すことによって、運用時のコストが下がりかつ利得が多く得られる可能性がある、という具合に話を持って行きます。

計画を変更するための原動力を加える

計画や構造が正しいとか正しくないとか、過去の戦争の失敗のあれこれとか民族性だとかナントかではなくて、計画を変更するための力を加えればよいのです。計画を変更することが目的なのですから。それも方向的に対峙する方向から力を掛けるのではなく(真っ向から反対という意味)、横から力を加えます。場合によっては、ななめ後ろから力を加えるわけです。援護射撃っぽく見せて、かつ行かせたくない方向に射撃する(後ろから打たれたくないから、その逆に走る)という方法です。

まあ、国立競技場の件はさておき、計画を見直せない病を疑似体験しておくのも悪くないかと、と思って書き下しておきます。

カテゴリー: プロジェクト管理 | 計画を見直せない病、という点で国立競技場の件を考える はコメントを受け付けていません

Windows IoT on Raspberry Pi で動作するマウスを探す

ちょっと…というかかなり間が空いてしまいましたが、Windows IoT on RPi2 の続きです。今月末の .NET ラボ勉強会で再び Win IoT のデモをやるので、それの下準備も兼ねて。

先日、大量のマウスをオークションで購入しました。30個程度(おまけが8個だったか)で送料込みで2,000円弱ぐらい。今回は種類が欲しかったので、秋葉原の中古をあさるよりもこの手のがさっとした種類が欲しかったので丁度よかったのです。

https://pbs.twimg.com/media/CHqQRg8UsAAQTCZ.jpg:large

Win IoT on RPi2 の場合、特定の場合のマウスしか動かなくて、どの「特定のマウス」が動くのかはは解りません。リリースノートには、マウスが動かないときには他のマウスを使ってくれというコメントがあるだけで、特定はできないのです(開発者が使っているマウスの種類が解ればいいんですけどね)。

ブログ等をちらちらと眺めると動いている人もあるのですが、自分のところのマウスでは全く動きません。仕方がないので、.NET ラボの方にいくつか借りたのと、上記な感じでがさっと検証用に買いました。

結果

ちまちまと接続してはチェックを繰り返すこと1時間ほどですが、大体の傾向はつかめたので結果を張り付けておきます。

image

DELLやVaioの古いマウスが動いたので、どうやら解像度の問題っぽいですね。古めの解像度の低いUSBマウスを利用すると良いようです。おそらく手に入りやすい(中古で)、Microsoft Optical Mouse の一番古いタイプだと思います。

image

これらの動くマウスを使うと、Windows IoT の画面で右上の電源ボタンを押すことができます。こんな風にメニューがでます。

image

25日の .NETラボ勉強会では、マウスでロボットアームを制御する話ができればよいかなと。あとできれば、meArm と Windows Remote Arduino のデモも交えて。

カテゴリー: RaspberryPi, Win IoT | Windows IoT on Raspberry Pi で動作するマウスを探す はコメントを受け付けていません

Windows ストアアプリから C言語の fopen を利用してローカルファイルを開く方法

久し振りのC言語ですが、ざざっと書き下します。とあるところで調べ始めてちょっと突っ込んだところで、本当にできるのか?ってのを調査している途中です。いや、正直に言うと目的を達する手段としては結構危ういので、まともに C# で書き直すなり別な方法を取ったほうがいいのですが、最初の目論見が達成できるのかを確認しているところ。

C/C++のライブラリをそのまま使う

とあるC言語で作ったライブラリがあるとします。デスクトップアプリならば、そのまま静的リンクをするかDLL呼び出しをすれば良い訳で、OpenCVとかその手のC++絡みのライブラリはデスクトップ側で動かします。それを.NETで包むか、iOS内でリンクさせて動かすか、JavaからJNIを通して動かすかは色々と動作環境により方法が違うのですが、Windows ストアアプリ上で動かそうとすると結構な手間です。

ひとつの方法としては、C++/CXでストアアプリを使って、C言語のライブラリをリンクさせます。C++/CXのストアアプリからは、stlenとかstd:stringとかの標準的な関数は大方呼び出せます。大方呼び出せますというのは、ファイル系だとかシステム系の関数とかは難しそうで、環境変数を呼び出すgetenv関数はありません。逆に言えば、ロジック系のものであればそのまま動くだろうという目算が立ちます。そうなると、既存のC言語ライブラリをそのまま移植できるわけで、特にLinux系のオープンソースなライブラリをそのままビルドして持ってくることも可能だろう、と思われます。

フロントエンドをC++/CXで作るのも良いのですが、巷のサンプル的にはC#が圧倒的に多いのと(逆に言えばC++/CXのサンプルは非常に少ない)、async/awaitの非同期処理が結構やりづらいので C++/CX でフルのフロントエンドは作りたくないところです。そのような場合は、C言語のライブラリをうまくマッピングするC++/CXのライブラリを作っておいて、C#側に提供させます。ロジック部分は全体の一部分になることが多いので、大方のところは C# で書き、小難しくて Linux 等から移植しなければいけないところを C++/CX でブリッジを書くという具合になるわけです。

大体これで行けそうな気がするのですが、ふと、移植ができるかな?というライブラリを眺めてみると、ファイル系のアクセスがありました。

fopen関数は扱えるのか?

最初の設定やらデータやらを読み込む場合には、C言語のライブラリではfopen関数が普通に使われます。あちこちで、fread/fwrite関数しているところを、WinRT の StorageFile に直すのは結構手間です…と言いますか、ほぼ不可能です。StorageFile クラスのほうは、非同期処理が入ってしまって、どうにもこうにもファイル読み込み部分の書き換えが必須になってしまいます。部分的に fread 関数呼び出しているところあれば、なんとかなるのですが、このあたりが混在して散らばっていしまっていると修正するのはちょっとお手上げ状態ですね。いちから作る直したほうが良いのでは?と思うくらいで、だからこそ、ストアアプリのほうの移植が進まないのかもしれません。

C# でファイルアクセスをしているとファイル名を直接扱うことは少ないので、じゃあ、C言語で使う fopen 関数が使えるのか?という疑問が発生します。ストアアプリの C#/VB のほうでは System.IO.File クラスが無くなっていて直接ファイル名を指定して任意なところにアクセスすることはできません。しかし、「任意なところ」以外はできるわけで、アプリケーションに含まれているファイル(Assetsの下とか、インストール先の適当なフォルダとか)、アプリケーションデータフォルダとかはアクセスが可能です、以前、直接 C++/CX で「任意なファイル」をオープンしようと思ったのですが、駄目だったのであっさりあきらめていたのですが、今回はもうちょっと突っ込んで調べてみました。

結論から言うと、fopen 系のファイルアクセスも C#/VB と同じように、アプリのインストールフォルダ内やアプリデータのフォルダへはアクセスができます。fget/fread 関数を呼び出してテキストなりバイナリデータを読み込むことができます。おそらく、アプリデータ領域であれば fwrite することも可能でしょう。この辺りは、もうちょっと後で調べていきます。ひとまず、いまやりたいことは、最初の設定が必要だったので、fopen/fread の組み合わせだけが必要になります。

ライブラリ内の fopen が有効に働く

目標としては、オープンソース系の C/C++ ライブラリをそのままストアアプリでリンクをすることです。

NuGet Gallery | Xamarin.Tesseract 0.2.4
http://www.nuget.org/packages/Xamarin.Tesseract/

実はちょうど調べていたときに、Xamarin 上で動く Tesseract-OCR を見つけました。折しも作り始めたばかりで、なんといいタイミングでしょう、という感じです。中のソースを見ると解るのですが、Xamarin.Android/iOS のプロジェクトのそれぞれの Tesseract のバイナリ形式のライブラリが含まれます。なるほど。Android の場合は、そのまま JNI で wrap させればよいし、iOS の場合には Objective-C から呼び出せるわけですから、それを C# から呼び出せる形式に変えればよいわけです。中身のファイルアクセス系も、Android/iOS ならばそのまま動きそうですね。

が、ストアアプリの場合は、中身のファイルアクセス系がそのまま動くかどうかはわかりません。Tesseract の場合 OCR の学習データのためにバイナリデータを読み込みます。これは Tesseract 自身のコードを見るとわけあるのですが、あちこちに fread 関数が散っているんですよね。ワンパスで読み込んでいるのか、適当に seek しているのかは不明ですが、これらを StorageFile 系に変えるのはほぼ不可能です。

となれば、ライブラリ内の fopen 関数が正常に動くのかどうか?が問題になってきます。

これも結論を言えば、自作の静的ライブラリでは動きました。Tesseract 自身はまだ試していないのでなんとも言えませんが、getenv 関数のダミーを作って環境変数を適当に操作してやれば読み込めそうです。

C# から C言語ライブラリの fopen を呼び出す

C# から C言語のライブラリは直接呼び出せないので、ところどころに相互運用が必要になります。

– C# でストアアプリのフロントエンドを書く。
– C++/CX で Windows ランタイムコンポーネントを作る。
– C言語のライブラリを書く

という具合になります。フロントエンドを C++/CX で書けば、C# のストアアプリは必要なくなりますが、先にも書いたように、C# のほうがサンプル数が圧倒的に多いので C# でフロントエンドを書くほうがよいでしょう。

また、「C言語のライブラリを書く」ところは、C++/CX のライブラリにしてもよいのですが、これだと C++/CX の文法に寄ってしまったり、コードの保守が煩雑になってしまうので、別途ビルドした C/C++ ライブラリを静的にリンクさせるほうがよいでしょう。DLL の場合はどうだったのかはわかりません。DLL 自体の配布がややこしくなるので、これは別途要検討というところですね。

プロジェクト形式は、

– CheckApp — C# のストアアプリ
– CheckCLib — C言語のライブラリ
– CheckCppcx — 相互運用の C++/CX ライブラリ

になります。ストアアプリ内にある Assets/sample.txt を fopen して読み込もうという計画です。

C言語のライブラリ(CheckCLib)は、ごく普通に fgets でファイル読み込みをします。ここではバッファは面倒なので static で返していますが、別途バッファを渡すほうが安全です。このあたりメモリ操作系の malloc/free, new/delete の扱いも注意しないといけませんね。

char *Class2::OpenPath(const char *path)
{
	FILE *fp = fopen(path, "rt");
	static char buf[256] = { 0 };
	fgets(buf, 256, fp);
	fclose(fp);
	return buf;
}

これを C++/CX のライブラリから呼び出します。C# からは、char* を直接扱えないので String から変換させます。

Platform::String^ Class1::OpenPathC(Platform::String^ fpath)
{
	std::wstring w(fpath->Data());
	std::string s(w.begin(), w.end());
	const char *path = s.c_str();

	auto obj = new Class2();
	auto buf = obj->OpenPath(path);

	std::string ss(buf);
	auto text = ref new String(std::wstring(ss.begin(), ss.end()).c_str());
	return text;
}

C++/CX では文字列を Platform::String で扱います。この String は wchar_t になっているので、std::wstring と std::string を駆使して const char * に変換します。漢字が入っているとこれでは駄目なのですが、ASCII の範疇であればこれで十分です。

この C++/CX で作ったライブラリを C# のストアアプリから呼び出すと次のコードになります。

private void clickOpen6(object sender, RoutedEventArgs e)
{
    var path = "D:\work\OCR\sample\CheckApp\CheckApp\bin\x86\Debug\AppX\Assets\sample.txt";
    var obj = new Class1();
    var text = obj.OpenPathC(path);
    text1.Text = text;
    text2.Text = path;
}

パスがいやに直接的に指定していますが、これで動きます。実はアクセスさせてみると分かりますが、AppX 以下のファイルであれば普通に fopen できますが、それ以外の場所だとエラーになります。また AppX 内であってもプロジェクト内に含まれていないファイルにアクセスしようとするとエラーになります。きっちりと、ストアアプリの StorageFile 系のアクセス禁止と同じ法則が適用されているのが素晴らしいところです。これ、OS の API レベルでガードされているということですよね。

ここのパス名をどうやってとるのかというと、普通に ms-appx:/// を使うこともできます。

private async void clickOpen6(object sender, RoutedEventArgs e)
{
    var uri = new Uri("ms-appx:///Assets/sample.txt");
    var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
    var path = file.Path;
    var obj = new Class1();
    var text = obj.OpenPathC(path);
    text1.Text = text;
    text2.Text = path;
}

こんな風に、一度 StorageFile.GetFileFromApplicationUriAsync を使って呼び出して、Path プロパティで取得すればよいのです。こうすると、いつも通り、ms-appx:/// でアクセスできるので、ファイルの絶対パスが分からなくても良いのです。

サンプルコード

テスト時に作ったサンプルコードはこちら。インクルードパス等が固定になっているかもしれませんが、参考まで。

CheckApp-v0.1-src.zip

おまけ

ストアアプリでファイルアクセスをするときには、非同期の await/async が必須になります。しかし、コードを見てみると気付くと思いますが、C言語の fopen 関数の場合は同期的に作ることになります。そういう意味では、ストアアプリの基準から逸脱しているようにも見えますが、逆に言えば、デスクトップアプリと同じような仕組みでファイルアクセスをする手段を得られる、ということでもありますね。ストアアプリの場合、http アクセスしてちらちらとデータを取ってくるのには適しているのですが、ローカル環境でがりがりと動かすにはちょっと道具不足、と言いますか昔ながらの C言語アクセスが楽だったりします。多分、std::cin/cout も使えるんじゃないかなと思うので、このあたりは後で試してみたいと思います。

補記

CreateFile2 function (Windows)
https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422(v=vs.85).aspx

When called from a Windows Store app, CreateFile2 is simplified. You can open only files or directories inside the ApplicationData.LocalFolder or Package.InstalledLocation directories. You can’t open named pipes or mailslots or create encrypted files (FILE_ATTRIBUTE_ENCRYPTED).

とあるので、内部的に Windows ストアアプリも fopen も CreateFile2 関数の動きに準じてそうとのこと Special thanks @biac -san .

カテゴリー: 開発, C#, C++/CX | Windows ストアアプリから C言語の fopen を利用してローカルファイルを開く方法 はコメントを受け付けていません

Objective-C の storyboard を Swift に移植する

誰得?な感じですが、必要となったときに参考にしてください。なぜ、必要に迫られているかというと、Objective‐C逆引き大全555の極意 を Swift 版に移植中なのです。先日 WWDC で Swift2 が発表になったので、結果的には Swift2 に移植することになるわけですが、まあ、両方買うと、Objective-C と Swift2 と相互に変換できて便利、という組み合わせな訳です。

その中で、最初はちまちまと Swfit 用の storyboard を書き直していたわけですが、storyboard 自体は中身が xml だし、そのままプロジェクト間をコピーしたら動かないか?と思ったわけです。結論から言えば、動きました。ViewController のクラス指定と、IBAction/IBOutlet に注意する必要がありますが、うまく手順を踏めば、きれいに動きます。

逆引きの場合、storyboard に 100 枚以上の ViewController が貼り付けてあって、その上に各種のコントローラがペタペタとついているんですよね。以前は、1項目を1プロジェクトに対応させていたのですが、プロジェクト自体が大量になって(起動が)面倒くさいのと、実機に入れてちまちまと動かすのには適当な単位でプロジェクト化しておいたほうが動作確認しやすいためです。まあ、そんなこともあって、Master-Detail プロジェクトを使って 100 枚程度の ViewController を行き来できるようにしてあります。

こんな感じにメニュー化されていて、

image

こんな風に遷移させています。

image

 

移行手順

ざっと、移行させるための手順は以下の通りに。

  1. 既存の Objective-C のプロジェクトを開く。
  2. 新規の Swift プロジェクトを作成する。
  3. 新規の Main.storyboard の名前を変えて、既存の Obj-C の Main.storyboard をコピー。
  4. Swift 側に、同じ名前で ViewControler を作成する。
  5. Swift 側に、同じ名前で、IBOutlet と IBAction を仮に用意する。
  6. ViewController の Custom Class 名を、一度、書き直させる。
    いったん、別の名前に設定して、元に戻すのでok(内部的な ID を振り直すために必須、)
    image
  7. Outlet を確認する。
    同じ名前で付けてあるはずなので、すべてが接続された状態になる。
    image

この状態でビルドをして実行をするとうまく動きます。ViewController のマッピング自体は、実行時に行われるので、画面を遷移させたときにエラーになるかどうかが分かります。うまく Outlet が設定されていない場合や、6 の時点で ViewController の ID の再割り付けが失敗している場合は、アプリケーションエラーになり、AppDelegate.swift で例外が発生します(これが訳が分からないので、再度 ViewController の再割り付けを確認するのが無難)。

実は、便利なのは storyboard が参照している ViewController をすべて揃えなくても良いことです。これは表示時に動的に参照されるので、使うところだけの ViewController を用意すれば良いわけです。なので、1枚1枚確認してから先に進むことができます。

まあ、画面を移行させても、中身は Swift なので書き直しが必須になる訳ですが、これはこれでそのまま使えるかなと。Xcode の場合プロジェクト間で、コントロールのコピー&ペーストができないので、storyboard そのままを移行させると便利ですね。この方法は、Swift 1.2 から Swift 2 への移行にも使えます。

カテゴリー: Objective-C, Swift | Objective-C の storyboard を Swift に移植する はコメントを受け付けていません

.NETラボ勉強会 Windows IoT on RPi2 のビデオ

.NETラボ勉強会 で Windows 10 IoT Core on Raspberry Pi のハンズオンをやりました | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/7212

のビデオを撮ってもらったので、youtube にアップしました。固定カメラだったので、実験中のビデオをはほぼほぼカットして今って、雰囲気だけ5分に縮めてあります。手前のノートブックに Visual Studio 2015RC が入っていて、Raspberry Pi にアップロード。そのまま LED がチカチカするか、VGA のモニタに時刻が写るか、という具合です。ブレッドボードにタクトスイッチを付けて、モニタに表示させよう、というところが失敗していますが、このあたりはいずれ家で試してみて撮り直しをしましょう。

実況ビデオ

 

 

サンプルコード

winiot_rpi2_src.zip

カテゴリー: RaspberryPi, Win IoT | .NETラボ勉強会 Windows IoT on RPi2 のビデオ はコメントを受け付けていません

『絶歌』を否定する

あまり、批判的な記事を書くことはなくなったのだが、これだけは残しておこう。書いた後に、エディタから消し去ってしまうか、そのままブログに載せるかは別のこと。自分が何をしようとしているのかを対象化することに「意義」があること、の実践でもある。

当然のように批判を浴びている元少年Aによる「絶歌」である。元少年Aというと、如何にも更生したかのような(正確に言えば正常に戻ったかのような)言い方になってしまうが、酒鬼薔薇事件の犯人であり、そこには「元」という冠詞はつかない。むろん、「刑期」を終えたのだから、刑期の前のように人権は扱われるべきではあるものの、直接的な被害者、殺人という事件の特異性、今回の「手記」を出してしまうような状況を鑑みれば、被害者の視点から「反省していて受け入れられる人」となるかは疑問である。

酒鬼薔薇事件が起きた当時「なぜ、人を殺してはいけないのか?」という問いが「流行し」その後に少年法が改正されたはずだ。一度、少年法として緩くなったところに起こった事件で、その後、少年法が強化された。そんなきっかけとなる事件でもあり、ある「緩い少年法」のもとに裁かれたという事実がある。それを考えると、当時、犯人と思われる少年(容疑者という範疇だった)が保護されるものであり、また「幼年時期に起こした過ちは、なんらかの家庭環境にて影響があるものだから、本人だけに責任があるわけではない。それゆえに更生したのちは、社会に受け入れられるべきであり、そのためにも名前を公表するべきではない」という根拠から、常に名前は伏せられていた。今となっては、インターネットで手軽に検索できるものでもあるし、何処の誰だか特定も可能であろう。

「なぜ、人を殺してはいけないのか」の議論に関しては、色々な「有識者」がテレビ等で議論したにも関わらず結論はでなかった。非常に馬鹿馬鹿しい話ではないけれども結論がでなかった。憲法や刑法などで人を殺してはいけないという意見もあれば、人を殺したことにより自分が苦しむからとか、人を殺すこと自体が絶対駄目だとか、じゃあ戦争の場合はどうなんだとか、そういう些末な議論が多かった。それが「些末」に感じたのは、そこには被害者が不在だったからだ。直接的な被害者は「殺されてしまった」ので生きることができないし、残された遺族(あるいは子を殺された親)にとっては、殺人者を肯定できる意義は全くない。そこには、犯罪者への同意は存在しない。時にして、そういう自己卑下になることもあるが(自分の父親が交通事故にあったときがそれだ)、いや考えてみれば、他人と自分とは「違う」ということ、相手にとっては自分は他者であることを強く意識すれば同調なんてする必要はない。被害者にとっては、子を殺された厳然たる「被害者」という立場があり、相手はどうやっても「犯罪者」だ。
そういう、曖昧模糊とした他人行儀な議論を続けた末に『「少年A」この子を生んで』というものが出版されて、マスコミ等で話題になる。いまでこそ Amazon 等で批判を受けた批評が残っているが、当時の盛り上がりは、実に被害者が不在であることと示し、そこには「酒鬼薔薇事件」を消費する世間という姿があった。いや、当時はそうは思ってはいなくて、単に嫌な感じがしていただけなのだが、今の私だと解る。それは「事件」そのものを消費している世間(主にテレビ?)があり、その突飛な事件こと話題性こそがターゲットを被害者ではなく「犯罪者」のほうに目を向けさせて、厳然と存在する事実であった「殺人」さえもおぼろげにさせてしまっている。そこには、一般的な「反省」の姿や、思いやりの姿がない。

殺人者であり死刑囚であった永山則夫は獄中で小説を書き、獄中で結婚をし、獄中のまま死刑になった。殺人者にとって「小説」を書く自由があるのかどうか、また、書いた小説が賞を取るという「栄誉」を与えられてしまうのかどうか、という問題が当時はあった。勿論、永山則夫は成人男性であり、少年Aは未成年であり少年法の範疇である、という違いはあるかもしれないが、「絶歌」なる手記を出版してしまうという時期には32才という成人でもあり、そこにはなんらかの分別が必要であろう。それは、この文章自体のように書き連ねることの自由はあるが、その自由を「被害者」にまで行使して良いのか?という「分別」である。
永山則夫の小説は買ったことがある。が、『「少年A」この子を生んで』も『絶歌』も買わないだろう読まないだろう。なんらかの折りに資料として手を取るかもしれないが、その時は被害者の出した手記と同時に読むだろう。なぜだろう。そこには「殺人事件」を商品化する過程があり、それを消費する自分が見えてくるからだ。確かに、言論は自由ではあるし、ともあれば誰かを批判するための出版は自由であろう。それ揺れに、読まない自由もあるし買わない自由もある。が、この出版に関しては「言論の自由」以外のところにある厭らしさ、というか絶対的な否定感がある。おそらく、それが「殺人」に対して自己商品化する態度だ。

話を元に戻そう。「なぜ、人を殺してはいけないのか」の議論がなされ、結局のところ「なぜ、人を殺してはいけないのか」の結論が出なかった時代であった訳だが、自分の中では確信になるものがある。「人を殺すような人がはびこる世間は、自分にとって危険だ」からだ。おそらく、利己的な遺伝子と自分が属する社会の在り方(分化する社会)からの結論になる。人を殺すことの不利益もそうだから、人を殺す人が蔓延る世の中も私にとって不利益である。この論法から言えば、「酒鬼薔薇事件」を起こした犯人が「絶歌」という本を出版し、被害者の意見も聞かず自己満足のために出版へと踏切り世の中になんらかの「名」を成すというスタイル(まさしく、このスタイルそのものが「酒鬼薔薇事件」だということがわかる)を、私は肯定することはできない。かつ、私はそういうものを受け入れる社会は否定する。

カテゴリー: 雑談 | 3件のコメント

DataTable よりも List を使うと 10 倍早くなる(続編)

うちのサイトでは地味にアクセス数が多いページで、

意外と遅い DataTable 、なので List を使うと 5 倍早くなる | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2228/comment-page-1#comment-24840175301577487

というのがあります。もう4年程前の記事で、業務で VB.NET 2.0 を使わないといけなくて、LINQ が使えなかったので、DataTable にしようか、List にしようかという調査の記録です。今だと、もうちょっと色々なやり方があるのですが、ちょっとコメントとが付いたので、計測しなおしてみました。

■list を使う
■list に構造体を使う

上記2つのケースについて、他の3つのケースにて行っている
「あえて最初に行を追加しておく」処理の記述がないように
お見受けしますが、これは単なる誤記であり実際は記述の上
実行された計測結果ということでしょうか。

随分前だったので覚えていないのですが、おそらく比較コードのミスです。あらかじめ1万行いれておいたのは「更新系」をチェックする必要があったので、このままだと list のほうが有利に働きますよね。
気になったので Go4 と Go5 だけ抜き出して書き直しました。

実験コード

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    DataTable MakeDataTable()
    {
        var dt = new DataTable();
        for (int i = 0; i < 100; i++)
        {
            dt.Columns.Add(new DataColumn("x" + i.ToString(), typeof(string)));
        }
        return dt;
    }

    double Go4()
    {
        var dt = MakeDataTable();//  new DataTable();
        // データ更新チェックのため、あらかじめ1万行を作る
        for (int i = 0; i < 10000; i++)
        {
            var row = dt.NewRow();
            dt.Rows.Add(row);
        }
        // 計測開始
        var start = DateTime.Now;
        var tm = DateTime.Now;
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            var row = dt.Rows[i];
            for (int j = 0; j < 100; j++)
            {
                row[j] = tm.ToShortDateString(); tm.AddSeconds(1);
            }
        }
        var tend = DateTime.Now;
        var span = (tend - start).TotalSeconds;
        return span;
    }

    double Go5()
    {
        var dt = new List<object>();
        // データ更新チェックのため、あらかじめ1万行を作る
        for (int i = 0; i < 10000; i++)
        {
            var row = new object[100];
            dt.Add(row);
        }
        // 計測開始
        var start = DateTime.Now;
        var tm = DateTime.Now;
        for (int i = 0; i < dt.Count; i++)
        {
            var row = dt[i] as object[];
            for (int j = 0; j < 100; j++)
            {
                row[j] = tm.ToShortDateString(); tm.AddSeconds(1);
            }
        }
        var tend = DateTime.Now;
        var span = (tend - start).TotalSeconds;
        return span;
    }

    /// <summary>
    /// DataTable を利用
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        var t = this.Go4();
        label1.Text = t.ToString();
    }

    /// <summary>
    /// list を利用
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        var t = this.Go5();
        label1.Text = t.ToString();
    }
}

どちらも、1万行いれておいて、その行に対して逐一データを修正するというスタイルになっています。
コードは Visual Studio 2013 を使っています。

実験結果

DataTable 8.32, 8.12, 8.12 sec
list 0.88, 0.83, 0.83 sec

とう具合に、DataTable よりも list のほうが 10 倍早くなっています。
すべてオンメモリで動くために、後は CPU 速度の違いになるとは思うのですが、PC が異なるし(こっちの PC のほうが断然早いので)相対的な結果になります。以前の 4,5倍よりも開きが大きくなっています。絶対値の違いは、VB が C# よりも遅いのではなくて、計測する CPU の差です。

カテゴリー: 開発 | DataTable よりも List を使うと 10 倍早くなる(続編) はコメントを受け付けていません

.NETラボ勉強会 で Windows 10 IoT Core on Raspberry Pi のハンズオンをやりました

思い付きでやったので、準備不足…な感は否めませんが、ひとまずハンズオンっぽいものをやりました。.NETラボ勉強会の面子にビデオを撮ってもらったので、後で編集して Youtube 等に上げたいと思います。初動が悪かったので、Raspberry Pi の初心者ばかりが集まる=手ぶらでやってくる方がほとんどと思ったのですが、予想に反して Raspberry Pi 2 を持って来て下さった方が8名余りもいらっしゃいました。ありがとうございます。ちょっと、そっちのほうは予想しなかったので、ほぼ放置状態になってしまったのが申し訳ない/残念なのですが、ひとまず、Raspberry Pi 2 に Windows IoT Core を入れるのは結構大変である、ってのは実感して頂けたと思います。いやいや、あれだけ色々な人がやって、結構躓くのだから、家でひとりでやると2時間ぐらいうんうん唸ってしてまっても仕方がないのですよ。情報的には、英語のサイト Windows IoT – Get Started から辿れるところにありますが、各自の環境(Mac, Windows, 仮想環境, micro SD カードの状況などなど)が異なっていて、一筋縄にはいきません。挙句、終わりの5時頃にできたのは、LED をチカチカさせるところまでです。

image

ただし、その前に「どこで躓くのか?」を話したのと、後ろのほうで「何ができるのか?」を話したので、Hello world 的に Lチカを済ませた後に「どこに進めばよいのか」は何となく掴めたのではないか、とは思っています。Raspberry Pi 2 自体は 5,000円程度はするし、時間とお金を掛けるのであれば、それなりに「何か」を掴み取りたいものです。

土曜日には、あえて言いませんでしたが、Windows IoT Core on RPi で四苦八苦するよりは、Raspberry Pi にすんなり Rasbian を乗せて制御したほうが断然いいです。また、Linux に四苦八苦するよりは、Arduino を使ってさっくりとセンサー制御を学んだほうがいいです。そのあたりは、適材適所なところと、「将来的に何をするのか?」の目標を踏み間違えないようにすれば、無駄な学習をせずにすみます(勿論、あえて「無駄な学習」をして異なる知見を得る方法もあります。私もよくやりますが)。

Windows Iot Core on Raspberry Pi の準備

来週から一週間ほど 6/1(月)Windows 10 for Raspberry PI2 開発実習ハンズオンセミナー – connpass が開催されるので、躓きそうなところ(勝手に)支援しておきます。18:00 スタート 21:00 終了というハードスケジュール(平日なので夕方から開催。たぶん de:code に合わせたと思うのですが、かなりきついスケジュール)なので、どこかで躓くと、Lチカもできずに帰ることになってしまうので。

  • 開発環境が Windows 10 IP + Visual Studio 2015 RC となっていますが、現在の Windows 10 IP の build が非常に不安定なので、Windows 8.1 + VS2015RC の組み合わせも検討してみてください。.NET ラボのハンズオンでは半分ぐらいが Mac に Windows 10 IP を入れていましたが、最新のとそうでないものとが混在すると結構ややこしいです。
  • 古い Windows 10 IP だと micro SD カードに書き込む dism のコマンドが異なっています。矛盾していますが、Windows 10 IP は新しいバージョンを使って micro SD カードに焼きこみます。ある意味、micro SD カードへの焼きこみだけ Windows 10 IP で行って、開発環境は Windows 8.1 + VS2015RC という組み合わせが安定します。ちなみに、Visual Studio 2013 と 2015RC は混在できています(これは安定しています)。
  • Windows 10 IP + Visual Studio 2015RC の組み合わせの場合、VS2015RC を立ち上げるときには「開発者モード」にする必要があります。そうしないと、Windows IoT の XAML デザイナが動きません(Windows 8.1 の場合は、もともと動かないので、気にする必要はありません)。デザイナを有効にするためには、「設定」→「Update & security」→「for Developers」を開いて設定します。ちょっと前の Windows 10 IP では、このページが落ちてしまうので Windows 10 を入れた直後に VS2015RC を入れて起動するとXAMLデザイナが動かないときの対処方法 | Moonmile Solutions Blog を参考にして、グループポリシーを設定してください。
  • micro SD カードに焼きこむときに dism コマンドを使いますが、その中の「/ImageFile:flash.ffu」にある、flash.ffu というのは焼きこむファイル名です。Windows_IoT_Core_RPI2_BUILD.zip を解凍すると flash.ffu というファイルがあるので、カレントディレクトリを cd コマンドで移動させてください。コマンドプロンプトを管理者モードで開くと「c:¥¥windows¥¥system32」になります。そのまま dism コマンドをコピペすると flash.ffu が見つからないので書き込みエラーになります(意外と嵌る人が多い)。
  • 多分、Win IoT のプログラムはユニバーサルアプリで作ると思うのですが、あらかじめ Visual Studio 2015 RC を立ち上げて、Universal アプリのテンプレートをダウンロードしておきます。
    以下な、感じになっていれば ok です。回線が細いと、このアップデートだけで20分以上かかります。最初の Universal アプリを作ったときテンプレートがダウンロードされるので、適当なプロジェクトで1回だけ作成しておきます。

image

  • できれば、Raspberry Pi 2 に Windows 10 IoT Core を乗せて Hello world するまで | Moonmile Solutions Blog 等を読んで、micro SD カードを Raspberry Pi に挿して Windows IoT Core の起動だけは確認しておくと安心です。ここまでを含めてハンズオンかもしれませんが、ここをやっておくだけで MS 太田さんの手間がかなり省けます。
  • 電源キットは、2A 5V の…となっていますが、実はノートパソコンから USB 給電だけでも起動します。ただし、HDMI 接続をしているときはうまく立ち上がらないことが多い(起動はしているので、Powershell やアップロードなどは問題ない)ので、電源アダプタは持っておくといかもしれませんね。Android 用の急速充電器(2A版)があればそれを使うとよいです。おそらく、iPad の充電器も使えるのではないかと。まあ、行った先で若松通商さんで買うのもアリですね。

あとは、受講用に Azure を登録しておくとか諸々ありますが、それらは別途、connpass のドキュメントを見てください。

ハンズオンの実際

少しぐらいは資料を用意すればよかったのと、事前に作っておいた(実は、超音波センサーのプログラムは前日…というか当日の夜に作ってあった)プログラムは、配布すればよかったですね。なんとなく、Raspberry Pi を各自動かしてみてから、の頭があったので配布し忘れていたのですが。

image

組み込みに関しては、全くやったことはないけど興味がある方から、自前で液晶ディスプレイを持参できる方までさまざまです。特に Windows IoT on RPi の場合には、もともと Raspberry Pi を使っている方は、それなりに機材が揃っている(自前のハット/拡張ボードとか)のでそれを使いたいものです。ちなみ、Raspberry Pi の既存のハットなのですが、Windows IoT のピン番号が異なっていたり融通が効かなかったりするので、ほとんど使えないと思います。I2C オンリーならば大丈夫かも、ってことで I2C ボードだけは検証します。残念ながら手元の Sparkfun のモータードライバは使えませんでした。

あと、歴史的に Raspberry Pi よりも Arduino のほうが早い時期からあるため、電子工作的なキットでは Arduino のほうが豊富にあります。このため RPi はサーバー機やカメラ利用に使われることが多いのです。Linux が動くので、そのまま apt-get で作れるってのがメリットですね。ですが、Windows IoT Core の場合は、どちらかというと Arduino 寄りな GPIO 接続を狙っているらしく、そのあたりが中途半端になっています。アナログ入力が RPi にはないので、温度センサーもちょっと工夫しないといけません。まあ、そのあたりは、Arduino + Raspberry Pi の組み合わせで試行するのがよいでしょう。ハンズオンでも話しましたが、中国の Arduino Nano 互換機は 300円と非常に安く手に入ります。Arduino Uno 互換機も 700円程度です。この値段ならば、Arduino を PIC などのチップと同様に扱うことも可能です(まあ、それでも 100円とかに比べれば十分高いですが)。

image

ハンズオンでは、敢えて安いブレッドボードと、あえて安いLED/ジャンパーワイヤーを使っています。色々高いものもあるのですが、価格的には低いところから入れますよというのを強調したかったからです。

こんな風な Arduino 戦車であれば、3,500円位で作れます。Arduno Nano 互換機を使えばもっと安くなります。これは Windows Remote Arduino 用にしたもので、Windows ストアアプリや Xamarin.Android を使って Android スマートフォンから操作できます。

image

ロボットアームも、おもちゃのものであれば 5,000円弱からあります。これは株式会社イスペットが出しているグリッパーアームロボットです。サーボモータではないので安く作れています。ロボットアームは2,3年前あたりに流行ったのですが、高価なものが多かった(5万円位?)ためか今ではほとんどが発売中止になっています。うまくやると、グリッパーアームで積木を積むことができます。

image

以前、Kickstarter で出ていた meArm も持ってきました。これはサーボモーターが4つ付いて 3,500円ぐらいです。英国産です。Raspberry Pi 用に Sparkfan で I2C ボードも買ってあるので、いずれ Windows IoT で動かしてみましょう。一年前に meArmPi の動作メモ | Moonmile Solutions Blog あたりで、Raspbian + mono + F# で動かしたことがあります。

image

半田付けの電子工作の例として、RealSense コンテストのとき作った妖怪ウォッチ LED も持って行きました。これは抵抗付きなので、そのまま Raspberry Pi のピンから給電しても大丈夫です。

image

私の場合、Internet of Things というよりも、動かせるモノからスタートしているので他とはちょっと毛色が違うのですが、具体的に「何かが動く」とか「何を操作できる」という入り口がいいかなと思っています。手元の Raspberry Pi 5 台は小学校でのワークショップ用に買ってはみたのですが、Windows IoT だとディスプレイがないとちょっと辛い感じ(Raspbian だとなおさら)なので、この辺りは考え直そうかなと思案中ですね。

次は何をするか?

Windows IoT Core で Lチカをやったり、モーターを制御できた後は何をするのか?が問題ですよね。ホビー的にマルチコプターに進むのもいいのですが、ワタクシ的には地べたを這いずり回るほうが「安全」なので、キャタピラと車輪とアームのほうに進みます。位置情報なんかは「確率ロボテック」を読むとよいでしょう。ルンバの位置情報はこれを使っているハズです。あと、カメラとアーム制御なんかは、ROS に対応させるのも良いかなと。

という訳で、.NET ラボ勉強会スタッフの皆様と、会場を提供してくださった Microsoft さんに感謝です。

参考資料

いくつか Windows IoT Core on Raspberry Pi で参考になりそうな書籍を上げておきます。

サンプルコード

ハンズオンで使った(使う予定だった)サンプルコードを後で載せておきます。

  • いわゆる Hello World.
  • Lチカ
  • 超音波センサーで(おざなりに)距離計測
  • グリッパーアームロボットを遠隔操作
  • Windows Remote Arduino で Arduino 戦車をストアプリで操作
  • Windows Remote Arduino で Arduino 戦車を Android スマートフォンで操作(Xamarin.Android)

の予定

 

カテゴリー: RaspberryPi, Win IoT | 1件のコメント