AWS SES+Lambda で作る、ドメインまるっとメール転送

僕は各種サービスに登録するメールアドレスを基本的に Gmail(旧 Google Apps) のエイリアスですべて変えているのですが、困ったことにエイリアスマッピング指定に使う + がはじかれるサービスがとにかく多くて困っています。

f:id:iseebi:20160505123607p:plain
▲正しく入力しているのに「正しく入力してください」と出て、そのたびにイライラしてしまいます。

また、登録上は通るけど、実際に使おうとすると不具合が起こるサービスもあります。*1

いままでは、その度に Google Apps の管理コンソールに行ってエイリアスを登録してきたのですが、アカウントに登録できるエイリアスの上限に行ってしまい、グループを作ってそこにエイリアスを追加していく羽目にもなっています。

スマートフォン上で登録したいタイミングも結構出てきたりして、そろそろ実用上耐えられないなと思っていたところ、AWS の SES が送信だけでなく受信もでき、Lambda でメールを処理させることができるということを最近知りました。

今回やりたかったのは、アカウント名を無視して、サブドメイン部分をアカウントとして転送する、つまりこういう形にしたかったのです。

any@hoge.mail.example.com → hoge@example.com

AWS Lambda SES Email Forwarder というものもあり、簡単に設定できそうだったので試してみました。

設定方法

今回は、us-west-2 (オレゴン) リージョンに設定してみました。

*1:FM802 RADIPASS などは、アカウントの登録は + が通るが、実際のアンケートフォームが + を通さないのでいちいち変更しないといけない。

続きを読む

Xamarin 用の Injection フレームワーク Saitama を使ってみた

NuGet のフィードを眺めていたら、Saitama.Android というフレームワークが更新されたという情報が流れてきました。

どういう経緯でこの名前がついたのかわかりませんが、日本人的にはすぐにこの AA を思い浮かべるでしょう。*1

f:id:iseebi:20160406064936g:plain

名前はともかく、紹介記事を読んでみると、MvvmCross がつらいけど MvvmCross のインジェクションっぽいのが欲しくて作ったみたいなことが書いてあって気になったので試してみました。

*1:その後 @atsushieno さんに指摘いただいたのですが、ワンパンマンのほうじゃないかとのこと。そういえばあっちもサイタマだった…。

続きを読む

3Dプリンタを買いました

f:id:iseebi:20160305204729j:plain

思い立って3Dプリンタを買いました。

自転車マウンタとか、ベッド用タブレットアームとか色々買ってきたのですが、せっかくこれ引っ掛けるところがあるんだったら色々ドッキングしたいなーと思っていて、DMM.makeの出力サービスとかでいい感じにできるかなと思ったのですが、トライアンドエラーで何度もやり直しができないので、自信がない。

やはり手元にあったほうがいいと思って3Dプリンタ欲しいと思ってはいたのですが、10万オーバーの世界だよなあと思いつつも調べたら、6万くらいで買えて、使いやすそうなダヴィンチという製品群があることを知りました。いろいろ検討して、ダヴィンチ1.0A という機種を買うことにしました。

ダヴィンチ 1.0A

ダヴィンチはXYZプリンティングという会社の製品群で、熱溶解フィラメント製法という、材料を細い線にしてリールにしたフィラメントというものを溶かして積み重ねてモデルを作ります。

1.0Aはこの会社の中の製品としてはエントリーユーザー向けの機種にあたります。最大で 20cm 四方のモデルを出力できます。

3Dプリンター ダヴィンチ 1.0 A

3Dプリンター ダヴィンチ 1.0 A

エントリーユーザー向けとしてはダヴィンチJr.という機種もありますが、こちらは安い代わりに出力できるサイズが 15cm 四方となります。

3Dプリンター ダヴィンチ Jr. 1.0

3Dプリンター ダヴィンチ Jr. 1.0

もう少しコンパクトだと思ってたら結構大きい箱で届いてびっくりしました。玄関塞いじゃって、独り身の1K部屋に入れるためには一度家具を動かす必要がありました。

f:id:iseebi:20160305094800j:plain

付属品はこんな感じ。モデルをステージからはがすためのへら、プリントヘッド掃除用のブラシなどがついています。あと出力する上で大事なスティックのりがついています。あとなぜかプラスチックの板がついてて何に使うんだろう…と思ったら、持ち上げる時に使うハンドルの穴を塞ぐためのパーツでした。

f:id:iseebi:20160305201728j:plain

モデルの作成

f:id:iseebi:20160320210724p:plain

学校は機械系と情報系を組み合わせた感じの学科だったこともあり、CAD を中心に勉強してたので、簡単な使い方は知っていました。いまでも IT エンジニアには Illustrator よりもわかりやすいんじゃないかな、と思います。

学生当時は 2D は AutoCAD、3D は Rhinoceros や Pro/ENGINEER を使っていましたが、いまは 123D Design という非商用無料の 3D CAD ソフトがありましたので、これを使うことにしました。2D 系の操作にショートカットがあまり定義されていなくて操作性の部分は微妙だなと思ったのですが、そこそこ直感的に使えてこれから始める人にはいいと思います。

また、僕はジョイントを持っているものに対して違うものをひっつけたかったので、測定用にノギスも買い、これで測りながら 123D に落としていきました。

作成したモデルは STL という形式に出力すれば、ダヴィンチの出力アプリである XYZware に読み込ませることができます。

モデルの出力

f:id:iseebi:20160320211548p:plain

XYZware で STL ファイルをロードするとモデルが現れるので、ステージのどの部分に出力するかを指定することができます。

プリントボタンを押すと、パラメータの設定画面が出て、ここでモデルの出力時の調整ができます。

プリントボタンを押すと、所要時間とフィラメントの消費量の見積もりが表示されるので、それでよければプリントを開始します。

プリント前にモデルが出力される箇所にスティックのりを塗ります。これをしておかないと、モデルを出したときにステージにフィラメントが固定されず出力が失敗します。また、モデルが出る部分だけではなく、向かってステージ右手前側にテストプリントが行われるため、ここにも塗っておく必要があります。

f:id:iseebi:20160320211921j:plain

プリントが始まるとエクストルーダー(プリントヘッド)は 210 度、ステージは 90 度に熱せられます。ステージの余熱に時間がかかり、実際に出力が始まるまでは 5 分程度かかります。

モデル出力後は冷却され、ステージが終わって完了となります。モデルをはがした後は、濡らした布でスティックのりを拭き取って、乾拭きして終わり、という感じになります。

作ったもの

この 2 週ほどで作ったものです。

モバイルバッテリーマウンター

最近 iPhone 6 Plus のバッテリーがもたなくなっていて、3時間で20%とかになってしまうのですが、バッテリー交換するにも画面左下欠けてておそらくここも直さないと交換してもらえないと思うし、今年買い替えることを考えると無駄な出費だと思っていました。

サンワダイレクトの 800-BYPDA2BK という自転車マウントはiPhone側に専用のケースをつけるタイプとなっています。

http://www.amazon.co.jp/dp/B00SUY7T1Qwww.amazon.co.jp

ここの固定部分にダンボーバッテリーを固定するプレートを作りました。しっかりケース固定にしてもいいかなと思ったんですが、めんどくさいと思ったので輪ゴム固定。

タブレットアームのiPhoneジョイント

先ほどの自転車マウントケースのジョイントパーツを使って、iPad を接続するアームに iPhone をマウントできるようにするジョイントを作りました。

http://www.amazon.co.jp/dp/B00NHKW9UYwww.amazon.co.jp

Venue 8 Pro 用のスタンド

ThingverseXYZプリンティング公式サイトのギャラリーなど、3D モデル共有のサイトから無料でダウンロードできるモデルがたくさんあり、そのまま出力したり独自の拡張を加えることができます。これはこちらのモデルをそのまま出力しただけですが、とってもぴったりでよかったです。

Xamarin と Gadgeteer と SignalR で色を伝えるデモ

f:id:iseebi:20160313102216j:plain

先日のDevelopers Summit 2016 Japan Xamarin User Group コミュニティブースと第3回フェンリルデベロッパーズセミナー セッション「モバイル/クラウド/IoT…C# の新たな活躍の場」でご紹介したデモのソースコードを公開しました。

GitHub - iseebi/ColorWithDevice: Connection demo with Xamarin / .NET Gadgetter / SignalR

どんなデモ?

このような動きをします。

  • Gadgeteer と iOS/Android アプリを Bluetooth で接続します。
  • ジョイスティックの向きに合わせて LED の色が変わります
  • その色を Bluetooth Low Energy で接続された iOS/Android に送られ、画面上に同じ色が表示されます。
  • Gadgetter につながっていないアプリにも、SignalR を通じて同じ色が表示されます。
続きを読む

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 も消せるはず。

Xamarin でネイティブオブジェクトを使う際に最近気をつけていること

Xamarin でネイティブクラス(UIViewやActivity)のオブジェクトを使った際、気をつけて使わないとクラッシュの元になったりします。

今回は最近はまって気をつけていることをご紹介します。

続きを読む

新しくなった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 開発のお供にぜひ活用してみてください。