下記は
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/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"ラベルがついた全ての記事
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>
2007/12/10
Leopard-Spotlight
スポットライトをオフる
http://www.macosxhints.com/article.php?story=20071102215912892
/System/Library/LaunchAgents/com.apple.Spotlight.plist
/System/Library/LaunchDaemons/com.apple.metadata.mds.plist
とありました。
% sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist
% sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
とした。
さらに
http://www.macosxhints.com/article.php?story=2007103015513360
sudo chmod 0 /System/Library/CoreServices/Spotlight.app
To re-enable it later, do this:
sudo chmod 755 /System/Library/CoreServices/Spotlight.app
実行するとファインダーのメニューバーから虫眼鏡アイコンなくなりすっきりした。
+++
追記:スポットライトをオフると書いたとおり上記を実行するとスポットライト機能が停止します。言うまでもないことですがこの意味が分からない人は実行すべきではないでしょう。また同時に、find や grep コマンドを利用したことのない人や find って何?という人も上記のコマンドを実行すべきではないでしょう。
個人的には find (詳細は % man find ) を利用していてなんら不足はなく Spotlight を使用していなかった為 www.macosxhints.com にあった内容はとても有益でした。
ターミナルを起動したことがない人や普段コマンドを利用してない人が、スポットライト機能を抑制したい時に最初に行うべき操作は、システム環境設定->Spotlight->プライバシーを開いて抑制したいディレクトリやハードディスクを指定したり、Spotlight->検索結果を開いて検索結果に表示されるカテゴリを制御すること、かもしれません。もちろん公式な情報が知りたければ当然ながらアップルに電話してサポートをお願いするべきです。
ちなみに、なにかの間違いで上記のコマンドを実行してしまいスポットライト機能を停止させてしまった場合、再びもとの状態に戻すには
Applications->Utilities->Terminal.app を起動し下記のコマンドを実行しコンピュータを再起動。管理者権限を有するユーザで実行する必要があります。launchctl コマンドの詳細は % man launchctl とすると表示されます。
% sudo launchctl load -w /System/Library/LaunchAgents/com.apple.Spotlight.plist
% sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
% sudo chmod 755 /System/Library/CoreServices/Spotlight.app
% は単なる記号です。打ち込む必要はありません。
--imported_from
http://www.midore.net/daybook/2007/12/1197212405.html
+++ 追記 +++
2010-02-06
関連する記事
10.6.2 Spotlight OFF
"Leopard"ラベルがついた全ての記事
2007/12/02
音楽の力
DVDタイトル名そのままの充実した内容だった。
ISBN: B000NA7WTE
--imported_from
http://www.midore.net/daybook/2007/12/1196521205.html