お茶を飲もう!


IMG_2073.png

※タイトル及び写真は本文と全く関係ありません。

お久しぶりです。なんやかやあって更新できませんでした。

更新できなかったのは怠けてたとか用事があったからなのですが、ブログのリニューアルを図ったからでもあります。

どうせだから スマートフォンオプション を導入してカコイイサイトにしようとしたら泥沼にはまってしまい、今の今まで時間がたってしまいました。経過についてはそのうちまとめます。

では、ぼちぼち更新していきます。

【Perl】Dyn.com の IP アドレス更新をスクリプトで行う

ホストに割り当てられたグローバル IP アドレスの変更を検知し、Dyn.com に変更を適用するスクリプトを書いた。

公式に似た機能のスクリプト ddclient がすでにあるのだがそれを車輪の再発明。MooseX::Daemonize を使ってデーモンにしてみた。

delphinus35/dynupdate – GitHub
https://github.com/delphinus35/dynupdate

使用例

# 単純な例
$ dynupdate -u testuser -p testpass -n test.remora.cx restart
# 更新間隔と IP アドレス取得 URL を指定
$ dynupdate -u testuser -p testpass -n test.remora.cx -i 3600 -e http://detect.example.com/ restart

MooseX::Daemonize を使ったデーモンの作り方はいつかまとめよう。

Last.fm for jQuery を改造してみました

Last.FM から再生履歴を取得して表示するツールです。このページの左のツールバーで動いています。本家にインスパイアして作成したのですが、次の点で拡張しています。

  1. 一定時間たつと自動で表示内容を更新する。
  2. アルバムアートが見つからない場合、アーティストの画像で代替する。
  3. 各曲の情報を順番にフェイド・インして表示する。
  4. strftime.js を使って Last.FM プロフィールページのように再生時刻を表示する。

サンプルページを開く

そしてついでに github デビュー。

delphinus35/lastfm – GitHub
https://github.com/delphinus35/lastfm

設置方法などは README.md と付属の sample.html に書いているのでそちらを見てください。

Last.FM の API Key の取り方など、細かいことは前回の記事参照。でもまあ、特別なことしない限り付属の API Key をそのまま使って問題ないっぽいです。

ホントは何ヶ月も前にできてたんだけど、ドキュメント書いたりするのが面倒でほったらかしてました。何とか今年中に公開できて良かった。

では、良いお年を!

Prototype.js で継承&オーバーライド

今更ながら、Prototype.js でクラスの継承とオーバーライドをやってみた記録。

しばらく使ってなかったら、$super() という便利なものができていた。

コード例

// 基底クラス
var Parent = Class.create({
    // コンストラクタ
    initialize: function() {
        // <p> 要素を生成して <body> に挿入
        this.ele = new Element('p');
        $$('body')[0].insert(this.ele);
    }
    // “word”を画面に表示
    ,say: function(word) {
        this.ele.update(word);
    }
});

// Parent を継承したクラス
var Child = Class.create(Parent, {
    // コンストラクタ
    initialize: function($super) {
        // Parent のコンストラクタを実行
        $super();
    }
    // Parent の say() をオーバーライドする
    ,say: function($super, word, word2) {
        $super(word);
        // “word, word2”という文字列を画面に表示
        this.ele.update(this.ele.innerHTML + ', ' + word2);
    }
});

var c = new Child;

c.say('One', 'Two');
// -> 画面上に 'One, Two' と表示される。

メソッドを定義するとき第一引数に $super を与えると、親クラスの同名のメソッドへの参照が与えられる。これを使ってメソッドのオーバーライドが簡単にできるのだ。

第二引数以降は親クラスから順に与えられる。これを使って引数の数すら変えることができる。上の例で言えば、Parent クラスの say() メソッドは引数を一つ採るが、Child クラスの say() メソッドは二つ採る。

jQuery.getJSON() の罠

とある Web アプリケーションを作っていたときのこと、Firefox ではまともに動くのに、IE ではバージョンを問わず機能しないことがあった。調べてみると、(珍しいことに)IE の方が仕様に則った正しい動作をしていたためであった。

最初に結論を言うと、毎回違う結果が欲しいのなら、$.getJSON() よりも $.post() を使えって話。

GET メソッドによるサーバーアクセスはブラウザにキャッシュされる。同じパラメータでのアクセスを繰り返そうとしても、ブラウザによっては、ローカルキャッシュを返すことでサーバーへのアクセスを行わない。これは GET メソッドの冪等性を考えれば自明のことだ。

冪等 – Wikipedia

冪等性は、大雑把に言って、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。

(中略)

HTTP の GET 要求は冪等とみなされる。Webの機構は基本的にその前提で要求結果をキャッシュに保持する。HTTP の POST 要求(フォーム送信に使われる)は冪等とはみなされないため、POST 要求はキャッシュされない。

Continue reading

自家用 Dropbox? な vbox を使ってみる

自前のDropboxを実現する1ファイルのシェルスクリプト「vbox」 – MOONGIFT|オープンソース・ソフトウェア紹介を軸としたITエンジニア、Webデザイナー向けブログ
http://www.moongift.jp/2011/08/20110802-2/

早速使ってみたよ。以下の構成で試してみた。

機種(OS) ホスト名
サーバー Mac mini remora.cx
クライアント 1 Macbook Air remora-air2
クライアント 2 ホスト 1 上の Windows XP remora-air-win

Continue reading

Pentadactyl ではてなブックマーク拡張を使う

小ネタ。はてなブックマーク拡張が Firefox 4.0 に対応した。これは拡張は以前から隠し機能(?)として Vimperator に対応している。

「はてなブックマークFirefox拡張」をFirefox 4.0に対応しました – はてなブックマーク日記 – 機能変更、お知らせなど
http://hatena.g.hatena.ne.jp/hatenabookmark/20110325/1301020900

Vimperator ではてなブックマーク拡張を使う – GitHub
https://github.com/hatena/hatena-bookmark-xul/wiki/Vimperator-%E3%81%A7%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E6%8B%A1%E5%BC%B5%E3%82%92%E4%BD%BF%E3%81%86

で、試しに Pentadactyl でやってみると簡単に有効になった。

javascript <<JS
if ( typeof hBookmark != 'undefined' )
    dactyl.loadScript(
        'chrome:hatenabookmark/content/vimperator/plugin/hatenabookmark.js'
        ,{__proto__: this} );
JS

liberator”を“dactyl”に置換しただけである。

ただ、c / C マッピングは問題ないものの、:hb / :hbt 時に補完リストが現れなかったりする。なんでなんだろ?