ジェネリックトレネ

振動を検知して荷物の盗難を防ぐデバイス「トレネ」のクラウドファンディングが、目標金額を達成しています。

要素技術が、振動センサーと Bluetooth ということで、Raspberry Pi Zero W と少しのパーツで似た機能の実現を目指しました。盗られたことがわかるので、「トラレ」と呼ぶことにします。



緑色のミンティアカテキンミント)の中に収まっているのが Raspberry Pi で、ケーブル接続されている黒い物体は一般的なモバイルバッテリーです。(ミンティアから飛び出している赤外線 LED は今回関係ありません)

まずは振動センサーですが、15 円/個くらいの 水銀スイッチ - WikipediaRaspberry Pi の GPIO18 ピンと GND にはんだ付けしました。水銀スイッチは取り扱いを誤ると、環境に悪影響を及ぼすため 金属球で感知するタイプ もあります。GPIO18 がオフからオン、または逆に変化したとき、傾きが発生したとみなすことができます。

「トラレ」と iOS 端末の距離は、Raspberry PiBluetooth の RSSI 値を定期的に取得することで監視します。今回は GitHub - ewenchou/bluetooth-proximity: Bluetooth Proximity Detection using Python を利用しました。

iOS 端末が一定以上離れていて、Raspberry Pi が傾きを検知したとき、iOS 端末に通知をおこないます。本家「トレネ」では、本体が警告音を発する仕様ですが、誤動作で注目を集めるのは望むところではないので、そのようにしました。Bluetooth による通知といえば、一時期ブームだった iBeacon - Wikipedia という仕組みがあるため、それを用います。

これらを組み合わせて「トラレ」として動作させるために Raspberry Pi 上で実行する TRARE · GitHub を作成しました。さらに、iOS 端末で iBeacon を受信するためのアプリのインストールが必要です。iBeacon advertisement を受信できるアプリは数多くありますが、任意の UUID を指定でき、バックグラウンドでも通知可能な ‎「Find My Stuff - 鍵やお財布から車まで、あなたの所持品を即座に位置確認!」をApp Storeで を採用しました。



Bluetooth が届く距離にいないと通知が受け取れないという懸念はあります。試した限りでは、壁を隔てた隣の部屋くらいであれば問題ないようです。圏外にいたとしても iBeacon advertisement は発信され続けるため、圏内に入った時点で通知されます。

Raspberry Pi Zero W は $10 なので、「トレネ」の予定価格 6,800 円と比較すると、コストパフォーマンスの高さが際立ちます。

Siri に本当の愛を問う


  • カメラがドッタンバッタンしてるのと iMovie 編集丸出しなのはご容赦ください


  • raspi と赤外線 LED の回路図その他は、多くの先人が英知を残しているので割愛
  • ミンティアのケースに入れた先達 に学び、赤外線 LED 関連も含めて格納する
  • カラオケへの送信は 先駆者 がいるのだが、リモコン信号のフォーマットが不明なので、自力で raspi に赤外線センサーを取り付けて LIRC で学習する
begin remote

  name            SIGMA
  bits            16
  flags           SPACE_ENC
  eps             30
  aeps            100
  header          9094  4425
  one             642   1608
  zero            642   481
  ptrail          646
  pre_data_bits   16
  pre_data        0xAA55
  gap             39822
  toggle_bit_mask 0x0

  begin codes
    0 0xc837
    1 0xf00f
    2 0xf20d
    3 0x728d
    4 0xe01f
    5 0xe21d
    6 0x629d
    7 0xc03f
    8 0xc23d
    9 0x42bd
    A 0xca35
    B 0x4ab5
    E 0x7c83
  end codes

end remote
    • 曲番号を 3825A4 とした場合、以下のようにパディングと終端をつけて送信する
$ irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E
    • これを Homebridge のスイッチに登録
{
  "accessories": [
    {
      "accessory": "CMD",
      "name": "ようこそジャパリパークへ",
      "on_cmd": "/usr/bin/irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E",
      "off_cmd": "true"
    }
  ]
}
  • iOS 端末の HomeKit を設定


  • 愛はどこにある…

引用元: LIVE DAM STADIUM / ようこそジャパリパークへ / どうぶつビスケッツ×PPP

サーバレスに OpenID Connect で AWS にサインイン

準備

$ git clone https://github.com/asannou/aws-signin-with-oidc
  • 適当な S3 バケット名を決め terraform.tfvars に書き込みます
  • Google Cloud Platform から、適当なプロジェクトを作り "OAuth クライアント ID" の API 認証情報を作成します
    • "OAuth 同意画面" でサービス名の設定が必要な場合がありますが、適当に入力します
    • "クライアント ID の作成" でアプリケーションの種類から "ウェブアプリケーション" を選択します
    • 適当に名前を決めて作成します
    • "クライアント ID" が表示されるので terraform.tfvars に書き込みます
  • Dev と Admin という IAM ロールがあるので、それぞれサインインを許可するユーザのメールアドレスを terraform.tfvars に書き込みます
    • Dev は ReadOnlyAccess ポリシー、Admin は AdministratorAccess ポリシーがアタッチされます
    • ここは適宜 カスタマイズ してください
  • 最終的にこのような感じになります
$ git diff
diff --git a/terraform.tfvars b/terraform.tfvars
index 2d3d635..ec5d990 100644
--- a/terraform.tfvars
+++ b/terraform.tfvars
@@ -1,17 +1,17 @@
 aws_region = "us-east-1"

-s3_bucket = "bucketname"
+s3_bucket = "aws-signin-with-oidc"

 client_id = {
-  google = "000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"
+  google = "689439588880-vmco4me6g34au0h43ao9tbkb3slgffht.apps.googleusercontent.com"
 }

 email = {
   dev = [
-    "dev@example.com",
+    "asannou@gmail.com",
   ]
   admin = [
-    "admin@example.com",
+    "asannou@gmail.com",
   ]
 }
  • terraform を適用します
$ terraform apply
...
google = {
  admin = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Admin
  dev = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev
}
origin = https://aws-signin-with-oidc.s3.amazonaws.com

利用

    • できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
  • AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
    • 環境変数を設定すると、同等の権限で AWS CLI を実行することが可能です
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE; export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY; export AWS_SESSION_TOKEN=AQoDYXdzEJr...
$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "AROAIOSFODNN7EXAMPLEU:asannou@gmail.com",
    "Arn": "arn:aws:sts::123456789012:assumed-role/Dev/asannou@gmail.com"
}

雑感

  • SAML であれば、ネイティブで AWS コンソールへのサインインが提供されているが…
    • SAML ID プロバイダの少なさ(Google でいいのだが G Suite でのみ利用可)
    • ロールの指定はプロバイダ側の属性付与が必要(AWS のみで完結しない)
    • CLI で使うときは スクレイピング ってまじか
  • そういった事情により OpenID Connect 採用
    • Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
    • G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した