less

きづかないくらいイージーなクオリティー

Archive

1月
21st
permalink

jquery.dataset.jsをjQuery Plugin Registryに登録してみた

昔作ったjquery.dataset.jsを登録しました。

jQuery Plugin RegistryはGitHubと連携していて、WebHookを登録した後マニフェスト書いてpushしてタグ付ければOKです。かんたん。

上手く登録出来ないなと思った時はIRCに行くと「ここおかしいから直して再pushして」とか教えてくれます(僕はキーワードにスペースを入れてしまっていて上手く行かなかった)。

1月
15th
permalink

選択範囲をプレーンなテキストでEvernoteに保存

Evernote拡張からプレーンテキストで保存したい場合、オプションの「デザインを維持」をオフにするといいことになっています。が、僕的にいくつか問題があって、

  • 「Evernote に選択範囲を保存」すると改行前に半角スペースが入る。前後に無駄な行が出来ることもある
  • デザインを維持したい時もあって、その場合毎回オプションを開かなくてはならない

解決用にAutomatorで確実にプレーンテキストで保存するサービスを作りました。テキストを選択して右クリックしてサービスメニューから選択。テキストなら何でも保存出来ますが、このスクリプトではSafariの今見ているページからタイトルとURLを取ってくるので、実質Safari向けです。

12月
17th
permalink

jQuery 1.8でDeferred.thenの挙動が変わった

JavaScriptを書いていて楽しいのがDeferredの処理。その仕組みはjQueryでも実装されていますが、このDeferred、1.8からDeferred.thenの挙動がDeferred.pipeと全く同じになりました。それまでのthenは単純にdeferred.done().fail().progress()のエイリアスでした。

このせいで非同期処理が動かず、いつもならさくっと上げられるバージョンがまだ1.7系のままです! 具体的に困るのはthenの後にdonefailを続けている場合にコールバック引数が渡らなくなること。

var d = $.Deferred();
setTimeout(function() {
    d.resolve('resolved!');
}, 0);

d
    .then(function(str) {
        console.log(str); // "resolved!"
    })
    .done(function(str) {
        console.log(str); // 1.7.xまでは"resolved!"、1.8からはundefined
    });

解決するには以前書いたDeferred.pipeの記事のように新しい値を返してDeferredを繋ぎ変えます。この例では

var d = $.Deferred();
setTimeout(function() {
    d.resolve('resolved!');
}, 0);

d
    .then(function(str) {
        console.log(str);
        return str; // 1.8対応
    })
    .done(function(str) {
        console.log(str); // "resolved!"
    });

なんか微妙ですね。jQuery Deferredは分かりやすい実装が好きでしたが、だんだんルールが複雑になってきている気がします。ていうかdonefailだけで処理している限りは今まで通りなので

var d = $.Deferred();
setTimeout(function() {
    d.resolve('resolved!');
}, 0);

d
    .done(function(str) {
        console.log(str);
    })
    .done(function(str) {
        console.log(str); // "resolved!"
    });

でいいのではないか。

一方全く同じになったpipeは、コード上ではthenのエイリアスのように扱われています。そのうちなくなる気がします。1.8.3だと1153行目

// Keep pipe for back-compat
promise.pipe = promise.then;

情報出てないようだけど、みんなDeferredあんまり使ってないのかな…。

8月
28th
permalink

Mountain LionにImageMagickを入れる

Lionからアップデートして動かなくなったので一度アンインストールしてから

% brew install imagemagick

で普通に入れたらTIFFファイルが扱えなくなった(自炊の自動処理に使っているのでTIFF重要)。

TIFFのサポートにはX11が必要らしい。Mountain LionからX11が入らなくなったので、XQuartzを入れる。その後

% brew install libtiff
% brew install imagemagick --build-from-source

でソースからビルドすると上手く使えるようになった。

7月
30th
permalink

jQuery Deferredのpipeにおける返り値の扱い

pipeは返す値で繋ぐ処理のパラメーターが変わるのだけど、たまにしか使わないので毎回動作を忘れてソースを見ている。バージョン1.7.2での動き。

deferred.pipe(function(data) {
    ...
    return ?;
});

以降の処理で引数が不要なら何も返さなくていい。引数が1つの場合は

return foo;

のようにそのまま返せばいい。複数の引数を送る場合はDeferredオブジェクトを返さないといけない(引数が1つの場合は同じ処理を裏でやってくれている)。

return $.Deferred().resolve(foo, bar); // コンテキストどうでもいい
return $.Deferred().resolveWith(this, [foo, bar]); // どうでもよくない

何もせずにそのまま値を引き継ぐ場合は(引き継ぎたいパラメーターでresolve、rejectした)Deferredオブジェクトを渡す。

return deferred;

Deferredオブジェクトが参照出来なければ新しくDeferredを作って渡す。

return $.Deferred().resolveWith(this, arguments);

resolveWithrejectWithの第2引数にはarray-likeオブジェクトを渡せるのでargumentsが通る(最終的にFunction.applyに渡しているので通る。resolverejectも内部でargumentsを渡している)。

ちなみにpipeはAPIで200が返ってくるけどJSONにはerrorが入っているからfailに回したい、みたいな時に使うことが多いです。

$.getJSON('/foo')
    .pipe(function(data, status, xhr) {
        return data && !data.error ?
                xhr :
                $.Deferred().rejectWith(this, [data, status, data && data.error]);
    })
    .done(success)
    .fail(error);
7月
10th
permalink

Handlebarsで配列にアクセスする

こうです。

// {items: ['foo', 'bar']} だったとして
{{items.0.this}} // foo

デモ。普通に考えると{{items.0}}になりそうですが、数値で終えるとパースエラーになります(array likeなオブジェクトも同様)。さらに階層がある場合はこうです。

// {items: [{'foo': 'a', 'bar': 'b'}]} だったとして
{{items.0.foo}} // a

Handlebarsでは基本自身にアクセスしたい時にthisを使うと覚えておくと混乱がなさそう。公式にも出ている例だとこんな。

<ul>
    {{#each items}}
        <li>{{this}}</li>
    {{/each}}
</ul>

参考:

7月
9th
permalink

WebKitは背後のタブを閉じる時にunloadイベントを発火しない

知らんかった。。SafariとChromeで実際に試したらそうなりました。unloadがない = beforeunloadもありません。代わりにpagehideを使えと言われても性格が違う。。

unloadイベント前提のコードは書かないようにしましょう。

6月
19th
permalink

Pixelmator のオートセーブを無効にする

Pixelmatorでは2.0からLionのオートセーブに対応しました。これが使いにくい。

これまでは開いたファイルを確認した後、アプリを終了することで一気に閉じていました。オートセーブが実装されてからはアプリを終了する際もファイルを保存したり閉じたりする必要がなくなりました。次回起動時に前回終了時の状態が復元されるからです。…つまりファイルを閉じずに開いてばかりいると、手に負えない数のファイルが開いた状態でアプリが起動することになってしまうのです。。。

何かないかと変更履歴を見たら2.0.3でオートセーブを無効にするオプションが追加されていたお。

defaults write com.pixelmatorteam.pixelmator disableAutosave -bool yes

何も開かないので起動が速い。

4月
26th
permalink

BathyScapheで選択したテキストをEvernoteに送る

BathyScapheのスクリプトフォルダに入れます。デフォルトでは「Tmp」ノートブックに追加されるので好きなノートブックに書き換えてください。

  • スレッド名でノートを作成
    • ノートのURLにはスレッドのURLを指定
  • 同じスレッドの発言は1つのノートに追記
4月
25th
permalink

Evernoteの容量を節約する

AppleScriptのテストしまくってたらEvernoteの容量上限来た。Evernoteの容量は実際の所1ヶ月の転送量なので適当にやってると無駄遣いしてしまう。

  • 細かくデータを作り直しているとその分転送し直しで減る
    • データを作り直す可能性があるものは上げない
  • ローカル上でEvernoteにノートを追加出来たかどうかが確認出来ればいい場合はローカルノートブックに対して送れば消費しない
    • 同期を手動にすると同期する前に消せば容量が復活するが、架空であっても容量上限に達すると何も出来なくなる

Evernoteは容量オーバーすると何も出来なくなる(Mac版のクライアントのみ?)。転送が次回になるだけで、ローカルでは自由に編集出来るようになるとうれしい。

スクリプト経由のバックアップノウハウ少しずつ溜まってきた。