TS99AGENT里怎么尽可能少的减少20人团多少人公会拾取贡献啊

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
聚合物改性水泥砂浆性能的研究论文.pdf 95页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
你可能关注的文档:
(科 学学位 )
聚合 物 改性 水泥砂 浆性 能研 究
称 : 土木 工程 学 院
称 : 结 构 工 程
导师 姓 名 、职称 : 高丹 盈
2009 年 4 月 15
a ster D isserta tio n
S tu d y o n
th e P r o P ert ie s o f P o ly m
o d ified C em
S tru e加 r a l E n g in e er in g
o n g ta o
a ster C a n d id a te
S u P e r v lso r
P r o t G a o D a n y in g
Z h en gzh ou U n iv ersity
Z h en g z h o u ,4 5 0 0 0 1 ,P.R .C h in a
A P r il,2 0 0 9
郑州大学硕士学位论文
许 多在役 建 (构)筑物 常 因设计不合理 、施工不 当、运 营养护不得法等人 为 因素 , 以
及冰冻灾害 、老化等 自然 因素 ,产生 了不少 隐患 ,急待进行修 复加 固。
普通水泥基修复材料具有粘 结性较差 、脆性大等缺 点 ,而传 统聚合物水泥基 改性材
料粘性大 、施工性 能较差 、成本高且污染环境 。聚合物乳液 改性水泥基复合材料 以其和
易性好 、力学性 能高 、抗渗性好 、具有很 强 的耐酸 、碱 、盐腐蚀性 能 ,而被广泛应用 于
大坝 、公路桥涵 、码头 、停车场 、防水 、防腐等工程 中, 已成为重要 的非结构性补强材
料 。因此 ,本文对 聚合物 改性水泥砂浆进 行 了大量 的试验研 究 ,旨在 为其工程应用提供
鉴于修补加 固的效果主要取 决于新 旧两种材料 的粘 结性 能 ,故本文对 聚合物 改性水
泥砂浆 与混凝 土 的粘 结性 能进行 了系统 的试验研 究 。考虑 到聚丙烯 纤维具有许 多优 点 ,
在 工程 中应用 日渐增 多 ,也有许 多成功应 用 的工程 实例 ,本文对 聚 丙烯纤维聚合物 改性
水泥砂浆 的相关性 能也作 了试验研 究 ; 另外 ,本文还通过试 验 ,研 究 了对外加剂及矿物
填料对 聚合物 改性水泥砂浆性 能 的影 响 。
本文 的研 究思路及 内容包括 :
第 一 、选择合适 的聚合物 改性剂 :针对 目前工程 中应 用较 多 的两类 聚合物 改性乳液 :
(丙烯 酸酷共 聚乳液 ) 和水性环氧 改性 乳液 ,共 五个产 品,在 各 自推荐 的配合 比范
围 内进行 了试验研 究 。通过 不 同产 品的改性 水泥砂浆 力学性 能的 比较 分析 ,同时兼顾 方
正在加载中,请稍后... 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
铬(Ⅵ)试剂在无溶剂条件下选择性氧化醇的研究进展
下载积分:280
内容提示:铬(Ⅵ)试剂在无溶剂条件下选择性氧化醇的研究进展
文档格式:PDF|
浏览次数:4|
上传日期: 02:47:51|
文档星级:
全文阅读已结束,如果下载本文需要使用
 280 积分
下载此文档
该用户还上传了这些文档
铬(Ⅵ)试剂在无溶剂条件下选择性氧化醇的研究进展
关注微信公众号Command&line&for&Keep&Password.Usage:&&keepass.sh&-l&&keepass.sh&-e&plain-text&&keepass.sh&-d&encoded-text&&keepass.sh&-s&encoded-text&name-l展示保存下所有加密后的密码信息-e将明文密码, 加密, 密文自动保存到剪切板上-d将密文界面, 解密后的明文自动保存到剪切板上-s将密文持久化保存到文件中代码实现#!/bin/shDATA="$HOME/.password/data"declare&-a&passwordsfunction&enc(){&&&&#$1:&plain&text&&&&echo&"$1"&|&openssl&enc&-des&|&base64}function&dec(){&&&&#$1:&encoded&text&&&&echo&"$1"&|&base64&-D&|&openssl&enc&-des&-d}function&sync(){&&&&for&((loop=0;loop&${#passwords[*]};loop++))&&&&do&&&&&&&&if&[&-z&"${passwords[$loop]}"&];then&&&&&&&&&&&&continue&&&&&&&&fi&&&&&&&&value="$value\n${passwords[$loop]}"&&&&done&&&&echo&$value&&&$DATA}function&save(){&&&&#$1&encoded&password&&&&#$2&name&&&&for&((loop=0;&loop&${#passwords[*]};&loop++))&&&&do&&&&&&&&info=${passwords[$loop]}&&&&&&&&password=$(echo&$info&|&awk&'{print&$1}')&&&&&&&&name=$(echo&$info&|&awk&'{print&$2}')&&&&&&&&if&[&"$2"&==&"$name"&];then&&&&&&&&&&&&passwords[$loop]="$1&$2"&&&&&&&&&&&&return&&&&&&&&fi&&&&done&&&&passwords[$loop]="$1&$2"&&&&sync}function&delete(){&&&&#$1:&name&&&&for&((loop=0;&loop&${#passwords[*]};&loop++))&&&&do&&&&&&&&info=${passwords[$loop]}&&&&&&&&password=$(echo&$info&|&awk&'{print&$1}')&&&&&&&&name=$(echo&$info&|&awk&'{print&$2}')&&&&&&&&if&[&"$1"&==&"$name"&];then&&&&&&&&&&&&passwords[$loop]=""&&&&&&&&fi&&&&done&&&&sync}function&list(){&&&&for&((loop=0;loop&${#passwords[*]};loop++))&&&&do&&&&&&&&echo&${passwords[$loop]}&&&&done}function&help(){&&&&echo&"Command&line&for&Keep&Password.Usage:&&keepass.sh&-l&&keepass.sh&-e&plain-text&&keepass.sh&-d&encoded-text&&keepass.sh&-s&encoded-text&name"}function&init(){&&&&loop=0&&&&while&read&line&&&&do&&&&&&&&if&[&-z&"$line"&];then&&&&&&&&&&&&continue&&&&&&&&fi&&&&&&&&passwords[$loop]=$line&&&&&&&&loop=$(echo&$loop+1&|&bc)&&&&done&&&$DATA}initcase&"$1"&in&&&&-l)&&&&&&&&list&&&&&&&&;;&&&&-e)&&&&&&&&enc&"$2"&|&tr&-d&'\n'&|&pbcopy&&&&&&&&;;&&&&-d)&&&&&&&&dec&"$2"&|&tr&-d&'\n'&|&pbcopy&&&&&&&&;;&&&&-s)&&&&&&&&save&"$2"&"$3"&&&&&&&&;;&&&&-r)&&&&&&&&delete&"$2"&&&&&&&&;;&&&&*)&&&&&&&&help&&&&&&&&;;esac备注:1. 纯shell打造2. 目前支持Mac shell, 理论上支持linux系统(唯一的改动, 把pbcopy改成linux下剪切板复制的命令即可)
SCP限速逻辑实现--带中文注释的bandwidth_limit函数SCP支持限速, 通过-l参数, 指定拷贝的速度
&&&&&&&&&&&&&Limits&the&used&bandwidth,&specified&in&Kbit/s.
具体实现, 是在misc.c中的bandwidth_limit函数
下面附上带中文注释的bandwidth_limit函数代码&1&struct&bwlimit&{&2&&&&&size_t&&&&&&&&&&&&&&&&&&//&每次read的buf长度&3&&&&&u_int64_t&rate,&thresh,&&&//&rate:&&限速速率,&单位kpbs&4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&thresh:统计周期,read长度到了指定阈值,&触发限速统计&5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&lamt:&&一次统计周期内,&read了多少长度&6&&&&&struct&timeval&bwstart,&&//&bwstart:&统计周期之开始时间&7&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&bwend:&&&统计周期之结束时间&8&};&9&10&void&bandwidth_limit_init(struct&bwlimit&*bw,&u_int64_t&kbps,&size_t&buflen)11&{12&&&&&bw-&buflen&=&&&&&&&&&&&//&初始化read&buf长度13&&&&&bw-&rate&=&&&&&&&&&&&&&&&//&初始化限速速率14&&&&&bw-&thresh&=&bw-&&&&&&&&&//&初始化统计周期15&&&&&bw-&lamt&=&0;&&&&&&&&&&&&&&&&&//&初始化当前read长度16&&&&&timerclear(&bw-&bwstart);&&&&&//&初始化统计开始时间17&&&&&timerclear(&bw-&bwend);&&&&&&&//&初始化统计结束时间18&}19&20&void&bandwidth_limit(struct&bwlimit&*bw,&size_t&read_len)21&{22&&&&&u_int64_t&23&&&&&struct&timespec&ts,&24&25&&&&&//&设置统计开始时间,&为当前时间26&&&&&if&(!timerisset(&bw-&bwstart))&{27&&&&&&&&&gettimeofday(&bw-&bwstart,&NULL);28&&&&&&&&&return;29&&&&&}30&31&&&&&//&设置当前read长度32&&&&&bw-&lamt&+=&read_33&&&&&//&判断当前read长度是否到达统计周期的阈值34&&&&&if&(bw-&lamt&&&bw-&thresh)35&&&&&&&&&return;36&37&&&&&//&设置统计结束时间,为当前时间38&&&&&gettimeofday(&bw-&bwend,&NULL);39&&&&&//&bwend变量复用,&这个时候,&bwend含义为,&本次统计周期实际开销的时间:&既read&thresh长度字节,花了多少时间.40&&&&&timersub(&bw-&bwend,&&bw-&bwstart,&&bw-&bwend);41&&&&&if&(!timerisset(&bw-&bwend))42&&&&&&&&&return;43&44&&&&&//&将单位从Byte变成bit45&&&&&bw-&lamt&*=&8;46&&&&&//&根据限速速率,&计算理论应该花费多少时间47&&&&&waitlen&=&(double)1000000L&*&bw-&lamt&/&bw-&48&&&&&//&bwstart变量复用,&这个时候,&bwstart含义为,&本次统计周期理论开销的时间49&&&&&bw-&bwstart.tv_sec&=&waitlen&/&1000000L;50&&&&&bw-&bwstart.tv_usec&=&waitlen&%&1000000L;51&52&&&&&//&如果理论开销时间&&&&实际开销时间,&则需要做限速53&&&&&if&(timercmp(&bw-&bwstart,&&bw-&bwend,&&))&{54&&&&&&&&&//&bwend变量复用,&这个时间,&bwend含义为,&理论开销时间&和&实际开销时间的差值,&既需要sleep的时间,&确保达到限速到指定的rate值55&&&&&&&&&timersub(&bw-&bwstart,&&bw-&bwend,&&bw-&bwend);56&57&&&&&&&&&//&如果差值达到了秒级,&则需要降低统计周期阈值,&确保统计相对精确58&&&&&&&&&//&thresh变为原先的1/2,&但不能低于buflen的1/459&&&&&&&&&if&(bw-&bwend.tv_sec)&{60&&&&&&&&&&&&&bw-&thresh&/=&2;61&&&&&&&&&&&&&if&(bw-&thresh&&&bw-&buflen&/&4)62&&&&&&&&&&&&&&&&&bw-&thresh&=&bw-&buflen&/&4;63&&&&&&&&&}&64&&&&&&&&&//&如果差值小于10毫秒,&则需要加大统计周期阈值,&确保统计相对精确65&&&&&&&&&//&thresh变为原先的2倍,&但不能高于buflen的8倍66&&&&&&&&&else&if&(bw-&bwend.tv_usec&&&10000)&{67&&&&&&&&&&&&&bw-&thresh&*=&2;68&&&&&&&&&&&&&if&(bw-&thresh&&&bw-&buflen&*&8)69&&&&&&&&&&&&&&&&&bw-&thresh&=&bw-&buflen&*&8;70&&&&&&&&&}71&72&&&&&&&&&//&乖乖的睡一会吧,&以达到限速目的73&&&&&&&&&TIMEVAL_TO_TIMESPEC(&bw-&bwend,&&ts);74&&&&&&&&&while&(nanosleep(&ts,&&rm)&==&-1)&{75&&&&&&&&&&&&&if&(errno&!=&EINTR)76&&&&&&&&&&&&&&&&&break;77&&&&&&&&&&&&&ts&=&78&&&&&&&&&}79&&&&&}80&81&&&&&//&新的统计周期开始,&初始化lamt,&bwstart变量82&&&&&bw-&lamt&=&0;83&&&&&gettimeofday(&bw-&bwstart,&NULL);84&}
之前的文章,因为贴了效果图,导致无法编辑。
@see http://www.blogjava.net/stone2083/archive//407807.html
使用table,tr/td作为一个像素点,画点。
&2&import&sys,&optparse,&Image
&4&TABLE='&table&id="image"&border="0"&cellpadding="0"&cellspacing="0"&%s&/table&'
&5&TR='&tr&%s&/tr&'
&6&TD='&td&width="1"&height="1"&bgcolor="%s"/&'
&8&def&rgb2hex(rgb):
&9&&&&&return&'#{:02x}{:02x}{:02x}'.format(rgb[0],rgb[1],rgb[2])
11&def&get_image(name,&thumbnail=1):
12&&&&&if(thumbnail&&=&1&or&thumbnail&&=&0):&
13&&&&&&&&&return&Image.open(name)
14&&&&&else:
15&&&&&&&&&img&=&Image.open(name)
16&&&&&&&&&return&img.resize((int(img.size[0]&*&thumbnail),int(img.size[1]&*&thumbnail)))
18&def&convert(img):
19&&&&&trs&=&[]
20&&&&&for&height&in&xrange(img.size[1]):
21&&&&&&&&&tds&=&[]
22&&&&&&&&&for&width&in&xrange(img.size[0]):
23&&&&&&&&&&&&&tds.append(TD&%&rgb2hex(img.getpixel((width,&height))))
24&&&&&&&&&trs.append(TR&%&(''.join(tds)))
25&&&&&return&TABLE&%&(''.join(trs),)
27&parser&=&optparse.OptionParser('Usage:&%prog&[options]&image')
28&parser.add_option('-c',&'--compress',&dest='thumbnail',&default='1',&metavar='float',&help='specify&the&compress&value&(0,&1)')
29&parser.add_option('-o',&'--out',&dest='out',&default='out.html',&help='specify&the&output&file')
30&opts,&args&=&parser.parse_args()
32&if(len(args)&!=&1):&
33&&&&&parser.print_help()
34&&&&&sys.exit(-1)
36&html&=&open(opts.out,'w')
37&html.write(convert(get_image(args[0],&float(opts.thumbnail))))
38&html.close()
下载地址&/p/stonelab/downloads/detail?name=img2html.py#makechanges
&&&& 摘要: 介绍
img2html,将图片转成HTML格式。
用HTML来画图。
转成HTML后的效果(压缩1倍后的效果--主意:请查看html源码,这边没有src图片属性,全是通过html代码渲染)
pystack: python stack trace. 类似java中的jstack功能.
1. https://pypi.python.org/pypi/pdbx/0.3.0 下载, 或者直接通过easyinstall安装
2. python scripts中, pdbx.enable_pystack(); 开启pystack功能
3. kill -30 pid , 就可以打印stack信息了.&
"CP&Server&Thread-10"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-9"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-1"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-7"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-4"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-2"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"MainThread"&tid=432
&&&&at&app.run()(raspctl.py:173)
&&&&at&return&wsgi.runwsgi(self.wsgifunc(*middleware))(application.py:313)
&&&&at&return&httpserver.runsimple(func,&validip(listget(sys.argv,&1,&'')))(wsgi.py:54)
&&&&at&server.start()(httpserver.py:157)
&&&&at&self.tick()(__init__.py:1765)
&&&&at&s,&addr&=&self.socket.accept()(__init__.py:1800)
&&&&at&sock,&addr&=&self._sock.accept()(socket.py:202)
&&&&at&pystack()(pdbx.py:181)
&&&&at&for&filename,&lineno,&_,&line&in&traceback.extract_stack(stack):(pdbx.py:169)
"CP&Server&Thread-5"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-8"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-3"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
"CP&Server&Thread-6"&tid=
&&&&at&self.__bootstrap_inner()(threading.py:525)
&&&&at&self.run()(threading.py:552)
&&&&at&conn&=&self.server.requests.get()(__init__.py:1367)
&&&&at&self.not_empty.wait()(Queue.py:168)
&&&&at&waiter.acquire()(threading.py:244)
def&pystack():
&&&&for&tid,&stack&in&sys._current_frames().items():
&&&&&&&&info&=&[]
&&&&&&&&t&=&_get_thread(tid)
&&&&&&&&info.append('"%s"&tid=%d'&%&(t.name,&tid))
&&&&&&&&for&filename,&lineno,&_,&line&in&traceback.extract_stack(stack):
&&&&&&&&&&&&info.append('&&&&at&%s(%s:%d)'&%&(line,&filename[filename.rfind('/')&+&1:],&lineno))
&&&&&&&&print&'\r\n'.join(info)
&&&&&&&&print&''
def&_get_thread(tid):
&&&&for&t&in&threading.enumerate():
&&&&&&&&if&t.ident&==&tid:
&&&&&&&&&&&&return&t
&&&&return&None
def&_pystack(sig,&frame):
&&&&pystack()
def&enable_pystack():
&&&&signal.signal(signal.SIGUSR1,&_pystack)有需要的朋友,赶紧拿走吧.
懒惰,直接上代码,用法见JAVA DOC.& 1&package&com.alibaba.stonelab.javalab.jvm.&&2&&&3&import&java.lang.instrument.I&&4&import&java.lang.reflect.A&&5&import&java.lang.reflect.F&&6&import&java.lang.reflect.M&&7&import&java.util.IdentityHashM&&8&import&java.util.M&&9&import&java.util.S&10&&11&/**&12&&*&&pre&&13&&*&1.&MANIFEST.MF&14&&*&&&&&&Premain-Class:&xxx.yyy.zzz.JavaSizeOf&15&&*&&16&&*&2.&MAIN.JAVA&17&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&ConcurrentHashMap&Object,&Object&()));&18&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&String("1234567")));&19&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&String("1234")));&20&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&Object()));&21&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&int[]&{&1,&2,&3&}));&22&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(new&CopyOnWriteArrayList&Object&()));&23&&*&&&&&&&&&System.out.println(JavaSizeOf.sizeof(null));&24&&*&&&&&&&&&&25&&*&3.&USAGE:&26&&*&&&&&&java&-javaagent:sizeof.jar&xxx.yyy.zzz.Main&27&&*&&/pre&&28&&*&&29&&*&@author&&a&href="mailto:li.jinl@"&Stone.J&/a&&&30&&*/&31&public&class&JavaSizeOf&{&32&&33&&&&&private&static&Instrumentation&&34&&35&&&&&public&static&void&premain(String&agentArgs,&Instrumentation&inst)&{&36&&&&&&&&&JavaSizeOf.inst&=&&37&&&&&}&38&&39&&&&&/**&40&&&&&&*&get&size&of&java&object.&41&&&&&&*&&42&&&&&&*&@param&o&43&&&&&&*&@return&44&&&&&&*/&45&&&&&public&static&long&sizeof(Object&o)&{&46&&&&&&&&&assert&inst&!=&null;&47&&&&&&&&&Map&Object,&Object&&visited&=&new&IdentityHashMap&Object,&Object&();&48&&&&&&&&&Stack&Object&&visiting&=&new&Stack&Object&();&49&&&&&&&&&visiting.add(o);&50&&&&&&&&&long&size&=&0;&51&&&&&&&&&while&(!visiting.isEmpty())&{&52&&&&&&&&&&&&&size&+=&analysis(visiting,&visited);&53&&&&&&&&&}&54&&&&&&&&&return&&55&&&&&}&56&&57&&&&&/**&58&&&&&&*&analysis&java&object&size&recursively.&59&&&&&&*&&60&&&&&&*&@param&visiting&61&&&&&&*&@param&visited&62&&&&&&*&@return&63&&&&&&*/&64&&&&&protected&static&long&analysis(Stack&Object&&visiting,&Map&Object,&Object&&visited)&{&65&&&&&&&&&Object&o&=&visiting.pop();&66&&&&&&&&&if&(skip(o,&visited))&{&67&&&&&&&&&&&&&return&0;&68&&&&&&&&&}&69&&&&&&&&&visited.put(o,&null);&70&&&&&&&&&//&array.&71&&&&&&&&&if&(o.getClass().isArray()&&&&!o.getClass().getComponentType().isPrimitive())&{&72&&&&&&&&&&&&&if&(o.getClass().getName().length()&!=&2)&{&73&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&Array.getLength(o);&i++)&{&74&&&&&&&&&&&&&&&&&&&&&visiting.add(Array.get(o,&i));&75&&&&&&&&&&&&&&&&&}&76&&&&&&&&&&&&&}&77&&&&&&&&&}&78&&&&&&&&&//&object.&79&&&&&&&&&else&{&80&&&&&&&&&&&&&Class&?&&clazz&=&o.getClass();&81&&&&&&&&&&&&&while&(clazz&!=&null)&{&82&&&&&&&&&&&&&&&&&Field[]&fields&=&clazz.getDeclaredFields();&83&&&&&&&&&&&&&&&&&for&(Field&field&:&fields)&{&84&&&&&&&&&&&&&&&&&&&&&if&(Modifier.isStatic(field.getModifiers()))&{&85&&&&&&&&&&&&&&&&&&&&&&&&&continue;&86&&&&&&&&&&&&&&&&&&&&&}&87&&&&&&&&&&&&&&&&&&&&&if&(field.getType().isPrimitive())&{&88&&&&&&&&&&&&&&&&&&&&&&&&&continue;&89&&&&&&&&&&&&&&&&&&&&&}&90&&&&&&&&&&&&&&&&&&&&&field.setAccessible(true);&91&&&&&&&&&&&&&&&&&&&&&try&{&92&&&&&&&&&&&&&&&&&&&&&&&&&visiting.add(field.get(o));&93&&&&&&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{&94&&&&&&&&&&&&&&&&&&&&&&&&&assert&false;&95&&&&&&&&&&&&&&&&&&&&&}&96&&&&&&&&&&&&&&&&&}&97&&&&&&&&&&&&&&&&&clazz&=&clazz.getSuperclass();&98&&&&&&&&&&&&&}&99&&&&&&&&&}100&&&&&&&&&return&inst.getObjectSize(o);101&&&&&}102&103&&&&&/**104&&&&&&*&&pre&105&&&&&&*&skip&statistics.106&&&&&&*&&/pre&107&&&&&&*&108&&&&&&*&@param&o109&&&&&&*&@param&visited110&&&&&&*&@return111&&&&&&*/112&&&&&protected&static&boolean&skip(Object&o,&Map&Object,&Object&&visited)&{113&&&&&&&&&if&(o&instanceof&String)&{114&&&&&&&&&&&&&if&(o&==&((String)&o).intern())&{115&&&&&&&&&&&&&&&&&return&true;116&&&&&&&&&&&&&}117&&&&&&&&&}118&&&&&&&&&return&o&==&null&||&visited.containsKey(o);119&&&&&}120&121&}122&
rpdb更名为pdbx,发布到pypi
软件已更新,最新请查看:/p/stonelab/wiki/pdbx原文:/p/stonelab/wiki/RemotePDB
rpdb:远程PDB调试工具,是对pdb的扩展。&
在pdb基础上,做了功能加强,主要特性如下:
1. 兼容pdb一切语法和使用习惯&
2. 增加了远程调试功能, 允许你客户端通过telnet连接到指定调试端口,进行远程调试&
3. 增加了rq/rquit命令,支持安全退出模式,避免默认的quik会导致python程序异常退出的情况&
4. 允许多次调试&
5. 增加suspend模式,在启动时强制或者非强制进入断点&
软件已更新,最新请查看:/p/stonelab/wiki/pdbx软件介绍rpdb扩展了pdb,让pdb支持远程调试功能。使用了rpdb的python脚本在远程启动,本地通过telnet方式连接上rpdb提供的调试端口,接下来的操作和本地完全一致。使用说明下载wget&&有两个文件:rpdb.py:扩展pdb的类库; example.py 演示程序安装将rpdb.py拷贝到PYTHONPATH即可,或者直接拷贝rpdb.py上内容到你的python脚本即可(程序非常小巧,30+代码行)演示pdb = Rpdb() & & & & # 类似于pdb=Pdb()pdb = Rpdb(8787) # 指定远程调试端口号pdb.set_trace() #设置断点如example.py中程序:#!/usr/bin/pythonfrom rpdb import Rpdbfrom random import randintfrom time import sleepdef add(i, j):& & r = i + j& & return rdef main():& & pdb = Rpdb()& & # pdb = Rpdb(9999) # debug port:9999& & pdb.set_trace()& & while True:& & & & i = randint(1,10)& & & & j = randint(1,10)& & & & r = add(i, j)& & & & print r& & & & sleep(1)if __name__ == '__main__':& & main()本地终端输入: telnet xxx.xxx.xxx.xxx 8787telnet 127.0.0.1 8787Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.& /Users/stone/Tmp/baidu/rpdb/example.py(15)main()-& while True:(Pdb) l &10 & & &11 & & def main():&12 & & & & pdb = Rpdb()&13 & & & & # pdb = Rpdb(9999) # debug port:9999&14 & & & & pdb.set_trace()&15&-& & & while True:&16 & & & & & & i = randint(1,10)&17 & & & & & & j = randint(1,10)&18 & & & & & & r = add(i, j)&19 & & & & & & print r&20 & & & & & & sleep(1)(Pdb) n& /Users/stone/Tmp/baidu/rpdb/example.py(16)main()-& i = randint(1,10)(Pdb) b 19Breakpoint 1 at /Users/stone/Tmp/baidu/rpdb/example.py:19(Pdb) c& /Users/stone/Tmp/baidu/rpdb/example.py(19)main()-& print r(Pdb) p r11(Pdb) qConnection closed by foreign host.操作和pdb完全一致。PDB常用命令命令介绍h(elp) command输入h或者help 列出pdb支持的所有命令, h command&介绍指定命令w(here)列出当前调试所在行,一般会使用 l(ist)l(ist) [first[, last]]列出源代码信息s(tep)进入函数体n(ext)执行下一行代码c(ont(inue))继续,直到遇到下一个断点r(eturn)执行到函数体结束那行b(reak)设置断点,可以是代码行号,方法名, 还可以加进入条件tbreak设置临时断点,进入一次后,自动消失cl(ear)取消断点disable让断点失效enable让断点生效ignore忽略断点n次condition给断点添加条件,符合条件的才进入断点j(ump) lineno跳掉指定行a(rgs)打印函数体参数信息p expression打印变量pp expression同上,打印得漂亮一些! statement执行代码,非常有用,可用来修改变量值q(uit)退出调试(pdb的quit很黄很暴力)
自己写的几个小工具,分享给需要的人:/p/stonelab/wiki/BaiduMp3百度MP3批量下载工具/p/stonelab/wiki/FileConvertor文件编码转换工具/p/stonelab/wiki/MyZip扩展zip命令,支持文件名编码/p/stonelab/wiki/Translate命令行下的翻译软件/p/stonelab/wiki/HostsX扩展Hosts,别名DnsProxy,DNS代理服务
原文:/p/stonelab/wiki/BaiduMp3软件介绍,基于命令行下的百度MP3歌曲批量下载工具。主要支持功能:搜索 根据关键词搜索匹配的歌曲下载 根据搜索出来的歌曲ID,下载到本地指定目录批量下载 根据关键词,批量下载匹配的歌曲,到本地指定目录软件使用下载wget&mv baidump3-0.9.0.py baidump3.pychmod +x ./baidump3.py命令参数介绍Usage: baidump3.py [options]Options:& -h, --help & & & & & &show this help message and exit& -m MODE, --mode=MODE &specifies the command mode& & & & & & & & & & & & [list|download|multidownload]& -o OUTPUT, --output=OUTPUT& & & & & & & & & & & & specifies the output dir for download& -p PAGE, --page=PAGE &specifies the list page& -k KEY, --key=KEY & & specifies the mp3 keyworld& -f FROMPAGE, --from=FROMPAGE& & & & & & & & & & & & specifies the from page for multidownload& -t TOPAGE, --to=TOPAGE& & & & & & & & & & & & specifies the end page for multidownload搜索通过-m list指定为搜索模式 -k参数指定搜索关键词,-p关键词指定分页页面号,默认一页显示20条数据。比如:./baidump3.py -m list -k 70后 -p 2&效果:./baidump3.py -m list -k 70后 -p 2Total: 1000 Page:21007797&刘若英 & & & & & & & & & 为爱痴狂2067170&姜育恒 & & & & & & & & & 别让我一个人醉209442 & &彭佳慧 & & & & & & & & & 相见恨晚2121730&杨钰莹,毛宁 & & & & & & & &心雨216206 & &许美静 & & & & & & & & & 蔓延226444 & &陈淑桦 & & & & & & & & & 问253833 & &张学友 & & & & & & & & & 秋意浓274172 & &张学友 & & & & & & & & & 三天两夜580824 & &孟庭苇 & & & & & & & & & 伤了你的心的我伤心582858 & &莫文蔚 & & & & & & & & & 电台情歌650924 & &姜育恒 & & & & & & & & & 其实我真的很在乎7274415&满文军 & & & & & & & & & 我需要你7277793&林志炫 & & & & & & & & & 单身情歌7280177&林志炫 & & & & & & & & & 离人7302437&李寿全 & & & & & & & & & 张三的歌844889 & &陈淑桦 & & & & & & & & & 流光飞舞1039139&王菲 & & & & & & & & & &容易受伤的女人1243712&罗大佑 & & & & & & & & & 恋曲19802076242&李宗盛 & & & & & & & & & 我是一只小小鸟2121739&杨钰莹 & & & & & & & & & 轻轻的告诉你下载通过-m download指定为下载模式 -k参数指定下载歌曲ID号 -o参数指定下载路径,默认为当前目录。比如:./baidump3.py -m download -k 1007797 -o ~/Tmp/&效果:Downloading &&& 为爱痴狂.mp3批量下载通过-m multidownload指定为批量下载模式 -k参数指定歌曲关键词, -o参数指定下载路径(默认位为当前目录), -f参数指定下载开始页面(默认为第一页), -t参数指定下载结束页面(默认为搜索到的最后一页)比如:./baidump3.py -m multidownload -k 70后 -o ~/Tmp/baidu -f 2 -t 3&效果:&MultiDownloading Page 2Downloading &&& 为爱痴狂.mp3Downloading &&& 别让我一个人醉.mp3Downloading &&& 相见恨晚.mp3Downloading &&& 蹇冮洦.mp3Downloading &&& 蔓延.mp3Downloading &&& 问.mp3Downloading &&& 秋意浓.mp3Downloading &&& 三天两夜.mp3Downloading &&& 伤了你的心的我伤心.mp3Downloading &&& 电台情歌.mp3Downloading &&& 其实我真的很在乎.mp3Downloading &&& 鎴戦渶瑕佷綘.mp3Downloading &&& 单身情歌.mp3Downloading &&& 离人.mp3Downloading &&& 张三的歌.mp3Downloading &&& 流光飞舞.mp3Downloading &&& 容易受伤的女人.mp3Downloading Fail.Downloading &&& 我是一只小小鸟.mp3Downloading &&& 轻轻的告诉你.mp3MultiDownloading Page 3Downloading &&& 孟婆汤.mp3Downloading &&& 情书.mp3Downloading &&& 橄榄树.mp3Downloading &&& 选择.mp3Downloading &&& 结束不是我要的结果.mp3Downloading &&& 鍛抽亾.mp3Downloading &&& 来生缘.mp3Downloading &&& 相思风雨中.mp3Downloading &&& 你我的爱只能擦肩而过.mp3Downloading &&& 忘情水.mp3Downloading &&& 爱如潮水.mp3Downloading &&& 特别的爱给特别的你.mp3Downloading &&& 千千阙歌.mp3Downloading &&& 涛声依旧.mp3Downloading &&& Hotel California.mp3Downloading &&& Roll Away The Stone.mp3Downloading &&& Peace Train.mp3Downloading &&& Have You Never Been Mellow.mp3Downloading &&& Hot Stuff.mp3Downloading &&& Rock The Boat.mp3备注: 有小概率会出现乱码,以及小小概率出现下载失败。
增加网络视频播放功能:
使用百度视频搜索
支持优酷,迅雷看看,PPS,乐视,CNTV,电影网,风行网视频
主要功能界面:
转自:/p/stonelab/wiki/RaspCTLCOPY过来格式比较乱,将就地看吧。原文直接看googlecode wiki吧 :)什么是RaspCTL
RaspCTL是Raspberry Pi和Control字母的组合,表示树莓派控制端。 RaspCTL是一款通过手机终端(泛义上包括手机,平板,电脑等设备)控制的软件。
目前,通过Raspberry&RaspCTL组合,打造成家庭多媒体播放机顶盒,在此场景中,RaspCTL非常类似平台。未来,会不断扩展RaspCTL功能,成为控制家庭物联网的设备中心,比如控制摄像头,空调开关等。此乃后话,按下不表。
为什么选择Raspberry Pi&RaspCTL为什么选择Raspberry Pi
我们先来看看Raspberry Pi的相关参数:
700 MHz, ARM1176JZF-S
GPU(显卡)
Broadcom VideoCore&IV,OpenGL ES 2.0, 1080p30 h.264/MPEG-4 AVC high-profile decoder
MEM(内存)
1*SD口 2*USB口 1*音频口 1*HDMI口 1*网卡
85.6 x 53.98 x 17mm (一张信用卡大小)
好吧,一起来总结下Raspberry Pi的优势吧
小巧:只有一张信用卡大小
GPU强悍: 硬解1080P,30帧/S,通俗地将,差不多是iphone4S手机的2倍性能
输出接口丰富: 包括2*USB,1*HDMI
性价比高:$35
从这些特性看,Raspberry非常合适充当高清视频播放机顶盒,来替代目前的华数机顶盒(华数官方垄断,费用高,质量差)。 家庭中,只要购置了Raspberry Pi和宽带,高清电影电视,免费看。 :)
为什么选择RaspCTL
只有一个原因:Raspberry Pi CPU很弱:700MHZ。 同样,我们来看一组数据:
Raspbian Terminal下 CPU LOAD在0.2左右
Raspbian XWindows下, CPU占用率差不多在70%以上
下,CPU占用率在95%以上如果,Raspberry Pi CPU能强悍那么一点点,那么XBian一定是首选,我也不会重新创造RaspCTL这个轮子了。只是目前,XBMC在Raspberry Pi(XBian)上的性能太糟糕了。 从数据看,只有在Raspbian Terminal下的性能,才能符合用户的期望,所以作者编写了RaspCTL这个控制端。通过手机终端的界面,来操作Raspbian Terminal,实现多媒体播放的功能。
RaspCTL(V0.1.0)功能特性
支持视屏,音频播放
支持播放,暂停,停止,快进,快退,播放列表,上一首,下一首等
支持本地文件查看
查看多媒体文件
配置系统信息
配置多媒体文件根路径等
视频网站真实URL分析
支持包括优酷,土豆,迅雷,百度等82个网站视频URL分析
制定Plugins规范
可非常方便开发RaspCTL Pugin
使用者文档
如何安装RaspCTL
下载,解压到指定目录
或者直接使用svn地址: svn co&&RaspCTL
安装RaspCTL
chmox +x bin/install. bin/install.sh
会自动安装RaspCTL依赖的第三方库,主要是python-webpy python-jinja2 python-pexpect依赖
如何使用RaspCTL
启动RaspCTL服务
bin/start.sh
启动后,在你手机浏览器上输入:
&配置你树莓派上本地多媒体文件根目录
&进入播放器
点击添加,选择本地多媒体文件
点击播放,暂停等功能
关闭RaspCTL服务
bin/shutdown.sh
Q:如何自启动RaspCTL服务
将 bin/start.sh 配置到树莓派的/etc/rc.local exit之前。 同理,你在rc.local中可以启动其他任何服务;
Q:如何使用80端口
debian系统禁用了小于1024的端口,所以RaspCTL只有使用8000端口。可以通过iptable将80端口请求转发到8000端口: iptables -t nat -A PREROUTING -p tcp --dport 81 -j REDIRECT --to-ports 8080
开发者文档
播放,可以指定播放列表中任一一个资源
快退, 快退30秒, 参数为True的话,快退10分钟
快进, 快进30秒,参数为True的话,快进10分钟
播放上一首
播放下一首
set_playlist
设置播放列表
add_playitem
添加多媒体资源到播放列表中, 参数为 ('url', 'name') 资源地址, 资源显示名
del_playitem
清空播放列表
sort_playitem
播放列表排序
设置输出设备, hdmi接口 或者 本地音频接口
设置播放模式:顺序,循环
获取播放器信息,如播放状态等
get_mediapath
获得多媒体文件根目录路径
获取一个目录下的所有资源
递归获取一个目录下的所有资源
获取f中的配置信息
更新f中的配置信息
获取网站url对应的真实视屏url地址信息, fmt=high 获取高清视屏地址
使用Ajax的目的:为了RaspCTL提供的服务可以同时被WAP, Android APP, IOS APP使用,RaspCTL服务均以Ajax形式提供。希望Plugins开发者也遵照这个规约,但不强制。
类库中,只要被标志@classmethod的方法,会直接暴露成Ajax服务,如:
class Foo:
& & @classmethod
& & def hello(cls, arg1, arg2):
& & & & return {msg: 'Hello Ajax[%s %s]' % (arg1, arg2)}
Ajax服务地址为:http://xxx.xxx.xxx.xxx:8000/api?data={"name":"Foo.hello", "args":["stone2083", "connie2083"]} 服务信息为:
& status: "Success",
& message: "Success",
& & args: [ ],
& & name: "Foo.hello"
& result: {
& & msg: "Hello Ajax[stone2083 connie2083]"
Plugins规范
youku --& 插件名字
& & __init__.py --& 插件程序
& & index.html --& 插件模板 【可选择】
init.py 内容为:
from rasplib import Plugin
& & '/', 'Index',
# 必须创建plugin实例,参数分别为插件名,作者名,版本号, 支持功能的urls
#其中,plugin中包含RaspCTL类库的所有方法,可直接调用
plugin = Plugin('youku','stone2083', '0.1', urls)
#web.py写法,插件规范并不引入新的学习成本。
class Index:
& & def GET(self):
& & & & return 'youku-NotSupported.' &#可以直接输出
& & & & #return plugin.render.index() &#可以渲染某个模板信息
RaspCTL作者联系信息: 程序的任何问题可直接联系这个邮箱
招募UED设计前端界面 0.1.0前端非常糟糕,急待重构
招募Plugin开发者,丰富RaspCTL
期待小白鼠适用RaspCTL
感谢limodou,Felinx Lee,获得了一个SAE Python邀请码。
首次倒腾SAE,不熟悉,瞎搞,第一件干的事情,就是尝试如何让SAE支持web.py.
1. svn check out
svn co&/stone2083 sae
2. 创建版本目录
3. copy web.py目录到当前目录
scp -r /usr/share/pyshared/web web
4. 编写正常的webpy应用代码
vi webpy.py&
&1&import&web
&3&urls&=&(
&4&&&&&'/',&'Home',
&7&class&Home:
&8&&&&&def&GET(self):
&9&&&&&&&&&web.header('Content-Type',&'text/html')
10&&&&&&&&&return&'Hello&Web.py'
12&app&=&web.application(urls,&globals())
5. 编写index.wsgivi index.wsgi1&import&sae2&from&webpy&import&app3&application&=&sae.create_wsgi_app(app.wsgifunc())整体目录结构如下:搞定:
背景之前利用笨重的Java写过内网访问程序(SSL双向认证系统),今天才发现curl等命令对SSL都有良好的支持。故记录相关点滴。创建CA根证书
#创建ca私钥
openssl genrsa -out ca.key
#创建证书请求文件(Certificate Secure Request)openssl req -new -key ca.key -out ca.csr
#创建CA根证书
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
创建服务器证书
#创建服务器私钥
openssl genrsa -out server.key
#创建服务器证书请求文件openssl req -new -key server.key -out server.csr
#创建服务器证书
openssl ca -in server.csr -cert ca.crt -keyfile ca.key -out server.crt
PFX证书转换
#pfx格式证书导出成pem格式证书
openssl pkcs12 -in jinli.pfx -nodes -out jinli.pem
openssl rsa -in jinli.pem -out jinli.key
#导出证书,公钥
openssl x509 -in jinli.pem -out jinli.crt
curl访问HTTPS命令
curl -E jinli.pem:${password} --cacert ca.crt ./
curl --cacert gmail.pem /mail
curl --cert jinli.crt --key jinli.key --cacert ca.crt ./
参数解释:
& & --cacert&&file&&CA&certificate&to&verify&peer&against&(SSL)
&&&&--capath&&directory&&CA&directory&to&verify&peer&against&(SSL)
&-E/--cert&&cert[:passwd]&&Client&certificate&file&and&password&(SSL)
&&&&--cert-type&&type&&Certificate&file&type&(DER/PEM/ENG)&(SSL)
&&&&--key&&key&&&&&&Private&key&file&name&(SSL/SSH)
&&&&--key-type&&type&&Private&key&file&type&(DER/PEM/ENG)&(SSL)
python访问HTTPS代码
from&httplib&import&HTTPSConnection
con&=&HTTPSConnection('.',&cert_file='jinli.pem')
con.connect()
con.request('GET',&'/xxx')
res&=&con.getresponse()
print&res.status
print&res.read()
res.close()
con.close()
python查看证书信息代码
from OpenSSL import cryptox509&=&crypto.load_certificate(crypto.FILETYPE_PEM,&open('cert_file').read())
print&x509.get_issuer()
pkcs&=&crypto.load_pkcs12(open(pkcs_file).read(),passphrase)
print&pkcs.get_certificate().get_issuer()
HTTPSConnection不理解的地方&
def&wrap_socket(sock,&keyfile=None,&certfile=None,
&&&&&&&&&&&&&&&&server_side=False,&cert_reqs=CERT_NONE,
&&&&&&&&&&&&&&&&ssl_version=PROTOCOL_SSLv23,&ca_certs=None,
&&&&&&&&&&&&&&&&do_handshake_on_connect=True,
&&&&&&&&&&&&&&&&suppress_ragged_eofs=True,&ciphers=None):
&&&&return&SSLSocket(sock,&keyfile=keyfile,&certfile=certfile,
&&&&&&&&&&&&&&&&&&&&&server_side=server_side,&cert_reqs=cert_reqs,
&&&&&&&&&&&&&&&&&&&&&ssl_version=ssl_version,&ca_certs=ca_certs,
&&&&&&&&&&&&&&&&&&&&&do_handshake_on_connect=do_handshake_on_connect,
&&&&&&&&&&&&&&&&&&&&&suppress_ragged_eofs=suppress_ragged_eofs,
&&&&&&&&&&&&&&&&&&&&&ciphers=ciphers)
ssl wrap的函数是支持ca_certs参数的,但是HTTPSConnection不支持ca_certs参数class&HTTPSConnection(HTTPConnection):&&&&&&&&"This&class&allows&communication&via&SSL."&&&&&&&&default_port&=&HTTPS_PORT&&&&&&&&def&__init__(self,&host,&port=None,&key_file=None,&cert_file=None,&&&&&&&&&&&&&&&&&&&&&strict=None,&timeout=socket._GLOBAL_DEFAULT_TIMEOUT,&&&&&&&&&&&&&&&&&&&&&source_address=None):&&&&&&&&&&&&HTTPConnection.__init__(self,&host,&port,&strict,&timeout,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&source_address)&&&&&&&&&&&&self.key_file&=&key_file&&&&&&&&&&&&self.cert_file&=&cert_file&&&&&&&&def&connect(self):&&&&&&&&&&&&"Connect&to&a&host&on&a&given&(SSL)&port."&&&&&&&&&&&&sock&=&socket.create_connection((self.host,&self.port),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&self.timeout,&self.source_address)&&&&&&&&&&&&if&self._tunnel_host:&&&&&&&&&&&&&&&&self.sock&=&sock&&&&&&&&&&&&&&&&self._tunnel()&&&&&&&&&&&&self.sock&=&ssl.wrap_socket(sock,&self.key_file,&self.cert_file)
我不想列“精通xxx...熟悉xxx”,只要求,如果您:有2年或以上java实际开发经验 或1年以上java实际开发经验但技术能力较强就能直接联系我:1. 直接在此帖留言2. Email:stone2083&#3. MSN:stone2083&#im沟通我们可以谈简历的事情,走内部推荐,1.电面2.来杭面试,流程简单,全程报销路费;P.S. 年初,各大公司招聘旺季,阿里巴巴这里呢,我不想说有多好,但也绝对不算差,最实际的,薪酬待遇,各大公司基本保密,但其实业内人士大多心里也有数,秘而不宣;所以,待遇方面不用过多担心,请诸君仔细斟酌,欢迎联系!P.S.II 为什么我这招聘帖这么简单呢?其实你懂的,“精通xxx熟悉xxx”那只是吓唬小菜的,对“高级java开发工程师”而言没有意义,我们需要的只是充分沟通、im沟通+当面沟通。在这个有点糟糕的时代,我们人人都不仅需要money,也需要平台与机遇,更需要个人修为与成长!请给阿里和您自己一个机会,谢谢!请管理员手下留情,如果非要删除,请先联系我下。让我能拷贝下这些文字先!谢谢
一直在网上听说web.py性能比较差,TPS才几十个。这个道听途说让我一度放弃了web.py。
对比了一圈python web framework后,还是让我对web.py的simple和它的设计理念念念不忘。
机型:ThinkPad R400 笔记本
CPU:Intel(R) Core(TM)2 Duo CPU & & P8700 &@ 2.53GHz
系统:Ubuntu11.04 32位操作系统
备注:服务器上没有python环境,所以只拿个人电脑做测试。
输出当前时间信息
1. &%= new Date() %&
2. time.ctime()
对比测试数据
平均响应时间
Tomcat6 + JDK6
CherryPy + Webpy
CherryPy + Webpy
Lighttpd + Flup(FCGI) + Webpy
Lighttpd + Flup(FCGI) + Webpy
1. webpy自带的CherryPy服务器性能也比传说的强多了,只是难以支撑高并发的请求。也难怪,本来就是一个用于开发的服务器,也不能要求太多;
2. Flup(FCGI)下,TPS达到1500左右,完全能够支撑一般应用的运营要求了;
3. 在专业服务器下,webpy fcgi tps自信能达到4-5k左右。足够了;
4. 和Java相比,确实存在一定差距,但是在开发效率上,远远快于Java;
5. web.py成为我日后web开发首选;
6. 凡事不要道听途说,需要眼见为实。附上测试报告图片:
Http协议之Byte Range&(14.35章节)&#&encoding:utf8&2&#!/usr/bin/env&python&3&import&socket&4&import&threading&5&import&sys&6&&7&headers&=&'''&8&HEAD&/&HTTP/1.1&9&Host:&%s10&Range:&bytes=%s11&Accept:&text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.812&13&'''14&15&#fragment&count&and&loop&count16&COUNT&=&150017&#concurrent&count18&PARALLEL&=&5019&PORT&=&8020&21&def&req(server):22&&&&&try:23&&&&&&&&&s&=&socket.socket(socket.AF_INET,&socket.SOCK_STREAM)24&&&&&&&&&s.connect((server,&PORT))25&&&&&&&&&s.send(headers&%&(server,&fragment(COUNT)))26&&&&&&&&&s.close()27&&&&&except:28&&&&&&&&&print&'Server&Seems&Weak.&Please&Stop.'29&30&def&fragment(n):31&&&&&ret&=&''32&&&&&for&i&in&xrange(n):33&&&&&&&&&if&i&==&0:34&&&&&&&&&&&&&ret&=&ret&+&'0-'&+&str(i&+&1)35&&&&&&&&&else:36&&&&&&&&&&&&&ret&=&ret&+&',0-'&+&str(i&+&1)37&&&&&return&ret38&39&def&run(server):40&&&&&for&_&in&xrange(COUNT):41&&&&&&&&&req(server)42&43&if&len(sys.argv)&!=&2:44&&&&&print&'killer.py&$server'45&&&&&sys.exit(0)46&47&#run48&srv&=&sys.argv[1]49&for&_&in&xrange(PARALLEL):50&&&&&threading.Thread(target=run,&args=(srv,)).start()51&
羡慕Windows下secureCRT的Session Copy功能,一直在寻找Linux下类似的软件,殊不知SSH本身就支持此功能。特别感谢同学的邮件分享。详细方法Linux/mac下,在$HOME/.ssh/config中加入Host&*ControlMaster&autoControlPath&/tmp/ssh-%r@%h至此只要第一次SSH登录输入密码,之后同个Hosts则免登。配置文件分析man ssh_config 5ControlPath&&&&&&&&&&&&&Specify&the&path&to&the&control&socket&used&for&connection&sharing&as&described&in&the&ControlMaster&section&&&&&&&&&&&&&above&or&the&string&“none”&to&disable&connection&sharing.&&In&the&path,&‘%l’&will&be&substituted&by&the&&&&&&&&&&&&&local&host&name,&‘%h’&will&be&substituted&by&the&target&host&name,&‘%p’&the&port,&and&‘%r’&by&the&remote&&&&&&&&&&&&&login&username.&&It&is&recommended&that&any&ControlPath&used&for&opportunistic&connection&sharing&include&at&&&&&&&&&&&&&least&%h,&%p,&and&%r.&&This&ensures&that&shared&connections&are&uniquely&identified.%r 为远程机器的登录名%h 为远程机器名原理分析严格地讲,它并不是真正意义上的Session Copy,而只能说是共享Socket。第一次登录的时候,将Socket以文件的形式保存到:/tmp/ssh-%r@%h这个路径之后登录的时候,一旦发现是同个主机,则复用这个Socket故,一旦主进程强制退出(Ctrl+C),则其他SSH则被迫退出。可以通过ssh -v参数,看debug信息验证以上过程备注有同学说在linux上通过证书的形式,可以实现免登录,没错。对于静态密码,完全可以这么干;对于动态密码(口令的方式),则上述手段可以方便很多。
本文将从配置解析,Bean的创建,Repository执行三个方面来简单介绍下Spring Data JPA的代码实现
友情提醒:图片均可放大
1. parser类
Spring通过Schema的方式进行配置,通过AbstractRepositoryConfigDefinitionParser进行解析。其中包含对NamedQuery的解析。
解析的主要目的,是将配置文件中的repositories和repository元素信息分别解析成GlobalRepositoryConfigInformation和SingleRepositoryConfigInformation。
2. Information
CommonRepositoryConfigInformation:
xml中repositories的通用配置,一般对应其中的attributes
SingleRepositoryConfigInformation:
xml中repository的配置信息,对应其中的attributes
GlobalRepositoryCOnfigInformation:
一组SingleRepositoryConfigInfomation信息,包含所有的Single信息
在JPA实现中,针对Single,有两份实现,一份是自动配置信息,一份是手动配置信息,分别对应图中的Automatic和Manual。
SimpleJpaRepositoryConfiguration是JPA中的所有配置信息,包含所有的Jpa中的SingleRepositoryConfigInformation。
3. Query Lookup Strategy CreateQueryLookupStrategy:对应repositories元素query-lookup-strategy的create值,主要针对method query方式DeclaredQueryLookupStrategy:对应use-declared-query值,主要针对带有@Query注解的查询方式CreateIfNotFoundQueryLookupStrategy:对应create-if-not-found值(default值),结合了上述两种方式
Bean的创建
主要包含两个类
RepositoryFactoryBeanSupport, Spring Factory Bean,用于创建Reposiory代理类。其本身并不真正做代理的事情,只是接受Spring的配置,具体交由RepositoryFactorySupport进行代理工作
RepositoryFactorySupport, 真正做Repository代理工作,根据JpaRepositoryFactoryBean的定义找到TargetClass:SimpleJpaRepository实现类,中间加入3个拦截器,一个是异常翻译,一个是事务管理,最后一个是QueryExecutorMethodInterceptor。
QueryExecutorMethodInterceptor是个重点,主要做特定的Query(查询语句)的操作。
Repository执行
1. 主要执行类
在看上面Bean定义的时候,其实已经明白了执行过程:1. 将JPA CRUD规范相关的方法交给SimpleJpaRepository这个类执行2. 将特殊查询相关的交给QueryExecutorMethodInterceptor执行。主要做自定义实现的部分,method query部分和named query部分。具体查询类详见下图。
2. 查询相关主要支持NamedQuery和JPA Query。
主要执行代码QueryExecutorMethodInterceptor#invoke(MethodInvocation invocation)&1&public&Object&invoke(MethodInvocation&invocation)&throws&Throwable&{&2&&3&&&&&&&&&&&&&Method&method&=&invocation.getMethod();&4&&5&&&&&&&&&&&&&if&(isCustomMethodInvocation(invocation))&{&6&&&&&&&&&&&&&&&&&Method&actualMethod&=&repositoryInformation.getTargetClassMethod(method);&7&&&&&&&&&&&&&&&&&makeAccessible(actualMethod);&8&&&&&&&&&&&&&&&&&return&executeMethodOn(customImplementation,&actualMethod,&9&&&&&&&&&&&&&&&&&&&&&&&&&invocation.getArguments());10&&&&&&&&&&&&&}11&12&&&&&&&&&&&&&if&(hasQueryFor(method))&{13&&&&&&&&&&&&&&&&&return&queries.get(method).execute(invocation.getArguments());14&&&&&&&&&&&&&}15&16&&&&&&&&&&&&&//&Lookup&actual&method&as&it&might&be&redeclared&in&the&interface17&&&&&&&&&&&&&//&and&we&have&to&use&the&repository&instance&nevertheless18&&&&&&&&&&&&&Method&actualMethod&=&repositoryInformation.getTargetClassMethod(method);19&&&&&&&&&&&&&return&executeMethodOn(target,&actualMethod,20&&&&&&&&&&&&&&&&&&&&&invocation.getArguments());21&&&&&&&&&}
主要分3个步骤:1. 如果配置文件中执行了接口类的实现类,则直接交给实现类处理2. 判断是查询方法的,交给RepositoryQuery实现,具体又分:NamedQuery,SimpleJpaQuery,PartTreeJpaQuery3. 不属于上述两个,则直接将其交给真正的targetClass执行,在JPA中,就交给SimpleJpaRepository执行。本文并没有做详细的分析,只是将核心的组件类一一点到,方便大家自行深入了解代码。
背景考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇工程。发现两者的思路惊人的一致。于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展SpringData相关资料介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段。目前已支持的数据库有(主要):MongoDB,Neo4j,Redis,Hadoop,JPA等SpringData官方资料(强烈推荐,文档非常详细)SpringData主页:SpringDataJPA 指南文档:&(非常详细)SpringDataJPA Examples:&/SpringSource/spring-data-jpa-examples (非常详细的例子)Spring-Data-Jpa简介Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切1. 编写Entity类,依照JPA规范,定义实体2. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)3. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)下面,我依赖Example中的例子,简单地介绍下以上几个步骤User.java
&1&/**&2&&*&User&Entity&Sample&3&&*&&4&&*&&#64;author&&a&href="mailto:li.jinl&#64;"&Stone.J&/a&&Aug&25,&2011&5&&*/&6&&#64;Entity&7&public&class&User&extends&AbstractPersistable&Long&&{&8&&9&&&&&private&static&final&long&serialVersionUID&=&-<span style="color: #07252L;<span style="color: #&<span style="color: #&&&&&&#64;Column(unique&=&true)<span style="color: #&&&&&private&String&&&&&&&&&&&&<span style="color: #&&&&&private&String&&&&&&&&&&&&<span style="color: #&&&&&private&String&&&&&&&&&&&&<span style="color: #&<span style="color: #&&&&&public&String&getUsername()&{<span style="color: #&&&&&&&&&return&<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&public&void&setUsername(String&username)&{<span style="color: #&&&&&&&&&this.username&=&<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&public&String&getFirstname()&{<span style="color: #&&&&&&&&&return&<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&public&void&setFirstname(String&firstname)&{<span style="color: #&&&&&&&&&this.firstname&=&<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&public&String&getLastname()&{<span style="color: #&&&&&&&&&return&<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&public&void&setLastname(String&lastname)&{<span style="color: #&&&&&&&&&this.lastname&=&<span style="color: #&&&&&}<span style="color: #&没什么技术,JPA规范要求怎么写,它就怎么写Repository.java
SimpleUserRepository.java
&1&/**&2&&*&User&Repository&Interface.&3&&*&&4&&*&&#64;author&&a&href="mailto:li.jinl&#64;"&Stone.J&/a&&Aug&25,&2011&5&&*/&6&public&interface&SimpleUserRepository&extends&CrudRepository&User,&Long&,&JpaSpecificationExecutor&User&&{&7&&8&&&&&public&User&findByTheUsersName(String&username);&9&<span style="color: #&&&&&public&List&User&&findByLastname(String&lastname);<span style="color: #&<span style="color: #&&&&&&#64;Query("select&u&from&User&u&where&u.firstname&=&?")<span style="color: #&&&&&public&List&User&&findByFirstname(String&firstname);<span style="color: #&<span style="color: #&&&&&&#64;Query("select&u&from&User&u&where&u.firstname&=&:name&or&u.lastname&=&:name")<span style="color: #&&&&&public&List&User&&findByFirstnameOrLastname(&#64;Param("name")&String&name);<span style="color: #&&&&&<span style="color: #&需要关注它继承的接口,我简单介绍几个核心接口
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别
CrudRepository: 继承Repository,实现了一组CRUD相关的方法
PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法
JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法不需要写任何实现类,Spring Data Jpa框架帮你搞定这一切。Spring Configuration
Configuration.xml
&1&&beans&&2&&&&&&bean&id="entityManagerFactory"&class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&&3&&&&&&&&&&property&name="dataSource"&ref="dataSource"&/&&4&&&&&&&&&&property&name="jpaVendorAdapter"&&5&&&&&&&&&&&&&&bean&class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&&6&&&&&&&&&&&&&&&&&&property&name="generateDdl"&value="true"&/&&7&&&&&&&&&&&&&&&&&&property&name="database"&value="HSQL"&/&&8&&&&&&&&&&&&&&/bean&&9&&&&&&&&&&/property&<span style="color: #&&&&&&&&&&property&name="persistenceUnitName"&value="jpa.sample"&/&<span style="color: #&&&&&&/bean&<span style="color: #&<span style="color: #&&&&&&bean&id="transactionManager"&class="org.springframework.orm.jpa.JpaTransactionManager"&<span style="color: #&&&&&&&&&&property&name="entityManagerFactory"&ref="entityManagerFactory"&/&<span style="color: #&&&&&&/bean&<span style="color: #&<span style="color: #&&&&&&jdbc:embedded-database&id="dataSource"&type="HSQL"&/&<span style="color: #&<span style="color: #&<span style="color: #&&&&&&jpa:repositories&base-package="org.springframework.data.jpa.example.repository.simple"&/&<span style="color: #&&/beans&核心代码只要配置一行:&jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" /&即可。上面的仅仅是数据源,事务的配置而已。至此,大功告成,即可运行
Sample.java
&1&/**&2&&*&Intergration&test&showing&the&basic&usage&of&{&#64;link&SimpleUserRepository}.&3&&*&&4&&*&&#64;author&&a&href="mailto:li.jinl&#64;"&Stone.J&/a&&Aug&25,&2011&5&&*/&6&&#64;RunWith(SpringJUnit4ClassRunner.class)&7&&#64;ContextConfiguration(locations&=&"classpath:simple-repository-context.xml")&8&&#64;Transactional&9&public&class&SimpleUserRepositorySample&{<span style="color: #&<span style="color: #&&&&&&#64;Autowired<span style="color: #&&&&&SimpleUserRepository&<span style="color: #&&&&&User&&&&&&&&&&&&&&&&&<span style="color: #&<span style="color: #&&&&&&#64;Before<span style="color: #&&&&&public&void&setUp()&{<span style="color: #&&&&&&&&&user&=&new&User();<span style="color: #&&&&&&&&&user.setUsername("foobar");<span style="color: #&&&&&&&&&user.setFirstname("firstname");<span style="color: #&&&&&&&&&user.setLastname("lastname");<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&//&crud方法测试<span style="color: #&&&&&&#64;Test<span style="color: #&&&&&public&void&testCrud()&{<span style="color: #&&&&&&&&&user&=&repository.save(user);<span style="color: #&&&&&&&&&assertEquals(user,&repository.findOne(user.getId()));<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&//&method&query测试<span style="color: #&&&&&&#64;Test<span style="color: #&&&&&public&void&testMethodQuery()&throws&Exception&{<span style="color: #&&&&&&&&&user&=&repository.save(user);<span style="color: #&&&&&&&&&List&User&&users&=&repository.findByLastname("lastname");<span style="color: #&&&&&&&&&assertNotNull(users);<span style="color: #&&&&&&&&&assertTrue(users.contains(user));<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&//&named&query测试<span style="color: #&&&&&&#64;Test<span style="color: #&&&&&public&void&testNamedQuery()&throws&Exception&{<span style="color: #&&&&&&&&&user&=&repository.save(user);<span style="color: #&&&&&&&&&List&User&&users&=&repository.findByFirstnameOrLastname("lastname");<span style="color: #&&&&&&&&&assertTrue(users.contains(user));<span style="color: #&&&&&}<span style="color: #&<span style="color: #&&&&&//&criteria&query测试<span style="color: #&&&&&&#64;Test<span style="color: #&&&&&public&void&testCriteriaQuery()&throws&Exception&{<span style="color: #&&&&&&&&&user&=&repository.save(user);<span style="color: #&&&&&&&&&List&User&&users&=&repository.findAll(new&Specification&User&()&{<span style="color: #&<span style="color: #&&&&&&&&&&&&&&#64;Override<span style="color: #&&&&&&&&&&&&&public&Predicate&toPredicate(Root&User&&root,&CriteriaQuery&?&&query,&CriteriaBuilder&cb)&{<span style="color: #&&&&&&&&&&&&&&&&&return&cb.equal(root.get("lastname"),&"lastname");<span style="color: #&&&&&&&&&&&&&}<span style="color: #&&&&&&&&&});<span style="color: #&&&&&&&&&assertTrue(users.contains(user));<span style="color: #&&&&&}<span style="color: #&其中,写操作相对比较简单,我不做详细介绍,针对读操作,我稍微描述下:Method Query: 方法级别的查询,针对
findBy,&find,&readBy,&read,&getBy等前缀的方法,解析方法字符串,生成查询语句,其中支持的关键词有:Named Query: 针对一些复杂的SQL,支持原生SQL方式,进行查询,保证性能Criteria Query: 支持JPA标准中的Criteria Query备注:本文只是简单介绍SpringDataJpa功能,要深入了解的同学,建议直接传送到
背景接上文:随笔摘自6月13日邮件分享目前此软件在公司测试环境上运行良好,故分享给大家。以下为分享内容:好处:1.&&&&&&&一个项目、小需求,需要绑定的Hosts,只需要一份Hosts信息即可。不必每个用户自行管理各自电脑的Hosts。达到一人配置,多人使用的目的2.&&&&&&&绑定的Hosts,支持通配符。方便类似旺铺域名的需求,只需要配置一个带通配符的域名即可3.&&&&&&&要在不同项目,小需求切换不同的Hosts时,只需要轻轻一点,方便4.&&&&&&&要想使用代理服务器,只需要本地DNS设置一下即可,方便5.&&&&&&&本机Hosts配置优先&如何使用:(以10.20.131.207环境介绍)备注:公司内部环境,外部无法访问,如果需要,请自行搭建1.&&&&&&&登陆DNS后台管理页面URL:,点击Add2.&&&&&&&添加一个项目的Hosts信息,点击添加3.&&&&&&&在Hosts信息页面,点击assign,绑定自己电脑IP和某个Hosts的关联4.&&&&&&&IP List页面上,显示了不同IP和Hosts关联的信息5.&&&&&&&将本机电脑的DNS服务器设置成DNS代理服务器即可(10.20.131.207)--&只需要一次操作即可,以后一直能用左图为windows配置,右图为linux配置&此时,你访问域名,如果在2011tp hosts中,则直接返回Hosts中的IP;反之,则返回真实IP。如何启动服务1. 启动DNS代理服务器服务1.1 cd dns/dns1.2 vi settings.py 修改配置信息1.3 python -u main.py2. 启动DNS BackOffice服务2.1 cd dns/config2.2 vi settings.py 修改配置信息2.3 python -u manage.py runserver软件下载:============================================================================================为了满足&#8220;邪恶&#8221;的人们能更方便的使用这个软件(貌似邪恶的人特别看重这个软件通配符的功能,具体邪恶在哪里,我不具体描述了,给个),我特意写了一个standalone的版本:1. 去除无用的backoffice功能2. 去除通过事件机制reload hosts文件的功能3. 去除复杂的settings配置文件,改用简单的命令行方式4. 特意为windows用户制作了一个exe文件,可以直接使用linux用户使用方案:python standalone.py -s xxx.xxx.xxx.xxx (上级dns地址)python standalone.py -s xxx.xxx.xxx.xxx -f /etc/hosts2 (指定hosts文件,默认是/etc/hosts)windows用户使用方案,进入dist(exe发布目录)dns.exe -s xxx.xxx.xxx.xxx (上级dns地址)dns.exe -s xxx.xxx.xxx.xxx -f d:/hosts (指定hosts文件,默认是c:/windows/system32/drivers/etc/hosts)对于不放心使用exe的客户来说,可以进入dns目录,通过py2exe工具自行发布成exe软件,方法如下python setup.py py2exe
Python shell下操作mysql一直使用MySqldb。
其默认的Cursor Class是使用tuple(元组)作为数据存储对象的,操作非常不便
1&p&=&cursor.fetchone()
2&print(p[0],&p[1])
如果有十几个字段,光是数数位数,就把我数晕了。
当然,MySqldb Cursor Class本身就提供了扩展,我们可以切换成DictCurosor作为默认数据存储对象,如
MySQLdb.connect(host='127.0.0.1',&user='sample',&passwd='123456',&db='sample',&cursorclass=DictCursor,&charset='utf8')#p&=&cursor.fetchone()print(p['id'],&p['name'])
字典的方式优于元祖。但是,"[]"这个符号写写比较麻烦,并且我编码风格带有强烈的Java习惯,一直喜欢类似"p.id","p.name"的写法。于是,扩展之1. 扩展Dict类,使其支持"."方式:&1&class&Dict(dict):&2&&&&&&3&&&&&def&__getattr__(self,&key):&4&&&&&&&&&return&self[key]&5&&&&&&6&&&&&def&__setattr__(self,&key,&value):&7&&&&&&&&&self[key]&=&value&8&&&&&&9&&&&&def&__delattr__(self,&key):10&&&&&&&&&del&self[key]2. 扩展Curosor,使其取得的数据使用Dict类:&1&class&Cursor(CursorStoreResultMixIn,&BaseCursor):&2&&3&&&&&_fetch_type&=&1&4&&5&&&&&def&fetchone(self):&6&&&&&&&&&return&Dict(CursorStoreResultMixIn.fetchone(self))&7&&8&&&&&def&fetchmany(self,&size=None):&9&&&&&&&&&return&(Dict(r)&for&r&in&CursorStoreResultMixIn.fetchmany(self,&size))10&11&&&&&def&fetchall(self):12&&&&&&&&&return&(Dict(r)&for&r&in&CursorStoreResultMixIn.fetchall(self))这下,就符合我的习惯了:1&MySQLdb.connect(host='127.0.0.1',&user='sample',&passwd='123456',&db='sample',&cursorclass=Cursor,&charset='utf8')2&#3&p&=&cursor.fetchone()4&print(p.id,&p.name)
悲哀,今天下午不知道执行了什么命令,居然删除了linux kernel。
晚上重启机子后,无法进入系统,一直停留在界面。
一开始,以为grub损坏,只好通过Live CD/USB Stick&的方式,进入系统。
1. 进入页面,下载ISO文件
2. 通过,创建USB启动文件详细说明请点击Ubuntu Download页面中&#8220;Burn your CD or create a USB drive&#8221;进入Live CD后,发现grub完好,但是查看/boot/下,发现linux kernel文件不见了,估计下午执行什么命令,给不小心删除了。只能通过chroot方式,重装linux kernel1.chroot -- 利用root帐号操作#mkdir /uroot #创建临时文件,作为新的root文件#mount /dev/sda1 /uroot #将硬盘挂载到新的root文件上,sda是之前装有ubuntu的硬盘#mount --bind /proc /uroot/proc #将当前进程文件绑定到uroot下的proc#mount --bind /dev /uroot/dev &#将设备文件绑定到uroot下的dev#chroot2.配置uroot下的网络 -- 家中是利用ADSL上网# pppoeconf #配置ADSL帐号和密码# pon dsl-provider #启动帐号,上网3.安转linux kernel# apt-get install&linux-image-2.6.32-32-generic重启系统,恢复正常。
一直习惯于Linux命令,唯独对svn diff耿耿于怀,其结果真不是人能看懂的 :)感谢的分享文档,提醒我可以使用vimdiff作为svn diff的默认工具,步骤如下:1.编写svndiff脚本1&#!/bin/sh2&#去掉前5个参数3&shift&54&#使用vimdiff比较5&vimdiff&-f&"$&#64;"2.修改svn默认配置,vi ~/.subversion/config1&#设置diff-cmd为svndiff脚本地址2&diff-cmd&=&svndiff3.使用svn diff命令,效果如下备注:1. svn diff --diff-cmd 中的7个回调函数参数分别是:1&-u2&-L3&pom.xml&(revision&351676)4&-L5&pom.xml&(working&copy)6&.svn/tmp/tempfile.tmp7&pom.xml2. vimdiff非常强悍的
&&&& 摘要: 背景
详见《Hosts绑定新思路之DNS代理篇》
核心内容
1. DNS协议解析
2. 启动UDP服务,监听53端口
3. 根据DB或者文本,进行Hosts解析
DNS协议
DNS Protocol Overview (推荐)
非强详细,但是不怎么看得懂的长篇大论
如果没有耐心的同学,可以看看我通过wireshark分析之后制作的两张gif图片。大概能知道DNS协议的...&&
此文摘自日邮件分享,为《Hosts绑定新思路之HTTP代理篇》续集电视有续集,电影也有续集,Hosts绑定思路同样有续集.&我们先用一句话来回顾下,上集中关于Hosts绑定的思路:原理:利用Http代理的方式,将分散在各个客户端的Hosts绑定,集中绑定在Http代理服务器上优点:集中管理缺点:一台Http代理服务器,只能绑定一组Hosts信息(详细内容,请见之前的邮件)&在当时描述方案邮件的时候,也意识到了方案存在的不足,所以一直在思考改进方案(详见之前邮件中最后一节&#8212;改进方案思路).经过一段时间的思考,改进方案有了大概的雏形:&将之前的HTTP代理方案&替换成&DNS代理方案&俗话说得好:有图有真相.先贴上一张架构图,之后再用文字慢慢解释&&架构中核心组件是:DNS BackOffice服务器&和DNS代理服务器DNS BackOffice服务器的作用有:1.开发/测试管理员通过BackOffice服务维护各自项目的绑定信息,BackOffice服务将之持久化&&&&&&&&&&&&&&& (图中&蓝色虚线)2.开发/测试人员通过BackOffice服务,告知需要哪个项目的绑定信息,BackOffice服务将之持久化&&&&&&&&& &(图中&黑色虚线)&DNS代理服务器的作用有:1.拦截Domain Name的解析.通过来源IP判断需要绑定的Hosts信息,通过File/DB得到对应的IP,通过DNS协议返回& (图中&红色实线&和&黑色实线)2.如果不在绑定之列,则请求上级DNS服务器,返回其Response.&此方案的优势:1.本地Hosts绑定优先.只要本地Hosts有绑定IP,则不会请求DNS代理服务器.只请求本地Hosts文件.能满足个性化需求.2.DNS代理服务器支持多种绑定方式,如通配符,正则等对于目前旺铺,完全可以使用通配符,如&*.,简化配置工作量3.操作简单只要将DNS服务器设置成DNS代理服务器IP即可&(附录中有详细说明)4.有效利用现有成果目前测试同学已经集中维护了Hosts绑定信息,只要部署DNS代理服务器,并做简单的集成即可5.DNS代理服务器代码轻量小巧,易于修改扩展目前一共只有212行代码,其中DNS协议部分130行,DNS代理部分82行.&&附录I.客户端如何设置DNS服务器Windows用户,见图:Linux用户,见图:修改&/etc/resolv.conf文件即可
现状平时开发,测试,功能预演阶段,为了能够正常访问应用,需要做Hosts绑定.随着应用数量的不断增多,绑定量也是急剧上升.例如最近工作平台三期项目,需要绑定的环境多达44个.一旦有变动,需要通知所有人员做本地Hosts的调整,维护成本那是相当地大.&用一张图,来描述下目前我们的方案:&如果站在面向对象编程的角度,来思考这张图,我们会发现.1.利用客户端本地Hosts绑定来实现,并且客户端数量不可控&#8212;利用客户端解决需求,但客户端维护不在可控范围内2.Hosts绑定是非常不稳定的&#8212;需求易变&这样的设计,违反了&#8221;封装变化&#8221;的设计原则,故一旦有变动,维护成本非常大.&新方案思路按照&#8221;封装变化&#8221;的设计原则,我们就应该把&#8221;域名绑定&#8221;这个易变需求,进行统一管理.看上图,我们会发现,DNS的职责就是做域名解析的,并且DNS管理比较可控.于是第一反应,我们可以使用内部域名解析服务器来绑定这些域名.但是问题又来了,DNS来做测试环境域名解析,太重量级了.同一个域名,对应测试服务器IP有多个,绑定哪一个好呢?并且域名对应IP不断变化,IT DNS负责人不被我们累死啊?&&既然DNS上做文章不可行,又需要统一管理的地方,那么我们只能再抽象出一个新的概念来.同样,我们利用一张图,来描述下整体架构.与上图相对,此图多了一个&#8221;代理服务器&#8221;的概念,即Hosts绑定动作在此概念上完成.流程如下:1.客户端浏览器设置代理服务器,将所有请求发送到代理服务器上2.代理服务器检查本地Hosts绑定,如绑定则直接解析,反之进入流程33.代理服务器通过内部域名服务器解析域名4.代理服务器发送请求到测试服务器上,并且将响应内容返回给客户端&具体尝试性实施方案如下(在XX项目过程中有成功案例)1.利用squid搭建代理服务器&(代理地址:&)备注:Squid配置介绍见附录I&2.浏览器配置代理全局代理:&代理服务器上,直接填写&10.20.131.207 3128局部代理:&通过pac实现,选择&#8221;使用自动配置脚本&#8221;,脚本格式内容如下:备注:Pac脚本详细介绍见附录II为了防止将配置工作带给PD,销售等,我们可以使用配置好的绿色浏览器提供直接使用.推荐一款:GreenBrowser:& IE具体配置,见下图:Firefox同样支持代理和pac脚本Chrome需要安装proxy switchy插件来支持.&改进方案思路上述的方案中,有两个比较大的缺陷1.代理服务器没有多实例概念代理服务器通过hosts绑定.hosts是全局性的,意味着一台代理服务器只能服务一组需求.而事实上,我们不同的项目需要的绑定都是不一样的.2.特性化需求不能满足绑定全在代理服务器上做了,客户端本地个性化需求无法支持&所以,我理想中整体架构是这样的,见图:1.优先查看本地hosts文件2.代理服务器支持多实例部署,不同实例有不同的hosts绑定配置.&目前具体实现方案,还在构思中.欢迎大家提供实现方案思路.&附录ISquid权威指南(中文版):&附录IIPac介绍:&&&&&&&&&&&&&& Pac函数介绍: &&&&&&&&
前段时间替朋友做了一个物业管理系统,使用了python+django技术,对django有了一些了解。
作为一个一直来使用java的人来说,初次使用django,真正体会到了简单美学。(一共13个功能,不到500行代码)
此文,主要总结下django框架的一些扩展点:
MIDDLEWARE_CLASSES
在request请求之前,或者response请求之后,做拦截,允许自定义逻辑。有些类似J2EE Servlet中的Filter概念。
TEMPLATE_CONTEXT_PROCESSORS
进入模板渲染之前,允许放入一组用于模板渲染的Key-Value属性。
TEMPLATE FILTER
模板中的管道语法,通过自定义行为,添加用于显示的一些逻辑。
TEMPLATE TAG
模板tag,添加一组行为。有些类似Velocity中的ToolSet功能。
模板tag+指定模板,充当页面组件(widgets)功能
middleware演示
&1&from&django.db&import&connection
&2&from&django.http&import&HttpResponseRedirect
&4&#拦截response请求之后,打印请求中的所有sql
&5&class&SqlLogMiddleware(object):
&6&&&&&def&process_response(self,&req,&res):
&7&&&&&&&&&for&sql&in&connection.queries:
&8&&&&&&&&&&&&&print&sql
&9&&&&&&&&&return&res
11&#拦截request请求之前,做权限校验
12&class&Auth(object):
13&&&&&def&process_request(self,&req):
14&&&&&&&&&if&req.path&==&'/admin/':
15&&&&&&&&&&&&&return
16&&&&&&&&&if&not&req.user.is_authenticated():
17&&&&&&&&&&&&&return&HttpResponseRedirect('/admin/')
1&MIDDLEWARE_CLASSES&=&(
2&&&&&'monMiddleware',
3&&&& 'django.contrib.sessions.middleware.SessionMiddleware',
4&&&&&'django.contrib.auth.middleware.AuthenticationMiddleware',
5&&&&&'finance.middleware.SqlLogMiddleware',
6&&&&&'finance.middleware.Auth',
template context processor演示
1&def&version(request):
2&&&&&return&{'name':'Stone.J',
3&&&&&&&&&&&&&'version':'1.0-beata',
4&&&&&&&&&&&&&'date':''}
1&TEMPLATE_CONTEXT_PROCESSORS&=&(
2&&&&&'django.core.context_processors.request',
3&&&&&'django.core.context_processors.auth',
4&&&&&'django.core.context_processors.debug',
5&&&&&'django.core.context_processors.i18n',
6&&&&&'django.core.context_processors.media',
7&&&&&'finance.example.context_processors.version',
template filter演示
&1&def&row(value):
&2&&&&&if&not&value:
&3&&&&&&&&&return&'row1'
&4&&&&&if&value&%&2&==&1:
&5&&&&&&&&&return&'row1'
&6&&&&&else:
&7&&&&&&&&&return&'row2'
&9&def&math_mul(value,&num):
10&&&&&return&value&*&num
12&def&math_add(value,&num):
13&&&&&return&value&+&num
15&register&=&template.Library()&&&&
16&register.filter('row',&row)
17&register.filter('math_add',&math_add)
18&register.filter('math_mul',&math_mul)
1&{%&load&my_filter&%}
2&{%&for&c&in&page.object_list&%}
3&&tr&class="{{&forloop.counter|row&}}"&
4&&td&{{&c.amount&|&math_add:c.amount2}}&/td&
5&&td&{{&c.amount&|&math_mul:12}}&/td&
7&{%&endfor&%}
通过约定的方式,在任意一个app下,建立一个templatetags目录,会自动寻找到。(不过没有命名空间,是一个比较猥琐的事情,容易造成不同app下的冲突)
template tag演示
&1&register&=&template.Library()
&3&class&AccountNode(template.Node):
&4&&&&&def&__init__(self,&name):
&5&&&&&&&&&self.name&=&name
&6&&&&&&&&&
&7&&&&&def&render(self,&context):
&8&&&&&&&&&context[self.name]&=&Account.objects.get()
&9&&&&&&&&&return&''
11&def&get_account(parser,&token):
12&&&&&try:
13&&&&&&&&&tag_name,&name&=&token.split_contents()
14&&&&&except&ValueError:&&&&&&&&
15&&&&&&&&&raise&template.TemplateSyntaxError,&"%s&tag&requires&argument"&%&tag_name
16&&&&&return&AccountNode(name)
18&register.tag('get_account',&get_account)
1&{%&load&my_tag&%}
2&{%&get_account&account&%}&!--&通过tag取到内容赋值给account变量&--&
3&{{&account.amount&}}
template tag + template file演示
1&from&django&import&template
2&register&=&template.Library()
4&def&version(context):
5&&&&&return&{'name':'Stone.J',
6&&&&&&&&&&&&&'version':'1.0-beata',
7&&&&&&&&&&&&&'date':''}
9&register.inclusion_tag('example/version.html',&takes_context=True)(version)
1&&!--&这份内容可以被当成widget复用&--&
3&&&&&&tr&
4&&&&&&&&&&td&{{&name&}}&/td&
5&&&&&&&&&&td&{{&version&}}&/td&
6&&&&&&&&&&td&{{&data&}}&/td&
7&&&&&&/tr&
8&&/table&
tag寻找模式等同于filter。
接上文,继续show下我命令行下的工具--翻译脚本
(利用了google 翻译 json api:/translate_a/t?client=t&text=%s&hl=zh-CN&sl=%s&tl=%s)
1. 自动识别中翻英/英翻中
涉及技术:
对应代码:
&2&Created&on&
&4&&#64;author:&stone
&6&import&json
&7&import&re
&8&import&sys
&9&import&urllib2
10&import&types
12&res&=&'/translate_a/t?client=t&text=%s&hl=zh-CN&sl=%s&tl=%s'
13&agent&=&'Mozilla&/&5.0&(X11;&U;&Linux&i686;&en&-&US)&AppleWebKit&/&534.7&(KHTML,&like&Gecko)&Chrome&/&7.0.517.44&Safari&/&534.7'
15&def&get_data(text,&sl='en',&tl='zh-CN'):
16&&&&&req&=&urllib2.Request(res&%&(urllib2.quote(text),&sl,&tl))
17&&&&&req.add_header('user-agent',&agent)
18&&&&&content&=&urllib2.urlopen(req).read()
19&&&&&return&json.loads(to_standard_json(content))
21&def&show(data):
22&&&&&#step1
23&&&&&print&u'翻译:\n&&%s'&%&(data[4][0][0])
24&&&&&#step2
25&&&&&if&types.ListType&==&type(data[1]):
26&&&&&&&&&print&u'\n字典:'
27&&&&&&&&&for&word&in&data[1]:
28&&&&&&&&&&&&&print&word[0]
29&&&&&&&&&&&&&if&len(word)&&&1:
30&&&&&&&&&&&&&&&&&for&i,&w&in&enumerate(word[1]):
31&&&&&&&&&&&&&&&&&&&&&print&'&&%s.%s'&%&(i&+&1,&w)&
33&def&to_standard_json(json):
34&&&&&p&=&pile(r',([,\]])')
35&&&&&while(p.search(json)):
36&&&&&&&&&json&=&p.sub(lambda&m:',null%s'&%&(m.group(1)),&json)
37&&&&&return&json
39&def&contains_cn(text):
40&&&&&for&c&in&text:
41&&&&&&&&&if&ord(c)&&&127:
42&&&&&&&&&&&&&return&True
43&&&&&return&False
45&if&__name__&==&'__main__':
46&&&&&if&not&len(sys.argv)&==&2&or&not&sys.argv[1].strip():
47&&&&&&&&&print&'Useage:translate.py&word'
48&&&&&&&&&sys.exit()
49&&&&&word&=&sys.argv[1].strip()
50&&&&&if&contains_cn(word):
51&&&&&&&&&show(get_data(word,&'zh-CN',&'en'))
52&&&&&else:
53&&&&&&&&&show(get_data(word,&'en',&'zh-CN'))
按照同事的话说,我是一个十足的命令控。
利用最近项目通宵发布的空闲时间中,写了一个命令行下的音乐播放器,以满足我在linux命令下的需求。
播放器利用技术:
Python+GST()+Console解析
播放器自持操作:
5. 查看播放列表信息
6. 查看当前播放信息
7. 停止(退出)
看一张截图:
通过分析meliae dump出来的内存信息,差不做占用2.5M内存,算的上比较小巧了。
对应代码:(需要安装py-gst,ubuntu下:sudo apt-get install python-gst0.10)
&&1&#!/usr/bin/env&python
&&3&import&gst
&&4&import&gobject
&&5&import&sys
&&6&#to&avoid&eclipse'warning
&&7&eval('gobject.threads_init()')&
&&8&from&threading&import&Thread
&10&class&AudioPlayer:
&12&&&&&EVENT_PLAY_NEW&=&1
&14&&&&&def&__init__(self,&advisor):
&15&&&&&&&&&self.main&=&gobject.MainLoop()
&16&&&&&&&&&self.player&=&gst.element_factory_make('playbin',&'player')
&17&&&&&&&&&self.index&=&-1
&18&&&&&&&&&self.list&=&None
&19&&&&&&&&&self.advisor&=&advisor
&20&&&&&&&&&
&21&&&&&&&&&bus&=&self.player.get_bus()
&22&&&&&&&&&bus.add_signal_watch()
&23&&&&&&&&&bus.connect('message',&self.on_message)
&24&&&&&&&&&
&25&&&&&&&&&Thread(target=self.main.run).start()
&26&&&&&&&&
&27&&&&&def&add_list(self&,&list=[]):
&28&&&&&&&&&if&list&is&None:
&29&&}

我要回帖

更多关于 公会多少级能买支援兵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信