PyQuery: 一个类似jQuery的Python库

PyQuery是一个类似于jQuery的Python库,也可以说是jQuery在Python上的实现。pyQuery是使用lxml来实现快速的xml和html操作的。具体的PyQuery文档见:http://pyquery.org

Python轻量级ORM - Peewee

最新API:Python轻量级ORM - Peewee

like匹配语句:

xxModel.select().where(xxModel.author ** 'zh%')

requests.get 获取页面乱码

查看一下网页的编码,比如是gbk

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

那就需要response设置为r.encoding=’gbk’, 代码如下:

r = requests.get(self.url, headers=config.HEADERS)
r.encoding = 'gb2312'
return r.text

IndentationError: unindent does not match any outer indentation level

解决方案:这主要是TAB键和空格混搭使用造成的,需要统一一下对齐的风格即可。

urllib2.HTTPError: HTTP Error 403: Forbidden

解决方案:ulr请求需要模拟真实的浏览器访问,需要设置User-Agent项,最简便的方式就是随机获取,代码如下:

# -*- coding: UTF-8 -*-
import sys
import random

reload(sys)
sys.setdefaultencoding('utf-8')

USER_AGENTS = [
                'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
                'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
                'Opera/9.25 (Windows NT 5.1; U; en)',
                'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
                'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
                'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
                'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
                'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7',
                'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'
            ]

#伪装浏览器头
HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'User-Agent': random.choice(USER_AGENTS),
    'Referer': 'http://www.baidu.com' # or 'http://www.google.cpm'
}

装饰器

@classmethod 或 @staticmethod

参考知乎话题 - https://www.zhihu.com/question/21084971

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren’t special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one– and preferably only one –obvious way to do it.

Although that way may not be obvious at first unless you’re Dutch.

Now is better than never.

Although never is often better than right now.

If the implementation is hard to explain, it’s a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea – let’s do more of those!

翻译如下:

Python之禅 by Tim Peters

优美胜于丑陋(Python 以编写优美的代码为目标)

明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)

简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)

复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)

扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)

间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)

可读性很重要(优美的代码是可读的)

即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)

不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)

当存在多种可能,不要尝试去猜测,而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)

虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )

做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)

如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)

命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

PS: 一图解读Python设计哲学:Python之禅 以漫画的形式去解读每一句话后面的含义,更加形象直观。

网络排错大讲解

基本命令

命令 用途
ipconfig 查看计算机的IP 地址、子网掩码和网关
ipconfig /all 查看计算机的IP 地址、子网掩码、网关和DNS 地址
ping 测试主机之间的网络连通性
nslookup 请求域名对应的IP 地址,并以此测试DNS 地址是否可用
tracert -d 路由追踪,并且不做反向解析
arp -a 查看计算机是否已获取到网关的MAC地址

抓包工具

广播风暴

VLAN 、IP分部门管理

ARP防火墙

何为DNS?

DNS 的全称是 Domain Name System 或者 Domain Name Service,以显浅的语言来解释,对于上网的用户来说,DNS 就是一台(或多台)在网络上的服务器,专门为大家上网时解析网址的IP地址的。互联网被发明时是需要靠 IP 地址去定位网络上的服务器或网络设备的,它可以看做是一个网站的门牌号,但IP地址(如 124.122.45.2)这样的数字实在太难被人们所记住,如果上任何网站都需要输入这样的地址恐怕对任何人来说都是噩梦!于是,人们发明了域名(网址),也就是像 iPlaySoft.com 这样有意义的单词组合来帮助人们记忆与输入。

不过,虽然人能看懂域名,但电脑却只懂 IP 地址,那怎么办呢?嗯,当你用电脑访问异次元的域名 www.iPlaySoft.com 时,就要有一位懂得“翻译”的“指路人”去告诉你的电脑,www.iPlaySoft.com 究竟对应的是哪个IP地址了,这样你的电脑才懂得怎样去找到异次元的服务器并下载你要访问的网页内容。而这个“指路人”的角色就是DNS。

更详细参看百科词条: http://baike.baidu.com/item/dns/427444

DNS知识平台

手动修改DNS

设置DNS详细教程

一般修改了dns, 需要手动清除本地的dns缓存: 进入命令行提示符,输入 ipconfig /flushdns 并回车即可。

第三方DNS 服务

  1. 114DNS: 114.114.114.114
  2. 谷歌DNS: 8.8.8.8 / 8.8.4.4
  3. 阿里DNS: 223.5.5.5 / 223.6.6.6
  4. 百度DNS: 180.76.76.76

自动化软件 - DnsJumper

DNS Jumper 完全免费,绿色免安装,体积非常小巧,经测试支持 Windows 8、Win7、Vista、XP,支持64位与32位系统,支持多网卡分别设置(譬如WIFI无线网卡以及普通的以太网网卡),提供了包含简体中文在内的多国语言。

它不但内置了 Google Open DNS、Comodo DNS 等大量免费公共DNS,还可以让用户自由手动添加/删除自己收集的地址。更实用的是,它还可以为你的DNS列表批量测速并自动选择最快的进行应用,而且也能一键清空本地DNS缓存。

下载地址

Git最佳实践

参考资源:

图解Git/图形化的Git参考手册
Git分支管理策略
Git 分支管理是一门艺术

1) $ git checkout -b myfeature develop
Switched to a new branch “myfeature”

2) $ git checkout develop
Switched to branch ‘develop’

$ git merge –no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)

$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).

$ git push origin develop

3) $ git checkout master
Switched to branch ‘master’

$ git merge –no-ff release-1.2
Merge made by recursive.
(Summary of changes)

$ git tag -a 1.2 -m ‘comments here’
$ git push –tags

show all tags
$ git tag -n or git tag -n5
$ git show v5.0

git tag -d 12345
git push origin :refs/tags/12345

4) $ git commit -a -m “Bumped version number to 1.2.1”

5) Push only to a remote branch

$ git checkout feature_x
$ git push origin feature_x

With modern git you should be able to simply “git push origin HEAD”, or even “git push HEAD” to push only currently checked-out branch

6) push and delete remote branches

$ git push origin :newfeature

7) shows all local and remote branches
$ git branch -a

shows only remote branches.
$ git branch -r

8) When “git unable to push to unqualified destination” occured, try to
Do “git fetch -p origin” to make refs/remotes/origin/my_remote_branch go away if it’s already deleted in origin. The -p option tells fetch to delete any tracking branches that no longer exist in the corresponding remotes; by default they are kept around.

9) Fetch和Pull的简单区别如下:

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

参考链接:Git fetch & pull 详解

10) Git分支管理策略,如图:

在当今信息时代,管理密码本是一件很费时费力的事情。相对于DNN这一平台,由于版本较多不可避免地在开发过程中会搭建好多本地站点,时不时忘记密码也是常有的事。

超级用户

终极方案

前提:有权限操作数据库db。

原理:把aspnet_membership表中的”XX_UserName”用户的password和password_salt值拷贝并覆盖host用户对应的值。

在SQL Management Studio执行如下Query SQL script:

/*
 -- Database Utility ---------------------------------------------------------------------------
 Description : Reset a Password in a DotNetNuke database
 Author : Tony Tullemans
 Date Created : 18.04.2007
 Note/s : Before you run this script you must know the UserName and Password of another
 registered DNN user in the database you wish to affect.
 -----------------------------------------------------------------------------------------------
 */

DECLARE @databaseName VARCHAR(128)
SELECT @databaseName = DB_NAME()

PRINT 'RESET PASSWORD IN DATABASE : ' + @databaseName
PRINT '-----------------------------' + REPLICATE('-', DATALENGTH(@databaseName ));

DECLARE @knownUserName NVARCHAR(128)
DECLARE @lostUserName NVARCHAR(128)
DECLARE @lostUserId NVARCHAR(128)
DECLARE @knownPassword NVARCHAR(128)
DECLARE @knownSalt NVARCHAR(128)

SET @knownUserName = 'windy' /* WHAT YOU NEED TO MODIFY */
SET @lostUserName = 'host'

SELECT @knownPassword = Password, @knownSalt = PasswordSalt
FROM aspnet_Membership
INNER JOIN aspnet_users
ON aspnet_Membership.UserId = aspnet_users.UserId
where UserName = @knownUserName;

PRINT ''
PRINT 'Known Password for "' + @knownUserName + '" is : ' + @knownPassword
PRINT 'Known Password Salt for "' + @knownUserName + '" is : ' + @knownSalt

SELECT @lostUserId = aspnet_Membership.UserId
FROM aspnet_Membership
INNER JOIN aspnet_users
ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName = @lostUserName;

PRINT ''
PRINT 'UserID for "' + @lostUserName + '" is : ' + @lostUserId
PRINT ''

IF (DATALENGTH(@lostUserName) <= 0 OR @lostUserName IS NULL)
PRINT 'Invalid Lost User Name ' + @lostUserName
ELSE BEGIN
IF (DATALENGTH(@knownUserName) <= 0 OR @knownUserName IS NULL)
PRINT 'Invalid Lost User Name ' + @lostUserName
ELSE BEGIN
IF (DATALENGTH(@knownPassword) <= 0 OR @knownPassword IS NULL)
PRINT 'Invalid Known Password ' + @knownPassword
ELSE BEGIN
IF (DATALENGTH(@knownSalt) <= 0 OR @knownSalt IS NULL)
PRINT 'Invalid Known Salt ' + @knownSalt
ELSE BEGIN
PRINT ''
PRINT 'BEFORE'
SELECT left(UserName, 12) as UserName, aspnet_Membership.UserId, left(Email, 20) as Email, Password, PasswordSalt
FROM aspnet_Membership INNER JOIN aspnet_users ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName IN ( @knownUserName, @lostUserName );
PRINT ''
PRINT 'Changing Password for User Id("' + @lostUserId + '") to: "' + @knownPassword + '"'
PRINT ''
UPDATE aspnet_Membership
SET Password = @knownPassword,
PasswordSalt = @knownSalt
-- SELECT UserId, Password, PasswordSalt
-- FROM aspnet_Membership
WHERE UserId = @lostUserId;
PRINT ''
PRINT 'AFTER'
SELECT left(UserName, 12) as UserName, aspnet_Membership.UserId, left(Email, 20) as Email, Password, PasswordSalt
FROM aspnet_Membership INNER JOIN aspnet_users ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName IN ( @knownUserName, @lostUserName );
END
END
END
END
GO

PRINT ''
PRINT ' * * * END OF SCRIPT * * *'
PRINT ''
GO

手动模式

前提:开放注册功能和有权限操作数据库db。
原理:创建新用户并手动到数据库,在表ASPNet_Membership查询出host和新用户的记录,把新用户的password和password_salt值拷贝并覆盖host用户对应相同的列上。

As there are frequent requests from users, who lost the password of the host account (and you cannot request the host password by email), the following solution will help for all DNN 3 and 4 installation. Please note, that your need direct access to the database to suceed with the issue:

  1. if “register” is not displayed for the portal, go to table “Portals” in your database and enter value “2” into column “Registration”.
  2. create a new user account by registration (this time, please remember the password you enter!)
  3. go to database, enter table “ASPNet_Membership”
  4. go to new user account (usually the last one) and copy the encrypted values of columns “Password” and “PasswordSalt” into the same columns of user account “host” (usually th first entry in this table)
  5. login as user “host” using the new password and delete the reshly created other user.

Keep remembering your password ;)

代码模式(不推荐使用)

前提:有权限访问FTP。
原理:调用核心API获取Host用户输出到页面。
缺点: 加密方式为Hashed不可用;操作完成务必删除。

<%@ Page Language="C#" %>
<script runat="server">
    void Page_Load(object sender, System.EventArgs e)
    {
        DotNetNuke.Entities.Users.UserInfo uInfo =
DotNetNuke.Entities.Users.UserController.GetUserById(0, 1);
        if (uInfo != null)
        {
            string password =
DotNetNuke.Entities.Users.UserController.GetPassword(ref uInfo, String.Empty);
            Response.Write("Password: " + password);
        }
        else
        {
            Response.Write("UserInfo object is null");
        }
    }
</script>
<html>
    <head>
        <title>Recover Password</title>
    </head>
    <body>
    </body>
</html>

普通用户

核心方案

通过注册模块点击重设密码链接获取邮件提醒。

DNN Wiki - Recover Passwords

第三方模块

IowaComputerGurus’s Secure Password Recovery module

墨菲定律

“墨菲定律”是一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的。主要内容:

一、任何事都没有表面看起来那么简单;
二、所有的事都会比你预计的时间长;
三、会出错的事总会出错;
四、如果你担心某种情况发生,那么它就更有可能发生。

墨菲定律的原句是这样的:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。

这句话迅速流传。墨菲定律是其作出的著名论断,亦称莫非定律、墨菲定理,是西方世界常用的俚语。

墨菲定律主要内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。

参考资源:

http://baike.baidu.com/view/40544.htm

二八定律

1897年,意大利经济学家帕列托在对19世纪英国社会各阶层的财富和收益统计分析时发现:80%的社会财富集中在20%的人手里,而80%的人只拥有社会财富的20%,这就是“二八法则”。“二八法则”反应了一种不平衡性,但它却在社会、经济及生活中无处不在。

在商品营销中,商家往往会认为所有顾客一样重要;所有生意、每一种产品都必须付出相同的努力,所有机会都必须抓住。而“二八法则”恰恰指出了在原因和结果、投入和产出、努力和报酬之间存在这样一种典型的不平衡现象:80%的成绩,归功于20%的努力;市场上80%的产品可能是20%的企业生产的;20% 的顾客可能给商家带来80%的利润。遵循“二八法则”的企业在经营和管理中往往能抓住关键的少数顾客,精确定位,加强服务,达到事半功倍的效果。美国的普尔斯马特会员店始终坚持会员制,就是基于这一经营理念。

“二八法则”同样适用于我们的生活,如一个人应该选择在几件事上追求卓越,而不必强求在每件事上都有好的表现;锁定少数能完成的人生目标,而不必追求所有的机会。

参考资源:

http://baike.baidu.com/view/40591.htm

零和博弈

一个游戏无论几个人来玩,总有输家和赢家,赢家所赢的都是输家所翰的,所以无论输赢多少,正负相抵,最后游戏的总和都为零,这就是零和游戏。

零和游戏之所以受人关注,是因为人们在社会生活中处处都能找到与零和游戏雷同或类似的现象。我们大肆开发利用煤炭石油资源,留给后人的便越来越少;我们研究生产了大量的转基因产品,一些新的病毒也跟着冒了出来;我们修筑了葛洲坝水利工程,白鳍豚就再也不能洄游到金沙江产卵了……

发展是硬道理。人类在经历了经济高速增长、科技迅猛发展、全球经济一体化及曰益严重的生态破坏、环境污染之后,可持续发展理论才逐渐浮出水面。零和游戏原理正在逐渐为“双赢”观念所取代,人们逐渐认识到“利己”而不“损人”才是最美好的结局。实践证明,通过有效合作,实现皆大欢喜的结局是可能的。

领导者要善于跳出“零和”的圈子,寻找能够实现“双赢”的机遇和突破口,防止负面影响抵消正面成绩。批评下属如何才能做到使其接受而不抵触,发展经济如何才能做到不损害环境,开展竞争如何使自己胜出而不让对方受到伤害,这些都是每一个为官者应该仔细思考的问题。

参考资源:

http://baike.baidu.com/view/196849.htm

破窗理论

破窗效应(英语:Broken windows theory)是犯罪学的一个理论,该理论由詹姆士·威尔逊(James Q. Wilson)及乔治·凯林(George L. Kelling)提出,并刊于《The Atlantic Monthly》1982年3月版的一篇题为《Broken Windows》的文章。此理论认为环境中的不良现象如果被放任存在,会诱使人们仿效,甚至变本加厉。

一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。最终他们甚至会闯入建筑内,如果发现无人居住,也许就在那里定居或者纵火。一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟、不堪入目的东西;一条人行道有些许纸屑,不久后就会有更多垃圾,最终人们会视若理所当然地将垃圾顺手丢弃在地上。这个现象,就是犯罪心理学中的破窗效应!

参考资源:

http://baike.baidu.com/view/298167.htm

奥卡姆剃刀定律

12世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地“剃除”。他主张“如无必要,勿增实体”。这就是常说的“奥卡姆剃刀”。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反,经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。

奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。

参考资源:

http://baike.baidu.com/view/646319.htm

水桶效应

一只水桶能装多少水取决于水桶中最短的一块木板而不是最长的那块木板。

任何组织几乎都有一个共同的特点,即构成组织的各个部分往往是优劣不齐的,但劣势部分却往往决定着整个组织的水平。问题是劣势部分是组织中一个有用的部分,你不能把它当成烂苹果扔掉,否则,你会一点水也装不了,可它却让你那些长的东西白长了!

劣势决定优势,劣势决定生死,这是市场竞争的残酷法则。水桶定律告诉我们,领导者要有忧患意识,如果你个人身上某个方面是“最短的一块”,你应该考虑尽快把它补起来;如果你所领导的集体中存在着“一块最短的木板”,你一定要迅速将它做长补齐,否则,它带给你的损失可能是毁灭性的—叫艮多时候,往往就是因为一件事没做好而毁了所有的努力。有些人也许不知道水桶定律,但都知道“一票否决”,这是中国的“水桶”,有了它你便知道水桶定律是多么重要。

决策和执行发生的机率。让谋划的人尽心谋划,让执行的人全力执行,让他们都从中获得间接而不是直接的功利,这样我们才能把“粥”分得更好。当然,还应有必不可少的独立的监督。

参考资源:

http://baike.baidu.com/view/47735.htm

《The Passionate Programmer:Creating A Remarkable Career In Software Development》

比较赞同另外一个版本的书名翻译《激情码农:迈向卓越之路》。总体而言,这纯粹就是一本方法论的指导教程,无非就是针对某一特殊行业-程序猿来阐述而已。

如果某些方式或思路吻合自己想做或正在实施过程中的,那就是最好不过了 - “英雄所见略同”。其余的则汲取适合自己即可。

简单摘抄如下:

选择市场

  • 如果你把自己的职业当成是一门生意(事实上它就是一门生意),那么你的”产品”就是由你提供的服务构成的。

  • 人们往往纠缠于做某事的方法,而忘记了最初的目的。

  • 软件是一门生意,而作为开发人员,我们就是生意人,要学会融入生意并创造利润。选择市场等同于选择投资某项技术或领域。投资时,务必要权衡风险和收益。

  • 不要用自己的技术来定位自己,而是用已经做过的和将要做的事情来定位自己。技术只是一种做事的方法。

  • 很多人认为专攻某种技术就简单地意味着不知道其他技术。

在产品上投资

  • 讲课是最好的学习方法。要主动问,不要等着别人来告诉你。

  • 研究大师的作品是成为大师的一个重要步骤。你学习别人的习惯时,就会发展出自己独特的风格。

  • 要有雄心,但不必路人皆知。比起只专注在目标上的做法,专注于现在的工作会使你离最终目标更近。

执行

26 一桶水中的鹅卵石

  • 对公司来说,基本上每个人就像一桶水中的鹅卵石。
  • 你越是成功,就越有可能犯下重大错误。当你得到很多肯定的时候,你就会很少质疑自己的决定。你使用的方法屡试不爽时,你可能就会忽略可能会有更好的方法。你开始变得傲慢。

    人一旦傲慢,就会产生盲点。越认为自己无可取代,就越有可能被别人取代(你在公司存在的意义就越小)。

29 学习如何失败

  • 公司对错误处理方式的不同,会产生不同的结果。问题处理得好,会使客户对其产品更加忠诚,甚至比碰到问题之前,更加信任这家公司。要是处理得不好,那就摧毁了客户的信任。工作中犯错误的时候,要时刻谨记客户的这一心理。

    以下规则适用于解决技术、沟通或者项目管理中出现的错误:

    1. 发现问题后第一时间提出,不要企图隐瞒错误
    2. 接受批评
    3. 提供可执行的解决方法及可计划的时间表
    4. 寻求帮助

30 敢于说不

  • 有勇气说“不”的人作出的承诺更可信,也更有分量。

  • 经常说“是”的人, 要不是天才,要不就是在说谎。后者通常占多数。

32 说出来、行动、展示

  • 从不做出承诺最容易导致一事无成。没有截止期限,你也就没有压力或者说是动力来完成某项工作,特别是当任务不是十分有趣的时候。

  • 编程是创作的工作,要想有成功的原创,失败和抄袭是最佳途径。

推销。。。。。。不仅仅是迎合

35 学会沟通,善于写作

  • 沟通,不仅仅是以文字方式进行沟通,是你所有绝妙的想法必须要通过的瓶颈。你自己就是你要解释的内容。

  • 如果你无法用母语清楚地表达自己的想法,让别人明白,又怎么可能用编程语言来清楚地表达出来呢?组织观点,带领读者思考并最终做出合乎逻辑的推断,这种能力与创作出清晰的设计和系统实施,并让功能维护者理解的能力是一样的。

39 让人们听到你的声音

  • 让人们听到你的声音的方法中,最重要的一点就是要尽早行动,而不是一味地去想自己是否已经做好了准备。

  • 大部分人都低估自己的能力。你一定有某种可以传授给他人的东西。

  • 你永远也不会觉得自己已经做好了100%的准备,所以不妨现在就开始行动吧。

40 创建自己的商标和品牌

  • 得到认知和尊重是值得去创建和维护的资产。

41 发布你编写的程序

  • 对开源软件有所建树是一种技术的展示。

保持技术领先

50 南印度捉猴陷阱

  • 当你坚信某事的价值时,就会无法客观地批判它,即是价值僵固。

52 每天都有进步

  • 远大的目标会使人散失动力。持续的小目标才是可执行的。

Lean Startup

创业公式

  1. 搭建可运行的原型 - 轻,小,快
  2. 上线运营(别管bug)
  3. 收集反馈
  4. 调整产品
  5. 成长壮大

Minimium Viable Product (MVP)

  • 产品规格:”一個”足夠解決問題的功能範圍
  • 不作平台,只解决问题
  • Complain Driven Development