21
07年8月
一张多用户的通讯记录表,主要是手机信息,每个用户可以建立自己的联系人组。
原来数据对数据没有校验,用户可以在一个组里面输入重复手机号码,如果数据量大,会造成数据重复。
所以要做一个唯一性的索引,如下:
create unique index inx_uniq_cellphone_onegroup on addresslist (cellphone, groupid, operatorid);
目的是保证每个用户的每个组里面,不能有同样的cellphone。
但是建立的时候出错,因为里面原来有重复的数据。
清除重复的数据,用如下的sql,如果重复的就删除rowid不等于max(rowid)的那条记录。
delete addresslist
where rowid not in (select rowid1
from addresslist a,
(select cellphone,
groupid,
operatorid,
max(rowid) rowid1,
count(*)
from addresslist
group by cellphone, groupid, operatorid) b
where a.cellphone = b.cellphone
and a.groupid = b.groupid
and a.operatorid = b.operatorid
and a.rowid = b.rowid1)
贝贝爸 发表在 原创技术文章 |
23
07年7月
主要功能是根据贝贝的出生日期来显示贝贝现在多大了,实时显示贝贝的成长。
用当前时间减去出生的日期,但是可以显示出来几岁,几个月,和几天。
天的算法有点问题,没有考虑到大小月和2月份。
function getDays() {
putenv("TZ=Asia/Chongqing");
$by = 2006;
$bm = 7;
$bd = 7;
$rday="";
$today = getdate();
$by = $today[year] - $by;
$bm = $today[mon] - $bm;
$bd = $today[mday] - $bd;
if ($bd < 0) {
$bd = 30 + $bd;
$bm--;
}
if ($bm < 0) {
$bm = 12 + $bm;
$by--;
}
#print $by."-".$bm."-".$bd;
if ($by > 0) {
$rday = $by . "岁";
}
if ($bm == 0&&$bd == 0){
$rday .="生日";
}else{
if ($bm == 0){
$rday.="零".$bd."天";
}elseif ($bd == 0){
$rday.=$bm."个月整";
}else{
$rday.=$bm."个月".$bd."天";
}
}
return $rday;
}
?>
?>
用的时候直接
就可以了
空下来再完善以下,再写一个js的版本。
有bug请拍砖,有好的写法请留言。
贝贝爸 发表在 原创技术文章 |
22
07年7月
要做一个mysql数据导入并且更新的工作。数据源是excel里来的。
选中excel里面左上角的元素,ctrl+shift+end,选中全部有内容的cell。另存为一个abc.txt的文件。
数据只有2列,建了一个有2列的表,准备把数据load进去,用root用户登录的,在mysql的shell运行如下命令
load data infile ‘/root/test.dat’ into table mytable FIELDS TERMINATED BY ‘\t’;
结果报错。
ERROR 13 (HY000): Can’t get stat of ‘/root/test.dat’ (Errcode: 13)
后来google,说是权限的问题,看来可能是mysql不能读root目录下的文件,随便换了个目录,问题解决。
load data infile ‘/tmp/test.dat’ into table ppname FIELDS TERMINATED BY ‘\t’;
但是后来出现的问题,基本让我崩溃。
举个例子
mysql> select * from mytable;
+------+------+
| a | b |
+------+------+
|aaa | aaa
+------+------+
1 row in set (0.00 sec)
肉眼看上去,a和b是一样的,然后我就按照一样的去匹配,奇怪的是怎么做都不行,刚开始以为是大小写的问题,作了lower操作还是不行。
后来开始不相信自己的眼睛了,查看一下到底是什么
mysql> select hex(a),hex(b) from mytable;
+--------+----------+
| hex(a) | hex(b) |
+--------+----------+
| 616161 | 6161610D |
+--------+----------+
1 row in set (0.00 sec)
这个时候才发现每个字符后边多了一个
0D
被这个问题搞了个把钟头,郁闷的要死。做了以下处理,终于乌云散尽看见阳光了。
update mytable set b=UNHEX(TRIM(TRAILING ‘0D’ FROM hex(b)));
奇怪的是我模拟不出来这种数据,本来以为是没有加“LINES TERMINATED BY ‘\n’”的问题,可是后来加了也不行,:S
看来眼见不一定为实啊。
贝贝爸 发表在 原创技术文章 |
20
07年7月
jquery使用2例
1.把
里面的数值增加1
$(”#a01″)[0].innerHTML=parseInt($(”#a01″)[0].innerHTML)+1;
2.所有的checkbox有多少个选上的
var all_check=$(”input[@type=’checkbox’][@checked]”);
alert(all_check.length+”个选中”);
3.给每个checkbox增加click事件
$("input[@type='checkbox']").click(function(){
Redirect_login()
return true;
});
贝贝爸 发表在 原创技术文章 |
21
07年6月
工作中遇到需求,就是form里面所有的checkbox,radio都是必填的。
原来的做法是写多个function进行检查,部分代码如下
function checkElement(c) {
for (var i=0;i<c.length;i++) {
if (c[i].checked) return true;
}
c[0].focus();
alert("请完成所有答题!");
return false;
}
需要传入要检查的radio或者checkbox。
原来的写法是要把所有要检查的object都写进去,比如
result=checkElement(form1.check_1)&&checkElement(form1.radio_2);
如果有10道8道还可以,如果多的话,就要写好多,还容易漏掉,出错。
这次有100多道题目,所以想用jquery来选择所有的checkbox和radio,然后再来检查。
代码如下:
var myt="";
//用于存储生成的js校验字符串
//每次load页面,只生成一次,第一次的速度还是有点慢的
function check() {
var result = true;
if (myt==""){
//如果没有myt,就选择所有要检验的element列表,用来校验。
var alle=$("select[@name='text_79'],input[@type='radio'],input[@type='checkbox']");
for (var i=0;i < alle.length;i++) {
var myobj = alle[i];
if (i==0||alle[i].name!=alle[i-1].name){
if (i>0) myt+="&&";
//根据不同的类型,调用不同的check function
//应该写成一个函数,在函数里面判断比较好:S
if (myobj.type!="select-one")
myt+="checkElement(form1."+myobj.name+")"+"\n";
else
myt+="checkText(form1."+myobj.name+")"+"\n";
}
}}
//最后执行拼出来的js语句
eval("result = "+myt+";");
if (!result) return false;
return true;
}
checkText是检验text的值的程度,是否为0,如果0就是未填写
花了点时间的是
var alle=$(”select[@name=’text_79′],input[@type=’radio’],input[@type=’checkbox’]”);
这一句,选择多个类型的element
但是上述写法有个问题,就是顺序和自然顺序不一样。还需要改进。
上面的and有点像union,如果是同一个element的属性的and,用下面的方法
$(”input[@name^=’S_’][@name$=’_R’]”).autocomplete(”autocomplete_backend.jsp”);
上面的是,input,名字以S_开始,并且以_R结束的元素。
贝贝爸 发表在 原创技术文章 |
11
07年6月
为了监控网站运行是否正常,写了一个脚本来检查网站运行的情况。
主要是自动登录并且校验登陆后的内容来判断网站web服务和数据库服务是否正常。
代码如下:
#!/usr/bin/env python
# -*- coding: gbk -*-
import urllib
import urllib2
import ClientCookie
import re
import string
import time
import socket
timeout=10
server="www.juyimeng.com"
loginurl="http://"+server+"/login.php"
v_account=[
{"name":"user1","pass":"pass1","utype":"1","vkey":"用户1"},
{"name":"user2","pass":"pass2","utype":"2","vkey":"用户2"}
]
def fes_write(s):
'''
控制输出信息的显示
'''
print s
def get_response(x):
'''
登录,取得登陆后的页面html代码,用来判断结果
'''
fes_write("login for "+ x["name"])
eform = {'username':x["name"], 'password':x["pass"], 'usertype':x["utype"]}
qstring = urllib.urlencode( eform )
#print qstring
try:
request = urllib2.Request( loginurl , qstring )
response = ClientCookie.urlopen( request )
return string.split( response.read(),"\n")
except Exception, e:
fes_write(e)
return "error"
def verify_info(k,l):
'''
校验信息是否正确
'''
for line in l:
if k.match(line):
return True
break
return False
def verify_all():
'''
主程序,进行校验
'''
if timeout!=0:
socket.setdefaulttimeout(timeout )
fes_write("socket time out: " + str(socket.getdefaulttimeout()))
success_num=len(v_account)
for x in v_account:
vkey=re.compile('.*'+x["vkey"]+'.*')
if verify_info(vkey,get_response(x))==True:
success_num=success_num-1
fes_write(x["name"]+ " login success!")
else:
fes_write("error when " + x["name"]+ "login!")
if success_num==0:
fes_write("all things runs well!")
else:
e_notify()
fes_write("some thing is wrong!")
def e_notify():
'''
出错之后的notify操作
'''
pass
if __name__ == '__main__':
verify_all()
v_account定义了多个账户,因为用户可能不同,后台机制不一样,所以用多个用户来登录
request = urllib2.Request( loginurl , qstring ) 用的是post的方法,也可以用get的方法。
ClientCookie,一个python的扩展包,安装请参考这里
2个v_account里的vkey用来和登陆后的页面上的信息来验证是否正常登录的
socket.setdefaulttimeout用来设置建立socket连接的超时设置,原来没有设置,程序会一直等待回应(如果服务器端做了最长运行时间会好点),设置了10秒,如果一个登录程序10秒还没有成功,基本上就失败了。
e_notify:可以自己设置一些notify的方法,比如邮件,短消息等。
贝贝爸 发表在 原创技术文章 |
9
07年6月
写了一个服务器的监控程序,里面用到邮件提醒功能。python sample code里面没有认证的部分,于是查了文档,google了一下,下了如下的smtp发送邮件的函数,支持smtp验证。代码如下:
#!/usr/bin/env python
# -*- coding: gbk -*-
#导入smtplib和MIMEText
import smtplib
from email.mime.text import MIMEText
#############
#要发给谁,这里发给2个人
mailto_list=["aaa@juyimeng.com","bbb@juyimeng.com"]
#####################
#设置服务器,用户名、口令以及邮箱的后缀
mail_host="smtp.126.com"
mail_user="xxx"
mail_pass="yyy"
mail_postfix="126.com"
######################
def send_mail(to_list,sub,content):
'''
to_list:发给谁
sub:主题
content:内容
send_mail("aaa@126.com","sub","content")
'''
me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
msg = MIMEText(content)
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me, to_list, msg.as_string())
s.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == '__main__':
if send_mail(mailto_list,"subject","content"):
print "发送成功"
else:
print "发送失败"
有问题请指教
贝贝爸 发表在 原创技术文章 |
7
07年6月
mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行
long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes
long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,我生成的log就在mysql的data目录
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。
把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境。
接下来就是分析了,我这里的文件名字叫host-slow.log。
先mysqldumpslow –help以下,俺主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
-s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。
用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。
贝贝爸 发表在 原创技术文章 |
3
07年6月
jQuery的选择器是CSS 1-3,XPath的结合物。现在有个需求,连接到外部网站的链接都在新窗口打开,以前的方法很简单就是在链接的地方写上target=”_blank”,但是这样有2个不好的地方。
1.target=”_blank”,不符合严格的DOCTYPE(xhtml1-strict.dtd),参见这里
2.如果自己写blog,代码里面如果有其他网站的链接,都要自己手工加,可能会忘。
现在想用jquery来完成这个工作,思路是,找到所有有链接的节点,如果里面的href是以”http”开始的,并且里面没有本站的域名juyimeng.com的,就给他加一个value为”_blank”的target(如果原来有,就修改成”_blank”)。
第一个很简单,就是
a[@href^=http]
现在是要过滤掉里面含有指定关键字的,找了半天手册,google,发现其实很简单,用一个not就可以了
not(”[@href*=juyimeng.com]
意思是,去除掉href属性里面含有juyimeng.com的节点。
其他的一些用法如下:
E[@foo] 拥有foo属性的E元素
E[@foo=bar] foo属性的值为bar的E元素
E[@foo^=bar] foo属性的值以字符串”bar”开始的E元素
E[@foo$=bar] foo属性的值以字符串”bar”结尾的E元素
E[@foo*=bar] foo属性的值包含有字符串”bar”结尾的E元素
实现整个功能的代码如下:
$("a[@href^=http]").not("[@href*=juyimeng.com]").click(function() {
this.target="blank";
});
测试通过,可能写的不是十分严密,但是已经能解决目前的问题了,不知道这里面能不能用正则表达式,或者大小写不敏感,如果可以,就能更精确地实现功能。
有错请提出.:D
贝贝爸 发表在 原创技术文章 |
2
07年6月
我们先导入必须用到的一个module
>>> import time
设置一个时间的格式,下面会用到
>>>ISOTIMEFORMAT=’%Y-%m-%d %X’
看一下当前的时间,和其他很多语言相似这是从epoch(1970 年 1 月 1 日 00:00:00)开始到当前的秒数。
>>> time.time()
1180759620.859
上面的看不懂,换个格式来看看
>>> time.localtime()
(2007, 6, 2, 12, 47, 7, 5, 153, 0)
localtime返回tuple格式的时间,有一个和它类似的函数叫gmtime(),2个函数的差别是时区,gmtime()返回的是0时区的值,localtime返回的是当前时区的值。
>>> time.strftime( ISOTIMEFORMAT, time.localtime() )
‘2007-06-02 12:54:29′
用上我们的时间格式定义了,使用strftime对时间做一个转换,如果取现在的时间,time.localtime() 可以不用。
>>> time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
‘2007-06-02 12:54:31′
>>> time.strftime( ISOTIMEFORMAT, time.gmtime( time.time() ) )
‘2007-06-02 04:55:02′
上面展示了gmtime和localtime的区别。
查看时区用
>>> time.timezone
-28800
上面的值是一个秒值,是当前时区和0时区相差的描述,-28800=-8*3600,即为东八区。
帖几个简单的函数
def ISOString2Time( s ):
'''
convert a ISO format time to second
from:2006-04-12 16:46:40 to:23123123
把一个时间转化为秒
'''
return time.strptime( s, ISOTIMEFORMAT )
def Time2ISOString( s ):
'''
convert second to a ISO format time
from: 23123123 to: 2006-04-12 16:46:40
把给定的秒转化为定义的格式
'''
return time.strftime( ISOTIMEFORMAT, time.localtime( float( s ) ) )
def dateplustime( d, t ):
'''
d=2006-04-12 16:46:40
t=2小时
return 2006-04-12 18:46:40
计算一个日期相差多少秒的日期,time2sec是另外一个函数,可以处理,3天,13分钟,10小时等字符串,回头再来写这个,需要结合正则表达式。
'''
return Time2ISOString( time.mktime( ISOString2Time( d ) )+time2sec( t ) )
def dateMinDate( d1, d2 ):
'''
minus to iso format date,return seconds
计算2个时间相差多少秒
'''
d1=ISOString2Time( d1 )
d2=ISOString2Time( d2 )
return time.mktime( d1 )-time.mktime( d2 )
贝贝爸 发表在 原创技术文章 |