starposの日記

思ったこと感じたこと考えたことを書く

Almost the same interface of both optimistic and pessimistic transaction processing.

I feel the interface of the STM is very attractive, but we need a pessimistic implementation sometimes, for example, when many threads concentrate into one resource at the same time, the overhead of first try of all threads is not ignorable. Even in such situations, we want to avoid dead locks.

The goal should be both optimistic and pessimistic implementations are available with almost the same interface, and programmers can choose any of them to suit the nature of their writing transactional program.

Some wrapper may be required to construct a pessimistic implementation with the same interface as STM. If all resources managed in a transaction system have a total order, and programs do not lock resources by themselves and delegate lock operations to the underlying system, then the system can decide the order of resources to be locked for each transaction, then it must realize dead-lock-free pessimistic transaction processing...

Is this thought reasonable? Or has someone already made some papers or implementations like this?

未来を見る

未来が見える,このような感覚を覚えたことはあるだろうか.明らかに今の現実には存在しないものが,未来には生まれ,育ち,当たり前のものになることが想像できるだろうか.

実際に未来に行って見てきたという電波な話ではない.たぶん脳内でごくごく簡単なシミュレーション機能が働いただけなのだと思う.具体的には脳内で何が起きるかというと,

  1. 現状に不満を覚える.
  2. 課題を明らかにし,何が必要かを考える.
  3. どうやってそれを実現できるかを考える.
  4. 仮にお金と仲間と運が味方してくれるフィーバー状態が続いたとしたら,何年で実現できるか見積る.
  5. 考えたことは,自分に起こるのではなく,同じようなことを考えた現時点での誰かのこれからの数年間である.
  6. よって,そのうち実現する.

おそらくこんな感じなのだろう.

あくまでシミュレーションなので,考察していない状態変数の影響が実は大きかったり,前提となる現状認識や課題設定,問題解決法が大きく間違っていると,その未来は実現しないことだってあるだろう.けど,案外いけるんじゃないかとも思う.最近,現実世界と自分の脳内世界の奇妙な一致感があるのは,このシミュレーション能力がそこそこ高まってきた状況証拠なんじゃないかと.自分の未来をイメージして,そこに向かっていくことも,同じようなプロセスなんだと思う.

具体例を出さずにそんなこと言っても説得力がゼロだが,まずは 5 年後に自分で振り返って今考えていることが当たるかどうかを確認することにしよう.


そんなことを考えた,29歳の春.

アニメ「東のエデン」感想

東のエデンは哲学とエンターテイメントがなかなかのバランスで配合された逸品.個人的にはエンターテイメント性をもう少し抑えても良いと思うけど,収益のためにはそれもアリだと思う.テレビアニメが11話と,続編の映画が前編後編の2本.昨日見てきたのは映画の後編だ.封切2日目の朝一のテアトル新宿は意外と混んででびっくりした.

監督は神山健治.攻殻機動隊を原作に対してかなり魅力的な作品に仕上げた人だ.私が一つだけオススメのアニメを挙げろと言われたら間違いなく攻殻機動隊を推す.攻殻機動隊は未来の技術を駆使して統治機構に蠢く悪と闘う物語だったが,東のエデンは現在が舞台.もちろん人間らしい AI がでてきたり,ちょっと非現実的なハッキング技術で繰り広げられる情報戦など,特に IT に関しては未来を取り入れているが,物語の大筋にはあまり関係ない.手っ取り早く物語を進展させるための魔法のようなものだと思えば良い.

この作品の主題は

  • この国を良くするにはどうすれば良いか?

だ.昨今のニート増加問題や,しがらみが多くてうまく動かない政治システムは物語の中でも大きく取り上げられる.

この問題への解決を半ば強制され,魔法を使うことを許されたプレイヤー達はそれぞれの考えで,試行錯誤する者もいれば明快な結論を持って動く者もおり,対立しながら与えられた魔法を奮う.その混乱に人々は巻き込まれる.物語の結果として,明快な答えは提示されない.それは未来に,視聴者に委ねられる.

ただ,未来に繋がるいくつかの考え方は提示される.ちょっとうろ覚えだが,こんな感じ.

  • どうやってサービスを亨受するかばかりを考えるお金を使う側に立つんじゃなくて,どうやって良いサービスを提供してお金をもらうかを考えた方が幸せになれるんじゃないか
  • あんたと俺は,同じ方向を向いていると思うんだけど,あんたのやり方には,愛がない

語られるメッセージは若者に希望を与える.アトウのじいさんがクライマックスで放つセリフは際立つ.ちょっと長いセリフで早口だったので,はっきりと覚えているわけではないのだが,

  • この国を支えてきた者は,この国を憂い,必死に働き,きれいなままでうまく立ち振舞うことなく汚れ地にまみれた名もなき民衆の中にこそ存在したのか

という感じだったと思う.かなり実際のセリフとは違う気がするが.とにかく,このときじいさんは何かを悟り,年寄りと若者が一つの合意に至る.

この国をよくするには,誰かがなにかデカいことをやってくれるのを待つのではなく,この国を良くしたいと思っている自分自身こそが,少しずつ頑張っていくしかないんだと視聴者は悟るはずだ.少なくとも私はそのようなメッセージをこの作品から受け取った.「国」という言葉にアレルギーを感じてしまうアレな方は,「世界」でも「人類」でも構わないけれど.

世の中はいつの間にか動乱の時代に突入している.呆けている若者が多いのは平和で豊かな証拠だが,それはいつまでも続くわけではない.いつの時代も,動乱期には若者のエネルギーが世の中を動かしてきた.年寄達は力をふるいその流れに逆らおうともがく者もいれば,若者に期待をし,流れを後押ししようとする者もいる.流れに逆らったものは,それが経験値の高い年寄りだろうが権力をいくらもっていようが,いつか淘汰される.それはいつの時代でも同じだと思う.

若者よ,未来への希望を胸に持て.自分自身で未来を切り開く覚悟を持て.自分自身で自分を守り,大切な人達を守れるだけの力を付けろ.これは自身への叱咤激励でもある.頑張ろう.


蛇足

昨今のアニメは金払いの良い「大きいお兄さん」達に媚びることに重きを置いた作品が多すぎるが,東のエデンはそれには属さないし,メッセージ性は初期のジブリアニメを越えると思う.私は前者があまり好きではないが,そのような作品達が存在して,それで大きいお兄さんが日々を生きるためのささやかな癒しとなり,経済が回るなら,それはそれで良いと思う.ただ,人間はだれしも,何故生きるかを自分自身に問い,その答えを自分で見つけないと幸せに生きていくのは難しい.東のエデンはそれを見つけるための一つの助けになるのではないだろうか,他の素晴らしい物語と同様に.

「習慣を変えると頭が良くなる―東大生が教える7つの学習習慣―」

習慣を変えると頭が良くなる―東大生が教える7つの学習習慣―

習慣を変えると頭が良くなる―東大生が教える7つの学習習慣―

コツコツ努力すること,という言葉は良く聞くけれども,それを頭では分かっていても実際に実行できていると感じている人は少ないと思う.努力というものが大層ご立派なもので,それは苦労に苦労を重ねることとほぼ同義で,まるで努力する才能でもなければそれは到底できるものではなく,自分からは到底離れた世界の話だ,というイメージを強く感じている人も多いのではないだろうか.私もその一人だった.

本書は学生が書いた本とは思えないほど理路整然とし,分かりやすく,我々に一つのメッセージを訴えかけてくる.この本を要約すると,「努力とは,毎日をほんの少しずつ変えていくだけの簡単な作業である.」と言える.7つの習慣とは,それを継続的に行うためにまず習得すべきスキルであり,もちろんそれらも毎日をほんの少しずつ変えていくだけで無理なくできるようになると説かれている.

本書は著者の体験記でもある.著者はそれを中学生のころから意識し,試行錯誤しながら実行し,東大に入り,在学中に教育コーチングの会社を興し,この本に書かれていることを教え子達が実践できるように指導し,劇的な成果を上げつつある.それは良い成績を取るという意味だけではなく,勉強だけできても幸せをつかむことが簡単ではないこの世の中で,たくましく生きていくための最低限の能力を身に付けさせるという意味もある.この世知辛く厳しい競争社会において本当に意味のある教育とは何か,を問いつづけた著者の結論である.だから説得力があるし,なにより,誰が書いたかに関係なく,読めばすぐにでも実践したくなるはずだ.努力することは何かを得るための王道であることは誰もが認めるところで,それが簡単に無理なく実践できるのだから.この本を読めばコツコツ努力することとは具体的に何をすれば良いことなのかがとても良く分かる.中高生向けとはいえ,これを読めば人生が変わる大人がいかに多いかと思うほどよく書けている本である.

ひとつだけこの本に問題があるとすれば,前書きで著者が自身の成功体験を全面に押し出しすぎていることで,嫌悪感を覚える読者がいるかも知れない.私も少し鼻についた.そのような場合は,本文の1章から読んで,最後に前書きを読むと,著者はなるべくしてこうなったことに納得がいくし,それは決して遠い世界の話ではないことが理解できるだろう.

私に子供ができたらいつか必ずこの本を読ませるし,私自身がコツコツ努力できる人間になりたいと強く思い,それは意外に簡単で,すでに効果を実感しつつある.コツコツ努力することは簡単なことであり,なりたい自分になるための一番の近道である.

Haskell の Eq と Ord クラスを C++ で作る

プログラムをたくさん書く生活になりつつある.C++, Java, Python, 必要ならその他も...加えてプライベートな勉強会に参加して,Haskellを学んでいる.1年前は高階関数なんじゃらほいって感じだったが,今ではそれが気軽に使えない言語だと,その代替としてループを回すコードを書くのがひどく苦痛に感じている...

C++ でも高階関数使いたいなぁーと思うようになってきているが,そもそも C++ の多相性と Haskell の多相性は同等の表現力があるのか?という疑問が湧き,C++Haskell に相当する Eq クラスと Ord クラスは書けるのか!?と思ったので書いてみることにした.

Haskell には型クラスがあり,これは Java でいうところの interface である.すなわち,その型が持つ機能の一面を表現するために使われる.基本型クラスの一つである Eq とは,(==) と (/=) (C++ では operator== と operator!= に相当) が定義されている型クラスで,同等および非同等を表現できる型が継承すべきインターフェースである.
また,Ord はこれに加えて,(<)と(>),(<=),(>=) が定義される.すなわち,全順序関係である.全順序ではない中途半端な順序関係も表現できたかも知れないが,普段はまず使わないので,今は考えないことにする.

目的は,同じことを二回以上書かずにコードを書くことである.言語における多相性(ポリモーフィズム)のサポートがそれを可能にする.多相性の表現方法は HaskellC++ でそれぞれ違う.パラメータ多相,アドホック多相,部分型多相の 3 種類あるそうだ.
参考: http://d.hatena.ne.jp/kazu-yamamoto/20081024/1224819961
C++にはテンプレートと多重継承があり,また純粋仮想関数が定義できる.これらの使い方が最初はもやもやとしてよく分からなかったが,ググりつつ,本を眺めつつ,コードと格闘しているうちになんとなく分かってきた.

まずは,コードを見てみよう.

/**
 * Type class definition like Haskell in C++.
 */

#ifndef TYPECLASS_HPP_
#define TYPECLASS_HPP_

namespace TypeClass {

    template <class T>
    class Eq
    {
    public:
        virtual bool operator==(const T& right) const = 0;
        bool operator!=(const T& right) const {
            return ! (*this == right);
        };
    };

    template <class T>
    class Ord : virtual public Eq<T>
    {
    public:
        virtual bool operator<(const T& right) const = 0;
        bool operator<=(const T& right) const {
            return (*this < right || *this == right);
        };
        bool operator>(const T& right) const {
                return ! (*this <= right);
        };
        bool operator>=(const T& right) const {
            return ! (*this < right);
        };
    };
}

#endif /* TYPECLASS_HPP_ */

まず,Eq もしくは Ord を継承する任意の型Tで,わざわざ引数の型を変えたコードを書かなくて済むように,パラメトリック多相性を実現するテンプレートを使う.

次に,

virtual bool operator==(const T& right) const = 0;

のように型Tによって,実際の振舞が変わり得るメンバ関数は,純粋仮想関数として型定義(プロトタイプ宣言)のみを行う.実際の定義は,型クラスを継承する型の定義時に行う.純粋仮想関数を用いることで Eq や Ord は実体を作ることが出来なくなり,それを継承した型のみで使われることを保証でき,また,同じ名前の関数(==)でも型によって振舞を変えるアドホック多相を実現できる.

次に,Eq に関しては (==) が決まれば,自動的に (/=) が決まり,Ord に関しては,(==) と (<) さえ決まれば残りが自動的に決まる.

bool operator!=(const T& right) const {
    return ! (*this == right);
};

このように,非同等は同等の否定であるため,Eq を継承するほとんどの型は,このデフォルト実装をそのまま使うことが出来,新たに定義する必要がない.だから,(==) と (<) 以外はこれらの型クラスを継承する型において,わざわざ定義したくない.そこで,デフォルト実装を使う.デフォルト実装は,通常のメンバ関数として定義する.(仮想型でない型同士の継承関係が子孫にあり,その振舞を動的に決定したい場合は,virtual をつけておく必要がある.部分型多相が実現される.)

Ord クラスは Eq クラスの性質を包含するため,型クラス同士の継承関係を記述する.

class Ord : virtual public Eq<T>

すなわち,Ord を継承する型は,自動的に Eq も継承することになり,(==) を定義する必要がある.
C++は多重継承を許すシステムのため,通常の継承を行うと,同一クラスが祖先に複数回登場することがあり,それらは別々の実体を持つため,対象を一意に決められず,コンパイルに失敗する.virtual をつけて仮想継承することで,同じ型が祖先にいる場合はその実体を共有させることでこの問題を回避する.今回は Eq および Ord は多重継承していないため,仮想継承しなくても挙動は変わらないが,子孫となる型クラスをさらに定義するときに多重継承を用いる場合を想定して,virtual をつけておく.

実際に Eq と Ord を使ったプログラム例を示す.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

#include "typeclass.hpp"

class A : virtual public TypeClass::Eq<A>
{
public:
    int i;
    bool operator==(const A& right) const {
        return i == right.i;
    };
};

class B : virtual public TypeClass::Ord<B>
{
public:
    int i;
    bool operator==(const B& right) const {
        return i == right.i;
    };
    bool operator<(const B& right) const {
        return i < right.i;
    };
};

int rand(int max)
{
    return (int)(rand() / ((double) RAND_MAX + 1.0f) * (double)max);
}

int main()
{

    srand(time(0));
    
    A a1, a2;
    a1.i = rand(100);
    if (rand(2))
        a2.i = a1.i;
    else
        a2.i = rand(100);

    assert((a1 == a2) == (a1.i == a2.i));
    assert((a1 != a2) == (a1.i != a2.i));

    B b1, b2;
    b1.i = rand(100);
    b2.i = rand(100);

    assert((b1 < b2) == (b1.i < b2.i));
    assert((b1 <= b2) == (b1.i <= b2.i));
    assert((b1 > b2) == (b1.i > b2.i));
    assert((b1 >= b2) == (b1.i >= b2.i));

    return 0;
}

型A は Eq のインターフェースを持ち,型B は Ord のインターフェースを持つ.Eq,Ord はテンプレートで実現されているため,それぞれの型名を与えて必要な関数プロトタイプ宣言を自動生成させる必要がある.A と B は,どちらも int 型の変数を持ち,それを直接比較した場合と,型Aおよび型Bとして比較したときに同じ結果になることを確認するだけの簡単なものである.これで,Eq と Ord を使って同じような記述を複数回することなく最小限の定義だけで型クラスを使ったプログラムが書けた.

気が向いたら,もう少し複雑なこともするかも知れない.

久々にRSSリーダを使ってみる

忙しくなってから全然読んでなかった.
自分の時間を取り戻せるようになったので,読んでみようとした.

・・・読もうにも,大量にありすぎる.まったく読まなくなってから10ヶ月分くらい?みんな自分の意見発信しすぎだよ...
優先順位つけるの面倒くせー.目でフィルタするのも面倒くせー.あー前に自分の価値観を気軽にフィードバックできるパーソナライズドランキング機能付きRSSリーダー欲しいって盛んに言ってたなぁ...誰か作ってくれよ(他力本願)

結論
はてブの更新フィードを登録しまくるのはやめよう.知り合いのだけで十分だ.
・おいかけるブログを厳選しよう.1日15分で読める範囲まで.

友人が昔言っていた.みんなが見ているようなものを見ても仕方がない,と.その時はRSSリーダーを使って情報収集し始めたころだったから意味が良く分からなかったが,やっと同じ感覚を得られたような気がする.

ヘルマン・ヘッセ「車輪の下」

バランスが大事などと人には言っておきながら,自分のことにはなかなか無頓着なものであると最近思うようになった.特に,潤いが足りないことに気がついてからは,小説を読もうと決めた.ここ3年くらい,小説なんて数えるほどしか読んでいない気がする.というわけで,いつか読もうと思って買ったまま自宅に放置されていた「車輪の下」を読んでみた.

なんという救いのない話だ.1975年訳だから日本語がすんなり入ってこないのに加えて,その内容に救いがない.太宰治を思い出した.訳者あとがきによると,ヘルマンヘッセ自体は母親のおかげで救われたが,小説の中の彼は母親が早くに亡くなっていたため,そのような悲劇的な人生を送ったというのだ...
狂気,という言葉が適当なのだろうか.

まあなんというか,ハッピーエンドが良いなんてそんなことを言うつもりはないが,小説を読もうと思って意気込んで読んだ最初がいきなりこれかよーという感じではあった.まあそれでも少し心は潤った気がする.次は人から借りたままになっている村上春樹でも読むか...