ブログ移転のお知らせ

報告が遅くなりましたが2013年1月1日よりブログを移転してます。

新しいブログはこちら。
http://www.robario.com/


それに伴ってフィードも変わってますので、再登録をお願いします。いつ再登録するの?今でしょ。
http://www.robario.com/feed.atom
諸事情により全文化されてませんが、そのうち全文化する*気持ちは*あります。



このはてなダイアリーは残しておきます。
新しい記事は書きません。
既存記事の修正も行ないません。
既存記事に移転先ブログからトラックバックすることはあるかと思います。

2006年05月30日より約7年間お世話になりました>はてな

[その他]はてなダイアリーやめたい

こういうHTMLが混ざった記事が非常に書き難い。はてな記法が嫌。他に引っ越そうにも各サービスが一長一短で決めるの面倒。
あとJavaScriptが使いたいとかURLが気に食わないとか過去記事をアップデートし易い機能が欲しいとか色々あって、自分好みのシンプルなブログシステムを自分で作ろうかと模索中。

[JavaScript]jQuery(html, props)でinput要素を生成する場合の正しい書き方

jQueryではDOM生成にjQuery(html, props)という構文が使えます。↓のように簡潔に書けます。

-$('<div class="bar">foo</div>');+$('<div/>', {'class': 'bar', 'text': foo'});


ただしinput要素に限っては問題があるので注意しないといけません。
これは昔ハマったことがある(ブログ記事も書いた)のですが、input要素のtype属性は上書きできません。type="password"がtype="text"に変更されないようにしているのだと思います。

そのため、http://api.jquery.com/jQuery/#creating-new-elements title:Creating New ElementsのUnsupported IEの項目では

-$('<input />', {type: 'text', name: 'test'}).appendTo("body");
+$('<input type="text" />').attr({name: 'test'}).appendTo("body");

と指導されています。私はこの部分を若干適当に読み流していて、

'<input type="text" />'

とさえ書けば良いのだと思っていました。そこで、冒頭で紹介したjQuery(html, props)を使って

$('<input type="text"/>',{name: 'test'}).appendTo("body");

と書いてしまいました。
すると
> "オブジェクトは 'createDocumentFragment' プロパティまたはメソッドをサポートしていません。"
とのお言葉を頂き、またもやinput周りでハマることになったのです。

jQueryでの新規input要素を正しく書くには

jQuery('<input/>')

ではなく

jQuery('<input type="text"/>', props)

でもなく

jQuery('<input type="text"/>').attr(props)

と書かなければならないのです。

Module::Buildを使ってると勝手にshebangが書き換わる

Module::Build::fix_shebang_line がshebang

#!/usr/bin/perl.exe 

eval 'exec /usr/bin/perl.exe  -S $0 ${1+"$@"}'
    if 0; # not running under some shell

って置き換えてくれるんだけど、もともと

#! /usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  if 0;

って書いてるから、

#!/usr/bin/perl.exe 

eval 'exec /usr/bin/perl.exe  -S $0 ${1+"$@"}'
    if 0; # not running under some shell
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  if 0;

ってなことになっちゃうんだよね。実害は無いけどあんまりゴニョゴニョせずにどうにかならんもんかね?

直ったかも?!→Re: Googleカレンダーの「毎日の予定リスト」通知メールが止まらない

以前↓な記事を書いたんだけど、その後「from:calendar-notification@google.com "Remember The Milk"」を削除するようGmailのフィルタを設定して放置してました。(RTMはもう辞めたのです)
Googleカレンダーの「毎日の予定リスト」通知メールが止まらない - ヒルズで働く@robarioの技ログ

それから更に何年も経つのに未だに送られてきていて、今回ちょっと本気出して対応してみたら何とかなったかもしれない件です。
似たような報告↓

カレンダーIDを探して

とりあえず、既にカレンダーIDが分からんので、何とか調べようと思ってメールをチェック。

Subject: 毎日の予定リスト - ******** さん 04:40 時点 
From: Google カレンダー calendar-notification@google.com

********さんの予定:
終日	2012/02/27 (月)	Tasks for 2/27	Remember The Milk

「Remember The Milk」カレンダーの毎日の予定リストの送信が設定されているため、本メールを ******** にお送りしています。

毎日の予定リストを受け取るカレンダーを変更するには、https://www.google.com/calendar/ にログインし、該当するカレンダーの通知設定を変更してください。

ここで「該当するカレンダーの通知設定を変更してください」とか言われるけど、既に登録解除済みだからできないんだってば。
「Tasks for 2/27」のリンク先が「https://www.google.com/calendar/event?action=VIEW&eid=長い長い英数文字列」になっている。eidはおそらくイベントIDのことで(昨年GoogleCalendarAPIいじってたので、見た目でもイベントIDって分かった)、イベントIDが分かるってことはガンバればカレンダーIDも分かるということ。
リンク先を開いたらイベント情報が出る。

Tasks for 2/27
2月 27日 (月), 00:00 〜 2月 28日 (火), 00:00
カレンダー	Remember The Milk

肝心のカレンダーにリンクが張られてなくて分からなかったけど、ソースを見て"Remember The Milk"で検索すると近くにカレンダーIDが書かれてた。

カレンダーを再登録

あとはカレンダーを追加し直して通知をオフにすればいい。そのためにはカレンダーIDを指定して登録できないといけないんだけど簡単な方法が思い付かない。プログラム書かないかんかな〜と考えながら他のカレンダーをいじっていたら
「マイカレンダー の詳細」の「カレンダーの情報」タブに「カレンダーのアドレス:HTML」というのを発見。リンク先は 「https://www.google.com/calendar/embed?src=カレンダーID&ctz=Asia/Tokyo

あーそんな機能あったな〜ということで調べておいたカレンダーIDに置き換えてアクセスすると、埋め込みカレンダーが表示できた!そう!埋め込みカレンダーは右下にカレンダーを追加するボタンがあるのだった!

通知設定が無い!?

あとは通知設定でオフにするだけ〜と気楽に構えていたら、肝心の「通知」タブが無い…orz...
あくまでも自分の状況からの予想なんだけど、昔は設定できた気がするから(だから毎日の予定リストが届くんだろう)カレンダーIDが"********@import.calendar.google.com"だと通知設定ができないように変わってしまったのだと思う(もしかしたら被害者達はカレンダーIDが"********@import.calendar.google.com"なのかも)

他のカレンダーにはあるので、通知タブを開くJavaScriptをカレンダーIDだけ変えて実行してみたり色々やったけどダメだった。
これはいよいよ設定変更画面を模倣するプログラムを書かないといけないか?GoogleCalendarAPIにそんなのあったっけ?など考えてたらめんどくさくなって、一時退散することにした。

念の為、通知設定可能なカレンダーの「毎日の予定リスト」を意味無いだろうな〜と思いながら「1.オンにして保存 2.オフにして保存」だけしといた。

翌朝

何故か毎日の予定リストメールが届いていませんでした。(∩´∀`)∩ワーイ
まだ油断はできないので、明日もドキドキです。
本日も届いていませんでした!(∩´∀`)∩ワーイ

ミニバッファの邪魔な履歴を削除する

ありそうなのに見つからなかったので書いてみました。
ミニバッファで何らかの消したい履歴が出ている時にShift-Deleteで消せます。
find-fileの履歴だけでなくdescribe-*の履歴とか、その他ミニバッファの履歴全てに使えるはずです。多分。

(define-key minibuffer-local-map (kbd "S-<delete>")
  #'(lambda ()
      (interactive)
      (set minibuffer-history-variable (delete (buffer-substring-no-properties (minibuffer-prompt-end) (point-max)) (symbol-value minibuffer-history-variable)))
      (goto-history-element minibuffer-history-position)
))

ついでにsession.elを使っていて、重複が鬱陶しいのでsession保存前に重複削除しています。

(defadvice session-save-session (before session-save-session-delete-dups activate)
  (set-buffer (find-file-noselect session-save-file))
  (goto-char (point-min))
  (while (re-search-forward "^(setq-default \\([^ ]+\\)" nil t)
    (delete-dups (symbol-value (intern-soft (match-string 1)))))
  (kill-buffer))