Latest entries
ミナミで集合。
今日は mitszo さん、 tokibito さんと晩ゴハンを食べてきたよ。
技術的な話から、おバカな話まで、色々話せて面白かった。 地元でもこういう機会を増やせていけたら良いなぁ。と思ったよ。
途中、 tokibito さんがMacBookを取り出してプレゼンがスタート。 画像検索のwebアプリを見せてもらって、ギャラリー2人がハイテンション。
とか、くだらない会話がポツポツとか。
他にもたくさん話したんですが、
まぁ、そこらへんは参加者のウマミって事で ![]()
mitszo さん、 tokibito さん、
本当にありがとうございました!!
また次回とかあると良いっすねー ![]()
- Posted at:
- 2008/05/06 02:32:43
- 0 Comments
- 0 TrackBacks
- Tags:
- memo
- Trackback:
- http://humming.via-kitchen.com/2008/05/06/meeting-in-minami/trackback/
モデルのsaveが変わったよ。
Django の trunk に queryset-refactor がマージされたタイミングで、 モデルの save メソッドにも改良が加えられてたのでメモメモ。
マージ前(r7476) は save メソッド自体に実際の処理が書かれてた。
# django/db/models/base.py@213行目あたり
def save(self, raw=False):
dispatcher.send(signal=signals.pre_save, sender=self.__class__,
instance=self, raw=raw)
# 中略...
dispatcher.send(signal=signals.post_save, sender=self.__class__,
instance=self, created=(not record_exists), raw=raw)
ので、データ登録の際に何か処理を挟みたい場合、 オーバーライドして処理を追加してあげて、 良いところで親の save をコールしてあげる事で実装してた(と思う)。
class Hige(models.Model):
"""
HIGEなモデル
"""
def save(self, raw=False):
# なにか追加したい処理が入る。
super(Hige, self).save(raw=raw)
でも、これだとダイレクトにデータを保存したい場合に、 適当な名前でもうひとつ save メソッドを作ってやる必要があった。
class Hige(models.Model):
"""
HIGEなモデル
"""
def save(self, raw=False):
"""
adminとかでは処理を追加したいので、
オーバーライドせざるを得ないんだ。
"""
# なにか追加したい処理が入る。
super(Hige, self).save(raw=raw)
def direct_save(self, raw=False):
"""
たまーに処理を追加しないのも必要。
"""
super(Hige, self).save(raw=raw)
こういう状況になると、ものっすごい残念な気持ちになってた訳なのですが、 これが マージ後(r7477) でちょっと素敵に改良されてるよ。
# django/db/models/base.py@293行目あたり
def save(self):
"""
Save the current instance. Override this in a subclass if you want to
control the saving process.
"""
self.save_base()
def save_base(self, raw=False, cls=None):
"""
Does the heavy-lifting involved in saving. Subclasses shouldn't need to
override this method. It's separate from save() in order to hide the
need for overrides of save() to pass around internal-only parameters
('raw' and 'cls').
"""
# 省略...
実際のデータ登録の処理は全部 save_base メソッドで実装しておいて、 save メソッドはそのフックになってるよ。 これだと、ダイレクトにデータを登録する必要が出て来た場合でも、 save_base をコールすれば良いだけ。 なので、特にモデルに変更を加える必要は無い。
class Hige(models.Model):
"""
HIGEなモデル
"""
def save(self):
"""
処理を追加したいのでオーバーライド。
raw=Falseは無くなってるよ。
"""
# なにか追加したい処理が入る。
# self.save_base()ってしてないのはなんとなく。
super(Hige, self).save()
これでもう残念な気持ちにならなくて良いね。
また一つ、 Django が好きになりましたとさ ![]()
- Posted at:
- 2008/05/02 00:29:35
- 2 Comments
- 1 TrackBack
- Trackback:
- http://humming.via-kitchen.com/2008/05/02/changed-models-save-on-django/trackback/
キャッシュ関連のヘッダメモ
なんとなくで通り過ぎてたのを調べてみたメモ。 知ってたのも知らなかったのも、恥を晒すためにもブログに書いておく。
リクエストヘッダ
- If-Modified-Since
日時を指定し、それより新しいコンテンツの場合にのみデータを返すようにサーバにリクエストする。
Ajaxでのキャッシュ抑制のために以下の設定で頻繁に使ってるな。
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT
この使い方が合ってるのかは分からんですけども、 QueryStringに時間をくっつけてキャッシュから逃げるやり方よりかは、 こっちの方がスマートで好き。
- If-None-Match
エンティティタグを指定し、一致しない場合にのみデータを返すようにサーバにリクエストする。
If-None-Match: "xyzzy"
とか
If-None-Match: *
とか指定するらしい。意図的に付ける場面はまだ思いつかないなぁ。
レスポンスヘッダ
- Expires
- コンテンツの有効期限を指定する。
- Last-Modified
- コンテンツの最終更新時刻を指定する。 If-Modified-Since と対で使用される。
- ETag
コンテンツを特定するための固有値を指定する。 If-None-Match と対で使用される。
Proxyとか使ってる場合にコイツが悪さをする事があるらしい。 その場合、設定を変えてやる必要がある。デフォルトだと以下になってる。
# デフォルトだとi-node, 最終変更時刻, ファイルサイズを見る。 FileETag INode MTime Size
i-nodeなどが邪魔してる場合は INode を外してやる。
# 最終変更時刻, ファイルサイズを見る。(i-nodeは見ない。) FileETag MTime Size
Directory, VirtualHost なディレクティブでも指定出来る。詳しくは core - Apache HTTP サーバ の FileETag を見る。
共通ヘッダ
- Cache-Control
- そのまま。キャッシュコントロールに関する指定をする。 HTTP/1.1から追加されたらしい。詳しい情報は HTTP/1.1: Header Field Definitions の 14.9 Cache-Control を見る。
- Pragma
- 特殊な追加情報を指定する。これはHTTP/1.0からある。 no-cache を指定することも出来る。詳しい情報は HTTP/1.1: Header Field Definitions の 14.32 Pragma を見る。
まとめ
眠気と戦いながら、調べながらメモしたので全然まとまってないや。
でも、忘れた時に見るべき場所は分かったので、それだけで良しとする。
また理解出来た頃にちゃんとまとめようと思う ![]()
- Posted at:
- 2008/05/01 02:26:03
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2008/05/01/cache-control-headers/trackback/
svnX入れてみたよ。
GUIなSubversionクライアントを探してたんだけども、 そこで出会った svnX ってのが結構ツボだったよ。
クライアントとしては、ちょっとイマイチだったんだけども、
リポジトリ管理ツールとしては抜群に素敵!!
複数リポジトリの管理も簡単に出来るし、
見た目も直感的で解りやすいと思う ![]()
- Posted at:
- 2008/04/25 18:18:57
- 0 Comments
- 1 TrackBack
- Tags:
- Svn
- Trackback:
- http://humming.via-kitchen.com/2008/04/25/installed-svnx/trackback/
JSFL書いてみたメモ
Flashで作業してると、 同じ作業を何度となく繰り返す場面に出くわすんですが、 どうにかして回避したいなぁ。って思ってたところで JSFL ってものに遭遇。 どうやらJavaScriptで書けるFlashの機能拡張らしい。
で、色々調べながら書いてみたのがコレ。 berian や iaocc が以前に話題にしてた、 ライブラリの画像をグラフィックスでラップして、 さらにムービークリップにしてくれるJSFL。完全に 車輪 ですよ!!
/**
* ConvertToSymbol.jsfl
**/
(function ()
{
// ファイルが開かれてないとココでおしまい
if (!fl || !fl.getDocumentDOM()) return alert("ドキュメントオブジェクトが見つかりません。");
var DOC = fl.getDocumentDOM();
var LIB = DOC.library;
LIB.items.filter(function (element)
{
// Bitmapなライブラリ以外はココではじく
return element.itemType == 'bitmap' ? true : false;
})
.filter(function (element)
{
var newName = element.name.split(".")[0] + "_g";
// 既に定義されていれば除く
if (LIB.itemExists(newName)) return false;
// Graphicsを生成
LIB.addNewItem("graphic", newName);
// BitmapをGraphicsでラップする
LIB.editItem(newName);
LIB.addItemToDocument({x:0, y:0}, element.name);
// ポジションの補正
var rect = DOC.getSelectionRect();
DOC.setSelectionBounds({
left: 0,
top: 0,
right: rect.right - rect.left,
bottom: rect.bottom - rect.top
});
DOC.exitEditMode();
return true;
})
.filter(function (element)
{
var name = element.name.split(".")[0];
var gName = name + "_g";
var mcName = name + "_mc";
// 既に定義されていれば除く
if (LIB.itemExists(mcName)) return;
// MovieClipを生成
LIB.addNewItem("movie clip", mcName);
// GraphicsをMovieClipでラップする
LIB.editItem(mcName);
LIB.addItemToDocument({x:0, y:0}, gName);
// ポジションの補正
var rect = DOC.getSelectionRect();
DOC.setSelectionBounds({
left: 0,
top: 0,
right: rect.right - rect.left,
bottom: rect.bottom - rect.top
});
DOC.exitEditMode();
return true;
});
})();
// vim: filetype=javascript fenc=utf-8 bomb
とりあえず良い感じに出来た(と思う)。
Flashでの作業中に、メンドクサイって3回思ったら JSFL 作るようにしよう ![]()
- Posted at:
- 2008/04/25 00:49:17
- 4 Comments
- 0 TrackBacks
- Tags:
- Flash
- JavaScript
- Trackback:
- http://humming.via-kitchen.com/2008/04/25/jsfl-memo/trackback/
家族持ちIT系技術者の交流会やるのかな?
カノエ さんが 面白そうな企画 を目論んでるっぽいよ!!(良い意味で)
関東の家族持ちエンジニアの方は、参加表明してみてはいかがでしょう? 実現すると面白くなると思うんだけどなぁ。
残念ながら自分は参加資格がありません。 ![]()
- Posted at:
- 2008/04/23 16:06:10
- 1 Comment
- 0 TrackBacks
- Tags:
- memo
- Trackback:
- http://humming.via-kitchen.com/2008/04/23/geek-family-summit/trackback/
Pythonでスクリプトからインタプリタを起動する
Google App Engine を弄ってるついでに覚えたメモ。 Python なスクリプトからインタプリタを起動するには、
import code
code.interact()
って、したら良いらしいよ。 IPython がインストールされてるのであれば、
import IPython
IPython.Shell.IPShell().mainloop()
で起動出来るよ。 なので、こんな感じにすると良いのかも。
try:
import IPython
IPython.Shell.IPShell().mainloop()
except ImportError:
import code
code.interact()
これで IPython がインストールされてれば IPython が使えるし、 されて無ければデフォルトでインタプリタが起動出来るね。
- Posted at:
- 2008/04/15 02:49:03
- 0 Comments
- 1 TrackBack
- Tags:
- Python
- Trackback:
- http://humming.via-kitchen.com/2008/04/15/execute-interpreter-on-pythonscript/trackback/
jQuery野良プラグイン
jQuery野良プラグイン なんてのを Google Code で作ったよ。
なんか作ったら、どんどこ追加していく予定。 大きいのはメインストリートで開発が進んでると思うので、 ココでは小粒なのを作っていけたら良いと思う。
とりあえず、WindowsのノートPCが手に入ったら、
SWFObject と SWFMacMouseWheel の jQuery バージョンは作りたいと思っとります!
が、それもいつになるんだか ![]()
abde な人や t- 氏に煽られると、
色々と良いものが出来てくるかも知れないね ![]()
- Posted at:
- 2008/04/10 00:36:38
- 0 Comments
- 1 TrackBack
- Tags:
- JavaScript
- jQuery
- Trackback:
- http://humming.via-kitchen.com/2008/04/10/jquery-nora-plugins/trackback/
Progressionレクチャーメモ
Progression Framework のレクチャー@ nium さんメモ。
とりあえずな定義として、一般的なコンテンツでの表示パターンは大まかにはこんな感じ。
- 常に表示される 例)グローバルナビゲーション等
- 特定階層以下で表示される 例)ローカルナビゲーション等
- 特定のページのみで表示される 例)各ページの内容
- その他、特定の条件下で表示される
4はどう考えても汎用化は無理なので、ココでは無視する。 例えばゲーム的なコンテンツを作るとして、
- 1は、最初に表示させてそのまま放置すればOK
- 2は、例えば product ページに行ったら詳しい製品情報が出る感じで それ以下でずっと表示、それより上の階層に戻った場合は消去 という感じなので、n 階層のページ以上・以下で分岐する処理
- 3は、該当ページに移動してきた場合のみ処理すればOK
で、ココからが本題。2のパターンを実装したい場合、 特定の階層以下でずっと表示、それより上で消去ということは 階層を移動した瞬間が分かれば、そこに処理を書けば自動的に流れがつながるようになる。 Progression のイベントの流れで説明すると、1階層目のシーンから2階層目への移動は、
// 1階層目から2階層目へ移動
onGoto -> onLoad -> onInit
という感じでコールされていく。 コレだけ見ると、 onLoad と onInit 同じなんじゃ?いう感じな訳ですが、 これが1階層目から3階層目までダイレクトに飛んだ場合には、
// 1階層目から3階層目へ移動
onGoto -> onLoad -> onLoad -> onInit
となるらしく、なんと2階層目の onInit が実行されません!
で、基本的に onLoad と onUnload が、 onInit と onGoto がそれぞれ対になっているので、 onLoad で表示したものは onUnload で消去して onInit で表示したものは onGoto で消去すれば破綻なく処理出来るみたい。
上の例で言うと、第3階層から第1階層にダイレクトに移動した場合、
// 3階層目から1階層目へ移動
onGoto -> onUnload -> onUnload -> onInit
というイベントフローになるので、第2階層目の onGoto は実行されない。
ココまでの流れの中で、実はちょっと省略したところがあって、 本当は第1階層から第3階層に行く時には、
// 間にonDEscendなイベントがコールされる
onGoto -> onLoad -> onDescend -> onLoad -> onInit
になるよ。
onDescend の使い道としては、 例えば第2階層以下で表示したい内容を、 第2階層に遷移してきた場合にはエモーショナルなアニメーションで表示して、 2階層目を飛ばしてさらに下にダイレクトに飛んだ場合は省略アニメーションをしたい場合、 onDescend に省略アニメーションを仕込んでおく事で実装出来るよ。
ココらへんは、 nium さんもあまり使わないぐらいの応用編らしく、
とりあえずは「スルーしたよ。」というのも検知できると、
どこからどこに飛んでも確実に、かつドラマティックに画面を再現できるようになるよ!って事らしい。
実際にそれをやる場合には、 onLoad の処理と onDescend の処理が重複しないように、
Progression クラスが持っている destinedSceneId とかで判別してやる必要がある訳ですが、
それでも、個々の画面をほとんど意識しないで実装出来るってのは素敵!
onGoto と onUnload も同じ感覚で出来ちゃうと思うよ ![]()
- Posted at:
- 2008/04/05 05:15:15
- 0 Comments
- 1 TrackBack
- Trackback:
- http://humming.via-kitchen.com/2008/04/05/progression-lecture-memo/trackback/
SWFMacMouseWheelがバグってるメモ
t-matsuda 氏と AS3.0 MouseWheel on Mac OS X を触る必要があったんだけども、 なぜかwindowsでエラー吐くので調べてみたよ。
エラー内容を見てみると、 どうやら SWFMacMouseWheel に registerObject ってメソッドが無いらしい。 それはさすがにアリエナイだろ。って思ってソースを見てみたら、 swfmacmousewheel_src.js の20行目あたりに、ものっすごいのが書いてあった!
var swfmacmousewheel = function()
{
if( !swfobject ) return null;
var u = navigator.userAgent.toLowerCase();
var p = navigator.platform.toLowerCase();
var mac = p ? /mac/.test(p) : /mac/.test(u);
// この1行がアリエナイ。
if( !mac ) return null;
// 処理がつづく...
// Macだとここが実行される。
return {
/*
Public API
*/
registerObject: function(objectIdStr)
{
regObjArr[regObjArr.length] = objectIdStr;
}
};
}();
この実装はどうなんだ? そりゃ registerObject なんてメソッド無いだろうよ。 windowだと swfmacmousewheel の中身がnullになるよ!
このあと、なんだかんだ修正しまくったんだけども、 とりあえずのやっつけなのであれば、
if ( !mac ) return null;
のところを、
if ( !mac ) return {
registerObject: function () {}
};
って変えてあげればエラーは消えるよ。
本当にやっつけだけども。
他にも色々と問題があったりなかったりなので、
デフォルトのまま使うのであれば、注意したほうが良いかもね ![]()
- Posted at:
- 2008/04/01 14:31:09
- 0 Comments
- 1 TrackBack
- Tags:
- Flash
- JavaScript
- Mac
- Trackback:
- http://humming.via-kitchen.com/2008/04/01/swfmacmousewheel-bug-memo/trackback/