2016年2月3日星期三

MySQL Too many connections解决方法

1.先检查代码是否及时关闭了MySQL的连接,或者是开启的连接池太大
MySQL默认的连接个数是151:
mysql>  show variables like 'max_connections' \G
*************************** 1. row ***************************
Variable_name: max_connections
        Value: 151
1 row in set (0.00 sec)


2.如果需要改变打开个数可以修改my.cnf将
max_connections = XXX
改成需要的个数。

或者通过mysql client改变,用root角色进入MySQL:

mysql>  set global max_connections=5000;
Query OK, 0 rows affected (0.00 sec)

mysql>  show variables like 'max_connections' \G
*************************** 1. row ***************************
Variable_name: max_connections
        Value: 5000
1 row in set (0.00 sec)

2015年12月13日星期日

Python atexit模块使用

atexit提供了一个程序退出时候的回调函数注册接口,比如你需要关掉文件,
保存当前数据等,当程序exit()时候自动调用回调函数,可以注册多个接口,
他们的调用顺序和注册顺序相反:

import atexit
import sys
import time

def goodbye(name, word):
  print 'Goodbye, %s, %s...' % (name, word)
  print 'pretend clean up resource...'


def first_register():
  print 'I am first register, but last called...'


atexit.register(first_register)
atexit.register(goodbye, 'python', 'see you again')


if __name__ == '__main__':
  time.sleep(3)
  if 1 == 1:
    exit(1)
  else:
    print 'exit(0)'
    exit(0)

2015年10月21日星期三

Python 使用 sock5 代理进行requests请求实例

找了很多的版本都有问题,总算有个可用的了:

需要安装依赖 python-socksipy==1.0



import socket
import socks
import requests

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "182.92.178.227", 1080)
socket.socket = socks.socksocket
url = u'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=inurl%E8%A2%8B'
print(requests.get(url).text)

2015年9月26日星期六

Python参数说明

-B     Don't write .py[co] files on import. 不产生pyc或者pyo文件
-c     执行字符串参数 如 python -c "print 1"
-d     产生调试信息
-E     Ignore environment variables like PYTHONPATH and PYTHONHOME that modify the behavior of the interpreter. 忽略环境变量
-i     执行完脚本以后 会打开解释器 在调试时候使用比较好
-m     比如 python -m SimpleHTTPServer 8088 从sys.path找到一个模块然后执行模块代码
-O     基本优化 会丢掉docstring
-R     hash() 返回伪随机数
-Q     控制两个整数相除得到的类型 如 python -Q new -c "print 10/100"
-v     显示加载模块 如 python -v -c "print 1"
-s     Don't add user site directory to sys.path.
-S     Disable the import of the module site and the site-dependent manipulations of sys.path that it entails.
-t     检测tab和空格混用 给出警告
-u     Force  stdin,  stdout  and stderr to be totally unbuffered.  On systems where it matters, also put stdin, stdout and stderr in binary mode.  Note that there is internal buffering in xreadlines(), readlines()  and  file-object iterators  ("for line in sys.stdin") which is not influenced by this option.  To work around this, you will want
to use "sys.stdin.readline()" inside a "while 1:" loop.

强制 标准输入 标准输出 标准错误 无缓冲 在nohup python test.py中用比较好 如
nohup python -u script.py > log.log 2>&1 & 会把日志实时写入log.log 而不是等待缓冲区
满了再写入
-W    警告相关的参数

2015年5月31日星期日

一次成功又失败的面试

       昨天去一个公司面试,做的事情侣移动应用。面试官太能说了,他说起话来可以持续很久的时间,听得我好累,对我这样反应比较慢的人来说好痛苦。
       他先问了我:"xxxxx学院是本科吧?",我说是的(高考考不好害死人啊...),接着说对我简历上的项目很有兴趣(其实那个东西很水,做得很烂,我参与的程度很低,简历实在没得写,哎),和他扯了几句,估计他也没听懂究竟是什么。
       接着他说要的是主程序,我就心虚了,我这种水货,怎么当主程序啊?! 然后他就开始balabala扯公司的前景和产品啥的,听得我一愣一愣的,然后就问我期待工资多少。其实我不太会谈工资,招聘网站上写的xx-xx,我直接说了个y,当然是比xx要少的,他就问我:"你觉得自己值这个价吗?"。我心里咯噔一下,这又是要鄙视我的啊(之前被鄙视太多了,还有直接给个3K的,应届生也不能只给3K啊。)。我竟无言以对,也没说出来个123,他竟然也没说什么,吓我一跳。接着说产品什么什么的,我跟着有一搭没一搭的扯着,最好搞了半天,他表示很看好我,问了我两次有没有其他面试我晕死啊,我几乎什么都没说,他一个技术问题也没问,如果我是面试官的话,根本看不出来自己的价值,肯定直接让我get out office了。看不出来是我在出卖劳动力还是他在销售产品。这公司肯定急缺人手,但是也不能这样玩吧,只看简历能看出来什么东西,难道是我的屌丝气质吸引了他?!这对公司和个人都是很不负责的事情。因为程序这种工作,还是要看看过去的代码,只看简历是没有用的,仅仅凭一个小时,看简历嘴上说说,怎么看出来一个人能不能做事情,这也太草率了。
       这次面试对我来说是成功的,因为我的求职目的达到了,同时也是失败的。因为我可能根本无力升任这个工作,真是纠结,不知道到底去不去,哈哈,可能我就是个矛盾体吧,很少自信,不过做事情的能力还算可以,真是撑死胆大的,饿死胆小的。

2015年5月25日星期一

为什么要有同源策略

   同源策略,是一个在Web应用安全中的一个重要的模型,它定义了两个站点之间是否可以执行彼此的脚本,比如A站不能通过脚本访问B站的cookie,不然会用户的信息毫无安全性可言了。
我们学会了如何解析URL,就好理解同源策略了,它的定义是:如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。那么两个在URL中:
scheme://[login[:password]@](host_name|host_address)[:port][/hierarchical/path/to/resource[?search_string][#fragment_id]]
scheme,host_name,port就决定了是否同源。具体实例可以参考MDN
那么为什么要有同源策略,没有的话怎么样,这篇文章里说,如果没有同源策略的话,你的个人信息容易被获取到,但是没说如何获取,在不同的浏览器Tab中,总无法读取另一个页面的DOM吧,简单的方法是使用iframe,我们看一个简单的例子,使用本地文本one.html作为一个含有敏感信息的网站:

one.html:
<input type="text" value="myuser" id="user" /> <br> <input type="password" value="123456" id="pwd" />
通过iframe.html读取它的信息,并把iframe隐藏掉:
<!DOCTYPE html> <html lang="en"> <head> <title>fream</title> <style> iframe { display: none; width: 1000px; height: 500px; } </style> <meta charset="UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <script> window.onload = function () { var iframe_one = document.getElementById('one-iframe'); var iframe_one_document = iframe_one.contentWindow.document; alert(iframe_one_document.getElementById('user').value + ' with password: ' + iframe_one_document.getElementById('pwd').value); } </script> <iframe id="one-iframe" src="./one.html" /> </body> </html>
这样就很容易得到有用的信息了,如果不同的域之间可以随意获取DOM对象数据的话,那么随便造很多网站就能得到其他网站的信息了,那样就无所谓安全了。 出于这样的考虑,有了同源策略,在同一个域下的脚本才能进行DOM操作,想要进行跨域操作的话,常见的是使用CORS或者JSONP,那将是另一个主题了。 如何绕过同源策略,更是一个有意思的安全问题,以后再深入学习吧。 参考: 1.同源策略——浏览器的安全卫士 2.JavaScript 的同源策略

2015年5月24日星期日

解析URL

  URL,就是我们天天使用的网址,英文全称叫做uniform resource locator,你可以把它理解成互联网上每个页面独一无二的名字。其实也不全是页面了,比如一些FTP下载资源,或者网页上的mailto链接,都是使用URL表示的。其实URL就相当于互联网字典上的索引,这些资源本来是一个个的孤岛,被一些工具(比如搜索引擎)整合后,使得互联网得以连接,所有的links加起来,就是我们看到的互联网了
URL的语法如下:
scheme://[login[:password]@](host_name|host_address)[:port][/hierarchical/path/to/resource[?search_string][#fragment_id]]
一个一个看:
  scheme,不是那个满屏幕小括号的编程语言,而是方案的意思,其实我认为可以理解成打开一个互联网资源的方式,比如http和ftp就是不同的方式,常用的scheme包括http,https,ftp,mailto,javascript,file(一般是打开本地浏览器可以打开的资源时使用的),chrome(Chrome浏览器特有的,一般用于插件)。scheme名称后加一个冒号,标准写法是在':'前只能出现[a-z][A-Z][0-1]+-.这些字符的,但是很多浏览器对于额外的字符也能够解释,比如下面这样的HTML代码,对于Chrome也是可以解析的:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>scheme</title>
</head>
<body>
    <a href="http:

www.baidu.com">baidu</a>
<a href="javascript	:alert(1);">javascript alert()</a>
</body>
</html>
& # 0 9 ;(合起来)在HTML中是TAB的转移字符,可以在free-formatter中转义回来。
不过对于Firefox第二个弹窗代码就没法使用了,它解释成了file:///Users/zookeep/Desktop/web/javascript:alert%281%29;一个本地文件的相对路径地址.

对于Safarier,会把第一个URL解释成http:%0A%0A//www.baidu.com其中的换行符变成了line feed就无法打开百度了。

对于scheme,我们试试file一个本地可执行文件hello.exe,发现它没法执行文件而是把它下载下来了,看来file方法只能打开浏览器可以识别的格式的文件,比如html,PDF等。

scheme后面跟了两个反斜杠//,如果不写的话,又会怎么样:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>without //</title>
</head>
<body>
    <a href="http:baidu.com">baidu</a>
    <a href="./http:baidu.com">baidu</a>
</body>
</html>
第一个没有指定目录,会被解释成和http://baidu.com一样的URL,而加上./(表示当前目录),则会被解释成一个本地的目录.
如果我们省略掉scheme的话,只用//filename的话又会怎样:

Chrome下 //filename 会打开本地文件 
Safair 则没反应
IE 会转到http://hello

下面是[login[:password]@]用户的认证信息,这个其实现在用处不大,几乎没人会让用户这样验证,都是表单验证了。
不过这个认证信息选项会让一些URL看起来很邪恶,我们以后再看。

接下来是主机名或者主机IP地址,比如localhost,或者一个域名google.com或者一个IP:http://74.125.130.99(同样是Google).不过这些常规的写法大家都明白,那么一些猥琐的写法可以是这样的:
http://0x7f.1
http://017700000001
同样都是localhost的表示,第一个是把点分十进制第一个127写成16进制,其他三个组成一个数字,第二个是把127.0.0.1每一个十进制都转为8进制然后加个0表示八进制的IP。 对于Google地址 74.125.130.99我们也可以这样写: >>> a = '74.125.130.99' >>> map(hex, map(int, a.split('.'))) ['0x4a', '0x7d', '0x82', '0x63'] >>> '.'.join(map(hex, map(int, a.split('.')))) '0x4a.0x7d.0x82.0x63' 或者: >>> '.'.join(map(oct, map(int, a.split('.')))) '0112.0175.0202.0143' 对于端口号倒是没什么可以玩的,记住常用的http是80, https是443就行了。 下一个是路径和资源比如/home/user/index.html这样的文件,不过现在很多都不显示文件的后缀了,因为都是动态网站了... 下一个是查询字符串,这个就很有用了,比如使用taobao的时候你输入的查询内容就会被填充到query中, 比如taobao.com/search?q=html就能在taobao找到你要的宝贝了... 下一个是片段ID,这个可是个好东西,不过注意它和服务器可是没有交互的,只是会在当前页面找到一片内容,由浏览器跳到那里去, 更多的内容可以参考 这里。 好了,我们基本上看完了URL的基本解析方式,那么如下的URL到底会把你带到哪里: http://qq.com&location=12306.com@evil.net http://a@b@c.com http://www.sina.com&id=123@0300.0250.01.01 ok,看第一个,这不就是qq嘛,好了,你把它输入Chrome一看,跑到了evil.net什么鸟玩意... 第二个,也许会是a@b@c.com,进去看看再说,不过Chrome把我们带到了c.com 第三个,估计是sina网吧...好吧,它把我带到了我的路由器登录页上.这是什么乱七八糟的?! 其实,URL的解释是没错的,不过我们忽视了登录信息罢了,[login[:password]@]: 第一个URL中,qq.com&location=12306都被当做了你访问evil.net的用户名了 同样的a@b也被当成c.com的认证消息了, 第三个也是一样,只不过把域名换成了一个IP地址,更加难以看出真实的hosts是谁.如果再用HTML转义一下,估计就没人能看清楚了,哈哈... 不过我发现,万能的Chrome还是可以在你的地址栏中高亮出真实的网址:
关于URL的解析我们算是搞明白了。