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"ラベルがついた全ての記事