インドのプネーでAISのSIM2Flyを使ったみた雑感とか。

仕事でインドのプネーに1週間ほど滞在していました。
Pokemon Goでどうしてもサニーゴを捕まえたかったのと、人とコンタクトをとる手段(主にLINE)が使用不能になると命に関わりそうだったので、事前にAmazonでSIMを購入しました。

使用感

インドだとAirtel回線を使用して繋ぐことになります。使用感ですが、特に問題なく繋がり問題なく使えました。が、4G回線でも遅い気がしました。LINEでもテキストメッセージは問題なく送信できるけど、写真は厳しいといった状態ですね。Amazonのレビューにもある通り、バスでの移動中に時たまエラーで繋がらなくなったりしましたが、機内モードから戻すと掴んだので許容範囲かなという感じです。いつでもどこでもスマホでネットが使える日本のインフラに感謝の気持ちがわきました。

ハードとの相性とか

nexus5, nexus5x, zenfone3, nova liteで試しましたが、nexus5とnexus5xでは2G回線しか掴まないか、接続時にエラーが出て(アンテナのアイコンに×マークが付く)ほぼ使い物にならない状態だったので、このSIMを使用して5と5xをインドに携帯するのはおすすめできません。LGのハードに問題があるのかもしれませんが、はっきりとした原因は不明です。5も5xもどっちも使えなかったのでOSの問題ではない気がします。他の機種では問題なく使えました。iPhoneはわかりません。

インド行った感想

バスで走ってるといたるところにAirtelのお店があってインドすげーなーと思いました。サニーゴは滞在最終日にバスで空港に向かってる途中で根性で捕まえました。全然出てくれなくてだいぶ諦めてたのでめっちゃうれしいです。
Phoenix Market Cityにちょっとだけ寄ったのですが、Pixel2の展示会やってました。触ってる暇がなかったのは残念でした。買って帰ろうかなーと思ったのですが、インドで買っても普通に高い(日本円で8万くらいする)のでやめました。

Pixel2の広告

道路状況が本当に最悪(しぬほど揺れるのとスピードブレイカーの凸段差で酔う)なのと、運転手が普通にアホみたいにスピード出すので死ぬかと思いました。道路に牛も人も普通に突っ込んでくるしバイク乗ってる人ほぼ全員ノーヘルだし車線は存在しないし信号はないしとにかくやべえ。現地の人曰く、プネーはまだましで、デリーが最高にクソらしいです。これ以上クソだったらほんと死ぬのでデリーは行きたくないなと思いました。
あと、滞在最終日の朝にnexus5xが突然うんともすんともいわなくなってブートローダーすら起動しなくなりました。LG製品はもう二度と買いたくないです。

Nature Remoは一度メールアドレスを認証させてしまうと変更時にめっちゃくちゃめんどくさい。

表題の通り、というかガジェット系は不具合あっても割とイライラせずに使用するタイプだと思ってるのですが、これはさすがに改善要求したいレベルで仕様がひどかったです。散々発売延期してコレかよ…。

あらまし

Nature RemoとGoogle Home miniを買ったので、IFTTTで連携しようと思いました。nexus5xでアプリをインストールし、メールアドレスAでRemoのアカウント登録を実施し、セットアップ→家電の登録まで済ませました。
次にIFTTTでGoogle Assistantを認証し、Nature Remoの連携も実施しました。これで晴れて音声で家電が操作できるようになりました。やったぜ。ここまではめっちゃくちゃ簡単でしたし、コーディング無しでここまでのことができるのはかなりすごいです。

問題となる操作

ここまでセットアップしたところで、どうしても他のメールアドレスを使用してRemoのアプリ、及びRemoを使用しなければならない事情が発生しました。メールアドレスAではなく、メールアドレスBを使用して最初から全部やり直します。
とりあえずNature Remoの背面ボタンを押してハードリセットしました。壁に貼ってるので、リセットボタンは背面ではなく側面につけてほしかったです。
なお、以降に書いた操作はnexus5x 1台で行っています。

何が問題になるか

  • Nature Remoのアプリにサインアウトの方法がない。(少なくともAndroidアプリにはない)

単純にアプリをアンインストールするだけだと設定値が残存するため、アプリデータを削除してからアンインストールしないとログアウトできません。というか登録済みのアカウントってどこで削除すればいいんでしょうか…。

  • IFTTTとConnectする時に、Connect先のRemoアカウントが古い方になる

  • OAuth認証時に、認証先のRemoアカウントがわからない

IFTTTとRemoの連携をIFTTTのServicesから削除した後、RemoにConnectしなおす場合、ブラウザでOAuth認証するアカウントの対象が古いメールアドレスになります。TwitterのようにOAuth認証画面で認証先のアカウントを確認+変更できれば良いのですが、アカウントがどれなのかもわからないし、認証画面でログアウトもできないので、仕方なくブラウザのキャッシュを全消しして対処しました。
これがかなりクソで、Connect後にServicesを確認しないとどのRemoアカウントと連携してるのかわからないので、古い方のRemoアカウントと連携しているのに気づかず、いつまでたってもRemo側の設定値がIFTTTから読めなくてめっちゃくちゃイライラしました。30分くらいハマった時点でやっと気づいたのですが、ユーザのせいって言われると納得行かない仕様だと思いました。

想定していない操作だったのかもしれませんが、メールアドレス変わったときとかどうすればいいのかわからないし、改善してほしいです。

上記仕様とアプリ自体が初期のPokemon GOレベルで不安定なのを除けばRemo自体は便利です。エアコンも簡単に制御できますし、IRKitで問題だったLEDもまぶしくないし、早くREST API公開してほしいなぁと思います。

tag.retrorocket.biz(はっしゅたんぐら。)のデータが飛びました。

物理的に壊れたのとバックアップも取ってなかったので復旧できません。ほんとすいません。
tag.retrorocket.biz(はっしゅたんぐら。)については利用者が片手で数えるくらいしかいないので、Raspberry Pi 3で運用していたのですが、引っ越しの時にSDカードがぶっ壊れたようでサルベージすらできませんでした。
とりあえずサービス自体はさくらVPSに移行しましたが、IFTTTで同じことができるはず(実際にできるかどうかは試してません)なので、今後はIFTTTの使用をおすすめします。

ジャンク品のnexus5xを電子レンジとパッチで直す。

ブートループして起動しないnexus5xを電子レンジで直す。
これの続きです。

メイン端末がnova liteなのですが、BlueBorneのパッチが来ないのと、Oreoの使える端末が必要になったので、ジャンクのnexus5xを手に入れて直してみることにしました。

ジャンク端末の状態

  • Googleのロゴがひたすらループする。いわゆるブートループしている状態。
  • ブートローダーに入れなかったり入れたりする
  • ブートローダーはロックされている
  • リカバリモードには入れない
  • 電源・充電系に異常はない

ブートローダーのロックが外れないとパッチを当てようがないので、どうにかして開発者向けオプションを起動させます。

ブートローダーのアンロック手順

  1. 分解して電子レンジをオーブンモードにしてマザーボードを焼く(物理)。200℃ 1分で加熱。
  2. 組み直した後、無事に起動を確認しました!!知らないエロゲの壁紙とか、普通に前の持ち主の情報が見えて動揺しました。ロック設定されてたらまずかったですね。
  3. ビルド番号を連打して開発者向けオプションを解除。
  4. 「OEMロック解除を有効にする」にチェック。

OSは7.1.2でした。
ここまできたらどうにかなりそうです。

Oreoへアップデート+CPU用のパッチ当て

Factory Images for Nexus and Pixel Devices | Google APIs for Android | Google Developers
BlueBorne対策済みのイメージが欲しいので8.0.0 (OPR4.170623.006, Sep 2017)をDLしました。
普通にブートローダーは起動したのでファクトリーイメージを焼いた後パッチを当てます。

  1. fastboot oem unlockでブートローダアンロック。
  2. Oreoのファクトリーイメージを焼く。
  3. Nexus 5X bootloop of death fix (BLOD) | 7/30… | LG Nexus 5X からDownloadsを選択し、「Boot.img from Android O DP6」から4CoreOreo.imgをDL。
  4. fastboot flash boot 4CoreOreo.img でパッチを当てる。

ファクトリーイメージを焼く時参考にしたページです。cache.imgはないので、その部分は fastboot format cache してます。
Nexus5Xを工場出荷時初期化~Xposed導入まで – akashisnの日記

無事起動しました。
電子レンジの力で一時的に動いてるだけかわからないので、予後を観察したいと思います。
TWRPを導入している端末であれば、EX kernelが焼けるので試してみても良いかもしれないですね。(TWRP自体がブートループで起動できないので私は試してません。)

起動しました。

BlueBorneも大丈夫。

追記(2017/10/16)

予後も順調なのでメイン端末をnova liteからnexus5xにしました。セキュリティパッチをOTAで当ててしまうとboot領域が書き換わってしまうので、fastbootコマンドで入れ替えています。
4コアしか動いてないのでパフォーマンスが心配ですが、Pokemon GOとIngressとメールとブラウザ使うくらいなら今の所問題ないので、このままメインで使っていこうと思います。

10月分のセキュリティパッチを当てました。

big側のコアは動いてない模様

追記(2017/12/10)

何の前触れもなく電源が落ちて、電源が一切入らずブートローダーすら起動しなくなりました。インドに出張中の時に発症したので死ぬかと思いました。サブ機持ってきてて良かったです。日本に帰ってから冷凍庫にいれたり分解して組み直したりしても駄目だったので、ヤケクソでマザボをオーブンにぶっこんだら復旧しました。オーブン万能説。パッチあてても壊れるんだったらもうだめっぽいですね。同じ症状でた人いるのかな。とりあえずこの状態で何日もつか様子見ですね。

追記(2017/12/11)

再びブートループになりました。パッチ当てた状態で復旧しないためこれ以上の状態改善は無理そうです。

悟空のきもちの予約フォームには致命的ではないが色々問題がある。

悟空のきもちというマッサージ屋さんが全然予約取れないらしいのと、予約フォームのソース見たらかなりひどい簡単に予約自動化できそうだったので、スクリプトを組んで予約してみました。
…のですが、「システム不具合で予約が取れなかった」とお店から連絡がきました。なぜ不具合が起こったか調査してるそうなので(本当に調査してるのかは別として)、私も調べてみることにしました。
ソースコードを見ればすぐわかるような、スクリプトキディレベルのことしか書いてないです。
詳細書きすぎると問題になりそうなのであえて書いてませんが、普通にHTMLとPOSTリクエストの組み方がわかる人なら10分ソースを眺めればわかることばかりです。

詳細

予約フォームは以下のURLですが、
https://goku-nokimochi.com/reservation.html
実際の予約本体は以下のURLを使用しています。
https://form.goku-nokimochi.com/form/reservation/index3.php?shop_id=

恐らくこちらの製品を使用しているようです。
メールフォームプロCGI/UTF-8対応・クレジット決済機能対応 | 無料素材

予約が空いているかどうかは、店舗名とコースを選択した時点でGETリクエストにより問い合わせが行われ、selectタグに反映されます。
例えば、銀座店で60分コースを選択すると以下にリクエストが飛び、JSON形式でレスポンスが返ってきますね。
https://form.goku-nokimochi.com/form/getReservation4.php?shop_id=4&course_id=157

index3.phpが出力しているHTMLのsetUpTimeメソッドを見ると、恐らく配列内には時刻が4ケタの数字で格納されているだろうことがわかります。(実際そうでした。)

value.substr(0,2) + "時"+ value.substr(2,2) + "分"...

フォームにはトークン等も設定されていないので、getReservation4.phpに定期的に問い合わせを送り、自分の都合の良い日時の空きがあれば、予約用のリクエストボディを組み立てて../sendmail2.php宛にcurlかなにかでPOSTしてしまえば良いことがわかります。

../sendmail2.php 宛にPOSTしても、実際にはまだ予約が完了にならず、customer_idが発行されるだけになります。どうやらsendmail2.php宛にリクエスト投げた時点で予約できてしまうようです。
customer_idが発行されると、以下のURLにジャンプします。
https://form.goku-nokimochi.com/form/reservation/sheet.php?customer_id=

sheet.phpのフォーム

トークン等は存在しないので、予約用のリクエストボディを組み立てて ../sendsheet.php にPOSTしてしまえば予約が取れてしまいますね。

このシステムで微妙な部分

予約が埋まっている時間帯を指定してリクエストを組み立ててもエラーが返ってきてしまいますが、エラーが返ってこなくなるまでリクエストを投げ続ければ、キャンセルで空きが出た瞬間に予約が取れますね。簡単に予約代行できそうです。
このマッサージ屋さんに限ったことではなく、似たような予約システムを抱えているところには同じ問題がいえますね。

このシステムで問題のある箇所

index3.php(予約フォームの本体)で、好きな日付を入力した上で時刻指定(r_time)の値を指定しなかった場合、customer_idが発行できてしまいます。
何かの拍子でr_timeが設定されていないのにリクエストが飛んだ場合、そのまま予約が(時刻指定なしのまま)とれてしまいますね。
私はコレにひっかかったのかも。
あと、コースIDが予測できるものなので、隠しコースとか予約できてしまいますね。実際予約できたんでこのままでいいや…。お金払うし…。

フロントのソースコードが中学生が作った掲示板レベルなので、調べたらもっといっぱい穴がありそうでオラワクワクしてきたぞ(悟空のきもちだけに)。
バックエンドもきっとヤバそうな気がします。