Wednesday, July 30, 2008

备份, 同步svn版本库

初始化本地一个空的svn库: svnadmin create /home/lg/repo

从远程库初始化0版本: svnsync init file:///home/lg/repo remote_svn_repo

从远程库同步: svnsync sync file:///home/lg/repo

顺便看看svn的命令, 别整天被UI给宠坏了, 命令行也是很好用的, ^_^

注意:
初始化过程中会有提示你要创建hook, 到/home/lg/repo下的hooks下创建相应的空文件改名为.sh(.bat)加入可执行权限即可

解决连接池获取连接后不能用的问题

连接池8小时断掉的问题确实很烦, 有些连接池的连接自动测试又不管用, 在网上无数的人问这个问题, 说是connection pool的bug云云, 在我看来, 这个应该不是什么问题, 出现这个问题的根源是数据库, 故而直接设置了一下mysql的连接超时时间(当然数据库的连接数是要考虑的),
在mysqld section中加入:
#mysql 自动断掉链接的时间设为十年
wait_timeout=315360000
interactive_timeout=315360000

想必也世界上也没有几台服务器10年不当机, 呵呵

简单的文本搜索, 用ie和firefox默认的功能实现, 代码:


var range="";
if(document.createRange){
    range = document.createRange();
}else{
    range = document.body.createTextRange();
}
if(range.findText){
    while(range.findText("和尚")){
       range.pasteHTML(range.text.fontcolor("#ff0000"));
       range.collapse(true);
    }
}else{
    var s,n;
    s = window.getSelection();
    while(window.find("和尚")){
        var n = document.createElement("SPAN");
        n.style.color="#ff0000"
        s.getRangeAt(0).surroundContents(n);
    }
}

Tuesday, July 29, 2008

app退出时的回调, java有AddShutdownHook, python也有atexit

def goodbye( name, adjective ):
print "goodbye %s %s"%( name, adjective )

def bye(info):

print "printed on exiting", info


import atexit
atexit.register( goodbye, adjective="cat", name="dog")

atexit.register( bye , info="cat")

atexit.register( bye , info="dog")
不过python的回调顺序是添加顺序的逆序!
这里的结果为:
printed on exiting dog
printed on exiting cat

goodbye dog cat

利用python, 构建自己的URLModuleLoader

利用python, 构建自己的URLModuleLoader.
需求:
为了便于客户端的代码更新, 故将module放到了服务器上, 客户端只需要一个简单的run.py, 剩下的问题用URLModuleLoader来搞定!
资源: http://localhost:8080/modules下放置了很多python modules, 举例来说logger.py, etc...

from ihooks import ModuleLoader, ModuleImporter
from urllib2 import urlopen, HTTPError
from urlparse import urljoin
import tempfile
import os

url_path=['http://localhost:8080/modules']

"""URL loader 的实现"""
class URLModuleLoader(ModuleLoader):
def find_module(self, name, path=None):
stub=ModuleLoader.find_module(self, name, path)
if stub:
#print "module :", name, stub
return stub
if path:
return
 """本地module优先, 如果本地没有, 则到服务器上去取"""
for base in url_path:
url=urljoin(base, name+'.py')
try:
file = urlopen(url)
name=tempfile.mktemp()
stream=open(name, 'wb')
stream.write(file.read())
stream.close()
file.close()

file=open(name, 'r')
#print "module :", url
return file, url, ('.py', 'r', 1)
except HTTPError, e:
#print e
return None

"""实现importer"""
class URLImporter(ModuleImporter):
def __init__(self):
hooks, verbose=(None, 1)
loader=URLModuleLoader(hooks, verbose)
ModuleImporter.__init__(self, loader, verbose)


"""设置自己的module loader"""
URLImporter().install()

"""测试"""
if __name__=="__main__":
import logger
import re
import base64
logger.log("logger loaded from remote packages")
logger.log("logger infomation demo")

urls中pattern可以简写

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^$', "main.views.index"),
(r'^contact-us/$', "main.views.contact_us"),
)

可以简写为:
from django.conf.urls.defaults import *

urlpatterns = patterns('main.views',
(r'^$', "index"),
(r'^contact-us/$', "contact_us"),
)
pattern的第一个参数是一个前缀

Tuesday, July 22, 2008

Rasphone - Dial up Networking (RAS) - 已使用 Google 工具栏发送

Rasphone - Dial up Networking (RAS)


RASPHONE (Dial Up Networking)

Manage Remote Access Service (RAS) connections.
This is a part of the Dial-Up Networking service, typically used to connect a PC to an Internet Service Provider.

 Dial a RAS connection:
RASPHONE [-v] -f
PhoneBook_file
-d "
PhoneBook_entry
"

Hang up a RAS connection:
RASPHONE [-v] -f
PhoneBook_file
-h "
PhoneBook_entry
"

Display RAS Status dialogue box
RASPHONE -S

Other RAS options:
RASPHONE [-v] -f
PhoneBook_file

options
"
PhoneBook_entry
"

OPTIONS
-a : Add new PhoneBook entry
-e : Edit an existing PhoneBook entry
-c : Clone an existing PhoneBook entry
-r : Delete/remove an existing PhoneBook entry
-v : Disable - 'grey out' the option to rename the PhoneBook_entry

To use this command requires that Dial Up Networking Service be installed (via Control Panel - Networking)

The default location for PhoneBook entries is %SystemRoot%\System32\ras\

"Someone invented the telephone, And interrupted a nation's slumber, Ringing wrong but similar numbers" - Ogden Nash

Related Commands:

RASDIAL - Manage RAS connections
Connection Manager Administration Kit - VPN connections ( 2003 Resource Kit)
RASMON - Windows 2000 GUI Resource Kit tool
CHECKRAS - SMS support tools

apple store opened at 7.19

7.19正好同学来北京玩, 没空去参加apple的开业大典, 听apple店员说盛况空前啊, 7000多人, 鲁豫等人也去了,
总算是在apple开业第二天, 也就是周日得来空闲, 草草洗刷完毕, 吃完早饭, 就直奔三里屯village, 117路4站就到, 下车之后首先看到三里屯 village的主楼, 很酷的样子, 然后是adidas的大型卖场, 不知不觉往前边走, 抬眼一看, 竟然到了apple的后门! 竟然这样到了apple, 本来还打算好好找一通呢.
还好, 来的早, 人不是太多, 看了一通ipod, 试用了一下ipod touch之后, 就直奔主角而去 - macbook pro, 赞美之词就省了吧, 总想夸夸mb, 算了, 我也别说了, 怕一说就停不下来, 呵呵, 不知不觉就到了15点, 我也该回家了, 有空再来体验一下genius bar, 预约一个apple genius陪我聊聊pro..., 该睡觉了,
最后, 看看我用烂技术拍的艺术品: http://picasaweb.google.com/xlty.0512/Apple720

北京烤鸭, 哈好吃

    这次的烤鸭个够大, 三个人愣是没吃完, 多亏鸭架汤上的太慢, 我们及时给要了回来, 打包回家, 烤鸭子总是那么的好吃啊. 慢慢感觉到生活的意义了, 呵呵.
    有点怀念全聚德的鸭皮沾白糖了, 好吃!
    picasa地址, 看看我拍的烤鸭和美味:  http://picasaweb.google.com/xlty.0512/dtzfDL

Sunday, July 20, 2008

研究了一通数字的格式化方法, 原来有个Number(num).toLocaleString()

Number(34443243244).toLocaleString() -> "34,443,243,244"

获取dom元素的绝对位置

function getPosition(ele){
var nTop = ele.offsetTop;
var nLeft = ele.offsetLeft;
while((ele = ele.offsetParent)!=null)
{
nTop += ele.offsetTop;
nLeft += ele.offsetLeft;
}
return {top:nTop,left:nLeft}
}

从dom书中获取某个元素的绝对位置, 跨浏览器IE, Firefox

Tuesday, July 15, 2008

用js动态实现图片热区

代码如下:
<html>
<body>
<button onclick="init();">init</button>
<img src='20080319_96325f230767e6ac385beuTiIglWzzkf.png' border=0 usemap='#Map'>
<map name="Map" id="MAP"></map>
<div id="maskDIV"></div>
<script language="JavaScript">
var maskDiv;
function mask(param){
if (!maskDiv)
{
maskDiv = document.getElementById('maskDIV');
maskDiv.style.position='absolute';
maskDiv.style.backgroundColor="red";
//document.appendChild(maskDiv);
}
maskDiv.innerHTML=param.title;
maskDiv.style.left=param.left+"px";
maskDiv.style.top=param.top+"px";
}

function init(){
var oAREA = document.createElement('AREA');
oAREA.shape = 'rect';
oAREA.coords = '0,0,225,299';
oAREA.href = 'showcity.aspx?cityid=10600';
oAREA.alt = '北京市西城区';
oAREA.title = '北京市西城区';
oAREA.onmouseover=function(e){
mask({left:e.clientX,top:e.clientY,title: oAREA.title});
}
document.getElementById("MAP").appendChild(oAREA);
}
</script>
</body>
</html>

好了, 技术问题搞定, 剩下的就是你的发挥了!

Sunday, July 13, 2008

重写django的FilterSpec来实现filter tag的数据自定义

重写django的FilterSpec来实现filter tag的数据自定义, 注意FilterSpec的register始终将新加的test function和factory的tuple放到registered list的最后, 但是当FilterSpec查找model匹配的FilterSpec的时候是顺序遍历的, 所以当在FilterSpec中只要有一个test function返回True, 那么model就用这个, 就是说model一直用第一个匹配的FilterSpec, 所以就有了下边的insert_first_filter_spec.

from django.contrib.admin.filterspecs import FilterSpec

def insert_first_filter_spec(test,factory):
FilterSpec.filter_specs.insert(0,(test,factory))

class AdvancedChoicesFilterSpec(FilterSpec):
def __init__(self, f, request, params, model):
super(AdvancedChoicesFilterSpec, self).__init__(f, request, params, model)
self.lookup_kwarg = '%s__exact' % f.name

make models's field default value to default filter
self.lookup_val = request.GET.get(self.lookup_kwarg, None) or self.field.default

def choices(self, cl):
yield {'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': _('All')}
for k, v in self.field.choices:
yield {'selected': str(k) == self.lookup_val,
'query_string': cl.get_query_string({self.lookup_kwarg: k}),
'display': v}

replace choices tag factory
insert_first_filter_spec(lambda f: bool(f.choices), AdvancedChoicesFilterSpec)

吓了一跳

看了自己的博客更是吓了一跳, 完全没有主观思想, 就是技术和记录!

这只是一份工作而已, 不是么?

每天对着电脑, 我的生活早己离不开它, 思维也慢慢的变的computer, 每天一成不变的check and read -- email, feed, blog, 期望看到, 发现一些感兴趣的事务, 文章, 思想, 但是看到, 发现了之后呢, 就又变得像机器一样learn it, 慢慢补充自己的知识储备, 而生活也慢慢变的一成不变, 像机器一般的生活, 简直是一个"机器人"了.
直到长假后回公司的第一天, 这么久没有看到满屏显示的code, 异常兴奋, 下意识的去拿鼠标, 然手下一阵失落传来, 紧跟着就是大脑的一阵惊慌, where is my mouse? why i am so afraid? 那一刻忽然想起人们经常谈论的话题: 没有电脑我们该怎么办?
""没有硝烟中的scrum和xp"" 作者提到一句话:
哦, 最后请不要忘记......
这只是一份工作而已, 不是么?

Friday, July 11, 2008

兼容各浏览器的Flash播放器封装: swfobject.js

这里下载最新版的SWFObject:http://blog.deconcept.com/swfobject/swfobject_source.js

用它的好处主要有:
1.IE中没有讨厌的虚框问题了。
2.提供了完善的版本检测功能,如果版本不够则显示其他东西,比如图片或文字。
3.易于使用,只要在页面头加载一个 .js 文件,然后 HTML 写一个容器,里面放普通的文本或图片(用于无法显示 Flash 时显示),最后 用脚本来替换这个元素里面的内容为 Flash。
4.可以通过验证——当然这个不是重点,只是顺带效果罢了。

只需要包含 swfobject.js这个js文件,然后在DOM中插入一些简单的JS代码,就能嵌入Flash媒体资源了。 下面是一个最简单的范例:

<script type="text/javascript" src="swfobject.js"></script>

<div id="flashcontent">
This text is replaced by the Flash movie.
</div>

<script type="text/javascript">
var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
so.write("flashcontent");
</script>

"ago filter" / date tag filter - django snippet

from django import template
from StringIO import StringIO

register = template.Library()

@register.filter_function
def date_tag(path, tags):
"""
{{ "/recent/"|date_tag:"0,1,2,3" }}
"""
html = StringIO()
if path:
path = path.strip()
else:
path=""
tags = [x.strip() for x in tags.split(',')]
for tag in tags:
if tag == "0":
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,"today"))
elif tag == "1":
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,"yesterday"))
else:
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,tag+" days ago"))
return html.getvalue()

===================================
usage:
1. put this code to app/templatetags directory, named tags.py
2. load tags into template: {% load tags %}
3. use filter