Xamarinプログラミング入門 C#によるiOS、Androidアプリケーション開発の基本ができました

Xamarinプログラミング入門 C#によるiOS、Androidアプリケーション開発の基本
https://www.amazon.co.jp/dp/4822253503

正月頃からちまちまと書いていた Xamarin 本がやっとこさ出版に至りました。

image

3月末に Visual Studio 2017 がリリースされ、Xamarin.Forms の Master-Detail のテンプレートが変わってしまったものだから、サンプルの作りを全面的に改訂。この際なので、あれこれと手直して秋口まで延ばして貰いました。本来は de:code 2017 に間に合わせたかったんですけどね。さすがに無理でした(苦笑)。

内容とコンセプト

詳細な目次は、日経BP書店|商品詳細 - Xamarinプログラミング入門 を見てもらうとして、執筆時のコンセプトは、

  • Xamarin.Android/iOS/Forms の動作原理を知り、シミュレータを含めた動作環境を構築する。
  • スマートフォン(iOS/Android)の開発が主となるので、Xamarin.iOSとXamarin.Androidもターゲットに入れる。
  • 前回、タイミング的に入れることができなかった Xamarin.Forms を「共通化のベース」として入れる。
  • と同時に、ロジックを共通化&外出しすることで TDD の手法が使える。

なところです。

なので、C#の文法の説明は一切しない(「独習C#」などで学習済みであることが前提です)、Windows Phone は本書のターゲットでありません(販売台数的にこれは仕方がないです)。

ただ、巻末に私の趣味的に、UWPアプリの作り方と Android Things の使い方の解説があります。このあたりも見てもらうと、目指すところとしての Xamarin/mono/.NET Core/.NET Standard がなんとなく想像できると思います。

前回は、Xamarin 自体が紹介も含めていたので(当時有料であったし)、サンプルプログラムとしてパズルゲームにしましたが意外と不評なので(苦笑)、今回は Master-Detail 型の ToDo アプリにしてあります。ToDo アプリ自体は、Xamarin.Forms のサンプルにあるのですが、本書のサンプルは、ToDo の新規追加と更新、そして Azure を使うところを2段階で解説しています。

分厚い Xamarin.Forms 本 よりももっと手に入れやすく(値段的に)という企画であったのと、この本も含めていくつかの Xamarin 本の企画を想定していたので、それらとは違う仕組みにしてあります。なので、お財布には優しくありませんが!両方買っても大丈夫ですよ。

ちなみに、ちょっと古めですが参考資料として Xamarin Mobile Application Development for iOS などの洋書を使っています。Xamarin.iOS/Android については、基本的なところは変わらないのと、どうせコードで把握することが多いので洋書にあたってしまったほうが情報の入りは早いです。

サンプルコード

日経BP社のサイト 日経BP書店|商品詳細 - Xamarinプログラミング入門 からサンプルコードがダウンロードができます。

でもって、ベゾルド本に倣い(と、最近のMicrosoft関係のOSS化に倣い)、github https://github.com/moonmile/xamarin-samples でもサンプルコードを公開しています。更新の早い Xamarin.Forms に完全に追随できないかもしれませんが、ちまちまと更新はしていこうかと思っています。

カテゴリー: Xamarin | Xamarinプログラミング入門 C#によるiOS、Androidアプリケーション開発の基本ができました はコメントを受け付けていません

中学校のあふれそうな中間試験勉強のためにタイムマネジメントを活用する

娘が中学校に入ったので、学校では中間試験、期末試験が行われるようになりました。その各試験の前のに「試験前の対策」と称していろいろなプリントやら提出物が課せられるわけですが、この分量が並ではない!そもそも、試験対策のための勉強ができないほど課題提出を持てめてしまうのはどういうことなの?

ということを Twitter で愚痴ろうと思ったわけですが、ちょっと対策を含めてブログにしておきます。この課題の多さ、1学期の中間、期末、夏休み、そして2学期の中間、となり4度目なので、おおまかな対策は立てることができました、というお裾分けでもあります。いわゆる「マネジメント」の分野なんですけどね。

そもそも課題が多い

課題が多い理由としては「試験前に勉強しない子でも、強制的に勉強するように」という方針らしいのですが、そもそもが、課題の多さ自体に疲労してしまうのではないか?という疑問があります。また、各教師が全体の課題のトータルを把握しているのか、という問題があります。

image

「課題が多い」ことに対して、保護者の立場であれこれ言うことはできないので(学校の方針でもあるし)、じゃあ、この多くの課題をどうやってこなすのか?と同時に、どうやって試験勉強をするのか?を考えていきましょう。

スケジュール表を作る…だけではだめ

学校からは、こんな感じのスケジュール表が配られて、予定と実績を書き込む、そして教師がチェックするというプリントが配られますが、これではだめです。できる子はいいんでしょうが、先のように多くの課題を抱えてしまってあふれてしまっている子は途方に暮れてしまいます。

image

この手の話は、IT業界のプロジェクトでもよくある話で、「課題や実装すべき機能が多すぎて、どこから手をつけたらよいかわからない」というものです。しかも、期限が決まっているパターンですね。仕事の場合は、そもそもの課題の量を調節する手段をとれるのですが、学校に提出する課題/プリントの量は、交渉の余地はありません。やるか、やらないかというパターンですね。溢れてしまっている場合は、半分だけやるという方法もありますが、ここでは「ひと通りやる」ことを目標に考えていきます。

全体の課題の数を書き出す

最初に、課題の数をかき出します。一応、渡された一覧で「数」はわかるはずなのですが、実感が伴わないので付箋に書き出します。付箋にすると、枚数で勘定ができるようになるので、何枚あるのかとうボリューム感が捉えられます。

image

すべての課題を付箋に書き出したら、

  • 簡単なタスク
  • 重たいタスク
  • ほどほどのタスク

の3つに分けます。簡単なタスクは、教科書をひと通り読むとか、1枚だけのプリントみたいなものです。重たいタスクは、2,3時間掛かりそうなものです。細かく分けても仕方がないので、大中小の3つに分類します。

その中から重たいタスクに注力します。

image

いわゆる「パレートの法則」で、上位20%をめやすに取り出します。そうすると、重たいタスクの数が判明し、計画が立てやすくなります。

重たいタスクには

  • 大まかな学習時間の予想を記述
  • いつ課題をこなすのかを日付で記入

します。このベースとなる、重たいタスクを中心に据えて、まわりの軽いタ50を空き時間なり、適当な制限時間(30分や50分単位)にまとめて課題をこなしていきます。

タイムマネジメントの活用

この手法は、いわゆる時間製薬のある「タイムマネジメント」と制限時間で遅延を計測する「タイムボックスを利用したマネジメント」の合わせ技です。仕事でも使えますよね…というか、そもそも仕事用です。

この手のマネジメント手法は、学校での学習でも使えるので大いに使うことが肝心です。うちの子も、小5,6の夏休みからあれこれやって、中1のこの時期にやって自分で付箋を掛けるようになりました(まあ、方法は毎度教えないとダメなんですけど)。中2になったら自分でできるようになるだろうか?

カテゴリー: 雑談 | 中学校のあふれそうな中間試験勉強のためにタイムマネジメントを活用する はコメントを受け付けていません

Android内のユーザーデータを探る

Android でアプリケーションが入っている場所は /data/data になるのだが、実機だとルート化する必要もありいくつか面倒なので、Nano Pi K2 に Android を入れて、その micro SD カードを使うことにする。

このカードを既存の Linux マシンに USB メモリとして認識させる。手元に Raspberry Pi があるので、認識させたのがこれ。ラズパイの場合は /media/pi にマウントされるようで、ここの /media/pi/userdata/data がそれにあたる。

image

例えば、マギレコの場合は com.aniplex.magireco 内を調べる。これらのフォルダーは root になっているので、su でルートになるか、sudo で調べるとよい。

後からダウンロードする場合は、別のフォルダーなのだろうが、マギレコの live2D は、com.aniplex.magireco/files/madomagi/resource/image_native/live2d にあるので、適宜コピーして PC 上で動かすことができる。

image

保存データは、userdata/media/0/Android/data にあるような気がする。歌マクロスの com.dena.a12024374 内に3Dデータが入っていると思うのだが、ちょっと分からない。

image

ふと見ると、etc の下に il2cpp が入っているので、中身は C# で書いているのかもしれない。

image

jp.showgate.girlsundpanzer はガルパンで、中身は Unity のデータが入っているとか。

ひとまず、メモ書き程度に。

カテゴリー: Android | Android内のユーザーデータを探る はコメントを受け付けていません

鳳凰OS(Phoenix OS)をVMWareにインストールしてみよう

鳳凰システム – Phoenix OS
http://www.phoenixos.com/ja_JP/ という Android ベースな中国産の OS があることを知りました。以前、Remix OS があって、うまいこと仮想環境にインストールできなくて断念していたのですが、今回の Phoenix OS は VMWare Player にインストールして程よくことができたので、お試しに。ただし、再起動すると、何故かインストーラから始まる(どうやら、内部 HDD じゃなくて、ネットワーク起動が優先になっているのが問題らしい)ので、あまり実用的ではありませんが。

http://www.phoenixos.com/zh_CN/
image

日本語OSからアクセスすると「鳳凰システム」になっていますが、れっきとした北京超卓科技 https://www.lagou.com/gongsi/62428.html なので中国の株式会社ですね。

Remix OSのインストールと設定 | E.i.Z
http://eizone.info/remix-os/

を見ると、Remix OS のほうは潰れたそうです。

Phoenix OS は、中国語版と英語版しかありません。Nexus 7 のタブレット Android に入れることもできるようですが、ちょっと危ういので、Phoenix OS for x86 のほうを VMware Player 上に入れます。実は、Windows を PC に入れた状態からディアルブートするインストーラーがあるのですが、VMWare 上では起動ができないため、*.iso ファイルをダウンロードして別途仮想環境で動かしています。ISO image (64bit) にある PhoenixOSInstaller_v2.2.0.207_x86_x64.iso   854.5M のやつですね。中国から落とすと 100kb/sec 程度しか出ないのでダウンロードに5時間位かかりますが、ひたすら待ちます。ちなみに、これは中国内の回線が遅いのではなく、中国と日本間の回線が遅いのです。例の検閲絡みですね。中国内だと高速通信がバンバン走っているので、日本国内よりも(最近は光通信があるから同じぐらいか)早いぐらいです。

仮想環境でのメモリは 1GB、ストレージは16GB 程度あれば十分です。スマホで動く程度で鳳凰OSも動かすことができます。

鳳凰OSをインストールする

*.iso をマウントして VMWare を起動すると、OS をどのように起動するのかを聞く画面が出てきます。デフォルトでは、インストールメディア(DVDか?)を使ってインストールする方法になっていますが、下矢印キーを押して HDD にインストールするようにします。DVD メディア起動だと、ストレージが小さくて後から説明する Android アプリをインストールできません。

image

なんと、この間が5秒しかないので、すかさず下矢印キーを押してください!

で、HDD インストール時に ext4 にフォーマットしてインストールを続けていきくと、下の画面になります。PCがそこそこ早ければ5分位で終わります。

image

インストール直後の起動画面。言語は、英語と中国語しか選べません。

image

見慣れた、Windows 10 っぽい画面がでてきます。動きもそれっぽいので、使うのにはそれほど問題ないような気もしますが…アプリをインストールしようにも、基本は Android なアプリしか入れられないで、利用範囲はかなり狭いです。

image

標準で、Phoenix Feature なストアがあるんですが、アプリが非常に少なく利用できる状態にありません(現在 v2.0 なのに…って感じがするけど、まあ、そういうものなのかも)。なので、素直に Google Play を使います。google アカウントは念のために新しく作っています。バックドアがあるかもしれないからね。

image

組み込み系 Android 御用達の「戦艦少女R」をインストールします。何故か、マウスでするする動くし、ほどよくゲームなので、試しにちょうどよいのです。しかも、中華 Android で非常によく動きます(弊社比)。

image

戦艦少女Rが動いたら、ユーザー名を入れて適当にチュートリアルをこなしてみましょう。音も出て、結構きびきび動くことがわかります。画質も結構きれいですね。

鳳凰OSにはファイルマネージャがある

いわゆる、ファイルエクスプローラーがあるので、Android 内部のファイルを見ることができます。どうもルート権限はないみたいなので、Documents 配下ぐらいしか触れない気もしますが。

image

Google Player から色々ダウンロードしてみる

この際なので、色々試してみます。

すべてのゲームが正常に動くわけではなくて、起動ができなかったり、画面が微妙だったりします。鳳凰OSでは、Android アプリをマルチウィンドウで動かせるわけですが、こんな風に、にゃんこ大戦争と戦艦少女Rを並べて起動ができます。ここはマルチで動いていて、両方とも音がなります。にゃんこ大戦争は、ウィンドウを大きくしてもゲーム画面が大きくなりません。戦艦少女Rは全画面表示でも動きます。戦艦少女R、優秀ですね。

image

ちなみに、歌マクロスはインストールできるもののマウスが効かず、マギレコとパズドラは起動ができず。ミリオンダッシュは最初の年齢が入れられず、と動かないものもの結構あります。モノ的には Android 7. 1 なのですが、ウィンドウ化するにあたって無理がきている模様。

image

以下は、いくつか動かしてみたもの。

# Android 版の Office 365 が入っているのだけど、アカウントを入れる勇気がないので試していません。

紅白アプリは、Xamarin で作っているものです。動きますね。

image

カンペアプリは、確か Unity だったはず。マウスでお絵かきができます。たぶんタッチパネルも動くと思う。

image

ネットワークドライブも扱えます。これは別のPCにある mp4 を鳳凰OS標準の Video Player で表示させたところです。有線LANだからか、動画や音の遅延はありません。

image

面白いところでは、Google Play にある Remote Desktop アプリをダウンロードさせて Windows 10 にリモートアクセスができます。リモート先から Tera Term を開いてラズパイに繋げているところです。キーボードとマウスが有効に働きます。

image

Android 自身への接続ができる Terminal Emulator を入れると、自分自身を操作できます。フォントの大きさは自由に変えられます。ユーザー名は u0_a77 という一般ユーザー名(ランダム?)になっています。su は効かないので、ルートになれるかどうかはわかりません。

image

結構色々動きそうなのですが、難点がいくつかあります。

再起動ができない

なぜか、VMWare 上で再起動させると、ひたすらネットワーク起動をしようとして起動できない状態に陥ります。これは、鳳凰OS無いからシャットダウンしたときも同様です。

仕方がないので、DVD を入れたまま(*.isoがアクセスできる状態にしたまま)で、起動。すかさず、下矢印を押して、HDD にインストールする状態にして、

image

下のように HDD をフォーマットしないままで進みます(初回のインストールではフォーマットが必須です)。そうすると、HDD の内容がそのままマウントされるので、以前の状態が復元されます。

image

本体のインストールに30秒位かかりますが、まあ VMWare 上だから仕方がないのかなと。実機 PC にしてディアルブートにした立ち上がるのかもしれません。

鳳凰OSアプリの開発はどうするのか?

どうやってやるんでしょうねぇ?書いてありません。

と思ったら、どうやら TCP/IP 経由の Android デバッグが動きます。

  1. 設定を Native Settings にする。
  2. 設定の About → Build number を連打。
  3. メインの設定には「Developer options」は出ないが、左上のハンバーガーメニューから出るので、ここから USB デバッグを ON にする。
  4. PC のほうから、adb connect <ipアドレス> で接続

↓な感じ、で無事 Visual Studio から Xamarin.Android アプリが起動できます。

image

めでたしめでたし。

カテゴリー: 開発, Xamarin | 鳳凰OS(Phoenix OS)をVMWareにインストールしてみよう はコメントを受け付けていません

ラズパイでUbuntu Core を試してみよう(前編)

ふと、Nano Pi K2 に Ubuntu を入れて .NET Core を使ってあれこれしようと思ったのですが、何やらこの OS がちょっと Ubuntu とは違う。Raspberry Pi に Ubuntu Mate を入れたときと挙動がちがう。そもそも CPU は同じ Cortex-A53 なのだから、GPIO まわりが違うとはいえ、Hello world 位は動くのではないか?

http://wiki.friendlyarm.com/wiki/index.php/NanoPi_K2#UbuntuCore

image

と思って、何の OS だか再確認すると「UbuntuCore」と書いてあります。これは、普通の Ubuntu とはどう違うのか?ってのが発端です。

そもそも Nano Pi K2 って何?

Friendly ARM で購入できるラズパイ互換機です。Nano Pi にはいくつか種類があって、メモリや USB の数などで選ぶわけですが、Nano Pi K2 は、Android が動作して歌マクロスを動かすために購入しました。Raspberry Pi 3 よりも安く購入ができます。ちなみに、このボードでは歌マクロスは動きませんでした orz どうやら、タッチパネルが必須みたいですね。ただし、マギレコは動きます。これは後日。

image

現在のところ動作できる OS は、Android 5.1 と Ubuntu Core だけです。Raspbian のような Debian 系はありません。購入時には、赤外線のコントローラーとケースが付属しているので、Android を入れると Fire TV のように動作できます。というか、その目的で売っているみたいですね。これも後日。

Ubuntu Core とは何か

そういえば、Docker を勉強した頃に、CentOS の Atomic というのがあって、Docker 専用のコンテナ OS でした、ってのをやっと思い出しました。

コンテナホスト向けOS環境「CentOS Atomic Host」や「Snappy Ubuntu Core」を試す – さくらのナレッジ
http://knowledge.sakura.ad.jp/knowledge/4217/

元の OS に apt-get やらで色々インストールすると環境が汚れるので、Docker を入れて動かします。Docker のコンテナとしての機能しか要らないので、機能が相当削ってあり vi すら動かない状態だった、とかなんとか。そんな訳で、素の状態の OS として使う訳ではありません。

当時、Raspberry Pi でも Docker が動かないかとかいう話があったのですが、当時のラズパイは、まだ 32bit で、Docker を動かすには 64bit CPU が必須だったという状態だった、というのを覚えています。

で、現在のラズパイ3は、64bit なので、Docker が動きます。なので、それのコンテナ用としての Ubuntu Core も動作する、という状況な訳ですね。www.raspberrypi.org でも「Snappy Ubuntu Core」と言う形でダウンロードできます。これをクリックすると、Ubuntu developer の https://developer.ubuntu.com/core/get-started/raspberry-pi-2-3 にジャンプするので、「Ubuntu Core」のことです。

image

さて、Ubuntu Core が動作する環境は、 https://developer.ubuntu.com/core/get-started で見れるわけですが、ここには Intel x86/64 系や Mac はありません。通常の PC で試したい場合は、KVM 版の仮想環境で動くものを使います。

となると、CentOS の Atomic のように複数の Docker を載せて動かすというよりも、Ubuntu mate よりもメモリが少ない環境/ストレージが少ない環境の組み込み用 Linux として動作させる、という形にシフトしたようです。2016年頃の記事を見ると「snappy ubuntu core」としてラズパイ上で docker を動かす記事が多いのですが、先のダウンロード先が Ubuntu core になっていることから内部構成が変わっています。そもそも、snappy と言うコマンドが無くなって、snap というコマンドに変わっています。

image

目的も Docker のコンテナとしてではなく(snap find docker で見つかるので、インストールはできる模様)、小メモリで IoT 機器が扱えるというスタイルみたいですね。

Ubuntu Core をインストール

まずは、Raspberry Pi 3 にインストールします。Raspberry Pi 2 でも CPU が 64ビット版であればインストールできます。

Raspberry Pi 2 or 3 | Developer
https://developer.ubuntu.com/core/get-started/raspberry-pi-2-3

普通の Raspbian と同じように micro SD に焼き込みます。色々な機能は削られているみたいで、8GB 以下でも大丈夫な感じです。限られた処理しか使わないのであれば、安価な 8GB を大量に買って入れ込むということもできそうですね。16GB はまだそこそこ高いので。

ひとつ気を付けなければいけないのは、Ubuntu Core に対して SSH するためには「Ubuntu SSO account」を取得して、そのアカウントでログインする必要があります。どうやら、組み込み機器へのインストールを制御するために Ubuntu SSO を使うらしいのですが、

image

  • Ubuntu Core の初回起動時に Ubuntu SSO のアカウントを入力する必要がある。
    • つまり、モニタとキーボードが必須
    • Ubuntu SSO に繋がるために、外部接続が必須になる。
  • Ubuntu Core に SSH するときにRSA公開鍵/秘密鍵が必要になる。
    • これが結構ハマる。ラズパイの英語フォーラムでもハマったまま解決していなかったり。
    • 公開鍵使って SSH している人には当たり前のことなのか?

という制限があります。

Ubuntu Core を起動して、Ubuntu SSO に登録したメールアドレスを入れると、以下のようなアカウントで Ubuntu Core にアクセスできるようになります。私の場合は moonmile というアカウントを取りました。おそらく、早い者勝ちですね。

image

Ubuntu Core は、この写真で分かるように単純なコンソール環境…と言いますか、コンソール環境ですらないです。外部から SSH で繋げてあれこれややるしかありません。WinSCP は繋げたのでファイルのアップロードなどはできます。

Raspberry Pi からだと。

ssh moonmile@172.16.0.16

のようにして SSH で接続できます。このときに、public/private key が必要になります。

SSH/OpenSSH/Keys – Community Help Wiki
https://help.ubuntu.com/community/SSH/OpenSSH/Keys

を見て、ssh-keygen -t rsa で作ります。ラズパイの場合、デフォルトで .ssh フォルダができているのですが、.ssh/id_rsa のパーミッションを chmod 600 id_ras で変えておく必要があります。ここがデフォルトの 644 のままだと、何故か ssh で繋げるときにエラーになって不明な状態に陥ります。

.ssh/id_rsa.pub の内容を、Ubuntu SSO の SSH Keys に貼り付けて、登録しておきます。初回 SSH するときには、秘密鍵のパスフレーズが必要になるので、忘れないでください。その後は、Ubuntu SSO のパスワードと混乱しそうですが、RSA公開鍵を使ってアクセスをするので、自分の秘密鍵のパスフレーズが必要、という訳です。

そうすると、無事 Raspberry Pi から(通常の Linux でも同じです)Ubuntu Core にログインできます。

image

Tera Term でログインする

では、Windows の環境から Tera Term を使って Ubuntu Core にログインしてみましょう。Raspberry Pi 上の .ssh/id_rsa と .ssh/id_rsa.pub を Windows 上の何処かにコピーします。github などで既に、id_rsa を作っている場合は、それを使ってもよいでしょう。

SSH 認証で、「RSA~鍵を使う」を選択して、id_rsa ファイルを指定します。ユーザー名には、Ubuntu SSO のログイン名を入れ、パスフレーズは、id_rsa のパスフレーズを入れます。ややこしいですね。

image

うまくつながると、↓のようにログインができます。

image

WinSCP でファイル転送する

Windows からファイル転送ができるように WinSCP の設定もしておきます。

転送プロトコルで「SCP」を選択して、ユーザー名に Ubuntu SSO のアカウント名を入れます。

image

設定ボタンをクリックして、SSH → 認証で、秘密鍵を指定します。

image

秘密キーのパスフレーズは、接続時に要求されるので入力します。このパスフレーズは保存できないようです。

image

うまくつながると、下記のようにファイル転送が SSH 経由できるようになります。

image

ホスト名の変更と avahi-daemon のインストール

ubuntu core のホスト名は、初期値が localhost になっているので、これを変更します。ホスト名を「raspicore」にするときは、以下のように実行。

sudo hostnamectl set-hostname raspicore

あと、windows からホスト名 raspicore.local でアクセスできるように avahi-daemon も入れておきます。

snap install avahi

でインストールができます。

インストールしたパッケージは snap list で確認ができます。

image

snap 自体は、Unbutu mata でも使えるので、このあたりは普通に使えるのかなと。snapcraft で自前のパッケージも作れます。

と言う訳で Raspberry Pi 上で ubuntu core が動き出したので、お次は GPIO 廻りをどう弄るのか?を調べていきましょう。

カテゴリー: 開発, RaspberryPi | ラズパイでUbuntu Core を試してみよう(前編) はコメントを受け付けていません

Live2D Viewer でデスクトップマスコットを表示してみよう

スマホでゲームをしていると、Live2D で二次元キャラが動くものがあります。

マギアレコード 魔法少女まどかマギカ外伝
https://play.google.com/store/apps/details?id=com.aniplex.magireco

なんてのは、各キャラが動いていますね。ってことで、この Live2D のデータはゲームに使われるだけじゃなくて、そのまま PC のデスクトップマスコットにできます。

Live2D Viewer
http://www.live2d.com/ja/download

image

元々、ビューアがあるのは知っていたのだけど、そのまま背景を透明にすれば、デスクトップマスコットになるんですね。こんな風に Amazon Prime を見ながら、マスコットが楽しめます…というか、子供には邪魔じゃないかと言われたのですが、まあ、これはこれでいいのです。

image

Liver2D Viewer は Adobe Air で動きます。インストールした後に、モデルデータ(*.moc)をドロップして、「キャンパスウィンドウの表示」のチェックを外します。余分な腕のデータとかは「パーツの表示」で適宜外します。

image

そのままだと、マウスを追うだけで詰まらないので「プロジェクト」→「サンプル」→「モーション:アイドリング」をいれると、少し揺れるような感じのモーションが付きます。たぶん、特定のキーか何らかのイベントでモーションを動かすこともできるでしょう。そのあたりは、少し探してみようかなと。FaceRig で連携するのもそれかと。

Live2D は当然 Android でも動作するので、真面目にポーティングすると Xamarin.Android で使えるようになるかなと。たぶん *.jar のバインディングあたりで。WebView ではなんとか動く模様 https://docs.com/user469647/7372/xamarin-de-live2d

カテゴリー: 開発 | Live2D Viewer でデスクトップマスコットを表示してみよう はコメントを受け付けていません

続 .NET Standard とは何か?

.NET Standard とは何か? | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8218

の続編です。1年前位に、.NET Standard が発表されて、その後どうなるのかと思いつつ、.NET Core 2.0 のプレビュー版が出てきて、最近 Rasbian 上で .NET Core 2.0 を動かしてみて分かったことをいくつかまとめます。

PLCは最小公倍数で、.NET Standardは最大公約数だ

せまっ苦しいPCL(Potable Class Library)では、なかなか大変なことになっているので、いっそのこと、.NET Framework、.NET Core、UWP な .NET Runtime を大まかに含めてしまったのが「.NET Standard」であるというのは、概ね合っています。完全に包括しているわけではない(たまに、.NET Frameworkで含まれているクラスが .NET Standard に含まれていないので)のですが、概ね含まれています。

大まかに.NETの動作環境を考えると、

  • .NET Framework は、Windows の Desktop で動く
  • .NET Core は、Linux で動く
  • .NET の Runtime は、UWP(Windowsストア)な環境で動く
  • .NET の Runtime は、Windows Mobile で動く

更に、

  • Mono が Linux 上で動く。
  • Mono が、macOS 上で動く。
  • Xamarin.MAc が macOS 上で動く。
  • Xamarin.Android(MonoDroid)が、Android 上で動く。
  • Xamarin.iOS(MonoTouch)が、iOS 上で動く。

という現状があります。Xmarinな環境はベースがMonoなので、Android/iOSに限らずLinuxやmacOSでも動作する点で範囲が広いわけですが、いざ、Winodwsも含めて共通ライブラリを作るとPLC Hellに陥ります。結局のところ、最小公倍数なクラス群をまとめる形になるので、せまっ苦しくなります。

実は、.NET Standardが最大公約数的とはいえ、Windowsのデスクトップ環境(WindowsフォームやWPFとか)は入っていないし、逆にXamarin.Macで使われるようなCocoaな機能は入っていません。なので、主に非グラフィックな機能を集めることになります。一方で、Xamarin.Formsが、iOS/Android/UWPをカバーし始め、Windows(.NET Framework)のWPF/UWPと括弧付きですがSilverlightを含めて、「XAML Standard」という発想が出てくるのは無理からぬことです。が、まあそれはさておき。

じゃあ、なんとなくですが、PCLよりも広い感じで使える.NET Standardということで、どんな風に使うのか?というのを具体的に考えます。

Rasbianで.NET Core 2.0を動かしてみる

.NET Core 2.0 から実行環境にRaspberry PiのARMv7/8な環境がサポートされるようなりました。もともと、RasbianではMonoが動くのですから、.NET Coreが動かないというのも変な形なのですが、まあ動かなかった訳です。で、現時点ではビルドはできないけれども(つまりコンパイラが動かないとうこと…なのか)、実行だけはできる環境が整いました。

さて、ラズパイ上でGPIOを制御する(Lチカする)ことなるので、ハードウェアを触るとここは RaspberryPi.Net を使いました(Raspberry#IOのほうが有名なのですが、これがどうも動かないもので)。さらに、ハードウェアそのものを動かすために bcm2835 といチップを操作する C言語のライブラリを扱います。つまり、次の3つの部分に分かれるわけです。

  • メインのプログラム(C#)
  • RaspberryPi.Netクラスライブラリ(C#)
  • bcm2835ライブラリ(C言語)

bcm2835ライブラリは、C言語で書かれているのでRaspberry Piべったりの制御ということが分かるので、当然ながら他のマシンとの互換性はありません。
メインのプログラムとRaspberryPi.NetクラスライブラリはC#で書かれているので、先に書いたような色々な.NETな実行環境で動かすことが可能です(実際のところ、GPIO制御が入るので、ラズパイ上でしか動かないのですが)。

最初に考えるのは、ラズパイ上なので、この2つをMonoでビルドすることです。Monoはラズパイ上で動いているので、そのまま動きますよね。

次に考えたのは、せっかく .NET Core 2.0 がラズパイ上で動くようになったので、メインのプログラムとRaspberryPi.Netクラスライブラリの両方を .NET Core 2.0 でビルドし直すということです。
この環境で動かすこともできるようになりました。

ふと、じゃあ .NET Standard 2.0(.NET Core 2.0をサポートしているので)を含めるとどうなるのだろうか?ということを考えてみると、

  • メインのプログラム(C#) → .NET Core 2.0
  • RaspberryPi.Netクラスライブラリ(C#)→ .NET Standard 2.0
  • bcm2835ライブラリ(C言語)

という組み合わせが考えられます。
RaspberryPi.Netクラスライブラリは汎用的に(その他のAndroidやiOSなど…GPIOを使えないけど)使うことを考えて .NET Standard でビルドをしておき、そのライブラリをメインの .NET Core で作った実行ファイル(Rasbian上なので拡張子はexeではありませんが)で利用します。

実際、この組み合わせで動作を確認しています。
これで、なんとなくわかると思いますが、

  • 最終的な実行部分(メインプログラム)は、各OSに即した.NET環境を使う
  • 中間のライブラリは一括して.NET Standardで作る。
  • 個別の制御はC言語や即した.NET環境を使う

という作り分けになるでしょう。

中間のライブラリを片っ端から.NET Standardにする

発想的には、こんな風に.NET Standardがサンドイッチ状態になります。

実際にはフロントが要らない場合もあるし、その環境でしか動かさないのであれば無理に.NET Standarでビルドをする必要はないのですが、中間の部分を.NET Standardでビルドをしておいて、NuGetのようにダウンロードできるようにしておけば、全ての.NET実行環境で使えることになるでしょう。

.NET Standardなライブラリの作り方

Visual Studio 2017 Update3プレビュー版では、.NET Standard 2.0 が使えます。プロジェクトのテンプレートを見ると非常に簡単で「クラスライブラリ」しかありません。

理由は簡単です。先に書いた通り、フロントUIでもないし、個別のハードウェア寄りでもない中間層を受け持つので「クラスライブラリ」だけで十分なのです。

既存のプロジェクトを.NET Standardに変えたい場合は、*.csporj を開いて、以下のように変更するだけです。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

コンパイル対象のファイルは、フォルダー内のC#の全てのファイルが自動的に対象になります。少々乱暴な気がしますが、プロジェクトの設定が非常に簡単になっています。

そんな訳で、これを踏まえて Rasbian + .NET Core/Standard の組み合わせを後日考察。

カテゴリー: 開発 | 続 .NET Standard とは何か? はコメントを受け付けていません

俺のラズパイ2で.NET Core 2.0なF#が動いたよ

俺のラズパイ2で.NET Core 2.0が動くまで | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8732

では C# が動いたので、今度は F# で試してみましょう。
手順は、C# の時と一緒で、

  1. Raspberry Pi2/3でRasbianを用意する。
  2. PC上で、.NET Coreのプログラムを作る。
  3. PCからRaspberry Piにデプロイする(アセンブリをコピーする)

すれば ok です。コードが F# なので、デプロイするアセンブリに「FSharp.Core.dll」が含まれていれば、ああ F# で動いているね、ということになります。

F#なコンソールアプリを作る

プログラム言語を -lang で指定して、コンソールアプリを作ります。

dotnet new console -n hellofs -lang F#

できあがったコードは、こんな感じ。皆さん、見慣れた F# なコードですよね :)

// Learn more about F# at http://fsharp.org
open System
[<EntryPoint>]
let main argv =
    printfn &quot;Hello World from F#!&quot;
    0 // return an integer exit code

[/code]

ビルドする

ビルドは、C# と同じです。ARM 用に -r linux-arm のスイッチを付けて publish します。

dotnet build
dotnet publish -r linux-arm

転送する

ビルドができたら、WinSCP を使って publish フォルダ―を転送します。

この部分は、適当なバッチを作っておきたいところですね。

実行フラグを付ける

Tera term で Raspbian に接続して、chmod +x して実行権限を付けます。

chmod +x hellofs
./hellfs

いよいよ asp.net mvc code + F# ができるのか?

と思いきや、ビルド時にエラーがでています。

どうも Razor のコード出力あたりでエラーになっていますね。この部分、通常の ubuntu でやってもエラーになるので、普通に不具合じゃないかなと。プレビュー版だし。
確か、1.1 の時は mvc にしても linux 上(Raspberry Pi上じゃなくて、x64のUnbuntu上)
で動いたはずなので、いずれ直ると思います。

dotnet new webapi のほうは、linux-arm でも動くので、これは後で試します。次は、せっかくなので GPIO を使って .net core 2.0 + Lチカの巻へ。

 

カテゴリー: 開発, F#, RaspberryPi | 俺のラズパイ2で.NET Core 2.0なF#が動いたよ はコメントを受け付けていません

俺のラズパイ2で.NET Core 2.0が動くまで

俺のラズパイ3で.NET CoreなF#が動かないわけがない | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8028

の記事が去年の8月末で、あれからほぼ1年が経ちました。経っているうちに、.NET Coreが2.0のプレビュー版になって、.NET Coreが動くようになりましたよ、という話。

core/roadmap.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/roadmap.md#technology-roadmaps
Running a .NET Core 2 app on Raspbian Jessie, and deploying to the Pi with Cake | Jeremy Lindsay
https://jeremylindsayni.wordpress.com/2017/07/23/running-a-net-core-2-app-on-raspbian-jessie-and-deploying-to-the-pi-with-cake/
core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md
<b>C#</b>RaspberryPi 3に.NET Coreを入れてHello World! – Qiita
http://qiita.com/logikuma/items/de8c987dc2308a96256d

.NET Core 1.0 ではいつの間にか消えてしまった Raspberry Pi のサポートですが、.NET 2.0 になって復活していました。

動作環境

  • Raspberry Pi2と3の Rasbian/Ubuntu の環境で動く。
  • Raspberry Pi Zero では動かない。
  • Raspberry Pi 上ではビルドができない。
  • なので、WindowsやLinux上でビルドして、Raspberry Pi へデプロイする。

つまり、実行環境としての.NET Core関連のアセンブリをラズパイへ入れ込めば動作する。ビルドする場合は、別のPC/Linux/Macが必要、という訳。Zeroで動かないのは、.NET Coreの動作対象が armv7とarmv8 となっているためで、zero が使っている arm32 は対象になっていない、ということです。
となると、armv7/8 の cpu を使っている arm 関係の組み込みボードでもいけそうでは?という予想が立つので、おそらく nano pi あたりでも動くはずです。

Rasbian Pi上で動かす

現状では、.NET Coreのランタイムが

  • Rasbian(Raspberry Pi標準のOS)
  • Ubuntu
  • Windows IoT Core

上で動きます。Rasbianで動かすときは、Scratchとの連携とかnode.jsの代わりとか色々できそうです。Ubuntuは低電力の常時Webサーバーというのもありで、ちょっとしたサーバー機として使えます。Windows IoT Coreの場合は、モニタ絡みで先行きはUWP on .NET Standardな環境かなと思ったり。
自前ビルド環境がないのが辛いところですが(Rasbian/Ubuntuという開発環境なのに)、別途、.NET Core対応なコンパイラとかスクリプトを作れば、それはRaspberry Pi上でもするっと動くようになるのかなと思ったり、まあ、そういうときはmonoを使えばいい訳ですが。

さて、.NET Coreのランタイムかつアセンブリ(各種のDLLファイル)は、実行環境に何かのインストールをする必要はありません。すべて、ビルドするときのアセンブリで完結しています。ということは、Raspberry Pi 上でセルフビルドができないのですから、そもそも、何らかの.NET関係のアセンブリをインストールしておく必要はありません。

ということで、手順は簡単で、

  1. Raspberry Pi2/3でRasbianを用意する。
  2. PC上で、.NET Coreのプログラムを作る。
  3. PCからRaspberry Piにデプロイする(アセンブリをコピーする)

だけで十分です。

PC上で hello フォルダーを作成して dotnet new console します。

mkdir hello
cd hello
dotnet new console

あるいは

dotnet new console -n hello

Raspberry Pi のデプロイするために dotnet publish -r linux-arm します。

dotent build
dotnet publish -r linx-arm

ここで一度 build していますが、Raspberry Pi に転送するだけならば、publish だけで十分かもしれません。

hello/bin/Debug/netcoreapp2.0/linux-arm/publish の中身に hello を含む .NET Core 2.0 用のアセンブリがごっそり作られます。

publish フォルダの中身を、WinSCP などで Raspberry Pi に転送します。

Tera Term などで Raspberry Pi に繋ぎ、転送した publish フォルダにある hello だけに実行権限を付けます。

mv publish hello
chmod +x hello/hello

アセンブリに実行権限を付ける訳です。

後は、普通に hello を動かせば動作できます。

./hello

※ラズパイ上の dotnet コマンドはバージョンしか出さないので、おそらく dotnet-runtime-latest-linux-arm.tar.gz をダウンロード&展開する必要はないハズです。
※実行権限を chmode 775 -R すると全てのアセンブリに設定してしまうので、ピンポイントで chmod +x しています。

追記 2017/07/31

arm 上の dotnet コマンドですが、pc/linux にあるような dotnet run コマンドがありません…が、アセンブリを実行するために、dotnet ./hello.dll ってのができますね。なるほど。以下な感じで最新版を取ってきて、展開して使えます。

wget https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tar.gz
mkdir /opt/dotnet
tar -xvf dotnet-runtime-latest-linux-arm.tar.gz -C /opt/dotnet
ln -s /opt/dotnet/dotnet /usr/local/bin/dotnet

のように /usr/local/bin/dotnet で動作できるようにしておいて

dotnet ./hello.dll

で実行します。PC/linux のほうにもこの機能はある。

このあたり、英語のブログ記事も錯綜している感じがするので、元ネタの

core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md

を参照するとよいでしょう。

Ubuntu上で動かす

Ubuntu 上で動かすときも基本は Rasbian と変わりません。
ただし、素の Ubuntu の場合、開発的なライブラリが少し足りないので apt-get で追加しておきます。

core/prereqs.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/Documentation/prereqs.md

にあるライブラリを以下で追加します。

sudo apt-get install libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libcurl4-openssl-dev libssl-dev uuid-dev unzip

これで、さっき dotnet publish -r linux-arm で作ったアセンブリを ubuntu のほうにコピーすると同じように動作します。

IoTのテンプレートを使う。

ここでは console のテンプレートを使った訳ですが、実は dotnet new –list すると、console 以外のテンプレートも使えることが分かります。

aps.net mvc の場合は dotnet new mvc とかのアレのやつですね。
ここに coreiot というテンプレートがあって、

dotnet new -i RaspberryPi.Template::*

とするとインストールができます(既に .net core 2.0 の dotnet コマンドに付いるかもしれません)。
このテンプレートを使って、

dotnet new coreiot -n helloiot

とした後で、vscode を開くと build.cake にビルドからデプロイまでを含めたCake(C# の makefile)を作ってくれます。

ビルド用の ps スクリプトを,

Invoke-WebRequest http://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1

でダウンロードして動かすと、pscp まで使ったデプロイまで一気にやってくれるはずなんですけどね…どうも PscpSettings の設定がうまくできていないらしく、うまく動いていません。

Cake – Home
http://cakebuild.net/

後でここは調べておきましょう。

そんな訳で

セルフビルドはできませんが、これで Rasberry Pi 2/3 上で .NET Core 2.0 が動作することが確認できました。これで何がやりたいかというと、F#でWeb APIが作りたいわけで、mono で作ってもよいのですが、どうせならば .net core + asp.net mvc core の組み合わせでやりたいのです。なんせ、PCよりも断然低電力なので常時立ち上げておいてもよいし、AzureやAWSよりもネットワーク的に近い位置に作れるから、これはこれで使い勝手がいいかなと。
と言う訳で、F#でのお試しは引き続き。

カテゴリー: 開発, RaspberryPi | 俺のラズパイ2で.NET Core 2.0が動くまで はコメントを受け付けていません

iOSから自己署名証明書で接続することができないので、Let’s Encryptの証明書を使う

iPhone(iOS 10以降)でUIWebViewを使って https 通信をするときに自己署名証明書を使っている場合、どうやっても接続ができなかった。

現状

色々調べたのだが、

ServicePointManager.ServerCertificateValidationCallback を使って、SSL証明書のエラーを回避する → そもそもここが呼ばれない。
Info.plist に NSExceptionDomainsとNSExceptionAllowsInsecureHTTPLoadsを追加して例外扱いにする → NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) のエラーになる。
非推奨の allowsAnyHTTPSCertificateForHost をオーバーライドして、ture を返す → そもそも、ここが呼ばれない。

自己証明書を使用しているサーバにHttpClientで接続 言語: C#
https://code.msdn.microsoft.com/windowsdesktop/HttpClient-fc321142
xcodeにてApp Transport Security(ATS)除外のドメインを複数設定する – Qiita
http://qiita.com/BurialMound/items/87b8c33e2c7ad767c9dc
SwiftでHTTPS通信時に自己認証証明書の警告によるエラーを無視させる – Steel Dragon 14106
http://raimon49.github.io/2015/05/27/ignore-verify-self-signed-certificate.html

ちなみに、WebView じゃなくて HttpClient とか NSURLSesstion の場合はうまく動いたりするので、WebView 固有の問題かもしれない。

最終的には、Xamarin.Forms を使うわけだが、その前段階として Xamarin.iOS と Swift で調査をしている。
「動いた」というページもあるのだが、

  • 「動いた」という記事自体が少し古い
  • 実機で動いても iOS シミュレータはだめっぽい、という記事がある。
  • Info.plist に IP を書いた場合は動かない。ドメイン名が必要。

とあるので、ここは最初に戻って、自己署名証明書じゃない正式な証明書を使うことを検討する。

ちなみに自己署名証明書は、↓を参考にすればok。

自己署名証明書の作成方法 – Qiita
http://qiita.com/akito1986/items/8eb41f5a43bb9421ae79

検証環境自体が、

  • HTTPS のサーバーは、外から見えない(検証機なので)
  • HTTPS のサーバーはドメインを持っていない(内部IPだけなので)
  • iOSシミュレーターでも確認したい。

という所謂、検証環境を想定しいている。

証明書を作る

証明書を作るのには、Let’s Encrypt が無償で使える。

Let’s Encrypt 総合ポータル
https://letsencrypt.jp/

適当なサーバーやクライアントの環境(Linuxかmacに限る)があれば、certbot コマンドで正式な証明書を作ることができる。この証明書は、そのまま外部のWebサーバーに載せることもできる、今回のような検証機に載せることもできる。

Let’s Encryptを使うときの制限は、

  • 証明書を発行するときに、ドメインを持ち外部公開されているサーバーが必要
  • 証明書の期限は3か月に制限されている

となる。外部に公開されているサーバーに証明書をおき、certbot を定期的に動作させて3か月の証明書期間を更新する仕組みなっている。
ただし、手動(manual)で証明書を取得する仕組みも用意されているので、必ずしも自動更新しなければいけない訳ではない。

問題は、「外部公開されているドメイン」が必要なところで、今回のように社内に検証機があって外部から見えないようになっている、グローバルIPを持っていない、ような場合には使えるのか?という疑問がある。なので、いきおい自己署名書になるわけだが、大丈夫、少しトリックを使うと使えるようになる。

実は、

  • Let’s Encrypt から見えるサーバー
  • 実際に証明書を使うサーバー

が同一である必要はない。Let’s Encrypt は、証明書を発行するときにレスポンスファイルを外部サーバーに置くことになるが、これは実際に証明書を使うサーバーとは異なっていても良いのだ。つまり証明書の servername だけ合わせておけばよいということになる。

証明書を作成する手順

Let’s EncryptでManual発行してみました | ぽちゃ猫.com
https://www.pochaneko.com/ietsencrypt-man/

を参考にしながら、certbot をインストールする。今回は mac 上でやっている。

1.仮アクセスできる外部サーバーを用意する。捨てドメイン名になるので ssl.moonmile.net のようにサブドメインを使うのが吉
2.sudo certbot certonly –manual で起動する
3.証明書に書き込むドメイン ssl.moonmile.net など を入れる

4.アクセスチェックのファイルが表示されるので、このファイルを先の外部サーバー ssl.moonmile.net に置く。
5.無事、証明書ができると /etc/letsencrypt/live に置かれる。

-rw-r--r--  1 root  wheel  543  7 23 18:38 README
lrwxr-xr-x  1 root  wheel   36  7 23 18:38 cert.pem -&amp;gt; ../../archive/moonmile.net/cert1.pem
lrwxr-xr-x  1 root  wheel   37  7 23 18:38 chain.pem -&amp;gt; ../../archive/moonmile.net/chain1.pem
lrwxr-xr-x  1 root  wheel   41  7 23 18:38 fullchain.pem -&amp;gt; ../../archive/moonmile.net/fullchain1.pem
lrwxr-xr-x  1 root  wheel   39  7 23 18:38 privkey.pem -&amp;gt; ../../archive/moonmile.net/privkey1.pem

6.シンボリックリンクされているので、本体をコピーする。

privkey.pem が秘密キー
cert.pem が証明書

7.検証機の WEB サーバー(今回は xamp)の C:/xampp/apache/conf/ に証明書を配置する

ssl.key に privkey.pem
ssl.crt に cert.pem

8.config/extra/httpd-ssl.conf に以下を追加する。ssl を有効にすることを忘れずに。

<VirtualHost *:443>
    DocumentRoot &quot;C:/xampp/htdocs&quot;
    ServerName ssl.moonmile.net
    SSLEngine on
    SSLCertificateFile &quot;conf/ssl.crt/cert.pem&quot;
    SSLCertificateKeyFile &quot;conf/ssl.key/privkey.pem&quot;
</VirtualHost>

これで HTTPS サーバーの準備が完了

9.iOSシミュレーターを動かす mac の /etc/hosts に ssl.moonmile.net を追加する。

172.16.0.12 ssl.moonmile.net

な風に追加する。「172.16.0.12」は検証サーバー機のIPアドレス。
iOSシミュレーターは、ホストの mac の /etc/hosts を共有しているようで、これで度命名「ssl.moonmile.net」でアクセスできます。

実行してみる

xcode で UIWebView を使って表示させてみると、

@IBAction func clickConnet(_ sender: Any) {
    let url = URL(string: "https://ssl.moonmile.net/")
    let req = URLRequest(url: url!)
    web.loadRequest(req)
}

こんな風に、https 接続して xamp トップページが表示される。当然、「nscurl –ats-diagnostics 」もさっくりと PASS する。

これは、info.plist の変更なしでいける…のがちょっと不思議なんだけど、何も設定しないから、そのままで審査が通るってことでしょう。

おまけ

ちなみに、UIWebView 限定なのであれこれやったが、SFSafariViewController を使うと自己署名証明書でもスルーしてくれる。通常のブラウザと同じように、自己署名だからという警告が1回だけ出るが、その後はキャッシュされるらしく警告がでなくなる。

ATS対策 外部ページの表示にはSFSafariViewController – Qiita
http://qiita.com/bird_tomita/items/2139d2b95c35a4e7d20f

なんか、適当な https を表示するだけだったら、こっちのほうが手軽でよいかも、ということで。

カテゴリー: 開発, Xamarin, iOS | iOSから自己署名証明書で接続することができないので、Let’s Encryptの証明書を使う はコメントを受け付けていません