本を読む

読書やコンピュータなどに関するメモ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「FRONT MISSION THE DRIVE」「FRONT MISSION DOG LIFE & DOG STYLE 01」

 マンガ「MOONLIGHT MILE」が好きなので、太田垣康男原作の「FRONT MISSION」モノに手をのばしてみた。それぞれ作画が違うのだけど、どちらも太田垣康男っぽい絵柄だなぁ。リアル系ロボット戦争マンガ。

「THE DRIVE」

FRONT MISSION―THE DRIVE (ヤングガンガンコミックス)
太田垣 康男 studio SEED
スクウェア・エニックス (2007/03/24)

 青二才キャラの青年将校が、部隊が全滅し、負け知らずの遊撃隊「暁愚連隊」に拾われる話。「宇宙の戦士」タイプの成長物語で、一平とか、「MLM」の沢村とかの線か。暁愚連隊のメンバーが濃いキャラ揃い。ただし、これからというところで終わる。

「DOG LIFE & DOG STYLE」01

FRONT MISSION DOG LIFE&DOG STYLE (1) (ヤングガンガンコミックス)
太田垣 康男 C.H.LINE
スクウェア・エニックス (2007/10/25)

 オムニバス形式。戦争の避難生活で壊れていく3人のジャーナリストを描いた「戦場の透明人間」、前線に送られたヤンキー上がりの兵士の哀歌「防人の詩」の2編。人物や心理を、あっさりじっくり描写する感じが、初期「MLM」っぽくていい。

スポンサーサイト

Bash on Railsを作る(6) config/database.sh

 くどいようですが、bashの内蔵コマンドでいかにRuby on Railsっぽいことをやるかというパロディ企画です。今回は、「Bash on Railsを作る(1) メタプログラミングでDSL」で触れたconfig/daatabase.shファイルの解説をしてみます。

まず基本方針

 bashはオンメモリーのデータ構造を操作するのは苦手です。そこで、読み込み時にデータをバラして、データは決め打ちで持つようにします。

config/database.shファイル

まずはおさらい。YAML風のconfig/database.shファイルの中身は、以下のとおりです。

# database configuration
development:
    adapter: sqlite3
    database: db/development.sqlite3
    timeout: 5000

test:
    adapter: sqlite3
    database: db/test.sqlite3
    timeout: 5000

production:
    adapter: sqlite3
    database: db/production.sqlite3
    timeout: 5000

これシェルスクリプトじゃね?

 この内容を見てみると、以下のことに気付きます。

  • コメントが「#」で始まってる
  • 第1レベル(インデントなし)と第2レベル(インデント1つ)でボキャブラリが完全に分離してる
  • 第2レベルのボキャブラリが同じ

 あと、こんなことも気付きます。

  • シェルスクリプトって、行頭に空白が入ってても無視されるよね
  • bashってコマンド名に「:」が含まれていてもいいんだよね
  • この通りのフォーマットなら、「:」のあとにスペースが入ってるね
  •  ということで、こんなフラットなシェルスクリプトと同じじゃね? と。

    # database configuration
    development:
    adapter: sqlite3
    database: db/development.sqlite3
    timeout: 5000
    
    test:
    adapter: sqlite3
    database: db/test.sqlite3
    timeout: 5000
    
    production:
    adapter: sqlite3
    database: db/production.sqlite3
    timeout: 5000

    頭を使わない実装

     まずは単純な実装をしてみます。第1レベルにあるコマンドは設定のモードの変更、第2レベルにあるコマンドは設定を実行するものとします。また、事前にSHAILS_ENVという変数に環境(development、test、productionのいずれか)が入っているものとします。

    function development:() {
        conf_env='development'
    }
    
    function testing:() {
        conf_env='testing'
    }
    
    function production:() {
        conf_env='production'
    }
    
    function adapter:() {
        if [ "$SHAILS_ENV" == "$conf_env" ]; then
            dbconf_adapter=$1
        fi
    }
    
    function database:() {
        if [ "$SHAILS_ENV" == "$conf_env" ]; then
            dbconf_database=$1
        fi
    }
    
    function timeout:() {
        if [ "$SHAILS_ENV" == "$conf_env" ]; then
            dbconf_timeout=$1
        fi
    }

     これらの定義の後に、config/database.shをsourceしてやれば、設定をシェル変数に展開できます。

    . config/database.sh

    メタプログラミングでDSLでDRY

     上の実装は、同じようなコードが並んでますね。長ったらしいだけでなく、設定項目が増えたり変更されたりした場合に、コピペしなくちゃならなくて面倒です。

     そこで、メタプログラミングでDSL(笑)。動的にコマンド(関数)を定義してみます。

    DBCONF_ENVIRONMENTS="development test production"
    DBCONF_PARAMETERS="adapter database timeout"
    
    for env in $DBCONF_ENVIRONMENTS; do
        eval "function ${env}:() {
                  conf_env='${env}'
              }"
    done
    
    for param in $DBCONF_PARAMETERS; do
        eval "function ${param}:() {
                  if [ "\$SHAILS_ENV" == "\$conf_env" ]; then
                      dbconf_${param}=\$1
                  fi
              }"
    done

     だいぶDRYでスッキリなものになりました。

    状態を表す変数を閉じ込める

     さて、上のコードだと、conf_envという状態変数がグローバルになっているのが気持ちが悪いところです(私にとって)。そこで、「Bash on Railsを作る(4) bashのlocal変数」で解説した方法によって、conf_envをローカル変数に封じ込めます。

    DBCONF_ENVIRONMENTS="development test production"
    DBCONF_PARAMETERS="adapter database timeout"
    
    function define_dbconf_functions() {
        local env param
    
        for env in $DBCONF_ENVIRONMENTS; do
            eval "function ${env}:() {
                      conf_env='${env}'
                  }"
        done
    
        for param in $DBCONF_PARAMETERS; do
            eval "function ${param}:() {
                      if [ "\$SHAILS_ENV" == "\$conf_env" ]; then
                          dbconf_${param}=\$1
                      fi
                  }"
        done
    }
    
    function load_dbconf() {
        local conf_env
        define_dbconf_functions
        . config/database.sh
    }
    
    load_dbconf

    まとめ

     YAML風の構造を無理やりシェルスクリプトとして解釈する方法と、evalで動的にコマンド(関数)を定義する方法を紹介しました。仕様を見て、そりゃそうだと思った人も多いかと思います。

     次回は、同様にしてdb/schema.shファイルをメタプログラミングでDSL(笑)する方法を解説する予定です。

「裁判官の爆笑お言葉集」

 さだまさしの「償い」を聴くよう被告人に言った裁判官が、何年か前に報道されて話題になった。そんな感じの、裁判官のある一言を集めた書籍。爆笑というより人情トークが多い。

 1見開きに1ネタの、一言ドリブンの構成で、軽い感じで読める。著者は元司法浪人の傍聴マニアだそうで、各裁判官のバックグラウンドや個性までふまえて書いていて面白かった。

 本筋じゃないけど、本書からの豆知識。

  • 裁判官のメッセージが出る機会:補充質問、判決理由、付言・所感・傍論、説諭
  • 全国の刑務所は軒並み定員超え
  • 求刑の8掛けが事実上の量刑相場。「求刑超え判決」は非常に珍しい
  • 裁判官⊃判事
  • 左陪席裁判官には新人が、右陪席裁判官には一歩引いた視点から全体を見る人がつく(ことになっている)
  • 都市部の裁判官は300件以上、最高裁の判事は数千件を常に抱えている
  • 弁護士の呼び名:刑事では弁護人、民事では代理人、少年審判では付添人
  • 前もって裁判官・検察官・弁護人で争点を絞り込む「公判前整理手続き」
  • 法律用語のようで違う言葉:容疑者、(刑事裁判の)被告、書類送検、起訴事実

Bash on Railsを作る(5) テンプレートエンジン

 今回は、テンプレートエンジン「eBash」です。Ruby on Railsで使われるERB/eRubyのパロディで、やはりpure bashで作りました。

テンプレートの仕様

 仕様はeRubyのサブセット(のつもり)です。テキスト中に<%~%>があると、それをbashのコマンドとして解釈します。もしコマンドが標準出力に出力すれば、内容がその場所に入ります。また、テキスト中に<%=~%>があると、それをbashの変数として解釈し、その場所に入れます。

テンプレートの例

 第3回で解説した、データベースの全件表示を、eBashのテンプレートにしてみます。

<html>
<head>
<title>members</title>
</head>
<body>
<h1>members</h1>

<table border="1">
<tr>
<% for column in $members_columns; do %>
  <th><%=column%></th>
<% done %>
</tr>

<% for person in $members_list; do %>
  <% members.bless person %>
  <tr>
    <td><%=person_name%></td>
    <td><%=person_mailaddress%></td>
    <td><%=person_comment%></td>
  </tr>
<% done %>
</table>

<br />

</body>
</html>

テンプレートを使う

 このテンプレートを使ってみます。

 まず、script/consoleを起動し、テーブルを読み出します。

% script/console
console:1> SHar::base.extend members
console:2> members.find members_list :all

 続いて、テンプレートファイルからテンプレートのオブジェクトを作ります。ebashのクラスメソッドnewを以下のように呼ぶと、ebashクラスのオブジェクトtmplが作られます。

console:3> ebash.new tmpl 'app/views/members/list.ebash'

 このtmplオブジェクトのresultメソッドを呼ぶと、結果が出ます。

console:4> tmpl.result
<html>
<head>
<title>members</title>
</head>
<body>
<h1>members</h1>

<table border="1">
<tr>

<th>name</th>

<th>mailaddress</th>

<th>comment</th>

</tr>



<tr>
<td>emasaka</td>
<td>emasaka@example.jp</td>
<td></td>
</tr>


<tr>
<td>oreore</td>
<td>oreore@example.jp</td>
<td>Hello!</td>
</tr>

</table>

<br />

</body>
</html>

 おしまい。

console:5> exit
exit
%

 これをブラウザで表示するとこうなります。

eBashの処理結果

まとめ

 pure bashでERB/eRubyふうのテンプレートエンジンを作ってみました。O/Rマッパー(もどき)と組み合わせると、それらしくなりましたね。でも先は長いので、ぼちぼちいきます。

注意:Bash on Railsは、実用性を無視したパロディソフトです。誤解のないようお願いします。

「星新一 1001話をつくった人」

 「星新一ってすごい人だよねー、10代の頃はよく読んだよ(だけどそれ以後は…)」という人も多いんじゃなかろうか。と一般化して正当化するのはいけないか、それは私だ。

 そんな星新一の生涯をまとめた伝記。ちょっと前に出た本だけど、年始ごろにようやく読んだ。感想:今まで読んでなくて損した。

 父親の星一の生涯から、「星親一」の生涯、そして星新一の生涯まで、調査データのないページがないというぐらい取材しまくって、しかもそれをひとつの物語としてまとめている。

 時代小説好きのオヤジとしては星一の生涯のバックにある明治の歴史を、(元?)SF者としては、日本SF黎明期の物語を、そして新しく読んだ本の読者としては日本SFの神の実像を、丹念に物語ってもらって堪能した。単なるお涙ちょうだい話ではない。

 読みながら、できのよくなかった(といわれる)時期の作品も含めて、作品群を再読したくなった。

星新一 一〇〇一話をつくった人
最相 葉月
新潮社 (2007/03)
売り上げランキング: 9605

Bash on Railsを作る(4) bashのlocal変数

 pure bashでBash on Railsを作るネタ企画です。今回はちょっとした小ネタ。

 bashでlocal宣言した変数って、Perlでlocal宣言した変数と同じく、動的スコープなんですね。

% cat local1.sh
#!/bin/bash

function print_a() {
    echo "$a"
}

function local_a() {
    local a='Good bye'
    print_a
}

a='Hello'
print_a
local_a
print_a
% bash local1.sh
Hello
Good bye
Hello
%

 bash自身が使う特殊な変数も、このとおり動的スコープ。

% cat local2.sh
#!/bin/bash

function print_1st() {
    set $1
    echo $1
}

function local_1st() {
    local IFS='/'
    print_1st "$1"
}

a='a/b c'
local_1st "$a"
print_1st "$a"
% bash local2.sh
a
a/b
%

「爆笑問題のニッポンの教養」1~10巻

 爆笑問題が、さまざまな分野で成果をあげている高名な研究者を毎回尋ねて対談するシリーズ。もとはTV番組らしい(見てないからよくわからない)。爆笑問題の本はとりあえず買って読むのだけど、いつもと違った雰囲気で、でも面白い。

 最新の研究成果を毎巻紹介してくれるのが楽しい。例えていうと、Wikipediaの「おまかせ表示」でランダムなページを表示させまくって読んでるような感じ。ただし、研究の中身には踏み込んでないので、それは他で。

 太田がひたすら一般人の立場をとって話しているのが、面白くもありもどかしくもあり。

 以下、とりあえず2007年に出た10冊。

1. 生命のかたちお見せします

 発生生物学の浅島誠氏。動物の胚から臓器だけを作ったり、それを元の動物に戻して臓器を2つにしたりと、マッドサイエンティストさながらですごい。

爆笑問題のニッポンの教養 生命のかたちお見せします 発生生物学 (爆笑問題のニッポンの教養)
太田 光 田中 裕二 浅島 誠
講談社 (2007/09/27)
売り上げランキング: 37758

2. 現代の秘境は人間の“こころ”

 芸術人類学の中沢新一氏。東京周辺で、縄文時代から今まで同じような場所が重要な場所になっているそうな。利用しやすい地形ということだろう。

爆笑問題のニッポンの教養 現代の秘境は人間の
太田 光 田中 裕二 中沢 新一
講談社 (2007/09/27)
売り上げランキング: 8197

3. 宇宙人はどこにいるのか?

 惑星科学の井田茂氏。太陽系や惑星の形成モデルの話。「ホット・ジュピター」や「エキセントリック・プラネット」など、さまざまな惑星のパターンが面白い。宇宙人の話はどうでもいいとして。

爆笑問題のニッポンの教養 宇宙人はどこにいるのか? 惑星科学 (爆笑問題のニッポンの教養)
太田 光 田中 裕二 井田 茂
講談社 (2007/09/27)
売り上げランキング: 18505

4. 人間は動物である。ただし…

 社会心理学の山岸俊男氏。ナッシュ均衡とか囚人のジレンマとかいった、協調のモデルを実験してみせる。「武士道は統治者の倫理で、破るほうが利益になるから、世の中をコントロールできるはずがない」という言葉が興味深かった。

爆笑問題のニッポンの教養 人間は動物である。ただし…… 社会心理学 (爆笑問題のニッポンの教養)
太田 光 田中 裕二 山岸 俊男
講談社 (2007/09/27)
売り上げランキング: 10465

5. ヒトはなぜ死ぬのか

 生化学の田沼靖一氏。生物が死ぬメカニズムについて。アポトーシス(自然死)が起こるところを観察してみせる。有性生殖と死はいっしょに始まったとか。

爆笑問題のニッポンの教養 ヒトはなぜ死ぬのか? 生化学 (爆笑問題のニッポンの教養 5)
太田 光 田中 裕二 田沼 靖一
講談社 (2007/10/31)
売り上げランキング: 10957

6. 教授が造ったスーパーカー

 環境工学の清水浩氏。電気自動車は本当は速くてカッコいいのに、いままでの電気自動車は地味すぎたので、スーパーカーを作った、という話。電気自動車なので各輪にモーターを仕込めるため、8輪にして各タイヤを小さくして室内も広くできたとか。

爆笑問題のニッポンの教養  教授が造ったスーパーカー 環境工学 (爆笑問題のニッポンの教養 6)
太田 光 田中 裕二 清水 浩
講談社 (2007/10/31)
売り上げランキング: 50227

7. 哲学ということ

 哲学の野矢茂樹氏。ウィトゲンシュタイン系の分析哲学に対して、太田がイマジネーション系の話をぶつけて、全然かみあわない…のだけど、なぜか最後は同じところに来てびっくり。まさに、「普通の人のスタートラインが哲学者のゴール」。

爆笑問題のニッポンの教養 哲学ということ 哲学 (爆笑問題のニッポンの教養 7)
太田 光 田中 裕二 野矢 茂樹
講談社 (2007/12/06)
売り上げランキング: 5094

8. 人間は失敗作である

 比較解剖学の遠藤秀紀氏。さまざまな生物の骨を集め、種や年代などの比較を研究していて、パンダのホアンホアンの骨まであった。骨と造詣に対する、フェティッシュな愛情が面白い。

爆笑問題のニッポンの教養 人間は失敗作である 比較解剖学 (爆笑問題のニッポンの教養 8)
太田 光 田中 裕二 遠藤 秀紀
講談社 (2007/12/06)
売り上げランキング: 39420

9. ロボットに人間を感じるとき…

 知能ロボット学の石黒浩氏。外見や反応を人間に似せることで、人間そっくりのロボットを作る研究。人工無能みたいなアプローチのハード版か。本でも面白いけど、これは映像で見たかった。ちなみに、人間そっくりの皮膚感を持った人形って…

10. タイムマシンは宇宙の扉を開く

 宇宙物理学の佐藤勝彦氏。当然ながらインフレーション宇宙論を中心に、ビッグバンや相対性理論+量子力学の話など、いろいろ面白かった。タイムマシンはどうでもいいとして。

爆笑問題のニッポンの教養 タイムマシンは宇宙の扉を開く 宇宙物理学 (爆笑問題のニッポンの教養 10)
太田 光 田中 裕二 佐藤 勝彦
講談社 (2007/12/06)
売り上げランキング: 35666

Bash on Railsを作る(3) O/Rマッパーもどきの説明

 Bash on Railsを作るネタ企画です。

 第2回で、ActiveRecotdふうのO/Rマッパーもどきを紹介しました。が、実行例だけだったので、今回は説明を入れます。

第1回の補足

 第1回で説明し忘れていたことがありました。

 第1回で定義したテーブルには、自分で定義したカラムのほか、自動的に「id」というカラムも定義されています。idには、ユニークな番号が自動的に割り振られます。

対話型実行環境を起動する

 まず、対話型実行環境のscript/consoleを起動します。すると、「console:(数字)> 」というプロンプトが表示されます

% script/console
console:1>

 実体は、ライブラリや設定を読み込んでbashを起動しているだけです。そのため、以下のコマンドは、自分で言語を実装したりしているわけではなくて、本当にbashで実行されるコマンドです。

モデルのクラスを定義する

 SHar::baseクラスのextendメソッドを使って、派生クラスとしてmembersクラスを作ります。

console:1> SHar::base.extend members

 membersというクラス名は、設定されたテーブル名と同じにします。ちなみに、extendというメソッド名はJavaScriptのprototype.jsを意識しました。

レコードのオブジェクトを作ってINSERTする

 では、memberクラスのインスタンスとしてレコードのオブジェクトを作ってみましょう。membersのクラスメソッドnewを使います。

console:2> members.new emasaka

 この例では、emasakaという名前のオブジェクトが作られます。emasakaオブジェクトは、membersテーブルと同名のインスタンス変数と、membersクラスで定義されたインスタンスメソッドを持ちます。

 さっそく、name、mailaddress、commentという、3つのインスタンス変数に値を設定してみます。

console:3> emasaka_name='emasaka'
console:4> emasaka_mailaddress='emasaka@example.jp'
console:5> emasaka_comment='Hello'

 あとは、emasakaオブジェクトのsaveメソッドを呼ぶと、データベースに対してINSERTされます。

console:6> emasaka.save

2つ目のレコードのオブジェクトを作ってINSERTする

 2つ目のレコードも作ってINSERTしてみます。oreというオブジェクトを、まったく同じ方法で作って処理します。

console:7> members.new ore
console:8> ore_name='oreore'
console:9> ore_mailaddress='oreore@example.jp'
console:10> ore.save

すべてのレコードを読み出す

 レコードを2つ作成したところで、データベースから読み出してみましょう。

 まず、membersのクラスメソッドfindを使って、テーブルから全件を読み出します。

console:11> members.find members_list :all

 これで、members_listという変数に、結果のリストが格納されます。

 members_listに格納される値は、bashのfor文で1つずつ取り出せます。ただし、それだけではただの文字列です。そこで、受け取った変数を、membersのblessメソッドに引数として渡すと、その変数がmembersクラスのオブジェクトに変身します。blessという名前は、Perlを意識したものです。

 あとは、そのオブジェクトのインスタンス変数にアクセスできます。

console:12> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done

 ちなみに、上のリストで行頭の「> 」はbashのプロンプトです。

 実行すると、以下のとおり表示されます。

name=emasaka, address=emasaka@example.jp
name=oreore, address=oreore@example.jp

特定のレコードを読み出す

 続いて、条件をつけてレコードを読み出してみましょう。findメソッドの引数で、:allのかわりに:conditions=(条件)を指定します。条件は、SQLのWHERE節をそのまま書きます。

console:13> members.find emasaka :conditions="name = 'emasaka'"

 結果が1レコードとわかっている場合は、そのままblessにかけてかまいません。blessは、リストの最初の項目以外を無視してオブジェクトに変える仕様になっています。

console:14> members.bless emasaka

 このオブジェクトのメンバー変数にアクセスすると、レコードが読み込まれていることがわかります。

console:15> echo "name=$emasaka_name, address=$emasaka_mailaddress"
name=emasaka, address=emasaka@example.jp

オブジェクトの値を変更してレコードを更新する

 上で読み込んだオブジェクトを使い、インスタンス変数の値を変更して、レコードを更新してみましょう。更新の場合も、新規作成した場合と同じくsaveメソッドを使います。

console:16> emasaka_mailaddress='updated@example.jp'
console:17> emasaka.save

 再び全件表示してみると、データベース上の値が更新されていることがわかります。

console:18> members.find members_list :all
console:19> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=emasaka, address=updated@example.jp
name=oreore, address=oreore@example.jp

レコードを削除する

 テーブルからレコードを削除するには、deleteメソッドにレコードのidを与えます。

console:20> members.delete 1

 ここでは話を簡単にするため、最初のレコードのidが「1」であることを前提にしています。実際に値を調べる場合は、削除するレコードを読み出してオブジェクトを作ってから、オブジェクトのインスタンス変数idの値を参照します。

 再び全件表示してみると、レコードが1つ削除されていることがわかります。

console:21> members.find members_list :all
console:22> for person in $members_list; domembers.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=oreore, address=oreore@example.jp

対話型実行環境を終了する

 終了は、bashですので、exitかCtrl-Dです。

console:23> exit
exit
%

まとめ

 Ruby on Railsが使うActiveRecordにできるだけ似せて、O/Rマッパーもどきを作ってみました。オブジェクト指向ふうの処理をbashでどう実装しているかは、インスタンス変数の扱いあたりから透けてみえるかもしれません。そのへんは、追って。

注意:Bash on Railsは、実用性を無視したパロディソフトです。誤解のないようお願いします。

「フューチャー・イズ・ワイルド 完全図解」

 5000万年後、1億年後、2億年後の(架空の)生物相を解説した図鑑。それぞれの土地の考察から入っているディテールがいいし、図鑑らしい雰囲気も出ていて、楽しめる。

 アリ(の子孫)が都市を作り、体重8トンのイカ(の子孫)が大地をのし歩き、鳥のいなくなった空には魚(の子孫)が飛ぶ。古くからいる種が残るという話が多いように思うけど、そこはドンマイ。

 ちょっと前に話題になったらしい本で、「アフターマン」のドゥーガル・ディクソン&ジョン・アダムスってことで買った。その当時はTV番組にもなったらしいけど、そっちは観てない。

フューチャー・イズ・ワイルド完全図解ーーThe WILD WORLD of the FUTURE
クレアー パイ 疋田 努 土屋 晶子
ダイヤモンド社 (2005/01/29)
売り上げランキング: 91799

Bash on Railsを作る(2) O/Rマッパーもどき

 第2回は、ActiveRecotdふうのO/Rマッパーもどきです。第1回のとおりにテーブルが作られていることを前提にします。

 ここでは、対話型実行環境のscript/consoleを使った例を紹介します。対話型実行環境といっても、ライブラリや設定を読み込んでbashを起動しているだけですが。

% script/console
console:1> SHar::base.extend members
console:2> members.new emasaka
console:3> emasaka_name='emasaka'
console:4> emasaka_mailaddress='emasaka@example.jp'
console:5> emasaka_comment='Hello'
console:6> emasaka.save
console:7> members.new ore
console:8> ore_name='oreore'
console:9> ore_mailaddress='oreore@example.jp'
console:10> ore.save
console:11> members.find members_list :all
console:12> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=emasaka, address=emasaka@example.jp
name=oreore, address=oreore@example.jp
console:13> members.find emasaka :conditions="name = 'emasaka'"
console:14> members.bless emasaka
console:15> echo "name=$emasaka_name, address=$emasaka_mailaddress"
name=emasaka, address=emasaka@example.jp
console:16> emasaka_mailaddress='updated@example.jp'
console:17> emasaka.save
console:18> members.find members_list :all
console:19> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=emasaka, address=updated@example.jp
name=oreore, address=oreore@example.jp
console:20> members.delete 1
console:21> members.find members_list :all
console:22> for person in $members_list; do
> members.bless person
> echo "name=$person_name, address=$person_mailaddress"
> done
name=oreore, address=oreore@example.jp
console:23> exit
exit
%

 説明は、次回以降にでも。

注意:Bash on Railsは、実用性を無視したネタソフトです。誤解のないようお願いします。

Bash on Railsを作る(1) メタプログラミングでDSL

 Bash on Railsとでもいうようなソフトを作っています。Ruby on Railsのパチもんを、bashの内蔵コマンドだけで作ろうという計画です。

 と書くとカッコいいですが、実用性はハナから無視していて、いかにRuby on Railsっぽいことをマネできるかという、まったくのネタソフトです。古い人には「Ah! SKI」誌に掲載されたOS「uni+」(ユニックロス)みたいなノリを連想していただければよいかと。

 とりあえず、ActiveRecord風のO/Rマッパーもどきを、最小限の機能まで試作してみたので、ぼちぼちブログで書いてみます。

 第1回は、DSL(Domain Specific Language)をメタプログラミングで書く話です。

内蔵コマンド縛りの限界

 bashの内蔵コマンドだけで作るといっても、さすがにRDBMSをいちから作る根性はありません。そこで、RDBMSのクライアントプログラムは使うことにします。

 ほか、作ってみて代替手段がないことがわかったのは、mkdirやrmでした。これは困った。

データベースの設定ファイル

 Bash on Railsでは、config/database.shファイルにデータベースの設定を書きます。

# database configuration
development:
    adapter: sqlite3
    database: db/development.sqlite3
    timeout: 5000

test:
    adapter: sqlite3
    database: db/test.sqlite3
    timeout: 5000

production:
    adapter: sqlite3
    database: db/production.sqlite3
    timeout: 5000

 これは、YAMLのように見えますが、シェルスクリプトです。

スキーマの定義ファイル

 もう1つ。Bash on Railsでは、いまのところ、db/schema.shファイルにスキーマの定義を書きます。「members」というテーブルを定義してみます。

create_table members t
      t.column name string
      t.column mailaddress string
      t.column comment string
elbat_etaerc

 当然これもシェルスクリプトです。ちなみに、「elbat_etaerc」というのは、「create_table」の逆綴りです。

 もちろん、「t」のかわりに「tbl」とかほかの名前を使って、「tbl.column」のようにも書けます。複数のテーブルのスキーマ定義を書くこともできます。ただし、いまのところ、リレーションには対応していません。

テーブルを作る

 では、上の定義を元にテーブルを作ってみましょう。

% make db-schema-load
vendor/SHar/migrate/migrator
-- create_table(members)
%

 これだけです。makeの部分は、bash内蔵コマンドで作ってもよかったのですが、ここはRails気分を優先してmakeを使ってみました。

「聖凡人伝」

聖凡人伝 (1)
聖凡人伝 (1)
posted with amazlet on 08.01.16
松本 零士
小学館 (1996/05)
売り上げランキング: 339316


 松本零士がかつて描いた数々の四畳半モノの中でも、極北ともいえるエクストリームな傑作(怪作?)。

 第1話の冒頭から、主人公が失恋して自殺しようとするが失敗、戻ってみると会社をクビになっていたという展開で始まる。以後、毎回、セックスと自殺(主に首吊り)がお約束として登場する。まさにエロスとタナトス。合間に職探しをするが、いつもそのエピソード中に辞めたり、会社がツブれたりする。

 というと、どろどろした話になりそうだけど、実にハイテンションであっけらかんとしたもの。初期のヒロインもあっさり首を吊っていなくなるし。人が死んだら、とりあえず酒飲んでどんちゃん騒ぎして忘れようという姿勢で、なんだかポジティブだかネガティブだかわからない。

 美人(メーテル系)でやさしくて金持ちの彼女(?)とか、元鬼畜日本兵のセックスコンサルタントとか、殺人事件が起きたり不発弾が爆発したりといった設定で、もう中学生の妄想か2chの書き込みかと。たまに感傷的っぽいまとめも入るのだけど、シチュエーションが異常なのでまったく感情移入しない。

 だが、そこがいい。万人にすすめるマンガでもないし、人生論とかそういうのを求める人には向かないけど、こういうのが好きな人はけっこういるんじゃなかろうか。

 なお、アッパー系の本作とともに、ダウナー系の「ひるあんどん」もいいのだけど、こちらは入手困難か。

ひるあんどん [文庫版:コミックセット]
松本零士
奇想天外社
売り上げランキング: 329946

perlshの.debファイルを作る

 Perlの対話型実行環境でperlshというツールがあります。Term::ReadLine::Gnuの付録としてCPANで配布されています。

 Term::ReadLine::Gnuは、DebianやUbuntuではlibterm-readline-gnu-perlパッケージとして用意されています。が、付録であるperlshは、パッケージには含まれていません。そこで、libterm-readline-gnu-perlパッケージのソースをいじって、perlshパッケージも同時に作るように変更してみます。以下、Ubuntu 7.10での例です。

 結局は、ひとつのソースから複数のパッケージを作る方法を試してみたかっただけですが。

ソースを入手

$ apt-get source libterm-readline-gnu-perl
$ cd libterm-readline-gnu-perl-1.16

debian/rulesを編集

 パッケージを作るためのMakefileであるdebian/rulesを変更します。

$ vi debian/rules

 変更点は、diffでいうと以下のとおり。

--- rules.bak	2008-01-13 21:18:28.000000000 +0900
+++ rules	2008-01-13 21:18:52.000000000 +0900
@@ -3,7 +3,9 @@
 
 #export DH_VERBOSE=1
 
-PACKAGE=$(shell dh_listpackages)
+#PACKAGE=$(shell dh_listpackages)
+PACKAGE=libterm-readline-gnu-perl
+PACKAGE_PERLSH=perlsh
 
 include /usr/share/dpatch/dpatch.make
 
@@ -16,6 +18,7 @@
 endif
 
 TMP     = $(CURDIR)/debian/$(PACKAGE)
+TMP_PERLSH = $(CURDIR)/debian/$(PACKAGE_PERLSH)
 DOCDIR   = $(TMP)/usr/share/doc/libterm-readline-gnu-perl
 
 OPTIMIZE = -O2 -Wall
@@ -48,6 +51,8 @@
 	dh_installdirs
 
 	$(MAKE) install PREFIX=$(TMP)/usr
+	install -d $(TMP_PERLSH)/usr/bin
+	install -m 755 eg/perlsh $(TMP_PERLSH)/usr/bin
 
 	find $(TMP) \( -name '*.pm' -o -name '*.pl' \) -print0 | xargs --null --no-run-if-empty \
 	  $(PERL) -i -pe '$$_ = "#!/usr/bin/perl$$1\n" if m|^#!.*/perl(.*)$$|;'

debian/controlを編集

 パッケージの情報を記述するdebian/controlファイルを編集します。

$ vi debian/control

 ファイルの末尾に、以下のような内容を追加します。

Package: perlsh
Architecture: any
Depends: ${perl:Depends}, ${shlibs:Depends}, libterm-readline-gnu-perl
Description: one-line perl evaluator with line editing function and
 variable name completion function

 元の内容との間は、空行で区切ります。

perlshの#!行を変更する

 perlshスクリプトは、冒頭で「#!/usr/local/bin/perl」を呼んでいます。これを、DebianやUbuntuに合わせて、「#!/usr/bin/perl」に変更します。ここでは、オリジナルのソース自体を編集するのではなく、dpatchを使ってパッチを作成します。

 まずdpatch-edit-patchを起動。

$ dpatch-edit-patch 50egpath

 サブシェルが立ち上がるので、perlshスクリプトを編集します。

$ vi eg/perlsh

 編集が終わったらサブシェルを抜けます。

$ exit

 これでパッチが作られました。作られたパッチを一覧に登録します。

$ vi debian/patches/00list
(末尾に「50egpath.dpatch」という行を追加)

バージョンを設定

 変更ができたら、バージョン番号を独自のものに変更します。

$ dch -v 1.16-2-emasaka1
(説明を入力)

パッケージのビルドとインストール

$ dpkg-buildpackage -uc -us -rfakeroot
$ cd ..
$ dpkg -i libterm-readline-gnu-perl_1.16-2-emasaka1_i386.deb perlsh_1.16-2-emasaka1_i386.deb

まとめ

 以上、設定を変更してビルドするだけの簡単なお仕事です。

Linuxで自分のIPアドレスを取る

AirOneでローカルIPアドレスを取得する必要があります。上のようなコードを書くのが面倒なので、ifconfig(1)の出力をパースしています。

 エントリーは参考になりましたが、ip(8)のほうがパースしやすいような気がします。

% ip -4 -o address show
1: lo    inet 127.0.0.1/8 scope host lo
2: eth0    inet 192.168.0.4/24 brd 192.168.0.255 scope global eth0

 以上、野球でいうと棒ダマみたいな方法でした。iproute2とnet-toolsの関係はよくわからないのでパスしておきます。

「無限の住人」22巻

無限の住人 22 (22) (アフタヌーンKC)
沙村 広明
講談社 (2007/12/21)


 逸刀流 vs. 六鬼団の大決戦。もそうだけど、そのまわりで巻き込まれる人たちの今後の物語に期待。

「江戸忍法帖」

江戸忍法帖―山田風太郎忍法帖〈8〉 (講談社文庫)
山田 風太郎
講談社 (1999/05)
売り上げランキング: 258495


 著者は「少年小説みたい」と低い位置づけにしてるみたいだけど、そこもそれなりにいいんじゃないでしょうか。

「人は見た目が9割」

人は見た目が9割 (新潮新書)
竹内 一郎
新潮社 (2005/10)
売り上げランキング: 6616

 Book Offで買って読んでみた。タイトルどおりの非言語コミュニケーションの本だと思って読むと外すけど、著者なりの演出手法のエッセイとして読むと得ることはそれなりにあるんじゃないでしょうか。缶コーヒーより安く買ったせいかもれないけど。

  • 顔と(劇としての)キャスティング:丸顔、角顔、逆三角形、横から観た凹凸
  • 自分の席から離れない上司、早口で声が高い人という演出
  • オーバーアクション:おっちょこちょいという演出
  • 女性の結婚詐欺師という演出:潤んだ瞳
  • 男の子の前髪を上げる・下げるという演出
  • 女の子らしいポーズの演出:片足を少し上げ、ぎこちない感じを出す
  • 斜めの構図でショックを表す
  • 荷物の色で同じ荷物の重さの印象を変える
  • 病院に絵を贈る運動、ドラマ療法
  • 演劇の「間」、ロックの「クイ」
  • 極端に対照的な2人を作る

「戦争の経済学」

戦争の経済学
戦争の経済学
posted with amazlet on 08.01.07
ポール・ポースト 山形浩生
バジリコ (2007/10/30)
売り上げランキング: 255

 「戦争は経済に貢献するか」にはじまり、戦争や軍隊、紛争にまつわるいくつかのテーマを、経済学の観点から分析する書籍。

 大学の教科書形式で書かれていて、ケーススタディや復習問題もついている。手法や語り口もオーソドックス。論理がやや粗い部分も含めて、各自で考察するときの土台として使うのがよいのではなかろうか。訳者によると米軍の士官学校やクウェート大などで採用されているのだとか。

 以下、本書で書かれている内容を、自分で考察する前にメモ。

戦争の経済効果

  • 軍事で政府が消費や雇用を増やすという考え(軍事ケインズ主義)
    • ただし、インフレを起こす(生産能力が不足、材料不測)
      • 予想できれば対応できるが、予想外だとマイナス影響
  • 戦争の場所
    • 輸入元での戦争は経済に打撃
      • 石油価格が10ドル上がるとアメリカの実質GDP成長率は平均約0.5%下がる
    • 輸出先での戦争は経済にプラスになる場合がある
      • 第1・2次世界大戦のアメリカ
  • 資金調達のために貨幣供給を増やすことが多い→インフレ
  • 物理リソースの動員
    • 遊休生産能力が多い場合であれば経済に有利
    • ただし、民間財を生産しない機会損失も
  • 労働リソースの動員
    • 20世紀の戦争では、失業率の下がり具合が小さい
    • 動員により人的資本を経済から取り除いてしまう分配の非効率
    • 軍人の人口比は戦争ごとに下がっている
  • 戦争が米国経済にポジティブに影響した例
    • 第1次大戦
      • 連邦準備制度
      • ナポレオン戦争でのイギリスに類似
    • 第2次大戦
      • 通貨供給と国債とが相殺して金利を下げる
      • 中央計画経済化
      • 戦後はインフレ
    • 朝鮮戦争
      • 増税に頼る:軍事行動が短期間だった
      • インフレ
  • 戦争が米国経済にネガティブに影響した例
    • ベトナム戦争
      • 負債のマネタイズ
      • 国債が買われた分、民間貸付の金が減って高金利に(クラウディングアウト効果)
      • ペロポネソス戦争でのアテナイに類似
    • 湾岸戦争
      • 失業率上昇
    • イラク戦争
      • 失業率上昇
      • 原油価格上昇
      • コストは減少:技術向上、武器が安価に、民生技術の転用、人員動員の低下
      • ワシントンDCや軍需産業では新規雇用
        • ただし株価は上がらなかった

軍隊

  • アメリカは世界の軍事支出の38%を占める
    • ただし、GDP比では冷戦時代の半分以下
  • 軍産複合体(MIC)は、戦時の支出を平時に均すために作られた
    • 第2次大戦時に軍事生産や政府のポストが劇的に増えた
  • 軍縮と軍拡
    • 基地の閉鎖は地域コミュニティの経済に深刻な影響を与えない
    • 軍事支出と民間支出に負の相関
    • 軍拡競争(安全保障のジレンマ)
      • ソ連は軍事生産に手いっぱいで民間部門に回らなくなった(PPF)
  • 人員
    • 徴兵軍は、同じ予算で多くの兵員を雇えるが、経済の機会費用(損失)は高い
    • アメリカはベトナム戦争のあと総志願軍(AVF)に移行
    • 民間軍事会社(PMC)・民営軍(PMF)は過去10年ですさまじい成長
      • イラク戦争では米軍人10人あたり民間業者1人
      • 米軍のダウンサイジング、兵器の複雑化、安くて有能(賃金が高い)
      • 政府軍からの引き抜きのため、政府の投資損失と再リクルート費用がある→公共財
  • 兵器市場(米国内の)は相互独占市場
    • 買い手は政府しかいない、寡占市場、価格が重要ではない、契約が決まれば独占、機密保持のために政府の保護と介入が大きい
    • 軍事産業の上位10社はほとんど軍事部門の売上が1/4未満、下位10社はほとんど60%以上
    • 米国防省の契約形態:固定費契約、コストプラス契約、インセンティブ契約
    • デッドウェイト・ロス:インセンティブを越えた金額での契約
      • 生産による便益、相互独占による総生産の縮小、技術の民間への還元(正の外部性)もある
  • 米国の兵器輸出:世界でもっとも広く取引されているF-16で検証
    • 政府間取引:外国軍事販売(FMS)
    • 外国政府-企業取引:直接商業販売(DCS)
      • 輸出免許
      • 相殺協定:購入国に一部技術提供や製造を認めて価格を相殺

安全保障

  • 貿易は戦争を減らすか
    • 金のアーチ理論:マクドナルドが開店した国どうしはれ以降戦争しないという説
    • 貿易は戦争の費用を高くする
    • 反論:戦争が少ないから貿易が増えているだけ
  • 内戦の原因
    • 民族や宗教の対立より、経済要因
    • 貧困、資源採掘、強欲、少数民族からの搾取、格差
    • GDPの相当部分が原材料の輸出からなる国は、紛争リスクが高い
    • 最大の民族集団が45~90%を構成しているとき紛争が起こる確率が28%に上がるとの説
    • 垂直格差は紛争につながらないが、垂直格差(民族、宗教、政治などの格差)は紛争の危険を増す
  • 平和維持活動は経済面では非効率
    • フリーライダー問題、限界便益を上回る限界費用
  • パレスチナの自爆テロリストの57%は高校以上の教育を受けている
  • テロの動機をゲームツリーで分析
  • ハワラ、飛銭
  • テロの経済的影響:国際貿易
  • 生物兵器はコストは低いが扱いが難しい
  • 核拡散
    • 核兵器は固定費は高いが限界費用や効果あたり費用は低い
    • たとえば、パキスタンが高濃縮ウラン(HEU)を、北朝鮮がミサイルを開発するといった国際分業をした場合、効率が高い
    • 闇市場価格報告事例:兵器純度のプルトニウム4kgに2.5~2.65億ドル
    • 条約や協定は有効性があるか
      • 経済学理論では協調行動になりにくい:遵守コスト、フリーライダー問題、覇権国不在

日本の戦争をプロジェクトとして収支計算(訳者付録)

  • 日清戦争
    • 収益率(賠償金÷費用-1):57.7%
    • 期待収益率:勝率80%で計算して5%
  • 現在価値:戦争が長期化すると割引率が重なり、正味現在価値(NPV)が小さくなる
  • イラク派兵
    • インフラ整備などの公共事業に見立てて割引率4%で計算:年65億円で元がとれる?
  • 現代の戦争はこれらのモデルで考えるには数値化困難な要素が多すぎる

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。