2010-12

2010-12-01 

気がついたら日付が変わってた。同じく気がついたら檜山さんがCatyScriptの風呂敷を対外的に広げてしまっていた。

というわけで、ちょっとだけ檜山さんのエントリに関連したCaty四方山話を。

Catyには現在、組み込みコマンドでrequestというコマンドがある。これがどういうコマンドかというと、次のように使う。

@json {"foo": "bar"} | request --method=PUT /something.ext

これは次のHTTPリクエストと大体同じ。

PUT /something.ext HTTP/1.1
Content-Length: 14
Content-Type: application/json

{"foo": "bar"}

要するにクライアントからのHTTPリクエストのエミュレーションコマンドなわけだが(実際には違うが)、こいつはなかばevalとして動作している。/somthing.extに関連付けられたCatyScriptをrequestが読み出して実行する、といった塩梅だ。だが実際にはもうちょっとややこしい。

例えばsomething.extにPUTしたときに動作するスクリプトに、ファイルへの書き込み処理があったとしよう。Catyでは一通りのパイプラインが終了するまではファイル、データベース、セッションなどへの書き込みは実際には行われず、パイプラインが正常終了したときにトランザクションをコミットというスタイルになっている。そして上記のスクリプトのパイプラインの終了というのは、requestコマンドの終了があたる。つまりsomething.extに関連付けられたスクリプトの実行が終わった時点では、実際の環境には無影響でなければならない。

というわけでrequestを実行する度に実行環境と切り離された環境を作り、requestの終了時に二つの環境をマージするという処理を行っている。前に何度か檜山さんが書いたCatyFITによるテスティングは非常に便利なのだが、その理由は副作用のあるリクエストでも実行終了時にトランザクションを破棄することで実際の環境への影響を与えずにテストできるという事によっている面が多々ある。


えーとまずはMyspaceにある写真を見てくださいよ。どこの国のヴィジュアル系だ。いやまあ、元はV系もアメリカの80'sヘアメタルからファッション面では影響されていたので、ヘアメタル影響下のバンドのファッションがV系っぽくなっても不思議じゃないし、結構V系って海外でも人気あるし。

音の方はヘアメタルというよりは、スクリームを取り入れたヨーロピアンヘヴィメタル。ってか言われないとアメリカのバンドとは思わなかったかもしれない。メロディアスなリードギターが全面に出されていて、特にツインハモリが思いのほか多めなのは気に入った。HIMのVille Valoっぽい案外繊細なヴォーカルや押しの強くない音作り含めて聴き易く、メタラー以外にも受けそう。

2010-12-07 

定期的に何か書かないと「読者に『檜山が鍬田を激務に就かせて使い潰してる』と思われるだろ」という文句を檜山さんから付けられるので、最近のことをツラツラと。


すげえ。

これはバッターアウト、あるいはスリーアウトチェンジ。知事の発言は一発で更迭もんだと思うが、こっちはこっちで酷い。いやまあ、副都知事として公の場で発言したんじゃないならまだマシというべきか、仕事の立場上でも何でもなく、素でこういう事を考えている奴が副都知事というのはやっぱり終わっているというべきか。


Gentoo Linuxの場合、varnishをemergeした直後の/etc/conf.d/varnishdのVARNISHD_OPTSには/etc/varnish/default.vclを読み込むための記述がないので、-f /etc/varnish/default.vclを追加して-bオプションを取っ払う。

……なんてことをいつまでも覚えていられるはずもなく、一時間ほど「キャッシュが効かない」「PURGEリクエストがバックエンドにやってくる」とハマりまくった。

2010-12-08 

毎日書ける保証なんざねえから日記と称するのやめ。雑記にしよう。気分の問題だけどさ。


諸事情により、CatyスキーマのJSON表現を考えているというか実装してる。CatyスキーマはオリジナルのJSONスキーマからは全然違うものになってしまったが、依然としてJSONでも表現可能になっているはずだ。

これを仮にJECS(xJsonEncodedCatySchema)とすると、JECSのCatyスキーマでの型定義は簡単にはこんなところか。

/**
 * CatyスキーマのXJSON表現
 */
type JECS = {
    "docstring": string, // ドキュメンテーション文字列
    "name": string, // 型名
    "data": Reference | {*:JECS} | list<JECS> | Scalar, // スキーマ本体、組み込みのスカラー型はnull
    "module": string | null, // 所属するモジュール名、組み込み型はnull
    "annotations": list<Annotation>, // アノテーション(定義は略)
    "options": Option, // オプション
};

type Option = {*:Scalar};

type Scalar = string | number | integer | boolean | null;

type Reference = @ref {
    "name": string, // 型名
    "options":Option, //オプション
};

上記の定義は型変数の存在を考慮していないので、実際にはもう少し複雑な型定義になるし、Catyスキーマだけでなくコマンド宣言もJSONにエンコードしたもの、JECD(JsonEncodedCommandDeclaration)も必要なのだが。

ところでJECSの型定義をJSON変換した結果、つまり

{
    "docstring": "CatyスキーマのXJSON表現",
    "name": "JECS",
    "data": {
        "docstring": "ユニオン型",
        "name": "$union",
        "data":{
            "$typeA" : {
                "$tag": "ref",
                "$val": {
                    "name": "JECS",
                    "options": {}
                }
            },
            "$typeB": {
                "docstring": "ユニオン型",
                "name": "$union",
                "data":...
            }
    },
    "module": null
}

をXJSONに変換したものはCatyスキーマで検証可能になる。ユニオン型をオブジェクトに変換しているなどの都合上、JECSオブジェクトのスキーマであるMetaJECS型を定義して検証する必要があるが、原理上可能には違いない。

このように概念上の存在を物理的な実体に落とし込むことをreificationという。まあ、檜山さんから教わったことなのだが。

2010-12-10 

次のCatyのリリースには、バッグ型+限定的な正規表現のバリデータが入る予定。既に実装はしてある。

/** 最低でも一つの整数を含む。 */
type foo = {[integer]};

/** 最低でも一つの整数と一つの文字列を含む。 */
type bar = {[integer, string]};

/** 一つの真偽値と三つまでの整数と二つ以上の文字列を含む。 */
type buz = {[boolean{1}, integer{0, 3}, string{2,}]}

type s<A, B> = {[A, B{2,}]};

/** 当然型変数も使える。 */
type t = s<integer, string>;

以下の定義はエラー。

/** 個々の要素は排他的になってないとダメ。 */
type bar = {[integer, integer]};

/** これも型が排他になってない */
type u = s<string, string>;

バッグ型で検証する対象は配列なので、Pythonにおけるsetなどの集合型とはちょっと違う。排他的なのは、要素の値ではなくて型定義時の要素。

あとは以下の構文で擬似タグが追加される。

type foo = {
    "k": string,
};

/ ** xの型は依然としてobject */
type x = @?(k: "x") foo;
/ ** yの型は依然としてobject */
type y = @?(k: "y") foo;

type bar = x | y;

本来はfooはobject型なのでユニオン演算はできないのだが、擬似タグでfooの特定のプロパティをタグのように扱うことで、あたかも排他的な型同士のように扱えるようにするという機能だ。

実際の意味論としては、次のタグ付きの値をJSONエンコードした形を正規形とし、@foo barはユニオン演算の文脈においては@?($tag:"foo") barのSyntactic Sugarだと思ってよい。

{
    "$tag": タグ名,
    "$val": 本体,
}

現時点ではまだwhen式の方で対応していなかったり、いろいろ課題が残っているのだが。

これと先のバッグ型を組み合わせれば、Catyスキーマレベルでより強力なチェックが可能になる。というか、そのレベルでチェックしないとテストが面倒なケースが出てきたというべきか。

2010-12-16 

最近思ったことの羅列。

2010-12-24 

CatyにリソースリークがあるっぽいのでGuppy-PEを使って調査してたんだが、このGuppy-PEはどうもある種のコードを食わせると死にやがるらしい(一応、パッチ込みで報告済み)。

とりあえず再現コードはこんな感じ。

import types
import guppy
class HugeObj(object):
    def __init__(self):
        self.huge_list = [range(100) for i in range(10)]

    def get_list(self):
        return self.huge_list

l = [HugeObj() for i in range(100)]
for o in l:
    o.get_list = types.MethodType(lambda self: map(str, self.huge_list), o)

print guppy.hpy().heap().get_rp()

インスタンスに対してメソッドのアサインを後付けで行い、それがget_rpの対象に含まれてると例外が発生する。極めてマズいことにCaty内部ではこのテクニックを使っている部分があり、そしてその近辺でリークが起こっていたのが問題を厄介にしていた。

この手のテクニックは柔軟なプログラムを実現できる一方で、こういう問題発生時の追跡が困難になりかねないので多用は禁物だということは重々承知してるが、そうも言ってられないのでな。

パッチはかなり応急処置気味と言うか問題先送りかもしれないんで、当てるんならそれを承知の上で。

- http://static.return0.info/guppy/UniSet.patch

2010-12-25 

Annihilation-V

EpiphoneのAnnihilation-Vを買った。80年代末期より活動しているカナダの古豪スラッシャー、Annihilatorの中心人物であるJeff Watersのシグネチャーモデルだ。「リーズナブルな価格で良い物を提供したい」みたいな事を言っていただけあって、メーカー希望小売価格で10万円を切っており、俺は6万円台で入手できた。

次にやる曲はこれで弾く予定。

2010-12-27 

ここ数日はCaty内部のクソのようなバグを潰すのにばっか時間を使っていたが、まあ仕方がない。いくつかは運用上の問題に直結する爆弾だったからな。

そんで全然話は変わるが、定期的に出てくる自転車置き場の議論ネタの手書き履歴書。とりあえず俺は手書き履歴書否定派で、それも極めて強硬な否定派であり、そもそも日本の履歴書のフォーマットの多くは年齢性別容姿などを記載せねばならない時点で国際的には違法なのでとっとと変えるべきだと思っている。

これは事ある毎に書いてることだが、手書きの履歴書を求めて「手書きだと人格や能力が云々」というのは、明確かつ合理的な採用基準を提示できないことの裏返しだと思った方がよい。特に「未経験者歓迎!」とかやってる底辺ソフトウェアハウスとか、体育会系的な残念業界はその傾向が強いのではなかろうか。

じゃあどうして「明確かつ合理的な採用基準を提示できない」のかだけど、これは主に以下のどちらかが原因。

どっちにしろろくなもんじゃない。

そもそも手書きの方が心がこもるってんなら、会社で作る企画書なんかも手書きの方が熱意が伝わって通りやすいってことになるんだろうけど、手書き履歴書肯定派はそういう書類も手書きしてんのか?

それにしても「字に人格が宿る」的な主張をする奴が多いのにはビックリだ。どんだけエスパーなんだ。あ、エスパーって薬中と同義だからな。ちゃんと更生施設に入って薬抜いてこいよ。

追記:リンク先間違ってた。それも数日間。


エスパーといえばスクエニがストレートにエスパー募集してたなと思っていたら、だいぶまともな文面に直ってた

協調性があること。ゲームが好きで、ゲームそのものの実装にモチベーションのある方

こういう人物像なら理解できる。しかしなんだって最初はエスパー募集しようとしてたんだろ。何か最近のスクエニってゲームの評判悪いし(俺の遊んだ限りじゃFF13はぶっちゃけアレ)、FF4のリメイクのスクリーンショットの「マザーポム」と全体的に残念な絵面とか、どんだけガタガタなんだろう。

俺、別にスクエニというか旧スクウェアは嫌いじゃないんだけどな。デュープリズムはPSで出たゲームの中でも思い出深いものの一つだし、初代ブシドーブレードはある意味で金字塔だとも思ってるし(ブシドーブレード弐は凡作だ。確かによりまとまりが良いのは弐の方なのだが)。

2010-12-31 

今年一年のまとめを書こうと思ったが、椎間板ヘルニアのインパクトに比重しうる事が起こらなかったので、「椎間板ヘルニア辛かったです」。以上。

……というのはあんまりなので、別の事もいろいろ箇条書きにて。

2010-12-22 

今日ちょっと引っかかったクソのような問題とバッドノウハウについて書く。

諸事情によりPNGファイルからSVGファイルに変換する必要が出てきたのでautotraceというソフトウェアを使ったのだが、そこで問題発生。Firefoxでそのファイルを見ようとすると「この XML ファイルにはスタイル情報が関連づけられていないようです」のメッセージとともにXMLのツリービューが表示されて画像として表示されなかった。

何事かと思ってSVGファイルを見たら、名前空間の指定が抜けてやんの。名前空間を手で書き足したら、あっさりとSVGの画像が表示できた。俺が使ったバージョンは0.31.1-r5で、他のバージョンは知らない。というか他のソフトウェアでは同じSVGを閲覧できたりして、なんつーかあれだ、手軽にローカルで使えるSVGバリデータとかあれば一番良い。


俺はギターのストラップにONORIというメーカーのL3を使ってるんだが、もう一本スペアとして持っておきたいなーと思って探したところ、何か全然見つからない。イケベ楽器のサイトじゃ「取扱い終了」とか書かれてるし、もう手に入らないのか。

ONORIのL3、レザー製だけどえらいこと柔らかく、裏地のおかげで全然滑らないので凄くいいんだけどなあ。