本を読む

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

スポンサーサイト

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

「スピリチュアルワールド見聞記」

スピリチュアルワールド見聞記
植木 不等式
楽工社
売り上げランキング: 9373

 「と学会」の植木不等式氏が、スピリチュアル(近代以降の心霊系)の歴史について、雑談も含めて豊富な話題にもとづき解説する本。ただし、なぜか、酔ってビルから落ちて瀕死の状態で体外離脱している植木不等式(霊を信じたいサイエンスライダー)と天使(主人公に霊が存在しないと納得させようとしていて、メイド姿)の漫才形式になっていて、おまけにやはりダジャレまみれ。「宮崎アニメと美少女と内村鑑三について熱く語るトークライブイベント」で吹いた。

 対話の構図となっているように、ベースは懐疑論なのだけど、むしろスピリチュアリストさんのほうをテーマにして「人はなぜスピチュアルを信じるのか」に重点を置いているようだ。ところで、「ボーイズ・ビー・シドビシャス」は田口トモロヲの昔のネタではないかと思う。

 以下、本書の内容からのメモ。

  • 幽体離脱(OBE)
    • レイモンド・A・ムーディの体験談
    • 松谷みよ子「あの世からのことづて」
    • オラフ・ブランケ(スイス連邦工科大学ローザンヌ校)の実験
      • 被験者のゴーグルに、被験者を後ろから見た映像を映し、被験者の背中を掻く
    • H・ヘンリック・エールソン(ユニバーシティー・カレッジ・ロンドン)の実験
      • 被験者のゴーグルに、被験者を後ろから見た映像を映し、被験者の胸を掻きながらカメラの前でペンを動かす
  • スーザン・ブラックモア(1951-)
    • 超常現象を肯定的な立場で研究していて後に批判派に
  • 「靈はもと雨乞いの儀礼をいう」白川静
  • 日本古代の2次元萌え
    • 古今和歌集の仮名序
    • 日本霊異記「愛欲を起こし吉祥天女の像に恋する縁」
  • 駄洒落には前頭葉前皮質の一部が反応、考えオチのようなユーモアには後側頭葉が反応(2001年「ネイチャー・ニューロサイエンス」誌)
    • ギャクで笑うのは肉体? 霊魂?
  • カナダの脳神経外科医ワイルダーペンフィールド(1891-1976):脳手術中の患者の脳に電気刺激を与えて「お化け」が見えると報告
  • 「ニッケル」の由来:銅鉱山で銅に似た鉱石が出ると、山の精霊「ニッケルン」の悪さということにした
  • マイケル・パーシンガー
    • 三つ揃いのスーツで芝刈りをする変人?
    • 脳を電磁波で刺激するマシン
      • リチャード・ドーキンス(利己的な遺伝子)、マイケル・シャーマー(スケプティック・ソサエティ)なども被験者に
      • 結果はどっちともとれる程度
    • 2004年にスウェーデンの研究者が二重盲検を組み込んで追試
      • 電磁波あるなしで同じ程度の霊体験数
  • 2005年、オラフ・ブランケの研究
    • TPJ(側頭頭頂接合部)の活動が損なわれるとOBE(感覚)が起こりやすくなる
  • 2007年、ベルギーのアントワープ大の事例
    • TPJに電極を当てるとOBE(感覚)が起きた
  • 2007年、ケヴィン・ネルソン(ケンタッキー大)
    • いわゆる臨死体験をした人は、睡眠麻痺(REM侵入、いわゆる金縛り)を経験する割合がハッキリと高かった
  • 20世紀初頭、ダンカン・マクドゥーガル、霊魂の重さを量る実験
    • 1930年代に別の学者がハツカネズミで追試、重量の減少はなかった
  • サム・バーニア(英国の医師)、天井付近に下から見えない目印を設置して体外離脱離脱の実験
    • が、臨死体験者が出なかった
  • 臨死体験の3つの仮説
    • 脳内現象説:幻覚
    • 心理的逃避説:無意識の空想、ドラマなどの影響、昏睡中に聞いた話の記憶
    • スピリチュアル説
  • 粒子加速器の予算について上院で「それは国を守る上でどんな役に立つのか」と聞かれたロバート・ウィルソン、「この国を守るに値する国にするのには役立ちます」
  • 1976年、心臓発作で瀕死の状態だった女性が、体外離脱して、窓の下に隠れたテニスシューズを見つけたというエピソード
    • 報告者自身も自身の体外離脱を語っている
  • 19世紀に「近代心霊主義」(モダン・スピリチュアリズム)運動
    • 降霊会ブーム
    • エンゲルスが批判。が、「いずれもが反証されないかぎり、彼らには十分の(反論の)余地が残されている」
      • 後にソ連のイワン・パブロフ、霊魂は肉体の現象として理解できるはずと主張
    • トマス・ハックスリ、心霊主義研究グループからの誘いを断わる
  • フランツ・アントン・メスマー(1734-1815)、動物磁気
    • 後に催眠療法に
  • エマヌエル・スウェーデンボルグ/スウェーデンボリ(1688-1772)
    • 最初の「神の声」は「食べ過ぎるな」
    • カール・ヤスパース「精神分裂病と極めて類似した病的体験」
  • 1848年、フォックス姉妹
    • これをきっかけに降霊会や霊魂のメッセージが大ブームに
  • ハムレット(hamlet):村とも呼べない小さな集落
  • カンタンに霊と交信する方法が登場
    • テーブル・ターニング、プランシェット、ウィジャボード、こっくりさん
    • 霊が怖い存在から娯楽に
  • マイケル・ファラデー、テーブル・ターニングの原理を看破。無意識の力
    • フォックス姉妹の件から5年後
    • ガウスや井上圓了(中野哲学堂)も批判的検証
  • アラン・カルデック(1804-1869)、降霊会で聞いた「神のお告げ」を出版
    • 男女平等などの主張も(カルデシズム)
      • もともと、恵まれない人々の教育に取り組んでいた
      • 労働者層から支持
      • ブラジルに伝わり、カトリックや民間信仰と混ざりあいながら現在も続く
  • ダニエル・ダングラス・ヒューム(1833-1886)
    • ナポレオン3世の前でナポレオン・ポナパルドの霊を呼び出すパフォーマンス
    • 空中浮遊
  • ウィリアム・スティントン・モーゼス(1839-1892)
    • 上のヒュームの影響で霊媒に
    • 「インペレーター」(皇帝?)と交信
    • 教会に批判的なメッセージ
    • 自動書記
  • モーリス・バーバネル(1902-1981)
    • 「シルバー・バーチ」(白樺)と交信
    • 教会に批判的なメッセージ、神の理想社会
  • 1875年、神智学協会が設立
    • ヘレナ・ペトロヴナ・ブラヴァツキー、ヘンリー・スティール・オルコット
    • 社会運動型のメッセージも
    • 霊媒ネタから離れ、よりオカルティックな方向に
  • 19~20世紀、心霊研究協会(SPR)
    • 信じる側の立場で、霊的なものを科学的に探求するという狙い
    • フランク・ポドモア(フェビアン協会)アンリ・ベルクソン、アルフレッド・ラッセル・ウォレス(進化論)、クルックス(タリウムの発見など)、リシェ(アナフィラキシー・ショックの発見)、マリー・キュリー、ジグムンド・フロイトらも
    • 霊媒を見つける活動
      • フローレンス・クック
      • レオノーラ・パイパー
        • ホットリーディングやコールドリーディングを利用?
        • 架空の人物名でカマをかけられて失敗
  • 1875年、サンクト・ペテルブルク帝国大学付属物理協会内いわゆる霊媒現象調査委員会
    • ドミトリ・メンデレーエフ
    • 否定の立場
  • 「ウォッカ」は「水」が語源
  • パラサイコロジー(ESP)
    • ジョセフ・バンクス・ライン(1895-1980)
  • 1976年、サイコップ(CSI)設立
  • カルデック「科学によって新しい法則が発見されるたびに、スピリチアリズムが新しい法則を発見する」
  • 2008年、サミュエル・モートン(ハーバード大)、「テレパシーを送る」ときにfMRIに違いが出るか実験
    • 違いはまったくなかった
  • 2004年、リチャード・ワイズマンの実験
    • 「世界で一番笑えるジョーク」プロジェクトの人
    • 霊媒に被験者のことを言い当てさせる、ただし対応を入れかえて渡す
      • 他人の話に高得点を付けるなどバラバラな結果に
  • リー・M・シルヴァー「活性度の高いDRD4遺伝子を受け継いだ人々は霊的力を信じる傾向が強かった」
  • 1865年、スピリチュアリスト系雑誌「宗教-哲学ジャーナル」創刊
    • 女性運動家アメリア・ジェンクス・ブルーマーも寄稿
  • 1872年、「ナショナル・アソシエーション・オブ・スピリチュアリスツ」会長で女性開放運動家のビクトリア・ウッドハルがアメリカ史上初の女性大統領候補に出馬
  • 神智学協会の国際会長を務めたアニー・ベザント、1917年にインド国民会議派の会長に
  • 中江兆民の闘病記より「躯殻が死すれば精魂は即時に滅ぶるのである」「釈迦耶蘇の精魂は滅してすでに久しきも、路上の馬糞は世界とともに悠久である」
  • 「夜と霧」によると、ナチスのユダヤ人収容所で職員たちがスピリチュアルな降霊会をやっていた
  • アメリカの社会派作家アプトン・シンクレアのスピリチュアル系の作品の序文をアインシュタインが書いた(ただし友情によるものでスピリチュアル系には懐疑的)
  • ASPRの支部であるアメリカ心霊研究協会(ASPR)会長のホッジソンが1905年に亡くなり、メンバーはホッジソンの霊を呼んで会の諸問題を相談した(モーリス・メーテルリンク(「青い鳥」)の本より)
  • マーク・トウェインもSPRに参加
    • テレパシーができれば電報代50セントが節約できる、という理由とか
  • キリスト教の霊魂観
    • パウロの手紙では死者は審判のときまでは天国と地獄のどちらに行くか待機状態
    • が、イエスの説いたたとえ話には、地獄に行った金持ちの話も出てくる
  • 仏教の霊魂観
    • 「無記」
    • 輪廻転生:何が輪廻するか
    • 閻魔様の由来:インドの神話で最初の人間「ヤマ」
    • 地獄のイメージは「暑いところ」という、暑いインドの発想
  • 神道の霊魂観
    • 神社本庁の手引きでは、死者はその家に宿ると同時に魂を子孫が受けつぐ
    • 歴史的には、とくに決まっていない
    • 神道の理論化は仏教に触発されたもの
    • 柏手の回数など参拝のしかたは神社によって違うことがある
  • ミラーニューロン:他人の動作に対し自分の動作と同じように反応する神経細胞
スポンサーサイト

VMware Player 2.5 Linux版は一発インストール

 ちょろっと実験するときなどに、Ubuntu上でVMware Playerを使って仮想マシン環境を動かしている。

 そのVMware Playerが2.5になったということでインストールしてみた。以下、メモ。

インストールがえらく簡単に

 Linux版の2.0までは、ダウンロードサイトに.rpm版と.tar.gz版があり、Ubuntuでは.tar.gz版を選んでいた。が、2.5では.tar.gz版がない。かわりに、.bundle版というのがある。

VMware Player 2.5のダウンロード

 これをダウンロードしてみた。さっそくファイルの正体をfileコマンドで調べてみる。

$ file VMware-Player-2.5.0-118166.i386.bundle
VMware-Player-2.5.0-118166.i386.bundle: a bash script text executable

 ときどきある、バイナリの頭にシェルスクリプトを付けた自己解凍形式のようだ。そこで、実行。

$ sudo bash VMware-Player-2.5.0-118166.i386.bundle

 ずらずらとメッセージが表示されたあと、ダイアログが表示された。

VMware Player 2.5のインストーラーが起動

 なお、画面をキャプチャーするときのミスでダイアログのタイトルバーや枠が写っていないのはご容赦を。

 ここで「install」をクリックすると、インストールが即実行されて、

VMware Player 2.5のインストール中

何も聞かれずにインストール完了した。びっくり。

VMware Player 2.5のインストール完了

 2.0まではコマンドラインだしコンパイラやカーネルヘッダーが必要だし、多くの確認項目を聞かれるしだったのだけど、ずいぶん楽になったもんだ。

bridge接続で無線LANが使えた

 あと2.5でうれしいのは、仮想NICをbridge接続に設定していても無線LANが使えたこと。いままでは、有線LANにするか、仮想NICをNAT接続に設定するかする必要があった。これで、無線LANしかない場所でもLAN内から仮想マシンに接続できる。

Re: compact-number-list

 bashで。引数→標準出力。

function compact-number-list() {
    local i r prev=-2
    for i;do
        if ((i != prev + 1));then
            print-range $r
            r=''
        fi
        r="$r $i"
        prev=$i
    done
    print-range $r
    echo
}

function print-range() {
    if (( $# > 1 ));then
        echo -n "( $1 "
        shift $(($# - 1))
        echo -n "$1 ) "
    else
        echo -n "$1 "
    fi
}

# test
echo -n '1 3 4 5 6 12 13 15 ->'
compact-number-list 1 3 4 5 6 12 13 15
# expects:
# 1 3 4 5 6 12 13 15 -> 1 ( 3 6 ) ( 12 13 ) 15 

Re: コマンドラインで一ヶ月分のファイル名を作る

$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do printf "access_log.%04d%02d%02d\n" $year $mon $i; done
さ~て、Perlやzshではどう書くんだろうか?
ネタふりをしてみる。

 これいいですね。calの結果をほぼそのままforに食わせるというのがシンプルで確実。実用コマン道としてベスト解なんじゃないでしょうか。

 以下、私がちょっとほかの方法を試行錯誤してみた、実用的じゃない例です。方法そのものはともかく、モジュールやコマンドの挙動は自分の勉強になりました。

Perlで

 DateTime->last_day_of_month()で月末を求めてループする方法です。ワンライナーで使うには長い。

$ perl -MDateTime -e '$y=2008; $m=12; printf "access_log.%04d%02d%02d\n", $y, $m, $_ for (1..DateTime->last_day_of_month(year=>$y, month=>$m)->day)'

dateコマンドで

 GNU系のdateに「1日の1か月後の1日前」を指定して月末を求める方法です。なんかまどろっこしい感じ。

$ y=2008; m=12; e=$(date -d "$y-$m-1 +1 month -1 day" +%d); for ((i=1; i<=$e; i++));do printf 'access%04d%02d%02d\n' $y $m $i; done

zshのzsh/datetimeモジュールで

 strftime -r(Cのstrptime()相当)がどの月でも31日まで受け付けるので、その結果をstrftimeにかけて、翌月にならない日を表示する方法です。こんなややこしいことワンライナーでやりません。

% zmodload -i zsh/datetime
% y=2008; m=12; for ((i=1; i<=31; i++));do strftime -r -s e %F $y-$m-$i || break; strftime -s d access_log.%Y%m%d $e; [[ $d == *$i ]] && echo $d; done

Re: コマンドラインで連番のファイル名を作る

$ for i in `perl -e 'printf("%0.2d\n", $_) for (1..27)'` ; do rm -f /usr/local/apache/logs/old/access_log.200801$i*.gz ; done
$ i=1; limit=13; while [ $i -le $limit ]; do j=$(printf "%03d" $i); echo access_log.200801$j; i=$(($i+1)); done

 お二方のやりかたでまったく問題はないと思いますが、bashやzsh、kshであれば、算術forを使うのもアリかなと思いました。POSIX-shやBourne Shellでは使えませんが。

$ for ((i=1; i<=27; i++));do printf "access_log.200801%02d\n" $i;done

 ちなみにseqかjotかという話を抜かすと、seqではこんな感じですね。

$ seq -f 'access_log.200801%02g' 1 27

修正2008-09-25: 自分のコードだけprintfまわりの冗長な部分を整理しました。どう見ても後出しジャンケンです、本当に(ry

追記2008-09-30: 言及はてブで、zshでは「print -l access_log.200801{01..27}」でいけると教えていただきました。zshすげー。

「大金星」

大金星 (アフタヌーンKC)
黒田 硫黄
講談社



 黒田硫黄の短編集。かつで雑誌で読んだ「居酒屋武装条例」が気になって買った。やっぱり買って正解。

 あと、「Schweitzer」や「ミシ」をはじめ、全部よかったと思う。なんというか、煮えきらない感じの演出が。

DebianやUbuntuでXMLカタログを変更する

Debian的には上記の操作を/usr/sbin/update-xmlcatalogでやるのが正攻法らしい。後で調べる。

 というわけで、RSS 0.91のDTDをXMLカタログに登録する操作を、DebianやUbuntuで用意されている機構でやりなおしてみる。このへんを参考にした。

 DTDを置くディレクトリを作るところと、DTDをダウンロードするところまでは同じ。カタログは自分で作らずに、とりあえずDTDだけコピーする。

$ sudo mkdir /usr/local/share/xml/schema/rss
$ wget http://www.rssboard.org/rss-0.91.dtd
$ sudo cp rss-0.91.dtd /usr/local/share/xml/schema/rss

 で、update-xmlcatalogを使って、/usr/local/share/xml/schema/rss/catalog.xmlを生成する。

$ sudo update-xmlcatalog --add --local /usr/local/share/xml/schema/rss/catalog.xml --type public --id "-//Netscape Communications//DTD RSS 0.91//EN" --file /usr/local/share/xml/schema/rss/rss-0.91.dtd

 続いて、それを指す/etc/xml/rss.xml(パッケージというらしい)を生成する。update-xmlcatalogのソースを見るかぎり、--packageであれば、--idで指定した文字列はXMLカタログ中で「publicStartString」扱いとなるようだ。

$ sudo update-xmlcatalog --add --package rss --local /usr/local/share/xml/schema/rss/catalog.xml --type public --id "-//Netscape Communications//DTD RSS"

 最後に、パッケージを指す大元の/etc/xml/catalogを変更する。やはりupdate-xmlcatalogのソースを見るかぎり、--rootであれば、--idで指定した文字列はXMLカタログ中で「publicStartString」扱いとなるようだ。

$ sudo update-xmlcatalog --add --root --package rss --type public --id "-//Netscape Communications//DTD RSS"

 これで、前回とほぼ同じ結果になった、と思う。

RSS 0.9のDTDをXMLカタログでさしかえる

 Plaggerで、今月に入ってからRSS 0.9のフィードのパースエラーが起きていたので、調べてみた。

の続き。

 面倒なのでwiresharkで調べてみたら、libxmlのパーサーはDTDのURLに本当にアクセスしていた。へー。

 避ける方法ぐらいあるんじゃなかろうかと思って、libxmlやXMLについて付け焼き刃で勉強してみた。どうやらXMLにはXMLカタログという機構があって、リソースの参照先を指定したり変更したりできるらしい。

 というわけで、RSS 0.91のDTDの参照先を設定してみる。以下、Debianでの例。

 まず、DTDとXMLカタログを置くディレクトリを適当なところに作る。

$ sudo mkdir /usr/local/share/xml/schema/rss

 次にDTDをダウンロードする。

$ wget http://www.rssboard.org/rss-0.91.dtd

 以下のようなXMLカタログを作る。ここではcatalog.xmlという名前とする。

<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <public publicId="-//Netscape Communications//DTD RSS 0.91//EN"
        uri="file:///usr/local/share/xml/schema/rss/rss-0.91.dtd"/>
</catalog>

 カタログとDTDをコピーする。

$ sudo cp catalog.xml rss-0.91.dtd /usr/local/share/xml/schema/rss

 最後に、/etc/xml/catalogを編集して、<catalog ~>と</catalog>の間に以下のような行を追加する。

  <delegatePublic publicIdStartString="-//Netscape Communications//DTD RSS"
    catalog="file:///usr/local/share/xml/schema/rss/catalog.xml"/>

 とりあえず、PerlのXML::RSS::LibXMLのテストケースは通るようになった。

追記2008-09-21:Debian的には上記の操作を/usr/sbin/update-xmlcatalogでやるのが正攻法らしい。後で調べる。

RSS 0.9のDTDがlibxmlでエラーになる

 Plaggerで、今月に入ってからRSS 0.9のフィードのパースエラーが起きていたので、調べてみた。

 試しにこんなRSSファイルを用意する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
            "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<rss version="0.91">
</rss>

 このRSSファイルをこんなPerlスクリプトで読み込む。

#!/usr/bin/perl
use strict;
use warnings;
use XML::Feed::RSS;
$XML::Feed::RSS::PREFERRED_PARSER = 'XML::RSS::LibXML';

my $content = do { local $/; <>; };
XML::Feed->parse(\$content);

 こんなエラーになる。

http://netscape.aol.com:4: parser error : Content error in the external subset
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
^
http://netscape.aol.com:4: parser error : Content error in the external subset
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
^
Can't call method "getNamespaces" on an undefined value at /usr/share/perl5/XML/RSS/LibXML/Parser.pm line 77.

 「Content error in the external subset」というメッセージ文字列は、libxmlのparser.cにあるようだ。

 DTDのURLを変えてみる。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
            "http://www.rssboard.org/rss-0.91.dtd">
<rss version="0.91">
</rss>

 今度はエラーが出ない。

 ちなみに、ブラウザでhttp://my.netscape.com/publish/formats/rss-0.91.dtdにアクセスすると、http://netscape.aol.com/にリダイレクトされる。

OpenOffice.org BasicでRange関数を使うには

 以下、Ubuntu 8.04のOpenOffice.org 2.4で試した話。

 最近のOpenOffice.orgではVBAのコードがだいぶそのまま動くようになっているということなので、Calcで試してみた。

 簡単なサンプルを動かしてみる。

Sub Hello
    Range("A1").Value = "Hello, World"
End Sub

 実行したらエラーになった。うーむ。

BASICランタイムエラー
SubまたはFunctionプロシージャーの未定義。

 ググってみると、VBASupportというオプションを設定するといいらしい。

Option VBASupport 1

Sub Hello
    Range("A1").Value = "Hello, World"
End Sub

 これで成功。

 OpenOffice.org Basicを使う人には基本なのだろうと思うけど、ビギナーの自分はハマったのでメモしておく。

「ハローサマー、グッドバイ」

ハローサマー、グッドバイ (河出文庫 コ 4-1)
マイクル・コーニイ
河出書房新社
売り上げランキング: 3143

 最近ブログを見て回ると「ハローサマー、グッドバイ」の話題が出ていたりして、えっマイクル・コーニイの? と思っていたらどうやら最近新訳で出たらしい。出た当時にけっこう気にいって今も本棚にあるのだけど、その後読み返してなかったので、新訳を買って20年ぶりに読み直してみた。海を見ながら。

 物語は、夏休みに海辺の町にやってきた少年が、その町の少女と恋をする、一夏のボーイ・ミーツ・ア・ガールの物語。海でのちょっとした冒険や、同世代の嫌な奴との対決、両親との葛藤、少年から大人への成長といった要素が詰まった、実際にはありもしなかった青春の日を思い出させるようなさわやかな物語となっている。基本的にはすごく甘い話なのに、くどさを感じなくて、パステル調っぽい表紙がうまくあっていると思う。

 …という部分は実は再読するまで記憶になくて、話題になってるラストのどんでん返し以降のパートだけ覚えていたりする。フェンスと小屋のシーンとか。嫌な奴だね。改めて読むと、伏線がうまく張りめぐらされているのに感心した。題名とかも。ところで、冒頭で主人公が回想として語り出しているのは、どの時点の視点なんだろう。やっぱりラスト?

 あと、今になってみると、脇役の人々が、控えめながらもいい味を出しているのに気づく。メストラーとかね。

 というわけで、月並な言いかたながら、よかった。

「だいじなのは、お話の裏にこめられた意味なんだよ、ドローブ少年。お話ってのはある目的があって語られるもので、その語られかたにもやっぱり目的がある。お話がほんとかそうでないかなんてのは、どうでもいいことなんだ。それを忘れるなよ」(グロープ)

「あたらしい朝」



あっ、黒田硫黄の単行本出てたんだ。知らなかった。

 「鋼鉄クラーケン」あたりっぽい感じの放浪というか冒険というかそういう物語。

bashでGrassをキメたら悪酔いしたwww

そろそろ誰かが bash で Grass を書くと見た。
                           ,r;;;;ミミミミミミヽ,,_
                         ,i':r"    + `ミ;;,
       __,、           ≡     彡        ミ;;;i
    〃ニ;;::`lヽ,,_           ≡  彡 ,,,,,、 ,,,,、、 ミ;;;!
    〈 (lll!! テ-;;;;゙fn    __,,--、_  ..   ,ゞi" ̄ フ‐! ̄~~|-ゞ, ≡
   /ヽ-〃;;;;;;;llllll7,,__/"  \三=ー"."ヾi `ー‐'、 ,ゝ--、' 〉;r'  ≡  bashは自分を評価することができるんです
   >、/:::/<;;;lllメ   \ヾ、  ヽTf=ヽ  `,|  / "ii" ヽ  |ノ
  j,, ヾて)r=- | ヾ:   :ヽ;;:     | l |  l  ''t ←―→ )/イ^    ≡ awkとは違うんです
 ,イ ヽ二)l(_,>" l|    ::\;::    | |  |  ヽ,,-‐、i'  / V
 i、ヽ--イll"/ ,, ,//,,    :;;   l //  l く> /::l"'i::lll1-=:::: ̄\
 ヾ==:"::^::;;:::/;;;;;;;;;:::::::::::::: :::::ゞ ノ/   L/〈:::t_イ::/ll|─-== ヾ
  \__::::::::/::::::::::::_;;;;;;;;;;;;;;;;;ノノ   ヘ   >(゙ )l:::l-┴ヾ、ヽ  )
      ̄~~ ̄ ̄/ :::|T==--:::::  //  / ト=-|:|-─ ( l   /
         / ::  ::l l::::::::::::::::::/ /:::::::::::/:::::(ヽ--─  / |  /
         ヽ_=--"⌒ ゙゙̄ヾ:/ /:::::::/:::::::::`<==-- ノ / /

 …すみません、言ってみたかっただけです。

 というわけで、ちょっと草植えときますね型言語Grassの処理系をpure bashで書いてみました。

前置き:シェルスクリプトはLispである

 みなさんご存知のとおり、シェルスクリプトはLispの一方言です。つまり、空白で区切った要素からなるリストを基本構造として、それを評価すると先頭が関数(手続き、コマンド)と解釈されます。

 たとえば、以下のシェルスクリプトをbashやPOSIX-shで実行すると、現在の日時が表示されます。

car() {
    echo $1
}

cdr() {
    shift
    echo $*
}

list='go to date and smile'

eval $(car $(cdr $(cdr $list)))

 という線で、クロージャーとかメタプログラミングとかの方向で実装してみます。

注意

  • In(入力)は未実装です
  • ちょっと複雑なラムダ計算(grass.elのサンプルにあるgrass-sample-helloでも)をすると、すぐマシンリソースを食い尽くしますので、注意してください
  • trueとfalseは、わかってないので適当です

 このあたりの不出来さが、タイトルの「悪酔い」の所以です。

実装の説明

 次のようなプログラムをパースします。

wwWWwWWWwvwWWwwWwwwWwwwwwWwwwwwwww

 すると、次のような文字列を生成します。

Abs 2 'App 2 1;App 3 1;';Abs 1 'App 2 2;App 1 3;App 1 5;App 1 8;';

 これはシェルスクリプトでもあります(言語内DSL?)。これを評価します。

 まず、先頭のAbsを実行すると、次のような文字列(クロージャ)が生成されてスタックに積まれます。

lambda 2 5 'App 2 1;App 3 1;' x

 lambdaの後に、未束縛の引数の数、スタック上のクロージャの位置、ボディ、(束縛済みの引数...)、「x」が続く、という書式です。

 これはシェルスクリプトでもあります。Appは、スタックから関数としてクロージャ文字列を参照すると、最後の「x」の前に引数を追加してから、文字列を評価します。

ソースコード

#!/bin/bash
# grass.bash
#   version 2008-09-13
# Copyright (C) 2008 emasaka. All rights reserved.

shopt -s extglob

declare debug                   # debug flag
declare parseonly               # only parse and exit

declare -a stack
declare -i stackptr=0

function errorout() {
    (echo "$@" >&2) > /dev/null
}

function log.debug() {
    [ -n "$debug" ] && errorout "$@"
}

function pushstack() {
    stack[$((stackptr++))]=$1
}

function getstack() {
    echo ${stack[$((stackptr - $1))]}
}

# DSL

function App() {
    local -i fun_offset=$1
    local -i arg_offset=$2

    local fun=$(getstack $fun_offset)
    local arg=$(getstack $arg_offset)
    log.debug "App: stackptr=<$stackptr> fun=<#$fun_offset: $fun)> arg=<#$arg_offset: $arg)>"

    local suffix
    if [[ $fun == *\ x ]];then
        fun=${fun% x}
        suffix=' x'
    fi
    local res=$(eval $fun \""$arg"\"$suffix)
    pushstack "$res"
}

function Abs() {
    local -i nargs=$1
    local body=$2

    log.debug "Abs: nargs=<$nargs> stackptr=<$stackptr> body=<$body>"
    pushstack "lambda $nargs $stackptr '$body' x"
}

function lambda() {
    log.debug "lambda: $*"
    local -i nargs=$1
    shift

    if [ $nargs = 1 ];then
        local -i stackptr=$1    # mask stackptr by local one
        local body=$2
        shift 2
        local -a stack=("${stack[@]}") # copy stack to local one

        while [ $# != 0 ];do
            local e=$1
            shift
            case "$e" in
            lambda)
                local -i level=1
                while ((level > 0));do
                    local elm=$1
                    [ $# = 0 ] && break
                    case "$elm" in
                    lambda)   ((level++)) ;;
                    x)        ((level--)) ;;
                    *\ *|'')  elm="'$elm'" ;;
                    esac
                    e="$e $elm"
                    shift
                done
                ;;
            x)
                continue
                ;;
            esac
            pushstack "$e"
        done
        eval "$body"
        getstack 1
    else
        echo -n "lambda $((nargs - 1)) $1 '$2'"
        shift 2
        local e
        for e in "$@";do
            if [[ $e == lambda* ]] || [[ $e != *\ * ]] || [ -z "$e" ];then
                echo -n " $e"
            else
                echo -n " '$e'"
            fi
        done
        echo
    fi
}

function Identity() {
    echo "$1"
}

function In() {
    errorout 'function In is not implemented'
}

function Char() {
    local self=$1
    set $2
    if [ "$1" = Char ] && [ "$2" = "$self" ];then
        echo "lambda 2 1 'App 3 1'" # true
    else
        echo "lambda 2 1 'App 3 2'" # false
    fi
}

function Succ() {
    local c=$1
    set $c
    if [ "$1" = Char ] && [[ $2 == +([0-9]) ]];then
        echo Char $(($2 == 255 ? 0 : $2 + 1))
    else
        errorout "function Succ is called with '$c'"
    fi
}

function Out() {
    local c=$1
    set $c
    if [ "$1" = Char ] && [[ $2 == +([0-9]) ]];then
        errorout -ne "\x$(printf '%x' $2)"
    else
        errorout "function Out is called with '$c'"
    fi
    echo "$c"
}

# parser

function trim_split() {
    local s=$1

    s=${s//w/w}                # 全角→半角
    s=${s//W/W}
    s=${s//v/v}
    if [[ $s == *w* ]];then
        s=${s//[^Wwv]/}
        s=${s#+([^w])}
        echo ${s//v/ }
    fi
}

function parse1() {
    local s=$1
    local arg

    while [ -n "$s" ]; do
        case "$s" in
        W*)
            echo -n 'App '
            arg=${s##+(W)}
            echo -n $((${#s} - ${#arg})) ' '
            s=${arg##+(w)}
            echo -n $((${#arg} - ${#s}))';'
            ;;
        w*)
            echo -n 'Abs '
            arg=${s##+(w)}
            echo -n $((${#s} - ${#arg})) "'"$(parse1 "$arg")"';"
            return
            ;;
        esac
    done
}

function parse() {
    local s
    for s in $(trim_split "$1");do
        parse1 "$s"
    done
}

# main

function toplevel() {
    local s

    pushstack Identity
    pushstack In
    pushstack 'Char 119'
    pushstack Succ
    pushstack Out

    read -d '' s                # slurp
    local parsed=$(parse "$s")
    log.debug "parsed: $parsed"
    [ -n "$parseonly" ] && return
    eval $parsed
    App 1 1
}

declare opt
while getopts 'dp' opt;do
    case "$opt" in
    d) debug=1;;
    p) parseonly=1;;
    esac 
done
shift $((OPTIND - 1))

if [ $# = 0 ];then
    toplevel
else
    toplevel < $1
fi

まとめ

 Grassをシェルスクリプトに変換して評価するとシェルスクリプトが得られ、それを評価すると…という方法でGrassを実装してみました。前述のとおり、サンプルも実行しきれない効率の悪さなので、awk版を元に作り直したほうがまともなものになると思います。

 そもそもが、「シェルスクリプトはLispの方言」「自分を評価することができるんです」の2ネタをやりたいがためのネタ実装ですので、ご了承ください。そうそう、「シェルスクリプトはLispの方言」はもちろん冗談ですので、念のため。

bashのreadで「\」が消える件

$ echo 'a\bc' | (read s; echo $s)
abc

 ありゃ。

$ echo 'a\bc' | (read -r s; echo $s)
a\bc

 あーよかった。

 ということを自分は知らなかったのでメモ。

「幕末の明星 佐久間象山」

幕末の明星佐久間象山 (講談社文庫 と 21-16)
童門 冬二
講談社
売り上げランキング: 27446


 佐久間象山って幕末の偉人らしいのだけどそのへんの知識がなくてよく知らなくて、マンガ「風雲児たち」で強烈な俺様キャラを発揮しているのが(見ているぶんには)面白い。ので、本書を書店の店頭で見て、読んでみた。

 こういう伝記では、人世訓とかビジネス訓とか美談とかが期待されるのだろうし、著者もそういう方向に持っていこうとしている様子が見えるのだけど、やっぱりあのキャラだけあってそうはいかない。が、逆にそれが面白かった。あと、本書によると、佐久間象山は陽明学(実践主義)を徹底して嫌う朱子学者であり、国際的な視点を持ちながらも基本は尊皇攘夷論者であるというのも興味深かった。

「ヤクザマネー」

ヤクザマネー
ヤクザマネー
posted with amazlet at 08.09.06
NHK「ヤクザマネー」取材班
講談社
売り上げランキング: 37070

 銀行やVCに代わって暴力団がベンチャーに資金を提供し、また巨額の資金を元手にデイトレードなどして大きな利益を得ている…という、NHKスペシャルで反響を呼んだ話が、再構成されて書籍になった。

 前半では主に闇勢力が金を貸したり株取引したりするグレーな話、後半では闇勢力が企業を食い物にするブラックな話と、大きくわけて2つの話からなる。どっちにしても、白紙委任状とか仕手戦とか循環取引とか、怖いですね。いや、よくわかりませんが。

 以下、本書からのメモ。

  • ヤクザのディーリングルーム
    • ヤミ金融、バカラ賭博、オレオレ詐欺などの売上を元手に、デイトレードで1日3億円を動かす
    • 元サラリーマン兼デイトレーダーがスカウトされてトレーダー
    • 組織の情報網で、企業の新規事業や合併、買収などの動きがかなり早く入ってくる
      • 「イカサマ賭博っていうのは、昔から我々の専売特許なわけよ」
    • ホームレスを使って証券講座を作る
  • 仁義を重んじる昔気質のヤクザ「おやっさん」も株取引
    • 「力っていうのは、ケンカだけじゃないから、いま」
  • ブラックエンジェル
    • 企業に投資する暴力団
    • ライブドア事件以降、資金調達に困ったベンチャー企業が頼る
      • 遅くとも3日以内、現金(速いカネ)
    • 投資先の「身体検査」
      • 社員と一席設けて会社の話を聞き、情報を丸裸にする
        • 経理の情報
        • 代表者の私生活:愛人関係も含め
        • 社員というのは代表取締役の悪い話を言いたがる
    • 投資とひきかえに全株をとる
      • いつでも代表者の首をすげ替えられる
    • 投資とひきかえに、実印つきの白紙委任状をとる
    • ジャスダックNEO設立計画も早い段階から知っていた
    • 投資を受けるベンチャー企業のインタビュー
      • 投資を受けて開発したIT関連機器が若者にヒット
      • 銀行やVCは審査が厳しく、時間がかかりすぎる
    • 政治家の選挙資金も貸す
  • 闇勢力の食い物にされた会社
    • 闇勢力の関与が囁かれたケースの多くで、企業が増資を実行している
    • ゼクー事件
      • 投資会社に株を発行して資金を調達する
        • その株はヴァージン諸島のファンドに
      • 3つの記号に株を発行するが、実は増資の直後から株を手放す
        • 投資ブローカー(大場武生?)が一般人の名義を借りて株をゆずり受ける
        • 録音テープ「ゼクーのカネ、自由になるんやもん」
      • 増資のうち7割ぐらいが暴力団関係の金
        • 増資と同時に取引先への払出として、その金が元に返っていく
  • 共生者(ゴト師)
    • 暴力団が元証券マンや外資系金融マンを仲間にして株取引
      • バブル崩壊であぶれた証券マン
    • 投資先の企業の経営者と交渉し、市場価格より安い価格で株を手に入れる
      • 株価を上げたい経営者
    • 仕手戦で一般投資家を誘い込む
    • 海外の投資ファンドを自分たちで作ってオフショア取引
      • カネの出所をわからなくする
      • 暴力団のカネは、最低3人ぐらいの投資家を間にはさんでから、ようやく海外の投資ファンドに入れる
    • 武闘派ヤクザも共生者と組んでシノギ
      • 「カネがなくなったら組もなくなりますから」
    • 銀行から資金を引き出すためのダミー会社
      • 商工会議所の会員になり、応接室にプレートを飾る
      • 偽の表彰状
      • 銀行の融資担当者が来るときは、闇の職安サイトで「社員」を集める
        • 元銀行員や元公認会計士
    • 失踪する共生者
      • うまくいっているときは何も言われないが、失敗すると「穴埋め」させられる
  • 暴力団も貧富の二極分化
    • 元チーマーのヤクザ
      • チーマー時代に仲間だった金持ちのボンボンが会社経営者になり、儲け話を持ってくる
  • 証券監視委 市場分析審査課のチェック
    • 出来高が増加しながら株価が上昇していて、株価に影響する情報がみあたらないケース
    • 好材料となる情報が発表される以前に出来高が急増するケース
    • 新興市場の銘柄の株主にタックスヘイブンの海外ファンドが名を連ねているケース
      • 「不公正取引に手をそめる、ちょっと悪い奴は間違いなく海外を使う」
      • 「BVIのペーパーカンパニーなんて十数万出せばネットですぐにつくれてしまう」
  • 暴力団コネタ
    • みかじめ料を取る名目として「親睦会の会費」
      • スカウトの子だと安いと1か月5,000円(1日150円ちょっと)
    • 暴力団の世界では、組織や人物の名前を直接呼ばずに、地名で呼ぶことが多い
    • 「通達文」「破門状」も携帯メールでやりとりされる

「宗像教授異考録」8巻



 鉄と古代史をメインテーマとする民族学者、宗像教授が活躍するシリーズ。そろそろ「伝奇考」を量で越えたんじゃなかろうか。

 「配線」は、ちょwwその鉄かよwwwと。でもしみじみとした話。

 「九呂古志家の崩壊」は、このシリーズで定番の一つ目ネタで、違う由来を導く話。ぐぐってみると、実際にそういう説があるらしい。

 「失われた島」は、江戸時代に沈んだ島の伝説を、鉄の歴史を軸に解題する話で、面白かった。

「極道めし」3巻



 同じパターンのくりかえしとはいえ、改めて夢中で読んだ。

 設定は、刑務所に収監された受刑者が、互いのメシ体験を順番に語り合い、聞き手にゴクリとさせた者が勝ちという、百物語っぽいよくある話。それぞれの話から、苦労したショボい人生が透けて見えるという、演歌的ながら、むしろ落語的なものを感じさせる話芸がいい。

 今回は第3弾として、317号室編に突入。

「喰いしん坊」20巻



 北京五輪にあわせて、台湾の喰輪杯の話。なにかにつけて各国ネタでセリフを回すところは、お約束か。アメリカのオバチャンが伏線になるようなならないような、はたまたどうでもいいような。

「弁護士のくず」7巻



 ちょっと前のドラマ化とか、盗作騒動とか、なにかと話題になってるマンガ。

 最近定番の裁判員制度ネタではあるけど、「裁判員といっしょ」編が面白い。このシリーズなので、裁判員側に焦点を当てて、リストラ寸前のサラリーマン、キレるオヤジ、自分が冷静で流されないと思っている流されやすい人などを登場させて、下世話な視点から問題点を提起している。

 「あなた以外の人には代わりができないとかじゃないとダメなんじゃない?」「代わりがきくから困っちゃうんだよっ!」で吹いた。

「クロサギ」20巻

 「ヘッドハンティング詐欺」「M&A詐欺」の2編を収録。最近のパターンで、短めの話+それを引き継いだ長めの話で2:3ぐらいにする構成。詐欺師が自分とまったく同じ手にひっかかるって実際にあるんでしょうか、とかいうのはさておき。

 メモはネタバレなので、続きを読むで。

続きを読む »

Bash on Railsを作る(14) splitの研究 in bash

 「splitの研究」「splitの研究 in PHP」という流れを見たので、bashでやってみます。

 もちろんネタです。ネタついでに、半年ぶりに「Bash on Railsを作る」シリーズにしてみます。

IFSで分割

 bashの場合、変数IFSに設定されている文字のいずれかで、forやread、位置パラメータ、配列などが区切られるようになっています。

 ただし、IFSを変更すると影響が大きすぎます。たとえば、以下の例では何が起きたのでしょうか。

$ IFS=,
$ echo $IFS

$

 そのため、拙作「Bash on Rails」では、SHas(Active Supportもどき)でラッパー関数string_splitを用意しました。

function string_split() {
    local separator=$1
    local str=$2

    local IFS=$separator
    result_val=($str)
}

 bashの制約により、結果はグローバルな配列変数result_valに入れて返すという、ださい仕様になっています。

 ちなみに、bashのlocal変数は動的スコープです。

普通に分割

 もちろんbashを起動して調べてみます。

$ string_split ',' a,b,c
$ echo ${#result_val[@]} items
3 items
$ for e in "${result_val[@]}";do echo "$e";done
a
b
c
$

末尾の空要素は省略される

$ string_split ',' a,b,c,
$ echo ${#result_val[@]} items
3 items
$ for e in "${result_val[@]}";do echo "$e";done
a
b
c
$

 ちなみに途中の空要素は拾われます。

$ string_split ',' a,,,,b,c
$ echo ${#result_val[@]} items
6 items
$ for e in "${result_val[@]}";do echo "$e";done
a



b
c
$

空文字列だと結果も空

$ string_split ',' ''
$ echo ${#result_val[@]} items
0 items
$ for e in "${result_val[@]}";do echo "$e";done
$

空文字列に対して分割パターンも空文字

 同じです。

$ string_split '' ''
$ echo ${#result_val[@]} items
0 items
$ for e in "${result_val[@]}";do echo "$e";done
$

分割パターンが空正規表現/分割パターンが正規表現の .

 正規表現ってなんですか?(笑)

 以上、実生活には役に立たなそうな研究でした。

「LL Future」に参加しました

 スクリプト言語の集まるイベント「Lightweight Language Future」に参加してきました。チケット購入者が1,000人以上、来場者でも800人以上が集まり、10時から21時近くまで盛り上がりました。

 詳細なレポートはすでにいくつか上がっているので、すべて面白かったセッションの中から、自分なりに感じたポイントをいくつか。

1. 純プログラミング寄りに

 今年は各言語それぞれの最新動向を解説するLanguage Updatesセッションがなくなっていました。それもあってか、ちょっと前にブログ界隈で話題になった「プログラムを作る人とアプリケーションを作る人」の分け方でいうと、前者向けの内容が多かったように思います。実装系の話は、言語ごとの勉強会が充実しているからそちらで、ということもあるのかもしれません(ただの憶測です)。

2. フィジカルコンピューティングがアツい

 「LLでアート」は、正直それほど期待してなかったのですが(ごめんなさい)、見てみたらとても面白かった。画面上の3Dオブジェクトを、加速度センサーの載ったGainerにシンクロさせて動かすデモを、ライブコーディングで見せるとか。試着シミュレーションがまるで鏡のようにできる液晶ディスプレイとか。筋電流を拾って、ダンサーの動きに合わせて音が鳴るとか。

 なにより忘れちゃいけないのが、LTの「Ruby on Railsで実現する自走式Webサーバー」。サーバー(ThinkPad+Debian+Ruby on Rails)をラジコンカーのシャーシに載せて、フルタッチスクリーン型リモコン(つまりiPhone)からコントロールするというネタを、記者発表ふうに演じて、場内爆笑。その勢いで発表された、拡張現実(電脳メガネみたいなの)で表示されたリアルはてなスターをゲットしにいく「Cyber Star Rally」もすごかった。

 あと、パネルディスカッション「LLで未来を発明する」では、「ユーザーはプログラミングの必要がなくなる」という一連の意見の中で、「CPUがGC(メモリ管理)や並列化などの機能を受け持つようになる」という話があって、未来では言語やOSの開発者は今でいうマイクロコードやHDL相当のレイヤーでプログラミングするようになるのかな、と漠然と思いました。

3. 言語の相互乗り入れ

 Larry Wallの基調講演は、Perl 6のRuleとそれによるパーサーの話。Perl 6はmany languageであり、言語の中の言語としてPerl 6自身の文法を設計できるというような話だったような(英語がよくわかってませんが)。実例として、正規表現のようなパーサージェネレーターのようなソースを見せて、「+-」という演算子を定義してみせたりしてました。あいかわらずメタと対象とを自在に行き来するプレゼンスタイルで、わかったようなわからないような(笑)。ちなみに、プレゼン途中でtakahashi.xulをいじってたような気がします。

 パネルディスカッション「LLで未来を発明する」では、ひげぽんさんのジョークで「言語大統一理論で“やっぱりLisp”ということに」というネタが出たほか、住井さんが「最近は言語がそれぞれの機能を取り入れあっている」という指摘もありました。

 パネルディスカッション「古い言語、新しい言語」では、JavaScript/ActionScript上でほかの言語の処理系を作った詳細が紹介。高校生で処理系開発なんてすごいなぁ。また、LLVMという、いろいろな言語からバイトコードにコンパイルし、各ネイティブコードに変換して実行する汎用言語処理系(?)が解説されました。CのソースからFlashのバイナリに変換するなんてのもあるそうで、Cで書かれたゲーム(DOOM)をFlashで動かす動画がデモされていました(ライブラリはどうしているんだろう)。

 LTでも、「Unbabel:LLにLLを埋め込んでみた」という発表が登場。Ruby中にHaskellを埋め込むRubiskell(ただし1行ごとにHaskellインタプリタを起動する)や、その発展形でさまざまな言語に対応したUnbabel(Ruby in Scheme in RubyとかRuby 1.8 in Ruby 1.9とかまで)が笑いをとっていました。

その他コネタ

  • 「サイコー?! フレームワーク」のQ&Aで、Debianで日本のソフトを精力的にパッケージ化しているhenrichさんが、「Debianのパッケージシステムとgemsとの整合性をとるのが大変」という問題提起。で、最新版を使いたい人はLinuxのパッケージを使わずgemsを使う、という話を経て、逆にMobaSiFをDebianパッケージにどうかという話に発展していました。
  • NewtonScriptってJavaScriptっぽいですね。JavaScriptの元ネタのひとつなんでしょうか(よくわかってない)。
  • 次回は同じく中野ZEROで2009年8月29日。
  • 「キミならどう書く?」のdd+lsネタで、幸運にも、会場の笑いと「またお前か賞」をいただきました。Yuguiさんの話芸のおかげですね。ありがとうございます。

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

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

Monthly


FC2Ad

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