Glims サムネイル表示機能が Amazon 商品履歴を汚す

Amazon の「チェックした商品の履歴」にクリックした覚えのない商品が追加されていることがありました。 正確には、その商品の画像を見た覚えはあるけど、クリックはしていないというもの。
長い間、謎だったのですが、Glims検索結果にサムネイルを追加する機能が原因と判明。

Google 等で検索した際に Amazon のページがあると、そこからサムネイルを持ってくるわけですが、それがクリックと判定されていたようです。

(上図:検索結果にGlimsでサムネイル表示)

(上図:通常の検索結果)

マウスジェスチャーのための Safari SIMBL プラグイン【SIMBLGesture】

追記)2012/4/7 アップデート v1.2
追記)2012/3/19 アップデート v1.1

Safariマウスジェスチャーするための SIMBL プラグインを作成しました。
ジェスチャー機能は基本的なものだけを実装してあります。
なお、SafariTop Sites, Bookmark, PDF 画面等では動作しません。

開発環境:
  Mac OS X 10.6.8 (Xcode 3.2.6)
動作確認:
  Mac OS X 10.6.8 Safari 5.1.2 / Safari 5.1.4 (SIMBL 0.9.9)
  Mac OS X 10.7.3 Safari 5.1.3 (SIMBL 0.9.9)
一部のプラグインと干渉することがあります。


【ダウンロード】
ベクター:SIMBLGesture 1.2 詳細ページ


【インストール】
1. 最新版の SIMBL 0.9.9 をインストールする。
2. ダウンロードした SIMBLGesture.bundle を以下のディレクトリのいずれかに配置する。
 /Library/Application Support/SIMBL/Plugins (全てのユーザ向けにインストール)
 ~/Library/Application Support/SIMBL/Plugins (特定のユーザ向けにインストール)
3. Safari を再起動する。

マウスカーソルを目立たせる Safari SIMBL プラグイン【RotCursor】

Realm of the God Mad (RotMG) というブラウザゲームに夢中になっていたのですが、画面がごちゃごちゃしているときにマウスカーソルを見失うことが多々ありました。

そこで、マウスカーソルの周辺に特殊な描画を施して目立たせる RotCursor プラグインを作成することにしました。 WindowsKokomite のようなものです。

        

RotCursor通常のブラウザ閲覧にも適用されます。

また、RotMG (Flash) はプレイ中にキーボードを操作するとマウスカーソルが消えるという(余計な)仕様になっていたため、RotCursor プラグインでは勝手にマウスカーソルが消えないように書き換えました

マウスカーソル周りの描画はいくつかカスタマイズできるようになっています。

開発環境:
  Mac OS X 10.6.8 (Xcode 3.2.6)
動作確認:
  Mac OS X 10.6.8 Safari 5.1.2 / Safari 5.1.4 (SIMBL 0.9.9)
  Mac OS X 10.7.3 Safari 5.1.3 (SIMBL 0.9.9)


【ダウンロード】
ベクター:RotCursor 1.0 詳細ページ


【インストール】
1. 最新版の SIMBL 0.9.9 をインストールする。
2. ダウンロードした RotCursor.bundle を以下のディレクトリのいずれかに配置する。
 /Library/Application Support/SIMBL/Plugins (全てのユーザ向けにインストール)
 ~/Library/Application Support/SIMBL/Plugins (特定のユーザ向けにインストール)
3. Safari を再起動する。

Ubuntu11.10 でスリープ(サスペンド)後にロックしないようにする

Ubuntu 11.04 では gconf-editorロックしないようにできたのですが、11.10 では dconf-editor という設定ツールを導入する必要があるようです。


1. dconf エディター をインストールする
Ubuntu ソフトウェアセンターdconf エディターを検索し、インストールします。


2. dconf エディターで設定を変更する
アプリケーション・ランチャー等で dconf エディターを起動します。
左のノードを org >> gnome >> desktop >> lockdown の順に開き、disable-lock-screen にチェックを入れます。

これでスリープサスペンド)解除後に画面ロックされなくなります。

引数によって関数の呼び出しオブジェクトが変わる goog.events.listen

goog.events.listen(src, type, listener, opt_capt, opt_handler) は、5 番目の引数 opt_handler を指定することで、関数の呼び出しオブジェクト this を変更することができます。

// opt_handler なし
goog.events.listen(src, EVENT_TYPE, function (e) {
    // |this| -> src オブジェクト
});

// opt_handler あり
goog.events.listen(src, EVENT_TYPE, function (e) {
    // |this| -> other オブジェクト
}, false, other);

この仕組みを知っていれば、

var that = this;

といった、this の回避をしなくて済みそうです。

ちなみに、4 番目の引数 opt_capt は true: キャプチャ(親から子へイベント伝播)、false: バブル(子から親へイベント伝播)。

Container 選択時に枠を表示させない

goog.ui.Container やその子要素 goog.ui.Control を選択すると表示される枠は、Container インスタンスに以下を設定すれば表示されなくなる。

    var container = new goog.ui.Container();
    // Container 選択時に枠を表示させない
    container.setFocusable(false);
    container.setFocusableChildrenAllowed(false);

Django モデルオブジェクトを何としてでも JSON に変換する

今回は説明を省略していくので注意。


あなたは models.py にモデルを定義しているとします。

#
# models.py
#
from django.db import models

class Item(models.Model):
    name = CharField(max_length=50, primary_key=True)
    tags = models.ManyToManyField(Tag)    # 別途 Tag モデルが定義されているとする

djangoModel インスタンスJSON 化する場合、以下の方法(ドキュメンテーション通り)なら(一応)問題はありません。
filter() メソッドが返す QuerySetJSON 化しやすい。
ただし、serializers が生成する JSON では 'pk', 'fields' 等の変なキーを使わないといけない

from django_project.application import models    # models.py
from django.core import serializers

items = models.Item.objects.filter(name='name')    # QuerySet
# JSON
json_serializer = serializers.get_serializer('json')()
data = simplejson.dumps(items, ensure_ascii=False)


一方、get() メソッドや for 文により得られた Model インスタンスは、上記の方法ではうまく JSON 化できません
Item is not JSON serializable」で何度も苦しめられました。
複数の Model辞書リストに入れて JSON 化したい場合、これでは困ります(もちろん、直接 Model インスタンスJSON 化する場合も)。


解決策として、独自にエンコード用の関数を定義する必要があるようです。
また、serializers ではなく simplejson モジュールを直接使用します。
変換関数は simplejson.dumps()default 引数で指定できます。

from django_project.application import models    # models.py
from django.db import models as django_models    # django が提供する models モジュール
from django.utils import simplejson

item = models.Item.objects.get(name='name')    # Item モデル

data = simplejson.dumps(item, ensure_ascii=False, default=encode_myway)
return HttpResponse(data, mimetype='application/json')

# 独自の変換関数    
def encode_myway(obj):
    if isinstance(obj, django_models.Model):
        return obj.encode()    # models.py のモデルに encode() メソッドを追加定義すること
        # encode という名前は適当に付けました
    elif isinstance(obj, QuerySet):
        return list(obj)    # 空の QuerySet は list 化する
    else:
        raise TypeError(repr(obj) + " is not JSON serializable")

空の QuerySet は「TypeError: [] is not JSON serializable」となるため、上記のように list 化します。


変換用の encode() メソッドを models.py の各モデルクラスに定義します。

#
# models.py
#
from django.db import models

class Item(models.Model):
    name = CharField(max_length=50, primary_key=True)
    tags = models.ManyToManyField(Tag)    # 別途 Tag モデルが定義されているとする
    
    def encode(self):
         return {
             'name': self.name,
             'tags': self.tags.all(),    # ManyToMany 等は all() でエンティティ化(非 QuerySet 化)
             }
    # JSON にキーが必要ないなら return [self.name, self.tags.all()] としてもよい。

これで Model インスタンスを自由に JSON 化できます。
私は Model を含んだ辞書リスト [{'item': item}, ... ] を view.pyJSON 化した Response を作ります。

  • 参考

Django models are not ajax serializable - Stack Overflow