Hatena::ブログ(Diary)

児童小銃 RSSフィード

みえない自由が欲しくて
みえない銃を撃ちまくる
THE BLUE HEARTS 「TRAIN-TRAIN」

なんばりょうすけの仮住まいです

連絡先: rna◎cyber●email●ne●jp


プライバシーポリシー


2004-09-09

[][] はてダラで -t オプションが効かない理由

まず、hw.pl は一件の日記につき、常に 2 回 POST を行います。2 回の POST はそれぞれ create_it, post_it というサブルーチンで微妙に異なる方法で POST しています。

  • create_it: 新規作成。パラメータ date, title, body を空にして POST する。
  • post_it: 普通に更新。

日記がまだない場合、post_it では日記が作成されません。そこでまず最初に create_it します。

本来、作成後の更新については post_it だけで更新できるようです。しかし、日記が削除されているかもしれず、その場合新規作成が必要なため、更新時にも create_it しています。あらかじめ日記が存在するかどうかを確認すれば無条件に create_it しなくてよいのですが、日記の存在/不在を判定する簡単な方法がありません。HTML を解析すれば可能なのですが。。。

create_it は date, title, body が空なので一度クリアされるだけで事実上無害、トラバも飛ばないはず、念のため -t オプション付きの場合は trivial パラメータも付けて POST してるし、ということで常に create_it しているようです。

。。。という解釈で合ってますでしょうか? > id:hyuki さん

しかし、実はこの前提は間違いでした。二度目の create_it では、

  • 日記の内容はそのまま残る
  • トラックバック等の処理は行われる
  • trivial パラメータは効かない

つまり「現状の内容で更新処理を再実行」という動作を行っているようなのです。どうやらこれが更新時に -t オプションが効かない原因のようです。

[][] はてダラ -t オプションを正しく動作させる

というわけで、対策を色々考えました。理想は日記の存在/不在を識別して必要な時だけ create_it する事です。しかしその識別には POST のレスポンスで指定されたリダイレクト先をダウンロードして、その HTML を解析しなくてはなりません。

そこで -t オプション付きの時は create_it する前に空の内容で post_it する、というのを試してみました。日記が存在すれば空の post_it で title, body がクリアされます。その状態なら続く create_it で更新がかかってもトラックバックは飛びません(アンテナは上がっちゃうかも?→上がらないぽい)。日記が存在しない場合は空の post_it は何の効果もないので(サーバへの負荷を除けば)無害です。

とりあえず以下のパッチでうまく動作しました。-t なしだとエラーになる…なおりました。

--- /home/nanba/Environment/bin/hw.pl   Wed Sep  8 03:02:31 2004
+++ ./hw.pl     Thu Sep  9 14:40:55 2004
@@ -302,10 +302,30 @@
 # Update entry.
 sub update_diary_entry($$$$$$) {
     my ($year, $month, $day, $title, $body, $imgfile) = @_;
+    my $clear_retry = 0;
     my $create_retry = 0;
     my $post_retry = 0;
     my $ok = 0;
  
+CLEAR_RETRY:
+    while ($cmd_opt{t} && $clear_retry < 2) {
+        # clear existing entry. if the entry does not exist, it has no effect.
+        $ok = post_it($year, $month, $day, "", "", "");
+        if ($ok or not $cmd_opt{c}) {
+            last;
+        }
+        print_debug("update_diary_entry: CLEAR_RETRY.");
+        unlink($cookie_file);
+        print_message("Old cookie. Retry login.");
+        login();
+        $clear_retry++;
+    }
+
+    if ($cmd_opt{t} && not $ok) {
+        error_exit("update_diary_entry: create: Check username/password.");
+    }
+
+
 CREATE_RETRY:
     while ($create_retry < 2) {
         # Make empty entry before posting.

しかし一回の更新で三回 POST するのはあんまりですね。日記の不在確認だけでも簡単にできればこんなことしなくていいし、むしろ現状よりも POST を減らせます。せめて存在しない日記にアクセスすると 404 Not Found を返すようにしてもらえないでしょうか。あるいはユーザの日記のトップにリダイレクト(303 See Other が適切?)するとか。[はてなダイアリーへの要望] ということでひとつ。。。> id:hatenadiary

(追記) id:hatenadiary:20040909#1094705150 で、日記の新規作成で「ちょっとした更新」(trivial パラメータ)が可能になったとの告知が… ひょっとして二回目の create_it でトラバ飛ばなくなった? ちょっと実験 id:rna:20040103←これには飛ばなかった。でも id:hatenadiary には飛んでる(上にリンクがあるけどこれを書くまで飛ばさないようにしてた)。アンテナも上がってます。謎。。。

もう一度(古い方の hw.pl で) -t 付き更新したら id:rna:20040103 にもトラバ飛びました。やっぱパッチあてないとだめっぽい。

[] Re: はてなダイアリーライターで-tが効かない不具合

入れ違いでメール送ってしまってすみません;

id:hyuki:20040909#1094717022:

この流れだと「最後のpost_it」でやっぱりトラックバックが送られてしまいませんか。つまりやはり誤爆が起きる?あ、エントリを空にすると、トラックバックも消えるのでしたっけ?

最後の post_it では trivial パラメータが効いてくれる、はず。。。

この更新で結城さんとこにトラバが飛ばなかったら OK ということで。。。

大丈夫かなぁ (((( ;´−`)))プルプルプル。お、大丈夫みたいだ。

[] カエラ blog で 100 get

いつのまにかできてた木村カエラさんの blog、トラバが 99 件あったのであわててトラックバックしたら見事 100 get しますた(g:saku2er:id:rna:20040909#p1)。

[] hw.pl 1.0.2 RC1

http://d.hatena.ne.jp/hyuki/20040909#1094717022

試してみました。この更新でトラバ飛んだら僕も4階から飛びます(嘘(←弱気))。

うおっ?。。。大丈夫だったみたいです。あーびっくりした。

素早い対応ありがとうございます。> id:hyuki さん