2012年6月25日月曜日

Powershellで2点間の距離計算

PowerShell覚え書き

背景

 個人的お遊びです。地球上の2地点間の距離を計算してみたくなりました。

お題

 地球上の2地点について、Google Geocoding APIで住所から緯度経度を取得し、その距離(キロメートルとマイル)を計算して表示する。

param( [String]$address1="関西国際空港",[String]$address2="北京国際空港")

$radius = 6378.137 #地球の赤道半径(単位:キロメートル)

function address2latlng([String]$address)
{
    $encoded_address=[System.Uri]::EscapeDataString($address)
    $google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                            $encoded_address+"&sensor=false&language=ja"

    $enc = [System.Text.Encoding]::GetEncoding("utf-8")
    $bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
    $xml=[XML]$enc.getString($bytes)
    $xml.GeocodeResponse.result|
        %{ @{ lat = $_.geometry.location.lat; lng = $_.geometry.location.lng; address = $_.formatted_address} }
}

function sin($r){[math]::sin($r)}
function cos($r){[math]::cos($r)}
function acos($r){[math]::acos($r)}
function d2r($d){ $d /180 * [math]::pi } #degreeからradianに変換

function distance($latlng1,$latlng2)
{
    $x1 = d2r $latlng1["lng"] ;$y1 = d2r $latlng1["lat"]
    $x2 = d2r $latlng2["lng"] ;$y2 = d2r $latlng2["lat"]

    $delta_x = $x2 - $x1
    $radius * (acos ( (sin $y1) * (sin $y2) + (cos $y1) * (cos $y2) * (cos $delta_x) ) )
}

$l1 = address2latlng $address1
$l2 = address2latlng $address2
$d = distance $l1 $l2

$l1;$l2;
$d.ToString() + "km"
($d/1.609334).ToString() + "mi"


結果

    Name Value
    ---- -----
    address 日本, 〒549-0001 大阪府泉佐野市泉州空港北1 関西国際空港
    lat 34.4348875
    lng 135.2443930
    address 中華人民共和国 北京 朝陽区 首都国际机场 (PEK)北京首都国際空港 (PEK) 邮政编码: 100621
    lat 40.0753910
    lng 116.5921350
    1763.70556211725km
    1095.92263763597mi


メモ

  • 2点間の距離についてはこのページを参考にしました。この計算は地球が完全な球形と仮定している(今回は赤道半径を使用)ので、実際とは誤差が出るそうです。(極半径は赤道半径より約21km小さいので、計算結果は極に近づくほど実際より少し大きめになる)
  • 関西国際空港と北京国際空港の場合にはマイレージ表とほぼ一致するのですが、成田国際空港と北京国際空港ではけっこう(10マイル以上)誤差が出ました。計算の誤差なのか、マイル計算が前提とする空港の緯度経度がgeocoding apiの結果と違うのかは不明です。おそらく後者なんでしょうね。(数10mから1km以下のような短距離については特に誤差が確認できなかった。)
  • 距離計算の式を完結にするために三角関数のラッパー関数を定義しましたが、単純に[math]の関数を呼び出しているだけなので冗長な気がします。javaのimportのようなやり方はないものか。
  • 手元のマシンではdistance関数1回あたり2.3msかかっている。遅いが、[system.math]の問題か。


2012年6月20日水曜日

Geocoding APIで緯度経度を取得

PowerShell覚え書き

背景

 完全に時代錯誤かもしれませんが、これまで個人的にWEB APIと無縁でした。遊びはじめたら色々とあるので、とりあえず基本的なことからメモしておきます。(本当はGoogle Mapsで色々やってみたいのですが、時間がかかりそうなので。)

お題

 Google Geocoding APIで住所から緯度経度を表示する。

param( [String]$address="千代田区北の丸公園")

$encoded_address=[System.Uri]::EscapeDataString($address)
$google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                        $encoded_address+"&sensor=false&language=ja"

$enc = [System.Text.Encoding]::GetEncoding("utf-8")
$bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
$xml=[XML]$enc.getString($bytes)
$xml.GeocodeResponse.result|
    %{ "lat:"+$_.geometry.location.lat+" lng:"+$_.geometry.location.lng+
    " address:"+$_.formatted_address }
    


結果

lat:35.6905448 lng:139.7546424 address:日本, 東京都千代田区北の丸公園

メモ

 リクエスト送信は最初System.Net.WebClient.DownloadData(URI)でやっていたのですが、日本語データが含まれる場合にXMLへのキャストに失敗(XmlDocumentに変換できません。)したために上記の方法に変更しました。
 また、上記ではXMLで結果を受け取っていますがGeocoding APIとしてはJSON形式(推奨)でも受け取る事が可能です。PowerShell3ではJSON対応のコマンドレットが追加される予定ですので、いずれはJSONで実装したいと思います。

2012年6月19日火曜日

子育て日記:流血の日々

この1ヶ月ぐらいの間にボーズ2号(ほぼ2歳)が立て続けにケガをした。幸いどちらも大したことはなかったが、2歳でこうだと先が思いやられる。
 一回目は例によってお年ごろのイヤイヤの最中に私の部屋に泣き叫びながら入ってきて、飛び跳ねた拍子に机の角の尖ったところに眉間を強打し、どかっと流血した。7〜8ミリ程度の小さな切り傷であったが顔の目立つところなので幼児向けの大きな病院に連れて行ったが、傷の形がスパっと切ったというより凹んだような形なので縫うことができないとのことだった。このまま消えてなくなってくれれば良いのだが、最悪はブルースハープの名手リトル・ウォルターのような三日月傷になるかもしれない。喧嘩っ早い人間にならなければ良いのだが、、。
 二回目は一人で静かに遊んでいる時にいきなり「ギャー、イタイ、イタイ!」と叫びだしたのが発端だった。その時は嫁さんも私もどこが痛いのかよくわからずとりあえず泣き止んだので放っていたのだが、翌日になって片耳の穴が血だらけであることがわかった。どうも、プラスチック製のおもちゃの部品で自分の耳の穴をホジホジしていて、耳から抜くとき?にケガをした模様である。日曜日だったが、開いている耳鼻科を探して連れて行ってお医者様に見てもらったところ幸い鼓膜には別状なさそうという結果であった。ただ炎症を起こしているため現在も抗生物質を飲ませているところである。
 それにしても、ボーズ1号と比較しても2号は行動が大胆なので暫くは厳戒態勢の日々をこれからも敷かざるを得ない。やれやれ。よろしく頼むよ。ボーズ2号。

2012年6月15日金曜日

スポイルされないこと

縁があって今日は中学高校時代の同級生と卒業以来26年ぶりに会い食事をしてきた。私の人生の中でもこれだけ長いあいだ連絡も取っていなかった人と会うことは初めてのことであり、なにか書いておこうと思う。
 彼も私も6年間寮生活をしていた。全寮制の学校ではなく実家が学校まで遠い生徒だけが寮に入って、文字通り寝食を共にする生活だった。学校はスパルタ式教育などと呼ばれていた厳格な校風であり、学校生活も寮生活も当時としてもかなり尋常ではない厳しい(軍隊の時代にタイムトリップしたような)環境で育てられていた。誰でも1年に数回は先生や先輩に殴られていたし、そのようなことは日常生活の一部だった。ただ今にして考えると学校や寮の先生達は第二次世界大戦を直接経験した世代であり、我々生徒たちは戦時中の日本人が持っていたある種の美意識を教育されていたのかもしれない。
 6年間の途中で増えたり減ったりしたが寮の同級生は全部で15名ほどであり、多感な時代だから馬鹿なことも相当やったし趣味のことでお互いに影響を与え合っていたが、内心では1日も早く寮からも学校からも離れたいとおそらく全員が考えていただろう。(Jimi Hendrixの演奏が有名な)Bob Dylanの名曲All Along the Watchtowerの始まりが"There must be some kind of way out of here."だったが、まさにそういう心境で無限に続くかのような長い日々を送っていた。だから同級生たちは同じ戦場で戦った者同士のような結束感を持つと同時に、思い出したくない過去を背負わされていたんだと思う。
 そのような寮や学校での生活の中で得たことは人それぞれ違うだろうが、久しぶりに悪友とあって改めて認識したのは結局「けっして誰にも社会にも自分はスポイルされない」という信念を持って卒業したということである。長く生きれば当然山あり谷ありではあるが、そういうコアな部分は忘れないようにしたいと思う今日の夜でした。

2012年6月13日水曜日

Google Chart APIでQRコードを表示してみた

PowerShell覚え書き

背景

 GoogleのAPIを見ていたらChart APIというのが結構充実していた。世界地図とか各国の地図とかも表示できるらしい。今回はQRコードを表示してみました。こじんまりと。

param( [String]$uri="http://flyerback.blogspot.jp/")

$encoded_url=[System.Uri]::EscapeDataString($uri)
$google_chart_api_uri="http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl="+$encoded_url

$ie = new-object -com internetexplorer.application
$ie.navigate($google_chart_api_uri)

while($ie.ReadyState -ne 4){}
$ie.visible = $true    



結果

 新しくInternetExplorerが起動され、以下のとおり表示されました。


2012年6月12日火曜日

Powershellでお天気API(非公式)の使用

PowerShell覚え書き

背景

 iGoogleのお天気ガジェットで使用している非公式のgoogle Weather APIがあるということで、使ってみました。とりあえず、メモしておきます。

$location="東京都武蔵野市"
$encoded_location=[System.Uri]::EscapeDataString($location)
$google_weather_uri="http://www.google.com/ig/api?weather="+$encoded_location+"&hl=ja"
$xml=[XML](New-Object System.Net.WebClient).DownloadString($google_weather_uri)

"【場所】"
$xml.xml_api_reply.weather.forecast_information.city.data

"【現在】"
$xml.xml_api_reply.weather.current_conditions|
    %{ "気温:"+$_.temp_c.data+"度 "+$_.humidity.data+" "+$_.wind_condition.data+" 天気:"+$_.condition.data }

"【予報】"
$xml.xml_api_reply.weather.forecast_conditions|
    %{ $_.day_of_week.data+"曜日 気温:"+$_.low.data+"度~"+$_.high.data+"度 天気:"+$_.condition.data }

実行結果

【場所】
Musashino, Tokyo
【現在】
気温:16度 湿度 : 88% 風: 北 10 m/s 天気:弱い雨
【予報】
火曜日 気温:15度~22度 天気:雨
水曜日 気温:16度~24度 天気:雨の可能性
木曜日 気温:16度~24度 天気:ところにより晴れ
金曜日 気温:16度~26度 天気:ところにより晴れ


メモ

 $locationのところに指定している場所名はどこまで対応しているのか不明です。

子育て日記:時間感覚を覚える(戦隊モノ大好き幼児向け?)

ボーズ1号(5歳1ヶ月)は、どうも数字と時間に弱いように思うが、新たな方法で少し良くなってきた。
 1から100までを口頭で数えるのはだいぶ前からできていて、数字も100までは書けるのだが、「101」を書きなさいといってもうまく書けない。また、ずっと言っているが時間の読み方がわからない。3時(おやつの時間)と7時30分(見たいテレビの始まる時間)と9時(寝る時間)だけは読めるのだが、どうも形で覚えているだけである。おそらく、数字を知識としてまる覚えしているだけで数字の感覚というものがないようだ。
 そこで最近編み出した方法、必殺「あいぼう」である。現在テレビでやっている戦隊モノのゴーバスターズにはそれぞれのヒーローは相棒と呼ばれる機械とペアとなって活動する。うちの場合はキッチンタイマーを相棒として使用し、歯を磨くとき、ご飯を食べるとき、等々いろいろな場面で相棒と一緒に生活するようにさせたところ、時間感覚を覚え始めたようだ。また、だらだらご飯をたべることもなくなったし、今のところ効果絶大である。(でも、これって子供だましなのかなぁ。子供ってシタタカだからわかってるだろうなぁ。)
 偶然見つけたやり方とはいえ、このまま改善していってくれたら良いのだが。ま、要は子育てに銀の弾はないので、臨機応変に親も頭を絞ってやっていくのが大事ということか。

2012年6月11日月曜日

Powershellのスクリプトブロックと変数スコープに関する疑問

PowerShell覚え書き

背景

 先日PowerShellのクロージャを試してみましたが、結局スクリプトブロック内外の変数のスコープがいまひとつ腑に落ちなかったので少し検証してみました。結論は特にないのですが、自分のメモとして残します。

1.再帰呼出しでの階乗関数

function factorial1([int]$n)
{
    if ( $n -eq 1 ) {return $n}
    $n * (factorial1 ($n-1))
}

factorial1 5      # => 120
factorial1 100    # => 9.33262154439441E+157
factorial1 170    # => 7.25741561530799E+306
factorial1 171    # => +∞
factorial1 300    # => +∞
factorial1 998    # => +∞
factorial1 999    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 ごく普通の再帰呼び出し関数です。(末尾再帰になってません。)170!までは計算できましたが、[double]の精度を超えると無限大になりました。また、関数呼び出しの深さの最大値が1000までという制約があるために、998!より大きくなるとエラーが発生しました。

2.スクリプトブロックを使用した再帰呼出しの階乗関数

function factorial2_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $script:f}
        $script:f = $script:f * $i
        factorial2_helper ($i-1)
    }
    &$block $n
}

function factorial2([int]$n)
{
    $script:f=1
    factorial2_helper $n
}

factorial2 5      # => 120
factorial2 100    # => 9.33262154439441E+157
factorial2 170    # => 7.25741561530799E+306
factorial2 171    # => +∞
factorial2 300    # => +∞
factorial2 498    # => +∞
factorial2 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 スクリプトブロックにして、結果を保持する変数fを使うようにしました。関数をまたがって参照するので、変数fはスクリプトスコープです。また、関数呼び出しはスクリプトブロック化することで2倍に増えています。

3.クロージャに変更

function factorial3_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $script:f}
        $script:f = $script:f * $i
        factorial3_helper ($i-1)
    }.GetNewClosure()
    &$block $n
}

function factorial3([int]$n)
{
    $script:f=1
    factorial3_helper $n
}

factorial3 5      # => $null
factorial3 100    # => $null
factorial3 170    # => $null
factorial3 171    # => $null
factorial3 300    # => $null
factorial3 498    # => $null
factorial3 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 単純にクロージャにしたところご覧の通りエラーとなります。直接の理由はスクリプトスコープである変数fが参照できないためなんでしょうが、なぜクロージャの場合には同一スクリプト内なのに変数参照ができないのか不明です。

4.グローバルスコープに変更

function factorial4_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $global:f}
        $global:f = $global:f * $i
        factorial4_helper ($i-1)
    }.GetNewClosure()
    &$block $n
}

function factorial4([int]$n)
{
    $global:f=1  #ここはscriptスコープでも結果は同じ
    factorial4_helper $n
}

factorial4 5      # => 120
factorial4 100    # => 9.33262154439441E+157
factorial4 170    # => 7.25741561530799E+306
factorial4 171    # => +∞
factorial4 300    # => +∞
factorial4 498    # => +∞
factorial4 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 変数fのスコープをグローバルにしたらさすがに動きましたが、クロージャにしてもグローバル変数を直接さわっているのでナンセンスです。(もともとあまり意味はないんですけど。)

5.結果を持つ引数の追加

function factorial5_helper($i,$res)
{
    if ( $i -eq 1) {return $res}
    $res = $res * $i
    factorial5_helper ($i-1) $res
}

function factorial5($n)
{
    factorial5_helper $n 1
}

factorial5 5      # => 120
factorial5 100    # => 9.33262154439441E+157
factorial5 170    # => 7.25741561530799E+306
factorial5 171    # => +∞
factorial5 300    # => +∞
factorial5 997    # => +∞
factorial5 998    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 スクリプトブロックをやめて末尾再帰になるようにしましたが、実測した感じではどうも末尾再帰の実装(ジャンプ)にはなってなさそうな雰囲気でした。

結論

 クロージャから参照・更新可能な変数スコープはやっぱりわかりません。スクリプトスコープの変数でも参照できないことがあることということで、難しいですね。

2012年6月10日日曜日

100分de名著「変身(カフカ)」を見た

NHKのテレビ番組でフランツカフカ著「変身」を観たのでメモ。

1912年にプラハで執筆された短編小説(日本語でも約110頁)である。番組ではカフカの人物像や当時の出来事を明確にすることで、なぜこの不思議な小説が名著となったのかを明かしていく。
カフカは小説家として暮らしていたのではなく、大都会に住む裕福なサラリーマンであり、仕事の傍ら小説を書いていた。趣味と言うにはかなり本格的だが、晩年病気をするまでずっとそのスタイルを続けていた。しかし、小説の内容はどれも夢も希望もなく、ひたすら現状から逃げたいとか自分の欲することが永遠に実現されないといった所謂「絕望モノ」ばかりであった。もちろんハッピーエンドでもない。しかも、リアリズムな表現ではなく、荒唐無稽なあり得ないような設定で物語を構成する。
番組では結局カフカは全く希望のない完全な絕望を描くことで、読者の共感を誘ってきたのであり、自分の持つ弱さを理解することで普通の人には気がつかないようなことも気がつくことができるのだというようなことを結論づける。
私なりの観点で書く。現在の日本は戦後の好景気を支えた世代も既に引退し、経済、社会ともに混迷を極めており、自分がどうなっていくのか見えない漠然とした不安を抱えた時代である。このような時代にはいったいどのようなストーリーが有効なのだろうか。
1.現実逃避、日和見主義型のイージーなハッピーな世界
2.仮想現実や仮想組織の世界に身を委ね、現実とは別のその檻の中に住まう世界
3.戦後日本人のように燃える意思を持ち世界に立ち向かう世界
だいたいの場合はこのいずれかのように考える。しかし、カフカの場合には新しい価値観を提供しているように思われる。ある意味でチープなトリックに見えてしまうぐらいの迷いや絕望の世界を作ることで、自分の持つ人間性をありのままに再認識させているのである。私の経験でいうとインドの放浪旅というのと似ている。


2012年6月8日金曜日

PowerShellのイベント処理

Powershell覚え書き

背景

Powershellでイベント処理ができないかと思い実験してみた。実際にやりたいことは、例えばログ解析処理をする常駐型のスクリプトがあった場合に、入力元のファイルが定期的に切り替わったり、定期的に集計結果を出力したい場合に常駐プロセスに対して、切り替わりのイベントを伝える手段がないかということです。

お題

Powershellにeventというものがあるので使ってみた。
function loop
{
    while ($true) {
        write-host("Runnnig..")
        sleep 1
        if ( !$running ) {break}     
    }
    write-host("out of loop!!")
}

$running = $true

#タイマーイベント登録
$timer = New-Object System.Timers.timer
$timer.interval = 10e3 #10 seconds
#$timer.enabled=$true
Register-ObjectEvent -InputObject $timer -EventName Elapsed `
    -SourceIdentifier Timer_test -Action {write-host("Timer Elapsed:");$global:running= $false} >$null
$timer.start()

#ループ
loop

unregister-event timer_test

簡単に解説

 タイマーイベントを10秒毎に発生させ、フラグ($running)を使ってメイン処理のループの処理を止めさせようとした。 

結果

 とりあえず動かせたが、変数のスコープで強引なことをやらないといけなかった。メインの処理もイベントの処理も確かに動いているのだが、イベント側で実行しているローカルスコープやスクリプトスコープで$runningを$falseに設定しても、メインの処理には反映されなかった。とりあえず、globalスコープとしたが、反則かなぁ。
 ネットの情報を見てもこんなことをやっている例が見つかってません。どなたかまともなやり方をお分かりの方がいらっしゃれば情報いただけると幸いでございます。

2012年6月5日火曜日

PowerShellのパイプライン処理の並列性

PowerShell覚え書き

背景

ここ数週間PowerShellを少し触ってみて、動作中になにか違和感を覚えた瞬間が何度かありました。どうもパイプラインとプロセス/スレッドの対応関係が関連していそうなのでミニ検証をしてみます。PowerShell3にはワークフローや並列処理の記述が増えるということなので、まだシンプルなうちに根本的なところで理解を深めておきたいと思います。おそらく同じような検証をやっている人はたくさんいるでしょうけど、ネット上で検索してもうまく見つからなかったので。

パイプライン処理の並列性

UNIXのシェルスクリプトの場合には複数のコマンドをパイプラインでつなぐと、各コマンドのプロセスが起動され複数のデータを並列的に処理しますが、PowerShellではどうでしょうか。例えば、以下の処理時間は何秒でしょうか。
1..3|%{sleep 1;$_ }|%{sleep 5;$_}
これはUNIXの場合には約16秒(=1+5*3)なのですが、PowerShellの場合にはMeasure-Commandで実測すると約18秒になりました。
えっ、嘘でしょうと私も疑ったのですが、結果から見る限りそれが正しいようです。つまりPowerShellの場合にはパイプライン部分が並列的に処理はなされていないということになってしまいます。
例えば、データA、B、Cに対して処理ステップ1、2、3を実行するとした場合(各ステップの処理時間が同じ長さで、集約処理はしないと仮定)を図で表すとこういうことです。

想定:

=====================>時間
A1 → A2 → A3
_____B1 → B2 → B3
__________C1 → C2 → C3

実際:

====================================>時間
A1 → A2 → A3
______________B1 → B2 → B3
____________________________C1 → C2 → C3


追加検証

それでも信じられないので以下も試してみましたが、確かに上記の通りでした。また、さらにbegin,endの実行タイミングも想定と異なりました。
function step([int]$num,[int]$interval)
{
    begin{
        write-host((&"get-date").tostring() +" start(" + $num.tostring() +")")
    }
    process{ 
        write-host ((&"get-date").tostring() +" step(" + $num.ToString() +") " +$_ + " |")
        sleep $interval
        write-host ((&"get-date").tostring() +" step(" + $num.ToString() +") " +$_ + " V")
        "[" + $_ + "]"
    }
    end {
        write-host((&"get-date").tostring() +" finished(" + $num.tostring() +")")
    }
}

("A","B","C")|step 1 3| step 2 2 | step 3 1 
実行結果
2012/06/05 21:26:04 start(1) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 start(2) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 start(3) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 step(1) A |
2012/06/05 21:26:08 step(1) A V
2012/06/05 21:26:08 step(2) [A] |
2012/06/05 21:26:10 step(2) [A] V
2012/06/05 21:26:10 step(3) [[A]] |
2012/06/05 21:26:11 step(3) [[A]] V
[[[A]]]
2012/06/05 21:26:11 step(1) B |
2012/06/05 21:26:14 step(1) B V
2012/06/05 21:26:14 step(2) [B] |
2012/06/05 21:26:16 step(2) [B] V
2012/06/05 21:26:16 step(3) [[B]] |
2012/06/05 21:26:17 step(3) [[B]] V
[[[B]]]
2012/06/05 21:26:17 step(1) C |
2012/06/05 21:26:20 step(1) C V
2012/06/05 21:26:20 step(2) [C] |
2012/06/05 21:26:22 step(2) [C] V
2012/06/05 21:26:22 step(3) [[C]] |
2012/06/05 21:26:23 step(3) [[C]] V
[[[C]]]
2012/06/05 21:26:23 finished(1) #=>endは最後にまとめて実行される
2012/06/05 21:26:23 finished(2) #=>endは最後にまとめて実行される
2012/06/05 21:26:23 finished(3) #=>endは最後にまとめて実行される

結論

PowerShellのパイプライン記号の処理についてはいわゆる複数プロセスや複数スレッドでの並列処理ではなく、単一スレッドによる逐次処理である(少なくともそうなる場合がある)としか考えられない。これは私としてはショックです。オーマイガー!アイヤー吃驚了!
当初はモナドシェルと呼ばれていたPowerShellのことですから、関数型言語固有の理由があるのかもしれません。どなたか誤りがあればぜひご指摘くださいませ。

2012年6月2日土曜日

数学部の思い出

一昨日、結城浩著「数学ガール/ガロア理論」を購入しまだ読んでないが、昔のことを思い出した。個人的なメモとして残しておく。

 私は中学高校6年間は寮生活を送っていた。一貫教育の学校に入っていていたためそれが中学時代か高校時代かも覚えがないのだが、スポーツも特に好きでなく基本的には帰宅部のようなものだった。それでも短期間だが2つのクラブ・サークルに関わった。
当時アップルⅡやPC-8001が発売されたばかりで、コンピュータ系のサークルが当時まだなかったので、寮の友人(淡路島出身)とコンピュータを少し知っている先生を巻き込んで新しくサークルを創立した。当然学校にはPCが1台もなく、代わりに親に買ってもらったポケットコンピュータを使ってのサークル活動だった。私としてはとにかくプログラムが動くだけで楽しい時代で無目的に遊んでいるだけだったので、友人と意見が合わず結局あまりサークル活動らしいことはしなかったと記憶している。ホームページによるとその後もそのサークルが残っていて、今ではプログラミング全国大会に出場して優秀な成績を残しているそうだ。
 もうひとつは、多少の問題があるかもしれないが既に時効になっているので書いておく。クラブの名前は「数学部」である。ある日、寮の悪友(尼崎出身)が部屋に来て私に言った。「サークル活動じゃ学校からお金が出ないんやけど、クラブ活動やったら毎年お金がもらえるらしいで。数学部はいまメンバーがおらんから、オレが部長になる。お前は数学ができるから部員になれ。活動なんかせんでええ。予算を山分けにして小遣いにしようや。」数学はできないが悪知恵だけははたらく友人である。私も「なんもせんでええんやったら」と思って部員になった。
 実際に部員になり部の予算が分かったが、たしか年間でたった3千円か5千円ぐらいだったように記憶している。(ジュースの一本ぐらいはおごってもらったかもしれないけど、)その金は当然悪友の懐に入った。それで終わりだったらまだ良かったのだが、後から判明した事実があった。それは文化系のクラブの場合に文化祭で出展する必要があるということである。それも、文化祭の3日ほど前にである。各クラブごとに教室をひとつ借りてそこに出展するのだから、それなりにテーマを決めて展示をしなければならない。時間もないし知識もないので、図書室にあったガロアの本(ブルーバックスだったかな?)を元にガロアをテーマにすることになった。とりあえず、僕は画用紙にマジックでその内容を書き写すことにしたのだが、文字だけの展示だと地味すぎるということで悪友はまたひとつひらめいたらしく、「そや。美術部に顔だけの石膏像があったやろ。あれを持ってきて「ガロア」って書いて貼っておこう。」ということになった。たしかギリシャ時代のヒゲモジャの中年男性の石膏像だったはずだが、まあいいだろうということで、美術室に借りに行き、教室の入口近くの机に仰々しく黒い布を引いてその上に石膏像を置き、悪友が紙に「ガロア」と大書した。数学部としてはこの石膏像を展示の中心に持ってきたのである。
 ところが文化祭ギリギリになって判明したのは、ガロアが20歳で夭折しているということだった。ショックだった。石膏像はどうみても20歳の天才少年からはほど遠いではないか。いまさら石膏像をどけるわけにも行かず、そのまま文化祭は執り行われたのだった。結果的にはマイナーな数学部の展示にはほとんど誰も来ず、たまに見に来た先生もガロアの石膏像には目もくれていなかった。幽霊部員ならぬ幽霊クラブの二人としては安堵したのだった。

 さて、これから「数学ガール/ガロア理論」をきちんと読もう。クラブ活動の一環として。