2008/12/20

LANG of scpt

shoes2 を
http://shoooes.net/tutorial
ダウンロードしてとりあえずオセロなど動かしていたら思い出したこと。

astest.rb

#!/pathto/ruby191/bin/ruby
# -*- coding: utf-8 -*-

begin
  e = Encoding.default_external.name
  abort "Lang Error #{e}\n" unless e == "UTF-8"
rescue
  abort "ruby version Error\n"
end
print e


これを、ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0] で実行すると

UTF-8

が返ってくる。この astest.rb に実行権限を与えてやり AppleScript から実行できるようにしておく。
今度は AppleScript から astest.rb を実行するためのスクリプト(myscpt.scpt)をつくり astest.rb と同じ階層に保存。

myscpt.scpt

# AppleScript's version "2.0.1". OS X 10.5.6 
# dir_base =>いまいる(このファイルの保存場所)ディレクトリの親ディレクトリ
tell application "Finder"	
  set dir_base to POSIX path of (folder of (folder of (path to me) as alias) as alias)
end tell
# dir_bin =>親ディレクトリ内 bin ディレクトリ
set dir_bin to dir_base & "bin/"
# コマンドテキスト生成
set comstr to "cd " & dir_bin & "; ./astest.rb"
# 発行
set res to do shell script comstr


これを実行するとなぜかエラーになる

AppleScript エラー
Lang Error US-ASCII


改めてターミナルで自分の今の環境変数を確認してみたけれど US-ASCII ではない。

% env |grep LANG
LANG=ja_JP.UTF-8


回避策はあるのだろうか?と考えた末...

# コマンドテキスト生成
#set comstr to "cd " & dir_bin & "; ./astest.rb"
set comstr to "export LANG='ja_JP.UTF-8';cd " & dir_bin & "; ./astest.rb"

結果

"UTF-8"

do shell script 中でLANG を設定してやればいいようだ。こんなことができるなんて初めて知った。

set comstr to "ENV"
set res to do shell script comstr

で、AppleScriptの環境変数をみることができた。どうやらここではまっていたようだ。。。

+++ memo +++
教訓:AppleScript が使う環境変数と自分の環境変数は異なる # OS X 10.5.6
ruby 1.9.x のものを AppleScript から実行してエラーが発生する時は encoding の問題かもしれないので注意が必要。と。

+++ 追記 +++
2009-01-27.
http://developer.apple.com/jp/technotes/tn2002/tn2065.html
http://developer.apple.com/qa/qa2001/qa1067.html
これらを読んでわかったこと. ENV LANG は

tell Application "Finder" ...
tell me ...

からは取得できない。

tell application "Finder"
  set lang to do shell script "ENV"
end tell
lang

これらが返す値に HOME, PATH, USER... などは含まれているものの肝心の LANG は含まれていない。

tell application "Terminal"
  set lang to do shell script "ENV"
end tell

には LANG は含まれている。
というこことから export しないで LANG 取得するにはこれが最短かなあ。

tell application "Terminal" to set lang to do shell script "ENV|grep LANG"
=>
"LANG=ja_JP.UTF-8"

でも、Terminal 起動させちゃうのはちょっと...

ちなみに
http://macscripter.net/viewtopic.php?id=24805
を読んで試したら

set SystemLanguage to do shell script "defaults read .GlobalPreferences AppleLanguages | tr -d [:space:] | cut -c2-3"
=>
"ja"

だけだった。

+++ さらに追記 +++
2009-01-29.

プログラミング Ruby
P41 を読んで
エンコーディング名を指定して ruby 1.9.1 を起動する方法がわかった

% cat as-test.rb
#!/path/to/ruby191/bin/ruby1.9 -E utf-8
# coding: utf-8
begin
  str = ARGV[0]
  if str
    puts str_e = str.encoding.name
    puts str_v = str.valid_encoding?
  end
  e = Encoding.default_external.name
  abort "Lang Error #{e}\n" unless e == "UTF-8"
rescue => err
  abort "Error.#{err}.\n"
end
print "ExtEncoding:#{e}\n"
print __ENCODING__, "\n"
% ./as-test.rb aa
=>
UTF-8
true
ExtEncoding:UTF-8
UTF-8


AppleScript からの呼び出しテスト
as-test.scpt をデスクトップに保存ー実行。

# as-test.scpt
tell application "Finder"
  display dialog "input" default answer "あいうえお"
  set str to text returned of result as text
  set path_file to POSIX path of (file "as-test.rb" of desktop as alias)
  set a to do shell script "./" & path_file & " " & str
  end tell
  a
=>
"UTF-8
true
ExtEncoding:UTF-8
UTF-8"


+++ memo +++

AppleScript ダイアログで受け取る文字列のエンコーディングは Ruby を通じて UTF-8 になっているのが確認できた。それでも、受け取る側の Ruby File ではその文字列をなにか処理する時には本当にUTF-8 か?とか valid か?をみるようにしておいたほうがいいのかも。

OS X 10.5.6
AppleScript's version "2.0.1"
Finder's version "10.5.8"

--imported_from
http://www.midore.net/daybook/2008/12/1229704901.html

2008/12/09

command-line-with-ruby

コマンドラインで対話するためのクラスを作ってみた。
http://doc.loveruby.net/refm/api/view/class/Timeout
を参考にした。
リファレンスに書かれているように何秒かするとタイムアウトし終了するようにした。$stdin で受けとる文字列が yes or no の場合と、数字の場合と、アルファベットなど文字を1文字の場合とを用意してみた。timeout() は、require 'timeout'しないと使えないけれど、もしもほかの用事で require 'net/http' していたら require 'timeout' を書かなくても timeout() を使うことができた。

CommandLine.new().yesorno
y or yes のとき true をそれ以外の場合 false をかえす。

% ruby19 -rmyttymess.rb -ve "Myttymess::CommandLine.new().yesorno"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please Select [y/n]:
y
true
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
n
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
a
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
Timeout...bye.
false


CommandLine.new().character
1つの文字であればその文字を返し、そうでない場合 false が返る。数字の場合も1桁の数字ならok。
ruby 1.9 の場合 日本語の「あ」も1文字と解釈してくれた。
ruby 1.8.6 の場合は false になった。

% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
a
"a"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
abc
false
% ruby19  -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please input one char:
あ
"あ"
% ruby -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
Please input one char:
あ
false


CommandLine.new().number(max)
max に指定した数字以下なら入力された数字を それ以外の場合 falseを アルファベットなど文字の場合 false を

% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
9
"9"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
10
"10"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
11
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
a
false


myttymess.rb

1 #!/pathto/ruby19/bin/ruby
2 # -*- coding: utf-8 -*-
3 
4 # myttymess.rb
5 # ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
6 # 2008-12-06.
7 
8 ######################################################
9 # reference:
10 # http://doc.loveruby.net/refm/api/view/class/Timeout
11 ######################################################
12 
13 # if require 'net/http', unnecessarily require 'timeout'.
14 # 'net/http.rb' require 'net/protocol.rb'. 'net/protocol.rb' require 'timeout'.
15 
16 require 'timeout'
17 
18 module Myttymess
19 
20   class MyError < Exception; end
21 
22   class StdinGets
23 
24     def interactive(mess, opt)
25       return false unless $stdin.tty? == true
26       print "#{mess}:\n"
27       ans = $stdin.gets.chop
28       m = /^y$|^yes$/.match(ans)
29       return false if /n/.match(ans) # n or no == stop
30       return false if ans.empty?     # ans is String class
31       case opt
32       when true   # yes or no
33         return false if m.nil?
34         return true
35       when false  # return one character
36         return false if ans.size > 1
37         return ans
38       else        # return number =< Max Number
39         return false if ans == "0"
40         return false if ans =~ /\D/
41         return false if ans.to_i > opt.to_i
42         return ans
43       end
44     end
45 
46     def message(str,opt)
47       ans = ''
48       begin
49         timeout(5, MyError){ans = interactive(str, opt)}
50       rescue MyError => err
51         puts "Timeout...bye.\n"
52         return false
53       end
54       return ans
55     end
56 
57   end
58 
59   class CommandLine
60 
61     def yesorno
62       str =  "Please Select [y/n]"
63       p ans = StdinGets.new().message(str, true)
64       return ans
65     end
66 
67     def number(max)
68       str =  "Please Select Number"
69       p ans = StdinGets.new().message(str, max)
70     end
71 
72     def character
73       str =  "Please input one char"
74       p ans = StdinGets.new().message(str, false)
75     end
76 
77   end
78 
79 end
80 
81 #Myttymess::CommandLine.new().yesorno
82 #Myttymess::CommandLine.new().number(max)
83 #Myttymess::CommandLine.new().character


--imported_from
http://www.midore.net/daybook/2008/12/1228833000.html

2008/12/08

amazon-aws-with-ruby1.9.1

コマンドで ean を指定すると、amazon にアクセスしその本の情報を返してくれるものをつくってみた。
せっかくなので ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0] で作ってみた。
useaws.rb xxx を実行すると、xxxの番号が本の場合なら Book class のto_sを、CD の場合は Music classのto_sをかえす。
その他のメディアは作ってない。

%./useaws.rb 9784763198426
# =>
[Book][9784763198426][-][-]| アホは神の望み | 村上 和雄 | 2008 | ¥ 1,680


とか
% pathto/ruby/191 useaws.rb 9784763198426 > aho.txt
% open aho.txt
などして使う。

+++ memo +++

アマゾンからデータ(xml)を取得したデータは、utf-8 か?をチェックしてそうじゃなかったらutf-8にしないといけないんだけど、force じゃなくてもいいのかもしれない。

BaseItem#setup でハッシュのデータをもとにインスタンス変数を生成する際 Proc を使ってみた。使ってみたかったので使っているにすぎなくて適切かどうかはよくわかっていない。

カンマを付与するメソッド comma(n) は「Ruby Way」[第二版] P147に掲載されていた素晴らしいやつにちょっと挑戦してみた。「Ruby Way」ではわずか3行なのに自分のは長くてわかりにくい。本当は、もとのデータの price format をどこかに保存しておいてそれを to_s が使えるようにしてやればいいんだけど、ゆくゆくは marshal data にしたい思惑があったので、数字なら数字を、文字列ならば文字列を Book class or Music class に持っていてほしいと考えてるうちにこのように...

おかしな点などいろいろあるかと思われます

% cat -n aws.rb

     1	# -*- coding: utf-8 -*-
     2	# aws.rb
     3	# ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
     4	
     5	require 'rexml/document'
     6	require 'uri'
     7	require 'net/http'
     8	
     9	module AWS
    10	
    11	  class Amazon
    12	
    13	    def initialize(str=nil)
    14	      unless str.nil?
    15	        case str.encoding.name # String
    16	        when "UTF-8"
    17	          @xml = REXML::Document.new(str)
    18	        else
    19	          ustr = str.force_encoding("UTF-8")
    20	          @xml = REXML::Document.new(ustr)
    21	        end
    22	      end
    23	      @h = Hash.new
    24	      @i = nil
    25	    end
    26	
    27	    def item
    28	      dh = data_to_h
    29	      unless dh.nil?
    30	        @i = selectitem
    31	        return nil if @i.nil?
    32	        @i.setup.call(@h)
    33	        return @i
    34	      end
    35	    end
    36	
    37	    private
    38	
    39	    def selectitem
    40	      g = @h["ProductGroup"]
    41	      return Book.new() if g == "Book"
    42	      return Music.new() if g == "Music"
    43	    end
    44	
    45	    def data_to_h
    46	      return nil if @xml.nil?
    47	      return nil if @xml.to_s =~ /Error/ #or @xml.to_s.empty?
    48	      return nil unless @xml.encoding == "UTF-8"
    49	      getelement
    50	      set_data
    51	      return @h
    52	    end
    53	
    54	    def getelement
    55	      ei = @xml.root.elements["Items/Item"]
    56	      @attrib = get(ei,"ItemAttributes")
    57	      @img = get(ei,"MediumImage")
    58	      @url = get(ei,"DetailPageURL")
    59	    end
    60	
    61	    def set_data
    62	      @attrib.each{|x| @h[x.name] = plural(@attrib,x.name)}
    63	      @h.delete_if{|k,v| v.nil?}
    64	      setprice
    65	      setimg
    66	      seturl
    67	      @h["EAN"] = @h["EAN"].to_i
    68	      @h["ISBN"] = @h["ISBN"].to_i unless @h["ISBN"].nil?
    69	      @h["price"] = @h["price"].to_i
    70	    end
    71	
    72	    def get(ele,str)
    73	      ele.elements[str]
    74	    end
    75	
    76	    def plural(ele,str)
    77	      e = ele.get_elements(str)
    78	      case e.size
    79	      when 0
    80	      when 1
    81	        ele.elements[str].text
    82	      else
    83	        @h[str] = e.map{|i| i.text}.join(" / ")
    84	      end
    85	    end
    86	
    87	    def setprice
    88	      @h["price"] = @attrib.elements["ListPrice/FormattedPrice"].text.gsub(/\D/,'')
    89	    end
    90	
    91	    def setimg
    92	      @h["mediumimage"] = @img.elements["URL"].text unless @img.nil?
    93	    end
    94	
    95	    def seturl
    96	      url = exurl(@url.text) #url.encoding => <Encoding:UTF-8>
    97	      return nil unless url.encoding.name == "UTF-8"
    98	      eurl = url.gsub(/\?SubscriptionId=.*/u,'')
    99	      m = /amazon.co.jp\/(.*?\/)/u.match(eurl)
   100	      @h["url"] = eurl.gsub(m[1],'') # => "http://www.amazon.co.jp/dp/4274065979"
   101	    end
   102	
   103	    def exurl(string)
   104	      # reference: lib/ruby/1.9.0/cgi/util.rb #line.15
   105	      enc = string.encoding
   106	      string.gsub(/%([0-9a-fA-F]{2})/){[$1.delete('%')].pack("H*")}.force_encoding(enc)
   107	    end
   108	
   109	  end
   110	
   111	  class Seturi
   112	
   113	    def initialize(aws_accessKeyId=nil, associate_ID=nil)
   114	      @aws_key = aws_accessKeyId
   115	      @aws_id = associate_ID
   116	      @jp_ecs = 'http://ecs.amazonaws.jp'
   117	      #http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService
   118	    end
   119	
   120	    def seturi(ean)
   121	      return nil if @aws_key.nil?
   122	      return nil if @aws_id.nil?
   123	      uri = URI.parse(@jp_ecs)
   124	      uri.path='/onca/xml'
   125	      q = [
   126	        "Service=AWSECommerceService",
   127	        "AWSAccessKeyId=#{@aws_key}",
   128	        "Operation=ItemLookup",
   129	        "ItemId=#{ean}",
   130	        "AssociateTag=#{@aws_id}",
   131	        "ResponseGroup=Medium"
   132	      ]
   133	      ean = ean.to_s
   134	      case ean.size
   135	      when 10
   136	        q << ["SearchIndex=Books" ,"IdType=ISBN"]  # Book isbn 10
   137	      when 12
   138	        q << ["SearchIndex=Music", "IdType=EAN"]   # Not japanese CD
   139	      when 13
   140	        if ean.to_s =~ /^978|^491/                 # Book isbn 13 (EAN)
   141	          q << ["SearchIndex=Books" ,"IdType=EAN"]
   142	        elsif ean.to_s =~ /^458/                   # japanese DVD
   143	          q << ["SearchIndex=DVD", "IdType=EAN"]
   144	        else
   145	          q << ["SearchIndex=Music", "IdType=EAN"] # Japanese CD
   146	        end
   147	      end
   148	      uri.query = q.join("&")
   149	      return uri
   150	    end
   151	
   152	  end
   153	
   154	  class Access
   155	
   156	    def initialize(uri)
   157	      @host = uri.host
   158	      @request = uri.request_uri
   159	    end
   160	
   161	    def reponse
   162	      res = ""
   163	      begin
   164	        Net::HTTP.start(@host){|http|
   165	          response = http.get(@request)
   166	          res = response.body
   167	        }
   168	        sleep 2
   169	        return res
   170	      rescue SocketError
   171	        return 'socket'
   172	      end
   173	    end
   174	
   175	  end
   176	
   177	  class BaseItem
   178	
   179	    attr_reader :group,:ean, :title, :author, :price
   180	    attr_accessor :memo, :genru
   181	
   182	    def initialize
   183	      @adddate = Time.now.strftime("%Y-%m-%d %H:%M:%S")
   184	    end
   185	
   186	    def values
   187	      ary = []
   188	      self.instance_variables.each{|v|
   189	        val = instance_variable_get(v)
   190	        ary << val unless val.nil?
   191	      }
   192	      return ary.join("_")
   193	    end
   194	
   195	    def setup
   196	      Proc.new do |h|
   197	        h.each{|k,v|
   198	          s = "@#{k}".downcase.to_sym
   199	          set_ins(s,v)
   200	        }
   201	        set_ins(:@genru,'-')
   202	        set_ins(:@memo,'-')
   203	        nil
   204	      end
   205	    end
   206	
   207	    private
   208	
   209	    def set_ins(i,val)
   210	      val = val.encode("UTF-8") if val.kind_of?(String)
   211	      self.instance_variable_set(i, val)#unless val.nil?
   212	    end
   213	
   214	    def com_txt(ary)
   215	      str = String.new()
   216	      ary.each{|i|
   217	        val = instance_variable_get(i)
   218	        str << lines = i.to_s.gsub("@","--") + "\n" + val.to_s + "\n"
   219	      }
   220	      return str
   221	    end
   222	
   223	    def pubyear(y)
   224	      return n = /(\d...)/.match(y.to_s)
   225	    end
   226	
   227	    def comma(n)
   228	      s, ary, res, jsEn = n.size, [], [], "\u{A5} " # added space
   229	      k = (s - 4) % 3
   230	      n.to_s.each_char{|i| ary << i}
   231	      ary.each_index{|i|
   232	        res << ary[i]
   233	        k, res = k + 3, res << "," if i == k and i + 1 < s
   234	      }
   235	      return jsEn + res.join('')
   236	      ### Ruby Way P147.###
   237	      #str = n.to_s.reverse
   238	      #str.gsub!(/([0-9]{3})/,"\\1,")
   239	      #str.gsub(/,$/,"").reverse
   240	    end
   241	
   242	  end
   243	
   244	  class Book < BaseItem
   245	
   246	    def to_s
   247	      price_j = comma(@price)
   248	      per = person
   249	      n = pubyear(@publicationdate)
   250	      return printf "[%s][%013d][%s][%s]| %s | %s | %s | %s\n", @productgroup,@ean,@memo,@genru,@title,per,n,price_j
   251	    end
   252	
   253	    def person
   254	      ac = @author
   255	      ac = "#{@author}\s(#{@creator})" unless @creator.nil?
   256	      return ac
   257	    end
   258	
   259	    def to_txt
   260	      ary = [:@ean,:@title,:@author,:@creator,:@publisher,:@adddate,:@genru,:@memo]
   261	      ary.delete(:@creator) if @creator.nil?
   262	      com_txt(ary)
   263	    end
   264	
   265	  end
   266	
   267	  class Music < BaseItem
   268	
   269	    def to_s
   270	      price_j = comma(@price)
   271	      n = pubyear(@releasedate)
   272	      return printf "[%s][%013d][%s][%s]| %s | %s | %s | %s\n", @productgroup,@ean,@memo,@genru,@title,@artist,n,price_j
   273	    end
   274	
   275	    def to_txt
   276	      ary = [:@ean,:@title,:@artist,:@label,:@adddate,:@genru,:@memo]
   277	      com_txt(ary)
   278	    end
   279	
   280	  end
   281	
   282	end


% cat -n useaws.rb

     1	# -*- coding: utf-8 -*-
     2	
     3	# useaws.rb
     4	# Created by midore on 2008-12-06.
     5	# ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
     6	
     7	require 'aws'
     8	
     9	class UseAmazon
    10	
    11	  include AWS
    12	
    13	  attr_accessor :ean, :aws_id, :aws_key
    14	
    15	  def initialize(ean=nil)
    16	    @ean = ean
    17	    @aws_key = nil
    18	    @aws_id = nil
    19	  end
    20	
    21	  def to_obj
    22	    doc = getdoc
    23	    return "socket error" if doc == "socket"
    24	    return "error doc" if doc.to_s =~ /Error/ or doc.empty?
    25	    a = Amazon.new(doc)
    26	    a.item
    27	  end
    28	
    29	  def getdoc
    30	    url = Seturi.new(@aws_key, @aws_id).seturi(@ean)
    31	    doc = Access.new(url).reponse
    32	  end
    33	
    34	end
    35	
    36	begin
    37	  ean =  ARGV[0] #ean = 9784797336610 if ean.nil? # 9784763198426
    38	  amazon = UseAmazon.new(ean)
    39	  amazon.aws_id = 'midore-22'
    40	  amazon.aws_key = 'xxxxxxxxxxxxx'
    41	  p ob = amazon.to_obj
    42	  puts ob.to_s
    43	  #puts ob.to_txt
    44	rescue
    45	  abort "Error\n"
    46	end


--imported_from
http://www.midore.net/daybook/2008/12/1228746600.html

2008/05/17

xsltproc

# 下記の内容は
# http://www.midore.net/daybook/2008/05/1210953600.html
# で公開していた内容に
# 2010年現在の OS X Snow Leopard で試した結果を追加したものです。(追記参照 2010-02-07.)

-- 2008-05-17 当時

OS X 10.5.2 の xsltproc を利用してみる

% cat entry.rb

# OS X 10.5.2
# ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
# 2008-05-16

require "rexml/document"
require "rexml/element"
require 'time'

xmlpath = 'entry.xml'
txtpath = 'test.txt'
txtpath = ARGV[0] unless ARGV.empty?
check = FileTest.exist?(File.join(Dir.pwd , txtpath))
raise "error" unless check
raise "error" unless txtpath =~ /.txt$/

doc = REXML::Document.new(IO.read(xmlpath))
k,v = nil, nil

IO.readlines(txtpath).each{|line|
  if line =~ /^--/
    k = line.chomp.gsub("--",'')
    next
  else
    v = line.strip
  end

  case k
  when /^mytext$/
    e = doc.root.elements["entry/#{k}"]
    ep = e.add_element('p').add_text(v)
  when /^created$/
    t = Time.parse(v)
    t.iso8601.to_s
    doc.root.elements["meta/#{k}"].text = t.iso8601.to_s
    doc.root.elements["entry/#{k}"].text = Time.parse(v).strftime("%B %d, %Y")
    doc.root.elements["entry/id"].text = t.to_i.to_s
  else
    doc.root.elements["entry/#{k}"].text = v
  end
}
print doc


用意した test.txt

--title
TestTitle
--created
2008-05-10 21:00
--mytext
test sample text.
second line.
etc.


コマンドの実行

 % xsltproc -V
  Using libxml 20616, libxslt 10112 and libexslt 810
  xsltproc was compiled against libxml 20616, libxslt 10112 and libexslt 810
  libxslt 10112 was compiled against libxml 20616
  libexslt 810 was compiled against libxml 20616

 % cd Entry
 % mkdir html xml
 % /usr/bin/ruby entry.rb test.txt > xml/00.xml
 % xsltproc entry.xsl xml/00.xml > html/00.html


生成された xml/00.xml

<?xml version='1.0' encoding='UTF-8'?>
<docroot>

<entry>
  <title>TestTitle</title>
  <id>1210420800</id>
  <created>May 10, 2008</created>
  <mytext><p>test sample text.</p><p>second line.</p><p>etc.</p></mytext>
</entry>

<meta>
  <created>2008-05-10T21:00:00+09:00</created>
<css>
  <url>default.css</url>
  <title>default.css</title>
</css>
<author>
  <name>test</name>
</author>
</meta>

</docroot>


生成された html/00.html

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transit
  ional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <meta name="author" content="test" />
      <meta name="date" content="2008-05-10T21:00:00+09:00" />
      <link rel="stylesheet" type="text/css" media="screen,tv" href="default.css" title="default.css" />
      <title>TestTitle</title>
    </head>
    <body>
      <h1>TestTitle<br /></h1>
      <h2>May 10, 2008<br /></h2>
      <br />
      <p>test sample text.</p>
      <p>second line.</p>
      <p>etc.</p>
      <hr />
    </body>
  </html>

% open html/00.html (OS X の場合 open コマンドがある。引数が .html ファイルだと、ブラウザが起動して 00.html を開いてくれる.)

entry.xml
http://www.midore.net/daybook/2008/05/hina-xml.html

entry.xsl
http://www.midore.net/daybook/2008/05/hina-xsl.html

00.html の <meta name="date" content="2008-05-10T21:00:00+09:00" /> 日付の形式は、
entry.xml 10行目: <meta><created/>,
entry.rb 35行目: doc.root.elements["meta/#{k}"].text = t.iso8601.to_s,
entry.xsl 81 行目: <xsl:attribute name="content"><xsl:value-of select="meta/created" /></xsl:attribute>
に依存。

--imported_from
http://www.midore.net/daybook/2008/05/1210953600.html

+++ 追記 +++

# 2010-02-06.
# midorex.blogspot.com へimport するにあたって entry.rb など使用するファイルを修正。
# 副題: 「OS X 10.6.2 の xsltproc を利用してみる」

0,現在の環境
Mac OS X 10.6.2
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-darwin10.2.0]
$ xsltproc -V
=>
Using libxml 20703, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20703, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20703
libexslt 813 was compiled against libxml 20703

1,準備
test.txt
entry.rb
entry.xml
entry.xsl

上記4枚のファイルを用意し(下記参照)

2,XML生成
$ chmod +x entry.rb
# xml ファイルの生成
$ ./entry.rb test.txt > 000.xml

$ cat -n 000.xml

     1	<?xml version='1.0' encoding='UTF-8'?>
     2	<docroot>
     3	<entry>
     4	 <title>TestTitle-2010</title>
     5	  <id>1265418000</id>
     6	  <created>February 06, 2010</created>
     7	  <mytext><p>test sample text.</p><p>second line.</p><p>etc.</p><p></p></mytext>
     8	</entry>
     9	<meta>
    10	  <created>2010-02-06T10:00:00+09:00</created>
    11	<css>
    12	  <url>default.css</url>
    13	  <title>default.css</title>
    14	</css>
    15	<author><name>test</name></author>
    16	</meta>
    17	</docroot>
    18


3,xsltproc コマンドでXHTML 生成
$ xsltproc entry.xsl 000.xml > 000.html
$ cat -n 000.html

     1	<?xml version="1.0" encoding="UTF-8"?>
     2	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     3	<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="ja">
     4	  <head>
     5	    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
     6	    <meta name="author" content="test" />
     7	    <meta name="date" content="February 06, 2010" />
     8	    <link rel="stylesheet" type="text/css" media="screen,tv" href="default.css" title="default.css" />
     9	    <title>TestTitle-2010</title>
    10	  </head>
    11	  <body>
    12	    <h1>TestTitle-2010<br /></h1>
    13	    <h2>February 06, 2010<br /></h2>
    14	    <br />
    15	    <p>test sample text.</p>
    16	    <p>second line.</p>
    17	    <p>etc.</p>
    18	    <p></p>
    19	    <hr />
    20	  </body>
    21	</html>


4,まとめ
Mac OS X 10.6.2 のxsltproc コマンドで XHTML ファイルを作れると確認できました。これにて実験おわり。


[使用したファイル]
test.txt

     1	--title
     2	TestTitle-2010
     3	--created
     4	2010-02-06 10:00
     5	--mytext
     6	test sample text.
     7	second line.
     8	etc.


entry.rb

     1	#!/path/to/bin/ruby191
     2	# coding: utf-8
     3	
     4	require "rexml/document"
     5	require "rexml/element"
     6	require 'time'
     7	xmlpath = 'entry.xml'
     8	txtpath = 'test.txt'
     9	
    10	doc = REXML::Document.new(IO.read(xmlpath))
    11	k,v = nil, nil
    12	IO.readlines(txtpath).each{|line|
    13	  (/^--/.match(line)) ? (k = line.chomp.gsub("--",''); next) : v = line.strip # 2010-02-06
    14	  case k
    15	  when /^mytext$/
    16	    e = doc.root.elements["entry/#{k}"]
    17	    ep = e.add_element('p').add_text(v)
    18	  when /^created$/
    19	    t = Time.parse(v)
    20	    t.iso8601.to_s
    21	    doc.root.elements["meta/#{k}"].text = t.iso8601.to_s
    22	    doc.root.elements["entry/#{k}"].text = Time.parse(v).strftime("%B %d, %Y")
    23	    doc.root.elements["entry/id"].text = t.to_i.to_s
    24	  else
    25	    doc.root.elements["entry/#{k}"].text = v
    26	  end
    27	}
    28	print doc
    29


entry.xml

     1	<?xml version="1.0" encoding="utf-8"?>
     2	<docroot>
     3	<entry>
     4	 <title/>
     5	  <id/>
     6	  <created/>
     7	  <mytext/>
     8	</entry>
     9	<meta>
    10	  <created/>
    11	<css>
    12	  <url>default.css</url>
    13	  <title>default.css</title>
    14	</css>
    15	<author><name>test</name></author>
    16	</meta>
    17	</docroot>
    18


entry.xsl

     1	<?xml version="1.0" encoding="UTF-8" ?>
     2	<?xml-stylesheet rel="stylesheet" type="text/css" href="default.css" ?>
     3	<!-- 
     4	  xhtml 1.0
     5	  text/xml
     6	  utf-8
     7	-->
     8	<xsl:stylesheet version="1.0" 
     9	  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
    10	
    11	<xsl:output 
    12	   method="xml" encoding="UTF-8" 
    13	   media-type="text/xml" 
    14	   doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
    15	   doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    16	   indent="yes" />
    17	
    18	<!-- ___ROOT___ -->
    19	<xsl:template match="docroot">
    20	<xsl:element name="html">
    21	  <xsl:attribute name="lang"
    22	            namespace="http://www.w3.org/XML/1998/namespace">ja</xsl:attribute>
    23	
    24	<!-- ___Header___ -->
    25	<xsl:call-template name="head" />
    26	
    27	<!-- ___ Body ___ -->
    28	<xsl:element name="body">
    29	<xsl:apply-templates select="entry" />
    30	
    31	</xsl:element><!-- end body -->
    32	</xsl:element><!-- end html -->
    33	</xsl:template>
    34	
    35	<!-- _____ Entry _____ -->
    36	<xsl:template match="entry" >
    37	
    38	<!-- Title -->
    39	<xsl:element name="h1">
    40		<xsl:value-of select="title" disable-output-escaping="no" /><xsl:element name="br" />
    41	</xsl:element>
    42	
    43	<!-- Date -->
    44	<xsl:element name="h2">
    45		<xsl:value-of select="created" disable-output-escaping="no" /><xsl:element name="br" />
    46	</xsl:element>
    47	
    48	<!-- Text -->
    49	<xsl:element name="br" />
    50	<xsl:apply-templates select="mytext" />
    51	<xsl:element name="hr" />
    52	</xsl:template>
    53	
    54	<!-- _____ Entry Templates_____ -->
    55	<xsl:template match="mytext/" >
    56	  <xsl:apply-templates />
    57	</xsl:template>
    58	
    59	<!--  Template p  -->
    60	<xsl:template match="mytext/p">
    61	  <xsl:element name="p"><xsl:value-of select="." disable-output-escaping="no"/></xsl:element>
    62	</xsl:template>
    63	
    64	<!-- _____ HEADER _____ -->
    65	<xsl:template name="head">
    66	  <xsl:element name="head">
    67	    <xsl:element name="meta">
    68	      <xsl:attribute name="http-equiv">content-type</xsl:attribute>
    69	      <xsl:attribute name="content">text/html; charset=UTF-8</xsl:attribute>
    70	    </xsl:element>
    71	
    72	   <!-- meta name="author" -->
    73	   <xsl:element name="meta">
    74	     <xsl:attribute name="name">author</xsl:attribute>
    75	     <xsl:attribute name="content"><xsl:value-of select="meta/author/name" /></xsl:attribute>
    76	   </xsl:element>
    77	
    78	    <!-- meta name="date" -->
    79	    <xsl:element name="meta">
    80	      <xsl:attribute name="name">date</xsl:attribute>
    81	      <xsl:attribute name="content"><xsl:value-of select="entry/created" /></xsl:attribute>
    82	    </xsl:element>
    83	
    84	    <!-- CSS -->
    85	    <xsl:element name="link">
    86	      <xsl:attribute name="rel">stylesheet</xsl:attribute>
    87	      <xsl:attribute name="type">text/css</xsl:attribute>
    88	      <xsl:attribute name="media">screen,tv</xsl:attribute>
    89	      <xsl:attribute name="href"><xsl:value-of select="meta/css/url" /></xsl:attribute>
    90	      <xsl:attribute name="title"><xsl:value-of select="meta/css/title" /></xsl:attribute>
    91	    </xsl:element>
    92	
    93	    <!-- Title -->
    94	    <xsl:element name="title">
    95	      <xsl:value-of select="entry/title" disable-output-escaping="no" /></xsl:element>
    96	  </xsl:element>
    97	</xsl:template>
    98	
    99	<!-- _____ END _____ -->
   100	</xsl:stylesheet>

2008/05/14

Book Shop

町の本屋さんには、話題の新書もろくにおいてなかったりする。けれどそんな小さな本屋さんで雑誌を買ったり気まぐれで本を買ったりもする。まれに「おっ!これ面白そう」って本もみかけたりしてそんな時はささやかに幸せな気分になる。
多くの人がアマゾンなどのオンラインで書籍を購入したら、町の本屋さんは全滅しちゃって本屋さんは伝説化してしまうんだろうか。
ここで、淘汰されていいじゃないかと考える人も多いと思うんだけど、私はそう思わない。たいした本がおいてないと知っていても町の本屋さんがあることだけでありがたく思えるから。なぜかというと、ふらりと入ってなにげなく自分の興味を試すかのごとく本を実際に手にとって見ることができるから。自分にとって未知の本をとりあえず実際に手に取って見ることができる。これが可能なのは町の本屋さんと図書館とブックオフのような古書店以外にない。図書館がもっともっと増えてくれればいいけど、日本の図書館未来はお先真っ暗でこちらには全く期待できそうもなくブックオフはどうしてもタイムラグを免れない。
とりあえず、町に「本」がおいてある事実自体が公共財産のように貴重に思えてくるので、これからはアマゾンで本を買うのは一切やめようか、と考えてしまう。
けれど、アマゾンがニッパンやトーハンなどの問屋を通さなくなってるらしいという話をちらほら目にすると、よくやった!と思ってしまう。なので実はアマゾンは本屋の味方のようにも見えてくる。違う?!!違うかも。

小さい本屋なりに努力している本屋さんとそうでない本屋さんとの違いは歴然とあるし、もっといえば、大型書店だったとしても棚作りに魂がこもっているかこもってないかは買う側には、はっきりとみえてしまう時ってあったりする。

この本には全く関係ない話でした。

ISBN: 9784150115944

SFの世界はよく知らない。人に勧められて購入。したのは何年前だったっけ?最近、読み直した。血なまぐさいこわさじゃないこわさがあって面白い。書いてる人はむちゃくちゃ賢い人みたいだ。

--imported_from
http://www.midore.net/daybook/2008/05/1210775400.html

2008/05/13

Glenn Gould[2]

そーいえば、グールドってすてきなピアニストがいたんだよって昔昔教えてくれたKさんにあらためて感謝。
それから、この楽譜がいいよって教えてくれたMさんにも。手元のを(J.S BACH Inventionen Sinfonien / G.HENLE VERLAG / URTEXT)アマゾンで探してみたんだけどなぜかなかった。。。とても読みやすいしアドリブしやすくてバッハを練習するのに最適な楽譜だと思う。楽器屋さんに行けばあるのかな。

Sinfonia 5 BWV 791
6 小節目、ド と フラットのシ の和音。もうずいぶん長い間ここが気になってる。

ISBN: 4988009917122

--imported_from
http://www.midore.net/daybook/2008/05/1210689000.html

2008/05/10

Glenn Gould

購入したやつは、2006/7/15 第十一版発行
装幀者 安野光雅
とあるんだけどよく知られている安野光雅氏のあーゆー絵では なかった。

ISBN: 9784480082343

著者のミッシェル・シュネデールが感じたことなのか、グールド自身がそう語っていたのか判然としない箇所があるのが気になった。
でも読んでいくうちに書かれてある内容に引き込まれた。読みながら、、、つきつめて考えちゃうと、あげくには俗世間の洪水からいかに身を守り自分の世界をいかにして保つかの示唆を含んでいて興味深い。
グールドが亡くなったとき、枕元には聖書と夏目漱石の「草枕」があったそうだ。亡くなる数ヶ月前、いとこのジェシーに「草枕」を電話で話して聞かせたそうだ。最後まで。

印象的なくだり。数カ所。
P046

語る声が重要なのであって、なにを言っているのか、どのような言い方をしているのか、言っているのが本当なのか間違ったことなのかはほとんどどうでもよい。


この発言の前後の発言の詳細がのってないので誤読している可能性が高い。声の質感やキーの高さや波長やイントネーションの切り替えなどなど、そんな中から美になりうるなにかを見つけてしまおうとする悪魔のような習慣から抜け出せなくなってしまった人のようだ、と思った。

P159

音楽は切り離す。「音楽の断片がぼくの心のなかに入り込んでくるとき、ぼくは奇妙にも自分との接触を見失ってしまい、会話や自分の周囲で起きることすべてから自分が切り離されてしまう。」...


この後に続く文章はわかりにくい。「ピアノなしを夢見る」という箇所。これは著者の勝手な憶測?それともグールドが感じていたことを言い当てている?どちらなのかよくわからない。けど強く惹かれる何かがある。グールドが発言した言葉から連想して書かれた文章にも読み取れる、、、。著者のシュネデールさんは「切り離されてしまう」という発言を捉えて「ピアノからの離脱」と受け取ったのだとしたら、それは違うじゃないかと思った。ひょっとしたら日本語がかみあってないのかもしれない。

読み終えて、
#熱心で調査好きなファンが三日三晩グールドについて熱く語る、のを静かに聞いていたかのような気持ちになった。その世界に浸れる。
#矛盾しつつも、ミュージシャンやアーティストの私生活や発言や経歴なんかにゃめもくれないし知りたいとも思わない...この態度こそが、ひとつひとつの作品に対する敬意のように思うこともあります。だから、読んだことなどすっかりすっかり忘れてどっぷりCDを聞いた方がよいな、とも思いました。

一番心に残ったところ
P062

「聴衆にとっても演奏者にとっても音楽は黙想にまで高められなきゃいけない。...


--imported_from
http://www.midore.net/daybook/2008/05/1210345200.html

+++ 追記 +++
2010-02-06
import するにあたり2年ぶりに自分の書いた文章を読み直してみて、書き直したくなった箇所がいくつかありますがこのままにしておくのもいいかなと思いました。これを怠慢といいます。

2008/04/22

steely dan

7枚組...比較してみたり
http://www.towerrecords.co.jp/sitemap/CSfCardMain.jsp?GOODS_NO=1701428&GOODS_SORT_CD=101

http://www.amazon.co.jp/Nightfly-Trilogy-Donald-Fagen/dp/B000M06SVS/ref=sr_1_1/249-9166969-5421947?ie=UTF8&s=music&qid=1208836102&sr=1-1

--imported_from
http://www.midore.net/daybook/2008/04/1208818805.html

2008/04/03

Google

いったいどこのリンクを辿って下記に辿り着いたか思い出せない。ここを読んでこの本を購入しました。面白かった。
http://iiyu.asablo.jp/blog/2006/06/17/409892

ISBN: 9784872576443

Google を知る前までは検索は一体どうしていたのだっけ?..えと
当時(1998,1999年頃)は 3,4 つの検索エンジンを使うのは当然のようにしていたような気がする。それで結構時間もとられていたしコンピュータだって今と比べたら非力だったしハードディスクが4ギガだったからnetscapeのキャッシュだってそんなに貯め込めなかったし回線だってとにかく遅くて夜11時以降は使う気がしなかった...こう書いてみると最悪。
今、当時の検索方法に戻れって言われたらかなりな苦痛を感じることを考えれば Google には感謝しなくては。もちろん回線が整ったことやパソコンが安価になって素晴らしくよくなったことにも。

この本で印象的だった箇所の引用
P8

...グーグル社の企業理念であり、戦略でもある「邪悪になるな」(Don't Be Evil)に光をあてている。...


P85

...問題は、人間には何千件もの検索結果を調査したり分析したりできないということだ。...本当はこっちの問題に真剣に取り組む必要があるのでしょうね...


Google が意図してかあるいは意図しないまでもすでに持ってしまった「力」が邪悪な者(て誰?はさておき)の手に渡るような日がきたら user は一体どうしたらいいんだろう?今後将来にわたって私たちは google をそのような疑いの視線でみなければならないのかな?
こういう疑問がこの本によってただちに払拭されるとは思わないものの、読んでいるうちにこの類いの疑問ってはなはだしくお門違いだったのかな?てな気分にさせられました。それはあくまでも気分の問題だから違う日に読めば違う気分なのかもしれないけど。ね。
どちらにせよ彼らは彼らの信じている理念を「維持し続けるであろう」と誰しもが確信めいた予測をしてしまうだけの強烈なエネルギーと知性を持つ意思の強い人々だってことはびしびし伝わってくるし、その印象と実績が彼らの会社の株価をつり上げ拡大させる原動力なんだろう、とこの本を通じて知りました。

Google の検索結果で表示される広告をクリックすると、その裏で何が起きているのか?この本にはそのあたりの解説もありました。日本の会社経営者の大半がこの仕組みを正しく理解しているのであれば、みるからに怪しげな SEO 対策なんかがこんなに巷で流行っていないはずなので、こりゃ面白い現象だなと思いました。

+++ memo ++++
ここはだんだん index.html に書いた趣旨のページじゃなくなってきているので index 変えなくては。

--imported_from
http://www.midore.net/daybook/2008/04/1207177201.html

2008/03/31

yael naim

MacBook Air TVCM song
輸入版じゃないやつ。

ISBN: 4943674079445

http://www.myspace.com/yaelnaim

--imported_from
http://www.midore.net/daybook/2008/03/1206918001.html

2008/03/15

Mozart

Book / すべては音楽から生まれる (PHP新書) / 茂木 健一郎 / 9784569696249

この本を読みはじめてまっさきに思い起こしたのは、
宗教は? 音楽!
てな会話が盛り込まれてる映画 EXILES。このエンディングを観て以来、宗教は?と聞かれたら「音楽」と私も答えようと決心してる.ものの、あいにくそのような機会はないし入国カードに宗教を記入しないとならない国に行くこともない。
...世の中には素晴らしい曲がたくさんあって心が動いてわくわくしたりクラクラしたりもするし、なにかの拍子に突然頭の中で特定の曲がリピートし始めて同じ箇所をリピートしてることって、わりと ある。多くの人がそうらしい。考えてみればとても不思議な現象で、そういう時人の頭の中にははっきりと音が再現されているにもかかわらず、周囲の人が聞こえるような周波数を発生させるなんてことありえない。(あったらすごいし感動的!)この時脳みその中は一体どうなっているんだろ。

「音楽のクオリア」について
この本に書かれてる音楽のクオリアなるものは「聞く側、受動する側」に完全依存しているものなんだろうか。音を発している人(特にヴォーカリスト)のクオリアは発したと同時に単なる周波数の組み合わせに変化して消えてしまうんだろうか?ライブのような同じ空間を共有して音を聞く場合とCD音源から音を聞く場合とで明らかに差異があるのだったら、音を発している側のクオリアがその違いのキーになってはいないんだろうか。
...周波数のように数値化できないようなものを証明するのはやっぱり無理なんだろか。脳科学に証明は必要なんだろか。

「モーツァルト効果」について
私はクラシックに明るいわけでもなく一般的に知られている曲くらいしか持ってないのでクラシックについてことさら考えてみたいとも書いてみたいと思ったこともない。クラシックはただの音楽のイチジャンルくらいにしか思ってなかったりする。片付けものをしながらバッハを聞くのは割と気持ちいいし眠る前にシューベルトやサティやリストを聞くのもたまにはいい。けれど、どれもこれもあまり熱心には聴いてない。例えば、雨戸を閉めきって大音量のワーグナーをかけながら、指揮者になりきって汗をかいて腕をふっている友人を笑いをこらえてみてたことがある。あれぐらいの熱をもったことはない。しかも

モーツァルトのよさを私は知らない。

あえて、書いてみた。
モーツァルトの曲は確かに軽やかだし流れるようなメロディだしよどみのないきれいな印象で、明らかにベートーヴェンのような重たさや陰鬱さや深刻さがない。
けれど、勇気振り絞って言ってしまえば情感が無視されているように私は感じてしまう。そこには、うれしすぎて絶叫しては「いけない」ような自由を制限されてるかのような、がんじがらめの雰囲気があるような気がする。ぐっと高まるべき転調をあっさり裏切られるような突拍子のなささは人の世の常の「軽薄さ」を連想させる。軽薄は日常的でリアルで非常に身近なもので往々にして笑いを連想させる。まるで、モーパッサンの小説のようだ。そういえば、モーパッサンの小説にも規律正しい作法や世間体、そういったものにがんじがらめにされてる人が多く登場する。

この軽薄さに対照的なのがショパンで、対極に位置しているのがベートーヴェンなような気がする。
ショパンは人の情感を湧きたたせるしその重心がぶれない。人の冷静な気持ちを感情的にさせてすっかり忘れていた情動を思いおこさせる。感情の抑制に惑わされることなく、押さえることのできない気持ちが伝わってきてすっかり感情移入してしまう。
こんなショパンの魔力に比べれば、モーツァルトはまるで子供たちの無邪気なたわむれにすぎないように映る。だから自分の中ではモーツァルトの順位は流行の歌謡曲とほぼ差がない。ショパンに近づく気配はなく、ましてやバッハからはかなり遠い。バッハから受ける規律性はモーツァルトの規律とは異なりとてもとても美しい。モーツァルト効果と呼ばれているものはクラシック効果と呼ばれるべきなんじゃないだろうか。

将来、この感じ方がいつ変化するかは自分でもわからないものの、今、現在はこんな風に思ってる。

昔、小林秀雄が嫌いだった。最近読み返してみてなんであんなに嫌っていたのかよくわからなかった。ただし、この本の中で引用されていた小林秀雄のモーツァルトに関する文章については、共感できないものと再認識した。

+++ Links +++

手動連想検索
茂木健一郎 クオリア日記

wikipedia
http://ja.wikipedia.org/wiki/クオリア
http://ja.wikipedia.org/wiki/モーツァルト
http://ja.wikipedia.org/wiki/モーツァルト効果
http://ja.wikipedia.org/wiki/シュヴァルツヴァルト
http://ja.wikipedia.org/wiki/東京物語
http://ja.wikipedia.org/wiki/リヒャルト・ワーグナー
http://ja.wikipedia.org/wiki/トリスタンとイゾルデ_%28楽劇%29
http://ja.wikipedia.org/wiki/無伴奏チェロ組曲
http://ja.wikipedia.org/wiki/FMRI

ギリシャ語
http://toxa.cocolog-nifty.com/phonetika/2004/09/post_f1a5.html

fMRIで解き明かす、脳と心の関係
http://wiredvision.jp/archives/200411/2004112902.html

バッハ コーヒーカンタータ
http://www.amazon.co.jp/バッハ-コーヒー・カンタータ-カークビー-エマ/dp/B00005FLKW

映画EXILES
http://ja.wikipedia.org/wiki/愛より強い旅

--imported_from
http://www.midore.net/daybook/2008/03/1205506801.html

2008/03/12

TextMate.app on Leopard 10.5.2

TextMate.app Version 1.5.7 (1436) で編集した RubyScript をコマンド+Rで実行すると、
下記のようなエラーが /var/log/system.log に残る。これはいったいなんだろ?ログをみるまで全く気づかなかった.

... ATS AutoActivation: MDQueryCreate failed!  
(params: queryString = {com_apple_ats_name_postscript == "LuxiMono" && kMDItemContentTypeTree != com.adobe.postscript-lwfn-font}, 
valueListAttrs = {<CFArray 0x14921390 [0xa00be1a0]>{type = immutable, count = 1, 
....


TextMate.app メニューの File Edit Template を開いて Show ALlをクリック。Ruby を表示して緑色の c マークがある 「Run」をクリック。

export RUBYLIB="$TM_BUNDLE_SUPPORT/RubyMate${RUBYLIB:+:$RUBYLIB}"
export TM_RUBY=$(type -p "${TM_RUBY:-ruby}")

"${TM_RUBY}" -- "$TM_BUNDLE_SUPPORT/RubyMate/run_script.rb"


と記述されていたので
TextMate.app/Contents/SharedSupport/Bundles/Ruby.tmbundle/Support/RubyMate/run_script.rb
の中身をみてみたが関係あるように思えない。
ふたたび Edit Templateの画面をみなおす。右側下に「output」がありプルダウンで表示方法を指定できる。デフォルトでは「show as HTML」となっている!この HTML が使用している css を探す。(error が出力した font を指定しているのは css のはずなので)

TextMate をインストールした場所に移動

% cd TextMate.app/Contents/SharedSupport/Support/themes/default/
% ls
images		print.css	style.css


とありました。早速 style.css の中をみてみる。シスログが出力したものと関係ありそうなものを探す。
code, pre が使っている font-family にログが報告したフォント名があったんで、

/*
default
font-family: "LuxiMono", "Bitstream Vera Sans Mono", "Monaco", "Courier New", monospace;
*/

code, pre {
	font-size: 95%;
	font-family: "Monaco", "Courier New", monospace;
	word-wrap: break-word;
	white-space: pre;
	white-space: pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -o-pre-wrap;
}


のように変更したところシスログのエラーはでなくなった。コマンド+R もちゃんと動いてよかった。

+++ 追記 +++
2008-03-13 の時点で最新の Ruby のバージョンは Ruby 1.8.6-p114 Macintosh に標準でインストールされている Ruby のバージョンは Ruby1.8.6-p111

--imported_from
http://www.midore.net/daybook/2008/03/1205251205.html

2008/03/02

zero

数字ゼロに関する本。

ISBN: 9784152085245

非理系人にとっても読みやすかった。数字のゼロが持っている威力について歴史的な逸話を紹介しながらわかりやすく解説してくれる良書。
ギリシャ人はゼロが便利なことを知りつつ拒絶したらしい。とか、デカルトはゼロを認めなかった...インドの人は 0 を表す記号を 9 世紀には用いていた...ピュタゴラスはあの定理の人じゃなくて「音階を発明した人」として記憶されていた...くじ引きソフトのバグの原因はゼロに関係していた...などなど。

物体としての果物のリンゴが全部で3個並んでいたら、リンゴが1個、2個3個と「1」からカズをかぞえる。
リンゴが、1個、2個、3個。よって「全部でリンゴが3個」

もし仮にこの習慣をかなぐり捨てて数字のゼロからリンゴの数を数え始めたとしたら、
リンゴが、ゼロ個、1個、2個。よって「全部でリンゴが2個」
...果物屋さんは勘弁してくれって言うだろう。

普段何も意識しないものの「習慣としての もの のかぞえ方」は、実はとてつもなく長い年月とたくさんの人々の知恵から成立したものなんだなと。
#地球温暖化で人類が死滅しなければ
ものすごく遠い遠い未来で人は習慣としての10進数をやめているかもしれないしもっと全く異なるかずの数え方が普及してるかもしれない?!そんな風に想像すると面白いな。

+++ 余談 +++

プログラミングを体験したことのない人におすすめのプチプログラム体験。10 分以内で完了。
Mac を使っている人だったら、OS X のターミナル(アプリケーション/ユーティリティ)を起動して下記のように打ち込んで

ruby -e 'x = ["a", "b", "c", "d", "e", "f", "g", "r"]; puts x[1]'


リターンするとアルファベットの b が表示されるはず...
x[0] にすると、"a" を表示
x[1] にすると、"b" を表示
x[2] にすると、"c" を表示

こなれてきた頃に、あれ? x の1番 つまり x[1] と指定したんだから "a" を表示するんじゃないのか?と感じたら大成功!

wikipedia ピュタゴラス
http://ja.wikipedia.org/wiki/ピュタゴラス

--imported_from
http://www.midore.net/daybook/2008/03/1204383601.html

2008/02/29

an intercalary day

ウィキペディア 今日は何の日(2月29日)から
http://ja.wikipedia.org/wiki/閏年
http://ja.wikipedia.org/wiki/太陽暦

--imported_from
http://www.midore.net/daybook/2008/02/1204211285.html

2008/02/23

rubyosa-Mail.Application

[2010-02-06 追記] RubyOSA はもはやメンテナンスされていないようで幻に包まれています。2010年2月現在においては MacRuby が熱いようです。

rubyosa からの mail.app の操作を試してみた。
メール本文のテキストの取り方が変更された様子。
# OS X 10.4 では message.content だった
rubyosa-0.3.0 :: http://www.midore.net/daybook/2007/03/1173944973.html

10.5 の Mail.app の .content はさらに階層化されててわかりづらい。
# message_viewers から辿るのではない異なるアプローチは試してない。

.content のかわりに、.properties を覗いてみるとハッシュになっておりその中に :content があるのをみつけたので
.properties[:content]
としたらうまくとれた。しかし本来 properties をみにいくのはあまりいいことではないのかもしれない。
OSA.utf8_strings = true にしていることで日本語のメール本文も正しく表示できているのだと思う。推測です。

test_1052-rubyosa-mail.rb

# this file is utf-8
# ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0] (Mac OS X 10.5.2)
# rubyosa-0.4.0
# AppleScript's version "2.0"
# Mail.Application version 3.2("919/919.2")
# 2008-02-23

require 'rbosa'

class Message < Struct.new(:subject, :postdate, :sender, :content, :messageid)
  def date(obj)
    #t = obj.date_received # Received Date
    t = obj.date_sent      # Posted Date
    t.strftime("%Y/%m/%d %H:%M:%S") # t.class is Date
  end
  def set(obj)
    # messageid
    self.messageid = obj.message_id
    # Subject
    self.subject = obj.subject
    # Date
    self.postdate = date(obj)
    # Sender
    self.sender = obj.sender
    # Message Body
    self.content = obj.properties[:content]
    ############ other items
    #obj.all_headers # String / Headers of message
    #obj.deleted_status? # FalseClass or TrueClass / message status
    #obj.message_size # Fixnum / mail size
    #obj.mail_attachments # Object /
    #obj.content # Object /
    #obj.content.paragraphs # Object /
    #obj.source # String / Message Source
    ############
  end
  def to_s
    str = ''
    self.each_pair{|k,v| str << v + "\n"}
    return str
  end
end

OSA.utf8_strings = true

mail = OSA.app('Mail')
mail.message_viewers.each{|x|
  x.selected_messages.each{|i|
    m = Message.new()
    m.set(i)
    puts m.to_s
  }
}


メールメッセージを選択してない場合のエラーなどエラーに対する処理は全て未対処。Mail.app が起動していなかった場合は下記のエラーになる。

RuntimeError: Cannot send Apple Event 'corecnte' : procNotFound (-600)


+++ memo +++
TigerLeopard(10.5) では、FileVault(システム環境)のオン<del>オン</del>オフに関係なく rubyosa 動くようになっていた。

RubyOSA
http://developer.apple.com/documentation/Cocoa/Conceptual/RubyPythonCocoa/Articles/Using%20RubyOSA.html

--imported_from
http://www.midore.net/daybook/2008/02/1203696485.html

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

2008/02/03

森の生活(上)

森の生活(上)/ H.D. ソロー / 岩波書店 / 9784003230718

本を売ろうと手にとったら読んでなかった事を思い出して読んでみた本。

子供だったころ近所の林の中にちょっとした居心地のよい空間があって「よしみんなでここに暮らそう」と言った本人が暗くなるやいなや「ご飯だ」とつぶやいたそのとたん、なぜか急に怖くなってみんなで走って帰った時のことを思い出した。まだ太陽が高かった時の高揚感は夕日と一緒に沈んで、それきり拾い上げられることはなかった訳だけど、
この本の作者は、大人になってそんな気持ちを拾い上げて忘れないで大切にした人なのかもしれない。

ずっと長い間私はそんな子供の頃に抱いた自然の中にいた時の気持ちを忘れていたし、その事とこの本が頭の中で結びついたのは半分以上読んだあとだった。そのせいなのか分からないが序盤はかなり読みづらい箇所があったのも確かだ。

普段、当然のように食料売場で買い物をして食材を買ったりお金を払って外食してる。ソローは「違うやり方もあるよ」と割と論理的に話を進める。食べることに限らず着ること、住むこと、衣食住の基本的価値観(食事、住居、衣服、お金の使い方)を根底から覆えさんばかりの勢いで書かれてあるので、読んでる側はついうろたえるような気分になり、そういう意味ではかなりヘビーな本でもある。究極のストイックな暮らし方の手本といっていいんじゃないかな。
日清のカップヌードルやポテトチップスが定期的に食べたくなる私にはまるで雲の上の人のようだ。

種をまき野菜を育て食べる、このサイクルがいかに大切かとか人ひとりが自分の胃を満たすために必要な農地はそんなに多くはないといった話も出てくる。
土や木々が放つ新鮮な空気と水と魚と動物。これらと遮断されている生活を人類が送るようになってからの歴史は人科の歴史全体の中ではまだ浅くて、自然に囲まれた生活を望む先祖 DNA の叫びが子供に顕著なのかなーなんて思った。

読む人によっては、非現実的なのにSF小説でもないし物語性もないので退屈しきってしまうかもしれない...。
が、不思議なもので読んでいるうちに、森の中で暮らすソローの幸せな満足感が、時を超えて読者を幸せな気持ちにさせる点はこの本の魅力だと思う。
脚注も面白かった。実は友人から土地を借りていたには笑った。


--imported_from
http://www.midore.net/daybook/2008/02/1202012972.html

[2010-02-27]
ソロー語録集
ISBN: 9784892570605 / Henry David Thoreau / 文遊社

2008/01/30

The U.S vs. JONHN LENNON

EAN: 4988006849013

2007 年末 日本で公開されたジョンレノンの映画サントラ。
INSTANT KARMA!(WE ALL SHINE ON) を繰り返し聞いた。

このCDによせてオノヨーコは、

...世界平和のプロモーションが危険をはらんでいるなどという考えは、一瞬たりとも浮かんできませんでした。...

とコメントしている。

世界的に有名なミュージシャンが自らの作品のために広告を打つのと同様に「世界平和」をプロモーションした。この事実を当時のアメリカ政府がどう捉えたのか?を映画は伝えている。
いち個人としての Jhon Lennon がどれほど恐れおののきなげき悲しんだかは 16.SCARED に表れてるように思う。

Imagine について...

...1971年10月11日にアメリカのみでシングルカット...ヴェトナム戦争での「兵士の戦意を喪失するため」放送禁止になった。1991年の湾岸戦争でも同様の措置がとられ、9.11 事件では放送自粛となっている。...

とある。

追記-2008.02.17
最近のニュースで、アメリカ大統領に立候補している白人ではない候補者が暗殺されるのではないかと心配している人のコメントが流れた。

--imported_from
http://www.midore.net/daybook/2008/01/1201618801.html

2008/01/28

Ruby 入門書

amazon 用の
スクリプトを変更してみたので早速。

ISBN: 9784797336610

この本の初版があったおかげで Ruby で何か作ってみようかなと思いました。あくまでも趣味で。

+++ memo +++

追加-本以外のデータの取得


  case isbn.size
  when 10
    q << ["SearchIndex=Books" ,"IdType=ISBN"] # Book 10
  when 12
    q << ["SearchIndex=Music", "IdType=EAN"]  # CD not Japanese
  when 13
    if isbn.to_s =~ /^978|^491/         # Book 13
      q << ["SearchIndex=Books" ,"IdType=EAN"]
    elsif isbn.to_s =~ /^458/ # DVD
      q << ["SearchIndex=DVD", "IdType=EAN"]
    else
      q << ["SearchIndex=Music", "IdType=EAN"] # CD Japanese
    end
  end


以前のやつ
/daybook/2007/06/1183167964.html

--imported_from
http://www.midore.net/daybook/2008/01/1201449665.html

2008/01/21

Ruby 1.9.0

.DS_Store ファイルを削除する&Rubyの練習目的で作ってみたもの(osx-dsstore.rb)を書き換えつつ..1.9.0 の String の練習しつつ。
Struct.new を使った場合と使わないで def initiailize @path end のようにした場合の2バージョンつくって time で計ったり profile を試してみたり...

% ruby -r profile osx-dsstore.rb
1.9.0 では 1.8.6 とはソート順が逆順になったようだ。。。

osx-dsstore.rb をもとに早さを計ってみた。
現在、Apple 提供の Ruby と、自分でインストールした Ruby とのバージョンは一致している。にもかかわらず自分でmakeインストールした1.8.6が早いのはなぜなんだろ。もっとも、ちゃんと計ったとは言えない。
指定したディレクトリにあるファイル数が多ければ多いほど如実に差が出る?と思ったらそうでもなかった。

% time /usr/bin/ruby osx-dsstore.rb # 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
...
real 0m3.813s
user 0m0.788s
sys 0m2.166s

% time /usr/local/bin/ruby osx-dsstore.rb # 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.1.0]
...
real 0m3.606s
user 0m0.754s
sys 0m2.068s

% time /usr/local/d/bin/ruby osx-dsstore.rb # 1.9.0 (2007-12-25 revision 14709) [i686-darwin9.1.0]
...
real 0m3.096s
user 0m0.780s
sys 0m2.093s

osx-dsstore.rb

=begin
Purpose: Remove '.DS_Store' for OS X 10.5.x

# Search .DS_Store file (% find ./ -name .DS_Store)
% ruby rmDS-Store.rb ~/Desktop/foo
=>
ls /Users/home/Desktop/foo/.DS_Store

# Remove .DS_Store file
% rmDS-Store.rb ~/Desktop/foo/ rmf
=>
Removed: /Users/home/Desktop/foo/.DS_Store
Removed: /Users/home/Desktop/foo/bar/.DS_Store

# Not support
path error like this..
ls: /Volumes/foo/bar : No such file or directory #  path include 'space character'
=end

require 'find'

class DSStore < Struct.new(:path, :option)

  def list
    return nil unless exist?
    return nil unless FileTest.directory?(self.path)
    list = Array.new
    #ごみ箱のなかはみにいきません。
    Find.find(self.path){|path| list << path if File.basename(path) =~ /^.DS_Store$/}
    return list
  end

   def exist?
     File.exist?(self.path)
   end
   
   def sys_ls(f)
     system("ls -la #{f}")
   end

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

   def command
     begin
     unless exist?
       print "not found directory"
       exit
     end
     list.each{|f|
       sys_ls(f) if self.option == 'ls'
       sys_rm(f) if self.option == 'rmf'
     }
     rescue
     end
   end

end

ds = DSStore.new
ds.path = Dir.pwd
ds.option = 'ls'
## option ##
ds.path = ARGV[0] unless ARGV[0].nil?
ds.option = ARGV[1] unless ARGV[1].nil?
ds.command


+++ memo +++

http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p03

1.9では、明示的にいずれかを選んでもらうようにした
str.lines.each (or each_line)
str.chars.each (or each_char)
str.bytes.each (or each_byte)
str.each とかしてるプログラムはほとんどないので影響は少ないと思う


str.each とかしてるプログラムはほとんどないらしい... ほとんどない....そーなんだっ。知らなかった。

--imported_from
http://www.midore.net/daybook/2008/01/1200841265.html


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

関連する記事
2009-10-03
Remove DS_Store file

2008/01/20

biorhythm.rb

感謝して ruby-1.9.0-0 をダウンロードしました。(2007年末)Mac OS X 10.5 でのmake からのインストールは成功しました。Rubyのおかげで趣味プログラミングは楽しいと味わわせてもらっています。Ruby を作っている方々ありがとうございます。

ruby-1.9.0-0/sample/のなかに biorhythm.rb がありました。名前にひかれ読んでみたけど何をやっているのかはすぐわからないので、おもむろに

$ /usr/local/bin/ruby biorhythm.rb
Your birthday (YYYYMMDD):

と聞かれたので適当な日付を入力してみたら


 Your birthday (YYYYMMDD): 2008/1/1
 >>> Biorhythm <<<
 The birthday 2008.01.01 is a Tue
 Age in days: [50]

                     P=physical, E=emotional, M=mental
              -------------------------+-------------------------
                      Bad Condition    |    Good Condition
              -------------------------+-------------------------
 2008.02.21 : ..E...............M......|.......................P.
 2008.02.22 : .....E........M..........|........................P
 2008.02.23 : .........EM..............|.......................P.
 2008.02.24 : ......M.......E..........|...................P.....
 2008.02.25 : ...M...............E.....|...............P.........
 2008.02.26 : .M.......................E.........P...............
 2008.02.27 : M........................|..P..E...................
 2008.02.28 : M.....................P..|..........E..............
 2008.02.29 : .M.............P.........|...............E.........
 2008.03.01 : ..M......P...............|...................E.....
             -------------------------+-------------------------


情緒、体力、精神力のグラフが。すばらしい。

$ /usr/local/bin/ruby biorhythm.rb -help
ヘルプをみながら、

Usage: biorhythm [options]
    -b, --birthday=DATE              specify your birthday
        --date=DATE                  specify date to show
    -g, --show-graph                 show graph (default)
    -v, --show-values                show values
        --days=DAYS                  graph range (only in effect for graph)
    -h, --help                       show this message


遊んでみた。

biorhythm.rb -b 20070101 と入力することで誕生日を指定できて、
biorhythm.rb -b 20070101 --date='20080101' グラフの日付を指定できる。どちらの日付も未来の日付をも指定できた。
biorhythm.rb -b 20070101 -v  をつけると数字のみになる。


こんどは

p ag = p.to_i/365


の一行を追加してみたら年齢が出た!おもしろ。> まて、365でいいのか?よくない感じがする。date 標準ライブラリで計算してもらうべきか。

--imported_from
http://www.midore.net/daybook/2008/01/1200758465.html