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年ぶりに自分の書いた文章を読み直してみて、書き直したくなった箇所がいくつかありますがこのままにしておくのもいいかなと思いました。これを怠慢といいます。