下記は
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とそうでない人のための
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/04/01
daybook_index
2009/02/25
readbook
readbook
source
http://github.com/midore/readbook
% mkdir readbook
% cd readbook/
% git clone git://github.com/midore/readbook.git
git clone git://github.com/midore/readbook-scpt.git
github.com/midore
# Scrennshot
ReadBook を作るうえで参考になった書籍とリンク
プログラミング言語 Ruby
ISBN: 9784873113944
Author: まつもと ゆきひろ / David Flanagan (卜部 昌平 (監訳) / 長尾 高弘)
Price: ¥ 3,990
Publisher: オライリージャパン
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
ISBN: 9784797336610
Author: 高橋 征義 / 後藤 裕蔵
Price: ¥ 2,730
Publisher: ソフトバンククリエイティブ
Rubyist Magazine 出張版 正しいRubyコードの書き方講座―RubyistのRubyistによる、Rubyistとそうでない人のための
ISBN: 9784839923204
Author: 青木 峰郎
Price: ¥ 2,730
Publisher: 毎日コミュニケーションズ
プログラミングRuby 第2版 ライブラリ編
ISBN: 9784274066436
Author: Dave Thomas / Chad Fowler / Andy Hunt
Price: ¥ 4,410
Publisher: オーム社
プログラミングRuby 第2版 言語編
ISBN: 9784274066429
Author: Dave Thomas / Chad Fowler / Andy Hunt
Price: ¥ 3,990
Publisher: オーム社
Ruby Way 第2版 (Professional Ruby Series)
ISBN: 9784798115337
Author: Hal Fulton
Price: ¥ 5,670
Publisher: 翔泳社
初めてのRuby
ISBN: 9784873113678
Author: Yugui
Price: ¥ 2,310
Publisher: オライリージャパン
読書は1冊のノートにまとめなさい 100円ノートで確実に頭に落とすインストール・リーディング
ISBN: 9784901491846
Author: 奥野宣之
Price: ¥ 1,365
Publisher: ナナ・コーポレート・コミュニケーション
Ruby Lang
Ruby Lang
Rubyリファレンスマニュアル(るりま)
http://doc.loveruby.net/refm/api/ |
http://doc.okkez.net/
--imported_from
http://www.midore.net/readbook/ReadBook.html
+++ 追記 +++
2010-02-06
2009年夏以降 Amazon AWS の仕様変更に伴い、
github.com/midore/readbook
は動かなくなりました。それ以降つくるのをやめています。
Amazon の新しい仕様にのっとって作った(2009/08)ものはこちら。github.com/midore/amazon-jp-api
関連する記事
"Amazon"ラベルがついた全ての記事
関連する記事
"readbook"ラベルがついた全ての記事
2009/02/03
load-wrap
新刊書「プログラミング言語 Ruby」をよみつつ..
p267. 7.6.2.1 ラップされたロード の項に
...指定されたファイルを「ラップ」し..とあった。さっそく試してみたいのだけど第二引数を指定する記述がみあたらないので
プログラミングRuby 第2版 ライブラリ編
を引っ張りだし調べたら P98
load (file_name, wrap=true)
とあった。
config の用意
module MineMod
module MineModConfig
class ConfHash
def initialize(h)
@h = h
end
end
def self.conf
config = ConfHash.new(
:dir_text =>'data',
:file_obj =>'mine.obj',
:file_name =>'mine.txt'
)
end
end
end
$MODMINE = MineMod::MineModConfig
# グローバル変数にモジュールを格納
load-wrap-test.rb
$LOAD_PATH.delete(".")
$LOAD_PATH.unshift File.dirname(File.expand_path($PROGRAM_NAME))
load 'config', wrap=true
p $MODMINE#.conf
load-wrap-test.rb を実行すると
#<Module:0x1f37f4>::MineMod::MineModConfig
本に書かれてあるとおり load する ファイルの末尾にグローバル変数をおいておくと、そのグローバル変数にモジュールが収められているのがわかった。
# config の書き方は
Rubyist Magazine 出張版 正しいRubyコードの書き方講座
を参考にしてます。
--imported_from
http://www.midore.net/daybook/2009/02/1233591000.html
2009/01/31
Enumerator
新刊書「プログラミング言語 Ruby」をよみつつ..
p140.
Enumerator の練習。
e = "100"
# => "100"
e.class
# => String
e.methods
e = "100".each_char
# => <Enumerator:0x1f44c4>
e.class
# => Enumerator
e.methods
e.to_a
#["1", "0", "0"]
e.entries
#["1", "0", "0"]
e.grep("0")
#["0", "0"]
e.find("1"){|x| p x}
# => "1"
e.each.find{|x| x == "1"}
# => "1"
e.count
# => 3
a = "aaa"
b = a.codepoints
b.class
# => Enumerator
a.class
# => String
"a".codepoints.class
# => Enumerator
a.methods
a = "aaa".chars.entries
# => ["a", "a", "a"]
a = "abc".codepoints.entries
# => [97, 98, 99]
a = "aaa".bytes.to_a
# => [97, 97, 97]
"a" は String だけど .chars や、.each_char .codepoints などすると,とたんに Enumerator クラスのメソッドが使えるようになるのですね。
つくってみたメソッド...
# マルチバイトが含まれているか?
# coding: utf-8
def multibyte?(str)
n = str.codepoints.entries.find{|m| m > 128}
end
str = "るびー"
puts "multiByte" if multibyte?(str)
puts "none multiByte" unless multibyte?(str)
ついでにかきなおしたやつ(readbook関連)
# 数字にカンマをあたえる
# Ruby Way にのっていたのより3倍はながい
def comma(str)
str = str.to_s
return nil if /[^0-9]/.match(str)
s = str.size
res, k = [], (s - 4) % 3
ary = str.chars.to_a
ary.each_index{|x|
res << ary[x]
(x == k and x + 1 < s) ? (k, res = k + 3, res << ",") : k
}
return "\u{A5} " + res.join('')
end
str = "111321"
comma(str)
# =>
# "¥ 111,321"
三項演算子はたのしい。
+++ 追記 +++
2009-02-01.
String クラスには ascii_only? があった。
"a".ascii_only?
=> true
"abcあ".ascii_only?
=>false
multibyte? メソッドは不要であった...
--imported_from
http://www.midore.net/daybook/2009/01/1233333360.html
2009/01/29
comma
# 2009-01-29.
comma.rb
def comma(str)
str = str.to_s
s, res = str.size, []
k = (s - 4) % 3
ary = str[0..str.size].each_char.map{|i| i}
ary.each_index{|i|
res << ary[i]
(i == k and i + 1 < s) ? (k, res = k + 3, res << ",") : k
}
# Japanese EN => \u{A5}
return "\u{A5} " + res.join('')
end
str = "100"
p comma(str)
str = "1001"
p comma(str)
str = "10011"
p comma(str)
str = "100001"
p comma(str)
str = "1001100"
p comma(str)
% ./comma.rb
=>
"¥ 100"
"¥ 1,001"
"¥ 10,011"
"¥ 100,001"
"¥ 1,001,100"
memo
daybook/2008/12/1228746600.html
--imported_from
http://www.midore.net/daybook/2009/01/1233232901.html
2009/01/24
プログラミング言語 Ruby
購入予定。済み
ISBN: 9784873113944
--imported_from
http://www.midore.net/daybook/2009/01/1232805605.html
+++ 追記 +++
2010-02-06
関連する記事
"Ruby"ラベルがついた全ての記事
2009/01/22
utf8-mac-filename
テスト用のファイルをデスクトップで作って (encode_test.rb) ruby 1.9.1で実行すると下記のような結果になった。
日本語がまざっていたらちゃんと UTF8-MAC になってる。けれど、dir1 と dir2 は、同じディレクトリを指しているにもかかわらず結果は異なるようだ。なんでだろう。
dir1 を文字列としての絶対パスにしたら .expand_path を使ったときと同じ結果になった。Dir.pwd だけは別なのかな。よくわからない。
encode_test.rb
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-darwin9.6.0]
# -*- coding: utf-8 -*-
# encode_test.rb
require 'find'
def files_enc(d)
Find.find(d){|path|
Find.prune if path =~ /.DS_Store/
f_name = File.basename(path)
f_enc = f_name.encoding.name
puts ":#{f_enc}=>#{f_name}\n"
}
puts "----\n"
end
dir1 = Dir.pwd
files_enc(dir1)
dir2 = File.dirname(File.expand_path(__FILE__))
files_enc(dir2)
p dir1 == dir2
% ruby19 encode-test.rb
=>
:ASCII-8BIT=>Desktop
:UTF8-MAC=>名称未設定フォルダ
:UTF8-MAC=>あああ.txt
:US-ASCII=>encode-test.rb
:US-ASCII=>aaaa
:US-ASCII=>.localized
----
:UTF-8=>Desktop
:UTF8-MAC=>名称未設定フォルダ
:UTF8-MAC=>あああ.txt
:UTF-8=>encode-test.rb
:UTF-8=>aaaa
:UTF-8=>.localized
----
true
以上のことからひょっとしたら変更するかもしれないメソッド
def set_path
mb = true
ext = @item.title.gsub(/\(.*?\)|\s|\.|:|;|#|%|&|$|@|!/u,'').gsub(/\//,'_')
path = File.join(dir_text, @item.ean.to_s + "-" + ext + '.txt')
ext.unpack('U*').each{|x| mb = nil if x > 128}
path.force_encoding("UTF8-MAC") unless mb
return path
end
# =>
# ISBN-タイトル名.txt
--imported_from
http://www.midore.net/daybook/2009/01/1232579405.html
+++ 追記 +++
2010-02-06
http://github.com/midore/readbook
はずっと放置したままになっちゃってます。
2009年夏以降 Amazon AWS の仕様がかわったことで今となっては動かせないものとなったままです。
Amazon の新しい仕様に対応した版 http://github.com/midore/amazon-jp-api
amazon-jp-api においては、テキストファイル名に ISBN 番号をふるよう変更しました。
amazon-asociate-id
アマゾンアソシエイトリンクのアソシIDが有効かどうかを確認する方法
http://chalow.net/2009-01-13-4.html
を読んで変更したメソッド
mod_aws.rb
def seturl
url = exurl(@url.text)
return nil unless url.encoding.name == "UTF-8"
tag = /\&(tag=.*?)\&/.match(url)[1]
eurl = url.gsub(/\?SubscriptionId=.*/u,'')
m = /amazon.co.jp\/(.*?\/)/u.match(eurl)
@h["url"] = eurl.gsub(m[1],'') + "?" + tag
# =>"http://www.amazon.co.jp/dp/4274065979?tag=midore-22"
#@h["url"] = eurl.gsub(m[1],'') # => "http://www.amazon.co.jp/dp/4274065979"
end
--imported_from
http://www.midore.net/daybook/2009/01/1232578805.html
+++ 追記 +++
2010-02-07
関連する記事
"Amazon"ラベルがついた全ての記事
2009/01/17
readbook
2008 年末に作った useaws.rb をマーシャルデータ化しコマンドでリスト表示できるものを作っていた 2009 お正月、
本屋で平積みになっていた「読書は1冊のノートにまとめなさい」を購入したところ useaws.rb はこの本のいう「読書ノート」だけにフォーカスしていたことに気付かされた。
ちょうど、コマンドでリスト表示させるものを作り始めていたものの「索引のデジタル化」を読んでとてもよい刺激を受けた。
P97 読書ノート
P125 索引のデジタル化
このふたつを意識した読書管理プログラム(ローカル内で)を ruby 1.9.1 で作成してみた。
% mybook h
Usage: ./readbook-run.rb [option] [EAN|ISBN|keyword|number]
Option:
a : get amazon data.
fadd : get amazon data followed text file.
l : list. sort adddate.
last : list. sort enddate
r : remove item.
u : update item.
s : search item with keyword.
f : text search with keyword.
h : help
...
# エイリアス myboook は実行権限のあるファイルのエイリアス。
# optparse.rb はよく分からなかったので使っていない。いつかは使ってみたい。よって help は手書き。
1) 本を登録
% mybook a 978xxxxxxxxxx
or
~/Desktop/mylist.txt に ISBN を一行づつ記入しておいて
% mybook fadd ~/Desktop/mylist.txt
でまとめて登録。
2) 一覧表示
% mybook l
1. [ Book][ -][-][ -] 読書は1冊のノートにまとめなさい 100円ノートで確実に頭に落とすインストール・リーディング | 奥野宣之
2. [ Book][ -][-][ -] プログラミングRuby 第2版 言語編 | Dave Thomas / Chad Fowler / Andy Hunt (田和 勝 / まつもと ゆきひろ)
3. [ Book][ -][-][ -] アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝 | スティーブ・ウォズニアック (井口 耕二)
----
3 items
# 右から # 左から 表示番号, [group][読了日][メモや感想の有無][ジャンル] タイトル|著者や訳者名
3) 数日後「アップルを創った怪物」を読み終えたら
% mybook s アップル
or
% mybook s 2009
などで検索。
候補が1つだけの時はいきなりオプションを聞いてくるので(複数の時は番号を選択後)英語のオーを入力してリターンキーを押すと、テキストエディット.app が起動し登録時に自動保存したテキストファイルが開く。読了日やジャンルや感想などを入力し保存。テキスト編集後にアップデートすると読了一覧表に反映される。
# オプションの種類
# c 詳細表示
# o テキストファイルオープン
# u アップデート
# r 削除
4) 一括アップデート
% mybook u all
: Updated アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝.
: Saved List.
# 個別にアップデートしたい時は検索後オプションで u を選ぶ。
5) 読了一覧
% mybook last
1. [ Book][2009-01-03][+][ Computer,Apple] アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝 | スティーブ・ウォズニアック (井口 耕二)
----
1 items
# last は読了したものだけを 読了日昇順に。
# l (小文字のエル) は登録しているものすべて(conf で設定した行数分だけ)を登録した昇順に。
6) 数日後or何ヶ月後 テキストファイルから「あの単語」を検索したくなったら、
% mybook f あの単語
1, ...
2, ...
----
2 items
: Please Select Number: [num/n]:
1
: Selected "たのしいRuby 第2版 Rubyではじめる気軽なプログラミング"
: open[o] cat[c] update[u] remove[r] stop[n]. Please Select Option:[o/c/u/r/n]:
s で検索した場合と同様に番号を入力するとオプションを聞いてくるのでオプションを選択する。キャンセルは n or リターンキー
+++ note +++ruby と ruby1.9 についてまだまだ未熟者がつくったものです。
なんだこれ?とかこういう機能がほしい思われる箇所があればご自由に書き換えご使用ください。私の Mac と ruby と ruby 1.9.1 に関する知識不足からそういった箇所はたくさんあるかもしれません。なんだこれ?を発見しましたらご一報などいただければ幸いです。
see: doc/README-UTF8.txt勇気とRuby と Ruby 1.9.1 に興味のある方はどうぞつかってみてください。またご自由に加筆修正してください。ダウンロードはこちら。 詳細は下記リンクhttp://www.midore.net/readbook/ReadBook.html
http://github.com/midore/readbook
1, Mac OS X 10.5.6
2, ruby 1.9.1 のインストール
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-darwin9.6.0]
を使用しています。
3, エディタの設定カスタマイズ
が必要です。
# ちなみに 世の中には Books というすばらしいアプリケーションがあります。
+++ 追記 ++++
「読書は1冊のノートにまとめなさい」の著者の奥野氏は「読書ノート」は手書きでノートにしたためることを前提としています。パソコンに保存されたデータの危うさには注意せよとも言っています。しかし、私としてはまさにここ(感動をしたためるとか重要箇所引用のページ数を記すとか)をパソコン管理したくて useaws.rb を作った経緯があったのでどうしてもそれをはずことはしたくなかったのでした。
奥野氏が言われているようにテキストエディタよい、という意見にはたいへん共感しました。OS X が提供するテキストエディタがいいかどうかは別として、日本語を入力するためには何不自由なく使えるようだし、環境設定をカスタマイズすることで確実に UTF-8 で編集/保存が可能だったのでテキストエディットを使うことを前提としてみました。emacs などお使いの方も一行書き換えるだけで使えるはずです。詳細は help をご覧ください。
--imported_from
http://www.midore.net/daybook/2009/01/1232118005.html
+++ 追記 +++
2010-02-06
2009年夏以降 Amazon AWS の仕様変更に伴い、
github.com/midore/readbook
は動かなくなりました。それ以降つくるのをやめています。
Amazon の新しい仕様にのっとって作った(2009/08)ものはこちら。github.com/midore/amazon-jp-api
関連する記事
"Amazon"ラベルがついた全ての記事
関連する記事
"readbook"ラベルがついた全ての記事
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
いったいどこのリンクを辿って下記に辿り着いたか思い出せない。ここを読んでこの本を購入しました。面白かった。
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