6 |
7 | mongorestore -d DATABASE ./dump-folder
8 |
9 |
10 | or 查询
11 | 查询时,有时需要一个值在多个字段中,比如:用户输入的可能是邮箱,也可能是手机号码,那么我需要用or来操作:
12 |
13 | {$or: [{username: xxxxx}, {phone: xxxxxxx}]}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/note/mongodb/replset.md:
--------------------------------------------------------------------------------
1 | 守护进程方式启动mongodb进程
2 | mongod --fork --dbpath data/rs0-0 --logpath log/rs0-0/rs0-0.log --rest --replSet rs0 --port 37017
3 |
4 | 2015-06-18T13:57:11.637+0800 ** WARNING: --rest is specified without --httpinterface,
5 | 2015-06-18T13:57:11.638+0800 ** enabling http interface
6 | about to fork child process, waiting until server is ready for connections.
7 | forked process: 14141
8 | child process started successfully, parent exiting
--------------------------------------------------------------------------------
/note/mysql/index.py:
--------------------------------------------------------------------------------
1 | #! encoding=utf-8
2 |
3 | import MySQLdb
4 | import random
5 |
6 | try:
7 | conn = MySQLdb.connect(
8 | host='localhost',
9 | user='root',
10 | passwd='root',
11 | db='django_blog'
12 | )
13 | except MySQLdb.Error, e:
14 | print "MySQL error %d:%s" % [e.args[0], e.args[1]]
15 |
16 |
17 | def create_table(conn):
18 | cursor = conn.cursor()
19 | cursor.execute('CREATE TABLE IF NOT EXISTS my_user\
20 | (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,\
21 | name varchar(50) NOT NULL,\
22 | code varchar(50) NOT NULL \
23 | )'
24 | )
25 | cursor.close()
26 |
27 | def insert_data(conn):
28 | '''
29 | 随机插入10万条数据
30 | '''
31 | cursor = conn.cursor()
32 | names = ((random_name(), random_code()) for i in xrange(100000))
33 | cursor.executemany('INSERT INTO my_user (name, code) VALUES (%s, %s)', names)
34 | conn.commit()
35 |
36 | def random_name():
37 | a_z = [ chr(97+i) for i in range(26)]
38 | return ''.join(random.sample(a_z, random.randint(1,26)))
39 |
40 | def random_code():
41 |
42 | return ''.join((str(random.randint(0,10)) for i in range(18)))
43 |
44 |
45 |
46 | if __name__ == '__main__':
47 | create_table(conn)
48 | insert_data(conn)
49 |
50 |
--------------------------------------------------------------------------------
/note/mysql/mysqldump.md:
--------------------------------------------------------------------------------
1 | mysqldump备份恢复数据库
2 | =======================
3 | mysqldump程序可以用来备份和恢复数据库,默认情况mysqldump会创建drop table, create table,和insert into的sql语句.
4 |
5 | 语法
6 |
7 | > mysqldump [options] db_name [tbl_name ...]
8 | > mysqldump [options] --databases db_name ...
9 | > mysqldump [options] --all-databases
10 |
11 | 备份指定数据库
12 |
13 | mysqldump -uroot -p[passwd] db1 > dumpfilename.sql
14 |
15 | 备份多个数据库
16 |
17 | mysqldump -uroot -p[passwd] --databases db1 db2 > dumpfilename.sql
18 | 备份所有数据库
19 |
20 | mysqldump -uroot -p[passwd] --all-databases > dumpfile.sql
21 |
22 | 备份指定表
23 |
24 | mysqldump -uroot -p[passwd] db1 table1 > db1_table1.sql
25 |
26 | 只备份表结构
27 |
28 | mysqldump -uroot -p[passwd] -d db1 > dumpfile.sql
29 |
30 | 如果不想要drop table, 附上参数`--compact`
31 |
32 | mysqldump -uroot -p[passwd] --compact db1 > dumpfile.sql
33 |
34 | 还原
35 |
36 | mysql -uroot -ppassword db1 < dumpfile.sql
37 |
38 |
39 | 如果存储引擎是MYISAM,还可以使用`mysqlhotcopy`
40 |
41 | mysqlhotcopy -u root -p passwd db1 备份目录
42 |
43 | 注意,-u后面有个空格, mysqlhotcopy相当于把数据库文件拷贝到新的目录. 恢复的方法就是把该备份目录拷贝到mysql数据目录下面.
44 |
--------------------------------------------------------------------------------
/note/mysql/slow_query.md:
--------------------------------------------------------------------------------
1 | MySQL慢查询
2 | ==========
3 | 慢查询日志是由一些SQL语句构成的,当查询时间超过了`long_query_time`的值时会生成慢查询日志,long_query_time的最小值是1s,默认值是10s。
4 |
5 | 检查MySQL慢查询是否开启:
6 |
7 | mysql> show variables like '%slow%';
8 | +---------------------+----------------------------------------------------------+
9 | | Variable_name | Value |
10 | +---------------------+----------------------------------------------------------+
11 | | slow_launch_time | 2 |
12 | | slow_query_log | OFF |
13 | | slow_query_log_file | E:\Program Files\mysql-5.6.10-winx64\data\lzjun-slow.log |
14 | +---------------------+----------------------------------------------------------+
15 | 3 rows in set (0.00 sec)
16 |
17 | 默认MySQL的slow_query_log是OFF,开启的方法有:
18 |
19 | 1. 启动MySQL的时候开启:
20 |
21 | mysqld --slow_query_log=[{0|1}] #MySQL5.5及以上版本
22 | 不指定值或者1表示开启,0表示关闭
23 | mysqld --slow_query_log_file=file_name
24 | 指定日志文件的保存的地方,如果指定,那么默认是保存在存放数据目录的`homename-slow.log`文件中。
25 |
26 | mysqld --log-slow-queries[=file_name] #MySQL5.1及以下版本
27 |
28 | 2. MySQL启动后设置
29 |
30 | set global slow_query_log=[1|0|ON|OFF]
31 | set global slow_query_log_file=[file_name]
32 |
33 | 3. my.ini中配置
34 |
35 | slow_query_log=1
36 | slow_query_log_file=/var/log/mysql_slow.log
37 |
38 | 一般long_query_time的值不宜设置过大,默认值10秒就显得不合适,通常2-5秒是理想值。当然慢查询日志会对MySQL性能有影响。如果是主从结构打开一台专门用来监控慢查询好了。
39 |
40 |
--------------------------------------------------------------------------------
/note/mysql/transation.md:
--------------------------------------------------------------------------------
1 | MySQL中innodb实现的事务的ACID,MySQL中的事务分为两种:第一种是标准事务(normal transaction),第二种是语句事务(statement transaction).
2 |
3 | 标准事务用begin,rollback,commit实现
4 |
5 | 语句事务通过set改变mysql的自动提交模式,默认mysql是自动提交的,也就是每一条语句对应一个事务
6 |
--------------------------------------------------------------------------------
/note/mysql/tree.md:
--------------------------------------------------------------------------------
1 | 二叉树
2 | =========
3 | [二叉树](http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91)是每个节点最多有两个子树的数结构
4 | 
5 | ###树的遍历
6 | [树的遍历](http://zh.wikipedia.org/wiki/%E6%A0%91%E7%9A%84%E9%81%8D%E5%8E%86#.E4.B8.AD.E5.BA.8F.E9.81.8D.E5.8E.86)是通过一种方法按照一定的顺序访问一颗树的过程,二叉树的便利方式常见的有三种:先序遍历、中序遍历、后续遍历。
7 | **先序遍历**:首先访问根节点然后遍历左子树,最后遍历右子树。假单记作**根左右**,上图按照先序遍历为:6 3 2 5 7 8
8 | **中序遍历**:先遍历左子树,然后访问根节点,再遍历右子树。简单记住**左根右**,上图按照中序遍历的结果就是:2 3 5 6 7 8
9 | **后续遍历**:先遍历左子树,然后遍历右子树,最后遍历访问根节点,简单记住**左右根**,上图按照后续遍历的结果是:2 5 3 7 8 6
10 | 从中可以看出一点规律是**前中后**都是相对于根节点而言的,然后左右顺序是不变的,变得只是根节点的位置。
11 | ###二叉查找树
12 | 二叉查找树中,左子树的值总是小于根的值,右子树的值总是大于根的值,满足这样条件的二叉树就是二叉查找树,它又称为有序二叉树。上图就是一颗二叉查找树。
13 |
14 | 对于上图中的二叉查找树,如果想查找值为7的节点,先从根节点找,6 > 7,然后往右子树查找,第二次就找到了,而如果按照从小到大的顺序找的话,要找5次才能找到。但是二叉查找树是可以有不同构建方式的,比如下图也是一个二叉查找树:
15 | 
16 | 然而对于这样的二叉查找树,它的查询效率就比较前面那种要低了,前面的平均查找时间为(1+2+2+3+3+3)/6=2.3,而后面那种二叉查找树的平均查找时间为:(1+2+3+4+5+5)/6=3.16,因此要想查询效率高效就要尽可能使得二叉查找树能均匀的分布,这就有了平衡二叉树。
17 |
18 | ###平衡二叉树
19 | 平衡二叉树是在满足二叉查找树的条件下,任何节点的左右两个子树的高度差不能大于1,比如上图中,节点5的右子树高度是2,左子树没有,他们的高度差为2,显然就不满足平衡二叉树的条件。
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/note/nginx/nginx故障分析.md:
--------------------------------------------------------------------------------
1 | #nginx故障分析
2 | Nginx安装完成后,在公网上访问80端口的网址,结果没有任何响应。那么问题出现在哪里呢,一步步排查问题。
3 |
4 | 1. 首先确认nginx安装没有问题,查看nginx是否启动成功。
5 |
6 | ps -ef |grep nginx
7 | 看看有没有nginx进程是否有在运行。
8 |
9 | root 16817 1 0 17:23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
10 | nobody 17029 16817 0 18:09 ? 00:00:00 nginx: worker process
11 | 这一步可以确定nginx服务是启动了的。
12 |
13 | 2. 查看端口占用情况,看nginx指定的端口是不是配置文件里面指定的80端口。
14 |
15 | lsof -i:80
16 |
17 | nginx 16817 root 6u IPv4 1549186 0t0 TCP *:http (LISTEN)
18 | nginx 17029 nobody 6u IPv4 1549186 0t0 TCP *:http (LISTEN)
19 |
20 | 或者
21 | netstat -lanp|grep 80
22 |
23 | tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16817/nginx: master
24 |
25 | 端口确定是nginx占用之后,接着往下查
26 |
27 | 3. 本地网络是否可以访问该地址
28 |
29 | curl http://localhost
30 | 有内容返回:
31 |
32 | curl http://localhost
33 |
34 |
35 |
36 | Welcome to nginx!
37 | .....
38 | 这里你可以确认问题出现在网络层,继续排查
39 | 4. 看看网络是否可以访问80端口,用telnet
40 |
41 | telnet xx.xx.xx.xx 80
42 |
43 | C:\Users\lzjun>telnet 123.57.218.39 80
44 | 正在连接123.57.218.39...无法打开到主机的连接。 在端口 80: 连接失败
45 | 网络不通,那么说明网络不通。
46 |
47 | 来看看是不是防火墙问题。
48 | 。。。。。
--------------------------------------------------------------------------------
/note/nginx/try_file.md:
--------------------------------------------------------------------------------
1 | try_file.md
2 |
3 |
4 |
5 | http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
6 |
7 | http://www.hi-linux.com/2016/03/29/Nginx%E7%9A%84try_files%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8%E5%AE%9E%E4%BE%8B/
8 |
9 | http://huoding.com/2013/10/23/290
--------------------------------------------------------------------------------
/note/nginx/try_files.md:
--------------------------------------------------------------------------------
1 | try_files.md
2 |
3 | Syntax: try_files file ... uri;
4 | try_files file ... =code;
5 | Default: —
6 | Context: server, location
7 |
8 | http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
--------------------------------------------------------------------------------
/note/python/Django_admin_site.md:
--------------------------------------------------------------------------------
1 | ###使用Django admin模块,必须:
2 | 1. 添加`django.contrib.admin` 到`INSTALLED_APPS`中
3 | 2. admin依赖的app包括:`django.contrib.auth`,`django.contrib.contenttypes`,`django.contrib.messages`和`django.contrib.sessions`
4 | 3. 添加`django.contrib.messages.context_processors.messsags`到`TEMPLATE_CONTEXT_PROCESSORS`
5 | 4. 添加`django.contrib.auth.middleware.AuthenticateionMiddleware`和`django.contrib.messages.middleware.MessageMiddleware`,`到MIDDLEWARE_CLASS`
6 |
7 | ###ModelAdmin.actions
8 |
9 | 自定义action函数和普通函数没啥区别,需要是三个参数:当前的 ModelAdmin,当前的HttpRequest,用户说选中的QuerySet
10 |
11 | def make_publiced(modleadmin,request,queryset):
12 | queryset.update(public=False)
13 |
14 | 直接调用queryset的update比逐个迭代entity更高效。默认action的下拉列表显示的名字就是函数名`make_publiced`,但是你可以起一个更优雅的名字:
15 |
16 | make_publiced.short_description = u"标记为公开"
17 |
18 | 最后一步就是告诉modelaction
19 |
20 | actions = ['make_publiced']
21 |
22 | 以上就是你需要做的全部
23 | https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/
24 |
--------------------------------------------------------------------------------
/note/python/README.md:
--------------------------------------------------------------------------------
1 | 1. [如何理解关键字yield](what-does-the-yield-keyword-do-in-python.md)
2 | 1. [Python如何使用static、class、abstract方法](./guide-python-static-class-abstract-methods.md)
3 | 5. [collections学习笔记](./collections.md)
4 | 5. [函数式编程------序列处理函数](./function_programming_of_function_processing_functions.md)
5 | 6. [协程](./coroutine.md)
6 | 7. [装饰器](./decorators.md)
7 | 10. [异常](./exception.md)
8 | 11. [yield 生成器](./generator.md)
9 | 12. [迭代器与生成器的区别](./iterator_generator.md)
10 | 13. [python json](./json.md)
11 | 15. [Python虚拟环境:virtualenv](./virtualenv.md)
12 | 16. [Python实用技巧](./useful_features.md)
13 | 17. [python测试](./testing.md)
14 | 18. [gevent简介](./gevent.md)
15 | 19. [Django应用部署(nginx、gunicorn、virtualenv、supervisor)](.\note\python\deploy_django_with_nginx.md)
16 | 20. [理解WSGI](./wsgi.md)
17 | 21. [Flask之Hello world详解](./flask.md)
18 |
19 | #####Django
20 | 1. [Django测试指南](./a_guide_to_testing_in_django.md)
21 | 2. [Django模版语言](./django_template.md)
22 | 3. [使用django-simple-captcha遇到的坑](./captcha.md)
23 | 3. [Python/Django编程实践指南](./code_style.md)
24 | 8. [Django Form](./django_form.md)
25 | 9. [Django url()函数详解](./django_url.md)
26 | 10. [Django signal](./signals.md)
27 |
28 |
29 | #####Mako模板
30 |
31 | 5. [mako简介](./mako.md)
32 |
33 | #####SQLAlchemy
34 | 14. [SQLAlchemy学习笔记](./sqlalchemy.md)
35 |
36 |
--------------------------------------------------------------------------------
/note/python/a_guide_to_testing_in_django.md:
--------------------------------------------------------------------------------
1 | #Django 测试指南
2 |
3 | 对绝大部分人来说,测试Django应用感觉很神秘,他们只是听说代码必须要测试,但是经常找不到线索如何入手。当他们看了Django的[测试文档](http://docs.djangoproject.com/en/1.3/topics/testing/),他们找到深入的哪些功能是可用的,但是如果实现没有任何指导。
4 |
5 | 这是本博客系列的第一篇,尝试帮助大家减轻压力,使得每个人在测试潮流。假设你从来没有做过任何测试,但是对Python&Django很熟悉了。
6 |
7 | 我们将贯穿添加测试到perennial [教程](https://docs.djangoproject.com/en/1.3/intro/tutorial01/),为了更好的关注,我上传了代码到[Github](https://github.com/toastdriven/guide-to-testing-in-django),标签有主要的步骤显示代码是如何改变的。
8 |
9 | 在我们深入代码前,我们先介绍一些基本的概念,讨论如何think/go 关于测试。
10 |
11 | ####为什么必须要测试代码
12 |
13 | *Code without tests is broken by design* --[jacob](http://jacobian.org/)
14 |
15 | 为代码提供自动化测试是重复确定最小化开发者努力,你写的代码处理任务.我喜欢特车作为我的保险策略。他们经常能让我远离破坏已存在的代码。再去看看其他愚蠢额人们,他们同样证明代码工作正确。没有证明,你有得是一堆代码工作起来正确,一旦你的机器你又要手工测试一遍又一遍在将来。
16 |
17 | 当你第一次开始,谢测试是一个提心吊胆的任务,听起来就象是额外的工作。但是简单测试非常易于编写,有一些测试总比没有测试好。你添加的新的测试后,你的套件货跟着增长。
18 |
19 | 这不是说有了测试后就能解决任何问题,软件中bug总是有的,也是测试忽略了代码深度或者用户将使用一些意外之事的方法,不是测试给你信心,一个安全的网络。
20 |
21 | ####测试的种类
22 | 有很多种不同的测试类型,比较突出的在这个系类中将涵盖 **但愿测试** 和 **几层测试** 。
23 |
24 | **单元测试** 覆盖面非常小,高度专一域的代码。通常相关作用和其他域的软件。这个风格的测试在危机的时候非常有帮助,复杂的组件,例如验证,倒入或者方法复杂的业务逻辑。
25 | **继承测试** 这种测试通常覆盖很多不同的面使得应用工作一起产生一个结果,他们确保数据流失正确的,经常处理多个用户交互。
26 |
27 | 这两种方式主要的不同不是工具而是方法,你选择哪种去测试。非常普遍是事混合交叉使用适度的。
28 |
29 | #####工具
30 |
31 | 在Python世界里,有各式各样的工具去测试你的代码,一些主流的可选项包括:
32 |
33 | - unittest/unittest2
34 | - doctest
35 | - nose
36 | 这份指南不会深入doctests和nose测试,坚持unittest,这是因为用uninitest写测试运行更快当你在测试Django应用的时候(感谢一些有趣的)。我鼓励你去投资其他选项,只要扩展你的知识。
37 |
38 | 你应该不会疑惑 uniitest(库)用于单元测试(连续代码块小测试的方法),你通常使用unittest库用于单元测试和集成测试。
39 |
40 | ####什么东西应该测试
41 |
42 | 另一个常见的挫折对于开发者或者设计者来说测试“那些东西应该测试哪些东西不应该测试”。当没有很困难快速的规则这里应用与任何地方,有一些通用的指导方针我可以提供在做决定的时候。
43 |
44 | - 如果代码在问题中是内建的Python函数或库,不需要测试。例如datetime库
45 | - 如果代码是内建在Django中,不需要测试,例如Model中的字段(field)或者测试如果再见template.Node渲染,包括标签。
46 | -
47 |
48 | - 如果你的模型由自定义的方法,你应该测试,通常是单元测试
49 | - 自定义的视图,表单,模版标签,上下文处理器,中间件,管理命令等,如果你实现业务逻辑,你因该测试代码的各方面。
50 |
51 | 令一个上游的问题时“how far down do you go",还是一样,没有正确的答案。保存为”哪里我最舒服“,如果你开始含糊”sdfldsfjs"在你呼吸 大师傅大师傅。
52 |
53 | #### 什么时候做测试
54 |
55 |
56 |
57 |
58 | [原文](http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/)
59 |
--------------------------------------------------------------------------------
/note/python/application.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python
2 | from wsgiref.simple_server import make_server
3 | from cgi import parse_qs, escape
4 |
5 | html = """
6 |
7 |
8 |