作者归档:贝贝爸

上海子明演出经纪有限公司的网络负责人的来信

今天收到一封email,起因是本站的一篇blog,请点击这里,内容已经作了修改,只真实记录了我们亲身经历的内容,删除掉了转贴的,有可能对子明公司声誉造成影响内容。
邮件如下:
主题: 请处理~
正文:
您好:
我是上海子明演出经纪有限公司的网络负责人,关于在贵网站上看到一篇帖子,帖子内容严重影响了本公司声誉,并且在您转帖的部分里叙述内容明显恶意攻击本公司,对本公司造成巨大负面影响,希望您能处理!

网络是提供各位会员自由言论的平台,但是一旦言论影响到个人或者公司的声誉的话,做为网站的管理人员应及时处理,希望互相配合不要把事情扩大话.谢谢!

您有任何疑问可以直接联系我,联系方式:021-321001XX 陈先生
E-mail: [email protected]
帖子地址:
http://www.juyimeng.com/huaihai-road-treatment-star-exploration.html#comment-248

希望此事能有个让大家满意的处理结果! 等待您的回复!

邮件结束

email里面的电话和邮件地址作了一些修改,不希望很多人骚扰陈先生,希望陈先生对我们的调整能感到满意,在此我真诚的向陈先生及子明公司道歉。

贝贝趣事二则

贝贝长的有点像男孩子,出去的时候很多次都给人认成是男孩子,即使穿上有花边的衣服,鲜艳的衣服,也有很多人来问说:这个小弟弟多大了?这天回来,听贝贝妈说,今天出去一个小朋友准确的辨认出了贝贝的性别,说是小妹妹。但是最后说了一句话让贝妈晕倒,问:这个小妹妹是男的还是女的?

贝贝现在还不会走,但是在家里想去哪里都可以,爬的那叫一个快。这天晚饭吃过,随手递给他一张抽纸给他玩儿,小家伙很麻利的擦了擦嘴,然后把纸拿到手里往门口爬去,大家都不知道她要干吗,结果贝贝爬到门口的垃圾桶边上,伸手要把擦过嘴的纸扔到垃圾桶里,第一次没成功,居然捡起来又扔了一次,第二次成功了。这倒好,从小养成好习惯,不乱丢垃圾,嘿嘿。

别小看我!

一天天长大的小贝贝总能给人惊喜,今天有2件事情让我们很惊讶。

天热了,纸尿裤不舒服,在家里一般不让贝贝穿,除了晚上睡觉,白天除了成功把尿,很多次都是尿在床上,地板上,地垫上。今天傍晚,贝贝,尿在了地垫上,爷爷去打扫战场对时候,由于光线比较暗,面积也小,找不到尿在那里了,于是问贝贝:你尿在那里了?贝贝二话没说,爬到自己尿的地方,并且“啪啪”的拍了起来,一家人惊喜万分,有道是,找铃还须造铃人阿。

晚上吃蒸蛋的时候,贝贝不老实,老是喜欢乱跑,我就给贝贝讲故事,讲的内容是拔萝卜的故事(贝贝妈给贝贝买了一些质地好,撕不烂的书,有乌鸦喝水,孔融让梨,拔萝卜等),我拿了一个可以手伸进去的维尼熊,用手做着动作就开始讲了,“春天来了,有个老爷爷在菜地里撒了萝卜种籽……”
突然,贝贝发脾气了,不知道怎么回事,我抱起来,问她要去哪里,她指着一堆她的玩具的地方。把她抱过去,径直爬到玩具堆里,一手拿出那本《拔萝卜》的书递给我,这时候才明白,原来是我讲的不标准,贝贝让我拿着书,准确的讲。

不能再小看贝贝了,已是什么都懂得了。(Y)

jquery进行and选择操作

工作中遇到需求,就是form里面所有的checkbox,radio都是必填的。
原来的做法是写多个function进行检查,部分代码如下

function checkElement(c) {
	for (var i=0;i<c.length;i++) {
		if (c&#91;i&#93;.checked) return true;
	}
	c&#91;0&#93;.focus();
	alert("请完成所有答题!");
	return false;
}
&#91;/code&#93;
需要传入要检查的radio或者checkbox。
原来的写法是要把所有要检查的object都写进去,比如
&#91;code lang="javascript" linenum="off"&#93;
result=checkElement(form1.check_1)&&checkElement(form1.radio_2);
&#91;/code&#93;
如果有10道8道还可以,如果多的话,就要写好多,还容易漏掉,出错。
这次有100多道题目,所以想用jquery来选择所有的checkbox和radio,然后再来检查。
代码如下:
&#91;code lang="javascript" linenum="off"&#93;
var myt="";
//用于存储生成的js校验字符串
//每次load页面,只生成一次,第一次的速度还是有点慢的
function check() {
	var result = true;
	if (myt==""){
//如果没有myt,就选择所有要检验的element列表,用来校验。
	var alle=$("select&#91;@name='text_79'&#93;,input&#91;@type='radio'&#93;,input&#91;@type='checkbox'&#93;");
	for (var i=0;i < alle.length;i++) {
    var myobj = alle&#91;i&#93;;
		if (i==0||alle&#91;i&#93;.name!=alle&#91;i-1&#93;.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结束的元素。

贝贝爷爷自我介绍

我是贝贝的爷爷,与人民共和国同龄。
虽已步入夕阳红,但却不愿虚度光阴。
学校辞职带孙女,空闲时间学育儿经。
随着孙女的成长,强身健体老有所乐。

简单经历

回头忆人生,道路坎坷经风雨。
工农商学兵,各行各业身都经。
童年百般苦,离乡背井为生计。
背包入学堂,已是大龄插班生。

贝贝爷爷要开博了!

贝贝爸的爸爸,贝贝的爷爷在贝贝出生的时候来了一段,这次从一月份从学校辞职来带贝贝已经5,6个月了。贝贝爷爷平时喜欢看书学习,会拉二胡,喜欢书法,练习过一段绘画,用炭笔的那种,贝爸小时候,贝贝爷爷还喜欢搞一些花花草草,嫁接月季什么的,可以让一株月季上长出多种颜色的花。有多年的驾驶经验,退休后又做过驾驶教员,这几年在一个交通学院教理论知识。
现在一家人都围着贝贝转,每个人都可以从不同的角度见证贝贝的成长。贝贝爷爷带贝贝的时间也很长,也为了让贝贝爷爷进行一下创作,就动员贝贝爷爷也来写一些东西。
贝贝爷爷负责写,贝妈,贝爸负责录入,贝贝爷爷视力不太好了。:S
今天先录入一篇,算是开张了!

python登录并校验是否成功

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

简单的python smtp发邮件代码

写了一个服务器的监控程序,里面用到邮件提醒功能。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=["[email protected]","[email protected]"]
#####################
#设置服务器,用户名、口令以及邮箱的后缀
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("[email protected]","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 "发送失败"

有问题请指教

用mysqldumpslow分析mysql的slow query log

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