マウスジェスチャーのための Safari SIMBL プラグイン【SIMBLGesture】
追記)2012/4/7 アップデート v1.2
追記)2012/3/19 アップデート v1.1
Safari でマウスジェスチャーするための SIMBL プラグインを作成しました。
ジェスチャー機能は基本的なものだけを実装してあります。
なお、Safari の Top 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 プラグインを作成することにしました。 Windows の Kokomite のようなものです。
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 モデルが定義されているとする
django の Model インスタンスを JSON 化する場合、以下の方法(ドキュメンテーション通り)なら(一応)問題はありません。
filter() メソッドが返す QuerySet は JSON 化しやすい。
ただし、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.py で JSON 化した Response を作ります。
- 参考