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

2010/07/06

mdiaryについて

mdiary はメモ帳、日記帳、ToDo管理、Blogに投稿したファイルの管理、本の管理、思いついたことをどんどん書き込んでいくだけの雑記帳 ...etc. いろいろな用途に利用できます。

[特徴]
1, ファイルタイプ
mdiary が管理する全てのファイルはテキストファイルであることを前提としています。

2, ファイル内の表記について
当初、Blogspot.com に投稿する記事を管理したかった為下記のような項目になっています。

1 --date
2 2010/07/04 Sun PM 12:40:52
3 --control
4 yes
5 --category
6 diary
7 --title
8 NewTitle
9 --content

3, 必要なもの
Mac OS X 10.6.x
Ruby 1.9.x

4, その他
自分が作成した文書(テキストファイル)は、常に統一した文書フォーマットを維持し、尚かつ素早く検索閲覧できるようにするにはどうすべきか?mdiary はこういった自問自答に対する1つの答えだったりしています。
あと、Ruby で遊ぶための口実のようなものが欲しかったというのもあります。口実が目的でもあり Ruby で遊ぶのが目的でもあり、そのあたりは曖昧模糊としています。いわゆる趣味で作ったやつなのです。
[mdiayr の使い方]
# 設定方法などはREADME を読んでください。
0) 新しい entry の作成
% diary -a 
を実行するとTerminal.app で新しいWindow が開き vim が起動します。
こんな感じです。


# 設定ファイルを編集すると vim 以外の editor に変えることもできます。
# テキストエディット.app に変更することもできます。(参照:README)

category と content を編集します。
category は,で区切ることができます。
content には test ... と記入。
編集し終えたら editor を終了し exit します。

1) リスト表示
% diary -l
1 [-] [2010/07/03 Sat PM 13:51:10] [NewTitle] (diary,mdiary)
Select [i/e/r]:

entry が1つしかない場合はすぐにオプションを訊ねられます。
entry が複数ある場合は entry 番号を選んだ後にオプション選択となります。
何も選択しないでこのまま終了する場合はリターンキーか CTRL + C で終了します。

i を選択すると entry ファイルのパスや生成時刻、カテゴリーなどをみることができます。
e を選択すると 先ほどと同じように entry ファイルを開きます。
r を選択すると 選択された entry ファイルは ~/.m_diary/trash に移動し2度とリストに現れなくなります。

2) 日時とタイトルを指定して新しい entry を作る場合
% diary -a 'お菓子ストック' -t '2010/07/30 18:00'

-a でタイトルを指定しています。
-a だけを指定し -t がなかった場合は自動的に現在の日付時刻になります。
-t は '2009/12/01 1:00:00' など過去の日付を指定することもできます。秒数もOKです。

control と content を編集します。
お菓子ストックは重要なので control を 「yes」 から 「must」 にしてファイルを保存します。



保存したらexit します。

リストをみます。
% diary -l
1 [+] [2010/07/30 Fri PM 18:00:00] [お菓子ストック] (diary)
2 [-] [2010/07/03 Sat PM 13:51:10] [NewTitle] (diary,mdiary)
Select NO:

controlを yes 「以外」にすると [-] だったところが [+] になります。

3) [+] マークがついた entry の表示
% diary -s +
1 [+] [2010/07/30 Fri PM 18:00:00] [お菓子ストック] (diary)

-s をつけると tilte, category, control を検索し該当する entry を表示します。
-s '7/30'
でも同様の結果を得られます。

お菓子も大事だけど水と缶詰も重要だったことに気づきました。
2つ目のentryを追加します。
% diary -a 水と缶詰のストック -t '2010/07/30 18:00'
2
Same name file is exist.

先ほどと全く同じ時刻を指定しまった為エラーになりました。
時刻を少し変え 18:10 にすると entry を追加できます。
% diary -a 水と缶詰のストック -t '2010/07/30 18:10'

水と缶詰も重要なので
editor でcontrol を 「yes」 から 「must」 に変えておきます。

[+] の entry を検索します。
% diary -s +
1 [+] [2010/07/30 Fri PM 18:10:00] [水と缶詰のストック] (diary)
2 [+] [2010/07/30 Fri PM 18:00:00] [お菓子ストック] (diary)

4) 今日の日付を持つ entry の表示
% ./test.rb -today
1 [-] [2010/07/03 Sat PM 13:51:10] [NewTitle] (diary,mdiary)
です。

5) 検索について
-s をつけると category, title, control, date 内を検索します。
-st をつけると content 内を検索します。
-today は今日の日付のentry を検索します。

6) 予定の entry の追加
来月になったら思い出すべき事柄があったとします。
未来の日時を指定して entry を追加します。
% diary -a 'Watch TV' -t '2010/08/19 23:00'

editor で編集します。
プラスマークを検索した時に表示させたいので control を 「yes」 から 「enjoy」 にしておきます。
category を TV,music にします。
content に .... 要注意! と記入しファイルを保存し editor を終了します。


リストで来月(現在:2010/07/03) のentry をみるためには -d 2010-08 をつけます。
% diary -d 2010-08 -l
1 [+] [2010/08/19 Thu PM 23:00:00] [Watch TV] (TV,music)
Select [i/e/r]:

-d がない限り、今月の entry 「だけ」を表示します。
# ToDo : 今月の entry しかリストにあらわれないのはやっぱり不便かな...と考え中です。
(コンピュータの日付が8月以降になれば  % diary -l  と打つと 2010年08月の日付をもつentry があらわれます。)

7) content の検索
content の内容に'要注意'という単語が含まれているentry を表示します。
% diary -d 2010-08 -st '要注意'
1 [+] [2010/08/19 Thu PM 23:00:00] [Watch TV] (TV,music)
Select [i/e/r]:

検索する時も -d で検索する月を指定します。-d がなければ今月の entry 内だけを検索します。
# 私のmdiary を vim で検索してみたところ
% diary -s vim
1 [-] [2010/07/02 Fri PM 22:57:36] [vim-practice-autocommand] (vim)
2 [-] [2010/07/02 Fri AM 10:00:00] [vim-practice-filetype] (vim)
3 [+] [2010/07/01 Thu PM 23:00:00] [safari.scpt] (vim, SnowLeopard)

めんどい時は最初から grep などを使ってください。# え"

+++ memo +++
実際の放送予定
2010/08/19 Thu PM 23:30:00

2010/02/24

mdiary 最近の変更点

  5     def initialize(arg)
  6       @err = false
  7       k, @h = nil, Hash.new
  8       arg.each{|x| m = /^-(.*)/.match(x); (m) ? (k = m[1].to_sym; @h[k] = nil) : @h[k] ||= x}
  9     end


arg は ARGV の値

% .mdiary-run.rb -d 2010-01 -s music

を実行した場合 arg は

arg = ["-d", "2010-01", "-s", "music"]

になる。line 8 はこの配列を

@h = {:d=>"2010-01", :s=>"music"} 

のようなハッシュにするためのもの。

arg = ["-d", "2010-01", "-l", "3"] だった場合
@h={:d=>"2010-01", :l=>"3"}

arg = ["-d", "2010-01", "-l"] だった場合
@h={:d=>"2010-01", :l=>nil}
になる。

line 7-8 をくだいて書くと

  1 # arg = ["-d", "2010-01", "-s", "music"]
  2 k, @h = nil, Hash.new
  3 arg.each{|x| 
  4   m = /^-(.*)/.match(x)
  5   if m
  6     k = m[1].to_sym
  7     @h[k] = nil
  8   else
  9     @h[k] ||= x
 10   end
 11 } 


line 4: x が '-' で始まっていたら m の値は #<MatchData "-d" 1:"d">
line 5: m の値に何か入っていたら(マッチしたら)
line 6: k に m の1番目のマッチの値を代入。
line 7: ハッシュキーが k で 値が nil のペアを @h に格納。
line 8: m の値に何もはいっていなければ(マッチしなかったら)
line 9: @h[k] が nil の場合は x を代入。@h[k] の値が nil でなく何か値が入っていたら何もしない。

+++ memo +++

1) @h[k] ||= x

line 9 の @h[k] ||= x を @h[k] = x にしてしまうと
あやまって
arg = ["-d", "2010-01", "xxx", "-s", "music"]
が与えられてしまった時
@h = {:d=>"xxx", :s=>"music"}
になってしまう。これでは意図した結果と異なる為 ||= にしている。

2) k = nil

line 2 の k = nil を書き忘れ
line 2 は @h = Hash.new だけだった場合
arg = ["-d", "2010-01", "-s", "music"] を与えると
@h={:d=>nil, nil=>"2010-01", :s=>nil}
になってしまう。
なぜなら...
{} の外側に k が存在していなければ k は {} の中だけで使える変数となり
m == nil でなければ
k = m[1].to_sym なので k には m[1].to_sym が代入されるが

m == nil だった場合、すなわち else 節においては
k = nil が代入されてしまうから。そして
line 9: @h[k] ||= x
で nil を ハッシュキーとしたペア(nil=>"2010-01")を @h に格納することになってしまう。

だから{} の外側の k = nil はとても大切。
外側で定義された k があることによって else 節においても k は m[1].to_sym を保持していてくれる。

[2010-02-26]
arg.each{|x| m = /(^-(.*))/.match(x); (m) ? (k = m[2].to_sym; @h[k] = nil) : @h[k] ||= x}
arg.each{|x| m = /^-(.*)/.match(x); (m) ? (k = m[1].to_sym; @h[k] = nil) : @h[k] ||= x}

2010/01/05

mdiary 覚え書き

新年とともに大幅に変えた。(2010/01/04)
次回(不明)は、ARGV の処理を変更予定。

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/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 なの?そうじゃないなら と書いてあった方が私にとってはわかりやすい時もあったりする。

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

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