2011-01-30

Someday is someday

今日は佐々木正悟さんのセミナーを受講してきました。

セミナーのテーマは「時間管理」でした。 最初に

どうして時間が足りなくなるのか?

という問いかけに始まり、そして、「うまく時間をコントロールできていない状態」を大きく2つ紹介していただき、あとは、懐深く質問に答えていくというセミナーでした。

眠たくて眠たくてたまりません。 頭も疲労困憊です。

その中でも佐々木さんは

someday/maybeリストを書くのは時間の無駄だ。

と力説していたことが印象的でした。 普段飄々とされている佐々木さんが、熱くなる数少ないトピックです。

この言に関して、納得できそうな経験がありました。 昔、someday/maybeリストを無くしたことがありました。 その後少し時間が経って、無くしたsomeday/maybeリストが無事に見つかりました。 改めてそれらリストを処理してみたのですが、 ほぼ(九割以上)someday/maybeリスト所属のままでした。

一度someday/maybeリストに登録された事柄 issue は、基本的に生き帰ってこない。 特に「**したい」という願望系のものは。 そのように、上記体験を解釈しました。

そのため、自分はGTDのsomeday/maybeリストは「願望の墓場」リストとして使っています。 「願望があることは忘れてはいませんよー」と安心して忘れることができるために。 リストをみれば願望を思い出せるのだから、それはリストに任せておいて、 今ここですべき事柄に資源を振り分けて、一日をまわしていこう、というスタンスでsomeday/maybeリストを使っていました。 まぁ、そこの多くの選手が戦力外通告される予定のファーム、といったところでしょうか。 いきなり、「クビね」ではショックが大きいので、「まずはファーム行って落ち着いてこい。すぐに帰ってこれるさ」と言って、解雇します。

僕は、この一連の処理をタスクに対しておこなっています。 someday/maybeがタスク・プロジェクトの墓場・安置所であることは大いに賛成します。 ただ、

そう思った事柄をメモしなくても良いのか?

ということには自信がなく、メモする場所としてsomeday/maybeリストを使っていました。 だから、一度someday/maybeリストに入ったものは、なかなかプロジェクトになれないのです。 いきなり願望を切り捨てる覚悟と自信とノウハウがなかったので、 「やったほうが好ましい、でも必須ではない」事柄を非アクティブリストのたらい回しにして、 実質的に考えるリソースを与えなければ良い、という手間をかけていました。

佐々木さんはもっと突っ込んでやっていました。

someday/maybe リストに書き込む時間、それ自体が浪費でしょう。

たしかに、someday/maybeリストを達成できるシステマティックな方法がなければ、 "someday/maybeリストは役に立たない"、それは間違いありません。 そこまでちゃんと考えているので、 someday/maybeリストは書かないと聞いて、「なるほどな」と納得した次第です。

この記事を書いていたら、この話は、バイキングスタイルの食べ方と共通点があるように思えてきました。 テーブルを一回りして、あれもたべたい、これもたべたい、と思います。 ただ、それを全部さらに盛ってしまったら、大体の場合、食べきれずにお皿に残すことに成ると思います。 あれもたべたい、これもたべたい、と手当り次第に皿に盛ることが、 これもしたい(いつか)、あれもしたい(死ぬまでに)、と手当り次第にsomeday/maybeリストに追加することと対応しそうです。 そして、佐々木さんは行儀よく、自分が食べられるだけしかお皿に盛らないのです。 更に「いや、家で夕食があるので」と言って、必要でないモノは食べないことを選ぶかもしれません。 自分の体調、栄養摂取の本来の意図を考えれば、それがまだ合理的です。

僕のように、バイキングの際に、「食べないけど、あれが食べたかったとメモしよう」とするのは頭の良い話ではなさそうです。 その食事を食べて楽しむことも、いつものペースを守って静かな満足感を得ることもできません。 書いいている本人ですらそう感じます。 頭悪いですね。

2011-01-22

What to do when I can’t focus properly on what I do because of dozens thoughts

GTD Times.comで What to do if you’re smart and imaginative という記事が紹介されていました。

詳しくは読んでいただくとして、 すごくまとめます。

やりたいことがいっぱいあって、かえって頭の中がぐちゃぐちゃになっている。 どうしたらいい?

という質問に対してDavid Allenは

自分も何度も通ってきた道だよ。 まず「この人生で本当に経験したいことは何だろうか?」と自問すること。 それから、この質問に答えたリストを手に持って、 「こんな経験ができるようになるために、今できることは何だろう?」 と再度自問することだ。

と応えました。

言うは易し。行うは難し。 これは自問することすら難しい。

そして、このemailの差出人(学生)の文面にドキッとします。

I’m not very practical and everything ends at a theoretical phase. I never have clear objectives and I’m always confused by dozens of thoughts and can’t focus properly on what I do.

Most of the time I feel like I’m wasting my time, and would rather be doing something else. I always feel I ought to organize, so I make a nice, tight schedule. But after a couple of days it’s gone, and I’m back at the beginning.

これほど正直で的確に状況を説明できる自信がありません。 有能な学生さんなんでしょうね。

2011-01-21

emacs-evernote-mode

EmacsからEvernoteを操作できないか?と考えていたのですが、ありました。 emacs-evernote-mode というものが存在するようです。

現在備えている機能は、

  • ノートを開く
    • 存在しているノートをEmacs bufferに展開する
  • ノートをセーブする
    • Emacs buffer内での変更されたノートを更新する
  • ノートを新規作成する
    • まっさらなバッファを新しいノートとして
    • 現在のバッファを新しいノートとして
  • Post region
    • (画像の?)選択範囲を含んだノートの作成
  • タグの編集
    • ノートに付加されたタグを変える
  • ノートのタイトル名変更
  • ノートの削除
  • ノートの検索

…基本的な機能は揃っていますね。 これはすごい。

これを利用すれば、EmacsでEvernoteを扱うことも可能になる。 使い慣れたキーバインド、キーレスポンス というのは魅力です。

テストの対象です。活動が活発で、楽しそうなプロジェクトに見えますし。

18分だそうです。

2011-01-19

Keep track with Evernote?

Evernoteのニュースレターで Tim Ferriss が「どうEvernoteを使っているか」インタビューされています。 How Tim Ferriss used Evernote to write The 4-Hour Body ちなみにTim はEvernote のアドバイザーになっています。

インタビューでは、

Evernoteがなかったら"The 4-Hour Body"を書けなかった

と言っています。 今回の著書"The 4-Hours Body"では、 様々な健康法、トレーニング法をTim自身の身体で試験し、 効果や身体への影響を紹介しているそうです。 その執筆となれば、まずはTimのデータを取ることになるでしょう。 日々の状態をデータに取り、それをまとめていったようです。 その記録時・執筆時の両方でEvernoteを使っているようです。

Timがアウトプットの道具としてEvernoteを推す理由は

  • 時刻が自動的に記録されるから

だとしています。 情報カードに自分で日時を書き入れなくても良いのです。 日時データが自動挿入されることによる利点を、 プライベートな日記の使い方として紹介しています。

Evernoteのクリッピング機能は魅力です。 非常に手軽なので、お世話になっています。 1アクションで少なくとも以下の2つの情報が作られます。

  • テキスト
  • 日時

それも、どのアプリケーションを使っている最中でも、です。

この後に、

Evernote をEmacsで使えないか?

といったことを考えて、探しながら記事を書けないかと思ったのですが、これで20分です。 23分です。

前振りが長すぎたと言うことですね。

EvernoteをEmacsで使える方法があれば、喜ぶのですが。 最低限はキーバインドで。 できるなら、置換などの各機能やモードでの扱いを。

これで25分です。十分にオーバーしました。

20 minutes blogging trial: I have no extra time. [2011-01-18 Tue]

相変わらずTaskChuteみたいな表を埋めることで、一日を過ごしています。

先日、繰り返しタスクを一度パージしました。 登録したルーティンの数と時間が増えた結果、 いつになっても作業が終わらないため就寝できなかったので。

この状況を僕は次のように認識しました:「やった方が良いこと」を満載した結果、自由に動けなくなった、と。 あれもこれもと装備した結果、で動けなくなったのだと。 だから、「必要なこと」のみをリストアップし直して、もう一度荷造りをし直そうと思いました。

まず全てのルーティンを、別のワークシートに移動しました。 ルーティンにまみれて、もみくちゃにされて生活するのが嫌になったからです。 まずは一度、全ての繰り返し作業を取り外しました。 タスクだけが表に残りました。

最初は、生存に必要な項目をルーティンとして追加しました。 睡眠、朝食、昼食、夕食、風呂です。 これに時間を1秒も割かなければ、生活に支障がでるでしょうから。

次に、自分のしたいことを1つ追加しました。 これは、是非とも時間を確保して、時間を使いたい事です。 そもそもこれのために、時間管理、行動管理をしているわけです。 これに時間を割けるだけの資源を割り振るのが、時間管理でのゴールです。

それから、自分に割り当てられた繰り返しタスクを、ルーティンとして登録しました。 これは、仕方がないと考えました。 今後改善するにしても、とりあえず今それが必要とされているものでしたから。

以上3つのルーティンの追加のみで数日回しています。 一日見積最大34時間という、どうやっても無理な状況から、 一日見積最大26時間という、まだ対応可能な状態に近づきました。 達成可能な見通しを得られる時間帯が増えました。

記録に費やす時間も削りました。 記録した内容を利用できていなかったので。

ルーティンの漏れが無いか不安がありますが、まだ致命的な不具合は確認されていません。

これで30分かかったようです。

2011-01-18

Radio taught me some ancient Japanese poems

先日ラジオを聞いていたら、古今和歌集についてなにかしゃべり出しました。 まったく分からない世界の放送でした。 3首ほど紹介されたのですが、聞いても、

なるほど。そうか。

としか反応できなかったほどでした。 その中で2つ気になったことを書きます。

まず、紀貫之について。 そう、あの徒然草…ではなく土佐日記で有名な紀貫之です。 この人、古今和歌集の撰者筆頭として紹介されていました。 そのとき紹介していた人の発音が、 「きの(↓)、つら(↑)ゆき(↓)」だったのです。 聞いていて、「ん?」と思い、少し考えました。 自分は「エレベーター」という音程で「きのつらゆき」と一息で発音していました。 これは違うぞ、と。

考えてみれば、当然も当然です。 紀貫之(きのつらゆき)は、紀の家の貫之さんということですから。 名字が「紀」だったんだなぁ、紀氏の一族なんだなぁ、と今さらながら勉強いたしました。

それともう一つ。 万葉集は素朴で素直な歌が多い。 古今和歌集は、技巧的に一ひねりした句が多くまとめられている。 という紹介がありました。

万葉集からの紹介でした。 行幸にお供した柿本人麻呂が詠んだ歌で、行幸先の吉野という土地を褒めちぎる歌です。

やすみしし わご大君の 聞し食す 天の下に
国はしも 多にあれども 山川の 清き河内と
御心を 吉野の国の 花散らふ 秋津の野邊に
宮柱 太敷きませば 百礒城の 大宮人は
船並めて 朝川渡り 舟競ひ 夕河渡る
この川の 絶ゆることなく この山の いや高知らす
水激つ 瀧の都は 見れど飽かぬかも

と続きます。 全文・意味は、万葉集 巻1 36をご覧下さい。

面白い見方としては、 柿本人麻呂は、旅行の記録係だった。というものです。 現在の旅行では、記念写真ビデオ撮影で記録を残すのと同じように、 「行幸の様を歌で記録しよう」として柿本人麻呂がお供したのではないか、 という考え方があるそうです。 そうならば、今も昔も、旅行にいったときの人の反応というのは変わらないモノですね。

他に記憶に残っている歌の解説ですが、

秋になって月を見上げたら、月も黄色に輝いていた。 そんなに黄色に輝いているのは、月でも秋が来て葉が落ちているからだろうか。

などという、歌もありました。 これは、古今和歌集からの紹介だったと記憶しています。 解説者は、このの見方自体が狙っているので、 その狙い具合(技巧)が好きな人と、嫌いな人とに分かれますね。 と解説していました。

もう一つ別の例を紹介すると、 冬に読まれたはずの歌なのに「花散りて・・・」という 表現を使った歌がありました。 二期桜ではありませんでした。

基本的に歌の中で「花」と読まれた場合は、原則的に「桜の花」を意味するそうです。 ただその歌には但し書きがあって、読まれたのは冬であることが分かっています。 ということは、この「花」、「花が散る様」というのは「雪が降る様」を表現しているのだ、とか。 この歌も古今和歌集にあるとのことです。

もうこうなってくると、一体、なんなんでしょうか。という質問しか出てきません。 何でもありの世界です。

さて、最後は紀貫之。 この人、結構情熱的な歌を詠むというか、後で相解釈している人がいます。

志賀の山越にて、いしゐのもとにて物いひける人の別れけるをりによめる むすぶ手のしづくににごる山の井のあかでも人にわかれぬるかな (古今集404)

その当時、初めてあった男女が山道の休憩所で出会っても、話す事はまず無かったであろう。 よって、この男女は宮中での顔見知りであろう。 とか解説してくれたのですが、それよりも、 序詞の使われ方に度肝を抜かれました。 この歌では「あかでも」を引っ張り出したいためだけに、「むすぶ手のしづくににごる山の井の」という序詞が使われています。 序詞は、無くても、文の意味に全く影響しません。 「あかでも人にわかれぬるかな」(ゆっくりと話もできず、心残りがあるままに分かれてしまった)を言いたいだけのようです。 それを「察して。」と言う歌の読み手、そして選者。 これは相当に難しい世界だ、と思いました。

そんな解説を聞いていたラジオ番組も、終了の時が来ました。 3日くらいして、こんなエントリーを書きました。 ふだんと全く違う毛色のエントリーになってしまいました。

2011-01-13

20 minutes blogging trail [2011-01-12 Wed]

今日もこのブログに書くことを考えながら過ごす20分の時間をスタートさせました。 例によってネタは「org-modeからblogger.comへ投稿できる」ということですが。

使っている道具を紹介します。

  • org-blogger.el
  • org2blogger.el
  • get-direct-url-in-picasa.py
  • getalbumid.py
  • upload-image-to-blogger-in-picasa.py

です。 なお、これらのpythonスクリプトは

  • gdata ライブラリ?

が先にインストールされてないと動作しません。 ま、インストールしたと言うことで。

使うための用意

まずは、albumidを取得して、次のアップロードに備えます。この作業は初回のみでOKです。 毎回行う必要はありません。

#!/usr/bin/python
import sys
import gdata.photos.service

#usage: in command.com like winXP, 
# > python get_albmid.py| nkf -s
# use "nkf -Wsd", if needed.

args = sys.argv
#args.pop(0)
email = "your@gmail.com"
password = "it's a nuts"
username='default'

gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

albums = gd_client.GetUserFeed(user=username)
for album in albums.entry:
  print 'id:[%s] title:[%s] number of photos: %s' % (album.gphoto_id.text, album.title.text, album.numphotos.text)

を実行すると、

>get_albumid.py
id:[5555555555555555555] title:[Windows Live Writer] number of photos: 2
id:[1234567890123456789] title:[Chemical-X] number of photos: 18

というIDの数字と、アルバムのタイトルが出てきました。 アルバムは、picasa内で確認できるアルバムの数と同じです。

そして、特定のアルバムに画像を追加したいときに、この album id :1234567890123456789 (自分の"Chemical-X"なら) を次に使います。

画像の有無をチェック・無ければアップロード

ここで得たalbum id を使って、そのアルバムに画像を追加したいとします。

bloggerに執筆するときにはそれらをひとまとまりにしたい

というのが良くある考え方だと思います。 その時、 get-direct-url-in-picasa.pyをつかって、picasa上にその画像の有無を調べます。 画像があれば、picasa上のファイルへのdirect linkが得られるはずです。 もしpicasa上にその画像が無いと判断したら、 upload-image-to-blogger-in-picasa.pyをつかって、 最初に得たalbum id を指定して、画像をアップロードします。 そしてその画像のpicasa上でのdirect linkをget-direct-url-in-picasa.pyで得ます。

まずはget-direct-url-in-picasa.py の内容です。

#!/usr/bin/python2.5
# return the direct link (URL) of picture in picasa.

import sys # for argv
import gdata.photos.service
import gdata.media
import gdata.geo

argvs = sys.argv
argc = len(argvs)
if (argc != 3 ):
    print 'Usage: # python %s AlbumName FileName' % argvs[0]
    quit()

albumname = argvs[1]
filename = argvs[2]
album_id="1234567890123456789" # the albm_id fo "Chemical-X" was given by get_albumid.py

gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'changeme@gmail.com'     # Set your Picasaweb e-mail address...
gd_client.password = 'secret word'  # ... and password
gd_client.source = 'api-sample-google-com'
gd_client.ProgrammaticLogin()



album_url = '/data/feed/api/user/%s/albumid/%s' % ('default', album_id)
photos = gd_client.GetFeed('/data/feed/api/user/%s/albumid/%s?kind=photo' % ('default', album_id))
for photo in photos.entry:
    if photo.title.text == filename :
        print photo.content.src,

続いて、upload-image-to-blogger-in-picasa.py の内容です。

#!/usr/bin/python2.5
# return the direct link (URL) of picture in picasa.

import sys # for argv
import gdata.photos.service
import gdata.media
import gdata.geo

argvs = sys.argv
argc = len(argvs)
if (argc != 2 ):
    print 'Usage: # python %s FileName' % argvs[0]
    quit()

filename = argvs[1]


gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'changeme@gmail.com'     # Set your Picasaweb e-mail address...
gd_client.password = 'secret password'  # ... and password
gd_client.source = 'upload-image-to-blogger-in-picasa'
gd_client.ProgrammaticLogin()
album_id="1234567890123456789" # the albm_id fo "Chemical-X" was given by get_albumid.py


album_url = '/data/feed/api/user/%s/albumid/%s' % ('default', album_id)
photo = gd_client.InsertPhotoSimple(album_url, filename, filename, filename, content_type='image/png')
print photo.content.src,

これで、画像がもともとpicasa上にあってもなくてもどちらの場合だったとしても、 処理後には、picasa上のurlを取得できたことになります。

それを使って、org2blogger.elでは、エクスポートしたhtml無いでの画像リンク先を変更するという作業を行います。 以下、org2blogger.el.

(setq get-url-script-name "pathto/org2blogger/get-direct-url-in-picasa.py")
(setq upload-image-script-name "pathto/elisp/org2blogger/upload-image-to-blogger-in-picasa.py")
(setq image-file-path "l:/0mine/org/images/")
(setq blog-name "Chemical-X")
(setq albumid "1234567890123456789") ; given by get_albumid.py for "Chemical-X")

(defun replace-links-with-upload-image-url ()
  (interactive)
  (while (re-search-forward "^<img src=\"images/\\(.*\.png\\)\"  alt=\"\\(.*\.png\\)\" />" nil t)
      (setq local-image-file-name (buffer-substring-no-properties (match-beginning 1) (match-end 1)))

      ;check the blog already has the image file or not.
      (setq uploaded-img-url 
            (chomp (get-uploaded-img-url get-url-script-name blog-name local-image-file-name)))
      (message "Match file name: %s" uploaded-img-url)
      (if (string-equal uploaded-img-url "")
                                        ;if the blog does not have the image, upload the image firstly, and receive the URL.
                                        ;if the blog has the image, just receive the URL.
          (progn
            ;upload image file-name
            ;get uploaded file name (direct URL) again.

            (setq uploaded-img-url
                  (shell-command-to-string (concat upload-image-script-name " " image-file-path local-image-file-name)))
            (message "uploaded-img-url:%s" uploaded-img-url)
;           (setq uploaded-img-url 
;                 (chomp (get-uploaded-img-url get-url-script-name blog-name local-image-file-name)))
            )
        )

      ;replace the line with htmlized-img-url string.
      ;Delete line
      ;The equivalent of ‘kill-line’ (‘C-k’) but without kill ring side effects:
      (delete-region (line-beginning-position) (line-end-position))

      (insert (htmlized-img-url uploaded-img-url))
      )
;  (message "matched string: %s" match-string)
)


(defun get-uploaded-img-url (script-name blog-name file-name)
      (shell-command-to-string (concat script-name " "
                                       blog-name " "
                                        file-name)))


(defun chomp (str)
      "Chomp leading and tailing whitespace from STR."
      (let ((s (if (symbolp str) (symbol-name str) str)))
        (replace-regexp-in-string "\\(^[[:space:]\n]*\\|[[:space:]\n]*$\\)" "" s)))

(defun htmlized-img-url (uploaded-img-url)
  (concat "<a "
          "onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" "
          "href=\"" uploaded-img-url "\">"
          "<img "
          "style=\"display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;\" "
          "src=\"" uploaded-img-url "\" "
          "border=\"0\" "
          "alt=\"\" "
          "/>"
          "</a>"
          )
  )

置換し終わったhtmlをorg-googlecl.elのorg-googlecl-blog関数を使ってblogger.comへ投稿します。 org-modeで書いたテキスト内で、

M-x org-googlecl-blog

してみてください。 世界が変わって見えましたか?

終わりに

これで画像を含むorg-mode の文章も、全自動でblogger.comへ投稿できるようになりました。 org-mode でblogger.comへ投稿するすてきなemacsライフを。

35分かかりましたね。まぁ、いいや。 このシリーズはこれでおしまいです。

2011-01-12

20 minutes blogging trial [2011-01-11 Tue]

昨夜遅くに申し訳程度の更新をしました。 org-modeで書いたエントリをblogger.comへ投稿するブログ投稿機能が一通り揃いました。

コードやスクリプト達が実際にしてくれるのは、以下の事柄です。 処理を、リストと図に並べて記します。 (図は昨日投稿したものです)

http://lh5.ggpht.com/_PPVUM1Hnh_Y/TStMJpi3cvI/AAAAAAAAAfw/OKKVnvcQbu8/how-to-post-entry-with-image_f0411f583f2403395c8ef2c80ca144f43c860dbe.png

Blog posting procedure from org-mode with some scripts.

  1. org形式をhtml形式へ変換して出力する
  2. orgファイル内で、ditaa, dot, src内で記述した画像ファイル(png)を生成する
  3. 指定されたたローカルのアドレスを、picasa上のアドレスに置換する
    1. imgタグで指定した(ローカルにある)ファイル名がpicasaのアルバム内にあるかを確認する
      1. アルバム内に該当するファイルが見つからなければ、アップロードする
    2. 3.1. で確認されたpicasa内のURLを取得する
  4. blogger.comに3.の内容を投稿する

これを説明しようとエントリを書いてみたのですが、この時点で既に25分経っています。

アルバム内で目的のファイルがあるかの確認には、pythonスクリプトを使いました。 スクリプト作成には ミドルスペックを低負荷で: ☆BloGTK補完計画 を、ほとんどそのまま流用させてもらいました。

picasa apiにdirect linkを得る関数がありました。 あと、アルバムを指定するときに、album idを取得する事も参考にしました。

30分越えてしまいました。 時間があっという間に過ぎました。

2011-01-11

Test post with uploaded image automatically

先日来の課題だった org-modeからblogger.comへの投稿が、 どうやらとりあえず動くモノになったようです。

仕組みとしてはこんな感じです。

これが動いていればokです。

2011-01-10

20 minutes blogging trial [2011-01-09 Sun]

blogger.com 経由でアップロードした画像ファイルの direct link が取得できました。 googleclはwindows版でのコンパイル済みのモノを使っていたので、開発待ちという状況でした。 python の gdata を取ってきて、ドキュメントを見ていくと、 (画素数を指定されていない)オリジナル画像のURLは photo.content.srcで出力されることが分かりました。 こんな感じです。

picasa-direct-url.pyの内容。

#!/usr/bin/python2.5

import gdata.photos.service
import gdata.media
import gdata.geo

gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'change.me@gmail.com'     # Set your Picasaweb e-mail address...
gd_client.password = 'change.your.password'  # ... and password
gd_client.source = 'api-sample-google-com'
gd_client.ProgrammaticLogin()

albums = gd_client.GetUserFeed()
for album in albums.entry:
  print 'Album: %s (%s)' % (album.title.text, album.numphotos.text)

  photos = gd_client.GetFeed('/data/feed/api/user/default/albumid/%s?kind=photo' % (album.gphoto_id.text))
  for photo in photos.entry:
      print 'Photo:', photo.title.text, '\n', photo.content.src

これを起動すると、

path/to/gdata-2.0.13/samples>picasa-direct-url.py
Album: Chemical-X (16)
(snip)
Photo: conventional-way-converting-html2blogger.png
http://lh6.ggpht.com/_PPVUM1Hnh_Y/TSb5A6CE8AI/AAAAAAAAAaY/OS4N7ZdiBn8/convention
al-way-converting-html2blogger.png
(snip)

長いURLが出力されています。

これで、org-modeでのテキスト作成->emacsからblogger.comへの自動投稿 への道が更に開けそうです。 画像も対応してblogger.comに自動投稿してくれたらそれはとても便利になります。

ただ、org-googlecl.elのみを利用するかというと、それはちょっと分かりません。 現状のorg-googlecl.elで文字列を送る機能を実装して、 画像を挿入したいときには、そのdirect-link のURLを api で取得、それをelispでhtmlのAタグまで整形。 この方法が、一番感性が早そうです。

googleclに画像を含めたポスト機能を求めるのは結構時間が必要になりそうです。 org-mode内でorg-babelを使って生成した画像を含めて、googlclが全部をポストするには、今の情報では足りなさそうだからです。 直リンクするためのアドレスを取得しなければいけません。 その機能をgoogleclが作られるのを待つしかないわけです。 googlecl wikiで探しても、希望は一件のみで、それに対応するチケットが切られていない用です。

Comment by gialloporpora, Jul 23, 2010

Is it possible to have an option to print the url-direct after posting an image on Picasa? I would like to see the direct link to the image that I have posted, better if I could select output format (html, BBCode) to embeed it. Another thing, is it possible to accept also URL (remote images) as input, not only local images?

Sandro

残念なことに何も反応がありません。

ですので、google apiが用意されていて、gdataで操作できるなら、自分で直接やった方が早そうです。 何が知りたいかはもう分かっているわけですから。 phthonはほとんどいじったことがありませんが、まぁ、何とかなるでしょう。。

最初に想像したこと、

XMLのやりとり全てをelispで書いて実現する

という悪夢の様な状況1と比べれば、よっぽど楽になりそうです。

python勉強時間確保の優先順位が上がりました。 楽しいことを勉強できるのは最高に幸せな時間です。

今日はemacsとblogger.comとの周りの状況を説明するのに、35分もかかってしまいました。 20minじゃないですよね。 全然時間が足りませんでした。

Footnotes:

1 atom-blogger.elというライブラリがあります。2006年に公開されております。詳しくは@ Blogger 投稿用の Emacs パッケージをご覧下さい。

2011-01-09

20 minutes blogging trial [2011-01-08 Sat]

久しぶりに「20分でどれだけのブログ記事が書けるのか?」というタイムトライアルをやっています。 こんなことをはじめたのも、昨日あたりから、

org-mode からのblog投稿がホットなんだ

と頭の中をグルグル回っているからです。

まぁ、今日のスタートはそんなところからです。

CUIの環境が恵まれているわけではないWin環境ですが、 以下の道具を使って、日常の最低限必要なことはできているようです。

  • Emacs(Meadow)
    • org-mode
    • ESS-mode
    • YaTeX-mode
  • pLaTeX
  • R
    • Sweave
  • Excel
  • Firefox
  • Google Chrome
  • FoxItReader

便利極まった訳ではありませんが、致命的な不自由をめったに感じることもなく過ごしています1。 ありがたい限りです。 なんとか普段の作業はそれで済んでいます。

今日は時間を持てて、 個人的に知りたかった blogger API の資料に目を通すことができました。 知りたい機能のapiが見つからなかったことは残念でした。 blogger.comにアップロードした画像の直接リンクを返すapiを探そうとしたのは、探し方として下手だったのかも知れません。 それなら picasa api を調べることで見つかるかも知れない、ですね。 探してみます。

Footnotes:

1 相手が使っているソフトを変えてやることができたらどれだけ楽だろう?とかは考えないことにして。

2011-01-08

How to post the body written in Japanese to blogger.com by org-googlcl.el

org-googleclでblogger.comに日本語本文を投稿する方法

org-googlecl.elは便利です。 org-modeで書いた文章を自動でhtmlに変換して、その上blogger.comに投稿までしてくれます。

でも、意図通りに動かすには、少々カスタマイズが必要でした。 例えば、

日本語のタイトルに日本語の本文を、emacs上から投稿したい。

と思ったのですが、現段階でのorg-googlecl.clのコードではできず、 ちょっと変更を施して、

  • 英語のタイトル
  • 日本語の本文

という形でemacs上からbloggerに投稿できるようにしました。 パッチをみれば分かりますが、一時ファイルを使って文字コードをsjisからutf-8に変換しています。

Patch

diff --git a/org-googlecl.el b/org-googlecl.el
index 08aed34..38e5c4c 100644
--- a/org-googlecl.el
+++ b/org-googlecl.el
@@ -119,21 +119,25 @@ t"
                  (setq blogurl (nth 0 (org-split-string blogurl)))
                  (if (setq reposted (or googlecl-blog-auto-del (y-or-n-p "Delete existing blog entry?")))
                      (googlecl-delete-blog googlecl-blogname  btitle)))))))
-    (let* ((tmpfile (make-temp-file "googlecl"))
+    (let* ((tmpfile1 (make-temp-file "googlecl"))
+          (tmpfile2 (make-temp-file "googlecl-u-"))
           (bhtml (if borg (org-export-as-html 5 nil nil 'string t) bbody))
+          (nkf-command (concat 
+                        "nkf -Swd " tmpfile1 " \> " tmpfile2))
           (blog-command (concat 
                          "google blogger post --blog \"" googlecl-blogname "\""
                          (if (length btitle) (concat " --title \"" btitle "\"")) " --user \"" googlecl-username "\" " 
                          (if (length blabels) (concat " --tags \"" (concat blabels (if (and reposted (not(zerop(length googlecl-repost-tag)))) (concat "," googlecl-repost-tag) "")) "\" "))  
-                         tmpfile)))
+                         tmpfile2)))
     
       (message "blog command is %s" blog-command)
 
-      (with-temp-file  tmpfile
+      (with-temp-file  tmpfile1
        (insert bhtml)
        (goto-char (buffer-end 1))
        (insert googlecl-footer))
-      
+
+      (call-process-shell-command nkf-command nil nil t)  ; waiting for generated tmpfile2 and go next line. (synchronous process)
       (start-process-shell-command "googlecl-pid" nil blog-command))))

これで、python のスクリプト googlecl でも日本語本文を意図通りに通して、blogger.comに投稿できます。

2011-01-07

Test post to blogger.com from emacs in org-mode with googlecl.el

org-modeから blogger.com への投稿方法についてです。

先日統合執筆環境 org-mode (Emacs Advent Calendar 22日目) にて、emacsのorg-modeから直接blogger.comへ投稿するライブラリがあることを知りました1。 使い慣れているorg-modeから直接投稿できるなら、嬉しい機能です。

というのも、今までは記事を書くのに、下のどちらかの方法を使っていました。

  1. rd-modeで書いて rd2 YYYYMMDD.rd > YYYYMMDD.html の内容をblogger.comに貼り付ける
  2. org-mode で書いて org-export-as-html で変更して出力内容をblogger.comに貼り付ける

箇条書きにしてはややこしいですね。 図にして、簡素化できないか試してみます。

どちらもマークダウンで記述できて、楽にhtmlを生成できます。 しかし、最終的には、blogger.comへログインしてhtmlを貼り付けなければ行けませんでした。 最後まで、自分が手動で操作しなくてはいけませんでした。

手作業の量を減らす方法を探していました。 googlecl.elがそれを実現してくれるのです。

blogger.comへの投稿作業を楽にする仕組みは簡単です。 自分で作業する代わりに、org-googlecl.elからgoogleclコマンドを呼び出して、blogger.comに投稿してもらいます。 つまり、執筆から投稿までの作業分担は以下の通りになります。

  1. org-modeで投稿内容を書く(自分で)
  2. org-google.elの関数を呼び出す(自分で)
  3. org-google.elが、以下の作業を自動実行する
    1. org-modeで書いた内容をhtmlへエクスポートする
    2. bloggerにアクセスして、エクスポートしたhtmlを使って投稿する

org-modeで本文を書いたら、org-googlecl.elの関数を呼び出せば投稿は完了するわけです。 わざわざblogger.comへログインする必要がなくなりました。 自分のやることは、

  1. org-modeで投稿内容を書く
  2. org-google.elの関数を呼び出す

になりましたから。 これは非常に便利です 。

ただ、 org-googlecl.elは発展途上のツールの様で、 現段階では、

  • 文字のみで構成されたhtml本文を自動投稿

できるだけのようです。

以下は、今後の進展を期待します。

  • 画像を自動的に挿入する
    • 生成される画像のアドレスをどう取得すればよいだろうか?
  • タイトルに日本語を使えるようにする
    • command.comからは日本語文字列で指定できた。meadowのset-buffer-process-coding-systemの設定値が問題か?
  • blogのエントリ一覧をリストする
    • 上と同じ症状。原因も同じか?

もしも、現在win(もしくは*nix)でorg-modeを使っていて、blogger.comへの投稿を楽にしたいと考えていらっしゃったら、是非お試し下さい。 windowsでも文字コードの問題をクリアして本文は投稿できますから。 また、コマンドラインからならば、タイトルも日本語で投稿できますから。 当方の環境は以下の通りです。

  • 日本語版Windows XP SP3
  • Meadow: emacs 22.3.1
  • org-mode ver 7.4 release_7.4.127.g997a.dirty
  • org-googlecl Sep 28 2010 commit 7de5c602b7c1108afe8391258b1d10c58781e269
  • python 2.6.6
  • googlecl 0.9.10

参考リンク

Footnotes:

1 org-modeからblogに投稿できるライブラリは、org2blogとorg-googleclとの2つがあるようです。blogger.comに投稿できるものはorg-googleclに限定されてしまうようです。もう一方の投稿ライブラリorg2blogは、sacha cha女史も使っていて便利そうですが。

Related Posts: