NDS(長岡IT開発者勉強会)のコラボ企画として、IPv6 Hackathon in 新潟を実施しました。
NDSとしては毎回の勉強会運営の実績と会場準備ができるので、その方面で協力しENOGさんからはネットワーク環境、講師依頼などを協力してもらいました。
コラボだと自分独自でやるよりも適当なことはできないんですが、NDSだけではとても実現できないイベントが開催できたと思います。ENOGの皆様、協賛企業の皆様ありがとうございました!
内容は午前セミナー、午後ハッカソン、そして懇親会で成果発表という、一般的なハッカソンをコンパクトに一日に濃縮しました。これは運営的に楽だからそうしたのですが、ハッカソン参加のハードルも下がって良かったです。
セミナーはIPv6のプロである講師の方々(インテック廣海さん、JPNIC小山さん)の貴重なお話を聞くことができました。
話を聞くほどIPv6への完全移行は長い道のりだと痛感。移行期間としてv4と共存する期間が20年ぐらいはあるだろうという予測に、ムーアの法則もビックリでしょう(長い!)。「LLとIPv6対応状況」は開発者向けの内容が満載でした。Pythonのv6対応は楽みたいなんですが、Python製WSGIサーバーってそんな対応出来てるのかなー?ってのが私がハッカソンで調べた感想です。
Hacktathon
でハッカソン。
わずか5時間のハッカソンなので、マラソンっていうかハーフマラソンてか短距離走なみのタイムアタックに近かったです。運営側としては「5,6人集まればイイトコじゃない?」って思ってたのが17名の参加!すごいです。
みんなでワイワイガヤガヤになるかなー?って思ってたら、すごい静かでカタカタッターンッ!音がなり響くのみ。なんという集中力!!!(たまにf*ckという罵り)たしかに5時間では突っ走るしかないのですが、あの人数で集中力切らさず続いてるのは、予備校の自習室か、ハーバードの早朝図書館くらいなもんです!
私はお留守番担当で昼ごはんずらして作業してたのですが、昼ごはん食べるの忘れたままコードに没頭しちゃいました。(あとでおにぎり食べながらコード書いてた)
ハッカソン終了時間ちょうどに、「終了です。鉛筆をおいてください!」のアナウンスがピッタリでしたよ。
ところでこの会場、@m_asamaさんのおかげですごいネットワーク環境が用意されました。v4only、v6only、v4v6のデュアルスタックのWi-Fi環境が整い、参加者には各自v4v6のデュアルスタックで動作するまっさらな仮想サーバが提供され、なんなりとインストールして開発できました。
さらに会場ネットワーク上流は会場設備のフリースポットWi-Fiのみで、MacBook Air内の仮想PC3台を通じてUSBイーサ3つを使ってWi-Fiルータ3台に繋ぐすごい構成でした。フリースポット1つがこんな素晴らしい環境に変化してしまうなんて奇跡の技でした!
何言っているか分からないですよね?要するに、電源とフリーのWi-Fiスポットさえあれば、そこに旅行ゴロゴロかばんで駆けつけて、v6環境一式整備できてしまう遠隔操作タイプのスタンドです。コンテナ型データセンター思い出しました。
懇親会は居酒屋に上流3Gで会場同様のネットワークは整備し(!?居酒屋には電源コンセント1個しかなかったのに!)、プロジェクターで希望者が5分くらいの発表でした!皆さん発表がバラエティに富んでて面白かったです。
自分のハッカソン内容
私の発表はというと、PythonでWebアプリ実行環境整えて動かしたいってのと、WebRTCをv6化で試そうって感じでやりました。
Python Webは、GAE上では経験あるのですが、GAEとさよならしたい場合にどうすべきか?てのを考えていて、自分でPython Webで作るベストプラクティスを考えようと思ったのがきっかけです。
PythonはWSGIという仕様でWebアプリ動かすのが普及してて、GAEもそれに乗ってるってのは知ってました。でも実際どうすべきか?ってとこをやりたかったんです。
WSGIを動かす構成としては、「Webサーバーに組み込むmod_wsgi」とか、「WSGI対応したサーバー」、「フロントエンドのwebサーバーと連携させるタイプ」など様々です。シンプルにWSGI対応のピュアPythonサーバー使うのが楽だろうと考えて、家の予習(時間少ないし、優等生タイプなので、技術検証は先にやっておきました。チート?)ではそれで動いてたんですが、v6でlistenできる方法がことごとく分からなかったです…。
Pythonの低レベルモジュールとしてはそんなにv6対応は難しくないってことだったはずですが、サーバー側の設定としてv6表記[::]とかを受け付けてくれないような…。
で途方にくれてたんですが、@hayajoさんから「nginxはフツーにv6対応されてるから」ってアドバイスを頂いて、急きょnginxをフロントで動かして、バックエンドではv4で動かしたPythonアプリサーバーで動かしました。バッグエンドはuwsgiというWSGIサーバーを動作させました。これはnginxと独自プロトコル(uwsgi)で連携するので、純粋なHTTPのリバースプロキシとは違います。で、ようやくv4,v6,デュアルスタックでwebアプリを動かすことができました。
もう一つのネタはWebRTCです。WebRTCはまだ実装されたブラウザが少ないですが(Chromeでフラグを立てれば使える)ブラウザのみでUDPのピア・ツー・ピア(P2P)通信できる技術です。具体的にはVoIPとかテレビ電話みたいなのがサーバーを使わず実現できるようになります。WebSocketはきっちりした通信で、UDPは抜けてもいいから飛ばせ的な。
IPv6になるとIPアドレスが豊富になるので現在の一般的なユーザー環境のように、グローバルIPを家庭で1つ、NATでアドレス変換してプライベートアドレスを使うという必要がなくなります。NATを通したアドレス変換が行われないというのは、P2P通信においてはとても都合がよいことなので(NAT超えの煩わしさがなくなる)、今後IPv6が普及すればP2P通信が普及するというわけです。
P2PならさっきPythonで作ったWebアプリを何に使うか?となりますが、接続を確立するまでのルームとかロビーのプロセスはWebで提供します。ルームの状況処理は、WebSocketで構築するのがスマートだったのですが、WSGI上でWebSocketを動かすことが難しくって断念(gevent,wsgi,v6の構成とかもろもろ)。家ではWebSocketで動かすつもりでいたのですが、急遽ajaxでポーリングするように切り替えました。(この間niigata.pmで「anyeventがどうこう」って言ってたのって同じことなのかな?)
で、ようやくWebRTCでテレビ会議実現!V6オンリーの環境下で同一ネットワーク内なら確認できました。NAT超えもしなきゃなーと思っていたのですが、v6同士でもう一つ外部のネットワーク環境がなくて未検証。v4デュアルスタックの会場ネットワークと、WiMAX環境化で通信するのは確認できました!あと発表の時にはv4とv6はできなかったと言いましたがサーバーを介さないP2Pの接続なので、v4とv6同士でP2P通信できないのは当然でした。(ですよね??)
ソース類はあとで整理して公開したいと思います。急いで作ったので超汚い。
WebRTCとしては駆け足で技術的な実現調査しかしてませんでしたが、Python Webの方は自分でも色々調べられたしハマったしとても勉強になりました。なによりもハッカソン環境下では逆精神と時の部屋のようにあっという間に時間が過ぎ(でもすごい集中力を発揮する)、こんなに長時間バッチンバッチンキーボード叩いてたのは楽しかったし、自分の新しい器官が使われたような気がしました。(すごい寝不足で参加したのに眠くなかった。)
またこんなハッカソンをやりたいです!できれば参加側でw