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 を張る機能があれば、端末でいちいち張らなくても済むのになぁ……。

拠点間 VPN

ボクの開発室は 9 月の末に引っ越した。これはいわゆる「開発分室」というヤツで、本社は今まで通りの場所にそのままあり、そして機能している。分室の方はボクがサーバをたて、いろいろ開発に使っているのだが、本社にはそこまで多機能なサーバはない。ただ、ボクがいる開発室は本社とは独立した部隊であり、あまり本社の業務内容に関わることはなかった。
が、いろいろと業務が進むにつれ、本社と連携をとらなければならない業務もあり、前々から VPN を貼りたくて仕方がなかった。でもそのためには、分室に置いてあるのと同じくらいのサーバを本社にも置く必要があった。う~ん、どうしようかなぁなんてここ数ヶ月悩んでいたんだけど、ふと本社も分室も同じルータを使っていることを思いだした。

「そうだ、ルータで VPN つなぎゃいいんだ」

って、なんで今までそのことに気付かなかったのか?
いや、実は気付いていたのだ。それでも VPN を積極的に張る気にならなかった。その理由は名前解決である。VPN を張った場合、当然 Windows ネットワークによるいわゆる共有フォルダのアクセスがメインの使い道になるわけだが、分室は DHCP を Windows Server が担っており、事細かに設定出来るため、本社側のマシンを分社の DNS に登録することにより、マシン名でアクセスすることができる。
一方、本社側の DHCP はルータ頼みになっており、分室側のマシンの名前解決ができない。また、ムリヤリ DNS サーバを VPN 先の分社側の DNS を参照するように設定は出来るが、万一 VPN が切れてしまったら、本社では名前解決ができなくなる(DNS を複数指定することはできるが、VPN が復活した後、自動的に分室の DNS を使ってくれるようにはなってくれない。DHCP に再度問い合わせる必要がある)。

そんなわけで、本社⇔分室の VPN 接続はここ数ヶ月、ずっと棚上げになっていたのだ(笑)。
が、様々なプロジェクトの進行上、さすがにそう言うワケにはいかなくなり、今日、ようやく重い腰を上げた。結局名前解決の問題は解決せず、単純に IP アドレスでアクセスすることにした。いわゆる「\\192.168.101.1」とかいう書き方である。

VPN 自体の接続はすぐにでき、あっという間に本社と分室でデータのやりとりができるようになった。VPN の確立が成功したら、分室側に本社の人のユーザを登録し、分室の Active Directory にアクセス出来るように設定した。さらに頻繁に使う人に対しては、hosts ファイルを書き換え、よく利用されるであろうマシンの IP を登録。原始的ではあるが、こうすることによってマシン名でアクセス出来るようにした。