iOS はクソだなぁ……

 

事の発端は 3/6 に作った福引きシステムを Bluetooth のシャッターボタンでも引けるようにするという要望だった。夏コミが近くなり、この福引きシステムを夏コミにも使うのだが、前回、お客さんがなかなか引けないという場面があり、列が伸びてしまったらしいのだ。

お客さんがひけなかった原因は、単純に「タッチ」しなければならないのに、画面にタッチした時、指を画面から離す前に指で画面をこすってしまい、タッチとして判定されなかったためだ(スワイプとして判定されてしまう)。緊張したのかなんなのか解らないが、そういうお客さんが多かったらしい。なかなか引けなくて後ろの列が伸びてしまった。列が伸びると次のサークルを回りたい人はさっさと諦めて引かずに行ってしまうらしい。
そこで対策としてリモコンのシャッターボタンを押して貰えば、失敗が少ないのではないかというわけだ。

リモコンのシャッターボタンはキーとしては【Volume Up】の信号が送られてくる。
確かにスマートフォンを横向きに構えると音量ボタンがちょうどシャッターボタンぽい位置に来る。
なので Javascript でシャッターボタンを拾うように組んでみた。とりあえず Windows の Edge で実験。ちゃんと動いた。
ところが iPhone ではウンともスンとも言わない。んー? なんだ?
シャッターボタンは拾えないのかな?

そこで、どんなキーを押しても動くように組み直してみる。
それでも iPhone だと何も起きない。おいおい、どういうことだよ。
そこで気づいたのが、iPad だ。ボクの iPad にはキーボードが着いている。これなら絶対に動くはずだ!!

ところが、iPad + キーボードでも動かなかった!!

ここに来て初めてボクはググった。そしたらなんと、画面にキーボードが表示されていないと、iOS ではキー割り込みが発生しないのだった!!! なんだこのクソ仕様は!!! つまり Javascript では何をしようがどうしようが Form の上か画面にキーボードが表示されていないと、キー情報をとることができないのだ(ちなみに Android はできる)。

というわけで、リモコンのシャッターボタンでは iOS ではクジは引けない。回避方法はないのだ。この一連の変更はすべて無駄となった。

で、結局どうしたかというと、スワイプでも引けるようにとりあえずした。
ただこれでお客さんの失敗が減るかどうかは、夏コミに実際に引いてもらわないと解らない。それはまたその日の日記に。

時給とモバイル WiFi ルータと JavaScript

東京にいるとあんまり実感しないんだけど、旅行先だと確実にバイトの時給って上がってるように感じる。というのも、アベノミクス前は地方都市(例えば高崎、宇都宮など)の時給って東京より 100 ~ 200 円は低かったけど、最近はそう言った地方都市でも時給 1000 円以上なんてぜんぜん珍しくない。特に飲食店は高い。1200 円とか平気で見る。
すごいなぁ。東京で 1200 円だと生活も大変そうだけど、地方都市で 1200 円だったらけっこう助かるんじゃないだろうか? そうでもない?? 物価はそんなに変わってなさそうだし。

2015 年の 9 月に買ったモバイル WiFi ルータ『MR04LN』がもう半年以上も使われずに机の中で眠っている。使わなくなった理由は単純に非常回線としての用をなしてないからだ。現在は au 系の MVNO を使っている。ボクは普段はこの au の回線を利用し、Docomo の回線に余裕を持たせている。ちなみに Docomo 回線はボクを含め三人が使い、容量は 5GB。au 回線はボクだけが使い、こちらは 6GB である。今のところこれで容量が少なくて困ると言うこともないし、当分 MR04LN の出番はなさそうだ……。

誰かに貸してもイイよな、と思いつつ……。

以前作った福引きシステムで、リラルタイム モニターを作ってみたんだけど、一秒に一回サーバを見に行くので、たくさんの人が使ったらダメだなぁと思いつつwwww
どういう機能かというと、自分で設定した福引きの状況(何等がいくつ出てて、それぞれの現在の確率がどれくらいか)っていうのをリアルタイムでモニターするためのもの。福引きが引かれたらモニターに通知する方法とかないかなぁ(ぁ
ちなみに 5 分以上福引きが引かれないと、自動的に止まるようになっている。

まぁ、将来のためにいろいろ考えよう……。

中屋と猫

PHPHTMLJavaScript でクジのシステムを作ったと以前書いた。それをパトスロのスロット画面みたいに派手にできないかなぁと何となく思っていて、After Effect でパーティクルのアニメーション部分だけ吐き出せないかなぁとやってみたら、できた。

これが一枚一枚の PNG になったので、こいつを使えばいくらでも画面が派手に出来るなぁと。

本番では使わなかったけど、将来的には星を飛ばしたり、ハートマークがいっぱい出てふわーっと浮き上がったり、打ち上げ花火みたいにしたりとか出来るといいなぁと思いつつ……ただ、Javascript で動かすので重そうだけど。

そして今日は中屋に行った。つけうどんに天ぷら三つ。うどんは 500g だったかなぁ?
お腹いっぱいになりました。そして猫の写真は、銀杏岡八幡神社の横でひなたぼっこしているこの界隈では名物猫。

WB-BT300 とか PHP とか VPN とか

Twitter から拾った、コンピュータ関係の話。

iPhone の音を PC の音とミックスして出したくて、使っていなかった Bluetooth レシーバを引っ張り出してきた。Onkyo の WB-BT300 という機械だ。コイツはなにをする機械かというと、iPhone など Bluetooth 対応機からは音響装置に見え、WB-BT300 に対して音声を飛ばしてくれる。WB-BT300 は iPhone からきた音声を、デジタル信号かアナログ音声信号に変換して出力してくれるのだ。

で、会社の開発機には TEAC の US-366 というミキサー兼 USB 音源があるのでそいつと接続すると、PC からの音と iPhone からの音をミキシング(混ぜて)出せるようになるのですな。ちなみに US-366 と WB-BT300 は光デジタルケーブルで接続。

ところが、iPhone からの音しか出ない!! なんだこれ??

原因は WB-BT300 のデジタル フォーマットがサンプリング周波数 192kHz、量子化ビット数が 24bit のせい。このフォーマットは統一しておかなければならないのだが、たかが Bluetooth の音声受信装置でなんでこんな高い設定なんだwww
ちなみに CD はサンプリング周波数が 44.1kHz、量子化ビット数が 16 ビットだ。CD よりも音が悪いクセにデータ量は CD の 6.5 倍もあるwww

仕方がないので PC 側の出力も 192kHz の 24bit に設定した。こうすることによって無事 PC と iPhone の音が同時に出るようになった。

某絵描きから、イベントの福引きみたいなクジをデジタル化できないかという依頼があり、ごりごりと PHP と HTML と Javascript で作った。今流行の HTML5 というヤツだ(ぁ
中身はすぐに出来た。そりゃまぁ、そうか。クジ振るだけだから、出た乱数が何等賞なのかに変換して表示するだけである。

問題は管理画面である。単純にクジ、と言っても誰でも彼でもアクセスしてクジが引けるというワケにはいかない。以下の様な機能が入っている。

  • ユーザ登録して、ユーザ登録した人がクジを作れる
  • クジはいくつでも作れる
  • それぞれのクジには 1 ~ 10 等賞まで設定でき、さらに残念賞、参加賞が設定できる。そしてそれぞれの賞及びはずれがいくつあるのか設定するようになっている。
  • QR コードの表示
  • クジを引く画面を Javascript でアニメーションさせる。
  • 何等賞が出て、残り何の賞がどれくらい残っているかリアルタイムで監視する、モニター

使い方はユーザ(主催者)がクジを作ったら、そのクジを iPad などの端末で表示し、お客さんがそれをタップしてクジを引くというものだ。
さらに QR コードを吐いて、それをお客さんが撮影してクジを引くという機能もつけた。この場合、ちゃんと一回しかクジは引けないようになってるのだが、残念ながら Javascript では機種固有の識別番号を取得できないので、cookie になってしまった。そのため、cookie を消去すれば何度でもクジは引けてしまう。

ツイートでの愚痴は、HTML というかサーバのプログラムは一回一回が初めてのアクセスになるというか、仕組み上、同じ人が何度アクセスしようが、サーバ側は初めての人が初めてアクセスしたことにしかならない。
今アクセスしに来た人が前の○○という場所にアクセスしに来て、今のアクセスはそれの続きであるということは実は認識できないのだ。それを実現するために、cookie やらセッションやらっていう仕組みがあるのだが、とにかく一回一回のアクセスがすべて関連を持たせられないので、渡す数値だのなんだのも全部もらい直さないといけないので、プログラミングがすげーめんどくさいっていう話。

これが普通のプログラムだったら、さっききたアクセスは変数に残ってるし、その変数を参照して関数を呼び出せば済むんだけど、PHP だとアクセスが来るたびにプログラムは先頭から実行されてしまうのだ。

あと処理は PHP なんだけど、それを表示するのは HTML なのね。組み方としては PHP が処理の結果に応じて HTML を吐き出してるワケなんだけど、そうなるとプログラム ソースの中に PHP と HTML が混在してけっこう美しくない結果に……。今回は仕様書も何もないままテキトーに作り始めてしまったので分離されてないのだけど、予定してたより大きなプログラム(PHP 部分で 2000 行程度、Javascript が 500 行程度)になってしまったので、今後は気をつけたい(汗


(MP4 / 750×1334 / 25fps / 1’05” / 126MB / iPhone)

amatsukami.jp サーバの様々なサービスは、色々がんばって外に出してるんだけど、それでもやっぱり一部の機能は VPN を張らないと使えない。そのたびに端末(iPhone など)から VPN を張ってるんだけど、けっこうめんどくさい。
モバイル WiFi ルータに VPN を張る機能があれば、端末でいちいち張らなくても済むのになぁ……。