Android SDK をアップデートしたら Hyper-V のエミュレータに接続できなくなったとき

久し振りに、Xamarin.Android を作って、ツールを作ろうと思ったのですが、何故か

error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: …

のようなエラーがでて、Visual Studio から Hyper-V の Android エミュレータに接続できなくなってしまいました。Android の axml を編集するために、Android SDK をアップデートしたのですが、どうやらタイミング的に Xamarin.Android 内の Android SDK と相性が悪い模様。正確には adb がうまく起動できないようです。

こんな風に、エミュレータにアップロードする時に固まってしまいます。

image

 

エミュレータへは adb を使って接続しているのですが、どうも adb devices を実行しても空で返って来ます。多分、AppData/Local のほうで使っていれば分離できているのだけど、/Program Files を示しているときは競合しているのかも。

image

C:/Program Files (x86)/Android/android-sdk/platform-tools に adb.exe があります。

image

多分、connect がうまくいっていないので、手動で接続してあげると、繋げるようになります。

Hyper-V のエミュレータで >> ボタンをクリックして「Network」のタブを開くと、エミュレータが使っている IP アドレスが分かります。

image

これを使って

adb connect 172.16.0.20

で起動させておくと、Visual Studio から Hyper-V のエミュレータへのデプロイができるようになります。

image

多分、Program Files 配下にあるから、パーミッション絡みで起動できなくなっているような気がするんだけど、どうなんだろう。コマンドが間違っているような気も。

おまけ

Visual Studio の新しいバージョンを Hyper-V 内で試しているんだけど、そこで Xamarin を動かして Android に接続するときに困っていたのですが、どうやら adb connect で繋げれば、Hyper-V 内の Visual Studio から別の Hyper-V で動いている Android エミュレータに接続できますね。これは結構便利。

カテゴリー: Xamarin, トラブルシューティング | Android SDK をアップデートしたら Hyper-V のエミュレータに接続できなくなったとき はコメントを受け付けていません

MVVM+MVCパターンを発注視点で分割する

MVVM+MVCパターンを大規模システムにスケールする | Moonmile Solutions Blog で書いた「大規模プロジェクトを発注視点で分割する」の項目をもう少し掘り込んで、思考実験してみましょう。

何故、発注視点を先にやるのか?

もし、ソフトウェア開発が車の購入のように、買ったその日から使えるとすれば(既存のシステムや、クラウド上にあるシステムに沿うならば、「即日」も可能ですよね)、開発している途中の都合は問題ではありません。機能的な価値よりも、機会損失を加味して早期導入によるメリットのほうが大きいパターンを考えてみます。実際には、開発期間が0日であったとしても、実際に使う期日はもっと先にあって、しばらく使わないという塩漬けな状態があったりするのですが、できることなら、すべてを0日で揃えるのが一番価値の高いものでしょう。

そう考えると、ソフトウェア開発における要件定義のまとめからソフトウェアの開発期間、品質の向上、機能の豊富さなどが、すべてマイナス要因となり、減点法で考えることができるようになります。学校においては「減点法」は良くないのですが、リリースが即日であって開発期間が0日であることが「最高」であると考えると、開発期間が増えるたびにマイナスになっていくという単純増加のグラフが簡単に作れるのです。

image

リリースまでの日数が0日でれば、先行利益の価値は最高になります。開発期間が0日以上であれば、その分、先行利益の金額は下がるというわけです。

発注からみれば、すべての機能が揃っているならば、即日使えたほうがいいですよね。既存の製品を売る場合はこのパターンになるでしょう。

開発期間により機能が増えると考えると

リリースまでの日数が0日の場合は、開発期間がなしということなので、何もモノがない場合は、モノがない状態で納品することになります。開発期間が数日、数週間、数か月と増えていくたびに、なんらかの機能が追加され製品を使ったことによる収入が増えると考えられます。これは、間接部門が使う情報管理システムかもしれないし、会計システムかもしれないし、顧客管理のシステムかもしれません。何の機能もない場合は、何も効率化できないけど、数週間なり数か月のソフトウェア期間を設けることによって、何らかのモノができるという考え方です。

image

開発期間を0日を基準にしたとき、右上がりのグラフが「先行利益」になり、右下がりのグラフが「機能による利益」になります。リリース日より、数日前から機能による利益は発生し、開発期間が長くなれば、機能による利益はアップします。ただし、開発期間を数十年にしたら、どこまでも伸び続けるかというとそうでもなく、ある程度の限界が必要なのですが、ここで注目したいのは「適切な開発期間」なので、長期すぎる開発期間の話は省きます。

図を見て分かる通り、二つの線には交点があります。2つの利益を加算したときに、最高になる地点がこの交点になります。2つのグラフが直接の場合には、加算しても同じ値になるのだけど、そこは曲線になると考えてください。

つまり、交差する時期にリリース日を設定すると、先行利益+機能による利益が最高になるというわけです。実際には、リリース後にも機能が追加されるので、機能による利益は少しずつ増加していきます。

ソフトウェア開発には最適なリリース日がある

この考察をまとめると、車のように即日買ったときに全ての価値が得られるのではなく、

  • なんらかの開発期間を要する
  • 開発期間により、製品自体の機能価値があがる

という条件のもとでは、リリース日は0日ではない、ということがわかります。また、すべての機能が盛り込まれた状態の最終的な出荷よりも、ある程度の機能が盛り込まれた状態でリリースさるほうが先行利益が加算されて、トータルの利益が大きいことがわかります。つまり、ここが「発注側の視点」によるリリース日の設定になります。

先行リリース、逐次リリースなどアジャイルやウォーターフォールを含めて、いくつかのリリース方法がありますが、発注側からすれば、リリースまでに極端に短期である必要もないし、すべての機能が揃うまでリリースを待つ必要もありません。リリースされたものを利用して、具体的に先行利益が得られる状態でのみ、リリース日の意味があります。

カテゴリー: 設計 | MVVM+MVCパターンを発注視点で分割する はコメントを受け付けていません

[ソフトウェア開発者の道具箱] 金の鍵

ソフトウェア開発者の道具箱 | Moonmile Solutions Blog シリーズの第3弾めは、情報発信の話。

研究開発でもプログラミングでもそうなんだけど、実際にモノを作っている時間と、モノを作ろうと設計としている時間がある。モノを作っているときは、集中している時間を多くして、出掛ける時間を減らしたり人と会う時間を減らしたりする。じゃないと「モノを作る」時間を捻出できない。逆に、モノを作るための設計とか計画をしているときは、適度に情報を取り入れたり出したりしないとうまく発想が回らない。情報を取り入れるところはすぐに分かると思うけど、「情報を出す」というところに手が回らないくてやめてしまう人が多いのだが、実は違う。情報を効率よく取り入れるためには、情報を出すという自分なりの整理が必要になる。

  1. 雑多な未知な情報を取り入れる。
  2. 自分の中の既知な情報と組み合わせたり比較したりする。
  3. 取り入れた情報に対して「本質」を外していないか、客観視するために情報を出す。

というサイクルが必要になる。よく、Twitter で書いた途端に誤字をみつけるとか、人と話した途端に理解が進むとか、コンピューターの横に熊のぬいぐるみを置いて話しかける、というアレです。

でもって、何らかの情報を出し入れしている間にだんだん固まってきて、ひとつに集約するためにモノ(プログラムコード)を形作っていくわけだけど、物理的なモノづくりと違って、プログラミングコードなんてのは作ったり消えたりするサイクルが非常に早いので、作る時間と考える時間を結構なタイミングでスライスさせても問題がない…ように見えるのだが、それでも交互に来ることには違いない。

「金の鍵」ってのは、情報を発信するときに内側から開けるための鍵です。外からの情報をシャットアウトするために鍵が必要なのは直ぐに分かると思うけど、内側から出るときに何故鍵が必要なのか?そう、先の設計時の思考で書いたように、情報の流入と流出のバランスと保ために、内側のほうにも鍵を付けておいて「常に外側に繋がっているという状態ではない」という状態を保つのに必要だということだ。「平田弘史のお父さん物語」に詳しく書いてあるのだが、呼吸と同じ。「吸」だけ続けても何も吸収できないので、「呼」があって循環させないといけない。これは仏教の呼吸法にもあるんだが、循環とか輪廻とかそういうところに根差している「思想」になる。だから、科学的に「本当に知識の吸収ばかりすると効率が悪いのか?」という証明は別として、温故知新な経験的なところから、情報の入力と出力のバランスを取れ、というのセオリーということになる。こんな風に、ブログとかで出力すると自分にとっても客観視ができやすくなるので、それなりの効用はある。

内部から外側にでるときに「鍵」を使うということは、情報発信をするときに、なんらかの形で情報を整理するということでもある。つまり、取り入れた情報をそのまま垂れ流すのではなくて、何がしかの理解をしたうえで流す/伝えるということですね。そうなると、安易なリツイートやまとめサイトの云々がアレなのが分かると思う。ひと呼吸おくということが、ちょうど「鍵」の役目をすることになって、それが「思慮深さ」を生むことなる。思慮深さは会話のテクニックでもあるのだけど、即答しないでひと呼吸置くとか、相手が息を吐ききった後に話かけるとか、そういうタイミングの話でもありますね。武術においても、相手が呼吸を吐いたときに当てるのが一番ダメージが大きいので、それを見る。同時に、呼吸をさとらせないという技もあれば、偽の呼吸を相手に伝えて惑わすという手法もある。これは武術に限らず、会議とか競合会社のアレとかにも使える。

そういうタイミングが鍵になる。

ちなみに、逆引き大全のほうは、1対多の情報発信の話になっているので、こっちはISO9000絡みの、「外に漏れるとまずい情報≒メンバ全体が知らなくても良い情報」あたりの鍵の話になってる。

カテゴリー: ソフトウェア開発者の道具箱 | [ソフトウェア開発者の道具箱] 金の鍵 はコメントを受け付けていません

怒鳴り声が聞こえる教室/職場について

実は「とと姉ちゃん」をちらちら見ていて思ったんだが、Twitter には流れてこないし、それほど気にする人はいないのかなと思った。しかし、Twitterで拡散されたツイート「先生の怒る声が辛くてドキドキして苦しくなっちゃう子供が実際にいること」: 『それでも彼と未来をさがして』HSC母のblog が流れてきたので、エールを送っておこう。

学校の先生とか職場とかで「怒鳴る先生/上司」がいるときに、別の人が怒られていて自分には関係ないはずなのに胃が痛くなる。先に書かれているブログの内容のように「メンタルが弱い」と言われることがあって苦々しく思うのだが、実は感受性が弱い(凡庸)だから他人が怒鳴られているのに気にせず(あるいは、胃が痛くなるほど同化せず)、感受性が強いからこそ(相手への共感性が高いほど)自分が怒鳴られているように感じて、精神的に病んでしまうことがある。…というのは、なかなか理解されない。

HSC/HSP(Highly sensitive person)というのを初めて聞いたので、自閉症/アスペルガー/注意欠陥/多動症/サヴァン症候群との違いが、いまいち掴めていないかもしれないが、ハイリー・センシティブ・パーソン – Wikipedia を見る限り「生得的な特性」とあるので、遺伝系の話になりますよね。社交性が問われる内向的な性格とか、協調性のような社会的な適応性のような後天的なもの(例えば、オオカミに育てられた子供のように、社会的な活動を一切していないのであれば、社会的な活動に沿う行動はできないのだ。逆に、後天的に学ぶことが可能ってことになる)とは違って、生まれつき持っているもので変化しないものだ。勿論、生れつき持っているもの=気質だからといって、将来的に(大人になったときに)、それがマイナスに働くかプラスに働くかは別の話になる。さらっと HSC の話をいくつかみていくと、子供の頃のマイナス面を強調されているものが多いのだが、プラス面を強調することも可能だ。

怒鳴り声に鈍感になる

HSC な子の割合が 15~20% ってことになっているので、30人学級だと6人ぐらいいることになるよね。これだと「症候群」というよりも、単にグループとか分類の範疇になると思う。そうそう、民主主義的に多数決で投票を取ると少数派になるパターン。でも、徒党が組めるぐらいの人数がある。最近語られることの多いマイノリティ(≒少数派)はもっと数が少ない。5%以下ぐらいじゃないかな。30人学級で1人いるかいないかという確率になる。こうなると、学級内で「友達」を作ることが難しいので、意図的に保護しないとうまくいかない。

でもって、人口の8割が「怒鳴ってもok」という雰囲気の中にいると、教室なり職場なりで「怒鳴る」ことが日常的に行われていることを、単なる現象として捉えること(ああ、かわいそうだなと思う程度で、自分に降りかからないようにするとか、他山の石として参考にするとか、そういう意味で)ができるのだが、残りの2割は自分が怒られているように恐怖として感じる。8割の多数の人は「怒鳴り声」の多い職場/教室では、自分だけが怒られたときに「怒られた」というストレスを感じるわけだが、2割の人は「怒鳴り声」を聞くたびに、自分が怒鳴られているのと同等のストレスを感じるので、まあ、常に怒られているような教室/職場になるわけだ。そりゃ、それがストレスになって登校拒否になったり、職場に行くのが嫌になったりする。いわゆる、ブラックな職場というものがあるけど、それはまた別な話。一般的に「怒鳴り声」が少ないと思われる職場であっても、怒鳴り声のたびにストレスを感じれば、ブラックな職場ぐらいのストレスをその人は感じているのだ。

じゃあ、これの場合はどうするのか?というと、

  • 職場を教室を変える。
  • 「怒鳴り声」に鈍感になる。

実は、「とと姉ちゃん」の怒鳴り声を聴くたびに、私は嫌な感じがするので内容はともかくとして、怒鳴り声を許容している職場というのが嫌なんだが(それが朝ドラで放映されているのも嫌なんだが)、そういう場合は、テレビを消せばよい。あるいは、音を小さくするという手段をとる。簡単だ。見なければ自分に関係ないからストレスを感じなくなる。

テレビドラマの場合は「見ない」という手段が取れるが、実際の教室や職場だとこれはできない。教師は、怒鳴ることによって「叱る」ことの手段を行使しているのかもしれないし、8割の子供や親にとって(かつ教師も含む)「怒鳴る」ことがそれほどストレスに感じないのだから、まあ、直接、怒鳴ることはなくても、他の子を怒鳴ることもあるだろう。そもそも、怒鳴ってくださいという体育会系の親もいる(今だといないのかな?)もいるわけで、なかなか一方の主張を通すだけでは難しい。逆の立場になれば、いたずらっ子を怒鳴って懲らしめるというのは、サザエさんも一般に行われているし、社会的に認知されているものと考えられるでしょう?それは、日本的なものなのか、戸塚ヨットスクールみたいに限定されているものなのかは不明だが(だって、赤毛のアンにだって鞭で打たれるシーンはあるし、洋画のほうが「口論」というシーンは多い)、社会的な通念は別として、感受性の高い子(「過敏な子」と言い方ほうがいいと思う)にとって、その「過敏」さは他の人に理解されにくいところがある。ただし、この HSC の原因が「気質」にあるならば、両親のどちらかがその遺伝的形質を持っているということなので、片親が理解できればいいのですよ。つまり、父親の遺伝であれば、母親には理解しがたい現象かもしれないし、逆に母親の形質であれば父親には理解しがたい。遺伝だからね。

となると、社会的に取れる手段として「鈍感になる」というのがある。自閉症の例で、目に入る光が多く感じられるので、色の濃いサングラスをかける(ある色彩だけ遮蔽するとか自閉症専用のサングラスがある)という方法がある。これだけでも十分過ごしやすくなるそうだ。同じように「怒鳴り声」が多い環境の場合は、怒鳴り声に対して鈍感になるように、自分の側で防衛する方法を取る。

  • 怒鳴り声が聞こえたら、教室や職場を一時的に出る。
  • 別なことに集中する。あえて、楽しい絵を見るとか、漫画を読むとか。
  • 端的に耳をふさぐ。耳栓をする。

一般的な8割の人からみれば、他の人が「怒鳴られている」のだから、もうちょっと気を使ったらいいんじゃないかという不審な目で見られがちなんだが、いや、自分が怒鳴られているように感じるのだから防衛するしかないのだ。8割の人の鈍感さの対応の仕方では難しいので、別な対策をとるという方法になる。

私の場合、だいたいこれでマシになります。会議中でも誰かが怒鳴りだしたら、空気を読まずにトイレに出ることにしている。

ポジティブに HSC/HSP をとらえる

アスペルガー症候群と若干混ざってくるが、常に防衛側に回る必要はない。所詮「症候群」という全体主義的なカテゴリ分けの意味しかないので、個人として生活するならば、アクティブなものとして捉えることもできる。

アスペルガー症候群にも重いやつと軽いやつがあるので、いろいろなんだけど、他人に迎合しない利点(感情を理解する仕組みは一般の人とは違う)を利用して、多人数に迎合しない仕事とか発見が可能になる。HSP の場合は、世の中の2割がそうならば、職業の2割は HSP のほうが得な職業だということだ。社会的適合としてね。

ひとりで研究をするという意味で、医者とか芸術家とか漫画家とかプログラマとかがあげられているけど(IT業界の場合は、群衆なプログラマと個なプログラマがあるので、もちろん後者のほうね)、とある現象に「過敏」という癖を利用すると、品質管理とか文書チェック関係の細かい仕事を正しくやるという仕事にも向いている。宇宙飛行士もその範疇だと思うんだけど、協調性(相手を早い時期に許すという緩めな性格)と強烈な自我(競争率が高いからね)を両立しないといけないので、もうちょっと待ったほうがいいかな。「死」に対する危険を人より多く感じるので、工事現場とか建設現場とか工場のライン作業には向かない。安全第一の場合、注意喚起として大声を出す事が推奨されているけど、それがマイナスに働く。「間違い」に関して多少寛容でないと、間違いを犯さないように注意深く進み過ぎて動けなくなってしまうという特徴がある。そういう意味で、私のプログラマ生活は TDD とワンセットだったりする。

研究員には向いているはずなんだが、日本の大学だともうちょっと違う要素が多くなっているみたいで、そこは教授をうまく選ばないといけない。というか、いっそ海外に出ちゃったほうがいい。海外に出ると、そももそも自分がマイノリティ(日本人=少数民族)なので、マイノリティな中でマイノリティなことをやるのが馬鹿馬鹿しくなる、という利点がある。

うちの娘も小学校最後の運動会が終わって、来年から中学生。親の保護ができるのは、小学生までなので(という風に決めている)、あとは自分の世界を模索しないといけない。そういう場合に親ができるのは「環境」を用意しておくだけ。あと、この手の理論武装≒武器をあらかじめ揃えておく。不利だからと言って(根本的には)誰も助けてくれないし、誰の助けも根本的な助けにはならない。信じられるのは自分だけなのだから、うまく環境(自分のまわり)を制御するのがコツ。

本を読んだので補足

エイレン・N・アローン著「ひといちばい敏感な子」を取り寄せて、読み終わったので追記をしておこう。HSC が Child で、HSP が Person なので実質違いはない。この本は、HSC の子供を持つ親向けに書かれているので、HSC かな?と思う場合は、「ささいなことにもすぐに動揺してしまうあなたへ」を読めということになっているが、自分の子供の頃は、注意欠陥も多動症も緘黙な子もごっちゃにまとまって「ひとつの普通のクラス」だったので、昔のことを思い出しながら小学生の章を読み下せばよい。

私は日本では「HSC がグループになじめなくて~」と書いたが、この本では179頁に「和を重んじる日本などでは、見方が違う」という項目があって、アメリカ国内の強い自己主張に負けてしまう HSC の子は、日本のような自己否定の少ない国のほうがなじみやすいのではないか、という書き方がされている。どうやら、アメリカでも日本でも HSC な子にとっては住みにくいらしい。

この本には HSC/HSP の「怒鳴りに対する恐怖」っぽいものは書かれていないのだけど、子供を叱るときに頭ごなしに叱るのではなくて、言い聞かせるほうが通じやすい、という書き方がされている。全体的に診療心理学の分野なので、自己主張よりも「現実の世の中にどのようになじむのか」という視点での提案が多い。まあ、芸術家などに HSC な人が多い(アスペルガーが多い)などと書かれているが、実際に統計をとるならば、無作為に芸術家を選び出して HSC な人の割合と、一般抽出の割合とを比較しなければいけないので、あまりあてにならない。が、良い目標にはなるだろう。HSC/HCP であることが、マイナスの要素として働くだけでなく、プラスの要素としても働くわけだ。これは障碍(障害)としてではなく、とある性格(特徴)として捉えることができることを示している。勿論、パラリンピックを観ればわかる通り、片足が義足でも一般のひとよりも遠くに幅跳びができるように、明確な障害(健常者ではない足)が人として全体的にはマイナスに働かない例もあるけれど、なにかと子供のうちはマイナスになりそうなところは避けておきたいのが人情だ。しかし、そういう明らかなマイナス要素としてではなく、伸ばすべき特徴(あるいは、本人の希望を叶えるための原材料)となる可能性あるならば、使わない手はないだろう。HCPの割合が15~20%という割合をどうとらえるかにもよるし、それは本に示されている通り「5人に1人」という高い割合なので、自閉症などと違って高い確率で存在することなる。そこを、進化論的に捉えて、潜伏した劣性遺伝子として捉えるかどうかは、今後の研究次第なんだけどどうなんでしょう。あとがきを見るとセロトニンと差次感受性に関係するので、普通に躁鬱病に関係するような気もするけど。このあたりは、自閉も多動もアスペルガーも根本は一緒だと思っている。症例が違うだけで。

 

カテゴリー: 雑談 | 怒鳴り声が聞こえる教室/職場について はコメントを受け付けていません

.NET Standard とは何か?

.NET Core が 1.0 になってリリースされて、ASP.NET Core MVC が Linux 上で動くようになったと思ったら、今度は .NET Standard ってのが出てきて、え?いきなり、.NET Standard 2.0 ってのは何ですか?ってな感じな人は多いと思いますが(私もそうでして)、ひとまず、.NET Standard とは何なのかを探っていきます。

Introducing .NET Standard | .NET Blog
https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/

もともと、.NET Core って、Windows に依存する API を切り離してしまって、Linux やら Mac やら動く環境を作るのが目的じゃなかったんですか?と思っていたわけですが、図を見るとちょっと違うようです。

dotnet-today

たぶん、Xamarinを買収した影響(Mono自体を取り込んでしまった影響)が大きいと思うのですが、Linux 上で、何らかの .NET なプログラムを動かそうと思うと、.NET Core なプログラムと mono なプログラムは競合します。上の図では、Xamarin が、iOS/Android に「のみ」依存しているような書き方ですが、実際は Linux 上で動かしているものもあるわけで、Raspberry Pi 上で C# を動かしてツールを作ったり、F# を動かせたりするのはそれです。実運用的に apache と .NET の組み合わせが妥当かどかは別として(LAMPで組むとか、Javaのほうが楽だろうし)、mono を使えば、結構な .net なツールを Linux 上で動かせます。クラスライブラリ自体も大体のところは本家(?)の .NET Framework を網羅しています。まあ、そのあたりが Unity + Mono という組み合わせなわけですが、それとは別なスタイルで .NET Core な環境を Microsoft は独自に始めたわけです。

で、結果的に Xamarin 社と業務提携から買収に至ったわけで、そうなると、上の「Mono Class Library」なところが「Core Library」に置き換わるのかな?と想像するわけじゃないですか。Microsoft 社内としては、Mono と .NET Core のメンテナンスを分散して注力するよりも、.NET Core に統一してしまったほうがよい(Mono の差分な資産はどうするのか?は別として)と思っていたわけです。

が、

dotnet-tomorrow

蓋を開けてみれば、base library の場所が、ごっそり「.NET Standard」に切り替わるって話なんですよね。ええ。.NET Core は 2.0 になることなく、vNext(でいいのか?)という統一された形で、.NET Standard になるわけですね。

すっきりするのはすっきりするんでいいですが、いわゆる OS 依存な低レイヤな部分は、.NET Standard としてどう扱うのか?特にSystem.IO系のセキュリティ絡みは .NET Standard としてどう扱うのか(あるいは扱わないのか)が不明なのですが、ひとまず、ひとつにまとめたい模様です。

PCL Hell が解決するのか?

PCL(Portable Class Library)を作るときに、動作するプラットフォームを選ぶわけですが「そんな未来なことはわかりません」。要は、誰が考えたか知らないのですが、.NET Framework で「Client Profile」っていう Web 系抜きのパッケージを考えたのが間違っていたわけです。

image

and

image

肥大化するアセンブリと、OneClick なインストール環境(だったかな)を利用できるようにするために、Web 系のアセンブリをケチったわけですが、その系譜が、Xamarin.iOS/Android を含める PCL 作りのところまで引き擦られていきます。あのプロファイルの番号は、順列組み合わせになっていて、Silverlight とか、Windows 8.0 とか Windows Phone とか過去の遺物を引きずり回します。まあ、最終的に Proifle7 か Proile78 か Profile259 なマジックナンバーに落ち着くわけですが(苦笑)。

ちなみに、ここの Hell な原因は、アセンブリ名やクラスの厳密性を優先させているのが問題であって、Linux の *.so のように(というか C言語呼び出しのごとく)「名前はどうでもいいから、スタックさえ合っていれば、呼び出せるよ」でもいいわけで、実際 Linux 内で *.so を呼ぶのは非常に簡単ですし、シンボリックも使えて便利です。まあ、その分、競合は発生しそうなんですが、Windows の各種ライブラリみたいに頻繁に更新しない、というのがミソですね。

あと、F# のタイププロバイダーで、ビルドするときの DLL と、出力する DLLと、Xamarin 内で動作する DLL が競合してしまって、Xamarin.Android/iOS 内ではタイププロバイダーを使えないとか、F# のライブラリを参照している C# のライブラリを参照する F# のプロジェクトを作るときにはコツがいるとか、変なことになっているのは、ぜんぶ PCL 絡みの変なことになっているせいです。ええ、F# のライブラリな変な番号も体系も PCL のせいです。F# が流行らないのも PCL のせいだし、ポストが赤いのも PCL のせい。

そんなわけで .NET Standard 1.x が過渡期である

ことが判明して、.NET Core そのものをあれこれと攻めていっても、これも過渡期(2.0がなくて吸収合併するんだったら、まあ VSCode でビルドの仕方ぐらいを覚えるのでよいのでは?)なので、構造的には .NET クラスライブラリの焼き直しの時期なんでしょう。Microsoft 内部の人にはそうなんだけど、外部からすれば、そこで停滞しているわけにはいかない( .NET 以外の分野が主だったりするわけなので)となれば、そこは「最新情報」の獲得にあくせくするのではなくて、

  • 従来型の WPF アプリを極める(内部的に UWP は .NET Standard で統一されるので、UWP でできることが限りなく WPF に近くなる)。
  • スマートフォンは、Xamarin.Forms を拡張してしまうか、Xamarin.iOS/Android で独自に進化させる(特に、Xamarin.Andrid のほう)。
  • Linux で ASP.NET するときは .NET Core を使う

という感じですかね。個人的には。

他にも VR とか Unity とか機械学習で Python とか Alljoyn とか ROS とか、諸々な要因があるわけで、 .NET Standard がそのあたりと「どのくらい組み合わられるか?」が肝になってきます。

もうちょっと真面目な解説はこちらへ

.NET Standard Library
https://docs.com/iwanaga-nobuyuk/3514/net-standard-library

.NET Core とマルチプラットフォーム
http://www.slideshare.net/shozon/net-core-66620714

マイクロソフト、.NETの分裂を未然に防ぐための標準仕様「.NET Standard」を策定 - Publickey
http://www.publickey1.jp/blog/16/netnet_standard.html

カテゴリー: 開発 | 1件のコメント

[ソフトウェア開発者の道具箱] 同情プログラミングをやめる

道具箱シリーズの第2弾は「同情プログラミング」の話です。

プロジェクト運営(プロジェクト「管理」ではなく)の視点から言えば、プロジェクトやチームがうまく動く方法は「うまくいかない部分」を切り去っていくことです。「切り去っていく」ということは、冷徹な感じがするような気がしますが、人を切り去るのではありません(チーム崩壊を招く「マイナス生産者」に対しては、切り捨ての手法をとりますが)、その人が何かをやるときに、うまくいかなくてマイナスになってしまう部分を切り落として捨て去ります。人なのだから、何かの間違いもするし、勘違いもするし、運が悪いときもあるし、体調が悪かったときもあるし、状況によりうまくいかない場合もあるでしょう。だから、トータルで考えるわけですが、チームとして(それは人として「成長」なのかもしれません)今よりもうまくいくためには、今、ダメである部分を少しずつ切り取っていくのが着実な方法なのです。なので、何らか状況でうまくいかなかったとき(能力が低かったというのも含めて)は、再び同じ状況に陥ったときには回避できるようにしておきます。完全に同じ状況というのはないのですが、今後も似たようなことはおきますよね。ISO9000の「是正処置」という考え方ですが、これを流用します。勿論、なんでも是正処置が必要なわけでなく、レアな場合(今後は1度も起こらないようなこと)は是正する必要はありません。苦くて忘れたい経験は、忘れ去ってしまうのがベターです。

さて、プログラミングにおいて、プログラムコードを書くということは、それなりの時間をかけて、それなりのかの人の努力の結果が示されているわけです。なにがしかに時間は、会社の給与のうちかもしれないし、自主的に家に帰って考えた結果かもしれないし、どこかの講習でお金を払って覚えた技かもしれません。1,2日のコードであれば、捨て去る勇気もあるのですが、1週間も掛かって苦労して作りあげたコードを、人情的に捨てるに忍びないですよね。ちょっとぐらいまずくても、何らかのいいところを拾うとか、かの人の心情を害さないような手段を取りたいものですよね。

ですが、残念。それらは捨て去ってしまうほうがベターなのです。

プログラムコードが、アジャイル開発的に動くものを達成するのであれば(場合によっては、「動かない飾りのコード」というものもありますから)、動かないまずいコードは、そのままゴミでしかありませんし。何の価値もありません。そこに「同情」をしてしまうと、先行き負債を抱えてしまうのは明らかなことです。いや、コード自体の負債以前に、かの人の成長機会を失ってしまうのです。

ベストな方法、かの人に書き直して貰う事です。仕事として。

うまくいかない原因は、まずい設計かもしれないし、時間がなかったのかもしれないし、予想よりも時間が掛かったかもしれない、能力が足りなかったのかもしれない、いろいろな原因があります。でも、2度めにコードを書くときは、設計の見直しや、時間をしっかりとったり、計画を立て直したり、かの人の能力だけでなく他の人の助けを求めたりすることが可能であり、それは「経験」として生きてきます。それを、本人に伝えずにこっそり直してしまったり、直すべきところを指摘して勝手にピンポイントで直してしまったりというような、かの人の「成長機会」を奪うような方法は、結果的にチームやプロジェクトにとって損失でしかありません。そう、いわゆるかの人の生産性が変わらないままになってしまうのですから。

この「同情プログラミング」をやめるのは、かの人にシビアすぎるような感じがするでしょうし、無意味につらくあたるような気がしますよね。いいえ。「同情プログラミング」をやめるためには、

  • 失敗を前提として、コーディング期間の計画を立てる
  • やり直しの時間を確保する
  • 失敗しても問題が少ないところを新人に配置する

というプロジェクト運営/計画が必要です。それがなければ、単なる無法地帯で、プロジェクトの成否は偶然によって左右されているだけですよね。

カテゴリー: ソフトウェア開発者の道具箱 | [ソフトウェア開発者の道具箱] 同情プログラミングをやめる はコメントを受け付けていません

PLEN2 で始めるロボット制御の基本…の補足

Plen2で始めるロボット制御の基本(スライド)

[slideshare id=66364049&doc=plen2-160924053144]

NETラボ勉強会 20160924 – YouTube

二足歩行ロボットのチート…じゃなくて、参考用に購入した PLEN2 を題材にした発表です。あれこれ、模索した結果を話しているので、本格的なところは ROBO-ONE などを参照して貰うとして、ソフトウェア開発のサイドから見ると、ハードウェアな二足歩行ロボットはこう見える&こうアプローチできるという感じで話をしています。

PLEN2 を購入して、あれこれ弄って分かったことなのですが、

  • サーボモーターの初期化が結構大変
    → 結構、誤差がでるので、誤差は誤差で許容しないといけない。
  • 歩くといっても、モーション作りと、自律制御と、人によるコントロールが混在している
    → どれを目指すかによって、制御プログラムにいろいろ違いがでる
  • ソフト屋さんのアプローチできるところは多い。
    → クラウドでセンサーデータを集めるだけじゃなくて、モーションを作るアプリとか、通信制御の部分とか、協調動作を映像化するとか、今後ソフト屋さんのできることは多い。

VR など仮想空間ということで、ソフトウェアだけで完結できるものが流行りだったりするのですが、自分としてはハードウェアにアプローチできる部分でソフトウェア開発の手法を使う方向でやっています。なので、重力の話だとか物理誤差だとかモーメントとか必須になりますよね。

7月からずっと、ASP.NET MVCの本を書いていたのですが、やっとこさ一区切りついてきています。10月以降は、再びハードウェアなもの(Windows IoT Core も含めて)に戻る予定。真面目に Raspberry Pi/Rasbian に戻って、Python も。

コントローラー制御の参考に

有線 USB の XBOX コントローラは、Windows IoT Core でも繋がるので、お手軽です。無線のほうは、まだ試していない。

カテゴリー: PLEN2 | PLEN2 で始めるロボット制御の基本…の補足 はコメントを受け付けていません

アリスは無限にプラダから猫を取り出す(F#編)

アリスは無限にプラダから猫を取り出す | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8179

これをF#版に直してみる。
実は、GetCatsメソッドを末尾呼び出しにして、F#のほうは無限に猫を取り出せる…という風にやろうと思ったのだが、この方式だと lst に詰め込むときにスタックオーバーフローになってしまう。
最初は head::tail 方式で書いていたのだが、なんか面倒になって(ツリー構造だから)、外部で list を持っているのが問題かも。

type IObject() = do ()
type Cat(name) = 
    inherit IObject()
    member val Name:string = name with get, set

type Bag() =
    inherit IObject()
    member val Items:IObject list = [] with get, set
    member x.Add(items) =
        for it in items do
            x.Items <- it :: x.Items
        x
    // 猫だけ取り出す
    member x.GetCats() =
        let rec cats (bag:Bag) =
            let mutable lst = []
            for it in bag.Items do
                if it.GetType() = typeof<Cat> then
                    lst <- it :: lst
                else
                    let bag = it :?> Bag
                    lst <- lst @ cats bag
            lst
        cats x 

// main
// 入れ子のバッグ
let prada = 
    Bag().Add(
        [Cat(&quot;mike&quot;);
         Bag().Add( 
            [Cat(&quot;hop&quot;);
             Cat(&quot;stop&quot;);
             Cat(&quot;jump&quot;)]);
         Cat(&quot;kuro&quot;);
         Cat(&quot;shiro&quot;)] )
// 猫のみ取り出す
for it in prada.GetCats() do
    let cat = it :?> Cat
    printfn &quot;cat: %s &quot; cat.Name 

// 無限バッグを作る
let mutable infbag = Bag().Add([Cat(&quot;Cheshire&quot;)])
infbag.Add([infbag]) |> ignore
// 無限に取り出す...ことはできない
for it in infbag.GetCats() do
    let cat = it :?> Cat
    printfn &quot;cat: %s &quot; cat.Name 
カテゴリー: F# | アリスは無限にプラダから猫を取り出す(F#編) はコメントを受け付けていません

アリスは無限にプラダから猫を取り出す

アリスはプラダがお好き | Moonmile Solutions Blog
http://www.moonmile.net/blog/article/alice-plada

アリプラシリーズの第24弾めは、イテレーターの話…というか、とある林檎な国では for がなくなって for in だけになってしまったものだから、いやいや、配列とコレクションがごっちゃになってないか?と思って作ろうと思ったのだけど、横道に逸れてイテレーターになってしまったという訳。

最近のプログラム言語ではコレクションの全ての要素に対して何かやるときは、foreach を使う訳ですが(林檎の国では for in ですね)、これはコレクションの中身のすべてのアクセスするというだけで、特に順序は決まっていません。まあ、実装上は最初の要素からアクセスするんだけど、Javascript のように実はとびとびだったり、そもそもコレクションと配列の違いってそういう「順序性」のところにあります。順序が保証されていないってことですね。順序が保証されないってことは、逆順ってのもないわけで、すべての要素に1回ずつアクセスするってだけです。実際のところは、各プログラム言語のスペックによるのだろうけど、配列とコレクションの違いってのはそういうところにある。
なので、コレクションを foreach で探索したときに、ひとつ前の要素とあわせて何かする(たとえばフィボナッチ関数)というような他の要素をアクセスして順序が問題になる場合は、再帰関数を使ったりするのだが、まあ、それの例っぽいものを示しておこう。

こんな感じに、Bag クラスと Cat クラスを作ってみる。鞄の中には猫か鞄を入れられる。鞄の中には鞄が入るので、実は無限に鞄が入るとい不思議な Bag クラスになっている。いや、これは DOM と一緒で XNode がそれの仕組みなっているので、一般的なツリー構造のアプローチになっている。

class IObject { }
class Cat : IObject
{
    public string Name { get; set; }
    public Cat( string name ) {
        Name = name;
    }
}
class Bag : IObject
{
    public List<IObject> Items { get; set; }
    public Bag () {
        this.Items = new List<IObject>();
    }
    public Bag Add( params IObject[] items )
    {
        foreach ( var it in items ) { this.Items.Add(it); }
        return this;
    }
    // 猫だけ取り出す
    public IEnumerable<Cat> GetCats()
    {
        foreach (var it in this.Items)
        {
            if (it is Cat)
            {
                yield return it as Cat;
            }
            if (it is Bag)
            {
                foreach (var ii in (it as Bag).GetCats())
                {
                    yield return ii;
                }
            }
        }
    }
}

Bag クラスには、猫だけを取りだすための GetCats メソッドがあって、イテレーターを返すようにしてある。yield return を使って、入れ子になった Bag の中も探索できるようにしている。
Add メソッドは、子要素(Bag か Cat)を追加できるようにしてあって、これは XElement と同じ仕組みになっている。

猫のみ取り出す

Bag prada = new Bag().Add(
    new Cat("mike"),
    new Bag().Add( 
        new Cat("hop"),
        new Cat("step"),
        new Cat("jump")),
    new Cat("kuro"),
    new Cat("shiro")
    );
// 猫のみ取り出す
foreach ( var it in prada.GetCats() )
{
    Console.WriteLine("cat: " + it.Name);
}

prada の鞄に、猫と鞄を入れるんだけど、これを実行すると GetCats メソッドで綺麗に猫だけを取り出せる。

これでアリスは満足ですよね。

結果を見るとわかるんですが、鞄の中身を取り出す順番は実装依存なので、どういう順番で猫が出てくるのかは分かりません。けれども、ひとつの要素を1回ずつアクセスして取り出しています。

無限に猫を取り出す

さて、Bag クラスを見ると、Bag クラス自身を入れ子にしているので、実は自分自身を要素に加えることができる。そう、循環参照というやつだ。

// 無限バックを作る
Bag infbag = new Bag().Add(new Cat("Cheshire"));
infbag.Add(infbag);
// 無限に猫を取り出せる
foreach (var it in infbag.GetCats())
{
    Console.WriteLine("cat: " + it.Name);
}

バッグ infbag を作って、自分の鞄に追加するという無限バッグを完成させる。でもって、これも GetCats メソッドで取り出すとどうなるか?アリスは、無限にチェシャ猫を取り出すことができるのだろうか?

20160921_02

一見、無限に取り出せるように見えるけど、GetCats メソッド内で入れ子になっているからスタックオーバーフローになっちゃんですよね~、ちゃんちゃん。

サンプルコード

サンプルコードはこちら
https://1drv.ms/u/s!AmXmBbuizQkXgf0CI2eEOEnAdsI-_w

カテゴリー: 開発, C# | アリスは無限にプラダから猫を取り出す はコメントを受け付けていません

[ソフトウェア開発者の道具箱] イチゴジャムの法則

6月末に出版した 現場ですぐに使える! Visual Basic 2015 逆引き大全 520の極意 なのですが、この第19章には不思議な Tips が入っています。章自体は「トラブルシューティングの極意」ということで、運用保守や設計段階の落とし穴について書いた章なのですが、最後の10個の tips が「対人関係」になっています。端的に言えば、トラブルシューティングなんて、その場その場の経験の積み重ねと、根本的な対処の方法を知っていればよいだけなので、あまり表面的な対症療法なものは、これ以上追加したくなかったんですよね。というのと、試しに「技術書に技術的なじゃないものを紛れ込ませてみたかった」というのがあります。真面目に書くと、えらい時間が掛かるのだけど、Tips 風に1頁にまとまるぐらい(1000字ぐらい)を目標に書き下してみました、という具合です。

でもって、ものがVBだったからなのか、やっぱり読者対象がずれていたのか分かりませんが、まったく反響がないので、ここにブログの記事としていくつかついかしておきます。中身的には、見積もり本舗とか消えてしまった別のブログに書いてきたものでもあるのですが、なんらかの形で検索に引っ掛かるようにするもひとつかと。あと技術顧問的なことをやるので「ここ読んで」という具合にできるようにしておきます。

タイトルはワインバーグ著「コンサルタントの道具箱」から持ってきてるので、いわゆる「ソフトウェア開発者の道具箱」です。コンサルタントだと、どこかのシャチョーさんとかマネージャーを相手にするのですが、ソフトウェア開発者の場合は同僚やプロジェクトリーダー、新人、顧客の担当者が相手になります。書籍のほうは、改変が効かないのである程度オブラートに包んで話をしていますが、バックグラウンドには行動経済学とか心理学とか孫子とかそんなものも入っています。参考文献としては「コンサルタントの道具箱」しか出てきませんが、そのあたりは「読み取って」頂くというのが主旨でもあったり、そもそも「イチゴジャムの法則」ってのがそんなものなのです。

中心に何か伝達したいものがある、というのをイチゴジャムの法則では「粒」と表しています。その粒は、広げようと薄めようと逆に濃くしようとも同じなわけで、過不足なく書けば「粒」そのもになるけど、人によって受け取り方が違ったり詳しい説明が必要だったりするときには、粒の外側に解説を付け加えます。まあ、それが書籍の売りだったりするし、「コミュニケーション」とか「会話」とか呼ばれるものですよね。ツーカーの関係であれば、メール一本で済むようなところも、顧客との関係であれば電話をするなり相手先まで行くなりの「礼儀」的なコミュニケーションを必要とします。それをしないと「コミュ障」と呼ばれたり、相手からコミュニケーションの取れない人と排斥されてりします。書籍にちらっと書きましたが、このコミュニケーションを過剰に付ける技というものあります。いわゆる「広告」的なものだったり、上滑りな議論だったり、暇つぶしのお昼のワイドショーだったりします。「粒」がないのですから、どこまでも薄く薄く引き伸ばせるし、そもそも「粒」がないのだから、議論にも反論にもなりません。ただ、ぴーちくとさえずっているだけになります。そう、暇つぶしだったらそれでいいんですけどね。残念ながら、人によっては「粒」のありかが何処なのか見えなくなってしまって、疑似的な「粒」に引っ張られて議論がどこかに飛んで行ったりします。いや、もともと「粒」がないのだから、議論自体にもならないんですけどね。

そういうわけで、とあるコミュニケーション(顧客との間柄だったり、チーム内の間柄だったり)の中には「粒」があったりなかったりするわけで、若い頃には「粒」がない会話にイライラすることもあるでしょうが、いやいや歳をとると「粒」ない会話はそれはそれとして、頭の中で別な「設計」を考えたりできるようになるので大丈夫です。そのあたりの話は、けらえいこ著「たたかうお嫁さま」や「セキララ結婚生活」に詳しく書いてあります。

ちなみに、「粒」とはいっても、クオリアみたいにこれと示せるものではありません(つーか、クオリア自体がアレなので、そういう意味では「粒」ない会話を「クオリア的な」と言ってもよいかしれません)。そこは双方の合意のものとに通じるものでもあり、共通の個人的体験の重なりや、重ならないけどツーカーに考えられる、というようなひとつの単語や文では表せないものかもしれません。明示的なものであれば、UMLのようにあらわせるのですが、概念的なものは伝えにくいので暗喩(メタファ)を使います。メタファーを重ねることにより色濃くなる中央を明らかにするんですね。これは質問の応酬という形でも表せる(ディスカッションとは違います)ので、双方、それなりの技能が必要です。そういう意味では、文体が読者を選ぶというものもあり、かつこの文章自体もそういうメタファーに含まれているという意味で、やっぱり「粒」的なものを強化するために「イチゴジャムの法則」をもう一度持ち出してみるわけです。

河合隼雄著「中空構造日本の深層」のように、中空であるからこそ中央にあるものを双方が了解できるという場合も多いのです。私はこの方法を好みますが、最近の世の中はそうではなくなりつつありますよね。実際に中央にあるものを右に寄せたり左に寄せたりすれば、当然ならが双方の主張が異なるのだから議論が一致するはずはありません。一致することもなく、妥協もせずなのだから、そこは社会は広く階層化されている(ねじれの位置にあるという意味で)交差位置で満足すればよいのです。

さて、話を元に戻すと、ある程度価値観が一緒だったり、共通の体験があれば粒を使ったコミュニケーションが楽≒効率よくなります。まあ、そこがアジャイル開発的なチームビルディングなんですけどね。スクラムの本にもそう書いてあります。ある意味で、チームで残業をしたりチームで経営的な視点を持ったりチームで趣味を共有できたり、というのは、濃厚なコミュニケーションを欲しているのではなく(そういう場合もあるけど)、仕事上の煩雑なコミュニケーションを省略するために「あらかじめ」価値観を共有するという目的があります。なので、チームビルディングにおいて、スタート時点の「価値共有」と同時に「仕事上の価値の共有をお互いに認めることができるか?」というハードルも必要となり、組織だからこ組織に成り得るという分岐がそこにはあります。

そうそう、もうひとつのチームビルディングの仕方として「オーケストレーション」もあるので、こっちのは別の機会に。いわゆる LLC(合同会社) です。

カテゴリー: ソフトウェア開発者の道具箱 | [ソフトウェア開発者の道具箱] イチゴジャムの法則 はコメントを受け付けていません