Storage Container を削除できない

Azure で VM の削除の順番によっては、ストレージに対するリースが残ったままになって消せなくなってしまう。 中に入っている VHDHow to break the locked lease of blob storage in Microsoft Azure (PowerShell) で消すことができる(これも大概変な動きするけど…)。

しかしながら、VHD を入れていた Storage Container のリースが解除されない。しかも当該のリースを break する APISDK に入っていなさそうだった。

そこで、Azure SDK for Ruby をインストールしたマシンで、irb を使って以下のように対応した。

$ irb 
irb> require 'azure'
irb> Azure.config.storage_account_name = "<<storage_account_name>>"
irb> Azure.config.storage_access_key = "<<storage_access_key>>"
irb> azure_blob_service = Azure::Blob::BlobService.new
irb> headers = azure_blob_service.service_properties_headers
irb> headers['x-ms-lease-action'] = 'break'
irb> url = "https://<<storage_account_name>>.blob.core.windows.net/<<storage_container_name>>?comp=lease&restype=container"
irb> r = azure_blob_service.call(:put, url, headers)

これで Storage Container も消せるはず。

新しくなったObjective SharpieでCocoaPodsのバインディングライブラリを作る

この記事はXamarin Advent Calendar 2015の7日目の記事です。

Xamarin.iOSCocoa バインディングライブラリを作る際、Objective Sharpieというツールを使いますが、このツールは対象となるライブラリのヘッダファイルを自分で読み込ませた上で、Xcodeを使って.aをビルドして…等、各種ツールを使った手間がありました。

Objective Sharpieを使いたい場面というのは、だいたいは CocoaPods を使うときでしょう。CocoaPods には様々なライブラリが揃っており、特に UI 周りのライブラリは Xamarin を使った開発でも Xcode を使った開発同様にとても有用です。

11月にリリースされた、Objective Sharpie 3.0 には CocoaPods のネイティブバインディングを簡単に生成する機能が追加されました。これを使ってバインディングライブラリを作成する方法を紹介します。

Objective Sharpie のダウンロード

Objective Sharpie は Xamarin のドキュメントページ からダウンロードできます。

ただし、すでに Objective Sharpie をダウンロードしたことのある方は、sharpie updateを実行するだけで更新することができます。

Objective Sharpie を使った CocoaPods バインディング

まず、CocoaPodsCocoaControlsで使いたいライブラリの名前を探しましょう。今回は MBProgressHUD をバインディングしてみます。

まずは適当にフォルダを作りましょう。

$ mkdir MBProgressHUD
$ cd MBProgressHUD

使用できるSDK を確認します。だいたいの場合は最新の iphoneos を使えば良いでしょう。

$ sharpie xcode -sdks
sdk: appletvos9.0    arch: arm64   
sdk: iphoneos9.1     arch: arm64   armv7   
sdk: iphoneos9.0     arch: arm64   armv7   
sdk: iphoneos8.4     arch: arm64   armv7   
sdk: macosx10.11     arch: x86_64  i386    
sdk: macosx10.10     arch: x86_64  i386    
sdk: watchos2.0      arch: armv7  

では、ライブラリのプロジェクトを生成します。sharpie pod initを使います。最初は CocoaPods のマスターリポジトリを取得するため時間がかかります。

$ sharpie pod init iphoneos9.1 MBProgressHUD
** Setting up CocoaPods master repo ...
   (this may take a while the first time)
Setting up CocoaPods master repo
-- このあたりに Master repo の取得状態が出る --
Setup completed
** Searching for requested CocoaPods ...
** Working directory: 
**   - Writing Podfile ...
**   - Installing CocoaPods ...
**     (running `pod install --no-integrate --no-repo-update`)
Analyzing dependencies
Downloading dependencies
Installing MBProgressHUD (0.9.1)
Generating Pods project
Sending stats
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
** 🍻  Success! You can now use other `sharpie pod` commands.

Podfile と Pods ディレクトリができます。

f:id:iseebi:20151207024856p:plain

もし、Deployment Target を下げたライブラリが必要であれば、ここで、Pods/Pods.xcodeproj を開き、Deployment Target を下げておきます。

f:id:iseebi:20151207024930p:plain

Deployment Targets を下げるなど、ビルドの準備ができたらsharpie pod bindコマンドを実行します。

$ sharpie pod bind
User defaults from command line:
    IDEDerivedDataPathOverride = /Users/ito/Working/MBProgressHUD/Pods/sharpie-build

=== BUILD TARGET MBProgressHUD OF PROJECT Pods WITH CONFIGURATION Release ===

-- 長々と xcodebuild のログが出ます --

** BUILD SUCCEEDED **

Starting project evaluation for target: 'Pods', configuration: 'Release'
    Computing dependencies
    Target MBProgressHUD (FE2F1D7B9D9FCEA148517E4657B243F4):
        Phase PBXSourcesBuildPhase
        Phase PBXFrameworksBuildPhase
        Phase PBXHeadersBuildPhase
    Target Pods (CA6B6247C232863826EA479E552E6B28):
        Phase PBXSourcesBuildPhase
        Phase PBXFrameworksBuildPhase
Parsing 1 header files...

Binding...
  [write] ApiDefinitions.cs
  [write] StructsAndEnums.cs

Binding Analysis:
  Automated binding is complete, but there are a few APIs which have been flagged with [Verify] attributes. While the entire binding should be audited for best API design practices, look more closely at APIs with the following Verify attribute
  hints:

  StronglyTypedNSArray (1 instance):
    A native NSArray* was bound as NSObject[]. It might be possible to more strongly type the array in the binding based on expectations set through API documentation (e.g. comments in the header file) or by examining the array contents through
    testing. For example, an NSArray* containing only NSNumber* instances can be bound as NSNumber[] instead of NSObject[].

  Once you have verified a Verify attribute, you should remove it from the binding source code. The presence of Verify attributes intentionally cause build failures.
  
  For more information about the Verify attribute hints above, consult the Objective Sharpie documentation by running 'sharpie docs' or visiting the following URL:

    http://xmn.io/sharpie-docs

Submitting usage data to Xamarin...
  Submitted - thank you for helping to improve Objective Sharpie!

Done.

ビルドした結果、build/Release-iphoneos/lib*.a に必要なファイルが作られます。また、Objective Sharpieの定義変換結果もあわせて出力されます。あとはこれらのファイルを使ってバインディングライブラリプロジェクトを用意すれば OK です。

f:id:iseebi:20151207024947p:plain

ここまでやってくれるんだったら、csprojの生成までやってくれたらよかったのに!としか思えないのですが、これだけでもバインディングの手間がかなり省けると思います。Xamarin.iOS 開発のお供にぜひ活用してみてください。

MvvmCross 4.0 beta について

いま、MvvmCross は 4.0 リリースに向けてβ版のリリースが続いています。

最近のウォッチしてる様子をご紹介します。

MvvmCross 4.0

公式の受け売りですが、だいたいこんな感じのようです。

  • Universal Windows Platform 対応
  • NuGet パッケージの Visual Studio 2015 対応
  • Xamarin.Forms サポート (のサンプルプロジェクトが公式化した)
  • Fragments のバックスタックハンドリング (Fragment 使ってるときに戻れるようになった)
  • テキストフォーカスにバインディングできるようになった
  • Roslyn Analyzer が追加されて VS2015 ではクイックフィックスみたいなのが出るようになった。
    • まだ 1 つしか指摘してくれないみたいだけどそのうち色々追加されてくるはず。
  • MvxPageViewController UIPageViewController の MvvmCross 版で、IMvxPageViewModel を実装すると各ページの ViewModel を返せるようになる。
    • iOS のことしか考えられてない系の実装になっており、使う前に要検討かも。

その他いろいろ変更が入っています。その他のあたりは マイルストーン4.0のPR みるといいかも。

Android のプロジェクトで "No more copying MvxAttributes.xml on Android" とか書いてあったので、もしかしたらプロジェクトの作り方も変わるかも。かも、というのは Xamarin Studio (Mac) でまだプレリリース版 NuGet パッケージのインストールがうまくいったことがないからです。

リポジトリが分かれた

今まで MvvmCross は Github の MvvmCross/MvvmCross に全部入っていましたが、以下のように分かれました。

  • MvvmCross/MvvmCross
    • ライブラリ本体
  • MvvmCross/MvvmCross-AndroidSupport
  • MvvmCross/MvvmCross-Plugins
  • MvvmCross/MvvmCross-Forms
    • '''Xamarin.Forms サポート'''。Xamarin.Froms で動作するときのための Presenter など。
  • MvvmCross/MvvmCross-Samples
    • もろもろサンプル。Contribution よろしくみたいな感じになってるみたいなので、ちっさいサンプルアプリとか作ったら送ってみるといいかも。

巨大になってたので当然の分割という感じでしょうか。

公式サイトができた

公式のニュースページができました。最新の概要情報はこのページだけでざっくりわかるようになりました。

mvvmcross.com

関西モバイルアプリ研究会 #5 で発表しました。 #関モバ

去る8月26日に行われた関西モバイルアプリ研究会#5で発表してきました。

同僚が RoboVM やると公言していたので、ちょうど似たようなのぶつけたら面白いんじゃないかなと思って最近やってた J2ObjC の話をしました。もう完全に世の中は Swift なのに Objective-C の発表で大変申し訳ありませんでした。*1

speakerdeck.com

そういえば Xamarin 以外のネタでしゃべったの久しぶりでしたね。

*1:しかも Android 枠だったはずなのに思った以上にAndroid感が出なかった

C#エンジニア養成読本 で記事を書きました

お知らせです。C#エンジニア養成読本 というムック本でちょっとした記事を書かせていただきました。

僕のパートはXamarinとかGadgeteerとか、WindowsやWeb以外のところで動くC#みたいな話を書かせていただきました。興味のある方はお手にとっていただけますと幸いでございます。

紙の本はこちらから。

C#エンジニア養成読本 (Software Design plus)

C#エンジニア養成読本 (Software Design plus)

Kindle版もあります。部屋に物を増やしたくない方はこちらをどうぞ。他の電子書籍サイトでも取り扱いあるそうです。

C#エンジニア養成読本

C#エンジニア養成読本

PDF欲しい方は出版社の電子書籍サイトから買えるみたいです。

gihyo.jp

ANAアプリが羽田空港でiBeacon使うようになったのでビーコンの位置を特定してきた

ANAアプリがこのたびのアップデートで、羽田空港内でのiBeaconガイダンスを追加しました。

ANA

ANA

  • ANA (All Nippon Airways)
  • 旅行
  • 無料

よく知らない人のために言っておくと、羽田空港第2ビルはANA専用みたいになってるんですが、乗る飛行機の出発ゲートによって通るべき手荷物検査場が違うのです*1。なので、以前からANAアプリはジオフェンスで羽田空港の圏内に入ったら行くべき手荷物検査場を案内するLocal Notificationを出したりしていました。今回はこの案内をさらにわかりやすくするためにiBeaconを使ったサービスを開始したということらしいです。

iBeaconは仕様が決まっているので、スキャンしたり強度を調べることでどこにあるか位置を特定することができます。ちょうどこのアップデートが降ってきた直後に羽田空港に行く用事があったので、ビーコンを探してきました。

iBeacon のしくみ

実際の話の前に、iBeaconのしくみをおさらいしておきましょう。

*1:正確にはどこから入ってもOKだけど、推奨じゃないところから入るとすごく歩かないといけなくなる

続きを読む