Xamarin.Android の開発とその先にあるもの

Android Advent Calendar 2016 の8日目になります。初めての人は初めまして、初めてでない人は、ずっと下のほうまで読み飛ばしてしまって大丈夫です。

Xamarin とは何か?

C# 界隈では鬱陶しいほど流行っている…のか流行っていないのかわかりませんが、Java のほうでもぼちぼちと Xamarin な人が入ってきたりしていると思いますが、端的に言えば、Android を C# で書こうというのが、Xamarin.Android です。ついでに言えば、iPhone/iPad のアプリを Objective-C や Swift じゃなくて C# で書こうというのが Xamarin.iOS で、Mac 上のアプリを C# で書こうってのが Xamarin.Mac です。あちこちで C# が出てきますが、実は F# で書くことができたりしますが、まあ、そんなマニアックなことをしなくても C# で .NET Framework を使ってアプリを書くことができます。

ここは Android 界隈に話を絞ると…

正直な話、Java で Android アプリを作るのは、Objective-C で iPhone アプリを作るよりも辛くはないと思うんですよね。スマートフォンのアプリを作る場合、それぞれのスマートフォンの仕様に従うので、Android の場合は Java が最適だとか、iOS の場合は…だとかは普通な話です。なので、いままで Java/Scala/Kotlin で Android をアプリを既に効率よく書けるのであれば、それはそれで十分だと思うのです。

Xamarin の場合は、Android/iOS そして XAML という XML形式で View を書いて(Android の axml と似たようなものです)Xamarin.Forms として共通化して書けるというメリットもあるのですが、まあそれも、Android だけを対象にするならば、特に Java から C# へ移行するというメリットはありません。

Xamarin.Android の欠点は?

どうせだから、欠点から先に並べておきましょう。

最新の Android の対応に 2,3か月かかる

iOS の場合は、事前にデベロッパーサイトに新しいバージョンの iOS が公開されます。メジャーバージョンアップのときには半年前に公開されることもあるので、そこで公開されるベータ版を使って iOS アプリのテストができます。Xamarin.iOS が iOS 内部のライブラリをポーティングしてテストする期間をそこに持つことができます。

しかし、Android の場合は事前公開がありません。Google からバージョンアップが表明されて、少しずつ各メーカーが対処するいう具合です。ここに Xamarin.Android の対応も巻き込まれるので、最新の発表から 2,3か月ほど遅れてしまいます。ここは、Java ネイティブで書いていたほうが即対応をすることが可能です。

Java の各ライブラリを個別にポーティングする必要がある

当たり前のことですが、Android の各種ライブラリは Javaで(*.jarで)提供されることが多いでしょう。あなたが使っている便利なライブラリや、あなたが作った効率的なライブラリを Xamarin.Android で使えるようにするには、C# で呼び出せるようにする必要があります。幸いにして、Xamarin.Android のコードのように属性を使って Java のライブラリを呼び出すようにできるのですが、Java から直接使うよりも手間が掛かることは確実です。

Java 特有のノウハウが使えない

Java も C# もオブジェクト指向言語ではありますが、それぞれのプログラム言語特有のノウハウがあります。私の場合、本格的に Android のプログラムを組んだことがありませんが(C# でならばあるんですが)Android の数々のコントロールは Java に対して組みやすいようにできていると思います。ListView へのアクセスとか、モデルオブジェクトの扱いとか、リスナーの扱いが Java っぽいですよね。そのあたりは、抽象的なデザインパターではなく「実装依存」にならざる得ないところがあります。そのあたりのノウハウを Xamarin.Android の世界に持って来ると Java –> C# なコンバートで混乱しますし、逆も同様です。そこは適材適所というところでしょう。

それを踏まえて Xamarin.Android を見ると

いくつかの欠点を踏まえて、Xamarin.Android + C# の組み合わせを見ると、「適所」な部分がみえてくるので、導入するときのポイントを示しましょう。

こなれた UI を使う場合

最新の Android ではなくて、4.4 のようなちょっと前の UI を使うときには、Xamarin.Android を使ってもよいでしょう。Android のアドベントカレンダーなので、C# な方はいない…とは思いますが、まあ、標準的な UI で社内アプリを作るようなときに C# –> Java で変換するよりも C# で書けるパターンを選ぶのもよいでしょう。勿論、社内ツールならば、引き継ぎなども考えて「誰かに任せられる言語」を選ぶことが大切です。社内で使われているプログラム言語が、Java なのか C# なのかという判断でよいと思います。

C#/.NET のノウハウを使う

例えば、MVVM パターンのような C#/.NET に端を発する技術やノウハウを使うときは Xamarin.Android を使って使うとよいでしょう。単に試してみるためでもいいと思います。私の場合、言語の出身上(?)、Java よりも C# のクラスライブラリのほうが知っているので、Xamarin.Android のほうが楽に開発ができます。ある程度、ライブラリなり試験が済んでしまえば、コード自体を Java と C# の相互変換してもよいし、クラスライブラリのまま呼び出してもよいでしょう。ちょっと、Java から C# を呼び出す方法は知らないのですが、先に示したように C# から Java の呼び出しは、Xamarin.Androidでロボホンを動かす(Java Binding Library利用) – Qiita が参考になると思います。

 

さて、ここまで来て話が飛びますが、ワタクシが Android をさして開発しないのに、Xamarin.Android であれこれやっている、理由のひとつがこれです。

左から、Raspberry Pi, Orange Pi, NanoPi です。いわゆる、組み込みボードと呼ばれるものなのですが、通常 Linux を入れて動かしますが、実は Android を入れて動かすこともできます。

NanoPi には、Android 5.1 を入れることができて、こんな風に HDMI を通して液晶ディスプレイに表示させることができます。

導入する Android の種類(主に中国産のAndroidになるので)にもよるのですが、NanoPi に入れられるものは Google Play も入っているので、ネットからアプリを入れることができます。

ここでは、有線LANで繋げていますが、無線LAN(WiFiドングルが必要)を付けることも可能なはずです(また試してはいない)。

ピンの部分は普通に GPIO なので、Lチカしたり、サーボモーターを動かしたり、各種センサーからデータを拾ったりもできますよね。

Android というと、スマートフォンの Android が筆頭にあがりますが、実はこのような組み込みボードの世界でも Android が使われているところがあります。中身は Linux なので、それなりに Raspberry Pi のようなアクセスが可能なのと、UI は Android のものが使えるのが利点です。まあ、そこで .NET な私としては Xamarin.Android のほうが使い勝手がいいというところなのです。

去年も Raspberry Pi に Android を入れて GPIO を弄ろうとしたのですが、なんかいまいち遅くてなんともならなかったのですが、NanoPi ぐらいならばなんとかなりそうです。幸いにして、Android のレポジトリからビルドする方法も NanoPi では用意されているので、コードから直接弄れそうな感じでもあります。

NanoPi の購入や解説は下記で

FriendlyARM-NanoPi 2 Fire
http://nanopi.io/nanopi2-fire.html

NanoPi 2 Fire – FriendlyARM WiKi
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_2_Fire#Compile_Android

というわけで Xamarin.Android のその先へのお話でした。よいクリスマスを。

カテゴリー: Android, Xamarin | Xamarin.Android の開発とその先にあるもの はコメントを受け付けていません

ASP.NET MVC プログラミング入門の入門の補足

.NET ラボ勉強会の2016年11月で、「ASP.NET MVC プログラミング入門の入門」の発表をしてきたので、それの補足です。

動画

スライド
[slideshare id=69549826&doc=asp-161126152036]

最初に補足しておくと、スライドの「おまけ」のページの .NET Core の ARM32/64 版がない、というくだりは、core-setup/README.md at master · dotnet/core-setup の中に .NET 1.2 という形で残っています。「Windows arm32/64」という形なので、Windows IoT Core が対象なのか、ARM ベースの通常の Windows 10 が対象なのかは謎ですが(これは後で実験します)、少なくとも ARM ベースの .NET Core は 1.2 で出そうですね。ただ、Raspberry Pi の Raspbian で .NET Core がコンパイルできる&実行できることを欲しているので、もう少し突っ込んで見ていきたいところです。issue を観ている限りは、一進一退っぽいのだけど他に比べてサポートが薄いかなと。

で、なんで、ARM + Linux の組み合わせなのかというと、動画の中でもちらほらでますが、Android + .NET Core を期待するのと、Android + Mono が継続されるのか、と微妙なところがあるからです。今後の .NET Standard と、組み込み OS としての Android(Orange Pi とか)の中で、Mono ベースなのか、.NET Core ベースなのか、というところがあります。そのあたりは組み込み Linux も含まれたりするのですが、まあ、そこは Python を入れたりするので .NET は不要だったり…期待したり。

ちなみに、スライドの中に Xamarin が入っていたり、「ASP.NET MVC プログラミング入門」の書籍のほうに Xamarin が入っているのは、2つほど理由があります。

  • Web API のクライアントバリエーションとして Xamarin を使った。
  • View 概念を拡張すると、スマートフォン/デスクトップ/ブラウザ(View)+Web API(ロジック)の組み合わせができる

2年前だと10万円近くした Xamarin.Android/iOS ですが、現在は Xamarin 社が提携/被買収のおかげで無料で使えます。こうなると、以前、Xamarin 本を出したときよりもぐっと敷居が下がって(実は Starter という形で Xamarin.Android/iOS を使えないこともなかったのですが、小さなアプリしか作れないし、Xamarin.Forms はサイズ的に使えないし、遊び/試用版の域を出ませんでした)、使おうと思えば使えるところまで下がってきたわけです。

逆に言えば、10万円也(Android/iOS の同時開発するのであれば20万円也)の資金を回収する必要がなくなったので、ある意味で「Xamarin を使う覚悟」ってのはだいぶん減っています。お金を出すとそれを回収しようと思って勉強するけど、無料だったら使えなくてもまあいいか、って感じになりがちですよね。

私が Xamarin を勧める理由

Cordova じゃなくて、何故 Xamarin なのかと言えば、端的に C#/.NET Framework だったからです。Java や Objective-C/Swift じゃなくて、何故 C# なのかと言えば、2002年以来 .NET でやってきたからです。ただし、C# ができるとか、Java が得意とかいうだけなれば、Android は Java で、iOS は Objective-C/Swift で書けばよいのでしょうが(実際、Swiftの本も書きましたから)、TDD の観点からすると、サーバーからクライアントまで一貫して同じプログラム言語を使うのは、開発効率という点で高いメリットがあります。

既存のコードが流用できる

いくつかの本の執筆も含めて、手元には膨大な C# のサンプルコードがあります。同じぐらい VB.NET のコードもあるけど、調べて実験するためのコードは C# が多いので、手元のサンプルは C# のほうが多いのです。そうなると、別の言語に(PHPやPython、Javaも含めて)直すよりも、C# で作れたほうが手元のサンプルを活用できます。インターネット上の「私のネットワーク」も C# のほうが多いので、C# のほうが回答が出やすい状態になっています。

ロジックを取り出してテストする

手元の実験コードはできるだけ、ロジックをオブジェクト化してテストできるように努めています。デスクトップでテストしたものを、そのままサーバーに持って行ったり、Xamarin.Android/iOS を乗せたスマートフォンアプリに持って行ます。これは、サーバーとしてテストしたり、スマートフォン上でテストするのではなくて、一度デスクトップアプリでテストする≒試行錯誤のスピードが速い、という利点があります。このためには、それぞれの環境で動くプログラム言語を同一にしておくことと、それぞれの環境のライブラリが同じ或いは似たものであることが必要です。幸にして、.NET は、.NET Framework/Mono/.NET Coreという形で、一見ばらばらのように見えるものの「再コンパイルさえすれば」おなじコードを使うことが可能です(ネットワークなHTTP廻りとファイル廻りが異なりますが)。

聞く/尋ねる人が近くにいる

私の場合、自宅で仕事になるので尋ねる人がいないのですが、Xamarin を学ぶときにあなたの身の回りに C# をよく知っている人いれば、Xamarin にしましょう。逆に言えば、Java を知っている人(サーバー系であっても)が多いのであれば Java で Android を書いたほうがいいし、そもそも Objective-C や Swift で iPhone アプリを書いている会社であれば Swift のほうがよいでしょう。誰にも尋ねることができないのは、勉強がはかどらないだけでなく、仕事として詰まってしまったときに「誰も助けることができません」。この状態はかなりリスキーです。

ただし、発表でも話したように、Xamarin.Android/iOS/Forms を使うと、C# で同時にリリースすることが可能になります。ロジックに不具合があったり、何かを修正しないといけないときに、Java と Swift の両方を手直ししないといけないよりも、うまくロジックを抜き出しておけば C# だけで済みます。例え、それぞれの画面が別々のレイアウトになっていたとしても、C# で似たような作りにしておくことができます。

勿論、Xamarin/C# ではなくて、Java で統一的に書くことも可能です。あるいは JavaScript のほうを活用するために Cordova でもいいかもしれません。上記の3点の理由を満たせば、どの言語を使っても良いと思います。例えば、手元に豊富な Java ライブラリを持っているのであれば、Xamarin.Android を使って未知なる C# を学ぶ理由はあまりありません。

そんな訳で、ASP.NET MVC の話なのですが、C# にちょっと興味がある/環境的に恵まれているのであれば、Xamarin.Android/iOS/Forms に手を出しておくのは悪くないですよ、という話でした。

書き忘れたけど、新刊

[amazonjs asin=”4822298884″ locale=”JP” title=”ASP.NET MVCプログラミング入門 (マイクロソフト関連書)”]

著者サポートは、こちら http://www.moonmile.net/blog/article/mvc

 

カテゴリー: ASP.NET, Xamarin | ASP.NET MVC プログラミング入門の入門の補足 はコメントを受け付けていません

漫画「この世界の片隅に」に寄せて

映画のほうは見ていないので、こうの史代著「この世界の片隅に」を一読した感想を記しておこう。著者の名前は憶えていなかったのだけど、以前「夕凪の街」が話題になったときに、ちょっと避けたんだよね。絵柄的…ではなくて、原爆を扱って、それが話題になっていたところで避けてしまっていた。で、改めて、先日 Kindle で「この世界の片隅に」上中下の3巻を買って読み終えて経歴を調べると、広島市西区生まれで広大の人だった。しかも同い年だ。中高を広島市で育った私としては、本当の意味で「同時代」的な人らしい。

「夕凪の街」は、直接、広島の原爆を扱うけど、「この世界の片隅に」はちょっと離れた呉から原爆を扱っている。全体的には戦時中の生活を扱っているのだが、やっぱり呉から見た「新型爆弾が落ちたらしい」という言葉は、精一杯の言葉になる。

絵柄的には、近藤ようこや「ヨコハマ買い出し紀行」の芦奈野ひとしに似ている。情景を描くので、キャラクタ自体はおとなし目だけど、逆にそっちのほうが印象感じになる。水木しげるの「熊楠」も似た感じの描写になるよね。情景の書き込みに惹かれるものがある。おそらく、呉港に出て来る数々の軍艦が映画のほうでは主になっている(ような感じがツイッターではみられるんだけど)、漫画のほうでは、シルエットとして軍艦が描かれている。特徴を軍艦のシルエットは漫画の中にもあるけど「諜報」活動とみなされたりするし、いわゆる戦闘機の機影で敵味方を識別するのと同じように、遠くから見える船影で相手を識別する。そんな軍艦の大きさと、生活との隔たりがよく描かれていると思う。

焼夷弾の内容とか、戦時中のあれこれの習慣がディテールとして詳しく書かれている手法は、高橋孟の「海軍めしたき物語」を思い出させるし、道具のあれこれが描写されているのは妹尾河童や安野光雅がベースだろう。もちろん、はだしのゲンは織り込み済みだ。

戦時中の生活を比較的「楽しく」描くという点では、NHKの朝の連続テレビ小説の長谷川町子の話の「マー姉ちゃん」あたりじゃないかな。最近の連続テレビ小説は戦時中の話は飛ばしてしまうことが多いのだが、当時(40年前ぐらい)は、視聴者がまだ戦争を知っていた世代でもあって、戦争を結構身近に描いていた。ただ、戦争モノを直接見ると、戦時中の本当の想いがよみがえってしまうので、少し視点を変えていたりする。
それが、「この世界の~」でもあるように、特に鉄砲が出て来るわけでもなく、何度となく鳴る空襲警報だったりする。3巻のうちでも戦闘機からの機銃掃射は1回しかない。焼夷弾も2回しかない。1回は防げて、不発弾で主人公は右手を失うところまで描く。

繰り返すが、数々の戦時のディテール(戦闘機や爆弾も含めて)が詳しく描かれているのは、そのほうが「リアリティ」を持たせられるからだ。現実の話だから「リアル」で当たり前のような気がするだろうが、実は違う。例えば、「爆弾が落ちて数万人の一瞬にして死にました」というフレーズよりも 原子爆弾 – Wikipedia にあるように、重さが何キロで緯度経度がここで、広島県産業奨励館の上で爆発して、直接の死者が何万人で、間接的に被ばくした人が何万人で…というような「殺傷力」という形で書くとディテールが埋まってリアリティが出て来る。と同時に、ディテールとしての情報が多いが故に、読み手が「何かを選択する」という余裕が出て来るという影響がある。なので、この手の「情報過多」なところは、当時のリアルを知るために必要だったりする。そのあたりのリアリティが今回の映画にも必要なのかどうかは分からない。

今はよくわからないが、当時(35年ほど前)の広島の中高生は、同和教育と原爆教育がしっかり行われている。同和教育は、数年後位に日教組がらみで止めることになった覚えがあるが、さだかではない。何故、同和/部落と原爆の差別教育が並列で行われるのかという、これには意味がある。私の場合、実際の部落を知ったのは大宮の小学校の頃なのだけど、いわゆる本人に依存しない「差別」は、同和による差別も被爆による差別も同じ感情からでてきている。ちなみに、福島の差別も同じだったりする。私がまだ、中学生だった頃「結婚ができないから被爆手帳を持たない」という人は結構いた。「夕凪の街」に出て来るけど、親が被爆して二世代目でも結構、避けていたりする現象だった。

そのあたりの話は、「この世界の~」ではあまり出てこない。いや、最後に強烈な形で出て来る。広島で母親を蛆虫で喰われている子いて、子のない主人公が、右手を失ったままで家族ぐるみでその子を受け入れるシーンがラストになる。

まあ、広島で育つと、そのあたりは一生離れられないのかもしれません。良い意味で。

カテゴリー: 雑談 | 漫画「この世界の片隅に」に寄せて はコメントを受け付けていません

LattePanda に windows 10 Anniversary edition を入れるまで

Orange Pi Zero を弄っているうちに、LattePanda という組み込みボードを知りました。半年前に、Kickstarter に出ていて Windows が動く組み込みボードとして発表されていたのですが、Raspberry Pi 3 でもいいかなと思って買わずにいたものです。

が、大統領選があって、Connect(); 2016 を眺めているうちに、やっぱり欲しくなって勢いで買ってしまいました。Kickstarter のでは Windows 10 Home が pre-install されているのですが、 LattePanda 2G/32GB -The Most Powerful Win10 Dev Board – DFRobot で、Windows が入ってないバージョンが若干安く手に入るのでこれにしました。手元に、MSDN 絡みで Windows 10 Pro があるので、それを入れてリモートデスクトップにするからという算段です。

ちなみに Amazon でも Lattepanda で検索すると売っています。若干高い感じがするけど、大統領選後に円安になってしまったので、DFRobot で直で購入するのと差が縮まっています。

ちなみに DFRobot には、↓なワイヤレスキーボードがあって一緒に購入しました。こっちのほうは後で。

Windows 10 Home を再インストールする

買った LattePanda には Windows が入っていないので、まずは OS を入れます。Docs | LattePanda に手順が書いてあります。手元のものは、メモリが 2GB のものなので x86 version for 2G/32GB のほうをダウンロードして USB メモリに書き込みます。CPU は Intel Cherry Trail Z8300 Quad Core 1.8GHz で、2GB バージョンも 4GB バージョンも変わりません。なので、2GB バージョンでも x64 にしておきたいところなのですが、書き込みのイメージが x86 のみになっています。試しに x64 のほうをダウンロードして書き込もうとしたけどブートしなかったので、素直に x86 で動作させています。

  • USB メモリを FAT32 フォーマットして(大抵はこれでフォーマットされている)、名前を WINPE にしておく。
  • ダウンロードした zip ファイルを解凍して、USB メモリに書き込む(普通にコピーでよいです)。
  • USB メモリを LattePanda に差して電源を入れる。電源は 2A のものを使います。

https://pbs.twimg.com/media/Cxe6CvyVIAAJ_b9.jpg

起動できるようなると、こんな風に HDMI でモニタに出すことができます。この状態でも十分使えるのですが、リモートデスクトップが使えないので、Pro にバージョンアップをします。Home のままで使う場合は、Setting up a VNC server on the LattePanda using TightVNC を入れておくとよいでしょう。

まあ、察するところ、Windows 10 Home のライセンスはダウンロード版でも付与されている感じなんですよね。このあたりは問わないことにしておきます。

Windows 10 Pro にアップグレードする

Home から Pro へのアップグレードは、「ライセンスの変更」でプロダクトキーを Pro のものに切り替えるだけです。

image

LattePanda は、もとから Arduino IDE が入っているのですが、アップグレード時に消されてしまいます。これは後からインストールしなおせば ok です。組み込みの GPIO へは firmata で繋げるので COM3 で通信することになります。確か、特にドライバーを入れなくても動作したハズです。

もしドライバーが足りない場合は、 LattePandaTeam/LattePanda-Win10-Software にあるので、適宜インストールします。

Windows 10 Anniversary にアップグレードする

あれこれと UWP アプリで操作したいので、Win 10 Anniversary にバージョンアップします。

CPUが Atom なので時間が掛かりますが、無事アップデートができます。

この状態で、せっかくなので、.net core 1.1 をダウンロードしてインストール。dotnet コマンドで asp.net mvc アプリを使って動かすことができます。

ちなみに、ストレージは 32GB しかないので、Visual Studio 2015 を入れるのは諦めて Visual Studio Code だけにしています。ただし、micro SD のスロットがあるので、差しっぱなしにして動かせるようにしても ok です。

CPU 的には4コアになるので、こんな感じですね。メモリがぎりぎりですが、まあ、GPIO を扱う程度ならこれで十分です。画像廻りはどうなんでしょうね。まだ調べていません。

 

その次はどうするのか?

mini PC に比べると若干安い LattePanda ですが、Raspberry Pi に比べると倍ぐらいの値段になります。何かのサーバーにするならば、Linux + Raspberry Pi の組み合わせで十分なので、LattePanda としては Windows + GPIO で使わないとメリットが見出せませんね。ボード自体に Arduino が乗っかっている感じなので、C# から Firmata 経由で手軽にアクセスできる環境を作っておくと良いかもしれません。Windows IoT Core が Windows 10 のサブセットなのに対して、LattePanda はフルの Windows が動くので、WPF で作るとか、コマンドラインで実験するとかが楽にできます。ちょっと、このあたりは後で考察していこうかなと。

LIVA BAT-MINI ってのもある

実は、GPIO が使えて Windows 10 が動く組み込みボード…というかPC & GPIO の組み合わせには LIVA BAT-MINI http://liva.links.co.jp/ ってのがある。Amazon で買う ECS BAT-MINI ベアボーン GPIO搭載 ファンレス完全無音設計の組み込み向けパソコン基板 BAT-MINI2G-32G-GPIO こともできるので、結構手軽です。

Slide Image

スペック的には LattePanda とほぼ同じ。OS が入っているかどうか分からなかったのと、GPIO 廻りをどう触るのか書いてなかったので避けたのだけど、似た感じで Firmata で通すのかなと思ったりします。LattePanda を弄り倒したら、ちょっと借りてみた機種だったりします。というか貸してくれ…ってのを1か月後にでも。

カテゴリー: 組み込みボード | LattePanda に windows 10 Anniversary edition を入れるまで はコメントを受け付けていません

Orange Pi Zero に Ubuntu を入れよう

Raspberry Pi の互換機である Orange Pi Zero を買いました。写真では、左側が Orange Pi Zero で、右が Orange Pi One です。Orange Pi Zero は Wi-Fi のアンテナがついているのですが、HDMI のような手軽なモニタ出力がありません(pinがついているところにビデオ出力があるので、これで表示ができます)。Orange Pi One のほうは、Wi-Fi はついていませんが、RPi 互換のピンや HDMI があります。

https://pbs.twimg.com/media/CxOc1irVIAIBzXI.jpg

まあ、用途に合わせて、どちらかを使えばよいかと思います。

Allwinner H2+搭載のOrange Pi Zeroが来た! | OSAKANA TAROのメモ帳
http://blog.osakana.net/archives/7555

を参考にして現在は armbian を入れています。現時点で、公式の orangepi.org を見ると、Android のほうはまともにダウンロードできるのですが、Linux 系がまともにダウンロードできません。Google Drive のほうのリンクが切れていたり間違ったりしています。百度からダウンロードするのもアレなので、先のブログにもあるように、armbian のほうを使ってみます。

armbian をインストール

https://www.armbian.com/orange-pi-zero/ から、Xenial server(Ubuntu系)をダウンロードして、micro SD に書き込んで起動させます。

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

Orange Pi Zero ではモニタがないので、有線LANをつなげた状態で起動したあとで、DHCP で取得した IP アドレスを探っていきます。SSH のデーモンが既に動いているので、tera tarm 等でログイン(root/1234)して設定をします。

ひとまず、apt-get update したあとに、apt-get avahi-daemon して名前でアクセスできるようにしておきます。reboot すると、orangepizero.local で接続できるようになります。

mono をインストール

なにはなくとも、mono をインストールします。apt-get install mono-complete して、暫く待っていればインストールが済む…はずなのですが、途中で止まります。

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

どうやら、Orange Pi Zero が熱暴走して止まってしまうんですよね。CPU の H2+ が熱に弱いのか、mono をインストールするときにフルで動かしてまうと熱暴走してしまいます。勘では 50度位が限界みたいですね。

ヒートシンクを付けるのが正当な手段なのですが、面倒なので、CPU に息を吹きかけて冷まします(苦笑)。普段使いでは、こんなに酷使することはないでしょうから、まあ、一時しのぎということで。

無線 LAN の設定

Orange Pi Zero ではオンボードで Wi-Fi が付いているので、これを有効活用します。

iwconfig wlan0 essid <SSID> key s:<パスワード>
dhclient wlan0

真面目に設定してもよいのですが、どうせ個人で使うだけなので、/etc/rc.local に直書きしてしています。iwconfig コマンドで無線ルータの SSID とパスワードを設定して、dhclient で DHCP から IP を自動取得しています。

ifconfig の結果

image

iwconfig の結果

image

なんか、微妙に遅い気がするのですが…まあ、ひとまず設定はできたのでokとしましょう。

追記 2017/01/18

https://www.armbian.com/orange-pi-zero/ に Wi-Fi 設定の記述があって、

nmtui-connect YOUR_ROUTER_SSID

で簡単に接続ができます。

 

実は、Orange Pi Zero の有線 LAN は、電源供給ができる LAN(PoE)なんですよね。なので、micro USB から電源供給させるのではなくて、ネットワークのケーブル1本で、ネットワークと電源の両方が使えます。試してみたいけど、PoE のハブって高いので、まあ、機会があればということで。

後はどうするか

  • モニタに出力できるようになること
  • Android 5.1 を動かしてみること
  • ピンヘッダの半田付け

ですね。それと、乾電池で動くことを確認したあとに、Arduino と組み合わせて、Raspberry Pi の代わりに使ってラジコン戦車を作ろうかなと。

何処で買えるのか?

本家の http://www.orangepi.org/ の左上にある「point me to by the boards」をクリックすると aliexpress.com に繋がります。時々、製品が間違っているので(たぶん、リンクが間違っている)ので、名前を確認して購入しましょう。トランプ効果で円安ぎみなので、110円/ドルで見込んだほうがいいですね。

Orange Pi Zero が $6.99、Orange Pi One が $9.99 です。送料が$3 ぐらい掛かります。Aliexpress は大抵が送料が無料(中国の郵送)なので、たぶん、Orange Pi 本家(これも中国だけど)から送っているのではないかなと。2週間ぐらいかかることになっていますが、中国から受付→発送のメールが来てから1週間位で届きます。地理的に近いですからね。

参考

すzのAVR研究: Orange pi zero
http://suz-avr.sblo.jp/article/177526024.html

 

カテゴリー: RaspberryPi | Orange Pi Zero に Ubuntu を入れよう はコメントを受け付けていません

PSPと詰将棋TDD(覚醒プログラム)の組み合わせの薦め

詰将棋のようにTDDでC#を学ぶ実験 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8347

で、プログラムを練習する訳だが、実際の詰将棋のように「この問題は3分で解けると5級」みたいなのがあるといいと思う…というか、そういう作りをしている。

試験じゃないので(仕事ベースでやるので)、ググろうが問題文からコピペしようが構わない。実際、チェック上仕方がなかったので、問題のテストコードに解答が書いてあったりする。だいたい、1問(1つのテストメソッド)に対して、15分以内にコードが通るようになれば十分だろう。だいたい、人の集中力は10~15分程度なので、それを超えると効率がガタンと落ちる。訓練で、この時間は2時間ぐらいまで伸ばせるけど(時間制限のある不具合の修正のときに使う)疲れるので、お勧めはしない。

パーソナルソフトウェアプロセスを使う

パーソナルソフトウェアプロセス入門 / Watts S.Humphrey  著 PSPネットワーク  訳 | 共立出版
http://www.kyoritsu-pub.co.jp/bookdetail/9784320120136

パーソナルソフトウェアプロセス技法の補助教材
http://www.kyoritsu-pub.co.jp/service/psp/dse_index.html

絶版になってしまったが、この手の時間を気にしたプログラミングの手法として「パーソナルソフトウェアプロセス」がある。もともと、情報工学の授業で使われていたもので、講義用のスライドや演習用のシートが用意されている。

これが、実際の仕事としてのプログラミングに応用できるかというと、経験上、そうでもありそうでもない、という状態と言える。検索すると、いくつか仕事に利用する例があるが、まあ、プログラマな仕事をしているときには使わない。何故か?端的に「疲れる」からだ。なので、社内研修などで PSP(パーソナル・ソフトウェア・プロセス)を使うのは時間制約内で効率的なんだけど、実際の仕事の場合には疲れすぎて役に立たなかったりする。

ただし、自分のプログラミング速度を測定する(私は「巡航速度」と呼んでいる)ためにはよい。

PSP の利用法に2種類あって、「最大戦速」と「巡航速度」がある。

「最大戦速」は、まさしく船のボイラーが悲鳴を上げるぐらい速度を上げるので、人間の体力的にもキツイ速度だ。できて、3時間から半日ぐらいが限界だろう。いわゆる、「この不具合を明日の朝のリリース前までに直してくれ」と言われたときのスピードだと思っても良い。これをやると、息も浅くなるし、モノも食べず飲み物も飲まない(口に何か入れるとリラックスしてしまって、遅くなるからだ)。なので、あまりやりたくない。

「巡航速度」のほうは、いわゆる毎日続けられる時間になる。継続できるプログラミング体制というのは、XP で言うところの 40時間/週 勤務であったり、8時間/日のうちに Google の 20% ルールが入っていたりする勤務体系になる。匍匐前進とかはやらない。その位の、ペースが毎日続けらる(プロジェクトが続いている間だから、2,3か月は大丈夫とか)パターンになる。アジャイル開発のスクラムよりも遅いペースでよい。

そういう巡航速度で過ごせる、プログラミング速度を自分で知っておくのは必要で、問題を解くときに、

  • 問題に対し予想時間を決める
  • 開始時刻を記録する
  • 問題を解く 
  • 終了時刻を記録する
  • 予想と実績の時間を比較する
  • 次回の予想時間を調節する

という具合に、予想を常に調節する(ドライビングする)ことになる。そうやって、何度も繰り返していくと、設計などを見たときに直感的に作業時間が見積もれるという「勘」が養われる。「勘」というとまるでマジックのような気がするか、モノづくりをするときに「勘」は必要だ。大工にも勘所があるし、税理士にだって不正のあるところが「勘」でわかる。そういう、プロフェッショナル「勘」を養うために、こういう問題を何度も疑似的に解いてみるというのが目的である。

ちなみに Humphrey 氏は、(悪名高い)CMMI の提唱者らしいので、その先のことは沿わなくてよい。CMMI とか ITSS は測定のための測定(端的にいえば、外部から「資格」を与えるものなので、自己言及がない)ので、測定の「道具」として使うにとどめるとよい。なので、プログラマな現場としては、自己鍛錬のひとつとして PSP を使うとよいだろう。

[amazonjs asin=”4320120132″ locale=”JP” title=”パーソナルソフトウェアプロセス入門”]

カテゴリー: TDD | PSPと詰将棋TDD(覚醒プログラム)の組み合わせの薦め はコメントを受け付けていません

詰将棋のようにTDDでプログラムを学ぶ(PHP編)

詰将棋のようにTDDでC#を学ぶ実験 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8347

の派生版として、PHP 版を作ってみました。

moonmile/TestPro-PHP: TDD で学ぶ PHP
https://github.com/moonmile/TestPro-PHP

真面目に PHPUnit を使うのは始めてなので(以前、CakePHP を使ったときは、クライアントの C# でテストしていたので)、もうちょっと効率のよい書き方があるのかもしれませんが、ひとまず tests フォルダを作って、テストクラス毎にファイルを分けています。テスト対象となるクラス名を「Target」で統一したかったので(いちいち変えるのが面倒だったとも云う)、ファイル名だけが「target001.php」のように変わっています。

文法だけだと、C# も PHP もやれることは同じなので、ちょうど比較になって良いかもしれません。Target となるクラスは、できるだけ既存の PHP クラスのスタイルに近づけたほうがよいかなと感じています。

設定

Windows に xampp を入れて php が動く環境を作っています。

XAMPP Installers and Downloads for Apache Friends
https://www.apachefriends.org/jp/index.html

xampp の phpunit のバージョンが古いので、以下の場所で、phpunit.phar をダウンロードして c:/xampp/php/phpunit.phar にコピーします。

PHPUnit ? The PHP Testing Framework
https://phpunit.de/

xampp の /xampp/php/phpunit.bat を

"%PHPBIN%" "C:xamppphpphpunit.phar" %*

のように書き替えます。コマンドラインでパスを追加して、src/01/tests フォルダ内で

phpunit  test001.php

のように実行すれば ok です。

テストコードのメソッド名が日本語なので、文字化けしてしまいます。UTF-8 が正しく表示されるように、

chcp 65001

で文字コードを変更してください。

image

こんな風に、Visual Studio Code 内からも表示できるようになります。

PHP Programming with Visual Studio Code
https://code.visualstudio.com/Docs/languages/php

vscode の PHP のための拡張設定は、まだ試行錯誤中なので後で。

 

 

先行きは

それなりに、配列とか連想配列の使い方を覚えられそうなので、もう少し文法を網羅できるようにテストコードを追加していくのと、C#のファイルアクセスと同じように、PHP からローカルファイルのアクセスをするところ、HTTPプロトコルのアクセス(引数の取り込みとか)、データベースアクセスを加えると、実用的になるかなと。

あと、Python 版も作る予定です。

カテゴリー: PHP, TDD | 詰将棋のようにTDDでプログラムを学ぶ(PHP編) はコメントを受け付けていません

詰将棋のようにTDDでC#を学ぶ実験(2)

逆引き大全のほうは、サンプルに対して1tipsという制限があるので、あまり盛り込めないが、詰将棋 TDD のほう(あるいは「覚醒プログラム学習」)のほうは、1問(1プロジェクト)に対して、ごっそと覚えるべきことを詰め込んである。というか、クラスの構造とかファイルストリームとか別々に書くと面倒なので、ひとつのテストクラスにしてテストメソッドだけ分けるというスタイルにしている。

image

項目の出し方は、IDEF0 や五行を使っているのだが、そもそものネタは patterns & practices に則っている。パフォーマンス・チューニングをする上で、

  • CPU
  • メモリ
  • ストレージ(ファイルシステム)
  • ディスプレイ
  • データベース
  • ネットワーク

を考える。業務システムで何をするかによるので、何処かが「ボトルネック」になる。ボトルネックを解決する仕組みは「クリティカルチェーン」を参考にすればよいだろう。所謂 TOC の話になる。

業務用 PC を組んだり、システムを設計するときもこの「ボトルネック」を意識する。そうすると、無駄なコストを支払わなくて済む。

ストレージ絡みを10問追加

moonmile/TestPro: TDDで学ぶC#
https://github.com/moonmile/TestPro

ざっと、ストリーム/ストレージ絡みを10問追加しました。テキストファイルの読み書きから、バイナリデータ、構造体、JSON形式、XML形式まで含めたので、業務システムで使うテクニックは入っていると思う。これができると、ストレージによる永続化が可能になるので、お試しにどうぞ。

カテゴリー: C#, TDD | 詰将棋のようにTDDでC#を学ぶ実験(2) はコメントを受け付けていません

詰将棋のようにTDDでC#を学ぶ実験

「ハチワンダイバー」を通読したので、浦野真彦著「1手詰めハンドブック」を買いました。子供用にどうぶつしょうぎを買っている訳ですが、結構いけそうなので、それならば詰将棋を試してみようという次第です。自分で読むというのもあるけど。私は、7手詰め位でギブアップですね。

[amazonjs asin=”4839933324″ locale=”JP” title=”1手詰ハンドブック”]

将棋とプログラミングは似ている

プログラミングは、新しい問題を解決すると同時に、既存の問題を解決する手段でもあります。新しい問題ってのは、人工知能とかVRとか、新しい技術ですよね。なんらかの技巧を駆使して実現するわけですが、一方で、みずほ銀行リプレースのような既存の技術の積み重ねで成り立っているところもあります。所謂、社内の情報システムの構築なんかは、大抵はこの「既存の技術」の組み立てで十分だったりします。そのあたりを主な仕事にしていると、面白いか面白くないかは別として、仕事としてやっていけるかが重要になります。

それを将棋に例えれば、終盤の詰めの場面で、詰められるかどうかの棋力が重要なのと同じで、きちんと構築されるべきモノに対しては、きちんと構築する力量が必要でしょう。プログラミングで言えば、基礎体力というべきものでしょうか。

「1手詰めハンドブック」は面白い構成になっていて、駒の種類と動き方を網羅かつ分類して詰将棋が作られています。なるほど、手駒に何があったとき(あるいは何もなかったとき)、盤面に何の駒が配置されていたときには…という具合に分類ができるわけです。1手詰めですから、手駒を打つか、盤上の駒を1手だけ動かすか、という基礎的な力が試されるものです。実際の場面では、1手で詰むかどうかは分からないわけですが、詰将棋の場合は「必ず1手で詰む」というルールがあるわけです。

これをプログラミングに置き換えると、

  • 仕様変更があったときに、どこの行を修正すれば、仕様を満たせるのか。
  • バグが見つかったとき、どこの行を修正すれば、バグが解消されるのか。
  • 何か機能を追加したいとき、何を追加すれば、機能が満たされるのか。

という具合に、ちょっとずつ進めるところに似ています。

じゃあ、この1手詰めのところを、TDD(テスト駆動)に直してみたらどうだろうか?というアイデアです。

テスト駆動的に問題を解いて学習する

プログラミングを学習するときに、どうやったら一番よいのか…は、まだ判明していませんが、既にいくつかの方法は提案されています。

  • ひたすら、先人のコードを写経する
  • Scratch のようなブロック型の言語を使って学習する。
  • 独習 C# を読み込んで書物で文法から学習する。
  • Swift Playgrounds のように RPG のように学習する。
  • 学習ビデオを買って、学習する

などなど、何を目的にするのかによるので、一概に何がベストという訳ではありません。ただ、ソフトウェア開発を主とする会社に入ったときに、新人教育でプログラミングを学ぶ場合には「独習 C#」あたりが多いでしょう。文法をひと通り覚えるところからスタートという感じですね。

私も、以前は独習させる場合(大手でない場合は、新人教育のみというパターンは少ないので)、一定のペースで独習シリーズをすすめていたのですが、これが終わってもちっともプログラミング力が上がったように思えないんですよね。確かに、文法はきっちり覚えるかもしれないけど、現場に入ると既存のコードがあって、仕様変更があって、結局のところ、独習シリーズの中にあるような文法すべてを網羅することは皆無であって、当面は、最初の数か所を覚えるだけで済み、あとは現場としてどう対応できるかが問われてきます。

「現場に問われる」という問題は、新人を受け入れる側からみる「即戦力」という視点と同時に、新人/未経験者自身が「仕事としてやっていけるか」の心の支えにも関わります。経験と未経験のギャップが確実にあって、そこをうまく OJT 的にフォローできればよいのでしょうが、最近の現場をみると、それほどフォローできているとは思えません。これは、OJT のリーダーが新人にもっと寄らないと駄目なのか、逆に新人が現場に対して自己的に「戦力になり得る」と思えるかどうか、にも関わる話です。

そうなると、学習のための学習でプログラムの文法を覚えるよりも、まずは、手を動かす形で、コーディングができる状態に持っていくのが先決ではないか?と思い始めました。そうなると、文法を網羅的に知っているという面接的な質問ではプログラミング力というのは測れなくて、もっと、違う面を持ってこないと駄目ですよね。よくある、何か課題を出して解くというのもあるけど、あれもちょっと違う感じがしています(まあ、未経験者の振るい落としとしては良い方法ではあるのだけど)。

面接としてや知識としてではなく、仕事としてプログラミング力を測るのならば、それはちょうど詰将棋を解くのと同じではないか?と思ったわけで、そうなると、問題を解く(実際にコードを動かしてみて解決する)という点では、TDD がよいのではないか、と考えました。

ひとまず10問作ってみた

Visual Studio 2015 の C# で 10問だけ作ってみました。本来は50問ぐらいあると、それなりに学習&実践できるのでしょうが、やってみると結構問題を作るのが大変だったので。

image

最初の変数と配列の扱い方、クラスにいくつかのメソッドを実装するスタイルでコードを完成させていきます。コードを組んで、実際に動かすとテストメソッドがクリアされる(グリーンになる)ので、達成基準が解りやすいと思います。

moonmile/TestPro: TDDで学ぶC#
https://github.com/moonmile/TestPro

なところにコードをアップしたので、気になる方は試してみてください。

ターゲット層

将棋で云うならば、「独習 C#」で文法を学んだだけでは、将棋の駒の動かし方を覚えた10級でしかない。目標とするのは「文法を詳しく知っている」のではなく、「プログラマとしてパフォーマンスが出せる」ということだから、将棋に例えるならば、初段で相手に勝てる、ところまで持って行かないといけない。だから、途中途中で、棒銀や中飛車としての「型」を覚える(高速道路に乗る)ように、オブジェクト指向的なテクニックを学んだり、GoF でパターンを覚えたり、いくつかのフレームワークの使い方を学んだりする。しかし、それだけでは現実には「勝てない」。

[amazonjs asin=”4861916992″ locale=”JP” title=”初段になるための将棋勉強法”]

ならば、プログラマとしてパフォーマンスが出せる≒現実に勝てる、程度が初段としたとき、文法を覚えたときの10級との間はどのように登っていくのだろうか、ということになる。

詰将棋のように TDD で C# を学ぶ前提として、

  • 「独習 C#」などで、C# の文法を学んでいる(本で読んで知っている)
  • Visual Studio の使い方が分かる。
  • .NET Framework のライブラリの使い方/調べ方を知っている(ググるのでもok)

という座学みたいなものがあり、これと実践的な「初段」の段階との間に「詰将棋のように TDD ~」がある。疑似的に5級までの実践力が養えればいいだろう。

  • 新人が3年目程度のプログラマに
  • 未経験の中途採用が3年目程度のプログラマに
  • 未経験のプログラム言語に対しての学習
  • 中途採用するときの経験度の判別に(3年程度の経験)
  • 中途就職するときの実力披露に(3年程度を目安に)

までの、疑似的な実践(スパーリングみたいなもの)ができればよいかなと。

カテゴリー: C#, TDD | 詰将棋のようにTDDでC#を学ぶ実験 はコメントを受け付けていません

ユーザー領域が壊れたらしいので、リセットするまで

ここのところ、Windows 10 のブルースクリーンが頻発するのと、どうもユーザー領域が壊れたみたいなので、OS をリセットすることにしました。

色々、症状が変で、

  • 熱暴走でブルースクリーンになる。直後に立ち上げても BIOS すら立ち上がらない。
  • Visual Studio で UWP アプリを作ったときに、XAML デザイナが立ち上がらない。
  • Visual Studio からローカルコンピュータへ UWP アプリがデプロイできない。AppLocker ではねられる。
  • 新しいユーザーを作ってもスタート画面が表示されない。Win キーが効かない。

最初の熱暴走は、水冷式のファンの目詰まりが原因だったのですが、直したあとでも微妙にブルースクリーンが頻発したりして、メモリ自体の不具合かもと思ったのですが…「新しいユーザーが作れない」ところで、あまりにも致命的なので OS のリセットです。

Windows 10 Build 14393.51 cannot perform app update from Store: error 0x80073CF9
https://social.technet.microsoft.com/Forums/scriptcenter/en-US/30f092a3-3f05-43be-a6e5-d14f59d57a62/windows-10-build-1439351-cannot-perform-app-update-from-store-error-0x80073cf9?forum=win10itprogeneral

な人と同じ状況に陥りました。この人も、リセットしているので、どうしようもないみたい。

image

OS の再インストールでもいいんですが、あれこれ C ドライブに残っているものが多いので、個人用のファイルを残したまま初期状態に戻します。

Visual Studio やら Office やらが、ごっそり消えてしまうので、ソフトウェアの再インストールは必須なんですが、Hyper-V の設定やら、こっそり /User/<ユーザー名>/Documents 等に残っている設定は、そのまま使えるので、サラにするよりは楽なのでは?ということで。

C ドライブの SSD(512GB)が、残り 100GB 位でぎりぎりだったのですが、初期化したあとにあれこれと開発環境を入れなおしたあとでも、200GB 以上残るようになりました。

image

結構、クリーンアップしたつもりなのですが、アンインストーラーのゴミが 100GB 程度あった、ということなんでしょうね。なんだかなー。

Xamarin を入れて、Android Studio を入れて、Eclipse も入れました。Java はやるつもりはないのですが、買ったデジタルペーパーの Windows ツールが Java なんですよね。これを、プロトコル解析して C# に移す予定です。

カテゴリー: トラブルシューティング | ユーザー領域が壊れたらしいので、リセットするまで はコメントを受け付けていません