2009/12/30

def max

github.com/midore/mdiary

個人が使うものなのであまり意味はないような気もするが、指定ディレクトリ内でのファイル上限数をもうけてみた。
bin/mdconfig に1ヶ月内に追加できるファイルの上限数を指定するメソッド default_file_count を追加し

mdconfig

def default_file_count
  90
end


当月ディレクトリ内のファイル数が default_file_count メソッドで指定した数を超えた場合
-a や -at でのファイル生成を抑制する。指定数に達している場合はその旨の文を返す。

万一、bin/mdconfig に default_file_count メソッドが存在しない場合(line 185)
ファイル上限数は 90 になる。(line 186)
1日平均2,3枚のファイルを生成すると仮定して 30 * 3

line 189 はなんかヘンなんだけど とりあえず...。

mdiary-main.rb
class Main

184     def max?
185       max = default_file_count if defined? default_file_count
186       max = 90 unless max
187       s = Dir.entries(@now_dir).select{|x| /\.txt$/.match(x)}.size
188       return false if s < max
189       print "too many files. Edit bin/mdconfig.\n"
190       return true
191     end


これに伴って
class Add < Main

221       return nil if max?

class ChoiceDir < Main

266     def base_view(n)
267       return nil if max?
...

273     def base_search(w, st=nil)
274       return nil if max?
...


としておいた。

あと

./mdiary-run.rb -s ""
./mdiary-run.rb -s ''

とかしたら無視するようにした。
line 132 あたり

2009/12/29

よみもの

ポール・グレアム「バージョン1.0
これ、めちゃくちゃおもしろかった。

「偉大な」執事とは何か?
と、小説の中の主人公が自問自答する場面を思い出した。なんでだろな...。あんまり関係ないと思うんだけど。

2009/12/28

unless a.nil?

このあいだ
github.com/midore/mdiary

mdiary-main.rb

378       return nil unless @st.nil? || @plus.nil?

だったのを

379       return nil if @st && @plus

に変えた。

前者と後者は同じ動きをする。どちらも
@st は nil ではなく、かつ、@plus もnil でなければ、return nil をかえす。

例えば

  1 # coding: utf-8
  2 
  3 a = 'a'
  4 b = 'b'
  5 print "a,b どちらも not nil です。\n" unless a.nil? || b.nil?
  6 print "a,b どちらも not nil でっす。\n" if a && b

実行すると

a,b どちらも not nil です。
a,b どちらも not nil でっす

となる。

前者(||を使用),後者(&&を使用)ともに

a は nilではない。かつ、b も nil ではない。
であれば print する。

と動く。ちょっと不思議だけど。

条件文が読みやすいのは && を使用した後者。
ただ、
if x
と書いて nil じゃなければとするより
unless x.nil?
と、nil なの?そうじゃないなら と書いてあった方が私にとってはわかりやすい時もあったりする。

...とはいっても || なのに「かつ」 を意図してるとなってると後になって自分がぎょっと驚いてしまうだろうから...変えた。

url for blogger-api

Blogger API 用
日付範囲を指定したURLの生成

line 10:
t に2010/12 が指定された場合、翌月は年も変わるので年に1加算し月にも1加算すると2011/1/1 が得られそこから1秒ひくと2010/12/31の23:59:59
になる。

Time だけ使った場合

  1 require 'time'
  2 
  3 def range_current_month(t=nil, bid)
  4   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  5   begin
  6     t = Time.parse(t) unless t.nil?
  7   rescue
  8     t = Time.now()
  9   end
 10   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 11   min = t.strftime("%Y-%m-%dT00:00:00")
 12   max = (Time.local(x[0], x[1], 1) -1).strftime("%Y-%m-%dT%H:%M:%S")
 13   return u + "?published-min=#{min}" + "&published-max=#{max}"
 14 end
 15 
 16 bloggerid = 'xxxxxxxxxxxx'
 17 t = '2010/12'
 18 p range_current_month(t, bloggerid)
 19 t = '2010/2'
 20 p range_current_month(t, bloggerid)

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


Date も使った場合

  1 require 'time'
  2 require 'date'
  3 
  4 def range_current_month(t=nil, bid)
  5   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  6   begin
  7     t = Time.parse(t) unless t.nil?
  8   rescue
  9     t = Time.now()
 10   end
 11   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 12   min = t.strftime("%Y-%m-%dT%H:%M:%S")
 13   max = ((Date.new(x[0], x[1], 1)) - 1).strftime("%Y-%m-%dT23:59:59")
 14   return u + "?published-min=#{min}" + "&published-max=#{max}"
 15 end
 16 
 17 bloggerid = 'xxxxxxxxxxxx'
 18 t = '2010/12'
 19 p range_current_month(t, bloggerid)
 20 t = '2010/2'
 21 p range_current_month(t, bloggerid)
 22 

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


もう少し短くできないかなと思うんだけど...。 ?

2009/12/20

class Search

github.com/midore/mdiary
の最近変更した箇所

$ ./mdiary-run.rb -st 'music'

を実行すると、ファイル content 内容に'music'を含むファイルがあるか検索する。
検索結果がゼロでなければ

1	[+] [2009/12/10 Thu AM 00:00:00] [music] (tower)
2	[+] [2009/12/11 Fri PM 17:04:36] [music] (diary)

と結果を返す。

この場合、
class ChoiceDir の中でSearch クラスを呼びだす。
mdiary-main.rb

252       Search.new(@word, @now_dir, st).base if @now_dir


Search の base method は、View の set_i_ary を呼び出す。
set_i_ary は、Search の get_diary を使用して一つづつファイルを処理する。

get_diary は @st が nil でなければ find_content にパス をわたす。
find_content はうけとったパスのファイルを一行づつ読み検索対象文字列を探す。
対象文字列がみつかった場合、ary_to_h をかえす。ary_to_h がかえす中身は Hash。
get_diary の中の to_obj は、Hash がかえってきた場合、その Hash をもとに Diary.new() する。

method "get_diary" in mdiary-main.rb

370     def get_diary(x)
371       begin
372         h = find_index(x) unless @st
373         h = find_content(x) unless @st.nil?
374         to_obj(h) unless h.nil?
375       rescue
376         return nil
377       end
378     end


method "find_content" in mdiary-io.rb

 38     def find_content(path)
 39       i, m = nil, nil
 40       a, mark = [], /^--content$/
 41       IO.foreach(path){|line|
 42         if line.match(mark)
 43           i = true; next
 44         end
 45         (i.nil?) ? a.push(line) : m = line.match(@word)
 46         break if m
 47       }
 48       return ary_to_h(a, path) if m
 49     end

2009/12/15

about-mdiary

mdiary について

有名な tDiary にあやかり mdiary と名付けた。
正式名称は「ま(m)だできてない diary」で mdiary ^^;

<特徴>
• ruby 1.9.1 が必要です。
• local (自分のコンピュータの中) で使うものです。
• home user 向けです。
• ちょっとしたメモ、雑記帳、todolist としても利用できます。
• vim を前提にしてますが mdiary-main.rb を一行変更するだけで他のエディタでもつかえます。
• 標準ライブラリ以外のライブラリに依存してません。
• gem とかいらないです。
• データベースを使用していません。
• marshal なども使用していません。
• キャッシュを作成しません。
• logfile ありません。
• ひょっとしたら軽いかも?
• まだ未完成です。

<使い方>
$ vim bin/mdconfig
ファイル保存先として利用したいディレクトリのパスを記入。
$ vim bin/mdiary-run.rb
ruby 1.9.1 のパスを一行目に記入(例:#!/usr/local/bin/ruby)

新規ファイル作成
$ ./mdiary-run.rb -at '2009/12/14 21:00'

一覧表示(ハイフン + 小文字のエル)
$ ./mdiary-run.rb -l

=>
1  [-] [2009/12/14 Mon PM 21:00:26] [about-mdiary] (draft)
2  [-] [2009/12/14 Mon PM 21:00:00] [about-git] (diary)
3  [+] [2009/12/14 Mon PM 20:00:00] [list] (book)
Select NO:


使い方の続きは REAME を...
$ git clone git://github.com/midore/mdiary.git
or
ブラウザごしにダウンロードもできると思います。
URL : http://github.com/midore/mdiary.git

force_encoding

ここを読んで
github.com/midore/amazon-jp-api
をなおした。

2009/11/07

numerical.rb

www.midore.net/daybook/2006/5-9/1159081162.html
を書き直し。

% cat numerical.rb

  1 # coding: utf-8
  2 # 2009-11-06
  3 
  4 str =<<EOF
  5 <?xml version="1.0" encoding="UTF-8"?>
  6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  7 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
  8 <head>
  9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 10 <title>数値文字参照</title>
 11 </head>
 12 <body>
 13 EOF
 14 
 15 n = ARGV[0]
 16 abort unless n
 17 abort if /\D/.match(n)
 18 (n.to_i..n.to_i+5).step{|x|
 19     str << "<p>#{x} => &##{x};</p>"
 20 }
 21 str << "</body>\n</html>"
 22 filename = 'numerical.html'
 23 # save file
 24 File.open(filename, 'w:utf-8'){|f| f.print str}
 25 # only OS X
 26 system "open #{filename}"


表示する数値文字は引数として与える数字から5を足した数までに制限している。line.18
数字の範囲は得に定めていないので、与える数字によってはすべて空欄にもなりうる。

% ruby19 numerical.rb '1100'


を実行すると実行ファイルと同じ階層に'numerical.html' ファイルが保存される。
OS X の場合、最終行でブラウザが 'numerical.html' を開く。
与えた数に対応する数値文字がブラウザに表示される。

1100 => ь

1101 => э

1102 => ю

1103 => я

1104 => ѐ

1105 => ё

2009/10/31

FXRecentFolders

Finder->移動->最近使ったフォルダ
に追加されたフォルダの削除

% cat delete-recentrolders.sh

#!/bin/bash

cd
defaults delete com.apple.Finder FXRecentFolders
killall Finder


# 実行権付与
% chmod +x delete-recentrolders.sh

# 実行
% ./delete-recentrolders.sh

参考
http://www.macosxhints.com/

2009/10/30

Book.new('1Q84')

村上春樹の『1Q84』が世間に投げかけた何かを仮に x として読者が感じ取ったものを仮に k とする。
k は抽象的概念を並べたものでもありキーワードの束のようなものとする。

これを Ruby で表現してみると

  1 # coding: utf-8
  2 
  3 class Book
  4 
  5   attr_reader :name
  6   attr_accessor :x
  7   
  8   def initialize(name)
  9     @name = name
 10     @x = nil
 11   end
 12   
 13 end
 14 
 15 class Reader
 16 
 17   attr_reader :booklist
 18   
 19   def initialize
 20     @booklist = Hash.new
 21   end
 22   
 23   def read(book)
 24     @book = book
 25     return self
 26   end
 27   
 28   def image(*k)
 29     @booklist[@book.name] = k
 30   end
 31   
 32 end
 33
 34 book1 = Book.new('1Q84-1')
 35 book2 = Book.new('1Q84-2')
 36 
 37 i = Reader.new
 38 i.read(book1).image('science','nation','man')
 39 i.read(book2).image('religious','language','female')
 40 p i.booklist


実行結果

# =>
# {"1Q84-1"=>["science", "nation", "man"], "1Q84-2"=>["religious", "language", "female"]}


@x には値を付与できるし値を読み取ることもできる。けれども値を付与できるのは作者以外にいない。そして Reader class は直接 @x の値を読み取る手段をもたない。@booklist の values は読者の抱いた感想に基づくキーワード群。それぞれ何かと対をなしていて二項対立とも同一概念の表裏とも光と陰とも言えるような値にしておいた。あえて加えなかったけれども Author class を作るとしたらそこには作者が値が付与できる @booklist があるはずだ。それは作家の頭の中にしか存在しないものなんだろうけど。

作ってみて一番面白かったのは、25行目 return self。 これは i.read(book).image('xxx') と記したかった為に必要だったからなにげなく書いたんだけど def read が self を返す(or 返す必要がある)なんて! ちょっとリアルな感じがした。

'science' のかわりに 'mathematic' の方がふさわしいような気もするし
'nation' のかわりに 'force' とすべきなのかなと迷った。
'female' のかわりに 'child', 'man' のかわりに 'soldier' にしてもよいような気もした。

『1Q84』を読み終えた読者が実際今何人なのか?なんて知る由もないが、仮にすべての読者が抱いたキーワードを全て寄せ集めることができたのなら、この本が抱えるキーワードの束は膨大な数になるんだろうなー。そして時間経過とともに読者数累計は増加してキーワードのエントロピーは増大していく。翻訳される言語が増えればなおさら...。それにキーワードはただ増えるだけじゃなく他の本とどんどんと繋がっていく。

たとえば
『知識人とは何か』( Edward W. Said / 平凡社 / 978-4582762365 )
に 『 若き日の芸術家の肖像 』( Joyce James )
からの引用がある。

p.46

「きみには、ぼくがすることと、しないことをおしえてあげよう。ぼくは自分で、もう信じていないもの、それを家庭と呼ぼうが、祖国と呼ぼうが、教会と呼ぼうが勝手だけれども、そういうものに仕えるつもりはない。ぼくがやってみたいのは、人生とか芸術をとおして、自分自身を、できるかぎり自由に、できるかぎりそこなうことなく表現することなんだ。そのため、自分をまもるのに使う武器は、三つにかぎることにするー沈黙、亡命、そして狡知」。


ここにある3つの単語は、『1Q84』が発する何かと強烈に結びついているように思えてならない。
狡知に対応するものが 'science' or 'mathematic'
亡命に対応するものが 'nation'
沈黙に対応するものが 'language'

それにしても、と思う。たくさんの小説家が巨大な渦に流され溺れてしまわないための自衛策についてあらゆるかたちで書き残してる。それこそ「そこなうことなく」しるされてる。

修正: 'femail' => 'female'

悪霊にさいなまれる世界

悪霊にさいなまれる世界 上 / Carl Sagan / 早川書房 / 978-4150503567
悪霊にさいなまれる世界 下 / Carl Sagan /早川書房 / 978-4150503574

この文庫本は2000年に「人はなぜエセ科学に騙されるのか」というタイトルで出版された作品で2009年7月に文庫化されたもの。

訳者の青木薫氏が「訳者あとがきに代えて」の中で

これまでも、たびたび、自ら行李を背負い、一冊一冊行商して歩きたいぐらいだと冗談めかして言ってきたが、実はそれは本音である。

と述べているのが印象深かった。

この訳者が手がけた本は過去にいくつか読んだことがある。どれも非常に面白かった。面白いばかりでなく「読者の1人として尊重されている」とすら感じた。
それはどういうことかというと....

科学分野の本(一般市場に流通する書籍)を書く人たちは、一般人への配慮に欠いていることがある。なぜならその方がより的確な単語を使用できるし効率的に話を進めることができるであろう、から。そこには本が作られる最初から一般人との境界線がある。そのような本は専門書店にだけ置いてあるわけではなく普通の書店にも並べられているので、私が何かの間違いで購入してしまった時、その都度私は自分を落第生だと改めて思い知らされマラソンを走る最後のランナーだと感じてきた。じっさい世の中は私にとって難しい本でみちみちているし。
たまには運良く少し理解できるようになることも稀にある。それはよほど意識的に関連本を探したり、うなりながら何度も繰り返し読んでみたり違う方向から探ってみることなしにはありえない。こういった読者の姿勢は独習することそのものだからそのように学ぶことを、億劫がったり嫌悪するべきではない、という考えは当然なことだとも思うけれども、一方で、難しいことをわかりやすい文章で説明し多くの人が理解しやすい内容の本に出会ってしまうと、なんというか、やっぱり深く感動する。小説を読み終わった後の感動となにも違わない。

そういった意味で「暗号解読」など青木薫氏が訳された一連の本は、読者である私に落第生だと感じさせるような真似は一切しなかった。私は最後まで興味深いマラソンを完走できてしまった。文系人間(高校生の時に文系か理系かの選択を迫られて文系を選択したという意味)の私でも科学ジャンルの本の面白さにフル参加できた...。これは当時非常に稀なことだった。この喜びは本の面白さともあいまって二重の楽しさを私にもたらしてくれた。ひとえに作者の人と訳者の人がわかりやすい文章を用意してくれたおかげだ。そこには科学者でも研究者でもないごく普通の一般人を尊重し信頼する気持ちが根底に流れているように感じた。だから、読者である私は

「読者として尊重されている」

と、思った。
(最近福岡伸一氏の著作にも同じ印象を持っている)

...以上のような経緯があり
この人が訳す本は面白いと認識している。そして実際今回も期待以上に面白かった。この本にこめられたカールセーガンさんの気合いと根気強さには驚くばかりだった。

懐疑的な精神を培うことは民主主義的な思考と矛盾しない。むしろ大切なことのようだ。加えて、もしもあなたが今なお数学や科学に対して文学や音楽に対するのと同じような興味や関心を抱けないでいるのなら、それはあなたの人生にとっても人類の歴史にとってもマイナスでしかない、とカールセーガンさんは言っているんだと思う。たとえこの本を手に取る人が何歳であろうともそんなことは全くおかまいなしに、知るとは科学的とはどういうことかについて改めて立ち止まって考えるべき機会を全ての読者に与えてくれると思う。愚かな権力者に対してストッパーとして役割を果たせるのは、結局1人1人の科学的な視点およびその総体なんだろうと思った。

nationalgeographic.co.jp

怠惰への讃歌-1

怠惰への讃歌 / Bertrand Russell / 平凡社 / 978-4-582-76676-9

新聞の書評欄に紹介されていたのを読んで(確か10月半ばあたり)珍しく素直に購入してみた。第四章まで読んだ

この本は、平凡社から2009/08/10 付けで出版されたものだが本の最初のページに 「1958年に角川文庫から刊行されたもの」だと記されている。作者のバートランド•ラッセル氏は数学者としても知られている人。

第1章 1932 年
第9章 1929 年
第10章 1930 年
第11章 1933 年
第13章 1928 年
第15章 1928 年

とあり1928年から1933年のあいだに書かれたもののようだ。

第一章で1日4時間労働説を読んだ。これにはちょとしたカルチャーショックをうけた。この説はたとえこの本に興味がない人でも知っていて損はないと思う。
そして、それにもまして興味深かったのが下記。

p.72

この気狂いじみた状態に対し、気狂いじみた解決を考えついた。ドイツに、ドイツが支払わなければならないものは何でも貸すときめたられたのである。
連合国が結局いいわたしたことはこうである。「私たちは、賠償をお前らから免除してやるわけにはいかぬ。というのは、それはお前たちの犯した罪悪に対する正当な罰であるからだ。さてまた、私たちは賠償を支払わせるようにしてやることはできない。そうすると、私たちの産業を破壊するからである。それで、私たちはお前たちに金を貸そう。そして私たちが貸したものをお前たちが返却するようにさせよう。この方法によると、原則は守られて、しかも私たちに損害はないだろう。お前たちに及ぶ損害についていえば、それをただ後まわししようと考えているだけだ」。だがいうまでもなく、この解決は、その場限りのものにすぎなかった。...


これはひどい話だと思った。

「インフレーション」という単語をガッコーのキョーカショではじめて目にした時、大量のお札を荷車にのせてそれを引っ張る老婆の白黒写真がそのかたすみに掲載されていたと記憶している。その写真の人はドイツ人だと習った気もする。その程度のことであとはほぼ忘れてしまっているんだけども、ここを読んでへぇーそんなことだったわけ?とちょっと驚いてしまった。ドイツに多額の賠償を負わせた。としか私は認識していなかったから。

p.74

私たちの不幸のもととなったしどろもどろの考え方は、消費者の立場と生産者の立場、もっと正しくいうなら、競争する組織の中の生産者の立場との間に起こった混乱である。賠償がドイツに課せられると、連合国は、自分たちを消費者だと思いこんだ。即ちドイツ人の生産したものを消費することができるのは、いい気持ちだろうと考えた。ところが、ヴェルサイユ条約が結ばれてしまって、彼らが俄に気がついたことは、自分たちも生産者であり、自分たちが求めているドイツの品物が流れ込むと、自分たちの産業が亡ぶだろうということだ。彼らは非常に困ったので、途方にくれ頭をかきはじめたが、何の役にも立たなかった。連合国側は一緒に集まって頭をかき、それを国際会議といってみても何にもならない。正直なところ、世界の支配階級が甚だ無智、愚かであるから、かよな問題を考えぬくこともできず、また甚だ鼻柱が強いから、彼らを助けようとする人々から注意をしてもらおうともしなかった。


え!...。ヴェルサイユ条約についてこんな風に書いてある文章には初めておめにかかった。これがある程度事実に即しているのならば連合国側は相当子供ぽいというか「あなたいくつですか」よばわりされても不思議じゃない程の愚行を行ったことになる。国際会議つったって商店街のおじさんたちの井戸端会議と大差のないような代物だったということにもなる。いや商店街のおじさんたちの方がよっぽど優秀だろうから大差はあるかな。これじゃたまらない気持ちになるし、これが歴史だと思いこまされてきたいくつかのことは詭弁だったのかと疑いたくなってしまう。

戦争がなぜ起きたのかを解説する本はたくさんあるし、何が事実で何が事実でなかったのかをできるかぎり正確に見分けようとするのは結構大変なことなんだけども、だからといってそれは永久に知ることができないものだと決めてかかるのもおかしな話だと、あらためて思ったりもした。

Black Swan

ブラック•スワン[上] / Nassim Nicholas Taleb / ダイヤモンド社 / 978-4478-00125-7
ブラック•スワン[下] / Nassim Nicholas Taleb / ダイヤモンド社 / 978-4478-00888-1
を読んだ。

上巻p.285

ある時...政治オタクを前に話をした。私たちは未来を正しく考えられない、いいかげん思い知れと言って、私は彼らに噛みついた。
お客は縮み上がって黙っていた。私はお前らの信じていることも、やっていることも全部間違いだと言ったのだ。私のほうは自分の客観的な主張に酔っていた。
...宗教会議に集まった枢機卿たちを前にした好戦的な無神論者みたいな気分だった。

とある。

この文章で上巻1冊の全てが言い尽くされているように思った。(ええ、そうですそうです。人は要約が大好き。)残りのページはこの文章を裏付けるための具体例に全て費やされているだけのような気がした。

上巻を読み終えて下巻を買ったことを後悔することってめったにないんだけどもそういう点で珍しい本だった。

読みながらストレスを感じることもあった。たとえば

p.134
私たちが、講釈に陥りがちな大本の原因がある。これは心理的なものではない。むしろ情報の溜め込みや読み込みを行う仕組みが及ぼす影響にかかわることである。確立論や情報理論の根本的な問題だと思うので、ここで説明しておくのがいいだろう。
第一の問題は、情報を手に入れるのにはコストがかかるという点である。....
第二の問題は、情報は溜め込むのにもコストがかかるという点である。...
第三の問題は、情報は複製したり取り出したりするのにもコストがかかるという点である。


とあって
情報理論学の根本的な問題として上記の3つが当然のように書かれてあるんだけども、はたしてそれは誰が言ったことで誰がとりあげていることなのかといった文章がない。情報理論を指さした以上はどういったところでそれが提唱されているかなど書かれるべきだと思うんだけども、そういった最低限の情報はこのページのどこにもない...。ない。

ここで述べられている「コスト」というのは例えばインターネットを使用する上で必要な電気消費量や電線であったり、10年以上前だったら古本屋をうろうろできるだけの脚力や電車代や気力がコストともいえるんだろう。いずれも「コスト」という変数におさまるべき値と想像できる。値が時代の変化によっていかに変化しようとも、情報を手に入れるためにはコストが必要なことにかわりはない。

といった考えをめぐらせ...p.134からp.136で作者が情報理論をとりあげてまで何を伝えたかったのか読み取ろうとしたが、私には困難だった。

この本の最初の方にこの本はエッセイだと述べられているので(上巻p.18)こういったストレスを感じる度に「ああそういえばこの本はエッセイでしたね」といちいち思いだす必要が生じた。

ということで、下巻はざぁーっと流し読みした。
印象に残った箇所としてあげるとすれば、p.63,p.64にあるバートランド•ラッセルの言葉の引用。だが、なんという著作物からの引用なのかは記されていない。これが本当にラッセルの言なのかすら確かめようがない。と思ったら下巻に参考文献一覧がありアルファベット順に人物名とその著書名があった。ラッセルの欄をみると3つの書物の名前が記されてある。けれどもp.63あたりの引用はこの3つのうちのどれからの引用なのかは明記されていない。はて...。

そしてもう一つ印象に残った箇所は
p.87

私はアップルのマッキントッシュを使っている。以前は、長年マイクロソフトの製品を使っていた。アップルの技術のほうがずっといいのに、質の悪いソフトウェアのほうが結局勝っている。どうして? まぐれのせいだ。

だった。

私もまぐれだと思っている。けれども実際に「まぐれだったのかどうか」は私がまぐれだと思うこととは全く「別」のことなんだと一般人の常識程度に理解しているつもり。おそらく、このような私の考え(別物だってこと)は、ナシーム•ニコラス•タレブ氏の主張する「人間は予想以上にバカだ論」とどこまでも交わることがない平行線なんだろうと思われる。

エッセイはそれをまに受けるか受けないかなんてことを考えながら読むべきもんじゃなく余韻を楽しんで読むべきなのですが、とても残念ながらこのエッセイは楽しんで読むには適していないようにみうけられました。

くちなおしとして
悪霊にさいなまれる世界 上 / Carl Sagan / 早川書房 / 978-4150503567
悪霊にさいなまれる世界 下 / Carl Sagan / 早川書房 / 978-4150503574

を読み直すのは有効。

2009/10/09

hash.nil? or hash.empty?

ハッシュが nil または empty だったら、error を返す一行の書き方をすぐに思い出せなかった。
基本に立ち返るべくテスト。

  1 # coding: utf-8
  2 
  3 def aa(h)
  4   p h
  5   return puts "error\n" if h.nil? || h.empty?
  6   return puts "ok\n"
  7 end
  8 
  9 h = Hash.new
 10 aa(h)
 11 
 12 h = nil
 13 aa(h)
 14 
 15 h = {:a=>'a'}
 16 aa(h)


テストして気付いた。5行目のところをついつい
return puts "error\n" unless h.nil? || h.empty?
と、書いてしまってたことに。どおりで一瞬ぎょっとする結果になるわけだわ。

でもよくみていたら「あっ」と思った。
hash は、nil を返すのかempty を返すのかは、最初からはっきり決めておくべきなんであって

... if h.nil? || h.empty?

なんて書かなくてよいようにメソッドを作るべきなんだ。
つまり

return puts "error\n" unless h


return puts "error\n" if h.empty?


どちらかしかありえないようにすべきなんだろう、と。
empty の場合もあれば nil の場合もありうるなんてことは回避した方が安全でわかりいい。

...そういえば、以前にもこの結論に至ったことを思い出してしまった。がっくり。

2009/09/30

configuration.com.apple

Apple が提供する有料サービスMobileMe (DotMac) を利用しているユーザはシステム環境設定の MobileMe をクリックするとAppleIDを入力することができる。私はこの有料サービスを利用していない。したがってシステム環境設定のMobileMe 内はすべて空欄になっている。

以下は私のようなMobileMeユーザでは「ない」人むけの話。

ある時、Safari が不穏な動きをしていることに気付いたらあなたはどう思うだろうか?

私が試したこと。
最初にSafari (Mac OS X 10.6.1 に付属する)の設定を下記のようにしてSafari が勝手にインターネットに出て行く行為を全て禁止する。

|一般|
新規ウィンドウを開く場合: 空のページ
新規タブを開く場合: 空のページ
ホームページ:空欄
履歴からの削除:1日
ダウンロード後”安全な..”:チェックをはずす
# "安全な"ファイルって何?といつも思う。
# 10.6 になってもデフォルトでここにチェックが入っているのは非常に残念な仕様。

|ブックマーク|
全ての項目のチェックをはずす。
MobileMeを使ってブックマークを同期:チェックなし

|RSS|
デフォルトRSS リーダー:Safari
自動アップデートする記事の登録場所: 全てOFF
アップデート後の確認:「しない」
#念のため「今すぐ削除」ボタンをクリックしておく

|自動入力|
全ての項目のチェックを入れていない。

|セキュリティ|
詐欺サイト: OFF
プラグイン: OFF
ジャバ: OFF
ジャバスクリプト: OFF
ポップアップ開かない: ON
クッキー:受け入れない

さらに
Safari メニューファイルからブックマークを書き出した後、全てのブックマークを手動で「削除」(ctr+A retrun delete key)
Safari メニューから「キャッシュを空にする」
Safari メニューから 「Safari をリセット...」
(ただしTop Site 以外. Top Site にチェックを入れると初期設定が呼び出されてしまうから)
Safari メニューから「Top Sites を表示」
1つも履歴がないことも確認する。
# もし履歴が1つでもあったら「編集」をクリックし1つ残らず削除する。

Safari を終了させておく。ターミナルを起動し

# キャッシュクリア
% rm -rf ~/Library/Cache/Metadata/Safari

# アイコンキャッシュクリアとアイコン読み込みの禁止
% defaults write com.apple.Safari WebIconDatabaseEnabled -bool false
% cd Library/Safari/
# WebIconData が存在していたら削除しておく
# ~/Library/Caches 内にマクロメディアフォルダがないことも確認


次に、システム環境設定のセキュリティのファイアウォール:入 になっているか確認する。
# ipfw のログはシステム環境設定のセキュリティのファイアウォールをオンにするとsyslog に反映する。

ターミナルから ipfw ルールを追加する。

$ su admin-user
$ sudo ipfw add 1000 deny log tcp from any to any


として TCP 使用を一時的に禁じる。
これによって
私が意識的にSafari からインターネットを閲覧せよとアプリケーションに命じたとしてもipfw はそれを許さない。
さらに
私がインターネットを閲覧せよとアプリケーションに「命じていない」にも関わらずtcp を使用したプロセスがあれば ipfw はそれを禁じる。

つまり
Safari が勝手にインターネットへ接続しようとしたら ipfw はそれをキャッチし禁止しログに残す、ようになる。

これで準備が整ったので
1, ネットワークにつなげ
2, Safari を起動する。
3, 私のSafari は設定したとおりに真っ白な空白ページを表示している。当然URL も空欄。
4, ログをみる

% syslog -w 
...
Firewall[xx] <Info>:  1000 Deny TCP xxx.xxx.xxx.xxx.:YYYYY 17.250.248.105:80 out via en1
...


5, 結果
私の期待に反して ipfw は 17.250.248.105 への接続を禁じたことを報告した。
繰り返して言うがSafari のURL は空欄である。私はどこにもアクセスして「いない」。

Safari に自動的にどこかにアクセスさせる設定もしていない。(例えば 新規ウィンドウを開いたときにつなげるページを指定していたりRSS で自動的に更新内容をとってこさせるようなこと)キャッシュもクリアしたばかりだしトップサイト履歴も全て削除してある。
にもかかわらず、Safari は私の意図に反して勝手に一意なIP に向けてTCP 80を発動した。念のため再度同じことを繰り返してみたが同様の結果だった。

Safari は起動するたびに勝手にどこかへお出かけになる。では、お出かけ先であるアドレスとは一体どこか?

% dig -x 17.250.248.105

#=>
#; <<>> DiG 9.6.0-APPLE-P2 <<>> -x 17.250.248.105
#;; global options: +cmd
#;; Got answer:
#;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1389
#;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
#
#;; QUESTION SECTION:
#;105.248.250.17.in-addr.arpa.  IN      PTR
#
#;; ANSWER SECTION:
#105.248.250.17.in-addr.arpa. 84399 IN  PTR     configuration.apple.com.
#
#...


17.250.248.105 のドメイン名は configuration.apple.com だとわかった。
configuration.apple.com は Apple がMobile Me(DotMac) 有料サービスに提供しているサーバアドレスのようだ

以上をふまえてまとめると

わたしはApple の有料サービスであるMobileMe を利用していない。したがってシステム環境設定のMobileMe に入力すべきAppleID もパスワードももちあわせていないので全て空欄。
ネットワークに接続した後に Safari 4.03 を起動した場合 Safari は確実に configuration.apple.com へアクセスする
Safari 4.03 の設定をどのようにしようともこれを免れることができない。設定いかんとは全く無関係にふるまっているようだ...。
ただし、ネットワークに繋がる前に Safari を起動しておき、その後にネットワークに接続した場合はこの限りではなく、10分後などある程度時間経過した後にアクセスするようだ。

ちなみに、最初にこれに気付いたのは ハードウエアを初期化し 10.6 をDVD からクリーンインストールしソフトウエアアップデートを終了しSafari を起動した時だった。クリーンインストールした直後なのにもうウイルスにやられたのか?と心配になり再度クリーンインストールしたが同じ結果だった。
# アンチウイルスソフトウエア導入済み。その他の市販アプリケーションは一切インストールしていない。

これではまるで全ての OS X 10.6 user イコール Mobile Me(.DotMac) user であるという大前提にのっとって Safari.app が作られており、常に MobileMe とブックマークを同期を試みているようにみえる。 Safari の設定で MobileMe と同期の「チェックが入っていない」ことは Safari には全く反映していないかのようだ。
いったい何の必要があって非ユーザにまで有料サービスサーバにアクセスさせるのだろうか。しかも Safari 起動の度ごとに。user がSafari をいつ起動しているのか調査でもしているのだろうか?
昔 マイクロソフトの Office というアプリケーション群はこれと似たような挙動をして大問題になったことがあった。そんな話を思いだしてしまった。
いずれにせよユーザが意図していない時にインターネットへアクセスするようなものはかなり不気味だ。

... それとも あくまでもこれは私のMac OS X 10.6.1 に「だけ」でみられる極めて固有の問題なのだろうか?...

MobileMe ユーザでは「ない」人は下の「ipfw を用いたちょとしたテスト」を試してみてほしい。
そして、私と同じ結果が得られたならこの件についてぜひ自分のブログなどに書いてほしい。

+++ 「10 分でできる ipfw を用いたちょとしたテスト」+++

1) もしもネットワークにつながっていたら切断する。(AirMac 切るとか Lan ケーブル抜く)
2) Safari の設定
ブックマークを書き出し保存しておく。
Safari 設定内容は上記を参照。
必ずSafari を終了させておく

3) ファイアウォールを入にする(詳細オプション内のチェックはどこにも入れてない)
4) ターミナル(/Applications/Utilities/Terminal.app)から下記のコマンドをうつ($ で始まっている行のみ。$ は打たない。)


# 自分のid をみる-ユーザが所属しているグループがわかる。
$ id

# もしも管理者ユーザであれば  admin という文字列がみえる。
# admin という文字列がみあたらなければ 管理者ユーザになる必要ある。

# 管理ユーザになる。
$ su admin-username
# password を尋ねられる。

# 無事に管理者ユーザになったかを確認。
$ id

# 今度は admin グループに属しているので admin という文字列がみえるはず。
# あいかわらず admin という文字列がみあたらないのであれば管理者ユーザ名かパスワードが間違っている。

# 管理者ユーザになった後、FileValt を利用中の場合は Permission deny な場所にいるので
# /var/log などに移動。
$ cd /var/log

# 素 のipfw の設定を確認しておく。
$ sudo ipfw list

# ファイアウォール詳細のオプションの中のチェックは1つも入っていない状態の場合 下記のみ表示される。
# =>
# 65535 allow ip from any to any
# ファイアウォール詳細のオプションで「すべての受信接続をブロック」にチェックが入っている場合は
# =>
# 65535 allow ip from any to any
# 33300 deny log icmp from any to me in icmptypes 8
# となっている。

# ipfw に新たなルールを追加し tcp を禁じる。
$ sudo ipfw 01000 add deny log tcp from any to any

# ルールが正しく追加されたか確認する。 
$ sudo ipfw list
#=>
#01000 deny log tcp from any to any
#65535 allow ip from any to any

# もし間違えちゃった場合は間違えたipfwルールの番号を指定して取り除く。
# ここで元のルールまで削除してしまったとしても再起動すれば元通りになるので心配いらない。
# $ sudo ipfw delete 01000

# ネットワークに接続する。(システム環境設定ーネットワーク。利用しているサービスが緑色になる)

# システムログを表示させておく(管理者ユーザ と一般ユーザではこの表示は微妙に異なる場合もあることに留意)
$ syslog -w

# Safari を起動する。
# もしもここで既にSafari が起動していたら終了し起動しなおす。
# 画面は空白でありURL も空欄であることを確認。

# もしもログに下記のようなログがのこったら...
# ... Firewall[xx] <Info>:  1000 Deny TCP xxx.xxx.xxx.xxx:YYYYY 17.250.248.105:80 out via en0

# xxx.xxx.xxx.xxx は自分のローカルネットワークアドレスを意味してます。
# YYYY を使用して17.250.248.105 宛に80番で接続しようとしたのを ipfw が禁止したことを意味しています。
# via en0 はEthernetケーブル、 en1 なら AirMac を意味してます。

# ログでとらえられたアドレスを逆引きしドメイン名を確認
$ dig -x 17.250.248.105

# 一般ユーザにもどる
$ exit

# ターミナルを終了
$ exit


5) Safari を終了
6) ネットワーク切断

再起動するとipfw のルールは自動的に素の状態(ipfw コマンドを打つ前の状態)に戻る

以上。

# Safari の設定を初期化するには
% rm -rf Library/Preferences/com.apple.Safari.plist
% defaults delete com.apple.Safari WebIconDatabaseEnabled
とした後 Safari を起動。書き出しておいたブックマークを読み込む。

追記:20091011
システム環境設定->ソフトウエアアップデート->アップデートの確認はオフにしています。
# ソフトウエアアップデートが使用しているサーバアドレス
# swscan.apple.com
# 17.250.248.95

Remove DS_Store file

以前作った もの を書き直し。

# coding: utf-8
# dsstore.rb
# 
# ruby dsstore.rb /Users/name/dir
# ruby19 dsstore.rb /Users/name/dir 'rmf'
#
# 2009-09-30
# Mac OS X 10.6.1
# ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
# ruby 1.9.1p243 (2009-07-16 revision 24175)
#
# 2008-09-06
# fix: path include space character .
# 2008-01-21
# http://www.midore.net/daybook/2008/01/1200841265.html

require 'find'

class DSStore
  def initialize(path, option)
    @path = path
    @option = option
    @checkdir = FileTest.directory?(path)
    @checkpath = File.exist?(path)
    @list = Array.new
  end

  def ls_or_rm
    return print "not found directory\n" unless @checkpath
    return print "It is not directory\n" unless @checkdir
    return print "not found .DS_Store file\n" if list.empty?
    @list.each{|f|
      # スペースが含まれていたら
      file = f =~ /\s/ ? f.gsub(/\s/, "\\ " ) : f
   # 指定した文字列が与えられたら
      @option == 'rmf' ? sys_rm(file) : sys_ls(file)
    }
  end

  private

  def list
    Find.find(@path){|path| @list << path if File.basename(path) == ".DS_Store"}
    return @list
  end

  def sys_ls(f)
    gf = f.gsub("&","*")
    system("ls  #{gf}")
  end

  def sys_rm(f)
    system("rm #{f}")
    print "Removed: #{f}\n"
  end

end

t = Time.now
dirpath = Dir.pwd

dir,opt = ARGV[0],ARGV[1]
dirpath = dir unless dir.nil?
option = opt unless opt.nil?
DSStore.new(dirpath, option).ls_or_rm

# time
t2 = Time.now - t
print "\n=>Time: #{t2.to_s}\n"

2009/09/29

Snow Leopard creator code

なんですと。クリエータコードがなくなってる?
http://d.hatena.ne.jp/tanemori/20090914/SnowLeopardKillsDocumentCreatorCodes
http://www.tidbits.com/tb-issues/lang/jp/TidBITS-jp-994.html#lnk9

では早速、OS 10.6.1 で TextEdit.app を起動し適当に文字うってコマンド+S
GetFileInfo コマンドを使ってクリエイターがなくなっているかみてみた。

% GetFileInfo ~/Desktop/e.txt
file: "/Users/midore/Desktop/e.txt"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz
created: 09/29/2009 22:37:08
modified: 09/29/2009 22:37:08


たしかに creator も file type も0で埋まっている。以前だったらなにかしら名前が入っていたはず。
ということは?ーAppleScript からもみてみよう。

# 10.6.1 の AppleSciprt ヴァージョン
set a to AppleScript's version

# あいまいな記憶の中を漂いながら書いてるからちょっとおかしい...とりあえず
# 最後にとらえたファイルのクリエイタータイプ情報を結果表示できた。
tell application "Finder"
	activate
	set f to files of desktop
	repeat with i in f
		#set b to name of i
		#set c to properties of i
		set d to creator type of i
	end repeat
end tell
{a, d}

# =>
#{"2.1", missing value}


たしかに、missing value になっている。AppleScipt の Version もあがっている。

AppleScript Editor.appもいろいろ変わったみたい。
環境設定からタブ幅を指定できるようにもなってる。
でも、タブをスペースに変換はないのね。

2009/09/15

Snow Leopard RemoteDesktop

リモートマネージメントを読み込まないようにする。

$ cd /System/Library/CoreServices/
$ sudo mkdir notuse
$ sudo mv RemoteManagement/ notuse/
$ sudo chmod 0 notuse

再起動

システム環境設定ー共有ーリモートマネージメント を開いてみると
「リモートマネージメントはこのコンピュータにインストールされていません。」
と表示されるようになった。

# この方法の問題点はソフトウエアアップデートが出た時に問題が発生するであろうこと
# rm -rf したほうがまだましなのかな。?

+++ 関連するファイル +++

/System/Library/LaunchDaemons/com.apple.RemoteDesktop.PrivilegeProxy.plist
/System/Library/LaunchDaemons/com.apple.RFBRegisterMDNS_RemoteManagement.plist
/System/Library/LaunchAgents/com.apple.RemoteDesktop.plist

Snow Leopard 10.6.1 AirMac

10.6.1で
メニューバー AirMac の状況を表示するアイコンが無反応になった。クリックしても AirMac 電源入らない。

コマンドから電源を入れると
# $/usr/sbin/networksetup -setairportpower AirPort on
電源は入った。だがあいかわらずメニューバーのAirMacアイコンから電源を切ることはできない。
# $/usr/sbin/networksetup -setairportpower AirPort off
とするほかない。この状態でAirMacを使用するのはよろしくない。

この問題は10.5.8から10.6.1にアップデートした場合に発生した。

ただし、10.5.8からのアップデートにも2種類あり
これまで使用してきたデータをまるごとひきついだ上で10.6.1までアップデートした場合と
ハードディスクを初期化し10.5を新規インストールして全てのソフトウエアアップデートを終え(2009/09/10までの)10.6 DVDで10.6にアップデートしソフトウエアアップデートで10.6.1にした場合
私が試したのは後者

ハードディスクを初期化して10.6をDVDから新規インストールした場合はこの問題は発生しなかった。(ただし違う問題ありかも)

解決策は下記にあった。

http://discussions.apple.com/thread.jspa?threadID=2132178

2009.09.08
andrewvernon wrote

> I created a new Location value, turned AirPort on successfully,

新規ロケーションを作ると成功したそうだ。
システム環境設定ーネットワークを開き
ネットワーク環境をクリックし「ネットワーク環境を編集」を編集する。プラスマークをクリックすると新しいロケーションをつくることができる。
新しいロケーションでAirMac設定を終えたら10.5.8から引き継いだ全ての古いロケーションを「ネットワーク環境を編集」から削除
再起動。

# 全て過去のネットワーク記憶をクリーンにしたい場合は、
# セーフブートで起動して設定する必要あり
# =>
# http://midorex.blogspot.com/2009/09/snow-leopard-networksetup.html

+++ 参照+++
http://discussions.apple.com
の「ネットワーク」内のあちらこちら

Snow Leopard NetworkSetUP

ネットワークの初期化ー再セットアップ

あらかじめしておくこと
keychain - システム および ログイン に登録されている AirMac Network に参加する key を全て削除
システム終了
セーフブート - shift キーを押しながら起動

$ cd /Library/Preferences/SystemConfiguration/
# 管理者ユーザになる
$ su admin-user
# 過去のネットワークを記憶しているファイルを削除
$ sudo rm com.apple.network.identification.plist
$ sudo rm com.apple.airport.preferences.plist
$ sudo rm preferences.plist.old

システム環境設定ーネットワークー鍵アイコンをクリックし鍵を開ける
新しいロケーションをつくり新しいネットワークの設定をする
古いロケーションをすべて削除
鍵を閉じる
システム環境設定終了
再起動

起動後初めてネットワークに参加すると、
/Library/Preferences/SystemConfiguration/com.apple.network.identification.plist が生成される。

起動時のロケーションにAirMac サービスが存在しないと、起動に時間がかかる上勢いよくファンがまわり
ログには
<Error>: ACInterfaceGetPower called with NULL interface
のリピートが残っていた。

このため起動時使用するロケーションにAirMac サービスを追加した上でサービスを無効にしておいた。
ネットワーク設定中にAirMac 設定が1つも存在しないのは許されないのかな。
FireWire はさくっと削除してしまってもなんの問題もないんだけどね。

+++ 参照+++
http://discussions.apple.com
の「ネットワーク」内のあちらこちら

2009/08/19

AirMac-UDP-192

システム環境設定->ネットワーク->「メニューバーに AirMac の状況を表示」のチェックをはずすと UDP 192 は使用されなくなるようだ。

OS X 起動時 /System/Library/CoreServices/SystemUIServer.app/Contents/MacOS/SystemUIServer のErrorがでるので試しにメニューバーのアイコンを全部削除してみたらSystemUIServerのこのエラーは現れなくなった。この時たまたま無線につなげたら UDP 192 のトラフィックがなくなっているのに気づいた次第。
ただ、メニューバーにAirMacアイコンがなければ接続時 UDP 192 は使用され「ない」と確かに明記された Apple の公式ドキュメントをみつけることはできなかった。

参照:
"Well known" TCP and UDP ports used by Apple software produc
日本語版は
アップルソフトウェア製品で使われる「一般的な」TCP および UDP ポート

+++ memo +++

コマンドで AirMac を操作する方法

# ネットワークインターフェイス一覧
# * がついているものは有効になっていないインターフェイス
% networksetup -listallnetworkservices

# 各インターフェイス設定内容表示
% networksetup -getinfo Ethernet
% networksetup -getinfo AirPort

# AirMac 電源入
% networksetup -setairportpower on

# AirMac 電源切
% networksetup -setairportpower off

# つなげているネットワーク名
% networksetup -getairportpower

# Help
/usr/sbin/networksetup -h

2009/08/15

Amazon Product Advertising API

Amazon のAWS は 『Product Advertising API』に名称変更されました。この変更に伴い認証方法も変更されました。
私も github.com で AWS にアクセスするものを公開していたので今回の変更に対応してみました。

http://github.com/midore/amazon-jp-api

Ruby 1.9.1 でのみ動作します。

Mac OS X
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-darwin9.7.0]
で動作確認してます。

使用する際には
Amazon アソシエイト ID と
開発者用アカウントが必要です。
具体的にいうと開発者用アカウントに付随する アクセスkey およびシークレットkey が必要です。

# 関連する投稿
Amazon Web サービスの署名認証 - with Ruby 1.9.1
http://midorex.blogspot.com/2009/06/amazon-web-with-ruby-191.html

2009/08/01

素数たちの孤独

素数たちの孤独 / パオロ・ジョルダーノ / 早川書房 / 9784152090539

を読んだ。以下とりとめのない感想。

タイトルにひかれて買った読者も多いのだろうと思う。私もそのうちの一人。本屋さんで平積みにされてるのをみかけタイトルに頷いて中身をみることもなくレジに向かってしまった。この本はそんな騒動買いをした読者をがっかりさせないどころじゃない。時間的ロス皆無で素晴らしい本に出会えたのは久しぶり。

あとがきを読んでさらに驚いてしまった。いろいろな意味で。

読み終えた日
http://booklog.kinokuniya.co.jp/ohtake/archives/2009/07/post_47.html
の中でこんな一文をみかけた。

トークのなかで「科学とは何だと思いますか」と斉藤に問われて、福岡は「ことばだと思う」と答え、斉藤も同感だと述べた。


え?!ことばなの?とすごく不思議に思った。よく知らないけどウィトゲンシュタインとかそういう人々の分野が関連してるんだろか。ふと、「素数たちの孤独」を書いた作者にこの意味をものすごくわかりやすく噛み砕いて解説してほしいと思ってしまった。マッティアとアリーチェの二人がこの意味について神妙な顔で話しあってる場面を読んでみたいと強く思ってしまった。

「科学はことば」とは一体なんぞや?書評で取り上げられている本『エレファントム』を読めば即理解できることとは到底思えないし、いかんせん私にとって難解そうな雰囲気がぷんぷん漂っていて二の足を踏む。かといって、とっかかりとなりうる本は『エレファントム』以外に考えられない。
本屋さんでみかけたら一度中身をみてみよう。

やがて哀しき外国語

やがて哀しき外国語 / 村上春樹 / 9784062634373
を読んで。印象的だった箇所いくつか。

p.180

うちの奥さんはトニ・モリスンとウーピー・ゴールドバークがときどき見分けられなくなると言う。困ったものである。


ここ、笑)奥さんにすごい親しみを感じてしまった。もし私だったらあのウーピーがあの本を書いたのか、すごいなって錯覚できちゃっう自信あったりする...。

p.126

「ソー・ホワット」っていう歌を知ってるだろう。あれに歌詞をつけて歌ったんだ。「マイルスがステージから出て行った。ソー・ホワット(だから何だ)?」ってさ」


ロックで「so what」 って歌あったけ。そうそう Pink が歌ってたやつ。 YouTube で初めてみた時、妙におかしくて笑えて仕方なかったのを思いだした。so what って日本語にすると 「で?」に相当するのかな。「それで君は何がいいたいのだ?」といったニュアンスがこめられた「で?」。発音的には「デッ」に近い感じのやつ。ポイントはそのあとじっと相手の目をみつめるところなんだと思う。はっきりいってちょっと攻撃的な印象を与える言葉なんだろうけど、非論理的な話に対して有効に使っている人みると小気味いいことがあったりする。

p.156

でも、居直るわけではないのだけれど、いったい誰の人生が間違っていないのだろう?お前の人生は間違っているとかいないとか、誰に確信を持って断言することができるのだろう?


こういう文に出会うと根拠なく元気もらえる。心の energy はどこからもらえるかわかったもんじゃないってところが面白いしそのぶん脆弱なのよねと思った。

+++ 最近読んだ村上春樹の本 +++

海辺のカフカ,アフターダーク,神の子供たちはみな踊る,TVピープル,東京奇譚集,村上春樹、河合隼雄に会いにいく,スプートニクの恋人,アンダーグランド,約束された場所で,村上春樹『1Q84』をどう読むか

1Q84 をきっかけにしてついつい7月は村上春樹強化月間になってしまった。今も反省してない。

dashboardadvisoryd.plist

OS X (10.5.7) 起動直後いつもこの↓ログがある。いつからこうなのわかんない。どうしたらこれを消せるのかわからない。

...  <Notice>: launchctl: Please convert the following to launchd: /etc/mach_init.d/dashboardadvisoryd.plist

Google で『dashboardadvisoryd.plist 'Please convert'』を日本語だけで検索したらたったの5件だった。

ローカル名が付与された後にこんなログも残る。

... /System/Library/CoreServices/SystemUIServer.app/Contents/MacOS/SystemUIServer[xxx] <Error>: CPSPBGetProcessInfo(): This call is deprecated and should not be called 
anymore.


このエラーもどうしたらとりのぞけるのかわからない。bag bug なのかなんなのかもわかんないや。

# この投稿はテストをかねていたりする。

2009/07/28

Junk News

長い間感じていることを文章にしてみようと思う。

テレビのニュース番組においてどうして毎度毎度スポーツニュースが幅をきかせてるんだ?ということ。スポーツニュースのかわりに文化や芸術や科学やテクノロジーであってもいいわけだし、スポーツだけが大々的に恒久的に尊重されなければならないその理由が私にはさっぱりわからない。科学やテクノロジーのニュースだってインターネットだけからではなくてテレビニュースから情報を得ていたいものだし理想を言えばスポーツニュースのかわりに GoogleNew のテクノロジー欄をごっそりとりあげて放送してもらいたいくらい。毎日毎日。野球&ゴルフと同じ頻度で。

現状のテレビのニュース番組のスポーツコーナーっていうやつは

第一に野球かゴルフ
たまにサッカー
たまに陸上と水泳、卓球など。
オリンピックの時は別途番組を用意。

といった子供たちにとってもわかりやすい価値付けが透けて見える上に他ののスポーツは大きな大会がない限りは無視されている模様。クレームがつかない程度に。おそらくこのクレームがつかない程度にってあたりはかなり慎重なのだろーと想像できる。つまりは基本的には日本のスポーツニュースは「野球とゴルフ」なのよね。とにかく暇さえあれば野球&ゴルフ&野球&ゴルフ...略。暇なくても剣道や柔道や卓球など他のスポーツなんて二の次三の次..。いっそ野球&ゴルフにしてしまえよと言いたくなる。野球&ゴルフ。fish&chips と同じくらいジャンキーでぶり&大根みたいにどっちがメインなのかわからんといった点で負けてない。

とにかく野球&ゴルフには相当にうんざりしています。
国際的なニュースとスポーツニュースは永久に「同等な時間配分」を「与えられ」続けてるのをみるにつけ、この調子じゃクローン人間が生まれてしまっても宇宙人がとうとう挨拶にやってきたとしても、たとえどっかの国に戦争しかけられたとしても日本のテレビニュース番組からスポーツニュースが消えることはないんじゃないのか?とすら思えてくる。「おいキズキ、ここはひどい世界だよ...」って本当にそうですよ。一体こんな価値基準はどっから?いつ?誰によって?もたらされてしまったんだろう。子供から大人まで視聴者の半数が、野球とゴルフに興味ある訳じゃないってこと「すら」理解できないようなあるいは意図的に理解を拒むような石頭がのさばってるってことなんだろうか。なんだろうなあ。

以下推測。

中国で歴史的と言えるほどの人権蹂躙や大量虐殺があろうとも、世界のどこかで内紛や戦争が起きようともスポーツ枠が固定されその時間枠はいかなるニュースからも侵害されない、そこには「クローズドで真っ黒でブラックボックスな極めて利己的な既得権益を振りかざすエゴイストたちの独断と偏見と超個人的趣味にまみれた Negative Energy 」が作用してんじゃないの?。

以上推測おわり。

なぜなら人の命にかかわる国際的な問題と野球の試合の「時間配分同じ」ってどこからどう考えてもおかしいでしょ?違うかな?(違うと断言できる人たちが支配しているからこそ現状こうなんだろうけれども)しかも、しかもだよ、その野球のニュースはたいして人気があるとは思えないような野球の試合だったりするわけよ。そんなものと同じだけの時間配分って一体どういうことかしら。テレビを見る側、私からすれば野球なんてどーでもいいからトップニュースの続きみせてくれって思うわけですよ。それでニュースのはしごがはじまるんだけど、どの局も申し合わせたかのように同じ内容だったりしてがっかりする。そしてどの局もそんな日であってもおかいまなしにスポーツニュースだけはしっかりと時間確保しギラギラ報道し続けている。しかもトップニュースとしてとりあげられないままの国際的な話題も多い。

テレビ報道における「時間の長さ」は厳然たる数字として秒数としてそのニュース内容に対する「価値付け」をはっきりと顕わしていますよ。そして、それぞれのニュースに対する優先順位がその数字からはっきりと見受けられないところが問題だと思うわけです。もちろん秒数が長ければいいってもんじゃなくてプロレス実況まがいの解説とはいえなような日本語としても怪しげな「おしゃべり」をみたいわけじゃない。むろん。そりゃニュースキャスターが勝間和代さんだったりしたら相当面白くなるとは思うけども、内容についてあれこれと言う以前の段階として「時間」としてしっかりと確保されないようでは、お話にならないのでは?ということなのです。

現状のテレビ報道をみていると、報道する人たちはそのプライドをドブに捨てて判断放棄しているんじゃないかとすら思えてきます。今時、システマチックな GoogleNews だってこれほど優先度を間違えたりしませんって。(もっとも GoogleNews にはうまい仕組みがあるからなんだろうけども) だから、おい、てれび、そこには大人の人間がいないのか?と言いたくなる。だとしたら、これが当たり前なのなら相当に憂うべきことなんじゃないのかなーと。つまり国際的に重要な事件を極めてローカルな野球試合と同じ程度に扱っているとしかみえないような、その態度、その姿勢、その井戸の中の蛙っぷり、そのあまりにも安易な悪癖ステレオタイプな「選択」に疑問をもたざるをえないと感じるってことです。1つの番組の時間配分をどうするかっていうのはある意味その番組を担当する人たちのモラルがしっかりとそこに顕在化しているんだと思います。人としてのね。そう、だからこれはモラルとしての問題だと捉えるべきなのかも...。

もっとも、留意すべきはテレビ局の人たちのなにげない判断がひいてはその国の文化をどこかで象徴してしまうことに繋がっていると彼らがほとんど自覚していないかのようにふるまっているあたりかもしれない。たとえ視聴者側がそこまで意識していないとしても、です。折しもどっかの幹事長が「...国の程度を表してる」ってうっかり発言してあとでわざわざ撤回したらしいけれど、撤回する必要なんてないです。幹事長が言うとおりですよ、つまり、貴重な1票を投じてくれた人たちをうかつにも貶めてしまう発言がするりと出てくるような人物ごときが国会議員に選ばれてしまう、せいぜいその程度の国なのだと、そしてせいぜいその程度の国のマスコミなのだという意味で、幹事長はずばり図星を言ったまででしょうに。なんとも皮肉なお話ですが...。


悪しき習慣ってのは土足であがってきた居直り強盗がずっと居るあいだに家族みたいになっちゃったようなもの、とは誰が言ったか忘れたけど名言だと思う。もちろん現実には居直り強盗を家族にするなんてありえないわけだけど人の無意識の中ではおこりえてしまう、だからこそ「親しき者」なんじの名は悪しき習慣となりえる。それで悪しき習慣は良き習慣と渾然一体となって人々の無意識の中での共通認識やコモンセンスを形づくっていくのだと思う。そうやって形成される無意識なコモンセンスがその国の文化の土台を形成してゆくはず...。

だとしたら、マスコミの流すジャンク情報には相当に注意が必要なんじゃないのかな。ジャンク情報なんかは無意識領域にのさばらない程度に遮断されてしかるべき。ただ、哀しいのは潜在的無意識領域は本人にすらコントロールが難しいから「こそ」潜在意識と呼ばれているわけだからして、この時点でこれまで上記に長々と書いてきた私のアンチスポーツニュース観ですらその無意識のなせるわざかもしれないと危惧しはじめた途端に、なにかが深く沈んでいってしまいかねないことに気づいてしまう。それでも、それにもかかわらず、たまには自分なりに条件分岐によってループを止めてひとつに書き落としてみるのはよいことなんだと思う。たぶん。

2009/07/23

夏に似合う曲

iTunes Sotre で大貫妙子さんが歌う「この道」を買った。2年前だったかな? 夏の涼しい夜にお皿洗いなんかしていたりするとふっとこの曲が頭に浮かぶ。というか唐突になんの前ぶれもなく頭の中で大貫妙子さんの声がする。「あぁそうだよ」って。さ。けどその先は聞こえてこない。しーん。それで最初から歌ってみるんだけど、やっぱり「そうだよ」の続きの歌詞は思い出せない。2,3度試してもだめ。いつもそう。
仕方ないので本物を聞いてみてほっと安心する。これ何度も繰り返してるのはどうなの?どうなのよって自分でも思う。それにしても、なんでこのフレーズに心ひかれちゃうんだろうな。大貫妙子さんが歌っているからなのか、音程の具合なのか、肯定を意味する言葉の持つ魔術なのか、はたまた夏だからか?
肯定の言葉にもいろいろ種類があって、世間話での うんうんといった相槌もあれば、そうだねーっといった共振的な yes もあれば、仕事っぽい yes もあれば、あいまいさを削ぎ落と すための事務的で明確な yes もある。日本語にはいろいろな yes がある。 この歌の「ああ、そうだよ」ってフレーズから伝わってくるニュアンスを含む yes は、日常生活ではあまり接することのない yes にきこえる。これは歌だからなのかな。

2009/07/07

1Q84

1Q84

1Q84 BOOK 1 / 村上 春樹 / 9784103534228
1Q84 BOOK 2 / 村上 春樹 / 9784103534235
2009-05-29 / 新潮社

+++ 検索してみたことがら

村上春樹 - Wikipedia

ガープの世界 - Wikipedia

安原顕 - Wikipedia

+++ 気になったキーワード

Q.E.D
# 数学の証明
出口なし
# サルトル?
青豆
# 英語にするとグリーンピース?

+++ 感想

p.182 (Book2)

「説明しなくてはそれがわからんというのは、つまり、どれだけ説明してもわからんということだ」

この台詞はちょっと暴力的に感じた。この言葉を実際に使うことが難しい人々がいるとしたら科学者、医者、弁護士、政治家かな。この台詞は、ただ単に物語に登場する人物の考えを雄弁に物語る上で使われているにすぎないのだろうが、それだけじゃない何か大事なことをはっきりと明確に思い出せと読者を促しているようにも読めた。この人物にそれを言わせているんだなと強く感じた。そういった意味で、この小説から受け取るこのようなメッセージは多かった。それらはメッセージなんかじゃないよと、ヒョーロンカの方々が言ったとしてもこの本を書いた当人が言ったとしても、もう遅い。本は本屋で売られた瞬間から作者の手を離れて一人歩きしてるんだから。まるで空気さなぎと同じように。

小説に書かれたことが現実になるなんて...
といった文章がこの本の中で出てくる。そしてリアル世界でもこの本は売れ続けている。変な感じがする。謎が多すぎる。リアルで怖い感がある。気持ち悪さが残る。この小説はホラー小説だったのかな?と納得してみようと思ったけれども、そうするにはあまりにも無理がありすぎる。その方向は間違いなく明後日の方向だろう。作家が世間を煙にまいて高笑いをしているような印象も受けるがそれだけでは納得のいかない怖さがあるのが非常に気になる。ま、こうして読者にあれか?これか?と考えさせることこそが作家の目的だったのなら、それはみごとに成功していますと報告できるわけだけど。

じっくり謎解きを試みるならば...
「ガープの世界」は読み直すべきかなと思った。ふかえりはガープの母親か?と思ったから。「ガープの世界」の中でガープの母親とプーという女性について語られていることは、確か、女性差別を促すのは女性たち自身なのだという論理を連想させるものだったと記憶している。記憶違いじゃなきゃいいんだけど。そのあたりを今一度さぐるべきなのかも。これも明後日の方向である可能性は高いんだけど...。

謎解きから離れて...
本来のまっとうな宗教が果たしてきた社会的役割は大きい。日本では古来からいろんな神様がまつられてきたし江戸時代の間に庶民に浸透したものも多い。にもかかわらず今の日本では宗教について話しあうことが法律で禁止されているかのごとく、人々はそれについて語りたがらないし避ける風潮があり政治と宗教の話を避けるのは大人としてのマナーです。といった習慣がはびこっている。そのためなのかなんなのか分からないけど、おかしなカルトにだまされる「善意ある人々」が多くいる。彼らはだまされていることを知らない。それは一見カルトのようには見えないから善意の人々である彼らはまさか自分がそんなものにお金を貢いでいると意識できないでいる。彼らはその集団に属すことでなにか救済されると誤解し錯覚し続けている。今現在も進行形で。

周囲の人々はこのような人々をまのあたりにしても、彼らに進言したり忠告するのを非常に難しいと感じてしまう。なぜなら日本における人間関係の常識としてそういった事に口を挟むべきではないとする風潮があるから。これはなにもカルトに限った話じゃない。この商品はねずみ講じゃないと主張する「悪気のない」人をまのあたりにした時に「それは立派な鼠講です。今すぐやめた方がいい」と、一体何人の日本人が相手の目をまっすぐ直視して言えるんだろうか?多くの人は今回に限ってそれを買わない旨を言葉を濁しながら相手に伝えるのが精一杯なのではなかろうか。それを口にできない程度の浅い関係なのだとは納得できないままに...。

政治と宗教とねずみ講を論理的に話しあうこと、を一億総勢で避け続けお互いの空気を読み続けてきた結果、そのしっぺ返しとして用意されたものは何か?それはカルトが国をのっとろうと企てていると知らされたことなんじゃなかろうか。why? や No を言わないことを古き良き日本の風潮として温存した結果がこれだったとはね。ブッシュの8年に匹敵するあるいはそれ以上におぞましい事態なのかもしれないと思った。

今は2009年だけど、確かに恐怖の質を変えた1984年はとっくの昔に到来していたのかも。

2009/07/04

梅雨に似合う



artist: フィッシュマンズ
ean: 4988005388032
label: ユニバーサル インターナショナル
title: 宇宙 ベスト・オブ・フィッシュマンズ
price: ¥ 3,300

_
「新しい人」は梅雨の時期に似合う曲です。水の音が聞こえるし、湿度が高いながらもすがすがしい朝もやを歌のなかにみいだすことができます。人によっては雨の後のアスファルトの匂いを感じることができるかもしれません。でもこの曲の神髄は歌を聞くところではなくてあのテンポを聞くところにありそうです。頭が痛い時に聞くと朦朧した世界をかいまみることができそうです。
# いつのまにか iTunes Store でも Fishmans を買うことができるようになっていたなんて。

アンティキティラ古代のギリシャのコンピュータ

アンティキテラ古代ギリシアのコンピュータ / ジョー・マーチャント / 文藝春秋 / 978-41637-14301

p.247-248
紀元前三世紀に、アリスタルコス(紀元前310-230)という天文学者が、太陽は地球よりも何倍も大きくて重いと考えた。それゆえ太陽が地球のまわりを回っているのではなく、地球が太陽のまわりを回っているのだ。彼はまた、昼と夜が起きるのは、地球が自転しているためだとも考えた。......(結局、十数世紀ものちにケプラーの楕円軌道説が出るまで、太陽中心説はかえりみられなかった。)

およそ1000年以上ものあいだ西洋の人々は現在の天文学の常識とは異なった世界観を前提にしちゃってきたわけだから、今の私たちが「あったりまえじゃん」としているようなことの中にも、未来の人からみたらおかしいと感じることがきっと多々存在しているんだろう、と今更ながらに当たり前のことについて考えていたらなんとも不思議な気持ちになった。
往々にして科学は進化するものだと考えがちだけど、もっと誤った世界観を押し広げて今よりももっともっと退化する可能性だってあるわけで、アリスタルコスがコペルニクス以前のヨーロッパの宇宙観を見知ってしまったら絶望したまま墓の中に舞い戻ったろうし、ニュートン以降の時代にタイムマシンでやってきたら歓喜のあまり失神したかもしれない。
つまり、すごく長い目でみた時、科学の発展はまっすぐな一本道を辿らずに一歩進んで三歩さがる(時には10歩戻る)くらいのぐにゃぐにゃした道を辿って進化してきたってことをこの本は教えてくれる。
ということは、これからもそうだし「今現在」もそうなんだろうと考えるのが自然なんだろうな。たぶん。

Apple Support Discussion

Apple - Support - Discussions - DNS Changer Trojan ...
DNS Changer Trojan

ひー。トロイもらっちゃった人のヘルプストーリー


$ /usr/sbin/scutil --dns | grep nameserver

これは networksetup とともに覚えておこうと思った。けど、きっと覚えられないだろうから、sc がつくってことだけ覚えてあとはタブ補完で...

Safari history

macosxhints.com - Remove Safari history files on logout via shell script
Remove Safari history files on logout via shell script

そっか一般ユーザがログアウトする時に実行するからroot がこれを動かす必要があると。でもって root 権限の com.apple.loginwindow にdefault コマンドでこのスクリプトをフックさせる旨を記述しなさい、と。そういうことらしい。コメント欄には Flash の残したキャッシュも消すべきなのでは?という突っ込みがあるようだ。おそらく、~/Library/Cache や Library/Preferences/ に残る Macromedia のキャッシュのことをさしてるんだろう。

$ sudo defaults write com.apple.loginwindow LogoutHook "/Users/your_user/scripts/privacy.sh"
を実行する前に

$ sudo defaults read com.apple.loginwindow
を実行してみたらその Domain 名はないよって返事がかえってきた。ということは上記のコマンドを実行すると新規の plist 作るってことになるんだよな。ちょっとためらってしまうな。

2009/06/23

話題の本

うっかり
『1Q84』村上春樹(新潮社) :阿部公彦の書評ブログ

を読んでしまった。失敗した。買いたいと思わないようにちょっと注意していたのに気になって仕方ない。

Amazon Web サービスの署名認証 - with Ruby 1.9.1

Amazon Product Advertising APIの認証の件
Amazon Product Advertising API (認証対応)

を読んで自分のID で試してみました。OS X のRuby 1.8.6 でちゃんと動きました。うれしい。
OS X 10.5.7 のOpenSSL のバージョンは古いので


dig = HMAC::SHA256.digest(secret_key, msg)

で試しました。

でも ruby 1.9.1 で動かすと


ruby-openid-2.1.6/lib/hmac/hmac.rb:94:in `ensure in digest': undefined method `reset_key' for nil:NilClass (NoMethodError)

となります。

あちこちみたあげく livedoor.com 経由で
amazon-auth-proxy
をみつけたのでこちらも手元で試してみました(cgi ぬきで)。module が拡張されていたのでもしや?と思いましたがやっぱり Ruby 1.8.6 では動くけどRuby 1.9.1 だと同じようなエラーがでて動きません。

エラーが指し示すライブラリ ruby-openid/lib/hmac/hmac.rb の中身をみて考えてみました。
reset_key メソッドはちゃんと存在しているし現にRuby 1.8.6 では動くので、一体なにがnil なのか?と少し書き足してエラーを再現してみたところ...


def set_key(key)
...
  for i in 0 .. key.size - 1
  key_xor_ipad[i] ^= key[i]
...

このメソッドにある ^= の部分でエラーになっていることがわかりました。Ruby 1.8.6 で動かすと nil じゃないけど、Ruby 1.9.1 だとnil になる。これはなぜだろう?あちこちに p をつけて実行してみて気づいたのは Ruby 1.9.1 の string[0]と Ruby 1.8 の string[0] の解釈が違うらしいということでした。

プログラミング言語 Ruby
p.59 によると
Ruby 1.8 の string[0]は、ASCII
Ruby 1.9 の string[0]は 文字列
とありました。

key[i]は、key に納められている文字列の1文字目の ASCII がかえってくる前提で書かれているけど、Ruby 1.9.1 で動かすと文字列そのもの("m"とか)がかえってきてしまう。これが nil になる原因なんだとわかりました。

...ということでいろいろ試しつつRuby 1.9.1 で動くものを作ってみました。とりあえず Amazon の認証にはクリアできましたが記述については自信がありません。

# 今回の Amazon からの宿題は Ruby 1.9.1 のString に関する知識を強制的に深める効果がありました。不幸中の幸いというかなんというか感謝。


# coding: utf-8

# Library:
# http://rubyforge.org/projects/ruby-openid/
# Original Page:
# http://github.com/tdtds/amazon-auth-proxy/blob/035bd4de90c4223994046fb489d7ccded566a879/amazon-auth-proxy.cgi
# http://diaspar.jp/node/239

# 使用したRubyのバージョン
# ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0]

# Ruby 1.9.1 のgem は使ってない為ライブラリの絶対パスを push している。
# gem19 unpack ruby-openid-2.1.6.gem で解凍後のパス
oid = '/path/to/ruby-openid-2.1.6/lib'
$LOAD_PATH.push(oid)

require 'uri'
require 'time'
require 'openid'
require 'rexml/document'

module HMAC
 # Original
 # => http://github.com/tdtds/amazon-auth-proxy/blob/035bd4de90c4223994046fb489d7ccded566a879/amazon-auth-proxy.cgi
  # Ruby 1.9.1 用に改造してみる。
  IPAD = "\x36" * 64
  OPAD = "\x5c" * 64
  module_function
  def sha256( key, message )
    ipad, opad = [],[]
    # バイトごとにArrayに追加
  IPAD.each_byte{|x| ipad << x }
    OPAD.each_byte{|x| opad << x}
    ikey = ipad
    okey = opad
    akey = []
  # うけとったkey もArrayへ
    key.each_byte{|x| akey << x}
    key.size.times{|i|
      ikey[i] = akey[i] ^ ipad[i]
      okey[i] = akey[i] ^ opad[i]
    }
    # コードポイントから文字列へ
    ik = ikey.pack("C*")
    ok = okey.pack("C*")
    value = Digest::SHA256.digest( ik + message )
    value = Digest::SHA256.digest( ok + value )
  end

end

module Aws
  class Amazon

    def initialize(host, uri)
      @host = host
      @uri = uri
    end

    def escape(string)
   # Original
      # => ruby19/1.9.1/cgi/uri.rb CGI::escape(string)
      string.gsub(/([^ a-zA-Z0-9_.-]+)/) do
        '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
      end.tr(' ', '+')
    end
    
    def local_utc
      t = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
      escape(t)
    end
    
    def make_req(isbn, access_key, secret_key)
   # original はこちら => http://diaspar.jp/node/239
      req = 
      [
        "Service=AWSECommerceService",
        "Version=2009-03-31",
        "AWSAccessKeyId=#{access_key}",
        "Operation=ItemLookup",
        "SearchIndex=Books",
        "ResponseGroup=Medium",
        "IdType=ISBN",
        "ItemId=#{isbn}",
        "Timestamp=#{local_utc}"
       ].sort.join('&')
      msg = ["GET", @host, @uri, req].join("\n")
      # 拡張モジュール1.9.1用改造版呼び出し
      hash = HMAC::sha256(secret_key, msg)
      mh = [hash].pack("m").chomp 
      sig = escape(mh)
      return "#{@uri}?#{req}&Signature=#{sig}"
    end

  end
end

#-------------------#

accesskey = 'xxxxxxxxxxxxxxxxxxx'
secretkey = 'xxxxxxxxxxxxxxxxxxxx' 
host = 'webservices.amazon.co.jp'
path = '/onca/xml'

#isbn = "9784274066429"
#isbn = "9784839927844"
#isbn = "9784894712850"
isbn = "9784797336610"
req = Aws::Amazon.new(host, path).make_req(isbn, accesskey, secretkey)

#exit

# 署名認証リクエスト開始
begin
  Net::HTTP.start(host, 80) { |http|
    resp = http.get(req).body
  # ドキュメントをUTF-8 へ強制変換
    ustr = resp.force_encoding("UTF-8")
    doc = REXML::Document.new(ustr)
    doc.elements.each('ItemLookupResponse/Items/Item/ItemAttributes') { |item|
      puts '%s -> %s' % [item.text('EAN'), item.text('Title')]
    }
  }
end

結果


% ruby19 for-19.rb 
9784797336610 -> たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

+++ 試したライブラリ+++
ruby-openid-2.1.6.gem
ruby-hmac-0.3.2.gem

+++ 参考にしたところ+++
Amazon Product Advertising APIの認証の件
Amazon Product Advertising API (認証対応)
github.com/tdtds

[を] アマゾンAPIを使うのに2009年8月15日から認証が必要になるらしい
KeN's GNU/Linux Diary | Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ

+++ Amazon +++
Product Advertising API 開発者向けガイド リクエストの署名認証について>(参考訳
http://developer.amazonwebservices.com/connect/ann.jspa?annID=442

+++ 追記 +++
Amazon Web Services Developer Community : OSSからの認証利用

私も Amazon Web サービスが元に戻ってくれたらいいのにな、と思いました。

2009/06/15

defaults domains

% man defaults
% defaults -h
を読みながら試してみたこと. OS X 10.5.7

# てっとり早くkey を探したい時-例えば clock
% defaults find 'clock'
=>
Found 9 keys in domain 'com.apple.MenuBarClock': {
...

略)

# ドメイン名一覧を得る-管理者ユーザ
$ sudo defaults domains
$ sudo defaults -currentHost domains

# ドメイン名一覧-一般ユーザ&管理者ユーザ
% defaults -currentHost domains
% defaults domains

# Safari.app に関する設定
% defaults read com.apple.Safari
# or
% defaults read -app Safari
# Rss
% defaults read com.apple.Safari.RSS
# Cookies
% defaults read com.apple.WebFoundation

# iTunes.app
% defaults read -app iTunes
# iTunes security
% defaults read /Library/Preferences/com.apple.iTunes.secure

# defaults write で書き換えたい場合事前に項目のタイプを確認する。
% defaults read-type com.apple.Safari RSSBookmarksInBarAreSubscribed
=>
Type is boolean

# 時計の設定をみる.みるだけ。
% defaults read com.apple.menuBarClock

# ソフトウエア・アップデート- / 一般ユーザ
% defaults read com.apple.scheduler

# ソフトウエア・アップデート- / 管理者
$ sudo defaults -currentHost read com.apple.scheduler AbsoluteSchedule

appleYukon2

Safari4 を使っているとネットワークが途切れることがある。必ずいつも再現するわけじゃないところが謎。
この現象がおきると
$ sudo tail -f /var/log/system.log
AppleYukon2: ... 略... deadmanCheck - nothing received, resetting chip
の直後に Ethrnet が再起動していることが多い。

http://discussions.apple.com/ で AppleYukon2 を検索

AppleYukon2
Network Errors Adding New Router

システム環境-ネットワーク-Ethernet を変更し「手動」で「全二重」を選択すべしということ?

--memo
/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleYukon2.kext

2009/06/09

Snow Leopard

http://jp.techcrunch.com/archives/20090608os-x-snow-leopard-should-purr-along-with-a-smaller-footprint/

によると Snow Leopard はダイエットされるらしい。朗報。どんどん削除してほしい。Apache も Samba もいらない。cupsd, sshd いらない。php もいらない。とにかくこの類いのもの XCode インストールする時のように全てオプションにしてくれたらな。

もちろん、
http://www.apple.com/jp/macosx/specs.html
をみるかぎりそういう意味ではないようだが、ODBC Administrator.app なんかはみあたらない。削除されるのかな。いいことだ。

ついでにプラグインなんかもユーザに選択させてくれたら素敵なのにな。
このあいだも、/Library/Internet Plug-Ins/JavaPluginCocoa.bundle のアクセス権を変更しておく事態に見舞われた。なんでも穴があいてるということだったので。ブラウザの設定で Java のチェックをはずだけでもよかったのかもしれないけれど、以前にここでチェックはずしてもチェックをはずしたこと自体が無効だったこともあったからプラグイン自体が起動しないようにアクセス権を変えておいた。

こういう時、つくづく思う。
もしも、 OS インストール時にこのプラグインをインストールするかしないか、私が選択できるようになっていたのならば、私は最初からこのプラグインをインストールしていなかったはず。インストールしてなければ私はそのプラグインのセキュリティホールに関して一切心配する必要はない。このプラグインに関するセキュリティニュースをみかけたとしてもスルーできる。なぜ、Appleはこういった環境を提供してくれないのかな。と。自分がインストールを決定していないものについては心配しなくて済む環境がほしいな。

それと、プラグインよりも複雑で巨大なフレームワークの場合もインストールされて「いない」方がユーザーの自由度を高める可能性もあると思う。
たとえば、cupsd (印刷するやつ)を 永久に kill したいと思ったとする。永久にプリンタ使う予定ないから。けれど関連するフレームワークはあちこちに分散している。そいつらは他のアプリケーションとどう関連しているのかわからない。例えば、cupsd を止めた状態で、システム環境設定アプリケーションの共有をクリックするとシスログにちょっとしたエラーが残る。このエラーはどうしたら止まるのか、それを説明してくれる文章は apple.com にはない。仮にそのエラーを止めることができたとしてもその行為が他の全然関係ないアプリケーションにどう影響するか?なんていう文章も探してみたけれどない。ただ、単に cupsd を kill したいだけでどうしてこんなに迷宮に迷いこまなくてはならんのでしょうか?

そもそもなぜあなたは cupsd を敵視するのかといわれそうだが 私としては敵視しているんじゃなくてプリンタにつなげることが100パーセントないので実際不要。だから、sudo lsof -i で cupsd が表示されたとたんに永久に kill したくなる。使う予定のないデーモンがずっと起動してるのは無駄。メモリー消費を押さえたい、これはいけないこと? Linux だったら、できて当たり前、やって当たり前のことよね? OS X だって正当な UNIX になったんじゃなかったっけ。正常にcupsd を起動させなくするGUIインターフェイスを持つ OS だってあるなかで、なぜアップルにそれがないのだろう。といったことから、、、
つくづく思う。
そもそも cupsd とそれに関係するフレームワークがインストールされていなければいいのに、と。インストールの選択肢を広げてユーザーに選ばせてくれよと。

もちろん、私なりに想像できることはある。例えばエプソンのドライバーをインストールしようとしたら「cupsd がインストールされていません」なんていうメッセージが現れてしまった。こんなおぞましい事態はAppleにとってはあってはならぬ悪夢なのかもしれない。だとしたら、ベンダーが必要としそうな最低限のアプリケーションやフレームワークは、インストーラーとしてどっかにまとめて保存されていればすむことだよね?DVDからの別途オプションインストールはDVDが手元にないときに不便だというのならば、OS のどこかにインストーラー格納しておいて、呼ばれて初めてインストールする、とか。あるいは、ソフトウエアアップデート経由でダウンロードできてもいいわけですよね。あ、Snow Leopard はインストールされてるドライバにアップデートがあった場合ソフトウエアアップデートからダウンロードできるとあったっけ。これ、いっそcupsd とそれ関連フレームワークごとにしてもらえないかな。

あと、.Macがらみの全てのアプリケーションもインストールするかどうかユーザーに尋ねて欲しいな。
アップルにしたって、独占しているって訴えられないためにもこれらは標準からはずした方が賢明なんじゃないのかな。.Mac というか Mobile Meか... 。
これ使わないユーザーはどこともシンクロする必要ないわけよね。なんで、OS と一体化してるんだろか、あ、いや、してないか。えーと、つまり、Mobile Me 関連アンインストーラーを提供してほしい!。Mobile me 使っていないマックユーザーだって僕らは歓迎しているぜという意思表示とともに。
そうしてもらうと、こちらは何が助かるのかというと syncserver とかいう謎のデーモン?Agent?と格闘しなくてもよくなる。最初から格闘しなければいいだけの話かもしれませんがね...。それともこれはあれですかね、システムが必要とし..?ま、まさか、そんなことはないだろうから隔離してほしい。
それに、今度のSnow Leopard は マイクロソフト関係のシンクロサービスなんかも盛り込まれるとか。マイクロソフト関係のものはできればインストール拒否したいと思っているユーザがここに1人いるってことは世界中に少なくともあともう1人はいるかもしれない。どんぶり勘定したらもっといるかもしれない。n万人いるかもしれない。オバマ大統領に投票した人数いる可能性だってありえる。当のオバマさんだってそう思うかもしれない!

言い過ぎた。
ということで、このシンクロ関連一切合切オプションのインストーラーでの提供としてくれたら私はとてもうれしい。こんなユーザーの要望はかなうわけなく、零か零以下の可能性だからこそ書いておこう。

零ついでにもっと書いておくと
/System/Library/Extensions/ におさめられてる
IOBluetoothFamily.kext
IOBluetoothHIDDriver.kext

これらもオプションにしてくれたら助かる。ずっと前にアップルが提供するドキュメントを読みながら、 IOBluethoos*.kext を削除して(Bluetooth 一切使ってなかったから。)それですっきり快適マックライフを送ってた。アップデートするまでは...。10.5.7 Update で、この子たちが強制的にインストールされた日には、すごくびっくりしたし心からがっかりした。なかったはずのものがいきなり出現した時のこちらの身にもなってほしいわ。以前にアパッチのコンフ書き換えちゃうアップデートあったっけ。あれに比べればまだましかもしれないけど。

ちなみに、アップルが提供するドキュメントとはこれ。
http://images.apple.com/server/macosx/docs/Leopard_Security_Config_20080530.pdf

2009.06.10 誤字脱字その他修正

数学をつくった人びと

数学をつくった人びと〈1〉 (ハヤカワ文庫NF―数理を愉しむシリーズ) / E.T. ベル / 早川書房 / 978-4150-502836

p.34-35

...この本をすみからすみまで理解するのに必要な知識量はどの程度であろうか?それは中学高等学校程度の数学で十分だといってさしつかえない。...あまりに専門的すぎると思った場合には、読み飛ばしてしまうがよい。残りの部分にも報いてあまりあるものがあるということである。..飛ばし読みは、私たちが厳格な先生からおしえられたように罪悪ではなく、常識の教える知恵なのである。...

数学を学ぶにあたってかつてこんなにも力強く励まされたことがかつてあったろうか。難しかったら飛ばして読みなさいと言ってくれた数学の本に出会ったのは初めて。あっ、でも高等学校程度の数学こそおぼつかない私は対象読者範囲外であった。読み飛ばすことでクリアしていく予定。
わかりやすく書き起こされて教科書に掲載されるべき箇所がたくさんあるような気がする。そういえば,どうして算数や数学の教科書には数学そのものの歴史に関する記述がなかったんだろうか。私がちゃんと勉強してなかっただけなのかな。その可能性はかなり高い。
デカルトの話に出くわした。あまりに面白かったので「方法序説」を読みつつ飛ばし読みつつ&道草読み。

方法序説 (岩波文庫) / デカルト / 岩波書店 / 400-336131-8 / creator: Ren´e Descartes & 谷川 多佳子

2009/06/08

一六世紀文化革命

一六世紀文化革命 1 / 山本 義隆 / みすず書房 / 978-46220-72867
一六世紀文化革命 2 / 山本 義隆 / みすず書房 / 978-46220-72874

この本では、
印刷技術の普及、職人によって著された書籍の登場、
蔑まされていた外科医による現実的で有用な情報公開、
商人たちが流布した計算方法と俗語で書かれた数学書の普及と算数教育、
宗教改革、大航海時代
ナショナリズムによる自国語の発展
...
といった出来事を取り上げラテン語以外は許容されなかった「神聖なる」学問がいかにして変貌し、中世ヨーロッパにおける医学、数学、科学、芸術や哲学などのあり方がどのように変化しその要因や引き金となったものは何だったのか?が膨大な資料と史料に基づいて丹念に追求されている。
著者は、
p.29

「16世紀文化革命」はひとつの仮説であり、それが十分に論証されているかどうかは、読者の判断に委ねたい。

と読者に判断を委ねているので読み終えた読者として是非とも判断してみたいところだが、例えば反証可能かどうかといった科学的な視点が社会学や歴史学の分野においてどのように反映されるべきかなのかは、今もって社会学的にはわからないことなのだろうしましてや一介の読者が判断できることではないと思った。
けれど、判断はつかないものの当時の常識がいかにして覆されていったかをこの本を通じて知ることができたのは個人的に楽しい読書体験であったし、あとがきに記された今の科学のあり方についての著者の主張はとても斬新で貴重な意見なんだと思う。
とくに読み応えがあったのは9章と10章だった。
なぜルターの宗教改革は世間に行き渡るに至ったのか?なぜそれが可能だったに関して...
p.577

一五一七年秋に...マルティン・ルター(1483ー1546)は...「九五ヶ条提題」を発表した。これは宗教改革の発端と言われるが、それは後から見た判断で、ルターはこれをラテン語で書いたのである。

p.582-p.583

カトリック教会は、ラテン語でかかれているかぎりにおいては新発見を報じる書物でも認可し、反対に学者が誰にでも理解される国語で自説を世に広めようとすると、
ただちに告発する場合が多かった。

とあった。ルターが最初にラテン語を用いたのは賢い選択であり処刑を免れるための手段だったのかもしれない。この本を読むまでは真実に目を向けた書が彼ら(カトリック教会の人々)の標的になったのだと思っていたがそればかりではなかったようだ。では俗語で書かれていたという事実そのものがなぜそこまで彼らの怒りを買ったのか?
p.630 に、ラテン語における「文書」という単語の意味についてふれられている。

ラテン語の'auctoritas' は「信ずべきこと」と「権威」の他に「文書」の意味をもつが、文書化されていることはとりもなさず権威を有し、したがってまた「信ずるに値すること」や「信ずべきこと」とされていたのである。

この定義によると内容として権威などとは無関係の内容の書籍であったとしても、書籍になった時点で権威を有する、あるいは有する恐れがあり信ずるに値するということになってしまうのだろう。全くナンセンスな話で子供すらだませないような話だが、この単語の意味がどれだけの影響力を持っていたかを想像することは、教会が一体何を恐れていたかを理解する上で非常に重要な点だと思った。つまるところ、単語の意味づけは社会規範を決定し人の行動と言語活動を制約し、権力者たちにとってはその権力維持を持続する上で重要な手段として活用すべきことでもあったと理解できる。現在もなお、この驚くほど古びた権力維持手段を利用している国があるのはとても残念で滑稽なことだと思う。
10章後半では、ついに学問を追求する上でラテン語で書かれている必要はないと明確に書かれた書籍の紹介に至る。情報公開性の重要性と公共性について言及した文章からは、暗黒のラテン語時代の終焉を迎えようとする人々の未来への希望がひしひしと伝わってきて静かに感動した。また、現在のインターネット上での情報公開性に受け継がれているモラルの発祥のようにも読み取れるのもとても興味深かった。そして、今後、インターネット上でこれまで存在していなかったデータが公開されていく中で何かが大きく変化していく時、そのさなかにいる私たちは案外それをはっきりと認識できない可能性の方が高いのかもしれない、とふと思ったりもした。
2009.06.09 脱字修正

2009/06/03

音楽は自由にする

Book / 音楽は自由にする / 坂本龍一 / 新潮社 / 978-41041-06028

大変面白い本でした。読み終えてみるとおぼっちゃまといったイメージを勝手にもっていたのは不思議なくらい。どういった経緯であれ、すごい曲をつくり続ける人々にまたそれらを聴ける幸せにいつまでも感謝していたいものです。先生とお友達だった話やYMO 誕生の時3人はこたつを囲んでいたって話には笑えました。
こちらも聴いてみた。どれもこれも何度聴いてもびっくりする曲ばかり収録されていてよかった。ただベートーベンのやつは最後の第三楽章が欠けていたのでちょっと寂しかった。

CD / グレン・グールド 坂本龍一セレクション/ グールド(グレン) / SMJ(SME)(M) / 4547366042269

2009/06/02

快適な睡眠に落ちる方法

10,20 など 0 のつく数字は排除した数字を並べる。


1, 2, 3, 4, 5, 6, 7, 8, 9
11,12,13,14,15,16,17,18,19
21,22,23,24,25,26,27,28,29
31,32,33,34,35,36,37,38,39
41,42,43,44,45,46,47,48,49
51,...

これらは一見、9進法にみえるもののよくみるとそうじゃない。そこんとこは無視してこんなようなルールを作ったとする。


1 + 8 = 9
1 + 9 = 11
1 + 11 = 12

2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 11
2 * 6 = 13
2 * 7 = 15
2 * 8 = 17
2 * 9 = 19
2 * 11 = 22

3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 13
3 * 5 = 16
3 * 6 = 19
3 * 7 = 23
3 * 8 = 26
3 * 9 = 29

これを用いると、今現在素数と呼ばれていない数字が素数となり逆に今素数と呼ばれている数字は2,3 などで割り切れてしまい素数ではなくなる。おもしろいことに1桁の数字の2倍の値には今現在素数とされている数が5つも含まれる。
このルールでの21 以下の素数を考えてみると...
2, 3, 5, 7, 9
ここまでは同じだが、11 は 2 で割り切れるので素数ではなくなる。13 も 2 で割り切れるようになるので同様。14 は?
5 * 2 = 11
6 * 2 = 13
7 * 2 = 15
...
ということで14 が9 の次の素数ということになる...。15,16,17 は 2や3で割り切れるので素数ではない。18 は?18 は割り切れないので素数になり、
結局 21以下の素数は


2,3,5,7,9,14,18,21  

ということになる。

こんどはちょっと違う角度から考えてみる。
ひとつの円を描き、中心点の横に数字の0 を書く。円の円周上に時計のように数字を順番に"等間隔"に配置する。ただし配置する数字は1から9までで9の右隣には必ず1が配置されているようにする。次にこの円の直径よりも1センチばかり大きな直径で(好みで何センチでもいい)中心点が最初の円の中心点と重なる円を描く。円周上に11から19 までの数値を等間隔に配置する。この時、最初の円の円周上の1と同じ角度の位置に11をおく。さらに3番目の円には、21から29、4番目の円には31から39と、数値を同様に配置する。これを繰り返し 99 までの数字が配置されている10個の円を描く。今現在、素数とされている100以下の数に丸印をつけてみると"ほぼ"直線上に並んでいることに気づく。では上のルールに従った素数の方をマークしていくと一体どのような図形が浮かび上がるか?
また、中心点0の地点に自分が立っていると仮定し10個の円を夜空に配置したとイメージする。今現在素数と呼ばれている数が星のように光っているものとすると、それらを見上げた時実際の星に重なるものはあるんだろうか?あるいは、このルールにおける素数ではどうか?

なーんてことを眠る時に考えると快適な睡眠に落ちることができます。横になって最初に書いた数字の列を眺めながら考えていると猛烈に眠くなります。ここで間違ってもノートに書いてみようとかコンパスなどを取り出さないことです。快適な睡眠を阻害してしまいます。^_^

--追記--

私は算数が苦手な子供でした。九九を覚える時も覚えが悪い方でした。文章問題が出された時も困惑しました。例えば
「太郎君が100 円をもっておつかいに行きました。20 円のりんごを3つ買いました。さて太郎君はおつりをいくらもらってきたでしょう。」

といった問題がだされたとすると、太郎君は帰り道でおつりを落とさなかったのか?リンゴを買ったそばから食べてしまわなかったのか?太郎君は1つしかリンゴを買えなかったら?帰り道にりんごのかわりにお菓子をかってしまったら?こういったことに夢中で問題を解くどころではありませんでした。
先生はそういったことは考えなくてもよいと言いましたが、なぜ考えなくていいのかが分かりませんでした。太郎君がおつりを落としたら、答えは変わっちゃうのに本当に本当にそれを考えなくていいのかと、とても不思議でした。しばらくして、太郎君はおつりを落とさないしリンゴを3個買ったと書いてあるなら実際3個買ったのだ、何も心配することはない。算数の時はそういうものなんだと教わり、それでやっと問題を解けるようになった覚えがあります。算数の問題に登場する子供たちは自分たちとは違う子供だしそこに登場するお店も暗くて人のいないお店をイメージするようになり変な感じがしたのを覚えています。

算数大好き少年少女だった人にはとても理解しがたい話でしょうがこういう子供がいたことは事実です。ま、要は私はかなり注意散漫なおばかさんだったわけで、今でもその傾向は多分にある故、上に書いたことはどうかゆるーりと読んでください。それにしても、なぜ素数が5つも並ぶのでしょうね...この数え方だと円周率や暦はどうなってしまうんだろう...月までの距離は一体いくつに...Zzz...

2009/05/20

足もとの Windows

こうして


$ cp /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/public.generic-pc.icns  ~/Desktop/
$ open ~/Desktop/public.generic-pc.icns 

目をこらして読むと ...CTRL-ALT-DELETE ... あ
こんなものがはいっていたとは。 Apple.
もうそろそろ Boot Camp Assistant.app を OS X に紛れ込ませるのはやめた方がいいと思う。

遊びついでに *ruby*png で検索してみたら ~/Pictures/iChat Icons/Gems 以外のをみつけた。


$ cp /System/Library//Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.5/doc/img/xml-ruby.png ~/Desktop/
$ open ~/Desktop/open xml-ruby.png

libxml-ruby-0.9.5 は OS X 10.5.7 で新たに入ったのか前からあったのか不明。

こんなのもあった


/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.5/doc/img/red-cube.jpg

なぜキューブなんだろう。

2009/05/19

BloggerAPI POST XML


# coding: utf-8
=begin
# post_xml.rb
# 2009-05-18.

# BloggerAPI POST Request で必要な XML の生成
<entry xmlns='http://www.w3.org/2005/Atom'>
<published>2009-06-01T00:00:00+09:00</published>
<app:control xmlns:app='http://www.w3.org/2007/app'>
<app:draft>yes</app:draft></app:control>
<title type='text'>test_title</title>
<category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/>
<category scheme='http://www.blogger.com/atom/ns#' term='test'/>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>xxx<a href='http://www.google.com'>google</a><br/><img src='ddd.png'/></p>
<pre><code>
  def aaa
  end
</code></pre>
<p>end.</p></div></content></entry>
# 実際は code element 以外,改行なし
=end

# You can redistribute it and/or modify it under the same terms as Ruby.
require "rexml/document"
require 'time'

module BloggerContentDiv

  def setup_div
    ary = @entry.content.strip.lines.to_a
    return nil if ary.empty?
    ary.each_with_index{|x,i|
      to_tag(x)
      tag_p if ary.size == i + 1
    }
    return @div
  end

  def to_tag(x)
    on = {"<pre>"=>"pre","<blockquote>"=>"blockquote"}
    off = {"</pre>"=>true,"</blockquote>"=>true}
    if on[x.strip]
      tag_p unless @str_plain.empty?
      @tag = on[x.chop]
    elsif off[x.strip]
      my_tag
      @tag = nil
    else
      @str_plain << x unless @tag
      @str_tag << x if @tag
    end
  end

  private

  def tag_p
    str = @str_plain.strip
    return nil if str.empty?
    @e_p = @div.add_element("p")
    str.each_line{|w|
      @m = /<(a)|<(img)|<(del)/.match(w)
      @m ? sub_tag_p(w) : @e_p.add_text(w.strip)
      @e_p.add_element("br") if /\n/.match(w)
    }
    @str_plain = ""
    return @div
  end

  def sub_tag_p(line)
    pre_str unless @m.pre_match.empty?
    if @m[1] then tag_a(line)
    elsif @m[2] then tag_img(line)
    elsif @m[3] then tag_del(line)
    end
    s = /<.*?\/>/.match(line)
    post_str(s) if s
  end

  def tag_del(line)
    del = /<del>(.*?)<\/del>/.match(line)
    @e_p.add_element("del").add_text(del[1])
  end

  def tag_img(line)
    href = /<img\ssrc=["'](.*?)["']/.match(line)
    alt = /alt=["'](.*?)["']/.match(line)
    return nil unless href
    img = @e_p.add_element("img",{'src'=>href[1]})
    img.add_attribute({'alt'=>alt[1]}) if alt
  end

  def tag_a(line)
    all = /<a\shref=["'](.*?)["']>(.*?)<\/a>/.match(line)
    @e_p.add_element("a",{'href'=>all[1]}).add_text(all[2])
  end

  def pre_str
    @e_p.add_text(@m.pre_match.chop)
  end

  def post_str(s)
    @e_p.add_text(s.post_match.chop) 
  end

  def my_tag
    case @tag
      when "pre" then tag_pre
      when "blockquote" then tag_block
    end
    @str_tag = ""
  end

  def tag_pre
    @div.add_text("\n")
    str = @str_tag
    e1 = @div.add_element("pre")
    e2 = e1.add_element("code").add_text("\n")
    e2.add_text(str)
    @div.add_text("\n")
  end

  def tag_block
    e1 = @div.add_element("blockquote")
    e2 = e1.add_element("p")
    @str_tag.strip.each_line{|w|
      e2.add_text(w.strip)
      e2.add_element("br") if /\n/.match(w)
    }
  end

end

class BloggerEntry

  attr_reader :title, :content, :published, :category, :control
  attr_accessor :editid, :updated

  def initialize
    @published = nil
    @control = nil
    @title = nil
    @content = nil
    @category = nil
    # these value, after post request
    @editid = nil
    @updated = nil
  end

  def setup(h)
    h.each{|k, v|
      i = "@#{k}".downcase.to_sym
      set_ins(i, v) if i_defined?(i)
    }
    return self
  end

  def to_xml_post
    return BloggerXML.new(self).post_data
  end

  private

  def set_ins(i,v)
    self.instance_variable_set(i, v)
  end

  def i_defined?(i)
    self.instance_variable_defined?(i)
  end

end

class BloggerXML

  include BloggerContentDiv

  def initialize(entry)
    @entry = entry
    @str_plain = ""
    @str_tag = ""
    @tag = nil
  end

  def post_data
    doc = REXML::Document.new()
    doc << REXML::XMLDecl.new(version="1.0", encoding="utf-8" )
    # entry
    @e = doc.add_element("entry", {'xmlns'=>'http://www.w3.org/2005/Atom'})
    # published
    set_published
    # App control element
    set_control
    # Title
    @e.add_element("title", {'type'=>'text'}).add_text(@entry.title.strip)
    # Category
    set_category
    # Content
    content = @e.add_element("content", {'type'=>'xhtml'})
    @div = content.add_element("div", {'xmlns'=>'http://www.w3.org/1999/xhtml'})
    setup_div
   return @e
  end

  private

  def set_published
    unless @entry.published
      n = Time.now.iso8601.to_s
    else
      n = Time.parse(@entry.published).iso8601.to_s
    end
    @e.add_element("published").add_text(n.to_s)
  end

  def set_control
    if @entry.control
      ac = @e.add_element("app:control",
        {'xmlns:app'=>'http://www.w3.org/2007/app'})
      ac.add_element("app:draft").add_text("#{@entry.control}")
    end
  end

  def set_category
    @entry.category.split(",").to_a.each{|c|
      @e.add_element("category",{"scheme"=>'http://www.blogger.com/atom/ns#',  "term"=>"#{c}"})
    }
  end

end

#--- test
title = 'test_title'
content =<<EOF 
xxxx<a href='http://www.google.com'>google</a>
<img src='ddd.png' alt='fff'>
<pre>
   def aaa
   end
</pre>
end.
EOF

category = "Blogger,test"
control = "yes"
h = {:title=>title, :content=>content, :category=>category, :control=>control, :published=>'2009-06-01'}
entry = BloggerEntry.new().setup(h)
puts data = entry.to_xml_post

#--- Start Post
# require 'gdata'
#begin
#  blogID = 'xxxxxxxxxxxx'
#  url = "http://www.blogger.com/feeds/#{blogID}/posts/default"
#  client = GData::Client::Blogger.new
#  client.source = sourcename
#  clientlogin('username', 'password')
#  client.post(url, data.to_s)
#rescue GData::Client::AuthorizationError => e
#  print "gData error\n"
#  print e.message
#end

content =<<EOF
中の pre は本当は小文字 < >で囲まれてる

修正
100 行目あたり
def pre_str
@e_p.add_text(@m.pre_match.chop)
@e_p.add_text(@m.pre_match)
end

def post_str(s)
@e_p.add_text(s.post_match.chop)
@e_p.add_text(s.post_match)
end

2009/05/17

BloggerAPI-パースエラー

ブラウザから手入力して投稿した記事の場合


 <content type='html'><div xmlns='http://www.w3.org/1999/xhtml'>

を含んでいなかったりする。入力してないのだから当たり前に、ない。その為 Blogger API を利用して GET Request し獲得した XML の content 要素は REXML ではパースエラーになってしまう。これを解消する方法をあれこれ考えてみたけれども挫折中。

パースエラーになるってことは例えばカテゴリをいっぺんに変換したくてもできない記事が存在してしまうってことになる。なぜなら、PUT Request でカテゴリを変更するリクエストを投げる時、その xml データには新規記事と全く同様の要素(タイトル、コンテンツ、カテゴリなど)が必要なのであって content は変更しないので含めませんでした、ではリクエストは通らない。

# 試しに content なしのデータを PUT リクエストしてみたところ BadRequest エラーだった。

でも、content を変えたいわけじゃなくてカテゴリーだけ変えたい。content は元のままを維持したい。それで Get で得られた xml の content をパースしてその要素をそのまんま PUT リクエストデータの content にしてしまえば楽だしミスがない。でもパースできないやつがあるってことが分かった。なぜなら div がないから。あるいはひょっとしてタイプミスして変なタグいれちゃったからなんだけど.. orz

# 結局、BloggerAPI からコントロールしたければ全ての記事の content には div 要素が必要だってことは明白になったので元の文章がちゃんとテキストで保存されていて尚かつ変更しやすそうな記事だけ div 要素を加えることができた。

簡単なテスト


  # coding: utf-8
 str=<<EOF
  # ここにパースエラーになった記事の content 要素内容をはりつける。
  # Get Request で得られた XML の entry.elements['content'].text
 EOF

  doc = REXML::Document.new()
  doc << REXML::XMLDecl.new(version="1.0", encoding="utf-8" )
  # Entry element
  x = doc.add_element(
  "entry",
  {'gd'=>'http://schemas.google.com/g/2005','xmlns'=>'http://www.w3.org/2005/Atom'}
  )
  begin
   # div 要素が存在し かつ ほかの要素も xhtml的に正しければこの行でパースが成功する。
    div = REXML::Document.new(str)
    div.add_namespace({ 'xmlns'=>'http://www.w3.org/1999/xhtml'})
    c = x.add_element('content', {'type'=>'xhtml'})
    c.add_element(div)
    puts c
  rescue REXML::ParseException
    # div 要素がない。あるいは div があってもタグがどっかおかしかったりとか変な br があったりとか? 未知
    # 記事中に Ruby の継承である記号があらわれただけでエラーになったりする
    # gstr = str.gsub(" < ", ' &lt; ').gsub("<<","&lt;&lt;")
    # この先どうすべきやら
  end

memo
カテゴリーを指定して Get Request を発行する場合のURL
#参照
# http://code.google.com/intl/ja/apis/blogger/docs/2.0/developers_guide_protocol.html

# URL 例:
# http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie

eco

子供ダマシにもほどがある・・・
http://takedanet.com/2009/05/post_a6ca.html

同感。二酸化炭素をより多く排出する人々が優遇されてて京都議定書なんて軽く無視どころか真逆の方向で大丈夫なんだろうか。そんなことよりお金の流れ?なんですかね。経済効果を狙うなら電車で高い特急料金支払った人も優遇すべきだろうに。

エコポイントなんかも子供だましにみえる。エコポイントはテレビの場合画面のサイズが大きければ大きいほどポイントが高いらしい。不況下の電気メーカー救済したいってちゃんと公表してくれたらよかったのに。

2009/05/09

update gdata-ruby 1.1

download gdata-1.1.0.gem (2009.04.28)
http://code.google.com/p/gdata-ruby-util/downloads/list

% gem19 unpack gdata-1.1.0.gem 
# 
# Unpacked gem: 'download/gdata-1.1.0'
% diff gdata-1.0.0/lib/gdata/ gdata-1.1.0/lib/gdata/
% vi gdata-1.1.0/lib/gdata.rb
# require 'jcode'
# $KCODE = 'UTF8'

# 2009-05-16 category 変更
# 2010-01-06 最新 mblogger

2009/04/15

Ruby のシンボル

String#to_sym ちょっとはまったこと。

Stringクラスの文字列を to_sym してシンボル化しそれをハッシュのキーで利用している時、なにかの間違いで文字列に半角スペースが混入されてしまうとシンボルの中身は :"word " のように文字列がダブルクォートで囲まれたシンボルになる。このままハッシュのキーに登録してしまうと、 h[:word] で問い合わせても nil が返ってきてしまう。こう書くと当たり前のことなんだろうけども、しばらくの間なんで nil になっちゃうのか悩んでしまった。

スペースが混入する文字列をシンボルにすると...


# coding: utf-8
str = "word"
p str.to_sym
# 半角スペース含む文字
str = " word"
p str.to_sym
#=>
#:word
#:" word"

# :word のようにダブルクォートのないシンボルを得るには
# 半角スペース含む文字
str = " word"
p str.downcase.gsub(\s,'').to_sym
#=>
#:word

ダウンケース、ジーサブ、トゥーシム。とおもったけれども...


str = "%word"
p str.downcase.gsub(\s,'').to_sym
=>
:"%word"

記号が混入されている時もだめなのね。んじゃいっそ ダブルクォート含むシンボルがハッシュキーとして登録されてしまったとして、それを前提としてハッシュの取り出し方をかえればいいのか?


h = {:word=>"aaa", :"%word"=>"bbb"}
p h.each{|x| x.find("word")}
p h.select{|x| "word"}
#=>
#{:word=>"aaa", :"%word"=>"bbb"}
#{:word=>"aaa", :"%word"=>"bbb"}

でも、この後めんどうなことに。やっぱりふりだしに戻って


# :word のようにダブルクォートのないシンボルを得るには
# 半角スペースや記号含む文字列
str = " *%$#wor d"
p str.downcase.gsub(\s|[^\w],'').to_sym
#=>
#:word

これでダブルクォートなしのシンボルになるかな。数字があった場合どうしようかな。
--
#2009-05-12.文字化けとタイプミス修正

2009/04/12

from Ruby Forum's RSS

http://www.ruby-forum.com/topic/183806#803619

さよならRuby?ってどういうこと? 投稿者の方は環境問題に興味をうつしたようだ...。

http://en.wikipedia.org/wiki/Permaculture

infoseekの翻訳によると最初のセンテンスは

パーマカルチャーは、自然な生態環境で見つかる関係を模倣する人間の和解と永続的な農業システムを設計するアプローチです。それは、一連の出版物で1970年代の間にオーストラリア人ビルモリソンとデイビッドホルムグレンと彼らの同僚によって最初に開発されました。語パーマカルチャーは、永久の農業(永久の文化と同様に)の旅行かばんです。

と、翻訳されました。よくわからないけど環境に配慮する農業ってことかな。 portmanteau は「旅行かばん」と訳されてしまったけどブランチ(朝食と昼食をかねた食事)のような混成語だったのね。permalink みたいなものかな。

http://ja.wikipedia.org/wiki/かばん語

「Permaculture」or「パーマカルチャー」は日本の wikipedia には登録されていなかった。残念。

ポータブルデバイス

http://yebo-blog.blogspot.com/2009/04/blog-post_12.html

Jobsさんすごい。ポータブルデバイスほしいな。

# 2009-05-16 category 変更

2009/04/09

宇宙の果てを探る-誕生から地球外生命体まで

宇宙の果てを探る-誕生から地球外生命体まで (COLOR新書y) (新書y) / 二間瀬 敏史 / 洋泉社 / 978-48624-83485

小さい本なので読む時に腕が疲れないし持ち運びに便利。素晴らしい写真が多く収録されている。ほぉーと眺めてるだけで楽しい。
まだ科学的に明らかにされていない事がらについて簡潔に述べられている。
# 2009.04.10 テスト投稿改め
# 2009.05.10 category 変更
# 2009-05-16 category 変更

2009/04/02

Blogger API 再考

[2011-06-28]
# 最新
https://github.com/midore/mblogger
https://github.com/midore/xblogger
# 関連する記事
# "Blogger"ラベルがついた全ての記事
# 下記は動かないかもしれません


再考
Blogger API から Postしてみる
# Blogger API 紹介ペーージ
http://code.google.com/intl/ja/apis/blogger
# じっくり読んでみたガイド
Developer's Guide: Protocol
# Google 翻訳 以前にくらべてわかりやすくなったような気がする。
翻訳ページ

It can authenticate using either of two approaches: AuthSub proxy authentication or ClientLogin username/password authentication.

認証には2通りありひとつが AuthSubプロキシ認証、もうひとつが、ClientLogin。認証方法はどちらでもかまわないらしい。(authentication documentation.をみにいくとさらに他の種類の認証方法もあった。)
# 認証の詳細
http://code.google.com/intl/ja/apis/gdata/auth.html
# gdata-1.0.0
gdata-ruby-util
私がダウンロードした Ruby 用ライブラリ gdata-1.0.0 は clientLogin 方式なのだと思う。(lib/Blogger.rb をみると class Base を継承していて class Base は account, password を必要としている。)なので、このライブラリを使用して Blogger.new するってことは自動的に clientLogin 方式を採用したことになる。たぶん。

# gem を通して使わないので gem を解凍
% gem19 unpack gdata-1.0.0.gem
% vi  gdata-1.0.0/lib/gdata.rb
# ここをはずすことで Ruby 1.9.1 でも動くようになる。
# require 'jcode'
# $KCODE = 'UTF8'
# 新しく作る起動用ファイルの冒頭。
# パスに gdata のパスを加える(Ruby 1.9.1 のgem をつかってないので)
% more myapp.rb
# coding: utf-8
$LOAD_PATH.push('/path/to/gdata-1.0.0/lib')
# gdata-1.0.0/lib/gdata.rb
require 'gdata'
require "rexml/document"
require 'time'
############# New 
# インスタンス生成 ダウンロードした gdata-1.0.0 ライブラリの
# Blogger クラスを呼び出す。
bl = GData::Client::Blogger.new
# bl.source には自分のプログラムの名前とバージョン名をいれる。
# いれなくても動くと思う。
bl.source = 'myapp_v1'
# 認証されたかの確認 。
# 認証に失敗した場合は エラーメッセージが表示される。
p token = bl.clientlogin(account, pass)
print "---------- Start\n"
############# Get 1
# 宛先URL : http://www.blogger.com/feeds/profileID/blogs
# profileID と blogID は異なるので注意。私も間違えた。
# profileID の部分は自分のブログの meta タグ内の
# link rel='me' href="http: で始まる url に含まれるID
# 以下を実行すると自分のブログに関連する URL  など
# xmlデータが返ってくる。最初の確認に必要な情報をうるための操作。
# url = 'http://www.blogger.com/feeds/xxxxx/blogs'
# p feed = bl.get(url).to_xml
# puts feed
############# Get 2
# 宛先URL : 
# http://www.blogger.com/feeds/blogID/posts/default?\
# published-min=2008-03-16T00:00:00&published-max=2008-03-24T23:59:59
# blogID は、Get 1で得られた xml に記載されている URL を使う。
# 日付を範囲指定するとその日付範囲内に投稿されたエントリー
#(下書きを含む)の xml がかえってくる。
# min と max で指定
# url = 'http://www.blogger.com/feeds/xxxxx/posts/default?\
published-min=2009-04-01T00:00:00&published-max=2008-04-03T00:00:00'
# res = bl.get(url).to_xml
# puts res
############# Get 3
# 宛先URL : http://www.blogger.com/feeds/blogID/posts/default
# 最新のエントリが[0] その一つ前が[1] (下書き含む)
# feed = bl.get(url).to_xml
# puts feed.get_elements('entry')[0]
############# Post
# 宛先URL : http://www.blogger.com/feeds/blogID/posts/default
#  <app:control xmlns:app='http://www.w3.org/2007/app'>
#    <app:draft>yes</app:draft>
#  </app:control>
# を含めると下書きとして保存される。
# 投稿と同時に公開したい場合はこの要素を削除。
# category ... term="Blogger"/> の 
# attribute term=''  の部分がラベルとなる。複数可。
# str = 上記ガイドの POST 参照 
url = 'http://www.blogger.com/feeds/xxxxx/posts/default'
p res = bl.post(url, str)
p res.status_code
# =>
#<GData::HTTP::Response:...........@status_code=201>
# 201
############# PUTS
# 宛先URL : http://www.blogger.com/feeds/blogID/posts/default/postID
# edit_uri は 宛先URL。Get で獲得したエントリー XMLの 
# entry エレメントにふくまれる link href ... rel='edit' /> の href=''の部分。 
# entry要素は、
# entry xmlns='http://www.w3.org/2005/Atom' gd='http://schemas.google.com/g/2005'
# POST で使用した entry のネームスペースのままだとうまくいかない。
# attribute gd='' が必要のようだ。よくわからないけど。
# edit_uri = 'http://www.blogger.com/feeds/xxxxx/posts/default/xxxxxxx'
# response = bl.put(edit_uri, entry)
# puts response.status_code

# 2009-05-16 category 変更. 改行修正

Mac お絵書きソフト

2009/04/01

daybook_index

下記は
www.midore.nete/daybook/daybook_index.html で公開していたものです。

--

これまでここを訪れてくださった全ての皆様、ありがとうございました。
midore. 2009-04-11

About MidoreDayBook
Archives (2006.10 - 2009.02) Daybook Archives
履歴 rireki.html (import 予定)
派生 ReadBook

MidoreDayBook はわりと気軽に作り始めました。2006年のことです。それを可能にしたのは、第一に「たのしいRuby」の初版がありとても分かりやすく解説されていたこと、第二に Web で様々な情報を得られたおかげです。
その頃 Rubyist Magazine でとある企画の告知を目にしました。次回が最後の添削とあったのでダメモトで応募しました。ruby-list で質問する勇気もなければ IRC とかそういったものに参加する勇気もなかった(今もない)私にとっては相当なことでした。ふりかえってみて添削していただいてよかったと心から感謝しています。

MidoreDayBook のソースコードは良くないやり方のオンパレードですが、趣味プログラミングを愛する人に少しの苦笑いと微笑みをもたらすかもしれません。そうであればいいなと思っています。

出張版 正しいRubyコードの書き方講座―RubyistのRubyistによる、Rubyistとそうでない人のための
images-amazon

ISBN:9784839923204
Author:青木 峰郎
Publisher:毎日コミュニケーションズ
Price: ¥ 2,730
この本の著者で添削者であられる青木峰郎氏の文章の面白さは絶妙です。コラムも素晴らしい内容です。

追記
圧縮ファイル内に Mac 特有のゴミが内包されてしまい申し訳なかったと反省しています。
このようなゴミを削除してくれる Ruby ライブラリ
http://raa.ruby-lang.org/project/unmac

--imported_from
http://www.midore.net/daybook/daybook_index.html

+++ 追記 +++
2010-02-06

関連する記事
"daybook"ラベルがついた全ての記事

2009/03/29

とある文字のコードポイントが示す数の和は素数か?

以下は、自分のサイトでほったらかしていた2つの内容を
文字コードの和
ひさびさにAppleScriptエディタ使った

をまとめて Ruby 1.9.1 で書き直したものです。
たとえば、「google」、このアルファベット6文字のそれぞれの文字のコードポイント(ruby 1.9.1 での)の和は素数か?という意味です。

# coding: utf-8
# prime_number.rb
=begin
# 100以下の素数検出 
# AppleScript. 2006-06-27 
# http://www.midore.net/daybook/2006/5-9/1151381435.html
set seed to {2, 3, 5, 7}
repeat with targetnum from 2 to 100
  my check(targetnum, seed)
end repeat
return seed
to check(targetnum, seed)
  set checklist to {}
  repeat with i in seed
    set end of checklist to targetnum mod i
  end repeat
  if checklist does not contain 0 then
    set end of seed to targetnum
  end if
end check
# =>
# {2, 3, 5, 7, 13, 11, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}
=end
# 2009-03-29.
# 以下は、上記のコードをもとに書き直したもの
def check(x,seed)
  a =[]
  seed.each{|n| a << x % n }
  seed << x unless a.include?(0)
  return seed
end
def sosuu?(n)
  # 大きな数字は計算しない
  return print "error\n" if n > 1000
  seed = [2,3,5,7]
  (2..n).step{|x| check(x, seed) }
  ( seed.include?(n) ) ? "Yes! prime number" : "Not prime number"
end
str, ary = "google", []
str.each_byte{|x| ary << x }
n = ary.inject(0){|sum, n| sum + n }
res = sosuu?(n)
print "number: #{n} is... #{res}\n" if res
# => number: 637 is... Not prime number
# if str = 'g'
# => number: 103 is... Yes! prime number

google の場合は素数でもなんでもなかったのですが、頭文字 g のコードポイントは103で双子素数と呼ばれる数でした!Wow (つーしん) w
http://ja.wikipedia.org/wiki/双子素数
http://ja.wikipedia.org/wiki/103
# 2009-05-16 category 変更

2009/03/28

Blogger API から Putsしてみる

[2011-06-28]
# 最新
https://github.com/midore/mblogger
https://github.com/midore/xblogger
# 関連する記事
# "Blogger"ラベルがついた全ての記事

参考ドキュメント
Using Ruby with the Google Data APIs
http://code.google.com/intl/ja/apis/gdata/articles/using_ruby.html
Google Data on Rails
http://code.google.com/intl/ja/apis/gdata/articles/gdata_on_rails.html
メモ

  entry.add_namespace('http://www.w3.org/2005/Atom')
  entry.add_namespace('gd','http://schemas.google.com/g/2005')

追記
http://midorex.blogspot.com/search/label/Blogger
# 2009-05-16 category 変更

2009/03/26

羊をめぐる冒険

羊をめぐる冒険 (上) (講談社文庫) / 村上 春樹 / 講談社 / 978-40618-36068
羊をめぐる冒険 (下) (講談社文庫) / 村上 春樹 / 講談社 / 978-40618-36075

この本に関して 蓮實 重彦氏は『小説から遠く離れて (河出文庫)』(ISBN 4-309-40431-6)の中で下記のように語っている。少し長いけれど引用してみる。

p.174
村上春樹の「羊をめぐる冒険」は、小説家を自認する人間が書いたものであるが故に小説だというだけの作品であり、....
p.174
村上春樹をも含めてこうした作家に欠けているのは、書くという実践的な体験としての物語的冒険にほかならない。書くことが冒険であるのは、そこに根拠が決定的に欠けているからなのだが、多くの小説家はその無根拠を直視しえず、「宝探し」といった物語に書くことの根拠を仮託せずにはいられない。そのとき、彼らにあっての執筆は技術の問題にすり換えられ、それを統御する術をどの程度心得ているかということだけが、面白さを決定しているということになってしまう。そこでの言葉は、震えてもいなければ、動脈を伝えてもいない。
だから、人が彼らの長編で触れうるものは、言葉ではなく、物語の普遍的な安定性ばかりである。そして、そうした体験しか許そうとしない小説を、われわれは退屈な作品だと自信をもって断言することができる。

書く根拠がない->宝探しに仮託->動脈が伝わらない->退屈
なるほど。蓮實氏にとって「羊をめぐる冒険」は退屈だったらしい。ところで、書かれるべき根拠があったら、読者を退屈させない保障でもあると言いたかったのだろうか?この場合の根拠って何?何をもってしたら根拠だといえる?それが仮に存在しえた場合、それはどのように説明できる?その根拠の有無を決定するのは一体誰なのさ?例えばトルストイの「戦争と平和」は「書く事が実践的な体験としての冒険物語」か?この疑問に蓮實氏は回答を持ち合わせているのだろうか?ここで「戦争と平和」を「聖書」に置き換えてもいいしシェークスピアの「オセロ」に置き換えたっていい。一体だれがそんなことを説明して断言できる?仮にできたとして、それは小説以上の価値をもつのか?

ところで、私はこんな子供同士の言葉のあげあしとりじみたことを列挙する必要はある?

そんな必要はどこにもない。と思う。実は根拠の不在とは、蓮實氏自身の感性の欠落、少しいい方をかえると、世代の限界によって引き起こされて当然の「未知の感覚」なのではないかと疑っている。どの世代にだって特有の感覚はあるんだろう。戦中生まれの人々が共通に感じうる特定の感覚はその後の世代の人間にとっては未知だし決して獲得できそうにない。こんなことはどんな世代にだってありえると思う。ただそれだけのこと。ただそれだけのことなのに...。

「インターネットを使うようになってから世界が二つにわかれちゃったように感じる。」知人がある日の電話でこんなことをつぶやいたのを思い出す。それはインターネットが普及しはじめて何年かたってからだった。いまどき、たとえ同じ世代であったとしても、共通の感覚をあわせもつ保障なんてどこにもない。おたがいがお互いの間にある溝の暗さをただぼんやりみているに過ぎない。それは自分自身の心の闇をのぞいてるかもしれないという何か得たいの知れない感覚を伴っている。知人が言いたかったのはそんなことだったとおもう。

「羊をめぐる冒険」の主人公に対して何かしら感情移入したかしなかったでこの本に対するイメージは180度変化する。蓮實氏にはそのような感情移入はなかったと推測できるのでそういった人は他にもいるのかもしれないが、少なくとも私は感情移入したし心が震えた。あの本の主人公は、本に書かれていないその後に自殺したのではないか?などとくだらない春樹談義に盛り上がったほどだ。当時、私もまわりの人間も村上春樹にぞっこんだったしそれだけ心が震えた小説だった。これは一読者の感想にすぎない。あたりまえだけども。
最近では、テレビがつまらないって話題をテレビが伝えてくれるほどに、マスメディアもなにかの力におされてる。そんな中で生き残っていく本って何なのか、それはなぜそうなのか?をちらりとでも考えるのは、これはこれで面白いことなんじゃないのかなと思う。

# 2009-05-16 category 変更 タイプミス修正

反=日本語論

反=日本語論 (ちくま文庫) / 蓮實 重彦 / ちくま文庫 / 4-480-02043-8

この本はインターネットが世の中に普及するよりもずっと前に購入した。たしか三省堂。違うかもしれない。この本は本の持ち主からその存在をすっかり忘れさられていて「文庫本の箱」の中でお局と化していて、そのうちにブックオフ行き用段ボールかなんかによく確認されないまま移動されちゃうかもしれないような運命にあった。かわいそうに。
この本が再び箱からとりだされたのは、ひとえに

『日本語が亡びるとき―英語の世紀の中で - 水村 美苗』(ISBN: 978-44808-14968)

のおかげです。
これを読み終えて何かわけのわからないストレス感をぬぐいきれないでいる人はいるだろうか。?私には何かが納得できなかった。まるで肩すかしだった。では、なにが?と聞かれるとうまく言葉にできそうにない。
こんな時は、類似した本を読んでみるのも手だと無意識のうちにそんな風に思ったのか、思わなかったか、はたまた気まぐれだったのか自分でもわからないけども文庫本箱に一冊の本をみつけた。耳が折れてるページを中心に読みかえしてみた。さっぱり記憶はよみがえらない。小説なんかの場合は、この作業をするうちにすっかり全体のストーリーを思い出すこともあるけど、学者専用の言葉使いが大好きな人が書いた本は一度読んだくらいじゃ定着しない。まるきり。
「反=日本語論 」はもう一度最初から読みなおすべきだろうか?私が求めている手がかりはありそうか?皆目わからないのでしばらく机の上に常駐してもらうことにした。常駐と積読とは断じて違うのです。
それにしても、蓮實氏が書いた文章を読むといつも学校時代のこわい先生を思い出すのはなぜなんだろ。再読完了は挫折するかもしれない。そしたらまた古い文庫本箱におかえりいただくかもしれない。申し訳ないことです。
# 2009-05-16 category 変更

2009/03/25

ロング・グッドバイ (Raymond Chandler Collection)

ロング・グッドバイ (Raymond Chandler Collection) / レイモンド・チャンドラー / 早川書房 / 978-41520-90102

ずっとむかしに、文庫本でうられていた同じ名前の本を買ってきて、読みかけてやめてしまった。もうすごくむかし。だから、あらたに出版されたこの本は、私にとってはたとえ読み切れなくて途中で興味を失ってもいたしかたない本だった。ところが、読み始めてみたらあっというまによみおえてしまって、しまった。と思っている。またいつか、何年かして読み返した時、マーロウさんの男の美学?を私はどう感じるかな。。。あとがきで訳者がフィッツジェラルドについて言及していて、そのあたりもとても面白かった。このあとがきは、食後のデザートタイムのようだった。満足をみたし食事の終わりを告げてくれている。
# 2009-05-16 category 変更

テレビからの情報

何日か前、たまたまテレビをつけたらアメリカの市民メディアについて報じる内容でついみいってしまった。DemocracyNow というサイトがあるらしい..。検索してみた。

# DemocracyNow
http://www.democracynow.org

# DemocracyNow 日本語サイト
http://democracynow.jp/
日本語字幕あってうれしい。

# オリジナルーハワード・ジン「戦争と社会正義」について
http://www.democracynow.org/2009/1/2/placeholder_howard_zinn

# 日本語ーハワード・ジン「戦争と社会正義」について
http://democracynow.jp/submov/20090102-1/

ユーモアにあふれていてとても面白かった。ひょっとしたら、ハワード氏は日本をかなりうらやましいと感じていらっしゃるのかな?と思った。
オバマ大統領に対する本音トークはとても誠実な印象を受けた。オバマ大統領がアフガニスタンから軍を撤退させたら、彼は本当の意味で世界のヒーローになるのになーと思った。

# 「貧者の銀行」のムハマド・ユヌス、ソーシャルビジネスと資本主義の未来を語る
http://democracynow.jp/submov/20080212-3flv

最近読んだ本の中でもこの銀行について書かれていたっけ。本人の話をこうして見られるなんて。インターネットって本当に便利だ。この銀行に反対する人の意見も聞けてバランスのとれたいい内容だと思った。

# 奴隷制とよばれない奴隷制 黒人再奴隷化の歴史
http://democracynow.jp/submov/20080711-2flv

このお話にはかなりびっくりした。実際は、第二次世界大戦が始まるころまで黒人の人々は解放されていなかったなんて。。まじめにまじめに耳を疑う話。

# 2009-05-16 category 変更

天使と悪魔 映画化ー反物質

反物質研究者 ソニー映画「天使と悪魔」表現に異例の指摘
http://slashdot.jp/science/article.pl?sid=09/03/19/0114213

「天使と悪魔」の虚と実 50のポイント
http://nucl.phys.s.u-tokyo.ac.jp/hayano/angles_and_demons_fact_vs_fiction/FACT.html

# 2009-05-16 category 変更

Blogger API からラベルつき投稿

[2011-06-28]
# 最新
https://github.com/midore/mblogger
https://github.com/midore/xblogger
# 関連する記事
# "Blogger"ラベルがついた全ての記事
# 下記は動かないかもしれません。

をするためには...いろいろためした結果わかったこと

def make_doc(title, content)
 n = Time.now.iso8601
 doc = REXML::Document.new()
 doc << version="1.0" encoding="utf-8"
 # 2009-05-18 加筆訂正
 entry = doc.add_element("entry", {'xmlns'=>'http://www.w3.org/2005/Atom'})
 #content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'
 content = entry.add_element("content", {'type'=>'xhtml'})
 div = content.add_element("div", {'xmlns'=>'http://www.w3.org/1999/xhtml'})
 div.add_text(content)
 entry.add_element("published").add_text(n.to_s)
 entry.add_element("title", {'type'=>'text'}).add_text(title)
 entry.add_element("category",{"scheme"=>'http://www.blogger.com/atom/ns#',  "term"=>'Blogger'})
 con = entry.add_element("content", {'type'=>'html'})
 
 #con.add_text(content)
 
 return doc
end

書き加えた箇所

 entry.add_element("category",{"scheme"=>'http://www.blogger.com/atom/ns#', "term"=>'Blogger'})

category エレメントの term => 'xxxx' で指定した文字列がラベルとなって反映されるようだ。
このメソッドで作成する XML ドキュメントは、ひょっとして何かが足りないかもしれないし何かが不要なのかもしれないけども、
投稿には成功している。です。
追記訂正 2009-04-10
http://midorex.blogspot.com/search/label/Blogger
2009-05-19 作り直しBloggerAPI POST XML

2009/03/23

未納が増えると年金が破綻する」って誰が言った? ~世界一わかりやすい経済の本~ (扶桑社新書)

Book /「未納が増えると年金が破綻する」って誰が言った? ~世界一わかりやすい経済の本~ (扶桑社新書) / 細野 真宏 / 扶桑社

この本は「年金問題」を社会保障問題としてとりあげる本じゃなくて年金に関する「一般共通認識」を深めるための入門書なので諸問題はあえて無視しているのだろう...と思う。そこはちょっと教科書のような語り口。ただし教科書では教えてくれない大切なことが詰まってる良書。
以下、読書中感想。
p.158

「未納者」というのは、「国民年金」において全体の 5% 程度の話に過ぎないのです!。

p.159 の一覧表によると
公的年金加入者 7012万人の内訳
1号保険者は 2035 万人
2号保険者は 3914 万人
3号保険者は 1063 万人
1号保険者の内訳
保険納付者 1209 万人
免除者 315万人
特例者 猶予者 203万人
未納者 308 万人
未納者308万人。公的年金加入者7012万人と記載されている。実際計算してみると、308 割る 7012 は 4.3(以下切り捨て)著者の言うとおり未納者は5%にも満たない。
では、未納率が6割などといった報道は一体どこの数字に対する6割だったのか?この表をたより6割に一番近い数字を得られるのは、2号保険者 3914 万人 を対象にしちゃった時だ。3914 割る 7012 は 0.55(以下切り捨て)
まさかね。2号保険者ってすなわち厚生年金加入者なんだから未納にしたくてもできない人たち、まさかそこ間違えないよね...どこをどう間違えれば「6割が未納」なる報道に至るまでをひきおこしたんだろか。数字のどこかにその手がかりをみいだしたかったけど...わからず。
ま、著者の方も書いてるとおり、とにもかくにもマスコミによる報道をうのみにしないのはとても重要。と。
この本の極意はここかな。
p.162

その未納者には年金を支払う必要がないので、その「未納者ぶんの保険料」が「年金積立金」から減っても、特に問題は起こらないのです。

なーるほど。確かに!。なっとく。
ちょっと気になる箇所
p.154

「税方式」論の「間違い」とは?(1)

この見出し、「税方式」論の「間違い」とあるので、あたかも「税方式」による案がかかえる脆弱性の根拠でも書かれてあるかのような見出しだが、ただ単に「税方式論を推進する一部の人の一部の現状認識の誤り」について語られているに過ぎなくて「税方式論」の見通しの甘さや提案された運用方法に対する試算の誤りを指摘説明するものではない。と私は思うのだけど、このあたり、なにかしら経緯でもあったんだろうか?
前半からの、流れるようないきいきとしたテンポがここでポキンと途切れるような印象を受けてしまった。
もう1点。
p.187

増税ぶんを社会保障費に使う(自分たちの将来の安心のために使う)ことでキチンと国の社会保障の安心につながれば...

と、まるで「明日晴れれば」と同じくらいにさらりと書かれてあるのだけど、消費税がキチンと安心のためには使われる保証がなんてあるのかいな?。むかし消費税が5%になる時「福祉税」って呼ばれていたのに、その後高齢者の医療費高くなったし介護年金できちゃったし一般の人の医療費も高くなったし、リハビリ受けられなくなって(前は受けられたのに)困ってる人続出してるし国民年金だって値上がったし障害者の人も大変な目にあってるみたいだし病院もつぶされるくらいいじめられてるし年金払ったのに記録がなかったとか、あとなんだろ他にも...この5,6年の間に日本の社会保障はぼろぼろになりましたよね。そして、グリンピア...。と。
それで、あの福祉税(現在の消費税)てなんだったのよ。と疑問は残ったままなわけで。今度消費税があがる時はこのお金は社会保障以外に絶対に使いませんって憲法なみの拘束力もったパワフルな法律でも定めてもらわないと、とてもじゃないけど安心に近づけないのでは?「福祉税」て呼び名に聞き覚えのある世代はまだまだ老人にはなってないので、消費税増額と聞くとあっ!福祉税と思い出さなくてもいいことまでつい思い出しちゃう人もいたりして...さ..。
オバマ大統領の活躍が華々しいだけに日本とアメリカのその差がますますくっきりと浮かび上がってしまう今日このごろ。。。
# 2009-05-16 category 変更

日本人だけが知らないアメリカ「世界支配」の終わり

Book / 日本人だけが知らないアメリカ「世界支配」の終わり / カレル・ヴァン・ウォルフレン / 徳間書店 / 978-41986-23623

p.265

...私は日本がこの歴史を消化しきれていないことが問題なのだと考える。つまり日本は過去の自らの歴史を受け入れていない、歴史と折り合いをつけることができずにいる、ということなのである。実際、日本はその点でかなり重症である。そして戦後、日本社会はその政治システムを真に再編することなく、つまり未消化の歴史が一部の人々の脳裏に残されたままの状態で、うまく運営されてきたのだ。

重症だそうだ。
たまたま買った雑誌文藝春秋 2009年 04月号 [雑誌] に「教科書が教えない昭和史ーあの戦争は侵略だったのか」という特集がくまれていた。なかなか人をおびきよせたい意思みなぎるタイトルがつけられている。
ところが激しく意見の異なる者同士がおりなす対談内容は結果的には「ええ、だから、わたしたち戦後を消化しきれていません」とみんなで宣言しているかのようにも読めてしまうのは、ある意味すごいなぁと思った。
この号には、他のページで茂木健一郎さん、天野祐吉さん、柄本明さん、勝間和代さん、村上春樹さん、などが紹介されていたりインタビューされていたりしています。
この方々に今回の「教科書が教えない昭和史ーあの戦争は侵略だったのか」対談をお願いしていたらどういったことになったんだろう。
少なくとも「ええ、だから、わたしたち結局消化しきれていません」といったオチにはならなかったんじゃないのかな?と思ったりした。
# 2009-05-16 category 変更

2009/03/22

文藝春秋 2009年 04月号 [雑誌]

文藝春秋 2009年 04月号 [雑誌] / 文藝春秋 / 491-00770-10498

村上春樹「なぜイスラエルに行ったのか」インタビュー掲載とのニュースをききつけ購入。
この雑誌買ったのはむちゃくちゃ久しぶり。この雑誌ってまだあったのかって思ったくらい。
(失礼)
そりゃ誰だってドンパチやってる国には行きたくない。。。けれども実際行ってきた人がいて、その人はその国の偉い人たちを前にして「あんたたちドンパチやめた方がいいよ」と暗に伝えてきたっていうんだから...とにかくものすごく勇気がある人だなと思った。
日本語のスピーチを読んだ。村上春樹氏が世界に向けて発信する愛が伝わってきた。
# 2009-05-16 category 変更

天使と悪魔

天使と悪魔 (上) (角川文庫) / ダン・ブラウン / 角川書店

映画化 2009.05 上映予定。
# 2009-05-16 category 変更

文明の衝突と21世紀の日本 (集英社新書)

Book / 文明の衝突と21世紀の日本 (集英社新書) / サミュエル・P. ハンチントン/ 集英社

カレル・ヴァン・ウォルフレン氏は、
『日本人だけが知らないアメリカ「世界支配」の終わり』(ISBN: 978-41986-23623)
の中で次のように語っている。
p.288

政治的な衝突というのは、異なるイデオロギーや利害をもつ国家間で起こるのではなく、異なる文明圏に所属する国家間で起こるというのがハンチントンの主張だった。...(略)この本は多くの科学的な推測の羅列すぎず、しかも正確さに欠ける内容も含まれていた。しかし、ともかくも、この本は敵を欲するアメリカの意には適っていた。...(略)彼の思想には、国の意思を教鞭に主張すべきであるとする日本の国粋主義者に似たところがある。

この本とは「文明の衝突と21世紀の日本 (集英社新書)」を指している。
# 2009-05-16 category 変更

2009/03/15

Adobe Flash Player

Flash Player インストールできたか確認するページ。
http://www.adobe.com/jp/software/flash/about/

ローカル共有オブジェクトを管理および無効化する方法
http://www.adobe.com/jp/support/kb/ts/228/ts_228706_ja-jp.html

# 2009-05-16 category 変更

2009/03/05

投稿テスト

時間封鎖〈上〉 (創元SF文庫) / Robert Charles Wilson / 茂木 健 / 東京創元社 / 9784488706036

2009/03/03

Blogger API から Postしてみる

[2011-06-28]
# 最新
https://github.com/midore/mblogger
https://github.com/midore/xblogger
# 関連する記事
# "Blogger"ラベルがついた全ての記事
# 下記は動かないかもしれません。

gData , Blogger API などで検索
http://blogger.ukai.org/2009/02/ruby2009.html
ここでGoogle が提供する gdata-ruby-util の存在を知った。
gdata_on_rails.html
Rails を使用するようだ?けどRails を使っていなくても参考になった。
gdata-ruby-util
から gdata-1.0.0.gem を手動ダウンロード。
% mv gdata-1.0.0.gem.tar gdata-1.0.0.gem
% gem19 unpack gdata-1.0.0.gem
Google Search keyword: gem 展開
参考になったページ
http://d.hatena.ne.jp/walf443/20080920/1221916162
http://blog.s21g.com/articles/1301
ダウンロードした gdata-1.0.0 をRuby 1.9.1 でうごくように少しかきかえた
% vi gdata-1.0.0/lib/gdata.rb 
# 20 行目あたりを編集。
# This is for Unicode "support"
#require 'jcode'
#$KCODE = 'UTF8'
---

# coding: utf-8
# post-gdata.rb
$LOAD_PATH.delete(".")
$LOAD_PATH.push('/path/to/BloggerAPI/gdata/gdata-1.0.0/lib')
require "rexml/document"
require 'time'
require 'gdata'
class MyBlogger
  def initialize(ary)
    @ary = ary
    @client = GData::Client::Blogger.new
  end
  def base(account, pass, url)
    doc = txt_to_xml
    # get token
    @client.clientlogin(account, pass)
    @client.prepare_headers
    # {"GData-Version"=>"2", "User-Agent"=>"GoogleDataRubyUtil-AnonymousApp", "Content-Type"=>"application/atom+xml"}
    @client.post(url, doc)
    #=> GData::HTTP::Response: @body=" ?xml version='1.0' .........@status_code=201
  end
  def txt_to_xml
    title = @ary[0].chomp
    content = @ary[2..@ary.size].join("").strip.gsub("\n","
")
    return make_doc(title, content)
  end
  def make_doc(title, content)
    n = Time.now.iso8601
    doc = REXML::Document.new()
    doc << REXML::XMLDecl.new(version="1.0", encoding="utf-8" )
    entry = doc.add_element("entry", {"xmlns" => "http://www.w3.org/2005/Atom"})
    entry.add_element("published").add_text(n.to_s)
    entry.add_element("title", {'type'=>'text'}).add_text(title)
    con = entry.add_element("content", {'type'=>'html'})
    con.add_text(content)
    return doc
  end
end

# File をあたえる
txt_ary = ARGF.readlines
# この url は 自分の Blogger URL トップページソース内
# link rel='self' type='application/atom+xml' で始まる行のリンク先
url = 'http://midorex.blogspot.com/feeds/posts/default'
# Blogger のアカウントとパスワード
account = 'xxx'
pass = 'xxx'
m = MyBlogger.new(txt_ary)
p m.base(account, pass, url)
30 行目あたりの真意は
content = @ary[2..@ary.size].join("").strip.gsub(改行、<br/>)
このBlogger に投稿すると本当の br と解釈されてしまうためコードが消えてるだけ。
pre とか、code といったタグが出現したらその中の文字列を解釈しないようになっていたら便利なんだけど...
それともなんか方法があるのかな。
Ruby 1.9.1 で実行
% ruby19 post-gdata.rb textdata.txt
textdata.txt の1行目がタイトルに、2行目以下がコンテンツに。
投稿に成功すると@status_code=201 が返る。
+++
追記 
2009-04-02 Blogger API 再考
2009-05-19 category 変更
2009-05-19 作り直しBloggerAPI POST XML
2010-01-06 最新 mblogger