Thursday, August 14, 2008

月满西楼

红藕香残玉簟秋
轻解罗裳 独上兰舟
云中谁寄锦书来
雁字回时 月满西楼
花自飘零水自流
一种相思 两处闲愁
此情无计可消除
才下眉头 却上心头

Friday, August 08, 2008

基于svn的cruise control config file

<?xml version="1.0" encoding="UTF-8"?>
<cruisecontrol>
<project name="test">
<bootstrappers>
<!-- 根据本地svn目录check -->
<svnbootstrapper localWorkingCopy="projects/${project.name}" username='yourname' password='yourpassword'/>
</bootstrappers>
<modificationset quietperiod="30">
<!-- 根据本地svn目录查找修改的代码文件 -->
<svn localWorkingCopy="projects/${project.name}" username='yourname' password='yourpassword'/>
</modificationset>
<schedule interval="300">
<!-- 定时构建, 标准ant -->
<ant buildFile="projects/${project.name}/build.xml" antHome="apache-ant-1.7.0" target='all'/>
</schedule>
<log>
<!-- 指定ant build log结果存放目录 -->
<merge dir="projects/${project.name}/target/test-results" />
</log>
<publishers>
<onsuccess>
<!-- 构建成功之后, 将bin移动到指定目录 -->
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar" />
</onsuccess>

<!-- htmlemail -->
<!-- email -->
</publishers>
<listeners />
</project>
</cruisecontrol>

Thursday, August 07, 2008

tomcat下单独设置某个app的access log

在project的META-INF目录下添加context.xml文件, 内容:
<Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="appname_localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false" buffered="false"/> </Context>
这样就能够单独设置某个app的access log了

如果把
这一段放到server.xml中, 那么就是记录所有app的access log:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="appname_localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false" buffered="false"/>

更详细的说明见文档
http://localhost:8080/docs/config/valve.html

Wednesday, August 06, 2008

Django ORM 中ForeignKey生成sql的方式

django根据model的name按照字母序升序排序, 然后依次生成sql, 例如有model A, B, C, 此时A外键引用B, C外键引用B, 则生成的sql即为:
create table app_a(...)
create table app_b(...)
create table app_c(...reference app_b(...))
alter table app_a add foreign key fkey_name reference app_b(...))

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)

吓了一跳

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