ラベル importdata の投稿を表示しています。 すべての投稿を表示
ラベル importdata の投稿を表示しています。 すべての投稿を表示

2009/04/01

daybook_index

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

--

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

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

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

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

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

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

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

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

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

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

2009/02/25

readbook

readbook
source
http://github.com/midore/readbook

% mkdir readbook
% cd readbook/
% git clone git://github.com/midore/readbook.git 

# Screenshot


Option scpt

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

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