C++/CLI と C# ライブラリを混在させるときの構成マネージャ

とあるプロジェクトで C++/CLI と C# ライブラリを混在させたときの構成マネージャの記録を残しておきます。ライブラリのほうは、既存のC/C++ライブラリを想定して、それをC#から使いやすいようにラップします。まあ、C#から直接C言語のDLLを呼び出すことは可能なのですが、後々のメンテナンスを考えると、インポート文の羅列はちょっと避けておきたい。C++/CLI を記述するにしても、これもメンテナンスが大変(C++/CLIを知っている人が少ない)なことを考えれば、ある程度C#で書ける部分を多くしておくほうがよいでしょう、という発想で構成を作ってあります。

clip_image010

この構成が妙に複雑なのは、デスクトップアプリ側にサービスとしてC/C++のDLLを利用する部分が存在し、これをストアアプリからローカルHTTPで利用しようとするスタイルのためです。ストアアプリではWin2Dを使っていますが、これがDirectXになると、C++/CXまで参戦するという大混乱状態になりますね…な感じです。

上記のプラットフォームを見ると、x86, Win32, Any CPUが混在していますが、これでokです。プラットフォーム名を「x86」などに揃えようとしたのですが無理でした。ビルドするたびに「構築されているプロジェクトのプロセッサ アーキテクチャ “MSIL” と~」という警告がでますが無視して大丈夫です。

嵌りどころとしては、C++/CLIのプロジェクトを追加したり、ストアアプリのC#プロジェクトを新規に追加したときには、「ビルド」のチェックが外れているということです。参照設定などでプロジェクト参照をしてれば自動的にビルドの順序は設定されるのですが、プラットフォームが異なるせいか、このビルドのチェックが外れたままになっています。C++/CLI と C# デスクトップアプリ、C#ストアアプリを混在させるときは、ここのプラットフォームを選択した後でビルドにチェックをいれておきます。これによってソリューションからリビルドしたときに、普通の C# プロジェクトのように依存関係を見てすべてリビルドされます。そうしないと、ビルドされないまま残った DLL があったりして、正しくビルドができません。

image

参照設定としてややこしかったのは、デスクトップとストアアプリ間のデータを共有するために、C#で作成したPCLを利用するということです。このPCLをシリアライズ/デシリアライズすることで、データ通信を楽にしています。.NETリモートはストアアプリでは使えない(マーシャリングが使えない?)ので、自前でシリアライズする訳ですね。シリアライズ自体は、DataContractSerializerを使っているだけなので難しくはありません。その分データ量が多くなってしまうのですが、まあ、ローカルで通信する分には問題はないでしょう。

これがさっくりと実機で動くかというと、そうでもなくて、

  • VC++ 2013 用の再配布可能パッケージをインストール(msvcp120.dll、msvcr120.dll)
  • netsh でのポート設定
  • 依存するDLLの配置

を適切にやらないとうまく通りません。そういう意味ではオールC#で書いておくと、そのあたりの懸念点は減るのですが…、まあ既存のC/C++のDLL呼び出しのときは、C++/CLIを使いたいところですよね、ってことで、メモ書き的に。

カテゴリー: C# | C++/CLI と C# ライブラリを混在させるときの構成マネージャ はコメントを受け付けていません

Windows フィードバックで英語版フィードバックを見る方法

木澤(@tkrx178)さんの

 

確かに、Twitterに文句を垂れるだけでは駄目ですよね。プレビュー版では、いくつか不具合情報を送ったりしていたのですが、Windows 10 でもフィードバックを送りましょう。ってことで、改めて開いてみたのですが…、あれ?このフィードバックって数が少なくありませんか?日本語だけでフィードバックされている訳ではなくて、英語のフィードバックは何処に?(実は、これを見たときには Windows IoT Core の日本語フィードバックは0件だったんですよね。今では2件入ってます)。

image

日本語フィードバックを米国MSの中の人が見ているのか見てないのかは別として、英語圏ではどのようなフィードバックが送られているのかが気になるところです。どうやったら見れるのか?ってのが気になってあれこれ探していたらいい方法を見つけました。

英語版OSを使う

正攻法としては、Windows 10 の英語版を使う方法です。US 版だから、US の Windows フィードバックが開かれるのは当たり前。

と思って昨夜やっていたのですが、今朝みるとなぜか英語OSの中で日本語フィードバックを呼び出しているんですよ。あれ?Windowsアカウントが日本語だから、英語OSなのに日本語になってしまった?

image

と思ったら、右下のキーボードが「日本語」になっているんですよ。

キーボードを英語キーボードに変える

実は、業務の都合があって私のPCには、日本語キーボードとUSキーボードの両方のドライバが入っています。「言語設定」を開いて、English が追加してあるのです。

image

言語設定(キーボード)は、タスクバーの右下にある「J」のアイコンで切り替えができます。通常は Microsoft IME を動かしていると思うので、これを ENG にすれば ok です。

image

そうすると、日本語キーボード(Microsoft IME)の場合は日本語の表示だったものが、

image

英語キーボードに切り替えると、英語圏のフィードバックになります。

image

フィードバックの数自体が変わっているのが解りますよね。再検索(別の項目をクリックするなど)すると、英語/日本語が切り替わるので、どうやら POST するときの言語設定をキーボード設定から取ってきているようです。Windows フィードバック自体は、ストアアプリ(Universal アプリ)で作られているので、ストアアプリの設定自体が OS 自体の言語設定じゃなくて、キーボード設定からとってきているのかもしれません。ちょっとここら辺は解らず。

ちなみに、Windows フィードバックアプリ自身に対するフィードバックを送るカテゴリもあります。「アプリ」→「Windows フィードバックアプリ」に送れば、フィードバック自体も改善されるかもしれませんね。

image

これは、日本語で送ったものなのですが、後で英語に訳して英語キーボードに切り替えて送ってみようと思います。

~~~

英語キーボードにして送ると、英語OSの Windows Feedback で検索できるようになりました。どうやら、直接米国MSに伝えたい内容は、

  1. Windows フィードバックを立ち上げる
  2. US キーボードに切り替える
  3. フィードバックを送信する。

という手順で送ると、米国MSから見えやすい状態になりそうですね。

カテゴリー: Windows 10 | Windows フィードバックで英語版フィードバックを見る方法 はコメントを受け付けていません

祝!Windows 10 IoT Core 正式リリース、そして TI SensorTag が動くまで

MS太田さんのつぶやきに Windows IoT Core だと BLE 使って簡単に Azure に、という話があって、でもなー、現状の Windows IoT Core on Raspberry Pi って Bluetooth のドングルが付いてなくて…と思っていて、念のためサイトを調べ直したら、リリースノート

image

な感じで書いてあるじゃないですか!!! 確か1か月前のリリースをつい先日見たときにはなかったはずで、となるとひょっとしてバージョンアップしたのでは?と思ってダウンロードしてみれば。おお、バージョンが変わっている。しかも、よくよく見れば「Windows 10 IoT Core Public Release」になっている訳だから正式版ってことですよね。ダウンロードして、RPi2 上で動かしてみれば、バージョンは 10.0.10240。これは、PC 版のバージョンと同じ。ってことは、7/29 に同時リリースしてたッ!!! ってことですね。なんというか、もうちょっと知らせてくれればいいのに(ひょっとすると Windows Dev Center のメールにはあったかもしれない)、あれだけ Build 2015 でやっていた訳ですから、もうちょっと宣伝しても良いのではないかと。

そんな訳で、晴れて正式版になった Windows 10 IoT Core を使ってみましょう、ってことでざっくりと。

SD カードは Windows 8.1 でも作れる

最初のプレビュー版では、SD カードへの焼き込みは Windows 10 からでしかできなくて、VMWare を使ったり Mac から焼きこんだりしていた訳ですが、正式版では(正確には1か月前のプレビュー版も可能)、Windows 8.1 からも SD カードへの焼き込みができます。

Windows IoT – Setup your Raspberry Pi 2
http://ms-iot.github.io/content/en-US/win10/SetupRPI.htm

上記にある通り、DVD イメージの iso ファイルをダウンロードしてインストールを済ませると、こんな風なインストールツールが使えるようになります。

image

これを使って flash.ffu ファイルを SD カードに焼き込めば ok です。Windows 10 IoT Core Build 10240について | WIAA さんのところも合わせて参考にしてください。

サンプルは github/ms-iot/samples にある

色々試してみるときに、さっくりとコードがあるとよいので(ピン配置とかが固有なので、それのあたりは見ないと駄目なんですが)、https://github.com/ms-iot/samples からサンプルコードをダウンロードしておきます。

Windows IoT – Start Coding
http://ms-iot.github.io/content/en-US/win10/StartCoding.htm

ここに動かせるものがあるので、これを Visual Studio 2015 でビルドして RPi 上で動かします。デバッグ実行するときに、

  • ターゲットを「ARM」に変更する。
  • リモートコンピュータで、認証を「なし」に変更しておく

image

ことを忘れなければ大丈夫です。

WiFi, Bluetooth, 無線マウスが(制限付き)で使える

USB の有線マウスは、ほぼどんなマウスでも大丈夫です。無線マウスは、手元の Microsoft Wireless Mobile Mouse 3500 がうまく動きました。ただし、Bluetooth と無線マウスを同時に差し込むと、電圧の関係で動作が不安定になるので、どちらかという感じですね。

WiFi ドングルは使える、ということになっていますが、正式サポートでは Raspberry Pi のオフィシャル WiFi ドングルのみです。Windows IoT – Using WiFi on your Windows 10 IoT Core device. 手元にある、Buffalo の WLI-UC-GNM は駄目でした。

Bluetooth ドングルは Windows IoT – Bluetooth Support の中では、Orico のドングル(アメリカだと安いらしい)のみサポートなのですが、手元にある Buffalo の BT ドングルで動きました。おそらくチップが「CSR8510 A10」であれば動くような気がします。

BLE のサンプルを動かす

Windows IoT – BLE GATT Sample – Code
http://ms-iot.github.io/content/en-US/win10/samples/BLEGatt2.htm

で紹介されている TI SensorTag を試しています。SensorTag は Bluetooth Low Energy で接続するのと、加速度センサーや温度センサーが付いて実験的に使えます。以前買ったもので、大体 5,000円位です。いまだと、Blue Ninja とか、konashi 2.0 あたりを使えばよいでしょう。

 

サンプルを動かすときに、Windows IoT Core 側に設定が必要です。あらかじめ、Bluetooth ドングルと SensorTag をペアリングしておきます。

このペアリングツール、PowerShell 上では使えなくて、なぜか SSH 上で使います。入力パイプのところが変なだけなので、PowerShell 用には…というか、通常のコマンドライン用に切り替えることはできるかなと。Tera Term で接続しようとしたのですが、なぜか10秒位で切れてしまうので、素直に Putty を使ってください。

SensorTag は BLE なので、「C」で BLE のほうに切り替えてから「P」でペアリングをします。ピンコードを入力すればokです。

Pairing Tool 1

Visual Studio 2015 からビルドをして、リモートコンピュータで実行すると、こんな風に画面に Sensor タグから取得した結果を表示します。

色々繋がってしまうので(特に有線LAN)、いまひとつ組み込みシステムの恩恵が感じられませんが(苦笑)、まあ、ディスプレイを7インチの小さなものを使ってみたり、LAN は外してしまって Bluetooth 経由でデータのやり取りを行えば、結構モバイル的に使えるでしょう。BLE だけでなく、通常の Bluetooth が使えるので PC と直接つなげることもできます。

PC から Windows IoT Core にペアリングする。

image

ちなみに、アプリ自体はユニバーサルアプリになっているので、デプロイ先をローカルコンピュータにして x64 あたりでビルドすれば、普通の PC でもそのまま動きます。なので、GPIO のような制御がない場合であれば、一度 PC で実験しておいて、その後に ARM でビルドをして Windows IoT Core のほうで使うということが可能ですね。

image

そんなわけで、再びロボットアームを動かすところを、後日。

カテゴリー: RaspberryPi, Win IoT | 祝!Windows 10 IoT Core 正式リリース、そして TI SensorTag が動くまで はコメントを受け付けていません

Windows 10にアップデートしたらHyper-Vのネットワークが効かなくなった場合

ほぼ、自分限定かもしれないけど、トラブルシューティング的に残しておきます。

現象

  • Windows 8.1 から Windows 10 にアップグレード
  • Hyper-V のゲストOSから接続できていたネットワークが繋がらなくなる。

原因

image

Hyper-V からは、Hyper-V Extensible Virtual Switch を通してホストOSのネットワークにつながっているのですが、もともとできていたネットワークアダプタ(「イーサネット6(無効)」と書いてあるもの)が、有効にできなくなってしまいました。有効にできない(削除もできない)のは妙な感じがするのですが、まあ、別なアダプターを作ってそっちに切り替えてやれば ok です。

最初は元のネットワークが有効にならなくて、あれこれ弄っていたいのですが、新しく作って切り替えた対処のほうが簡単そうです。

ちなみに、今の PC にはネットワークボードが2本差しになっていて、その一方しか使っていない、というのがトラブルの元っぽいです。何故か、ケーブルの繋がっていないほうに対して優先してつなげようとするので、ケーブルが繋がっていない「イーサネット4(未使用)」のほうは「無効」にしておきました。

対処

仮想ネットワークを構成する
https://technet.microsoft.com/ja-jp/library/Cc816585(v=WS.10).aspx

を参考にして Hyper-V の仮想ネットワークを再構成します。若干文言が異なる(「仮想ネットワーク マネージャ」ではなく「仮想スイッチマネージャ」など)ので、ちょっと注意が必要です。

Hyper-V マネージャを開いて、「ホストOS」→「仮想スイッチマネージャ」をクリック。

image

「新しい仮想ネットワークスイッチ」を選択して「外部」で仮想スイッチを作る。名前は適当に変えておくのがベターです。

image

ゲストOS(仮想マシン)のほうで、設定を選択肢て、ハードウェアの追加で「ネットワークアダプター」を選択

image

仮想スイッチを、先に作ったスイッチを選択して、適用すれえばよい。

image

これで、ゲストOSのほうから直接ネットワークにつなげることができます。

もとの動かなくなったアダプターが気持ち悪いのですが、まあ、ネットワークが復旧できたのでひとまずこれでok。

カテゴリー: Windows 10 | 1件のコメント

.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 に移植する はコメントを受け付けていません