ブギーボードを借りました

このエントリーを含むはてなブックマークはてなブックマーク - ブギーボードを借りました この記事をクリップ!Livedoorクリップ - ブギーボードを借りました Share on Tumblr newsing it! Bookmark this on Delicious Digg This

少し前から会社でT丸さんがこれみよがしにブギーボードを使い始めました。ちらちらとみんなに見せつけます。良いモノだとは決して言いません。ただ黙って見せつけるだけです。そんなに良いモノなら少し使わせてください、と頭を下げる羽目になりました。

そして数日使っています。

書き心地はなかなかのものです。しかし不満もあります。画面が狭い点です。何かメモを書いていると、もっと書くスペースが欲しくなります。最新のブギーボードはデータ保存機能があるようですが、T丸さんのブギーボードは旧式なので保存機能はありません。書いて消す、これだけの機能です。書くスペースがなくなると消すしかありません。一時的にページを取っておきたくても手段がありません。永続的な保存機能を欲しいとは思いませんが(一時的な書き物と割り切っているので必要は感じません)、数ページ分の書きスペースを欲しいと思った時の手段がないのは辛い部分です。

結論として、利便性は紙とペンに軍配が上がります。それでも、ちょっとしたミーティングの時には使えそうです。紙とペンよりやる気がありそうに見えるからです(たぶん)。

ブギーボードの一番のユースケースは、使っているのを見せつける使い方です。そう、T丸さんは意地が悪くて見せつけていたのではなく、ブギーボードのもっとも正しい使い方をしていたのでした。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | コメントをどうぞ

「ストラウストラップのプログラミング入門」を読みました

このエントリーを含むはてなブックマークはてなブックマーク - 「ストラウストラップのプログラミング入門」を読みました この記事をクリップ!Livedoorクリップ - 「ストラウストラップのプログラミング入門」を読みました Share on Tumblr newsing it! Bookmark this on Delicious Digg This

ストラウストラップのプログラミング入門を読みました。

C++作者のストラウストラップ先生(以下、先生)の書いた本です。分厚いです。写真を撮るとこんな感じです。HTCのアンドロイド端末と同じぐらいの幅です。

先生の書いた本なので是非読むべきです、と言いたいところですが、この分厚さを万人には勧められません。人生の優先順位は各自それぞれだからです。全部を読めない人のために、優先的に読むべき箇所を決めるために各章の個人的主観を書きます。

用語集

本の巻末1093ページから始まる用語集は立ち読みでも読む価値があります。8ページなのですぐに読めます。一例を抜粋します。

  • 型: オブジェクトにおいて有効な値および演算を定義するもの
  • 値: 型に基づいて解釈されるメモリ内のビットの集合
  • 演算: 関数や演算子など、何らかのアクションを実行できるもの
  • 関数: プログラムの別の場所から呼び出せる名前付きのコードの単位。計算の論理的な単位

人によっては上記を読んで、(特に関数の説明に)C++固有で意味を限定しすぎていると感じる人もいるかもしれません。しかし、こういう基本的な用語を(異論はあれど)きちんと定義してくれる本は意外にありません。その点で貴重です。かつ先生の定義なので、困った時に使えます。

Javaのジェネリック型は知っていても、「ジェネリックプログラミングとは?」と聞かれて答えられない人は、本屋に行って用語集だけでも立ち読みするとよいでしょう。ちなみに用語集の中で一番面白いのは「パラダイム」の説明です。どんな説明かは読んでのお楽しみです。

第0章

短いですし読む価値があります。心に残る一言を抜粋します。

たとえば、プログラムでミスを犯すのがいかに簡単で、それらを修正するのがいかに難しいかを学ぶまでは、ソフトウェア開発手法の真価を見きわめることはできない。

第1章

あまりにどうでもいい一般論なので読まなくてもいいでしょう。一言でまとめると、ソフトウェア開発は現代社会で重要です。

第2章

Hello, World!のタイトルの章です。自分には不要でした。C++のコードを見たことのない人には意味があるかもしれませんが、その人にとって本書が意味があるか不明です。

第3章

「オブジェクト、型、値」のタイトルです。同じような話をパーフェクトJavaで書きました。パーフェクトJavaを執筆前に本書を読んでいなくて良かったです(もし先に読んでしまっていたら、パクリみたいに思えて却って書きづらかったからです)。

第4章

前章に引き続き、C++の基本的な言語機能の説明が続きます。C++の構文を知らない人や忘れている人は読むと良いでしょう。

第5章

エラー処理の話です。

第6章

第7章

時間のない人に、本書の中で読むべき章を選べと言われたら、第6章を挙げます。第7章は内容的に続きなので興味があれば読み進めるとよいでしょう。構文解析(パーサ)の説明です。if文やwhile文など言語の基本構文の説明の次がいきなり構文解析です。先生にとっては普通の展開なのでしょう。

この章を勧める理由は、内容が難しいからあるいは高度だからではありません。とても説明が平易だからです。電卓プログラム(ありがちですが)を題材にして、何度も間違いコードを出しながら少しずつ正解に導きます。一例を挙げると以下の文法に対して

Expression:
 Term
 Expression "+" Term
 Expression "-" Term
Term:
 Primary
 Term "*" Primary
 Term "/" Primary
 Term "%" Primary
Primary:
 Number
 "(" Expression ")"
Number:
 floating-point-literal

次のようなコード例を挙げます。

double expression()
{
  double left = term();
  Token t = get_token();
  switch (t.kind) {
  case '+':
    return left + expression();
  case '-':
    return left - expression();
  default:
    return left;
  }
}

このコードにはバグがあり、ここから更に2回書き直しをします。コードを見て、すぐに間違いに気づく人に本書は不要です。どこに間違いがあるか見当もつかないなら、本書第5章から3章分を読む価値があります。

第8章

再び、C++の基本に説明が戻ります。変数や関数などの説明です。参照の話など、この章もパーフェクトJavaと説明が被ります。つくづく執筆前に読まなくて良かったと思います。

プログラミング初学者であれば読んで損はありません。経験者には自明の話が続くかもしれません。

第9章

クラスの話です。C++を使う予定のない人でも、教養としてC++のクラスの言語機能は知っておいたほうがよいでしょう。本章から心に残る一言を抜粋します。

さらに調べているうちに、複雑すぎるために前の単純な解決策よりも悪いものを思い付いてしまう、ということになるかもしれない。これは最善は善の敵(ボルテール)の1つの真意である。

第10章

第11章

ファイル操作まわりの説明です。C++をきちんと勉強したい人は読むべきです。教養としてC++を学んでいる人は必要になるまで読まなくてもいいでしょう。

第12章

第13章

第14章

第15章

第16章

5章を割いてGUIプログラミングの説明です。しかもマイナーなFLTKです。

ぼく自身は世代的にX Window Systemのプログラミングもやりましたし、Windowsプログラミングもしました。GUIプログラミングの経験が自分のプログラミングの学習の助けになったことは否定しません。しかし、今プログラミングの勉強を始めた人にGUIプログラミングを勧める気はなるかと問われると迷います。とは言え、Webアプリのプログラミングしか知らないと大事な何かを欠いたままではないかという懸念があるのも事実です。どうなんでしょう。よく分かりません。でもFLTKはないよな、と思います。せめてAndroidプログラミングだろうと思います。

第14章に仮想関数の内部実装のvtblの話がこそっと差し挟まれます。vtblという単語を聞いたことのない人には、ポリモーフィズムの仕組みを知る上で読むと面白いかもしれません。

第17章

第18章

ポインタと参照の話です。K&R2を読んでいる気分になるほど原理原則の話です。この章の内容を理解しているJavaプログラマと、していないJavaプログラマでは、同じJavaプログラマと呼ばれていても別次元の存在です。

第19章

テンプレートとジェネリックプログラミングの話です。たとえJavaのジェネリック型しか使わない人でも、C++のテンプレートを知っておいて損はありません。

第20章

第21章

前章の続きですが、STLの各論に入ります。自分の好きなプログラミング言語のコレクション型と比較しながら読むと興味深いと思います。各論なので、必要になった時にリファレンス的に読むのでもいいと思います。

第22章

趣が変わりプログラミング言語の歴史を語る章になります。有名人の写真を眺めるために読みます。アタック25の最後で「この人物の名は?」「Alexander Stepanov」「その通り!」のやりとりをいつかするために読む必要があります。

第23章

テキスト処理と題して正規表現の説明などがあります。正規表現は大事ですが、C++本で読む必要は感じません。

第24章

数値の章です。配列、行列、複素数などです。必要な人は読むと良いでしょう。

第25章

「組み込みシステムプログラミング」と題して、雑多な話題が散りばめられています。

C++でコレクションを共変にできる話題がさらっと触れられています。共変にできるというのは、Array_refを不変のArray_refとして扱えるという意味です(CircleがShapeを継承している場合の話です。ここでの「不変」はinvariantの意味ではなくimmutableの意味です)。Javaで言えばListオブジェクトをList型の変数に代入できるか否かの話です。Javaではできませんし、C++でも普通はできません。C++で細工をすれば共変にできる話です。難しくて使う気になれませんが。

第26章

ソフトウェアテストの話です。C++本に必要なのかと思いたくなりますがそれを口に出してはいけません。

第27章

最後にC言語の話です。落ち着きます。Cは単純で美しい。一番好きです。ごめんなさいストラウストラップ先生、C++より好きです。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: | 1件のコメント

websocket client 0.5のリリース

このエントリーを含むはてなブックマークはてなブックマーク - websocket client 0.5のリリース この記事をクリップ!Livedoorクリップ - websocket client 0.5のリリース Share on Tumblr newsing it! Bookmark this on Delicious Digg This

ちまちま作っていたwebsocketのpythonのクライアントライブラリをアップデートしました。バージョンは0.5ですね。以前サポートしてたプロトコルのバージョンは、echo.websocket.orgで使えなくなってしまっていたので、古いプロトコルのコードはごっそり消しました。今回はRFC6455になったhybi13だけをサポートしています。いや、サポートしているつもり。

[続きを読む...]


関連文書:

カテゴリー: 開発 | タグ: , | コメントをどうぞ

Apache2.4そろそろリリース…かもしれないので非同期I/Oのevent mpmの紹介

このエントリーを含むはてなブックマークはてなブックマーク - Apache2.4そろそろリリース…かもしれないので非同期I/Oのevent mpmの紹介 この記事をクリップ!Livedoorクリップ - Apache2.4そろそろリリース…かもしれないので非同期I/Oのevent mpmの紹介 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

自信のないタイトルは1年前に「2011年には流石にリリースされると思います」と書いてしまった反省からです。

リリースに関わっているわけでもないのに根拠のない予言をするものではありません。更にさかのぼること3年前には、Apache2.4カウントダウン?のタイトルで記事を書いています。もはや狼少年状態です。

Apache2.4の新機能の中で意外にフィーチャーされていませんが、個人的な注目はevent MPM(とAsynchronous support)です。いわゆる非同期I/O動作のイベントドリブンなmpmです。非同期I/Oのイベントドリブンと聞くと、nginxと同じ動作?と思う人もいるかもしれませんが、動作モデルは異なります。

Apacheを知っている人は、event mpmがバージョン2.2から存在するのを知っているかもしれません。バージョン2.2では実験的(experimental)mpmでしたが、バージョン2.4でexperimentalが取れました。それどころかUnix系ではデフォルトmpmになりました(経緯としては、一度、simpleと呼ばれる類似の非同期I/Oベースのmpmが作成されデフォルトになって、その後、event mpmに集約されました)。

event mpmの前提知識として、v2.2のデフォルトのworker mpmの動作を知っておいたほうが良いのですが、その辺は3年前の記事を参考にしてください。この記事のsimple mpmの説明の大枠はevent mpmにも当てはまります。

event mpmはマルチプロセスにもできますが、まずは単一プロセスの前提で説明します。

event mpmには単一のリスナスレッドと複数のワーカースレッドが存在します。リスナスレッドのエントリポイントはlistener_thread()です。listener_thread()はネットワーク待ちのイベントループです。イベントループはapr_pollset_poll()でブロックします(タイマーありのブロック)。apr_pollset_poll()はOSに応じてepoll_wait(2)やpoll(2)やselect(2)の呼び出しにつながります。

このapr_pollset_poll()で、accept(2)待ちのソケット(いわゆるlistenソケット)とaccept(2)が返したソケット(いわゆるconnectionソケット。以下接続ソケット)の両方を監視します。コードの骨格は次になります。

// リスナスレッドのコードの骨格
static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy)
{
    省略...
    for (;;) {
        省略...
        rc = apr_pollset_poll(event_pollset, timeout_interval, &num, &out_pfd);
        省略...
        // apr_pollset_poll()が返したソケットの処理ループ
        while (num) {
            省略...
            // CSD(client socket descriptor):HTTP処理中のソケット
            if (pt->type == PT_CSD) {
                省略...
                // ソケットのステートに応じた処理の振り分け(リクエスト読み込み中やレスポンス書き出し中など)
                switch (cs->pub.state) {
                case CONN_STATE_CHECK_REQUEST_LINE_READABLE:
                    省略...
                case CONN_STATE_WRITE_COMPLETION:
                    省略...
                    // ワーカースレッドに拾ってもらうためのキューに突っ込む
                    rc = push2worker(out_pfd, event_pollset);
                    省略...
                case CONN_STATE_LINGER_NORMAL:
                case CONN_STATE_LINGER_SHORT:
                    // 処理済みのソケットを閉じる
                    省略...
                }
            }
            // TCP接続を受け付けたソケット
            else if (pt->type == PT_ACCEPT) {
                // accept(2)して接続ソケットをCSDとしてapr_pollset_poll()の監視対象にする
            }
            out_pfd++;
            num--;
        }
        省略...
    }
    省略...
}

クライアントから接続を受け付けると、listenソケットに対してaccept(2)処理をします。accept(2)が返した接続ソケットをapr_pollset_poll()の監視対象にします。クライアントからHTTPリクエストが飛んでくると、この接続ソケットがreadableとしてapr_pollset_poll()から返ります。最初のステートはCONN_STATE_CHECK_REQUEST_LINE_READABLEなので、リクエスト行の読み込みをします(上記コード抜粋を参照)。リクエスト行読み込みの処理など、実際のHTTP処理はリスナスレッドではなくワーカースレッドが行います。リスナスレッドは読み込み可能になった接続ソケットを内部的なキューに入れるだけで実処理はしません。

ワーカースレッドのエントリポイントはworker_thread()です。コードの骨格は次のように単純です。キューにソケットが突っ込まれるまでブロックします。言うまでもありませんが、ブロック中にCPUは消費しません。

// ワーカースレッドのコードの骨格
static void *APR_THREAD_FUNC worker_thread(apr_thread_t * thd, void *dummy)
{
    省略...
    // 事実上の無限ループ
    while (!workers_may_exit) {
        省略...
        // リスナスレッドがキューに突っ込んだソケットを取り出すまでブロック
        rv = ap_queue_pop_something(worker_queue, &csd, &cs, &ptrans, &te);
        省略...
        rv = process_socket(thd, ptrans, csd, cs, eq, process_slot, thread_slot);
    }
    省略...
}

process_socket()はソケットのステートに応じたHTTP処理をします。細かい部分を無視すれば、リクエスト行の読み込み、リクエストヘッダの読み込み、リクエストボディの読み込み、レスポンス出力の4段階のステート遷移です。HTTP接続がkeep-aliveであれば、レスポンス出力後に次のリクエスト行読み込みにステート遷移します。

worker mpmの場合、このステート遷移の間、ワーカースレッドがひとつのHTTP処理、つまりひとつのクライアントに占有されます。event mpmの場合、ワーカースレッドは占有されないので、複数のHTTP接続を並行的に処理できます。

こうなるとHTTP処理中のソケット読み書きがブロッキングかノンブロッキングかが気になります。答えを書くと、リクエスト行の読み込みとレスポンス書き出しはノンブロッキング、リクエストヘッダとリクエストボディの読み込みはブロッキングです。つまり、クライアントが遅かったり(これはあまりない)、ネットワークが遅かったり(これはありそう)、悪意的に小さなバイト列を散発的に送りつけるリクエストがあると、ワーカースレッドがリクエストの読み込みでブロックする可能性があります。要はワーカースレッドが占有されます。これが問題になる場合はRequestReadTimeoutディレクティブのタイムアウトを短くするのが防衛策になります。

Apacheが非同期I/Oベースになると、nginxとの性能比較が気になります。個人的見解ですがApacheがnginx同等のスループット性能には達しないだろうと思っています。誰かがベンチマーク比較していないか探しましたが見つかりませんでした。Apache2.2時の比較でボロ負け結果は見つかりますが。

比較のためにnginxの動作を簡単に説明すると、単一スレッドがリスナとワーカーの役割を兼ねて、かつすべてのソケット読み書き処理がノンブロッキングになるアーキテクチャです(acceptすらaccpet4でノンブロッキングにする徹底さです。accept可能になったソケットがブロックしうるのかは知りませんが)。こういう言い方はUnixはLinuxみたいなものですと言うみたいで一部の人を不快にさせそうですが、要はNode.jsと同じアーキテクチャです。

event mpmのApacheはworker mpmより平行性が上がったとは言え、依然としてワーカースレッドの数が平行性の制約であることに変わりありません。ワーカースレッドの数を増やすには次のふたつの方法があります。

  • プロセス当たりのワーカースレッドを増やす
  • プロセスを増やす

プロセス当たりのワーカースレッドの数は32bit OSではメモリの制約で通常1000のオーダーです(OSにも依ります。Linuxのデフォルトはスレッドひとつに仮想メモリ2Mバイト割り当てるのでスレッド数1000のオーダーでプロセスの仮想メモリが2Gバイトのオーダーになります)。64bit OSであればこの辺の制約が外れるので、スレッド数のオーダーを上げられます。スレッド数のオーダーを上げた時はスレッド間のタスク切り替えのコストが課題になります。この課題は10年前ぐらいから言われていて、その後、カーネル側の改良のニュースなども時々聞いた記憶もあるので(最近の動向はウォッチしていません)、もしかした1万スレッドぐらい余裕な世界になっているかもしれません。

後者のプロセスを増やすのはApache的には保守的な手段です。一見、問題ないようですが、複数プロセスが同じポートのソケットに一斉にaccept(2)かけた時の性能問題を昔(いつだったか思い出せないぐらい大昔)見た記憶があります。こちらも凄腕のカーネルハッカーたちが解決済みの問題かもしれません。

他のApache2.4の新機能の解説は気が向いたらやります。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: 開発 | コメントをどうぞ

第八回ありえるえりあ勉強会 ~PyPyのキホンの気

このエントリーを含むはてなブックマークはてなブックマーク - 第八回ありえるえりあ勉強会 ~PyPyのキホンの気 この記事をクリップ!Livedoorクリップ - 第八回ありえるえりあ勉強会 ~PyPyのキホンの気 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

今回で第8回目となるあえりえるえりあ勉強会が1月20日(金) 19:00から開催します。今回は第8回ということで、8は漢字の八になっています。年も開けてめでたいということで、末広がりの八になっています。実行委員長のこの粋なはからいに誰が気づいたでしょう?全ては偶然ではなく、必然なのです。

8回目となるありえるえりあ勉強会の今回のお題は「PyPy」です。pyって付いていることからほとんどの人はPythonを想像すると思います。想像できなくっても気にしないでください。pypyというのは、Pythonで作られたPythonの処理系ですね。冗談のような本当の話です。jvmがjavaで書かれているようなもんですね。ちょっと違うか?

今回はpypyって何?っていう人向けにその説明から入ります。「キホン」に恥じない内容のはずです。キホンといえば、「セルフホスティングインタプリタ」ってなっていますが、セルフホスティングってどういうことなの?ブートスラップはどうなっているの?って言うお話だと信じています。が、ひょっとしたら、pypyを使ったおれおれ言語の作り方かもしれません。

その次に「静的解析」ってなっていますが、どんな話になるかは主催者もわかっていません。誰か、どんな内容になるのか、概要を教えてください。コンパイル時の最適化とかなのかな?

その後に、pypyの最もキホン的なお話といえばJITでしょう。CPythonにはないpypyの特徴になります。JITといえば、JVMのJITが有名なので知らない人はいないと思います。JITの基本的な説明から始まり、pypyのJITの理論と実装についてのお話らしいです。Pythonを知らなくても楽しめるということらしいので、Javaを使っている人たちもJITについてどうなっているのか理解が深まるかもしれません。

全体的にあまりPythonについて知らなくても処理系がどのように動作するのか、など、理解が深まると思います。アリエルとしては気分的にキホン的なことの勉強会だと思っています。

 

申し込みは、今すぐWebで


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | コメントをどうぞ

公共機関にsudoできるPCを置くのは危険

このエントリーを含むはてなブックマークはてなブックマーク - 公共機関にsudoできるPCを置くのは危険 この記事をクリップ!Livedoorクリップ - 公共機関にsudoできるPCを置くのは危険 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

ハイデラバードの話の続きです。

ハイデラバードの某大学の図書館に行きました。そこで設置してあるPCのOSはFedoraでした。ちなみに書架にもFedora本とRedHat本はたくさんありました。一方、Ubuntu本とDebian本はあまりありません。プログラミング言語の書籍は、C、C++、C#、Java、Perl、Pythonが揃っている印象でした。日本と比べて少ないと感じたのが、JavaScript、PHP、Rubyです。正確に言うとRuby本は探しても見つけられませんでした。もちろん、図書館なので、人気があって借りられている可能性も否定できません。

さて、今回は本が主題ではありません。図書館の設置PCの話です。

最近は、公共機関に設置するPCはWebブラウザさえ動けば充分な場合も多いと思われます。このため、無償OSでコスト削減する流れが一定数増えてもおかしくありません。

世の中の一部にはWindowsよりもUnix系OSのほうがセキュアという神話があります。しかし、何も考えずに設置したら大差ありません。むしろ、何も考えずに設置したらUnix系OSのほうが相対的に危険度が高い可能性もあります。

他のディストリビューションの動向を調べていませんが、Ubuntuはデフォルトで一般ユーザがsudoできます。代わりにsuコマンドを禁止しています。一見、rootユーザのパスワードの盗難リスクが減ってセキュアに見えます。そういう一面も否定しませんが、公共機関に設置するPCに関して言えば、sudoできるアカウントが普通に使われているのは大きなセキュリティリスクです。と言うのも、次のクラックをされる危険があるからです。

まず公共機関のPCから故意にログアウトします。係員の女性を呼んで「間違ってログアウトしてしまいました」と伝えます。女性が再ログインしてくれれば、指の動きからパスワードを盗めます。sudoのできるアカウントであれば、これでroot権限を取ったことになります。

パスワード入力の指の動きでパスワードを盗むのはアリエル社内では割とメジャーですが(Mさんのせいですが…)、何か決まった名前はあるのでしょうか。簡単な割には無防備な人が多くて驚きます。広義に言えばソーシャルクラッキングの一種ですが、正しく危険性を伝えるには特別な名前があってもいい気がします。

入力中に手を凝視していると視線からばれることもあります。そんな時は、あなたの手があまりに綺麗なので見とれていました、と言い訳します。このため、話しかける係員は若い女性でなければいけません。

この記事を読んでこのクラックを試してみようと思った人に警告しておきます。試さないほうが身のためです。罠かもしれません。簡単にパスワードを取れたと思って喜んだら改造sudoが仕込まれているかもしれません。sudoを実行した瞬間にピーピーと警告音が鳴って、背後に怖い人が並ぶことを想像してください。

アリエルも最近は普通のセキュリティ強化では飽き足らず、ハニーポット専門です。罠のかけかたを色々知っていると、面白半分のいたずらはリスクが大きすぎて手を出せません。小さないたずらの防止には知識を隠すのではなくどんどん明らかにしていくのが良い好例です。それにしても、しつこいですが、パスワード打つ時に無防備な人が多くて困ります。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | 3件のコメント

RFCになったwebsocketのハンドシェイクの部分

このエントリーを含むはてなブックマークはてなブックマーク - RFCになったwebsocketのハンドシェイクの部分 この記事をクリップ!Livedoorクリップ - RFCになったwebsocketのハンドシェイクの部分 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

@t2y に「You’ve been writing only about cat, recently. I feel you are over.」っていわれちゃいました。そんなことではいけないと思い、それから最新のwebsocketに対応してくれ、ってリクエストが来ているwebscoketのpython clientもバージョンアップすべく、RFCになったほうを読んでいます。大きな処理の流れは、昔のwebsocketと大きくは違わないので割愛します。

[続きを読む...]


関連文書:

カテゴリー: 開発 | タグ: | コメントをどうぞ

インドの認めたくない現実

このエントリーを含むはてなブックマークはてなブックマーク - インドの認めたくない現実 この記事をクリップ!Livedoorクリップ - インドの認めたくない現実 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

最初に注意事項です。下記の話は「たった3人」に聞いた話です。統計的な意味はまったくありません。念のため。

昨年末、インドのハイデラバードに行きました。そこで3人の学生と話す機会がありました。そして驚きました。なんと彼ら3人が揃いも揃ってVimユーザだったのです。

こう聞くと、なんだインド人のITスキルは凄いと聞いていたけれど、実はIT後進国なんだね可愛そうに、と思うかもしれません。

その認識は間違いです。インドの他の都市はともかくハイデラバードはIT先進都市です。Vim使いの学生たちのレベルも日本のトップ高の学生に引けを取りません。彼らはHadoopを使うプロジェクトに従事しています。Amazon EC2も使いこなしています。単なるツールの使い手というだけではありません。たとえばSVM、DHT、HMMなどの略語が説明なしで学生に通じます。略語は順にサポートベクタマシン、分散ハッシュテーブル、隠れマルコフモデルです。これらの略語がすらすら出てくるのは日本でもそういないレベルではないでしょうか。

揃いも揃ってVim使いと聞けば、Emacsは知っていますかと聞かざるをえません。学生たちはEmacsを知っていました。なぜEmacsではなくVimを使うのか聞いてみました。特に理由はない、みんなが使っているから、というのが答えでした。

やれやれ。

これが日本であれば、「GNUを知っていますか?」「FSFを知っていますか?」「GPLを正しく説明できますか?」「フリーソフトのフリーの意味を正しく答えられますか?」「ストールマンの業績を知っていますか?」と質問を矢継ぎ早に浴びせかけます。これらの質問のすべてに完璧に答えられる学生はそうはいません。圧倒的な情報量を前にした学生は恐れおののき正常な思考ができなくなります。そして己れの無知を恥じます。謝る学生にぼくは優しく声をかけます。大丈夫、無知は罪ですが救いはあります、と。Emacsです。Emacsを使えば過去の罪は消えます。

言うまでもありませんが、Emacsを強制する意図はありません。正しい知識を持った人であればVimを使っても問題ありません。エディタ選択は自由だからです。世の中すべての人がEmacsを使わなければいけないとは思っていません。罪深い気分の時にズクナシの曲を聞くのと同じ程度に、己れの無知の罪深さに対してEmacsに救いを求めればいいと思うだけです。

残念なことに相手に畳み掛けるほどの英語力は持っていないので、みんなが使っているからVimを使っていますと答えるインド人学生を前にして、驚きです以上の返しはできませんでした。世が世なら宣教師失格です。もっと英語を勉強しようと思いました。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | コメントをどうぞ

Gmailのようなファイル添付UIのサンプルとドラッグアンドドロップの未来

このエントリーを含むはてなブックマークはてなブックマーク - Gmailのようなファイル添付UIのサンプルとドラッグアンドドロップの未来 この記事をクリップ!Livedoorクリップ - Gmailのようなファイル添付UIのサンプルとドラッグアンドドロップの未来 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

今年も残すところあと数十分となりました。今年のことは今年のうちに、という格言にしたがって、今年の5月くらいに書く予定だったブログ記事を書くことにします。およそ7ヶ月ですか。光陰矢のごとしとはよく言ったものです。

Gmailのようなファイル添付UIのサンプルとは、ファイルをブラウザにドラッグしてくるとドロップするための領域を表示するという挙動をするサンプルです。

弊社の製品ではGoogle Closure Libraryを利用しているので、ここでもClosure Libraryの力に頼ることにします。相変わらず流行る気配のないClosure Libraryですが、便利ですよ実際のところ。手軽ではありませんが。

さて、サンプルは https://gist.github.com/1544144 に置いておきます。

ポイントは、以下の4つです。

  1. ファイルがドラッグされたらドロップための領域(以下、DropZone)を表示する
    • listen すべきイベントは window に対する goog.events.EventType.DRAGENTER
  2. ファイルが DropZone にドロップされた、あるいはマウスポインタがウィンドウを外れたら DropZone を非表示にする
    • listen すべきイベントは window に対する goog.events.EventType.DRAGLEAVE
  3. ファイルがDropZoneにドロップされたら event オブジェクトからファイルが取得できるのでそれをハンドリングする
    • event.getBrowserEvent().dataTransfer.filesでファイルが取得できる
    • listen すべきイベントは goog.events.FileDropHandler.EventType.DROP
  4. 通常のファイル選択ダイアログからファイルが選択されたときに発火する goog.events.EventType.CHANGE も同様に listen する
    • このときも event.getBrowserEvent().dataTransfer.files でファイルが取得できる

ちょっとしたはまりポイントとして、2 は Firefox ではうまく動作しません。マウスポインタがウィンドウから外れたタイミングで goog.events.EventType.DRAGLEAVE が発火しないのです。そこで仕方なくタイマーをセットして、750 ms 時間が空いたら DropZone を非表示にするという処理を記述しています。これは Gmail がそのような挙動になっていたから真似をしました。ところが、久しぶりにGmailにアクセスしてみるとなんとFirefoxでもウィンドウを外れた直後にドロップ領域が消えるという挙動になっていました。いつの間に変わったんでしょう。というよりも、どう実装したのでしょう。これを調べるのは来年の抱負とします。あと、このサンプルではサーバーサイドにリクエストを投げるところまでは記述していないので、そこは適当に書いてください。

さて、ここまでは前フリです。この記事の本題は、果たしてドラッグアンドドロップという操作はこれからも生き残るのか、というものです。

スマートフォンやタブレットの普及にともないUIのデファクトスタンダードも変わりつつあります。その中のひとつに没入型UIがあります。要はアプリケーションのフルスクリーン化です。スマートフォンやタブレットは画面が狭いため1つのアプリケーションがすべての画面を専有する設計になっています。そしてその思想がパソコンのUIに流入してきています。

Mac OS は 10.7 (Lion) から標準的にフルスクリーンに対応しました。Windows も次期リリースの Windows 8 から Metro UI を採用し、フルスクリーンの UI を採用します。一方デスクトップ Linux で大きなシェアを持つ Ubuntu も Unity により没入型の UI を実現しました。

このように最近の OS はことごとくフルスクリーン化を推し進めています。そしてフルスクリーン化したアプリとドラッグアンドドロップは極めて相性が悪いです。よって、このままフルスクリーンが標準として広がっていくとドラッグアンドドロップという操作は忘れ去られてしまうかもしれません。

個人的には、ハードウェアの UI が変わらないのにソフトウェアの UI だけを変えても意味がないと思っています。もちろん汎用的に使える優れたソフトウェア UI はあると思いますが、スマートフォンやタブレットでうまくいったからといって、その UI をパソコンでマネしたところで使いやすいものにはならないでしょう(Mac の Launchpad を使いやすいと思っている人はいるのでしょうか)。

それでもフルスクリーン化を推し進めるというのなら、現在主流のファイルというインターフェイスを隠蔽した新しいUI体系を作る必要があると思います。それこそスマートフォンで実現されているように、ファイルを意識させることはなく、そこにはアプリとデータがあるだけで、あとはデータを受け渡すための仕組み(Android のインテントとか)があるというようなものです。触ったことがないのでわらかないのですが、Chrome OS はもうすでにそうなっているんでしょうか(Google Chrome がベースのままだとアプリが持っているデータの受け渡しができそうにありませんが)。とりあえず2012年リリースされるはずの Windows 8 がどのような形になるのかを楽しみにしておきます。

それでは、みなさま良いお年を。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | コメントをどうぞ

IT業界面接必勝法

このエントリーを含むはてなブックマークはてなブックマーク - IT業界面接必勝法 この記事をクリップ!Livedoorクリップ - IT業界面接必勝法 Share on Tumblr newsing it! Bookmark this on Delicious Digg This

元祖Ariel Advent Calendar 2011の記事です。クリスマスなので就職面接の必勝法について書きます。

新卒でも中途でもどちらでも使えますが、それなりに若い人を想定しています。一定の年齢になっていれば、面接での小細工よりも実績で勝負すべきだからです。実績を積み重ねていれば、面接が多少下手でも採用に至るはずです。同様に、新卒や若い人でも、既に充分な実績や誇れる何かがあればこの記事は不要です。

とは言え、充分な実績を持つ若手は稀です。ほとんどの人はさして誇れるものもなく、売りもなく、挙げ句、下手な面接で採用の機会を逃しているのではないでしょうか。もったいないことです。そもそも就職活動は生産的な活動ではありません。さっさと就職して生産的な活動に精を出すほうが世の中のためです。

必勝法を文字どおり解釈すると、必ず勝つです。必ず通る面接なんてあるはずない、と反論がありそうです。それはそうです。採用の合否は相対的なものです。面接官との相性や運もあります。必ず勝つの意味は、自分自身に勝つの意味です。己に勝てば、結果も自ずとついてきます。面接に落ち続けると人生に負けた気分になりますが、老婆心ながら言っておくと、若いうちの面接の失敗なんてその後の長い社会人生活で見ると誤差です。面接に落ちることより、その結果、自分に負けるほうが問題です。

だからと言って、気楽にやればいいんだ、と無責任で役に立たないアドバイスは嫌いです。もっと実践的なアドバイスをしたいと思います。

面接必勝法に話を戻します。ひと言で書くと

過去は日常で語る、未来は非日常で語る

少し気取って書きました。クリスマスなので許してください。

この必勝法は、過去、多くのアンチパターンを見てきた結果、気づきました。アンチパターンは、過去を非日常で語り、未来を日常で語る応対です。次のような回答です。

  • 「授業でプログラミングをしたら面白さに目覚めて、自分にはプログラミングしかないと思いました」
  • 「見よう見まねでPHPを書いて動いたのが感動したので、この業界を志しました」

好きや熱意をアピールしたらダメなのか、と思うかもしれません。いえ、プログラミングやコンピュータが好きであることは重要です。好きでなければ続けられないからです。しかし、数ヶ月プログラミングしただけで好きのアピールをされても…が率直な感想です。せめて3年間はプログラミングを続けた上で好きと言って欲しいと思います。そして3年間続けていれば、その実績をアピールできるので、本記事の対象読者ではなくなります。繰り返しますが、この記事は、こういう実績のない人に向けて書いています。

言葉を飾ろうと話を膨らまそうと、ほとんどの人にとって、IT業界を目指さなければいけない衝撃の体験なんてないと思います。聞いているほうだって、ないと思っています。ないものをあるかのように話す必要はありません。

アンチパターンの人は、過去を非日常で語っておきながら、未来を日常で語ります。「入社したらどんなことをしたいですか」や「将来のキャリアは何か考えていますか」の質問に、「御社の期待する人材になれるように努めます」や「周りから認められて、仕事を任せてもらえる人になりたいです」などと答えます。がっかりです。

面接必勝法は、過去を日常で語り、未来を非日常で語ります。

自称平凡な人は過去の事実をたんたんと語ればいいのです。この目的は、継続できる力を示すことです。過去の自分を振り返れば、何かしら興味が継続しているものがあるはずです。IT業界と関係なくても構いません。継続してずっと好きである事実を語ります。好きな対象は徹底的に分類して整理しなければ気が済まないはずです。調べて調べて、そして様々なトライを繰り返すはずです。それを事実ベースで語ります。

たいした成果がないので何も語れません、と言うかもしれません。関係ありません。何をしたかの事実だけで充分です。なぜかと言うと、面接官が知りたいのは、相手が日常の平坦さを越えられるかどうかだからです。しかし、仕事だからつまらなくてもいいとか、苦しい仕事に耐えます、のような発言は求めていません。平坦な日常の中に楽しみを見出せるかが鍵です。平凡な過去に引け目を感じるかもしれませんが、逆手に取ります。平凡な日常を楽しんだ事実を語れば継続できる力をアピールできます。だから、本当はネガティブに過ごしていたとしてもポジティブに語りましょう。平凡な事実とポジティブな感情の組み合わせは、飾り立てた非凡な過去を上回ります。

過去は日常で語っても未来は非日常で語ります。

世界を変えたい。これぐらいぶちあげればいいと思います。

そんな大それたことを言えるような実績がありません、と思うかもしれません。経歴書を見れば実績がないことはわかっています。何者でもない自分を逆手に取ります。誰でも最初は何者でもありません。

ただ、世界を変えたいと言うと、どう変えたいのかと質問され、会話がどんどん具体的になるリスクがあります。せっかく非日常で語っているのに、話が具体的になったら作戦失敗です。それに、世界を変えたいという回答は、面接官によっては地に足がついていないと判断されるリスクがあります。なぜかと言うと、世界を変えるまでの道のりが見えないからです。

お勧めの回答は「トップになりたい」です。まず配属チームの中でトップになり、会社の中でトップになり、業界の中でトップになり、世界でトップになりたい、と答えます。抽象的で非日常な回答ですが、道のりが見える化されているのがポイントです。

なぜトップになりたいのかと聞かれたら、頂点に立たなければ見えない風景を見たいから、と答えます。

それパクリだろとつっこまれても開き直ります。自分は見たいと言い張ります。見たくないですか、と逆に面接官に問いかけてもいいと思います。面接官が見たいと思わないと答えようと、自分は見たいと言い通します。過去を美辞麗句で飾り立てても意味はありませんが、未来の夢は強気で押し通せばいいのです。抽象論のまま強気で一貫して押し通せば、結局、面接官に否定する術はありません。

P.S. 一瞬の熱意をこき使い、燃え尽きたら使い捨てる、人材を消耗品と見なす企業の場合、アンチパターンのほうが面接で通るかもしれません。


関連文書:

  • 関連文書は見つからんがな
カテゴリー: いろいろ | コメントをどうぞ