2010年1月27日水曜日

debug() for js

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
(function($){
  function debug(){
    if (window['console']){
      console.log.apply(null, arguments);
    };
  };
}(jQuery);
いくつかpointをば:
  • functionで囲う。これはname spaceの汚染防止
  • window['console']のガード:firebugがあがっていないときはlogしない。
  • apply~はdebugに可変長引数をパススルーするトリック。

2010年1月18日月曜日

Param serialization of JQuery 1.4.0

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
with jQuery 1.4.0

shinano.tonic-water.com - - [18/Jan/2010 17:21:47] "GET /?callback=jsonp1263802906929&_=1263802907163&move%5B%5D=4%2F2+1%2Foff(2)+&gnubgid=ZwAAwGwAAAAAAA%3AcIkkAAAAAAAA HTTP/1.1" 500 59


with jQuery 1.3.2

shinano.tonic-water.com - - [18/Jan/2010 17:23:24] "GET /?callback=jsonp1263803004677&_=1263803004910&move=4%2F2+1%2Foff(2)+&gnubgid=ZwAAwGwAAAAAAA%3AcIkkAAAAAAAA HTTP/1.1" 200 80

I need to figure out differences.
%5B%5 is [], so it comes from some where in js, and it looks like array related.

ajax with

data : {'move' : m, gnubgid : alt},

generates "move%5B%5=" so, I changed it to

data : {'move' : m[0], gnubgid : alt},

and it gives the right result.

m comes from

var m = mv.match(moveRegexp);

so I guess that 1.4.0 has changed over match object handling on serialization.


Param serialization now happens in the PHP/Rails style by default. You can use jQuery.ajaxSettings.traditional = true; to use traditional parameter serialization.

Source: Backwards-Incompatible Changes

PHP/Rails means "recursive". If match object is an iterable of strings, then it is reasonable.

Home server NIC

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
current settings.

eth0 Link encap:Ethernet HWaddr 00:19:DB:62:B9:9F
inet6 addr: fe80::219:dbff:fe62:b99f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:193946 errors:0 dropped:0 overruns:0 frame:0
TX packets:565 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12137016 (11.5 MiB) TX bytes:23946 (23.3 KiB)
Interrupt:21 Base address:0xa800

eth1 Link encap:Ethernet HWaddr 00:90:CC:EF:8C:3F
inet6 addr: fe80::290:ccff:feef:8c3f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3381843 errors:0 dropped:0 overruns:0 frame:0
TX packets:3000068 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2379434048 (2.2 GiB) TX bytes:1767241216 (1.6 GiB)
Interrupt:17 Base address:0xec00

eth1:0 Link encap:Ethernet HWaddr 00:90:CC:EF:8C:3F
inet addr:192.168.2.64 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:17 Base address:0xec00

eth1:1 Link encap:Ethernet HWaddr 00:90:CC:EF:8C:3F
inet addr:192.168.2.65 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:17 Base address:0xec00

eth1:2 Link encap:Ethernet HWaddr 00:90:CC:EF:8C:3F
inet addr:192.168.2.66 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:17 Base address:0xec00

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2086245 errors:0 dropped:0 overruns:0 frame:0
TX packets:2086245 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:305132509 (290.9 MiB) TX bytes:305132509 (290.9 MiB)


  • one of NIC is not used.

  • I do not have cross cable!

2010年1月12日火曜日

チャレンジ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
人材獲得作戦・4 試験問題ほかの試験問題にチャレンジ
30分でLv2まで。おせー。 goalから小さくなるように逆にたどればいい気もしてきた。面倒だからもういいや。プログラミングコンテストに出る連中だと10分とかだろ。これ。

* * * * * * * * * * * * * * * * * * * * * * * * * *

* S * ( 7) * ( 9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(21)(22)(23)(24)(25)(26)(27)(28) *

* ( 0) * ( 6) * ( 8)( 9) * (13)(14) * * * * * * * * * * * * * (28)(29) *

* ( 1) * ( 5)( 6)( 7) * (15)(14)(15)(16) * * * * * * * * * * * * (29)(30) *

* ( 2)( 3)( 4)( 5) * (17)(16)(15)(16)(17)(18)(19)(20)(21)(22)(23)(24)(25)(26)(27)(28)(29)(30)(31) *

* * * * * * * * * * * * * * (22) * * * * * * * * * * *

* (36)(35)(34)(33)(32)(31)(30)(29)(28)(27)(26)(25)(24)(23)(24)(25)(26)(27)(28)(29)(30)(31)(32)(33) *

* * (36) * * * * * * * * * * * * * * * * * * * * * * *

* (38)(37)(38)(39)(40)(41) * (45)(46)(47)(48)(49)(50)(51)(52)(53)(54)(55)(56)(57)(58) G (64)(65) *

* (39)(38) * (40)(41)(42)(43)(44)(45) * * * * * * * * * * * (59) * (63)(64) *

* (40)(39)(40)(41) * (43)(44)(45)(46)(47)(48)(49)(50) * * * * * * * (60) * (62)(63) *

* (41)(40)(41)(42)(43)(44)(45) * (47)(48)(49)(50)(51)(52)(53)(54)(55)(56)(57)(58)(59)(60)(61)(62) *

* * * * * * * * * * * * * * * * * * * * * * * * * *

コード

f = open('meiz')

m = []
for line in f:
cs = []
for c in line:
cs.append(c)
m.append(cs)

f.close()
print m


def locate_x(x, m):
for i, line in enumerate(m):
for j, c in enumerate(line):
if c==x:
return i, j
raise

print locate_x('S', m)
print locate_x('G', m)

def pretty(m):
for cs in m:
line = ''
for c in cs:
if isinstance(c, int):
line += '(%2i)'%c
else:
line += ' '+c+' '
print line


def clone(m):
r = []
for line in m:
cs = []
for c in line:
cs.append(c)
r.append(cs)
return r

def step(x, m, count):
V = m[x[0]][x[1]]
if isinstance(V, int):
if V <= count:
return False
m[x[0]][x[1]] = count
return search(x, m, count + 1)
if V == ' ':
m[x[0]][x[1]] = count
return search(x, m, count + 1)
elif V == 'G':
return True
elif V == 'S':
return False
elif V == '*':
return False
else:
pass
assert False

def search(S, m, count):
#print count ,S

# North
x = S[0] - 1, S[1]
step(x, m, count)
# South
x = S[0] + 1, S[1]
step(x, m, count)
# West
x = S[0], S[1] - 1
step(x, m, count)
# East
x = S[0], S[1] + 1
step(x, m, count)

search(locate_x('S', m), m, 0)
pretty(m)

2010年1月11日月曜日

packaging

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

python*/site-packages/hoge.py
python*/site-packages/hoge-usage-sample/sample.py
python*/site-packages/hoge-usage-sample/sample-data/*.dat

みたいなdir構造にしたいのだが、開発中は

foo/src/hoge.py
foo/src/sample.py
foo/src/sample-data/*.dat

というdir構造をしていて、どのようにやればpackageできるのか困り果てる。
妥協してhoge/hoge.pyとhoge/__init__.pyをインストールするようにするかぁ。

2010年1月7日木曜日

werkzeug

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
contrib.sessionsがまさにほしかったもの。

これでcomet sideとweb sideのsessionの共有が可能になる。


session_store = FilesystemSessionStore()

def application(environ, start_response):
request = Request(environ)
sid = request.cookie.get('cookie_name')
if sid is None:
request.session = session_store.new()
else:
request.session = session_store.get(sid)
response = get_the_response_object(request)
if request.session.should_save:
session_store.save(request.session)
response.set_cookie('cookie_name', request.session.sid)
return response(environ, start_response)