Home | Index | Changes | Diaries

2002.01.11

1: Remind

試しにインストールしようと思ってみたら、インストーラがすごい。

Tcl/Tk のウィジェットでオプションの設定をした後、Build というボタンを 押すと wish の中で configure && make が始まった。

こんなのは初めて見たな〜。

2: RemindEmacsWiki

なんかすごい便利なスケジューラがあって、そのデータベースから diary や planner のファイルに引っ張って来るのかと思っていたのに。 planner 側の日々のファイルに日程を入れといて、そいつをリマインダ1 に出そうという、逆のものだったよ。

でも 2002.01.09 で最初に言ってたのと同じか。

どっちがいいのかな。

3: plannerは想像以上にイイ!

説明(planner.el内のコメントね)よく読んでなかったから 今まで知らなかったけど、 Tasks の本当の使い方って、各planファイル(a.k.a. WikiPage)に書いて C-c C-c で日誌ファイルにコピーするのね。

コピー元は status のところが '>' になって、後ろに (ccyy.mm.dd) がつく。 コピー先の日誌ファイルのほうは後ろに (元のplanファイル) がつく。 日誌の方で status は '_' ⇒ 'o' ⇒ 'X' と進捗を記録していくんだけど、 こっちを変更すると、元の planファイル側も連動して変わるんだこれが。

いやビクーリした。恐れ入りました。また使い方を改めなくちゃ。

4: planner: gnusとの連携

planner では gnus://グループ名/メッセージ番号 で特定のメールへ飛べるらしい。

で、gnusのサマリバッファから planner のタスクを作る関数もあって、 タスクに上記リンクを張ってくれる。

planner-browse-url をいじれば Wanderlust へも飛べるかな。 wl のいじり方をよく知らないんだけど。

5: inetdからリモートアドレスをもらう

そういえば ちょっと前のユニマガで、inetd のそこらへんについて解説がありました。

多治見さんの「プログラミング・テクニック」だったと思うけど、何月号だったかな。

6: とりあえず

Outlookからスケジュール一式を引っ張り出してきて、diary形式で書き出すスクリプトを 書いてみた。


#!/usr/home/bin/ruby/bin/ruby

require 'win32ole'



module OUTLOOK_CONST

end



class OutlookCalendar

  def OutlookCalendar::run

    cal = self.new

    begin

      yield cal

    ensure

      cal.quit

    end

  end



  def initialize(display = false)

    @outlook = WIN32OLE.new("Outlook.Application")

    WIN32OLE.const_load(@outlook, OUTLOOK_CONST)

    mapi = @outlook.GetNameSpace("MAPI")

    @calFolder = mapi.GetDefaultFolder(OUTLOOK_CONST::OlFolderCalendar)



    if display then

      @calFolder.Display

    end

  end



  def find(title)

    return @calFolder.items(title)

  end



  def each

    count = @calFolder.items.count

    for i in (1..count) do

      yield @calFolder.items(i)

    end

  end



  def quit

    @outlook.quit

  end

end



def snap(s)

  date, time = s.split " "

  yy, mm, dd = date.split "/"

  return [yy,mm,dd,time]

end



# main

OutlookCalendar.run { |cal|

  cal.each do |item|

    s = snap(item.start)

    e = snap(item.end)

    dy = s[1] + "/" + s[2] + "/" + s[0]

    st = s[3]

    et = e[3]

    if (st == "00:00" && et == "00:00") then

      print "#{dy} - #{item.subject}\n"

    elsif (st == et)

      print "#{dy} #{st} | #{item.subject}\n"

    else

      print "#{dy} #{st}-#{et} | #{item.subject}\n"

    end

  end

}



=begin

OutlookCalendarの使い方



#タイトルで探す

  cal = OutlookCalendar.new

  item = cal.find("業務ミーティング")

  p item.start

  p item.duration # 所要時間を分で表す整数

  p item.end

  p item.subject



#全部見て回る

  cal.each { |item| print item.subject }



#片付ける

  cal.quit



=end

(→ RubyOnWindows へ)

双方向ではないけれど、記録として残すには便利かも。


(defadvice calendar (before remind-generate-diary activate)

  "Generate a diary file from Outlook data."

  (save-excursion

    (with-current-buffer (find-file-noselect diary-file)

      (erase-buffer)

      (shell-command "/usr/home/bin/olconv" (current-buffer))

      (save-buffer))))

組み込みはこんな感じ。(→ MakingOfWikiTech へ)

元のコードのようにmark-diary-entriesのたびにoutlookが起動するのは、 挙動が重くていやだったのでcalendarを起動するタイミングにしてみた。


[1] その日その時がきたら教えてくれる、要はアラーム。