├── .gitignore ├── BasicPython ├── 001.md ├── 101.md ├── 102.md ├── 103.md ├── 104.md ├── 105.md ├── 106.md ├── 107.md ├── 108.md ├── 109.md ├── 110.md ├── 111.md ├── 112.md ├── 113.md ├── 114.md ├── 115.md ├── 116.md ├── 117.md ├── 118.md ├── 119.md ├── 120.md ├── 121.md ├── 122.md ├── 123.md ├── 124.md ├── 125.md ├── 126.md ├── 127.md ├── 128.md ├── 129.md ├── 130.md ├── 131.md ├── 201.md ├── 202.md ├── 203.md ├── 204.md ├── 205.md ├── 206.md ├── 207.md ├── 208.md ├── 209.md ├── 210.md ├── 211.md ├── 212.md ├── 213.md ├── 214.md ├── 215.md ├── 216.md ├── 217.md ├── 218.md ├── 219.md ├── 220.md ├── 221.md ├── 222.md ├── 223.md ├── 224.md ├── 225.md ├── 226.md ├── 301.md ├── 302.md ├── 303.md ├── 304.md ├── 305.md ├── 306.md ├── 307.md ├── 308.md ├── 309.md ├── 311.md ├── 312.md ├── 313.md ├── 314.md ├── 401.md ├── 402.md ├── 403.md ├── 501.md ├── 502.md ├── 503.md ├── README.md ├── Why-I-start-this-column.md ├── codes │ ├── 105-1.py │ ├── 105.py │ ├── 106-1.py │ ├── 109.py │ ├── 111-1.py │ ├── 118-1.py │ ├── 129-1.py │ ├── 129-2.py │ ├── 130.txt │ ├── 131.txt │ ├── 204-1.py │ ├── 204-2.py │ ├── 205-1.py │ ├── 205-2.py │ ├── 205-3.py │ ├── 208.txt │ ├── 213-1.py │ ├── 213-2.py │ ├── 217.py │ ├── 219-2.py │ ├── 220-2.py │ ├── 220.py │ ├── 221.py │ ├── 225.py │ ├── hello.py │ ├── mmmm.py │ ├── request_url.py │ ├── template │ │ ├── index.html │ │ ├── user.html │ │ └── userscontroller.py │ └── temploop │ │ ├── index.html │ │ ├── index.py │ │ └── static │ │ └── style.css ├── index.md └── reading │ └── 01.md ├── Business ├── 2014,哪些猪会被屠杀得更快一些?.txt ├── C2B:不断消融传统商业ing.md ├── Why Your Startup Can’t Find Developers.md ├── 一个新的App该如何推广.md ├── 云技术如何改变世界变更管理?.md ├── 互联网思维到底是什么?.md ├── 网上推广随想.md ├── 让员工感到公平.md └── 谈谈对程序员的管理.md ├── Docker └── DockerApplicationDevelopement.md ├── Education ├── 上海教育第一的真相.md ├── 我为什么说电子书包是一条“歧路”和“弯路”?.md ├── 教育的本质.md ├── 教育短语.md ├── 毫无征兆的一跳 19岁高三学生的最后时刻.md ├── 爱国主义教育.md ├── 程序员的“非程序员”之路.md ├── 纽约的中学教育.md ├── 超越信息素养.md └── 高等教育的困境.md ├── Git ├── Git 诞生记.md ├── GitHub如何运作:时间并不决定一切.md ├── github公钥和推送.md ├── git服务器搭建(局域网).md ├── windows下使用github或bitbucket.md ├── 七款出色的GitHub功能集成工具.md ├── 使用Gitolite搭建轻量级的Git服务器.md └── 开发者日常使用的Git命令.md ├── HTML5 ├── CSS3打造的精美效果.md ├── HTML5优秀技术网站.md ├── codes │ └── index.html ├── css中单位px和em,rem.md └── 自适应网页设计.md ├── IT ├── 14位科技才俊与导师的故事.txt ├── 3D打印技术风起云涌背后的三种兴奋和三种思考.txt ├── App开发中容易出现的5种错误.md ├── Linux之父:讨厌封闭 回绝乔布斯.md ├── iOS和Android的历史起源.md ├── 一天能学会的计算机技术.txt ├── 为什么我要公开代码和想法.txt ├── 主要的编程范型.md ├── 云服务器与物理服务器的成本比较.txt ├── 使用 Vagrant 打造跨平台开发环境.md ├── 全栈工程师到底有什么用.md ├── 如何判断自己是否具有成为一名优秀程序员的潜质.md ├── 如何面试程序员.txt ├── 开发人员需要知道如何做,做什么,和为什么做.md ├── 提升团队编码效率的10个提示.md ├── 码农提高工作效率.md ├── 结对编程——我的噩梦.txt ├── 编程技术面试的五大要点.md ├── 编程范式,程序员的编程世界观.md ├── 编程趋势.md ├── 英国政府横评11款系统:Ubuntu最安全.md ├── 计算机界五位巾帼英雄.txt ├── 谷歌大牛Jeff Dean是如何成为互联网战神的.txt ├── 阅读优秀代码是提高开发人员修为的一种捷径.md └── 面试时,如何向公司提问?.txt ├── JS ├── JS优秀技术网站.md ├── jQuery日历.md ├── 如何编写好的jQuery代码.md ├── 改善jQuery的性能和代码.md ├── 纠正jQuery获取radio选中值的写法.md └── 防止表单重复提交的方法.md ├── JavaAndroid ├── how_to_install_java8.md └── install_android_studio_sdk_ubuntu.md ├── Knowledge ├── 15条技巧提高你的写作技巧.md ├── GDG苏州2014.7.26活动记录.md ├── IBM5150.md ├── Mac_VS_PC.md ├── bad_or_good_software.md ├── 为什么选黄金做货币.md ├── 关于八小时工作制.md ├── 斐波纳契数列.md ├── 美国大选日的由来.md └── 职业发展和年龄.md ├── Linux ├── CentOS-nginx + mysql + php-fpm.md ├── CentOS7上安装POCO.md ├── GAE for Ubuntu.md ├── How_to_solve_GLIBCXX_3.4.19.md ├── Linux命令.md ├── Linux的五个查找命令.md ├── chmod改变文件和目录权限.md ├── chown命令修改文件或目录的所有者.md ├── installGooglePinyinUbuntu.md ├── install_swftools.md ├── linux下面用ssh上传和下载文件.md ├── linux命令后台运行.md ├── ubuntu启动器和菜单不显示.md ├── ubuntu目录文件操作权设置.md ├── upgrade_gcc_on_Centos.md ├── 使用 Linux 命令行测试网速.md ├── 使用ssh公钥密钥自动登陆linux服务器.md ├── 博客自定义域名经历.md ├── 压力测试工具tsung.md ├── 大规模WEB服务(笔记).md ├── 如何优雅地连接ssh.md ├── 检查远程端口.md ├── 网站性能压力测试工具WebBench.md ├── 远程备份工具Rsync使用方法.md ├── 通过ssh连接远程服务器.md ├── 通过配置host文件实现本地域名任意设置.md └── 阿里云应用纪实.md ├── MongoDb ├── export_import_bak.md └── mongodb_command.md ├── Mysql ├── mysql-ERROT(28000)“Access denied for user 'root'@'localhost' .md ├── mysql处理海量数据时的一些优化查询速度方法.md └── 关于设计表时应该注意的问题.md ├── NLP ├── articles_online.md └── learn_nltk01.md ├── Nginx └── 配置性能优化的方法.md ├── PHP └── php5-fpm支持php程序.md ├── Pictures ├── 10201.png ├── 10202.png ├── 10203.png ├── 10501.png ├── 10502.png ├── 10503.png ├── 10504.png ├── 10505.png ├── 10506.png ├── 10507.png ├── 10601.png ├── 10602.png ├── 11101.png ├── 11201.png ├── 11801.png ├── 12401.png ├── 12402.png ├── 12403.png ├── 12404.png ├── 12601.png ├── 12602.png ├── 12603.png ├── 12801.png ├── 12802.png ├── 13001.png ├── 13002.png ├── 13003.png ├── 203R52038-1.gif ├── 203R56302-0.gif ├── 20501.png ├── 20601.png ├── 21001.png ├── 21101.png ├── 21801.png ├── 22001.png ├── 22101.png ├── 22102.png ├── 22201.png ├── 22301.png ├── 22401.png ├── 22402.png ├── 22403.png ├── 30101.png ├── 30701.png ├── 30702.png ├── 30801.png ├── 30901.png ├── 30902.png ├── 30903.png ├── 30904.png ├── 30905.png ├── 30906.png ├── 30907.png ├── 30908.png ├── 31101.png ├── 31102.png ├── 31103.png ├── 31201.png ├── 31202.png ├── 31203.png ├── 31301.png ├── 31302.png ├── 31401.png ├── 31402.png ├── 31403.png ├── 31404.png ├── git001.jpeg ├── git002.jpeg ├── git003.jpeg ├── git004.jpeg ├── git005.jpeg ├── git006.jpeg ├── git007.jpeg ├── git008.jpeg ├── git009.jpeg ├── hands.jpg ├── python1.png ├── python2.png ├── pythonlogo.png ├── reading01.jpg └── reading02.png ├── PyRead ├── base.md ├── module.md └── practice.md ├── Python ├── Collection小技巧.md ├── Python--字典.md ├── Python中的赋值和拷贝.md ├── Python中的除法.md ├── Python代码性能优化技巧.md ├── Python优秀技术网站.md ├── Python开发注意事项.md ├── Python操作Mysql实例代码教程.md ├── Python现在成为美国名校中最流行的编程入门语言.md ├── Python的中文显示方法.md ├── Python高效编程技巧.md ├── Reverse Polish Notation.md ├── Unicode应用注意事项.md ├── collections_Counter.md ├── datetime模块.md ├── dict字典遍历方法.md ├── filter、map、reduce、lambda、yield.md ├── heapq.md ├── md5和sha1加密.md ├── os模块.md ├── post和get请求方式以及区别.md ├── python中dict的sorted排序.md ├── python之MySQLdb库的使用.md ├── python之UTF-8解决方案.md ├── python标准模块和第三方库.md ├── python编码风格.md ├── python连接mysql.md ├── random随机数生成.md ├── scrapy爬虫框架.md ├── 为什么Python数组的索引从0开始.md ├── 代码里的命名规则.md ├── 关键字yield的解释.md ├── 在NLTK中使用斯坦福中文分词器 ├── 字符串的encode和decode.md ├── 文本文件读写.md ├── 稳定可靠的文件操作.md ├── 获取时间的方法.md └── 随机函数random.md ├── README.md ├── Reading ├── IT民工避免猝死攻略.md ├── Python趣文:Import Girlfriend.md ├── 为什么我反对环保主义.md ├── 人生有何意义.md ├── 你还赖床吗.md ├── 别给 12306 洗地了.md ├── 历史教科书欺骗了我们.md ├── 小蚂蚱和小蜻蜓.txt ├── 恨恨而死.md ├── 柔弱的人.txt ├── 番茄时间管理法.md ├── 程序员的学习和积累.md ├── 腐败代码的警告.md └── 详解熬夜对人体的各种危害.txt ├── Tornado ├── 001.jpg ├── 002.gif ├── 003.gif ├── DifferenceHttpGetPost.md ├── Tornado安装.md ├── Tornado开发最佳实践.md ├── python中的HTML转义.md ├── tornado模板转义处理.md ├── understandREST.md └── webpy数据批量插入.md ├── Wechat ├── python微信开发课程.md ├── python微信开发课程2.md └── 微信开发值得推荐的开源项目.md └── noSQL └── 在ubuntu上安装mongodb.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | 10 | # Packages # 11 | ############ 12 | # it's better to unpack these files and commit the raw source 13 | # git has its own built in compression methods 14 | *.7z 15 | *.dmg 16 | *.gz 17 | *.iso 18 | *.jar 19 | *.rar 20 | *.tar 21 | *.zip 22 | 23 | # Logs and databases # 24 | ###################### 25 | *.log 26 | *.sqlite 27 | 28 | # OS generated files # 29 | ###################### 30 | .DS_Store* 31 | ehthumbs.db 32 | Icon? 33 | Thumbs.db 34 | 35 | # Vim 36 | *~ 37 | *.sw[a-z] 38 | ._* 39 | 40 | # md 41 | *.md~ 42 | 43 | # PhpStorm (IDE) project files 44 | .idea/* 45 | 46 | # python compiled binary 47 | *.pyc 48 | -------------------------------------------------------------------------------- /BasicPython/109.md: -------------------------------------------------------------------------------- 1 | #玩转字符串(3) 2 | 3 | 字符串是一个很长的话题,纵然现在开始第三部分,但是也不能完全说尽。因为字符串是自然语言中最复杂的东西,也是承载功能最多的,计算机高级语言编程,要解决自然语言中的问题,让自然语言中完成的事情在计算机上完成,所以,也不得不有更多的话题。 4 | 5 | 字符串就是一个话题中心。 6 | 7 | ###给字符串编号 8 | 9 | 在很多很多情况下,我们都要对字符串中的每个字符进行操作(具体看后面的内容),要准确进行操作,必须做的一个工作就是把字符进行编号。比如一个班里面有50名学生,如果这些学生都有学号,老师操作他们将简化很多。比如不用专门找每个人名字,直接通过学号知道谁有没有交作业。 10 | 11 | 在python中按照这样的顺序对字符串进行编号:从左边第一个开始是0号,向下依次按照整数增加,为1、2...,直到最后一个,在这个过程中,所有字符,包括空格,都进行变好。例如: 12 | 13 | Hello,wor ld 14 | 15 | 对于这个字符串,从左向右的变好依次是: 16 | 17 | |0|1|2|3|4|5|6|7|8|9|10|11| 18 | 19 | |H|e|l|l|o|,|w|o|r| |l |d | 20 | 21 | 在班级了,老师只要喊出学生的学号,自动有对应的学生站起来。在python里面如何把某个编号所对应的字符调出来呢?看代码: 22 | 23 | >>> a = "Hello,wor ld" 24 | >>> len(a) #字符串的长度是12,说明公有12个字符,最后一个字符编号是11 25 | 12 26 | >>> a[0] 27 | 'H' 28 | >>> a[3] 29 | 'l' 30 | >>> a[9] 31 | ' ' 32 | >>> a[11] 33 | 'd' 34 | >>> a[5] 35 | ',' 36 | 37 | 特别说明,编号是从左边开始,第一个是0。 38 | 39 | 能不能从右边开始编号呢?可以。这么人见人爱的python难道这点小要求都不满足吗? 40 | 41 | >>> a[-1] 42 | 'd' 43 | >>> a[11] 44 | 'd' 45 | >>> a[-12] 46 | 'H' 47 | >>> a[-3] 48 | ' ' 49 | 50 | 看到了吗?如果从右边开始,第一个编号是-1,这样就跟从左边区分开了。也就是a[-1]和a[11]是指向同一个字符。 51 | 52 | 不管从左边开始还是从右边开始,都能准确找到某个字符。看官喜欢从哪边开始就从哪边开始,或者根据实际使用情况,需要从哪边开始就从哪边开始。 53 | 54 | ###字符串截取 55 | 56 | 有了编号,不仅仅能够找出某个字符,还能在字符串中取出一部分来。比如,从“hello,wor ld”里面取出“llo”。可以这样操作 57 | 58 | >>> a[2:5] 59 | 'llo' 60 | 61 | 这就是截取字符串的一部分,**注意:**所截取部分的第一个字符(l)对应的编号是(2),从这里开始;结束的字符是(o),对应编号是(4),但是结束的编号要增加1,不能是4,而是5.这样截取到的就是上面所要求的了。 62 | 63 | 试一试,怎么截取到",wor" 64 | 65 | 也就是说,截取a[n,m],其中n>> a[:] #表示截取全部 70 | 'Hello,wor ld' 71 | >>> a[3:] #表示从a[3]开始,一直到字符串的最后 72 | 'lo,wor ld' 73 | >>> a[:4] #表示从字符串开头一直到a[4]前结束 74 | 'Hell' 75 | 76 | ###去掉字符串两头的空格 77 | 78 | 这个功能,在让用户输入一些信息的时候非常有用。有的朋友喜欢输入结束的时候敲击空格,比如让他输入自己的名字,输完了,他来个空格。有的则喜欢先加一个空格,总做的输入的第一个字前面应该空两个格。 79 | 80 | 好吧,这些空格是没用的。python考虑到有不少人可能有这个习惯,因此就帮助程序员把这些空格去掉。 81 | 82 | 方法是: 83 | 84 | - S.strip() 去掉字符串的左右空格 85 | - S.lstrip() 去掉字符串的左边空格 86 | - S.rstrip() 去掉字符串的右边空格 87 | 88 | 看官在看下面示例之前,请先自己用上面的内置函数,是否可以? 89 | 90 | >>> b=" hello " 91 | >>> b 92 | ' hello ' 93 | >>> b.strip() 94 | 'hello' 95 | >>> b 96 | ' hello ' 97 | >>> b.lstrip() 98 | 'hello ' 99 | >>> b.rstrip() 100 | ' hello' 101 | 102 | ##练习 103 | 104 | 学编程,必须做练习,通过练习熟悉各种情况下的使用。 105 | 106 | 下面共同做一个练习:输入用户名,计算机自动向这个用户打招呼。代码如下: 107 | 108 | #coding:utf-8 109 | 110 | print "please write your name:" 111 | name=raw_input() 112 | print "Hello,%s"%name 113 | 114 | 这段代码中的raw_input()的含义,就是要用户输入内容,所输入的内容是一个字符串。 115 | 116 | 其实,上面这段代码存在这改进的地方,比如,如果用户输入的是小写,是不是要将名字的首字母变成大写呢?如果有空格,是不是要去掉呢?等等。或许还有别的,看看能不能在这个练习中,将以前学习过的东西综合应用一下? 117 | 118 |
119 | 120 | [首页](./index.md)   |   [上一讲](./108.md)   |   [下一讲](./110.md) 121 | -------------------------------------------------------------------------------- /BasicPython/112.md: -------------------------------------------------------------------------------- 1 | #一个免费的实验室 2 | 3 | 在学生时代,就羡慕实验室,老师在里面可以鼓捣各种有意思的东西。上大学的时候,终于有机会在实验室做大量实验了,因为我是物理系,并且,遇到了一位非常令我尊敬的老师——高老师,让我在他的实验室里面,把所有已经破旧损坏的实验仪器修理装配好,并且按照要求做好实验样例。经过一番折腾,才明白,要做好实验,不仅仅花费精力,还有不菲的设备成本呢。后来工作的时候,更感觉到实验设备费用之高昂,因此做实验的时候总要小心翼翼。 4 | 5 | 再后来,终于发现原来计算机是一个最好的实验室。在这里做实验成本真的很低呀。 6 | 7 | 扯的远了吧。不远,现在就扯回来。学习Python,也要做实验,也就是尝试性地看看某个命令到底什么含义。通过实验,研究清楚了,才能在编程实践中使用。 8 | 9 | 怎么做Python实验呢? 10 | 11 | ##走进Python实验室 12 | 13 | 在[《集成开发环境(IDE)》](./102.md)一章中,我们介绍了Python的IDE时,给大家推荐了IDLE,进入到IDLE中,看到>>>符号,可以在后面输入一行指令。其实,这就是一个非常好的实验室。 14 | 15 | 另外一个实验室就是UNIX操作系统(包含各种Linux和Mac OSx)的shell,在打开shell之后,输入python,出现如下图所示: 16 | 17 | ![](../Pictures/11201.png) 18 | 19 | 如果看官是用windows的,也能够通过cmd来获得上图类似的界面,依然是输入python,之后得到界面。 20 | 21 | 在上述任何一个环境中,都可以输入指令,敲回车键运行并输出结果。 22 | 23 | 在这里你可以随心所欲实验。 24 | 25 | ##交互模式下进行实验 26 | 27 | 前面的各讲中,其实都使用了交互模式。本着循序渐进、循环上升的原则,本讲应该对交互模式进行一番深入和系统化了。 28 | 29 | ###通过变量直接显示其内容 30 | 31 | 从例子开始: 32 | 33 | >>> a="http://qiwsir.github.io" 34 | >>> a 35 | 'http://qiwsir.github.io' 36 | >>> print a 37 | http://qiwsir.github.io 38 | 39 | 当给一个变量a赋值于一个字符串之后,输入变量名称,就能够打印出字符串,和print a具有同样的效果。这是交互模式下的一个特点,如果在文件模式中,则不能,只有通过print才能打印变量内容。 40 | 41 | ###缩进 42 | 43 | >>> if bool(a): 44 | ... print "I like python" 45 | ... 46 | I like python 47 | 48 | 对于if语句,在上一讲[《从if开始语句的征程》](./111.md)中,已经注意到,if下面的执行语句要缩进四个空格。在有的python教材中,说在交互模式下不需要缩进,可能是针对python3或者其它版本,我使用的是python2.7,的确需要缩进。上面的例子就看出来了。 49 | 50 | 看官在自己的机器上测试一下,是不是需要缩进? 51 | 52 | ###报错 53 | 54 | 在一个广告中看到过这样一句话:程序员的格言,“不求最好,只求报错”。报错,对编程不是坏事。如何对待报错呢? 55 | 56 | **一定要认真阅读所提示的错误信息。** 57 | 58 | 还是上面那个例子,我如果这样写: 59 | 60 | >>> if bool(a): 61 | ... print "I like python" 62 | File "", line 2 63 | print "I like python" 64 | ^ 65 | IndentationError: expected an indented block 66 | 67 | 从错误信息中,我们可以知道,第二行错了。错在什么地方呢?python非常人性化就在这里,告诉你错误在什么地方: 68 | 69 | IndentationError: expected an indented block 70 | 71 | 意思就是说需要一个缩进块。也就是我没有对第二行进行缩进,需要缩进。 72 | 73 | 另外,顺便还要提醒,>>>表示后面可以输入指令,...表示当前指令没有结束。要结束并执行,需要敲击两次回车键。 74 | 75 | ###探索 76 | 77 | 如果看官对某个指令不了解,或者想试试某种操作是否可行,可以在交互模式下进行探索,这种探索的损失成本非常小,充其量就是报错。而且从报错信息中,我们还能得到更多有价值的内容。 78 | 79 | 例如,在[《眼花缭乱的运算符》](./110.md)中,提到了布尔运算,其实,在变量的类型中,除了前面提到的整数型、字符串型,布尔型也是一种,那么布尔型的变量有什么特点呢?下面就探索一下: 80 | 81 | >>> a 82 | 'http://qiwsir.github.io' 83 | >>> bool(a) #布尔型,用bool()表示,就类似int(),str(),是一个内置函数 84 | True 85 | >>> b="" 86 | >>> bool(b) 87 | False 88 | >>> bool(4>3) 89 | True 90 | >>> bool(4<3) 91 | False 92 | >>> m=bool(b) 93 | >>> m 94 | False 95 | >>> type(m) 96 | 97 | >>> 98 | 99 | 从上面的实验可以看出,如果对象是空,返回False,如果不是,则返回True;如果对象是False,返回False。上面探索,还可以扩展到其它情况。看官能不能通过探索,总结出bool()的特点呢? 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /BasicPython/118.md: -------------------------------------------------------------------------------- 1 | #画圈还不简单吗? 2 | 3 | 画圈?换一个说法就是循环。循环,是高级语言编程中重要的工作。现实生活中,很多事情都是在循环,日月更迭,斗转星移,无不是循环;王朝更迭,寻常百姓,也都是循环。 4 | 5 | 在python中,循环有一个语句:for语句。 6 | 7 | ##简单的for循环例子 8 | 9 | >>> hello = "world" 10 | >>> for i in hello: 11 | ... print i 12 | ... 13 | w 14 | o 15 | r 16 | l 17 | d 18 | 19 | 上面这个for循环是怎么工作的呢? 20 | 21 | 1. hello这个变量引用的是"world"这个str类型的数据 22 | 2. 变量 i 通过hello找到它所引用的"world",然后从第一字符开始,依次获得该字符的引用。 23 | 3. 当 i="w"的时候,执行print i,打印出了字母w,结束之后循环第二次,让 i="e",然后执行print i,打印出字母e,如此循环下去,一直到最后一个字符被打印出来,循环自动结束 24 | 25 | 顺便补充一个print的技巧,上面的打印结果是竖着排列,也就是每打印一个之后,就自动换行。如果要让打印的在一行,可以用下面的方法,在打印的后面加一个逗号(英文) 26 | 27 | >>> for i in hello: 28 | ... print i, 29 | ... 30 | w o r l d 31 | 32 | >>> for i in hello: 33 | ... print i+",", #为了美观,可以在每个字符后面加一个逗号分割 34 | ... 35 | w, o, r, l, d, 36 | >>> 37 | 38 | 因为可以通过使用索引编号(偏移量)做为下表,得到某个字符。所以,还可以通过下面的循环方式实现上面代码中同样功能: 39 | 40 | >>> for i in range(len(hello)): 41 | ... print hello[i] 42 | ... 43 | w 44 | o 45 | r 46 | l 47 | d 48 | 49 | 其工作方式是: 50 | 51 | 1. len(hello)得到hello引用的字符串的长度,为5 52 | 2. range(len(hello),就是range(5),也就是[0, 1, 2, 3, 4],对应这"world"每个字母的编号,即偏移量。 53 | 3. for i in range(len(hello)),就相当于for i in [0,1,2,3,4],让i依次等于list中的各个值。当i=0时,打印hello[0],也就是第一个字符。然后顺序循环下去,直到最后一个i=4为止。 54 | 55 | 以上的循环举例中,显示了对字str的字符依次获取,也涉及了list,感觉不过瘾呀。那好,看下面对list的循环: 56 | 57 | >>> ls_line 58 | ['Hello', 'I am qiwsir', 'Welcome you', ''] 59 | >>> for word in ls_line: 60 | ... print word 61 | ... 62 | Hello 63 | I am qiwsir 64 | Welcome you 65 | 66 | >>> for i in range(len(ls_line)): 67 | ... print ls_line[i] 68 | ... 69 | Hello 70 | I am qiwsir 71 | Welcome you 72 | 73 | ##上一个台阶 74 | 75 | 我们已经理解了for语句的基本工作流程,如果写一个一般化的公式,可以这么表示: 76 | 77 | for 循环规则: 78 | 操作语句 79 | 80 | 用for语句来解决一个实际问题。 81 | 82 | **例:**找出100以内的能够被3整除的正整数。 83 | 84 | **分析:**这个问题有两个限制条件,第一是100以内的正整数,根据前面所学,可以用range(1,100)来实现;第二个是要解决被3整除的问题,假设某个正整数n,这个数如果能够被3整除,也就是n%3(%是取余数)为0.那么如何得到n呢,就是要用for循环。 85 | 86 | 以上做了简单分析,要实现流程,还需要细化一下。按照前面曾经讲授过的一种方法,要画出问题解决的流程图。 87 | 88 | ![](../Pictures/11801.png) 89 | 90 | 下面写代码就是按图索骥了。 91 | 92 | 代码: 93 | 94 | 95 | #! /usr/bin/env python 96 | #coding:utf-8 97 | 98 | aliquot = [] 99 | 100 | for n in range(1,100): 101 | if n%3 == 0: 102 | aliquot.append(n) 103 | 104 | print aliquot 105 | 106 | 代码运行结果: 107 | 108 | [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 109 | 110 | 这里仅仅列举一个简单的例子,看官可以在这个例子基础上深入:打印某范围内的偶数/奇数等。 111 | 112 | 如果要对list的循环进行深入了解的,可以到我专门撰写的[python and algorithm](https://github.com/qiwsir/algorithm/blob/master/README.md)里面阅读有关文章 113 | -------------------------------------------------------------------------------- /BasicPython/224.md: -------------------------------------------------------------------------------- 1 | #模块的加载 2 | 3 | 不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中(关于[mmmm.py文件可以看上一讲](./223.md)),多了一个文件: 4 | 5 | qw@qw-Latitude-E4300:~/Documents/ITArticles/BasicPython/codes$ ls mmm* 6 | mmmm.py mmmm.pyc 7 | 8 | 在这个目录下面,除了原来的那个mmmm.py之外,又多了一个mmmm.pyc文件,这个文件不是我写的,是哪里来的呢? 9 | 10 | 要破开此迷,需要用import的过程说起。 11 | 12 | ##import的工作流程 13 | 14 | import mmmm,并不是仅仅将mmmm.py这个文件装载到当前位置(文件内),其实是首先进行了一次运算。当mmmm.py被第一次导入的时候,python首先要对其进行编译,生成扩展名为.pyc的同名文件,然后才执行mmmm模块的代码,创建相应的对象等。就如同把大象装进冰箱,有三步要执行: 15 | 16 | 1. **搜索**。就是python要能够找到import的模块。怎么找到,后面讲述。 17 | 2. **编译**。找到模块文件之后,将其编译成字节码,就是那个.pyc文件里面的(关于字节码,下面会介绍,请继续阅读)。注意,不是什么时候都编译的,只有第一次运行时候才编译,如果mmmm.py文件改变了,相当于又一个新文件,也会从新编译。其实就是.pyc文件中有一个时间戳,python会自动检查这个时间戳,如果它比同名的.py文件时间戳旧,就会从新编译。否则跳过。当然,如果根本就没有找到同名的.py源文件,只有字节码文件.pyc,那么就只能运行这个了。 18 | 3. **运行**。这就没什么好说的了,生米已经淘干净了,并且放到锅里,开始加热了,最后就只能熟饭了。执行就是前面已经编译的模块字节码文件,顺理成章要执行了。 19 | 20 | ##搜索模块 21 | 22 | 一般情况下,python会自动的完成模块搜索过程。但是,在某些情况下,或许会要求程序员来设定搜索路径。当import一个模块后,python会按照下面的顺序来找那个将要导入的模块文件 23 | 24 | 1. 程序的主目录。上一讲中,在codes这个目录中运行交互模式,这时候的主目录就是codes,当在那个交互模式中运行import mmmm的时候,就首先在codes这个目录中搜索相应的文件(找到.py之后编译成为.pyc)。当然,后面在网页编程中,看官会看到,所谓主目录是可以通过顶层文件设置的目录。 25 | 2. PYTHONPATH目录。这是一个环境变量设置,如果没有设置则滤去。如何进行环境变量设置,请看官google啦。 26 | 3. 标准库目录。已经随着Python的安装进入到计算机中的那个。 27 | 4. 任何.pth文件的内容。如果有这类文件,最后要在这类文件中搜索一下。这是一个简单的方法,在.pth文件中,加入有效目录,使之成为搜索路径。下图就是我的计算机上,存放.pth文件的位置以及里面放着的.pth文件 28 | 29 | ![](../Pictures/22401.png) 30 | 31 | 看官也可以自己编写.pth文件,里面是有关搜索目录,保存到这里。比如,打开目录中的easy-install.pth文件,发现的内容: 32 | 33 | ![](../Pictures/22402.png) 34 | 35 | 搜索就是这么一个过程。这里建议看官了解即可,不一定非要进行什么设置,在很多情况下,python都是会自动完成的。特别是初学者,暂且不要轻举妄动。 36 | 37 | ##重载模块 38 | 39 | 以mmmm模块为例(在这里要特别提醒看官:我这样命名是相当不好滴,只不过是为了恶搞才这样命名的)。 40 | 41 | 在一个shell里面,运行了python,并且做了如下操作: 42 | 43 | >>> import mmmm 44 | >>> mmmm.web 45 | 'https://qiwsir.github.io' 46 | 47 | 下面我再打开一个shell,编辑mmmm.py这个文件,进行适当修改: 48 | 49 | ![](../Pictures/22403.png) 50 | 51 | 保存之后,切换到原来的那个导入了模块的交互模式: 52 | 53 | >>> mmmm.web 54 | 'https://qiwsir.github.io' 55 | 56 | 输出的跟前面的一样,没有任何变化,这是为什么呢? 57 | 58 | 原来,当导入模块的时候,只会在第一次导入时加载和执行模块代码,之后就不会重新加载或重新执行了,如果模块代码修改了,但是这里执行的还是修改之前的。 59 | 60 | 怎么实现代码修改之后,执行新的呢?一种方式就是退出原来的交互模式,再重新进入,再import mmmm。呵呵,这种方法有点麻烦。Python提供了另外一个函数——reload函数,能够实现模块的重新加载(简称重载),重载后模块代码重新执行。如下继续: 61 | 62 | >>> reload(mmmm) 63 | 64 | >>> mmmm.web 65 | 'https://qiwsir.github.io, I am writing a python book on line.' 66 | 67 | 这下就显示修改之后的内容了。 68 | 69 | 特别提醒注意: 70 | 71 | - reload是内置函数 72 | - reload(module),module是一个已经存在的模块,不是变量名。 73 | -------------------------------------------------------------------------------- /BasicPython/225.md: -------------------------------------------------------------------------------- 1 | #私有和专有 2 | 3 | 在任何语言中,都会规定某些对象(属性、方法、函数、类等)只能够在某个范围内访问,出了这个范围就不能访问了。这是“公”、“私”之分。此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字就不能用class,def等,这就是保留字。除了保留字,python中还为类的名字做了某些特殊准备,就是“专有”的范畴。 4 | 5 | ##私有函数 6 | 7 | 在某些时候,会看到有一种方法命名比较特别,是以“__”双划线开头的,将这类命名的函数/方法称之为“私有函数”。 8 | 9 | 所谓私有函数,就是: 10 | 11 | - 私有函数不可以从它们的模块外面被调用 12 | - 私有类方法不能够从它们的类外面被调用 13 | - 私有属性不能够从它们的类外面被访问 14 | 15 | 跟私有对应的,就是所谓的公有啦。有的编程语言用特殊的关键词来说明某函数或方法或类是私有还是公有。但是python仅仅用名字来说明,因为python深刻理解了2k年前孔先生丘所说的“名不正言不顺”的含义。 16 | 17 | 如果一个 Python 函数,类方法,或属性的名字以两个下划线开始 (但不是结束),它是私有的;其它所有的都是公有的。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。例如: 18 | 19 | class Person: 20 | def __init__(self,name): 21 | self.name = name 22 | 23 | def __work(self,salary): 24 | print "%s salary is:%d"%(self.name,salary) 25 | 26 | 这里边定义的方法'\__work()'就是一个私有方法。 27 | 28 | 下面把上面的类进行完善,然后运行,通过实例来调用这个私有方法 29 | 30 | #!/usr/bin/env python 31 | #coding:utf-8 32 | 33 | class Person: 34 | def __init__(self,name): 35 | self.name = name 36 | print self.name 37 | 38 | def __work(self,salary): 39 | print "%s salary is: %d"%(self.name,salary) 40 | 41 | if __name__=="__main__": 42 | officer = Person("Tom") 43 | officer.__work(1000) 44 | 45 | #运行结果 46 | 47 | Tom 48 | Traceback (most recent call last): 49 | File "225.py", line 14, in 50 | officer.__work(1000) 51 | AttributeError: Person instance has no attribute '__work' 52 | 53 | 从运行结果中可以看出,当运行到officer.__work(1000)的时候,报错了。并且从报错信息中说,没有该方法。这说明,这个私有方法,无法在类意外调用(其实类意外可以调用私有方法,就是太麻烦,况且也不提倡,故本教程滤去)。 54 | 55 | 下面将上述代码进行修改,成为: 56 | 57 | #!/usr/bin/env python 58 | #coding:utf-8 59 | 60 | class Person: 61 | def __init__(self,name): 62 | self.name = name 63 | print self.name 64 | 65 | def __work(self,salary): 66 | print "%s salary is: %d"%(self.name,salary) 67 | 68 | def worker(self): 69 | self.__work(500) #在类内部调用私有方法 70 | 71 | if __name__=="__main__": 72 | officer = Person("Tom") 73 | #officer.__work(1000) 74 | officer.worker() 75 | 76 | #运行结果 77 | 78 | Tom 79 | Tom salary is: 500 80 | 81 | 结果正是要得到的。看官是否理解私有方法的用法了呢? 82 | 83 | ##专有方法 84 | 85 | 如果是以双划线开头,但不是以它结尾,所命名的方法是私有方法; 86 | 87 | 如果以双划线开头,并且以双划线结尾,所命名的方法就是专有方法。 88 | 89 | 这是python规定的。所以在写程序的时候要执行,不执行就是跟python过不去,过不去就报错了。 90 | 91 | 比如前面反复提到的'\__init\__()',就是一个典型的专有方法。那么自己在写别的方法时,就不要用“__”开头和结尾了。虽然用了也大概没有什么影响,但是在可读性上就差很多了,一段程序如果可读性不好,用不了多长时间自己就看不懂了,更何况别人呢? 92 | 93 | 关于专有方法,出了'\__init\__()'之外,还有诸如:'\__str\__','\__setitem\__'等等,要向看,可以利用dir()函数在交互模式下看看某个函数里面的专有东西。当然,也可以自己定义啦。 94 | 95 | 因为'\__init\__'用的比较多,所以前面很多例子都是它。 96 | -------------------------------------------------------------------------------- /BasicPython/501.md: -------------------------------------------------------------------------------- 1 | #基本的(字面量)值 2 | 3 | |类型|描述|语法示例| 4 | |----|----|--------| 5 | |整型|无小数部分的数|42| 6 | |长整型|大整数|42L| 7 | |浮点型|有小数部分的数|42.5, 42.5e-2| 8 | |复合型|实数(整数或浮点数)和虚数的和|38+4j, 42j| 9 | |字符串|不可变的字符序列|"foo", 'bar', """baz""", r'\n'| 10 | |Unicode|不可变的Unicode字符序列|u'foo', u"bar", u"""baz"""| 11 | -------------------------------------------------------------------------------- /BasicPython/502.md: -------------------------------------------------------------------------------- 1 | #运算符 2 | 3 | |运算符|描述|优先级| 4 | |------|----|------| 5 | |lambda|lambda表达式|1| 6 | |or|逻辑或|2| 7 | |and|逻辑与|3| 8 | |not|逻辑非|4| 9 | |in|成员资格测试|5| 10 | |not in|非成员资格测试|5| 11 | |is|一致性测试|6| 12 | |is not|非一致性测试|6| 13 | |<|小于|7| 14 | |>|大于|7| 15 | |<=|小于或等于|7| 16 | |>=|大于或等于|7| 17 | |==|等于|7| 18 | |!=|不等于|7| 19 | |\||按位或|8| 20 | |^|按位异或|9| 21 | |&|按位与|10| 22 | |<<|左移|11| 23 | |>>|右移|11| 24 | |+|加法|12| 25 | |-|减法|12| 26 | |*|乘法|13| 27 | |/|除法|13| 28 | |%|求余|13| 29 | |+|一元一致性|14| 30 | |-|一元不一致性|14| 31 | |~|按位补码|15| 32 | |**|幂|16| 33 | |x.attribute|特性引用|17| 34 | |x[index]|项目访问|18| 35 | |x[index1:index2[:index3]]|切片|19| 36 | |f(arg...)|函数调用|20| 37 | |(...)|将表达式加圆括号或元组显示|21| 38 | |[...]|列表显示|22| 39 | |{key:value, ...}|字典显示|23| 40 | |'expressions...'|字符串转化|24| 41 | -------------------------------------------------------------------------------- /BasicPython/README.md: -------------------------------------------------------------------------------- 1 | #为什么要开设此栏目 2 | 3 | 这个栏目的名称叫做“零基础学Python”。 4 | 5 | 现在网上已经有不少学习python的课程,其中也不乏精品。按理说,不缺少我这个基础类型的课程了。但是,我注意到一个问题,不管是课程还是出版的书,大多数是面向已经有一定编程经验的人写的或者讲的,也就是对这些朋友来讲,python已经不是他们的第一门高级编程语言。据我所知,目前国内很多大学都是将C之类的做为学生的第一门语言。 6 | 7 | 然而,在我看来,python是非常适合做为学习高级语言编程的第一门语言的。有一本书,名字叫《与孩子一起学编程》,这本书的定位,是将python定位为学习者学习的第一门高级编程语言。然而,由于读者对象是孩子,很多“成年人”不屑一顾,当然,里面的讲法与“实战”有点距离,导致以“找工作”、“工作需要”为目标的学习者,认为这本书跟自己要学的方向相差甚远。 8 | 9 | 为了弥补那本书的缺憾,我在这里推出面向成年人——大学生、或者其他想学习程序但是没有任何编程基础的朋友——学习第一门编程高级语言的教程。将Python做为学习高级语言编程的第一门语言,其优势在于: 10 | 11 | - 入门容易,避免了其它语言的繁琐。 12 | - 更接近我们的自然语言和平常的思维方法。 13 | - 学习完这门语言之后,能够直接“实战”——用在工作上。 14 | - 学习完这门语言之后,能够顺利理解并学习其它语言。 15 | - python本身功能强大,一门语言也可以打天下,省却了以后的学习成本。 16 | 17 | 下面的图示统计显示:Python现在成为美国名校中最流行的编程入门语言。 18 | 19 | ![](https://camo.githubusercontent.com/564fab8f8af978ff1aa5e477d21a266f240010ec/687474703a2f2f6361636d2e61636d2e6f72672f73797374656d2f6173736574732f303030312f363435312f546f7033392d3730302e322e706e67) 20 | 21 | [点击这里看上图来源](https://github.com/qiwsir/ITArticles/blob/master/Python/Python%E7%8E%B0%E5%9C%A8%E6%88%90%E4%B8%BA%E7%BE%8E%E5%9B%BD%E5%90%8D%E6%A0%A1%E4%B8%AD%E6%9C%80%E6%B5%81%E8%A1%8C%E7%9A%84%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8%E8%AF%AD%E8%A8%80.md) 22 | 23 | 综上,我有了这样一个冲动,做一个栏目,面对零基础要学习Python的朋友,面对将python做为第一门高级语言的朋友。这就是开始本栏目的初衷。 24 | 25 | ###[点击这里,进入本教程的目录](./index.md) 26 | -------------------------------------------------------------------------------- /BasicPython/Why-I-start-this-column.md: -------------------------------------------------------------------------------- 1 | #为什么要开设此栏目 2 | 3 | 这个栏目的名称叫做“零基础学Python”。 4 | 5 | 现在网上已经有不少学习python的课程,其中也不乏精品。按理说,不缺少我这个基础类型的课程了。但是,我注意到一个问题,不管是课程还是出版的书,大多数是面向已经有一定编程经验的人写的或者讲的,也就是对这些朋友来讲,python已经不是他们的第一门高级编程语言。据我所知,目前国内很多大学都是将C之类的做为学生的第一门语言。 6 | 7 | 然而,在我看来,python是非常适合做为学习高级语言编程的第一门语言的。有一本书,名字叫《与孩子一起学编程》,这本书的定位,是将python定位为学习者学习的第一门高级编程语言。然而,由于读者对象是孩子,很多“成年人”不屑一顾,当然,里面的讲法与“实战”有点距离,导致以“找工作”、“工作需要”为目标的学习者,认为这本书跟自己要学的方向相差甚远。 8 | 9 | 综上,我有了这样一个冲动,做一个栏目,面对零基础要学习Python的朋友,面对将python做为第一门高级语言的朋友。这就是开始本栏目的初衷。 10 | -------------------------------------------------------------------------------- /BasicPython/codes/105-1.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:utf-8 3 | 4 | """ 5 | 请计算:19+2*4-8/2 6 | """ 7 | 8 | a = 19+2*4-8/2 9 | print a 10 | -------------------------------------------------------------------------------- /BasicPython/codes/105.py: -------------------------------------------------------------------------------- 1 | print "Hello,World" 2 | -------------------------------------------------------------------------------- /BasicPython/codes/106-1.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | 3 | def add_function(a,b): 4 | c = a+b 5 | print c 6 | 7 | if __name__=="__main__": 8 | add_function(2,3) 9 | -------------------------------------------------------------------------------- /BasicPython/codes/109.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | 3 | print "please write your name:" 4 | 5 | name=raw_input() 6 | 7 | print "Hello,%s"%name 8 | 9 | 10 | -------------------------------------------------------------------------------- /BasicPython/codes/111-1.py: -------------------------------------------------------------------------------- 1 | # /usr/bin/env python 2 | #coding:utf-8 3 | 4 | print "请输入任意一个整数数字:" 5 | 6 | number = int(raw_input()) #通过raw_input()输入的数字是字符串 7 | #用int()将该字符串转化为整数 8 | 9 | if number == 10: 10 | print "您输入的数字是:%d"%number 11 | print "You are SMART." 12 | elif number > 10: 13 | print "您输入的数字是:%d"%number 14 | print "This number is more than 10." 15 | elif number < 10: 16 | print "您输入的数字是:%d"%number 17 | print "This number is less than 10." 18 | else: 19 | print "Are you a human?" 20 | 21 | -------------------------------------------------------------------------------- /BasicPython/codes/118-1.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:utf-8 3 | 4 | aliquot = [] 5 | 6 | for n in range(1,100): 7 | if n%3 == 0: 8 | aliquot.append(n) 9 | 10 | print aliquot 11 | -------------------------------------------------------------------------------- /BasicPython/codes/129-1.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import random 5 | 6 | number = random.randint(1,100) 7 | 8 | print "请输入一个100以内的自然数:" 9 | 10 | input_number = raw_input() 11 | 12 | if number == int(input_number): 13 | print "猜对了,这个数是:" 14 | print number 15 | else: 16 | print "错了。" 17 | -------------------------------------------------------------------------------- /BasicPython/codes/129-2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import random 5 | 6 | number = random.randint(1,100) 7 | 8 | print "请输入一个100以内的自然数:" 9 | 10 | input_number = raw_input() 11 | 12 | if number == int(input_number): 13 | print "猜对了,这个数是:" 14 | print number 15 | elif number > int(input_number): 16 | print "小了" 17 | input_number = raw_input() 18 | elif number < int(input_number): 19 | print "大了" 20 | input_number = raw_input() 21 | else: 22 | print "错了。" 23 | -------------------------------------------------------------------------------- /BasicPython/codes/130.txt: -------------------------------------------------------------------------------- 1 | learn python 2 | http://qiwsir.github.io 3 | qiwsir@gmail.com 4 | hello 5 | -------------------------------------------------------------------------------- /BasicPython/codes/131.txt: -------------------------------------------------------------------------------- 1 | My name is qiwsir. 2 | My website is qiwsir.github.io 3 | Aha,I like program 4 | There is a baby. -------------------------------------------------------------------------------- /BasicPython/codes/204-1.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:utf-8 3 | 4 | print "请输入字符串,然后按下回车键:" 5 | 6 | user_input = raw_input() 7 | 8 | result = user_input.isdigit() 9 | 10 | if not result: 11 | print "您输入的不完全是数字" 12 | 13 | elif int(user_input)%2==0: 14 | print "您输入的是一个偶数" 15 | elif int(user_input)%2!=0: 16 | print "您输入的是一个奇数" 17 | else: 18 | print "您没有输入什么呢吧" 19 | -------------------------------------------------------------------------------- /BasicPython/codes/204-2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import random 5 | 6 | numbers = [random.randint(1,100) for i in range(20)] 7 | 8 | """ 9 | odd = [] 10 | even = [] 11 | 12 | for x in numbers: 13 | if x%2==0: 14 | even.append(x) 15 | else: 16 | odd.append(x) 17 | """ 18 | 19 | odd = [x for x in numbers if x%2!=0] 20 | even = [x for x in numbers if x%2==0] 21 | 22 | print numbers 23 | print "odd:",odd 24 | print "even:",even 25 | -------------------------------------------------------------------------------- /BasicPython/codes/205-1.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:UTF-8 3 | 4 | import random 5 | i=0 6 | while i < 4: 7 | print'********************************' 8 | num = input('请您输入0到9任一个数:') 9 | 10 | xnum = random.randint(0,9) 11 | 12 | x = 3 - i 13 | 14 | if num == xnum: 15 | print'运气真好,您猜对了!' 16 | break 17 | elif num > xnum: 18 | print'''您猜大了!\n哈哈,正确答案是:%s\n您还有%s次机会!''' %(xnum,x) 19 | elif num < xnum: 20 | print'''您猜小了!\n哈哈,正确答案是:%s\n您还有%s次机会!''' %(xnum,x) 21 | print'********************************' 22 | i += 1 23 | 24 | """ 25 | 此代码是一个名曰李航的大学生发给我的,我用在了教程中 26 | """ 27 | -------------------------------------------------------------------------------- /BasicPython/codes/205-2.py: -------------------------------------------------------------------------------- 1 | 2 | """ 3 | This is a game. 4 | I am Qiwei. 5 | I like python. 6 | I am writing python articles in my website. 7 | My website is http://qiwsir.github.io 8 | You can learn python free in it. 9 | """ 10 | 11 | #!/usr/bin/env python 12 | #coding:utf-8 13 | 14 | import random 15 | 16 | number = random.randint(1,100) 17 | 18 | guess = 0 19 | 20 | while True: 21 | 22 | num_input = raw_input("please input one integer that is in 1 to 100:") 23 | guess +=1 24 | 25 | if not num_input.isdigit(): 26 | print "Please input interger." 27 | elif int(num_input)<0 or int(num_input)>=100: 28 | print "The number should be in 1 to 100." 29 | else: 30 | if number==int(num_input): 31 | print "OK, you are good.It is only %d, then you successed."%guess 32 | break 33 | elif number>int(num_input): 34 | print "your number is more less." 35 | elif number",x 10 | 11 | funcx() 12 | print "--------------------------" 13 | print "this x is out of funcx:-->",x 14 | 15 | -------------------------------------------------------------------------------- /BasicPython/codes/213-2.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:utf-8 3 | 4 | def add(x,*arg): 5 | print x 6 | result = x 7 | print arg 8 | for i in arg: 9 | result +=i 10 | return result 11 | 12 | print add(1,2,3,4,5,6,7,8,9) 13 | 14 | -------------------------------------------------------------------------------- /BasicPython/codes/217.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | """ 5 | class Person: 6 | def __init__(self, name, lang, website): 7 | self.name = name 8 | self.lang = lang 9 | self.website = website 10 | self.email = "qiwsir@gmail.com" 11 | """ 12 | class Person: 13 | def __init__(self, name, lang="golang", website="www.google.com"): 14 | self.name = name 15 | self.lang = lang 16 | self.website = website 17 | self.email = "qiwsir@gmail.com" 18 | 19 | def author(self, address): 20 | #return self.name 21 | return laoqi.name+" in "+address 22 | 23 | laoqi = Person("LaoQi") 24 | info = Person("qiwsir",lang="python",website="qiwsir.github.io") 25 | 26 | #print "laoqi.name=",laoqi.name 27 | print "Author name from laoqi:",laoqi.author("China") 28 | print "Author name from info:",info.author("Suzhou") 29 | #print "info.name=",info.name 30 | #print "-------" 31 | #print "laoqi.lang=",laoqi.lang 32 | #print "info.lang=",info.lang 33 | #print "-------" 34 | #print "laoqi.website=",laoqi.website 35 | #print "info.website=",#info.website 36 | 37 | -------------------------------------------------------------------------------- /BasicPython/codes/219-2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | class A: 5 | def __init__(self): 6 | print "aaa" 7 | 8 | class B(A): 9 | pass 10 | 11 | if __name__=="__main__": 12 | a = A() 13 | b = B() 14 | -------------------------------------------------------------------------------- /BasicPython/codes/220-2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | class A: 5 | def __init__(self): 6 | print "aaa" 7 | def amethod(self): 8 | print "method a" 9 | 10 | class B(A): 11 | def __init__(self): 12 | print "bbb" 13 | 14 | 15 | if __name__=="__main__": 16 | print "A--->" 17 | a = A() 18 | a.amethod() 19 | print "B--->" 20 | b = B() 21 | b.amethod() 22 | -------------------------------------------------------------------------------- /BasicPython/codes/220.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | class Person: 5 | def __init__(self, name, email): 6 | self.name = name 7 | self.email = email 8 | 9 | class Programmer(Person): 10 | def __init__(self, name,email,lang, system, website): 11 | Person.__init__(self,name,email) 12 | self.lang = lang 13 | self.system = system 14 | self.website = website 15 | 16 | class Pythoner(Programmer): 17 | def __init__(self,name,email): 18 | Programmer.__init__(self,name,email,"python","Ubuntu","qiwsir.github.io") 19 | 20 | if __name__=="__main__": 21 | writer = Pythoner("qiwsir","qiwsir@gmail.com") 22 | print "name=",writer.name 23 | print "lang=",writer.lang 24 | print "email=",writer.email 25 | print "system=",writer.system 26 | print "website=",writer.website 27 | -------------------------------------------------------------------------------- /BasicPython/codes/221.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | def outer_foo(): 5 | a = 10 6 | def inner_foo(): 7 | a = 20 8 | print "inner_foo,a=",a 9 | 10 | inner_foo() 11 | print "outer_foo,a=",a 12 | 13 | a = 30 14 | outer_foo() 15 | print "a=",a 16 | -------------------------------------------------------------------------------- /BasicPython/codes/225.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | class Person: 5 | def __init__(self,name): 6 | self.name = name 7 | print self.name 8 | 9 | def __work(self,salary): 10 | print "%s salary is: %d"%(self.name,salary) 11 | 12 | def worker(self): 13 | self.__work(500) 14 | 15 | if __name__=="__main__": 16 | officer = Person("Tom") 17 | #officer.__work(1000) 18 | officer.worker() 19 | 20 | -------------------------------------------------------------------------------- /BasicPython/codes/hello.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import tornado.httpserver 5 | import tornado.ioloop 6 | import tornado.options 7 | import tornado.web 8 | 9 | from tornado.options import define, options 10 | define("port", default=8000, help="run on the given port", type=int) 11 | 12 | class IndexHandler(tornado.web.RequestHandler): 13 | def get(self): 14 | greeting = self.get_argument('greeting', 'Hello') 15 | self.write(greeting + ', welcome you to read: www.itdiffer.com') 16 | 17 | if __name__ == "__main__": 18 | tornado.options.parse_command_line() 19 | app = tornado.web.Application(handlers=[(r"/", IndexHandler)]) 20 | http_server = tornado.httpserver.HTTPServer(app) 21 | http_server.listen(options.port) 22 | tornado.ioloop.IOLoop.instance().start() 23 | -------------------------------------------------------------------------------- /BasicPython/codes/mmmm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | web = "https://qiwsir.github.io, I am writing a python book on line." 5 | 6 | def my_name(name): 7 | print name 8 | 9 | class pythoner: 10 | def __init__(self,lang): 11 | self.lang = lang 12 | def programmer(self): 13 | print "python programmer language is: ",self.lang 14 | -------------------------------------------------------------------------------- /BasicPython/codes/request_url.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import textwrap 5 | 6 | import tornado.httpserver 7 | import tornado.ioloop 8 | import tornado.options 9 | import tornado.web 10 | 11 | from tornado.options import define, options 12 | define("port", default=8000, help="Please send email to me", type=int) 13 | 14 | class ReverseHandler(tornado.web.RequestHandler): 15 | def get(self, input_word): 16 | self.write(input_word[::-1]) 17 | 18 | 19 | class WrapHandler(tornado.web.RequestHandler): 20 | def post(self): 21 | text = self.get_argument("name") 22 | width = self.get_argument("width", 40) 23 | self.write(textwrap.fill(word, width)) 24 | 25 | if __name__ == "__main__": 26 | tornado.options.parse_command_line() 27 | app = tornado.web.Application( 28 | handlers = [ 29 | (r"/reverse/(\w+)", ReverseHandler), 30 | (r"/wrap/(/w+)", WrapHandler) 31 | ] 32 | ) 33 | http_server = tornado.httpserver.HTTPServer(app) 34 | http_server.listen(options.port) 35 | tornado.ioloop.IOLoop.instance().start() 36 | -------------------------------------------------------------------------------- /BasicPython/codes/template/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sign in your name 5 | 6 | 7 |

Please sing in.

8 |
9 |

Name:

10 |

Email:

11 |

Website:

12 |

Language:

13 | 14 |
15 | 16 | 17 | -------------------------------------------------------------------------------- /BasicPython/codes/template/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sign in your name 5 | 6 | 7 |

Your Information

8 |

Your name is {{username}}

9 |

Your email is {{email}}

10 |

Your website is {{website}}, it is very good. This website is make by {{language}}

11 | 12 | 13 | -------------------------------------------------------------------------------- /BasicPython/codes/template/userscontroller.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | 4 | import os.path 5 | 6 | import tornado.httpserver 7 | import tornado.ioloop 8 | import tornado.options 9 | import tornado.web 10 | 11 | from tornado.options import define, options 12 | define("port", default=8000, help="run on the given port", type=int) 13 | 14 | class IndexHandler(tornado.web.RequestHandler): 15 | def get(self): 16 | self.render("index.html") 17 | 18 | class UserHandler(tornado.web.RequestHandler): 19 | def post(self): 20 | user_name = self.get_argument("username") 21 | user_email = self.get_argument("email") 22 | user_website = self.get_argument("website") 23 | user_language = self.get_argument("language") 24 | self.render("user.html",username=user_name,email=user_email,website=user_website,language=user_language) 25 | 26 | handlers = [ 27 | (r"/", IndexHandler), 28 | (r"/user", UserHandler) 29 | ] 30 | 31 | template_path = os.path.join(os.path.dirname(__file__),"template") 32 | 33 | if __name__ == "__main__": 34 | tornado.options.parse_command_line() 35 | app = tornado.web.Application(handlers, template_path) 36 | http_server = tornado.httpserver.HTTPServer(app) 37 | http_server.listen(options.port) 38 | tornado.ioloop.IOLoop.instance().start() 39 | -------------------------------------------------------------------------------- /BasicPython/codes/temploop/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Loop in template 5 | 6 | 7 |

aaaAAA

8 |

There is a list, it is {{info}}

9 |

I will print the elements of this list in order.

10 | {% for element in info %} 11 |

{{element}}

12 | {% end %} 13 |
14 | {% for index,element in enumerate(info) %} 15 |

info[{{index}}] is {{element}} 16 | {% if element == "python" %} 17 |

I love this language--{{element}}

18 | {% end %} 19 | {% end %} 20 | 21 | {% if "qiwsir@gmail.com" in info %} 22 |

A Ha, this the python lesson of LaoQi, It is good! His email is {{info[2]}}

23 | {% end %} 24 |

Next, I set "python-tornado"(a string) to a variable(var)

25 | {% set var="python-tornado" %} 26 |

Would you like {{var}}?

27 | 28 | 29 | -------------------------------------------------------------------------------- /BasicPython/codes/temploop/index.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #-*- coding:utf-8 -*- 3 | 4 | import os.path 5 | import tornado.httpserver 6 | import tornado.ioloop 7 | import tornado.web 8 | import tornado.options 9 | 10 | from tornado.options import define, options 11 | define("port", default=8000, help="run on the given port", type=int) 12 | 13 | class IndexHandler(tornado.web.RequestHandler): 14 | def get(self): 15 | lst = ["python","www.itdiffer.com","qiwsir@gmail.com"] 16 | self.render("index.html", info=lst) 17 | 18 | handlers = [(r"/", IndexHandler),] 19 | 20 | template_path = os.path.join(os.path.dirname(__file__), "temploop") 21 | #static_path = os.path.join(os.path.dirname(__file__), "static") 22 | static_path = "./static" 23 | 24 | if __name__ == "__main__": 25 | tornado.options.parse_command_line() 26 | #app = tornado.web.Application(handlers, template_path, static_path,) 27 | app = tornado.web.Application(handlers, template_path, debug=True) 28 | http_server = tornado.httpserver.HTTPServer(app) 29 | http_server.listen(options.port) 30 | tornado.ioloop.IOLoop.instance().start() 31 | -------------------------------------------------------------------------------- /BasicPython/codes/temploop/static/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #000; 3 | background: #fff; 4 | margin: 0 auto; 5 | padding: 0; 6 | } 7 | 8 | p { 9 | text-align: center; 10 | color: black; 11 | } 12 | -------------------------------------------------------------------------------- /Business/2014,哪些猪会被屠杀得更快一些?.txt: -------------------------------------------------------------------------------- 1 | 文/电商老兵斗牛士(torero2013) 2 | 3 | 2013年,粉丝经济、互联网思维无疑是互联网圈子里最热门的关键词之一,而这两个关键词都跟雷军及他的小米有关。今年的雷军可是无限风光,不仅小米估值超过100亿美元,销售额达到300亿,还拿下了年度经济人物。难怪乎他2年前在微博上说的话“创业要大成,一定要找到能让猪飞上天的台风口”今年被重新热炒,成为众多创业者的励志名言,很多创业者天真的认为在合适的时间做合适的事“站在风口,猪真的能飞起来”。 4 | 5 | 站在2013年年底,不得不给各位互联网创业屌丝提个醒,不要一厢情愿把自己代入雷军的角色。小米从来不是一只猪,也绝对不是小米加步枪的民兵,而是经过了严格飞行训练的土豪级正规空军。对于即将到来的2014,站在风口浪尖上的猪,不是会飞起来,而是会被屠杀的更快一些,而屠夫就是BAT巨头,旁边还有360只兀鹰在捡漏。 6 | 7 | 那么,哪些风口浪尖上的猪会率先进入屠宰场呢?老兵斗牛士来预测一下,权当笑料,并无恶意,请切勿对号入座。 8 | 9 | 首当其冲的就是pc互联网创业者。他们的种群名称叫“大白猪”,全世界分布最广的猪种,这类猪天生就是被屠杀当肉吃的命。小的时候会被农夫(天使投资)圈养起来,等长大了唯一的宿命就是拿给屠夫宰杀,换取两蚊饭钱。当然,更多的情况是还没等养大就被饿死了。 10 | 11 | 绝大部分的PC互联创业者就像这样的一只“大白猪”。还没等项目成熟落地,移动互联时代就来临了。在移动互联的冲击下,PC互联创业已经被视为鸡肋,几乎所有的人都认为pc互联的机会已经被巨头们瓜分殆尽了。如果你的项目不包装成移动互联网的项目,都不好意思拿出去谈风投,要想拿到融资的可能性非常低。 12 | 13 | 造成PC互联网创业者艰难境地的外因是寡头的崛起。国内互联网创业环境远比国外艰难的多,他们首先要规避的就是巨头的抄袭复制。今天中国pc互联网的格局已经形成了事实上的BAT三大巨头+360的寡头局面。四大巨头已经牢牢把控信息检索、社交、交易(购物)、游戏四大核心需求入口(阿里暂未入局游戏),占据了超过85%的PC互联流量入口。所有的PC创业者都只能借助他们提供的狭小通道进入这一体系,而进入后必须遵守他们自己设计的游戏规则来实现他们所谓的创业梦想。但遗憾的是,今天众多pc互联网创业者的创业方向都是错误的,往往选择互联网轻资产或者与传统行业整合难度小的行业入手,几个人就怀揣梦想操起了互联网创业,这些创业者最终都将沦为了BAT巨头们的创业小白鼠。 14 | 15 | 互联网创业者在做项目之前首先要问自己的是“我的项目BAT会做吗”?几个人乃至几十个人能做起来的互联网项目没有很大商业价值,只有需要几百上千人才能做起来的重商业模式才不容易被复制。作为平台型的企业,BAT是不太可能在一个新项目上投入过多资源,特别是涉及到实体产业运营。小米的成功有一部分原因要归功于选择了硬件这一很重的行业作为切入口。如果小米当初做的不是硬件,而是做平台或者做电商,也许今天能活着都是个问题。小米说到底还是个包着互联网外衣的传统企业。 16 | 17 | 第二只是移动互联网创业者。这一类的种群可以称为“长白猪”,特点是生长快,属于杂交品种。而移动互联网创业者就像是这样的一个角色。从pc嫁接到移动互联,智能手机的爆发式增长,4G时代的到来,让众多的创业者嗅到了创业的新方向。总有不少意淫者自以为乘着巨头们互相打架未站稳脚跟时可以浑水摸鱼进入移动互联市场,甚至于还在每天盘算着哪个巨头获得了几张移动互联网门票,真搞得自己好像也能得到一张门票似的。巨头们获得几张门票真跟你半毛钱关系都没有,瞎操这份心思干啥呢? 18 | 19 | 在虎嗅F&M创新节上,老兵看到类似打车软件等移动互联创业者的恐惧,他们之所以恐惧原因就在于选错了创业方向,当巨头在他们的软件里镶嵌这一功能,你的优势在哪里呢?就像微信推出扫二维码功能后原来火爆的一些二维码软件瞬间被消灭。这几年app倒下的还少吗? 20 | 21 | 老兵不得不给各位移动互联创业者泼点水清醒一下,别幸灾乐祸以为巨头打架第三方能渔翁得利,真正被屠杀的是第三方移动互联创业者。手起刀落,四大互联网巨头早已经在构筑从pc互联到移动互联的护城河,把pc的商业模式照搬进了移动互联,巨头还是之前的巨头,格局从未发生变化。当很多人都在YY腾讯已经获得了一张移动互联门票,为另外两大巨头前途感到担忧时,还是先想想自己吧。 22 | 23 | 第三只可能进入屠宰场的或许是B2C垂直电商。他们的种群名称叫“汉普夏猪”,这是一群品质高,瘦肉比例大的优质种群。他们的普遍特点是有风投,抗风险能力较强。对于B2C垂直电商企业,我曾经在《从凡客困局看垂直纯电商,90%都会死掉!》表达过自己的观点,直到现在我仍然坚持自己的观点。大部分垂直电商都是没有未来的,2014年还将倒掉一批垂直电商。最近还被传出“卖壳自救“号称B2C第一股的麦考林到现在还有几个人记得?其它上市的B2C电商日子还过得好吗?别说是垂直电商,连天猫京东这样的综合性B2C电商都受困于流量,需要不断从移动端获取新的流量增长点,更何况是其他B2C垂直电商呢? 24 | 25 | B2C垂直电商难以逾越的三道坎是:一如何解决流量成本居高不下的难题;二是如何解决客单价太低的问题,三是如何解决库存成本的巨大压力问题。尽管众多B2C垂直电商开出了移动互联、O2O等各种药方,但如果不从根本上改变B2C模式的成本难题最终都是死路一条。 26 | 27 | 没有实体产业支撑的电商是没有未来的,未来的电商一定是属于那些有互联网精神的传统企业,传统企业的品牌价值沉淀,对供应链的把控,品质的严苛都是互联网企业无法比拟的。给他们一个站在风口浪尖的机会,他们也会变成猪能飞起来。 28 | 29 | 除了上面几只,2014年要被屠杀的猪还真不少。例如淘品牌、淘宝小卖家、泡沫下的所谓粉丝经济、传统媒介及新媒体等都有可能涌现宰杀潮。太的创业者在奔往屠宰场的创业路上,如果你足够幸运,希望你能快到屠宰场时掉头往回跑。 30 | 31 | 我是电商老兵斗牛士,欢迎关注微信公共账户:torero2013,每周更新独家电商研究干货。新浪微博账户:@电商老兵斗牛士 32 | -------------------------------------------------------------------------------- /Business/一个新的App该如何推广.md: -------------------------------------------------------------------------------- 1 | #一个新的App该如何推广 2 | 3 | 由于经常写关于App推广的事情,经常有朋友打电话过来咨询我关于新的App的推广事宜,有的是旅游的app,有的是女性的app,有的是社交类的,问的问题也是各种各样,有的说没有预算,怎么推广,有的说有点预算但是不多怎么推广,经常电话给朋友们解答,索性今天我就把我的思路写出来,以飨初进行业做推广的朋友,如果是行业高人,可以略过。 4 | 5 | 先说下初步的推广思路,一个新的App刚出来,无论有没有预算都可以按照这样来。 6 | 7 | 第一步:为你的App建立一条百科。 8 | 9 | 刚出来的app在网络上肯定是一篇空白,网络上还没有任何关于新的app的信息,建立一个关于App的百科,有用户搜索的话,用户可以从百科上更详细的了解你,同时,如果后期做品牌营销的话,也能为你引来更多的潜在用户,当然,百科不一定只仅仅是百度百科,你可以举一反三在各种百科上建立你的词条,建立的越多越方便用户快速的搜索到。建立百科看似是一个很简单的事情,其实不然。有的百科看起来简单明了,有的百科看起来一头雾水,这里面也是有技术含量的,所以建立百科时一定要条理清晰,语言通俗易通,同时配上清晰的截图,这样用户才能更快的了解,明白。国内很多app的百科写的很烂,为什么很烂,一是写的很专业,二是还有很多修饰性词语,三是还很啰嗦,这样的词条带着很重的主观思维,用户也不会喜欢,所以通俗的告诉用户你的app能帮他们干什么,可以更方便他们下载。 10 | 11 | 第二步:为你的app建立一个微博 12 | 13 | 微博是一个大众化的产品,很多人的手机上可能都装有,当用户从词条哪里了解了你的app之后可以很轻松的通过微博关注你,和你互动,包括信息反馈,有的人说用户可以通过app里的“留言反馈”可以和你互动啊,这个是大错特错,很多用户在不了解一个app之前是不会轻易下载的,除非这个app是非下不可,而且很多app的用户反馈都藏的很深,用户一般找不到。相反,通过微博,用户可以实时的了解你,好的微博内容还会引起用户的转发和扩散,这些都是建立微博的好处,当然微博不仅是新浪微博,其他的微博也都要入驻,别让腾讯微博的用户去新浪微博找你,那是不可能的。 14 | 15 | 第三步:在权重高的论坛发帖 16 | 17 | 通过百科和微博的信息填充,一个新的app算是有一定的品牌基础了,接下来就是在论坛发个帖子,别小看发帖子,我曾经一篇广告帖子可以传播几百万页面,而且被各种淘宝店当做教程,直接贴在卖手机的说明书里,我这样说的意思是别小看一篇帖子,你要把帖子写的用心一些,从用户的角度出发,让用户看了觉得非常有用才行。帖子写好了,就要找论坛发,找什么样的论坛,那肯定是找权重高的,那些网站论坛权重最高?建议用站长查询查询下,权重高的论坛搜索引擎的抓取速度是最快的,一般是一分钟之内抓取,我建议发个20~50个论坛,之前在推广APP时候,论坛带来的流量能高达一两万激活,现在应该更多。 18 | 19 | 第四步:拓展200个渠道 20 | 21 | 前面三步说了那么多,其实都是在网络上布置关键词,方便用户搜索,提高app的曝光量和自传播力,接下来是拓展渠道,把新的app上传到各种应用商店,软件下载站上,拓展200个渠道,目前的渠道很多,你可以根据类别进行分类,同时发掘一些新的渠道。渠道的定义为能给APP带来展示和下载的网络媒介,谈渠道不是只指那些APP商店,比如有些公交车的免费wifi也提供APP下载的,也是你的渠道,另外一些微信粉丝比较多的应用自媒体,经常会推荐一些APP,也能为你的APP提供一些下载量,这些都是你的渠道。另外,铺渠道是一种比较累的工作,但是确实很有用,我曾经只铺渠道就带来了一百万的量。铺渠道还有另外一个好处就是,通过自然下载可以知道一个app在用户心中是什么位置了,也可以知道自己的app到底优秀不优秀,同时也可以帮你更详细的了解各个渠道的质量,为以后的付费推广做铺垫。铺渠道当然不能只是简单的铺渠道,在铺渠道的过程中,要了解渠道的一些情况,比如是否对新的APP有推广资源、首发资源等,可以为后续的大量推广做铺垫。 22 | 23 | 第五步:结合受众人群做活动营销 24 | 25 | 前面说了那么多,都是免费推广APP的一些方法,当然如果有一点预算又不是很多的话,可以做一些活动营销,花费不会很多,你可以在论坛,在渠道做一些活动,活动形式要简单,可玩性强,而且奖品要吸引人,通过用户的参与可以提高APP的下载量,可以提供曝光度。活动营销要和你的APP属性相结合,找到你的特定人群,比如做女性APP的,可以在校园里办活动,也可以在线上的女性社区办活动,做旅游APP的,可以和一些旅行社合作等等,所以做活动营销一定要和受众人群合作。 26 | 27 | 这些都是一些新的APP的推广思路和方法,在推广APP的时候要视野宽泛,举一反三,切不可思维定势,同时要站在用户的角度考虑问题,现在的新APP一出来,大部分一开始就是换量,建议不要做,换量这种推广方式,一方面对产品的影响比较大,一方面对产品来说没有什么意义,换量适合做垃圾APP。 此外,本文的思路适合没有资源的个人和中小团队。 28 | 29 | 作者:移动互联网李建华,微信号:tianyi86913,转载时务必注明文章作者信息和来源移动互联网(ydhlwdyq),不尊重原创的行为将受到追责。 30 | 31 | -------------------------------------------------------------------------------- /Business/云技术如何改变世界变更管理?.md: -------------------------------------------------------------------------------- 1 | #云技术如何改变世界变更管理? 2 | 3 | 为了对云计算做出反应,变更管理专家应该看一看技术、战略和开发变化。还要关注一下其它相关的影响。例如,当你需要某一个特定软件时,你是否要安装你第一眼看到的东西,或者是检查规格、价格、兼容性等等。简单说,你需要决定特定变动是如何影响你系统的。然而,当组织兴奋地向云迁移时,但却没有考虑变更管理的一些重要影响。 4 | 5 | 一直以来,我们在创造,我们在实践,我们在进步,这就是变革。随着时间推移我们不停的经历失败和成功。创造的人们总是带给我们思想的动荡,文人们引发了法国大革命,孔子的儒家思想改变了战时复杂的思想纷争,从那以后,战争不断,但是思想不变,直到近代,从变开始,以变结束,我们唯一知道就是变化就是唯一永远的不变。 6 | 7 | 所以在云技术、大数据、移动技术出现后,无论组织拥抱或者决定使用哪种技术时,变更管理都是非常重要的一部分。然而,由于过去几年云服务的关注点一直放在敏捷、快速部署方面,以至于大家都没有意识到这一概念。把业移动到SaaS模型中不仅有技术影响,还有各种业务影响。业务操作和业务流程可以打包成服务。这样,他们可以迅速地交付出去。这对于在线产品如软件及其它服务来说也是正理。 8 | 9 | 为了对云计算做出反应,变更管理专家应该看一看技术、战略和开发变化。还要关注一下其它相关的影响。例如,当你需要某一个特定软件时,你是否要安装你第一眼看到的东西,或者是检查规格、价格、兼容性等等。简单说,你需要决定特定变动是如何影响你系统的。然而,当组织兴奋地向云迁移时,但却没有考虑变更管理的一些重要影响。 10 | 11 | 本文介绍了云对变更管理的几方面影响。 12 | 13 | ##提高生产率 14 | 15 | SaaS可以轻而易举地提升生产率,通过提供应用或基础设施平台以及其它资源,来在客户服务中带来变更。员工可以迅速、有效地对客户做出回应。 16 | 17 | ##移动服务 18 | 19 | SaaS还可以给组织带来移动性变更。公司有能力承担使用移动服务的价格。组织中实施了SaaS,你必须再担心维护和集成数据库和服务器问题。你可以更专注于管理服务。 20 | 21 | #3流程驱动变更管理 22 | 23 | 业务流程管理或基于BPM的解决方案可以给流程鸡翅变更行为提供支持。在这种情况下,业务模型能够驱动特定的变更,同时可以确保可追溯性,通过在分析和需要文档中连接不同的业务流程到特定的变更上。然而,业务可能需要完善结构化方法,如IT服务管理信息技术基础设施库,从而支持动态广告快速的SaaS部署。 24 | 25 | 评估变更管理有很多重要的考虑因素: 26 | 27 | - 组织——SaaS改变了员工的现有角色和责任。 28 | - 业务运维——因为SaaS改变了多个业务流程,所以引起的了运维变更。 29 | - 采购——SaaS改变了服务产生的方式。 30 | - 技术——SaaS解决方案可以轻易地提供可扩展的访问权限。另外,还提供了高级分析和数据采集能力。 31 | - 开发——SaaS确保了恰当的部署和集成。 32 | 33 | 当组织没有集中在一个连贯的治理方法时,就会致力于独立的SaaS部署。尤其在服务有其自己的程序和政策的情况下,关于集中管理很有可能导致严重的问题。没有合适的、一致的企业安全性和架构,就很可能会陷入困难的境地。因此,SaaS解决方案应该一直对服务管理和互通用性投入适当的关心。 34 | 35 | 有了企业级SaaS解决方案,混合服务就可以很容易地利用。然而,局面还是有可能不受控制。这样,有一个合理的策略和愿景来处理重要元素很重要,这些元素有服务管理、政策管理、数据和应用之间的交互、性能、可用行和变更管理的可控性。 36 | 37 | 来源:[网易云阅读](http://yuedu.163.com/news_reader/#/~/source?id=a4a21dba-8c0b-4404-b48f-53d526aa792b_1&cid=8faf1035054a4425b59d612586cfe6f2_1) 38 | -------------------------------------------------------------------------------- /Business/互联网思维到底是什么?.md: -------------------------------------------------------------------------------- 1 | 作者:B座12楼 2 | 3 | 但凡做企业的,不管是创业的还是在互联网冲击下转型升级的传统行业企业家,“互联网思维”已经成为了大家共同的口头禅。 4 | 5 | 但究竟什么是互联网思维?众说纷纭,莫衷是一。我简单谈一下我的看法,很多内容就不展开了,欢迎拍砖交流。 6 | 7 | 1、互联网思维是相对于工业化思维而言的。 8 | 9 | 一种技术从工具属性、从应用层面到社会生活,往往需要经历很长的过程。珍妮纺纱机从一项新技术到改变纺织行业,再到后来被定义为工业革命的肇始,影响东、西方经济格局,其跨度至少需要几十年。互联网也同样。 10 | 11 | 但因为这种影响是滞后的,所以,我们就难免会处于身份的尴尬之中:旧制度和新时代在我们身上会形成观念的错位。越是以前成功的企业,转型越是艰难,这就是克莱顿·克里斯坦森讲到的“创新者的窘境”——一个技术领先的企业在面临突破性技术时,会因为对原有生态系统的过度适应而面临失败。 12 | 13 | 现在很多传统行业的企业,面临的就是这种状况。这种困境可以叫做“工业人”要变成“数字人”的困境。 14 | 15 | 2、互联网思维是一种商业民主化的思维。 16 | 17 | 工业化时代的标准思维模式是:大规模生产、大规模销售和大规模传播,这三个大可以称为工业化时代企业经营的“圣三位一体” 18 | 19 | 1)但是互联网时代,这三个基础被解构了。工业化时代稀缺的是资源和产品,资源和生产能力被当作企业的竞争力,现在不是了; 20 | 21 | 2)产品更多地是以信息的方式呈现的,渠道垄断很难实现; 22 | 23 | 3)最重要一点,媒介垄断被打破了,消费者同时成为媒介信息和内容的生产者和传播者,你再希望通过买通媒体单向度、广播式制造热门商品诱导消费行为的模式不成立了。 24 | 25 | 这三个基础被解构以后,生产者和消费者的权力发生了转变,消费者主权形成。 26 | 27 | 3、互联网思维是一种用户至上的思维 28 | 29 | 以前的企业也会讲用户至上、产品为王,但这种口号要么是自我标榜,要么真的是出于企业主的道德自律。但是在现在这个数字时代,在消费者主权的时代,用户至上是你不得不这样的行为,你得真心讨好用户。淘宝卖家“见面就是亲,有心就有爱”是真实的情绪,因为好评变成了有价值的资产。民主和专制的区别就在于,前者是不得不对人民好,后者是出于道德自律。所以判断民主社会和专制社会的一大标准,就是两方是怎么对待道德这个事情的。 30 | 31 | 4、互联网思维下的产品和服务是一个有机的生命体 32 | 33 | 在功能都能被满足的情况下,消费者的需求是分散的、个性化,购买行为的背后除了对功能的追求之外,产品变成了他们展示品味的方式。 34 | 35 | 这样,消费者的需求就不像单纯的功能需求那样简单和直接,所以,对消费者需求的把握就是一个测试的过程,要求你的产品是一个精益和迭代的过程,根据需求反馈成长。小米手机每周迭代一次,微信第一年迭代开发了44次,就是这个道理。 36 | 37 | 5、互联网思维下的产品自带了媒体属性 38 | 39 | 因为需求和品味相关联,也就是和人性相关联,所以,互联网思维下的产品就是极致性能+强大的情感诉求。这两样东西都是会自传播的。 40 | 41 | 现在看到一些和互联网相关的企业,还在开新闻发布会,还在把硬广当致胜利器,都是互联网思维不充分的体现。 42 | 43 | 6、有互联网思维的企业组织一定是扁平化的 44 | 45 | 互联网思维强调开放、协作、分享,组织内部也同样如此,它讲究小而美,大而全、等级分明的企业很难贯彻互联网思维,不管是对用户还是对员工,有没有爱,也是一个重要的评判标准。 46 | 47 | 很遗憾,很多互联网企业也还在用工业化的套路做着自己的企业。大家都羡慕小米、极路由这样的极速发展,但如果不能在观念上进行改变,那么,不管你做的是APP还是其他,你本质上还是一个传统企业。 48 | -------------------------------------------------------------------------------- /Business/网上推广随想.md: -------------------------------------------------------------------------------- 1 | 网上推广随想 2 | 3 | 网上推广,在所谓的专业人员那里有一个词语——SEO。不管是什么,终极目的就是让人在网上能够了解到、搜索到自己。如果在网上不能被查到,自己心理就不放心,总担心别人会质疑自己的存在,事实也基本如此。 4 | 5 | 但是,10年前不是这样的。 6 | 7 | 曾经,就是10多年前,我鼓捣一些公司做网站,当然自己是从中有油水的。那些老板一般反问:做网站有什么用途?有谁会到网上看我的东西,他们都是打电话订购。 8 | 9 | 10年后,还是这些做家具、做图书、做培训等等跟网络相去较远的老板们,已经是众多做网络推广的公司的收入来源,他们已经迷信网络推广能够带来滚滚财源了。一般的套路就是花钱,在国内几个搜索引擎上买关键词。不少做搜索引擎关键词买卖代理的公司偷着乐呢。而且这些老板们鉴定地相信,这种相信已经到了雷打不动的地步,只有在搜索引擎购买关键词才能给自己带来订单和财源。 10 | 11 | 10年前,那些有钱的老板们错过了最佳时机,10年后,他们依然犯者同样的错误,而且代价更高。因为10年后的互联网已经不同于10年前了。 12 | 13 | 讲个案例吧。 14 | 15 | 一个做家具的朋友,为了敢某个家具展销活动扩大宣传,他想到要在网上推广。于是找人做网站,网站比较简单啦,就是他做的几个家具品种的静态页面。当然,由于是他着急要把网站做起来,肯定是做肥猪了。此外,又花钱在什么度、什么零等搜索引擎上买关键词。急着想让自己上头条,还得当肥猪呀。 16 | 17 | 结果呢?没有自己得到预想的结果。 18 | 19 | 他开始抱怨诸多网络推广不行了。 20 | 21 | 我则提示他,你看看那些来看家具人,是不是都在用手机拍来拍去?你有二维码让扫描吗?你有微信跟他们互动吗?你有微博来讲你的家具故事吗?你有公众号每天发鸡汤夹带着家具呢?...... 22 | 23 | 他摇头,还反问我:那么麻烦,有用吗? 24 | 25 | 列为看看,是不是和10前一样的思维方法? 26 | 27 | 所以,历史,不是没有用途的。历史学不好,一定搞不好现在。历史总在重复,只不过现在的人不知道而已。 28 | -------------------------------------------------------------------------------- /Business/让员工感到公平.md: -------------------------------------------------------------------------------- 1 | **作者:王增荣** 2 | 3 | 我们常讲,管理的一切出发点和落脚点都应该是提高管理对象工作的积极性,事实上,“积极性”的一个重要依据就是“公平感”,俗话讲:“不患寡,而患不均”,说的大概也是这个道理。有专业公司在进行劳动力调查时发现:大多数蓝领员工,更追求公平,如薪酬、工作方式等方面的公平;而白领员工,更追求自由度,如自由、弹性工作时间、工作场所和工作方式等。 4 | 5 | 所以,之于企业,各方面的公平是创造满意度的基础,也影响着员工工作的积极性、进取心、甚至是他的去留。我们在很多企业内部调查时,会问到“身边同事离职的原因”,超过4成的人会选择“受到了不公平的对待”,而这又常常体现在薪酬方面,所以,降低员工对薪酬的不公平感,一直以来都是企业致力解决的重要问题之一。据我们的经验,以下三种方式有利于降低员工对薪酬的不公平感。 6 | 7 | 其一,企业必须让员工明确什么是“有效付出”。在很多企业,我们注意到的一个现象是——人们都很忙,忙到甚至连喝水、打盹的时间都没有,而当他们自己坐下来静静思考时,发现好像也没做什么事,关键是没创造什么价值,所以企业就不会给你涨工资、加薪水,于是他就会感觉很不公平——付出没有回报。正常的想法,人们都以为付出就应该得到回报,但只有高效才会获得价值,瞎忙是没有价值的。所以,为了减少员工的不公平感,就要让每一们员工都了解到他的薪酬的来源和组成部分,给予期待正确的努力方向,这个物质基础会减少员工的不公平感。 8 | 9 | 其二,增加员工对自身岗位价值的认识。即便是一个拧螺丝的工作,也有他不可替代的价值。在德国的工厂里,你会看到每一颗螺丝旋转的力度和方向都是完全相同的,因为每个人都知道自己的行为标准代表着“德国制造”。所以,企业应该通过岗位评价的培训让员工了解岗位评价的科学性,用客观的评价让员工了解到自身岗位的真正价值。同时,将岗位评价的价值差与薪酬差挂钩,使员工更理性的认识到企业内部的薪酬差异,纵向、横向比较均体现公平感。 10 | 11 | 其三、严格执行绩效考核。2013年,网络上有篇文章很火,大意是:索尼之死,死于绩效考核,说索尼自己绩效考核以来,大家只关注考核的内容,而不再主动创新,工作氛围也变得压抑、沉闷……最后到了今天这种地步。可是谁规定“创新”不能作为考核的关键点呢?!换言之,索尼之死并非绩效考核问题,而是绩效考核关键点的设置问题,绩效考核方案的设计出了偏差。事实上,在我看来索尼之死的真实原因在于创新能力、文化以及对市场的把握,不够敏捷。 12 | 13 | 因此,在企业,不仅仅是绩效工资要和绩效制度联合起来,一些福利、奖励等也应该与绩效挂钩,这样就能够避免“吃大锅饭”、“干好干坏一个样”、“干多干少一个样”的不公平现象。这样,不仅让员工有被尊重的感觉,同时也可以增加制度的透明度,这样的绩效考核会显得更公平、客观,从而有效减少不公平感。 14 | 15 | 事实上,公平的感觉是让员工更有动力、工作更积极和实现高绩效的基础。企业只要认真去做、用心去做,员工一定会看得见、感受得到,收效也会很明显。 16 | 17 | 来源:[简书](http://jianshu.io/p/c2de9b2b9a81) 18 | -------------------------------------------------------------------------------- /Docker/DockerApplicationDevelopement.md: -------------------------------------------------------------------------------- 1 | #云计算的乐高玩具,Docker从根本上改变应用程序开发 2 | 3 | 【编者按】Docker改变了应用程序开发领域的很多事情,已经成为时下最流行的开源项目之一,而且也从根本上改变了人们构建应用程序思维方式。Docker正在改变云的开发实践,允许任何人以整合别人容器的形式利用封装社区的最佳实践,这就像云组件的乐高玩具。 4 | 5 | 以下为译文: 6 | 7 | Docker就像一场森林大火,这个新的Linux容器技术以它自己的方式点燃了周围的一切,我们许多人难以跟上它蔓延的速度。Docker不仅是历史上最流行的开源项目之一,而且也从根本上改变了人们构建应用程序的思维方式。 8 | 9 | 严格来说,许多基于Docker应用程序背后的理念并不新颖,但Docker却给这些旧理念带来了新的思维角度。Docker鼓励像 12-Factor Applications 的最佳实践,那么利用Docker到底改变了什么?且看以下四个领域。 10 | 11 | ##微服务架构的崛起 12 | 13 | 单片云应用开发已经被淘汰了,取而代之的是微服务架构,它将大型应用程序拆解成通过普通REST API通信的更小的、 目的驱动的服务。 14 | 15 | 在90年代,一个类似的概念被称为接口/基于组件的体系结构,后来,SOA似乎势头很猛,到现在微服务器概念已经成为Docker社区一个标准的主题,它的趋势是将应用程序拆解为解耦的、极简的以及为做好一件事而设计的专门容器。 16 | 17 | 完全封装的Docker容器能通过为微服务应用程序创建一个高效的分销模式来提供微服务,这改变了云开发实践模式,使得原来在Facebook和Twitter使用的大规模架构,在小开发团队里的应用变得可能。 18 | 19 | ##让dev和ops更加紧密 20 | 21 | 尽管Puppet、 Chef、 Salt等开创了devops运动,这些工具在运维团队的受欢迎度仍然比开发人员高。 22 | 23 | Docker是第一个devops工具,它在开发者和运维者之间同样受欢迎,为什么?因为开发人员可以在容器内部工作,而运维工程师可以并行的在容器外部工作。 24 | 25 | 当开发团队采用Docker,他们为软件开发生命周期添加了一个新的敏捷层。最大的区别是一致性,基于Docker应用程序能够和开发阶段一样运行在笔记本电脑上。因为Docker封装应用程序的所有状态,你不必担心由于底层操作系统的差异缺陷造成的管理或bug问题。 26 | 27 | ##保证持续集成一致性 28 | 29 | 通过自动测试你代码的持续集成是一个非常好的方式来减少你最终产品的bug数量,但持续集成有两大缺点。 30 | 31 | 首先,很难封装所有依赖项。传统CI(持续集成)/ CD(持续交付)技术如Jenkins 或Travis由于binary dependencies 或OS-level 变更,导致代码在开发阶段和dev /test/ QA阶段稍有出入,而Docker封装了整个应用程序的状态,这使得代码运行在dev /test/QA阶段和开发阶段完全相同。 32 | 33 | 其次,持续集成并不是为微服务架构而构建的。CI是基于一个App位于一个代码库的假设而构建的。然而,Docker最佳实践鼓励微服务架构与各种Docker容器全部松散耦合,于是有了新的CI / CD工具 Drone 和 Shippable ,它们是基于Docker容器构建的。这些工具可以让你从多代码库中提取测试多容器的应用程序。 34 | 35 | ##最佳容器的协同 36 | 37 | 并不是改变你们自己的服务容器如Hadoop、Nginx或MongoDB,Docker鼓励开源社区合作和在 Docker Hub上 微调容器。因为Docker可以封装状态,它们让你更灵活的配置软件来保证其最佳运行。 38 | 39 | 因此,Docker由于允许任何人以整合别人容器的形式利用封装社区的最佳实践,从而改变了云开发实践。这对于云组件来说就像是乐高玩具,最后总会将它们拼在一起。 40 | 41 | ##云计算的乐高玩具 42 | 43 | 新技术的出现总会伴随着打破现状,Docker正迅速改变云的规则和颠覆云技术领域,它改变了CI / CD、微服务、开源协作、devops等领域,Docker也正在改变应用程序开发生命周期和云工程实践。每一天,成千上万的开发人员愉快地重构或构建新的基于Docker的App。了解Docker已经成为企业或个人在激烈变化的世界中保持竞争力的一个关键因素。 44 | 45 | 原文链接:[4 ways Docker fundamentally changes application development (编译/魏伟 审校/仲浩)](http://yuedu.163.com/news_reader/#/~/source?id=426f1ed9-b19b-44f5-bcad-9f58930fc65e_1&cid=a5e98f26ea22481c8903a6883ff07abd_1) 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Education/上海教育第一的真相.md: -------------------------------------------------------------------------------- 1 | BBC:点评中国:上海教育第一的真相 2 | 3 | 中国的教育状况如同经济一样,由于地域和社会差异太大、太复杂,各种信息纷至沓来,往往令人莫衷一是,难辨真相。 4 | 5 | 2013年中国教育的一个特大好消息,是OECD(经济合作与发展组织)公布PISA(比萨测试)2012测试结果,上海蝉联第一。 6 | 7 | 2009年上海首次代表中国参加这个著名的国际学生评估项目,毫无准备地得了个第一;这次成功卫冕却是没有悬念的。PISA的评估对象是15岁学生,项目为数学、阅读和科学(理科)。上海的成绩是:数学613分(比第二名新加坡高40分)、阅读570分(比第二名香港高25分)、科学580分(比第二名香港高25分),各项都比平均值高出一倍以上,更是把美国远远甩在后面。 8 | 9 | 在上海第一的背后,可以看到亚洲国家的文化特性:对教育的高度重视和对纸笔考试的高度重视。PISA三个项目进入前五的几乎全为亚洲国家,仅芬兰获得科学第五。 10 | 11 | 对于上海第一,也有人质疑其实施过程是否有假。我相信这一结果是真实的,不仅因为上海基础教育的水平在全国遥遥领先,而且学校之间比较均衡,农民工子女的教育得到较好保障,在大城市中首屈一指。国外发现的是教育系统的教研制度,形成市、区、学校三级教研网络;以及重视教师的继续教育和专业发展等具有中国特色的特点。 12 | 13 | 然而,在学业成就之外,上海还获得了另一个世界第一:课业负担最重。上海学生每周作业时间平均为13.8小时,高于OECD国家的平均7小时,是香港、澳门、台北的两倍多,是韩国、芬兰、捷克的四倍多。加上校外辅导和私人家教,上海学生每周校外学习时间平均为17小时左右,远远高于OECD的平均值7.8小时。 14 | 15 | 它澄清了一个事实,以往经常有人说亚洲国家的应试教育、课外补习都一样,难以改变,看来还是很不一样。它证明减少一半的作业时间仍然取得较好成绩是完全可能的。这便是更值得重视的中国教育的真相和基本面貌。 16 | 17 | 在大多数城乡,学生都在严酷的应试教育环境中苦读苦练苦熬。河北衡水的万人高中,标榜的“雪狼精神”是“今日疯狂,明日辉煌”,对学生的一举一动都进行打分和排名评价,有些学生因为早上来不及叠被子怕被扣分,高中三年未脱过衣服睡觉。安徽六安市的毛坦厂中学有2万学生,号称“亚洲最大的考试机器”。高三“全年无休”,仅周日傍晚放假2小时换洗衣物,可以说是教育界的“血汗工厂”。它们与上海的相似之处,都是以“时间 + 汗水”作为基本教育方式的。 18 | 19 | 中小学生的课业负担过重,已经成为严重的社会问题,因不堪学业负担和考试压力,学生自杀的事件不断发生。去年教育部再次重拳出击进行治理,颁布被称为史上最严“减负令”的《小学生减负十条规定》,内容包括阳光入学、均衡编班,切实缩小校际差距,招生不依据任何获奖证书和考级证明,禁止以各种名目分重点班和非重点班;一年级新生入学后从“零起点”开展教学;一至三年级不留书面家庭作业,四至六年级每天书面家庭作业总量要控制在1小时之内;每天锻炼1小时等等,其实不过是重申《义务教育法》的有关规定,以及小学应当做到的基本要求。 20 | 21 | 然而,《中国青年报》的一项调查显示课外补习依然火爆。93.9%的受访者确认身边很多小学生仍然在上补习班。71.3%的被访者反映,学校老师向学生、家长推荐或要求上补习班的情况很普遍;“英语”补习班最多(81.1%),其次是“数学(包括奥数)”(59.4%),“语文”(36.0%)排在第三位。中国家长的“虎妈”形象又一次显现:许多家长并不支持减负的举措,导致学校减负、家长加负。家长首选的原因是“竞争太激烈,周围人都上补习班”(60.6%),其次为“许多考试内容课堂不讲,只在补习班里讲”(26.1%)和“学校课堂质量不高”(21.1%)。 22 | 23 | 可见在家长的集体焦虑背后,学校差距过大、择校热高烧不退才是学生学业负担过重的根本原因。这不是说家长的价值观和行为没有问题,而是说由于制度性的问题,将“虎妈”的过激行为部分合理化了。 24 | 25 | 基础教育的功能和目标显然不仅仅是考试成绩。那些PISA没有评价的指标,如身心健康、体能、社会化程度、交往能力、表达能力、艺术欣赏、生活能力、视力等等,都比学业成就更重要。如果评价这些内容,上海会得第几呢?究竟是谁输在了起跑线上?这是真正令人担忧的。 26 | 27 | (作者:北京理工大学教育研究院教授杨东平) 28 | 29 | -------------------------------------------------------------------------------- /Education/我为什么说电子书包是一条“歧路”和“弯路”?.md: -------------------------------------------------------------------------------- 1 | 我为什么说电子书包是一条“歧路”和“弯路”? 2 | 作者:王竹立 3 | 4 | 【“电子书包热”虽然至今还在杂志和论文中延烧,在实践中事实上已经开始式微,电子书包试点十多年后仍然停留在试点阶段,难以得到真正的普及和推广,就是一个明证。下文是笔者最近正在修改的论文中的一个片段,先放上来供大家争鸣。---竹立附记】 5 | 6 | 为什么电子书包在试点十多年后依然徘徊不前、无法在国内普及和推广呢?笔者分析有下列几方面原因: 7 | 8 | ①我们错误地把电子书或电子书包的主要应用放在课堂上,以为这样就能改变教学模式或教学结构,构建所谓“一对一”的个性化教学环境,这使得电子书包的试验一开始就走入了一个误区。只要稍有教学经验的人都知道,课堂上短短的几十分钟很难进行所谓个性化学习,而适合进行教师主导的讲授、示范或讨论。笔者曾研究过一些所谓在课堂上开展一对一教学的案例,这些案例其实并不是真正的一对一学习,例如老师让学生通过电子书包步调一致地观看统一的学习内容,用标准化的答案回答问题;整个课堂带有表演性质,有事先排练的痕迹,每个环节时间很短,来不及展开就已经结束,很难让学生真正进行“个性化”学习。所谓个性化学习,应该是根据学习者个人的兴趣、爱好、需要,由学习者选择自己想学的内容和适合自己的方式,按照个人的节奏、步骤、进度进行的学习。一句话,个性化学习就是真正意义上的自主学习。这种自主学习当然不排斥接受老师的指导和同伴的帮助,但决定权一定在学习者手中。因为只有学习者本人才知道自己想学什么、学到了什么以及什么时候学最合适,任何人都不能越俎代庖。而“一对一”则是指一个教师面对一个学生的个性化指导,电子书包能代替教师吗?显然不能!因此,真正意义上的个性化学习,必须突破课堂上时间与空间的限制,因而只能发生在课外。那种在公开课中带有表演性质的一对一教学,自然很难在日常的教学中推广。 9 | 10 | ②不符合国情。在我国高考制度尚未实现真正变革的情况下,应试教育依然无法避免。在高考指挥棒的引导下,学校和教师关心的首先是如何提高考试成绩。引进信息技术及其产品或者新的教学模式并不一定能提高考试分数,反而可能把教师和学生的精力分散到对技术及其产品的学习和对新模式的适应上,其结果很可能是费力不讨好。而且电子书包及其相关资源、平台价格不菲,日常维护与更新换代更需要源源不断的资金投入,在我国大多数地区和学校这样的“先进教学环境”目前还只能是一种奢望。 11 | 12 | ③电子书包无论是理念还是产品都存在严重的缺陷。在美国这样的信息技术最发达的国家,电子书包并不流行,甚至连“electronic school bags”这个词都没有,有人用这个词到国外期刊数据库里去查找,连一篇论文都查不到,以至于黎加厚教授不得不把美国教育部发表的一张“技术支持的学习模式图”视为“美国人心中的‘电子书包’定义”。在美国只有手执移动电子终端这样的名称。你可以说美国的“手持移动电子终端”就是我们说的“电子书包”,但仔细琢磨还是有区别的,“手持移动电子终端”强调的是其移动性和网络连接功能,而我们的“电子书包”强调的是设备里的学习资源、电子教具、家校联系服务;为了不让学生学习分心,大多数电子书包还专门设计了限制学生上网和老师控制学生电子书包的功能,电子书包实际上变成了学生手头的一种多媒体设备,老师们只希望学生利用电子书包和学校平台上的资源进行学习,对学生通过网络自由获取信息和资源、与他人进行社会化交流不太热心。这与国外中小学鼓励学生通过互联网获取信息与资源恰成鲜明对比,很难真正培养学生的信息素养。因为真正的信息素养应该是如何在互联网这个信息的汪洋大海中,对信息进行有效的搜索、选择、加工、传播,与他人进行充分的交流与合作。正如在澡盆里永远不能训练出游泳高手一样,在教师事先定制的“书包”和“平台”上也培养不出真正的信息能力。事实上,现在互联网中已有越来越多的教学资源和教学工具,今后通过手持移动终端直接登录互联网上的平台进行教与学是大势所趋,电子书包已面临被淘汰的命运。 13 | 14 | 在我国,电子书包项目一开始就具有浓厚的商业目的,电子书包开发商瞄准的是所谓1000亿的产值,他们不仅通过卖设备一次性赚钱,更多的还要靠卖资源、卖教具、卖服务和不断升级持续赚钱。不同的开发商开发不同的电子书包,规格、标准、服务都不统一;开发商制作的资源也很难真正符合一线教师的需要;为了保证自己的利润,开发商之间很难进行真正的合作。何况电子产品对学生的注意力、文字书写能力、社会交往能力以及身心健康都有一定的负面影响。这些都限制了电子书包的推广。 15 | 16 | 综上所述,笔者认为电子书包只是一个过渡性的技术和产品,电子书包热并非是我国教育信息化的必经阶段,而是一条“歧路”与“弯路”。这并不意味着否定电子产品在教与学中的作用。平心而论,电子产品在丰富教与学手段、调动学生学习积极性、提高师生的信息素养等方面有一定作用;在部分课程,如外语教学中表现不俗。将来电子书(电纸书)有可能取代纸质书成为主流学习工具。未来的电子书的价格有可能便宜过纸质书,而功能要强大得多,相应的教与学方式也会发生一定程度的变化。笔者只是不赞成过于夸大电子产品的作用,把它作为变革课堂教学模式的“灵丹妙药”;尤其不赞成在我国大部分老少边穷地区和城市打工者子弟学校教育信息化程度还很低、连基本的电脑和上网条件都不具备的情况下,部分地区和学校“炫富”式的教育信息化发展方式。 17 | 18 | -------------------------------------------------------------------------------- /Education/教育的本质.md: -------------------------------------------------------------------------------- 1 | 作者:周国平 2 | 3 | 现在我把我最欣赏的教育理念列举出来,共七点,不妨称之为教育的七条箴言。它们的确具有箴言的特征:直指事物的本质,既简明如神谕,又朴素如常识。 4 | 5 | ##第一条:教育即生长,生长就是目的,在生长之外别无目的。## 6 | 7 | 这个论点由卢梭提出,而后杜威作了进一步阐发。“教育即生长”言简意赅地道出了教育的本义,就是要使每个人的天性和与生俱来的能力得到健康生长,而不是把外面的东西例如知识灌输进一个容器。 8 | 9 | 苏格拉底早已指出,求知是每个人灵魂里固有的能力,当时的智者宣称他们能把灵魂里原本没有的知识灌输到灵魂里去,苏格拉底嘲笑道,好像他们能把视力放进瞎子的眼睛里去似的。 10 | 11 | 懂得了“教育即生长”的道理,我们也就清楚了教育应该做什么事。比如说,智育是要发展好奇心和理性思考的能力,而不是灌输知识;德育是要鼓励崇高的精神追求,而不是灌输规范;美育是要培育丰富的灵魂,而不是灌输技艺。 12 | 13 | ##第二条:儿童不是尚未长成的大人,儿童期有其自身的内在价值## 14 | 15 | 把儿童看作“一个未来的存在”,一个尚未长成的大人,在“长大成人”之前似乎无甚价值,而教育的唯一目标是使儿童为未来的成人生活做好准备,这种错误观念由来已久,流传极广。 16 | 17 | “长大成人”的提法本身就荒唐透顶,仿佛在长大之前儿童不是人似的!蒙台梭利首先明确地批判这种观念,在肯定儿童的人格价值的基础上建立了她的儿童教育理论。 18 | 19 | 杜威也指出,儿童期生活有其内在的品质和意义,不可把它当作人生中一个未成熟阶段,只想让它快快地过去。 20 | 21 | ##第三条:教育的目的是让学生摆脱现实的奴役,而非适应现实。## 22 | 23 | 这是西塞罗的名言。今天的情形恰好相反,教育正在全力做一件事,就是以适应现实为目标塑造学生。 24 | 25 | 人在社会上生活,当然有适应现实的必要,但这不该是教育的主要目的。 26 | 27 | 蒙田说:学习不是为了适应外界,而是为了丰富自己。孔子也主张,学习是“为己”而非“为人”的事情。古往今来的哲人都强调,学习是为了发展个人内在的精神能力,从而在外部现实面前获得自由。当然,这只是一种内在自由,但是,正是凭借这种内在自由,这种独立人格和独立思考的能力,那些优秀的灵魂和头脑对于改变人类社会的现实发生了伟大的作用。 28 | 29 | ##第四条:最重要的教育原则是不要爱惜时间,要浪费时间。## 30 | 31 | 这句话出自卢梭之口,由我们今天的许多耳朵听来,简直是谬论。然而,卢梭自有他的道理。 32 | 33 | 如果说教育即生长,那么,教育的使命就应该是为生长提供最好的环境。什么是最好的环境?第一是自由的时间,第二是好的老师。在希腊文中,学校一词的意思就是闲暇。在希腊人看来,学生必须有充裕的时间体验和沉思,才能自由地发展其心智能力。 34 | 35 | 到了大学阶段,自由时间就更重要了。依我之见,可以没有好老师,但不可没有自由时间。说到底,一切教育都是自我教育,一切学习都是自学。就精神能力的生长而言,更是如此。 36 | 37 | 我赞成约翰·亨利的看法:对于受过基础教育的聪明学生来说,大学里不妨既无老师也不考试,任他们在图书馆里自由地涉猎。我要和萧伯纳一起叹息:全世界的书架上摆满了精神的美味佳肴,可是学生们却被迫去啃那些毫无营养的乏味的教科书。 38 | 39 | ##第五条:忘记了课堂上所学的一切,剩下的才是教育。## 40 | 41 | 我最早在爱因斯坦的文章中看到这句话,是他未指名引用的一句俏皮话。随后我发现,它很可能脱胎于怀特海的一段论述,大意是:抛开了教科书和听课笔记,忘记了为考试背的细节,剩下的东西才有价值。 42 | 43 | 那个应该剩下的配称为教育的东西,用怀特海的话说,就是完全渗透入你的身心的原理,一种智力活动的习惯,一种充满学问和想象力的生活方式,用爱因斯坦的话说,就是独立思考和判断的总体能力。按照我的理解,通俗地说,一个人从此成了不可救药的思想者、学者,不管今后从事什么职业,再也改不掉学习、思考、研究的习惯和爱好,方可承认他是受过了大学教育。 44 | 45 | ##第六条:大学应是大师云集之地,让青年在大师的熏陶下生长## 46 | 47 | ##第七条:教师应该把学生看作目的而不是手段## 48 | 49 | 我赞同爱因斯坦的建议:给教师使用强制措施的权力应该尽可能少,使学生对其尊敬的唯一来源是他的人性和理智品质。与此相应,便是扩大学生尤其研究生的权利,在教学大纲许可的范围内,可以自由选择老师和课程,可以改换门庭,另就高明。考核教师也应主要看其是否得到学生的爱戴,而非是得到行政部门的青睐。 50 | 51 | 像现在这样,教师有本事活动到大笔科研经费,就有多招学生的权力,就有让学生替自己打工的权力,否则就受气,甚至被剥夺带学生的权利,在这种体制下,焉有学生不沦为手段之理。 52 | -------------------------------------------------------------------------------- /Education/教育短语.md: -------------------------------------------------------------------------------- 1 | ##【让孩子从小自己作决定】 2 | 1.德国父母自小就注重让小孩作决定,可以选择一边读书一般学习音乐,自己人生是自己决定的,父母只给指导意见。 3 | 2.父母在有意无意之中灌输责任感的重要性,在要求小孩自己作决定的同时也要求小孩对自己的行为负责。而父母也会为他们的行为负责。 4 | 5 | ##[名家名言] 6 | 不能总是牵着他的手走,而还是要让他独立行走,使他对自己负责,形成自己的生活态度。 ——(前苏联)苏霍姆林斯基 7 | 8 | ##【培育孩子开朗乐观性格的八要点】 9 | 美国儿童教育专家塔尼可博士建议: 10 | 1、勿对孩子控制过严; 11 | 2、鼓励孩子多交朋友; 12 | 3、教会孩子与人融洽相处; 13 | 4、物质生活避免奢华; 14 | 5、让孩子爱好广泛; 15 | 6、引导孩子学会摆脱困境; 16 | 7、拥有适度的自信; 17 | 8、创建快乐的家庭气氛。 18 | 19 | ##【把玩耍的时间还给孩子】 20 | 英语中有句民谚说“只工作不玩耍,聪明的杰克也变傻”.对于正在成长中的孩子来说,这句话同样适用.玩对孩子成长大有益处,因此,父母要帮孩子安排好游戏时间—让孩子有计划的玩,让孩子学会在完成日常作息学习以外时间安排自己的兴趣。 21 | 22 | ##【 4类不合格爸爸】 23 | 1.纵容型爸爸;对宝宝有求必应,无论对与错。 24 | 2.过度保护型爸爸;宝宝有能力自己做到的事情,总要抢先一步为他做了。 25 | 3.放任型爸爸;任由宝宝为所欲为。 26 | 4.支配型爸爸;总是处在领导的位置,要宝宝绝对服从。 27 | 28 | ##【怎样引导孩子对自己正确定位】 29 | 有两位家长,第一位经常这样说:孩子,好好读书,考个好大学,才能找份好工作;另一位则是:孩子,好好读书,将来还有很多人等着你养活。两位家长的话差不多,但身份定位正好相反,久而久之,孩子潜意识便接受了这种思想,他们信念、价值观也随之发生改变。 30 | 31 | ##【千万不要让你的孩子养成的五大学习习惯】 32 | 1.学习无计划。 2.学习不定时。 3.学习不定量。 4.学习马马虎虎。 5.学习时一心二用。 33 | 34 | ##【7个技巧培养懂得感恩的孩子】 35 | 1、"谢谢你"挂在嘴边; 36 | 2、以身作则,常对孩子的努力表示感谢; 37 | 3 、睡觉前一起分享当天要感谢的事; 38 | 4、养成奉献和志愿服务的习惯; 39 | 5、列一个给家人的感谢礼物清单 。 40 | 6、常感谢那些为你们提供服务的人; 41 | 7、要有耐心,逐步把感恩作为一种生活态度灌输给孩子。 42 | 43 | ##【如何与孩子愉快聊天】 44 | 1.注视着孩子的眼睛,认真倾听。 45 | 2.多用“我们”,少用“你”。 46 | 3.以赞赏的态度鼓励孩子。 47 | 4.对于自己不懂的问题要虚心。 48 | 只要把孩子当成知心朋友,创造一个自由、宽松的语言交往环境,聊天也可以收到事半功倍的效果哦! 49 | 50 | ##【最好的教育是“没”教育】 51 | 最好的教育是“没”教育。把教育的观点渗透到生活当中,而不是让大道理一吐为快,你觉得有些话说出来,心里轻松和舒服了,而孩子却烦了。所以永远不要和孩子直观的去讲道理,遭孩子的腻味。从小养成良好的生活习惯和自主学习的习惯,会受益终生。 52 | 53 | ##【肯定是成长中的必要环节】 54 | 尤其是父母的肯定。当孩子在成长中缺乏父母的肯定,孩子就会无法建立信心,伴随而来的是自卑和自闭。肯定不是表扬,它有时候可以是以表扬的方式出现,肯定是一份确认,使孩子找到那份确认的感觉。 55 | 56 | ##【别逼孩子撒谎】 57 | 很多父母在训斥孩子撒谎的时候,都有过这样的愤怒:那么明显的证据摆在那里,可孩子还是不肯承认。教育心理学表明,只要你认定孩子撒谎,就会发现越来越多的证据,而且他最后真的会成为一个撒谎者。“真正的谎言”产生的原因很多,其中最重要的是压力。 58 | 59 | ##【家庭教育,必须走出单纯说教的误区】 60 | 尤其要重视身教和境教:说得精要,不啰嗦。重要的内容可以重复,不能啰嗦。一般说,孩子心情不佳时,不利于认识自己的问题,大人的批评容易引起孩子的反感。不能盲目地有机会就说,应该选择合适的时机。孩子最烦家长天天说,不分场合见面就说。 61 | 62 | ##【11行为扼杀孩子创造力】 63 | 1 .习惯帮孩子选择; 64 | 2 .错用物质奖赏; 65 | 3 .让孩子参加无谓的等级评定; 66 | 4 .敷衍孩子的提问; 67 | 5. 监视多于关注; 68 | 6. 制止孩子的探索行为; 69 | 7. 给孩子不恰当的玩具; 70 | 8 .打断孩子玩耍; 71 | 9 .不允许孩子犯错误和失败; 72 | 10 .过度赞美; 73 | 11. 和别人比较。 74 | -------------------------------------------------------------------------------- /Education/爱国主义教育.md: -------------------------------------------------------------------------------- 1 | 作者:肉唐僧 2 | 3 | 每当一个国家的政治、经济出现重大危机的时候,爱国主义的破旗就又散发出臭味来 —— 列宁 4 | 5 | 国家是为人而建立,而人不是为国家而生存 —— 爱因斯坦 6 | 7 | 除非你把爱国主义从人类中驱逐出去,否则你将永远不会拥有一个宁静的世界。爱国主义是一种有害的、精神错乱的白痴形式。爱国主义就是让你确信这个国家比所有其他的国家都要出色,只因为你生在这里 —— 乔治.肖伯纳 8 | 9 | 当爱国主义涉入认知领域时,是一个应该被扔出门外的混小子 —— 阿瑟.舒本华 10 | 11 | 爱国主义是流氓的最后庇护所 —— 卢梭 12 | 13 | 任何时候当你听到一个人说他爱他的国家,这是一个信号,表明他在期待为此获得报偿 —— 门肯    14 | 15 | 爱国主义:一堆随时可以被任何野心家所点燃,去照亮他的名字的易燃垃圾 —— 安卜罗斯·皮尔斯 16 | 17 | 对他们来说,爱国不过是谄媚统治者的一种方式;只要他们认为统治者再也听不到,他们所说的一切马上就惊人地诚恳,因为那些听他们说话的人是可靠的  ——卡斯汀侯爵 18 | 19 | 那些没有自尊的人仍然可以是爱国的,他们可以为少数牺牲多数。他们热爱他们坟墓的泥土,但他们对那种可以使他们的肉体生机勃勃的精神却毫无同情心。爱国主义是他们脑袋里的蛆——亨利·大卫·梭罗 20 | 21 | 爱国主义是无赖最后的避难所。——塞缪尔·约翰逊 22 | 23 | 爱国主义就是积极地为了微不足道的原因杀人并被杀——勃特兰·罗素 24 | 25 | 爱国主义是超越于原则之上的对于不动产的一种专横的崇拜——-乔治·简·纳森 26 | 27 | 民族主义是我们的乱伦模式,是我们的偶像崇拜,是我们的疯狂。“爱国主义”是它的迷信崇拜。不必说,我所谓的“爱国主义”态度将自己的国家置于人道之上,置于正义与真理的原则之上——埃里克·弗罗姆 28 | 29 | 在专制横行的地方,国家形同虚设——西塞罗 30 | -------------------------------------------------------------------------------- /Education/纽约的中学教育.md: -------------------------------------------------------------------------------- 1 | #林广:我为什么感慨纽约的中学教育 2 | 3 | 2006年8月20日,经过13个小时的飞行,我们一家三口从中国最大的城市上海,来到美国最大的城市纽约,开始我在纽约大学一年的访学生涯。办好访学和租房手续之后,孩子入学成了我们家要办的头等大事。孩子在上海就读市西初级中学初三。现在该如何办理插班入学手续?孩子能跟得上班吗?同学容易相处吗?唉,我们真是一头雾水。 4 | 5 | 我们住在布朗克斯区东194大街,根据就近入学原则,我们打听到附近一所初级中学,恰巧邻居皮特就是那所中学的老师,是一位热心肠。他详细介绍学校的开学时间、学制安排等情况,并说我们去学校时候可以找他。可是,从他的介绍中我们才知道,纽约的初级中学和上海的初级中学的学制有所不同,初中最高是8年级。我的孩子就读初三,在上海属于初级中学,但初三在纽约是九年级,而九年级属于高级中学。皮特老师告诉我们,这里对口学校就是艾伯特·H.雷曼高级中学。按照网上提供的日期,我们带着孩子到区教育局报名,交了我的访学证明、租房证明及孩子防疫证明等,接着排队、叫号、面谈,时间不长就办好了手续。9月5日,也就是美国劳动节的第二天,孩子就进入雷曼高级中学了。 6 | 7 | 纽约中学有私立和公立之分,私立中学学费不菲,一年平均2.7万美元,高者达3万美元,与名牌大学的学费不相上下。雷曼高级中学是一所公立中学,实施名符其实的义务教育,无论学生来自美国本土还是国外,都无需交学杂费,更没有以赞助、借读等为名的变相收费。此外,学校还会提供早餐和午餐,但餐费视家庭经济条件而定,年收入在2万美元以下的家庭学生可免费就餐,高于此收入的可享受半价,超过3.3万元的家庭学生就得自掏腰包了。我家经济来源就是富布赖特项目资助,属于中间那一档的,所以孩子可以半价也就是25美分享受早餐和中餐。花不到2元人民币就可吃上早餐和中餐,这简直就是一种福利。 8 | 9 | 令人高兴的事还有,学校还为学生提供校车服务,每天校车按照规定的时间接送学生。我们住的地方有地铁6号线,所以学校给孩子一张学生交通卡,每天可乘车三次,一次是上学乘车用的,一次是放学乘车用的。还多余一次是何用处呢?原来这第三次是备用的,是为学生急用而备的,如粗心的学生把书包落在家里,就可以乘车回去取,但我的孩子一直没用上第三次。 10 | 11 | 雷曼高级中学各班都有一名指导老师,相当于国内的班主任,负责学生的课程安排、学生在学校的各方面生活,学生的学业成绩、出勤情况等等。指导老师会帮每一个学生量身定制课程表,课程有必修和选修,包括数学、英语、世界历史、生物、绘画、计算机、体育等。我的孩子是临时插班生,初来乍到,我们担心孩子跟不上,但从他回家时轻松的神情可以感觉到,一切很顺利。他告诉我们,这里学习非常轻松,特别是数学,老师还在教正负数大小的问题,当一位女学生回答老师说正10大于负10时,老师立即毫不吝啬地给了她一个“Good”。在我的孩子看来,这简直太简单了,上海小学三年级学生都能回答的问题。“要是这样的问题都能‘good’,那么我天天都能‘good’!”果不其然,入学半个月后,任课老师就推荐我的孩子转到十年级数学班去学习了,期中考试后又转到十一年级去了。 12 | 13 | 学生成绩好可以跳级!这对我们来说是一件新鲜事!原来,纽约高中的数学和英文等课程,是针对学生水平而非年级设定的,就是真正意义上的因材施教。无论是数学还是英语,一个学生只要成绩足够优秀并学有余力,就可以申请调到更高级的课程班学习,如果还有余力,还可以调到更高一级的课程班听课。这种跳级制度能激励和促进学生努力拼搏,也为学生提供自己的发展路线。有的中学还开设大学的预修课程,就是为了在教学上与大学接轨,使优秀的学生更快融入大学。 14 | 15 | 这种“跳级制”带来的副作用就是“跑班”现象。同年级的学生因为数学和英语水平不同,而要到另外一个班级上课,而不同的班级位于不同的教学楼。学生要在短暂的5分钟课间里,从一个教学楼换到另一幢教学楼上课。这样一来,每到课间时你就会看到有学生脚底像抹了油一样在楼道里奔跑,否则就会迟到,而4次迟到算1次旷课,一学期4次旷课成绩就不及格。因此,许多学生来不及上厕所。不过,这也没关系,任课老师都备有一个“通行证”,学生课上内急时,只要向任课老师打一声招呼就能拿到“通行证”。但是,上课的前10分钟和最后10分钟,厕所的门都是锁着的,目的是防止学生逃课。纽约每天有15%的学生逃课,而厕所很可能是逃课学生的藏身之地,更有甚者会躲在厕所里从事吸毒、涂鸦等违法的事。 16 | 17 | 学校的作业很多。历史,英语等科目都要求学生每天完成大量的阅读任务。我的孩子每天都要阅读历史老师发来的《纽约时报》的有关内容,然后写成评论或读后感。另外,纽约中学教育最具有特色的作业就是课题。在纽约地铁里,我经常看到学生拿着自己手绘的五颜六色的课题作业赶往学校去,因为作业做在厚板纸上,所以卷起来就像“长枪短炮”似的。课题很具有挑战性,老师给出一个大的方向,所有的细节和过程必须学生自己琢磨。一次,老师要求围绕“经济全球化”做一个课题,具体题目由自己决定。我孩子写了一篇有关耐克公司的课题“血汗工厂在中国”。这个项目所包含的工作量非常大,孩子从网络、老师或者图书馆等不同途径查阅很多的资料,经过一周多时间才完成。在这样的研究过程中,孩子的潜力才能被挖掘。老师布置的作业五花八门,别出心裁。孩子有时带着包好的饺子去学校参加“美食节”;有时外出到附近公园里寻找老师事先埋藏的钱物;有时戴着眼镜或胡子扮成哲学家、历史学家,围绕某一主题和同学进行辩论,以培养口才和思辨能力。 18 | 19 | 朋友般的师生关系同样给我留下很深的印象。有一次,我去参加家长会,惊讶地发现孩子直呼其历史老师的名字,还和他来了一个熊抱,好像是老朋友见面的样子。这种平等、融洽的师生关系,着实令从教30年的我感慨不已。更使我感慨的是,老师会尽力发现学生的闪光点,哪怕是一丁点的进步,老师就会对学生进行表扬或鼓励,甚至带着夸张的口吻对学生说:“你真棒!” 20 | 21 | 有人认为,美国不重视基础教育,学生不在乎分数,其实不然。纽约地铁上写着“分数高,前途好”的宣传广告。纽约的中学教育表明,美国很重视基础教育,但不是一味地追求考试成绩高低,而是培养学生各方面的技能和社会实践能力,包括市民素质等。■ 22 | 23 | 24 | (作者系华东师范大学历史系教授) 25 | 26 | -------------------------------------------------------------------------------- /Education/高等教育的困境.md: -------------------------------------------------------------------------------- 1 | 文/Seth Godin 译/郑枫等 2 | 3 | 大规模的教育? 4 | 5 | 大规模生产需要大规模的教育,这句话看上去理所当然,但我们对于学校的目的是追求一致性这种说法却会感到吃惊。尽管职场和文明社会都要求多样性,工业化的学校系统却在摧毁多样性。 6 | 7 | 学校的批量化特征可以追溯到其创建初期,追溯到普通学校、师范学校和全民教育理念。而所有这些都是在我们改进和完善大规模生产、零件可替换性以及大规模营销手段的同一时期发明的。 8 | 9 | 让我们浏览一下背景知识:普通学校(现在叫公立学校)曾是一个全新的概念,出现于南北战争后不久。称之为“普通”是因为它面向平民百姓,不论是农民子弟、制陶匠子弟、还是店铺人家的子弟,都可以进这种学校学习。霍瑞斯·曼被认为是公立学校之父,但他办学并没有人们想象的那样艰难,因为企业家们都站在他一边。当时,新兴的工业化经济面临着两大挑战,一是缺乏守纪律的产业工人,二是缺乏热衷购物的消费者。普通学校的出现把二者都解决了。 10 | 11 | 师范学校(现在叫教师学院)是为普通学校培养和输送师资而开办的,目的是确保教育方式的一致性。如果这听上去和生产的批量化、零件可替换、产品测量和质量控制等概念有相似之处,它绝不是偶然的。 12 | 13 | 当然,世界已经变了。当今社会是由市场驱动的,这个市场懂得如何实现大规模定制生产,如何发现各种边缘和古怪的需求,如何迎合个体的不同需要,不再坚持整齐划一。 14 | 15 | 将大规模定制的理念用于学校教育很难。但是,难道我们还有其他的选择吗?如果连大规模生产和大众化市场都在土崩瓦解,我们确实无权要求这个为不同时代设计的学校系统满足今天的需要。 16 | 17 | 对学校的前途感到担忧的人们面临着几种选择,但是很显然,维持现状不是其中之一。一个选择是将学校内部划分出较小单元,使之看上去不那么工业化,每个单元可以发展出有自己特色的领袖和公民。另一个选择是,使学校认识到:规模也可以是优势,但前提是,学校必须重视而不是抗拒个性化教育。 18 | 19 | 目前的系统是在追求低成本的一致性以满足最低标准,而这样的教育正在扼杀我们的经济、我们的文化和我们自己。 20 | 21 | 高等教育即将土崩瓦解? 22 | 23 | 美国高等教育已有四百年辉煌的历史。从十六世纪哈佛大学邀请伽利略当客座教授起,到今天几百万人在电视机前观看大学运动队之间的赛事,大学所享有的时间、金钱和声誉一直在步步攀升。但恐怕所有这一切即将灰飞烟灭。因为: 24 | 25 | 1. 多数大学是在为中等水平的学生提供中等水平的教育 26 | 27 | 随便找一本大学宣传册,去掉上面的名字和地图,你能分辨出来是哪个大学的吗?虽说也有一些比较另类的大学,但多数学校都大同小异,都是大规模营销商。请停下来思考一下商业化的后果。由于注重大规模、统一性和排名,大学改变了它们的使命。 28 | 29 | 在工业化时期,这样的策略相当奏效,因为当时一个大学生给企业带来的经济效益大大超过了雇用他的成本。巨大的需求量使得大学生非常走俏,供不应求。但是…… 30 | 31 | 2. 大学学费上涨速度大大超过工资上涨速度 32 | 33 | 结果,成千上万的大学毕业生债台高筑,很可能需要几十年才能还清。这种状况人们都有所耳闻,很多人不会再上钩了……这样一来,新一代准大学生就不能再盲目地选择上“最好”的学校了。 34 | 35 | 3.“最好”的定义被滥用 36 | 37 | 为什么现在的大学要向几百万高中生发千篇一律的垃圾邮件?免学费!申请表仅一页!申请吧!这是我见过的最不专业、最赤裸裸的邮件。他们为什么这样做呢? 38 | 39 | 最大的原因:提高拒收率。一个大学拒收的学生越多,它在美国新闻(U.S. News)大学排行榜和其他排行榜上的名次就会更高。所以各个大学都急着招揽学生以求更好的排名。这个迹象表明,营销商(即大学)急于获得更大的市场份额。如果你能上一个排名靠前的学校,谁管它是不是真的提供更好的教育呢? 40 | 41 | 4. 大学学位能否带来成功很值得怀疑 42 | 43 | 大学本不该成为(有更多人酗酒的)高中,但是在很多地方,大学正是如此。据我所了解的数据,相比学费更低的大学,那些名牌大学(不论有无橄榄球队)的学位并没有转化成职场上更多的机会、更好的工作和更幸福的生活。 44 | 45 | 5. 资格认证不是答案,而是症结所在 46 | 47 | 大学的很多问题都是统一的资格认证系统造成的,这种系统一直在驱使大学走高投入、低回报的路线,一直鼓励培养教授型人才,而不鼓励培养领导者和实干家。正如我们所目睹的大众产品营销这种旧式营销观念正在解体一样,我们将目睹大众学位营销的旧式办学理念即将出现显著的裂痕。 48 | 49 | 在数字革命前,信息的获取是一个问题,所以,图书馆的规模很重要。上大学的好处之一就是可以获取信息。而在今天,这个渠道没有那么重要了。上大学的主要价值是可以接触到大师(通常是那些亲自授课并认真治学的教授),还可以参加对个人成长有益的各种课外活动。那么我想问:大众营销型大学在推销自己和抬高身价上的花费是否值得?它们究竟是在培养人才还是在追求排名?纽约大学真的需要扩招吗?为什么呢? 50 | 51 | 高等教育问题有很多解决办法。如今,获得便宜而自由的教育有着无数的途径。这类教育让你接触社会,使你有机会和做实事的人一起工作,学习怎样才能有所作为。不过,不会有人大张旗鼓地向你推销这类教育的,你也不必进入一所有两百年厚重传统、并拥有一个摔跤队的大学。利用高中毕业后的空档年旅行,做研究助理,开办公司,或者做公益项目,这些都可以为渴望发现新世界的学生们提供各种机会。 52 | 53 | 唯一没有意识到这一点的,是那些焦虑并喜欢干涉孩子的家长、大众营销型大学和传统的雇主。但是这三类人也正在觉醒,正在学习怎样面对新的形势。 54 | 55 | 节选自《盗梦工厂》 56 | -------------------------------------------------------------------------------- /Git/Git 诞生记.md: -------------------------------------------------------------------------------- 1 | Git 诞生记 2 | 3 | 你可能有过这样的经历:在 debug 的时候这里加一句,那里减一句,顺便改改参数,不一会你的程序就从一个 bug 增加到了无数个 bug 。最重要的是,你完全想不起来自己到底改了几个地方,原来的程序到底长什么样子了。经历过几次这样的痛苦,你学乖了,下次 debug 之前先把原文件备份一下——改成 program.c.bak 什么的,然后放开了胆子改。有时候修改的次数多了,就会出现 program_V1.c.bak, program_V2.c.bak …… 又有时候需要同时修改多个文件。而需要倒回到之前的版本的时候,又完全想不起来这些 V1, V2 到底改了哪些地方。坑爹呐!难道要老子手工查不成?难道老子还要给每个 version 写个描述文件? 4 | 5 | 程序员们应该都中枪了。 6 | 7 | 或者你有过这样的经历:写论文的时候这里改动一个词,那里改动一句话。改来改去发现还不如最初的版本……囧之余,你怎么办?Ctrl+Z 能救你几次?甚至,万一是第二天打开 Word 的时候后悔了,又怎么办? 8 | 9 | 学生党们应该都中枪了。 10 | 11 | 有没有办法解决问题?当然有。但是别着急,喝杯茶,我们慢慢聊。 12 | 13 | 1972年的时候,贝尔实验室的程序员们快被这个问题烦死了。可能纯粹出于提升工作舒适度,他们写出了史上第一个版本控制系统(Version Control System A.K.A. VCS),取了个直白的名字叫 Source Code Control System,简称 SCCS。这个软件用 C 语言改写后,被收录在 AT&T 的系统中。由于太懒了,这群程序员们只写了 Unix 版本。 14 | 15 | SCCS 的原理很简单,储存要监控的源文件,**当文件被修改时,它自动地为每次修改创建一个快照(Snapshot)**。你工作的时候,想切换到哪个版本,它就先取出源文件,再依次应用修改直到你要的那个版本为止。 16 | 17 | SCCS 好用是好用,但有几个问题。首先,当你对文件作出多次、大量修改后,它的速度明显变慢了——对啊,它要从原文件开始依次应用修改嘛。然后,它内置在 AT&T 生产的系统中,不能跨平台啊,广大 Windows 用户很不开心啊。 18 | 19 | 这其中 Water.F.Tichy 估计是最不开心的一个。 20 | 21 | Water 是一个教计算机的大学教授,学校里的电脑上有 AT&T 的系统,可是到家就没辙了,老爷子很不爽啊,这叫人家在家怎么刻苦呢?1982年,他一气之下,写出了改变历史的第二个被广泛应用的 VCS,取名 Revision Control System,也就是大家熟知的 RCS(谁熟知了?谁?)。 22 | 23 | 从名字上就能看出,老爷子雄心很大,不想让它仅仅成为程序员们的玩具。**RCS 开源,跨平台,一经推出即在全球……的程序员,和大学中流行。**它相比于 SCCS 更快。为什么?因为老爷子机智地换了一个想法,储存最近的文件作为源文件,对历史修改反向,并且创建快照(Snapshot)。对呀,正常人工作肯定是从最新的文件开始读取,出现问题后再回滚到历史文件,谁没事就从第一版开始改起啊, SCCS 那种做法也太二了吧? 24 | 25 | 于是 RCS 开始统治江湖。渐渐地,程序员们又不高兴了,说你这个 RCS 也不科学呀,你每次都只能监控单个文件,老爷子你写个论文什么的倒是还行,可是我们是要写整个项目的呀,我项目中每个文件是有关联的呀,你这个单一文件监控不好使呀。被 RCS 折磨了四年之后,程序员们终于忍不了了,不知是哪路豪杰在开源社区吼了一声,一呼百应,不一会儿(哪有那么快!),新的 VCS 诞生了——Concurrent Versions System(A.K.A. CVS)。 26 | 27 | CVS 不能不说是革命性的成果,它不但支持了对整个项目进行监控,并且首次提出了**仓库(Repository)**的概念,更加不能忍的是,它明确地分成了**服务端和客户端**,把代码仓库放在服务器上,由客户端向服务端提交修改。这还是 1986 年啊同学们,我真想回滚到那个时候激动地告诉他们:小伙子们(为什么是小伙子们……)你们发明的这种概念叫**「云」**你们造吗?「云」在二十多年以后有多火你们造吗? 28 | 29 | CVS 很好地支持了多用户多文件并行操作,按说这样一来所有人应该都满意了吧?当然不是,不然今天讲的就是 CVS 而不是 Git 了。它的问题是监控的对象是文件,而不是目录。乍听起来,觉得好像没什么呀。其实不然,仔细想想,如果在项目目录下再创建目录,这个子目录里面的文件并不会被监控;同理,添加一个新文件,这个新文件也不会被监控。 30 | 31 | 程序员们又不开心了。 32 | 33 | 终于到了21世纪,一个跨时代的 VCS 出现了—— Subversion(A.K.A. SVN)。它由 CollabNet 公司开发,并且在后来被纳入了 Apache 软件项目孵化器(Apache Incubator),成为其中 top-level 的产品。它不但**支持监控整个目录,而且首次支持了监控非文本文件。**这两个特性使它在 2001 年在全球范围内取代了 CVS,并且一直流行到今天。没错,现在许多软件公司用的版本控制系统还是 SVN。 34 | 35 | 咦,说好的 Git 呢? 36 | 37 | 这就不得不提到同时代的另一款 CVS —— BitKeeper。与 SVN 不同,它是一款商业软件,但提供了免费的社区版本(Community Version)。它最大的优点在于,分布式管理。在 SVN 中,服务端相当于代码中心,所有的代码都提交到这里。它两点不方便的地方在于,客户端要不断地和服务端进行交互以保证自己的代码是最新的,如果自己从一个比较旧的版本开始修改,就会出现问题。而且与服务端的交互要求网络连接,**不适合离线工作。**分布式管理的概念是每个仓库都是主仓库,当两个仓库版本不一致时,可以方便地查看冲突之处并加以修改。 38 | 39 | 使得 BitKeeper 如此出名的原因还在于,大名鼎鼎的 Linux Kernel 就存放在其免费的社区版本上。 40 | 41 | 2005年4月,BitMover(拥有 BitKeeper 的那家公司)突然宣布,停止 BitKeeper 的社区版本,你们这群不想交钱就用我们软件人都玩蛋去!好嘛,改变了人类历史的 Linux 就这样无家可归了。 42 | 43 | **Linux 之父 Linus 看着自己的儿子被别人赶出了家门,愤怒值立刻飙升。他环绕四周看了看,觉得 SVN 什么的简直是屎,决不能允许亲儿子流落至此。两斤啤酒下肚,他冲到电脑前三天三夜不眠不休。** 44 | 45 | ##Bang!Git 诞生了。 46 | 47 | 什么?你说 BitKeeper ?玩蛋去吧。 48 | 49 | 来源:http://jianshu.io/p/ee89f9385ca4# 50 | -------------------------------------------------------------------------------- /Git/GitHub如何运作:时间并不决定一切.md: -------------------------------------------------------------------------------- 1 | GitHub如何运作:时间并不决定一切 2 | 3 | **导读:**Github公司的职员Zach Holman写了一篇关于“GitHub如何运作管理”的文章,文章分三部分,这是第一部分:**时间并不决定一切。** 4 | 5 | 弗雷德里克·温斯洛·泰罗在1911年写了一篇有关管理和效率的惊世之作:《科学管理原理》。他是用科学方法阐述工业生产中最优效率的第一人。时间就是金钱。效率越高越好,时间越多越好。 6 | 7 | #“时间决定一切”不适用于我们 8 | 9 | 在很多行业中,时间是评判效率的准则,但不是我们的标准。在创业公司工作是完全不同的。你不可能花太多时间来解决一个问题。编程是一件需要创造力的事情,你需要在最佳状态才能编出高质量的代码。 10 | 11 | 想想上次你消沉或愤怒时候,你的效率如何?再想想上一次你真正高效的时候吧,代码好像从你的指尖飞出来的,你编码不仅速度快,代码的质量也高。在状态好的时候编码远远超过机械式的敲键盘。 12 | 13 | 我们希望雇员们更多的处于最佳状态,但规定上班时间会影响他们进入这种状态。如果强迫我早上九点钟上班,我将不会达到最佳状态。但GitHub一半的同事在早上工作都是最高效的。 14 | 15 | 如果创造一个更随意的工作时间,程序员会更积极工作,最终会促进程序员工作更久,更加高效。他们甚至会周末工作,晚上工作,因为他们感觉在做的事并不是别人要他们做的工作。 16 | 17 | #在GitHub的一天 18 | 19 | 每个在GitHub工作的人的时间安排都是不一样的。我没有平均计算过每一天的时间,但大致是这样的: 20 | 21 | >早上10点起床,查看Campfire日志,处理过夜支持请求
22 | >坐巴士上班,在十二点或一点钟左右吃饭
23 | >从下午一点开始工作,直到下午六点或晚九点下班
24 | >回家工作或休息到凌晨两点钟。
25 | 26 | 我们有同事早上七点来到办公室(简直是疯子),也有人下午三点来。有一些同事在家里工作更有效率,如果你不喜欢来办公室,你不需要每天都来(尽管大部分同事每天都来)。 27 | 28 | 为什么我们的每一天都如此“松散”?这是因为:1. 我们可以随时随地用聊天室来交流,2. 我们想创造一个让所有人都高效的环境。没有一个工作时间是适合每个人的,所以我们没有强制工作时间。 29 | 30 | #强制工作时间 31 | 32 | 我们现在有35个雇员,队伍在不断壮大。上班时间灵活随意,对我们的团队来说运作的非常好。但是经理们喜欢规定时间是有原因的:这样做可以给他们一个错觉,工作时间的长短可以转化为评判表现的标准。 33 | 34 | 经理们如果不看雇员们的工作时间,就得看他们其他方面的表现。他们代码的质量如何?他们修复了错误吗?他们在专心工作吗?更大的灵活性是否让他们更消极? 35 | 36 | 确实很难将以上这些评判标准进行量化。但是程序员的价值远比一天工作十小时要高。如果你认为时间决定一切的话,那么程序员在乎的将只是时间,而不是代码的质量。 37 | 38 | var:[http://www.kuqin.com/managetool/20111119/315087.html](http://www.kuqin.com/managetool/20111119/315087.html) 39 | -------------------------------------------------------------------------------- /Git/github公钥和推送.md: -------------------------------------------------------------------------------- 1 | #github公钥和推送 2 | 3 | ##在本地生成公钥 4 | 5 | 方法是: 6 | 7 | ssh-keygen -t rsa -C "your email of github" 8 | 9 | 会询问存储地址,一般存在主目录下。还会询问密码,可以为空。如果不为空,则在推送的时候也要输入密码。 10 | 11 | ##安装xclip 12 | 13 | 用于在shell上将公钥内容复制到剪贴板(clipboard)上 14 | 15 | sudo apt-get install xclip 16 | 17 | 安装之后,运行下面的命令,完成复制 18 | 19 | xclip -sel clip < [path of id_rsa.pub]/id_rsa.pub #id_rsa.pub是公钥存储文件 20 | 21 | ##在github上添加公钥 22 | 23 | 然后登录到github,在setting中找到ssh keys,点击add ssh key,将复制到剪贴板上的公钥复制过来。 24 | 25 | 在本地shell中通过下面的命令检验是否联通 26 | 27 | ssh -T git@github.com 28 | 29 | ##推送文件 30 | 31 | 进入到本地的目录,参考github上的帮助: 32 | 33 | Create a new repository on the command line 34 | 35 | touch README.md 36 | 37 | git init 38 | 39 | git add README.md 40 | 41 | git commit -m "first commit" 42 | 43 | git remote add origin git@github.com:qiwsir/Yeashape.git #这是我的github仓库 44 | 45 | git push -u origin master 46 | 47 | Push an existing repository from the command line 48 | 49 | git remote add origin git@github.com:qiwsir/Yeashape.git 50 | 51 | git push -u origin master 52 | 53 | 上述操作,还可以合并为: 54 | 55 | git push git@github.com:qiwsir/Yeashape.git master 56 | 57 | -------------------------------------------------------------------------------- /Git/git服务器搭建(局域网).md: -------------------------------------------------------------------------------- 1 | #git服务器搭建(局域网) 2 | 3 | ##第一步: 4 | 5 | 在服务器上创建一个用户(最好的做法是一个项目组的一个项目,创建一个用户,这里以git项目组为例) 6 | 7 | ![](../Pictures/git001.jpeg) 8 | 9 | ##第二步: 10 | 11 | 切换用户,创建仓库 12 | 13 | ![](../Pictures/git002.jpeg) 14 | 15 | ![](../Pictures/git003.jpeg) 16 | 17 | ##第三步: 18 | 19 | 把项目组里所有人的公钥都收集(这里只是其中一个) 20 | 21 | ![](../Pictures/git004.jpeg) 22 | 23 | ##第四步: 24 | 25 | 把所有人的公钥都写入到.ssh/authorized_keys里。一行一个 26 | 27 | ![](../Pictures/git005.jpeg) 28 | 29 | ##第五步: 30 | 31 | 把用户设置为不可登录的shell(保证安全) 32 | 33 | ![](../Pictures/git006.jpeg) 34 | 35 | ![](../Pictures/git007.jpeg) 36 | 37 | 改为 38 | 39 | ![](../Pictures/git008.jpeg) 40 | 41 | ##第六步: 42 | 43 | 项目成员在自己的电脑里尝试获取仓库 44 | 45 | ![](../Pictures/git009.jpeg) 46 | 47 | **到这里结束,** 48 | 49 | 服务器用的是CentOS6.5 50 | 51 | 成员用的是windows系统,装cywin 52 | 53 | -------------------------------------------------------------------------------- /Git/windows下使用github或bitbucket.md: -------------------------------------------------------------------------------- 1 | #windows下使用github/bitbucket 2 | 3 | 在windows操作系统中,如果使用github或者bitbucket等,一般需要安装能够模拟linux的环境,如cygwin等。 4 | 5 | 这里推荐两个工具,是直接安装即可使用,免去了上述过程。 6 | 7 | [http://www.sourcetreeapp.com/](http://www.sourcetreeapp.com/) 8 | 9 | [http://msysgit.github.io/](http://msysgit.github.io/) 10 | 11 | -------------------------------------------------------------------------------- /Git/七款出色的GitHub功能集成工具.md: -------------------------------------------------------------------------------- 1 | #七款出色的GitHub功能集成工具 2 | 3 | 人气代码共享网站GitHub已经成功吸引到全球无数用户的目光,其代码库规模也保持着傲人的增速——当然,随之而来的则是滚滚不绝的支持与注资。除此之外,也有越来越多的第三方软件与GitHub相对接、旨在为用户提供从项目管理到持续集成再到PaaS云服务等多种功能拓展。 4 | 5 | GitHub最近在网站的Integrations专栏中公布了合作关系的具体细节,并表示将通过GitHub开发者计划吸引更多开发人员为其贡献集成方案。在今天的文章中,我们将介绍七款广受好评的工具集成,了解它们如何帮助GitHub用户在自己的开发流程中实现价值提升。 6 | 7 | ##Asana 8 | 9 | Asana是一款项目管理工具,旨在以无需借助电子邮件的前提下帮助用户实现团队合作。目前Asana提供Web应用版本以及面向iOS与Android设备的移动应用版本。 10 | 11 | Chartbeat公司工程技术副总裁Nathan Potter表示,Asana已经在该公司内部被广泛用于任务管理工作。作为一家实时Web分析企业,Chartbeat正是通过GitHub进行代码库管理。“我曾经在2012为参与到Asana-GitHub集成的编写工作当中,”Potter回忆道。在GitHub开源插件系统的支持下,这款集成方案正式上线启用。当代码提交结果在GitHub上付诸运行时,Asana会为其创建一个任务ID、同时自动配备一条指向提交内容的链接。 12 | 13 | ##CircleCI 14 | 15 | CircleCI是一款面向Web开发人员的持续集成与部署工具。Intercom公司CTO Ciaran Lee发现,GitHub与CircleCI这一组合能够帮助用户显著节约时间。作为一家专门为网络企业提供客户交流工具的厂商,Intercom公司将其代码保存在GitHub当中并通过CircleCI进行代码运行测试。 16 | 17 | “它每一天都能为我们节约数个小时的工作周期,”Lee表示。他同时补充称,CircleCI与GitHub的协作几乎完全以自动化方式进行。Lee在实际操作中感受到的惟一缺憾在于,同时在GitHub上使用CircleCI与Code Climate(一款代码质量分析工具)时会出现冲突。Intercom不得不在二者中选择其一,但Lee相信GitHub正在着手修复这一问题。 18 | 19 | ##CloudBees 20 | 21 | CloudBees是一套Java PaaS解决方案,它利用Jenkins持续集成机制帮助客户更为快捷地交付更多软件成果。作为一家为商业客户提供峰值负载与能源传输信息的企业,Viridity Energy公司利用CLoudBees进行质量保障测试、构建生产环境并将其作为二进制代码存储库,Viridity公司工程技术副总裁Duncan DeVore指出。在GitHub与CloudBees的集成协作下,该公司顺利完成了模块创建、分布式应用程序开发以及源代码存储外加问题追踪等工作。Viridity利用云模式取代了原有的内部系统。 22 | 23 | “我们选择云模式的原因在于,我们希望能将自己的主要精力集中在创建业务软件而非打理部署事务与解决故障难题身上,”DeVore解释道。 24 | 25 | ##Code Climate 26 | 27 | Code Climate为Ruby on Rails以及JavaScript项目提供静态分析功能。作为一项托管服务,它所访问的代码被保存在一台GitHub服务器上,并通过互联网进行数据传输。众包网站Kickstarter就使用Code Climate与GitHub集成方案进行漏洞排查工作。 28 | 29 | “当我们将代码提交至GitHub时,Web触发机制会自动通知Code Climate并由其对变更内容进行分析,”Kickstarter网站运营工程师Aaron Suggs表示。“Code Climate的分析结果会以链接形式被纳入我们的提取请求当中。Code Climate还能通过电子邮件和我们的聊天室通知开发人员严重事态的最新进展情况。”Kickstarter网站同时利用Code Climate的最近功能将评论反馈发送至GitHub提取请求当中。 30 | 31 | ##Pivotal Tracker 32 | 33 | Pivotal Tracker是一款由Pivotal实验室开发的敏捷项目管理工具。医学杂志《Cureus》就在利用Pivotal Tracker与其GitHub代码库相结合以进行任务管理工作。 34 | 35 | “在代码库中的每一项提交内容中,除了固有的Tracker故事ID与状态之外,我们还额外添加了对应提交者的身份验证信息,”《Cureus》杂志工程技术副总裁Chris Barretto指出。“当提交内容被推送至GitHub上的主分支中时,背景故事将被更新至Tracker并作为最新状态,同时故事评论也会被嵌入到GitHub提交结果当中。”尽管对于Pivotal Tracker与GitHub集成方案的实际效果表示满意,《Cureus》方面仍然提出了几项改进愿望,其中包括希望在Pivotal Tracker中为每个项目设置通知机制。 36 | 37 | ##Travis CI 38 | 39 | 作为同时提供托管与防火墙后版本的解决方案,Travis CI是一款用于持续集成、部署与测试的工具。在线零售企业ModCloth公司一年前为了降低管理成本而利用Travis CI替代了原有Jenkins服务器,并在此后一直使用GitHub代码库。GitHub与Travis CI通过GitHub API实现对接,ModCloth公司高级软件工程师Dan Buch表示。 40 | 41 | 尽管对GitHub的表现感到满意,ModCloth方面仍然为该平台提出了一系列改进意见,Buch指出。“他们的功能交付速度无法满足我们的业务发展需求。” 42 | 43 | ##TenXer 44 | 45 | TenXer生产力分析工具旨在帮助工程师了解团队的服务使用情况(包括GitHub在内),从而掌握对方的工作习惯。TenXer可通过标准GitHub API或者利用GitHub OAuth登陆TenXer的方式实现双方集成,TenXer市场推广官员JP Patil指出。 46 | 47 | “对于GitHub Enterprise用户来说,客户需要在内部防火墙之后安装TenXer Agent。TenXer Agent利用同一API与GitHub Enterprise进行通信,但能够通过安全端口根据需求将数据推送至TenXer服务器当中,”Patil指出。当GitHub用户为TenXer提供通过该API访问数据的必要权限时,TenXer能够追踪一系列指标与数据点、从而完成分析工作。 48 | 49 | [英文网址](http://www.infoworld.com/slideshow/147333/programmer-picks-7-great-github-integrations-239832#slide1) 50 | -------------------------------------------------------------------------------- /Git/开发者日常使用的Git命令.md: -------------------------------------------------------------------------------- 1 | #开发者日常使用的 Git 命令 2 | 3 | 这些命令分四种类型: 4 | 5 | ①不需要和其他开发者协作的独立开发者,会经常用到 git init、git show branch、git commit 等命令; 6 | 7 | ②需要和其他人协作的开发者,会常用到 git clone、git push、git pull、git format patch 。 8 | 9 | ③在项目中负责接收其他开发者发来更新的核心开发者,会常用到 git am、git pull、git format patch、git revert、git push; 10 | 11 | ④ 代码仓库管理员常用 git daemon、git shell…… 12 | 13 | 对于任何想做提交的人来说,甚至对于某位单独工作的人来说,【个人开发者(单独开发)】部分命令都是必不可少的。如果你和别人一起工作,你也会需要【个人开发者(参与者)】部分列出的命令。 14 | 15 | 除了上述的部分,担当【集成人员】角色的人需要知道更多命令。【代码库管理】命令帮助系统管理员负责管理,及向git代码库提交内容。 16 | 17 | ##个人开发者(单独开发) 18 | 19 | 单独的个人开发者不会与他人交换修补程序,只用到下列命令,独自在单独的代码库上工作: 20 | 21 | git-init #用来创建新代码库。 22 | 23 | git-show-branch #用来查看你在哪里。 24 | 25 | git-log #查看发生过什么。 26 | 27 | git-checkout 和 git-branch #用来切换分支。 28 | 29 | git-add #用来管理索引文件。 30 | 31 | git-diff 和 git-status #查看你正在做什么。 32 | 33 | git-commit #将内容推进现分支 34 | 35 | git-reset 和 git-checkout #(带路径名 参数)放弃修改。 36 | 37 | git-merge #用来合并本地分支 38 | 39 | git-rebase #用来维护主题分支 40 | 41 | git-tag #用来给已知点打标签 42 | 43 | ##个人开发者(参与开发) 44 | 45 | 作为在一个团体项目里参与角色的开发人员,需要学习如何与他人沟通,除了那些单独开发者需要掌握的命令以外,还要使用这些命令。 46 | 47 | git-clone #从上游代码库填充你的本地代码库。 48 | 49 | git-pull 和 git-fetch #从“origin”得到最新的上游代码库。 50 | 51 | git-push #用来共享代码库,如果你采用cvs风格的代码库工作流的话。 52 | 53 | git-format-patch #用来准备e-mail提交,如果你使用Linux内核风格的公共论坛工作流的话。 54 | 55 | ##集成人员 56 | 57 | 在一个团队项目中担任集成者的是一名相当重要的人员,他接受别人的修改,评审并且集成并且发布结果,供他人使用;除了那些参与者需要的命令之外,还会使用这些命令。 58 | 59 | git-am #用来采用你的贡献者发电邮寄来的补丁文件。 60 | 61 | git-pull #用来从你的可信任的助手处合并内容。 62 | 63 | git-format-patch #用来准备并向你的贡献者发送建议选项。 64 | 65 | git-revert #用来撤销不好的提交。 66 | 67 | git-push #用来发布最新的内容。 68 | 69 | ##代码库管理 70 | 71 | 代码库管理员使用下列工具来设置及维护开发者对代码库的访问。 72 | 73 | git-daemon #允许匿名者从代码库下载 74 | 75 | git-shell #可以被用作为限制登录shell,用于共享中央代码库的用户 update hook howto有一个很好的管理共享中央代码库的实例。 76 | 77 | 78 | 原文链接: kernel.org 翻译: 伯乐在线 - cjpan 79 | 译文链接: http://blog.jobbole.com/54184/ 80 | -------------------------------------------------------------------------------- /HTML5/CSS3打造的精美效果.md: -------------------------------------------------------------------------------- 1 | #CSS3打造的精美效果 2 | 3 | ###1-Quickly Build a Swish Teaser Page With CSS3 4 | 5 | 这个教程告诉你使用CSS3快速构建一个时髦预告页面,提示你的网站还有多少天完成 6 | 7 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134429e0e04zzleare0lss.jpg) 8 | 9 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/Archive) 10 | 11 | ###2-How to Create Accordion Menu in Pure CSS3 12 | 13 | 在本教程中,我们将学习如何创建一个纯CSS3手风琴菜单 14 | 15 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134430owvaoaovtx34kumv.jpg) 16 | 17 | [点这里看DEMO](http://designmodo.com/demo/css3accordionmenu/) 18 | 19 | ###3-Button Switches with Checkboxes and CSS3 Fanciness 20 | 21 | 告诉你如何只用CSS创建按钮开关,没有一行JavaScript代码 22 | 23 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/1344309b9bhlb9v3t8zz98.jpg) 24 | 25 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/CSS3ButtonSwitches) 26 | 27 | ###5-CSS3 Responsive Slider 28 | 29 | 纯CSS3打造的响应滑块导航 30 | 31 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134431pisqr7dfas0x4sfh.jpg) 32 | 33 | [点这里看DEMO](http://csscience.com/responsiveslidercss3/) 34 | 35 | ###-How to Create a Content Accordion in Pure CSS3 Tutorial 36 | 37 | 今天的教程中,我们将学习如何创建一个纯CSS3内容的手风琴 38 | 39 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/1344312bs6bykb5sltw6i2.jpg) 40 | 41 | [点这里看DEMO](http://designmodo.com/demo/accordioncss3/) 42 | 43 | ###3D Flipping Circle with CSS3 and jQuery 44 | 45 | 这个教程创造逼真的3D翻转效果的CSS 3D变换和阴影效果 46 | 47 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134432v24u914o1zxdxdo4.jpg) 48 | 49 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/3DFlippingCircle) 50 | 51 | ###Swatch Book with CSS3 and jQuery 52 | 53 | 使用CSS3创建一个书本的切换效果 54 | 55 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/1344336ke7hee68f5gfe22.jpg) 56 | 57 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/SwatchBook) 58 | 59 | ###Accordion with CSS3 60 | 61 | 使用 hidden inputs和labels,我们将创建一个CSS手风琴 62 | 63 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134434gm242fqs4b4d18nd.jpg) 64 | 65 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/CSS3Accordion) 66 | 67 | ###Circle Navigation Effect with CSS3 68 | 69 | 这个教程向您展示如何创建一个美丽的悬停效果的图像导航使用CSS3 70 | 71 | ![](http://bbs.html5cn.org/data/attachment/forum/201212/14/134435ed220eadfrdgndxn.jpg) 72 | 73 | [点这里看源码](https://github.com/qiwsir/BitJSCode/tree/master/CircleNavigationEffect) 74 | 75 | 更多请到这里找:[**分享30个新鲜的CSS3打造的精美效果**](http://bbs.html5cn.org/thread-10546-1-1.html) 76 | 77 | -------------------------------------------------------------------------------- /HTML5/codes/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | The example of HTML5 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 33 | 34 | 35 |
36 |

视频播放

37 |

关于video标签

38 |
39 | 44 | 45 |
46 |

通过js加载视频

47 |
48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /HTML5/css中单位px和em,rem.md: -------------------------------------------------------------------------------- 1 | #css中单位px和em,rem 2 | 3 | ##PX特点 4 | 5 | 1. IE无法调整那些使用px作为单位的字体大小; 6 | 7 | 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位; 8 | 9 | 3. Firefox能够调整px和em,rem,但是96%以上的中国网民使用IE浏览器(或内核)。 10 | 11 | px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。(引自CSS2.0手册) em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。(引自CSS2.0手册) 12 | 13 | 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。 14 | 15 | ##EM特点 16 | 17 | 1. em的值并不是固定的; 18 | 19 | 2. em会继承父级元素的字体大小。 20 | 21 | 所以我们在写CSS的时候,需要注意两点: 22 | 23 | 1. body选择器中声明Font-size=62.5%; 24 | 25 | 2. 将你的原来的px数值除以10,然后换上em作为单位; 26 | 27 | 3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。 28 | 29 | 也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em,那么在声明p的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继承#content的字体高而变为了1em=12px。 30 | 31 | ##rem特点 32 | 33 | rem是CSS3新增的一个相对单位(root em,根em),这个单位引起了广泛关注。这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器均已支持rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。 34 | 35 | 下面就是 一个例子: p {font-size:14px; font-size:.875rem;} 36 | 37 | **注意:** 38 | 39 | 选择使用什么字体单位主要由你的项目来决定,如果你的用户群都使用最新版的浏览器,那推荐使用rem,如果要考虑兼容性,那就使用px,或者两者同时使用。 在这里为大家提供一个px,em,rem单位转换工具 40 | 41 | 地址:http://pxtoem.com/ 42 | 43 | -------------------------------------------------------------------------------- /IT/14位科技才俊与导师的故事.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/IT/14位科技才俊与导师的故事.txt -------------------------------------------------------------------------------- /IT/3D打印技术风起云涌背后的三种兴奋和三种思考.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/IT/3D打印技术风起云涌背后的三种兴奋和三种思考.txt -------------------------------------------------------------------------------- /IT/Linux之父:讨厌封闭 回绝乔布斯.md: -------------------------------------------------------------------------------- 1 | 一个21岁的芬兰大学生,在学生宿舍里写了一个操作系统的内核——Linux,然后公布于众,吸引了成千上万的程序员为之增补、修改和传播,短短几年就拥有了千万的用户,成为地球上成长最快的软件。他就是Linux之父——Linus Torvalds。 2 | 3 | Linux系统的创始者Torvalds与之前的技术创新者存在着很大的区别。之前的技术创新者都通过自己所持有的专利权而获得利益,但是Torvalds将自己的创新免费提供给所有需要的人。在一定的安排条款之下,根据所有改进都能共享的原则,用户可以免费使用并改进该系统。 4 | 5 | Linux不仅仅是一个产品,其背后有着人性中最悠久的底蕴,有着自由软件深厚的传统,又有着互联网势不可挡的自由共享精神的背景。而且它所摧毁的不仅仅是一家公司,而是整个软件产业封闭的传统商业模式。 6 | 7 | Linux这个项目诞生时并不为人所看好。当Torvalds还是赫尔辛基大学的一名学生时就启动了这个项目,因为他希望在自己的英特尔386计算机上改进Unix。不过Linux不久就变成了一个强势社区,针对的不仅是那些由DEC和Sun之类公司开发的Unix服务器,还包括微软的Windows操作系统。 8 | 9 | 对大多数黑客来说,他们的目标就是创造简洁优雅的程序,干净而无冗余的代码。或者是超一流的程序,以此赢得同行们的尊敬和推崇。而李纳斯走得更远,他不但重新定义了一流程序、代码和软件的基准,而且迈向了“黑客”的终极高度。 10 | 11 | Linux之所以受欢迎因为三股强大的势力正好发生交融。首先,Linux的开始恰逢英特尔的处理器准备好进入黄金时期。在企业员工偷偷摸摸地把iPad和智能手机带进办公室以前很久的时候,Linux就已悄然将英特尔机器带进企业,用来开发新程序原型,以及建设廉价的网站和文件及打印服务器。 12 | 13 | 第二股势力是GNU通用公共许可(General Public License) 。在上世纪八十年代,Unix制造商做得很好,但他们把许多最好的技术留给自己。这对于做生意来说是好的,但从长远来看对Unix却并非好事。到了1991年,已经出现了许多不兼容的Unix版本。但是Linux的许可则要求任何对其作出变更的人都要共享之。这使得该项目避免了分崩离析,并确保任何真正好的软件都能为人人所用。 14 | 15 | 不过第三个因素则是Torvalds本人,他以一种在开源界所罕见的方式将自己的印记烙在Linux上面。 16 | 17 | 上世纪九十年代晚期,当李纳斯搬到美国去的时候,Linux正值巅峰。Linux的创始人还是开源革命的一位令人特别印象深刻的发言人。他为一家神秘得有趣的芯片初创企业Transmeta工作—在网络泡沫破裂之后这家公司也最终倒闭,但只要记者不问到Transmeta的事情,Torvalds属于那种有话直说的家伙,显然他并不关心自己会不小心惹恼了谁。 18 | 19 | Torvalds成为了垄断的、不招人喜欢的比尔·盖茨的完美映衬。前者为人低调、不摆架子,是个纯粹因为乐趣而喜欢计算机的好人。《乐者为王》正是他2002年与记者David Diamond合著的自传的名字,自传有趣得令人惊讶—但Torvalds说要是在现在的话他决不考虑。 20 | 21 | Torvalds仍然在为了乐趣而做事。他是一位毫无保留的专家,在技术在线讨论中总是开诚布公,但他从不夸夸其谈。 22 | 23 | Torvalds从来没有见过盖茨,但是大概在2000年,当他还在Transmeta工作的时候,他会了乔布斯。乔布斯邀请他到苹果库比蒂诺(Cupertino)总部,想要雇他。“他的诱饵是最大用户群的Unix,”Torvalds说。条件是:Torvalds必须放弃Linux开发。“他希望我在苹果工作,从事非Linux的东西,”Torvalds回绝了乔布斯的邀请。对于Torvalds来说这个条件是异想天开。他不喜欢苹果的封闭,讨厌Mac OS的Mach内核。 24 | 25 | var:网易阅读 26 | -------------------------------------------------------------------------------- /IT/一天能学会的计算机技术.txt: -------------------------------------------------------------------------------- 1 | 作者:Vamei 出处:http://www.cnblogs.com/vamei 2 | 3 | 在Quora中看到一个有趣的问题,题目是"What are some useful computer related technical skills I can learn within a day?",哪些有用的计算机技术,是一天能够学会的?后面的回答很高质量,最受欢迎的答案拿到了2000多个赞。提问人最后将这些有趣的回答收集在一起。简直是程序员“周末干什么”指南。 这些推荐的技术都非常实用。有些技术一天之内只能了解一个皮毛。但如果你之前对这些技术一无所知,大概的了解可以让你遇到困难时,知道还有这么美妙工具的存在。 4 | 5 | #Technical 技术类# 6 | *版本控制 (Version control):Git, GitHub and SVN ([Link:Git - Getting Started](http://git-scm.com/book/en/Getting-Started)) [版本管理三国志] 7 | *正则表达式 (Regular expressions) [Python正则表达式](http://www.cnblogs.com/vamei/archive/2012/08/31/2661870.html) 8 | *学习使用AWK (Linux的文本处理工具) 9 | *学习使用sed (Linux的文本处理工具) 10 | *学习使用Grep (Linux的文本搜索工具) 11 | *学习一些你从没想到的Vim用法。 12 | *设置网络爬虫,扒些网页和数据。 13 | *设置一个爬虫,用来填表。 14 | *编写一个基本的线性代数库 (linear algebra library),处理矩阵、矢量和相关乘法 15 | *给这个库增加SVD (Singular Vector Decomposition) 16 | *给这个库增加求逆矩阵功能 (matrix inversion) 17 | *给这个库增加最小二乘回归 (least squares regression) 18 | *优化这个库,让它更有效率的处理稀疏数据。 19 | *使用Python的列表推导式 (list comprehension) [Python循环对象](http://www.cnblogs.com/vamei/archive/2012/07/09/2582499.html) 20 | *创建Stack Overflow账户,并学着用这个网站。 (Link:[Stack Overflow](http://stackoverflow.com/)) 21 | *读你最喜欢语言的文档,虽然文档可能让人头皮发麻 22 | *实施一个简单的机器学习算法 23 | *用Excel画线图 24 | *个性化eclipse,加插件 25 | *学习NoSQL数据库的基本功能 26 | *学习SQL数据库的基本功能 27 | *理解SQL和NoSQL数据库的差别,各自的优缺点以及适用场景 28 | *习惯Linux环境 [Linux的概念与体系](http://www.cnblogs.com/vamei/archive/2012/10/10/2718229.html) 29 | *一个或者两个排序算法 [排序算法] 30 | *学用D3 (JavaScript的库,用于数据可视化) 31 | *学习使用单元测试 [gdb调试] 32 | *熟悉AWS服务 (亚马逊云服务) 和它们的API 33 | *学习图论基础 34 | *每天学习并实践一个算法 [纸上谈兵] 35 | *理解分布式处理和分布式存储 (CAP理论,MapReduce算法,集群MySQL,PostgreSQL数据库) 36 | *针对Python的 37 | >尝试内置函数 [Python内置函数] 38 | >使用某个框架,比如Flask或Tornado,写一个简单的网站 39 | >学习itertools模块 [循环器itertools模块] 40 | >开始玩CheckIO(Python编程游戏网站) 41 | 42 | *学习编辑Wikipedia的文章 43 | *学写Markdown 44 | *试用LaTeX, BibTex, pgfplots 45 | *学用命令行 (command line) [Linux常用命令] 46 | *学用JavaScript (Link:Eloquent JavaScript) 47 | *如果已经知道了面向对象编程,看一点设计模式 48 | 49 | 最妙的是这个非技术类部分,仔细想想,非常重要啊。 50 | 51 | #Non Technical 非技术类# 52 | 53 | *学习园艺 54 | *学习酿啤酒 55 | *经历与电脑无关的生活 56 | *学焊接 57 | *学打字 58 | *找一个女孩/男孩约会。 [用21天速成上面的技术类,约会时冒充高科技男? 59 | -------------------------------------------------------------------------------- /IT/为什么我要公开代码和想法.txt: -------------------------------------------------------------------------------- 1 | 为什么我要公开代码和想法 2 | 3 | 晚饭结束后 ,我朋友Valerie说:”我一点也不担心别人发现我的秘密,因为秘密就是事实。比方说有人发现我的秘密并为此而烦恼,那是他们的问题,而不是我的”。 4 | 5 | 我喜欢这种豁达的态度,并开始思考。 6 | 7 | 随后我们离开,我帮她披上外套、拿起手提包。她的钱包很重,于是我问,”里面是什么“? 8 | 9 | 她说:“是我的两本日记。一本很私密,另一本更加私密”。 10 | 11 | 由于刚刚谈到了秘密,于是我就问:”我能不能看看你更加私密的那本”? 12 | 13 | 她有点吃惊,犹豫了一会,说:“好吧”。 14 | 15 | 我们点了两杯苹果汁,我花了大概20分钟看完,期间她一直耐心等待。日记中记的都是家庭琐事,目标规划,改变生活的计划,一些浪漫的细节,后悔的事情,思考,等等。 16 | 17 | 读完后我吃惊的发现这些日记对我一点意义都没有。那些日记对她来说意味着整个时间,但对我却没有任何秘密可言。日记记录的都是我们都会想到的东西。 18 | 19 | 然后我就开始思考关于保守秘密的事情。 20 | 21 | 就像我写的代码一样,我把它放在一个只支持SSH 的server的加密分区上,我目前的工作,极度私密。不能让任何人访问它。 22 | 23 | 但是如果有人读了我的代码会怎样?他们会偷去然后优化它?真的? 24 | 25 | 我意识到这就像Valerie的日记一样。对我意义非凡,对别人一文不值。那为什么要高度保密且自寻烦恼呢?(另一方面也会有争论,公开也会有麻烦)。 26 | 27 | 总要有人试一试,所以我决定公开我所有程序的源代码和业务点子(business idea),看看会怎样。 28 | 29 | 我就是要挑战对别人盗取我们想法的恐惧。 30 | 31 | 结果是,我把所有的商业概念放在网上两年多,没有人”偷走”它。欢迎你去试试。我还会不断的增加。 32 | 33 | 所有的东西都在:http://sivers.org/projects 34 | 35 | PS:我并不是说所有的东西都应该公开,我只是说我自己的代码和想法(idea)。就是这样。这并不是讨论哪些应该公开,哪些应该保密。每个人都有自己的标准。重新审视一下自己的选择,看看对你是否适用。 36 | 37 | 原文链接: Derek Sivers 翻译: 伯乐在线 - 马超 38 | 译文链接: http://blog.jobbole.com/53879/ 39 | -------------------------------------------------------------------------------- /IT/云服务器与物理服务器的成本比较.txt: -------------------------------------------------------------------------------- 1 | 云计算很强大、很灵活也很便宜,嗯,也许并不是非常便宜。事实上,有时候云计算也很贵。但是,这都取决于你的观点、需求及处境。 2 | 3 | 我最近读了一篇关于这个主题的文章,讲的是关于创业公司停止使用云主机,是因为云主机很贵,而标准的物理服务器性能、内存及存储量都比以前大大增强了。 4 | 5 | 这无疑是事实。云计算服务,尤其是大行的云计算如AWS、Rackspace、SoftLayer及阿里云等是很强大的,除了CPU、RAM及磁盘价格很低之外,这些云还具有其它的附加值。 6 | 7 | 同时,对于特定的云服务器,其配置成本不会比物理服务器少多少,以Dell为例,我们通常买的是64-128GB 32 核(有超线程功能,可能相当于20-24个实体核),6-12TB 磁盘的服务器,价格大概是5000美金。当然,此外你还需要购买数据中心空间、带宽及其它许多运营支持系统。 8 | 9 | 要达到类似的配置,若使用的是AWS的话,需要两个QuadXL, 每个每小时是1.6美元或每个每月是1150美元,再加上存储等等,所以,构建这样的系统,很快就会用到3000美元每个月。Rackspace也是类似 的,但成本相差很大,如果你有5个这样的系统的话,需花费25, 000美元,再加上2500美元每月(数据中心等花费),而使用AWS只需15,000美元。 10 | 11 | 另外,云服务器还有许多其它好处,如地理优势、特别的性能特点、额外服务如DBMS、负载均衡器、及最重要的灵活性等。毕竟,一旦你花了 25,000美元买了服务器,就很难把钱再拿回来。更不必说,AWS可以保留了实例及其它方法,还能通过适当的规模及按需分配等方式帮助您缩减50%或更 多的开支。 12 | 13 | 所以,总的说来,你的钱花的是物有所值,您只需要清楚自己的需求,并关注云实际提供的价值,尤其是对于刚起步的公司或中小型系统而言,云是能给你带来切实的价值的。 14 | 15 | 所有这些,会使您想要使用私有云,当然,在此您可以比较云及实体硬件的成本。由于这个及更多的原因,云络科技在中国每周都会建立一个私有云。花同样 的成本,私云比公共云性能要高、能力要强,但是,从长期来看,由于上述公共云具有以上特点,而且随着工作量的增大,这些公司还是会发展到运用公共云。 16 | 17 | 在将来,我们预计会看到很多混合系统,这些系统很可能是基于OpenStack的,因为,你可以将两者的优势集于一体:实 体物理服务器成本低廉且扩展性能强大,公共云灵活性高、功能强大、服务种类多、发展潜力大。在这个领域,AWS及Rackspace发展的很迅速,因为客 户喜欢这些混合系统,因为混合系统成本低、安全性好还有其它许多优势。 18 | 19 | 总之,云很好,大多数时候也很便宜。对于许多人而言,需考虑所有的特点、灵活性及构建真实系统的成本等,决定是否使用云。在某些情况下,使用私云或 混合云是很合理的,客户需综合考虑自己的所有需求,及所有可行方案,然后才能够开始构建、扩展自己的运营平台,并使该平台发展成熟。 20 | 21 | 文章来自IT经理网 22 | 23 | 文章转载自:开源中国社区 [http://www.oschina.net] 24 | 25 | -------------------------------------------------------------------------------- /IT/如何判断自己是否具有成为一名优秀程序员的潜质.md: -------------------------------------------------------------------------------- 1 | 如何判断自己是否具有成为一名优秀程序员的潜质 2 | 本文的作者 Joshua Kemp 3 | 4 | 5 | 很多像这样的日子,当地上积起厚厚的雪时,我通常会燃起铁炉,把马蹄跌烧的通红,搓搓温暖的手,开始打造特制手工马蹄铁。 6 | 7 | 经过了5年多的专职钉马掌生活后,我开始问自己一个问题:我要一直这样干下去吗?能不能干点儿别的?我的性格跟其他乡下那些叼着雪茄、喝着小酒的铁匠不一样,我从来没有戴过牛仔帽或骑过公牛。我渴望的是知道更多的事情,琢磨更多的事情,做更多的事情。 8 | 9 | 成功的从事开发工作7个月后,我已经给几百人回复了邮件,他们问我如何成为一个程序员的,寻求我的建议,他们想知道如何判断自己是否适合去做一名程序员。 10 | 11 | 下面罗列了7种特征,是我从同事中最有效的程序员身上观察到的,我知道,优秀的程序员都有很多共同之处: 12 | 13 | #1) 注意细节,尤其是最小的细节。 14 | 15 | “差不多”、“很接近”是只能在做马蹄铁时用的词,在软件开发中,95%的正确仍然是不能用,一个“差不多”能用方法或一个使图片很“接近”居中的CSS样式都是不合格、不能用的。这剩下的5%对于整个软件的有效性十分重要,能造成完全相反的结果。 16 | 17 | **««« 如果你讨厌细节,你就别去做程序员。** 18 | 19 | #2) 学无止境 20 | 21 | 起初这句话听起来会很迷人,你会很喜欢!我喜欢学习新事物!尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时 =-)。然而,经过了一段时间后,你会发现,这变成了一条永不停息的知识河流,如果你不喜欢水,你会感觉困在了无尽无边的知识瀑布前,无法停止,也无法穷尽。我每天大概有学到10-20种新的东西,我喜欢这些!我的弟弟却希望事情永远不会变化,始终如一,他对我说他永远都不愿意去学编程。 22 | 23 | **««« 如果你不喜欢坚持不懈的去学习新事物,而喜欢待在一个永不变化的环境中,那你很可能成为不了一名程序员。** 24 | 25 | #3) 面对压力、紧张和限定期限 26 | 27 | 没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任务吗?是否还记得要注意细节?你怎么办?急匆匆的完成?加班加点希望能多完成一些?在理想世界里,编程是一个很有趣的活动,我们写出代码,让它们完成很酷的事情,吃着批萨,喝着可乐。而在现实生活中,有的是压力,虽然不是时刻都这样,但事情会比那种做一个30分钟的简单在线辅导要不同的多。我喜欢挑战我的极限,我渴望成长,变成一个更棒的程序员,所以我不介意。 28 | 29 | **««« 你面对时间限制和工作压力会怎样?如果你想回避这些压力,那你将无法成为一名程序员。** 30 | 31 | #4) 有组织能力 32 | 33 | 我知道有些程序员的生活一塌糊涂,看起来他们似乎没自我组织能力,但我说的不是这些,我是说管理好工作流程的能力。比如,能否迅速容易的在你的计算机里找到一个东西?我认识的优秀的程序员通常能迅速的定位一个需要的文件,能够用工具或脚本帮他们处理繁杂的事物,这些都是高效的工作。 34 | 35 | **««« 当你学到了一个新东西时,你是否把它写下来?你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。** 36 | 37 | #5) 好奇心 38 | 39 | 当我还是十几岁时,教堂里的一位夫人几乎每月都会对我说一次,她说我应该停止问那么多为什么,她说这让人讨厌。虽然受了批评,最终我还是清楚的认识到,优秀的程序员总是在问“为什么?”这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪他们为什么要这样做…?”以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。 40 | 41 | **««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?如果你不具有某种程度天生的好奇心,那么你就很可能不喜欢做一名程序员。** 42 | 43 | #6) 自学 44 | 45 | 我知道,很多的程序员都上过大学,出自高校的,但这不是我要说的。优秀的程序员总是在钻研程序代码和文档,来弄清楚东西的工作原理,他们不会敲开老板办公室的们说:“我需要上培训课,学习这款新软件”。优秀的程序员在不断的学习,不断的靠自己研究出事情的原委——不论是有高学历还是没有学历。 46 | 47 | **««« 如果你需要有人教你,或者等着参加热门的课程去学知识,那你很可能不会成为一名程序员。** 48 | 49 | #7) 人际交往能力 50 | 51 | 这在程序员中不是一个普遍的特征。真正优秀的程序员善于与人交往,但大多数程序员缺乏这些能力。如果你善于沟通,你的老板、你的公司会非常喜欢你。而且,不要因为他们不会编码就瞧不起他们。 52 | 53 | **««« 如果你不喜欢与人接触,跟别人在一起时觉得很难受,那你也许就不应该成为一名程序员。** 54 | 55 | -------------------------------------------------------------------------------- /IT/如何面试程序员.txt: -------------------------------------------------------------------------------- 1 | 如何面试程序员? 2 | 3 | 阮一峰 整理 4 | 5 | 一、提问之前的准备 6 | 7 | 首先,最重要的是,你自己一开始就应该想清楚: 8 | 9 | 1. 需要新员工完成什么样的任务? 10 | 11 | 2. 怎样的人能完成这样的任务? 12 | 13 | 3. 哪些途径和方法可以发现这样的人? 14 | 15 | 只有明确这些根本性的问题,才能正确高效地完成面试。 16 | 17 | 二、提问的原则 18 | 19 | 假定你对上一节的三个问题,已经有了清晰的想法,那么接下来就可以设计如何提问了。 20 | 21 | 有一些提问的原则,是你应该遵循的: 22 | 23 | * 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。 24 | 25 | * 多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。 26 | 27 | * 不要问宗教、家庭、健康、个人隐私等方面的问题。 28 | 29 | * 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。 30 | 31 | 三、考察专业能力 32 | 33 | 为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。) 34 | 35 | 比如,你的招聘职位是系统管理员,你可以问"如何快速地在50台机器上部署Linux?"(提示:正确答案不是刻录50张安装光盘。) 36 | 37 | 另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。 38 | 39 | 四、考察综合素质 40 | 41 | 因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。 42 | 43 | 所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。 44 | 45 | 下面是一些典型问题: 46 | 47 | Why did you get into development? 48 |   你为什么开发软件? 49 | 50 | How many technical books did you read in the past year? 51 |   去年你读了几本技术书籍? 52 | 53 | What was your favorite technical book in the past year? What did you learn from it? 54 |   去年你最喜欢的技术书籍是哪本?你从中学到了什么? 55 | 56 | What websites do you read regularly, related to development? 57 |   平时你经常访问哪些编程类网站? 58 | 59 | Do you maintain any open-source projects? 60 |   你有自己的开源项目吗? 61 | 62 | Do you code in your spare-time? 63 |   业余时间你编程吗? 64 | 65 | Do you love programming, or do you do it for the money? 66 |   对于你来说,编程是一种爱好,还是一种谋生手段? 67 | 68 | Have you accomplished anything important in your career yet? Do you want to? 69 | 你的职业生涯之中有什么重要的成就?它是你主导的吗? 70 | 71 | What would make you feel that you have done something important? 72 |   什么事情会让你很有成就感? 73 | 74 | 五、考察理性思维 75 | 76 | 某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。 77 | 78 | 那么,你可以依次提出这样三个问题: 79 | 80 | What's your favorite programming language? Why? 81 | 你最喜欢的编程语言是哪种?为什么? 82 | 83 | If you could add one feature to your favorite language, what would it be? Why? 84 |   如果允许你为这种语言加一种功能,你会加什么功能?为什么? 85 | 86 | If you could remove one feature from it, what would it be? Why? 87 |   如果允许你取消一种功能,会是什么功能?为什么? 88 | 89 | 这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。 90 | 91 | 你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等。 92 | 93 | 94 | -------------------------------------------------------------------------------- /IT/开发人员需要知道如何做,做什么,和为什么做.md: -------------------------------------------------------------------------------- 1 | 你是否工作在这样的一个大公司里——他们工作效率缓慢,会议无穷无尽?你是否有被告诉去完成一个任务,去开发一个API,但你的不知道它会用在哪里,怎么用?你只是按照文档在技术上把它正确的实现? 2 | 3 | “如何做”是一个开发人员在团队生活中需要知道的最有价值的信息。但遗憾的是,有些人却认为这是开发人员在项目中唯一要知道的事情。 4 | 5 | 我们不能这么认为。 6 | 7 | 如果不知道自己做的究竟是个什么东西,即使是最高效的Ruby on Rails家伙,最熟练的Spring开发人员,或PHP编程者,也不可能做出最有价值的东西。 8 | 9 | 你们中有多少人,曾经写出了API,但却不能说出它们将被在哪里、如何使用?有多少人曾生气的追问“你们要怎么用它们?我按照规格书里的要求把17个Web Service都开发完了,但现在你们只用了其中的4个。该死。” 10 | 11 | 我认为,一个开发人员如果想把工作出色的完成,除了要知道“怎么去做”外,还必须知道自己究竟做的是什么。 12 | 13 | 然而,知道做的是什么和如何做,这还不够。 14 | 15 | 我深信一个开发人员还需要知道和理解"为什么这样做"。只有当你知道这些后,你才能开发出最有价值的产品。 16 | 17 | 为什么会有这个项目?为什么需要这样的产品?该死,为什么会有这样的公司?每个人都需要问这样的问题。当知道并理解了“为什么”后,我们才能做出最优的解决方案。 18 | 19 | 知道了“为什么”,我们才能真正的理解项目的目标,产品的目标和公司的目标。它能激励我们,因为我们看到了大蓝景。 20 | 21 | 理解了“为什么”会使决策更加准确。 22 | 23 | 我们要坚持从是什么 和 为什么入手。这样我们就知道如何最好的去做了。 24 | 25 | 这一招对我很有效。而你又是如何走上成功之路的呢? 26 | 27 | 来源:[http://www.aqee.net/developers-should-know-how-what-and-why/](http://www.aqee.net/developers-should-know-how-what-and-why/) 28 | -------------------------------------------------------------------------------- /IT/提升团队编码效率的10个提示.md: -------------------------------------------------------------------------------- 1 | Voja Janjic是一位自由的Web开发者,拥有多年的从业经验;此外,他还是一位出色的网络管理员。近日,Voja撰写了一篇文章,谈到了如何提升团队的编码效率,如何提升团队中每一个成员的工作效率。毕竟,团队是由一个个成员构成的,如何在保证提升每一个人的效率的基础上提升整个团队的效率就是一个非常重要的议题了。 2 | 3 | 与其他活动类似,Web或软件开发也是个社会性活动,如果你是个开发者或设计师,那很有可能你会身处在一个团队之中。团队由不同的人构成,每个人都有不同的习惯、动机、工作与编码风格。本文旨在介绍一些让团队更具效率和生产力的提示。 4 | 5 | #1. 定义好团队结构 6 | 7 | 可以按照多种方式来定义团队结构,不过最常见的两种是主程序员团队与无我编程团队。 8 | 9 | 主程序员团队至少由3人组成:一个主程序员、一个高级程序员和一个程序管理员。这种结构非常适合于处理简单和直接的任务。另一方面,该结构并不适合于复杂的任务,因为在这种结构下,交流与任务协作都是非常有限的。 10 | 11 | 无我编程通常是个去中心化的团队,由10个左右的程序员构成。整个团队会共同参与设定目标,在项目的不同阶段,领导者也会发生相应的变化,这会提升工作满意度。除此之外,良好的协作与交流也使得这种结构非常适合于处理复杂任务。不过另一方面,缺乏控制可能会造成效率与生产力的下降。 12 | 13 | #2. 将项目分解为任务 14 | 15 | 在定义好团队角色后,接下来需要将项目分解为任务,并将这些任务分派给团队成员。好的做法是一个团队成员只负责一个任务。如果需要,可以将一个任务分解为几个更小的任务,这样可以很好地完成。 16 | 17 | #3. 制订项目计划 18 | 19 | 定义好团队结构并分派好任务后,接下来就需要制订项目计划了。在这个阶段,你需要确定好任务的优先级与顺序,同时还要指定好每个任务的截止日期,这样才能确定下来整个项目的持续时间。 20 | 21 | 这个过程可以通过传统手段完成:使用笔纸。不过,最好使用项目管理软件来做。这样不仅会加快计划的速度,而且现在有很多在线工具可以实现跨团队成员的沟通与协作。 22 | 23 | 在这个阶段中需要考虑到的一个重要的事情就是计划谬误——低估完成任务所需的时间。这种心理现象只会影响到我们对自己所要做的任务的预测。在1994年的一项研究中,研究人员让学生们估算一下他们完成论文所需的时间,平均的估算时间是33.9天,而实际完成的平均时间则是55.5天。因此,好的做法是将估算时间乘以1.7,这样才会得到一个比较恰当的估算时间。 24 | 25 | #4. 定义编码标准 26 | 27 | 不同的程序员有着不同的编码风格,这会导致低效的编程和错误修复过程。幸好,我们可以通过定义团队中每个人都要使用和遵守的编码标准来轻松解决这个问题。最好的做法不是强制施加标准,而是团队一同来制订标准,根据业界的最佳实践与推荐来制订。 28 | 29 | #5. 不要编辑现有代码 30 | 31 | 这个提示是对上一提示的补充,并且在编码标准尚未形成的情况下尤为重要。当团队中存在着不同的编码风格,同时又没有定义好编码标准时,经常出现的一种情况就是一个人会重写其他人的代码,觉得自己的代码风格是最好的。这会扰乱团队成员之间的关系,降低大家对工作的满意度,并且将大量宝贵的时间浪费在没什么生产力的事情上面。因此,建议大家不要这么做,如果怀疑或是发现有人这么做时要及时提出来。 32 | 33 | #6. 考虑结对编程 34 | 35 | 结对编程是一种特别的开发技术,指的是两个程序员在一台电脑前工作的方式。其中一个程序员编写代码,另一个程序员会审查他所编写的每一行代码。两个程序员的角色会频繁切换。 36 | 37 | 相较于独立工作的方式,结对编程有很多优势。两个程序员共同编写出的代码Bug更少,完整性更好,能够更快地找出问题的解决方案并提供更多的设计选择。除此之外,结对编程还会提升生产力,因为处于结对中的程序员不太可能频繁检查社交网络、邮件或是在工作时间内上网。 38 | 39 | 另一方面,有一些情况会破坏结对编程的效率: 40 | 41 | 脱离(其中一个成员没在工作,离开了计算机)。 42 | 一个程序员的经验比另一个少很多,他总是看自己的同伴写代码。 43 | 程序员彼此之间缺乏交流和沟通。应该极力监控和避免这些情况的发生。 44 | 45 | #7. 使用版本控制软件 46 | 47 | 老话说的好“只要做就有可能出错”,编程的时候当然也会出现错误。然而,如果没有使用版本控制软件,那么团队成员可能就要花很多时间将代码恢复到之前没有错误的状态。借助于版本控制软件,恢复的过程就好比是按下一个撤销按钮一样简单。 48 | 49 | #8. 不要在延迟的项目中再添加人手 50 | 51 | “在延迟的软件项目中添加人手会让项目更加延迟”,这句话出自Brooks之口。更加通俗一点,“9个女人不能在1个月内生出孩子”。那么,为什么说添加更多的人手反而会导致效率低下呢?主要的原因在于新人需要时间才能实现高效率。这个时间又叫做增强时间,涉及到对新人的培训,让其了解项目之前的工作、目标与细节信息。资深的团队成员要花很多时间在培训而不是工作上,这意味着放在项目任务上的资源就变得更少了。然而,这只适用于那些已经延迟了的项目。 52 | 53 | #9. 不要加班 54 | 55 | 当项目延期时,经理们通常会要求团队成员加班来完成工作。这么做会导致精力衰竭、动力降低、工作满意度下降的结果。此外在加班时,人的生产力实际上是很低的。因此,不要加班,而是在工作时间内保持高效率。 56 | 57 | #10. 工作时保持舒服的感觉 58 | 59 | 在编程时,重要的是要保证大脑运转正常,不要被其他事情分心。比如说保持足够的睡眠、在工作前做一些轻度的运动或是吃点东西都会提升工作效率。另外,一把舒适的椅子、明亮的灯光等都有助于大脑的全神贯注。 60 | -------------------------------------------------------------------------------- /IT/码农提高工作效率.md: -------------------------------------------------------------------------------- 1 | #码农提高工作效率 2 | 3 | 俗话说,天下武功,唯快不破。也就是说要练成天下高手的话,出招速度一定要快,这样才能在江湖上立足,不至于掉了脑袋。而程序员要在IT界混出个名堂,也要有高效的工作效率才行。IT行业时时刻刻都产生着新知识、新技术,要想跟上变革肯定要有几把刷子。 4 | 5 | 而我本人很喜欢各种各样的方式来提高自己的工作效率,可以分享给大家一些经验。 6 | 7 | **键盘功底要扎实。**敲键盘时要使用标准指法。可能你认为这是程序员的基本功,可是我发现其实很多程序员都做不到这点。看着他们敲代码时那笨拙的指法我就心急。其实炼成标准指法不难,相当年我还是一指禅,打字极慢,痛定思定,在一周内我打字必用标准指法,再别扭也要坚持,一周后就适应了标准指法了。现在不说运指如飞也算是略有小成。练习指法和键盘速度可以给大家推荐一些网站:http://10fastfingers.com/typing-test/english,这个就是练习标准指法的,我可以轻松上60 WPM(每分钟60单词),有个外国同事可以达到130以上,那才叫恐怖。http://typing.io/lessons,专门供程序员练习敲代码的网站,融合了各种括号和标点,难度有点大。 8 | 9 | **要熟悉IDE的各种快捷键及特性。**IDE基本上是码农们上班中使用时间最长的软件。首先要选择一个趁手的IDE,俗话说,工玉成其事,必先利其器嘛。如果是C#阵营的那肯定是最新版的Vistual Studio了,如果是Java阵营的话当然是Intellij了(eclipse作为开源IDE,真心比不过Intellij)。我现在使用Intellij可以在95%的情况下不用鼠标,全键盘完成开发过程中的大部分操作。我觉得没有什么常用快捷键、不常用快捷键之分,只要你知道的快捷键就要拿来用。尤其是各种重构快捷键必须要熟练掌握,当我看到码农修改变量名时不用重构快捷键,而是自己手动在引用的地方一个个改,然后编译查错时,真为他们捉急。还有各种inline,introduce的快捷键真是好用到爆,掌握了这些快捷键可以说对代码进行任何重构都不费除灰之力,我们的注意力也从手动修改代码转移到如何发现坏味道了。Vistual Studio中推荐安装ReSharper,其开发公司与Intellij开发公司是同一家。除了重构快捷键,还要掌握一些IDE的特性,比如调试时可以插入指定条件来命中断点等,这些就要平时的积累和学习,另外还有好奇心。我敢说你现在挨个看IDE菜单,至少有30%功能你从没用过或不知道是干什么用的,其实里面有些功能是非常实用的,只是你没尝试而已。 10 | 11 | **至少熟练掌握一种shell终端。**作为程序员老用图形化界面咋行,要用那种古老的命令行界面才能显示出你的高深嘛!鼠标点界面谁都会,而命令行界面不是谁都能驾驭。有些功能在命令行下要比图形界面下高效N倍。比如我使用git提交文件时都是在命令行下查看哪些文件被修改了,哪些是新添加的,修改的部分是哪些等。使用图形化界面要用鼠标点来点去,效率实在太低。Linux系统下的终端太多了,就不推荐了。Mac系统下推荐使用iTerm2这个壳,其比MAC自带的terminal多了不少实用的特性,也能方便切换自己喜欢的配色。Windows下当然首推Windows Power Shell了。Windows Power Shell本身集成了常用的实用工具,并且与.net framework无缝结合,这点是那些在Windows上的类Linux模拟器(比如Cygwin)是远远比不了的。 12 | 13 | **具有一定编写shell脚本的功底。**光会用现有的脚本还不行,还要会根据情况编写脚本来实现自己特定的一些目标。比如我使用MAC机上的终端时,经常需要在不同目录间跳来跳去,每次都打一串的cd …..很麻烦,后来我就自己写了一个小工具,可以给指定的目录起别名,想要跳到这个目录只要敲别名即可(参见http://www.huangbowen.net/blog/2013/02/16/gtshell/)。还有我在Windows系统上工作时,也经常编写一些Power Shell脚本,比如一个命令就启动指定的FTP服务器,一些小命令用来实现快速在不同项目源码间切换并执行构建命令等。这些命令编写起来都很简单,在提高工作效率方面很好帮助,因为一些常用的费时的操作每天重复N次,让人很厌烦,如果能够使用脚本将其自动化起来,岂不是就把自己给解脱了? 14 | 15 | **多语言编程。**在这个世界有太多太多的编程语言,但凡稍微流行的编程语言都有自己独特的优势,而我们要善于利用每种编程语言的特点,而不是整天吵闹那种语言更强大。我自己熟悉C#、java语言,也用JavaScript、Ruby、Python、Groovy做过一些东西,甚至为了理解函数式编程还专门学习了Haskell语言。这些语言都给我带来了实用的效果。比如我用Ruby写了一个插件,可以自动把我主站上的博客同步到博客园中的博客来。我使用Groovy给我的Java代码写单元和集成测试,比使用Java语言编写要快很多。我用Python和WebDriver写了一个论坛灌水工具来刷积分。你掌握的语言越多,你的视野就越广,你对编程的理解就会越深入。当然我不赞成盲目的求多,至少你要有2到3门精通的语言,从语言语法、语言运行时、语言特性、语言API等方面都要有深入学习和见解,当你再学习其它语言时也不会浮于表面的了。 16 | 17 | 这是最重要的一点,**时刻保持一颗好奇心,一颗坚定不移的提高工作效率的决心。**很多人都抱着差不多态度,心想“我虽不是标准指法,敲键盘速度也差不多”,“我IDE快捷键用的不多,也没觉得那里影响到我开发”,“我只会C#一种语言,还不照样干到现在了吗?”之所以有这种想法,是是因为你没有见到真正高效的人。我曾看到某IT界牛人那出神入化的VIM操作,简直已经超越了指哪打哪的境界,已经达到了键随心动的境界。我也看到某高级程序员使用IDE快捷键三下五除二就把一段丑陋的代码给收拾的服服帖帖。耳濡目染之下让我坚定了这个决心,不做差不多先生。所以平时我和同事一起工作时,就留心他们有哪些方法和工具来提高自己的工作效率。如果他们使用了一些好用的快捷键而我不知道,那我就会记下来下次自己用(快捷键熟练程度上我早已是我们项目组的number one)。如果看到他们使用了一些好的工具我也会立马回去下载下来自己用。(比如前两天我看到同事使用SuperPutty来连接远程主机,其支持多tab方式,这正是我想要的功能。我回去立马下载下来,抛弃了以前的Putty)这样时间长了,集众人之所长,你自然也成为效率达人了。 18 | 19 | 为了我追崇高效率那?我觉得最大的好处是能让我的大脑从繁重的重复劳动中解脱出来,从而能集中精神思考更有价值的事情,而不是被一些杂音干扰。 20 | -------------------------------------------------------------------------------- /IT/结对编程——我的噩梦.txt: -------------------------------------------------------------------------------- 1 | 结对编程——我的噩梦 2 | 3 | 自从极限编程诞生起,我就一直在听说结对编程是个好东西。所有的敏捷传教士们都在告诉我们:结对编程能提高代码质量,有助知识共享,甚至激发开发效率,同时,还能深度拉近程序员之间的感情关系(参看拥抱编程)。 4 | 5 | 那些拒绝结对编程的人都被认为是独行客,懒蛋,或社交恐惧症患者。然而,我不属于任何一种(至少我自己是这么想的),可我仍然讨厌结对编程。为什么我会这样?下面是理由。 6 | 7 | 我们这个社会已经不再崇尚沉默是金。外向性格受青睐。所有的事情都要用合作的方式完成。每个人都要时刻准备好为他人服务。个人空间已不再存在,工作成绩不再归功于某个人。基本上,大家都认为三个臭皮匠胜过一个诸葛亮。 8 | 9 | Steve Wozniak 曾与斯蒂夫·乔布斯合伙创立苹果电脑(今之苹果公司)。沃兹尼亚克在1970年代中期创造出苹果一号和苹果二号,苹果二号风靡普及后,成为1970年代及1980年代初期销量最佳的个人电脑,被誉为是使电脑进入大众家庭的工程师。 10 | 11 | Steve Wozniak 曾与斯蒂夫·乔布斯合伙创立苹果电脑 12 | 13 | 然而,很显然,我们可以看到,有些事情并不是这样的。即使在编程界,很多伟大的创新和杰出的软件都不是由一个团队或某个组合创造的,而是来自一个人的努力。Ant,给Java社区带来巨大飞跃的软件,就是由一个人在从欧洲飞往美国的飞机上开发出来的。还有,一些更近些的例子,Notch开发Minecraft,Marco Arment开发Instapaper,Gabriel Weinberg开发DuckDuckGo:全是单枪匹马的成就。事实上,地球上最有影响力的一个编程大师,Steve Wozniak,有一句著名的教导: 14 | 15 | “单干,拒绝团队,拒绝委员会。” 16 | 17 | 视线放的更远些,很多科学界和艺术界伟大的思想家都是喜欢埋头工作的类型(内向性)——达尔文,爱因斯坦,牛顿,就连漫画家Seuss博士也是这样。甚至诺贝尔文学奖的得主、《愤怒的葡萄》的作者John Steinbeck也要在这事情是插嘴说: 18 | 19 | “两个人一起什么都干不成。合作永远是不成功的——无论是在音乐创作,艺术创作,诗歌创作,数学研究,还是哲学理论研究。只有在奇迹诞生之后,团体才去开发/扩展它们,但团体永远发明不了什么。伟大的思想往往生长于孤独的心里。” 20 | 21 | 好吧,我是有点高谈阔论哲学了,回到我们的小世界,软件开发,为什么我们要相信——如很多人极力主张的——极限合作(例如结对编程)是高质量代码或高工作效率的保障?却忽视如此多的现实反例?为什么——按某些人的说法——结对编程是“必须的”——在所有工作中? 22 | 23 | 我认为这种观点只是个人的内心心理的外现。很简单:有些人喜欢这种形式的工作,所以他们会这样建议,不厌其烦的,让每个人都这样做。 24 | 25 | 然而,真实情况是,我们三分之一的人都是内向的(可能程序员中的比例会更大!)。总体上,我们人类不仅喜欢孤独的工作,而且在孤独中繁荣。并不是我们不喜欢其他人,而是我们的大脑神经会因此受到更多的干扰。对于我们程序员来说,高质量的工作来自于进入并保持一种“意识流状态(参看一种境界)”中。能做到这些,我们就能高效率,否则就不能。爱因斯坦 26 | 27 | Demarco 和 Lister 在他们著名的 Coding War Games 实验中验证了这些——他们发现,判断是否能够成为优秀程序员的最有效的先兆不是他们将有多少年的经验,而是他们工作的办公环境是否足够安静。 28 | 29 | 以前人们是重视这种认识的。关于工作场所的Joel on Software Test这篇文章的第8点就是“程序员是否有安静的工作环境?”然而,很遗憾,极限协作的文化颠覆了我们大脑的工作方式,说实话,我认为这是让人痛恶的。 30 | 31 | 结对编程,作为“everything-together”文化的延续,渗入到人们的思想中,以至于很多人认为一个人独自工作不仅低效率的,而且很无趣。而对于我来说,这正好相反。我的最佳工作状态就是与世隔绝,大脑流状态是我作为程序员最享受的事。并不是我喜欢做独行客,或我是圣人不会犯错。我十分倡导严格的代码审查,我每天都从别人的观点/指教中受益。我只是认为结对编程不能让我成为一个更好(更高兴)的程序员。我实话实说。 32 | 33 | 当人们把结对编程描述成一种他们从中受益的编程方法时,这很好,我祝贺他们。但他们进一步鼓动(要求)我进行结对编程,说他们“知道”我将也会从中受益(而且还有“数据”证明!),打住。一个人能够高效编程的方法并不一定就会适合其他人。想一想这世界上很多伟大的成就(或就在你的项目中),显而易见。宣称适合外向人的结对编程对所有人都是“最佳方法”,这是愚蠢,我不屑这些敏捷教条主义者的言论。 34 | 35 | [英文原文:Pair Programming - My Personal Nightmare ] 36 | 37 | 来源:http://www.aqee.net/pair-programming-my-personal-nightmare/ 38 | -------------------------------------------------------------------------------- /IT/英国政府横评11款系统:Ubuntu最安全.md: -------------------------------------------------------------------------------- 1 | 来源:驱动之家 作者:上方文Q 2 | 3 | 英国政府国家安全部门电子通信安全工作组(CESG)今天公布了一份评估报告,对比了11款桌面、移动操作系统的安全性,最终得出结论:Ubuntu胜出! 4 | 5 | 这份报告考察了11个方面的安全性,包括VPN、磁盘加密、认证、安全启动、平台整合与应用沙盒、应用白名单、恶意代码检测和防御、安全策略增强、外部界面保护、设备更新策略、事件收集企业分析、事故响应。 6 | 7 | 所测试系统分别是Android 4.2、Android 4.2的某三星设备、苹果iOS、苹果Mac OS X 10.8、黑莓BB 10.1(EMM Corporate)、黑莓10.1(EMM Regulated)、Google Chrome OS 26、Ubuntu 12.04、Windows 7/8、Windows RT 8、Windows Phone 8。 8 | 9 | 参测系统没有一个能够完全满足上述所有条件,但是Ubuntu得分最高,其中9项合格(绿色)、3项警告(橙色),无一严重缺陷(红色)。Ubuntu 12.04还是一个长期支持版本,可在五年内免费获得官方安全更新,下一个这种版本将是三个月后的Ubuntu 14.04。 10 | 11 | 黑莓10.1(EMM Regulated)、Android 4.2三星设备也有9项合格,但是事件收集企业分析被打上了红色。 12 | 13 | Windows Phone 8是唯一有两项红色的,分别是VPN、磁盘加密。事实上,这两个项目没有一个能够完全做好,而都顺利过关的只有平台整合与应用沙盒、恶意代码检测和防御。 14 | 15 | 绿色合格项最少的是Android 4.2、黑莓BB 10.1(EMM Corporate),都只有5项。 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /IT/面试时,如何向公司提问?.txt: -------------------------------------------------------------------------------- 1 | 面试时,如何向公司提问? 2 | 3 | 很多人将面试看作一种单向选择,事实上,面试是一种双向选择:不仅是公司挑选你,也是你挑选公司。面试就是为双方提供互相了解的机会,公司在评估你,你也在评估公司。 4 | 5 | 面试官也知道这一点,所以他们有心理准备,期待你提出问题,并且会做出回答。所以,面试时不要浪费向公司提问的机会。而且,你主动提问,表明你比较重视这个职位,会加深面试官对你的印象,可能会提高面试的成功率。 6 | 7 | 有一些注意点,你需要知道: 8 | 9 | 1. 面试之前,一定要做准备,多了解公司的情况。 10 | 11 | 2. 你提出的问题,应该围绕"这份工作是否合适我"这个中心点,其他与应聘关系不大的问题,不宜多问。 12 | 13 | 3. 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。 14 | 15 | 4. 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。 16 | 17 | 5. 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。 18 | 19 | 6. 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。 20 | 21 | 下面是一些你可以问的典型问题。 22 | 23 | 问题一:你们为什么要招聘这个职位? 24 | Q1: Why are you currently recruiting for this position? 25 | 26 | 这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。 27 | 28 | 问题二:你们的新员工多吗? 29 | Q2: Do you have many new staffs? 30 | 31 | 这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。 32 | 33 | 问题三:你们公司(团队)目前面临的最大挑战是什么? 34 | Q3: What are the biggest challenges your team are facing right now? 35 | 36 | 如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。 37 | 38 | 问题四:什么新技术(编程语言)是你们未来希望采用的? 39 | Q4: What technologies/languages would you like to see your team adapt to that aren't currently being utilised? 40 | 41 | 如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。 42 | 43 | 问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的? 44 | Q5: Few companies, if any, are 100% satisfied with the way their business is operating. If you could simply flick a switch to fix it, what one thing would you change? 45 | 46 | 很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。 47 | 48 | 问题六:我申请的这个职位,对公司的业务有何影响? 49 | Q6: If you struggle to fill the position I have applied for, what impact would that have on the business? 50 | 51 | 这个问题会让你了解自己在公司的角色,以及你的岗位对公司是否重要。 52 | -------------------------------------------------------------------------------- /JS/纠正jQuery获取radio选中值的写法.md: -------------------------------------------------------------------------------- 1 | #纠正jQuery获取radio选中值的写法 2 | 3 | 先看一段代码 4 | 5 | aaa 6 | 7 | bbb 8 | 9 | ccc 10 | 11 | 12 | 13 | 24 | 25 | 网上流行的说法就是 $(input[name='aaa'][checked]).val() 能取到选中项的value,但我测试后发现只在IE下有效,在firefox和Chrome中不论选中哪一项,或者不选,取到的值都是第一项的value 26 | 27 | 正确做法应该是 28 | 29 | $("input[name='aaa']:checked").val() 30 | 31 | 同样对于checkbox也是这种写法 32 | -------------------------------------------------------------------------------- /JS/防止表单重复提交的方法.md: -------------------------------------------------------------------------------- 1 | #防止表单重复提交的方法 2 | 3 | 防止表单被用户重复提交,以下方法供参考: 4 | 5 | 1、禁掉提交按钮。表单提交后,通过Javascript将提交按钮设置为disable。.这种方法能够防止用户重复提交。但是,如果客户端把Javascript禁止,这种方法就无效了。 6 | 7 | 2、Post/Redirect/Get模式,在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。当用户提交了表单后,执行一个客户端的重定向,转到提交成功信息页面。 这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。 8 | 9 | 3、在数据库里添加约束。在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。 10 | 11 | 4、在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。 如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。 这使你的web应用有了更高级的XSRF保护。 12 | 13 | 以上方法中,更推荐2、3。 14 | -------------------------------------------------------------------------------- /JavaAndroid/how_to_install_java8.md: -------------------------------------------------------------------------------- 1 | This article will help you to Install Oracle JAVA 8 (JDK/JRE 8u25) on Ubuntu 14.04 LTS, 12.04 LTS and 10.04 and LinuxMint systems using PPA File. 2 | 3 | ##Installing Java 8 on Ubuntu 4 | 5 | Add the webupd8team Java PPA repository in your system and install Oracle java8 using following set of commands. 6 | 7 | $ sudo add-apt-repository ppa:webupd8team/java8 8 | 9 | $ sudo apt-get update 10 | 11 | $ sudo apt-get install oracle-java8-installer 12 | 13 | ##Verify Installed Java Version 14 | 15 | After successfully installing oracle Java using above step verify installed version using following command. 16 | 17 | $ java -version 18 | 19 | java version "1.8.0_31" 20 | Java(TM) SE Runtime Environment (build 1.8.0_31-b13) 21 | Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) 22 | 23 | ##Configuring Java Environment 24 | 25 | Webupd8team is providing a package to set environment variables, Install this package using following command. 26 | 27 | $ sudo apt-get install oracle-java8-set-default 28 | 29 | **References:** 30 | 31 | http://tecadmin.net/install-oracle-java-8-jdk-8-ubuntu-via-ppa/ 32 | 33 | If you want to know: How to Install Java 8 (Jdk 8u31) on CentOS/RHEL 7/6/5 and Fedora. You should read: 34 | 35 | http://tecadmin.net/install-java-8-on-centos-rhel-and-fedora/ 36 | -------------------------------------------------------------------------------- /JavaAndroid/install_android_studio_sdk_ubuntu.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/JavaAndroid/install_android_studio_sdk_ubuntu.md -------------------------------------------------------------------------------- /Knowledge/GDG苏州2014.7.26活动记录.md: -------------------------------------------------------------------------------- 1 | #GDG苏州2014.7.26活动记录 2 | 3 | 2014年7月26日下午,参加[GDG suzhou](http://developers.dushu.hu/)的活动。 4 | 5 | 会上Frank介绍了google I/O大会的盛况以及有关资料。 6 | 7 | 这是一个团结的大会。(严肃,掌声) 8 | 9 | 下面是会议的图片。 10 | 11 | 12 | 会上积极热烈地发言 13 | 14 | ![](http://wxpictures.qiniudn.com/IMG_5506.JPG) 15 | 16 | 全神贯注呀 17 | 18 | ![](http://wxpictures.qiniudn.com/IMG_5507.JPG) 19 | 20 | 主讲人在讲座呢 21 | 22 | ![](http://wxpictures.qiniudn.com/IMG_5532.JPG) 23 | 24 | 我和朋友正在认真地讨论 25 | 26 | ![](http://wxpictures.qiniudn.com/IMG_5479.JPG) 27 | 28 | 本次省会胜利闭幕 29 | 30 | ![](http://wxpictures.qiniudn.com/IMG_5669.JPG) 31 | -------------------------------------------------------------------------------- /Knowledge/IBM5150.md: -------------------------------------------------------------------------------- 1 | #PC鼻祖IBM5150 2 | 3 | ![](http://cms.csdnimg.cn/article/201408/11/53e88b4e67b4c.jpg) 4 | 5 | 1981年8月12日,世界上首款PC——IBM 5150正式推出,这款电脑由IBM的12位工程师研发而出。IBM开发这一产品的初衷是为了获得更多的利润,但它却改变了整个世界。 6 | 7 | ##IBM 5150介绍 8 | 9 | IBM 5150的售价约为1565美元,该款产品重为11.34公斤,仅键盘就重2.7公斤。据悉,这台售价为1565美元的IBM 5150的心脏是Intel的4.77MHz的8088处理器,16KB内存(可升级至256KB),采用低分辨率单色或彩色显示器;捆绑微软的BASIC以及后来被称为PC的“杀手级应用”的VisiCalc电算表软件;配置两个160kb单面软盘驱动器。 10 | 11 | IBM在推出5150这款电脑时并附带了一本技术参考手册,称能够让任何一个普通的消费者在“数小时内学会使用电脑”。而当时的其他企业并不会泄露他们产品的任何技术细节,而IBM却打破了这个行规。这也使得哥伦比亚数据产品公司在1982年推出了首款IBM电脑的复制品——MPC 1600-1。也正是因为这个原因,IBM在PC市场上迅速地建立起一系列的行业标准,并迅速在全球范围内推广。 12 | 13 | IMB创立的个人计算机标准,开创了PC革命的新纪元,至今仍被不断的沿用和发展。可以说到目前为止,仍未有一款科技产品能够替代PC,对世界有如此巨大的影响。 14 | 15 | ##IBM 5150的前身 16 | 17 | 1975年,IBM的前身5100正式推出。5100主要是为小型实验室的数据采集和分析工作减轻压力,5100被设计成一款集CRT显示器、键盘和磁盘驱动于一体的计算机,能够在仿真中运行IBM大型主机中一些比较流行的软件。1980年推出的升级版的5120,在体积上更大一些,但由于性能得到了提升,当年一经推出就卖出上千台,这对当时的IBM而言,已算得上一个巨大的成功。 18 | 19 | ##IBM 5150的评价 20 | 21 | IBM曾描述5150型电脑为“专为商业、学校和家庭设计,系统易于使用”、“它提供许多先进功能和多种可选软件,可运行上百种流行的应用程序”,“用户能在几小时内学会使用电脑,还可异常轻松地开发个人程序”。 22 | 23 | 1982年,IBM5150这台信息时代的“开山鼻祖”登上美国《时代》周刊的封面,被评选为“年度人物”(Man of the Year)。该刊写道:“在一年的新闻里,这是最吸引人的话题,它代表着一种进程,一种持续发展并被广泛接受和欢迎的进程。这就是为什么《时代》在风云激荡的当今世界中选择了这么一位新闻人物,但这完全不是一个人物,而是一台机器。” 24 | 25 | 2005年5月,IBM将自己的PC部门出售给联想,彻底退出了PC市场。但是,IBM PC却成为了PC市场绝对的主流,而且这一趋势将继续延续下去。 26 | 27 | var:http://www.csdn.net/article/2014-08-11/2821144-ibm 28 | -------------------------------------------------------------------------------- /Knowledge/bad_or_good_software.md: -------------------------------------------------------------------------------- 1 | #为什么烂软件大行其道而好软件无人问津? 2 | 3 | 作为喜欢较真的程序开发者,一个最难以让我们接受的事实是,很多看起来开发和设计都几乎完美的软件却无人问津。相反,很多开发的一塌糊涂的软件却被世界上的人们大量的每天使用着,这些软件如果不是设计糟糕,就是bug多多。这看起来似乎是软件界让人忿忿不平的根源之一。 4 | 5 | ##所谓“烂软件”烂在哪里? 6 | 7 | 如何看待“烂软件”,这首要、最重要的一点是我们如何给“烂”定义标准。所有人都会认为,如果一个软件宣称能备份你的电脑数据,但却时不时的丢失数据;成功的备份了数据,却占用了多余的空间、备份错了文件,这就是“烂”软件。可很多时候“烂”和“不烂”却不那么容易辨别,而大多数程序员都会认为这样的软件是烂软件。比如: 8 | 9 | 10 | - 如果一个软件能为主要用户提供正确的服务,但难于扩展,难于修改,难于维护,这是好软件吗? 11 | - 如果一个软件功能正确,但需要大量的培训才能投入使用,这是好软件吗? 12 | - 如果一个软件工作正常,相对也容易学,但就是运行速度慢,这是好软件吗? 13 | - 能用但界面丑陋的软件是好软件吗? 14 | - 95%情况下都正常,偶有会崩溃的软件是好软件吗? 15 | 16 | 上面举的这些例子都可以归类为“烂软件”,尽管每个人对这些问题的严重性反应不一。也许你会认为软件的界面不好看,所以是烂软件,而我会认为它在功能上偶尔出现错误,所以不是好软件。很显然,我们认为它们应该做的更好。 17 | 18 | ##为什么“烂软件”受欢迎 19 | 20 | 为什么烂软件会很受欢迎?也许你会困惑。做为市场人员,他们对软件的好坏的评判跟程序员有很多的不同。而软件的最终用户的评判标准跟市场人员和程序员又有些不同。但有人认为一个软件非常好时,另外一个人却会认为糟糕透了。这才是关键问题。 21 | 22 | 你也许不认可Wordpress团队的开发方向和设计重点,你也许会认为他们开发的东西就是烂东西,但你无法回避这样的现实:大量的用户(这个数目仍在在增加)仍在使用它,并且认为很简单、实用和强大。 23 | 24 | ##重新定义“好软件” 25 | 26 | 基本上,评判什么是“烂软件”的标准驱动于人们的立场、角度和侧重点,这些意识决定了他们认为最终产品应该如何设计、部署和实施。 27 | 28 | 站在老板的角度上,软件能够按要求开发完成,能够盈利,这就是好软件。 29 | 30 | 代码清晰,测试充分,文档齐全,这是程序员关心的。市场人员关心的是软件能否提供价值,能否赚钱。对于管理员来说,持续运行时间达到99.999%就是好软件。对于用户来说,他们关心的是否简单好用。 31 | 32 | 对于软件的开发商来说,需要照顾各方面的需求,在各种取舍上做权衡。当所有软件开发参与者、使用参与者、维护参与者、销售参与者等看重的东西都有了很好的照顾,这样的软件才是最成功的软件。 33 | 34 | 35 | 原文出处: David Hayes 译文出处:techug,var:http://blog.jobbole.com/81081/ 36 | -------------------------------------------------------------------------------- /Knowledge/斐波纳契数列.md: -------------------------------------------------------------------------------- 1 | #斐波纳契数列 2 | 3 | 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数、斐波那契数列、斐波那契数列、黄金分割数列。 4 | 5 | 在数学上,费波那契数列是以递归的方法来定义: 6 | 7 | F0 = 0 (n=0) 8 | F1 = 1 (n=1) 9 | Fn = F[n-1]+ F[n-2](n=>2) 10 | 11 | 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就由之前的两数相加。首几个费波那契系数是(OEIS A000045): 12 | 13 | 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…… 14 | 15 | 特别指出:0不是第一项,而是第零项。 16 | 17 | 关于Fibonacci的精彩解释,请看下列视频: 18 | 19 | [TED-神奇的斐波那契数列](http://swf.ws.126.net/openplayer/v02/-0-2_M9HKRT25D_M9HNA0UNO-vimg1_ws_126_net//image/snapshot_movie/2014/1/6/L/M9HNA8H6L-.swf) 20 | 21 | 如果要查看文字解释,请看维基百科词条:[斐波那契数列](http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97) 22 | -------------------------------------------------------------------------------- /Knowledge/美国大选日的由来.md: -------------------------------------------------------------------------------- 1 | 作者:甘阳 2 | 3 | 美国全国大选日的设定问题并不是一件小事,它必须尽可能不要打乱百姓的日常生活,使他们能在最方便的日子来参与全国政治活动。我们现在不妨就了解一下目前美国法定大选日为什么定在11月而不是别的月份,同时也不是11月1日,而是颇有些复杂地定为“11月的第一个星期一以后的星期二”举行,这在当初事实上是国会很费了一番苦心才找出来的一个与民方便的日子。 4 | 5 | 美国宪法并未规定大选日,其原因究竟是当时费城制宪会议的疏忽还是别的什么原因,目前已无从考证。现在这个大选日是国会于1845年制定的。这里最重要的是1845年时美国还是一个完全的农业国,因此任何考虑都像我们老中国那样必须从农业季令出发。大选日定在11月的第一个理由就是到那时不仅夏收已经完成,而且夏粮的储存和销售也都应该已完成,因此是美国农夫们心情舒畅又有空闲的日子。这个时间同时不能晚于11月的上旬,因为当时选民需要走远道去投票地点投票,晚于11月美国很多地方的雨雪季节就到了,许多人不愿再出门。至于大选必须在星期二而不是星期一举行,而是因为当时多数人去投票站事实上要一天的路程,而星期天是上教堂做礼拜的日子,因此国会的算盘是选民可以在星期一出门,星期二到达投票地点投票。 6 | 7 | 最费解的自然是为什么不简单点是11月的第一个星期二,而要弄成“11月第一个星期一以后的星期二”这么复杂?其原因是,美国地方法院大多在每个月的1日开庭审案,如果11月第一个星期二正好是11月1日,那就会与地方法庭开庭日冲突,“十一月第一个星期一后的星期二”就避开了这个冲突,由此美国大选日实际上总是落在11月2日与8日之间。 8 | 9 | 10 | -------------------------------------------------------------------------------- /Knowledge/职业发展和年龄.md: -------------------------------------------------------------------------------- 1 | #职业发展和年龄 2 | 3 | 谈起这个话题,是因为近几天又听到周围的朋友在讨论如下话题: 4 | 5 | - 是不是要做一辈子程序员呢?我都快而立之年了,听说程序员这个职业三十岁以上就不适合了 6 | - 这个人年龄太大了,都四十了,还能写出程序吗?还能加班吗? 7 | 8 | 就先列出两条比较有代表性的吧。 9 | 10 | ##程序员职业和年龄挂钩,是一个伪命题。 11 | 12 | 大约在十年前,就有很多刚刚工作时间不长,大约在二十五六岁的程序员,担心十年之后,自己三十多岁的时候,是否还能做程序员。当初那帮人,现在都三十多了,不少都奔四了,事实上他们中大多数还在做程序员,而且是相当不错的程序员。 13 | 14 | **请程序员们自尊、自重,编程序是一个脑力活,是一个技术活,更是一个艺术活。**它不是像某个行业那样,只能吃青春饭,当人老珠黄的时候就不值钱了。 15 | 16 | 某些程序员,之所有担心,我估计有以下原因: 17 | 18 | - 对自己的技术不自信,又不愿意提升自己的技术,总想做点别的。这不是坏事,但是,他还总想着为自己的变化找点借口,这就多余了。只要你喜欢,今天你敲代码,明天去卖猪肉,完全可以,无人指摘。或许只有一些闲着蛋疼的媒体在这个事情上鼓捣一下,不过请放心,大家都不会很在意的,只要你自己不刻意追求让别人在意。 19 | - 某些所谓成功人士忽悠年轻人。特别是某些程序员出身的公司老板,自认为自己是成功者,然后就忽悠程序员,“如果你们现在不努力,过来三十,就不值钱了”,看看,这明显就是忽悠你无偿加班呢。 20 | 21 | 如果还有别的原因,请看官补充吧。 22 | 23 | 不管什么原因,其实也不仅仅是程序员这个行业,很多正当的行业,只要不是纯粹体力和肉体的工作,跟年龄挂钩,都是伪命题。 24 | 25 | 比如教师,现在很多学校喜欢招聘年青教师,对于40岁以上应聘者基本上是拒之门外。难道教师的工作已经沦落到纯粹体力的了吗?如果不是,让一帮刚刚出校门的大孩子来教育一群懵懂的小孩子,能教育好吗?所以,大家宁可谈某国足球也不谈某国教育了。 26 | 27 | 编程这个职业,跟年龄无关。 28 | 29 | ##软件公司的圈套 30 | 31 | 如果你已经是有若干年工作经验的,想挑选一个技术流的软件公司,只要看看他们招聘的条件就足够了。如果招聘条件中有年龄限制,或者应聘的时候,对方询问与年龄有关的事情,或者把某些工作与年龄挂钩了。基本上可以断定,这个公司不是你要找的技术流公司,他们需要的只是一个搬运代码的,不是需要用自己智慧编写程序的。特别提醒:不要听公司的各种忽悠。 32 | 33 | 某些公司打着各种广纳人才的旗号,甚至在网上发帖声称找“靠谱的xx程序员,真难呀”。其实,靠谱的程序员很多很多,但靠谱的公司很少很少。 34 | 35 | 傲慢的、擅长忽悠的公司,永远找不到靠谱的程序员。 36 | 37 | ##编程可以做为一生的工作 38 | 39 | 编程,不是拼体力,更多是在拼智力和经验。所以,它完全是可以做为一生的工作的。 40 | 41 | 当然,这取决于个人的爱好。如果您就是讨厌这个职业,也无妨。 42 | 43 | 在某国人中,由于长期畸形的教育,很多人都是把某个职业做为一个谋生的饭碗,而不是把兴趣和自己从事的职业结合起来。如果看官朋友,你起恰好是喜欢编程而且已经从事这个职业了,那么就要恭喜了,这是非常幸福的事情,在某国,能够享受这种幸福的人很少很少。请珍惜。 44 | 45 | 顺便告知:我已进不惑之年,依然喜欢编程。而且自我感觉良好。 46 | -------------------------------------------------------------------------------- /Linux/CentOS7上安装POCO.md: -------------------------------------------------------------------------------- 1 | #CentOS上安装POCO 2 | 3 | ##POCO是什么? 4 | 5 | 看[官网](http://pocoproject.org/)说明: 6 | 7 | >Modern, powerful open source C++ class libraries and frameworks for building network- and internet-based applications that run on desktop, server, mobile and embedded systems. 8 | 9 | ##下载地址 10 | 11 | 强烈建议,唯一下载地址就是官方网站,不要图省事在某些国内站点下载。地址是:[http://pocoproject.org/download/index.html](http://pocoproject.org/download/index.html) 12 | 13 | ##安装过程 14 | 15 | 网上有很多安装实例,但是,我在CentOS7中按照那些方法实施,总是遇到问题。于是发挥自己的探索精神,终于按照下面步骤搞定,记录下来,供自己和朋友们参考 16 | 17 | 第一步:安装MySQL和ODBC 18 | 19 | # yum -y install unixODBC 20 | # yum -y install unixODBC-devel 21 | # yum -y install mysql 22 | # yum -y install mysql-devel 23 | 24 | 如果不安装,在安装POCO的时候需要声明忽略。具体看的后面步骤。 25 | 26 | 第二步:安装POCO 27 | 28 | # gunzip poco-X.Y.tar.gz 29 | # tar -xf poco-X.Y.tar 30 | # cd poco-X.Y 31 | # ./configure 32 | # gmake -s 33 | 34 | 以上步骤中,已经假设第一步安装了MySQL和ODBC,如果用户不安装,需要在./configure指定目录的这一步进行声明。 35 | 36 | 参数解释: --omit 排除(不编译的), --prefix安装路径,命令样例(prefix部分可以不写): 37 | 38 | # ./configure --omit=Data/ODBC,Data/SQLite --prefix=/usr --static --shared 39 | 40 | 如果没有 --static --shared 默认为 shared 不编译静态库 41 | 42 | 附加一条来自网络的经验: 43 | 44 | >如果在x64的系统下使用到静态库 .记得一定要加-fPIC,动态库不用. 45 | > ./configure --omit=Data/ODBC,Data/SQLite --prefix=/usr --cflags=-fPIC --static 46 | 47 | 以上做好,最后一个命令不要忘记: 48 | 49 | # gmake -s install 50 | 51 | 至此,在CentOS7上安装POCO成功结束。 52 | -------------------------------------------------------------------------------- /Linux/GAE for Ubuntu.md: -------------------------------------------------------------------------------- 1 | #GAE for Ubuntu 2 | 3 | 1、下载SDK FOR UBUNTU(PYTHON)https://developers.google.com/appengine/downloads?hl=zh-cn 4 | 5 | 2、将下载的文件解压,并存储到本地计算机中 6 | 7 | 3、修改ubuntu命令路径。方法是: 8 | 9 | 用户主目录下的.profile或.bashrc文件,登录到你的用户(非root),在终端输入: 10 | 11 | $ sudo gedit ~/.profile(or .bashrc) 12 | 13 | 可以在此文件末尾加入PATH的设置如下: 14 | 15 | export PATH=”$PATH:your path1/:your path2/ ...” 16 | 17 | 保存文件,注销再登录,变量生效。 18 | 19 | 该方式添加的变量只对当前用户有效。 20 | 21 | 4、创建一个文件夹,并在文件夹中创建文件app.yaml(必须是这个文件名),其内容如下: 22 | 23 | application: clock #文件夹名称,可修改 24 | version: 1 #应用的版本号 25 | runtime: python #运行python脚本 26 | api_version: 1 #python的api version 27 | threadsafe: yes 28 | 29 | handlers: 30 | - url: /.* #每个请求都由名字为main.py的脚本处理 31 | script: main.py 32 | 33 | 5、进入到clock所在的文件夹,执行: 34 | 35 | dev_appserver.py clock 36 | 37 | 显示: 38 | 39 | INFO 2013-06-15 02:58:26,865 api_server.py:138] Starting API server at: http://localhost:35036 40 | 41 | INFO 2013-06-15 02:58:26,875 dispatcher.py:164] Starting server "default" running at: http://localhost:8080 #main.py启动的应用 42 | 43 | INFO 2013-06-15 02:58:26,876 admin_server.py:117] Starting admin server at: http://localhost:8000 44 | 45 | 6、上传文件到gae空间,执行: 46 | 47 | appcfg.py update clock 48 | -------------------------------------------------------------------------------- /Linux/How_to_solve_GLIBCXX_3.4.19.md: -------------------------------------------------------------------------------- 1 | #解决类似`/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found`错误 2 | 3 | 运行MonaServer的时候,遇到了下面的报错: 4 | 5 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./MonaServer) 6 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./MonaServer) 7 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./../MonaBase/lib/libMonaBase.so) 8 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./../MonaBase/lib/libMonaBase.so) 9 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./../MonaBase/lib/libMonaBase.so) 10 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.17' not found (required by ./../MonaCore/lib/libMonaCore.so) 11 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./../MonaCore/lib/libMonaCore.so) 12 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./../MonaCore/lib/libMonaCore.so) 13 | ./MonaServer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./../MonaCore/lib/libMonaCore.so) 14 | 15 | 执行: 16 | # strings /usr/lib64/libstdc++.so.6|grep GLIBCXX 17 | 18 | 得到结果: 19 | 20 | GLIBCXX_3.4 21 | GLIBCXX_3.4.1 22 | GLIBCXX_3.4.2 23 | GLIBCXX_3.4.3 24 | GLIBCXX_3.4.4 25 | GLIBCXX_3.4.5 26 | GLIBCXX_3.4.6 27 | GLIBCXX_3.4.7 28 | GLIBCXX_3.4.8 29 | GLIBCXX_3.4.9 30 | GLIBCXX_3.4.10 31 | GLIBCXX_3.4.11 32 | GLIBCXX_3.4.12 33 | GLIBCXX_3.4.13 34 | GLIBCXX_FORCE_NEW 35 | GLIBCXX_DEBUG_MESSAGE_LENGTH 36 | 37 | 到13到头了,所以报错啦。 38 | 39 | ##解决方法 40 | 41 | ###到编译时的目录下面找到文件:libstdc++.so.6.0.18 42 | 43 | 我编译的时候,建立build_gcc_4.8.1文件夹,具体方法参见:[centos升级gcc到4.8.1](https://github.com/qiwsir/ITArticles/blob/master/Linux/upgrade_gcc_on_Centos.md) 44 | 45 | 注意,进入目录是,.libs是隐藏的:/home/build_gcc_4.8.1/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs 46 | 47 | ![](http://wxpictures.qiniudn.com/glibcxxerror.png) 48 | 49 | 用下面的命令查看: 50 | 51 | strings libstdc++.so.6.0.18|grep GLIBCXX 52 | 53 | 一般来讲,里面就有满足需要的GLIBCXX版本了。 54 | 55 | 然后,把该文件拷贝到了/usr/lib64下. 56 | 57 | 然后将libstdc++.so.6指向libstdc++.so.6.0.18: 58 | 59 | [root@localhost lib64]# rm -r libstdc++.so.6 60 | rm: remove symbolic link `libstdc++.so.6'? y 61 | [root@localhost lib64]# ln -s libstdc++.so.6.0.18 libstdc++.so.6 62 | 63 | 这就Ok了。 64 | -------------------------------------------------------------------------------- /Linux/Linux命令.md: -------------------------------------------------------------------------------- 1 | #Linux命令 2 | 3 | - shutdown -h now 立刻关机 4 | - shutdown -r now 重启计算机 5 | - reboot 重启计算机 6 | 7 | - logout 退出当前用户 8 | 9 | - ls 10 | - ls -a 显示隐藏 11 | - ls -l 显示详细 12 | 13 | - mkdir 建立目录 14 | - rmdir 删除空目录 15 | 16 | - touch 建立空文件 17 | - cp 复制文件 18 | - cp -r dir1 dir2 递归复制(复制子目录) 19 | 20 | - mv 移动和修改文件名 21 | 22 | - rm 删除文件和目录 23 | - rm -rf 强制删除文件和目录 24 | 25 | - grep '要查找的关键词' 文件名 在某个文件中查找某关键词 26 | - grep 'kivi' aa.py > qiwei.text 在aa.py中查找kivi,并把检查结果保存到qiwei.text 27 | 28 | - find 查找文件名/目录 29 | - find / -name aaa.py 从根目录开始找名称为aaa.py的文件 30 | - find /root -name aa.py 从目录root中找 31 | 32 | - ls -l > a.txt 列表的内容写入到文件a.txt中(覆盖写) 33 | - ls -al >> aa.txt 列表内容追加到文件aa.txt末尾 34 | 35 | - history 查看历史执行的命令 36 | - history 5 查看最近的5条命令 37 | 38 | -------------------------------------------------------------------------------- /Linux/Linux的五个查找命令.md: -------------------------------------------------------------------------------- 1 | **作者:阮一峰** 2 | 3 | 最近,我在学习Linux,下面是一些笔记。 4 | 5 | 使用电脑的时候,经常需要查找文件。 6 | 7 | 在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条命令都很熟悉的人应该是不多的。 8 | 9 | ##1. find 10 | 11 | find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。 12 | 13 | find的使用格式如下: 14 | 15 | $ find <指定目录> <指定条件> <指定动作> 16 | 17 | - <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。 18 | 19 | - <指定条件>: 所要搜索的文件的特征。 20 | 21 | - <指定动作>: 对搜索结果进行特定的处理。 22 | 23 | 如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。 24 | 25 | find的使用实例: 26 | 27 | $ find . -name ‘my*’ 28 | 29 | 搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。 30 | 31 | $ find . -name ‘my*’ -ls 32 | 33 | 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。 34 | 35 | $ find . -type f -mmin -10 36 | 37 | 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。 38 | 39 | ##2. locate 40 | 41 | locate命令其实是”find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。 42 | 43 | locate命令的使用实例: 44 | 45 | $ locate /etc/sh 46 | 47 | 搜索etc目录下所有以sh开头的文件。 48 | 49 | $ locate ~/m 50 | 51 | 搜索用户主目录下,所有以m开头的文件。 52 | 53 | $ locate -i ~/m 54 | 55 | 搜索用户主目录下,所有以m开头的文件,并且忽略大小写。 56 | 57 | ##3. whereis 58 | 59 | whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。 60 | 61 | whereis命令的使用实例: 62 | 63 | $ whereis grep 64 | 65 | ##4. which 66 | 67 | which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。 68 | 69 | which命令的使用实例: 70 | 71 | $ which grep 72 | 73 | ##5. type 74 | 75 | type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。 76 | 77 | type命令的使用实例: 78 | 79 | $ type cd 80 | 81 | 系统会提示,cd是shell的自带命令(build-in)。 82 | 83 | $ type grep 84 | 85 | 系统会提示,grep是一个外部命令,并显示该命令的路径。 86 | 87 | $ type -p grep 88 | 89 | 加上-p参数后,就相当于which命令。 90 | 91 | 本文来自:阮一峰的网络日志 92 | -------------------------------------------------------------------------------- /Linux/chmod改变文件和目录权限.md: -------------------------------------------------------------------------------- 1 | #chmod改变文件夹或文件的权限 2 | 3 | chmod是linux中常用的命令之一,主要用来改变文件夹或文件的权限。在网站部署中经常被使用。 4 | 5 | 此命令由root用户或者被赋予相关权限的用户执行 6 | 7 | ##命令格式 : 8 | 9 | chmod [-cfvR] [--help] [--version] 文件或文件夹 10 | 11 | ##参数说明 : 12 | 13 | 权限设定字串,格式如下 : 14 | 15 | [ugoa][[+-=][rwxX]...][,...],其中 u 表示该文件或目录的拥有者,g 表示与该文件或目录的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 16 | 17 | - + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 18 | - r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 19 | - -c : 若权限确实已经更改,才显示其更改动作 20 | - -f : 若权限无法被更改也不要显示错误讯息 21 | - -v : 显示权限变更的详细资料 22 | - -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更) 23 | - --help : 显示辅助说明 24 | - --version : 显示版本 25 | 26 | ##举例: 27 | 28 | 将文件 file1.txt 设为所有人皆可读取 : 29 | 30 | chmod ugo+r file1.txt 31 | 32 | 将 file1.txt 与 file2.txt 设为该文件所有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : 33 | 34 | chmod ug+w,o-w file1.txt file2.txt 35 | 36 | 将 ex1.py 设定为只有该文件拥有者可以执行 : 37 | 38 | chmod u+x ex1.py 39 | 40 | 将目前目录下的所有文件与子目录皆设为任何人可读取 : 41 | 42 | chmod -R a+r * 43 | 44 | 此外chmod也可以用数字来表示权限如 chmod 777 file 45 | 46 | **语法为:**chmod abc file 47 | 48 | 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 49 | 50 | - r=4,w=2,x=1 51 | - 若要rwx属性则4+2+1=7; 52 | - 若要rw-属性则4+2=6; 53 | -若要r-x属性则4+1=7。 54 | 55 | 例如: 56 | 57 | chmod a=rwx file 和 chmod 777 file 效果相同 58 | 59 | chmod ug=rwx,o=x file 和 chmod 771 file 效果相同 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Linux/chown命令修改文件或目录的所有者.md: -------------------------------------------------------------------------------- 1 | #chown命令修改文件或目录的所有者 2 | 3 | 在linux中, chown命令用于修改文件或者目录的所有者 4 | 5 | 通常是root用户或者有权限的用户使用。 6 | 7 | **格式:**chown [选项] 用户或组 文件 8 | 9 | **说明:** 10 | 11 | chown将指定文件的所有改为指定的用户或组。用户可以是用户名或 用户I D;组可以是组名或组ID。 12 | 13 | 文件是以空格分开的要改变权限的文件列表,支持通配符。 14 | 15 | 选项含义: 16 | 17 | - R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。 18 | - v 显示chown命令所做的工作。 19 | 20 | 举例 21 | 22 | (1)chown wang shiyan.c 把文件shiyan.c的所有者改为wang。 23 | 24 | (2)chown - R wang.users /his 把目录/his及其下的所有文件和子目录的属主改成wang,属组改成users。 25 | 26 | 27 | 特别注意,chown命令与chmod命令的区别。chmod用于改变访问权限,不改变所有者。 28 | -------------------------------------------------------------------------------- /Linux/installGooglePinyinUbuntu.md: -------------------------------------------------------------------------------- 1 | #Install Googlepinyin on Ubuntu 2 | 3 | 1. To install the dependencies, you can run: 4 | 5 | sudo apt-get install cmake build-essential opencc mercurial ibus 6 | 7 | 2. download libgooglepinyin: https://libgooglepinyin.googlecode.com/files/libgooglepinyin-0.1.2.tar.bz2 8 | 9 | 3. run next step: 10 | 11 | tar -jxvf libgooglepinyin-0.1.2.tar.bz2 12 | cd libgooglepinyin 13 | mkdir build; cd build 14 | cmake .. -DCMAKE_INSTALL_PREFIX=/usr 15 | 16 | make 17 | sudo make install 18 | 19 | 4. reload ibus 20 | 21 | pkill -f ibus-daemon ; ibus-daemon -d -x 22 | 23 | 5. add Googlepinyin in "System Settings-Text Entry" 24 | -------------------------------------------------------------------------------- /Linux/install_swftools.md: -------------------------------------------------------------------------------- 1 | #在ubuntu上安装swftools 2 | 3 | ##关于swftools 4 | 5 | 官方网站:www.swftools.org 6 | 7 | 解释: 8 | 9 | >SWFTools is a collection of utilities for working with Adobe Flash files (SWF files). The tool collection includes programs for reading SWF files, combining them, and creating them from other content (like images, sound files, videos or sourcecode). SWFTools is released under the GPL. 10 | 11 | ##swftools安装过程 12 | 13 | ###依赖组件 14 | 15 | 1. 安装freetype 16 | 17 | 下载地址:http://www.freetype.org/ 18 | 19 | 安装流程: 20 | 21 | tar -xjf freetype-2.5.5.tar.bz2 #以下载的是freetype-2.5.5.tar.bz2为例 22 | cd freetype-2.5.5 23 | ./configure 24 | make 25 | sudo make install 26 | 27 | 2. 安装JPEG Group 28 | 29 | 下载地址:http://www.ijg.org/ 30 | 31 | 安装流程: 32 | 33 | tar -xvzf jpegsrc.v9a.tar.gz 34 | cd jpeg-9a 35 | ./configure 36 | make 37 | sudo make install 38 | 39 | ###安装swftools 40 | 41 | 从官方网站下载之后,解压缩(我在这里用的是github上的版本,直接:git clone https://github.com/brad/swftools.git) 42 | 43 | cd swftools 44 | ./configure 45 | make 46 | sudo make install 47 | 48 | 上面的方法,是在比较顺利的时候,就那么顺利地完成了。或许,有下面的问题。 49 | 50 | 安装完成后执行一下,pdf2swf -h 有帮助内容显示,则证明安装成功。 51 | 52 | 如果所转换的PDF不包含中文,则到此为止就可以正常使用了。 53 | 54 | 如果包含中文,就需要使用到xpdf的字体库。 55 | 56 | ###问题和解法 57 | 58 | 出现报错信息: 59 | 60 | :info:build jpeg.c:109:35: error: use of undeclared identifier 'TRUE' 61 | :info:build jpeg_set_quality(&cinfo,quality,TRUE); 62 | :info:build 63 | 64 | 解决方法: 65 | 66 | 到swftools的源码中,修改文件:lib/jpeg.c: 67 | 68 | 原来为: 69 | 70 | #ifdef HAVE_JPEGLIB 71 | #define HAVE_BOOLEAN 72 | #include 73 | 74 | 将上述部分修改为: 75 | 76 | #ifdef HAVE_JPEGLIB 77 | #ifndef FALSE 78 | #define FALSE 0 79 | #endif 80 | #ifndef TRUE 81 | #define TRUE 1 82 | #endif 83 | #define HAVE_BOOLEAN 84 | #include 85 | 86 | ##更多参考资料 87 | 88 | - https://trac.macports.org/ticket/42735 89 | - http://iwang.github.io/miranda/2013/12/15/install-swftools-ubuntu.html 90 | - http://shitouququ.blog.51cto.com/24569/1252930 91 | - http://blog.sina.com.cn/s/blog_6094008a0102vney.html 92 | -------------------------------------------------------------------------------- /Linux/linux下面用ssh上传和下载文件.md: -------------------------------------------------------------------------------- 1 | #linux下面用ssh上传和下载文件 2 | 3 | ##一,ssh上传文件 4 | 5 | scp file username@hostIP:文件地址 6 | 7 | 例: 8 | 9 | [zhangy@BlackGhost ~]$ scp test.sql root@192.168.1.5:/var/www/zhangying 10 | zhangying@192.168.1.5's password: 11 | test.sql 100% 7884 7.7KB/s 00:00 12 | [zhangy@BlackGhost ~]$ 13 | 14 | ##二,ssh下载文件 15 | 16 | scp username@hostIP:文件所在地址 文件目录 17 | 18 | 例: 19 | 20 | [zhangy@BlackGhost ~]$ scp root@192.168.1.5:/var/www/zhangying/test.sql /home/zhangy/database_bak/ 21 | zhangying@192.168.1.5's password: 22 | test.sql 100% 7884 7.7KB/s 00:00 23 | [zhangy@BlackGhost ~]$ 24 | 25 | -------------------------------------------------------------------------------- /Linux/ubuntu启动器和菜单不显示.md: -------------------------------------------------------------------------------- 1 | #ubuntu启动器和菜单不显示 2 | 3 | 现象描述:在安装glx-dock后,不知道什么原因,左边的启动器penal和顶部的菜单栏都不见了。 4 | 5 | 解决方法: 6 | 7 | 1. 在命令终端(ctrl+alt+t)输入ccsm,打开compizconfig设置管理器。 8 | 2. 在“桌面”里面找到ubuntu-unity plugin。 9 | 3. 点击之,打开后,选中该项目。 10 | 4. 大功告成。 11 | -------------------------------------------------------------------------------- /Linux/ubuntu目录文件操作权设置.md: -------------------------------------------------------------------------------- 1 | #ubuntu目录文件操作权设置 2 | 3 | chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级权限用户root才 有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过八进制的语法,另一种是通过助记语法。 4 | 5 | ##助记语法设置文件权限 6 | 7 | chmod的主机语法相对简单,对文件或目录的权限改变时,是通过比较直观的字符形式来 完成。在助记语法中,相关字母的定义如下。 8 | 9 | 用户或用户组定义 10 | 11 | u:代表属主; 12 | g:代表属组; 13 | o:代表其他用户; 14 | a:代表属主、数组和其他用户,也就是上面三个用户(或组)的所有。 15 | 16 | 权限定义 17 | 18 | r:代表读权; 19 | w:代表写权; 20 | x:代表执行权。 21 | 22 | 权限增减字符 23 | 24 | -:代表减去相关权限; 25 | +:代表增加相关权限。 26 | 27 | 用助记语法比较灵活,组合起来比较方便,比如: 28 | 29 | - u=r+x 为文件属主添加读、写权限; 30 | - ug=rwx, o-r 为属主和属组添加读、写、执行权限,为其他用户设置读权限; 31 | - a+x 为文件的属主、属组和其他用户添加执行权限; 32 | - g=u 让文件的属组和属主的权限相同。 33 | 34 | ##八进制表示法设置权限 35 | 36 | 八进制语法的数字说明 37 | 38 | | 单个权限 | 对应八进制数字 | 39 | |---------|---------------| 40 | |R |4 | 41 | |W | 2 | 42 | |X | 1 | 43 | |- | 0 | 44 | 45 | 然后再把相应权限的数值相加,得到一个组的权限描述。因为一个文件包括三 个权限 组,所以对于一个文件的权限描述来说,八进制描述包括从0到7的数字,这三个数值分别对应属主、属组和其他用户的权限描述,比如文件的权限位rwxr- xr-x,对应的八进制描述如下: 46 | 47 | - 属主的权限用数字表达:属主的权限是rwx,也就是4+2+1,应该是7; 48 | - 属组的权限用数字表达:属组的权限是r-x,也就是4+0+1,应该是5; 49 | - 其他用户的权限数字表达:其他用户权限是t-x,也就是4+0+1,应该是5。 50 | 51 | 所以整个文件的权限用八进制描述就是755。 52 | 53 | ##语法 54 | 55 | usr@ubuntu:~$ chmod [权限八进制数值] [文件或目录名 称] 56 | 57 | 从上面的分析可以看出,每三位的权限代码(分别是属主、属组和其他用户)组合,有8种可 能,如下表所示。 58 | 59 | 组权限与八进制数值的映射关系 60 | 61 | |八进制数值 | 三位组合权限| 62 | |-----------|------------| 63 | |0 | — | 64 | |1 | –x | 65 | |2 | -w- | 66 | |3 | -wx | 67 | |4 | r– | 68 | |5 | r-x | 69 | |6 | rw- | 70 | |7 | rwx | 71 | -------------------------------------------------------------------------------- /Linux/upgrade_gcc_on_Centos.md: -------------------------------------------------------------------------------- 1 | #centos升级gcc到4.8.1(支持c++11)步骤 2 | 3 | ##下载gcc最新版 4 | 5 | wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.1/gcc-4.8.1.tar.gz 6 | 7 | 然后解压到文件夹 8 | 9 | tar -xvzf gcc-4.8.1.tar.gz 10 | 11 | 进入解压缩之后的目录 12 | 13 | cd gcc-4.8.1 14 | 15 | 然后执行下面的运行 16 | 17 | ./contrib/download_prerequisites 18 | 19 | 再返回上一层,建立`build_gcc_4.8.1`目录,这个目录和gcc-4.8.1平行 20 | 21 | cd .. 22 | mkdir build_gcc_4.8.1 23 | 24 | 进入刚建立的目录,并执行编译过程 25 | 26 | cd build_gcc_4.8.1 27 | ../gcc-4.8.1/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib 28 | make -j23 29 | make install 30 | 31 | OK,在build_gcc_4.8.1中将gcc已经安装完成 32 | 33 | 确定新安装的GCC的路径,之前安装时记下最后mv时的路径即可,我是默认安在了/usr/local/bin 34 | 35 | ls /usr/local/bin | grep gcc 36 | 37 | 看图 38 | 39 | ![](http://wxpictures.qiniudn.com/binx86.png) 40 | 41 | 执行 42 | 43 | /usr/sbin/update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-unknown-linux-gnu-gcc-4.8.1 40 44 | 45 | gcc --version #查看版本 46 | 47 | /usr/sbin/update-alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++ 40 48 | 49 | g++ --version #查看版本 50 | 51 | 52 | 53 | 来源:http://lonelyprogram.blog.51cto.com/6246243/1355261 54 | -------------------------------------------------------------------------------- /Linux/使用 Linux 命令行测试网速.md: -------------------------------------------------------------------------------- 1 | #使用 Linux 命令行测试网速 2 | 3 | 当发现上网速度变慢时,人们通常会先首先测试自己的电脑到网络服务提供商(通常被称为“最后一公里”)的网络连接速度。在可用于测试宽带速度的网站中,Speedtest.net也许是使用最广泛的。 4 | 5 | Speedtest.net的工作原理并不复杂:它在你的浏览器中加载JavaScript代码并自动检测离你最近的Speedtest.net服务器,然后向服务器发送HTTP GET and POST请求来测试上行/下行网速。 6 | 7 | 但在没有图形化桌面时(例如,当你通过命令行远程登陆服务器或使用没有图形界面的操作系统),基于flash、界面友好的Speedtest.net将无法工作。幸运的是,Speedtest.net提供了一个命令行版本——speedtest-cli。下面我将向你演示如何在Linux的命令行中使用speedtest-cli来测试宽带连接速度。 8 | 9 | ##安装speedtest-cli 10 | 11 | speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行。它基于Speedtest.net的基础架构来测量网络的上/下行速率。安装speedtest-cli很简单——只需要下载其Python脚本文件。 12 | 13 | 安装speedtest_cliShell 14 | 15 | >$ wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py 16 | >$ chmod a+rx speedtest_cli.py 17 | >$ sudo mv speedtest_cli.py /usr/local/bin/speedtest-cli 18 | >$ sudo chown root:root /usr/local/bin/speedtest-cli 19 | 20 | ##使用speedtest-cli测试网速 21 | 22 | 使用speedtest-cli命令也很简单,它不需要任何参数即可工作。 23 | 24 | >$ speedtest-cli 25 | 26 | 输入这个命令后,它会自动发现离你最近的Speedtest.net服务器(地理距离),然后打印出测试的网络上/下行速率。 27 | 28 | 如果你愿意分享测试结果,你可以使用参数“–share”。它将会把你的测试结果上传到Speedtest.net服务器并以图形的方式分享给其他人。 29 | 30 | 如果你对目前所有可用的Speedtest.net服务器感兴趣,你可以使用参数“–list”。它会打印出所有的Speedtest.net服务器(按照离你的地理距离由近及远排序)。 31 | 32 | 原文:How to check Internet speed from the command line on Linux 33 | 转自:极客范 - 小道空空 34 | -------------------------------------------------------------------------------- /Linux/博客自定义域名经历.md: -------------------------------------------------------------------------------- 1 | #博客自定义域名经历 1 2 | 3 | 来源:http://marklma.uni.me/2014/08/02/My-Blog-Domain-1/ 4 | 5 | 一直想搞个自定义的个人域名,因为marklma.gitcafe.com感觉还是太长了,而且个性化不足。想要的域名当然是免费域名(一般搜索“免费域名”就会找到免费资源部落,可以看看里面文章,还是不错的),之前一直看好的有.tk域名和.ml域名。这两个免费的一级域名都是属于freenom的,不过在网上查了一下,好像freenom会吞域名,而且还明文存储你的密码……汗。 6 | 7 | 且不管freenom它要吞免费域名,freenom申请免费域名的过程困难重重。不知道为什么,我的火狐老是没法显示freenom网页它那特殊的验证码,明明按照操作使用,但是就是申请不下来。不但DNS设置不能用dnspod和360dns等,而且申请失败后老是提示这个域名已经被占用,让我郁闷不已。 8 | 9 | 最后实在是不想再跟freenom周旋了,转而在免费资源部落上找一些其它免费域名,结果发现一级免费域名寥寥无几。再转而求其次:(,先搞个二级域名耍耍。看上co.cc,结果网站都上不去(当然我已经番羽了)……最后找来找去,cz.cc和uni.me看起来勉强还行,就按照步骤开始申请了。相比之前其它网站,申请过程简单得让我都不敢相信,而且支持第三方NS(Nameserver),还支持DNSPOD! 10 | 11 | 大致过程是在http://uni.me上申请了marklma.uni.me和marklma.cz.cc这2个域名,并在已经将这2个域名的Nameserver设置为了dnspod的f1g1ns1.dnspod.net、f1g1ns2.dnspod.net。在gitcafe.com/marklma中的custom domain上都增加了marklma.uni.me和marklma.cz.cc。为了以防万一,还建立了一个CNAME文件放到了gitcafe-pages分支下。不过由于DNS的延迟性与我性格的急躁性是一对不可调和的矛盾,结果经历了一番折腾:跑去了SegmentFault来了个自问自答。 12 | 13 | 域名设置完毕后我以为就高枕无忧了,但是事实告诉我“想得美”!半夜用手机一登录marklma.uni.me,结果居然给我跳出一个H网站!!我去,这是什么情况,这是便宜没好货么?不禁想到如此顺畅的申请过程是不是有鬼。还好到了早上一查,网站解析正常了。正常是正常了,但是又被360给封了,说有危险,让我想起hexo官网的待遇,赶忙按照流程进行站长申诉。360倒是很快,立马就可以正常访问了。 14 | 15 | 网站解析异常这究竟是域名提供商问题还是我DNS解析上出现了问题,如果是域名提供商的问题,那就麻烦了。我浏览器设置了广告拦截,该不会没使用广告拦截的访客们访问本页面会跳出一个广告吧,还请各位偶然路过看到此文章的访客,回复一下究竟是否有广告干扰。 16 | 17 | 最后感慨一下,“免费的东西其实更贵”,因为它消耗了你的时间…… 18 | 19 | -------------------------------------------------------------------------------- /Linux/大规模WEB服务(笔记).md: -------------------------------------------------------------------------------- 1 | 大规模WEB服务开发技术 2 | 作者:伊藤直也 田中慎司 3 | 4 | #一、开发定位 5 | 6 | ##1、保证可扩展性、负载均衡的必要性 7 | 8 | - 横向扩展(scale out):通过增加服务器数量来提高系统的整体处理能力并分担负载。 9 | - 纵向扩展(scale up):通过提高硬件性能来提高处理能力。 10 | 11 | ##2、保证冗余性 12 | 13 | 不论哪台服务器出现故障或不正常,服务必须能继续运行。 14 | 15 | ##3、低成本运维的重要性 16 | 17 | #第2课 持续增长的服务和大规模化的障碍 18 | 19 | ##WEB服务的困难 20 | 21 | - 根据服务器用途选择最适合的硬件配置; 22 | - 次用LVS+keepalived负载均衡器+运行状态监视 23 | - 服务器替换,逐渐推行虚拟操作系统 24 | - 管理服务器信息:开发了基于WEB的服务器信息管理系统 25 | 26 | 过早优化不是最佳方案(从商业角度看,WEB服务一夜成名可能性几乎为零) 27 | 28 | ##服务开发的实际状况 29 | 30 | - 每天早晨各个团队用10分钟左右开个短会。会议中共享前一天的进度和当天的计划等; 31 | - 在会议中决定任务的负责人。各个成员在会议之后立即开始实现自己的任务; 32 | - 实现过程中尽量书写测试用例。 33 | - 写完测试后开始实现。实现完成后提交到版本管理系统中; 34 | - 实现完成后,请求团队内其他工程师进行代码审查。审查过程挑出bug、发现不遵循公司内部编码约定的代码,并找出可能发生负载过高的代码等。代码审查对提高实现质量来说是及其有效的手段。 35 | - 审查通过后,将其合并到产品代码中,并在测试环境中确认其正常工作后,反应到产品系统上。 36 | 37 | 一般在单独工作感到不稳妥时采用结对编程。是否结对编程,视具体情况而定。 38 | 39 | 40 | -------------------------------------------------------------------------------- /Linux/如何优雅地连接ssh.md: -------------------------------------------------------------------------------- 1 | #如何优雅地连接ssh 2 | 3 | 作为一个开发者,经常要面对管理一大堆服务器的情况,对unix类服务器,我们一般用ssh连接来管理。那么你一般怎么连接ssh,输入密码?弱爆了,既难得记,又不安全。现在俺们都用证书来连接 4 | 5 | 使用证书来管理连接至少有如下两个好处 6 | 7 | - 安全,目前生成证书的方式不管是RSA还是DSA无论从位数上还是加密方式上都比自己生成的密码安全许多。 8 | - 方便,有了证书以后你就不用再记忆密码了,系统会自动使用证书跟服务器接驳,这一过程不需要人工干预 9 | 10 | 使用证书连接ssh也非常简单,首先你得生成一个证书,在shell中输入如下命令 11 | 12 | ssh-keygen -t rsa -C joyqi -f my-key-file 13 | 14 | - -t定义的是加密方式,一般有rsa和dsa两种 15 | - -C定义的是注释,一般也可以不写 16 | - -f定义了输出的证书文件名,不需要写后缀,因为生成的证书包含了公钥和私钥两个文件,它会自动帮你加文件名。 17 | 18 | 我们执行后可以看到如下结果 19 | 20 | $ ssh-keygen -t rsa -C joyqi -f my-key-file 21 | Generating public/private rsa key pair. 22 | Enter passphrase (empty for no passphrase): 23 | Enter same passphrase again: 24 | Your identification has been saved in my-key-file. 25 | Your public key has been saved in my-key-file.pub. 26 | The key fingerprint is: 27 | 57:75:20:37:e2:53:29:ef:86:09:8e:1b:47:2b:6f:88 joyqi 28 | The key's randomart image is: 29 | +--[ RSA 2048]----+ 30 | | o *o.| 31 | | ..*.o | 32 | | +o | 33 | | o. .. | 34 | | S+.o + | 35 | | +.+ o o | 36 | | . B . | 37 | | E o o | 38 | | . | 39 | +-----------------+ 40 | $ ls 41 | my-key-file my-key-file.pub 42 | 43 | 可以在上面的命令执行完成,我们已经得到两个文件my-key-file和my-key-file.pub。前者就是你的私钥,是由你自己个人保存的,后者是公钥,你需要把它上传到任何你想用这个私钥来登录的服务器上。 44 | 45 | ok,现在你需要把公钥文件上传到服务器上,一般我建议用scp命令 46 | 47 | scp my-key-file.pub loginname@yourdomain.com:. 48 | 49 | 把loginname和yourdomain.com分别替换为你的登录名和服务器地址。上传完后我们需要告诉服务器,以后处理loginname的登录时用公钥来验证,现在最后一次用ssh密码登录你的服务器,并执行如下命令 50 | 51 | cat my-key-file.pub >> ~/.ssh/authorized_keys 52 | 53 | 在后面我们都用loginname来特指你自己的登录名,用yourdomain.com来特指你的服务器地址,请自行脑补 54 | 55 | 其中my-key-file.pub是我们刚刚上传的公钥文件名。现在我们还要告诉本机,连接yourdomain.com的时候使用my-key-file这个私钥来登录 56 | 57 | 退出ssh连接,回到本地。将刚才生成的my-key-file文件拷贝到~/.ssh目录下 58 | 59 | cp my-key-file ~/.ssh/ 60 | 61 | 然后编辑~/.ssh/config文件,如果没有,就创建一个,在其中写入如下配置内容 62 | 63 | Host yourdomain.com 64 | IdentityFile ~/.ssh/my-key-file 65 | 66 | 很简单吧,一看就懂,根据你的需要自行修改。最后还有一步,别忘了将本地缓存的公钥文件删掉,因为那是你以前没有上传公钥时,缓存的服务器默认公钥,现在你用了自己生成的公钥就得把这个老的记录删掉 67 | 68 | 打开~/.ssh/known_hosts文件,找到包含yourdomain.com的那一行,将它删掉,然后保存退出 69 | 70 | 现在,你就可以正常登录服务器了,输入ssh loginname@yourdomain.com,第一次登录会出现 71 | 72 | The authenticity of host 'yourdomain.com (xxx.xxx.xxx.xxx)' can't be established. 73 | RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. 74 | Are you sure you want to continue connecting (yes/no)? 75 | 76 | 这是因为你刚才把公钥删掉了,系统在连接本地没有缓存公钥的服务器时会询问下你,输入yes即可,然后你没输入密码就登入了服务器。怎么样,是不是很方便。 77 | 78 | -------------------------------------------------------------------------------- /Linux/检查远程端口.md: -------------------------------------------------------------------------------- 1 | #用telnet检查远程端口是否打开 2 | 3 | 在shell中输入: 4 | 5 | telnet <域名或者IP> <端口号> 6 | 7 | 端口号和域名之间为空格 8 | 9 | 如果能够打开,出现下面提示信息: 10 | 11 | Escape character is '^]'. 12 | 13 | 这说明端口打开了 14 | 15 | ctrl+]退出此地。 16 | 17 | ^] 18 | 19 | telnet> quit 20 | 21 | Connection closed. 22 | -------------------------------------------------------------------------------- /Linux/网站性能压力测试工具WebBench.md: -------------------------------------------------------------------------------- 1 | #网站性能压力测试工具WebBench 2 | 3 | Webbench是由[Lionbridge公司](http://www.lionbridge.com)开发,是知名的网站压力测试工具。 4 | 5 | ##在debian 上的安装方法: 6 | 7 | 在 http://home.tiscali.cz/~cz210552/webbench.html 找到最新版 8 | 9 | wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz 10 | 11 | tar zxvf webbench-1.5.tar.gz 12 | 13 | cd webbench-1.5 14 | 15 | make 16 | 17 | make install 18 | 19 | 如果make 时提示出错: 20 | 21 | ctags: not found 22 | 23 | 则安装它 24 | 25 | apt-get install ctags 26 | 27 | 测试格式: 28 | 29 | webbench -c 1000 -t 60 http://localhost/ 30 | 31 | webbench -c 并发数 -t 运行测试时间 URL 32 | 33 | -------------------------------------------------------------------------------- /Linux/通过ssh连接远程服务器.md: -------------------------------------------------------------------------------- 1 | #通过ssh连接远程服务器 2 | 3 | 注意:以下方法是在Ubuntu操作系统。 4 | 5 | 安装SSH:sudo apt-get install openssh-server 6 | 7 | 确认sshserver是否启动:ps -e |grep ssh 8 | 9 | 如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。 10 | 11 | ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务: 12 | 13 | sudo /etc/init.d/ssh restart 14 | 15 | ssh连接:ssh linuxidc(这里是远程服务器登录用户名)@192.168.1.1(这里是远程服务器IP) 16 | 17 | 然后根据提示输入密码。 18 | 19 | 以下方法也可以参考: 20 | 21 | 1. 启动ssh-server:$ /etc/init.d/ssh restart 22 | 23 | 2. 确认ssh-server已经正常工作。 24 | 25 | $ netstat -tlp 26 | 27 | tcp6 0 0 *:ssh *:* LISTEN - 28 | 29 | 看到上面这一行输出说明ssh-server已经在运行了。 30 | 31 | 3. 在客户端通过ssh登录服务器。假设服务器的IP地址是192.168.0.103,登录的用户名是hyx。 32 | 33 | $ ssh -l hyx 192.168.0.103 34 | 35 | 接下来会提示输入密码,然后就能成功登录到服务器上了 36 | 37 | -------------------------------------------------------------------------------- /Linux/通过配置host文件实现本地域名任意设置.md: -------------------------------------------------------------------------------- 1 | #通过配置host文件实现本地域名任意设置 2 | 3 | 在进行web开发的时候,通常需要以http://localhost或者127.0.0.1之类的访问本地环境的网站。但是,如果本地放的网站多了,不得不做别的操作,比如端口设置。结果不容易记住啦。 4 | 5 | 我在本地之用的是ubuntu+nginx环境,nginx允许设置多个域名,只需要分别指向不同的存储位置即可。那么,接下来就要如何设置一个自己选定的域名,同时这个域名只访问本地某个网站呢? 6 | 7 | 在windows中,有一个文件:system32/drivers/etc/host,在这个文件里,可以配置域名指向本地IP,从而实现上述目的。 8 | 9 | 在ubuntu里面(一般linux都如此),则是在/etc下查找hosts文件,这个就是相当于那个host文件一样的存在。如果没有的话,就自己新建一个。 10 | 11 | sudo vi /etc/hosts 12 | 13 | 添加你需要的项,格式如下: 14 | 15 | . 16 | 17 | 以下是我做的一些配置: 18 | 19 | 127.0.0.1 www.v.com #在我的计算机浏览器中输入www.v.com域名,就可以访问我本地指定的网站。当然仅限于本地。不了解内情的还以为我注册了www.v.com这个域名呢。 20 | 127.0.0.1 www.b2b.com 21 | 127.0.0.1 www.itdiffer.org 22 | 127.0.0.1 www.weixin.com 23 | 24 | 要注意的是,Nginx中,要做好conf配置,让这些域名有所访问的对象。 25 | -------------------------------------------------------------------------------- /Mysql/mysql-ERROT(28000)“Access denied for user 'root'@'localhost' .md: -------------------------------------------------------------------------------- 1 | #mysql登录报错“Access denied for user 'root'@'localhost' (using password: YES”的处理方法 2 | 3 | 这个问题常常出现在连接某些远程服务器,运行其mysql数据库的时候。 4 | 5 | 最近登录某台服务器的mysql时候总报错: 6 | 7 | Access[root@log01 ~]# mysql -u root -p 8 | Enter password: 9 | ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) denied for user 'root'@'localhost' (using password: NO) 10 | 11 | 我猜想是不是密码忘记了。。。然后准备修改密码: 12 | 13 | #mysqladmin -u root -p password 123456 ###设置root密码为123456 14 | Enter password: 15 | mysqladmin: connect to server at 'localhost' failed 16 | error: 'Access denied for user 'root'@'localhost' (using password: YES)' 17 | 18 | 依然报这个错误。。。蛋疼了,百度一下,最终找到了方法如下: 19 | 20 | ##方法一:(此方法我已经使用过,通过) 21 | 22 | # /etc/init.d/mysqld stop 23 | # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 24 | # mysql -u root mysql 25 | mysql> UPDATE user SET Password=PASSWORD(’newpassword’) where USER=’root’; 26 | mysql> FLUSH PRIVILEGES; 27 | mysql> quit 28 | # /etc/init.d/mysqld restart 29 | # mysql -uroot -p 30 | Enter password: <输入新设的密码newpassword> 31 | mysql> 32 | 33 | ##方法二: 34 | 35 | 直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码: 36 | 37 | # mysql -udebian-sys-maint -p 38 | Enter password: <输入[client]节的密码> 39 | mysql> UPDATE user SET Password=PASSWORD(’newpassword’) where USER=’root’; 40 | mysql> FLUSH PRIVILEGES; 41 | mysql> quit 42 | # mysql -uroot -p 43 | Enter password: <输入新设的密码newpassword> 44 | mysql> 45 | 46 | ##方法三: 47 | 48 | 这种方法我没有进行过测试,因为我的root用户默认密码已经被我修改过了,那位有空测试一下,把结果告诉我,谢谢! 49 | 50 | # mysql -uroot -p 51 | Enter password: <输入/etc/mysql/debian.cnf文件中[client]节提供的密码> 52 | 53 | 至此,困惑多时的问题解决了! 54 | 55 | 56 | 本文出自 “苦咖啡's运维之路” 博客,请务必保留此出处http://alsww.blog.51cto.com/2001924/1121676 57 | 58 | -------------------------------------------------------------------------------- /Mysql/关于设计表时应该注意的问题.md: -------------------------------------------------------------------------------- 1 | #关于设计表时应该注意的问题 2 | 3 | 如有错误欢迎大家指出。这段时间在家里,做了点修正。 4 | 5 | ##慎重选择表名 6 | 7 | 1. 按照多数开发语言的命名规则。比如(myCustomer)。 8 | 2. 按照多数开源思想命名规则。比如(my_customer)。 9 | 3. 按照咱们中国人的思想。比如(我的客户)。 10 | 11 | - 第一种有个缺点,很容易忘掉大写的字母。 12 | - 第二种则比较好,每个WORD间用下划线连接,避免遗忘。 13 | - 第三种建议不要用,虽然很好记。不觉得解析这个表的时候还需要编码转化吗?我个人理解,大家可以补充。 14 | 15 | ##关于编码的设定。 16 | 17 | - GBK/GB2312.(适用于纯中文存储)。 18 | - UTF8.(适用于中英文混合存储)。 19 | - LATIN1。(适用于纯英文存储)。 20 | - 其他的。 21 | 22 | ##关于表引擎的选择。 23 | 24 | - MYISAM.(很多人说她的表级锁定会带来好多问题,其实只要设计好对应的表以及写好对应的SQL查询就没有那么大的问题。) 25 | - INNODB. (如果要用到事务,选择她不会错。至于多数人讲的MASTER/SLAVE结构上用INNODB在MASTER的选择是否正确,就要看你怎么用了。不能一味的疯狂使用INNODB。除非你想要确保非常高可用性,) 26 | - CSV. (以前我写过文章,关于这个引擎。个人觉得最主要的是来存储少量数据以及从EXCEL到MYSQL的转换方面会很有用。当然只要涉及到规则数据的导入,她就可以办到。) 27 | - BLACKHOLE. (觉得最完美的用处在于MASETR/SLAVE上面,并且MASTER是一个临时的专门负责写的机器。不过缺点也很多,会与MYISAM或者INNODB或者其他的引擎有所冲突,这点自己要做个权衡)。 28 | - MEMORY. (应该说是MYISAM的兄弟了。不过在读内存总比读磁盘的速度要快。不过要注意,它不支持动态数据类型)。 29 | - FEDERATED. (典型的分布式引擎。我以前文章中有介绍。) 30 | - NDB。(网络版存储引擎。因为Replication 总是有延迟,所以如果系统容不得任何延迟,就用这个吧。) 31 | - FOLCON。(6.0后用来代替INNODB的引擎。) 32 | - 其他旧的以及新开发的引擎具体介绍:http://dev.mysql.com/doc/refman/6.0/en/storage-engines.html)。 33 | 34 | ##关于属性数据类型的选择。 35 | 36 | - INT(一个字节的TINYINT,两个字节的SMALLINT,三个字节的MEDIUMINT,四个字节的INT,8个字节的BIGINT。记住:UNSIGNED不管你定义或者不定义,都不影响内部的存储字节大小) 37 | - 少于10个字符用CHAR是在合适不过了。(不过要记住在MEMORY引擎里面会自动把VARCHAR转化为CHAR) 38 | - 我一般用DECIMAL或者NUMERIC来代替FLOAT 或者DOUBLE。因为老板要求精确的数字。如果不要求精确的,那就用FLOAT吧。速度快,占空间小。(DECIMA、FLOAT(P)是动态存储。比如 :D ECIMAL(10,2)占用5个字节。FLOAT占4个字节,) 39 | - BLOB,TEXT,VARCHAR(一般存放文章内容,特别是新闻网站。需要的字节数是所存储的字符长度+1。记住BLOB和VARCHAR是TEXT和CHAR的BINARY类型) 40 | - ENUM(在一定范围内绝佳的代替VARCHAR和CHAR的工具,因为她只占一到两个字节。) 41 | - 时间和日期类型(占3个字节的DATE,8个字节的DATETIME,4个字节的TIMESTAMP,3个字节的TIME,1个字节的YEAR。)。如果要存储比如‘1983’这样的年份,用YEAR明显比VARCHAR或者CHAR要节省空间。因为后者要占5个字节。 42 | - BOOLEAN(用来存储YES或者NO之类的值,占用一个字节。) 43 | - 关于自增字段。目前我们的项目中涉及到好多ORDER BY RAND()操作。此类语句在数据库并发大的时候会造成CPU严重阻塞,持续产生数据库死锁!解决此类问题最好的办法就是利用自增字段,用程序随即生成数字序列,或者在数据库端随即生成数字序列。 44 | - 关于ZEROFILL。非常好用的前置填补0的存储,而不是用用对应个数的空串来代替。在需要前置补零的操作中INT ZEROFILL可以用来代替CHAR或者VARCHR。 45 | 46 | ##关于默认值。 47 | 48 | - 在5.0之后,只要设定字段为NOT NULL,系统自动给出默认值。对应CHAR->’’,INT->0,BOOLEAN->0等等。 49 | - 在5.0之前的版本,需要手动指定默认值,否则会出现一定的异常。到时候查都不好查了。 50 | 51 | ##关于多数据库建立。 52 | 53 | - 应该把对应的业务放在各自不同的数据库里,而不是所有业务放到一个库里面。 54 | - 数据库的命名和表命名一样。 55 | 56 | ##关于索引。 57 | 58 | - 设计表初期尽量考虑到应该建立的索引。所有建立的索引一定要测试一下,看是否有必要,否则会翻倍的减少写数据的性能。 59 | - 对于只有存储0或者1的列,尽量干掉索引,单独分出两个表。一个代替0,另外一个代替1。或者在一个字段里面用EMUM或者CHAR(0)或者CHAR(1)来代替。 60 | - PS: 最后一个要值得注意的,就是尽量所有的字段用NOT NULL。虽然MYSQL可以对NULL列进行索引,不过我不建议。 61 | 62 | 来源:http://ourmysql.com/archives/373 63 | -------------------------------------------------------------------------------- /NLP/articles_online.md: -------------------------------------------------------------------------------- 1 | There are some articles or resources about NLP. 2 | 3 | - TextBlob:简单、Pythonic的文本分析工具 4 | 5 | TextBlob是一个支持Python2和Python3的用于进行文本数据处理的工具包。它提供了简单的API,用于一般自然语言处理(NLP),如:语音识别、名词短语提取、情感分析、翻译等功能。 6 | 7 | TextBlob is a Python (2 and 3) library for processing textual data. It provides a simple API for diving into common natural language processing (NLP) tasks such as part-of-speech tagging, noun phrase extraction, sentiment analysis, classification, translation, and more. 8 | 9 | ***NOTE:*** 10 | 11 | In this project, we can attempt splling correction. ***Word*** object have a `spellcheck()` method. `Word.spellcheck()` method returns a list of (word, confidence) tuples with splling suggestions. 12 | 13 | 项目主页:https://textblob.readthedocs.org/en/dev/ 14 | GitHub主页:https://github.com/sloria/TextBlob 15 | 16 | 17 | -------------------------------------------------------------------------------- /NLP/learn_nltk01.md: -------------------------------------------------------------------------------- 1 | www.nltk.org 2 | 3 | import nltk 4 | nltk.download() #download the book in nltk 5 | 6 | from nltk.book import * 7 | # there are some book, like : 8 | >>> from nltk.book import * 9 | *** Introductory Examples for the NLTK Book *** 10 | Loading text1, ..., text9 and sent1, ..., sent9 11 | Type the name of the text or sentence to view it. 12 | Type: 'texts()' or 'sents()' to list the materials. 13 | text1: Moby Dick by Herman Melville 1851 14 | text2: Sense and Sensibility by Jane Austen 1811 15 | text3: The Book of Genesis 16 | text4: Inaugural Address Corpus 17 | text5: Chat Corpus 18 | text6: Monty Python and the Holy Grail 19 | text7: Wall Street Journal 20 | text8: Personals Corpus 21 | text9: The Man Who Was Thursday by G . K . Chesterton 1908)') 22 | 23 | >>> text1.concordance("monstrous")) #查询文本中的词汇,并列出上下文 24 | 25 | ##问题 26 | 27 | >>> text1.similar("good")) 疑问:是不是查询出与good的上下文结构相似的词汇?即得到的词汇上下文和'good'相似。如果是这样,那么这里的上下文是按照什么标准定义为相似? 28 | 29 | >>> fdist1 = FreqDist(text1) #找出文本中最常见的50个词汇。结果是类似dict类型的数据. 我怀疑是默认列出前50个 30 | >>> fdist1 31 | FreqDist({u',': 18713, u'the': 13721, u'.': 6862, u'of': 6536, u'and': 6024, u'a': 4569, u'to': 4542, u';': 4072, u'in': 3916, u'that': 2982, ...}) 32 | 33 | >>> fdist1.hapaxes() #列出只出现一次的词汇 34 | 35 | nltk频率分布类中定义的函数 36 | 37 | |例子|描述| 38 | |---|-----| 39 | |fdist=FreqDist(samples)|创建包含给定样本的频率分布| 40 | |fdist.inc(sample)|增加样本| 41 | |fdist['monstrous']|给定样本出现的次数| 42 | |fdist.freq('monstrous')|给定样本的频率| 43 | |fdist.N()|样本总数| 44 | |fdist.keys()|以频率递减的样本list| 45 | |for sample in fdist:|以频率递减遍历样本| 46 | |fdist.max()|数值最大的样本| 47 | |fdist.tabulate()|绘制频率分布表| 48 | |fdist.plot()|绘制频率分布图| 49 | |fdist.plot(cumulative=Ture)|绘制累积频率分布图| 50 | |fdist1 < fdist2|测试样本在fdist1中出现的频率是否小于fdist2| 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /PHP/php5-fpm支持php程序.md: -------------------------------------------------------------------------------- 1 | #php5-fpm支持php程序 2 | 3 | 阿里云的云服务器,配置是512M内存. 4 | 5 | 原来已经通过cgi跑着一个python项目.后来又通过spawn-fcgi跑php项目. 6 | 7 | 结果是,cpu使用率达到了100%,系统直接挂了. 8 | 9 | 解决方案是:采用php5-fpm 10 | 11 | ##什么是php-fpm 12 | 13 | PHP-FPM是一个PHPFastCGI管理器,是只用于PHP的。 14 | 15 | 相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。 16 | 17 | PHP5.3.3已经集成php-fpm了,不再是第三方的包了。 18 | 19 | PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。 20 | 21 | ##操作 22 | 23 | 首先停止fastcgi进程 24 | 25 | 去掉spawn-fcgi开机启动: 26 | 27 | /usr/sbin/update-rc.d -f php-fastcgi remove 28 | 29 | 接着就可以开启(关闭、重启)php-fpm: 30 | 31 | 开启:/etc/init.d/php5-fpm start 32 | 33 | 关闭:/etc/init.d/php5-fpm stop 34 | 35 | 重启:/etc/init.d/php5-fpm restart 36 | 37 | 如果想php-fpm开机启动,可以执行者命令: 38 | 39 | /usr/sbin/update-rc.d php5-fpm defaults 40 | 41 | ##配置和说明 42 | 43 | 关于 php-fpm配置(配置默认放在/etc/php5/fpm/php-fpm.conf)的说明,网上很多,随意搜索即可. 44 | 45 | 特别说明的是,在php5的php-fpm.conf配置中,此文件夹中有pool.d子目录,php-fpm.conf是公共配置,如果对某一个服务有单独配置,可以到pool.d中进行. 46 | 47 | 此外,如果遇到在开启或者重启不成功的话,最可能的是此处的配置有错误. 48 | 49 | -------------------------------------------------------------------------------- /Pictures/10201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10201.png -------------------------------------------------------------------------------- /Pictures/10202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10202.png -------------------------------------------------------------------------------- /Pictures/10203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10203.png -------------------------------------------------------------------------------- /Pictures/10501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10501.png -------------------------------------------------------------------------------- /Pictures/10502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10502.png -------------------------------------------------------------------------------- /Pictures/10503.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10503.png -------------------------------------------------------------------------------- /Pictures/10504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10504.png -------------------------------------------------------------------------------- /Pictures/10505.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10505.png -------------------------------------------------------------------------------- /Pictures/10506.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10506.png -------------------------------------------------------------------------------- /Pictures/10507.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10507.png -------------------------------------------------------------------------------- /Pictures/10601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10601.png -------------------------------------------------------------------------------- /Pictures/10602.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/10602.png -------------------------------------------------------------------------------- /Pictures/11101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/11101.png -------------------------------------------------------------------------------- /Pictures/11201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/11201.png -------------------------------------------------------------------------------- /Pictures/11801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/11801.png -------------------------------------------------------------------------------- /Pictures/12401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12401.png -------------------------------------------------------------------------------- /Pictures/12402.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12402.png -------------------------------------------------------------------------------- /Pictures/12403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12403.png -------------------------------------------------------------------------------- /Pictures/12404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12404.png -------------------------------------------------------------------------------- /Pictures/12601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12601.png -------------------------------------------------------------------------------- /Pictures/12602.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12602.png -------------------------------------------------------------------------------- /Pictures/12603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12603.png -------------------------------------------------------------------------------- /Pictures/12801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12801.png -------------------------------------------------------------------------------- /Pictures/12802.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/12802.png -------------------------------------------------------------------------------- /Pictures/13001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/13001.png -------------------------------------------------------------------------------- /Pictures/13002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/13002.png -------------------------------------------------------------------------------- /Pictures/13003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/13003.png -------------------------------------------------------------------------------- /Pictures/203R52038-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/203R52038-1.gif -------------------------------------------------------------------------------- /Pictures/203R56302-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/203R56302-0.gif -------------------------------------------------------------------------------- /Pictures/20501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/20501.png -------------------------------------------------------------------------------- /Pictures/20601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/20601.png -------------------------------------------------------------------------------- /Pictures/21001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/21001.png -------------------------------------------------------------------------------- /Pictures/21101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/21101.png -------------------------------------------------------------------------------- /Pictures/21801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/21801.png -------------------------------------------------------------------------------- /Pictures/22001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22001.png -------------------------------------------------------------------------------- /Pictures/22101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22101.png -------------------------------------------------------------------------------- /Pictures/22102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22102.png -------------------------------------------------------------------------------- /Pictures/22201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22201.png -------------------------------------------------------------------------------- /Pictures/22301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22301.png -------------------------------------------------------------------------------- /Pictures/22401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22401.png -------------------------------------------------------------------------------- /Pictures/22402.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22402.png -------------------------------------------------------------------------------- /Pictures/22403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/22403.png -------------------------------------------------------------------------------- /Pictures/30101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30101.png -------------------------------------------------------------------------------- /Pictures/30701.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30701.png -------------------------------------------------------------------------------- /Pictures/30702.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30702.png -------------------------------------------------------------------------------- /Pictures/30801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30801.png -------------------------------------------------------------------------------- /Pictures/30901.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30901.png -------------------------------------------------------------------------------- /Pictures/30902.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30902.png -------------------------------------------------------------------------------- /Pictures/30903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30903.png -------------------------------------------------------------------------------- /Pictures/30904.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30904.png -------------------------------------------------------------------------------- /Pictures/30905.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30905.png -------------------------------------------------------------------------------- /Pictures/30906.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30906.png -------------------------------------------------------------------------------- /Pictures/30907.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30907.png -------------------------------------------------------------------------------- /Pictures/30908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/30908.png -------------------------------------------------------------------------------- /Pictures/31101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31101.png -------------------------------------------------------------------------------- /Pictures/31102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31102.png -------------------------------------------------------------------------------- /Pictures/31103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31103.png -------------------------------------------------------------------------------- /Pictures/31201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31201.png -------------------------------------------------------------------------------- /Pictures/31202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31202.png -------------------------------------------------------------------------------- /Pictures/31203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31203.png -------------------------------------------------------------------------------- /Pictures/31301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31301.png -------------------------------------------------------------------------------- /Pictures/31302.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31302.png -------------------------------------------------------------------------------- /Pictures/31401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31401.png -------------------------------------------------------------------------------- /Pictures/31402.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31402.png -------------------------------------------------------------------------------- /Pictures/31403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31403.png -------------------------------------------------------------------------------- /Pictures/31404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/31404.png -------------------------------------------------------------------------------- /Pictures/git001.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git001.jpeg -------------------------------------------------------------------------------- /Pictures/git002.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git002.jpeg -------------------------------------------------------------------------------- /Pictures/git003.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git003.jpeg -------------------------------------------------------------------------------- /Pictures/git004.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git004.jpeg -------------------------------------------------------------------------------- /Pictures/git005.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git005.jpeg -------------------------------------------------------------------------------- /Pictures/git006.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git006.jpeg -------------------------------------------------------------------------------- /Pictures/git007.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git007.jpeg -------------------------------------------------------------------------------- /Pictures/git008.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git008.jpeg -------------------------------------------------------------------------------- /Pictures/git009.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/git009.jpeg -------------------------------------------------------------------------------- /Pictures/hands.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/hands.jpg -------------------------------------------------------------------------------- /Pictures/python1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/python1.png -------------------------------------------------------------------------------- /Pictures/python2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/python2.png -------------------------------------------------------------------------------- /Pictures/pythonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/pythonlogo.png -------------------------------------------------------------------------------- /Pictures/reading01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/reading01.jpg -------------------------------------------------------------------------------- /Pictures/reading02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Pictures/reading02.png -------------------------------------------------------------------------------- /PyRead/base.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/PyRead/base.md -------------------------------------------------------------------------------- /PyRead/module.md: -------------------------------------------------------------------------------- 1 | #Python网络文摘--模块篇 2 | 3 | - [Overview of Python Visualization Tools](http://pbpython.com/visualization-tools-1.html) 4 | -------------------------------------------------------------------------------- /PyRead/practice.md: -------------------------------------------------------------------------------- 1 | #Python网络文摘--实践篇 2 | 3 | - [用Python在地图上模拟疫情扩散](http://python.jobbole.com/80938/) 4 | -------------------------------------------------------------------------------- /Python/Collection小技巧.md: -------------------------------------------------------------------------------- 1 | #Python Collection 小技巧 2 | 3 | 独立软件开发者 Alex Marandon 在他的博客中介绍了数个关于 Python Collection 的实用小技巧,在此与诸位分享。 4 | 5 | ##判断一个 list 是否为空 6 | 7 | 传统的方式: 8 | 9 | if len(mylist): 10 | # Do something with my list 11 | else: 12 | # The list is empty 13 | 14 | 由于一个空 list 本身等同于 False,所以可以直接: 15 | 16 | if mylist: 17 | # Do something with my list 18 | else: 19 | # The list is empty 20 | 21 | ##遍历 list 的同时获取索引 22 | 23 | 传统的方式: 24 | 25 | i = 0 26 | for element in mylist: 27 | # Do something with i and element 28 | i += 1 29 | 30 | 这样更简洁些: 31 | 32 | for i, element in enumerate(mylist): 33 | # Do something with i and element 34 | pass 35 | 36 | ##list 排序 37 | 38 | 在包含某元素的列表中依据某个属性排序是一个很常见的操作。例如这里我们先创建一个包含 person 的 list: 39 | 40 | class Person(object): 41 | def __init__(self, age): 42 | self.age = age 43 | 44 | persons = [Person(age) for age in (14, 78, 42)] 45 | 46 | 传统的方式是: 47 | 48 | def get_sort_key(element): 49 | return element.age 50 | 51 | for element in sorted(persons, key=get_sort_key): 52 | print "Age:", element.age 53 | 54 | 更加简洁、可读性更好的方法是使用 Python 标准库中的 operator 模块: 55 | 56 | from operator import attrgetter 57 | 58 | for element in sorted(persons, key=attrgetter('age')): 59 | print "Age:", element.age 60 | 61 | attrgetter 方法优先返回读取的属性值作为参数传递给 sorted 方法。operator 模块还包括 itemgetter 和 methodcaller 方法,作用如其字面含义。 62 | 63 | ##在 Dictionary 中元素分组 64 | 65 | 和上面类似,先创建 Persons: 66 | 67 | class Person(object): 68 | def __init__(self, age): 69 | self.age = age 70 | 71 | persons = [Person(age) for age in (78, 14, 78, 42, 14)] 72 | 73 | 如果现在我们要按照年龄分组的话,一种方法是使用 in 操作符: 74 | 75 | persons_by_age = {} 76 | 77 | for person in persons: 78 | age = person.age 79 | if age in persons_by_age: 80 | persons_by_age[age].append(person) 81 | else: 82 | persons_by_age[age] = [person] 83 | 84 | assert len(persons_by_age[78]) == 2 85 | 86 | 相比较之下,使用 collections 模块中 defaultdict 方法的途径可读性更好: 87 | 88 | from collections import defaultdict 89 | 90 | persons_by_age = defaultdict(list) 91 | 92 | for person in persons: 93 | persons_by_age[person.age].append(person) 94 | 95 | defaultdict 将会利用接受的参数为每个不存在的 key 创建对应的值,这里我们传递的是 list,所以它将为每个 key 创建一个 list 类型的值。 96 | 97 | 内容来源:AlexMarandon.com 98 | 99 | -------------------------------------------------------------------------------- /Python/Python中的除法.md: -------------------------------------------------------------------------------- 1 | #Python中的除法 2 | 3 | Python中分为3种除法:传统除法、精确除法、地板除。 4 | 5 | ##传统除法 6 | 7 | 如果是整数除法则执行地板除,如果是浮点数除法则执行精确除法。 8 | 9 | >>>1/2 10 | 0 11 | >>>1.0/2.0 12 | 0.5 13 | 14 | ##精确除法 15 | 16 | 除法总是会返回真实的商,不管操作数是整形还是浮点型。执行from __future__ import division 指令就可以做到这一点。 17 | 18 | >>>from __future__ import division #如果在代码中,这个必须置于第一行 19 | >>>1/2 20 | 0.5 21 | >>>1.0/2.0 22 | 0.5 23 | 24 | ##地板除 25 | 26 | 从Python2.2开始,增加了一个操作符 // ,以执行地板除://除法不管操作数为何种数值类型,总是会舍去小数部分,返回数字序列中比真正的商小的最接近的数字。 27 | 28 | >>>1//2 29 | 0 30 | >>>1.0//2 31 | 0 32 | >>>-1//2.0 33 | -1 34 | 35 | ##内建函数divmod() 36 | 37 | divmod (a,b),返回(a//b,a%b) 38 | 39 | >>>divmod(1,2) 40 | (0,1) 41 | >>>divmod(3.14159,1.5) 42 | (2.0,0.4159000000000002) 43 | >>>5+6j//3+2j 44 | 2+0j 45 | >>>5+6j%3+2j 46 | -1+2j 47 | >>>divmod(5+6j,3+2j) 48 | ((2+0j),(-1+2j)) 49 | 50 | -------------------------------------------------------------------------------- /Python/Python优秀技术网站.md: -------------------------------------------------------------------------------- 1 | #Python优秀技术网站 2 | 3 | ###Python Programming:以Python为专题的博客。 4 | 5 | (英文地址)http://jeffknupp.com/ 6 | 7 | ###Linux 下 Nginx+tornado+supervisor通过反向代理实现负载... 8 | 9 | (中文地址)http://www.pythonfan.org/thread-717-1-1.html 10 | 11 | ###Centos搭建Python+Nginx+Tornado+Mysql环境 12 | 13 | (中文地址)http://www.centoscn.com/CentosServer/www/2013/0817/1310.html 14 | 15 | ###使用Tornado+Nginx部署Django的一种尝试 16 | 17 | (中文地址)http://fendou.org/post/2012/06/01/tornad-nginx-django/ 18 | 19 | -------------------------------------------------------------------------------- /Python/Python现在成为美国名校中最流行的编程入门语言.md: -------------------------------------------------------------------------------- 1 | #Python现在成为美国名校中最流行的编程入门语言 2 | 3 | ##摘要 4 | 5 | 在成文之时(2014年7月),Python是美国名校中最流行的计算机编程入门语言,高校排名前10名中的8个,前39名中的24个学校的计算机科学入门课程都选择了Python。 6 | 7 | ##成文动机 8 | 9 | Python在编程新手中变得越来越流行。3年前,Mark Guzdial贴出一篇博文,讨论了Python在教育领域呈现的上升态势,并预测了未来的编程教学语言。现在, MIT、UC Berkeley、MOOC(edX, Coursera和Udacity)都提供了Python语言的编程入门课程。一些子领域的教授也在倡导将Python作为初学者的入门语言。我开发的Online Python Tutor也验证了这一点。 10 | 11 | 因为没有明确的报告阐明Python在名校中的现状,所以,我做了一些调查,与此同时,也汇总了其他教学语言的流行情况。 12 | 13 | 为什么要分析这个现状?因为编程语言的选择反映了学校的教育哲学,同时也会影响学生对计算机科学的第一印象,与此同时,名校对编程语言的选择也会对其余学校产生影响。 14 | 15 | ##方法 16 | 17 | 我选择了前39所学校,每所学校,我调查了CS、CSE或者EECS专业的CS0和CS1的课程,我将CS1定义为CS专业的基础课程,CS0为非主修计算机专业或者是在CS1之前需要打基础的学生开设的入门课,这里不包括小课、选修课、或者是其他专业提供的编程课,在结果中,我将CS1和CS0合并在了一起。 18 | 19 | ##调查结果 20 | 21 | 结果如图表所示,纵坐标之和是超过39的,因为有些学校既提供了CS0,也提供了CS1。 22 | 23 | ![](http://cacm.acm.org/system/assets/0001/6451/Top39-700.2.png) 24 | 25 | ##结果讨论 26 | 27 | 虽然我是一个Python的推动者,我还是要客观给出调查结果。 28 | 29 | Python稍稍领先Java,Java在大学先修课程(Advanced Placement Computer Science)中仍然在使用。在科学家和工程师的编程入门中,Matlab优先考虑。C++、C被逐渐替代。基于Scheme的语言只是在计算机语言研修学者中使用,在调查的39所学校中,只有3所学校使用。Scratch是K-12教育中的主角,还没有到大学的层面。 30 | 31 | 当然还有三种类型的编程语言是图表中没有涉及的,因为在统计结果中很少有学校将它们作为编程入门语言,它们是:静态函数语言(Haskell和OCaml等)、动态函数语言(JavaScript, Ruby以及PHP等)、广泛使用的开发语言(Objective-C等)。 32 | 33 | var:http://top.jobbole.com/5028/ 34 | -------------------------------------------------------------------------------- /Python/Python的中文显示方法.md: -------------------------------------------------------------------------------- 1 | #Python2.x的中文显示方法 2 | 3 | python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错 4 | 5 | UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128), 6 | 7 | python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式。 8 | 9 | 查询系统默认编码可以在解释器中输入以下命令: Python代码 10 | 11 | >>>sys.getdefaultencoding() 12 | 13 | 设置默认编码时使用: Python代码 14 | 15 | >>>sys.setdefaultencoding('utf8') 16 | 17 | 可能会报 18 | 19 | AttributeError: 'module' object has no attribute 'setdefaultencoding' 20 | 21 | 的错误,执行reload(sys),在执行以上命令就可以顺利通过。 22 | 23 | 此时在执行sys.getdefaultencoding()就会发现编码已经被设置为utf8的了,但是在解释器里修改的编码只能保证当次有效,在重启解释器后,会发现,编码又被重置为默认的ascii了,那么有没有办法一次性修改程序或系统的默认编码呢。 24 | 25 | ###有2种方法设置python的默认编码: 26 | 27 | 一个解决的方案在程序中加入以下代码: Python代码 28 | 29 | import sys 30 | reload(sys) 31 | sys.setdefaultencoding('utf8') 32 | 33 | 另一个方案是在/usr/local/lib/python.27/site-packages或者/usr/lib/python2.7下新建一个sitecustomize.py,内容为: Python代码, 34 | 两个路径的原因是因为系统不同的原因,debian和ubuntu存放的目录是后者,其他没有测试。 35 | 36 | # encoding=utf8 37 | 38 | import sys 39 | reload(sys) 40 | sys.setdefaultencoding('utf8') 41 | 42 | 重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。 43 | 44 | 还有一种解决方案是在程序中所有涉及到编码的地方,强制编码为utf8,即添加代码encode("utf8"),这种方法并不推荐使用,因为一旦少写一个地方,将会导致大量的错误报告. 45 | 46 | 来源:http://blog.sina.com.cn/s/blog_6b1ed4fb01019d4n.html 47 | 来源:http://blog.sina.com.cn/s/blog_494e45fe0102e3p9.html 48 | -------------------------------------------------------------------------------- /Python/Reverse Polish Notation.md: -------------------------------------------------------------------------------- 1 | ##Description 2 | 3 | 标准的表达式如"A+B",在数学上学名叫中缀表达式(Infix Notation),原因是运算符号在两个运算对象的中间。相对应的还有前缀表达式(Prefix Notation),如:"+ - A * B C D",转换成中缀表达式为:"A - B * C + D";后缀表达式(Postfix Notation),比如前所述的中缀表达式转换为后缀表达式为:"A B C * - D +"。为了纪念波兰数学家鲁卡谢维奇(Jan Lukasiewicz),前缀表达式被称作波兰表达式,后缀表达式称为逆波兰表达式(Reverse Polish Notation)。 4 | 后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。 5 | 6 | 后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。 7 | 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。 8 | 9 | 事实上,人的思维方式很容易固定~~!正如习惯拉10进制。就对2,3,4,8,16等进制不知所措一样~~!人们习惯的运算方式是中缀表达式。而碰到前缀,后缀方式。。迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我这里教你一种也许你老师都没跟你讲的简单转换方式一个中缀式到其他式子的转换方法~~这里我给出一个中缀表达式~a+b*c-(d+e) 10 | 11 | 第一步:按照运算符的优先级对所有的运算单位加括号,式子变成:((a+(b*c))-(d+e)) 12 | 13 | 第二步:转换中缀与后缀表达式. 14 | 15 | - 后缀:把运算符号移动到对应的括号后面 16 | - 则变成:((a(bc)*)+(de)+)- 17 | - 把括号去掉:abc*+de+- 后缀式子出现 18 | 19 | 发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。 20 | 21 | 现在,你需要用计算机来实现这一过程,怎么样,是否有兴趣一试呢?如果答案是肯定的话,Let‘s go! 22 | 23 | ##Input 24 | 25 | 按照人们日常的输入习惯,请输入一个带浮点型带括号的中缀表达式(不需要添加等号)。 26 | 27 | 输入的算式可以包含整数,小数,+,-,*,/,(,)这几种类型, 28 | 29 | 当然,为了体现和谐社会的客观要求及人文关怀,你可以假设这个算式的总字符长度小于100字节。 30 | 31 | ##Output 32 | 33 | 输出与此中缀表达式对应的逆波兰表达式,为了区分数字,请将数字与数字或字符与字符以空格隔开。 34 | 35 | 最后一个字符后不需要添加空格,各组测试数据之间请用空行隔开。(输出到文件尾) 36 | 37 | ##Sample Input 38 | 39 | 1.5+2.5*3-(4+5) 40 | 41 | 1*(2+3)/4 42 | 43 | ##Sample Output 44 | 45 | 1.5 2.5 3 * + 4 5 + - 46 | 47 | [来源](http://puppypuppy2005.blog.163.com/blog/static/5204815620107523258709/) 48 | 49 | -------------------------------------------------------------------------------- /Python/Unicode应用注意事项.md: -------------------------------------------------------------------------------- 1 | #Unicode 应用注意事项 2 | 3 | 遵守以下的规则, 处理 Unicode 就是这么简单: 4 | 5 | 1、程序中出现字符串时一定要加个前缀 u. 6 | 7 | 2、不要用 str()函数,用 unicode()代替. 不要用过时的 string 模块 -- 如果传给它的是非 ASCII 字符,它会把一切搞砸。 8 | 9 | 3、不到必须时不要在你的程序里面编解码 Unicod 字符.只在你要写入文件或数据库或者网络时, 才调用 encode()函数;相应地, 只在你需要把数据读回来的时候才调用 decode() 函数. 10 | 11 | 这些规则可以规避 90%由于 Unicode 字符串处理引起的 bug.现在的问题是剩下的 10%的问题却让你处理不了,幸亏 Python 提供了大量的模块、库来替你处理这些问题.它们可以让你用 10 行 Python 语句写出其他语言需要 100 行语句才能完成的功能,但是相应地,对 Unicode 支 持的质量也完全取决于这些模块、库. 12 | 13 | Python 标准库里面的绝大部分模块都是兼容 Unicode 的.除了 pickle 模块! pickle 模块只 支持 ASCII 字符串。如果你把一个 Unicode 字符串交给 pickle 模块来 unpickle,它会报异常. 你必须先把你的字符串转换成 ASCII 字符串才可以.所以最好是避免基于文本的 pickle 操作. 幸运地是现在二进制格式已经作为 pickle 的默认格式了,pickle 的二进制格式支持不错.这点 在你向数据库里面存东西是尤为突出, 把它们作为 BLOB 字段存储而不是作为 TEXT 或者 VARCHAR 字段存储要好很多.万一有人把你的字段改成了 Unicode 类型,这可以避免 pickle 的崩溃. 14 | 15 | -------------------------------------------------------------------------------- /Python/collections_Counter.md: -------------------------------------------------------------------------------- 1 | #collections中的Counter计数器 2 | 3 | python模块collections提供了内置容器类型dict,list,set,tuple更专业的容器数据类型。 4 | 5 | ##Counter计数器 6 | 7 | 计数器(Counter)是一个容器,用来跟踪值出现了多少次。 8 | 9 | 计数器支持三种形式的初始化。构造函数可以调用序列,包含key和计数的字典,或使用关键词参数。 10 | 11 | >>> import collections 12 | >>> print collections.Counter(['a','b','c','a','b','b']) 13 | Counter({'b': 3, 'a': 2, 'c': 1}) 14 | >>> print collections.Counter({'a':2,'b':3,'c':1}) 15 | Counter({'b': 3, 'a': 2, 'c': 1}) 16 | >>> print collections.Counter(a=2,b=3,c=1) 17 | Counter({'b': 3, 'a': 2, 'c': 1}) 18 | 19 | 注意key的出现顺序是根据计数的从大到小 20 | 21 | 也可以创建空的计数器,在update: 22 | 23 | >>> c=collections.Counter() #创建空计数器 24 | >>> print 'Initial:',c 25 | Initial: Counter() 26 | 27 | >>> c.update("abcdaab") #update 28 | >>> print 'Sequence:',c 29 | Sequence: Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1}) 30 | 31 | >>> c.update({'a':1,'d':5}) 32 | >>> print 'Dict:',c 33 | Dict: Counter({'d': 6, 'a': 4, 'b': 2, 'c': 1}) 34 | 35 | >>> d=collections.Counter("abbccdde") 36 | >>> d 37 | Counter({'c': 2, 'b': 2, 'd': 2, 'a': 1, 'e': 1}) 38 | 39 | 访问计数: 40 | 41 | >>> d=collections.Counter("abbccdde") 42 | >>> d 43 | Counter({'c': 2, 'b': 2, 'd': 2, 'a': 1, 'e': 1}) 44 | >>> for letter in 'abcde': 45 | ... print '%s:%d'%(letter,d[letter]) 46 | ... 47 | a:1 48 | b:2 49 | c:2 50 | d:2 51 | e:1 52 | 53 | elements可以列出所有的元素 54 | 55 | >>> m = collections.Counter('helloworld') 56 | >>> m 57 | Counter({'l': 3, 'o': 2, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1}) 58 | #上面的dict中'e':1 59 | 60 | >>> m['e'] = 0 #将这个值设置为0 61 | >>> m 62 | Counter({'l': 3, 'o': 2, 'd': 1, 'h': 1, 'r': 1, 'w': 1, 'e': 0}) 63 | #从新按照值的大小排序 64 | 65 | >>> print list(m.elements()) 66 | ['d', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w'] #0个e,不显示. 67 | 68 | most_common([n]),列出最常出现的。例如: 69 | 70 | >>> Counter('abracadabra').most_common(3) #最常出现的前三个 71 | [('a', 5), ('r', 2), ('b', 2)] 72 | 73 | 其它关于collections.Counter()的内容,请阅读[官方文档](https://docs.python.org/2/library/collections.html#collections.Counter) 74 | -------------------------------------------------------------------------------- /Python/dict字典遍历方法.md: -------------------------------------------------------------------------------- 1 | #dict字典遍历方法 2 | 3 | ##python dict遍历: 4 | 5 | 1、 for in 6 | 7 | 2、 items 8 | 9 | 3、 iteritems 10 | 11 | ##举例: 12 | 13 | >>> dict={"name":"python","english":33,"math":35} 14 | >>> dict 15 | {'name': 'python', 'math': 35, 'english': 33} 16 | >>> for i in dict: 17 | ... print "dict[%s]"%i,dict[i] 18 | ... 19 | 20 | dict[name] python 21 | dict[math] 35 22 | dict[english] 33 23 | 24 | >>> for i in dict: 25 | ... print dict[i] 26 | ... 27 | python 28 | 35 29 | 33 30 | 31 | >>> for (k,v) in dict.items(): 32 | ... print "dict[%s]="%k,v 33 | ... 34 | dict[name]= python 35 | dict[math]= 35 36 | dict[english]= 33 37 | 38 | 39 | >>> for (k,v) in dict.items(): 40 | ... print k,v 41 | ... 42 | name python 43 | math 35 44 | english 33 45 | 46 | 47 | >>> for k,v in dict.iteritems(): 48 | ... print "dict[%s]="%k,v 49 | ... 50 | dict[name]= python 51 | dict[math]= 35 52 | dict[english]= 33 53 | 54 | -------------------------------------------------------------------------------- /Python/md5和sha1加密.md: -------------------------------------------------------------------------------- 1 | #md5和sha1加密 2 | 3 | python提供了一个进行hash加密的模块:hashlib 4 | 5 | hashlib的官方介绍地址:http://docs.python.org/2/library/hashlib.html,当然是洋文的,下面理解来自于官网和自己的使用经验。 6 | 7 | 在应用中,常用的是md5加密和sha1加密(注意,是数字1,不是字母l,这类命名,应该最大限度避免。) 8 | 9 | ##md5 10 | 11 | md5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前md5是一种不可逆算法。 具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。 12 | 13 | ##sha1 14 | 15 | sha1的全称是Secure Hash Algorithm(安全哈希算法) 。SHA1基于MD5,加密后的数据长度更长, 它对长度小于264的输入,产生长度为160bit的散列值。比md5多32位。 因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢了。 16 | 17 | ##Python中的用法 18 | 19 | Python 内置的 hashlib 模块就包括了 md5 和 sha1 算法。使用方法: 20 | 21 | ###以MD5为例: 22 | 23 | import hashlib 24 | 25 | data = 'This a md5 test!' 26 | 27 | hash_md5 = hashlib.md5(data) 28 | 29 | hash_md5.hexdigest() 30 | 31 | 输出: 32 | 33 | '0a2c0b988863f08471067903d8737962' 34 | 35 | 上面这段字符串就是 data 转换后的MD5值。 36 | 37 | MD5的用途: 38 | 39 | - 加密网站注册用户的密码。 40 | - 网站用户上传图片 / 文件后,计算出MD5值作为文件名。(MD5可以保证唯一性) 41 | - key-value数据库中使用MD5值作为key。 42 | - 比较两个文件是否相同。(大家在下载一些资源的时候,就会发现网站提供了MD5值,就是用来检测文件是否被篡改) 43 | …… 44 | 45 | ###sha1的使用 46 | 47 | 与MD5类似: 48 | 49 | import hashlib 50 | hashlib.sha1('This is a sha1 test!').hexdigest() 51 | 52 | ###处理大文件 53 | 54 | 上面说过可以用MD5来检测两个文件是否相同,但想想,如果是两个很大的文件,担心内存不够用,这时怎么办? 这就要使用 update 方法了。 55 | 56 | 代码如下: 57 | 58 | import hashlib 59 | def get_file_md5(f): 60 | m = hashlib.md5() 61 | while True: 62 | data = f.read(10240) 63 | if not data: 64 | break 65 | m.update(data) 66 | return m.hexdigest() 67 | 68 | with open(YOUR_FILE, 'r') as f: 69 | file_md5 = get_file_md5(f) 70 | 71 | (windows 用户 要使用 'rb'方式打开文件) 72 | 73 | 可以用下面这段代码验证一下: 74 | 75 | import hashlib 76 | 77 | x = hashlib.md5() 78 | x.update('hello, ') 79 | x.update('python') 80 | x.hexdigest() 81 | 82 | hashlib.md5('hello, python').hexdigest() 83 | 84 | 这两次的输出是一样的。 SHA1 也是一样的用法。 85 | 86 | 参考:http://www.cnblogs.com/the4king/archive/2012/02/06/2340660.html 87 | 88 | -------------------------------------------------------------------------------- /Python/os模块.md: -------------------------------------------------------------------------------- 1 | #Python os模块 常用功能小结 2 | 3 | os 模块提供了一个统一的操作系统接口函数, 这些接口函数通常是平台指定的,os 模块能在不同操作系统平台如 nt 或 posix中的特定函数间自动切换,从而能实现跨平台操作。 4 | 5 | - os.name: 字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。 6 | - os.stat(file):文件属性操作; 7 | - os.getcwd():得到当前工作目录,即当前Python脚本工作的目录路径; 8 | - os.getdir():获取当前目录; 9 | - os.getenv()和os.putenv():分别用来读取和设置环境变量; 10 | - os.listdir():返回指定目录下的所有文件和目录名; 11 | - os.makedirs(dirname)和os.removedirs(dirname):分别生成和删除目录,makedirs可以生成多层递归目录,removedirs可以删除多层递归的空目录,若目录中有文件则无法删除; 12 | - os.remove():删除一个文件; 13 | - os.rename(file,back):给文件重命名; 14 | - os.system():运行shell命令; 15 | - os.linesep:字符串给出当前平台使用的终止符,例如:Windows使用’\r\n’,Linux使用’\n’; 16 | 17 | ##os.path模块 18 | 19 | - os.path.split():返回一个路径的目录名和文件名; 20 | - os.path.isfile()和os.path.isidr():分别检验给出的路径是一个文件还是目录; 21 | - os.path.existe():检验给出的路径是否真的存在 22 | - os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false; 23 | - os.path.isfile(name):判断name是不是一个文件,不存在name也返回false; 24 | - os.path.exists(name):判断是否存在文件或目录name; 25 | - os.path.getsize(name):获得文件大小,如果name是目录返回0L; 26 | - os.path.abspath(name):获得绝对路径; 27 | - os.path.normpath(path):规范path字符串形式; 28 | - os.path.split(name):分割文件名与目录; 29 | - os.path.splitext():分离文件名与扩展名; 30 | - os.path.join(path,name):连接目录与文件名或目录 31 | - os.path.basename(path):返回文件名; 32 | - os.path.dirname(path):返回文件路径; 33 | 34 | -------------------------------------------------------------------------------- /Python/python中dict的sorted排序.md: -------------------------------------------------------------------------------- 1 | #python中dict的sorted排序 2 | 3 | 我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value。可是有时我们需要对dictionary中的item进行排序输出,可能根据key,也可能根据value来排。到底有多少种方法可以实现对dictionary的内容进行排序输出呢?下面摘取了一些精彩的解决办法。 4 | 5 | ##按key排序 6 | 7 | ###最简单的方法,这个是按照key值排序: 8 | 9 | def sortedDictValues1(adict): 10 | items = adict.items() 11 | items.sort() 12 | return [value for key, value in items] 13 | 14 | ###又一个按照key值排序,貌似比上一个速度要快点 15 | 16 | def sortedDictValues2(adict): 17 | keys = adict.keys() 18 | keys.sort() 19 | return [dict[key] for key in keys] 20 | 21 | ###还是按key值排序,据说更快。。。而且当key为tuple的时候照样适用 22 | 23 | def sortedDictValues3(adict): 24 | keys = adict.keys() 25 | keys.sort() 26 | return map(adict.get, keys) 27 | 28 | ###一行语句搞定: 29 | 30 | [(k,di[k]) for k in sorted(di.keys())] 31 | 32 | ##按value排序 33 | 34 | ###根据value排序的,先把item的key和value交换位置放入一个list中,再根据list每个元素的第一个值,即原来的value值,排序: 35 | 36 | def sort_by_value(d): 37 | items=d.items() 38 | backitems=[[v[1],v[0]] for v in items] 39 | backitems.sort() 40 | return [ backitems[i][1] for i in range(0,len(backitems))] 41 | 42 | ###还是一行搞定: 43 | 44 | [ v for v in sorted(d.values())] 45 | 46 | ###用lambda表达式来排序,更灵活: 47 | 48 | sorted(d.items(), lambda x, y: cmp(x[1], y[1])) 49 | 50 | 或反序: 51 | 52 | sorted(d.items(), lambda x, y: cmp(x[1], y[1]), reverse=True) 53 | 54 | ##用sorted函数的key=参数 55 | 56 | ###按照key进行排序 57 | 58 | print sorted(dict1.items(), key=lambda d: d[0]) 59 | 60 | ###按照value进行排序 61 | 62 | print sorted(dict1.items(), key=lambda d: d[1]) 63 | 64 | 下面给出python内置sorted函数的帮助文档: 65 | 66 | sorted(...) 67 | 68 | sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list 69 | 70 | 看了上面这么多种对dictionary排序的方法,其实它们的核心思想都一样,即把dictionary中的元素分离出来放到一个list中,对list排序,从而间接实现对dictionary的排序。这个“元素”可以是key,value或者item。 71 | 72 | var http://hi.baidu.com/jackleehit/blog/item/53da32a72207bafa9052eea1.html 73 | 74 | -------------------------------------------------------------------------------- /Python/python之UTF-8解决方案.md: -------------------------------------------------------------------------------- 1 | #python之UTF-8解决方案 2 | 3 | 答案1:使用Python3 4 | 5 | 直到目前,还更多使用python2.7的。看下面答案: 6 | 7 | # -*- coding: utf8 -*- 8 | # 及早将一切转到UTF-8 9 | unicode_str = unicode('中文', encoding='utf-8') 10 | # 打印或者写入前用UTF-8编码 11 | print unicode_str.encode('utf-8') 12 | # 用codecs.open替换open 13 | import codecs 14 | codecs.open('filename', encoding='utf8') 15 | 16 | -------------------------------------------------------------------------------- /Python/python连接mysql.md: -------------------------------------------------------------------------------- 1 | #python连接mysql 2 | 3 | 尽量不用框架内的数据库连接方式。特别是在tornado中,我提倡用python通过MySQLdb连接mysql数据库。虽然在tornado2.4有tornado.database,在tornado3.0有torndb。但是,为了性能,还是不推荐用这些。 4 | 5 | 做为程序员,必须写SQL语句,除非不用。 6 | 7 | ##下载安装MySQLdb 8 | 9 | MySQLdb模块是python连接mysql数据库的一个模块,在操作mysql数据库是经常使用。 10 | 11 | windows下略,只提供linux方式。 12 | 13 | **方法一:** 14 | 15 | 下载地址:http://sourceforge.net/projects/mysql-python/ 16 | 17 | 先安装setuptools, 18 | 19 | 然后在下载文件目录下,修改mysite.cfg,指定本地mysql的mysql-config文件的路径 20 | 21 | 这里有更多的内容,包括源码和安装文档:https://github.com/farcepest/MySQLdb1 22 | 23 | **方法二:针对ubuntu操作系统** 24 | 25 | 前提:已经在Ubuntu下安装了easy_install,若没有,可以执行命令: 26 | 27 | sudo apt-get install python-setuptools python-dev build-essential 28 | 29 | 安装完成以后,就可以利用easyinstall 安装需要的模块。 30 | 31 | 安装MySQLdb: 32 | 33 | sudo easy_install mysql-python 34 | 35 | 有可能报错,曾遇到一种错误提示: 36 | 37 | "the required version of distribute(>=0.6.28) is not available" 38 | 39 | 这是要安装 libmysqld-dev,安装方法: 40 | 41 | sudo apt-get install libmysqld-dev 42 | 43 | 再安装mysql-python,OK。 44 | 45 | ##数据库的连接 46 | 47 | 用下面的方法连接数据库: 48 | 49 | import MySQLdb 50 | 51 | conn=MySQLdb.connect(host="localhost",user="root",passwd="111111",db="yeashape",charset="utf8") 52 | 53 | #yeahape是数据库名称 54 | 55 | connect函数的参数详解:(一般情况下用默认值,不用修改,即可省略) 56 | 57 | - host,连接的数据库服务器主机名,默认为本地主机(localhost)。 58 | - user,连接数据库的用户名,默认为当前用户。 59 | - passwd,连接密码,没有默认值。 60 | - db,连接的数据库名,没有默认值。 61 | - conv,将文字映射到Python类型的字典。默认为MySQLdb.converters.conversions 62 | - cursorclass,cursor()使用的种类,默认值为MySQLdb.cursors.Cursor。 63 | - compress,启用协议压缩功能。 64 | - named_pipe,在windows中,与一个命名管道相连接。 65 | - init_command,一旦连接建立,就为数据库服务器指定一条语句来运行。 66 | - read_default_file,使用指定的MySQL配置文件。 67 | - read_default_group,读取的默认组。 68 | - unix_socket,在unix中,连接使用的套接字,默认使用TCP。 69 | - port,指定数据库服务器的连接端口,默认是3306 70 | 71 | ##其它连接对象的方法 72 | 73 | - 连接对象的db.close()方法可关闭数据库连接,并释放相关资源。 74 | - 连接对象的db.cursor([cursorClass])方法返回一个指针对象,用于访问和操作数据库中的数据。 75 | - 连接对象的db.begin()方法用于开始一个事务,如果数据库的AUTOCOMMIT已经开启就关闭它,直到事务调用commit()和rollback()结束。 76 | - 连接对象的db.commit()和db.rollback()方法分别表示事务提交和回退。 77 | - 指针对象的cursor.close()方法关闭指针并释放相关资源。 78 | - 指针对象的cursor.execute(query[,parameters])方法执行数据库查询。 79 | - 指针对象的cursor.fetchall()可取出指针结果集中的所有行,返回的结果集一个元组(tuples)。 80 | - 指针对象的cursor.fetchmany([size=cursor.arraysize])从查询结果集中取出多行,我们可利用可选的参数指定取出的行数。 81 | - 指针对象的cursor.fetchone()从查询结果集中返回下一行。 82 | - 指针对象的cursor.arraysize属性指定由cursor.fetchmany()方法返回行的数目,影响fetchall()的性能,默认值为1。 83 | - 指针对象的cursor.rowcount属性指出上次查询或更新所发生行数。-1表示还没开始查询或没有查询到数据。 84 | 85 | -------------------------------------------------------------------------------- /Python/random随机数生成.md: -------------------------------------------------------------------------------- 1 | #random随机数生成 2 | 3 | ##random.random 4 | 5 | random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 6 | 7 | ##random.uniform 8 | 9 | random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: b <= n <= a。如果 a >>import time 4 | 5 | >>>this_time=time.localtime() 6 | >>> this_time 7 | time.struct_time(tm_year=2013, tm_mon=6, tm_mday=6, tm_hour=13, tm_min=42, tm_sec=38, tm_wday=3, tm_yday=157, tm_isdst=0) 8 | >>> type(this_time) 9 | 10 | 11 | >>> this_year=this_time[0] 12 | >>> this_year 13 | 2013 14 | >>> for time in this_time: 15 | ... print time 16 | ... 17 | 2013 18 | 6 19 | 6 20 | 13 21 | 42 22 | 38 23 | 3 24 | 157 25 | 0 26 | 27 | ##取过去具体时间的方法: 28 | 29 | import time 30 | 31 | #取一天前的当前具体时间 32 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()-24*60*60)) 33 | 34 | #取20天前的当前具体时间 35 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()-20*24*60*60)) 36 | 37 | #取20天前当前具体时间的前2小时 38 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()-20*24*60*60-2*60*60)) 39 | 40 | ##取将来具体时间的方法: 41 | 42 | import time 43 | 44 | #取一天后的当前具体时间 45 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()+24*60*60)) 46 | 47 | #取20天后的当前具体时间 48 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()+20*24*60*60)) 49 | 50 | #取20天后当前具体时间的前2小时 51 | time.strftime('%Y-%m-%d %T',time.localtime(time.time()+20*24*60*60-2*60*60)) 52 | 53 | ##只取某个时间单位过去、未来具体值 54 | 55 | import time 56 | 57 | #取上一月月份 58 | time.localtime()[1]-1 59 | 60 | #取去年年份 61 | time.localtime()[0]-1 62 | 63 | #取两个月后的月份 64 | time.localtime()[1]+2 65 | -------------------------------------------------------------------------------- /Python/随机函数random.md: -------------------------------------------------------------------------------- 1 | #随机函数random 2 | 3 | 随机整数: 4 | 5 | >>> import random 6 | >>> random.randint(0,99) 7 | 21 8 | 9 | 随机选取0到100间的偶数: 10 | 11 | >>> import random 12 | >>> random.randrange(0, 101, 2) 13 | 42 14 | 15 | 随机浮点数: 16 | 17 | >>> import random 18 | >>> random.random() 19 | 0.85415370477785668 20 | >>> random.uniform(1, 10) 21 | 5.4221167969800881 22 | 23 | 随机字符: 24 | 25 | >>> import random 26 | >>> random.choice('abcdefg&#%^*f') 27 | 'd' 28 | 29 | 多个字符中选取特定数量的字符: 30 | 31 | >>> import random 32 | random.sample('abcdefghij',3) 33 | ['a', 'd', 'b'] 34 | 35 | 多个字符中选取特定数量的字符组成新字符串: 36 | 37 | >>> import random 38 | >>> import string 39 | >>> string.join(random.sample(['a','b','c','d','e','f','g','h','i','j'], 3)).r 40 | eplace(" ","") 41 | 'fih' 42 | 43 | 随机选取字符串: 44 | 45 | >>> import random 46 | >>> random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] ) 47 | 'lemon' 48 | 49 | 洗牌: 50 | 51 | >>> import random 52 | >>> items = [1, 2, 3, 4, 5, 6] 53 | >>> random.shuffle(items) 54 | >>> items 55 | [3, 2, 5, 6, 4, 1] 56 | 57 | random的函数还有很多,此处不一一列举。 58 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #老齐的技术资料 2 | 3 | 这里汇集了我个人撰写以及网上搜集的有关技术文章,原本放到自己的网站和有关博客上,但是由于种种原因,不得不放到这里,感觉更方便。 4 | 5 | ##有关联系方法: 6 | 7 | - 邮箱:qiwsir(at)gmail.com 8 | - QQ群:26913719 9 | - 微博:http://weibo.com/qiwsir 10 | 11 | -------------------------------------------------------------------------------- /Reading/为什么我反对环保主义.md: -------------------------------------------------------------------------------- 1 | 作者:李子暘 2 | 3 | 首先提醒环保主义者一个事实:如果一个人声称他想要保护环境,这并不等于他的主张就能保护环境。同样,另一个人没有这样说,也不等于他就是一个极端自私的破坏环境者。考察一个政策的全部后果——而不是这个政策想要达到的后果——这正是社会科学的任务之一。 4 | 5 | 在环保这个问题上,我的基本意见是:如果有完善的市场体制,环保基本上不会是一个问题。因此,解决环保问题的关键在于完善市场体制。靠环保主义者主张的那样,由政府大力干预,或像在家修行的弟子们主张的那样,存天理、灭人欲都不可能解决环保问题。这两种主张基本上都是破坏市场体制的。 6 | 7 | 我举一个极端的例子,齐白石的绘画是不是污染?是,因为他老人家弄脏了原来干净的纸。不过,这张纸被弄脏的损失远远小于得到一张齐白石画的收益,所以,几乎没有人认为这是污染。如果荣宝斋的纸被一个笨蛋涂鸦,想来荣宝斋是一定要索取赔偿的。但荣宝斋会向齐白石索取赔偿吗?天方夜谭。 8 | 9 | 所以,污染的含义不是弄脏、破坏、喧嚣,而是损失大于受益。 10 | 11 | 没有不带来污染的行为,呼吸、写作、听音乐都必然带来污染。 12 | 13 | 因为由荣宝斋在,所以那里的纸不会被人随便涂鸦,只会被特定的人做特定的污染(买纸的人绘画)。后一种污染的收益要大得多。好像没有人提出要画家尽可能少画,以减轻污染。环保分子会提出这种要求吗?应该也不会。 14 | 15 | 用经济学的术语来说,绘画的成本是内在的,完全由买纸者来承担。这时,即使污染再严重(画得再多),也不构成什么问题。没人会感觉不满。 16 | 17 | 但有时,这种成本会不再全是内在的,会发生外溢,结果,行为实施者只承担一部分成本,这样一来,原来的平衡就会被打破,在新的成本结构中,行为实施者制造的污染会超过收益,但并没有超过他自己的收益,因为一部分成本外溢了,被其他人承担了。他负担的成本减少了。 18 | 19 | 何时会出现这种情况?荣宝斋的纸成为公有的时候。 20 | 21 | 蒙古草原就是公有的。结果大家就尽可能的放牧。因为牧场损失的成本是大家承担的,而放牧的收益却只归牧民自己。假如牧场的损失和放牧的收益都归牧民自己,牧民还会过度放牧吗? 22 | 23 | 假如是自己买的纸,会在上面随便乱画吗?不会。 24 | 25 | 牧民也不会在自己的牧场过度放牧。 26 | 27 | 环境保护问题就是这样不会成为一个问题。 28 | 29 | 需要人们尽可能少画画吗?不需要。需要牧民降低需求、少生子女、尽可能少放牧吗?不需要。需要的只是产权明晰。 30 | 31 | 环保主义为何往往提出相反的主张? 32 | 33 | 他们想把本不可调和的东西硬调和在一起——公有制和个人负责。 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Reading/人生有何意义.md: -------------------------------------------------------------------------------- 1 | 人生有何意义? 2 | 3 | **作者:胡适** 4 | 5 | 答某君书 6 | 7 | ……我细读来书,终觉得你不免作茧自缚。你自己去寻出一个本不成问题的问题,“人生有何意义?”其实这个问题是容易解答的。人生的意义全是各人自己寻出来、造出来的:高尚、卑劣、清贵、污浊、有用、无用,……全靠自己的作为。 8 | 9 | 生命本身不过是一件生物学的事实,有什么意义可说?一个人与一只猎,一只狗,有什么分别?人生的意义不在于何以有生,而在自己怎样生活。你若情愿把这六尺之躯葬送在白昼作梦之上二那就是你这一生的意义。你若发愤振作起来,决心去寻求生命的意义,去创造自己的生命的意义,那么,你活一日便有一日的意义,作一事便添一事的意义,生命无穷,生命的意义也无穷了。 10 | 11 | 总之,生命本没有意义,你要能给他什么意义,他就有什么意义。与其终日冥想人生有何意义,不如试用此生作点有意义的事…… 12 | 13 | 为人写扇子的话: 14 | 15 | 知世如梦无所求,无所求心普空寂。 16 | 还似梦中随梦境,成就河沙梦功德。 17 | 18 | 王荆公小诗一首,真是有得于佛法的话。认得人生如梦,故无所求。但无所求不是无为。 19 | 20 | 人生固然不过一梦,但一生只有这一场做梦的机会,岂可不努力做一个轰轰烈烈像个样子的梦?岂可糊糊涂涂懵懵懂懂混过这几十年吗? 21 | -------------------------------------------------------------------------------- /Reading/你还赖床吗.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Reading/历史教科书欺骗了我们.md: -------------------------------------------------------------------------------- 1 | #历史教科书欺骗了我们 2 | 3 | 六十年过去了,有几个中国人知道同盟国二次大战中国战区最高司令是蒋中正。 4 | 5 | 六十年过去了,有几个中国人知道在内战中“恶贯满盈”的“中美合作所”在抗战中是盟军重要的情报机关。 6 | 7 | 六十年过去了,有几个中国人知道在影视作品中恶贯满盈的张灵甫是抗战英雄。在武汉会战中,他率领敢死队包抄小道,夜夺张古峰,为国军成功阻击日军立下汗马功劳,张灵甫还为抗战伤了一条腿。 8 | 9 | 六十年过去了,有几个中国人知道抗战中唯一全歼日本师团的战役-万家岭大捷。有几个中国人知道歼敌13万人的三次长沙会战。 10 | 11 | 六十年过去了,有几个中国人知道抗战中被日本人认为仅有的两次中国军队的勇猛程度要超过自己的战役之一的桂林保卫战(另一次为昆仑关战役日军第5师团被中央军第5军击败)。 12 | 13 | 六十年过去了,有几个中国人知道随枣会战中士兵以血肉之躯与敌人坦克相搏斗,官兵竟攀登敌人的坦克之上,以手榴弹向车里投掷,作战之勇敢与牺牲之壮烈,笔难尽述。 14 | 15 | 六十年过去了,有几个中国人知道抗战期间战线最长的会战-武汉会战。有几个中国人知道在武汉曾经上演了一场规模仅次于英德伦敦空战的武汉空战,有几个中国人知道宋美龄女士为鼓舞官兵士气五次赶赴武汉前线差点被日本人炸死。 16 | 17 | 六十年过去了,有几个中国人发出过这样的疑问:55年授衔的共和国将帅们都少有抗战的经历,而国民党高级将领几乎个个与小日本干过。 18 | 19 | 六十年过去了,在大陆的主流媒体和教科书上没有把抗日战争的所有战役完整的介绍过一次,甚至连起码的大事记也没有。 20 | 21 | 六十年过去了,有几个中国人看过日本的投降书?难道就是因为上面写着大日本皇军向国民政府投降向蒋委员长投降之类的字眼? 22 | 23 | 六十年过去了,蒋介石动用70万国军发动了淞沪会战。在会战中,国军空军炸毁日本海军陆战队司令部,炸沉日本海军第3舰队旗舰,国军陆军为补充战损而五次发布动员令,超过半数的团职以上高级将领以身殉国。淞沪会战未能阻止日军占领上海,却改变了日军在中国战场的战略部署,还为上海资本向西转移赢得三个月时间。 24 | 25 | 六十年过去了,有几个中国人知道最让外国人刮目相看的不是新四军,而是孙立人的新一军。新一军远征缅甸,以伤亡1.7万人的代价击毙击伤日军10.9万人。在新一军攻占缅甸重镇于邦的时候,下属向孙立人询问如何处理日军战俘,孙将军的回答是:你去问问那些狗杂种,都谁到过中国,到过中国的就地枪毙,以后都这样办。 26 | 27 | 六十年过去了,有几个中国人知道八路军在平型关大捷中消灭的只是一支日军运输队,而平型关大捷只是平型关战役的一部分,平型关战役又是太原会战的一部分。 28 | 29 | 六十年过去了,有几个中国人知道李向阳和他的游击队是虚构的,真正让日军闻风丧胆的军队是国军的委员长卫队。这支军队使用德军的装备,甚至有德军教官亲手指导。在南京雨花台,委员长卫队的两个营独自阻击日军一个甲种师团(在第二次世界大战中,日军一共只有六个甲种师团),平均每个士兵要坚守25米长的阵地,面对50名日军精锐部队的士兵,但胜利者依然是中国人。 30 | 31 | 六十年过去了,有几个中国人知道在常德保卫战中,74军57师的8000名官兵阻击10万日军15天之久,最后只有200人能够战斗。师长发出了74军57师最后一封电报:弹尽,援绝,人无,城已破。职率副师长、师附、政治部主任、参谋部主任死守中央银行,各团长划分区域,扼守一屋,作最后抵抗,誓死为止,并祝胜利。 32 | 33 | 六十年过去了,有几个中国人知道在武汉上空爆发过持续时间仅次于不列颠空战的武汉空战。那场空战中,国军空军击落日军飞机78架,炸沉日军舰艇23艘。那个时候,每当防空警报响起,很多武汉市民不是钻进防空洞,而是爬上房顶,为的是能看到日军飞机被击落的场景。 34 | 35 | 六十年过去了,有几个中国人知道在重庆有17家军工厂在敌机轰炸下坚持24小时不间断生产。以金陵军工厂为例,抗战期间共生产迫击炮7000门、重机枪1.8万挺、步枪28万支、手榴弹30万枚、炸药包20万个。 36 | 37 | 六十多年过去了,有几个中国人知道日军投降书是什么样子。为什么某个政府只宣传9.18日军侵华而不宣传8.15日军投降,不让国民看看日军投降书?难道仅仅是因为文中多次出现:日本陆海空军及其辅助部队向蒋委员长投降。或者是因为受降落款是:中国战区最高统帅特级上将蒋中正特派代表陆军一级上将何应钦。 38 | 39 | 要知道,伟大的中国卫国战争是世界四大反法西斯战争之一!它不是用游击战、麻雀战、地道战、地雷战就能打赢的。它是用重兵集团与敌人浴血奋战才打赢的!战争期间,国军陆军有3211418名官兵壮烈牺牲,其中包括8名上将,41名中将,71名少将。国军空军有6164名飞行员血洒长空,2468架战机被击落。国军海军全军复没,所有舰艇全部打光。 40 | -------------------------------------------------------------------------------- /Reading/小蚂蚱和小蜻蜓.txt: -------------------------------------------------------------------------------- 1 | 小蚂蚱和小蜻蜓 2 | 3 | 作者:郑渊洁 4 | 5 | 一只小蚂蚱和一只小蜻蜓栖息在田间同一片庄稼叶上。 6 | 7 | “别看咱们躺在一起,其实咱俩不一样。”小蜻蜓说。 8 | 9 | “哪不一样?”小蚂蚱问。 10 | 11 | “我是益虫,你是害虫。”   12 | 13 | “谁定的?”   14 | 15 | “人”   16 | 17 | “为什么?”   18 | 19 | “我吃蚊子。你吃庄稼。”   20 | 21 | “为什么吃蚊子就是益虫吃庄稼就是害虫?”  22 | 23 | “蚊子吃人血。人吃庄稼。”  24 | 25 | “这个世界是围着人转的?”  26 | 27 | “是。”   28 | 29 | “我觉得不是。不信咱们问问上帝?”  30 | 31 | “问吧。”   32 | 33 | 小蚂蚱拿出手机给上帝打电话。上帝答复它说地球是大家的,是属于所有生命的。 34 | 35 | “怎么样?”小蚂蚱问小蜻蜓。 36 | 37 | “这……”   38 | 39 | “我现在宣布,人是害虫。”  40 | 41 | “为什么?”   42 | 43 | “人和我们蚂蚱抢庄稼吃。”  44 | 45 | “!”   46 | 47 | “你也是害虫。”   48 | 49 | “为什么?”   50 | 51 | “你帮人,帮害虫的东西当然是害虫。”  52 | 53 | “这……” 54 | 55 | “依我看,在这个世界上,所有生命对别的生命来说都是害虫。” 56 | 57 | “照这么说,地球上没有益虫了?” 58 | 59 | “地球上的所有生命在上帝那儿都是益虫。” 60 | 61 | 休息够了,蜻蜓继续吃蚊子,蚂蚱继续吃庄稼。 62 | 63 | -------------------------------------------------------------------------------- /Reading/恨恨而死.md: -------------------------------------------------------------------------------- 1 | 作者:鲁迅 2 | 3 | 古来很有几位恨恨而死的人物。他们一面说些“怀才不遇”“天道宁论”的话,一面有钱的便狂嫖滥赌,没钱的便喝几十碗酒,——因为不平的缘故,于是后来就恨恨而死了。 4 | 5 | 我们应该趁他们活着的时候问他:诸公!您知道北京离昆仑山几里,弱水去黄河几丈么?火药除了做鞭爆,罗盘除了看风水,还有什么用处么?棉花是红的还是白的?谷子是长在树上,还是长在草上?桑间濮上如何情形,自由恋爱怎样态度?您在半夜里可忽然觉得有些羞,清早上可居然有点悔么?四斤的担,您能挑么?三里的道,您能跑么? 6 | 7 | 他们如果细细的想,慢慢的悔了,这便很有些希望。万一越发不平,越发愤怒,那便“爱莫能助”。——于是他们终于恨恨而死了。 8 | 9 | 中国现在的人心中,不平和愤恨的分子太多了。不平还是改造的引线,但必须先改造了自己,再改造社会,改造世界;万不可单是不平。至于愤恨,却几乎全无用处。 10 | 11 | 愤恨只是恨恨而死的根苗,古人有过许多,我们不要蹈他们的覆辙。 12 | 13 | 我们更不要借了“天下无公理,无人道”这些话,遮盖自暴自弃的行为,自称“恨人”,一副恨恨而死的脸孔,其实并不恨恨而死。 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Reading/柔弱的人.txt: -------------------------------------------------------------------------------- 1 | 柔弱的人 2 | 3 | 作者:安东·契诃夫 4 | 5 | 前几天,我曾把孩子的家庭教师尤丽娅·瓦西里耶夫娜请到我的办公室。需要结算一下工钱。 6 | 7 | 我对她说:“请坐,尤丽娅·瓦西里耶夫娜!让我们算算工钱吧。您也许要钱用,你太拘泥于礼节,自己是不肯开口的……呶……我们和你讲妥,每月三十卢布……” 8 | 9 | “四十卢布……” 10 | 11 | “不,三十……我这里有记载,我一向按三十付教师的工资的……呶,您呆了两个月……” 12 | 13 | “整两月……我这里是这样记的,这就是说,应付您六十卢布……扣除九个星期日……实际上星期日您是不和柯里雅搞学习的,只不过游玩……还有三个节日……” 14 | 15 | 尤丽娅·瓦西里耶夫娜骤然涨红了脸,牵动着衣襟,但一语不发…… 16 | 17 | “三个节日一并扣除,应扣十二卢布……柯里雅有病四天没学习……您只和瓦里雅一人学习……您牙疼三天,我内人准你午饭后歇假……十二加七得十九……扣除……还剩……嗯……四十一卢布。对吧?” 18 | 19 | 尤丽娅·瓦西里耶夫娜左眼发红,并且眼眶湿润,下巴颤抖。她神经质地咳嗽起来擤了擤鼻涕,但——一语不发! 20 | 21 | “新年底,您打碎了一个带底碟的配套茶杯。扣除两卢布……按理茶杯的价钱还要高,它是传家之宝……上帝保佑您,我们的财产到处丢失!而后哪,由于您的疏忽,柯里雅爬树撕破礼服……扣除十卢布……女仆盗走了瓦里雅皮鞋一双,也是出于您的玩忽职守,您应对一切负责,您是拿工资的嘛,所以,也就是说,再扣除五卢布……一月九日您从我这里支取了九卢布……” 22 | 23 | “我没支过!”尤丽娅·瓦西里耶夫娜嗫嚅着。 24 | 25 | “呶……那就算这样,也行。” 26 | 27 | “四十一减二十七净得十四。” 28 | 29 | 两眼充满泪水,长而修美的小鼻子渗着汗珠,令人怜悯的小姑娘啊! 30 | 31 | 她用颤抖的声音说道:“有一次我只从您夫人那里支取了三卢布……再没有支取过……” 32 | 33 | “是吗?这么说,我这里漏记了!从十四卢布里再扣除……呐,这是您的钱,最可爱的姑娘!三卢布……三卢布……又三卢布……一卢布再加一卢布……请收下吧!” 34 | 35 | 我把十一卢布递给她……她接过去。喃喃地说: 36 | 37 | “merci(法语:谢谢)。” 38 | 39 | 我一跃而起,开始在屋内踱来踱去。憎恶使我不安起来。 40 | 41 | “为什么‘谢谢’?”我问。 42 | 43 | “为了给钱……” 44 | 45 | “可是我洗劫了您,鬼晓得,这是抢劫!实际上我偷了您的钱!为什么还说‘谢谢’!” 46 | 47 | “在别处,根本一文不给。” 48 | 49 | “不给?无怪啦!我和您开个玩笑,对您的教训是太残酷了……我要把您应得的八十卢布如数付给您!呐,事先已给您装好在信封里了!可是何至于这样怏怏不快呢?为什么不抗议?为什么沉默不语?难道生在这个世界口笨嘴拙行吗?难道可以这样软弱吗?” 50 | 51 | 她苦笑了一下,而我却从她脸上的神态看出了答案,这就是“可以”。 52 | 53 | 我请她对我的残酷教训给予宽恕,跟着把使她大为惊疑的八十卢布递给了她,她羞羞地过了一下数就走出去了…… 54 | 55 | 我看着她的背影,悟想到: 56 | 57 | “在这个世界上做个有权势的强者,原来如此轻而易举!” 58 | -------------------------------------------------------------------------------- /Reading/番茄时间管理法.md: -------------------------------------------------------------------------------- 1 | 如果你经常读一些关于提高工作效率或时间管理类的博客,一定听说过番茄时间管理法(Pomodoro Technique)。这是一种极好的帮助你集中注意力、获得更高工作效率的方法。 2 | 3 | 基本上,它的实施方法是这样的: 4 | 5 | >1. 确定你想要做什么(例如:翻译一篇外文)。 6 | >2. 设定一个25分钟的定时器。 7 | >3. 工作,直到定时器时间到:这就是一个“番茄钟”。 8 | >4. 休息5分钟,继续下一个番茄钟 9 | >5. 每4个番茄钟做一次长时间的休息。 10 | 11 | (有很多像Tomato Timer这样的应用都是为这种时间管理方法设计的。) 12 | 13 | 大多数人都会对其做一些细微调整来适应自己:例如,你可以选择每两个番茄钟——而不是四个,做一次长时间的休息。这特别是你刚开始应用这种方法时。 14 | 15 | ##为什么这种方法会有效## 16 | 17 | 你是否曾计划要在办公桌前坐两个小时来写一篇博客,结果却发现自己一会儿整理桌面,一会儿浏览微薄,不断的被一些有趣的链接分心,或就在那儿浪费时间? 18 | 19 | 按时间段工作能帮助你保持工作状态。当有分心的事情出现——例如“我需要发一个email”或“我想看看微薄上有没有人回复我”——你可以这样告诉自己:这个番茄钟完成之后再做这些事情。 20 | 21 | 如果你在写博客,将写放在一个番茄钟、修改放在另一个番茄钟,你会发现这个方法十分的有效,如果一个番茄钟写不完,在加一个番茄钟,看看你能完成多少。 22 | 23 | ##番茄时间管理方法的名称来历## 24 | 25 | 如果你是第一次听说“番茄时间管理法(Pomodoro Technique)”,你会奇怪它为什么叫这个名称。Pomodoro就是意大利语里的“番茄”。Francesco Cirillo——番茄时间管理法的发明人——使用的就是一个形状像番茄的定时钟。 26 | 27 | 关于番茄时间管理法的用法有很多,主要都是用它来防止干扰的:如果你试过这种方法,并发现它真的能提供你的工作效率,那就也做一些研究,丰富它,扩展它。 28 | 29 | 挑战:今天就尝试一下番茄时间管理法——或下一次你写博客时,看看你能做到何种程度。在下面的评论里告诉大家你的体验。 30 | -------------------------------------------------------------------------------- /Reading/程序员的学习和积累.md: -------------------------------------------------------------------------------- 1 | 程序员的学习和积累 2 | 3 | 对于一个程序员来说,学习的重要性相信大家都能意识得到。如何才能有效地学习,高效地学习?探讨下这个问题,我认为很有必要。 4 | 5 | 每个人学习的方法和习惯可能都不尽相同,很多人习惯了在学校的学习方式,特别是很多刚出校门的人。在他们潜意识中,学习只是应付考试的一种手段,考完就一切OK了,全部还给老师了也无所谓,反正考完之后下次不会再考这么课程了(大学尤其如此)。长期的应试教育会让很多人以考试的心态来对待学习,我也是受害者之一,翻翻我硬盘中散落的各种语言编写的"hello world",各种半成品,它们就像一张张60分、80分的试卷悄无声息地躺在某个昏暗的角落里。 6 | 7 | 职业生涯的学习一个最大的特点是具有持续性,你需要在某个知识或技能上花费你大部分精力。这时候,应付考试的学习方法已经不再有效了,而知识积累显得尤为重要。如果没有积累,所有的学习的成果都是一张60分的试卷。当你下次使用所学知识的时候,你手头有的就只有那张60分的试卷,你的学习将重新从0开始,由于时间关系或其他原因,你这方面的学习可能在你达到可以考60分的水平时又戛然而止,当你后面又需要使用时,又从0开始学习...如此循环往复,一定时期内,你的水平将永远停留在0-60分中间。 8 | 9 | 职业生涯学习的另一个特点是,你有机会去教。**“The best method to learn is to teach”,**你可以将你的所学通过各种形式的分享传授给他人。通过教的方式你不仅能够巩固你所学的知识,更能够推销自己、结交志同道合的朋友。 10 | 11 | 那么,基于职业生涯学习的特点,应该养成哪些好习惯呢,本人愚见,提出几点: 12 | 13 | #积累: 14 | 15 | 1、使用note。比如evernote,one note(个人推荐神器evernote)。作为一名程序员,如果你不使用note的话,显然你已经out了。你可以使用note来在任意时间记录你的想法、学习笔记、分享、待办事项等等任意你想记录的。 16 | 17 | 2、经营好你自己的资产。你的作品、代码、idea、你搜集到的资料都是你的资产。对其进行分门别类,同步到网络硬盘(注意信息安全)、多备份都是很好的选择。 18 | 19 | #分享: 20 | 21 | 1、将自己的知识总结成ppt、写出demo。要养成这种意识,当你形成ppt、demo的过程中,你将站在更高的层次去看待你学过的知识、加深你的理解。当然,如果有机会一定要去讲,不管是何种级别的分享,哪怕是自己给自己讲或是讲给自己身边的朋友。 22 | 23 | 2、写技术博客。博客有很多种,对博客的定位,决定你写什么样的博文。如果你的博文每篇都作为一个研究课题来写,我相信你打造一个精品博客一定是早晚的事情。当然我们可能没有要求这么高,那么博客也可以当note来使用(记录你每天的所学所想),这样可能有好心的人会指出你博文中的错误,和你探讨相关的技术等等。 24 | 25 | 最后想谈下自己对技术书籍、博客订阅和技术社区、QQ群一些看法。现在社会的信息非常大,你可以通过很多渠道获得你想要的信息。但是,问题是信息的质量良莠不齐、信息量巨大,如果每天都把时间花在自己熟悉的信息上、每天都参与各种无意义的讨论(如语言之间的优劣),那么反而学不到东西还会把自己弄得心烦意乱。 26 | 27 | **技术书籍:**技术书籍应该是最严肃的获取信息方式,你可以通过对优秀技术书籍的研读、思考(特别注意思考这个词),形成你知识的框架,这应该是一个稳固的结构。 28 | 29 | **技术博客和社区:**这里是指订阅业界的博客,参与相关博客社区的技术交流。订阅业界、牛人的博客是获得最新、最前沿的知识和技术的方式,应该每隔一定时间段(如每天、每周2次等)研读这些文章、做好笔记。 30 | 31 | **QQ群(或其他即时通讯群组):**即时通讯是最直接的技术交流工具。通过这种工具交流技术、扩大职业圈子是一个很好的选择。但是鉴于目前,很多技术群很少谈论技术、或技术含量较低等情况,建议加入后仔细甄别,不要因为大量垃圾信息浪费宝贵的时间。 32 | 33 | 来源:http://www.kuqin.com/pragmatic/20111128/315535.html 34 | -------------------------------------------------------------------------------- /Reading/腐败代码的警告.md: -------------------------------------------------------------------------------- 1 | #腐败代码的警告 2 | 3 | 如果在代码中,存在下面的情况之一者,则说明代码需要清除腐败。 4 | 5 | 1、代码中存在许多大型的类和复杂的函数 6 | 7 | 2、函数的名称很晦涩或者会误导人。如果函数名称没有良好地反应函数的用途,那么会造成惊人的副作用。 8 | 9 | 3、没有任何结构:应该在哪里找某个功能非常不清晰。 10 | 11 | 4、内容重复:有许多相互独立的代码在做着同一件事情。 12 | 13 | 5、高耦合性:复杂的模块相互连接和依赖关系,将意味着某个地方的小小改动就会影响整个代码,甚至会影响看起来不相关的模块。 14 | 15 | 6、当数据流过系统时,它将在各个表示方法之间转化。 16 | 17 | 7、API变得模糊不清。由于考虑不周,增加了新功能,曾经整洁的接口现在在范围上变得宽泛。 18 | 19 | 8、API在不同代码版本中快速地变换。 20 | 21 | 9、公共API中泄露了部分私有实现,以便可以进行别的快速的修改。 22 | 23 | 10、代码中到处都是权宜之计:治标不治本的修改。它们隐藏了真正的问题。系统的外围尽是这种修改,结果导致缺陷隐藏在系统的核心。 24 | 25 | 11、有些函数的参数太多。这些函数有许多并不使用的参数,而只是将他们传递给下一级函数调用。 26 | 27 | 12、你发现代码太可怕了,以至于你都不想去修改它。你不知道它是会改善的,还是会轻微地破坏它,或是它更糟糕。 28 | 29 | 13、添加新功能时没有提供任何支持文档:现有的文档过时了。 30 | 31 | 14、你发现有的注释说:“不要动这段代码......” 32 | 33 | -------------------------------------------------------------------------------- /Tornado/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Tornado/001.jpg -------------------------------------------------------------------------------- /Tornado/002.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Tornado/002.gif -------------------------------------------------------------------------------- /Tornado/003.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiwsir/ITArticles/d4684cd186c3f0a6e5c3ea9345e6698594c6b2c1/Tornado/003.gif -------------------------------------------------------------------------------- /Tornado/Tornado安装.md: -------------------------------------------------------------------------------- 1 | #tornado安装 2 | 3 | Tornado,中文含义是龙卷风,但是这里不是谈论这种自然现象了。当然是软件。 4 | 5 | 根据维基百科中文的介绍: 6 | 7 | Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使用,被Facebook收购以后框架以开源软件形式开放给大众。 8 | 9 | 它的性能怎么呢? 10 | 11 | 在维基百科上有人做了比较: 12 | 13 | Tornado有着优异的性能。它试图解决C10k问题,即处理大于或等于一万的并发,下表是和一些其他Web框架与服务器的对比: 14 | 处理器为 AMD Opteron, 主频2.4GHz, 4核服务 15 | 16 | | |部署 |请求/每秒| 17 | |---------|:-------------:|--------:| 18 | Tornado |nginx,4进程 |8213 | 19 | |Tornado |1个单线程进程 |3353 | 20 | |Django |Apache/mod_wsgi|2223 | 21 | |web.py |Apache/mod_wsgi|2066 | 22 | |CherryPy |独立 |785 | 23 | 24 | 这就足够促使我喜欢这个框架了,更何况,据说它跟所钟爱的web.py还有很多近似。 25 | 26 | 于是就开始安装: 27 | 28 | 登录官方网站:http://www.tornadoweb.org/ 29 | 30 | 下载安装包,目前是tornado-3.2,到官方网站下载。 31 | 32 | 然后就安装,命令如下: 33 | 34 | tar xvzf tornado-3.1.tar.gz 35 | cd tornado-3.1 36 | python setup.py build 37 | sudo python setup.py install 38 | 39 | -------------------------------------------------------------------------------- /Tornado/python中的HTML转义.md: -------------------------------------------------------------------------------- 1 | #python和web.py的HTML字符转义 2 | 3 | ##Python处理HTML转义字符 4 | 5 | 抓网页数据经常遇到例如>或者 这种HTML转义符,抓到字符串里很是烦人。 6 | 7 | 比方说一个从网页中抓到的字符串 8 | 9 | s = '<abc>' 10 | 11 | 用Python可以这样处理: 12 | 13 | import  HTMLParser 14 | 15 | html_parser = HTMLParser.HTMLParser() 16 | 17 | s = html_parser.unescape(s) #这样就得到了s = '' 18 | 19 | ##url 上的转义 20 | 21 | import urllib 22 | 23 | urllib.quote 24 | 25 | ###反函数 unquote 26 | 27 | 用这个函数,会遇到一个问题,就是编辑器中输入的内容如果含有空格,会自动转义成“+”. 28 | 29 | 解决方法是用:urllib.quote_plus() 30 | 31 | ##html 中保留字符(eg: ><)转义 32 | 33 | import cgi 34 | 35 | cgi.escape 36 | 37 | ##webpy模板自动HTML转义 38 | 39 | 要注意 web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本。 40 | 41 | 如果要关闭该选项,可以写成 $:name 来代替 $name。 42 | 43 | 如果我们想部分转移,怎么办? webpy显然提供了转移函数,我们在应用层直接调用就可以了。 44 | 45 | from web.net import htmlquote 46 | 47 | htmlquote(raw_text) 48 | 49 | -------------------------------------------------------------------------------- /Tornado/tornado模板转义处理.md: -------------------------------------------------------------------------------- 1 | #tornado模板转义处理 2 | 3 | tornado默认是转义所有字符,比较安全,但有时候我们的确需要把字符当做html来解析处理,因此我们需要做些处理。 4 | 5 | 示例: 6 | 7 | main.py 代码: 8 | 9 | import tornado.ioloop 10 | 11 | import tornado.web 12 | 13 | class MainHandler(tornado.web.RequestHandler): 14 | 15 | def get(self): 16 | 17 | self.render('main.html',title = '

Title

') 18 | 19 | application = tornado.web.Application([ (r"/", MainHandler), ]) 20 | 21 | if __name__ == "__main__": 22 | 23 | application.listen(8888) 24 | 25 | tornado.ioloop.IOLoop.instance().start() 26 | 27 | 28 | main.html 代码: 29 | 30 | {{ title }} 31 | 32 | 执行结果: 33 | 34 | ![](./001.jpg) 35 | 36 | 默认把h1标签给转义,我们可以这么干使它不要转义 37 | 38 | main.html 代码: 39 | 40 | {% raw title %} 41 | {{ title }} 42 | 43 | raw 是不要转义 44 | 45 | 执行: 46 | 47 | ![](002.gif) 48 | 49 | 或者在头部这么定义 50 | 51 | main.html 52 | 53 | {% autoescape None %} 54 | {{ title }} 55 | {{ escape(title) }} 56 | 57 | {% autoescape None %} 是整个文件都生效,但可以使用escape转义某一处 58 | 59 | 执行: 60 | 61 | ![](003.gif) 62 | 63 | Tornado在所有模板中默认提供了一些便利的函数。它们包括: 64 | 65 | **escape(s)** 66 | 67 | 替换字符串s中的&、<、>为他们对应的HTML字符。 68 | 69 | **url_escape(s)** 70 | 71 | 使用urllib.quote_plus替换字符串s中的字符为URL编码形式。 72 | 73 | **json_encode(val)** 74 | 75 | 将val编码成JSON格式。(在系统底层,这是一个对json库的dumps函数的调用。查阅相关的文档以获得更多关于该函数接收和返回参数的信息。) 76 | 77 | **squeeze(s)** 78 | 79 | 过滤字符串s,把连续的多个空白字符替换成一个空格 80 | 81 | -------------------------------------------------------------------------------- /Tornado/webpy数据批量插入.md: -------------------------------------------------------------------------------- 1 | #web.py中db实现数据的批量插入 2 | 3 | 在SQL中,实现数据的批量插入,类型如: 4 | 5 | insert into tablename (filed1,field2) values (a1,a2),(b1,b2) 6 | 7 | 在web.py框架中,实现数据批量插入的方法是: 8 | 9 | multiple_insert(self, tablename, values, seqname=None, _test=False) 10 | 11 | Inserts multiple rows into tablename. The values must be a list of dictioanries, one for each row to be inserted, each with the same set of keys. Returns the list of ids of the inserted rows. 12 | 13 | Set seqname to the ID if it's not the default, or to False if there isn't one. 14 | 15 | >>> db = DB(None, {}) 16 | 17 | >>> db.supports_multiple_insert = True 18 | 19 | >>> values = [{"name": "foo", "email": "foo@example.com"}, {"name": "bar", "email": "bar@example.com"}] 20 | 21 | >>> db.multiple_insert('person', values=values, _test=True) 22 | 23 | 24 | 25 | var:http://webpy.org/docs/0.3/api#web.db 26 | 27 | -------------------------------------------------------------------------------- /Wechat/python微信开发课程.md: -------------------------------------------------------------------------------- 1 | #python微信开发视频课程 2 | 3 | ##第一讲:验证微信公众账号的接口 4 | 5 | 本视频来自爱奇异网站 6 | 7 |
8 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /Wechat/python微信开发课程2.md: -------------------------------------------------------------------------------- 1 | #python微信开发视频课程2 2 | 3 | ##第一讲:开发工具 4 | 5 | 本视频来自爱奇异网站 6 | 7 |
8 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /Wechat/微信开发值得推荐的开源项目.md: -------------------------------------------------------------------------------- 1 | #微信开发值得推荐的开源项目 2 | 3 | 1.Wechat-PHP-SDK 4 | 5 | 微信公众平台 PHP 开发包,细化各项接口操作,支持链式调用。 6 | 7 | Github托管地址:[dodgepudding/wechat-php-sdk](http://github.com/dodgepudding/wechat-php-sdk) 8 | 9 | 2.微信公众平台 PHP SDK 10 | 11 | 简单的微信公众平台 PHP SDK ,通过调用相应的接口,使你可以轻松地开发微信 App 。 12 | 13 | Github托管地址:[netputer/wechat-php-sdk](http://github.com/netputer/wechat-php-sdk) 14 | 15 | 3.Wechat-php 16 | 17 | 本微信SDK实现了被动响应的官方 API 已经主动发送消息给订阅用户,主动批量发送消息给订阅用户。 18 | 19 | Github托管地址:[ligboy/Wechat-php](http://github.com/ligboy/Wechat-php) 20 | 21 | 非常强大的微信公众平台开发框架推荐中有官方和第三方开发者提供的丰富的插件,是免费并且成熟的框架,更多的信息可以点击这里: 22 | 23 | - [微擎:http://www.we7.cc/](http://www.we7.cc/) 24 | - [微笑:http://www.sylai.com/](http://www.sylai.com/) 25 | - [weiphp:http://www.weiphp.cn/](http://www.weiphp.cn/) 26 | 27 | -------------------------------------------------------------------------------- /noSQL/在ubuntu上安装mongodb.md: -------------------------------------------------------------------------------- 1 | #在ubuntu上安装mongodb 2 | 3 | 计算机:32位,ubuntu操作系统。 4 | 5 | 采用安装方法参考:[http://www.cnblogs.com/alexqdh/archive/2011/11/25/2263626.html](http://www.cnblogs.com/alexqdh/archive/2011/11/25/2263626.html) 6 | 7 | 进入mongod所在的目录(/usr/bin),然后运行“./mongod --dbpath /var/lib/mongodb/ --logpath /var/log/mongodb/mongodb.log --logappend &” 8 | 9 | --dbpath:指定mongo的数据库文件在哪个文件夹(也就是说我本地的数据库文件存储在/var/lib/mongodb/内) 10 | 11 | --logpath:指定mongo的log日志是哪个,这里log一定要指定到具体的文件名 12 | 13 | --logappend:表示log的写入是采用附加的方式,默认的是覆盖之前的文件 14 | 15 | &:表示程序在后台运行 16 | 17 | 注意:如果是系统非正常关闭,这样启动会报错,由于mongodb自动被锁上了,这是需要进入mongodb数据库文件所在的目录(/var/lib/mongodb/),删除目录中的mongodb.lock文件,然后再进行上述操作。 18 | 19 | 另外,推荐按照官方安装,这样可以得到最新版本:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ 20 | 21 | service mongodb start #开始运行 22 | 23 | service mongodb stop 24 | 25 | service mongodb restart 26 | 27 | 在浏览器中:http://localhost:27017 (估计是端口被占领了,我的系统上居然得用28017端口) 28 | 29 | --------------------------------------------------------------------------------