村上春樹のやりかた

"It's not that I don't believe in contemporary literature," he added, "but I don't want to waste valuable time reading any book that has not had the baptism of time. Life is too short."

嘘かほんとかわからないけど、村上春樹が「死後何年かした作家の作品以外は評価しない」というポリシーを持っているという話はよく聞かれる. 今日, 授業でやっている英語版ノルウェイの森の和訳(ややこしいねぇ)で, そのポリシーが作中人物によって語られる場面に触れた. 上のものがそれだ.
「時間による洗礼」(baptism of time)というのは大雑把にいうと「何十年にも渡る時間による淘汰が, 本当に良いものだけを選りすぐってくれる」ということだ. これって, 最初に聞いたときはなるほどと思ったけど, よく考えるといまいち納得できない.
つまり, 時間による淘汰というのは大衆による取捨選択に過ぎない, という問題があると思う. 必ずしも良いものが残るとは限らない.
たしかに, 幸運にも後世で再評価される機会があれば, 成立当時は評価されなかった良い作品が残る可能性もある. フランツ・カフカとかがそうらしい. だけどそれは, むしろそういうものの存在は, その影で二度と評価される機会を持たなかったが非常に優れたものが存在するということの裏返しでもある.
今この時代, この瞬間に華やかにスポットライトを当てられたものの影で, 優れた側面を持つにも関わらず「わかりにくい」という理由だけで後世に残らないものも必ずある. 後世に残らないなら, それを味わえるのは今しかない.
そもそも過去の評価はそれほど確かなものだろうか? 今「評価」の代名詞であるメディアが取り上げるのはほとんどの場合ろくでもないものじゃないだろうか? そうやって後世に伝えられてきた作品が, なぜ必ずしも素晴らしいといえるのだろうか?
それから, 現代の作品を読まないというのは「時間による洗礼」への参加を辞退しているということになる.

かずさアカデミアパークまでの道のり

やっと何とかわかったのでメモしておく。
つくば→JR木更津駅は普通に乗り換えていける。
木更津駅からの路線バスが、土日は出ていないと思っていたのだけど、こちらによれば小糸南行きだけの話で、それ以外は本数は少ないながら出ているらしい。
あんまり早すぎてもアレかと思うので、10:30に木更津駅を出ることにする。いろいろとあるので9:30には木更津駅に着いておきたい。とすると、つくば発は7:30になるのね。起きられるかなあ。

秋がくる

つくば市ではだんだん気温も下がってきて、昨晩半袖で歩いていたら風邪をひいてしまったし、今朝はとうとうパーカーの出番になった。一昨日くらいから一気に気温が下がったように思う。
ここしばらくはずっと、北関東の冬の厳しさを感じている。Yahooの天気予報をブックマークに入れるのが億劫でいつも日本全地図からつくば市までFlashをぽちぽちしているのだけど、ときどき何となく伊勢市の予報も見たりしている。やっぱり、だいたい2度くらいこちらのほうが寒いらしい(特に朝とか、なぜか伊勢市のほうが5度くらい気温が低いことがある。冬の朝に僕が布団からなかなか出られなかったのは仕方のないことだったのだろう...というわけではない?)。
なつやすみ中に帰省して、それ自体はなかなか楽しかったのだけど、タイミング悪く持病が激化(悪化なんてもんじゃなかったなあ)してしまって以降、いろんな活動(大掛かりなことも、小さなことも)を停止していた。たぶん少なくない人に迷惑をかけたと思うので、誰も見ていないかもしれないけどここで謝っておきたいと思います。
時間が経つのは恐ろしいくらい早くて、つい最近はじまったはずの2009年も残すところあと3ヶ月足らずとなっている。高専ドロップアウトして大学に入って、たくさんの環境がいろいろな方向に変化した。僕はその変化についていけた部分もあるし、取り残されていたけど追いついた部分もあれば、未だにどうしていいのかわからない部分もある。ある程度予想どおりに進んだ要素の傍らで、たくさんの障害に阻まれた要素が身動きも取れずにもがいている。あきらめたことだっていくつかある。
自分のスタンスと立ち位置も少しずつだけど見えてきた。そういった類のものは全部が全部自分で選べるわけではない、ということを最近になって知った。周りの人のイメージや間柄、自分の虚栄心と現実がせめぎあって、SFに出てきても不自然じゃないような複雑なメカニズムを経て少しずつ構築されていく。僕らは基本的にはそれを見ていることしかできない、というよりもしっかりと見ていなければいけない。
一度ぼろぼろになった(比喩的にも肉体的にも)おかげで、何を得て何を捨てるべきか、おぼろげだったその正体の輪郭くらいは見えるようになった。僕らは何よりも健康に生存する必要があるし、だからといってパンを食べるために生きているわけでもない。
できればしたくなかった後悔も何度かした。(複数の集合について)僕らに残された時間は長くて短い(そもそも時間というのは本質的にそういうものなのかもしれない)。

メモ

苦戦中. うう...

avcodec_encode_video

int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
                         const AVFrame *pict)
{
    if(buf_size < FF_MIN_BUFFER_SIZE){
        av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n");
        return -1;
    }
    if(avcodec_check_dimensions(avctx,avctx->width,avctx->height))
        return -1;
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || pict){
        int ret = avctx->codec->encode(avctx, buf, buf_size, pict);
        avctx->frame_number++;
        emms_c(); //needed to avoid an emms_c() call before every return;

        return ret;
    }else
        return 0;
}

AVCodec

typedef struct AVCodec {
    /**
     * Name of the codec implementation.
     * The name is globally unique among encoders and among decoders (but an
     * encoder and a decoder can share the same name).
     * This is the primary way to find a codec from the user perspective.
     */
    const char *name;
    enum CodecType type;
    enum CodecID id;
    int priv_data_size;
    int (*init)(AVCodecContext *);
    int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
    int (*close)(AVCodecContext *);
    int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
    /**
     * Codec capabilities.
     * see CODEC_CAP_*
     */
    int capabilities;
    struct AVCodec *next;
    /**
     * Flush buffers.
     * Will be called when seeking
     */
    void (*flush)(AVCodecContext *);
    const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
    const enum PixelFormat *pix_fmts;       ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
    /**
     * Descriptive name for the codec, meant to be more human readable than name.
     * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
     */
    const char *long_name;
    const int *supported_samplerates;       ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
    const enum SampleFormat *sample_fmts;   ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
    const int64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
} AVCodec;
int ff_xvid_encode_frame(AVCodecContext *avctx,
                         unsigned char *frame, int buf_size, void *data) {
    int xerr, i;
    char *tmp;
    struct xvid_context *x = avctx->priv_data;
    AVFrame *picture = data;
    AVFrame *p = &(x->encoded_picture);

    xvid_enc_frame_t xvid_enc_frame;
    xvid_enc_stats_t xvid_enc_stats;

    /* Start setting up the frame */
    memset(&xvid_enc_frame, 0, sizeof(xvid_enc_frame));
    xvid_enc_frame.version = XVID_VERSION;
    memset(&xvid_enc_stats, 0, sizeof(xvid_enc_stats));
    xvid_enc_stats.version = XVID_VERSION;
    *p = *picture;

    /* Let Xvid know where to put the frame. */
    xvid_enc_frame.bitstream = frame;
    xvid_enc_frame.length = buf_size;

    /* Initialize input image fields */
    if( avctx->pix_fmt != PIX_FMT_YUV420P ) {
        av_log(avctx, AV_LOG_ERROR, "Xvid: Color spaces other than 420p not supported\n");
        return -1;
    }

    xvid_enc_frame.input.csp = XVID_CSP_PLANAR; /* YUV420P */

    for( i = 0; i < 4; i++ ) {
        xvid_enc_frame.input.plane[i] = picture->data[i];
        xvid_enc_frame.input.stride[i] = picture->linesize[i];
    }

    /* Encoder Flags */
    xvid_enc_frame.vop_flags = x->vop_flags;
    xvid_enc_frame.vol_flags = x->vol_flags;
    xvid_enc_frame.motion = x->me_flags;
    xvid_enc_frame.type = XVID_TYPE_AUTO;

    /* Pixel aspect ratio setting */
    if (avctx->sample_aspect_ratio.num < 1 || avctx->sample_aspect_ratio.num > 255 ||
        avctx->sample_aspect_ratio.den < 1 || avctx->sample_aspect_ratio.den > 255) {
        av_log(avctx, AV_LOG_ERROR, "Invalid pixel aspect ratio %i/%i\n",
               avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
        return -1;
    }
    xvid_enc_frame.par = XVID_PAR_EXT;
    xvid_enc_frame.par_width  = avctx->sample_aspect_ratio.num;
    xvid_enc_frame.par_height = avctx->sample_aspect_ratio.den;

    /* Quant Setting */
    if( x->qscale ) xvid_enc_frame.quant = picture->quality / FF_QP2LAMBDA;
    else xvid_enc_frame.quant = 0;

    /* Matrices */
    xvid_enc_frame.quant_intra_matrix = x->intra_matrix;
    xvid_enc_frame.quant_inter_matrix = x->inter_matrix;

    /* Encode */
    xerr = xvid_encore(x->encoder_handle, XVID_ENC_ENCODE,
        &xvid_enc_frame, &xvid_enc_stats);

    /* Two-pass log buffer swapping */
    avctx->stats_out = NULL;
    if( x->twopassbuffer ) {
        tmp = x->old_twopassbuffer;
        x->old_twopassbuffer = x->twopassbuffer;
        x->twopassbuffer = tmp;
        x->twopassbuffer[0] = 0;
        if( x->old_twopassbuffer[0] != 0 ) {
            avctx->stats_out = x->old_twopassbuffer;
        }
    }

    if( 0 <= xerr ) {
        p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA;
        if( xvid_enc_stats.type == XVID_TYPE_PVOP )
            p->pict_type = FF_P_TYPE;
        else if( xvid_enc_stats.type == XVID_TYPE_BVOP )
            p->pict_type = FF_B_TYPE;
        else if( xvid_enc_stats.type == XVID_TYPE_SVOP )
            p->pict_type = FF_S_TYPE;
        else
            p->pict_type = FF_I_TYPE;
        if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) {
            p->key_frame = 1;
            if( x->quicktime_format )
                return xvid_strip_vol_header(avctx, frame,
                    xvid_enc_stats.hlength, xerr);
         } else
            p->key_frame = 0;

        return xerr;
    } else {
        av_log(avctx, AV_LOG_ERROR, "Xvid: Encoding Error Occurred: %i\n", xerr);
        return -1;
    }
}

screenの表示が崩れる

fedora11にて.

sudo yum install screen

.screenrcはこんなん(takaてんてーからもらった):

caption always "%{= kw}%-w%{= BW}%n %t%{-}%+w %-= @%H - %LD %d %LM - %c"

GNU screenをインストールして実行してみたら、ステータスラインが表示されない。なぜかと思ったら.screenrcが.screeenrcだったので修正したところまた表示されない。なんでやねんと思いながら確認すると今度は.sceenrcになってた。死にたい。

ちゃんと.screenrcに修正したらびっくりするくらい表示が崩れた。あとで調べたところわかったのだけど、

  1. 日付表示内の日本語が化ける
  2. 文字列の長さが1行を溢れて2行になる
  3. 溢れた部分を最下行に残して、残りは下から2行目に浮かぶ
  4. 常に表示されるのは最下行だけ

という流れでステータスラインが表示されなかったようす。

そんなこととはつゆ知らず、takaてんてー(なぜか工事中の図書館で騒音に苦しんでいたらしい)と悩みに悩んで、次のような流れに:

  • debug onにしてみる
    • してみたら「-DEBUGでビルドされてないので無理!」とか言われたのでGNU screen 4.0.3を落としてきて--DDEBUGをつけてビルドしてみる
    • が/tmp/debugに吐かれたものを見てもイマイチ意味がわからない(なんかlsの実行結果みたいなものがあった
  • tscreen 0.4.9を落としてきてビルドしてみる
    • うまく表示された。ただし文字化けしている。文字化けしている?

文字化けしている?そもそも設定ではステータスラインには:

Friday 28 August

みたいな感じで表示されることを期待しているし、takaてんてーのほうではそのように表示されている...

tnzk: 冷静に考えたらtakaてんてーのだと日付って英語で表示されてて
tnzk: 化ける要素ないと思うんだけど
opentaka: 普通にLANG=POSIXやからねぇ
tnzk: ああ。。。
tnzk: ストイックすぎるw
tnzk: 真似できねえw
opentaka: wwwww

ためしにLANG=POSIXで起動してみる:

$ LANG=POSIX screen

してみたところ、めちゃめちゃ正常に表示された。

というような経緯で冒頭の問題の原因がはっきりした。消極的に、ステータスラインに日本語を表示しないことで対応することに。

defencoding utf-8
encoding utf-8 utf-8
escape ^]v
vbell on
vbell_msg "(OxO)"
caption always "%{= kw}%-w%{= BW}%n %t%{-}%+w %-= [%t] - @%H - %Y/%m/%d %c:%s"

フォーマット指定子は次のURLから参照できる(一部だけっぽい...

twitterとブログとmixiの使い分け

こういう自分垂れ流し系のサービスってどう使い分ければいいのか悩む。距離感を測るためにtwitterをやめてみたりmixiをやめてみたり(不思議と意識しなくてもブログは続かない。なぜだろう?)したけど、結局のところうまくまとまらないからせめて今の気持ちを記録しておく。

twitter

  • 最近気づいたけど最初のpostまで遡れるわけじゃなさそうなので、ログとしての利用は長期的には難しい
  • エクスポートのようなことはできない(わっさーではそれができるらしい?
  • 「どこかに書きたいが長くは残ってほしくない」内容に向く
    • 歌詞の写し
    • 愚痴
    • 詩的なぼやき

mixi

  • 「顔見たことある人だけ!」とかって言える人にはmixiの存在価値は大きいと思う。僕はそこまで潔くないのでうまく住み分けできない
  • 適当なこと書いても誰もツッコまない空気がある。一長一短だけどそうされたくないような文章を書くのには向いてる
  • ただしエクスポートはできないので技術的・ノウハウ的な内容には合わないか

フロー

  1. 何か書きたいと思う
  2. それが140文字にまとまる程度ならまずtwitter
  3. シンタックスハイライトなどが使いたければブログへ
  4. あとはmixi
  5. twitter/mixiに投げたものを後で見て、誰かの何かの役に立ちそうならブログへ

実行せずに文法チェック

当然のことだけど、コンパイルを要する言語では当然それが文法チェックの役割を果たしてくれて、結果として文法上の間違いを含んだプログラムを実行するといったことは発生しえない。
これがスクリプト言語だと、文法に問題のある部分こそ実行できないものの(実行できるならそこには問題があるとはいえない)、問題に突き当たるまでは実行を進めてしまう。
これが厄介で、例えば:

  1. DBにファイルのパスを書き込む
  2. そのパスに実際にファイルを作成する

といったような記述をした(設計の良し悪しは別のはなしとして)とき、2の実行時に失敗してファイルが書き込めなかったりすると、実際には存在しないファイルがフロントエンドからは存在するように見えてしまう。よくあるバグだ。
そういうわけで文法チェッカーみたいなのがないかなーと思っていたら、今日ふと見つけた。

 $ ruby -cw script

とすると、実行することなしに文法のチェックのみを遂行できる。

  • cだけでも文法チェックを実行して、問題がなかった場合にその旨を表示することはできるが、-wも加えると具体的にどんなエラーがあるのかも確認できる。

たとえば次のようなスクリプトなら、

#!/usr/bin/ruby

arr = ["Hello", "Good-bye", "So long", "and Hello!" # ココが残念
puts arr.join(",")

次のように診断される:

$ ruby -cw patricia
patricia:4: syntax error, unexpected tIDENTIFIER, expecting ']'
puts arr.join(",")