Piで作るVPN切り替え機やりたいことUSの家に置いてあるAppleTVで、日本のIPからしか使えないサービスを使いたい。AbemaTVNetflix(日本版)常時日本経由のインターネットだと速度面、レイテンシ面で不利なので任意に切り替えられるようにしたい。実装の方針RaspberryPiで日本の実家においてあるサーバへVPNを張り、日本側の出口とする。RaspberryPiのwlan0を家庭内LAN、eth0を切り替え用LANにして、eth0の先にAppleTVをぶら下げる。Serverを使った拠点間VPN。これはまぁ色んな所に参考情報が記載されているので簡単に。Bridgeをインストール仮想HUBを作成して実家の仮想ハブにカスケード接続を設定する。tapデバイスにローカルブリッジするように設定する。(ここではtap_jikkaとした)この時点でうまくローカルブリッジが動いていれば、数百msec遅延のping、すなわち日本経由でのpingが返ってくるはず。下記行を追加して、eth0とwlan0のIPアドレスを固定する。ip_address=192.168.50.111/24udhcpd設定DHCPサーバをインストールしてセットアップ。udhcpdをインストール。デフォルトの設定を参考にしながら編集。0より前に下記記載を追加する。これにより起動時にこれらのコマンドが実行され、再起動後も有効になる。MASQUERADEここまでで、eth0に繋がっている装置からインターネットに出ていこうとすると、10.0.0.1を経由して、192.168.50.1のルータ経由での通信となる。ここでデフォルトゲートウェイを下記コマンドで変更すると、日本のルータ192.168.0.1からインターネットに出ていくようになる。HomeKitの装置を模倣するオープンソースプロダクト。これを使って電球と同じような感じでiPhoneから切り替えられるようにする。Homebridgeは導入済みとする。cmdswitch2プラグインを導入する。on_cmdには日本ルータをデフォルトゲートウェイにする設定を入れる。off_cmdにはUSルータをデフォルトゲートウェイにする設定を入れる。VPNサーバへのスタティックルートが落ちる事があるので、ここで改めて追加するようにする。state_cmdには、日本ルータを向いているときに終了コード0を返すようなコマンドを設定する。}これでHomebridgeをrestartするとこんな感じにiPhoneに表示されるようになり、切り替えられるようになる。TVからのBonjourのマルチキャストDNS配信がiPhoneから見えないことになる。iOSにはAppleTVのリモコンとして動く機能があるが、この機能はBonjourに依存しているため、このままでは使えないことになる。Bonjourの実装のひとつであるAvahi-daemonがRaspbianにはプリインストールされており、これのreflector機能を使って、プロキシとして機能して他のネットワークに伝播させることができる。設定は、/etc/avahi/avachi-daemon.confのenable-refrectorをyesにして有効にすればOK。enable-reflector=yesただしこれだけでは10.0.0.0/8への経路がiOSからは分からないので、家のルータにLAN側のスタティックルートを設定してやる必要がある。うちのASUSのルータだとこんな感じ。上の階層に、mdnsプロパティを作って、HomebridgeにつなげるiOSデバイスが居るネットワークに繋がっているインターフェースに割りあたっているIPアドレスを指定してやる。....}詳細RaspberryPiで、VPNサーバとHomebridgeをセットアップしようとしたところ、eth0とwlan0を両方使うと、wlan0側のネットワークからHomebridgeが見えなくなる現象が発生した。デバイスのアドバタイズがどうなっているのかを検索すると、Homebridgeのデバイスはeth0にしか流れていない。デフォルトだと、先頭(?)のネットワークにしかmDNSのアドバタイズをしてくれないようで、eth0側にしか情報が流れていないらしい。解決法ソースを掘ると、配信はmulticast-dnsモジュールでやっている事がわかる。multicast-dnsのコードを見ると、UDPのリスンはココでやっているので、interfaceオプションにインターフェースを示すIPを与えればいいことがわかる。ここにオプションを渡すための変更が、このコミットで行われていたので、それに従って、config.jsonに設定を入れることで、うまく接続できるようになった。Clockが発売されたのでポチってみたやつが届いた。付属品はペラいマニュアルと単3電池4本。Basicのものだった。デザインはシンプルで、文字盤がカバーで覆われておらず、むき出しになっているタイプの時計。Clock」というと、裏面の青いボタンを押すように言われる。言われるがままに青いボタンを押すと文字盤中央のLEDが光り、ペアリング状態になる。するとAlexaがペアリングが完了したことを知らせてくれる。この時計の機能は、普通の掛け時計に加えて下記の2つの機能しかない。時刻を自動で合わせるタイマーが動いている場合、残り時間をLEDで示すつまり時計だけではAlexaの操作もできないし、スピーカーにもならないということになる。Alexaを使って5分タイマーを設定すると、下記のように0時から1時までの間のLEDが光り、残り時間が5分間であることを示してくれる。残り時間が1minを切ると下記のように一周分を使ってカウントダウンしてくれる。機能としては非常に少ないが、現在Alexaの一番の利用用途がタイマー機能なので、十分ペイすると考えている。サマータイムがあるアメリカでは、時刻を自動で合わせてくれる時計は非常にありがたい。電波時計も試してみたが、家のあたりは電波が良くないようでうまく動かなかったので、これは嬉しい。単3電池を4本も使うのはちょっと気になるところではある。使用頻度にもよると思うが、あまりに電池の持ちが悪かったりするとちょっと悲しい。#初代ゲームボーイを彷彿させる。Marketの生鮮食品売り場カウンターで、生牡蠣が殻付きで1個1ドルで売られているのを発見した。生牡蠣は好物なので生で食べれるか聞いてみたところ大丈夫らしい。殻は剥くか聞かれたので剥いてほしいと頼んだところ、お店で出てくるような氷満載のバットに並べて渡された。Market内にはバーコーナーも設けられているので「そこのバーで食べていってもいいよ」と至れり尽くせり。家まで持ち帰って、ポン酢をかけて白ワインと頂く。身はしっかりしているし、以前近所のシーフード屋で食べたときのような消毒液の匂いもしない。非常に良いものを見つけた。夏はバーベキューで焼いても良さそうだ。今の所食中毒の症状は出ていない。Attachement。今回はレガシーWebAppに使ったので、JQueryで実装。設定はドキュメントに掲載されているが、実はここに書かれている以上に拡張性があるので、コード自体を読むことをおすすめする。これによりやりたかったことは全て実現できた。やりたかったことどんなファイルでも添付できるようにしたいデフォルトだと画像ファイルに制限されているが、どんなファイルでも受け付けるようにしたかった。すれば良いことがわかったのでそのようにした。アップロードされたファイルの名前が、サーバサイドでわかるようにしたいデフォルトだと、サーバサイドから見えるファイル名は、image-タイムスタンプ.拡張子となり、もとのファイル名がわからない。ドキュメントに記載は無いが、remoteFilenameというプロパティに関数を入れてやると、引数にファイルオブジェクトを渡してくれるので、ファイルオブジェクトの内容を使ってファイル名を作成して返してやることで、サーバサイド側ではそのファイル名で見える。下記のようにすると、もともとのD&Dされたファイル名がサーバサイドに送付される。file.name}ファイルの種類によって、埋め込まれるコードを変えたいMarkdown形式で入力するテキストエリアだったので、ファイルの種類によって埋め込まれるコードを修正したかった。←ドキュメントならこっち埋め込まれるコードは、urlTextプロパティで静的に設定できるが、このプロパティに関数を与えることで好きなデータに編集できる。ファイルの種類はサーバサイドで判定したMIMEをJSONに入れて返し、これを読んで画像ファイルか普通のファイルかどうかの判別がつくようにしてある。リンク文字列ももともとのファイル名にしたかったので、同じくサーバサイドからオリジナルのファイル名を返して埋め込むようにしている。}マウスオーバしたときにドロップできる感じを出すファイルをドラッグしてきたときに、textareaに点線で枠線を表示することで、ドロップできますよー感を出した。})最終型JSはこんな感じ。})});CSSはこんなん。0px;}PHPはこんなもんで。Bag)というのがある。これはビール醸造の最初の手順である麦芽の糖化(マッシング)にて、袋に麦芽を入れてそれをティーバックの要領で煮出すというやり方になる。使う鍋の量が少ないので、利便性が高く人気がある。マッシング中は1時間以上に渡って温度を一定に保つ必要があるので、通常は定期的に温度を確認して、必要に応じて火にかけたりする必要がある。要するにある程度の時間、水温を一定に保てばよいということなので、みんな大好き低温調理器Anovaが使えるんじゃないか?と思い、実際にやってみた。Anovaは水を吸いこんでヒータで温度を上昇させ、水を吐くという仕組みになっている。Anovaに麦芽が吸い込まれるのはあまりよろしくなさそうなので、麦芽の入った袋の外側にAnovaを取り付ける。今回は5galを仕込むので、その1.5倍の7.5galの水で煮出すことにした。鍋に水を張り、バッグとAnovaを取り付けてスイッチ・オン。マッシング温度は65°Cとした。水の容量が大きいためAnovaだけの熱量だとパワー不足のため、最初は電熱コンロも併用する。65°Cになった時点で麦芽を投入。最高水位線を超えてしまうことが懸念だったが、特に問題なかった。初めは非常に順調だったが、30分ほど経ったときに水量不足の警告音を出してAnovaが停止するようになってしまった。水量不足になるほど、鍋内の水は減っていない。誤検知かと思い、何度かスイッチをオンにしてもすぐに止まってしまう。試行錯誤の上、Anovaの水を吸い込む口の部分にバッグと麦芽がへばりついて、水がうまく吸えなくなったので、水量不足という表示をしているのではないかと思いあたった。そこで、Anovaの水を吸い込む口のあたりにトングを突っ込んでバッグをブロックしてやったところ、うまく動作するようになってくれた。次回は水を吸い込む口のところに、何らかのつっかえ棒などを取り付けて、バッグがへばりつくようなことが無いように工夫してみるつもり。マッシングの工程は、多少エラーがでてまごついた部分はあったが、ほぼ全自動で完了させることが出来た。比重も1052でほぼ狙い通りまで行けた。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。