Archive for the ‘原创技术文章’ Category

jquery选择例子3

九月 27th, 2007

选取一个name为”S_03_22″的input text框的上一个td的text值
$(“input[@name=S_03_22]“).parent().prev().text()

名字以”S_”开始,并且不是以”_R”结尾的
$(“input[@name^='S_']“).not(“[@name$='_R']“)

一个名为radio_01的radio所选的值
$(“input[@name=radio_01][@checked]“).val();

Popularity: 34%

删除表中重复数据的sql

八月 21st, 2007

一张多用户的通讯记录表,主要是手机信息,每个用户可以建立自己的联系人组。
原来数据对数据没有校验,用户可以在一个组里面输入重复手机号码,如果数据量大,会造成数据重复。
所以要做一个唯一性的索引,如下:

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)

Popularity: 22%

share一下贝贝成长进度的php代码

七月 23rd, 2007

主要功能是根据贝贝的出生日期来显示贝贝现在多大了,实时显示贝贝的成长。
用当前时间减去出生的日期,但是可以显示出来几岁,几个月,和几天。
天的算法有点问题,没有考虑到大小月和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;
}

用的时候直接

<?php echo getDays();?>

就可以了
空下来再完善以下,再写一个js的版本。
有bug请拍砖,有好的写法请留言。
您可以免费用,但是请留个到本页的链接。谢谢

Popularity: 36%

mysql去除特殊asc码

七月 22nd, 2007

要做一个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
看来眼见不一定为实啊。

Popularity: 20%

jquery 3例

七月 20th, 2007

jquery使用2例
1.把

<div id="a01">0</div>

里面的数值增加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;
                            
});

Popularity: 23%

jquery进行and选择操作

六月 21st, 2007

工作中遇到需求,就是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结束的元素。

Popularity: 21%

python登录并校验是否成功

六月 11th, 2007

为了监控网站运行是否正常,写了一个脚本来检查网站运行的情况。
主要是自动登录并且校验登陆后的内容来判断网站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的方法,比如邮件,短消息等。

Popularity: 24%

简单的python smtp发邮件代码

六月 9th, 2007

写了一个服务器的监控程序,里面用到邮件提醒功能。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 "发送失败"

有问题请指教

Popularity: 33%

用mysqldumpslow分析mysql的slow query log

六月 7th, 2007

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语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。

Popularity: 29%

jquery选择满足条件,排除指定条件

六月 3rd, 2007

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

Popularity: 22%