2012年12月04日

Qt+JS: 数値を入力するには?

ビルドの仕方、Qtライブラリを組み込んだJS環境の作り方、ドキュメントの見かたまで説明してきました。そろそろ具体的なTipsに入っていこうと思います。

数値入力にはどのウィジェットを使うのがいいのでしょうか?QLineEditを使って編集されたら数値に変換するというのはどうでしょうか?フォームにQLineEditの部品が置いてあるものとしてサンプルを書きます。

this.lineEdit = this.widget.lineEdit;
this.lineEditChanged = function ()
{
    this.lineEdit.textChanged.disconnect(this.lineChangedHandler);
    var value = Number(this.lineEdit.text);
    this.lineEdit.text = value;
    this.lineEdit.textChanged.connect(this.lineChangedHandler);
}
this.lineEditChangedHanlder = this.lineEditChanged.bind(this);
this.lineEdit.textChanged.connect(this.lineChangedHandler);

イベントの中で無駄にイベントが発生しないように一度イベントを切ってから値を変更しています。バリデータを使う方法もあります。

this.lineEdit = this.widget.lineEdit;
var validator = new QRegExpValidator();
validator.regExp = new QRegExp('0|^[1-9][0-9]*$');
this.lineEdit.setValidator(validator);

もちろん、最初から特定のフォーマットのみを扱う別のウィジェットもあります。QSpinBoxです。小数を扱えるQDoubleSpinBox、時間入力のQDateTimeEditもその仲間です。

this.spinBox = this.widget.spinBox;

最後が圧倒的に短いですね。もちろん、最初からこれが使えたらこれしかないのですが、微妙な制約で最短距離を薦めなくて迂回せざるを得なくなるのがGUIプログラミングでよくあることなので、他のも存在を知っておくのも悪くないです。

QLineEditの自力方法のメリットとデメリットは:

  • ◯: どんな複雑な、条件や状態を持つようなバリデーションであっても書くことができる
  • ◯: 空白状態を実現できる(iTunesの曲名入力で、複数の曲を選択して、それぞれの曲の情報が一致しなかった時、みたいな)
  • ☓: 長い

QLineEditのバリデータ方法のメリットとデメリットは:

  • ◯: 正規表現で実現できる範囲で制御できる
  • △: 空白状態を実現できる(空白条件もバリデーションに入れる必要あり)
  • ☓: 範囲指定を正規表現で書くのが面倒
  • ☓: やや長い

専用の入力ウィジェットのメリットとデメリットは:

  • ◯: 短い
  • ◯: 値の範囲などの指定などが便利
  • ◯: 値を変更するボタンが付いている。増減量も設定可能。
  • ◯: pxなど、単位などの文字を前後(prefix, suffix)に追加することも可能。
  • ☓: 空白条件が設定できない。ドキュメントを見るとできそうだけどできなかった・・・
posted by @shibukawa at 09:04 | Comment(245) | TrackBack(0) | 日記 はてなブックマーク - Qt+JS: 数値を入力するには?

2012年12月03日

Qt+JS: ドキュメントの読み替え方

QtをJSから使う場合、C++版Qtのドキュメントを読み替えながら使うことになります。これはきっと他言語のバインディングからC++のヘビーなライブラリを使う場合(Qtだけじゃなくて、GTKとか、wxWidgetとかも)も同様かと思います。当然C++は他の言語にない特徴をいくつか持っているため、そのまま利用できないケースもあります。

QComboBoxを例にして説明します。

まず、publicなメソッドと、publicなシグナルはそのまま使えます。

// publicなメソッド
comboBox.addItem("Times New Roman");
// publicなスロット
comboBox.clear();

publicなプロパティは関数呼び出しではなくて、値を直接代入したり取得して使います。プロパティと似たような働きのシグナル等(enabledに対する、setDisabled)が提供されていることもありますが、値の取得との対称性を考えると、なるべくプロパティの方を優先して使う方が読みやすいコードになると思います。これはJSに限った話じゃなくてQt全般に言えることかも。

// 取得
var index = comboBox.currentIndex;
// 設定
comboBox.enabled = false;

publicなシグナルはこんな感じで使います。他にもメソッドがあるのかな・・・今のところ使っているのはこのあたりのみ

// 無名関数を渡す。
comboBox.editTextChanged.connect(function () {
   // 処理
});
// thisを指定して渡す。
comboBox.editTextChanged.connect(this, this.onChanged);
// bindして渡す。パラメータを任意個追加できる。
var handler = this.onChanged.bind(this, "param");
comboBox.editTextChanged.connect(handler);
// bindしたやつのみ、disconnectできる
comboBox.editTextChanged.disconnect(handler);

QStringを受け取るものはJavaScriptの文字列、QStringListを渡すものはJavaScriptの文字列配列でOKです。

comboBox.addItems(["Times New Roman", "Courier New"]);

引数違いで多重定義されているシグナルは以下のように呼び分けます。あまり美しくないけど仕方がないですね。

// int版
comboBox["currentIndexChanged(int)"].connect(handler);
// QString版
comboBox['currentIndexChanged(QString)'].connect(handler);

enum値の渡し方はちょっと特殊です。ドキュメントのMember Type Documentationと書かれたところの名前(enum QComboBox::SizeAdjustPolicy)と、表中のConstantの列の名前が大事です。enumのグループ名の関数に、定数を渡します。可変長引数の関数なので、複数個の値のORを渡したい時は、全部この関数に渡します。大体長い行になってしまいがちですが・・・

var policy = QComboBox.SizeAdjustPolicy(QComboBox.AdjustToContents);
comboBox.sizeAdjustPolicy = policy;

protectedなオーバーライドするメソッドも利用できますが、これについては別の日にpaintEventのオーバーライド例を紹介しようと思います。QtDesignerで作ったuiファイルに書かれているコンポーネントを後からメソッドだけ差し替えてもうまく動きません。

posted by @shibukawa at 09:12 | Comment(171) | TrackBack(0) | 日記 はてなブックマーク - Qt+JS: ドキュメントの読み替え方

2012年12月02日

Qt+JS: QtDesignerダイアログを表示する

前回のエントリーのQtのクラスをJSから触れるようにするで、QtのクラスがJSが使えるようになりましたので、ダイアログを表示します。Qtのクラスはすべてグローバルに置かれているので、PySideやPyQtに慣れている人は戸惑うかもしれません。

QtにはGUIをグラフィカルに設計するツールがあります。単体のツールになっているQtDesignerと、統合ツールのQtCreatorです。まあどちらもGUI作成に関しては同じです。ツールを使って.uiファイルを作成します。作成するのはQWidgetとします。スクリーンショットはめんどうなので、後回しにしますが、Root直下にボタン(QPushButton)が2個、もしくはRoot直下にレイアウトを置いてボタンが置かれているものとします。名前はdoButton, closeButtonとします。あと、こちらのCommonJSスタイルのrequireが使えるようにしてあるものとします。

// MyDialog.js
var MyDialog = function ()
{
    QDialog.call(this);

    var layout = new QGridLayout();
    var loader = new QUiLoader();
    var file = new QFile(__dirname + '/../dialogs/MyDialog.ui');
    if (file.exists())
    {
        if (file.open(QIODevice.ReadOnly))
        {
            this.widget = loader.load(file);

            // つけた名前でアクセスできる
            this.doButton = this.widget.doButton;
            this.closeButton = this.widget.closeButton;
            // こんな感じでシグナルを使う
            this.doButton.clicked.connect(this, this.onDoButtonClicked);
            this.closeButton.clicked.connect(this, this.onCloseButtonClicked);
            layout.addWidget(this.widget, null, null);

            file.close();
        }
    }

    this.setLayout(layout);
};

// 継承
MyDialog.prototype = new QDialog();

MyDialog.prototype.onDoButtonClicked = function ()
{
    // プロパティへのアクセス。代入で行けます。
    this.doButton.text = "Button Clicked";
};

MyDialog.prototype.onCloseButtonClicked = function ()
{
    this.done(QDialog.Accepted);
    // もしくは
    this.done(QDialog.Rejected);
};
exports.MyDialog = MyDialog;

このコードを使う場合は:

var MyDialog = require('MyDialog').MyDialog;
var dialog = new MyDialog();
if (dialog.exec()) // doneにAcceptedが渡されると真
{
    // Closeが押された後の処理
}

このコードはそんなに長くないですが以下の要素が含まれています:

  • Qtのクラスへのアクセス
  • Qtクラスの継承
  • フォームのロード
  • フォームの要素のウィジェットへのアクセス
  • シグナルとプロパティの利用
posted by @shibukawa at 09:04 | Comment(215) | TrackBack(0) | 日記 はてなブックマーク - Qt+JS: QtDesignerダイアログを表示する

2012年12月01日

Qt+JS: QtのクラスをJSから触れるようにする

QtではJavaScriptを使ってコードを書くこともできます。詳しくはこちら参照。ベースはC++で、QtScriptエンジン(JavaScriptエンジン)を動かします。これはPureなECMAScriptのエンジンで、追加のコンポーネントとかは一切ないのですが、C++からクラスとか関数を登録できます。QtScriptBindingGeneratorで作ったバインディングを実際に使えるようにします。

なお、現在のQtScriptBindingGeneratorはQt4系にしか対応していません。Qt5はまだダメでした。

まず、QtScriptバインディングのファイルをplugins/scriptフォルダに置きます。ビルド時にこれらのファイルもデプロイされるようにプロジェクトファイルに追加します。

folder_01.source = js
folder_01.target = .
folder_02.source = plugins
folder_02.target = .
DEPLOYMENTFOLDERS = folder_01 folder_02

これらのバインディングを実行時に使えるようにするには、もろもろの設定をする必要があります。ちょっと長いですが、基本は「アプリケーションのsetLibraryPathsで作ったバインディングを読みこませる」「QScriptEngineでimportExtensionsして、Qtのクラスを登録する」の2点です。

QDir pluginDir(QApplication::applicationDirPath());
#ifdef Q_OS_MAC
pluginDir.cdUp();
pluginDir.cd("Resources");
#endif
if (!pluginDir.cd("plugins")) {
    fprintf(stderr, "plugins folder does not exist -- did you build the bindings?\n");
    return(-1);
}
QStringList paths = app.libraryPaths();
paths << pluginDir.absolutePath();
app.setLibraryPaths(paths);

QStringList extensions;
extensions << "qt.core"
           << "qt.gui"
           << "qt.xml"
           << "qt.svg"
           << "qt.network"
           << "qt.sql"
           << "qt.opengl"
           << "qt.webkit"
           << "qt.xmlpatterns"
           << "qt.uitools";
foreach (const QString &ext, extensions) {
    QScriptValue ret = engine.importExtension(ext);
    if (ret.isError())
    {
        qDebug() << "Error occured to load extionsion: " << ret.toVariant() << ext;
    }
}

これで、QScriptEngineに渡すスクリプトファイルから、Qtの機能にアクセスすることができます。基本的にはC++のライブラリリファレンスを見てもらえばほぼそのまま使えるのですが注意点も少々あったりします。

  • 使えないクラスもたまにある。ファイルシステムをツリービューで見せるコンポーネントとかなかった。
  • QStringの代わりに素のJSの文字列が使える。
  • QStringListとかは、素のJSの配列に文字列を入れて渡せば良い。
  • 日付オブジェクトの代わりに、素のJSのDateオブジェクトが返ってくる。
  • オーバーロードされているメソッド名が変わる点に注意。
posted by @shibukawa at 11:19 | Comment(141) | TrackBack(0) | 日記 はてなブックマーク - Qt+JS: QtのクラスをJSから触れるようにする

2012年09月30日

Pythonはなぜ?str.join(seq)なのか?

Screen Shot 2012-09-29 at 10.13.21 AM

PythonのAPI設計の中で、たまに思い出したように話題が出てくるのが、配列に入った文字列を結合するメソッド。Pythonではstr.join(iterable)です。他の言語(僕がよく知っているRubyとJavaScript)はArray.join(String)となっています。どちらでもありえる話ですが、個人的にはPythonの方が自然だな、と感じていました。ですが、他の言語の方がいいという人も多く、Pythonプログラマーの中でも好き嫌いが出たりもします。せっかく、弾さんがPerlの国からやってきて適度にガソリンをまいて炎上したところなので、Pythonの歴史を紐解いてみました。

軽くjoinの歴史について語っているサイトはないか探してみる

軽くぐぐってみると、何箇所か言及しているところがありました。

まずは無料のPython教育資料のDive Into Python。1.14. Joining lists and splitting stringsの項目の中に、歴史に関するメモ(Historical Note)という欄があります。ここによると:

  • 1.6以前のPythonの文字列には便利なメソッドがなかった(実際、配列に毛が生えた程度)
  • 文字列操作はstringというモジュールをimportして行っていた
  • 2.0で文字列のメソッドが強化された時に他のモジュール関数と一緒にstring.joinも文字列のメソッドになった
  • 当時はハードコアなPythonプログラマでもこれに反対(配列に入れるべき)の人がたくさんいた

他には、Stack Over FlowのPython join, why is it string.join(list) instead of list.join(string)?というスレッドもひっかかりましたが、この中で技術的に語っているのもありました。

  • リストやタプル、ジェネレータなど、いろんなシーケンスに対応する必要がある
  • 文字列、バイト列など、いろいろな対象があり、対象ごとに処理が変わる

それに対して、それならシーケンスの共通親クラスから対象のjoinを呼べばいいだけやんか!とツッコミが入っています。まあこのツッコミでは足りないのですが、元の回答も足りないのは確かです。どちらの回答者も、逆転裁判をプレイして論理思考を訓練すべきですね。

補足

@atsuoishimotoさんより、Pythonは2.2まではCで書かれた組み込みクラスの継承はできなかったとのコメントがありました。たしかにそうだった。

これは多重ディスパッチと呼ばれる問題の1つです。2種類のクラス群が関係しています。シーケンスのクラスがn個あって、文字列の種類がm個あれば、n×m個の組み合わせがあります。大抵の場合は、nとmのうち、変化の少ない方、あるいは数が少ない方のメソッドとして実装する、あるいはまったく属さないで独立の関数として実装する方法が取られますが、まあどちらに属させても正しいかどうかは状況による、といった感じです。後者の場合はパターンマッチ(関数型言語)やオーバーロード(C++)などの言語機能とセットになりますが、Pythonなどの動的言語にはそれらの言語機能がないので、前者の実装となります。

いろいろ見てみましたが、状況が分かっただけで、「なぜPythonがこうしたのか?」の手がかりはまだ得られていません。ここは本丸を攻めるしかありません。敵はpython.orgにあり!

PEPを見てみる

続きを読む
posted by @shibukawa at 02:31 | Comment(42) | TrackBack(0) | 日記 はてなブックマーク - Pythonはなぜ?str.join(seq)なのか?

2012年09月28日

Adobe Edge Animateの今後期待できる用途

さきほどのブログエントリーはあくまでもFlashの代替と考えた場合のお話でした。Flashはあくまでも枠の中で動かす的な用途が多いのですが、Edge Animateは「枠を作る」用途で使えそうな気がします。

アプリケーションの枠を作るのに必要な機能

例えば、HTMLベースのメールアプリを作るとして、ログインフォームが出て、そこからメール一覧をとってきて、メールのリストを表示するといったケースを考えてみます。今後数年間のトレンドを先取り・・・かは分からないですが、ログインフォームの表示、認証待ち、クローズ、メールのロード、リストの表示などなど、さまざまなアクションにアニメーションをつけるといったことがしたくなるでしょう。今までのWebアプリよりももっと動的に動いて見えるアプリ。Qtなどでは作りにくいような遷移を伴ったアプリです。あるいはウィジェットが満載の(iGoogleのようなアプリ)などです。こういったものを作る上で、Edge Animateが活躍しそうです。

Edge Animateの各要素はすべてHTMLのタグになります。idが標準で付きますし、classも設定できます。テキストであればdivタグ以外もいろいろ選択できます(pタグとかh1タグとか)。現状でフォームを作成する機能はないのですが、そこはDjangoのフォーム作成などを利用して、フォームをAjaxで送ってタグの中に差し込めば、全体のレイアウトをEdge Animateで構成することが可能になります。

ドラッグ・アンド・ドロップでウィジェット(シンボルで表現)を整列するような機能をEdge Animateで作りこんで、それをアプリケーションのテンプレートとして配布すれば、誰でも似たような高機能なウェブサイトが作れるようになりそうです。JavaScriptの世界はどちらかというと「部品」がライブラリだったのですが、ウインドウマネージャのような仕組みをライブラリとして作って配布、みたいな感じですね。

また、シンボル単位でエクスポートすることもできるので、JavaScriptでいろいろ作りこんでそれ単位で配布することが可能です。jQueryも使えるし、ツリービューアーとかそういう部品として配布できそうです。jQueryのプラグインの場合、関数として定義して使う形式になりますが、Edge Animateでは、よりコンポーネントに近い形式で作り込んで配布が可能です。

今後増えて欲しい機能

より高度なCSSが設定できるようになればいいな、と思います。ボーダーとかグラデーションとか、もっと自由に設定できるようになると良さそうです。まぁ、CSSでいろいろやりすぎると今のモバイルのブラウザのパフォーマンスが良くないということであえて入れてないのかもしれませんが。現在は各要素がデザインを持っていて、CSSのようにclassでデザイン指定がないのですが、そのあたりもできるようになると良いかな、と。特にAjaxでフォームを差し込んだりするのであれば、フォームのデザイン機能は欲しいですよね。グローバルなJavaScriptのファイルのロードとかも今はどこでやればいいのか見当たらないです。ウインドウシステムのように使うのであれば、9パッチのようなものが簡単に作れると捗りそうです。

後はエクスポートするときにCSSスプライトが生成されるよ!とかになると面白そうです。

とは言え、現状でも、進撃のバハムートやファイナルファンタジーブリゲード的なミッション画面や合成画面っぽいUI(画像でウインドウとかボタンを作る)とか、カードゲームの管理画面とかを作りこむには十分な機能を持っていますし、ソーシャルゲーム的な世界から積極的に活用されるようになる可能性もありそうな気がします。

なんにせよ、いろいろ用途が広がりそうですし、将来が楽しみなツールに思えました。

posted by @shibukawa at 00:50 | Comment(28) | TrackBack(0) | 日記 はてなブックマーク - Adobe Edge Animateの今後期待できる用途

2012年09月27日

Adobe Edge Animate 1.0を試してみた

Screen Shot 2012-09-26 at 7.19.42 PM

HTML5は、HTML5という名前のくせに98%ほどはJavaScriptという、詐欺っぽい名前でありながら一世を風靡したとおもいきや、FacebookのCEOの発言で一悶着あったりと、まだまだいろいろな話題を提供し続けてくれています。個人的にはGPUサポートやスマートフォンの高速化などがこなれてくれば、さまざまな用途で活用できるようになるだろうな、と思っています。HTMLのレイアウトがGPGPUとかで行われるようになれば、CPUでレイアウトを処理している今時のGUIツールキットよりも高速に動くようになる時代が来てもおかしくないですしね。今はまだまだHTML 5に投資し続ける時ですよ!バカ発見器のTwitterのTLになんとなく踊らされた人たちが寝転んでいる今がチャンスです。

そんな中、アドビ社がAdobe Edge Animate 1.0を無償提供することを発表しました。Flash四天王のうちの最弱なモバイル端末のFlash Playerはやられてしまいましたが、なんだかんだでFlashとAdobeの影響力はまだまだ強いな、と感じています。ゲームエンジンとしてしのぎを削っているUnreal EngineとUnity 3DはそれぞれFlash向けのエクスポータを開発中です。10年近くパフォーマンスチューニングされ続けたFlashは、マルチプラットフォームなブラウザ用のVMとして強力ということでしょう。AAAタイトルのゲームのエンディングのロールを見ると、だいたいScaleFormという文字が出てきます。これはゲームコンソールやモバイル端末用の特殊なFlashプレーヤーです。インタラクティブなメニューやちょっとしたカットシーンはFlashが活用されているということです。AIRもスマートフォン向けのアプリ開発環境として変換ツールが開発されていますし、インタラクティブなアート作成環境として、一定数のスキルをもったデザイナーさんが確保できるツールはFlash以外は見当たりません。

HTML5、とりわけCSS3がFlashキラーといっても、デザイナーさんがFlashのように自在に使えるツールの決定版は今まではありませんでした。Sencha Animatorとかはありましたが・・・本とかもFlashほどは見かけないですよね?僕自身、Adobeのツールの中で一番使い方が分かっているのがFlashなので(5, MX, CS5と来て、ほぼマクロメディア時代の知識ですし、教わったわけではないので勘違いしているところもあると思いますが)、数時間触ってみて分かる範囲でFlashとの比較をしてみようと思います。作った絵にセンスがなくてすんません。

Edge Animate 1.0とFlashで大きく変わったところ

続きを読む
posted by @shibukawa at 16:13 | Comment(88) | TrackBack(0) | 日記 はてなブックマーク - Adobe Edge Animate 1.0を試してみた

2012年09月18日

オンラインの議論にはTwitterは適さないというけれど

では、どのようなシステムならいいのかなー、と考えてみる。ダメだというのは簡単だけど、ダメなら自分の頭で代替案を考えてみるのが俺のジャスティス。というのはどうでもよくて、Python-devのMLの1999年当時のstr.join(seq)のスレッド追いかけんのめんどくさいよ(# ゚Д゚) ゴラァというところがスタートなんだけど。

  • オーガナイザーがいる。議論の議事進行役。編集長。
  • 議論への参加にはオーガナイザーの承認がいる。
  • 意見を言う時は次のどれかを選ぶ。
    • 前に出ている意見に対する賛成(いいね的でコメントは不可)
    • 矛盾の指摘(反証が必須)
    • ゆさぶり(その意見ではうまく説明できない箇所・足りない所についての追加説明要求)
    • 議題の追加(オーガナイザーの承認必須)
  • 議論として成り立たないようなコメントがある場合はオーガナイザーが却下することができる(却下の理由とともに却下した事実は残る)

うむー。まるで逆転裁判のようだ。

Open IDとか使えばユーザ管理というか、Twitterの議論から移行してくることは可能だろうし、ある程度Twitter上で行われているお話をオーガナイザーがTogetter的にまとめて、そこを出発点に議論する、というのも手ではあると思う。そして最後に議事録として議論の見える化ができて、PEPドキュメント化されれば完璧。ゆさぶりで出てきた事実は、ゆさぶりの親コメントにマージしてやれば、基本的には反証→反証というきれいな議論の流れになると思う。Twitterの場合は言い逃げもできて良い感じに議論を消滅させるというか、無視するということを使うことで、徹底的な殴り合いをしなくてもいいメカニズムなので、この流れで議論するのは最初からある程度仲がいい人じゃないとダメだろうな、という気はするけど。

誰か作ってくれないかなー

posted by @shibukawa at 23:32 | Comment(25) | TrackBack(0) | 日記 はてなブックマーク - オンラインの議論にはTwitterは適さないというけれど

2012年09月15日

アジャイルの「ア」は合気道の「ア」

Sensei Fujita
taken by denisko under CC BY-NC-SA

今年はサンフランシスコにいて、かつ先月子供が生まれたばかりということもあって、日本にふらっと行ってXP祭り2012に参加することができないので、今年はビデオレターで出演することになりました。僕が考えるアジャイルの核について話をします。ビデオレターって反応がないから難しいですね。なにか間違ったことを言ってしまって(たぶん色々間違っている)も「あ、今間違えました」って気付けない。ビデオレター達人になるにはどうすればいいんでしょうね?手元のNikon D3100+NIKKOR 35mmでFull HDで動画を撮ってみたので、絵は綺麗に撮れたと思いますが、なんか声が小さそうなのでブログにも書きます。XP祭り参加する方はまだ見ないでー!いろいろ補足もしていこうと思います。あと、時間的な制約で2/3ほど内容を削ったので、このブログにはそのあたりも含めます。ぜひ、懇親会でハッスル(死後)した後にお読みください。

日本のアジャイルの黎明期と、アジャイル関連のイベント

僕がアジャイルのコミュニティに関わって10年以上たちました。XP祭りも最初が2003年だったので今年で10回目ですよね。昨年のXP祭りでは10年前のアンケートの結果を紹介しながら話をしましたが、10年前はアジャイル導入は夢の話でした。アンケートを取っても、ユニットテストとリファクタリングだけはやってみた、というレベルの人が多かったように思います。

でも、アジャイルの夢は覚めることなく、時には会社を動かした人がでたり、世界の勉強会に出張で行かせてくれたり、あるいは転職しちゃった、と夢を叶える人もでてきてます。僕も当時は東工大で、その後周りがトヨタトヨタと騒ぎ始めたので、反骨精神が目覚めてホンダに就職し、その後はDeNA、現在は子会社のngmoco:)でなんだかんだでアジャイルっぽい環境に落ち着いています。「ヘイ、ヨシキ!スクラムって知ってるか?」「最初のスクラム本の日本語訳はやったよ」的な会話もキメました。いろんな時差をまたいでいるので教科書通りじゃないですがー。いつかこのあたりの話もしたいですね。

適用が難しいと言われながら、多くのエンジニアを惹きつけて、ゲリラ活動を行わせて世界を変えてしまう。アジャイル原理主義教団は危険だ!今すぐクラス名を記号+数字にして奴らの言論を封じろ!みたいなプレゼンもかつて行われたぐらいです(by牛尾さん)。アジャイルの何が魅力的なんでしょうか?

あと、今日のXP祭りもそうですが、アジャイルのイベントではアジャイルの本に必ずしも書いていない話題もたくさんあります。初期のころのイベントで言うと、マインドマップ、コーチング、パタン・ランゲージ、トヨタ生産方式、振り返り、制約理論、アジャイルUXなんてのも出てきました。パターンそのものはXPの記述には使われていますが、パタン・ランゲージそのものに興味を広げて、沢田マンション(Google日本語入力で補完が出た!)に行っちゃう人も出てきたのはケント・ベックもあずかり知らぬところだと思います。

アジャイルイベントの多様なセッションとアジャイルの共通点

続きを読む
posted by @shibukawa at 01:35 | Comment(58) | TrackBack(0) | 日記 はてなブックマーク - アジャイルの「ア」は合気道の「ア」

2012年08月13日

子供が産まれました

DSC_0995

もう一週間たってしまいましたが、サン・フランシスコのCalifornia Pacific Medical Centerで長女が産まれました。予定日から一週間近く遅くの出産で、生まれる前から嫁から引きこもり扱いされたりしていましたが、おめめがぱっちりした子が無事産まれました。母子ともに健康です。初産で海外で出産というのはチャレンジングでしたが、いろいろな方のサポートのもと、無事に安心して出産を迎えることができました。うちの母親もこちらまで来てくれました。とても穏やかな子で、お腹すいても、おむつが濡れてもほとんど泣かない子で、授乳の合間は良く寝ています。

ちなみに、結婚のきっかけとなった、ソニックの音楽のディレクターの瀬上純さんとは、一日違いの誕生日となりました。

アメリカでの出産

続きを読む
posted by @shibukawa at 12:15 | Comment(77) | TrackBack(0) | 日記 はてなブックマーク - 子供が産まれました

2012年07月27日

関わった本が二桁突破しました。

DSC_0695

大学生の時に、当時日本XPユーザグループの代表だった長瀬嘉秀さんに声をかけていただいて翔泳社から出た本に関わって以来、約10年で10冊を突破しました。その間、本田技術研究所に就職して宇都宮に引越したり、DeNAに転職して東京に戻ってきたり、結婚したり、子会社のngmocoに転籍となってサンフランシスコに引越ししたり、とても色々ありました。ここ数カ月はちょっと忙しくて、まともにブログも書けませんでしたが、この数カ月の間にも何冊か本が出版されました。筆が遅くなりましたが、関係者の皆さんに感謝申し上げたいとおもいます。

ちなみに、このエントリーで紹介した以外の書籍は下記の通りです。

  • アート・オブ・コミュニティ ―「貢献したい気持ち」を繋げて成果を導くには
  • ポモドーロ・テクニック入門
  • 電子出版文書フォーマット技術動向調査報告書2010-2011
  • エキスパートPythonプログラミング
  • IT業界を楽しく生き抜くための「つまみぐい勉強法」
  • 実践eXtremeプログラミング
  • アジャイルソフトウェア開発スクラム
  • Xtreme Programmingテスト技法―xUnitではじめる実践XPプログラミング

100人のプロが選んだソフトウェア開発の名著

翔泳社さんの100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊企画に参加させていただきました。書いた量は全体の1/100です。紹介したのは、C++の設計と進化です。

この本は言語の歴史と、その歴史の過程の中でどのように意思決定がされて、現在の形式になっていったのかが書かれています。書いた内容が2ページなので、概略を書こうとしてしまうと、ブログにも全部書けちゃうので悩ましいのですが、「自分の道具をきちんと知ろう。正確に、詳しく、発展の過程も」といったことが訴えたかったことです。C++と銘打ってありますが、この本で書かれているような過程を、自分の好きな言語についてもなぞってみると、多くのことが学べるとおもいます。

オブジェクト指向JavaScript

技術書の翻訳で有名な水野さんと一緒に、オブジェクト指向JavaScriptの翻訳をしました。直球なタイトルどおりの内容です。原著が少し古く、ECMA Script 5ではなく3対応だったりしますが、3と5で変わるようなチャラい内容ではなく、JavaScriptの基本骨格を丁寧に紹介した本です。

JavaScript関連はブラウザ、サーバ、クライアントとさまざまな分野に広がりつつありますし、必要な知識やコードの構成は土台によってもいろいろ設計が変わってきます。最大公約数的なコアの知識を本書で得ながら、それぞれ自分が特化したい分野に関しては、ウェブサイトや技術評論社の雑誌などで最新情報をおっかける、みたいな読み方が良いと思います。HTML5だBackbone.jsだnode.jsだMeteorだ、といったキラキラした技術に触る際に、ぜひご一緒にどうぞ。「JavaScriptのDISりなら俺に任せろバリバリ〜」という発言とHTML 5で有名な、紀平さんも下記のように紹介してくれています。

Mobageを支える技術 ~ソーシャルゲームの舞台裏~

DeNAのメンバーとして、Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)の執筆に参加しました。

どちらかというと、Mobageに(生活を)支えてもらっている技術な今日この頃ですが、本書の4章のngCore関連の章を書きました。ngCore関連はこの本が出てからの数カ月でもいろいろバージョンアップし、GUIの統合開発環境のngCore Builderを使ってソースコードデバッグができるようになったり(ないしょだけど、node.jsのV8エンジンのデバッグもできるらしいですよ)、様々な統計情報がリアルタイムにグラフで見られるようになったり、エンジンも高速化されたり、動画再生が追加されたり、高速なパーティクルエンジンが入ったりと機能追加がされていたりもします。そんなどんどん良くなっていく最中のスナップショット的な感じの章になっています。

また、データベースの章なども充実な内容になっており、発売後に社内のSNSで「えー、こんなことまで書いてしまって・・・」みたいな声が上がるほどなのですごいと思います(僕は専門じゃないので他と比較とかはできないですが)。みんなで勢い良く書いた内容です。楽しんでいただければ幸いです。

posted by @shibukawa at 05:51 | Comment(89) | TrackBack(0) | 日記 はてなブックマーク - 関わった本が二桁突破しました。

2012年05月09日

Win/Mac/Linuxで圧縮テクスチャを作成する

圧縮テクスチャ。現代的なグラフィックス処理の大半はメモリ間転送ですよね。圧縮テクスチャはGPU内のメモリ使用量と転送量を削減してパフォーマンスもアップさせる魅惑のテクニックです。きっとスマートフォンのバッテリーの持ちも良くなることでしょう。

iOSはPowerVRを一貫して使っているので、PVRフォーマットが標準です。Androidの方はいちおうETC1という共通フォーマットはあるのですが、アルファチャンネルが持てなかったりするのでデバイスごとの最適なフォーマットを使うのが普通みたいです。

  • ATiTC: 元ATi(現AMD)のフォーマット。ATCとも呼ばれています。ATiのモバイル向けのプロセッサは現在Qualcommがリリースしています。よく使われていrます。アルファチャンネルの有無、アルファチャンネルの特性で3種類の内部フォーマットがあります。
  • DXTC: Direct X用共通フォーマットみたいです。nVidiaのTegra系が利用しています。これも、データの種類ごとに3〜4種類の内部フォーマットがあるらしい。
  • PVR: iOS系と同じPowerVRを載せているデバイスで使います。圧縮率、アルファチャンネルの有無で2x2の4種類あります。
  • ETC1: エリクソン社が作った標準フォーマットですが、ARM社自身が作っているMaliというGPUがこれのみをサポートしています。

そのうち、ETC2というアルファチャンネルをサポートしたフォーマットが共通で使えるようになるらしいです。このあたりは、こちらのブログを上から下まで拝むように読みまくる方が正しい情報を得られると思います。

開発ツールのみであれば、WindowsかMacだけでもいいとは思うのですが、ビルドサーバとか考えるとLinuxサポートも欲しくなるかもしれないので、その観点でマルチプラットフォームで入手可能か?で調べています。全部の検証をしたわけではないです。あくまでもメモです。

PVRフォーマット

PowerVRをリリースしている、Imagination社のサイトにツールなりなんなりが色々あります。要ユーザ登録。PVRTexToolが変換ツールです。GUIツールですが、コマンドラインからも使えるらしい。パッケージに、Windows 32/64, Linux 32/64, Mac 32の5バージョンが含まれています。Windows版だけはDXTCサポートみたい。ずるい。Apple限定でよければ、iOS用のSDKに変換ツールが付いてきます。

ライブラリとしても提供されていますので、ツールチェーンに組み込んだりもしやすいかな、と思います。ただし、ビルド手順を見ると、SDKに含まれるライブラリとかヘッダも必要とか色々書かれていて、家の遅いネットでダウンロードするのが時間がかかりそうなので詳しくおいかけてません。SDKはOpen GL ES1.1と、ES 2.0用と分かれていリリースされています。

DXTCフォーマット

今回は僕の作業では特に必要はないので詳しくは調べていませんが、nVidia社が変換ツールのソースをMIT License!で公開しています。コメントを見ると、Linuxでも動くよ、と書かれています。Macは時々落ちるかも・・・と書かれています・・・。

http://code.google.com/p/nvidia-texture-tools/

ATiTC/ETCフォーマット

なかなか調べにくかったのがこいつです。DXTCファイルから無理やり変換も見つけましたが、1ビット情報を無理やり落としてしまっていたりとちょっとデザイナーさんから怒られそうな感じ。AMDはWindows向けのツールしか提供していませんし、QualcommのAdrenoSDKもzipファイルを展開すると.exeファイルががががが。

でも、あきらめずに.exeファイルでインストールすると、変換用のライブラリが手に入ります。Windows32/64用とMac用。それにWindowsMobile、webOS、Androidもサポートしているので実機上の変換もできそうです。Linuxは残念ながら対象外。

また、Windows専用ですが、QCompressというGUI/CUIのツールも付いてきます。@nakamura001の啓示に従い、wineで動かしてみようと思います。

$ sudo port install wine
: (待つ)
$ wine ~/Downloads/AdrenoSDK/AdrenoSDK.2.3.00.exe

ふつーにWindowsっぽいダイアログが出て、インストールが行われます。初回のwine起動時は環境作ったりで時間がかかるかも。ホームの.wine以下にWindowsっぽいディレクトリ構造ができます。/users/Public/Documents/にテスト用の画像を置いてみました。

$ cd ~/.wine/drive_c/AdrenoSDK/Tools/QCompress
$ wine QCompressCmd.exe c:\\users\\Public\\Documents\\test.png c:\\users\\Public\\Documents\\test.atc "ATC RGBA Explicit"
QCompessCmd v0.01.00 (c)2011 QUALCOMM Incorporated

フォルダを見てみると、test.atcが出来ています。やったね。

上記の例で使ったQCompressがETC1にも対応しています。以上終了。

まとめ

やっぱり、Windowsの方が細かいツール類は充実していますねー。一部無理やりなところもありましたが、ひと通り欲しいデータは得られそうです。

posted by @shibukawa at 03:42 | Comment(254) | TrackBack(0) | 日記 はてなブックマーク - Win/Mac/Linuxで圧縮テクスチャを作成する

2012年04月02日

Pythonプロフェッショナルプログラミング

DSC_0937

レビューにちょびっと参加した、Pythonプロフェッショナルプログラミングが無事発売されたようです。おめでとうございます!わざわざ、アメリカにまで献本を送って頂きました。ありがとうございます。ホントにアメリカなんだぜ、というのを証明するために、USのトイザらス限定のクラシック・ソニック10インチフィギュアと、日本未発売のアニメーターズ・コレクションのポカホンタス、サン・フランシスコのローカルなアイスのThree Twinsと一緒に写真撮ってみました。

Amazonでも入荷待ちになっていますね。Amazonで買えないときは、弊社の親会社(DeNA)が運営するビッダーズで検索すると、見つかるかもしれませんよ。ポイントも付くかも?

本のタイトル的にはエキスパートPythonプログラミング とかぶっていますし、いくつか同じテーマを扱った章もあります。ですが、こちらはより実践的な、仕事で使えるような内容がより多くなっています。テーマが同じでも、より深堀してあったり(Sphinxのドキュメント)、より新しい内容を元に書かれていたり(パッケージ管理)、最近ではより広く使われているもの(Jenkins)を対象としていたり、エキスパートPythonプログラミングを持っている人でも、「おおっ」っと思える内容が多いです。まぁ、エキスパートPythonプログラミングの方は、Pythonという言語を深く深く取り扱っている本なので、当然両方そろえるべきですね【ステマ】

とくに実践的だな、と思えるのが想定環境です。最近のシステム開発だとウェブ上のシステムがかなりの割合を占めていると思いますが、仮想PCを使って、それの上で開発をすると説明されています。もしかしたら他のRailsとかの本もそうなっているのかもしれませんが(最近全然そちらは追いかけていない)、個人的には「なるほどー」と思いました。以前、大規模にPythonで開発していたときは、Windows XP上でコードを書き、Djangoで動作確認をしながら、本番環境(Windows Server 2003)にデプロイして・・・とかやっていました。細かい差であっても、結構デプロイ作業で手間暇がかかったりするんですよね。また、開発環境をシステム上に入れてしまうと、Pythonのバージョンなどで引きずられてしまったり・・・と。当時のPCは非力すぎて仮想PCは難しかったという事情もあったのですが、いろんな仕事を受託で引き受けて、ばっちり開発しているようなBeProudでは、そのあたりはしっかりとしているんだなぁ、と思いました。

かなりスキルの高い開発者を固めている印象のあるBeProudの、実践でつちかってきたノウハウがばっちり書かれた本に仕上がっています。Pythonと書かれていますが、半分ぐらいの章はPythonでなくても役に立つ話が書かれています。とても良い本です。ぜひ、みなさんお手にとって、レジまで運んでお金を払い、東京で毎月定期的に開催されているBPStudyという勉強会にも参加して、できるエンジニアの人たちのありがたいお話を聴きながら、本にサインをもらうと良いと思います。

posted by @shibukawa at 16:59 | Comment(210) | TrackBack(0) | 日記 はてなブックマーク - Pythonプロフェッショナルプログラミング

2012年03月29日

MacPortsは生まれ変わった

Golden Gate in San Francisco, California
by www.frontendeveloper.com under CC BY-SA

あ、近況報告ですが、DeNAから子会社のngmocoに転籍となり、サン・フランシスコに引越しました。また暇見つけて詳しく書きます。

MacのOSS関連のツールのインストールは昔からいろいろ歴史があります。最近の事件としては、MacPortsがほぼデファクトだったときに、Homebrewが出てきて一躍人気になり、MacPortsからの引越しネタが一時期の技術ブログでさかんに書かれたことですかね。

で、僕もいろいろ使っていました。最近は、環境を作りなおす際に時間節約と思ってHomebrewを使っていたのですが、どうしてもBoostの最新版がインストールできず(手元のフォーミュラがupdateでも更新されず、手元のフォーミュラの参照しているアーカイブはすでにsourceforge上から削除)、困ってMacPortsに戻しました。そしたらびっくり!ビルド済みのバイナリパッケージを落としてくるようになってました。

依存関係がやたら多い(X11とかも含む)py27-pilをインストールしても、7分半(fontconfigのactivateに時間かかってた)。今までのように、ビルドをしかけてから、オヤスミなさいまた明日する必要はないです。あ、僕のマシンはHDDのCore 2世代のMacBook Proです。ディスク暗号化とかいろいろかかっていてかなり重いです。Windows 95を思い出すぐらい・・・

インストールの過程を見ても、必要なパッケージはだいたい自分のサイトのところに置いていて、サードパーティのサイトのリンク切れとかに悩まされられない安心感もいいですね。ビルドしないからSSDみたいな環境の人にいいと思います。スペースが余計に使われないので。また、ビルドしないので、HDDみたいな環境の人にいいと思います。ビルドの時間がかかりませんし。なにより、CPUパワーと時間が食われて熱となって消えていくわけですから、バイナリを使ったほうがエコですよね。gentoo好きみたいなビルド好き以外の人はMacPortsを選んでおけば間違いないと思います。作業のインフラとしては。

まぁ、比較してみると、ちょっとパッケージに収録されているバージョンが古かったり(node.jsは0.6.10。Homebrewは0.6.14)、というのはありますが、gitとか、安定している仕事のツールを揃えるにはいいんじゃないでしょうか?

今、Boostを+universalでインストールしていますが、基本バイナリで、見つからないやつだけソースコードからビルドしている模様。icuのuniversalバイナリはなかったか・・・でも、icuのソースはmacports.orgから取ってきていました。Boostのソースはsourceforgeでしたけど。

Homebrewさん、お世話になりました。

posted by @shibukawa at 05:54 | Comment(185) | TrackBack(0) | 日記 はてなブックマーク - MacPortsは生まれ変わった

2012年02月18日

Sphinxへの感謝の気持ちをブログに書いてみる

sphinx02

僕はSphinx-Users.jpの創設者です。そんでもって、Sphinx-Users.jpの会長をやっていました。先月、次の代表に譲ったので今は違います。現在の会長は@tk0miyaさんです。通称、世界の小宮。副会長は前期からの引き続いて@shimizukawaさんと、新規の@shkumagaiさんです。できる人ほど忙しい、という法則の通り、みんな暇ではないのですが、きちんとビジョンを持った、良いメンバーだと思います。

僕が代表を辞した理由は、転勤によるものです。今はベイスターズで有名な東京のDeNAで働いています。実は野球以外にソーシャルゲームをやっている会社でして、僕もそちらの仕事をしています。来月から、アメリカの子会社のngmoco:)に転勤になります。サンフランシスコです。日本でのコミュニティのマネジメントはできなくなってしまいます。ただ、大きな成長のチャンスを与えてくれたDeNAにはとても感謝しています。

Sphinx-Users.jpは変わったソフトウェアのコミュニティで、Sphinxと、一般的なドキュメンテーションを対象にしています。コミュニティのミッションは、Sphinxやドキュメンテーションに関する情報を集約し、発信していくことです。僕がSphinxに出会ったのは2009年。僕は大学のころから、SWIGやらC++のリファレンスやら、アジャイルソフトウェア開発スクラムやら、実践eXtremeプログラミングやらの翻訳をしたりしていました。Erlang Efficiency Guideというドキュメントを翻訳しているときに、@Voluntasというとんでもない男にSphinxを教えてもらいました。どうとんでもないかというと、自分が読みたい英語の文章があったら、他の人に興味を持たせて、そいつに翻訳させてしまうという・・・ある意味人使いのうまい奴です。日本のPython界とErlang界を影で操っているのはこの男です。某トイプー使いのトイプーさばきとどちらが上か気になります。そんなこんなでSphinxに興味を持ち、リファレンスのドキュメントを日本語に翻訳したりしました。その後Sphinxのコミュニティを作りました。コミュニティの最初のイベントは単なる飲み会だったのですが、偶然その日にSphinx 1.0がリリースされて、偶然リリースパーティー(世界で唯一)になってしまったのは良い思い出です。その後、Sphinxは僕の右腕として大活躍しました。本を5冊ほどSphinxで書きましたし(別の2冊が進行中)、仕事のドキュメントも書きました。僕の持つスキルの中でもかなりの重要度です。

sphinx01

コミュニティイベントには、かなり熱心な人が多く集まりました。PHPのコミュニティのメンバーもいました。@tk0miyaさんもそのようなアクティブなメンバーの一人です。Pythonの勉強がてら、Blockdiagシリーズを次々と作っては公開しました。去年の11月にはsphinxjp.shibukawaという名前で誕生日プレゼントのモジュールを作ってプレゼントしてくれました。おかげで今週、DeNAの同僚から不具合の報告を受けることになったのですが・・・他のメンバーも同様です。@shimizukawaさんはSE向けのドキュメントテンプレートを作成したり、HTMLのテーマを簡単にインストールする拡張を公開したり、Windowsのインストーラも作成しています。@shkumagaiさんは、なかなか刺激的なプレゼンテーションのテーマを作っていたりします。他のメンバーもいろいろな貢献がありました。全部おぼえきらないほどです。日本からの貢献をまとめて紹介するページをコミュニティページに足さなかったのは失敗でした。

Sphinx-Users.jpはすでにコラボレーションの仕組みを持っています。ウェブサイトのリポジトリに誰かがpushすると(もちろんソースはSphinx)、裏でサーバがpullして自動でビルドします。さくらの廉価な月500円プランなので、Jenkinsとかを使うことはできませんでしたので、cronを使って実装しています。オフラインの勉強会に参加できなくても、外からコミットはできます。新しいリーダーは多くのイベントを開催してくれそうです。ソフトウェア開発の速度がドキュメンテーションやコミュニケーションの速度を超えるまでは、ドキュメンテーションは重要なもので在り続けるでしょう。PythonやErlangなどのようなすばらしいシステムはすばらしいドキュメントを持っています。そういう意味で、Sphinxのスキルは、プログラマにとっての良い習慣になっていくでしょう。Sphinx-Users.jpの今後の発展を期待しています。

そうそう、Sphinx-Users.jpにはひとつ迷信があります。僕も@shimzukawaさんも、Sphinx-Users.jpの三役をしている時に、相手を見つけて結婚しました。@tk0miyaさんは、会長に就任して1ヶ月もたたずに、彼女ゲッツ宣言を出していました。Sphinxに関わる人は幸せになっちゃいますね!

posted by @shibukawa at 03:40 | Comment(294) | TrackBack(0) | 日記 はてなブックマーク - Sphinxへの感謝の気持ちをブログに書いてみる

Thank you for Sphinx!!

sphinx02

I am a founder of Sphinx-Users.jp. And I was a leader of Sphinx-Users.jp. Generational change was done last month. Now the leader of community is @tk0miya (his byname is "World Komiya"). Sub leaders are @shimizukawa (he continued) and @shkumagai. Basically they are all busy but they have clear vision and great members.

The reason of I have to resign the leader is job transfer to a affiliated company. I am working at DeNA Co.,Ltd, Tokyo, Japan. It is a social game company. And I will move to ngmoco:) LLC it is in San Francisco, USA. I won't be able to manage community in Japan. I would like to say thank you to DeNA for giving me chance to grow up. I am exciting.

Sphinx-Users.jp is a unique community. It deals not only Sphinx but also generic documentation topic. Its mission is gather and spread information about Sphinx and documentation. I met Sphinx in 2009. From my courage days, I translated many documents. SWIG, C++ reference, Agile Software Development with Scrum, Practical Guide to eXtreme Programming and so on. During translating Erlang Efficiency Guide, blamed guy @Voluntas taught Sphinx to me. If he found any interesting topic in English, he made other guys translate in Japanese. He is the rule of Python and Erlang in Japan. I was interested in Sphinx and I translated the reference document into Japanese. After that, I made a community about Sphinx. First event of that community was just drinking party. But Sphinx 1.0 was released at the same day, so it became release party by chance. It was a good memory. After that, I wrote many document on Sphinx. It includes 5 published books (and 2 are under writing) and business work. Now Sphinx is an one of most important my skill.

Many good members came to the community event. It includes PHP community members. @tk0miya is one of them. He start creating Sphinx extension, Blockdiag series with learning Python. L ast November, he gave me special birthday present. It was sphinxjp.shibukawa, it has my name in it. So I reported the bug of that extension this week from my coworker... Other guys too. @shimizukawa uses Sphinx in his work and opened his document template for software consulting. And he created HTML template extension and Sphinx installer for Windows. @shkumagai created super impressive presentation theme. I can't remember all community member's commitment. I should have created show case page in Sphinx-Users.jp website.

Sphinx-Users.jp already made collaboration system. If I commit to the website's repository(of course it uses Sphinx too!), hosting server pulls and build automatically. My cheap host server ($5/month, no transfer fee) doesn't use cool daemon system like Jenkins, so it is based on cron... super simple. So I can't attend offline event anymore, but I can commit from USA. And new leaders will hold many offline events. Documentation have been important until programming speed will overtake documentation(communication) speed. Good software have good document. Like Python and Erlang.The skill of Sphinx is good habit for all programmers. I am crossing my finger for continue growth of Sphinx-Users.jp.

Oh, I forget one more thing. I have to tell the rumor of Sphinx-Users.jp. When I and @shimizukawa were leader of Sphinx-Users.jp, we found partners and god married. And @tk0miya got girl friend within a month from becoming the leader. Sphinx gives us happy :)

sphinx01
posted by @shibukawa at 03:11 | Comment(298) | TrackBack(0) | 日記 はてなブックマーク - Thank you for Sphinx!!

2011年12月24日

RPythonでスレッド-RPythonで何ができるかを知るには?-

Christmas Blooms in Singapore
by chooyutshing under CC BY-NC-SA

さて、クリスマス・イブになりました。みなさまいかがお過ごしでしょうか?昨日のソニック・ジェネレーションズのイベントで、ハードロックアレンジのクリスマスソングを聞くまではクリスマスイブのことなどすっかり忘れていました。

今日はまさかの三週目のPyPy アドベントカレンダーのエントリーを書いています。

RPythonでスレッドを使ってみる

Pythonとほぼ互換のPyPyでは当然のスレッドをサポートしています。PyPyはRPythonで書かれていてtranslate.pyでビルドされています。つまり、RPythonで作る実行ファイル用のスレッドサポートがpypyのコードのどこかにあるはずです。ためしにgrep -r "thread" *としてみると・・・いろいろわんさか引っかかりますね。その中でも、pypy/module/thread/以下のモジュールがあやしそうです。

pypy/module以下のフォルダは、RPythonで処理されたり初期化されたりして、最終的にPyPyの組み込みライブラリとして使われるモジュール群になります。thread以外にも、bz2zipなどのファイルアーカイブ関連とか、_multiprocessingpyexpatなどもこの中にあります。

オブジェクトスペース

さて、この中のモジュールをそのままコピーすればいいのかというとそうではありません。@jbkingさんのアドベントカレンダーのエントリーで説明されている通り、RPythonにはオブジェクトスペースという概念があります。言語の基本的な論理構造をインタフェースとして切り出したものです。こちらにオブジェクトスペースで提供しているインタフェースの数々があります。

たとえば、is_trueを書き換えると、Rubyみたいに0を真として扱うような言語が作れますし、演算子を書き換えると、PerlやAWKのように、適当に文字列表現の数値を変換してから計算するような言語が作れるといった寸法です。callを書き換えて遅延評価やmemoizeを実装することも可能かもしれません。

pypy/module/以下のライブラリは、このオブジェクトスペースが整備された、言語処理系のためのライブラリとして実装されています。pypy/module/thread/__init__.pyを見ると、pypy/module/thread/os_thread.pyからstart_new_thread関数をインポートしていますが、こちらのコードを見ると、最初の引数にspaceとあります。

我々にはオブジェクトスペースなど不要!

ですが、RPythonを言語を作るためではなく、マゾっ子志向プログラミング言語(MOPL)として、あくまでも、ふつうのプログラムを作るための処理系として使う場合には、オブジェクトスペースを1から作るのは大げさです。そのため、このPyPy向けのモジュールを参考にしながら、実装していく必要があります。

逆に言語を作りたい人は、このあたりから勉強していくといいのかもしれません。基本的には、パーサを作って、オブジェクトスペースを操作するための命令列を作る、というのがRPython Toolchainを使った言語作りです(僕の理解では)。

さて、os_thread.pyを見ると、ll_thread.pyの関数を呼び出しています。ざっとこの2つのモジュールをコードリーディングしてみると、つぎのようなことが分かりました。

  • ll_thread.start_new_thread()を使えばスレッドが作れる。
  • ll_thread.start_new_thread()にはパラメータを渡せない・・・
  • os_threadでは、グローバル変数?を使ってパラメータ渡しをエミュレートしている。
  • os_threadではパラメータ渡しでトラブルが置きないように、スレッド起動時にロックをかけている。
  • スレッドの最初ではll_thread.gc_thread_prepare()を呼ぶ必要がある

このように、コードリーディングした結果を手で実装してみて、確認していきます。

スレッドをためしてみた

できあがったのが上記のコードです。グローバル変数の読み書きのタイミングよりは、list.pop()の方がちょっとは安全かな?(要出展)ということで、スレッド分パラメータをあらかじめ作っておいてpop()していますが、まぁこれは実験コードですので、本番コードを作る場合にはPyPyの実装と同じく、ロックを使う実装にすべきです。スレッドごとに指定された時間分スリープしながら(重い仕事をしているイメージ)、終わったら、自分のIDをコンソールに出力しています。translateで実行ファイルを作ってみて、実行するとつぎのように表示されます。

$ ./testthread-c 
finish task:1
finish task:2
finish task:1
finish task:3
finish task:1
finish task:4
finish task:2
finish task:1
finish task:5
finish task:1
finish task:3
finish task:2
finish task:1
finish task:1
finish task:4
finish task:2
finish task:1
finish task:3
finish task:1
finish task:5

どうやらきちんと実行できているようですね。ちなみに、translate.pyには--threadオプションがあるのですが、付けても付けなくても、普通に動きました。

まとめ

スレッドを題材に使いましたが、説明したかったのはつぎのようなことです。

  • RPythonでできることを調べるなら、PyPyのコードが参考になる
  • 言語を作らないなら、オブジェクトスペースに依存した部分を取り払って使う必要がある

それでは最後になりました。つぎは@drillbitさん?

posted by @shibukawa at 16:33 | Comment(213) | TrackBack(0) | 日記 はてなブックマーク - RPythonでスレッド-RPythonで何ができるかを知るには?-

2011年12月21日

RPythonを使ってechoサーバを作る

Echo Rock and Observation Rock
taken by brewbooks under CC BY-SA

PyPy Advent Calenderの第二回目のバトンが回って来ました。こんかいは時間がないので、さらっと。

RPython用のライブラリ、rlibを探る冒険その2

rlibを探検してみるエントリーの第二弾です。アドベントカレンダーの中では、shomah4aさんがclibffiというモジュールを使って、Cで書かれたライブラリの関数を呼び出していました。

初めての方もいるかもしれないので、軽く関連情報をおさらいしてみましょう

  • PyPyは、Pythonで書かれたPythonインタプリタである。
  • Pythonで書かれたといっても、CPythonの上で実行されるわけではなく、RPython Toolchainというツールを使ってCやllvm、Java、.netに翻訳されてバイナリが作られる。
  • このバイナリを作る用に機能を制限したPythonがRPythonである。
  • RPythonで書かれたプログラムはtranslate.pyで変換するか、Python上で実行できる
  • RPythonでCに変換すると、40倍ぐらい早くなっちゃったりする。
  • RPythonの制約はかなり厳しく、マゾっ子指向プログラミング言語(MOPL)である。

詳しくは、アドベントカレンダーの他のエントリーも見ると良いと思います。

rlibには何が含まれるの?

rlibについては、PyPyのドキュメントが参考になります。名前から何をやっているのか分かるものもあれば、わかりにくものもあります。僕もまだすべて試したわけではないので・・・ちなみに、pypy/pypy/rlib以下にあるモジュールを不用意にimportすると、ビルドできないモジュールもありますので要注意。何がどうなっているのかよく分からないのですが・・・

  • listsort
  • nonconst
  • objectmodel
  • rarithmetic
  • rbigint
  • rrandom
  • rsocket
  • streamio
  • unroll
  • parsing

RSocketを使ってみる

今回はrlibの中から、rsocketを使って、echoサーバをつくってみようと思います。

はい、できました(3分クッキングの音楽を妄想で補完してください)。

Pythonのsocketの違い

大きな処理の流れに関しては違いはありません。

  • gethostbyname()の返り値がrsocket.INETAddress型。
  • RSocket.bind()rsocket.INETAddress型を受け付ける。CPythonのようにタプルは受け取ってくれない。
  • gethostbyname()呼び出し時は一度にrsocket.INETAddressのオブジェクトに一度にポート番号とIPアドレスを指定できない

あと、細かいPyPyの問題として、while True:とエラーになったので、十分に大きなループにしてあります。

遊んでみる

遊んでみました。起動するとポート5000で立ち上がるので、Telnetでつないで入力すると、入力した文字が返ってきます。

$ telnet localhost 5000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. server : connection start hello world hello world

こちらがサーバ側のログです。地味ですね。すみません。

$ ./server_rsocket-c waiting for connection... connection start 'cv: 'hello world

本当は、こちらのベンチマークを図ろうと思ったのですが、何やらエラーになるので、測ってません。

CPythonと互換性がないのは、ちょっと使いにくいな、と思うので、CPythonとなるべく同じインタフェースになるようにしたライブラリでも作りたいなぁ、と思います。今回はthreadモジュールに関しても色々トライしていたのですが、まだばっちりと動くところまでできなかったので、今回はsocketだけです。

次は誰かな?

posted by @shibukawa at 01:39 | Comment(215) | TrackBack(0) | 日記 はてなブックマーク - RPythonを使ってechoサーバを作る

2011年12月10日

PyPyよりも5倍高速な最速のPython処理系

IMG_0844

今出張で、サン・フランシスコに来ています。街はもうクリスマスムードで、楽しげな雰囲気がただよっています。期間限定のアイススケートのリンクが公園にできていたり、ngmoco:)のオフィスの入っているビルにもイルミネーションが飾られていたりします。

PyPy advent calendar に参加しています。@aodagからバトンを受け取りました。今日のこのネタはアドベントカレンダーの記事です。

PyPyはご存知でしょうか?その怪しげな(Pythonらしくイヤラシい)名前にもかかわらず、なんだかよく分からないパフォーマンスを叩き出しているPython処理系です。1.6でもすでにCPythonよりも早かったのですが、1.7ではさらに改善されています。

ですが、このPyPyよりも速いPythonの処理系が存在します。次のスクリーンショットはフィボナッチ数列を計算するベンチマークプログラムの結果です。それぞれの組みの最初の行が計算結果(F31)で、2行目が経過時間です。このベンチマークでは、比較対象としてCPython 2.7.2とPyPy 1.7を使っています。

スクリーンショット(2011-12-10 19.23.38)

PyPyはCPythonよりも8.6倍ほど高速であることが分かりますが、「それ」はPyPyよりも5倍ほど高速でした。オリジナルのCPythonと比べると、実に40倍の速度です。にわかには信じがたい結果です。

この秘密のPythonはPyPyに含まれています。Restricted Pythonというもので、略してRPythonと呼ばれます。Zopeには同じ名前のPython環境がありますが、これとは異なります。ベンチマークのコードを以下に貼り付けます。このブログではsmippleを利用しました。Ianさんありがとう!

だけど、そんなインタプリタ存在しないよ

ですが、RPythonインタプリタなどというものはどこを探してもありません。RPythonというのは、Pythonのサブセットの仕様名です。すべてのRPythonのプログラムはPythonやPyPy上で実行させることもできます。PyPyでは、もう一つ、translate.pyというツールを提供しています。このブログのキモはこのプログラムです。translate.pyについて紹介します。

RPythonってなに?

RPythonはPyPyのために作られたサブセットです。PyPyがPythonで書かれている、という話を聞いたことがある人もいるでしょう。ですが、PyPyのとんでもない速度はGuidoが開発しているCPython上で達成された結果ではありません。Pythonで書かれたPyPyのインタプリタのソースコードはtranslate.pyを使ってC言語やLLVM、CLR(.net)、Javaといったバックエンドのソースコードに変換されます。RPythonは軽量言語的な柔軟性を捨てる代わりに、速度を獲得した言語といえます。例えるなら乙女座のシャカですね。RPythonの結果はまさに天舞宝輪です。

py2exeなどのように、このネイティブコードやJavaや.netなどのプログラムを生成できるというところに興味があったので、アドベントカレンダーのネタ作りのためにちょっと触って見ました。

RPythonでコードを書くにはどうするの?

つぎのコードは、すべてのプログラマーにとって馴染みの深いコードサンプルのHello Worldです。

  • target関数は、エントリーポイントを定義する特別な関数。
  • __name__を使ったブロックはRPythonでは実行されないため、他のPythonインタプリタと互換性を維持するのに使える。
  • エントリーポイントの関数は整数を返す必要がある。

つぎのコマンドを実行して、スタバにでも行ってコーヒーを飲んでいると、凄まじく効率の良いバイナリのプログラムが生成されます。

僕はまだ詳しくは調べていませんが、RPythonには速度に関するオプションがたくさんあります。Just-In-Timeコンパイラだったり、ガーベジコレクションのアルゴリズムを選択s地ありできます。上記のベンチマークの結果は単に-O2をつけただけで簡単に実行したものです。また、上記のコマンドラインではCPythonを使っていますが、PyPyを使うと、ちょっと時間の節約ができます。

RPythonプログラミングはエクストリーム・プログラミング

この「エクストリーム」は「エクストリーム・アイロン」的な意味ですお察しください。ほとんどのPythonのコードはそのままでは変換できないでしょう。なんだかC++でコードを書いているかのような気分になりますし、多くの落とし穴があります。ここでは解決方法がわかっているものに限定していくつか紹介します。

関数の中で他の関数を定義

関数定義をネストさせることはできません

多重継承

RPythonは多重継承をサポートしていません。メソッドのコードの共有をしたい場合には、_mixin_フラグを2つ目以降のクラスに付ける必要があります。super()関数を使うこともできません。ただし、多重継承をすることができないため、親クラス群をC3アルゴリズムで直列化することはないので、それほど重要ではありません。

公式サポートされているモジュールが少ない

公式には、os, math, time群だけがサポートされているようです。せめてreを・・・

@propertyデコレータ

プロパティというすばらしい機能を使うことができません。

メタプログラミング

__dict__プロパティにアクセスすることができないため、dir()関数が使えません。もしRPython用のテスティングフレームワークを作るのであれば、古のCppUnitのようにテストメソッドを1つずつ手で登録していくようなコードになる気がします。

関数の引数が、特定のデータ型にバインドされる

通常のPythonでは、変数が型情報を持つことはありません。そのため、C++のテンプレートのように、ジェネリックなアルゴリズムを記述することもできます。しかし、RPythonの変数は型情報を持ち、最初に割り当てられた時にバインディングが生成されます。これには関数の引数も含まれます。

RPythonの印象

IMG_0847

なんだか難しいなぁ、と感じました。

最初に、「これが正規表現をサポートしたら、ちょっとした小さなツール開発で使えるかな、と考えました。そのため、pure Pythonで実装されていて、reと互換性を持つrxpyの移植に挑戦しました。しかし、凄まじく難しくて、うまく完成まで持っていくことができませんでした。上記の落とし穴も、この移植中に見つけたものになります。また、RPythonの最も厳しい点は、ビルド時にリソースを大量に消費するというものです。上記のHello Worldのビルドでも1.5分ぐらいかかりましたし、もしPyPyのような巨大なプロダクトをビルドするときは、メモリは4GB以上ないとダメ、だとか。

また、それほど詳しいドキュメントもありませんし、だれかがRPythonの仕様を保証してくれているわけでもありません。そのため、試行錯誤を繰り返して触っていく必要があります。しかし、将来的には、RPythonのアノテーションの仕組みをもっと詳しく知って、RPythonでのプログラミングを支援してくれる便利なライブラリが増えてきたりすると、もっと開発しやすくなるでしょう。

僕は兎にも角にも、このスピードのすごさを目の当たりにしてしまったため、少しずつでもRPythonを触って、RPythonでできることをどんどん広げていきたいと考えています。

PyPyアドベントカレンダーは、つぎは@yanolabさんの番です。

なお、このエントリーでちょっと言葉が難しいなあ、と感じられた方は、とても評判のよい、エキスパートPythonプログラミングという本をおすすめしております。とうか訳しました。よろしくね!

posted by @shibukawa at 20:55 | Comment(180) | TrackBack(0) | 日記 はてなブックマーク - PyPyよりも5倍高速な最速のPython処理系

The fastest Python Implementation x5 faster than PyPy

IMG_0844

Now I stay San Francisco for business trip. The city become Christmas season and very happy atmosphere. Special ice-skating rink is appeared in the park and the office building that ngmoco:) is in has many illuminations.

I joined PyPy-ja advent calendar . Yesterday @aodag wrote the entry. Today is my turn.

Do you know PyPy? It is a very impressive Python implementation. Its speed become faster and faster. 1.6 was already faster than CPython but 1.7 improved too.

But there is the fastest Python implementation that is faster than PyPy. Following result of the benchmark program that calculates Fibonacci number. Each first lines are the result of the calculation (F31), and second lines are the time to calculate. I uses CPython 2.7.2 and PyPy 1.7 and "it".

スクリーンショット(2011-12-10 19.23.38)

PyPy runs 8.6 times faster than CPython. But "that" implementation runs 5 times faster than PyPy. It is more than 40 times faster than original CPython. Do you believe the result?

That secret of that Python is included in PyPy. Its name is RPython, shorten form of "Restricted Python". Zope has same name Python environment, but it is different one. The code of benchmark is following. This entry uses smipple. Thank you for Ian Lewis! He is super cool Python programmer.

But the interpreter doesn't exist actually.

But you can't use RPython interpreter. RPython is the specification for the subset of Python. All RPython program can run on Python and PyPy. One more thing, PyPy provides the tool translate.py. This is a secret of this blog entry. I will introduce translate.py.

What is RPython?

RPython is created for PyPy. As you heard, PyPy is written in Python. But its super exciting benchmark result isn't achieved on Guido's CPython. PyPy interpreter source code is converted by translate.py into C or LLVM or CLR(.net), Java source code. RPython can gain unbelievable speed instead of any flexibility of lightweight language.

I am interested in the feature that it can translate into native or Java or .net execution like py2exe. So I tried it for PyPy-ja advent calendar.

How to program in RPython?

Following code sample is a sample that familiar with all programers - Hello World.

  • The target function is the special function it makes decision the entry point.
  • __name__ block is not executed. It is useful to keep compatibility with other Python interpreters.
  • The entry point function must return integer.

After typing these command and going to Starbucks and drinking coffee, you get super fast native binary program.

I don't research the detail, but it supports many options to improve the speed, like Just-In-Time compiling and Garbage-Collection. Above result of benchmarking was generated by simple option(just -O2). Above sample uses CPython, but if you use pypy, you can save your time.

Programming in RPython is an eXtreme Programming.

This "eXtreme" is a same meaning of eXtreme Ironing. Almost all Python code can't be accepted as is. I felt as if I programming in C++. There many pit falls. I will show the some of them.

Function in other functions

You can't nested function definition:

Multiple inheritance

RPython can't use multiple inheritance. If you want to share the methods, you must set _mixin_ flag into secondary classes. And you can't use super() function. But it is not important any more (because it doesn't use C3 algorithm to create sequence of parent classes).

Official supported modules are limited.

In official document, only os, math, time modules are supported.

@property decorator

It can't support nicer syntax - property.

Meta-Programming

We can't access to __dict__ property. It means dir() function is not supported. If you want to write testing framework, you must add each test methods by hand like older style CppUnit.

Function's parameters are binded specific data type

Variables in Python don't have type information. So you can write generic algorithm like C++'s template. But in RPython, variables have type information and they are binded when first assignment. It includes parameters of function.

My impression of RPython

IMG_0847

I felt it is difficult.

At first, if it supports regular expression, I will be able to use it for small tool developing. So I tried to port rxpy (pure Python regular expression it has compatibility with re module). But it is super extreme hard task for me (and I couldn't finish). Above pit falls were found when porting rxpy. And the worst point of RPython is it takes much resources. Compiling above simple took about 1.5 minuits. And I heard building PyPy needs more than 4GB memory.

There is only a little instruction. And no one guarantees the specification of RPython. So we have to try and error to use RPython. But if I can understand annotation system better than now and more useful modules they support RPython programming are released, it will be more useful environment.

But I was moved to the performance. So I want to try RPython little by little to expand the capability of RPython. At first I will read the source code of existing programming languages they are implemented in RPython.

Next person who write PyPy-ja advent calendar is @yanolab.

posted by @shibukawa at 20:15 | Comment(173) | TrackBack(0) | 日記 はてなブックマーク - The fastest Python Implementation x5 faster than PyPy
検索ボックス

Twitter

www.flickr.com
This is a Flickr badge showing public photos and videos from shibukawa.yoshiki. Make your own badge here.
<< 2016年12月 >>
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
最近の記事
カテゴリ
過去ログ
Powered by さくらのブログ