2014-05-15

最近の妖怪ハウスの様子

最近の妖怪ハウスの様子はどうか。

妖怪ネットワークに、新しいWiFi APを追加した。たまたま、NECのAterm WR9500Nを安く手に入れたので、これまで部屋が密集している場所に設置されていたバッファローの貧弱な無線LANルーターと交換した。とりあえず、各部屋にまともなWiFiが提供されたようだ。

それにしても、無線だけで満足なこの妖怪ハウスの住人たちというのは、よくわからないものだ。筆者はもとより無線を信用していない。有線でなければ満足できないのだが。

あとは、奥の部屋がひとつ、無線難民になっている。ところが、ここの住人は、テザリングでも構わないと言っている。ますます理解できない。

妖怪ネットワークの抱えているもうひとつの問題としては、午後10時頃から深夜にかけて、インターネット回線がかなり遅くなるということだ。調べてみると確かに遅い。しかし、特に今この瞬間、誰かが帯域を大幅に消費しているわけでもない。そもそも、RTX810で"show status pp 1"した結果によれば、今月はじめから15日間でダウンロードした情報量は、1.3ギガオクテット程度である。全然使われていない。何故こんなに遅いのか。どうも、この原因は、妖怪ハウスの外にあるような気がしてならないのだが。

また、今の妖怪ハウス内のLANケーブルの配線は、とりあえず壁にテープでとめただけなので、いずれ剥がれてくるだろうし、あまり見た目もよくない。床をケーブルがはっているよりはマシになったが、これもおいおい何とかしなければならないだろう。

さて、妖怪ハウスもいろいろあったが、どうやら無事に一周年を迎えたようだ。一周年記念のパーティには、大勢の人がやってきた。筆者は、カレーとピザを作った。今回のピザ生地は、水の量が適切であったため、うまくいった。さすがに三度目ともなると慣れるものだ。次はどのような料理を作ろうか。

一周年記念のパーティの余興になるかと思い、たまたま都合よく届いていたテントを、ベランダに設置した。安物のテントではあるが、どうやら十分実用になるようだ。さながら、妖怪ハウスに部屋が一つ増えたようであった。パーティ中は、筆者のあずかり知らぬところで、勝手に占領されてしまっていたのだが。

ベランダにテントを設置できることは確認したが、長期運用するには、雨対策をしなくてはならない。下にパレットを設置して、地面から浮かすのがいいだろうと思う。パレットは、最小購入数が、50枚や100枚のものばかりで、なかなか難しい。どこかで、1メートル四方のパレットが4枚ばかり手に入らないだろうか。

一周年記念パーティの翌日の夕方、パーティの参加者で、まだ妖怪ハウスに残っていた者達で、にわかに近所の公園まで遊びに行った。リア充ごっこをしようということで、途中にあった100円ショップでバトミントンやらボールやらのリア充グッズを買い求めて向かった。しかし、平均年齢が少なくとも20代後半、ことによれば30になる上、男5人、女1人というこのデコボコ集団は、はたしてリア充と言えるのだろうか。

さて、公園についたが、あいにくと風が強く、またバトミントンも100円ショップの安物のせいか、ラリーが続かない。しまいには、ラケットをボール代わりにして投げつけ合う奇妙な遊びに発展した。果たしてこれはリア充と言えるだろうか。

そろそろ暗くなってきたので帰路についた我々リア充ごっこ一行が目にしたのは、だるまさんがころんだをしている男女比率の偏っていない大学生らしき集団であった。実にリア充らしい集団であった。我々は敗北感を感じたまま無言でその横を通り過ぎた。

帰り道に、我々はこの「リア充」なる用語の定義について話し合った。

「彼女がいればリア充か」
「しかし、たとえ恋人がいたとて、仲違いをしている状態はリア充とは到底言えまい」
「しかし、痴話喧嘩というのは、はたから見ればリア充ではないか」
「うまいものを食べていればリア充だ」
「では、70、80のじいさんばあさんがうまいものを食べているのはリア充か」
「リア充だな」
「思うに、リア充なる用語はあまりにも濫用されすぎて意味が弱くなってしまっている」

さて、18日には、妖怪ハウスで、タピオカボドゲ会をする予定である。これは、大量のタピオカパールをココナッツミルクで飲み下しつつ、ボードゲームをする会のことだ。

2014-05-14

KADOKAWA・DWANGOについて

朝起きると、今朝の02:00に日経が興味深い記事を公開していたことに気がついた。

角川・ドワンゴ経営統合 アニメなど「ニコ動」で海外へ  :日本経済新聞

はて、どうせ日経のことだろうし、また飛ばし記事だろうかと読み飛ばして、10:45にドワンゴに出社した。ちなみに、この時間は、ドワンゴのエンジニア基準では、まだ出社している人もまばらな時間帯である。筆者はドワンゴ社員にしては珍しく、早寝早起きなのだ。

さて、ドワンゴ社内では、日経の報道する、角川との経営統合について知っている人間はいなかった。

さて、出社して、勤務時間中に、勝手にBoost.勉強会 #14 札幌で使うスライド資料を書いて公開してから、弁当を使った。今日の弁当は、五分づきご飯、グラタン、コンソメスープだ。グラタンは、昨日の夕食の残りである。筆者はしっかりとした弁当用の容器を持っているので、コンソメスープも温かいまま運搬可能なのだ。

さて、昼飯を食べた後、ドラゴンズストーンというボードゲームをした。このゲームはなかなか戦略が練れそうだが、ルールを把握しているものは誰もいないので、今回はルールの把握がてら、手探りで遊ぶことになった。

さて、恒例の昼ボドゲ終了後に、OpenGLネタの興味深い記事をブログで紹介しようと思ったが、やや眠気を覚えたので、昼寝をすることにした。考えてみれば、昨日は実質6時間しか寝ていない。すこし仮眠して眠気を取ってからとりかかろう。

さて寝ようと横になったところで、同僚がやってきた。なんでも、15:15から、15階で角川の件で発表があるという。はて、そんな話は聞いていないぞ。どうやら、私がフロアを離れたすこし後に伝達されたそうだ。

さて、歌舞伎座タワーの15階というのは、近々MAGESが移ってくる。そのため、現在社内では、フロア中央のぶちぬき踊り階段を延長する工事を行っている。そのため、13階と14階の行き来が面倒になっている。フロア貫通階段は、すでに歌舞伎座タワーのドワンゴ社内を見学した人によって画像などもネット上に広がっている。

株式会社ドワンゴ 歌舞伎座タワー新オフィス に行ってきた! - 941::blog

フロアぶち抜きの踊り階段は、結構カネがかかるそうで、今まで、その価値をあまり意識したことはないのだが、今回、工事で塞がれて、初めてその価値を認識した。なるほど、踊り階段がないと、わざわざエレベーターや非常階段を使わねばならず、とても面倒だし、余計に時間がかかる。踊り階段は必要だ。

それはさておき、まだ15階への踊り階段は完成していないので、エレベーターで15階に上がった。そこには、歌舞伎座タワーにいるほぼ全員が集まっていた。さて、その場で川上会長が話した内容は、株式会社KADOKAWA 株式会社ドワンゴ 合同発表会 - 2014/05/14 17:00開始 - ニコニコ生放送で話した内容と、全く同じだった。さてはリハーサルであったのか。

筆者は会社経営には詳しくないが、あやふやな記憶によれば、KADOKAWAとドワンゴを束ねる持株会社を設立して、両社とも上場をやめるのだそうだ。

両社は対等な関係、会長はKADOKAWA側ではなく、ドワンゴから川上会長が就くらしい。

川上会長「個人的には副会長のほうがいいんだけどね」

ある社員から以下のような質問が出た。

社員「会社名はどうなるんです?」
荒木社長「あー、やっぱり気になる。KADOKAWA・DOWANGO」
一同「あー・・・」
荒木社長「まあ、これに関しては後でいくらでもSNSでDisってください」

だそうだ。

そして、17時から記者会見をニコ生するので、仕事をサボって見てね、とのことであった。

そして、MAGESが入る歌舞伎座タワー15階フロアは、まだ金を払ってないのだそうだ。

そして、肝心のOpenGLネタの紹介は、明日以降に持ち越されそうだ。とりあえずリンクだけ。

Rich Geldreich's Blog: Things that drive me nuts about OpenGL

Rich Geldreich's Blog: The Truth on OpenGL Driver Quality

ドワンゴ広告

この記事はドワンゴ勤務中に記者会見をニコ生で見ながら書いた。

ところで、今日ドワンゴ社内で知り得た有益な情報によると、タピオカパールはアメ横に大量に売っているそうだ。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

Boost.勉強会 #15 札幌の発表に使うスライド資料

来る2014年6月24日にBoost.勉強会 #15 札幌が開かれる。筆者は、この勉強会に発表者として参加する。

そのスライド資料の草稿を書き上げたので、公開する

EzoeRyou/boost-benkyokai-sapporo

今回、筆者が話す内容は、自動ストレージ(一般的な実装ではスタック)からの動的なメモリ確保を、標準化する際の、障害についてだ。

本来C++14に入るはずだった、実行時サイズ配列とdynarrayは、この問題のためと、スイス支部がNBコメントで拒否したために、規格ではなくTS(Technical Specification)行きになった。

その問題点とは、簡単に行ってしまえば、ネストされた再確保の方法ということになる。ネストされた再確保は、今までも規格でサポートされているので、例外を設けることはしたくない。そのためには、ネストされた再確保の標準化が必要になる。その方法は、まだ提案されていない。

より詳しくは勉強会で説明する。

ドワンゴ広告

リンクしているスライド資料は、あえて休日を使わず、ドワンゴ勤務中に書いた。

Boost勉強会札幌に参加するための旅費はドワンゴが出す。

この記事はドワンゴ勤務中に書かれた。

そして筆者はこれから社内で昼ボドゲ。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-05-12

C++標準化委員会の国際会議に出席するためにパスポートを取得した

さて、ドワンゴに入社した筆者は、今やC++標準化委員会の国際会議に出席できる機会を得た。国際会議というのは、年数回、海外に飛んでホテルに一週間缶詰になるということだ。これにかかる費用を個人で出すのは難しい。ましてや無職では難しい。C++の規格は個人でも学べるが、金や会社がなければ行えないC++啓蒙活動もあるということだ。

さて、C++WGの国際会議に出席するには、単に金さえあればいいというわけではない。色々と準備が必要だ。とりあえず筆者個人としては、まずパスポートを取得しなければならない。

パスポートの取得は、それほど難しくはなかった。問題は、パスポート取得に至る準備が、厄介だった。

まず、パスポートを取得するには、戸籍謄本か戸籍抄本が必要になる。筆者の本籍は生まれてから移していないので、東京にはない。したがって、郵送で申請しなければならない。申請するには、本籍がある場所をしらなければならないが、筆者は知らない。たしか、住民票に書いてあったはずだが、引越の際についでに取得した住民票は、もう破棄してしまった。

そのため、本籍を知るためだけに住民票を申請する必要があった。

さて、住民票によって本籍を把握したので、さっそくその場所の役所に郵送で戸籍謄本を申請した。これに一週間かかった。

さて、パスポートの申請に必要な書類が揃ったので、パスポートセンターに行った。

顔写真は用意しなかった。思うに、パスポートセンターともなれば、周辺に顔写真を撮影する機械ぐらいあるだろうと踏んだのだ。

はたして顔写真撮影所はあった。それも、パスポートセンターの横にあった。駅やコンビニにあるようなボックス型の撮影機ではなく、撮影所であった。料金はボックス型撮影機よりは割高であったが、ちゃんと照明や撮影者がいるので、利用することにした。平日の昼間だというのに、撮影所は撮影待ちの人が大勢いた。だいぶ儲かっているといえよう。この撮影所の形態はどうなっているのだろうか。公務員がやっているのだろうか。それとも民間の業者がやっているのであろうか。

顔写真の撮影でよくわからないのが、価格だ。写真撮影の価格が、かなり高い。もちろん、部屋の中に照明があって、撮影者がいて、受付がいるこの撮影所ならば、料金がある程度高いのは分かる。しかし、無人のボックス型撮影機まで、料金が高いのは何故だろう。なぜプリクラほど安くはならないのだろうか。いや、考えてみれば、プリクラだってそれなりに高い。この機材と印刷用の紙やインクが、それなりの値段するのだろうか。

写真撮影の価格に対する疑問を抱きながら、パスポート申請の手続きをした。パスポートが発行されるにはすこし時間がかかるので、その日はそのまま出勤した。

さて、いよいよパスポート受領の日だ。再びパスポートセンターを訪れた筆者は、パスポートを受領する窓口に向かった。

筆者「パスポートを受け取りに来ました」
職員「ここに名前を漢字でおねがいします」

と職員が差し出した書類を見ると、なるほど署名欄がある。さっそく、江添亮の江のさんずいまでかいて、ふと、上の欄にある文面に気がついた。正確な文面は失念したが、以下のような意味の内容が書いてあった。

旅券に記載事項を確認し、旅券を受領しました

ん? 旅券の受領はともかく、まだ旅券の現物を確認していないではないか。

この事実を指摘すると、職員は、「では署名は後で」と、パスポート(旅券)を持ってきた。筆者は、旅券に記載された事項に誤りがないことを確認した後で、書類に署名した。

型通りのお役所仕事というのは、実に不思議だ。手順だけが目的になってしまう。

こうして、パスポートを手に入れた筆者は、職場に向かった。まだ国際会議参加のためにやることは山ほどあるのだ。

ドワンゴ広告

筆者のパスポートの申請作業はドワンゴの勤務時間を大胆に削って行われた。この記事はドワンゴの勤務中に勝手に書いたので、これも筆者の勤務時間の削減に貢献している。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-05-10

妖怪ハウス一周年

今月、妖怪ハウスは設立から一年を迎えた。一周年を記念して、5月10日はパーティを開く予定である。どうやら、このパーティは、広く告知していないようであるが、まあ、筆者の直接の知り合いであれば、来ても構わないだろう。どのくらい人が集まるのかは、まだわからないが、あるいはすこし騒がしくなるかも知れない。

妖怪ハウスは去年の今頃設立された。果たして続くだろうかと常に危惧されながら、どうやら一年間維持できたようだ。

聞くところによれば、妖怪ハウスの設立当初は、多大な初期費用を支払ったために、住人は貧困に苦しんだという。そして、ここで語るべきではないことどももあったと聞く。何にせよ。今はもう、過去の話だ。

シェアハウスの雰囲気は住人が決める。住人が数人入れ替わるだけで、シェアハウスの雰囲気はガラッと変わるのだ。

筆者が今年のはじめに妖怪ハウスに引っ越した時、妖怪ハウスは、筆者にとって住みにくい状態にあった。ゴミの山、散らかった部屋、汚れたトイレと風呂場。そして最悪なことに、不安定すぎるインターネット回線だ。ゴミや汚れはまだ我慢もできるが、ネット回線のような基本的人権で保証されるべきインフラが貧弱なのは、到底耐えられるものではない。

ただし、筆者は繊細な心を持ち合わせていないので、治療は荒療治になる。大雑把にゴミを捨てたり、掃除をしたりはするが、元来荒っぽい正確なためか、細かいところに手が届かない。なにより、汚れる速度に掃除が追いつかない。

ネットワークも、それほど繊細なことはしていない。ただ、ケーブルを壁に固定して、強力なスイッチングハブとルーターを導入したぐらいだ。これでもまだ、皆のネット利用が集中する午後10字頃になると、ネット回線が遅くなる(どのように遅いのかは不明だが)という意見があるので、また詳しく調べなければならない。残念ながら、午後10時というと、筆者はすでに寝ている時間なので、なかなか調査が難航している。

筆者は何かを大きく変化させることは好むところであるが、仕上げは苦手だ。それに労力の問題もあり、やはり汚れる速度が優っていた。

幸い、そのような仕上げをする人間が、新しく二人入ってきたので、妖怪ハウスは今、だいぶ綺麗になっている。

この新しく入ってきた二人は、料理も私より繊細に作る。あるいは、筆者の毎日妖怪ハウスで料理を提供するという役目も、そろそろ引き下がるべきかも知れない。私の料理は荒っぽいので、適任者がいれば譲った方がいい。

さて、現在、筆者が妖怪ハウスでとりかかっているのは、テントの設営である。妖怪ハウスには大きなベランダがあり、テントを設営するのに十分な面積を有している。去年の夏も、住人の中で、テントをはってみたいという声は上がったそうだが、その費用と労力のために断念したという。

そこで筆者は、今年の夏、妖怪ハウスに妖怪テントを設営して、そこで暮らしてみるつもりである。

さて、テントを設営するにあたって色々と調査を進めた。テント自体は安い。もちろん、よいテントは高いが、とりあえずお試しで、五千円ぐらいの安いNorth Eagle(ノースイーグル) イーグルミニドーム200IINE164 [2~3人用]を買った。いきなり高いものを買って失敗すると、金銭的損失が大きい。それに、いくら普通の家より大きなベランダを有しているからとはいえ、所詮ベランダであるので、それほど大きなテントは設置できない。このぐらいの大きさが無難であろう。

テントの設置場所となるベランダであるが、プランターが設置されていて、十分な面積を確保できない。そのため、まずプランターをどかした。これは、プランターの中に入っている土を一時的に動かして、プランターを動かし、さらに土を戻すという、結構な労力が必要であった。ただし、ものの一時間ほどで終わったので、それほどの作業量でもなかった。

さて、プランターを動かした後、筆者は思わぬ障害に出くわした。雨樋である。

なんと、テント設置予定場所に、雨樋が設置されていた。屋根の雨水をパイプでベランダに導いている。これはまずい。ここにテントを立てると、雨が降った時は、ベランダの地面が水浸しになってしまう。

さてどうするか。パイプを使って、雨樋を延長し、テントから離れた場所に放水するべきだろうか。

しかし、問題は雨樋だけではない。やはり数日テントを張るだけならともかく、一夏設営するのであれば、やはり雨水の問題は解決しなければならない。先人の意見を聞くに、やはりテントを長期運営すると、雨水が問題になるそうだ。テント設置場所の下に敷くシートや、上に張って簡易的な屋根にするためのブルーシートは買ってあったが、やはり、もうすこしマシな解決方法も必要になる。

地面からの浸水を防ぐためには、テントを地面から浮かす必要がある。そのためには、すのこ、あるいはパレットの上にテントを立てるべきだろう。簡単に手に入るすのこは、室内で布団の下に敷くためのもので、高さ、強度の点で、不満である。機能から言えば、パレットのほうが強力なはずだ。ただし、どこで買えるのか。値段はどうなのかというと、まだ調べがついていない。中古のパレットなら安いのだが、強度が心配だ。

さて、注文したテントはすでに届いているし、妖怪ハウスの一周年記念パーティのために、今日中に設置したいが、下に敷くものという点で、どうしようか迷っている。とりあえず今日はいい天気なので、一時的に設置してしまうのもいいかも知れない。

さて、本日行われる予定のパーティであるが、おめでたい日であるので、筆者は赤飯の作成に挑戦する予定だ。他にも、カレーやピザを、余裕があれば作ろうかと思っている。

妖怪ハウスは、あと何年続くだろうか。

2014-05-05

1980年代に不自由ソフトウェアを販売するということ

The Codist

1980年代に不自由ソフトウェアを販売する当時の事情が書かれている。

まず、当時はソフトウェアという概念自体が一般に知られておらず、出資を得るために説明するのが難しかった。

開発も、当然VCSなどという便利なものは存在しない。

インターネットがないので、雑誌でソフトウェアが酷評されても、反論すら難しい。

などなど。

2014-05-04

Google翻訳には秘密の特別版があるのか?

Does Google Have A Secret "Google Translate" Service?

公に公開されているGoogle翻訳と、GAndroidやChrome用のソフトウェア流通サイトに組み込まれているGoogle翻訳機能は、翻訳精度が違うというお話。

GoogleのGoogle翻訳は、おそらくオンライン翻訳サービスの最大手と言えるだろう。Googleは、このサービスを使って自動翻訳コンテンツを生成してオンライン上に公開するスパマーと戦っている

このため、Google自身が自動翻訳コンテンツの利用者だというのは、驚きに値する。まず最初に気がついたのは、Google Playで、アプリ説明に自動翻訳を付けたことだ。後にChrome Web storeでも同様になった。

さらに興味深いことに、この翻訳はほぼ人間のように見えることだ。少なくとも、Google翻訳オンラインの結果よりは、人間らしく見える。これはいったいどういうことだ。まず観察して、それから考察してみよう。

観察:Google翻訳コンテンツ

これは翻訳されたコンテンツと検索マーケッターとGoogleに対する観察、あるいは、如何にして最近イディッシュ語がオンライン上で知名度を上げているかということ。

コンテンツを書くコストは、規模を拡大したいWebサイトにとって、とても重いものだ。たいてい、ロングテールなキーワードとか内容は、広告収入などのWebサイトのマネタイズに、簡単には反映されない。

このため、ここ数年、自動翻訳(たいていはGoogle翻訳を使用)されたWebサイトに出くわすことがよくあるのだ。翻訳結果は、一件素晴らしいように見えて、よくよく読めば拙いものである。

Webサイトが自動翻訳というダークサイドに堕ちた末に、オリジナルのコンテンツは、できるだけ多くの言語に翻訳されるようになった。

このため、コンピューターを使わない超正統主義派のユダヤ教徒の間でしか話されていないような、珍しいイディッシュ語の知名度が上がっているのだ。Google翻訳でイディッシュ語が提供されているがために、イディッシュ語がオンライン上で広がっていると、筆者は信ずる。

Googleは自動翻訳コンテンツを使うサイトにペナルティを与える

Googleは翻訳コンテンツと戦うために、二つの方法を用いている。AdSenseと検索だ。

検索:Googleは自動的に生成されたコンテンツを検出して、SPAMとして扱う。

AdSense:多くのサイトは、Google AdSenseを使って、コンテンツのマネタイズをしている。最近、多くの者が不満の声をあげていることには、Googleから「あなたのGoogle AdSenseアカウントが無効にされました」というメールを受け取ったということだ。その説明には、Googleは、「無意味なコンテンツや自動生成されたコンテンツをWebサイトが提供している」ことを検出したことにより、規約違反の可能性があるとのことだ。

Google翻訳は、自動生成されているがスパムではないコンテンツとして使うことができるか?

もし、Google翻訳が改良されれば、WebサイトはGoogleのガイドラインや罰則から逃れることができるわけだ。この可能性はあるだろうか。

そこで、筆者はあるアプリのオリジナルのテキストを、Google翻訳を使って、英語からスペイン語と、英語からヘブライ語に翻訳して、比較してみた。(Chrome Web storeの設定アイコンをクリックして言語を変えることで可能だ)

Googleがweb storeで使っている内部ツールは、公開されているオンラインツールより、いくつかの点で優れているようだ。これは自動翻訳を使う全員が注目すべきことである。

  1. 固有名詞の判定。Google翻訳は、ゲーム名(Parking Panic)を、同じ意味の用語(例えば、スペイン語では"Aparcamiento pánico")に、間違えて翻訳してしまっている。まあ、例えば読者がAppleであったとしたら、ブランド名を"Manzana"(フランス語で果物のりんごの意)に翻訳されたくはないだろうし、この場合もそうだろう。
  2. 文法の性の判定。これもGoogle翻訳の問題だが、内部ツールには存在しない問題だ。ゲーム説明のヘブライ語翻訳は、「彼女は素晴らしいゲームだ」となるが、内部ツールは、ヘブライ語における文法の性を認識して、よりマシな「これは素晴らしいゲームだ」とする。
  3. 綴り間違い。Microsoft Wordは、内部ツールの翻訳に綴り間違いを一つしか発見しなかったが、公開ツールでは、二つの綴り間違いを発見した。
  4. 流暢性。内部ツールは、他にもいくつかの点で、公開ツールよりよい判断をしている。スペイン語とヘブライ語への翻訳では、みたところ、スペイン語翻訳は公開版でも良いのだが、ヘブライ翻訳は、内部ツールでようやくかろうじて読めるレベルになる。

なぜGoogleは持てる最高の技術を公開しないのか?

筆者の推測では、Gogoleは検出できないSPAMがあふれかえるのをおそれているのではないか。何にせよ、AndroidやChrome storeで公開できるほどであるとおもうならば、なぜGoogle翻訳で使えるようにしないのか。Google君、君の規約は我々を縛るが、その縛りはマウンテンビューにはないとみえるね。

Googleは、内部的にはもっと優れた翻訳技術を持っているが、何らかの戦略的理由で、公にはしていないのではないかというお話。

2014-05-02

Linux Torvalds、最近のCPUのPage Faultのコストにご不満の様子

Linus Torvalds - Google+ - One of the things I end up doing is do a lot of performance…

Linus Torvaldsが、最近のIntelのCPUは、通常以外の処理のコスト、つまりPage faultのコストが上がっているので、問題であるとしている。

俺はよくカーネルコードのパフォーマンスプロファイリングをやる。特に、VMとかファイルシステム周りに対してだ。

俺がよくやるのは、「うまくいってるとき」に対する計測だ。つまり、だいたいほぼ完璧にキャッシュされてる状況だな。というのも、俺はもちろんIOのことは気にかけているが、俺の個人的なワークロードはたいてい、うまくキャッシュされてるからだ。たとえば、俺にとってよくあるロードは、pullした後のフルカーネルビルドだ。これにどのくらいの時間がかかるかが問題になる。というのも、俺はまず取り込んだものが、基本的なテストをパスするのを確認した後でなければ、次のpullをしたくないからだ。

さて、カーネルビルドシステムは、実際の所、けっこう賢い。ほとんどのドライバーやアーキテクチャーのpullでは、コアヘッダーを書き換えないので、「全カーネルを再コンパイル」というのは、それほど大規模なビルドではない。大方は、「オッケー、依存してるヘッダーとファイルは変更されてないな。何もする必要がねーぜ」というチェックだけだ。

だが、これを何千ものヘッダーファイルと、何万ものCファイルで行うわけで、けっこう時間がかかる。フルビルドカーネル("allmodconfig"なので、まあ大体フルビルド)で、「終わったぜ。pullは何もコンパイルする必要のある変更をしてなかったぜ」と言うだけでも、俺の普通のデスクトップでは、30秒はかかる。

まあ、30秒のallmodconfigは、それほどってわけでもない。だが、次のpullを始めるまでの待ち時間としては長すぎるし、コーヒーでも1杯といくには短すぎる。

要するに、うざいということだ。

そこで、俺はこのクソをぶっ殺すためにプロファイルしたが、半分ぐらいは、"make"が遅かった。これは、実際には、珍しいことに、カーネル由来のロードである。なぜならば、makeは大量のpathname lookupをしていて、けっこうな量の短命なプロセス(短いシェルスクリプトとか、"make"がfork/exitするとか)もやっているからだ。

従来、この手の問題の原因は、VFS pathname lookupで、もちろんいまだに大きな問題ではあるのだが、最近はそれだけの問題ではなくなっている。

最も大きいコストは何か? CPUによるPage fault handlingさ。

この「CPUによる」という部分に注目してもらいたい。カーネルVMはよくやってるのだ。問題はPage faultのコストそのものと、(小規模だが)、page faultから戻る"iret"のコストだ。

この問題を特定するために、ちょっとしたテストプログラムを書いたが、その結果が興味深い。俺のHaswell CPUでは、page fault一回のコストは、約715サイクルだ。"iret"で戻るのは330サイクルだ。そのため、page faultとreturnは、約1050サイクルだ。このコストは多少の誤差があるかもしれないが、近い値だ。他のテストでは、1150サイクルあたりに計測された。だが、これにもっとノイズが大きいので、1050は最小コストとしてはありえるだろう。

なんでこれが興味深いかって? カーネルソフトウェアが、ページを見つけてページテーブルに設定するためのコストは、はるかに小さいからさ。最悪の状況で(固定のzero-pageをマップしたばかりという、あからさまに作り上げた状況だが)、この1050サイクルは、全CPU時間の実に80.7%を占めるのだ。これは、カーネルもユーザースペースもpageをfaultさせるのにほとんど何もしていないという極端な例だが、俺の実際のカーネルビルドでは、全CPU時間の5%を占める。

古い32bitのCore DUoでは、俺のテストプログラムは、page faultオーバーヘッドは、80%ではなく、「たった」の58%だと計測している。これは、page faultが遅くなっているからだ(Core Duoのコストは、「たった」の700 + 240サイクルだ)

この問題の理由の一つとしては、Haswellは通常のコードでは改良されている(ので、faultオーバーヘッドが相対的に意識されやすい)が、コストが明後日の方向に向かっているのは、なんだかなぁ。

Intelエンジニアと話つけて、これを改良できるかやってみるか。

G+やHacker Newsのコメント欄では、ユーザースペースのビルドシステムの問題が指摘されている。

そもそもいまだに旧態依然のMakeを使っているのが問題なのだ。ビルドシステムに大量の小さなシェルスクリプトや、fork/exitのようなものが発生するから遅いのだ。例えばChromiumを見よ。規模はLinuxカーネルと同程度だが、まともなビルドシステムを使っているため、何もしないビルドは、数秒で終わるぞ。

といった意見だ。これに対しLinus Torvaldsは、

いや、そりゃ確かに、makeはブタでやりすぎだが、GNU makeの拡張機能や複雑な変数やらその他のよくわからんシェルエスケープやら何やらを駆使したところで、状況は改善しない。

だから、いわゆるmakefileコンパイラーが、この状況を最適化できるのは確かだ。だが、make代替品は自分でいくつも試してみた。imake, cmake, qmake, こいつらは問題の一部は解決しているが、やはり特有のクソさがある。

makeが超効率的になるのはありがたいが、俺としては、makeが必要とする部分のカーネルを最適化をしたいし、CPUに手間取ってもらいたくない。

というのも、まあ考えてみろ。たといカーネルビルドひとつ、超効率的になったとしてもだ、現実はそうじゃない。言っておくが、カーネルビルドでやっている「大量の小さなシェルスクリプトとか何とか」というのは、よそでもやっている現実のワークロードだ。page faultを最適化するのは、他のワークロードのためにも役立つのだ。

この話は、Old New Thingの記事を思い出した。

The hunt for a faster syscall trap - The Old New Thing - Site Home - MSDN Blogs

syscallトラップのパフォーマンスは興味深いものだ。

15年前[訳注:この記事が書かれたのは2004年なので、1989年頃]、IntelとMicrosoftと会議があった(残念ながら、私はこの会議に参加していなかったので、この話は伝聞なのだが)

Microsoftというのは、Intelの最大の顧客のひとつなので、Intelの代表はよくMicrosoftを訪問して、最新のプロセッサーを紹介したり、カーネル開発部に新しいプロセッサーの機能をサポートするようロビーしたり、どのような機能を追加すれば、もっとも役立つかという知見を吸い上げたりしていた。

この会議で、Intelの代表がたずねた。「でさ、たったひとつだけ、速くして欲しいところがあるとすれば、どこ?」

躊躇なく、カーネルの開発主任が答えた。「無効命令のfaultingの高速化」

Intel社員は笑い転げた。「いやぁ、Microsoftのエンジニアは愉快でいらっしゃる」というわけで、会議は冗談で締めくくられた。

研究所に戻った後、IntelのエンジニアがWindowsカーネルのプロファイルをしたところ、驚くなかれ、彼らはWindowsがかなりの時間を、無効命令例外をさばくためにつかっていることを発見したのである。何だと! ひょっとして、Microsoftのエンジニアは冗談を言ったのではなかったのか?

冗談じゃない。

この当時の80386チップで、V86モードからカーネルモードに移行する最速の方法は、無効命令を実行することだったのだ! そのため、Windows/386は、無効命令をsyscall trapに使っていたのであった。

この話の教訓? よくわからない。たぶん、何か物を作ったならば、それが作成者の意図しない方法で使われるだろうということか。

立っている者は親でも使えとは、それこれこれを謂か。

ゲームスペース柏木でドミニオンをした

ゲームスペース柏木の毎週木曜日に行われている木ドミに参加して、ドミニオンをしてきた・・・と思う、たぶん。私の知るドミニオンとは、だいぶ趣が違ったのだが。

ゲームスペース柏木というのは、新宿区百人町1-24-7のタウンプラザ3Fにある、ゲーム用の部屋だ。極めてわかりにくい場所にある上、タウンプラザという建物自体がカオスだ。何やら小規模な店舗が多数入っている。

さて、新宿駅から明後日の方向に向かって進んだ挙句、途中でブックオフを発見してしまったので、やむを得ずして立ち寄った後、ようやく柏木に到着した。中では、4卓はドミニオン、1卓はアグリコラをしていた。

さて、ある卓でのプレイが終わったので、入れ替わりに入って、ドミニオンをした。

ドミニオンというのは、覚えやすいルールでありながら、選択の余地が大量にあって、大変面白いゲームである。筆者はまだ、数えるほどしか遊んでいないが、筆者の知るドミニオンとは、カードを迷いつつ買って、相手が悩んでいるのを待つゲームであったはずだ。

しかし、この空間におけるドミニオンは、筆者が知っているドミニオンとは、だいぶ様子が違った。

まず迷わない。皆、手番を即座に終えてしまう。

迷わない結果、待たない。筆者が手番を終えて、カードをシャフルして、5枚引いて、さてどうするかと考えつつ、ふと顔を上げると、すでに手番が一巡した後で、皆、筆者の手番を待っている状態であることがほとんどであった。

そして、ゲームも短時間で終わる。その終わり方も唐突で、一人が一瞬にして得点を得て、しかもゲームの終了条件を満たすような終わり方であった。

今日、筆者は初めて、ドミニオン、ガチ勢の戦いを目の当たりにしたのであった。筆者にとって、この卓は極めて場違いであり、存在を申し訳なくも思った。こういうガチ勢の戦いに初心者が混じっている場合の上級者の感じるいらだちは、筆者も経験上知っている。もちろん、ゲーム人口を増やすためにも、初心者と遊ぶことは重要であるし、紳士であれば、そのいらだちを表に出すことはないが、感じるいらだちは否定しようがない。ドラクエで例えれば、ゲームを開始してラダトーム城を出たら、りゅうおうがあらわれた コマンド? 級の場違いさを感じた。

筆者は、ドミニオンのようなゲームは、あそこまでのめり込むほどの魅力を感じない。TCGの流れを組む、デッキ構築に、筆者はそれほど楽しみを覚えないのだ。デッキ構築という概念は、好きな人は好きで、特に、人が思いもよらないような戦略で勝つことを楽しみとする人までいる。

それにしても、このゲームスペース柏木という空間はどうなのだろうか。いわゆるコワーキングスペースに似通ったような空間ではあるが、これで利益が出ているのだろうか。興味深いところだ。

時に、今月の18日はカタン月例会だそうだ。ゴクリ。

2014-05-01

PCを置き換えるもの

Replacing the PC

なかなか興味深い考察を読んだので紹介する。

PC、すなわち、今のデスクトップやラップトップといった形のコンピューターを置き換える新しい形のコンピューターについて考察している。

PCを置き換えるのはタブレットだろうか。PCの売上が低迷しているなか、タブレットの売上はうなぎのぼりだ。

これは違う。なぜならば、タブレットの利用者の年齢層をよく見ると、オッサン、オバハン世代だからだ。アーリーアダプターが若い世代ではないというのは、いったいどういうことだ。

なぜタブレットはオッサン、オバハンに受け入れられているのか。それは、今のオッサン、オバハンは、コンピューターといえばデスクトップやラップトップから入ったので、その延長線上にある、タブレットを欲しがるのだ。用途は、ソファに座ってテレビを見ながらの操作だ。

では、時代を形成する今の若い世代は、何を使っているのか。スマートフォンである。今の若い世代にとって、コンピューターやインターネットとは、スマートフォンを意味するのだ。

ところで、タブレットとスマートフォンの新製品の傾向が興味深い。タブレットの大きさは、年々小さくなりつつある。逆に、スマートフォンの大きさは、年々大きくなりつつある。

これは、今のタブレットのサイズは、今より大きすぎるし、スマートフォンは小さすぎるためであろう。

すると、将来的には、タブレットとスマートフォンは融合して、ひとつの種類のコンピューターになるはずだ。

タブレットとは、ディスプレイとバッテリーの技術的な制約により生まれた一時的な産物に過ぎず、技術が進歩した将来は、タブレットとスマートフォンの区別がなくなり、それこそがポストPCなコンピューターであると結論している。

なかなか面白いが、スマートフォンやタブレットでは、まともにコードが書けないので、ポストPCなど幻想に過ぎない。

あるいは、将来、コンピューターの性能が極端に上がり、マウスもキーボードもディスプレイも何もかも、無線で接続できるようになるのかもしれないが。

2014-04-30

ノイズキャンセリングヘッドホンの購入をやめた

先日、超会議3の会場でノイズキャンセリングヘッドホンを体験したところ、実に素晴らしかったので、購入を考えた。騒音がなくなれば、どこでも集中して作業できるではないか。

ところが、今日、実際に展示されている場所で試した結果、やはり購入をやめてしまった。

なるほど、たしかに騒音は低減されるのだが、その結果として、人間の声が聞こえやすくなってしまう。筆者にとっては、人間の声のほうがはるかに気が散る。これでは逆効果だ。何万円も出してまで買いたいとは思わない。

ノイズキャンセリングヘッドホンは、超会議のような過酷な騒音環境で会話をするには向いているかも知れないが、消音効果としては、筆者向きではない。

さて、とはいえ騒音は低減したいものだ。今はイヤーマフの購入を検討している。

超会議3の超チューニング祭の感想

さて、超チューニング祭が終わったので、感想を書こうと思う。すでに、参加者の中で、感想を書いている人もいる。

レポート - 超チューニング祭で努力賞(最速賞)をとるためにやったこと - Qiita

ニコ動 超チューニング祭で最優秀賞もらいました

超チューニング祭に参加した - masarakki's blog

JavaScript - 超チューニング祭に参加&表彰した - Qiita

kmizu/slide_cho_tuning

また、いつの間に行ったのか、優勝者に取材したところもあるらしい。

『ニコ超3』の超チューニング祭で、“創世神”戀塚昭彦氏を上回ったカップルが見せたバランス感覚 - エンジニアtype

さて、筆者の視点からみた超チューニング祭はどうだったか。

そもそも、私がスタッフとして配置されるブースは、超時空ニコニコ研究所であるはずだった。しかし、超会議にさかのぼること三週間前、スタッフとして参加するドワンゴ社員向けの説明会の会場で、急遽、ユーザー企画のハッカソンに割り当てられたと告げられた。

なんでも、この企画はユーザーが提案したものにドワンゴが予算を出して行うまるなげ企画の一部らしい。詳細はよくわからないが、フロントエンドの最適化らしい。HTML, CSS, JavaScriptあたりだろうか。

ところで、ドワンゴから選ばれた他称精鋭達というのは、恋塚、まさらっき、水島、江添と、いずれもフロントエンドエンジニアではない。

そして、発表から超会議まで、時間が二週間ほどしかない。大丈夫なのだろうか。

かくして、その詳細が一切わからないまま、超会議3の当日となった。

当日、超チューニング祭の場所は、まるなげ広場の端に設置されていた。超歌ってみたと、何やら歌やダンスなどのパフォーマンスを行うらしき場所、さらには自作装甲車ブースに設置されたスピーカーもあって、これ以上ないくらいにやかましい場所であった。こんなところでコードが書けるのだろうか。

さて、当日、参加者に伝えられたレギュレーションは、以下のようなものであった。

サーバー側の変更は不可、HTML, CSS, JavaScriptの変更。

かつ、UI要件として、以下の条件を満たさなければならない。

  1. ログインボタン、プレミアム登録のためのボタン(もしくはリンク)
  2. 横長の広告が2つ
  3. 「利用規約」「特定商取引法」「ヘルプ」「PC表示に切り替え」「新規会員登録」へのリンク
  4. 2クリック以内で以下のコンテンツのリンク踏めるようにしてください。

また、パブリックなCDNなら使ってもいいという条件も追加された。

ファイルはsftpサーバーで取得、提出することになっていた。開始直後、なぜか誰もsftpサーバーに繋げられないという問題が発生した。用意したsftpサーバーが使用するポート番号を配布した資料に載せていなかったのが原因であった。

さて、実際にファイル群をみてみたが、現行のスマートフォン向けのニコニコ動画と同じ見た目になっている。

今回の競技では、評価点が二つある。パフォーマンスと、UIのデザインである。パフォーマンスの測定は、謎のテスト環境で測定されることになっている。UIデザインはユーザー投票で決定されるそうだ。実際の受賞には、測定と投票を元に審査で決定される。

しかし、UIデザインは、これ以上なにか改善場所があるようには思われない。このデザインが最高ではないにせよ、これは小さな画面のスマートフォン向けのデザインだということを考えると、そうそう複雑なデザインも使えない。

とすると、パフォーマンスを改善するのが、まず第一ということになる。

使われているCSSやJavaScriptも、一見すると、そんなに量が多いわけではない。しかも、大部分をGoogle AnalysticやjQueryなどの、有名なJavaScriptコードが占めていて、それほど改良点があるようには思われない。CSSやJavaScriptを一つのファイルに統合して、機械的な変換で最適化、最小化をほどこしたところで、どれだけ改善されるものか。

実際のパフォーマンス計測環境の詳細は明らかになっていないが、LTE回線とスマートフォンを使って行われるそうだ。そのテスト用のURLも提供されているが、キャッシュを破棄してリロードすると、明らかに遅い。

実は、この超チューニング祭のために用意された環境には、すこし意図的な罠が仕掛けられている。まず遅い理由というのは、jQueryをホストしているサーバーが、意図的にとてつもなく遅くされているのだ。そもそも、そのURIからして、あきらかに、「超遅いサーバー」と読める。

<script src="http://cyouosoiserver.kunikiya.jp/js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script>

CSSにも、よくわからないものがある。

/* 猫の日対応@2/22が終わったら消す */
.siteHeaderMenu .siteHeaderLogoNeconeco {
 width:152px;
 height:24px;
 background:url(/img/etc/shot/neconeco.png);
 background-size:100%;
 float:left;
 margin:15px 0 0 15px;
}
/* 猫の日対応@2/22が終わったら消す */

そして、CSSは明らかに同じ内容のものが重複していて非効率的にみえる。無駄にコメントアウトされたコード片もある。

このへんの整理をするのが、まずド素人ふるい落としということになるだろう。

あとは、CSSやJavaScriptのファイルをまとめたり、コードの最適化をしたり、不要な部分をそぎ落としたりするべきだろうか。少なくとも、機械的な最小化ぐらいは書けて損はないだろう。複数のファイルに分けられているとパフォーマンス上悪影響なので、CSSとJavaScriptは全部、HTMLに埋め込むべきだろうか。

細かい画像が多数ある。これはひとつの画像にまとめて、CSSで座標を指定して使う、いわゆるCSS Spriteにすべきだろうか。あるいは、HTML内にData URIとして埋め込むというのはどうか。

さて、どうするか。筆者は、HTMLやCSSやJavaScriptには詳しくないし、CSS Spriteのための作業などしたくない。それに、その他の最適化というのも、やはり泥臭い作業になる。仮にやったところで、筆者以上に優秀な人間がいるこの状況では、勝てるはずがない。

初日は、とりあえず非標準のCSSプロパティとベンダープレフィクスの削除をした。このようなCSSプロパティは使われるべきでない。特にベンダープレフィクスは邪悪である。これは、提供者が対応すべき問題ではないのだ。利用者側が、まともな規格準拠のブラウザー実装の最新の安定版を使うべきなのだ。もし、利用者が、何らかの理由で、自分の所有するコンピューターのソフトウェアを変更することができないとするならば、それは利用者側の問題である。提供者の問題ではない。特に、スマートフォンは不自由なコンピューターが蔓延しており、利用者にはroot権限すらないと聞く。なまじ、提供者が泥臭いハックで対応してしまうがために、利用者と、利用者を食い物にしている不自由コンピューターの売人がつけあがるのだ。つけあがらせてはならぬ。断じて妥協の姿勢を見せてはならない。

そして、CSSでは不自由なフォントファミリーが指定されていたので、それも削除した。

15時になった。初日は、15時にいったん、途中経過のパフォーマンスを計測するということであった。計測方法の詳細は公開されていないが、LTE回線を使ったスマートフォン実機上で計測するそうだ。

初日の途中計測では、意図的に遅いjQueryのCDNである、"cyouosoiserver.kunikiya.jp"に気がついたものが、別のCDNに切り替えるか埋め込むなどの回避方法を使って、ダウンロード時間を1秒台に削減していた。ちなみに、CSSプロパティをわずかに変更しただけの、ほぼデフォルト状態の筆者のダウンロード時間は、19秒であった。超遅すぎる。

それぞれパフォーマンスはまちまちであったが、計測結果の一位のスコアが圧倒的に素晴らしかった。なんと、ダウンロード時間は0.3秒で、処理時間が0.01秒ではないか。いったいどうやっているのだ。

sftpサーバーで該当のユーザー、user003のindex.htmlを見てみると、以下のようなコードであった。

<html>niconico(C++)</html>

なるほど、速いに決まっている。ちなみに、さんざん疑われたが、user003は筆者ではない。濡れ衣である。

もちろん、テスト結果では、user003はUI要件を満たしていないとされていた。

ただし、二位は0.6秒で、デフォルトとほぼ変わらぬ見た目と機能を維持していた。

しかし、この結果は興味深い。index.htmlが最小であれば、ダウンロード時間も処理時間も短縮される。当然である。JavaScriptとかCSSとか画像とかのリソースを別ファイルにしなければ、別々にダウンロードする必要もないので、パフォーマンス上有利である。そもそも使わなければ、なおいい。

では、もし、軽量なHTMLで、レギュレーションが規定するUI要件を満たしてやれば、パフォーマンス最速は狙えるのではないか。無論、そのようなページはすこぶる利便性を欠くため、ユーザー投票で負けることは確かだが、少なくとも、パフォーマンスで一位にはなれるわけだ。真面目な方法では、知識不足で勝つことは望めないとすれば、悪い戦略ではない。どんなに汚い方法であれ、レギュレーションさえ満たして、パフォーマンス計測で最速になればいいのだ。

さて、もう一度、レギュレーションの規定するUI要件を確認してみよう。

  1. ログインボタン、プレミアム登録のためのボタン(もしくはリンク)
  2. 横長の広告が2つ
  3. 「利用規約」「特定商取引法」「ヘルプ」「PC表示に切り替え」「新規会員登録」へのリンク
  4. 2クリック以内で以下のコンテンツのリンク踏めるようにしてください。

1. 2. 3.は問題がない。単にa要素やimg要素でリンクしておけばいいだけだ。問題は4.である。「以下のコンテンツ」というのは、結構たくさんあるし、ランキング一覧などもあって、単なるリンクひとつふたつだけで済ますことは出来ない。これをいったいどうしたものか。

ここで考える。この文面の条件さえ満たせばいいのだ。マキャベリになれ。方法は問わぬ。2クリックだ。2クリックでリンクが踏めればいいのだ。

さて、最初から叩き台として用意されているindex.htmlは、現行のスマートフォン向けページと、同等機能を有している。したがって、レギュレーションの規定するUI要件も満たしている。軽量index.htmlから、元のindex.htmlに飛ばしてやればいいのだ。

window.location.href="original_index.html" ;

しかし、デフォルトのindex.htmlで、もし「以下のコンテンツ」へのリンクを踏むために2クリック要するものがあれば、問題である。軽量index.htmlからオリジナルindex.htmlに飛ぶ際に、1クリックを要してしまうと、合計3クリック必要となり、UI要件を満たせない。すべて1クリックで行けるかどうか検証するのは面倒だ。

考えろ。こんなとき、マキャベリなら、何をするか。

結局、クリックが問題なのだ。クリックさせなければいいのだ。軽量index.htmlから、0クリックでオリジナルindex.htmlにとべればいい。そう、例えば、特定の要素の上にマウスが乗ったら、別ページに飛ぶような仕組みがあればいい。

elem.addEventListener("mouseover",
    function( evt )
    { // クリックしてないよ
        window.location.href = "original_index.html" ;
    }
) ;

これだ。0クリックでオリジナルのindex.htmlに飛べれば、UI要件は満たせる。UI要件さえ満たせれば、パフォーマンスは最速だ。もはやHTMLの機械的な最小化も必要ない。他社に比べて圧倒的余裕があるだろうから、リンクをCSSでボタン風のUIにしても、楽勝で一位になれるだろう。HTMLの機械的な最小化変換も必要あるまい。むはははははは。さらばだ、マキャベリになれぬ超真面目な諸君。レギュレーションさえ満たしていればいいという柔軟な発想ができれば、パフォーマンスで一位になれるのだよ。見よ、ダウンロード時間0.5秒、レンダリング時間0.01秒の、この圧倒的パフォーマンス。しかもUI要件は満たしている。これで勝てないはずがない。

結果は・・・甘かった。

結局、レギュレーションを満たすための大量のリンクのせいで、index.htmlのサイズは膨らむ。サイズが膨らむとダウンロードに時間がかかる。他の真面目なガチ勢よりはダウンロードが速いとはいえ、やはり時間はかかる。

そもそも、軽量なindex.htmlで、レギュレーションの規定するUI要件を満たすためのリンクをはる必要はないのだ。軽量index.htmlには、オリジナルのindex.htmlに自動的に飛ぶためだけのコードを入れればいいのだ。そうすれば、index.htmlのサイズは最小となる。ただし、計測を通すために、色々と飛ばす工夫が必要になり、レンダリング時間が伸びるが、そこさえ回避してしまえば、極めてサイズの小さいindex.htmlが作成できる。すなわち、ダウンロード時間の削減につながる。

したがって、筆者と同じ戦略を取ったもう一人の人間の発想のほうが、より柔軟であったために、敗北を喫してしまった。

パフォーマンス測定では、筆者は三位となった。そう、こんなに不真面目な戦略をとっても、まだ上がいるのだ。

さて、姑息なマキャベリ達はこのへんにして、超真面目勢はどうか。

まず、運営の仕掛けた初歩的な罠を、一瞬で把握したことはもちろんである。ドワンゴの他称スターエンジニア達は、しきりと、CDNが遅い、jQueryでタイムアウトまで待っている処理がある、この挙動は変えてもいいものだろうかと迷っていたが、彼らは冷静に、レギュレーションを満たしているかどうかだけを判断し、さっくりと挙動を変えた。Google Analyticsも使われていたが、そもそもレギュレーションにGoogle Analyticsを使えとは書かれていないため、あっさり削除された。

その他、CSSやJavaScriptの最適化、機械的な変換のようなことは、普通に行われていたようだ。

超真面目勢は、短時間でCSS Spriteに書き換えていた。あのように画像をひとまとめにして座標で指定するのは、完全に自動化できぬだろうから面倒で時間のかかる作業だと思うのだが、あっさりと書き換わっていた。特に再優勝賞を取ったチームは、画像の特性をみて、見た目をほとんど劣化させず圧縮しやすい加工までしていた。この手の画像処理は、デザイナーの得意分野なのだろう。デザイナーの価値を認識した。

そして印象的だったのが、画像のキャッシュだ。古くはcookie、Flash内のcookie、最近ではlocal storageのような、ユーザー側に保存されるストレージ領域に、画像を入れてしまうのだ。これにより、次回以降はJavaScriptでキャッシュの有無を調べて、ダウンロードを回避できる。

どうやら、テスト環境は、ばらつきを押さえるために、複数回のテストをして、その平均をとっていたようだ。問題は、テスト後にcookieやlocal storageのようなストレージ領域の破棄をしていないために、このようなキャッシュはとても効率的だったようだ。もっとも、多くの環境では、local storageが使えるだろうから、テスト環境がそのようになっていたとしても、悪いわけではない。

それにしても、HTMLを最小化していないし、コメントもあれば、CSSで無駄に装飾を入れて遊んでいたとはいえ、筆者の超不真面目な戦略が、デフォルトとほぼ変わらぬ見た目と機能を維持したガチ勢に負けてしまったことは、ただただ呆然とするしかない。

思うに、敗因は、HTML最小化やCSSの有無ではなく、同じURIの広告画像を二箇所に普通にimgで表示していたので負けたのだろう。筆者はData URIとか、local storageによる画像のキャッシュのような技法を使っていなかったのだ。複数のファイルに細かく分けるということは、極めてパフォーマンス上よろしくないことを認識した。

そういえば、誰だったかは忘れたが、今回の競技では、数十個のドメインを使って、ものすごく泥臭い画像の並列ダウンロードを実現していた人もいた。これは、多くのブラウザー実装で、ひとつのドメインから同時にダウンロードするファイルの数は、紳士協定により低く抑えられているため、ドメイン名を分けることで、大規模な並列ダウンロードをさせるというものだ。もちろん、local storageへの画像キャッシュに敗北していたが。

こんな突発的なチューニング競技に、いったいどれだけ真面目な人間が集まるのか。そして、この短時間で、一体どれだけ作業ができるのかと、筆者は疑問であったが、やはりプロは格が違った。それにしても、様々な技法があるものだ。

ドワンゴ広告

この記事はドワンゴ勤務外に書かれた。

4月26日、27日は、ドワンゴ社員のほぼ全員が超会議にスタッフとして参加するため、28日、30日は振替休日となっている。また、5月1日、2日は有給休暇の取得推奨日となっているので、まだ有給休暇を使い切っていないほとんどのドワンゴ社員は有給休暇を取得している。そのため、今年のゴールデンウィークは、9連休だ。

筆者はまだドワンゴに入社して日が浅いので、本来有給休暇はないのだが、5月1日、2日は、入社して日が浅い社員でも、特別に有給休暇の先取りを認めているので、休みとなっている。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

妖怪クッキング

東京のメシがマズいということは、もう十分に力説したので、いまさら言うまでもなかろう。東京のメシはマズい。これは純然たる事実である。

筆者は美食家というわけではないが、金を払ってマズいメシを食べたくはない。かつまた、東京の飯屋は高い。それならば、自分で作ったほうがいいだろう。

こういう理由で、東京に来てからはほぼ自炊している。これまでも自炊していたが、ここまで本格的に料理を作ることはなかった。

さて、今はゴールデンウィークという名の長期休暇なので、この機会に、積極的に新しい料理に挑戦するとしよう。

28日には、ピザを作った。ピザは強力粉とドライイーストを買ってきて生地から作り、もちろんトマトソースも自作した。ピザの具には、玉ねぎとピーマンとオリーブと生ハムを使用した。

まず、ピザ生地を作るのは、不安であった。作業中、何度も、果たして本当にこれでピザ生地が作れるのだろうかとの疑問が生じた。ピザ生地のレシピは、どれも大差がない。強力粉、塩、ドライイースト、水をこねるだけである。薄力粉をすこし混ぜると良いとか、ぬるま湯だとかの細かい工夫の差異はあるものの、基本的にはどのレシピも変わらない。今回は、強力粉だけで作ることにした。

まず、生地をこねるのは難しい。ベタベタする上に、強力な粘り気が出るので、全力でこねなければならぬ。すっかり疲労困憊してしまった。

どのくらいこねればいいのかわからないので、ある程度こねた上で、ラップをかけて放置した。これで発酵が進み、倍ぐらいの大きさに膨れ上がるはずである。

その間、来客もあったので、バックアップ用に買ってあった、出来合いのピザ生地で、ひとまずピザを作った。ギークハウス新宿で食べたピザより美味しかったことを記録しておく。

さて、2時間ほどたって、ピザ生地をいれたボウルをみてみると、なんと、倍ぐらいに膨らんでいる。さっそく生地をのばそうとしたが、強力に粘る上に、ベタベタで綿棒が役に立たず、引き伸ばせぬ。

すわ、どうしたものか。失敗か。

いや、ここで終わるわけには行かぬ。水を使ってベタつきを回避し、なんとかオーブンのプレート二枚分にピザ生地を引き伸ばした。その上にトマトソースを塗り、具材を配置して、チーズを山ほどかけて、220度のオーブンで15分焼いた。

結果は、みごとにうまいピザが焼きあがった。ピザ生地がやや分厚く、むしろパンのようになったが、しっかりとピザだ。「これは市販のピザよりうまい」、「金を取れるレベルだ」との感想が得られた。大成功だ。

ピザは結構な手間と金がかかるので、人が集まった時にしか作れない。幸い、いまはゴールデンウィークなので、次の4連休にでも、またピザを作ろうと思う。

29日には、ロールキャベツを作った。一応、ロールキャベツの形はしていたと思う。キャベツとつみれの入ったコンソメスープと何が違うのかと言われれば、返答に窮するのだが。

さて、今日は何を作ろうか。

ノイズキャンセリングヘッドホンの購入を検討中

ノイズキャンセリングヘッドホンの購入を検討している。きっかけは、超会議だ。

超会議では、超チューニング祭の場所が、超歌ってみたと、丸投げ広場のパフォーマンス場所に挟まれる形で設営されていたので、およそこれ以上ないぐらいにやかましい環境であった。会話が困難であり、耳栓をしても騒音が防げない。

その過酷な騒音環境で、たまたまノイズキャンセリングヘッドホンを試す機会があった。確か機種は、BOSEのQuietConfort 15であったと記憶している。

ヘッドホンを装着すると、騒音が消えた。まだ音は聞こえるものの、比較的快適だ。

スポンジの耳栓より消音効果が大きく感じられる。特に、重低音が聞こえなくなったのは大きい。しかも、耳が疲れない。

興味深いことに、通常なら会話できないほどの騒音環境であるにもかかわらず、このヘッドホンを装着すると、隣の人間と普通に会話できるようになった。

ノイズキャンセリングヘッドホンは、今まで購入を考えていたが、その値段に躊躇していた。ただ、ここまでその威力を示されると、購入を検討してしまう。

では、どれを買えばいいのだろうか。BOSEからは、これまでに三種類の製品が出ている。15, 3, 20という製品がある。

ノイズキャンセリング・ヘッドホン | ヘッドホン | Bose ボーズ

形状を考慮しすると、15は耳を覆うヘッドホンで、3は耳を上から押さえるヘッドホン、20はイヤホンのようだ。

消音性能の評価を調べると、20がいちばんよく、3と15は、どちらがよりよいかは、議論が分かれるようだ。

20が最も消音効果が高いというのは気になるが、問題は、20はイヤホンの他に、コントロールモジュールが付属していて、結局かさばりそうだ。それに、バッテリーが独自のもので、USB端子で充電するというの難点だ。3も、独自バッテリーという問題を抱えている。その点、15は入手が容易な単4電池で動作するので、好印象だ。

価格としては、どれも3万円以上するようだ。

2014-04-28

ピザ

とあるルートで生ハムを手に入れたので、ピザを作ることにした。

せっかくなので、ピザ生地から作りたい。調べた所、ピザ生地は簡単に作れるようだ。

さっそく、今日は半日かけて材料を買ってきて、ピザ作りに挑戦した。

ピザ生地は、強力粉とドライイーストを水でこねて、発酵させて作る。

トマトソースは普通に作ればよい。

ピザの具は、玉ねぎ、ピーマン、オリーブ、生ハムを使用した。

そして、シュレッドチーズを大量にまぶして、オーブンで焼いた。

結果は、大成功。

市販のピザよりうまいとの好評を得た。

ピザは案外簡単に作れるものだ。

大成功した感激でうまく文章が書けないので今日はこのへんで。

2014-04-27

超チューニング祭りの投票受付中

超チューニング祭 投票

超チューニング祭の競技は終わり、後は投票を待つだけとなっている。

上記URLからもっとも気に入ったデザインに投票ができる。

ところで、筆者の名前は江添亮である。筆者は超チューニング祭に参加している。この情報は何かの役に立つはずである。筆者の名前は江添亮である。何かの役に立つはずである。

ドワンゴ広告

この記事は超会議3の超チューニング祭のブースから執筆された。今はユーザー投票を待っている。筆者の名前は江添亮である。

超チューニング祭のブースは現在、飲み物と菓子を買い込んで、参加者だけの超懇親会かつ超ネットカフェと化している。近くにお立ち寄りの読者は、一声お掛け下されば幸いである。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

超会議3の見どころ

ニコニコ超会議3が幕張メッセで行われている。今回は、その見どころを紹介しようと思う。たまたま、筆者はドワンゴ社員であったために、開幕前に書くブースを回って、見どころのある場所を確認しておいた。

超のぼってみた

ホール6の中央、いこいのモールの中央から入った辺りに、クライミング用の壁が二面用意されている。筆者は26日の閉幕後に、二面とも登ったが、最高に楽しかった。筆者でも登れるほどの難易度なので、ぜひ挑戦してもらいたい。

どうやら筆者が登っている間に盗撮されていたようだ。

超ゲームマーケット

超ゲームマーケットでは、アナログゲームの販売とプレイが行われている。

この日のために、ドワンゴ社内では有名なトランプゲーム、大富豪の派生版、ニコニコ超大富豪のテストプレイが行われていた。

もし、このブースに立ち寄ることがあったら、読者のすべきゲームは、ダンジョン・オブ・マンダムである。筆者も参加したいのだが、なかなか混み合っていて難しい。

なお、このブースの隣には、不自由なゲーム専用機と、その上で動く不自由なゲームソフトウェアが展示されている上、このブースの向かいには不自由なOSの会社(なぜかLinuxカーネルへの貢献コード量は大きいのだが、これは自社プラットフォームをサポートするためであろう)がブースを開いているので、注意されたい。

超宇宙

このブースでは、ロケットのフェアリングをプロジェクターの投影用に使っていた。なかなか豪華だ。そして、USSRと書かれたソ連時代からのソユーズが展示されていた。なお、このブースの隣には、自衛隊と在日米軍のブースがあるので、日本、アメリカ合衆国、旧ソ連の建造物を一枚の写真に収めることができる。やれやれ、世の中は平和になったものだ。

超時空ニコニコ研究所

ここでは、ニコニコ動画の年表や、GIFアニメ一覧などを展示している。また、ニコファーレの映像をOculus Riftを使って展示している。

ちなみに、ここのOculus Riftには、ひとつR-18というラベルのはられたものがあり、それをかぶると・・・詳細は読者自身の目で確かめてもらいたい。

超歌ってみた

これは筆者が直接体験したわけではないが、超歌ってみたというのは、人前にでて歌うことが好きな人にとっては、とても素晴らしいブースになっているようだ。

バックダンサーつきで、しかも大勢の観客が盛り上げてくれるそうだ。とてつもなく豪華である。自分の歌によって、そのような圧倒的に盛り上がってくれる機会は、なかなか得られないだろう。

コスプレ

これは、どこのブースというわけでもない。会場の至るところでコスプレが行われている。参加者もコスプレして来ている人が多い。

ところで、筆者が思うに、コスプレをする者は、ある程度体を鍛えるべきであると思う。特に、露出の多い衣装を着用するものは、ある程度脂肪を落として筋肉が浮き上がっていなければ、見栄えが悪い。筆者も最近、腹筋を鍛えはじめている。無論、脂肪の落とし過ぎは健康に悪いので、程々にしなければならない。

今日は筆者も、超会議スタッフのコスプレをして各所を回ろうかと思う。

まるなげひろば

ここには、ユーザーにまるなげした様々な企画が行われている。特に、Oculus Riftを使ったゲームが複数あり興味深い。Oculus Riftは、最近どんどん有名になってきている。あの伝説のゲームプログラマー、John Carmackがidを辞してまでOculus Riftの開発に加わったのも、当然と言えるだろう。しかし、まさかあのJohn Carmackが、結果的にFacebook社員になるとは思わなかったが。

また、まるなげひろばでは、MicrosoftのKinectを使ったモーションキャプチャーを使い、可愛らしいローポリゴンモデルにモーションをさせる展示もされている。踊り手を募集しているそうだ。

超チューニング祭

これは、筆者が参加しているブースだ。場所はまるなげ広場の端、超歌ってみたとニコつくステージに挟まれていて、極めてやかましい場所にある。およそ、コードを書くのにこれほど不向きな場所もないものだ。

ここで、我々はニコニコ動画のスマートフォン向けのページをチューニングしている。

皆、本物のプログラマーであり、周りの喧騒を無視して黙々と作業しているので、周りから完全に浮いている。さながら、超会議会場にネットカフェを切り取って置いたような空間になっている。

なお、本日はユーザー投票が行われるので、読者は投票に来てもらいたい。超チューニング祭は、パフォーマンスの計測と、ユーザー投票により、順位が決定される。筆者もレギュレーションの範囲内で、パフォーマンスのチューニングとデザインを行った。おそらくパフォーマンスはかなり良くなったであろうし、決して万人受けするデザインではないが、レギュレーションの条件は全て満たしているはずである。もっとも、現時点では、筆者が妥協できるほどに自由なスマートフォンが存在しないため、筆者はスマートフォンを所有していない。したがって、実際にスマートフォンでどのように見えるのかということは、確認できないでいる。

超チューニング祭の様子については、後日、詳細な報告記事を執筆する予定である。

ただしひとつだけ行っておくと、user004は筆者ではない。筆者はuser016である。user004が速いのは、index.htmlの中身が以下になっているからだ。


<html>niconico(C++)</html>

確かに、これはダウンロード時間もレイアウトやレンダリングにかかる時間も短いが、悲しいかな、レギュレーション条件を満たしていない。

いまのところ一番真面目に健闘しているのは、user005のようだ。さっと確認した限り、昨日の段階では、index.htmlに直接記述して外部リソースを読み込まず、script要素も末尾に配置しているようだ。そういう工夫でテスト環境を突破できるというのは、なんだかお粗末な気がするのだが。

ドワンゴ広告

この記事は超会議3スタッフとしての特権をexploitして、まだガラ空きのうちに超会議3の各ブースを体験してから、会場内で書かれた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-25

超会議3の前日の手記

さて、明日は超会議3だ。ドワンゴ社員である筆者もスタッフの一人として参加する。

すでに告知されている通り、超会議スタッフとしての筆者の割り当ては、超チューニング祭だ。

筆者、江添亮はドワンゴ社員であるが、公式Webサイトに載っているルール以外、未だに何の情報も得ていない。したがって、競争のための条件は公平である。

公式Webサイトのルールは、公開後に更新されて追加されたので、もし参加者の中で、現在公開されているルールを閲覧していない者がいれば、閲覧すべきだろう。とはいっても、漠然とした情報しか公開されていない。

競技の参加者に関係がある情報を、念の為に書いておく。

多くの人間の集まるイベントであり、WiFiは不安定になることが予想される。有線による安定したネットワークに接続するため、参加者はLANケーブルを持ってくることが推奨されている。また、競技参加者には電源が提供されるので、バッテリーが6時間持たないコンピューターを持ち込む場合は、ACアダプターを忘れないように注意されたい。

当日の計測環境へのファイルのアップロードは、sftpプロトコルで行うということなので、sftpクライアントを用意する必要がある。

筆者のさしあたっての問題としては、明日、迷わずに幕張メッセにたどり着けるかどうかということだ。

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。筆者は今、ECMAScript Edition 5.1を読むのに忙しい。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-24

Ubuntu 14.04のリリースと、Ubuntu 14.10のコードネーム決定

Ubuntu 14.04がリリースされた。そして、ようやくMark Shuttleworthが、Ubuntu 14.10のコードネームを発表した。

Mark Shuttleworth » Blog Archive » U talking to me?

[訳注: タイトルは「タクシードライバー」の名セリフが元ネタ]

[訳注: この文章はやたらとUで始まる英単語が多く使われている]

この浮上したる約束されしUbuntuは、同僚のMPTが明言したるごとく、パフォーマンスのアアトなり。ただにアアトなるのみならず、こはdeadlineを行わざるべからず。かかる最新のリリースを成し遂げ、Trusty Tahrを14.04 LTSとして固めたりし諸氏に感謝感激雨あられ。そしてこの湧き上がる歓声とリリース後の休息を経て、今こそ水門を開きて種々の改良を成し遂げ、いでいで次の晴れ舞台の準備をせん。

[訳注: Ubuntu 14.04はI/OスケジューラーをCFQからdeadlineに変えた]

LTSに向けた努力は我々をして創造性を発揮せしめる。我々のユーザーは、パフォーマンスと安定性と保守性に特化した開発の結果を喜んでいる。そして、我々としても、技術的負債を一掃するための春の大掃除がやってきたことには喜ばしいものがある。しかし、春の大掃除の目的は、新しいアイディアと新しい技術を取り入れる余地を生み出し、もって次のリリースを屋根から飛び立たせることにある。Ubuntuで創造性を発揮するにあたって、今は絶好の時期である。我々は基本原理として革新の精神を備えている。我々のコアアプリ開発部が、例えば、フォンやタブレットやPCで輝かしい業績を示したように。そして、我々は同様に素晴らしい革新的を有する。LXC 1.0は、この地球で最速、最軽量の仮想環境であり、Ubuntuで生まれ育った。LTSが発表された今、まさに次のLinuxの世代の基礎を更新すべき時だ。より速く、より軽く、よりよくスケールし、よりよく保守できるように。我々はすべてのUbuntu開発者に、先駆的開拓者たりえる有益な変更をもたらすことができる唯一の立場を得ているのだ。

未来のUbuntu開発者は、アプリのアップデートをすべてのユーザーに一瞬で提供せんことを願う。我らはその願いを実現するものなり。Ubuntu開発者はすべてのクラウドとすべてのハードウェアに対して、デプロイを華麗に発行せんことを願う。我らはその願いを実現するものなり。Ubuntu開発者はPAASSaaSモノのインターネットを簡単に扱うことを願うによって、いざ実現せんとす。もし、自由ソフトウェアがその真の約束を果たさんとすれば、実務に使っている人々に役立つものでなければならぬ。我々はUbuntuを、開発や運用に携わる自由ソフトウェア開発者にとって最も役立つものにすべく活動しているのだ。

愛すべき我らの地に迫る必然の荒波を察すれば、今こそ、日陰を照らすときである。Ubuntuにsystemdをもたらす時である。Python 2.xから解放される時である。高地に、すなわち上流(Upstream)に歩みを進める時である。今こそ汚れを払い落とし、無益物を切り落とす時である。このクソコードを目の前にして、今こそ協力して、非協力性より有益性を高め、意地をすてて利点を考えよ。発狂や盲信はお呼びではない。いつも通りの仕事への注意深い検証と考察をすべき時なのだ。

[訳注: Ubuntuの今後の予定では、Upstartからsystemdに移行し、Python 2からPython 3に移行する予定である。また、自前で保守している自由ソフトウェアのパッチを本家に取り込んでもらうのはいいことである]

さて、最上のものを卓上に、あるいはフォーラムで、あるいはメーリングリストに置いた上で、なにか素晴らしい物を作ろうではないか。何か統一されていてすごいものを、何か世界に誇れるものを。今、我々は新規に始められる二年に一度の機会にいて、未来がどうなるかということについて制約を受けぬ野望を夢見ているのであるから、そのまま突き進んで、何か夢見がちな名前をつけよう。utopia unicornで始めよう。批評するがいい。vUDSで会おう。

いつも通り、Mark Shuttleworthの文章を訳すのは、死語となった言語を研究しているかのような難しさを覚える。

さて、Ubuntu 14.04がリリースされた。筆者の環境でのUbuntu 13.10からのアップグレードは、問題なく成功した。

まず、Linux Kernelは3.13になった。

Pythonは3.4だ。Ubuntuは、まだすべてのコードをPython 3に移行出来ていないが、いずれ移行する予定である。

gccは4.8.1から4.8.2になった。あまり代わり映えはしない。gcc-snapshotは2014年4月5日のものとなっている。

clangはclang-3.4が正式リリース版になった。どうやらlibc++も更新されたようで、-std=c++1yオプションを使っても、getsで失敗しなくなった。これにより、ローカルでC++1yを使える環境が、Ubuntuならば自前ビルドせずに構築できる。新たにスナップショット版のclang-3.5が付け加えられた。

vimは7.4.000から7.4.054になった。

さて、Unityにはいくつか変更が加えられている。まず、高DPIをサポートするためのスケール設定ができるようになった。また、メニューをウインドウごとのタイトルバーに表示できるようになった。また、Super+Wで各ウインドウを表示した時に、アプリケーション名をタイプすることでフィルターできるようになった。

そして、新しいウインドウデコレーションに変わっている。ウインドウの左右下のボーダー部分が完全になくなっていて、ウインドウ外にすこしシャドウがかかるUIになっている。黒背景のターミナルウインドウを黒背景のデスクトップの上に置くと見分けがつかない。私はあらゆるウインドウを全画面で切り替えて使うので問題はないのだが。

iBusは1.5.3から1.5.5になった。キーボードショートカットがうまく認識されない問題が解決されている。また、アプリケーションごとにIME有効無効の状態を保持できるようになった。

また、Ubuntu 14.04では、ブート、シャットダウン、サスペンドからの復帰が早くなったように感じる。特に、シャットダウンはとても早くなった。

現在、筆者が遭遇している問題は、たまにWiFiが使えなくなることだ。最も手っ取り早い解決方法は・・・再起動。ネットワーク関連のデーモンを再起動しても治らないので、ドライバーの問題だろうか。

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。ところで、次のC++WG論文集の発表は6月頃なので、しばらくはC++以外の記事が多くなるだろう。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

ドミニオンの拡張が送られてきた

筆者の住む妖怪ハウスの私宛に、ドミニオンの拡張が3箱送られてきた。すでに基本セットを購入済みだったので、実にありがたいことだ。

送られてきた拡張は以下の通り。

  • ドミニオン:海辺 (Dominion:Seaside)
  • ドミニオン:収穫祭 (Dominion:Cornucopia)
  • ドミニオン:暗黒時代 (Dominion:Dark Ages)

まだ実際にプレイしていないので、感想を書くことはできない。いずれ妖怪ハウスでボードゲームパーティでも開きたいものだ。

ドミニオンとは、実に商業的に素晴らしいゲームである。というのも、拡張を売りやすいゲームなのだ。これがカタンとなると、基本があまりにも完成されているために、拡張は蛇足になってしまう。ドミニオンは、新しい効果が追加されるほど面白くなるゲームである。

ただし、単純なルールが複雑にして、面白さを損ねてしまったドミニオン拡張もあると聞く。

2014-04-23

JavaScriptのオブジェクト初期化子

JavaScriptでは、オブジェクトをリテラル風に式の中に書くことができる。これは、オブジェクト初期化子(Object Initialiser)とか、オブジェクトリテラル(Object Literal)と呼ばれている。その文法は、{ }の中にプロパティを記述する。

var a = {} ;
var b = { PropertyName : AssignmentExpression } ;
var c = { A : 1, B : 2, C : 3 } ;

プロパティ名とその値のペアを、コロンで区切って指定する。そしてカンマで区切る。

オブジェクト初期化子は、{}内の最後をカンマで終わらせることもできる。

{ A : 1, } ;

これは、やや気持ち悪い文法だ。

PropertyNameには、識別子と文字列リテラルと数値リテラルを書くことができる。

var x = {
// 識別子
IdentiferName : 0,
// 文字列リテラル
"StringLiteral" : 0,
// 数値リテラル
3.14 : 0 
} ;

さて、オブジェクト初期化子のプロトタイプに文法には、もうひとつ、getter/setter、あるいは、アクセッサーなどと呼ばれているものを記述する文法がある。文法は関数式に似ているが、functionキーワードのかわりに、get/setを用いる。

function X( val )
{
    this.value = val ;
}

X.prototype = {
    get value() { return this._value ; }
    set value( val ) { this._value = val ; }
} ;

var x = new X(0) ;
x.value ; // 0
x.value = 10 ;
x.value ; // 10
x.value += 10 ;
x.value ; // 20 

アクセッサーは、通常の関数呼び出しの文法を使わずに、同じ識別子で、値の設定と取得を、単なる参照と代入というわかりやすい文法で行うことができる機能である。これは、例えば以下のように書くより、格段にコードがわかりやすくなる。


function X( val )
{
    this.value = val ;
}

X.prototype = {
    function get_value() { return this.value ; }
    function set_value( val ) { this.value = val ; }
} ;

var x = new X(0) ;
x.get_value() ;
x.set_value(10) ;
x.get_value() ;
x.set_value( x.get_value + 10 ) ;
x.get_value() ;

ちなみに、Where's Walden? » More SpiderMonkey changes: ancient, esoteric, very rarely used syntax for creating getters and setters is being removedによれば、アクセッサーの文法には、実に様々な歴史的な非標準の方言があったようだ。特にMozillaのものだが。

まず、__defineGetter__/__define_Setter__がある。これは、Object.definePropertyを使うべきである。

かつて、SpiderMonkeyのJavaScriptのパーサーに問題があったため、以下のようなコードが通ってしまっていた。

var x = { get a b() { return "get" ; } } ;

また、アクセッサーの生みの親であるNetscapeの当初の文法は、以下のものであったらしい。

function g() { print("gotten!"); return "get"; }
var o1 =
  {
    property getter: g,
    property setter: function(v) { print("sotten!  " + v); }
  };
var v1 = o1.property; // prints "gotten!", v1 === "get"
o1.property = "new"; // prints "sotten!"

SpiderMonkeyはこれをしばらくサポートしていた。

また、アクセッサープロパティを付け加えるSpiderMonkey独自の文法として、以下のようなものもあったらしい。

var o = {};
o.property getter = function() { print("gotten!"); return "get" };
o.property setter = function() { print("sotten!"); };
var v = o.property; // prints "gotten!", v === "get"
o.property = "new"; // prints "sotten!"

うーん・・・。

SpiderMonkeyの独自文法はまだある。

getter function foo() { return "foo getter"; };
var v = foo; // "foo getter"
var q = setter function bar(v) { };

うーむ。

そういえば、strict modeのとき、PropertyAssignmentの中のPropertySetparameterListの識別子として、"eval"と"arguments'が現れると文法エラーというのは、どういうことだろう。コード例で言えば、以下のようなものだが。

"use strict" ;

// SyntaxError
var x = { set setter( eval ) { } } ;

なぜ、数あるキーワードの中でevalとargumentsだけが特別に禁止されているのか。ちょっと調べただけでは出てこない。もうすこし規格を読み進める必要がありそうだ。

ドワンゴ広告

この記事はドワンゴ勤務中に、十分な昼寝とカタンをした後に、書かれた。睡眠は重要である。カタンも重要である。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-21

JavaScriptの誕生と終焉

The Birth & Death of JavaScript — Destroy All Software Talks

あの、Watのスピーカーとして有名なGary Bernhardtが、JavaScriptの誕生と終焉についてスピーチしている。

このスピーチは、2040年に行われているという設定である。JavaScriptが10日でやっつけ設計されたというところから始まり、JavaScriptが開発された地は、すでに放射能汚染されているという、2040年からみた歴史的事実を交えつつ、話は続く。

JavaScriptはあまりにも一般化してしまったため、皆JavaScriptで書くようになった。ただし、JavaScriptは遅いので、JavaScriptをネイティブコードにコンパイルしやすいようにする制限的な記法が流行した(整数型でいいところには、0をビット列論理和することにより、整数型であることのアノテーションとするなど)。

そして、他の言語からJavaScriptを生成することが流行した。もはや、C言語からすらJavaScriptを生成できる。

次第に、JavaScriptは移植性の高い共通のアセンブリの地位を確立させていく。

そして、核戦争が起きた。オーストラリアの辺境にでも住んでいる変人でもなければ、10年ほどプログラミングなど出来ない状況に陥る。

そして、ようやくプログラミング可能なほど状況が落ち着いたとき、人々はプログラミングできない間でも、潜在意識の中で、思案を続けていた。

そもそも、CコードがJavaScriptにコンパイルできるのである。OSはなんで書かれているか? Cである。OSをJavaScriptにコンパイルすればいいではないか。

OSは、ハードウェアの特権モードの支援を受けて、ユーザースペースのプロセスを、お互いに干渉できないような隔離を保証する。この特権モードの切り替えは、非常に高くつく。しかし、Webブラウザーはタブでソフトウェア的に隔離を実装しているではないか。

なんと2040年では、JavaScriptは、極めて移植性の高い共通のアセンブリ言語として君臨している。もう移植性のない点でバラバラのハードウェアについて考える必要はないのだ。JavaScriptで動作する分、2割ほど遅くなるが、ハードウェアの特権モードを多用しない分、2割ほど速くなる。掛け算がどのように働くかということをかんがえれば、0.8 * 1.2 = 0.96であり、ネイティブで実行するよりも多少遅くはなるのだが、これは許容範囲である。

そして、JavaScriptは死んだ。JavaScriptは使われているが、もはや誰もJavaScriptを直接書くことはない。

そういった内容の、架空のジョークスピーチだ。とても面白い。

ドワンゴ広告

この記事はJavaScriptと関係があるので、ドワンゴ勤務中に書いた。超チューニング祭に役立つ記事ではなさそうだ。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

JavaScriptの配列初期化子

ECMAScript Edition 5.1を§11まで読み進めた。§11は、式だ。ようやく面白くなってきた。

§10は、この後の文面で使いまわすための、擬似的な処理を定義している。

さて、いよいよ具体的にコードとして書く、式のセクションを読んでいる。なかなか楽しいが、配列初期化子の文法が興味深かった。

配列初期化子、あるいは配列リテラルは、[ ]の中に要素を書く。

// 結果は要素数4の配列、[ 1, 2, 3, 4 ]
[ 1, 2, 3, 4 ] ;

配列初期化子には、Elisionという文法があり、途中の要素を省略できる。省略した要素は、undefinedである。

// 結果要素数4の配列、[ 1, undefined, 3, 4 ]
[ 1, , 3, 4 ] ;

なるほど、これはよく分かる。しかしよくわからないのは、「Elisionが配列の最後に使われた時には、配列の長さに寄与しない」という文面だ。つまり、最後のElisionは、無視されるのだ。

// 結果は3
[ 1, 2, 3 ].length ; 
// 結果は3
[ 1, 2, 3, ].length ;

たいていの言語ならば、文法違反とするところだが、実に不思議で例外的な文法だ。

しかし、それだけではない。要素が任意個のElisionだけの場合の文法も特別に定義されていて、その場合は、末尾のElisionも配列の長さに寄与するのだ。

[].length ; // 0
[,].length ; // 1, [undefined]
[1,].length ; // 1, [1, undefined]
[,,].length ; // 2, [undefined, undefined]
[1,,].length ; // 2, [1, undefined]

気持ち悪い。極めて気持ち悪い。例外に例外を重ねた文法で気持ち悪い。

さて、次はオブジェクト初期化子だが、どうもこれも、文法が気持ち悪そうだ。

文法の汚さ、パースしにくさでいえば、C++は悲惨なのだが、しかし、このような不思議な文法は多くない。JavaScriptの文法は気持ち悪い。

それでも、JavaScriptの文法や思想は、いまさら言うことではないが、面白い。

ドワンゴ広告?

この記事は超チューニング祭に向けてドワンゴ勤務中にECMAScript Edition 5.1を読みながら書いた。

そもそも、この超チューニング祭というのは、ユーザーによる企画だそうである。実は筆者も詳しいことを知らない。公式サイトが更新されて、基本ルールが追加されたが、この更新情報も事前事後に知らさるような特別なはからいは一切ない。そのため当日は、ドワンゴ社員であることによる不公平な情報差は発生しないだろうから安心してよろしい。

ところで、その更新されたルールによれば、当日編集できるソースコードは、HTML, CSS, JavaScriptだという。

「超チューニング祭 ~ニコニコを超快適にしてみた~ in ニコニコ超会議3」の問題点 - Webサイトパフォーマンスについてで指摘されているように、ボトルネックの大半はフロントエンドにないというのは、実際その通りだろう。複数のCSSやJavaScriptを結合したり、最小化したりといった小手先の技術は、小さな最適化に過ぎない。

では、勝利を狙うカギは、パフォーマンス以外の評価点、すなわちUIデザインだろうか。スマートフォン向けのデザインは、小さな画面サイズのため、とても単純にならざるを得ず、差別化を行いにくい。

ところで、現在、自由なスマートフォンがないので、筆者は携帯電話を所有していない。当日は極めて厳しい戦いを強いられることになりそうだ。

そして、そろそろ「広告」の定義について根本的な疑問が生じている。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-20

妖怪ハウスの水道事情

筆者の住んでいるシェアハウス、妖怪ハウスは、ひとつ問題を抱えていた。水道の水量が極めて少ないという問題である。

水量が少ないということは、水の節約になるとはいえ、あまりにも少ない。料理や皿洗いに時間が余計にかかるほど水量が少ないのだ。しかも、複数箇所の蛇口から水を出すと、どちらも実用に耐えざるほど水量が少なくなるのだ。水を出すというのは、たとえばトイレの水を流したあと、タンクに水をためるのも、水を出しているので、誰かがトイレに入ったあとしばらくは、皿洗いが難しくなる。

就中、問題なのはシャワーだ。シャワーの勢いが弱すぎるということもあるが、あまりの水量が少ないため、なかなかお湯が出ない。思うに、給湯器から風呂場まで距離があるために、水を押し出すのに時間がかかっているのだろう。

あるいは、給湯器も怪しい。なぜか途中で水になったりする。浴槽に自動でお湯をはる機能も、途中て勝手に停止する。故障しているのだろうか。

とはいえ、業者を呼んでみてもらう金もないので、仕方なく、妖怪ハウスに引っ越してからこの三ヶ月は、シャワーを諦め、浴槽にお湯をはる運用でしのいできた。

時に、妖怪ハウスにもともとついていたシャワーヘッドとホースの結合部分が劣化し、水が漏れるようになってしまった。

ひょっとしたら、シャワーヘッドをもっといいものに変えれば、少ない水量でも、すこしはマシになるのかも知れない。そう思って、大きなシャワーヘッドを買ってきた。

シャワーヘッドを取り付けるにあたって、水の元栓をしめる必要があった。住人はなぜか、水の元栓がどこにあるか把握していなかった。不思議なことだ。玄関の横にわかりやすくついているのだが、なぜ気が付かないのだろうか。

さて、さっそく水道の元栓を締めにとりかかったが、どちらの方向に回せばいいのかわからない。どちらにも回る。

ん? どちらにも回る・・・まさか、まさか水道の水量が少ないのは、元栓が開ききっていないためだったのか。

そのまさかであった。シャワーヘッドの交換作業を終えたあと、元栓をいっぱいまで開けると、水量は豊富になった。もう複数箇所で水を出しても、水量が不足することはない。トイレを流した後に皿洗いができなくなることもない。そして、お湯が短時間で出るようにもなった。

興味深いことに、お湯が勝手に水になったり、お湯はり機能が勝手に停止する現象に悩まされることもなくなった。ひょっとしたら、水量があまりにも少ないために、給湯器に実装された何らかの安全装置が働いて自動的に停止していたのかも知れぬ。

そして、新しい大きなシャワーヘッドから供給されるシャワーは、豊富な水量も相まって、極めて快適になった。

およそ、人間の人生の中で、食事と睡眠と入浴ほど重要なものはない。すでに東京のメシはマズいことは述べた。筆者は東京でろくなものが食べられない問題を解決するために、自炊をしている。筆者は平時は22時には寝て6時には起きる生活をしているので、睡眠も十分である。そして、入浴の問題も解決した。これでようやく、妖怪ハウスは人生において重要な三要素を満たしたことになる。

後は、住人に掃除の習慣が根付けばいいのだが。

2014-04-17

JavaScriptの自動セミコロン挿入

JavaScriptでは、多くの文は、セミコロンという終端記号を明示的に記述して、文の終わりを示す。

var i = 0 ;
++i ;
--i ;

しかし、JavaScriptでは、一部の文脈で、セミコロンの省略が許されている。あたかも、セミコロンが自動的に挿入されたかのように振る舞う。これを、自動セミコロン挿入(Automatic Semicolon Insertion)

ECMA-262 Edition 5.1 §7.9が規定する、自動セミコロン挿入の定義を、本記事では解説する。

まず、三つの基本的なルールがある。

  • プログラムを左から右にパースした時に、文法上許されないトークン(反則トークン, offending token)があった場合、以下の二つの条件のうちどちらかひとつ、もしくは両方を満たせば、セミコロンが自動的に挿入される。

    • 反則トークンと前のトークンが、ひとつ以上の行終端子で分かたれている場合

      // 例
      var x
      x
      x
      x
      

      これは、以下のようにセミコロンが自動挿入される。

      // 自動セミコロン挿入後
      var x ;
      x ;
      x ;
      x ;
      
    • 反則トークンが}である場合

      // 例
      function f(){ var x }
      
      // 自動セミコロン挿入後
      function f(){ var x ; }
      
  • プログラムを左から右にパースした時に、トークン列の最後に到達したが、正しい文法を構築できない場合、トークン列の最後にセミコロンが自動的に挿入される。

    // 例
    var x
    
    // 自動セミコロン挿入後
    var x ;
    
  • インクリメント、デクリメント、continue、break, return, throwの間で、行終端子が許されていない場所に行終端子がある場合、セミコロンが自動的に挿入される。

    LeftHandSideExpression [行終端子不許可] ++
    LeftHandSideExpression [行終端子不許可] --
    continue [行終端子不許可] Identifier ;
    break [行終端子不許可] Identifier ;
    return [行終端子不許可] Expression ;
    throw [行終端子不許可] Expression ;
    

最後のルールは、たとえば以下のようになる。

var i = 0 ;

i // 自動セミコロン挿入
++ ; // 文法エラー
i // 自動セミコロン挿入
-- ; // 文法エラー

function f()
{
    return // 自動セミコロン挿入、undefinedが返される。
    {
    // JSON的な何か
    } ;
}

ただし、自動挿入したセミコロンが空文に解釈される場合と、for文のヘッダーの中では、自動セミコロン挿入は行われない。

// 空文に解釈される場合
if( cond )
else

これは、もし自動セミコロン挿入が行われるとするならば、以下のようになる。

// 空文に解釈される場合
if( cond ) ;
else ;

このセミコロン挿入は、どちらも空文となるので、自動セミコロン挿入は行われない。

for文のヘッダーとは、for ( ... ; ... ; ... )のことだ。これにも自動セミコロン挿入は行われない。

さて、なぜ自動セミコロン挿入などという規則が存在するのか。思うに、ECMAScriptというのは、規格があって、しかる後にJavaScriptとして実装された言語でではない。JavaScriptという実装だけが先行して、あとからデファクトスタンダードとなった挙動を、ECMAScriptとして追認した形なのだ。規格の責任ではない。無秩序に進化した実装の歴史的経緯の問題である。したがって、既存の実装の挙動を、なるべく正確に規格に落としこんでいる。ECMA-262 Edition 5.1は、既存の実装の挙動を規格に落としこむという点で、非常にいい仕事をしたと思う。文面は読みやすい。JavaScriptは、C++より落とし穴が多い言語であるが、ECMA-262 Edition 5.1で、だいぶ救われている。

なお、規格では、自動セミコロン挿入には頼るべきではなく、明示的にセミコロンを書くべきだとしている。

ドワンゴ広告

この記事は、ドワンゴで最も怠惰な社員である筆者が、出社早々To Court The Kingで遊んだあとに、超チューニング祭に向けて準備をするふりをして書いた。まだバレていないようだ。

そういえば、昨日、珍しく時間の指定されて参加する必要のある社内会議があったので、予定時間の5分前に会議室に行った所、まだ誰も集まっていないどころか、会議室が別の会議で使用中であった。仕方がないので、一旦引き上げて、予定時間の2分後に会議室に行った所、前の会議の参加者は引き上げた上に、すでに全員集まって着席していた。一体、わずか7分間の間に何があったのか。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-16

JavaScript規格の正規表現リテラルの文面の疑問点

JavaScript規格、ECMA-262 Edition 5.1を読み進めていて、以下の文面が気になった。

A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical.

正規表現リテラルは、リテラルが評価されるごとに、RegExpオブジェクトに変換される入力要素である。プログラム中の二つの正規表現リテラルは、たとえ二つのリテラルの中身が同一であっても、===と比較されることのない正規表現をオブジェクトに評価される。

§7.8.5 Regular Expression Literals

つまりは、/./ === /./ はfalseになるということだ。正規表現リテラルが評価されるごとに別のオブジェクトになるということは、以下のようになる。


for ( var elem in [ true, false ] )
{
    var r = /./ ; // ひとつの正規表現リテラル 
    if ( elem )
        var a = r ;
    else
        var b = r ;
}

a === b ; // false

なるほど、確かに複数回評価されている。

しかし、文面では二つの正規表現リテラルとあるが、このプログラム中に、正規表現リテラルはひとつしかない。ひとつの正規表現リテラルが二回評価されるだけだ。と、屁理屈めいた疑問も生ずる。

筆者が規格を読むときは、文面は全て間違っているという前提で読むので、このような屁理屈のような疑問が生ずる。

ドワンゴ広告

この記事はドワンゴ勤務中にやんごとなき理由により自分の机を離れて書いた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

JavaScriptのコメントと改行

今回の記事は、JavaScriptのコメントの文法についての、とてつもなく些細な内容になる。

まず、「改行」の定義について

ECMAScript規格では、俗に改行と呼ばれているものは、正式には、行終端子(Line Terminator)と名づけている。行終端子は5個あり、これは4種類の文字からなる。なぜ4種類の文字で5個あるのか。ひとつは組み合わせなのだ。

行終端子を構成する4種類の文字は、\u000A(Line Feed), \u000D(Carriage Return), \u2028(Line separator), \u2029(Paragraph separator)である。

しかし、慣習的に、CRに続くLFを、ひとつの「改行」とみなすことが横行している。JavaScriptはこの慣習を追認する形で、CRLFの2文字をひとつの行終端子として認識する。

さて、本題に入ろう。JavaScriptのコメントには、一行コメントと、複数行コメントがある。

// 一行コメント

/* 複数行
コメント*/

コメントは空白文字とみなされる。

一行コメントは、//から行終端子までがコメントとなる。ただし、行終端子はコメントに含まれない。

複数行コメントの中に行終端子があった場合、複数行コメントは、行終端子とみなされる。

なぜ行終端子が残るのかというと、自動セミコロン挿入(automatic semicolon insertion)のためだ。


function f()
{
    var i = 0 ;
    i // 一行コメント
    ++ ; // エラー
}

一行コメントは、行終端子として認識されるので、自動セミコロン挿入が働く。したがって、上記のコードは、正しく文法エラーになる。

JavaScriptの自動セミコロン挿入については、このブログでも4年前に取り上げたが、当時はまだ規格の読解力が今ほどではなく、やや稚拙であるので、この機会に、規格を§7.9まで読み進めたあとで、解説しようと思う。

ドワンゴ広告

この記事は意識高い系ドワンゴ社員である筆者が、超チューニング祭のために、自発的に06:33に出社してECMA-262 Edition 5.1を読みながら書いた。

昨日は、実質七時間しか睡眠を取っていない故に「つれー」状態にある。実質七時間なのだ。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-15

Multipath TCPについて

Multipath TCPとは、複数の経路を扱うためのTCP拡張である。実は、以前、本の虫: MultiPath TCPのLinuxカーネル実装という記事で、その実装デモを紹介している。

従来のTCPは、IPとの分離ができない。TCPヘッダーの中には、ひとつのIPアドレスとポートがある。経路ごとにIPアドレスが割り振られるので、経路を変えるには、別のTCPコネクションを貼り直さなければならない。

しかし、複数の通信経路を持つという環境は、もはや珍しいものでも何でもなくなっている。たとえば、多くのラップトップにはEthernetとWiFiの二つの経路があるし、スマートフォンにも、WiFiと3G/4Gという複数の経路がある。特にスマートフォンの場合、経路が使えるかどうかが頻繁に切り替わる。

過去に、TCPで複数のIPアドレスを扱う拡張はいくつも出されたが、いずれも、IPアドレスを隠すという点で、非効率的である。

複数の経路を直接扱えれば、パフォーマンス的にも、冗長性的にも、利点がある。

実は、トランスポート層で、複数のIPアドレスを扱うプロトコルは、すでに設計されている。SCTPだ。

SCTPは単に複数のIPアドレスを使えるのみならず、ストリーム単位を混ぜあわせて送信し、受信側でストリーム単位に分解できたり、送信バイト数を通知して、全部受信するまで待機できたりと、従来ならアプリケーション層でやっていたことが、トランスポート層で面倒を見てくれるので、とても便利なのだ。

問題は、SCTPのその他の利点は、とてもニッチな分野でしか需要がない。古い歴史を持つTCPには様々な問題があるとはいえ、既存のTCPからの移行コストを支払ってまで置き換えるほどの利点ではない。

それに、既存のほとんどのルーターが、SCTPパケットを、単に破棄してしまう。卵と鶏の問題と同じで、SCTPの利用者がいないので、ルーターベンダーはSCTPをサポートしない。ルーターがSCTPをサポートしていないので、開発者はSCTPを使えない。

必要とされているのは、既存のTCPパケットとして流せて、既存の機器でも問題なく動く、TCPの拡張だ。それが、Multipath TCPである。

MTCPは、アプリケーションからは、従来のsocketによるTCPと同じように扱える。ただし、アプリケーションが従来のTCPと同じだと信じているものは、実はMTCPによるレイヤーを通した仮想的なもので、本物のTCPコネクションは、MTCPによって管理されている。MTCPは複数の経路をまとめて管理し、アプリケーション側には、従来のTCPのようにみせかける。

MTCPの実装には、TCPオプションを使う。しかし、これは現実的に問題になる。

今日のインターネットは、当初のインターネットとは大きく違う。経路上に、実に多数の、中間箱(middlebox)が存在する。ルーターやスイッチだけではなく、ファイヤーウォールやらNATやらロードバランサーやらDeep Packet Inspectionやらだ。多くの中間箱が、TCPパケットを書き換える。

そもそも、モダンなNICは、効率化のために、勝手にTCPパケットを分割する。この際、TCPヘッダーは、単にコピーされてしまう。そのため、MTCPがTCPヘッダー内で予約して使うデータシーケンス番号が、コピーされてしまう。

MTCPシーケンス番号のコピーは、従来のTCPシーケンス番号の範囲のマッピングにより対処した・・・つもりであった。しかし、これでも問題があった。なんと、多くのルーターが、シーケンス番号を書き換えているのだ。背景には、最初のシーケンス番号をランダムに開始しない脆弱性ある実装に対処するため、ルーター側でシーケンス番号を振り直すということが、広く行われているようなのだ。このため、マッピングを絶対的ではなく、相対的にすることで、対処した。

さらに、active FTPなど、複数のTCPコネクションを貼り、ASCIIでIPアドレスをエンコードするような特定のプロトコルに対し、中身を書き換える(すなわち長さも変わる)などの改変を行うルーターすら存在する。

Linuxカーネルに実装されたMTCPでは、チェックサムを使うことで、データの改変を検知し、従来のTCPにフォールバックする実装になっている。

研究者がインターネット上の中間箱(middlebox)について調査を行ったところ、どうやら今日のインターネットでは、TCPパケットのあらゆる部分は、中間箱により改変される可能性があるということが判明した。これは、将来のTCP拡張を設計する上で考慮に入れなければならないことである。TCPヘッダーの中身のあらゆる箇所は、改変されないという保証がないのだ。

さて、利用例であるが、Wifiと3G/4Gなどの複数の経路を持つスマートフォンやデータセンターが挙げられている。

スマートフォンは、短期間で有効、無効が切り替わる複数の経路でも、TCPコネクションを維持するために使われる。

今日、データセンターでは、複数の経路を使うことは当然になっている。ただしその実装は、複数の経路をロードバランサーなどでまとめて、ラウンドロビンで複数の経路にパケットを割り振り、あたかもひとつのMACアドレス、ひとつのIPアドレスを持つように見せかけている。これは非効率的である。また、通常の経路と、バックアップ用の待機経路を持って、冗長性を確保するという利用方法もある。MTCPならば、複数の経路がそれぞれ異なるMACアドレス、IPアドレスを持てる。直接MTCPが管理するので、パフォーマンス目的でも、冗長性目的でも、効率的に管理できる。

Multipath TCPは、従来のTCPパケットのまま経路上を流せるということと、安全のために従来のTCPへのフォールバックがある、既存のアプリケーションの対応が必要ないという点で、移行しやすい拡張だと言える。

現在、Linuxカーネルで実装されていて、FreeBSDでも実装する計画がある。

さて、流行るだろうか。理想主義者の筆者としては、むしろ抜本的な解決方法として、SCTPのような全く新しいプロトコルが主流になって欲しいのだが。

ドワンゴ広告

この記事は、たまたま、ドワンゴ社内にCOMMUNICATIONS OF THE ACM 04/2014 VOL. 57 NO.04が転がっていたので、興味を引いたMultipath TCPについての論文を読んで、勤務時間中に書いた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-04-14

Python 2.7のサポート期間が2020年まで延長

peps: 76d43e52d978

Python 2.7のThe End Of Life時間(EOL、日没の時間)は5年間延長されて、2020年になった。この決定はPython 2.7の状態を明確にし、まだPython 3に移行出来ない利用者の懸念を取り除くものである。PEP 466も参照されたし。

この表明は、バグ修正リリースが頻繁に行われることを保証するものではないが、Python 2.7のバグ修正を行いたいボランティアの貢献を可能にし、また、今後もしばらくPython 2をサポートする必要のあるベンダーを満足させるものであろう。

Python 2.8はない。

いかにプログラミング言語にとって、下位互換性が重要化が分かる事例だ。Python 3は、下位互換性をぶち壊す変更をすべきではなかった。たとえどんなに汚かろうが、一度使われてしまった文法は、いまさら廃止することは出来ないのだ。

ドワンゴ広告

この記事は、そろそろドワンゴを退社しようとしかけたところでニュースに気がついたので、急遽、勤務中に書いた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

JavaとJavaScriptの違い

JavaとJavaScriptには、Unicode escape sequenceというものがある。どちらも同じ文法で、\uに続いて4文字の16進数文字を指定することで、Unicode Code Pointを指定できる。あたかも、Unicode Code Pointを記述したかのように振る舞う。

ところで、JavaとJavaScriptは、このUnicodeエスケープシーケンスの使い方が異なる。例えば、行終端文字\u000Aを、以下のように書く。

// これは\u000Aコメント

これは、JavaScriptで解釈すると、以下のようになる。

// これは\u000Aコメント

以下は、Javaによる解釈である。

// これは
コメント

Javaでは、Unicodeエスケープシーケンスが、実際に行終端文字として扱われてしまう。したがって、行終端文字以降が一行コメントからはみ出してしまう。

これは、文字列リテラルの中でもそうである。

"これは\u000A文字列リテラル" ;

というコードは、Javaでは

"これは
文字列リテラル" ;

と解釈される。Javaの文字列リテラルは、途中に改行文字を記述してはならないので、これはエラーとなる。Javaで文字列リテラルの中に、リテラルの値として改行文字を入れたい場合は、\nなどと書かなければならない。

Javaは謎すぎる。ますますJavaはクソであるという認識を新たにした。

というわけで、ECMA-262 Edition 5.1を読んでいるが、まず、文法記法の丁寧な定義が書いてある。これはとても親切だ。ただし、丁寧な定義と引き換えに、いろいろと文法記法が複雑になっている。これは、JavaScriptのデファクトスタンダードな文法を、後から追認する形で規格化したので、どうしてもこのような複雑な記法にならざるを得ないのだろう。例えば、改行が意味を持つ文脈など。

次はLexical Conventionsだ。

ドワンゴ広告

この記事は超チューニング祭のために勤務中にECMA-262 Edition 5.1を読んでいて興味深かったので書いた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0