<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>きづかないくらいイージーなクオリティー

Tumblr Life Userscript
♥Tumblr
@yksk
煤 - Note
</description><title>less</title><generator>Tumblr (3.0; @carbonless)</generator><link>http://less.carbonfairy.org/</link><item><title>BathyScapheで選択したテキストをEvernoteに送る</title><description>&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/19242/archives/Send%20to%20Evernote.scpt.zip"&gt;Send to Evernote.scrt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://bathyscaphe.sourceforge.jp"&gt;BathyScaphe&lt;/a&gt;のスクリプトフォルダに入れます。デフォルトでは「Tmp」ノートブックに追加されるので好きなノートブックに書き換えてください。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;スレッド名でノートを作成

&lt;ul&gt;&lt;li&gt;ノートのURLにはスレッドのURLを指定&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;同じスレッドの発言は1つのノートに追記&lt;/li&gt;
&lt;/ul&gt;&lt;script src="https://gist.github.com/2495353.js"&gt;&lt;/script&gt;</description><link>http://less.carbonfairy.org/post/21827696389</link><guid>http://less.carbonfairy.org/post/21827696389</guid><pubDate>Thu, 26 Apr 2012 11:45:00 +0900</pubDate><category>evernote</category><category>2ch</category><category>applescript</category></item><item><title>Evernoteの容量を節約する</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m31i9jGGIB1qz52zt.png" alt=""/&gt;&lt;/p&gt;

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

&lt;ul&gt;&lt;li&gt;細かくデータを作り直しているとその分転送し直しで減る

&lt;ul&gt;&lt;li&gt;データを作り直す可能性があるものは上げない&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;ローカル上でEvernoteにノートを追加出来たかどうかが確認出来ればいい場合はローカルノートブックに対して送れば消費しない

&lt;ul&gt;&lt;li&gt;同期を手動にすると同期する前に消せば容量が復活するが、架空であっても容量上限に達すると何も出来なくなる&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Evernoteは容量オーバーすると何も出来なくなる（Mac版のクライアントのみ？）。転送が次回になるだけで、ローカルでは自由に編集出来るようになるとうれしい。&lt;/p&gt;

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

&lt;ul&gt;&lt;li&gt;&lt;a href="http://discussion.evernote.com/topic/12038-evernote%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88faq-%E5%AE%B9%E9%87%8F%E8%A8%88%E7%AE%97%E3%83%BB%E8%AA%B2%E9%87%91%E5%87%A6%E7%90%86/"&gt;EvernoteサポートFAQ - 容量計算・課金処理 - Evernote 日本語 - Evernote User Forum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://less.carbonfairy.org/post/21783670307</link><guid>http://less.carbonfairy.org/post/21783670307</guid><pubDate>Wed, 25 Apr 2012 23:51:04 +0900</pubDate><category>evernote</category></item><item><title>tview → Dropbox → Evernote</title><description>&lt;p&gt;特に理由はないんだけど思い付いたのでTumblrのリブログ、Like画像をEvernoteに送ることにした。凄まじい勢いて落ちてきて笑える。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;いつも使っているtviewはTumbletailと違ってEvernoteに送れない

&lt;ul&gt;&lt;li&gt;Tumbletailもノートブックの名前が固定なのがよくない&lt;/li&gt;
&lt;li&gt;Dropboxには送れる ← これを使う&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;ins&gt;最初iftttを調べたけど、Dropboxの公開フォルダーにファイルを置く必要があって逆に面倒。&lt;/ins&gt;&lt;/p&gt;

&lt;p&gt;手順。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;tviewでリブログ、Likeした時にDropboxにも保存するようにする&lt;/li&gt;
&lt;li&gt;リブログ、LikeするとDropboxにtviewフォルダーが作られる&lt;/li&gt;
&lt;li&gt;tviewフォルダーにフォルダアクションを設定して、ファイルが落ちてきたタイミングでEvernote.appに送るようにする。アクションはAutomatorで作る&lt;/li&gt;
&lt;li&gt;Evernote.appが同期されるとEvernoteに上がる&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;tviewは「ユーザー名_ポストID.拡張子」という規則でファイル名で作ってくれる。パースすればソースのURLも組み立てられる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://ユーザー名.tumblr.com/post/ポストID
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;デスクトップからのリブログもどうにしかしたくなる。。ワークフローは以下。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Finder 項目にフィルタを適用

&lt;ul&gt;&lt;li&gt;種類がイメージである&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;AppleScript を実行

&lt;ul&gt;&lt;li&gt;&lt;a href="https://gist.github.com/2352527"&gt;https://gist.github.com/2352527&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Finder 項目をゴミ箱に入れる&lt;/li&gt;
&lt;/ol&gt;&lt;script src="https://gist.github.com/2352527.js"&gt;&lt;/script&gt;&lt;p&gt;現在のtview設定。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m29tplxdOq1qz52zt.png" alt=""/&gt;&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/20848769076</link><guid>http://less.carbonfairy.org/post/20848769076</guid><pubDate>Wed, 11 Apr 2012 02:17:00 +0900</pubDate><category>tumblr</category><category>evernote</category><category>dropbox</category><category>app</category></item><item><title>jQuery 1.7.2のattr、propには罠がある</title><description>&lt;p&gt;jQuery 1.7.2には割と多くの人が引っかかると思われる問題があります。1.7.2では&lt;code&gt;$attr&lt;/code&gt;、&lt;code&gt;$.prop&lt;/code&gt;の第二引数に&lt;code&gt;undefined&lt;/code&gt;が入ると、値ではなくコンテキスト自体が返るように挙動が変わりました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;img src="foo.png"&amp;gt;

var img = $('img');
img.attr('src'); // =&amp;gt; "foo.png"
img.attr('src', undefined) // =&amp;gt; "foo.png" (1.7.1)
img.attr('src', undefined) // =&amp;gt; img (1.7.2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;普通はわざわざ&lt;code&gt;undefined&lt;/code&gt;なんて指定しない。&lt;code&gt;$.attr&lt;/code&gt;に値をそのまま渡してラッパー的に使っていると挙動が変わることが多いと思います。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function foo(value) {
    // value===undefinedな状況
    return $('img').attr('src', value);
}
foo();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://bugs.jquery.com/ticket/11527"&gt;バグとして登録されている&lt;/a&gt;ので近く直ると思いますが、とりあえず以下のようにすれば対処出来ます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function foo(value) {
    // nullは通したいので===で比較
    return value === undefined ? $('img').attr('src') : $('img').attr('src', value);
}
foo();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;arguments.length&lt;/code&gt;を見るようになったのが原因。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-        return jQuery.access( this, name, value, true, jQuery.attr );
+        return jQuery.access( this, jQuery.attr, name, value, arguments.length &amp;gt; 1 );
&lt;/code&gt;&lt;/pre&gt;</description><link>http://less.carbonfairy.org/post/20340904205</link><guid>http://less.carbonfairy.org/post/20340904205</guid><pubDate>Mon, 02 Apr 2012 17:11:00 +0900</pubDate><category>jquery</category><category>javascript</category></item><item><title>Tumblr Life 1.0 Pre 10</title><description>&lt;p&gt;Tumblr Dashboardを拡張するユーザースクリプト、Tumblr Lifeの1.0 Pre 10を公開しました。&lt;strong&gt;Tumblrのデザイン変更に伴って、過去のバージョンではリブログボタンが表示されない可能性があります。アップデートしてください。&lt;/strong&gt;また、Pre 9には表示されないバージョンと応急処置をしたバージョンが存在します。Pre 9をご利用の方もアップデートをお願いします。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/raw/master/tumblr_life.user.js"&gt;Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/blob/master/tumblr_life.user.js"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gumroad.com/l/PhJm"&gt;Gumroad - Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Pre 9からの変更点&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;リブログボタンが表示されなくなっていた問題修正&lt;/li&gt;
&lt;li&gt;新しいリブログボタンに合わせたデザインの調整&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;要望や問題を発見した際は&lt;a href="https://github.com/yoko/userscripts/issues?labels=Tumblr+Life&amp;amp;state=open&amp;amp;milestone=1.0"&gt;GitHubのIssues&lt;/a&gt;や&lt;a href="https://twitter.com/yksk"&gt;@yksk&lt;/a&gt;までお願いします。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18936782285</link><guid>http://less.carbonfairy.org/post/18936782285</guid><pubDate>Thu, 08 Mar 2012 14:22:16 +0900</pubDate><category>tumblr</category><category>tumblrlife</category><category>userscript</category><category>greasemonkey</category></item><item><title>Tumblr Life 1.0 Pre 9</title><description>&lt;p&gt;# 出してすぐまたTumblrのUIが変わりました。。&lt;del&gt;&lt;strong&gt;現在Tumblr Lifeを有効にしているとリブログボタンが消えます！&lt;/strong&gt; 対応するまでスクリプトをにするようお願いします。&lt;/del&gt;&lt;ins&gt;修正版を上げました。細かい表示の調整は後ほど行う予定です。&lt;/ins&gt;&lt;/p&gt;

&lt;p&gt;Tumblr Dashboardを拡張するユーザースクリプト、Tumblr Lifeの1.0 Pre 9を公開しました。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/raw/master/tumblr_life.user.js"&gt;Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/blob/master/tumblr_life.user.js"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gumroad.com/l/PhJm"&gt;Gumroad - Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tumblrのリニューアルの影響で崩れた表示などを修正しました。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;リニューアル後にフィルターメニューの重なりがおかしかった問題修正&lt;/li&gt;
&lt;li&gt;Firefox、Operaでリブログメニューがズレる問題修正&lt;/li&gt;
&lt;li&gt;Firefoxでプレースホルダーの文字が見えていなかった問題修正&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;要望や問題を発見した際は&lt;a href="https://github.com/yoko/userscripts/issues?labels=Tumblr+Life&amp;amp;state=open&amp;amp;milestone=1.0"&gt;GitHubのIssues&lt;/a&gt;や&lt;a href="https://twitter.com/yksk"&gt;@yksk&lt;/a&gt;までお願いします。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18902974351</link><guid>http://less.carbonfairy.org/post/18902974351</guid><pubDate>Thu, 08 Mar 2012 00:44:00 +0900</pubDate><category>userscript</category><category>tumblr</category><category>tumblrlife</category><category>greasemonkey</category></item><item><title>URLから画像を取得してEvernoteにクリップする</title><description>&lt;p&gt;&lt;a href="http://www.evernote.com/"&gt;Evernote&lt;/a&gt;の画像クリップ周りにはちょっと癖があります。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;画像をダウンロード。上手く行けば画像データを保存&lt;/li&gt;
&lt;li&gt;ダメだったら画像へのリンクとして記録。&lt;em&gt;画像データ自体は保存されない&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;上手く落とせない原因はタイムアウト、認証の掛かったページ、リファラ制限などがありそうですが、保存されないとオフラインになった時やその画像がサーバーから消えた後は見ることが出来ない！ フォーラムでも&lt;a href="http://discussion.evernote.com/topic/23358-%E3%80%90%E8%A6%81%E6%9C%9B%E3%80%91%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%95%E3%82%8C%E3%81%9F%E7%94%BB%E5%83%8F%E3%81%AE%E6%89%B1%E3%81%84/page__fromsearch__1"&gt;報告があります&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;メール経由で送ったりと色々試したところ、結局ローカルにダウンロードしてからEvernoteに送るのが確実ということになりました。一度落としてしまえば自由に扱えます。&lt;a href="http://itunes.apple.com/jp/app/evernote/id406056744?mt=12"&gt;Mac版Evernote&lt;/a&gt;はAppleScriptから操作出来るので、Automatorと組み合わせてURLから画像をクリップするサービスワークフローを作りました。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/19242/archives/Clip%20Images.workflow.zip"&gt;Clip Images.workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;本文は取り込みません。画像取得の際はSafariのクッキーが送られるので、セッションが残っていればログインが必要なページからもクリップ出来ると思います。リファラー制限はITmediaで試したところ無理でした。。リンク画像が絶対に作られない点と、ノートのフォーマットを統一出来る点が特徴です。動作には&lt;a href="http://itunes.apple.com/jp/app/evernote/id406056744?mt=12"&gt;Evernote.app&lt;/a&gt;が必要です。Lion上で作ったので他のOSだと動かないかも。Lionの場合、ワークフローファイルをダブルクリックするとサービスに追加出来ました。使い方です。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;URLが含まれた文字列を選択して右クリック&lt;/li&gt;
&lt;li&gt;コンテキストメニューから「サービス」→「Clip Images」

&lt;ul&gt;&lt;li&gt;URLが見つからなかった場合はサービスの項目がメニューに出ない（たぶん）&lt;/li&gt;
&lt;li&gt;URLが複数見つかった場合はそれぞれから画像を探し1つのノートにまとめる&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;ページ自体の画像を探すか、そのページからリンクされている画像を探すかを選択&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;成功するとEvernoteの「Inbox」ノートブック（なければ作られる）に画像の入ったノートが作られます。ページによっては時間が掛かることがあるかも。完了時、または画像がなかった時はGrowlに通知します（&lt;a href="http://growl.info/extras.php#growlnotify"&gt;growlnotify&lt;/a&gt;が必要）。&lt;/p&gt;

&lt;p&gt;# 画像は一時的に&lt;code&gt;~/.Clip_Images_ランダムな数字&lt;/code&gt;フォルダーにダウンロードされます。普通は終了後自動で消されますが、エラーなどでフォルダーが残った時は適当に削除してください。&lt;/p&gt;

&lt;p&gt;取り込めない例と対策。JSで画像やリンク先の表示を遅延させているページでは、HTMLソースに画像のパスが存在しないため上手く行きません。何かおかしい時は次の方法でなんとなかなるかも。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;以下のブックマークレットを追加

&lt;ul&gt;&lt;li&gt;&lt;a href="http://let.hatelabo.jp/yksk/let/gYC-xbf8gqK3Eg"&gt;List Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://let.hatelabo.jp/yksk/let/gYC-xbf7ntGVWw"&gt;List Linked Images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;ブラウザーでページを表示して画像を読み込ませる&lt;/li&gt;
&lt;li&gt;ページに合わせて上記のブックマークレットを実行&lt;/li&gt;
&lt;li&gt;ページのテキストを全選択して右クリック。「サービス」→「Clip Image」→「これらの Web ページ上にあるイメージ」&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;上手く行けばノートが作成されるはずです。&lt;/p&gt;

&lt;p&gt;ワークフローの流れ。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m046iyK1gR1qz52zt.png" alt=""/&gt;&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;AppleScriptで出来ることは&lt;a href="http://www.evernote.com/about/developer/mac.php"&gt;Evernoteのコード例&lt;/a&gt;が参考になります。完全なリファレンスを見るにはAppleScriptエディタにアプリケーションのアイコンをドラッグしましょう（この方法分かりにくい上に面倒なのでどうにかしてほしい＞＜）。&lt;/p&gt;

&lt;p&gt;最近&lt;a href="https://github.com/yoko/bookmarklets"&gt;ブックマークレットをCoffeeで書いています&lt;/a&gt;。やりたいことがやりたい通りのコードで書けて楽しい。ブックマークレットは気軽に書きたいしね:D&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18489271957</link><guid>http://less.carbonfairy.org/post/18489271957</guid><pubDate>Wed, 29 Feb 2012 18:57:53 +0900</pubDate><category>osx</category><category>automator</category><category>applescript</category><category>evernote</category></item><item><title>LionのUIで思ったこと</title><description>&lt;p&gt;もう次のOS発表されましたが、草稿が残っていてちょっと面白かったので載せときます。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;妄想です。&lt;/p&gt;

&lt;h3&gt;最初からウィンドウ全体リサイズを実装しようと思ってない感&lt;/h3&gt;

&lt;ol&gt;&lt;li&gt;ジェスチャー入れたい&lt;/li&gt;
&lt;li&gt;スクロールバーも消そう&lt;/li&gt;
&lt;li&gt;スクロールバーを消すと右下のリサイズだけ残すのはおかしい（iOSと整合性が取れなくなる）&lt;/li&gt;
&lt;li&gt;ウィンドウ全体でリサイズ出来るようにしてUI無くせばいい&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;のような流れで実装されたのでは…。UIを連鎖的に考えるのは以前&lt;a href="/post/147955620"&gt;閉じるボタンの位置について考えた時&lt;/a&gt;と同じパターン。&lt;/p&gt;

&lt;h3&gt;フルスクリーンアイコンを置くためにツールバーのトグルボタンを廃止した説&lt;/h3&gt;

&lt;p&gt;UIが一定まで埋まるともうそれ以上機能を追加せず、既存のものからプライオリティの低いものを置き換えていく？ 逆にUIが埋まってなければあってもなくてもいいような機能でもそのままにしておくｗ&lt;/p&gt;

&lt;p&gt;iTunesが肥大化出来るのはUIが埋まらない構成になってるからかな…。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;スクロール方向の変更は納得が行かなかったけど検証してる時に慣れたら納得した。。スクロールバーを消すのとセットなのは、以前はスクロールバーに対して操作していたものを面自体に対しての操作に切り替えたことを無意識に伝える意図もあるのかなぁ（iOSの時に検証されたと思う）。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18076851934</link><guid>http://less.carbonfairy.org/post/18076851934</guid><pubDate>Thu, 23 Feb 2012 02:34:11 +0900</pubDate><category>ui</category><category>osx</category><category>apple</category></item><item><title>MacのTwitterクライアントをOsfoora for Twitterにした。なかなかいい。Tweetieの出た頃を思い出す。

iPhoneのクライアントも合わせてTwittelator...</title><description>&lt;p&gt;MacのTwitterクライアントを&lt;a href="http://www.osfoora.com/mac/"&gt;Osfoora for Twitter&lt;/a&gt;にした。なかなかいい。Tweetieの出た頃を思い出す。&lt;/p&gt;

&lt;p&gt;iPhoneのクライアントも合わせて&lt;a href="http://stone.com/neue/"&gt;Twittelator Neue&lt;/a&gt;にしてみたのだけど、こちらはまだチューニング出来る感じ。公式とTweetbotと3アプリ行ったり来たりしている。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dayoneapp.com/"&gt;Day One&lt;/a&gt;も買ってしまって、これもなかなかいいんだけど今度書きます。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18075986526</link><guid>http://less.carbonfairy.org/post/18075986526</guid><pubDate>Thu, 23 Feb 2012 02:13:21 +0900</pubDate><category>iphone</category><category>osx</category><category>app</category></item><item><title>IE 9以下に存在するセレクター数制限にはまった</title><description>&lt;p&gt;&lt;ins&gt;# 対策を追記しています &lt;time&gt;2012-02-23&lt;/time&gt;&lt;/ins&gt;&lt;/p&gt;

&lt;p&gt;開発中にいきなりCSSが壊れて原因を探っていたらこれに行き着きました。&lt;a href="http://marc.baffl.co.uk/browser_bugs/css-selector-limit/"&gt;IE 9以下では1つのCSSファイル当たり4,095個までしかセレクターを認識しない&lt;/a&gt;。4,096個以上は無視される。ええええ。。MSにもページがある模様（&lt;a href="http://twitter.com/os0x/status/172347202381942785"&gt;@os0xさん&lt;/a&gt;に教えてもらった！）。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/262161/en-us"&gt;A webpage that uses CSS styles does not render correctly in Internet Explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;この問題は&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;SCSSだと割とカジュアルにセレクター数が増える&lt;/li&gt;
&lt;li&gt;CSSは出来るだけ1ファイルにまとめたい（リクエスト数削減のため）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;との組み合わせがやばい。SCSSはセレクターが他のページに影響しないように以下のように書いていました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// 共通部分
@mixin foo {
    color: red;
    .foo {
        font-size: 2em;
        // たくさんの指定…
        ...
    }
}

// 影響範囲を以下のページのみに限定したい
#page-a {
    @include foo;
}
#page-b {
    @include foo;
    color: yellow;
}

// 全ページに跨がる負の遺産
.foo {
    font-size: 5em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これだと適用ページを増やそうと思うとページ倍にセレクターが増えることに。。共通で使うセレクターを安心して設定出来るようにきれいな環境にする必要があると思いました…。&lt;/p&gt;

&lt;p&gt;一般的に問題になりそうなのはCSSの1ファイル化。対処方法としては溢れたら2ファイルに分ける、がありますｗ 1ファイル化後に毎回挙動が変わっていないかチェックするのは大変なので、セレクター数をチェック出来る仕組みがほしいところ。&lt;a href="http://sass-lang.com/"&gt;SCSS&lt;/a&gt;や&lt;a href="http://compass-style.org/"&gt;Compass&lt;/a&gt;側で生成時に警告してくれたり自動的に分割するオプションがあるといいですね…。&lt;/p&gt;

&lt;ins&gt;
&lt;p&gt;公開後にいくつかアドバイスを頂きました。&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;code&gt;extend&lt;/code&gt;を利用すれば減るのでは →CSSはスリムになるけどセレクターの数自体は減らせない&lt;/li&gt;
&lt;li&gt;事後処理のツールが有効なのでは&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blesscss.com/"&gt;Bless&lt;/a&gt;というまさにこの問題を解決するためのツールがある！&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/1131536"&gt;css_splitter&lt;/a&gt;もある&lt;/li&gt;
&lt;/ol&gt;

とりあえずCompassのconfig.rbにcss_splitterを組み込むことになりました。

&lt;pre&gt;&lt;code&gt;require 'css_splitter'

...

on_stylesheet_saved do |filename|
    if File.exists?(filename)
        CssSplitter.count_selectors(filename)
        CssSplitter.split(filename)
    end
end&lt;/code&gt;&lt;/pre&gt;

scriptタグが増減することになるので、その扱いは考える必要があります。。
&lt;/ins&gt;

&lt;p&gt;IE 6、7、8、9と現行のIEでは必ず起こります。&lt;a href="http://twitter.com/hell2u/status/172266759615823872"&gt;IE 10では直っている&lt;/a&gt;らしいです。&lt;/p&gt;

&lt;blockquote class="twitter-tweet" data-in-reply-to="172345909718433792"&gt;&lt;p&gt;@&lt;a href="https://twitter.com/yksk"&gt;yksk&lt;/a&gt; &lt;a href="http://t.co/eDRNqkJV" title="http://d.pr/fsYE"&gt;d.pr/fsYE&lt;/a&gt;一応スクショ。VirtualBox上のWindows 8 Developer PreviewでのIE10 PP4。&lt;/p&gt;— Kyo Nagashima (@hell2u) &lt;a href="https://twitter.com/hell2u/status/172352067187384320" data-datetime="2012-02-22T16:08:29+00:00"&gt;February 22, 2012&lt;/a&gt;&lt;/blockquote&gt;

&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;p&gt;ちなみに&lt;a href="http://john.albin.net/css/ie-stylesheets-not-loading"&gt;IEにはCSSファイルを31個までしか読めない問題もある&lt;/a&gt;ので、たぶんページのセレクター数上限は126,945個になるんじゃないでしょうか…。確認はしてない。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;HTMLにインラインで書いたCSSでも起こるのか&lt;/li&gt;
&lt;li&gt;JSでセレクターを追加していっても起こるのか&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;辺りも特に調べていません。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/18072493708</link><guid>http://less.carbonfairy.org/post/18072493708</guid><pubDate>Thu, 23 Feb 2012 00:44:00 +0900</pubDate><category>ie</category><category>css</category></item><item><title>git stash pop忘れが酷いのでzshのプロンプトにgit stash listの数を表示するを組み込んだ。zsh で Git...</title><description>&lt;p&gt;&lt;code&gt;git stash pop&lt;/code&gt;忘れが酷いので&lt;a href="http://stnard.jp/2010/10/25/402/"&gt;zshのプロンプトにgit stash listの数を表示する&lt;/a&gt;を組み込んだ。&lt;a href="http://d.hatena.ne.jp/mollifier/20100906/p1"&gt;zsh で Git の作業コピーに変更があるかどうかをプロンプトに表示する方法&lt;/a&gt;と合わせてこんな感じに表示するようにした。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzhujhAggt1qz52zt.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;全然分かってないまま適当に継ぎ足しました…。&lt;/p&gt;

&lt;script src="https://gist.github.com/1846104.js?file=gistfile1.sh"&gt;&lt;/script&gt;</description><link>http://less.carbonfairy.org/post/17714419750</link><guid>http://less.carbonfairy.org/post/17714419750</guid><pubDate>Fri, 17 Feb 2012 01:22:35 +0900</pubDate><category>zsh</category><category>git</category></item><item><title>Tumblrのハイライト機能を試した</title><description>&lt;p&gt;&lt;a href="http://staff.tumblr.com/post/16980189397/highlighted-posts"&gt;$1払うとDashboard上で記事を目立たせることが出来る&lt;/a&gt;。&lt;a href="http://less.carbonfairy.org/post/17642488183"&gt;前の記事&lt;/a&gt;で試してみた。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzf4myVJDI1qz52zt.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;テキストの種類とアイコン、色を自由に選択出来る。テキストのパターンはかなりある。チェック入れた状態でポストしようとすると支払いの案内が出る。PayPalでも払える。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzf7p28x5U1qz52zt.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;PayPalの支払いにしてみた。PayPalの場合1回ずつは払えず5回分からのチケットを買う形。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzf91uI0SW1qz52zt.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;こんな感じにDashboardに表示される。右カラムに被る時？はリボンが左側に表示されるみたい。&lt;/p&gt;

&lt;p&gt;Tumblrの色が黒いのは&lt;a href="http://staff.tumblr.com/post/673318863/save-our-gulf"&gt;石油流出テーマ&lt;/a&gt;です。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/17648623566</link><guid>http://less.carbonfairy.org/post/17648623566</guid><pubDate>Wed, 15 Feb 2012 15:54:00 +0900</pubDate><category>tumblr</category></item><item><title>GumroadでTumblr Life売ってます</title><description>&lt;p&gt;&lt;a href="/tagged/tumblrlife"&gt;Tumblr Life&lt;/a&gt;を試しに&lt;a href="https://gumroad.com/"&gt;Gumroad&lt;/a&gt;で売り始めました。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://gumroad.com/l/PhJm"&gt;Gumroad - Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tumblr Lifeは無料で使えますが、気に入ったら買ってみてもらえるとうれしいです:)&lt;/p&gt;

&lt;p&gt;Gumroadは簡単にデータを売り買い出来るサービスです。本当に簡単で面白い。これが当たり前になってくるとまた変わるんじゃないかなー。Tumblrとも相性いいと思う。まだ出来たばかりでクリエイターの方達も試しているみたいです。作品探してみると楽しいかも。&lt;/p&gt;

&lt;p&gt;とりあえずGumroadで売ってることが分かるボタンを用意してほしい！&lt;/p&gt;

&lt;p&gt;ついでにTumblrの&lt;a href="http://staff.tumblr.com/post/16980189397/highlighted-posts"&gt;ハイライト機能&lt;/a&gt;も試してみる…。結構細かく設定出来ますね。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/17642488183</link><guid>http://less.carbonfairy.org/post/17642488183</guid><pubDate>Wed, 15 Feb 2012 13:04:31 +0900</pubDate><category>gumroad</category><category>tumblr</category></item><item><title>CP+ 2012</title><description>&lt;p&gt;土曜日遅めの時間から参加。カメラを見に来るものだと思っていたら、みんなコンパニオンさんとか撮って楽しんでるのが面白かった。&lt;/p&gt;

&lt;p&gt;ニコンブースでやっていた中井精也氏（有名な鉄道写真家）のセッションでいい発見が出来た。D4とD800の紹介だったのだけど、撮ってきた作例を紹介する時に自分で「きれいでしょー」とよく言っていた。自慢じゃないと思う。客観的に聞こえた。きれいに撮っているのではなく、きれいなものを撮っている意識なんだなぁと感じた。カメラについても、きれいな景色をより切り取りやすくなるという説明の仕方だった…気がする。&lt;/p&gt;

&lt;p&gt;普段きれいに撮ろうと変な意識が働きがち。きれいなものを見つけて、それをそのまま撮れればいいのに。まずきれいなものを見つけるのが大変で、きれいでしょーと言えるのは本気で向き合って撮ってるからなんだなと思った。&lt;/p&gt;

&lt;p&gt;写真を撮るってそういうことなのかも。。きれいなものなのにそれを撮る技術がない…とか言えるとかっこいい。&lt;/p&gt;

&lt;p&gt;D4はISO感度最大20万とか言っててドラゴンボールかと思った。うちのK-7は1600でもうやばいのに。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/17611899208</link><guid>http://less.carbonfairy.org/post/17611899208</guid><pubDate>Wed, 15 Feb 2012 02:20:26 +0900</pubDate><category>photo</category><category>camera</category></item><item><title>Kindle Touchを買った</title><description>&lt;p&gt;&lt;a href="http://instagr.am/p/G7qReSq_34/"&gt;&lt;img src="http://distilleryimage4.instagram.com/fd53d21855f911e180c9123138016265_6.jpg" alt=""/&gt;&lt;/a&gt;
&lt;a href="http://instagr.am/p/G7qh6PK_3-/"&gt;&lt;img src="http://distilleryimage10.instagram.com/4d97cb4455fa11e18bb812313804a181_6.jpg" alt=""/&gt;&lt;/a&gt;
&lt;a href="http://instagr.am/p/G7rQfVK_4H/"&gt;&lt;img src="http://distilleryimage3.instagram.com/3108397c55fb11e19e4a12313813ffc0_6.jpg" alt=""/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon.comで先日日本からも買えるようになったKindle Touchとカバーを買った。すぐ届いてびっくり。小さい。設定して少し試しただけだけど楽しいー:D サービスと連携したりネットで端末の管理が出来るのが気持ちいい。&lt;a href="http://weblog.bulknews.net/post/13811211811"&gt;Kindleで未読を消化する&lt;/a&gt;のも楽しそう。&lt;/p&gt;

&lt;p&gt;カバーはグリーンのライト付きにした。ちょっと傷が付いて届いた（本体の方も操作した跡があったり埃っぽかったり）。気になる人は目立たない色にした方がいいかも。&lt;/p&gt;

&lt;p&gt;静かな雰囲気が漂ってる。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/17551262508</link><guid>http://less.carbonfairy.org/post/17551262508</guid><pubDate>Mon, 13 Feb 2012 23:26:35 +0900</pubDate><category>kindle</category><category>book</category></item><item><title>Tumblr Life 1.0 Pre 8</title><description>&lt;p&gt;&lt;a href="http://instagr.am/p/gAUXs/"&gt;&lt;img src="http://distilleryimage8.s3.amazonaws.com/38db858e3baa11e1abb01231381b65e3_6.jpg" alt=""/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tumblr Dashboardを拡張するユーザースクリプト、Tumblr Lifeの1.0 Pre 8を公開しました。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/raw/master/tumblr_life.user.js"&gt;Tumblr Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yoko/userscripts/blob/master/tumblr_life.user.js"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Dashboardのフィルターリストを復活したのと、デザインの調整がメインになります。また、&lt;a href="http://staff.tumblr.com/post/15571652703/keyboard-shortcuts"&gt;Tumblrが標準でLikeのキーボードショートカットを実装した&lt;/a&gt;ので、Tumblr Lifeではサポートを止めました。&lt;strong&gt;ショートカットが以前の&lt;kbd&gt;A&lt;/kbd&gt;から&lt;kbd&gt;L&lt;/kbd&gt;に変更されています&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;詳しい変更点。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://staff.tumblr.com/post/15571652703/keyboard-shortcuts"&gt;Tumblrが標準でLikeのキーボードショートカットを実装した&lt;/a&gt;ので、Tumblr Lifeではサポートを止めた&lt;/li&gt;
&lt;li&gt;/tumblelog が /blog に改名されたので、それに合わせた修正&lt;/li&gt;
&lt;li&gt;GreaseKitをサポートから外した&lt;/li&gt;
&lt;li&gt;新しい（と言っても去年の中頃にアップデートされた）Dashboardに合わせて表示を調整&lt;/li&gt;
&lt;li&gt;Dashboardのフィルターリストが表示されなかった問題修正&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最近意外と使ってもらえていることを知る機会がいくつかあってうれしく思っています。要望や問題を発見した際は&lt;a href="https://github.com/yoko/userscripts/issues?labels=Tumblr+Life&amp;amp;state=open&amp;amp;milestone=1.0"&gt;GitHubのIssues&lt;/a&gt;や&lt;a href="https://twitter.com/yksk"&gt;@yksk&lt;/a&gt;までお願いしますー。&lt;/p&gt;

&lt;p&gt;GreaseKitのサポート廃止に当たって、作者のkzysさんに今後更新の予定がないことを確認しました。今まで素晴らしいツールをありがとうございました！&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/15884503124</link><guid>http://less.carbonfairy.org/post/15884503124</guid><pubDate>Sun, 15 Jan 2012 23:19:18 +0900</pubDate><category>tumblr</category><category>tumblrlife</category><category>userscript</category><category>greasemonkey</category></item><item><title>pixivポップボードのキャッシュの仕組みとFacebookのUIの話</title><description>&lt;p&gt;こんにちは。&lt;a href="http://atnd.org/events/21980"&gt;JavaScript Advent Calendar 2011 オレ標準コース&lt;/a&gt;18日目の&lt;a href="https://twitter.com/yksk"&gt;@yksk&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;先日pixivに&lt;a href="http://www.pixiv.net/info.php?id=819"&gt;ポップボードという通知機能がリリースされました&lt;/a&gt;。自分がお気に入りユーザーに追加されたり、投稿したイラストがブックマークされたりした時にヘッダーに未読件数などのお知らせを表示します。僕は直接機能を実装していたわけではないのですが、リリース直後に起こった負荷の問題でJSを書きました。今日はその話をします。主にUIの話です！ え！&lt;/p&gt;

&lt;p&gt;&lt;a href="http://instagr.am/p/Z2cNX/"&gt;&lt;img src="http://distilleryimage11.instagram.com/15aee476295c11e1abb01231381b65e3_6.jpg" alt=""/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;リリース直後、定期的に未読数の更新をAjaxで行っていた部分の負荷が急激に上がりました。ページロード時にHTMLに未読数を埋め込んだあと、2分ごとに未読数取得APIへリクエストするという処理です。&lt;/p&gt;

&lt;p&gt;ポップボードはヘッダーに出るため、ほぼ全てのページでこの処理が入ります。複数のタブでpixivを開いて見ていた場合、その分だけリクエストも増える……そのことが原因じゃないかという話になった時、まじかよと思って自分のブラウザを確認すると複数タブで開いて見ていました。ははーん……。&lt;/p&gt;

&lt;p&gt;具体的な対応は後述しますが、結果的には負荷の問題は解決出来ました。それよりも気付かされたのはサイトの設計の問題です。僕はこの現象をUI上のバグだと思いました。同じお知らせ機能のあるFacebookとpixivの違いを考えた時に浮かぶFacebookを複数タブで開いて見ているか？という疑問。&lt;strong&gt;Facebookはサイト設計にあたって複数タブを開かせないことに最適化しているのではないか&lt;/strong&gt;。そして現状pixivは複数タブを開いた方が便利な設計になっていること、負荷になるほど一般的な方法だと思われること……。説が正しいかは別にして、思い付いてからFacebookへの見方が変わりました。チャットもアクティビティも1つのタブで全て見れるし、遷移も速い（&lt;code&gt;history.pushState&lt;/code&gt;）。フィードに全てが流れる。不便さを感じさせないことはユーザー体験だけでなく、同じ機能を実装しようと思った時に負荷の面でもメリットになっているいい例なのではないかと思いました。逆に局所的に先進性を取り入れた結果、歪みが生じるのは避けられないことなのかもしれません。&lt;/p&gt;

&lt;p&gt;以上UIの話でした。取り上げたUIの問題については現在製作中の&lt;a href="http://www.pixiv.com/"&gt;国際版&lt;/a&gt;で解決する予定です。Railsで作っています。興味のある方&lt;a href="http://recruit.pixiv.net/"&gt;一緒に作りましょう！&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;明日は&lt;a href="https://twitter.com/aerith"&gt;@aerith&lt;/a&gt;さんがinstagramのお話をしてくれるようです。楽しみですね！ 以下は実装の話になります。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;さて具体的な解決方法です。結論から言うと、JS側ではタブ間でキャッシュを共有して、いくつタブを開いていてもリクエスト数は一定になるようにして負荷を減らしました。&lt;/p&gt;

&lt;p&gt;# ざっくりとしか説明していません。実際のコードは&lt;a href="http://source.pixiv.net/source/js/pixiv.js"&gt;pixiv.js&lt;/a&gt;で見ることが出来ます。今のところ難読化していません:)&lt;/p&gt;

&lt;p&gt;キャッシュにはHTML5のlocalStorageを使います。localStorageがすばらしいのはブラウザ全体で値を共有出来ることです。ページをリロードする必要なく、タブ1で値を書き換えたらその瞬間にタブ2で更新された値にアクセス出来ます。この仕組みがあればキャッシュを全体で共有出来ます。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;localStorageの値を監視&lt;/li&gt;
&lt;li&gt;値の期限が過ぎていたらAPIから値を再取得して、結果をlocalStorageに突っ込む&lt;/li&gt;
&lt;li&gt;値の期限が残っていたらlocalStorageの値をそのまま使う&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;これにより最初に期限が切れたタブだけがリクエストして、他のタブはその結果を使い回します。&lt;/p&gt;

&lt;p&gt;対策した後の処理の流れです。まず、ページロード時にHTMLに入っている未読数をlocalStorageに突っ込みます。このキャッシュは2分間有効。これによって2分以内に新しいタブが開かれ続ければ常にキャッシュが生きるのでAPIリクエストは全く発生しなくなります。キャッシュの期限は&lt;code&gt;setInterval&lt;/code&gt;で10秒ごとに確認します。前述の通り、古くなっていればそのタブが値の更新を担当します。まだ期限が残っていれば、値が新しくなっていないかの確認を行います。&lt;/p&gt;

&lt;p&gt;タブを開きっぱなしにして何も操作をしていない場合を想定して、リクエストの度に間隔を4分→8分と延ばすようにしました。新しいタブが開かれると間隔はリセットされます。&lt;/p&gt;

&lt;p&gt;タブを開いたタイミングによっては1つのタブでリクエストしている間に別のタブからさらにリクエストが飛ぶ可能性があるので、その対策も必要です。今回はjQueryのDeferredオブジェクトを使って解決しました。localStorageにロード中のフラグを立てて、フラグが立っている間に発生したリクエストにはDeferredオブジェクトを返しておきます。最初のリクエストの結果が返ればlocalStorageの期限が更新されるはずです。待っているタブではキャッシュを1秒おきに確認して、更新されたら&lt;code&gt;Deferred.resolve&lt;/code&gt;で更新されたキャッシュの値を流してあげるようにしました。&lt;/p&gt;

&lt;p&gt;localStorageでいくつか注意する点として、1つはlocalStorageにはCookieのように有効期限が設定出来ません。今回はこんなこともあろうかと整備してあった、localStorageの値自体に期限を設定出来るライブラリを使ってさくっと実装出来ました。抜き出すと、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function storageParse(d) {
    var data, expires;
    try {
        if (!isNaN(d)) {
            return d;
        }
        d = JSON.parse(d);
        return $.type(d) == 'object' ?
            pixiv.storage.parseExpire(d) :
            d;
    }
    catch (e) {
        return d;
    }
}

function storageAddExpire(data, expires) {
    expires = +new Date + (expires || 0);
    return {data: data, expires: expires};
}

function storageParseExpire(data) {
    var expires = data.expires;
    return expires || expires === 0 ?
        (+new Date &amp;gt; expires ? undefined : data.data) :
        data;
}

function storageLocalStorage(name, value, expires) {
    expires &amp;amp;&amp;amp; (value = pixiv.storage.addExpire(value, expires));   
    return storageStorage('local', name, value);
}

function storageStorage(type, name, value) {
    var storage = w[type + 'Storage'], ret;

    if (!storage || !name || !$.support.json) return;

    switch (value) {
    case null:
        storage.removeItem(name);
        break;

    case undefined:
        return pixiv.storage.parse(storage[name]);

    default:
        try {
            $.browser.touchDevice &amp;amp;&amp;amp; storage.removeItem(name);
            storage.setItem(name, $.type(value) == 'object' ? JSON.stringify(value) : value);
        }
        catch (e) {
            pixiv.log(e);
        }
    }
}

// 使う時はこれだけでOK
pixiv.storage.localStorage('name', value, 1000 * 60 * 60);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このような感じ。オプションを与えるだけでいいようにしておくと便利だと思います。もう1つはlocalStorageの値はサービスのログイン状態とは無関係ということです。ユーザーがログアウトした後も固有の情報がlocalStorageに残り続けてアクセス出来てしまうのは問題です。今回は未読数しかキャッシュしない上にキャッシュする時間も短時間なので利用しましたが、この制限でだいぶ利用範囲が狭まります。。実装可能か検討する際には考慮しておきましょう。最後にlocalStorageはIE 8未満では使えません。pixivではIE 8未満はサポートしない方針なので、APIリクエストによる未読数更新はlocalStorageをサポートしないブラウザでは動かないようにしました（ページをリロードすれば更新される）。&lt;/p&gt;

&lt;p&gt;最終的にどうにかなったものの、ダメだった場合は機能自体が成り立たない可能性がありました。非同期な機能が増えると事前の予測が難しくなっていくので、問題が起こった例は共有していくといいと思います。これらの処理が必要になるサービスは滅多にないとは思いますが、何かの折りに参考になればうれしいです。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/14399301483</link><guid>http://less.carbonfairy.org/post/14399301483</guid><pubDate>Sun, 18 Dec 2011 20:46:00 +0900</pubDate><category>javascript</category><category>ui</category><category>pixiv</category><category>facebook</category></item><item><title>jqyery.dataset.js</title><description>&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/yoko/jquery.dataset.js"&gt;https://github.com/yoko/jquery.dataset.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://less.carbonfairy.org/post/9539844912"&gt;前回の$.fn.dataの問題&lt;/a&gt;を回避するためにしばらく $.fn.attrを使っていたのですが、面倒になってきた（特に$.fn.attrではオブジェクトで値を取得出来ない）ので$.fn.datasetを作りました。&lt;/p&gt;

&lt;p&gt;使いながらもう少しチューニングするかも。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/10980759258</link><guid>http://less.carbonfairy.org/post/10980759258</guid><pubDate>Tue, 04 Oct 2011 00:09:47 +0900</pubDate><category>javascript</category><category>jquery</category></item><item><title>$.dataはHTML5 datasetのラッパーではない</title><description>&lt;p&gt;HTML5では要素に任意の属性を追加出来るdata-*属性がサポートされました。&lt;a href="http://www.w3.org/TR/html5/elements.html#embedding-custom-non-visible-data-with-the-data-attributes"&gt;仕様&lt;/a&gt;では&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div data-foo="bar"&amp;gt;...&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;data-foo&lt;/code&gt;の値には&lt;code&gt;div.dataset.foo&lt;/code&gt;からアクセスすることが出来ます。ただしdatasetは現在一部ブラウザでしかサポートされていない。。そこでjQueryに存在する&lt;a href="http://api.jquery.com/data/"&gt;&lt;code&gt;$.data&lt;/code&gt;メソッド&lt;/a&gt;を使いましょう、という流れなのですが、&lt;code&gt;$.data&lt;/code&gt;をラッパーとして見た場合結構罠がありおすすめ出来ません。中途半端に対応してしまったために誤解されがちですが、&lt;code&gt;$.data&lt;/code&gt;はdatasetのラッパーではありません。&lt;/p&gt;

&lt;h3&gt;属性値がJSONとして解釈出来る場合、パースして返す&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id="test1" data-json="{&amp;amp;quot;foo&amp;amp;quot;:&amp;amp;quot;bar&amp;amp;quot;}"&amp;gt;...&amp;lt;/div&amp;gt;
$('#foo').data('json').foo // = "bar"

&amp;lt;div id="test2" data-number="42"&amp;gt;...&amp;lt;/div&amp;gt;
$('#test2').data('number') // = 42

&amp;lt;div id="test3" data-null="null"&amp;gt;...&amp;lt;/div&amp;gt;
$('#test3').data('null') // = null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HTML5 datasetは全ての値を文字列として扱いますが、&lt;code&gt;$.data&lt;/code&gt;はJSONとして扱える場合JSONとして処理します。上の例のようにJSONテキストはオブジェクトに、数値文字列は数値型に、「null」は&lt;code&gt;null&lt;/code&gt;に変換されます。また、「true」と「false」は特別に真偽値に変換されます。&lt;/p&gt;

&lt;p&gt;このためユーザーの入力値をdata-*属性に入れている場合、処理内容によってはセキュリティ的に問題になったり、文字列のみが返る想定で作っているとJSのエラーを引き起こす可能性があります。TwitterのポストIDのように極端に桁が大きい数値文字列は、この型変換で丸められて正常に取得出来なくなってしまうかもしれません。&lt;/p&gt;

&lt;p&gt;元々jQueryは独自に要素にデータを持たせる仕組みを持っており、HTML5でdata-*属性が仕様化された後に「data-*属性にデフォルト値を指定出来る」扱いでdata-*属性の値取得をサポートしました。データそのものの扱いはjQueryの以前からの仕組みのままです。そのため、1.6.2現在でも&lt;code&gt;$.data&lt;/code&gt;で書き込んだ値にDOMからアクセス出来ないなど、単純に属性値を読み書きするメソッドとして考えるのは無理があります。&lt;/p&gt;

&lt;p&gt;このような状況なので、使うならば仕様を良く理解した上で、data-*属性の内容が任意の場合やパース処理が余計な場合には&lt;code&gt;$.data&lt;/code&gt;を使わずに単純に文字列で入出力するメソッドを作るのがいいと思います（&lt;code&gt;$.attr&lt;/code&gt;も使える）。先に触れたように誤解されやすいので、jQueryに&lt;code&gt;$.dataset&lt;/code&gt;メソッドが新設されてもいいかもしれないですね。プラグインはあるようです（ただしこのプラグインは&lt;code&gt;$(element).dataset('fooBar', 123)&lt;/code&gt;をdata-foobar属性に書き込む。仕様に合わせる意味でdata-foo-barに書き込まれるのがベターだと思うし、最新のjQueryではそうなっている）。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.orangesoda.net/jquery.dataset.html"&gt;HTML5 Dataset jQuery Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ins&gt;
&lt;p&gt;自前で&lt;a href="/post/10980759258"&gt;jquery.dataset.js作りました&lt;/a&gt;。&lt;/p&gt;
&lt;/ins&gt;</description><link>http://less.carbonfairy.org/post/9539844912</link><guid>http://less.carbonfairy.org/post/9539844912</guid><pubDate>Mon, 29 Aug 2011 17:31:00 +0900</pubDate><category>javascript</category><category>jquery</category><category>html5</category></item><item><title>IEメモ</title><description>&lt;h3&gt;localStorageで容量限界近くになると書き込み処理でout of memoryが起こる&lt;/h3&gt;

&lt;p&gt;IE 8で確認。9ではチェックしてないです。全く書き込みをしない&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;localStorage.foo = '';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でも起こる。が、必ず起こるわけではない。別の書き方で&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;localStorage.removeItem('foo');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とすれば再現しなくなった。直接代入するのは止めた方が良さそうな気配。ついでに気付いたのが、代入して容量オーバーになった時のエラーは&lt;q&gt;メモリが不足しています。&lt;/q&gt;（とout of memoryのアラート）、&lt;code&gt;setItem&lt;/code&gt;を使った時のエラーは&lt;q&gt;この操作を完了するのに十分な記憶域がありません。&lt;/q&gt;と内容が変わること。やはりメソッドを経由した方が良さそう。&lt;/p&gt;

&lt;p&gt;確認してないけどsessionStorageも同様な気がする。&lt;/p&gt;

&lt;h3&gt;固定サイトの挙動&lt;/h3&gt;

&lt;p&gt;IE 9で追加された固定サイト機能。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/gg581716(v=vs.85).aspx"&gt;固定サイト: Windows 7 デスクトップの Internet Explorer 9 との統合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;meta要素に設定を書くのだけど、その設定は&lt;code&gt;msapplication-starturl&lt;/code&gt;のURLに見に行っているらしい（今開いているページに同様の記述があっても）。指定したURLがリダイレクトしていると設定がいつまでも反映されずに、例えばタスクの定義が反映されなかったりしてハマる。&lt;/p&gt;

&lt;p&gt;あとタスクバーにショートカットを置いた際に大きなアイコンが必要になったので、faviconを&lt;a href="http://www.xiconeditor.com/"&gt;X-Icon Editor&lt;/a&gt;（紹介記事は&lt;a href="http://blogs.technet.com/b/stanabe/archive/2010/10/29/html5-x-icon-editor-now-available.aspx"&gt;複数サイズに対応したアイコンエディターが公開されました (HTML5 アプリ) - Shigeya Tanabe&amp;#8217;s blog - Site Home - TechNet Blogs&lt;/a&gt;）で作ったらIE 8で壊れて見えるアイコンが出来て泣いた。Safariで作ったからかな…。&lt;/p&gt;</description><link>http://less.carbonfairy.org/post/9332734435</link><guid>http://less.carbonfairy.org/post/9332734435</guid><pubDate>Wed, 24 Aug 2011 22:17:54 +0900</pubDate><category>ie</category></item></channel></rss>

