2009/12/30

def max

github.com/midore/mdiary

個人が使うものなのであまり意味はないような気もするが、指定ディレクトリ内でのファイル上限数をもうけてみた。
bin/mdconfig に1ヶ月内に追加できるファイルの上限数を指定するメソッド default_file_count を追加し

mdconfig

def default_file_count
  90
end


当月ディレクトリ内のファイル数が default_file_count メソッドで指定した数を超えた場合
-a や -at でのファイル生成を抑制する。指定数に達している場合はその旨の文を返す。

万一、bin/mdconfig に default_file_count メソッドが存在しない場合(line 185)
ファイル上限数は 90 になる。(line 186)
1日平均2,3枚のファイルを生成すると仮定して 30 * 3

line 189 はなんかヘンなんだけど とりあえず...。

mdiary-main.rb
class Main

184     def max?
185       max = default_file_count if defined? default_file_count
186       max = 90 unless max
187       s = Dir.entries(@now_dir).select{|x| /\.txt$/.match(x)}.size
188       return false if s < max
189       print "too many files. Edit bin/mdconfig.\n"
190       return true
191     end


これに伴って
class Add < Main

221       return nil if max?

class ChoiceDir < Main

266     def base_view(n)
267       return nil if max?
...

273     def base_search(w, st=nil)
274       return nil if max?
...


としておいた。

あと

./mdiary-run.rb -s ""
./mdiary-run.rb -s ''

とかしたら無視するようにした。
line 132 あたり

2009/12/29

よみもの

ポール・グレアム「バージョン1.0
これ、めちゃくちゃおもしろかった。

「偉大な」執事とは何か?
と、小説の中の主人公が自問自答する場面を思い出した。なんでだろな...。あんまり関係ないと思うんだけど。

2009/12/28

unless a.nil?

このあいだ
github.com/midore/mdiary

mdiary-main.rb

378       return nil unless @st.nil? || @plus.nil?

だったのを

379       return nil if @st && @plus

に変えた。

前者と後者は同じ動きをする。どちらも
@st は nil ではなく、かつ、@plus もnil でなければ、return nil をかえす。

例えば

  1 # coding: utf-8
  2 
  3 a = 'a'
  4 b = 'b'
  5 print "a,b どちらも not nil です。\n" unless a.nil? || b.nil?
  6 print "a,b どちらも not nil でっす。\n" if a && b

実行すると

a,b どちらも not nil です。
a,b どちらも not nil でっす

となる。

前者(||を使用),後者(&&を使用)ともに

a は nilではない。かつ、b も nil ではない。
であれば print する。

と動く。ちょっと不思議だけど。

条件文が読みやすいのは && を使用した後者。
ただ、
if x
と書いて nil じゃなければとするより
unless x.nil?
と、nil なの?そうじゃないなら と書いてあった方が私にとってはわかりやすい時もあったりする。

...とはいっても || なのに「かつ」 を意図してるとなってると後になって自分がぎょっと驚いてしまうだろうから...変えた。

url for blogger-api

Blogger API 用
日付範囲を指定したURLの生成

line 10:
t に2010/12 が指定された場合、翌月は年も変わるので年に1加算し月にも1加算すると2011/1/1 が得られそこから1秒ひくと2010/12/31の23:59:59
になる。

Time だけ使った場合

  1 require 'time'
  2 
  3 def range_current_month(t=nil, bid)
  4   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  5   begin
  6     t = Time.parse(t) unless t.nil?
  7   rescue
  8     t = Time.now()
  9   end
 10   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 11   min = t.strftime("%Y-%m-%dT00:00:00")
 12   max = (Time.local(x[0], x[1], 1) -1).strftime("%Y-%m-%dT%H:%M:%S")
 13   return u + "?published-min=#{min}" + "&published-max=#{max}"
 14 end
 15 
 16 bloggerid = 'xxxxxxxxxxxx'
 17 t = '2010/12'
 18 p range_current_month(t, bloggerid)
 19 t = '2010/2'
 20 p range_current_month(t, bloggerid)

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


Date も使った場合

  1 require 'time'
  2 require 'date'
  3 
  4 def range_current_month(t=nil, bid)
  5   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  6   begin
  7     t = Time.parse(t) unless t.nil?
  8   rescue
  9     t = Time.now()
 10   end
 11   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 12   min = t.strftime("%Y-%m-%dT%H:%M:%S")
 13   max = ((Date.new(x[0], x[1], 1)) - 1).strftime("%Y-%m-%dT23:59:59")
 14   return u + "?published-min=#{min}" + "&published-max=#{max}"
 15 end
 16 
 17 bloggerid = 'xxxxxxxxxxxx'
 18 t = '2010/12'
 19 p range_current_month(t, bloggerid)
 20 t = '2010/2'
 21 p range_current_month(t, bloggerid)
 22 

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


もう少し短くできないかなと思うんだけど...。 ?

2009/12/20

class Search

github.com/midore/mdiary
の最近変更した箇所

$ ./mdiary-run.rb -st 'music'

を実行すると、ファイル content 内容に'music'を含むファイルがあるか検索する。
検索結果がゼロでなければ

1	[+] [2009/12/10 Thu AM 00:00:00] [music] (tower)
2	[+] [2009/12/11 Fri PM 17:04:36] [music] (diary)

と結果を返す。

この場合、
class ChoiceDir の中でSearch クラスを呼びだす。
mdiary-main.rb

252       Search.new(@word, @now_dir, st).base if @now_dir


Search の base method は、View の set_i_ary を呼び出す。
set_i_ary は、Search の get_diary を使用して一つづつファイルを処理する。

get_diary は @st が nil でなければ find_content にパス をわたす。
find_content はうけとったパスのファイルを一行づつ読み検索対象文字列を探す。
対象文字列がみつかった場合、ary_to_h をかえす。ary_to_h がかえす中身は Hash。
get_diary の中の to_obj は、Hash がかえってきた場合、その Hash をもとに Diary.new() する。

method "get_diary" in mdiary-main.rb

370     def get_diary(x)
371       begin
372         h = find_index(x) unless @st
373         h = find_content(x) unless @st.nil?
374         to_obj(h) unless h.nil?
375       rescue
376         return nil
377       end
378     end


method "find_content" in mdiary-io.rb

 38     def find_content(path)
 39       i, m = nil, nil
 40       a, mark = [], /^--content$/
 41       IO.foreach(path){|line|
 42         if line.match(mark)
 43           i = true; next
 44         end
 45         (i.nil?) ? a.push(line) : m = line.match(@word)
 46         break if m
 47       }
 48       return ary_to_h(a, path) if m
 49     end

2009/12/15

about-mdiary

mdiary について

有名な tDiary にあやかり mdiary と名付けた。
正式名称は「ま(m)だできてない diary」で mdiary ^^;

<特徴>
• ruby 1.9.1 が必要です。
• local (自分のコンピュータの中) で使うものです。
• home user 向けです。
• ちょっとしたメモ、雑記帳、todolist としても利用できます。
• vim を前提にしてますが mdiary-main.rb を一行変更するだけで他のエディタでもつかえます。
• 標準ライブラリ以外のライブラリに依存してません。
• gem とかいらないです。
• データベースを使用していません。
• marshal なども使用していません。
• キャッシュを作成しません。
• logfile ありません。
• ひょっとしたら軽いかも?
• まだ未完成です。

<使い方>
$ vim bin/mdconfig
ファイル保存先として利用したいディレクトリのパスを記入。
$ vim bin/mdiary-run.rb
ruby 1.9.1 のパスを一行目に記入(例:#!/usr/local/bin/ruby)

新規ファイル作成
$ ./mdiary-run.rb -at '2009/12/14 21:00'

一覧表示(ハイフン + 小文字のエル)
$ ./mdiary-run.rb -l

=>
1  [-] [2009/12/14 Mon PM 21:00:26] [about-mdiary] (draft)
2  [-] [2009/12/14 Mon PM 21:00:00] [about-git] (diary)
3  [+] [2009/12/14 Mon PM 20:00:00] [list] (book)
Select NO:


使い方の続きは REAME を...
$ git clone git://github.com/midore/mdiary.git
or
ブラウザごしにダウンロードもできると思います。
URL : http://github.com/midore/mdiary.git

force_encoding

ここを読んで
github.com/midore/amazon-jp-api
をなおした。