<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>MyBlog</title>
 <link href="http://winares.github.com/atom.xml" rel="self"/>
 <link href="http://winares.github.com"/>
 <updated>2015-06-03T04:18:25+00:00</updated>
 <id>http://winares.github.com</id>
 <author>
   <name>winares</name>
   <email>xxxxxx@gmail.com</email>
 </author>

 
 <entry>
   <title>ShadowSocks—有墙不怕,科学上网</title>
   <link href="http://winares.github.com/2015/05/17/shadowsocks"/>
   <updated>2015-05-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2015/05/17/shadowsocks</id>
   <content type="html">
&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_0.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　除去广为人知、人见人爱的&lt;a href=&quot;http://www.i-vpn.net&quot;&gt;VPN&lt;/a&gt;，其实还有十八般兵器存在于科学上网界，其中ShadowSocks可以说是其中一把功能齐全的瑞士军刀。服务器端提供了各种版本，如Python、Nodejs、Go、C libev等等，安装配置过程极其简单。而用户端则可以在windows、mac、iOS和android上轻松运行，很好很强大。&lt;/p&gt;

&lt;p&gt;　　PS：此程序&lt;a href=&quot;https://github.com/clowwindy/shadowsocks&quot;&gt;开源&lt;/a&gt;，感谢作者&lt;a href=&quot;https://twitter.com/clowwindy&quot;&gt;@clowwindy&lt;/a&gt;为主的所有程序员。
官网地址&lt;a href=&quot;http://shadowsocks.org/en/index.html&quot;&gt;www.shadowsocks.org&lt;/a&gt;
注意那个.com并不是官网，而是上面的.org&lt;/p&gt;

&lt;h4 id=&quot;shadowsocks&quot;&gt;Shadowsocks是什么？&lt;/h4&gt;

&lt;p&gt;码农对于shadowsocks应该不陌生，而一般普通网民可能知之甚少。shadowsocks实质上也是一种socks5代理服务，类似于ssh代理。与vpn的全局代理不同，shadowsocks仅针对浏览器代理，不能代理应用软件，比如youtube、twitter客户端软件。如果把vpn比喻为一把屠龙刀，那么shadowsocks就是一把瑞士军刀，轻巧方便，功能却非常强大。&lt;/p&gt;

&lt;h4 id=&quot;shadowsocks-1&quot;&gt;喜欢上shadowsocks的理由&lt;/h4&gt;

&lt;p&gt;很多时候，我们仅仅只是需要上一下google，收个gmail邮件，或者打开某个网站瞄一眼看看有无更新。这种情况下，vpn可以做到吗，可以，但是很麻烦，连个vpn，qq也得掉一次线，有时候还连半天连不上。而通过ss的话呢，后台运行一个小程序，然后浏览器点击切换一下SS的网络，就可以了。不用的时候，再切回来。这也就是其轻巧的地方。&lt;/p&gt;

&lt;h4 id=&quot;shadowsocks-2&quot;&gt;如何使用shadowsocks？&lt;/h4&gt;

&lt;p&gt;首先，你需要有一个shadowsocks账号，这里有&lt;a href=&quot;http://www.ishadowsocks.com&quot;&gt;免费shadowsocks账号&lt;/a&gt;（会换密码）。&lt;/p&gt;

&lt;h4 id=&quot;windows&quot;&gt;windows平台&lt;/h4&gt;

&lt;p&gt;1.下载一个shadowsocks的客户端程序&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pan.baidu.com/s/1o6KF4vw&quot;&gt; Win7及以下百度网盘下载地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pan.baidu.com/s/1gdvlsif&quot;&gt; Win8及以上百度网盘下载地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;不需要安装，解压就可以用。&lt;/p&gt;

&lt;p&gt;2.运行解压后文件夹中的“shadowsocks.exe”&lt;/p&gt;

&lt;p&gt;3.右下角找到程序图标，右键图标，“服务器”–“编辑服务器”，如下图，设置好shadowsocks的账号信息，点确定；&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_1.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;4.再次右键程序图标，勾选“启用系统代理”。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_2.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;5.接下来，可以在chrome中直接打开youtube试试，测试OK，没问题。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_3.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tips：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;原GUI版本需要配合浏览器插件才能使用，新版无需浏览器插件配合，直接启用系统代理，配置好后就可以上网了。&lt;/li&gt;
  &lt;li&gt;系统代理模式一项，可以选择“PAC模式”和“全局模式”。PAC模式即需要代理的网站才代理，不需要代理的则通过本地网络访问，可以理解为，访问国内网站还是和你原来的网络一样，只有访问部分国外网站，才通过shadowsocks服务器。全局模式则是访问所有网站都通过shadowsocks服务器。&lt;/li&gt;
  &lt;li&gt;如何关闭shadowsocks呢？shadowsocks程序直接关闭就行了。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;mac-os-x&quot;&gt;Mac OS X平台&lt;/h4&gt;

&lt;p&gt;还是先下载mac下的客户端程序（&lt;a href=&quot;http://pan.baidu.com/s/1gdIRTnl&quot;&gt;百度网盘下载&lt;/a&gt;），后面的过程和win是一样的，设置好以后，打开浏览器上网就O了，新版支持海外和全局的选项，一般默认选海外，基本感觉不到Wall的存在。&lt;/p&gt;

&lt;h4 id=&quot;ios&quot;&gt;iOS平台&lt;/h4&gt;

&lt;p&gt;直接在appstore搜索下载shadowsocks（&lt;a href=&quot;https://itunes.apple.com/cn/app/shadowsocks/id665729974?mt=8&quot;&gt;safari直接进入下载&lt;/a&gt;），app打开后就是一个浏览器，内置了公共服务器，可以直接输入网址打开youtube了。当然，有时候公共服务器会出现不稳定的情况，这时可以设置自己的服务器使用，设置方法和windows一样。相比Android版，iOS版只支持浏览器，有点弱爆了的感觉。iOS上还是VPN更方便&lt;/p&gt;

&lt;p&gt;前往&lt;a href=&quot;http://www.jianshu.com/p/90e18e1e40a7&quot;&gt;iOS上那些好用的VPN应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_4.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;android&quot;&gt;Android平台&lt;/h4&gt;

&lt;p&gt;安卓下的软件名称为“&lt;strong&gt;影梭&lt;/strong&gt;”（&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.github.shadowsocks&quot;&gt;GooglePlay下载&lt;/a&gt;  &lt;a href=&quot;http://pan.baidu.com/s/1kTEacbt&quot;&gt;百度网盘&lt;/a&gt;），下载后无需root，设置好服务器和帐号信息后即可直接使用。&lt;/p&gt;

&lt;p&gt;与iOS版本不同，android版是以VPN的方式运行的，也就是说不仅支持浏览器，而且支持其他App，简直好用到没朋友。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150517_5.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.jianshu.com/p/08ba65d1f91a&quot;&gt;（整理自网络）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>解读百度搜索引擎工作原理</title>
   <link href="http://winares.github.com/2015/03/03/search-engine-theory"/>
   <updated>2015-03-03T00:00:00+00:00</updated>
   <id>http://winares.github.com/2015/03/03/search-engine-theory</id>
   <content type="html">
&lt;p&gt;【文章摘要】以下便是百度搜索引擎决定搜索结果排序时考虑的六大原则，那么六大原则的侧重点是怎样的呢？哪个原则在实际应用时占比最大呢？其实在这里没有一个确切的答案。在百度搜索引擎早期，这些阈值的确是相对固定的，比如“相关性”在整体排序中的重量可以占到七成。但随着互联网的不断发展，检索技术的进步，网页数量的爆发式增长，相关性已经不是难题。于是百度搜索引擎引入了机器学习机制，让程序自动产出计算公式，推进排序策略更加合理。&lt;/p&gt;

&lt;p&gt;　　在说这个话题前，我们先了解一下搜索引擎Spider抓取系统的工作机制。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150303_1.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　上图为spider抓取系统的基本框架图，其中包括链接存储系统、链接选取系统、dns解析服务系统、抓取调度系统、网页分析系统、链接提取系统、链接分析系统、网页存储系统。Baiduspider即是通过这种系统的通力合作完成对互联网页面的抓取工作。&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;那么百度搜索引擎是根据什么指标来确定对一个网站的抓取频次的呢，主要指标有四个：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　1，网站更新频率：更新快多来，更新慢少来，直接影响Baiduspider的来访频率&lt;/p&gt;

&lt;p&gt;　　2，网站更新质量：更新频率提高了，仅仅是吸引了Baiduspier的注意，Baiduspider对质量是有严格要求的，如果网站每天更新出的大量内容都被Baiduspider判定为低质页面，依然没有意义。&lt;/p&gt;

&lt;p&gt;　　简单介绍几种百度支持的返回码：&lt;/p&gt;

&lt;p&gt;　　最常见的404代表“NOT FOUND”，认为网页已经失效，通常将在库中删除，同时短期内如果spider再次发现这条url也不会抓取；&lt;/p&gt;

&lt;p&gt;　　503代表“Service Unavailable”，认为网页临时不可访问，通常网站临时关闭，带宽有限等会产生这种情况。对于网页返回503状态码，百度spider不会把这条url直接删除，同时短期内将会反复访问几次，如果网页已恢复，则正常抓取；如果继续返回503，那么这条url仍会被认为是失效链接，从库中删除。&lt;/p&gt;

&lt;p&gt;　　403代表“Forbidden”，认为网页目前禁止访问。如果是新url，spider暂时不抓取，短期内同样会反复访问几次；如果是已收录url，不会直接删除，短期内同样反复访问几次。如果网页正常访问，则正常抓取；如果仍然禁止访问，那么这条url也会被认为是失效链接，从库中删除。&lt;/p&gt;

&lt;p&gt;　　301代表是“Moved Permanently”，认为网页重定向至新url。当遇到站点迁移、域名更换、站点改版的情况时，我们推荐使用301返回码，同时使用站长平台网站改版工具，以减少改版对网站流量造成的损失。&lt;/p&gt;

&lt;p&gt;　　3，连通度：网站应该安全稳定、对Baiduspider保持畅通，经常给Baiduspider吃闭门羹可不是好事情&lt;/p&gt;

&lt;p&gt;　　4，站点评价：百度搜索引擎对每个站点都会有一个评价，且这个评价会根据站点情况不断变化，是百度搜索引擎对站点的一个基础打分（绝非外界所说的百度权重），是百度内部一个非常机密的数据。站点评级从不独立使用，会配合其它因子和阈值一起共同影响对网站的抓取和排序。&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;理论上，Baiduspider会将新页面上所有能“看到”的链接都抓取回来，那么面对众多新链接，Baiduspider根据什么判断哪个更重要呢？两方面：&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;第一，对用户的价值&lt;/h3&gt;

&lt;p&gt;　　1，内容独特，百度搜索引擎喜欢唯一的内容&lt;/p&gt;

&lt;p&gt;　　2，主体突出，切不要出现网页主体内容不突出而被搜索引擎误判为空短页面不抓取&lt;/p&gt;

&lt;p&gt;　　3，内容丰富&lt;/p&gt;

&lt;p&gt;　　4，广告适当&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;第二，链接重要程度&lt;/h3&gt;

&lt;p&gt;　　1，目录层级——浅层优先&lt;/p&gt;

&lt;p&gt;　　2，链接在站内的受欢迎程度&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;百度优先建重要库的原则&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　众所周知，搜索引擎的索引库是分层级的，优质的网页会被分配到重要索引库，普通网页会待在普通库，再差一些的网页会被分配到低级库去当补充材料。目前60%的检索需求只调用重要索引库即可满足，这也就解释了为什么有些网站的收录量超高流量却一直不理想。&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;那么，哪些网页可以进入优质索引库呢。其实总的原则就是一个：对用户的价值。包括却不仅于：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　1，有时效性且有价值的页面：在这里，时效性和价值是并列关系，缺一不可。有些站点为了产生时效性内容页面做了大量采集工作，产生了一堆无价值面页，也是百度不愿看到的.&lt;/p&gt;

&lt;p&gt;　　2，内容优质的专题页面：专题页面的内容不一定完全是原创的，即可以很好地把各方内容整合在一起，或者增加一些新鲜的内容，比如观点和评论，给用户更丰富全面的内容。&lt;/p&gt;

&lt;p&gt;　　3，高价值原创内容页面：百度把原创定义为花费一定成本、大量经验积累提取后形成的文章。千万不要再问我们伪原创是不是原创。&lt;/p&gt;

&lt;p&gt;　　4，重要个人页面：这里仅举一个例子，科比在新浪微博开户了，即使他不经常更新，但对于百度来说，它仍然是一个极重要的页面。&lt;/p&gt;

&lt;p&gt;　　搜索引擎抓取排序机制（下图）&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150303_2.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　简单来说这个流程图：网站生成页面，搜索引擎蜘蛛抓取后存储到数据库里面（对应开头的那个流程图），程序对这个页面进行分析，利用切词分词技术建立外部索引。&lt;/p&gt;

&lt;p&gt;　　用户输入关键词进行检索，百度搜索引擎在排序环节要做两方面的事情，第一是把相关的网页从索引库中提取出来，第二是把提取出来的网页按照不同维度的得分进行综合排序。“不同维度”包括：&lt;/p&gt;

&lt;p&gt;　　1，相关性：网页内容与用户检索需求的匹配程度，比如网页包含的用户检查关键词的个数，以及这些关键词出现的位置；外部网页指向该页面所用的锚文本等&lt;/p&gt;

&lt;p&gt;　　2，权威性：用户喜欢有一定权威性网站提供的内容，相应的，百度搜索引擎也更相信优质权威站点提供的内容。&lt;/p&gt;

&lt;p&gt;　　3，时效性：时效性结果指的是新出现的网页，且网页内承载了新鲜的内容。目前时效性结果在搜索引擎中日趋重要。&lt;/p&gt;

&lt;p&gt;　　4，重要性：网页内容与用户检查需求匹配的重要程度或受欢迎程度&lt;/p&gt;

&lt;p&gt;　　5，丰富度：丰富度看似简单却是一个覆盖范围非常广的命题。可以理解为网页内容丰富，可以完全满足用户需求；不仅可以满足用户单一需求，还可以满足用户的延展需求。&lt;/p&gt;

&lt;p&gt;　　6，受欢迎程度：指该网页是不是受欢迎。&lt;/p&gt;

&lt;p&gt;　　以上便是百度搜索引擎决定搜索结果排序时考虑的六大原则，那么六大原则的侧重点是怎样的呢？哪个原则在实际应用时占比最大呢？其实在这里没有一个确切的答案。在百度搜索引擎早期，这些阈值的确是相对固定的，比如“相关性”在整体排序中的重量可以占到七成。但随着互联网的不断发展，检索技术的进步，网页数量的爆发式增长，相关性已经不是难题。于是百度搜索引擎引入了机器学习机制，让程序自动产出计算公式，推进排序策略更加合理。&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;外部链接的作用&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　1， 吸引蜘蛛抓取：虽然百度在挖掘新好站点方面下了很大工夫，开放了多个数据提交入口，开避了社会化发现渠道，但超链依然是发现收录链接的最重要入口。&lt;/p&gt;

&lt;p&gt;　　2， 向搜索引擎传递相关性信息：百度除了通过TITLE、页面关键词、H标签等对网页内容进行判断外，还会通过锚文本进行铺助判断。使用图片作为点击入口的超链，也可以通过alt属性和title标签向百度传情达意。&lt;/p&gt;

&lt;p&gt;　　3， 提升排名：百度搜索引擎虽然降低了对超链的依赖，但对超链的识别力度从未下降，制定出更加严格的优质链接、正常链接、垃圾链接和作弊链接标准。对于作弊链接，除了对链接进行过滤清理外，也对链接的受益站进行一定程度的惩罚。相应的，对优质链接，百度依然持欢迎的态度。&lt;/p&gt;

&lt;p&gt;　　4， 内容分享，获取口碑：优质内容被广泛传播，网站借此获得的流量可能并不多，但如果内容做得足够，也可以树立自己的品牌效应。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://zhanzhang.baidu.com/college/courseinfo?id=144&quot;&gt;（整理自网络）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>从产品运营思路看微信公众号运营</title>
   <link href="http://winares.github.com/2015/01/06/subscription-account-operation"/>
   <updated>2015-01-06T00:00:00+00:00</updated>
   <id>http://winares.github.com/2015/01/06/subscription-account-operation</id>
   <content type="html">
&lt;p&gt;【文章摘要】很多传统企业老板很容易走入这个误区,所有经历全部投入到微信商城里,建完微店后就开始到处发广告,结果效果很差。记住移动互联网时代,是个流量碎片化,去中心化时代,你把所有的宝押到一个不成熟的营销渠道上,肯定是功亏于溃。正确的做法应该是去尝试那些效果性营销渠道，比如淘宝，天猫，京东，SEM等，然后通过微信商城去维护客户，产生互动与粘性，黏住客户。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20150106_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　有必要理清微信运营思路，避免陷入运营误区，思路错了，一错再错，帐号运营基本上就打不到点子上，所有努力都会前功尽弃。这个逻辑思路其实就是微信创业要选择什么项目?微信运营思路是怎样的?如何一步一步运营微信公众号?&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;谁在运营微信？&lt;/h3&gt;

&lt;p&gt;　　目前我接触的微信的运营操盘者大概有以下几种:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A 个人微信运营者 B 企业微信运营团队 C 企业高管 D 传统行业老板&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　对于这些操盘者来说,想获取微信层面的东西是不一样的,比如&lt;/p&gt;

&lt;p&gt;A 个人微信运营者重视的是微信运营实际操作细节的优化.&lt;/p&gt;

&lt;p&gt;B 企业微信运营团队关心的可能是团队怎么配备运作协调实现运营目标&lt;/p&gt;

&lt;p&gt;C 企业高管最关心的是思维上,团队组织管理&lt;/p&gt;

&lt;p&gt;D 传统行业老板看到别人都在搞微信了,怎么入手依靠微信来助推线下行业。&lt;/p&gt;

&lt;p&gt;　　所以不同操盘者侧重点不一样,关心的业务层面也会不一样,但是无论是实操者还是幕后的运营策划者,在微信运营上达到思维统一是必然的，简单来说无论是术还是道，最后都要殊途同归。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;微信营销的本质是什么?&lt;/h3&gt;

&lt;p&gt;　　我一直强调微信公众号的服务性质重于营销,微信公众号其实就是许可证邮件营销的加强版。怎么来理解这个问题呢？原来的许可证营销是基于用户订阅了你的邮件后，帐号推送相关有价值的信息给用户，最后再陆续通过销售信的形式完成注册，购买，下载等环节。一样的道理，微信公众号的本质也是基于订阅用户，用户对你的公众号有兴趣，产生关注，公众号推送有价值的信息给用户，然后产生互动，最后形成销售闭环。微信营销的本质可以用这个流程来表示:&lt;/p&gt;

&lt;p&gt;　　用户关注-帐号内容或者信息推送-持续粘性互动-注册,购买,下载等&lt;/p&gt;

&lt;p&gt;思维误区&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;误区一：重粉丝数量忽视粉丝质量&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　曾有人这样比喻微博：当你的粉丝超过100人时，你就像是一本内刊；超过1000人，你就像个布告栏；超过1万人，你就好比一本杂志；超过10万人，你就是一份都市报；超过1000万人，你就成了CCTV。所以几乎每个运营企业社会化媒体的人，都是用粉丝数来衡量自己运营业绩的优劣。&lt;/p&gt;

&lt;p&gt;　　微博的媒体属性决定了其品牌宣传特性,微信是私密的,粉丝是因为公众号的价值来关注你,即使他现在关注了你的帐号,如果发现没有价值,最终还是会取消关注,所以对于微信公众号,粉丝的质量重于数量,做好公众号的定位,服务你的受众人群就足够了.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;误区二:内容一定要原创的&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　很多客户反馈说,原创内容产生太难了,总有一天会江郎才尽。作为一个社会化媒体运营人员应该把心思花在运营上,怎么去整合有价值的信息推送给用户,你又不是4A公司的金牌文案,每天跟挤牙膏一样产生那么多精品原创,当然偶尔也要搞搞原创。&lt;/p&gt;

&lt;p&gt;　　运营人员应该是明确定位，针对你的目标人群，努力做匹配自身能力的内容。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;误区三:见谁咬谁式营销&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　我们更多是因为一个你感兴趣的内容而关注它,而不是社交媒体上到处乱发的陌生人广告而关注它。一开始就产生营销念头,QQ群,朋友圈,微信群都到处发广告,发到最后所有人都把你拉黑.记住微信是强关系CRM，给你做客户维护用的，别一来就开始营销。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;误区四:移动电商就是微信商城&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　很多传统企业老板很容易走入这个误区,所有经历全部投入到微信商城里,建完微店后就开始到处发广告,结果效果很差。记住移动互联网时代,是个流量碎片化,去中心化时代,你把所有的宝押到一个不成熟的营销渠道上,肯定是功亏于溃。正确的做法应该是去尝试那些效果性营销渠道，比如淘宝，天猫，京东，SEM等，然后通过微信商城去维护客户，产生互动与粘性，黏住客户。&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;产品运营思路&lt;/h3&gt;

&lt;p&gt;　　互联网产品的运营思路是什么呢?按我的理解来说,就是做一款解决目标用户痛点需求的工具获取第一波用户群,然后加入社交属性,让用户彼此交流,最后形成社区,沉淀用户。简单来说就是&lt;/p&gt;

&lt;p&gt;　　工具-社交-社区-增值服务-盈利模式闭环&lt;/p&gt;

&lt;p&gt;　　这里的例子很多：&lt;/p&gt;

&lt;p&gt;　　QQ:从在线即时通讯工具入手&lt;/p&gt;

&lt;p&gt;　　YY：从语音聊天入手&lt;/p&gt;

&lt;p&gt;　　hao123:从一个快速让你找到网站的导航入手&lt;/p&gt;

&lt;p&gt;　　唱吧:从一个可以在手机上唱歌的工具入手&lt;/p&gt;

&lt;p&gt;　　墨迹天气:从一个可以在手机上查天气的工具入手&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;微信运营思路&lt;/h3&gt;

&lt;p&gt;　　微信运营也一样,我们也要以产品运营思路来运营微信,把微信当做一个工具,解决粉丝痛点需求,积累第一波种子用户,目前微信产品运营上我大体给它分为两类:&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;A 从工具入手&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　便民服务:天气预报,快递查询,火车查询,违章查询,百科,股票查询,看电影&lt;/p&gt;

&lt;p&gt;　　餐饮行业:会员卡,优惠券,预订,查询排号进度&lt;/p&gt;

&lt;p&gt;　　酒店行业:预订,打折卡,会员积分&lt;/p&gt;

&lt;p&gt;　　旅游行业:门票预订,酒店预定,线路预订,机票预订&lt;/p&gt;

&lt;p&gt;　　。。。&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;B 通过内容聚合形成工具&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　上述A类是指那些具有开发能力的团队,如果你的团队不具备这样能力,那就通过高质量的内容聚合,形成一个小型工具,解决你目标用户群的痛点需求。这个思路大概如下：&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;第一阶段:高质量内容&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　这里有个内容差异化策略问题,就是你的内容要么质量高,要么专业权威,要么表现风格与众不同&lt;/p&gt;

&lt;p&gt;　　&lt;strong&gt;第二阶段:形成app，聚合内容，分类内容&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;　　将你的内容产品化,做成类APP形式，分类更加清晰,聚合力更强。&lt;/p&gt;

&lt;p&gt;　　如何判断内容质量：你的公众号内容自动转发率要超过5%（转发率＝转发数/阅读数）&lt;/p&gt;

&lt;p&gt;　　最后反问自己: 从产品运营思路上反问自己,&lt;/p&gt;

&lt;p&gt;　　1 我微信营销的目的是做什么?自媒体?卖货?做工具?&lt;/p&gt;

&lt;p&gt;　　2 如果是做工具,我要解粉丝什么痛点需求?预定,会员卡,优惠券,记住一个就够了..&lt;/p&gt;

&lt;p&gt;　　3 如果是做内容,我怎么去做差异化,我的内容更专业吗?分类聚合更清晰吗?表现风格与众不同吗?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.91yunying.com/8605.html&quot;&gt;（整理自网络）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>有哪些生活小习惯，慢慢地会改变人的性格或生活？</title>
   <link href="http://winares.github.com/2014/12/17/good-habbit"/>
   <updated>2014-12-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/12/17/good-habbit</id>
   <content type="html">
&lt;p&gt;对这方面有些研究，分享一些改变性格和人生的习惯，会慢慢更新一段时间，这会是一个很长的文章，请大家有些耐心。&lt;/p&gt;

&lt;p&gt;我花了好几年时间在研究习惯，同时在微信（read01）上发起 100 天行动，通过 100 天来培养一个好习惯，到 2014 年 12 月 7 号为止进行了 1 年半左右，有数万人参与，在各种不同途径收到几千人的反馈和总结，从大家的反馈过程中发现了很多有意思的现象，同时现在也在做一些习惯养成方面的培训，对这个问题有很多心得可以跟大家分享。&lt;/p&gt;

&lt;p&gt;先从只要你坚持就一定能改变你的性格或者生活的习惯来说：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141217.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;一、记录自己的时间花销&lt;/h3&gt;

&lt;p&gt;这个习惯能让你明白一件事情，你的时间哪去了？&lt;/p&gt;

&lt;p&gt;培养这个习惯花了好几年时间，这个习惯是时间管理中一入门就要做的，刚开始时可以按小时来记录，当时你记录一段时间之后，才能真正认识到自己的时间到底哪去了，真实的反映出自己把时间都花在哪了。&lt;/p&gt;

&lt;p&gt;人会有一种错觉，觉得自己如何努力，表现还行，当你开始记录和统计自己的时间花销之后，才会真正认识到一天中真正花在有意义事情的时间少得可怜，一不小心就会浪费很多时间。&lt;/p&gt;

&lt;p&gt;不管你是谁，有什么梦想，只要你看看你的时间花在哪了，就知道你是什么样的人，时间是没办法做假的。&lt;/p&gt;

&lt;p&gt;这个习惯的进阶技巧就是柳比歇夫的时间管理统计法，可以精确记录一天每分钟的时间花销。&lt;/p&gt;

&lt;h4 id=&quot;section-1&quot;&gt;推荐阅读&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjA3OTM0MA%3D%3D&amp;amp;appmsgid=100405140&amp;amp;itemidx=1&amp;amp;sign=4c27acc8445d3549f0a993dfaa89748e&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;From=test&quot;&gt;《奇特的一生》时间统计法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjA3OTM0MA%3D%3D&amp;amp;appmsgid=100407348&amp;amp;itemidx=1&amp;amp;sign=5f22c5821477bd53285db3691a4b4aaa&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;From=test&quot;&gt;时间统计法让你超越自己&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.read.org.cn/html/2178-shan-yong-ke-ji-tong-guo-ruan-jian-lai-ti-sheng-ni-de-xiao-lv.html?From=test&quot;&gt;善用科技–通过软件来提升你的效率&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;section-2&quot;&gt;在电脑记录你的时间花销&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;使用RescueTime或Hronos 来记录和追踪一下你在电脑上的时间花销。
两个软件不同之处在于，Hronos是只运行在本机的软件，而RescueTime是本机软件和网络统计服务相结合的软件&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;1、Hronos 能跟踪你花在每个程序上的时间，并且以使用百分比的形式提供完整的统计数据。这个绿色软件不需要安装，运行后它就会静静的呆在系统托盘区“监视”你，不需要你的干预。缺点是数据无法保存或导出，只能截图&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;2、RescueTime如何使用
首先需要在RescueTime网站上注册一个帐号，然后下载RescueTime软件并安装。启动软件以后出现的是配置对话框，需要输入刚才注册的帐户信息才能开始使用： 
输入完毕按下“Verify”登录，编辑框下方会显示“login success”登录成功。保存设置后就可以开始使用了。 
它会常驻内存，在后台记录每个软件的使用时间。默认每隔30分钟将记录到的数据上传一次（你可以在设置对话框的“Advance”页面中设置上传时间间隔）。 
你必须登录RescueTime网站才能看到统计数据。访问 &lt;a href=&quot;http://rescuetime.com/dashboard/&quot;&gt;RescueTime : Log in to RescueTime&lt;/a&gt;，就能看到统计图表了，它的图表非常的漂亮。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;目前已知的习惯中，这个习惯养成的难度是最高，需要几年的时间，最终目标是象柳比歇夫不看表就可以精确的感知时间。&lt;/p&gt;

&lt;p&gt;好消息是随着科技的发展，可以通过手环、手机和PC上的APP来半自动的记录和统计时间花销，期待有一天能做到全自动的记录和统计。&lt;/p&gt;

&lt;p&gt;把评论中的回复补充一下：&lt;/p&gt;

&lt;p&gt;这么说记录时间花销本身只是一个中性行动，不能激励你也不会产生焦虑和恐慌，只会让你有个清醒直观的认识，而你本身的态度会让你产生正面或负面的想法。对自己的要求别过高，别想一开始就追求完美，每天优先完成三件要事和一个梦想番茄（每天在梦想、年度目标上花费30分钟），记录下来，就可以了。&lt;/p&gt;

&lt;p&gt;从个人的感觉和别人的反馈来说，只有准确的数据才能反应真实的情况。自己的感觉在任何的时段都不可靠。 &lt;/p&gt;

&lt;p&gt;你可能没办法准确的统计和记录自己的产出，时间本身也是有不同质量的，并不是你花在学习上就一定有收获，同时产出本来也是比较模糊？我不知道你如何定义。&lt;/p&gt;

&lt;p&gt;学习上，有明确收益的叫产出? 陪家人，跟朋友吃饭，是产出吗？ 有很多的时间花销，不积累到一定程度之后，可能看不到明确而直接的收益。比如睡眠，如果你一年时间的睡眠记录，进行分享和统计，你能发生很多有意思的数据，你觉得睡眠是产出吗？&lt;/p&gt;

&lt;p&gt;再说记录，确保自己尽量少买不需要的东西，跟了解自己几年的花销比例是两回事，记帐跟买东西多少并没有直接的联系，但可以从总体的角度来了解自己的花费比例，哪怕你就是什么东西都不乱买，但还有会一些固定的花销，不可避免，而且这些花费会随着时间而变化，比如饮食，自己吃和在外面吃，记录几年后，你会发现你的饮食习惯就会跟经济、物价也能产生联系。还有交通费用、着装费用、人情来往，会随着收入、环境而有不同的变化，当你有一个很长的时间段数据，这些数据都会反应出真实的生活。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;二、记帐&lt;/h3&gt;

&lt;p&gt;对于你的时间哪去了和你的钱哪去了，绝大多数人都只能说出一个大概，当你开始记录和统计之后，就会发现很多你不在意的事情上，会花了远远超出你想象的比例。&lt;/p&gt;

&lt;p&gt;从自己身上找个例子：记帐一段时间之后，做统计之后，发现在不到3个月左右在饮料上竟然花了1000多了，平均每天在饮料上花了10元左右，以前只是有个大概有感觉，在饮料上花钱有些多，对具体的数量和费用没感觉。统计之后，发现自己的饮料上花费过多，费钱而且对健康不利，开始有意识的少喝饮料，多喝白水，花了几个月时间，最终把碳酸饮料完全戒掉，一点瘾也没有，现在偶尔也会喝零度可乐，但已经对饮料处于完全可控的情况。&lt;/p&gt;

&lt;p&gt;很多理财课程的第一步就是记帐，当你明白你的钱具体花费在哪些，哪些应该花，哪些不应该，就开始了财务自由的第一步。&lt;/p&gt;

&lt;p&gt;建议通过手机上的APP来随时记录自己的各项花销：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;重量级：挖财、随手记、支付宝帐单（所有的线上消费基本可以在这里汇总）&lt;/li&gt;
  &lt;li&gt;轻量级：DailyCost、Monny、Timi时光记账&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;section-4&quot;&gt;三、每天运动或定期运动&lt;/h3&gt;

&lt;p&gt;这是每个人从小听到大的建议，但只是极少数的人能真正做到，一旦当你养成这个习惯之后，你会发现这些习惯会影响你的整个生活，让你的世界完全不一样。 &lt;/p&gt;

&lt;p&gt;有运动习惯的人，整个人的精气神都会不一样，更不说当你身材比例合适的时候，穿什么衣服都好看。在这个习惯培养过程中，你会发现必须要改变你的生活方式才行，比如睡眠、饮食都需要同样需要注意和改变。而且运动会上瘾，并且能帮助你改变很多坏的生活习惯，已经看到不止一个人在培养慢跑和健身习惯过程把烟戒掉。&lt;/p&gt;

&lt;p&gt;这个习惯对性格、注意力、意志力、精神、拖延、忧郁上的改变能在很短的时间（2-3个）月就能看到效果，当养成成固定的运动习惯之后，每一次运动都在增加你的自信心、锻炼注意力和意志力，别小瞧这一点，会让你跟其它人立刻区别开来。&lt;/p&gt;

&lt;p&gt;在知乎上写过一个回答，分享了一些自己的改变：&lt;a href=&quot;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjA3OTM0MA%3D%3D&amp;amp;appmsgid=201684801&amp;amp;itemidx=1&amp;amp;sign=8a01f1c9d46dcbbd4aceca60b8a93ba4#rd&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;From=test&quot;&gt;体质极差的人如何从头开始恢复身体素质？（2）&lt;/a&gt;
运动并不是必须要要去健身房或出去慢跑才行，只要你真的想做，随时随地都可以做，推荐过一些APP、视频和最简单的方法可以帮助你从入门开始：&lt;/p&gt;

&lt;h4 id=&quot;section-5&quot;&gt;推荐阅读&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;《拉伸：最好的运动》适合在办公室里做的5个动作&lt;/li&gt;
  &lt;li&gt;运动App推荐&lt;/li&gt;
  &lt;li&gt;让我们每天做10分钟运动吧！&lt;/li&gt;
  &lt;li&gt;晚饭后进行15分钟步行有助减肥&lt;/li&gt;
  &lt;li&gt;想减肥吗?从每天多走2000步开始&lt;/li&gt;
  &lt;li&gt;腹部运动女生版&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;section-6&quot;&gt;四、定期总结&lt;/h3&gt;

&lt;p&gt;无论再怎么强调这个习惯的重要性都不为过，当你培养定期总结的习惯，能让你避免很多麻烦，可以参加以前在这个问题的答案：哪些你熟知的重要知识或方法，外人却常常因不了解而陷入困境？ - warfalcon 的回答&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;如果你从刚开始工作时就刻意的去记录自己所遇到的事情，包括正常工作、学到的经验，遇到的问题，每周或每月花了1、2天时间去分析自己的记录，不断的总结、分析和思考，你工作的一年时间可能比别人三年经验还要强，这个方法在目前我看到的所有行业和岗位中都适用。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;完全可以通过定期总结来提升生活的质量和延长生命的长度
定期总结这个习惯长期效果很好，但培养时间要几个月，看到效果也要几个月或几年。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjA3OTM0MA%3D%3D&amp;amp;appmsgid=10000637&amp;amp;itemidx=1&amp;amp;sign=63b7abdc4b43a8f7818173d278478c70&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect&amp;amp;uin=MjU4MjUyNzM2MA%3D%3D&amp;amp;key=0c00a07c3a04c3b0058f2bb584f1322b1bad92b11d8a2d49bcebd75267106da8995a17996c31f9ba8be80e62d438e709&amp;amp;devicetype=android-10&amp;amp;version=25000338&amp;amp;lang=zh_CN&amp;amp;pass_ticket=j8faVNcbpnq9M1aELDgbT3Ltp2zm%2B3d46Dy3aiwPIi410cTLQ15a%2Bs20O25bcP9b#wechat_webview_type=1#wechat_redirect#wechat_redirect&amp;amp;From=test&quot;&gt;100天行动之自我总结&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.zhihu.com/question/20170514/answer/14207126?group_id=526343795365773312&quot;&gt;我应该选择怎样的输出方式来启迪思维和总结自身？ warfalcon 的回答&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;section-7&quot;&gt;五、每隔几年学习一门新的技能&lt;/h3&gt;

&lt;p&gt;在看德鲁克《个人的管理》看到一段内容，反复读了好多遍，正在身体力行：
&amp;gt; 每过三四年，他就选择一个新的学科。例如，统计、中世纪史、日本艺术或经济学。要精通一门学科，3年时间的学习是绝对不够的。不过，要了解一门学科，3年的时间就足够了。 60多年来，德鲁克坚持一次选修一门学科。“这种学习习惯不仅为我打下坚实的知识基础，而且迫使我接触新学科、新学说和新方法，因为我学的每一门学科都有不同的假说，并且采用不同的方法论。&lt;/p&gt;

&lt;p&gt;因为时间关系，执行这个计划的时间还太短，从去年开始把精力放到慢跑和运动上，只用了三个月时间，体重就减掉了20多斤，现在一年过去了，这个习惯给我带来的收益大到无法想象。我期待再过一年左右，开始下一个学科的学习。
虽然今年30年多了，但才感觉到生命刚刚开始，有些非常多的知识可以选择和学习，我有足够的耐心和动力，去把这个习惯坚持下去，期待把这个习惯坚持到死为止。&lt;/p&gt;

&lt;h3 id=&quot;section-8&quot;&gt;六、静坐或冥想&lt;/h3&gt;

&lt;p&gt;静坐、冥想或、打座禅修都可以，这东西一深入，就能细分成很多种。这是极少数传统和科学都推荐的运动方式之一，有大量的科学研究、试验和论文都讨论这方面的优点。
随意找几项：&lt;/p&gt;

&lt;p&gt;1、有研究表明普通人跟禅修大师（1万小时以上禅修）在听起一些负面声音时（女人尖叫），禅修大师大脑中与情绪有关的杏仁体部分，显示出更少的激活反应。进行禅修越长的人，杏仁体的激活支应也就越少。杏仁体能直接影响你的情绪，反应越好，也是越冷静。&lt;/p&gt;

&lt;p&gt;2、而另一个研究表现，冥想之后会提高大脑左前额叶皮质的活跃度，降低右侧的额叶皮质的活跃度。左前额活跃度高让你呈现更多的正面情绪。而右侧的额叶皮质的活跃度提高之后，会让人表现出负面情绪。&lt;/p&gt;

&lt;p&gt;3、在威斯康星大学的一项初步研究中，研究人员发现：一位有经验的冥想者仅仅在15分钟的冥想之后，他血液中的干细胞数量就有了明显的上升。需要说明的是，这个测试只是一群好奇的科学家进行的一次随意调查，但是实验结果确实让人大吃一惊。在采访过程中，托瑞斯·泰勒几乎无法隐藏她的兴奋，称这一现象为“我见过的（干细胞数目的）最大的增长。”这一结果可能有助于解释冥想对于人类健康的巨大影响，定期进行冥想的人可能会：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;患中风的几率降低33%；&lt;/li&gt;
  &lt;li&gt;患癌症的几率降低50%；&lt;/li&gt;
  &lt;li&gt;患心脏病的几率降低20&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;看过一些这方面的书籍，去除一些夸张的部分，个人认为最终冥想或静坐能让你更冷静，释放压力，掌控情绪，提高注意力，改善睡眠质量，提高情商。用更专业的说法就是：神经可塑性，可以有目的的改变自己的大脑。&lt;/p&gt;

&lt;p&gt;冥想、静坐并不能立刻看到效果，在初期你需要花很多精力维持对于外在事物的关注—这种精力消耗非常大，会让我们感觉特别疲惫。&lt;/p&gt;

&lt;p&gt;任何人都可以闭上眼睛，花一个小时或者更长的时间进行思考，但这并不是冥想；冥想的质量远比冥想的时间和数量要重要得多。初期几分钟就足够了。&lt;/p&gt;

&lt;p&gt;每天坚持5、10分钟，看到效果要100天左右。收到过几十位，坚持静坐、冥想的反馈，坚持100天之后，改变的情况都非常的明显。&lt;/p&gt;

&lt;h4 id=&quot;section-9&quot;&gt;推荐阅读&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;《硅谷最受欢迎的情商课》&lt;/li&gt;
  &lt;li&gt;《贪婪的大脑》冥想的作用&lt;/li&gt;
  &lt;li&gt;增加注意力小技巧—-观察自己的呼吸&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://www.zhihu.com/question/26811466/answer/34723592&quot;&gt;（全文链接）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>大型网站系统架构演化</title>
   <link href="http://winares.github.com/2014/10/17/architecture-evolution"/>
   <updated>2014-10-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/10/17/architecture-evolution</id>
   <content type="html">
&lt;h3 id=&quot;section&quot;&gt;　前言&lt;/h3&gt;
&lt;p&gt;　　一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的，
它是随着用户量的增加，业务功能的扩展逐渐演变完善的，在这个过程中，开发模式、技术架构、设计思想也发生了很大的变化，
就连技术人员也从几个人发展到一个部门甚至一条产品线。所以成熟的系统架构是随着业务的扩展而逐步完善的，并不是一蹴而就;
不同业务特征的系统，会有各自的侧重点，例如淘宝，要解决海量的商品信息的搜索、下单、支付，例如腾讯，要解决数亿用户的实时消息传输，
百度它要处理海量的搜索请求，他们都有各自的业务特性，系统架构也有所不同。尽管如此我们也可以从这些不同的网站背景下，找出其中共用的技术，这些技术和手段广泛运用在大型网站系统的架构中，下面就通过介绍大型网站系统的演化过程，来认识这些技术和手段。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;一、最开始的网站架构&lt;/h3&gt;

&lt;p&gt;最初的架构，应用程序、数据库、文件都部署在一台服务器上，如图：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_1.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;二、应用、数据、文件分离&lt;/h3&gt;

&lt;p&gt;随着业务的扩展，一台服务器已经不能满足性能需求，故将应用程序、数据库、文件各自部署在独立的服务器上，并且根据服务器的用途配置不同的硬件，达到最佳的性能效果。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_2.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;三、利用缓存改善网站性能&lt;/h3&gt;

&lt;p&gt;在硬件优化性能的同时，同时也通过软件进行性能优化，在大部分的网站系统中，都会利用缓存技术改善系统的性能，使用缓存主要源于热点数据的存在，大部分网站访问都遵循28原则（即80%的访问请求，最终落在20%的数据上），所以我们可以对热点数据进行缓存，减少这些数据的访问路径，提高用户体验。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_3.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等，这个后面再讲。本地缓存，顾名思义是将数据缓存在应用服务器本地，可以存在内存中，也可以存在文件，OSCache就是常用的本地缓存组件。本地缓存的特点是速度快，但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是，可以缓存海量的数据，并且扩展非常容易，在门户类网站中常常被使用，速度按理没有本地缓存快，常用的分布式缓存是Membercache、Redis。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;四、使用集群改善应用服务器性能&lt;/h3&gt;

&lt;p&gt;应用服务器作为网站的入口，会承担大量的请求，我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求，根据分发策略将请求分发到多个应用服务器节点。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_4.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;常用的负载均衡技术硬件的有F5，价格比较贵，软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡，根据目标地址和端口选择内部服务器，Nginx和HAProxy是七层负载均衡，可以根据报文内容选择内部服务器，因此LVS分发路径优于Nginx和HAProxy，性能要高些，而Nginx和HAProxy则更具配置性，如可以用来做动静分离（根据请求报文特征，选择静态资源服务器还是应用服务器）。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;五、数据库读写分离和分库分表&lt;/h3&gt;

&lt;p&gt;随着用户量的增加，数据库成为最大的瓶颈，改善数据库性能常用的手段是进行读写分离以及分表，读写分离顾名思义就是将数据库分为读库和写库，通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分，水平切换则是对一个数据库特大的表进行拆分，例如用户表。垂直切分则是根据业务不同来切换，如用户业务、商品业务相关的表放在不同的数据库中。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_5.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;cdn&quot;&gt;六、使用CDN和反向代理提高网站性能&lt;/h3&gt;

&lt;p&gt;假如我们的服务器都部署在成都的机房，对于四川的用户来说访问是较快的，而对于北京的用户访问是较慢的，这是由于四川和北京分别属于电信和联通的不同发达地区，北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器，返回路径也一样，所以数据传输时间比较长。对于这种情况，常常使用CDN解决，CDN将数据内容缓存到运营商的机房，用户访问时先从最近的运营商获取数据，这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。&lt;/p&gt;

&lt;p&gt;而反向代理，则是部署在网站的机房，当用户请求达到时首先访问反向代理服务器，反向代理服务器将缓存的数据返回给用户，如果没有没有缓存数据才会继续走应用服务器获取，也减少了获取数据的成本。反向代理有Squid，Nginx。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_6.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-6&quot;&gt;七、使用分布式文件系统&lt;/h3&gt;

&lt;p&gt;用户一天天增加，业务量越来越大，产生的文件越来越多，单台的文件服务器已经不能满足需求。需要分布式的文件系统支撑。常用的分布式文件系统有NFS。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_7.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;nosql&quot;&gt;八、使用NoSql和搜索引擎&lt;/h3&gt;

&lt;p&gt;对于海量数据的查询，我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis，搜索引擎有lucene。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_8.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-7&quot;&gt;九、将应用服务器进行业务拆分&lt;/h3&gt;

&lt;p&gt;随着业务进一步扩展，应用程序变得非常臃肿，这时我们需要将应用程序进行业务拆分，如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者同享数据库来实现。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_9.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-8&quot;&gt;十、搭建分布式服务&lt;/h3&gt;

&lt;p&gt;这时我们发现各个业务应用都会使用到一些基本的业务服务，例如用户服务、订单服务、支付服务、安全服务，这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。淘宝的Dubbo是一个不错的选择。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20141017_10.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-9&quot;&gt;小结&lt;/h3&gt;

&lt;p&gt;大型网站的架构是根据业务需求不断完善的，根据不同的业务特征会做特定的设计和考虑，本文只是讲述一个常规大型网站会涉及的一些技术和手段。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/leefreeman/p/3993449.html&quot;&gt;（整理自网络）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>互联网产品的七宗罪</title>
   <link href="http://winares.github.com/2014/09/16/seven"/>
   <updated>2014-09-16T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/09/16/seven</id>
   <content type="html">
&lt;p&gt;&lt;img src=&quot;/assets/media/20140916_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;七宗罪（Seven deadly sins），13世纪道明会神父圣多玛斯·阿奎纳列举出各种恶行的表现。天主教教义中提出“按若望格西安和教宗额我略一世的见解，分辨出教徒常遇到的重大恶行”。七宗罪总结了七大类人类与生俱来且不可战胜的欲望。我们有必要思考一下，互联网到底是还是祭司还是恶魔。互联网带来的应用和服务，到底是帮助我们改善这些欲望、维护信仰的祭司？还是在充分利用人类天生的阴暗种下诅咒，并任其增长的恶魔？&lt;/p&gt;

&lt;h3 id=&quot;lust&quot;&gt;性欲（lust）&lt;/h3&gt;

&lt;p&gt;过分强烈的或放纵的性欲&lt;/p&gt;

&lt;p&gt;代表产品：成人网站、9158等聊天室、陌陌、豆瓣小组&lt;/p&gt;

&lt;p&gt;中国历史上对性文化避而远之的性格，并不能压抑人们对这方面最本质的需求，从落后的拨号上网时代至今，成人网站一直屹立不倒，面对越发成熟的网络监控和严厉的法律制裁，其依然通过将服务器转移至海外、网址更新器、社区发布信息、QQ群讨论等方式玩着猫捉老鼠的游戏。&lt;/p&gt;

&lt;p&gt;从远古时期刻在岩壁上让人脸红心跳的图画，到文字和印刷术出现后的成人书籍，再到影像技术成熟带来的成人录像带和成人光盘，人类一直在穷其所有，利用最先进的技术来做出承载着人类欲望的产品。&lt;/p&gt;

&lt;p&gt;目前各种视频聊天室如雨后春笋，很有些聊天室主播日薪过万；陌陌即使顶着约炮的帽子，也将用户做到了1亿；移动搜索引擎中每天近30%的色情需求；微信推出摇一摇之后彻底引爆了用户的指数级增长；豆瓣、比邻、贴吧、遇见，即使是秘密、糗百等，也到处洋溢着勾搭与被勾搭的情愫；在这个信息越来越发达、诱惑越来越多、人越来越寂寞的时代，那无处安放的荷尔蒙会让约炮文化来得更加猛烈！
小编只想说，未来的社交产品：条条大路同约炮！&lt;/p&gt;

&lt;h3 id=&quot;greedgluttony&quot;&gt;贪婪&amp;amp;暴食（greed&amp;amp;gluttony）&lt;/h3&gt;

&lt;p&gt;希望占有更多&lt;/p&gt;

&lt;p&gt;代表产品：棋牌游戏、彩票&lt;/p&gt;

&lt;p&gt;暴食的定义是放纵食欲和酗酒，但丁对其的解释还加上了囤积过分的食物。贪婪的意思是希望占有比所需要的更多，比起人类有限的需求，其想获取的总是更多。棋牌游戏的随机性和博弈机制是刺激人性赌性和贪婪，让人误以为找到了一条发财致富之道，从而将贪婪的本性再度放大而失去控制。而互联网的产品更是加剧了这种贪婪，让懒惰的人更懒，不断挖掘你的需求，来填满你无穷尽的欲壑；&lt;/p&gt;

&lt;h3 id=&quot;sloth&quot;&gt;懒惰（sloth）&lt;/h3&gt;

&lt;p&gt;浪费时间&lt;/p&gt;

&lt;p&gt;代表产品：视频网站、微博、淘宝等电商&lt;/p&gt;

&lt;p&gt;懒惰具体表现是懒惰、怯懦、容易满足和无责任感，具体表现有“不求上进”和“浪费时间”。&lt;/p&gt;

&lt;p&gt;社会进步是由懒人推进的，科技进步也在促使人们愈发懒惰，通过视频、有声读物对传统阅读的替代，电梯代替了爬楼，汽车代替了步行，洗衣机代替了双手洗衣，在微博和微信上点“赞”的人数要远远高于发表评论的人数，O2O、电商送货直接到家（以后如果报道说某人几年没出家门你一定不要吃惊）。&lt;/p&gt;

&lt;p&gt;人们的懒惰还体现在各类游戏设计的升级与PK模式中，用户从游戏中获得的快乐基本都是基于过程的单调重复。比如，大部分游戏设计的升级模式都是各种“砍”，从静态的木桩到动态的怪物，连动作都出奇的一致。&lt;/p&gt;

&lt;h3 id=&quot;wrath&quot;&gt;愤怒（wrath）&lt;/h3&gt;

&lt;p&gt;对别人的憎恶并产生报复的冲动和行动&lt;/p&gt;

&lt;p&gt;代表产品：微博、游戏&lt;/p&gt;

&lt;p&gt;愤怒是由于憎恶而引发的不正常的感觉，在律法所赋与的权力以外，行使惩罚他人的意欲。&lt;/p&gt;

&lt;p&gt;竞争压力变大、人的耐心变差，你一定发觉了网络上的暴民要比现实从多很多，从各种贴吧爆吧，到网络论战、口水战，从“不转不是中国人”，到各新闻下方的谩骂和反对评论更容易被亮；一个关于微博的研究发现，如果你的微博好友发了一条泄愤的微博，你也更容易跟着愤怒起来。&lt;/p&gt;

&lt;h3 id=&quot;envy&quot;&gt;嫉妒（envy）&lt;/h3&gt;

&lt;p&gt;因对方所拥有的资产或其他美好事物比自己丰富而恼恨他人&lt;/p&gt;

&lt;p&gt;代表产品：社交网络&lt;/p&gt;

&lt;p&gt;嫉妒跟贪婪一样，是一种因不能满足的欲望而产生的罪恶。贪婪通常与物质财产有关，而妒忌则跟与爱情、他人的成功等精神层面的东西有关。但丁说，嫉妒对自己资产的喜爱变质成了忌恨其他更美好事物的拥有者。嫉妒产生的原因是贪婪，造成的后果是愤怒。&lt;/p&gt;

&lt;p&gt;嫉妒源于我们自己与其他人的横向比较，它不是一个绝对值概念，而是一种进行比较后的落差和“为什么他有我无”的心态。信息孤岛的时代，彼此间无法进行高效、快速和实时更新的信息交互，所以我们受刺激的机会相对较少，引发我们嫉妒的来源也相对有限。&lt;/p&gt;

&lt;p&gt;但互联网带来了穷凶极恶的社交网站，从早期的ChinaRen同学录，到后来的校内和QQ空间，再到现在的微博和朋友圈，一时间同学、朋友的各种信息全部触手可及并保持持续更新。
信息的流动和透明使我们总能在第一时间知道对方的各种情况，这给我们带来了比之前更多的横向比较机会，从而使我们更容易心生妒忌。每当我们使用社交工具，我们都会被“为何当年的学渣变成了土豪”、“为何同行小伙伴可以去马代而我却一直在马甸”、“为何大佬去澳洲跳伞而我现在却想跳楼”等问题所勾引出嫉妒欲。&lt;/p&gt;

&lt;p&gt;我们之所以对那句“朋友圈里总有那么一两个只要他一发照片你就想骂SB的人”的吐槽如此感同身受，是不是因为我们内心的嫉妒在从中作祟？&lt;/p&gt;

&lt;h3 id=&quot;pride&quot;&gt;傲慢（pride）&lt;/h3&gt;

&lt;p&gt;过度迷恋自己及对他人凶残&lt;/p&gt;

&lt;p&gt;代表产品：所有互联网产品&lt;/p&gt;

&lt;p&gt;当回想能典型代表傲慢的互联网产品时，却发现几乎所有的互联网产品都与傲慢有关，甚至于所有的人类行为，人与人之间、人与物之间都存在傲慢，只是我们从未发觉。这里的傲慢不是我们通常认为的那种带有极大贬义的骄傲，而是一种人类属性，是一种应激性的自我保护，完全不涉及褒贬。这也是但丁为何要把傲慢作为第一宗罪：嫉妒产生的原因有两方面，主观原因是源于我们自身的贪婪，而客观原因是其他人的傲慢。&lt;/p&gt;

&lt;p&gt;我们每个人都会积极寻找自己在智力、知识、技能、权力、金钱、外表、地域等方面的某些优势，并通过炫耀对其他人产生凶残的打击。傲慢使我们千方百计的将自己相对美好的一面展现出来，如同一个表演欲旺盛的演员在众人面前起舞，而互联网让舞者戴上了面具，使我们可以将真面目隐藏在黑暗中，从而更加肆无忌惮的展示自己，至于是优雅的芭蕾舞还是低俗的脱衣舞，我们全然不顾。
每个人都能找到傲慢的资本和渠道，而每个人犯下的傲慢之罪也远远超出了自己的想象。&lt;/p&gt;

&lt;h3 id=&quot;vanity&quot;&gt;虚荣（vanity）&lt;/h3&gt;

&lt;p&gt;并不属于原本天主教义七宗罪之一，与嫉妒相对&lt;/p&gt;

&lt;p&gt;代表产品：iPhone、朋友圈、美图秀秀、QQ、打飞机等&lt;/p&gt;

&lt;p&gt;微博、QQ空间、人人网等社交网络本身是炫耀虚荣的舞台，晒一下或者秀一下满足虚荣心理。知乎的回答一下获得赞的数量是另一种虚荣。
层出不穷的因为想买iPhone而出现的新闻，卖肾、卖初夜、偷钱、抢劫，无疑不是虚荣心拖动的，而QQ显示“iPhone在线”同样如此；聊天室中为主播一掷千金的屌丝、QQ等级、点亮图标、QQ靓号、微博加V等等，都是利用人们无限虚荣衍生的经济。&lt;/p&gt;

&lt;p&gt;美图秀秀曾上线了一款专注女生美颜的应用美颜相机，上线三天就获100万安装量，39天破 1000万；微信5.0的打飞机成了全国最热的游戏，火爆到了如果分数没有上百万简直都不好意思跟人打招呼。上一次热潮是偷菜和抢车位，为了满足虚荣心，很多用户甚至使用外挂来刷分。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.tmtpost.com/86732.html&quot;&gt;（整理自网络）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>为什么你的“努力”一文不值？</title>
   <link href="http://winares.github.com/2014/09/02/endeavor"/>
   <updated>2014-09-02T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/09/02/endeavor</id>
   <content type="html">
&lt;p&gt;&lt;img src=&quot;/assets/media/20140902_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;让一个研究生男收集一份资料，快下班了问结果，竟然毛也没有。见我要怒，他慷慨激昂地说：”我已经很努力找了，但真的查不到。”&lt;/p&gt;

&lt;p&gt;作为主管，“我已经努力”这话我不知听过多少次，每次都要面对一张无比诚恳的脸。但我要说：你的“努力”一文不值！&lt;/p&gt;

&lt;p&gt;【一】&lt;/p&gt;

&lt;p&gt;工作以后还把“努力”当免死金牌的人，都是混入职场的“学生党”。当年他们考试没考好的时候，因为已经头悬梁锥刺股地努力了，所以父母心疼，老师同情，摸摸他们的小脑袋说“没关系，下次继续努力嘛”。而到了职场上，你最好不要再嗑这些从学校带出来的药丸。如果你还是没有脱瘾，那建议你问自己三个问题：&lt;/p&gt;

&lt;p&gt;1）你可以不“努力”吗？&lt;/p&gt;

&lt;p&gt;当然不行。&lt;/p&gt;

&lt;p&gt;因为“努力”这两个字，本就应该是每个人站在职场起跑线时的觉悟。这是最基本的角色设定。一个整天把“我已经努力”挂在嘴边的人，就像警察喊着“我要见义勇为”、医生嚷着“我要救死扶伤”，不是很可笑的事吗？&lt;/p&gt;

&lt;p&gt;2）你的工资是按“努力”来计算的吗？&lt;/p&gt;

&lt;p&gt;当然不是。&lt;/p&gt;

&lt;p&gt;绩效的构成，无非是任务完成的数量和质量，也就是你做了多少和你做得多好，与你流了多少臭汗没有半点关系。“努力”了一天却没有像样的结果，那你今天对公司的贡献就是零。如果一家公司全是像你这样“努力”的人，你说前景会是如何？&lt;/p&gt;

&lt;p&gt;“工作是否完成”是基数，“你有多么努力”是系数。残酷的事实是，当基数为零时，系数再大也没有任何实际价值。试想，如果成龙没有那些好作品，他一身的伤还有意义吗？如果爱迪生没有找到钨丝，那他之前的上千次失败，还有谁会去在意？&lt;/p&gt;

&lt;p&gt;3）甲乙两个人，甲每天加班到半夜十二点，连老婆生孩子都是请假一小时去瞄一眼然后回来继续玩命干活，但任务还是完不成；乙每天上班喝咖啡看杂志，准时下班零延误，但交代的任务却完成得妥妥的。请问，你更欣赏哪一个？&lt;/p&gt;

&lt;p&gt;当然是乙！&lt;/p&gt;

&lt;p&gt;不用“努力”就把工作做好的人，才是精英。如果你“努力”了还是做不好，那你干脆辞职吧——既然你完全燃烧了小宇宙都还是不行，那你实在不能胜任这份工作。所以按照这个逻辑，如果你还想干下去，那越是工作没做好，就越不能声称自己“努力”了，反而要说“我还不够努力”，才能隐藏自己能力的天花板，让别人对你还抱有希望。&lt;/p&gt;

&lt;p&gt;【二】&lt;/p&gt;

&lt;p&gt;“努力”这样的褒义词，最好留给别人去评价，而不是自已来标榜。就像别人说“你好帅”，那才是真的帅；自己说“我好帅”，那是真的不要脸。&lt;/p&gt;

&lt;p&gt;可为什么很多人还是忍不住要说呢？一是看得见的成绩拿不出来，所只好拿无形的“努力”来充数；二是知道自己的“努力”肉眼无法识别，不喊出来就被当空气——其实不过是“此地无银三百两”。&lt;/p&gt;

&lt;p&gt;“我已经努力”这话，无非是掩饰自己叫苦、认怂的熊样：“我已经累到不行了，这活儿还是别找我了吧。”这样的情况出现三次，基本就耗光主管对你的信任。&lt;/p&gt;

&lt;p&gt;有的人嘴上说“我已经努力”，但身体却很老实，坐得慵慵懒懒，戴着耳机，吃着水果……心理学家说，肢体动作占印象分的55%。所以，如果主管看不见你努力的身姿，又怎么相信你努力了呢？&lt;/p&gt;

&lt;p&gt;如果是一个团队项目，上级问责的时候，抢先说“我已经努力”的人，注定要遭众怒——“就你一个人努力了，我们都是懒羊羊是不？！”而你看那些明星，每天收工后都要对片场里的所有人说“你辛苦了”——因为肯定别人的努力，才能得到更多的支持。&lt;/p&gt;

&lt;p&gt;越是把“我已经努力”挂在嘴边的人，其实越难成功。因为成功者懂得保持优雅，而隐藏努力的狼狈。就像天鹅在水上轻松优雅地游着，但其实它们的脚在不停运动，只是藏在别人看不到的水下。&lt;/p&gt;

&lt;p&gt;【三】&lt;/p&gt;

&lt;p&gt;如何体现“努力”的价值？一是取得实质的成绩，二是要增加“努力”的可见度。尤其是碰上不可能完成的任务，再怎么努力也不可能有好的结果，这时更要让主管能看到你的“努力”。L是我带过最得力的手下，同样是搜集资料这样简单的工作，这个充满灵气的姑娘，第一次就给我很大惊喜。她是这样做的：&lt;/p&gt;

&lt;p&gt;1）列出已搜索的关键词组合，附上关联性最强的结果。&lt;/p&gt;

&lt;p&gt;以往我和研究生男的对话往往这样：&lt;/p&gt;

&lt;p&gt;“各种关键词都试了吗？”&lt;/p&gt;

&lt;p&gt;“都试了。”&lt;/p&gt;

&lt;p&gt;“这个试了吗？”&lt;/p&gt;

&lt;p&gt;“……没有。”&lt;/p&gt;

&lt;p&gt;“那个呢？”&lt;/p&gt;

&lt;p&gt;“……没有。”&lt;/p&gt;

&lt;p&gt;于是，我的脸色越来越难看，语气越来越严厉。&lt;/p&gt;

&lt;p&gt;L的做法避免了这样绝望的对话。我一眼就能看出她已做了各种努力的尝试，而且一目了然地就能发现她存在的问题，做出明确的指导。其实L和研究生男存在同样的盲区，但我面对她时，语气是正向的，态度是和蔼的。为什么会有这样的不同？因为她把自己的工作过程记录下来，让我看到她努力的轨迹；而研究生男的“努力”口说无凭，叫我如何信他？&lt;/p&gt;

&lt;p&gt;2）把搜集的资料汇编成精炼的提要。&lt;/p&gt;

&lt;p&gt;这是在我指令之外的主动升级，所以让我格外欣赏。按要求完成工作，只是六十分的努力；超乎要求地完成工作，才能获得超乎期待的评价。就像你为老公切水果，那叫做家务；但如果你懂得把切好的水果摆成心形，那就叫创造生活的惊喜，应该得到一个吻。&lt;/p&gt;

&lt;p&gt;研究生男偶尔也会找到一堆资料，意气风发地把几万字发我邮箱，让我看到吐血（吐血的主管，只能对你狠狠吐槽）。而L的做法好处有二：一是表明这几万字资料她全部看过，因为编出的提要就是她努力的证明；二是节约了我的时间——你花一天搜集的资料，难道还要主管再花一天看一遍？下属最重要的职责，就是要为主管减负，郁郁不得志的诸位不妨自我考评。&lt;/p&gt;

&lt;p&gt;3）积极请求他人援手。&lt;/p&gt;

&lt;p&gt;有个教育经典故事是这样说的：父亲让孩子移走花园里的石头，孩子想了各种办法，石头纹丝不动。父亲问：你用尽全力了吗？孩子说是。父亲说：不，你还没有尽全力，因为我就在你旁边，你却没向我求助。&lt;/p&gt;

&lt;p&gt;很多人把“努力”与“埋头苦干”简单划上等号，其实，努力求助他人，也是一种努力。有时你抓耳挠腮也解决不了的问题，坐在你隔壁的人早知道答案，你要做的就是带上谦虚的微笑和动听的话语，请这位高人指点迷津。L就请公司编译部的同事，帮忙查找了国外的资料，这样善于协作的下属，实在是每个主管所乐见的。她还及时求教了我——主管往往掌握了完成指令的究极钥匙，只要你的问题有足够的含金量，没有理由得不到指点。所以看着研究生男那憋屈的脸，我很想说：“你还没有努力，因为我就在你旁边，你却没向我求助。”&lt;/p&gt;

&lt;p&gt;【四】&lt;/p&gt;

&lt;p&gt;台北著名的欣叶餐厅，早年有一招传遍业界：老板明知座无虚席，还要叫自己儿子在候位的客人面前，反复去看有无空位。他儿子看似白跑了整个晚上，其实客人感受到了这家店待客的热忱和满满的努力。&lt;/p&gt;

&lt;p&gt;“努力”是越说越不值钱的东西，只有做出来才能变现。努力是一种精神，但要让你的努力有价值，既需要智商，更需要情商。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.douban.com/note/411141183/&quot;&gt;（来源）&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>记忆中的朴树</title>
   <link href="http://winares.github.com/2014/07/21/pu-shu"/>
   <updated>2014-07-21T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/07/21/pu-shu</id>
   <content type="html">
&lt;p&gt;仿佛就在一夜之间，朴树又重新回归人们的视线，社交媒体上疯传的电影主题曲《平凡之路》，似乎宣告着记忆中的那个不羁青年又回来了，但这个青年如今已逾不惑之年，青春不在，只留下那熟悉的旋律响彻耳旁。也许是一个巧合，就在人们热议着朴树的新作之时，他的昔日伴侣周迅也传出婚讯，可能也算是另一种支持吧。&lt;/p&gt;

&lt;p&gt;记得刚开始接触朴树还是他的那首成名作《白桦林》，要说到真正开始喜欢这个歌手还是在他第二张专辑（也是到目前为止他的最后一张专辑）发布之后，而这张卡带也被珍藏到了现在。成名之后的朴树也未像一般的歌手那样活动频繁，演出不断，一段时间之后，竟逐渐淡出人们的视野，之后听闻的也就是他和张悬以《树与花》为名的巡演。再这一等就是十年之后的这首新作，歌曲还是延续了朴树的一贯风格，但歌曲的内在含义远比歌曲本身重要的多，这首歌更像是朴树十年的心得体会，平凡之路才是生活的最真实写照。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140717_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;关于朴树有太多不同的看法，他似乎也从不属于主流的歌手，跟多的是被贴上文艺青年的标签，南方周末上的一篇&lt;a href=&quot;http://weibo.com/p/1001603733355169488204&quot;&gt;歌手朴树成长史&lt;/a&gt;对他的生平做了一个比较详尽的介绍，生活中的他从来都是活在自己的世界中，唱着属于自己的歌，我想这也是为什么有那么多人喜欢他的原因吧。&lt;/p&gt;

&lt;p&gt;《平凡之路》的火爆一点都不出人意料，朴树和韩寒风格气质有些过分的相近，两人的合作似乎再合适不过了，加上《后会无期》在媒体上不断地造势宣传，再加之歌曲本身的品质和其传递的深意，可以说这首歌想不火都难。但这首歌是不是预示着朴树要重回主流视野之中，我想未必，最主要的原因还是朴树本身的气质和他的性格，他注定不是媒体的宠儿，他注定是在自己的世界里唱歌的那个人。&lt;/p&gt;

&lt;p&gt;十年恍若隔世，但朴树似乎还是那个朴树，那个不受世俗约束的少年，人虽老去，歌声不老，感谢他的那些动人旋律和充满情感的内心，就像《生如夏花》歌词中写到的那样：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;我从远方赶来恰巧你们也在&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;痴迷流连人间我为她而狂野&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;我是这耀眼的瞬间&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;是划过天边的刹那火焰&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;我为你来看我不顾一切&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;我将熄灭永不能再回来&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;我在这里啊&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;就在这里啊&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;惊鸿一般短暂&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;像夏花一样绚烂&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>如何成为一个卓越的程序员</title>
   <link href="http://winares.github.com/2014/07/17/how-to-be-a-great-software-developer"/>
   <updated>2014-07-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/07/17/how-to-be-a-great-software-developer</id>
   <content type="html">
&lt;p&gt;作者是Rails/Angular开发者，企业家&amp;amp; YC alum。早先创建了Clickpass.com网站并出售。目前担任&lt;a href=&quot;http://brojure.com&quot;&gt;Brojure.com&lt;/a&gt;的OTO（唯一O（only）TO），兼职&lt;a href=&quot;http://www.entrepreneurfirst.org.uk/&quot;&gt;entrepreneur first&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;如果有一件事是开发者都关心的，那就是成为更优秀的开发者。那你应该从哪里开始呢？你是否应该积累一些附加的卖点：比如专研Node知识和no-sequel？或者你应该死记硬背专业的网关问题答案，并能按要求立即写出冒泡排序算法和短连接算法吗？或者有其他更基本和关键的东西更值得你投入?&lt;/p&gt;

&lt;p&gt;我相信，作为一个程序员的资历和价值并不是以你所知道的东西来衡量的，而是通过你做出多少成就来衡量的。这两者是相关的，但又有本质的不同。你的价值是你如何推动项目前进，如何鼓励你的团队也这样做。在我十五年的开发生涯中，我从来没有需要实现一个冒泡排序算法和短链算法。不过，我花费了成千小时来编写和重构账户管理工具，编辑套件，缓存逻辑，邮件接口，测试套件，部署脚本，JavaScript分层，分析架构和文档。这些都是有价值的事情，完成了这些事情推动了我们的前进。&lt;/p&gt;

&lt;p&gt;那些微小的组件是构建项目的砖瓦和沙砾，需要成百上千小时的辛劳工作来组建。尽管它们被用来组装复杂系统，它们本身却不应该是复杂的。你应该将简化这些组件作为目标。多年来，我学会简单可以通过假以时日的不断工作和重构来达到，而这比纯粹“灵感一闪”的思考更容易得多。&lt;/p&gt;

&lt;p&gt;简单和卓越通过一些事情或者任何可以让工作完成并从回头重新审视这样的过程来不断完善，这是最可靠的路径。这也是那些公司和MVP试图深入我们意识观念的真谛，软件也是如此。从一些可工作但丑陋的解决方案开始，你不断应用这个丑陋和怪异的方案，不断重构它为最简单的形式。简单从工作中比“灵光一闪”来得更为可靠。通过写代码比费力思索更加可预期。简单来自努力。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;衡量一个开发人员的价值，不是通过你能达到的某个点的高度值，而是在于你表现线下的面积值。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458594994954469376&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;对于聪明的懒人来说，他们可以轻易展现自己的卓越才华，亮瞎同龄人的双眼，然而公司却不能建立在这些人之上，产品也无法落实在那些“卓越的才华”上。公司是由那些每天进出办公室，提交良好的代码，并且也让其他人也干同样的事情的团队和个人。伟大的产品由勤奋的驭马驱动，而不是由那些盛装的舞步马推动的。&lt;/p&gt;

&lt;p&gt;多年之前，Joel创造了“明星程序员”这个词多，它依赖公司对需要这样缺乏合作的极客来完成所有事情的误解。的确存在拥有这样特质的人，但是人数不多。你发现他们的聪明缺乏规律——让他们感兴趣的事情表现得惊人的聪明，然而在和其他人协作或与团队无缝合作时，又显得无法抱有期望。&lt;/p&gt;

&lt;p&gt;他们的成果是无法预期的，但是他们的成就又让人艳羡，而且更具传染性。他们的傲慢可能伤及到团队的其他人员。它大声而且响亮地释放这样的信号：如果你够聪明，你可以选择你何时工作和你干什么。你成为了一个“Developer in Residence”。你不但吸取了薪水，也扭曲了你周围工作人员的价值。&lt;/p&gt;

&lt;p&gt;所以现实是，你和你的团队更可能依靠或者说应该依靠于那些值得依靠并可靠工作的人，而不是那些自认为是“明星程序员”或者“编程忍者”的人。&lt;/p&gt;

&lt;p&gt;卓越的开发者不是那些上手就可以写出冒泡排序或者短链接算法的人。他们是你一旦将其安排在项目中工作，就会不停推动和鼓舞周围每一个人来做到一样的人。让明星程序员滚蛋，雇佣那些可以驾驭的驭马（Fuck Rockstars. Hire workhorses），下面一些方法值得借鉴：&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;为你的函数和变量取个好名字（编写见名知意的代码）&lt;/h3&gt;

&lt;p&gt;这是一个难以置信的简单开始，但是我认为它是编程中最重要的技巧之一。函数命名是问题定义直接表现，坦白的说，是编程最难的部分。（编注：ITWorld 在2013年发起的一个投票，结果显示：《&lt;a href=&quot;http://blog.jobbole.com/50708/&quot;&gt;程序员最头疼的事：命名&lt;/a&gt;》）&lt;/p&gt;

&lt;p&gt;名字是你代码的的边界条件，命名是你应该解决的首要问题。&lt;/p&gt;

&lt;p&gt;如果你的命名是正确的，也解决了边界条件，使用这样的名称，你几乎不可避免编写出了高功能的代码。&lt;/p&gt;

&lt;p&gt;考虑这样的函数：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def process_text string
…
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;它几乎没有透露它准备做什么或者是怎么实现的，但是：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def safe_convert_to_html string
...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;它告知了接下来会发生什么，通过这个函数你可以预期它会完成什么，并且你可以多大程度重载这个函数。&lt;/p&gt;

&lt;p&gt;开发者可能会很高兴重构一个“process_text”函数，同时将字符串转换为HTML标签并自动嵌入视频。不过，这在一些使用这些函数地方时可能是完全不期望的。一旦你改动了它，你就制造了bug。一个清晰的名称，不但保住函数会做什么，也表明了它不会做什么。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;函数名称为函数和调用它们的代码之间创建了契约关系。好的命名定义了好的架构。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458595617233989632&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一个好的函数，承诺了它会交付什么并如期望地交付了。好的函数和变量名称，不但使得代码更加清晰易读，也为你纵横交错的代码库建立了成千上万的约束。草率的命名意味着草率的约束，缺陷，甚至建立在它们之上更加草率的契约。&lt;/p&gt;

&lt;p&gt;不仅仅是函数命名可以衡量你的代码质量，变量命名也应该加强。有时为了简化，值得创建一个变量名来自注释代码逻辑。&lt;/p&gt;

&lt;p&gt;以下面的内容为例：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (u2.made &amp;lt; 10.minutes.ago) 
&amp;amp;&amp;amp; !u2.tkn 
&amp;amp;&amp;amp; (u2.made == u2.l_edit)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;糟糕的变量名称使得你很难弄清楚到底正在发生，甚至哪怕你这样做了（成功了），你也难以保证100%清楚原作者意图是做什么。它什么也没告诉你。&lt;/p&gt;

&lt;p&gt;“and not”声明经常让人困惑（请永远不要编写“and not”与名称结尾的代码），如果你的工作是重构这样的代码，你不得不做一些复杂的猜测来推断它原始的含义。&lt;/p&gt;

&lt;p&gt;不过：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (new_user.created_at &amp;lt; 10.minutes.ago) 
&amp;amp;&amp;amp; !new_user.invitation_token 
&amp;amp;&amp;amp; (new_user.created_at == new_user.updated_at)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;我们将这些变量修改为一些更有意义的名字，代码的含义立马就变得更清晰了：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user_is_recently_created = user.created_at &amp;lt; 10.minutes.ago
invitation_is_unsent = !user.invitation_token
user_has_not_yet_edited_profile = (user.created_at == user.updated_at)
 
if user_is_recently_created 
&amp;amp;&amp;amp; invitation_is_unsent 
&amp;amp;&amp;amp; user_has_not_yet_edited_profile
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;我们还可以进一步要求对 if 语句声明中的每一部分进行分离，命名组件并做文档注释。&lt;/p&gt;

&lt;p&gt;需要一些勇气来写像“user_is_recently_created”的变量名，因为这样的命名逻辑模糊。不过我们时不时这样做了，并且承认这告知了代码阅读者你做了什么假设。&lt;/p&gt;

&lt;p&gt;注意，这些方法比使用注释要更加有效。一旦你改变了代码逻辑就会要求你改变变量的命名，而使用注释却无法强制这一点。我很认同DHH，注释是危险的并且容易腐朽——最好是编写自注释的代码。&lt;/p&gt;

&lt;p&gt;代码自注释越充分，其他人就更可能按照其初始的意图来实现它，代码也会有更好的质量。记住，在计算机科学中只有两类问题最难：缓存失效、命名和off-by-one错误。（我怀疑作者是写错了，这是三个…）。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;如果你想成为一个伟大的开发者，请确保你写的代码让人见名知意：也就是说代码精确地完成了它名字告诉的东西— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458596274322046976&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;在学习广泛之前先精深某一方面——从里到外学习你选择的技术栈。&lt;/h3&gt;

&lt;p&gt;只有非常少的编程问题是真正新的。很多公司所做的技术工作，是之前的许多团队已做过的。在Stack Overflow上吸引眼球的问题很少没有在其他地方遇到过。&lt;/p&gt;

&lt;p&gt;因为这个确切的原因，你正在努力做的大部分事情，已经被你当前使用的技术栈解决过了。我有一次使用了Rails自带的简单而强大的方法，将其他人写的60多行Rails代码重构为一行语句。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;大多数程序浪费了大量的时间，用于重新实现那些现有的功能。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458596571962441729&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这不仅浪费了他们的时间，而且他们新构建的代码冗长且含有很多错误。新的代码需要新的文档注释，新的测试来检查，也让代码充满噪杂，并且难以阅读。和其他新代码一样，也容易产生bug。使用技术栈经过严谨测试并且实际验证的代码，很少产生bug。&lt;/p&gt;

&lt;p&gt;如果你是一个Ruby的开发者，请花时间好好学习Ruby，尤其是数组的那些惊人多的方法。如果你是Node的开发者，请花时间了解它的架构、方法及理念体系。如果你是一名Angular的开发者，你应该敢于挑战，并理解正由核心团队锤炼的那不可思议的架构背后的逻辑。在你重新发明之前先询问。你行走在巨人的阴影下，花费一些时间找到他们的踪迹，然后你会对他们已经建立的东西感到惊叹。因为，如果你不这样做，你只是把问题推给了后面的人，别人会指出为什么你偏偏选择了你自己的小路走。&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;学会辨识糟糕的代码&lt;/h3&gt;

&lt;p&gt;有时候，我注意到一些程序员挺不错的，只不过他们趋于安逸，并没有意识到他们的代码其实可以写得更好。这对于你个人的发展是一件极为糟糕的事情，在你知道如何改进之前，先要知道什么是需要改进的。知道好的代码应该是怎么样的，坏的代码长得怎么样。据说，象棋大师比普通棋手花费多得多的时间，来学习其他优秀棋手的如何下棋。我非常确信这对于开发者来说也是对的。&lt;/p&gt;

&lt;p&gt;能觉察到代码异味，是提升你能力的重要的武器之一——哪怕只是有一点点异味或者闻起来可能有点异味。异味代码，你可能不知道为什么，仅仅是觉得哪里不对的代码。&lt;/p&gt;

&lt;p&gt;你可能做某件事情用了60行代码感觉这很简单，这也可能让你觉得应该交由语言本身来处理却被程序员手动处理了的感觉，也可能是你觉得这段代码糟糕透顶且难以阅读。这就是代码异味。&lt;/p&gt;

&lt;p&gt;这不是件容易的事情，但是经过一些年，你会发现哪些代码存在异味，漂亮的代码应该是怎么样的。你会开发出对代码的审美观，对于丑陋事物所带有的丑陋理论会让你感觉很不舒服。简单即是美，而简单正是我们所需要的。&lt;/p&gt;

&lt;p&gt;真理是，真实有时候是丑陋的，但是你应该不断地追求美丽，并且当你感觉丑陋无法避免，你知道如何优雅地展示它。如果你不能编写出优雅的代码，最少创建一个史莱克式的代码，而在这之前，你需要培养出对代码异味的感觉能力。如果你不知道好的代码是怎么样的，坏的代码看起来是怎么样的，那你怎么会想到去改进它呢。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;编写可读性良好的代码&lt;/h3&gt;

&lt;p&gt;我有一次听Joel Spolsky说，Stack Exchange不是针对提出问题的人进行优化，而是对阅读答案的人进行优化。为什么呢？因为相较于提出问题的个人，有多得多的人会去查看答案——应用最大化原则应该对读者进行优化，而不是提问的人。&lt;/p&gt;

&lt;p&gt;我觉得你可以同样的方式对待代码。它可能只是由你一个人写一次。但是它可能被其他许多人阅读和编辑。你的代码具有两个功能：其一是满足你当前的工作，其二是面对在你之后的每一个人，因此代码应该始终对可读性和可理解性进行优化。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“代码编写一年后，从原作者眼光来说，也是全新的代码” — Peter Nixey&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://ww3.sinaimg.cn/bmiddle/7cc829d3jw1e45mugorr1j20dw0a0jrs.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;你代码里面假定什么？你的方法实际返回什么？这个四层嵌套的 if/else if and not/unless 声明究竟是在区分什么？&lt;/p&gt;

&lt;p&gt;有时候你需要的不仅是好的变量名，你也要围绕着代码进行测试，看它究竟需要什么，并使得代码经久耐用。有效的代码是可以工作的代码，并且始终工作，即使被公司里每一个人都改过，都还能如常运行。&lt;/p&gt;

&lt;p&gt;写的每一行代码，其读者会是那些对此不感兴趣的，或者时间紧迫的团队成员，他们可能要在接下来一年时间扩展这些代码。请记住，那个不感兴趣，或时间紧迫的人，或许就是你自己。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;根据代码的生命周期来评估特性价值，而不是它的实现成本。&lt;/h3&gt;

&lt;p&gt;新的开发者总是喜欢探索和发挥。他们喜欢最新最炫的东西。无论是Nosql数据库，还是高并发的移动服务，他们想尽快了解和掌握所有这些东西，用完这些玩具，就撇下一堆垃圾给下一个开发人员来擦屁股。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;狗不是为圣诞节准备的，特性也不是为下一个发布版本准备的。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458597632248930304&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;功能和架构的选择，会影响所有你在这之上构建的东西。一旦抽象泄露，你在抽象中陷得越深，就有越多的东西会被玷污，或者这个泄露导致很多东西都“中毒”。&lt;/p&gt;

&lt;p&gt;实验性的架构和某些很炫的特性应该极为谨慎采用。优先添加你需要的功能，而不是你想要的功能。同时请注重架构。把一些实验玩具留给边缘项目。你创建的每一个组件，每一个前沿模块合并到你的项目，会快速地改变你的软件，也会让你的项目受伤或直接破坏项目。如果你不希望在项目后期除了止血而干不了其他事情，请不要首先将上述应用到你的项目中。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;了解和评估技术债务&lt;/h3&gt;

&lt;p&gt;技术债务是你写的代码但没有达到最优化或你想要的。它包含一些错误，虽然烦人，不过还是可以用的。它可能是一个单应用程序，不过你知道它可能发展为面向服务的程序，也可能是一个20分钟的计划任务需要被重构为20秒。&lt;/p&gt;

&lt;p&gt;这些成本不仅仅是累加的，而且是复合累加。爱因斯坦曾经说过：宇宙中没有什么比复利更强大的力量了。同样，在大型软件开发中，也没有什么比复合技术债务更具破坏性的了。我们见过或构建的大部分项目，哪怕最小的改变也会花费数月的时间。针对码基（code base），人们已经放弃了编写更好代码的想法，只是希望在修改的时候不至于导致站点整个崩溃。&lt;/p&gt;

&lt;p&gt;技术债务是项目中一个可怕的负担。&lt;/p&gt;

&lt;p&gt;除非没有技术债务。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;和所有其他债务一样，应用合理的话，技术债务也会给你带来巨大的杠杆效应。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458597500640067585&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;不仅是这样，技术债务可能是世界上最好的债务，因为你不一定每次都需要偿还。当你开发一个功能结果发现它是错误的，或者当你开发一个产品结果不能正常工作，你可以丢弃掉它们然后继续。你可能丢弃功能相关的所有优化，测试和重构。因为这些不是必须的，那就不要去写这些。这个时候就应该最大化你的杠杆，留个空白，避免错误，仅仅为你需要的测试而进行测试。&lt;/p&gt;

&lt;p&gt;在一个产品和功能的早期，很可能你现在做的是错误的。你还处在探索阶段。你要同时以产品和技术实现为核心。这期间可以大量借用技术债务。这不是修改零星错误和进行大量重构的时候，这时候你应该集中火力猛攻直到你达到（成果的）另一边。&lt;/p&gt;

&lt;p&gt;不过当你发现，你确信你已经到了正确的位置并走出了另外一边，这个时候需要进行梳理，并加强你的地位。把事情做得足够好来推动你前进，偿还足够的技术债务来进入下一个阶段。&lt;/p&gt;

&lt;p&gt;对于初创公司来说，技术债务和其他许多事情一样是一场跨越式的游戏。初始的代码是试探性的代码，它应该让你快速前进，发现问题和解决方案，给你恰当的空间来建立营地。你呆的时间越久，营地系统就需要更多内容，而你需要构建更大更强来支撑 它。如果你仅仅只需要停留一周时间，不要浪费时间来构建一个可以支持十年的基础设施。&lt;/p&gt;

&lt;h3 id=&quot;section-6&quot;&gt;检查，再检查你的代码，你的问题由你来修复。&lt;/h3&gt;

&lt;p&gt;“把代码扔过篱笆”的工程师都是可怕的工程师。你应该保证你的代码是可以工作的，这不是测试人员或者你同事的工作，这是你的工作。懒洋洋写就的代码会拖延你，延迟周期时间，产生bug，有让每个人恼火。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;如果你一直提交破坏性的代码，那么你就在对团队其他成员不断征税。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458597632248930304&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;不要拿自己不当回事，觉得你只是个负担，问题应该自己解决。&lt;/p&gt;

&lt;h3 id=&quot;section-7&quot;&gt;每天至少（只）花4个小时做实际工作&lt;/h3&gt;

&lt;p&gt;对于讨论自我进步，关注和使用在开发者之间流行的生活技巧，简单的真理是：你不需要做大量的工作，就可以实现高效。真正重要的是，你能持续地做到这一点。每天花费最少完整4个小时来做恰当（proper）的事情，日复一日，你会成为团队中最有贡献力的成员。&lt;/p&gt;

&lt;p&gt;不过，每天都抽出4个小时来工作比看起来要难得多。&lt;/p&gt;

&lt;p&gt;恰当的工作意味着没有邮件，没有新闻，没有会议，没有杂七杂八的琐事。意味着一小时最少45分种的时间专注于（你正在做的事情）。一天4小时的工作意味着一天没有会议，没有漫长的午餐和休息时间讨论足球。我相信，一天扎实工作八小时几乎是不可能的。每天四小时也意味着你应该瞄准工作五或者六个小时，这样你才可能得到四小时的认真工作时间。&lt;/p&gt;

&lt;p&gt;这也意味着你可以拥有丰满人生的同时，成为团队中一个卓有成效的贡献者。这意味着你不需要在HN上发表一个自我放弃“我忙死了，快来帮帮我”的帖子，这意味着你只要持续工作，你就能被重视和获得尊重。&lt;/p&gt;

&lt;p&gt;软件团队并不因为人们每天工作四小时而比工作七小时的团队进展慢（持续这样的方式是非常疯狂的）。他们慢下来是因为人们几周都没有找到方向，或者那些响亮而空乏的嗓子，决定花费时间讨论 google vs facebook 的获取策略而导致的无止境的咖啡休息时间。&lt;/p&gt;

&lt;p&gt;只要能工作就好，不要在乎你的进步看起来是如何缓慢或平庸…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;每天工作四个小时，日复一日你会成为团队中最优秀的人员之一。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458597797278007296&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-8&quot;&gt;记录已完成的事情，并和团队成员分享&lt;/h3&gt;

&lt;p&gt;不管你是如何记录文档，是通过类似Copyin的邮件列表，wiki 或者是代码中的内嵌注释，你应该花时间来解释你的架构方法，和团队其他成员一起学习。&lt;/p&gt;

&lt;p&gt;在安装Postgres或者ImageMagic时遇到了问题？如果你觉得这解决起来比较困难，团队的其他成员可能也会遇到这样的困难，花费一些时间记录下来并告诉团队其他人你是如何做到的，节约他们下一次遇到问题时的时间。&lt;/p&gt;

&lt;p&gt;程序开发时最糟糕的事情是，整天和bug作战或者处理安装问题。如果你花费时间来记录和分享你找到的方法，你可以从预先为你同事准备中赢得五倍你花费的这些时间。&lt;/p&gt;

&lt;h3 id=&quot;section-9&quot;&gt;理解和欣赏处理太多测试和太少测试之间的微妙平衡&lt;/h3&gt;

&lt;p&gt;测试是一个强大的工具。它允许你设置一个发布基准，你可以信赖你的发布，让你不那么害怕制造它们。对发布的恐惧越少，你越这样做你改进得就越快。&lt;/p&gt;

&lt;p&gt;不过，这也可能过头。测试需要时间编写，运行和更多的时间来维护。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;可以想象测试是盔甲，你穿得越多你受伤的可能性就越小，不过也让你更难进攻。— Peter Nixey (@peternixey)&lt;/em&gt; &lt;a href=&quot;https://twitter.com/peternixey/statuses/458597921211293696&quot;&gt;April 22, 2014&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;你负重太多而无法前进，阻碍你弯曲四肢，无法移动。太少的话，第一次跨过混凝土地板的滑动就会伤到你，让你流血。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140717_1.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;关于如何进行适量的测试，没有直观的答案，某些项目需要比其他项目更多的测试，测试是你专业化需要学习的一个全新的领域。&lt;/p&gt;

&lt;p&gt;花时间去理解什么是真正需要测试，如何编写一个良好的测试。花时间去查看当测试添加值，或者最起码你期望它们是怎么样的。不要害怕进行测试，也不要害怕不进行测试。正确的处理方式是平衡，花时间去探索平衡点在哪里。&lt;/p&gt;

&lt;h3 id=&quot;section-10&quot;&gt;让你的团队更出色&lt;/h3&gt;

&lt;p&gt;这不同于其他点，这不是你可以独自采取行动，也没有明确的指标告知你其他行动是否有效。&lt;/p&gt;

&lt;p&gt;你的存在，是让你的团队变得更好还是更糟呢？你的代码质量，你的文档和你的技术有米有帮助到你周围的人。你是否激励和鼓励你的队友成为一个更优秀的开发者？或者你就是那个导致bug的人，或者你坚持自己的观点浪费数小时讨论架构无关的废话，因为它有助于掩饰你没有做实际工作的事实？&lt;/p&gt;

&lt;p&gt;你应该让你的团队变得更好，总是有一两种方法你可以让你的团队变得更好，通过你素养的熏陶而帮助其他人变得更强。然而，成为一个孤独的“智者”可能是最缺乏价值的，或者说你能选择的最有破坏价值。事实上，如果你选择的维度并没有让你觉得厌烦，这可能不是一个好的选择。&lt;/p&gt;

&lt;h3 id=&quot;its-not-who-you-are-on-the-inside-that-defines-you&quot;&gt;It’s not who you are on the inside that defines you&lt;/h3&gt;

&lt;p&gt;这是一个谦卑的智慧，在蝙蝠侠开篇就有这么一句，这句也一直伴随着我。在电影的某个时间，蝙蝠侠在闲逛，表演着一个亿万富翁的花花公子。克里斯蒂安·贝尔恳求凯蒂·赫尔姆斯相信：他内在仍然是一个好人，她只是说了：不是你穿了什么，而是你做了什么展现你的价值。&lt;/p&gt;

&lt;p&gt;你作为一个开发者的贡献，不是由你有多聪明或你知道多少来衡量的。这不是由你简历上的技术名称缩写，你工作的公司和你上过的大学决定的。它们暗示你能做什么，但是你的价值是由你做过什么，以及这些如何改变了项目和你周围的人决定的。&lt;/p&gt;

&lt;p&gt;如果你想变得更好，请做好准备。&lt;/p&gt;

&lt;p&gt;（via：&lt;a href=&quot;http://blog.jobbole.com/72457/&quot;&gt;伯乐在线&lt;/a&gt;）&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>到底开发者需要掌握多少门语言？</title>
   <link href="http://winares.github.com/2014/07/06/programming-language"/>
   <updated>2014-07-06T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/07/06/programming-language</id>
   <content type="html">
&lt;p&gt;&lt;img src=&quot;/assets/media/20140706_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;诸如Apple、Facebook及Google这样的大公司正在开发他们自己的编程语言，开发者们被迫只有适应。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;前不久的世界开发者大会上，Apple公布了它的新开发语言&lt;a href=&quot;https://developer.apple.com/swift/&quot;&gt;Swift&lt;/a&gt;。这是最近大型技术公司们开发的一大波新语言中的最新成员，这些新语言某种程度上都是专门应用于他们自己的平台。&lt;/p&gt;

&lt;p&gt;对iOS开发者，Apple有Swift；而&lt;a href=&quot;http://readwrite.com/2014/03/20/facebook-new-programming-language-hack&quot;&gt;Facebook 有 Hack&lt;/a&gt; —— 一门用于后端开发的语言。与此同时，Google已经拥有了它自己的Javascript替代者 Dart，以及一门新的通用编程语言Go。&lt;/p&gt;

&lt;p&gt;这一波又一波的新语言，给开发者们带来了许多问题。也许其中最严重的问题正如我一位同事&lt;a href=&quot;http://readwrite.com/author/adriana-lee#awesm=%7EoGfPbJlSrFBamJ&quot;&gt;Adriana Lee&lt;/a&gt;在Apple发布Swift后所说：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;（开发者们到底还得学习多少门语言？） ——Adriana Lee (@adra_la) &lt;a href=&quot;https://twitter.com/adra_la/statuses/473537386266112000&quot;&gt;June 2, 2014&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;section&quot;&gt;计算机语言的通天塔&lt;/h3&gt;

&lt;p&gt;目前已经存在的&lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_programming_languages&quot;&gt;编程语言有数百种&lt;/a&gt;，同时还有更多的语言正在涌现。其中许多都是被设计用在相对较窄的应用程序范围内，大多数甚至从未走出过项目小组的范围。&lt;/p&gt;

&lt;p&gt;与此类似，大技术公司开发的新语言其实也是伴随着公司一起成长的。&lt;a href=&quot;http://en.wikipedia.org/wiki/C_(programming_language)&quot;&gt;通用语言的鼻祖，C语言&lt;/a&gt;，就源于上世纪70年代初的AT&amp;amp;T贝尔实验室。Java，目前作为Android app开发的主要语言，诞生于上世纪90年代&lt;a href=&quot;http://en.wikipedia.org/wiki/Java_(programming_language)&quot;&gt;Sun公司的Microsystems系统&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;发展到现在，不同之处在于，公司们拥抱新语言、从而想要延伸的特定商业目标的范围不一样了 —— 这一过程同时建立了一个忠心耿耿的开发者基础，他们被牢牢锁定在了某个公司的特定平台上。这类一石二鸟的战略，最早可以追溯到Sun对Java的采用，当时公司就将其作为了挑战微软PC桌面统治地位的一种手段。（事情虽然没有像Sun计划的那样发展下去，但在Google转向Android之前，Java大体上也算是在企业中间件系统中找到了自己的一席之地。）&lt;/p&gt;

&lt;p&gt;这么看来，Apple的Swift其目标也就很明确了。Swift应该不会辜负公司前期的大肆宣传，通过磨平Objective-C那粗糙的毛边，看起来它能够成功简化iOS app开发者的开发过程。但是同样还是这些开发者，他们却需要学习一门新语言的输入和输出，而这些功能很可能在其他地方都不会用到。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;大公司们为什么要重复造轮子&lt;/h3&gt;

&lt;p&gt;“不要重复造轮子”这一哲学在绝大多数开发者心中根深蒂固，大公司们对此却并不买账。那他们为何不只是修改下现有语言用于新的用途呢？&lt;/p&gt;

&lt;p&gt;答案很简单，公司们发明他们自己的语言，是因为他们有这个能力。设计一门新语言可能很复杂，但对资源要求却并不很高。困难之处也就在对其提供支持，包括提供软件资源（共享代码库、API、编译器、文档等）以及赢得开发者的支持。大公司们在这两方面尤其擅长。&lt;/p&gt;

&lt;p&gt;还有一个事实，现有语言通常很难硬塞进如今的复杂代码框架中。举个栗子，&lt;a href=&quot;http://readwrite.com/2014/03/20/facebook-new-programming-language-hack&quot;&gt;Facebook决定发明的Hack&lt;/a&gt;，就是一个普遍适用于Web开发的&lt;a href=&quot;http://en.wikipedia.org/wiki/PHP&quot;&gt;脚本语言PHP&lt;/a&gt;的超集合（superset）。&lt;/p&gt;

&lt;p&gt;Facebook的Hack最近已经比较普遍，其主要目标就是改进代码的稳定性，针对这一目的，它强制在程序运行之前对数据类型进行检测。这样的检测确保了一个程序，比方说，不会将一个整数解析为一个字符串，这样的错误如果捕获不到很可能会导致不可预知的后果。在Hack中，这些检测会预先执行，以便程序员能够在程序上线前早早发现这样的错误。&lt;/p&gt;

&lt;p&gt;据Facebook的Hack项目组核心成员Julien Verlaguet透露，公司之前尝试过用一门现有语言实现更高效的编程。但是Facebook的大部分代码都是由PHP编写的，公司实际上已经建立了一个支持PHP及其分支的软件架构。即使能够让PHP同其他语言编写的代码协同工作，实现的难易程度和运行速度都无法满足要求。&lt;/p&gt;

&lt;p&gt;“比如说我们尝试用Scala重写PHP代码库，”Verlaguet说。“Scala是一门设计优秀的漂亮语言，但是它与PHP完全不兼容。每次我需要从Scala的代码库部分调用PHP的时候，都会损失性能。我们很愿意使用一门现有语言，但是对于我们来说，这条路行不通。”&lt;/p&gt;

&lt;p&gt;于是，Facebook发明了Hack，它与PHP一样能够共用公司现有的架构。Verlaguet介绍说，Facebook的代码库主体已经从PHP迁移到了Hack，同时公司将Hack开源，希望独立开发者们能够帮公司找到Facebook以外的用途。&lt;/p&gt;

&lt;p&gt;“你仍然可以使用PHP，”他说，“但是我们希望你有使用Hack的欲望。”&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;谁说了算&lt;/h3&gt;

&lt;p&gt;公司和开发者之间有一种微妙的平衡。公司可以按照自己的喜好发明语言。但是如果开发者都不愿使用这门语言，那就没人用了，公司以外的人也就没人愿意将自己的职业生涯托付给这家公司。&lt;/p&gt;

&lt;p&gt;公司在开发过程中同时使用不同的语言，这并不少见。例如，你可能用Objective-C开发iOS app，但却用Java开发Android app。对开发者来说，这从来都不是症结所在，因为Objective-C和Java都是通用面向对象语言。它们用途广泛适用于很多场合。&lt;/p&gt;

&lt;p&gt;然而，Hack、Dart、Go和Swift，到目前为止，仍然只适用于严格特定公司的编程解决方案，往往和公司选择的编程环境相对应。诚然，现在下结论可能还太早。比方说Hack，就可以用在一些后端的实现中；它只是太新了，以至于Facebook还没有任何数据供人们如此使用。&lt;/p&gt;

&lt;p&gt;不是开发者不能学习多门语言。事实上，大多数人已经掌握了多门语言。这好比罗曼斯语（一种由拉丁语演变而成的语言），如果你会说西班牙语，再去学法语就比那些不会西班牙语的人简单许多。与此类似，如果你已经会Java，再学Ruby或Perl就简单得多。如果你会PHP，基本上就已经学会了Hack。&lt;/p&gt;

&lt;p&gt;与此相反，学习多门语言更多的是一个习惯问题。如果Java已经解决了你的问题，你就不再有动力去学Ruby。如果你用Objective-C编写iOS app感觉很爽，你就不会有强烈的意愿去学Swift。&lt;/p&gt;

&lt;p&gt;另外，对于一些开发者来说，封闭生态系统的语言只会使每个人的生活变得更糟。例如，自由设计师Jack Watson-Hamblin就告诉我说，像Apple这样强势推出Swift，其实是在冒险增加程序员的负担，同时将开发者社区割裂开来：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;程序员掌握多门语言固然重要，但是不断强迫他们紧跟新语言，却是行不通的。如果我正在开发一个简单的跨平台app，我可不想被迫掌握四门语言再来完成它。如果真的需要，我也只想使用一门语言。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Watson-Hamblin就主张说，当每家公司都为了自家需要发明自己的语言时，程序员的注意力被分散，开发的视野也局限于一种，这只会拖慢整个开发进程。他说，“如果拿公司负责一门语言与负责一个开源社区相比较，这两者的区别就好比一家大企业与一个初创小公司的区别”。社区生来就更加灵活，适应能力更强。&lt;/p&gt;

&lt;p&gt;当然，Apple有&lt;a href=&quot;http://blog.erratasec.com/2014/06/why-it-had-to-be-swift.html#.U58BJI1dXtA&quot;&gt;许多非常好的理由推出Swift从零开始&lt;/a&gt;，就像当初Facebook发明Hack的时候一样。我并不是说，大公司不会强迫开发者接受这种改变，在这方面，有些公司一直都很让人讨厌。&lt;/p&gt;

&lt;p&gt;“新语言的发明，伴随着霸权的支配，”Verlaguet说，“被迫不停追赶，确实令人沮丧，但另一方面，你又多了一种解决问题的新语言。反过来想想，要是全世界的程序员都用同样一门语言做所有事情，即使啥都凑合着能干，这门语言也一定干得不怎么样”。&lt;/p&gt;

&lt;p&gt;题图来自于&lt;a href=&quot;https://www.flickr.com/photos/ruiwen/3260095534&quot;&gt;Flickr user Ruiwen Chua&lt;/a&gt;，CC 2.0&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;via: &lt;a href=&quot;http://readwrite.com/2014/06/17/apple-swift-facebook-hack-google-dart&quot;&gt;http://readwrite.com/2014/06/17/apple-swift-facebook-hack-google-dart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;译文：&lt;a href=&quot;http://linux.cn/article-3327-1.html&quot;&gt;http://linux.cn/article-3327-1.html&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>程序员生存定律--管理向左，技术向右</title>
   <link href="http://winares.github.com/2014/06/20/technology-or-management"/>
   <updated>2014-06-20T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/06/20/technology-or-management</id>
   <content type="html">
&lt;p&gt;&lt;img src=&quot;/assets/media/20140620_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;一个程序员在考虑增值时无法回避的一个根本问题是到底是做技术还是做管理。当然也有些职位会介于两者之间，比如架构师，但我们暂时不去做细分，而是用简单的二分法。&lt;/p&gt;

&lt;p&gt;这种基本方向上的选择对后续很多细节上的取舍有关键影响，所以在考虑其他之前，最好先回答一下这个问题。这就和修炼时要选择少林、武当、华山还是魔教一样，一旦选择，基本上是回不了头。&lt;/p&gt;

&lt;p&gt;当然选择管理不意味着不需要掌握编程技能，毕竟当下大多公司还是信奉“宰相拔于州郡，将军起于行伍”的。但当技术达到一定水平后，管理还是技术这种方向性的选择将对下一步做什么有比较大的影响。在考虑那个方向前，则要先弄清楚管理和技术的关键差异。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;技术与管理的关键差异&lt;/h3&gt;

&lt;p&gt;到了30几岁后，转为管理人员的程序员经常会调侃自己的技术能力：当年解决这种有时出、有时不出的Bug时，我常常在其前后都加几条调试输出，这招很管用很可能立刻就把它搞定了。结果多年后维护这代码的人困惑了，还来问我，这句为啥不能去掉，看着也没用啊，其实我也不知道，只能说运气和人品在程序里也是很有影响力的。&lt;/p&gt;

&lt;p&gt;这是管理人员的一种真实写照，大家都知道，一旦走上管理岗位，那就和ppt越走越近，和代码越走越远了。虽然他仍然要跟踪最新技术的动向，但他很可能已经无法深究很多技术细节了。&lt;/p&gt;

&lt;p&gt;据说微软这样的公司推崇一个人要想走上管理岗位，那要先把自己的代码用远少于别人的时间写好，省下来的时间才用来做管理工作。这很好，也不是完全不可能，但大多时候很难，需要很强大的天分，大多数人是做不到的。&lt;/p&gt;

&lt;p&gt;主要原因是管理和技术所要处理的问题有根本上的差异。&lt;/p&gt;

&lt;p&gt;管理者往往需要处理许多与人相关的事情，这导致要处理的事情是碎片化的，如果坚持编码，那么每天的打断往往会大幅降低写代码的效能，大家都知道编码是需要专注的。&lt;/p&gt;

&lt;p&gt;管理工作总是需要面对大量的琐碎工作的，比如：老板对项目不满要赶紧去说明，免得发酵成大问题；人力缺了要赶紧协调，一是要能要到人，关键还得能要到合适的人；工具缺了，要赶紧购买；兄弟们有情绪了，要赶紧安抚；PPQA了有抱怨了，要赶紧改正。如果工作进一步泛化，还要涉及到预算、评估、职业路径规划等。&lt;/p&gt;

&lt;p&gt;我们很难让这些事情按照自己的节奏发生，如果管理人员做编程，最终这些都会变成一种对编程工作的随机性干扰。所以一般来讲很难把它们很好的与编码结合在一起。想象一下，一个管理人员负责某个项目中影响关键路径的某个模块，接下来上面所列的意外发生了，那这个管理者怎么办？&lt;/p&gt;

&lt;p&gt;唱歌的时候常说到Key或者调门这个词。同样是《花心》这首歌，周华健的用的Key和原本的冲绳民谣《花》的就不同，这导致两首歌听起来差别就很大，完全不一个感觉。也许可以说管理也是一种技术，但管理和设计编码这种技术的Key不一样。做技术需要面对的是程序，程序是讲道理的，Stack Overflow时它一定会崩溃；而做管理时需要考虑技术因素，但更需要面对的是各种人，人则只在一定程度上讲道理，所以管理不只是一种技术。因此基本上可以认为管理和技术时完全不同的两个方向。&lt;/p&gt;

&lt;p&gt;如果大家细心观察周围，就会发现，做技术（编码）的往往可以转去做管理，但做管理的再转回做技术（编码）就难了。这意味着技术背景对做管理往是很有帮助的，而管理背景对做技术则几乎没用。&lt;/p&gt;

&lt;p&gt;了解到这种差异后，要想做出自己的那份选择，还需要考虑三件事情：一是既定环境下技术路径究竟有多长，也就是说做技术有前途么；一是个人的性格适不适合做管理工作；一是做管理工作可能会有什么负面影响。这三点将在接下来的三个小节中分别进行探讨。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;技术路径长短对前途的影响&lt;/h3&gt;

&lt;p&gt;程序员往往自嘲自己是“码农”，不知道这词是那里出来的，但听起来“码农”和“农民工”已经有点近似了。而“农民工”往往是收入低，工作时间长的代名词。这就折射出了一个很尴尬的事实，在很多公司中，单纯从收入的角度来看管理职位是要高于纯粹的技术岗位的。&lt;/p&gt;

&lt;p&gt;这并非是一个绝对规则，前文就曾经提到早在20年前，微软的超级程序员就可以拥有比管理人员更高的工资，可以拥有多辆保时捷。但在技术路径短的公司里，管理人员收入偏高这事情却具有必然性。&lt;/p&gt;

&lt;p&gt;当一个公司的核心技术并没有创生多大价值，而是需要靠人力规模、商业模式等来支撑业务的时候，那么我们可以称之为技术路径短的公司。想象一下，如果一家公司专门承接本地化工作，那么也许也会需要程序员编制某些工具，但对程序员而言技术路径无疑是短的。&lt;/p&gt;

&lt;p&gt;如果暂时把眼光从程序的世界移开，那么事情就可以看得更清楚。&lt;/p&gt;

&lt;p&gt;在盖楼的时候，只要达到基本的质量，一个人每天砌200块砖，固然比砌100块要好的多，但相对于大楼而言，多砌100块砖，所多带来的价值有限。再进一步由于砌每块砖的价值是固定的，同时一个人每天所能砌的砖也是有限度的，这就会导致砌砖工人，不管多么努力，其收入水平必然会被限制到某一个较低的水平，只要他的工作还只是砌砖。这种限度是由这一工作的内涵所决定的，倒不是谁遭到了歧视。&lt;/p&gt;

&lt;p&gt;再类比到软件行业里，单纯的在既定接口下实现已定义的业务逻辑就是技术路径比较短的工作，是体力密集型的；而分析业务逻辑，控制整体架构或者去研究TTS的算法则是智力密集型的，技术路径较长。&lt;/p&gt;

&lt;p&gt;在选择方向时关键要避免的是选择了技术方向，但身处的现实中技术方向却路径较短，或者喜欢管理但跑到了纯粹技术流的公司里，这种选择其内部所蕴含的矛盾会给当事人的人生造成极大的困扰。比如说开发小型信息管理系统时，其所需要的技术含量并不高，公司的主营如果是这个，单纯的做技术可能会直接影响收入。这是一个需要考虑的很现实的事情。&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;什么样的程序员适合转管理&lt;/h3&gt;

&lt;p&gt;《黑客帝国》的动画片中有一集叫做“Matriculated”，在这一集里有个机器人被逮住后，人类通过各种场景让他相信自己是个人类，计划看似成功了，但实际却不是。这个动画的启示意义在于，先天带来的很多东西，比如性格等实在很难改变，更多时候选择顺应自己的天性比选择对抗更加明智。&lt;/p&gt;

&lt;p&gt;从先天性格来看，确实有的人天生适合做管理多一点，有的人天生适合做技术多一点。&lt;/p&gt;

&lt;p&gt;比如说：&lt;/p&gt;

&lt;p&gt;有的程序员天生有点被动，不喜欢主动学习很多东西，不喜欢与人沟通，但对工作所直接关联的领域研究较深，做事情兢兢业业，一丝不苟。&lt;/p&gt;

&lt;p&gt;有的程序员非常聪明，理解东西很快，但不愿意搭理别人，总感觉别人水平比较差，脾气也比较暴躁。&lt;/p&gt;

&lt;p&gt;有的程序员精力充沛，对技术狂热，但并不仅局限于技术本身，有大局观，有理想，能坚持。&lt;/p&gt;

&lt;p&gt;单从性格而论前两者都不太适合做管理工作的，一旦做了管理工作，接触各种性格的人，容易造成人际关系紧张，反倒对自己形成一定的压力，极端情形下就会精神失常。&lt;/p&gt;

&lt;p&gt;单纯的因为收入而选择管理工作，并不总是明智的，你可能无法适应，反倒导致事业出现起伏—不要低估这点的影响，现实中非常多的人因为这种错位而使人生走入低谷，甚至生病。&lt;/p&gt;

&lt;p&gt;在大五模型里用五个因素来考察人格特质：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;外倾性（extroversion):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;外倾者者倾向于喜欢群居，善于社交和自我决断。内倾者则比较内向，胆小害羞，安静少语。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;随和性（agreeableness）:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;高随和性的人是合作的，热情的和信赖他人的，低随和性的人是冷淡的，敌对的和不受欢迎的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;责任心(conscientiousness):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;高责任心的人是负责的，有条不紊的，值得信赖的，持之以恒的。低责任心的人则容易精力分散，缺乏规划性，且不可信赖。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;情绪稳定性(emotional stability):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;积极的情绪稳定性者倾向于平和，自信；而消极情绪稳定性者（神经质的人）倾向于紧张，焦虑，失望和缺乏安全感。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;经验开放性(Openness to experience):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;开放性高的人富有创造性，凡事好奇，具有艺术的敏感性；开放性低的人则保守对熟悉的事物感到舒适和满足。&lt;/p&gt;

&lt;p&gt;总的来看，外倾性和经验开放性好的人更适合走上管理岗位。&lt;/p&gt;

&lt;p&gt;千万不要忽视这种错位的力量。金山的求伯君先生就直承自己不擅长做管理。他认为人的一生之中最关键的是对自己能够有所了解，不是说自己什么都能干，是万能的。在雷军走后的4年里，做CEO有些力不从心，快50岁的他精神压力太大，多次想退休，请雷军出山。最终求伯君先生在不到50岁的时候退出江湖，不知道是不是和这个有关。&lt;/p&gt;

&lt;p&gt;当然很多人可能远走不到求伯君先生的高度，但终究类似，可以打个比方形容错位的中层管理者。上司和下属员工像两块板子，管理这门功夫没练好的话，中层管理者就被搓球了：上司说，你做的这叫什么事儿，脑子大大的坏了。下属说：你瞎答应什么，这事儿怎么做，我不干，要干你自己干，爱咋咋地。&lt;/p&gt;

&lt;p&gt;管理这功夫练好了，情形就变了：上司尊重你的意见，下属把你视为旗帜。一处天堂，一处地狱，核心差别其实不大，根本还在天生的人格特质。待管理人群的特质也很有影响，但这是运气所管理的范畴。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;是不是适合做管理者的简明判断方法&lt;/h3&gt;

&lt;p&gt;假设说团队里两个兄弟吵起来来了，你愿不愿意去调解？&lt;/p&gt;

&lt;p&gt;假如有一个人脾气很坏你愿不愿意和他沟通，即使你不喜欢？&lt;/p&gt;

&lt;p&gt;假如有一个人问题很多，你愿不愿意面对面批评他？&lt;/p&gt;

&lt;p&gt;假如有一个人屡教不改，你愿不愿意采取直接的惩罚措施，那怕关系紧张？&lt;/p&gt;

&lt;p&gt;这个列表还可以增长。一旦做管理工作，这类需要抛开个人视角，而从组织的视角去看待问题并行动的地方很多。&lt;/p&gt;

&lt;p&gt;如果对这类问题的回答是否定的，那么最好是不要往管理的方向上走。&lt;/p&gt;

&lt;p&gt;上面这几个问题，纯走技术道路的还可以作壁上观，但如果是发生在自己团队里，管理者却保持逃避的态度，那么管理者就失职了。&lt;/p&gt;

&lt;p&gt;由于人的世界很复杂，所以期望坏的事情一件也不发生，那是不现实的。我个人感觉管理者面对这类事情的几率是100%，区别是遇到多少件，而不是遇不遇得到。&lt;/p&gt;

&lt;p&gt;其实故事到这里还没完，如果往深了考察，就会发现，即使一个人愿意去搞定吵架中的两个人，那还有你怎么去搞定，搞不搞得定的问题。&lt;/p&gt;

&lt;p&gt;捣糨糊、各打五十大板这类简单粗暴的方法往往只能有效于一时，等价于埋下定时炸弹，长线来看不是什么高明方法。但把这个展开就需要另外一本书，这里就不进行展开了。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;管理工作的负效应&lt;/h3&gt;

&lt;p&gt;从日常很多人发表的言论来看，管理工作似乎被无限美化了，很多人都认为管理工作似乎是一条彻底金光大道，但这并不完全正确。为了让事情回归本来面目，这里说一点管理方所可能带来的负效应。&lt;/p&gt;

&lt;p&gt;同纯技术工作相比，管理工作（特别是中层管理）的可流动性可能会非常低，形象来讲很多公司并不会愿意请外来的中层管理者来管理已有的员工，而更愿意请技术上有专长的人来解决具体的问题。这是由管理工作的几个特质所决定的：&lt;/p&gt;

&lt;p&gt;管理工作和人打交道比较多，所以对人员的特质有很强的依赖性。如果一个团队的人都非常像机器人，那么在不同公司间管理技能是完全通用的—只要有PMP，CMMI这类东西就够了。但关键问题是人员的特性是多样的，这导致管理人员和被管理人员需要较多的磨合和适应。形象点讲就是，如果无法搞定特定人群，你考5个PMP证书，该不管用还是不管用。&lt;/p&gt;

&lt;p&gt;同时长时间在管理岗位的话，即使是做技术出身，技术能力也会退化，沟通技能、与上级的信任程度反倒会提高。而这些东西，到一家新公司后，一定会被归零，，其价值并不明显。反倒不如擅长算法，擅长某类业务的技术人员可流动性好。&lt;/p&gt;

&lt;p&gt;这也就意味着，管理人员往往与公司的利益绑定的更紧。尤其是中层管理人员，达到一定年纪后（比如：40岁），很可能会失去流动的可能性，一旦所处的公司出现问题，那就可能会面临非常尴尬的局面—直接讲就是，如果你选择了管理方向，却缺乏相应的人脉，35岁之后基本不具备可流动性，换工作会很难，至少比纯技术的高端人员难。&lt;/p&gt;

&lt;p&gt;这点的一个旁证是各个初创期公司的人员构成。如果你用心观察就会发现对于初创期的公司而言，它需要创始人把握方向和寻找资金，也需要工程师来完成具体事务，但不太需要中层管理人员。比如：Pinterest曾经公开了自己的数据，在2010年是2个创始人，1个工程师；2011是3个工程师；2012年是6个工程师；2013年是40个工程师。这种情况下，只有到2013年后中层管理人员才有存在价值，而一般情形而言这种情况并不会社招，而是会从现有人员中选拔。这最终导致纯管理人员的可流动性并没有想的那么好。&lt;/p&gt;

&lt;p&gt;当然什么事情都有例外，如果你是成功运作几个产品的产品经理，那么也可不在流动性上受到限制。因为那些产品就是你最好的名片，他们使你在江湖里有了一席之地。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;小结&lt;/h3&gt;

&lt;p&gt;考虑上述三个方面，大多时候可以判明自己是应该做技术还是做管理。比如说：如果一个人日常很容易和人产生冲突，但脑子很好使，也能静下心来钻研技术。这种情形大致上应该努力找一家技术路径长的公司做技术，否则可能会人际关系紧张。而与此相反，一个人如果技术能做的还不错，也愿意与人沟通，同时已经身处一家技术路径不是很长的公司，并不太能够换工作，那么就很可能需要尽早转向管理方向。&lt;/p&gt;

&lt;p&gt;总之，别太为了点钱过度难为自己，走不远的话，最终还是吃亏。&lt;/p&gt;

&lt;p&gt;（via：理想流的博客  &lt;a href=&quot;http://www.cnblogs.com/daoshi/p/3776814.html&quot;&gt;程序员生存定律系列&lt;/a&gt;）&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>写一封「用户体验」良好的求职邮件</title>
   <link href="http://winares.github.com/2014/05/29/how-to-write-a-resume-email"/>
   <updated>2014-05-29T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/05/29/how-to-write-a-resume-email</id>
   <content type="html">
&lt;p&gt;如何写一封「用户体验」更好的求职邮件，让 HR 或是招聘者对你顿生好感。&lt;/p&gt;

&lt;p&gt;我之所以要写这个话题，是因为我在处理求职邮件的时候，就深受「用户体验」不好的困扰，很是头痛。从求职者的角度上说，你的目的是让招聘方(一般是 HR)从数十封甚至上百封简历里把你筛选出来；从招聘方的角度上看，则是如何从数百封简历里筛选出感兴趣的人。其中的关键就在于，你的求职邮件要传递足够丰富恰到好处的信息。&lt;/p&gt;

&lt;p&gt;我给出的一些注意事项如下：&lt;/p&gt;

&lt;p&gt;1.先注意收件人用什么邮箱。举个例子，如果收件人留了 Gmail 的邮箱，标题怎么写? 写多长合适? 正文第一句话应该是什么? 不明白为什么，打开你的 Gmail 看一下，如果你有 Gmail 的话。&lt;/p&gt;

&lt;p&gt;2.如何避免求职信进入收件人垃圾箱?&lt;/p&gt;

&lt;p&gt;3.你的邮件发送出去，收件人收信之后，看到显示的名字会是什么? 中文名? 英文名? 还是火星文? 不知道怎么设置的话，翻看一下邮箱的帮助。为什么有人讨厌求职者用 QQ 邮箱? 我想主要的原因就是因为用 QQ 邮箱的人「名字」那个地方显示的都有问题。&lt;/p&gt;

&lt;p&gt;4.你谋求什么岗位? 如果是 HR 处理你的邮件的话，每天面对很多种岗位的求职信，怎么知道你是针对哪一个岗位求职?&lt;/p&gt;

&lt;p&gt;5.针对谋求的岗位，你最关键的优势是什么? 最关键的技能是什么，最关键的经历是什么? 用一两句话写出来，写在邮件正文里。&lt;/p&gt;

&lt;p&gt;6.你的简历能够让接收者方便的打开么? 你用的是 Word 简历还是 PDF 格式的简历? 如果对方电脑没安装 Word 怎么办? 你用的简历文档是怎么命名的? 是简单的写了「简历.doc」还是「你的名字-技能-求职职位.doc」，你知道类似后者的格式会让 HR 节省多少时间么?&lt;/p&gt;

&lt;p&gt;7.你还在用前程无忧那种老掉牙的简历模板么? 说实话，那个模板真的已经让无数招聘者审美疲劳了。尤其是有些人根据那个模板填写的还不够认真。&lt;/p&gt;

&lt;p&gt;8.你有必要在正文里深情款款的贴你的所谓求职信么? 还是以「尊敬的公司领导」作为开头? 很多时候都没必要。以我个人的经验来看，我很少去看简历中的求职信。当然会看邮件中的正文，如果看到不那么肉麻又令人感兴趣的内容，而且还没什么错别字的话，肯定会加深印象。&lt;/p&gt;

&lt;p&gt;9.你的邮件，接收者在手机上也能很方便的阅读么? 不确定的话，自己发给自己，然后测试一下。你邮件里的附件，接收者在手机上也能方便的查看么?&lt;/p&gt;

&lt;p&gt;10.如果招聘方终于打开你的简历看了，对你感兴趣，准备通知你面试。你猜，通知你之前他/她最关心什么? 当然，你可能猜不到。绝大多数人会需要确切的知道你现在在哪个城市的哪个区，是否能方便的过来面试。问题是，你写清楚了么? 没有的话，那就写明你现在在哪个城市发展，当下，人在哪里。你是否愿意到招聘方所在的城市或是区域发展。&lt;/p&gt;

&lt;p&gt;怎样算是「用户体验」良好? 就是你做的事情必须为对方考虑，而且，你的确考虑到了。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dbanotes.net/review/resume_email.html&quot;&gt;原文ByFenny&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Larry Page密歇根大学毕业典礼演讲</title>
   <link href="http://winares.github.com/2014/05/17/larry-page-2009-university-of-michigan-commencement-speech-transcript"/>
   <updated>2014-05-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/05/17/larry-page-2009-university-of-michigan-commencement-speech-transcript</id>
   <content type="html">
&lt;p&gt;拉里·佩奇(Larry Page，1973.03.26－)，全名劳伦斯·爱德华·佩奇(Lawrence Edward Page)，Google搜索引擎的创始人之一，2011年4月4日佩奇正式出任谷歌CEO。佩奇为美国密歇根大学安娜堡分校的毕业生，拥有理工科学士学位；因其出色的领导才能获得过多项荣誉，以奖励他对工学院的贡献。他曾担任密西根大学Eta Kappa Nu荣誉学会的会长。其指导教授是Terry Winograd 博士。Google就是由Page在斯坦福大学发起的研究项目转变而来的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140517_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　09届的同学们！来点激情给我个回应。各位同学，我希望大家站起来向支持你们的亲朋好友挥手致意。你们一定能在人群中找到他们，借此机会表达你们的爱吧！能站在这里我感到非常荣幸。&lt;/p&gt;

&lt;p&gt;　　等等，大家可能觉得有点矫情。“我很荣幸”这句话都说烂了。但真的是大实话，大家不知道：我对密歇根大学有特殊的感情。很久以前，1962年9月，天很冷，在密歇根大学里有一家餐厅，学生志愿者负责打扫厨房的天花板，大约十年才会打扫一次。&lt;/p&gt;

&lt;p&gt;　　想象一下：有个叫格洛丽亚的女学生，爬上了高高的梯子，努力地打扫脏兮兮的天花板。而一个叫卡尔的寄宿生在下面偷窥，这是他俩的初次邂逅，他们就是我父母。所以说，我是地地道道从密歇根大学厨房里造出来的，我母亲今天也来了。我想找到当年那个厨房，在天花板挂个匾上刻”感谢父母”！&lt;/p&gt;

&lt;p&gt;　　我的家人都毕业于密歇根大学：我哥、我父母、还有我。我爸在文凭数量上更胜一筹：他在这获得了三个半学位，其中一个是通信工程的博士。44年前，他们认为计算机火不了多久。为取得这个学位，爸妈做出了很大的牺牲。为了抚养刚出生的哥哥，省吃俭用。堂堂计算机博士，论文是我妈逐字敲出来的，讽刺吧？&lt;/p&gt;

&lt;p&gt;　　我身上这套博士服是我爸的，还有这张毕业证，跟你们即将拿到手的一样，也是我爸的。还有我的内裤，呃……算了。我的祖父曾在雪佛兰汽车厂工作，他曾开车带两个孩子来到安娜堡。告诉他们：你们以后要上这所大学！听起来挺扯。不过两个孩子确实都进了密歇根大学，这就是我们家的“美国梦”。&lt;/p&gt;

&lt;p&gt;　　我姑姑贝弗利今天也来了。爷爷以前经常扛着一个大铁锤，铁管上铸着大铅坨的那种。那是用来在静坐罢工时，保护自己的武器。小时候，我们常用它在后院打桩子。现在世道好了，大家不需要铁锤保护自己了。但以防万一，我还是把它带来了。后来我的父亲成为了一名教授，密歇根州立大学的教授，我很走运，因为教授的工作比较灵活，有大量的时间陪我。还有比这更棒的吗？&lt;/p&gt;

&lt;p&gt;　　我想要告诉大家的是：这次回来，意义非凡！我不知道该如何表达我的喜悦之情。今天和家人还有你们相聚在此，我无比激动！因为这里造就了我，我为你们感到骄傲，也为你们的家人和朋友感到骄傲，因为我们都是密歇根大家庭的一员，它是我生命中不可或缺的一部分。同时，我也知道你们现在坐在台下的感受：听我们这些老家伙絮叨，老生常谈。别担心，我不是话痨。我给大家讲个追梦的故事，确切地说是一个将梦想变为现实的故事。&lt;/p&gt;

&lt;p&gt;　　想想看：午夜你从美梦中醒来，然后躺下接着睡回笼觉，第二天早上准会把昨晚的美梦忘个精光。我23岁时，就做过这样的美梦。我猛然惊醒，想把所有的网络内容下载下来，通过链接的方式保存。于是，我抓起笔就开始写。还好我把握住机会，从梦里及时醒来，花了一整晚研究出实现方案，自信满满。&lt;/p&gt;

&lt;p&gt;　　我对导师Terry Winograd说：下载整个网络需要几周时间。他点点头，其实心里清楚需要更久。但他很明智，没打击我。年轻人的激情不可小视！不过那时，创造一个搜索引擎，对我而言是天方夜谭。我从没动过这个念头。很久以后，我们偶然找到了更好的排序方式。做出了一级棒的搜索引擎，谷歌就这么诞生了。所以，当梦想闪现时，抓住它吧！我在这儿念书时，曾学过如何梦想成真。&lt;/p&gt;

&lt;p&gt;　　听起来有点扯，但我确实从 “塑造领导力”夏令营中得到了启发。看，真的有人参加过的吧。我们的口号是“世上无难事只怕有心人“！我们被要求去实现自己看似疯狂的梦想。我想建立个人快速交通系统来替代公交，我知道你们还在研究。没准是今后解决交通问题的好方法。我时不时还在考虑交通问题，梦想不会消失，会变成习惯！我们现在花费精力做的事情，比如做饭、打扫、开车，今后占用的时间会越来越少，这不是天方夜谭。世上无难事，只怕有心人！&lt;/p&gt;

&lt;p&gt;　　我认为，自古精英出狂人。这话听起来挺没溜，但正因为别人没你疯狂。你的对手就很少事实上，狂人屈指可数。碰巧我都认识，他们比狗仔队还忙，比亲戚还走得近，乐于接受一个又一个挑战。谷歌就有这样一帮人，我们的任务是整合全世界的信息，使其随手可得，随时可用。碉堡吧？但谷歌差一点夭折，因为我和我的搭档Sergey担心丢了博士学位。好在你们已经毕业。当时我们坚信自己是一只暴风雨里的小小鸟，总有一天会飞得很高。即使刷爆了三张信用卡，买来谷歌的第一批硬盘，也不曾后悔。&lt;/p&gt;

&lt;p&gt;　　家长们，同学们。事实证明：多几张信用卡总是有用的，如果用一句话总结：如何改变世界。为了迷狂般的梦想而奋斗终生！其实在读博期间，我想参加三个项目。还好导师建议道：”为什么不先研究网络呢？”这个建议实在太好了，因为1995年网络就开始了迅猛发展。科技，尤其是网络确实能让人顺利变”懒”。你看三个人做的软件，能解决上百万人的需求问题，你让三个接线员回答上百万人的问题试试？只找到能撬起地球的杠杆，才能让人成功变懒。世界正在瞬息万变，但对你而言，这是个绝佳的时机！你可以不顾一切地追寻奇思，实现妙想，不要放弃梦想，世界需要你们！&lt;/p&gt;

&lt;p&gt;　　我还想说个故事：如果某天你如现在这般欣喜若狂，就像从马戏团的炮口轰了出来，一头冲向蓝天。请铭记那一刻的美妙，同时请铭记那些和家人朋友共处的时光，铭记每一个上天赋予你改造世界的机遇，铭记为所爱的人做出的改变，铭记生活赋予的一切美好，但生活也能轻易将它夺走。人生无常，1996年3月下旬，我到斯坦福大学读研不久，我的父亲便因呼吸困难住进了医院。两个月以后，他去世了。我当时几乎崩溃，许多年后，我创业，恋爱。历生命的种种后，我总会想起我的父亲。我和Lucy去过一个偏远又炎热的村庄，在狭窄的街道上散步。&lt;/p&gt;

&lt;p&gt;　　那里的人很友好，却极度贫穷。污水不经处理就径直流入饮水河道，我们遇到一个因小儿麻痹而瘸腿的小男孩。那是在印度村庄，少数还存在小儿麻痹症的地方。这种病主要归罪于污染的水源，我的父亲也有小儿麻痹症，他一年级去田纳西州旅行时患病，住院两个月后，由军用航班DC-3送回家，这是他第一次打飞的。&lt;/p&gt;

&lt;p&gt;　　他在五年级的日记里写道：我必须在床上躺一年，不能上学。父亲一辈子呼吸困难，小儿麻痹症使他过早离开我们。现在即使有了疫苗，小儿麻痹症依然肆虐，在印度脚上的鞋子也会传播小儿麻痹症，穿过那被污染的携带着病毒的水沟，每走一步都在传播病毒，病毒横行于孩子们玩耍的每个角落，人类正在努力消灭小儿麻痹症。到目前为止，还有328例感染病例。让我们加速这一进程吧，也许你们中就有人能够实现这个目标。&lt;/p&gt;

&lt;p&gt;　　我父亲曾作为学生代表在毕业典礼上致辞。我最近看到他的毕业演讲，震住了。他说，这是一个瞬息万变的时代，一个科学技术和人才就业在不断变革的时代，教育成为发展的必需品。我们有更多的时间做想做的事，因为工时减少，退休提前，我们期待这一刻的到来。参与或见证科学、医学、工业的飞速发展。人们说，一个国家的未来取决于对年轻人培养。&lt;/p&gt;

&lt;p&gt;　　如果所有美国青年能像我们一样接受教育，美国的前景会更加光明；如果父亲还在世，他会为即将出世的小孙子而高兴，也我没获得博士学位而揪心。感谢密歇根大学！&lt;/p&gt;

&lt;p&gt;　　他对于新事物总有着敏锐的观察，并充满热情。我时常幻想，他会如何看待现在的变化。如果他还在，这会是他人生中最美好的时光。他会像在糖果店的孩子那样开心，我们大部分人都很幸运，有家人为伴，有朋友相随，可能有些人正在憧憬和另一半的未来。当初家人带你来此读书，如今他们见证你毕业。&lt;/p&gt;

&lt;p&gt;　　请务必珍惜！记住——他们才是你们生命中最重要的人！谢谢你妈妈！谢谢你 Lucy！谢谢大家！&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.networkworld.com/article/2255174/applications/google-co-founder-larry-page-s-2009-university-of-michigan-commencement-speech-transcri.html&quot;&gt;英文原文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://v.youku.com/v_show/id_XMTE3MDQ2NTYw.html&quot;&gt;视频地址&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>深度学习概述：从感知机到深度网络</title>
   <link href="http://winares.github.com/2014/05/10/An-Introduction-to-Deep-Learning-From-Perceptrons-to-Deep-Networks"/>
   <updated>2014-05-10T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/05/10/An-Introduction-to-Deep-Learning-From-Perceptrons-to-Deep-Networks</id>
   <content type="html">
&lt;p&gt;近些年来，人工智能领域又活跃起来，除了传统了学术圈外，Google、Microsoft、facebook等工业界优秀企业也纷纷成立相关研究团队，并取得了很多令人瞩目的成果。这要归功于社交网络用户产生的大量数据，这些数据大都是原始数据，需要被进一步分析处理；还要归功于廉价而又强大的计算资源的出现，比如GPGPU的快速发展。&lt;/p&gt;

&lt;p&gt;除去这些因素，AI尤其是机器学习领域出现的一股新潮流很大程度上推动了这次复兴——深度学习。本文中我将介绍深度学习背后的关键概念及算法，从最简单的元素开始并以此为基础进行下一步构建。&lt;/p&gt;

&lt;p&gt;（PS：本文译自一篇博客，作者行文较随意，但作者所介绍的知识还是非常好的，包括例子的选择、理论的介绍都很到位，由浅入深，本文作者也是Java deep learning library的作者，&lt;a href=&quot;http://www.toptal.com/machine-learning/an-introduction-to-deep-learning-from-perceptrons-to-deep-networks）&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;机器学习基础&lt;/h3&gt;
&lt;p&gt;如果你不太熟悉相关知识，通常的机器学习过程如下：&lt;/p&gt;

&lt;p&gt;1、机器学习算法需要输入少量标记好的样本，比如10张小狗的照片，其中1张标记为1（意为狗）其它的标记为0（意为不是狗）——本文主要使用监督式、二叉分类。&lt;/p&gt;

&lt;p&gt;2、这些算法“学习”怎么样正确将狗的图片分类，然后再输入一个新的图片时，可以期望算法输出正确的图片标记（如输入一张小狗图片，输出1；否则输出0）。&lt;/p&gt;

&lt;p&gt;这通常是难以置信的：你的数据可能是模糊的，标记也可能出错；或者你的数据是手写字母的图片，用其实际表示的字母来标记它。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;感知机&lt;/h3&gt;
&lt;p&gt;感知机是最早的监督式训练算法，是神经网络构建的基础。&lt;/p&gt;

&lt;p&gt;假如平面中存在 n 个点，并被分别标记为“0”和“1”。此时加入一个新的点，如果我们想知道这个点的标记是什么（和之前提到的小狗图片的辨别同理），我们要怎么做呢？&lt;/p&gt;

&lt;p&gt;一种很简单的方法是查找离这个点最近的点是什么，然后返回和这个点一样的标记。而一种稍微“智能”的办法则是去找出平面上的一条线来将不同标记的数据点分开，并用这条线作为“分类器”来区分新数据点的标记。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-01.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在本例中，每一个输入数据都可以表示为一个向量 x =(x_1,x_2) ，而我们的函数则是要实现“如果线以下，输出0；线以上，输出1”。&lt;/p&gt;

&lt;p&gt;用数学方法表示，定义一个表示权重的向量 w 和一个垂直偏移量 b。然后，我们将输入、权重和偏移结合可以得到如下传递函数：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-02.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个传递函数的结果将被输入到一个激活函数中以产生标记。在上面的例子中，我们的激活函数是一个门限截止函数（即大于某个阈值后输出1）：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-03.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;训练&lt;/h3&gt;
&lt;p&gt;感知机的训练包括多训练样本的输入及计算每个样本的输出。在每一次计算以后，权重  w  都要调整以最小化输出误差，这个误差由输入样本的标记值与实际计算得出值的差得出。还有其它的误差计算方法，如 均方差 等，但基本的原则是一样的。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;缺陷&lt;/h3&gt;
&lt;p&gt;这种简单的感知机有一个明显缺陷：只能学习 线性可分函数 。这个缺陷重要吗？比如  XOR，这么简单的函数，都不能被线性分类器分类（如下图所示，分隔两类点失败）：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-04.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;为了解决这个问题，我们要使用一种多层感知机，也就是——前馈神经网络：事实上，我们将要组合一群这样的感知机来创建出一个更强大的学习机器。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;前馈神经网络&lt;/h3&gt;

&lt;p&gt;神经网络实际上就是将大量之前讲到的感知机进行组合，用不同的方法进行连接并作用在不同的激活函数上。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-05.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我们简单介绍下前向神经网络，其具有以下属性：&lt;/p&gt;

&lt;p&gt;*一个输入层，一个输出层，一个或多个隐含层。上图所示的神经网络中有一个三神经元的输入层、一个四神经元的隐含层、一个二神经元的输出层。
*每一个神经元都是一个上文提到的感知机。
*输入层的神经元作为隐含层的输入，同时隐含层的神经元也是输出层神经元的输入。
*每条建立在神经元之间的连接都有一个权重 w （与感知机中提到的权重类似）。
*在 t 层的每个神经元通常与前一层（t - 1层）中的每个神经元都有连接（但你可以通过将这条连接的权重设为0来断开这条连接）。
*为了处理输入数据，将输入向量赋到输入层中。在上例中，这个网络可以计算一个3维输入向量（由于只有3个输入层神经元）。假如输入向量是 [7, 1, 2]，你将第一个输入神经元输入7，中间的输入1，第三个输入2。这些值将被传播到隐含层，通过加权传递函数传给每一个隐含层神经元（这就是前向传播），隐含层神经元再计算输出（激活函数）。
*输出层和隐含层一样进行计算，输出层的计算结果就是整个神经网络的输出。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;超线性&lt;/h3&gt;

&lt;p&gt;如果每一个感知机都只能使用一个线性激活函数会怎么样？整个网络的最终输出也仍然是将输入数据通过一些线性函数计算过一遍，只是用一些在网络中收集的不同权值调整了一下。换名话说，再多线性函数的组合还是线性函数。如果我们限定只能使用线性激活函数的话，前馈神经网络其实比一个感知机强大不到哪里去，无论网络有多少层。&lt;/p&gt;

&lt;p&gt;正是这个原因， 大多数神经网络都是使用的非线性激活函数，如对数函数、双曲正切函数、阶跃函数、整流函数等。不用这些非线性函数的神经网络只能学习输入数据的线性组合。&lt;/p&gt;

&lt;h3 id=&quot;section-6&quot;&gt;训练&lt;/h3&gt;

&lt;p&gt;大多数常见的应用在 多层感知机的监督式训练的算法都是反向传播算法。基本的流程如下：&lt;/p&gt;

&lt;p&gt;1、将训练样本通过神经网络进行前向传播计算。&lt;/p&gt;

&lt;p&gt;2、计算输出误差，常用均方差：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-06.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其中 t 是目标值，y 是实际的神经网络计算输出。其它的误差计算方法也可以，但MSE（均方差）通常是一种较好的选择。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-07.svg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;3、网络误差通过 随机梯度下降 的方法来最小化。&lt;/p&gt;

&lt;p&gt;梯度下降很常用，但在神经网络中，输入参数是一个训练误差的曲线。每个权重的最佳值应该是误差曲线中的全局最小值（上图中的  global minimum ）。在训练过程中，权重以非常小的步幅改变（在每个样本或每小组样本训练完成后）以找到全局最小值，但这可不容易，训练通常会结束在局部最小值上（上图中的local minima）。如例子中的，如果当前权重值为0.6，那么要向0.4方向移动。&lt;/p&gt;

&lt;p&gt;这个图表示的是最简单的情况，误差只依赖于单个参数。但是，网络误差依赖于每一个网络权重，误差函数非常、非常复杂。&lt;/p&gt;

&lt;p&gt;好消息是反向传播算法提供了一种通过利用输出误差来修正两个神经元之间权重的方法。关系本身十分复杂，但对于一个给定结点的权重修正按如下方法（简单）：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-08.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其中 E 是输出误差，w_i 是输入 i 的权重。&lt;/p&gt;

&lt;p&gt;实质上这么做的目的是利用权重 i 来修正梯度的方向。关键的地方在于误差的导数的使用，这可不一定好计算：你怎么样能给一个大型网络中随机一个结点中的随机一个权重求导数呢？&lt;/p&gt;

&lt;p&gt;答案是：通过反向传播。误差的首次计算很简单（只要对预期值和实际值做差即可），然后通过一种巧妙的方法反向传回网络，让我们有效的在训练过程中修正权重并 （期望） 达到一个最小值。&lt;/p&gt;

&lt;h3 id=&quot;section-7&quot;&gt;隐含层&lt;/h3&gt;

&lt;p&gt;隐含层十分有趣。根据 普适逼近原理 ，一个具有有限数目神经元的隐含层可以被训练成可逼近任意随机函数。换句话说，一层隐含层就强大到可以学习任何函数了。这说明我们在多隐含层（如深度网络）的实践中可以得到更好的结果。&lt;/p&gt;

&lt;p&gt;隐含层存储了训练数据的内在抽象表示，和人类大脑（简化的类比）保存有对真实世界的抽象一样。接下来，我们将用各种方法来搞一下这个隐含层。&lt;/p&gt;

&lt;h3 id=&quot;section-8&quot;&gt;一个网络的例子&lt;/h3&gt;

&lt;p&gt;可以看一下这个通过 testMLPSigmoidBP 方法用Java实现的简单(4-2-3)前馈神经网络，它将 IRIS 数据集进行了分类。这个数据集中包含了三类鸢尾属植物，特征包括花萼长度，花瓣长度等等。每一类提供50个样本给这个神经网络训练。特征被赋给输入神经元，每一个输出神经元代表一类数据集（“1/0/0” 表示这个植物是Setosa，“0/1/0”表示 Versicolour，而“0/0/1”表示 Virginica）。分类的错误率是2/150（即每分类150个，错2个）。&lt;/p&gt;

&lt;h3 id=&quot;section-9&quot;&gt;大规模网络中的难题&lt;/h3&gt;

&lt;p&gt;神经网络中可以有多个隐含层：这样，在更高的隐含层里可以对其之前的隐含层构建新的抽象。而且像之前也提到的，这样可以更好的学习大规模网络。增加隐含层的层数通常会导致两个问题：&lt;/p&gt;

&lt;p&gt;1、梯度消失：随着我们添加越来越多的隐含层，反向传播传递给较低层的信息会越来越少。实际上，由于信息向前反馈，不同层次间的梯度开始消失，对网络中权重的影响也会变小。&lt;/p&gt;

&lt;p&gt;2、过度拟合：也许这是机器学习的核心难题。简要来说，过度拟合指的是对训练数据有着过于好的识别效果，这时导至模型非常复杂。这样的结果会导致对训练数据有非常好的识别较果，而对真实样本的识别效果非常差。&lt;/p&gt;

&lt;p&gt;下面我们来看看一些深度学习的算法是如何面对这些难题的。&lt;/p&gt;

&lt;h3 id=&quot;section-10&quot;&gt;自编码器&lt;/h3&gt;

&lt;p&gt;大多数的机器学习入门课程都会让你放弃前馈神经网络。但是实际上这里面大有可为——请接着看。&lt;/p&gt;

&lt;p&gt;自编码器就是一个典型的前馈神经网络，它的目标就是学习一种对数据集的压缩且分布式的表示方法（编码思想）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-09.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;从概念上讲，神经网络的目的是要训练去“重新建立”输入数据，好像输入和目标输出数据是一样的。换句话说：你正在让神经网络的输出与输入是同一样东西，只是经过了压缩。这还是不好理解，先来看一个例子。 &lt;/p&gt;

&lt;h3 id=&quot;section-11&quot;&gt;压缩输入数据：灰度图像&lt;/h3&gt;

&lt;p&gt;这里有一个由28x28像素的灰度图像组成的训练集，且每一个像素的值都作为一个输入层神经元的输入（这时输入层就会有784个神经元）。输出层神经元要有相同的数目（784），且每一个输出神经元的输出值和输入图像的对应像素灰度值相同。&lt;/p&gt;

&lt;p&gt;在这样的算法架构背后，神经网络学习到的实际上并不是一个训练数据到标记的“映射”，而是去学习数据本身的内在结构和特征（也正是因为这，隐含层也被称作特征探测器(feature detector)）。通常隐含层中的神经元数目要比输入/输入层的少，这是为了使神经网络只去学习最重要的特征并实现特征的降维。&lt;/p&gt;

&lt;p&gt;我们想在中间层用很少的结点去在概念层上学习数据、产生一个紧致的表示方法。&lt;/p&gt;

&lt;h3 id=&quot;section-12&quot;&gt;流行感冒&lt;/h3&gt;

&lt;p&gt;为了更好的描述自编码器，再看一个应用。&lt;/p&gt;

&lt;p&gt;这次我们使用一个简单的数据集，其中包括一些感冒的症状。如果感兴趣，这个例子的源码发布在&lt;a href=&quot;https://github.com/ivan-vasilev/neuralnetworks/blob/master/nn-core/src/test/java/com/github/neuralnetworks/test/AETest.java。&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;数据结构如下：&lt;/p&gt;

&lt;p&gt;*输入数据一共六个二进制位
*前三位是病的证状。例如， 1 0 0 0 0 0  代表病人发烧； 0 1 0 0 0 0  代表咳嗽； 1 1 0 0 0 0  代表即咳嗽又发烧等等。
*后三位表示抵抗能力，如果一个病人有这个，代表他/她不太可能患此病。例如， 0 0 0 1 0 0  代表病人接种过流感疫苗。一个可能的组合是：0 1 0 1 0 0 ，这代表着一个接种过流感疫苗的咳嗽病人，等等。&lt;/p&gt;

&lt;p&gt;当一个病人同时拥用前三位中的两位时，我们认为他生病了；如果至少拥用后三位中的两位，那么他是健康的，如：&lt;/p&gt;

&lt;p&gt;*111000, 101000, 110000, 011000, 011100  = 生病
*000111, 001110, 000101, 000011, 000110  = 健康&lt;/p&gt;

&lt;p&gt;我们来训练一个自编码器（使用反向传播），六个输入、六个输出神经元，而只有两个隐含神经元。&lt;/p&gt;

&lt;p&gt;在经过几百次迭代以后，我们发现，每当一个“生病”的样本输入时，两个隐含层神经元中的一个（对于生病的样本总是这个）总是显示出更高的激活值。而如果输入一个“健康”样本时，另一个隐含层则会显示更高的激活值。&lt;/p&gt;

&lt;h3 id=&quot;section-13&quot;&gt;再看学习&lt;/h3&gt;

&lt;p&gt;本质上来说，这两个隐含神经元从数据集中学习到了流感症状的一种紧致表示方法。为了检验它是不是真的实现了学习，我们再看下过度拟合的问题。通过训练我们的神经网络学习到的是一个紧致的简单的，而不是一个高度复杂且对数据集过度拟合的表示方法。&lt;/p&gt;

&lt;p&gt;某种程度上来讲，与其说在找一种简单的表示方法，我们更是在尝试从“感觉”上去学习数据。&lt;/p&gt;

&lt;h3 id=&quot;section-14&quot;&gt;受限波尔兹曼机&lt;/h3&gt;

&lt;p&gt;下一步来看下受限波尔兹曼机（Restricted Boltzmann machines  RBM），一种可以在输入数据集上学习概率分布的生成随机神经网络。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-10.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;RBM由隐含层、可见层、偏置层组成。和前馈神经网络不同，可见层和隐含层之间的连接是无方向性（值可以从可见层-&amp;gt;隐含层或隐含层-&amp;gt;可见层任意传输）且全连接的（每一个当前层的神经元与下一层的每个神经元都有连接——如果允许任意层的任意神经元连接到任意层去，我们就得到了一个波尔兹曼机（非受限的））。&lt;/p&gt;

&lt;p&gt;标准的RBM中，隐含和可见层的神经元都是二态的（即神经元的激活值只能是服从 伯努力分布 的0或1），不过也存在其它非线性的变种。&lt;/p&gt;

&lt;p&gt;虽然学者们已经研究RBM很长时间了，最近出现的对比差异无监督训练算法使这个领域复兴。&lt;/p&gt;

&lt;h3 id=&quot;section-15&quot;&gt;对比差异&lt;/h3&gt;

&lt;p&gt;单步对比差异算法原理：&lt;/p&gt;

&lt;p&gt;1、正向过程：&lt;/p&gt;

&lt;p&gt;*输入样本  v  输入至输入层中。
*v通过一种与前馈网络相似的方法传播到隐含层中，隐含层的激活值为 h。
2、反向过程：&lt;/p&gt;

&lt;p&gt;*将 h 传回可见层得到 v’（可见层和隐含层的连接是无方向的，可以这样传）。
*再将 v’ 传到隐含层中，得到 h’。
3、权重更新：
&lt;img src=&quot;/assets/media/image-5-11-11.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其中  a 是学习速率， v , v’ , h , h’  和 w  都是向量。&lt;/p&gt;

&lt;p&gt;算法的思想就是在正向过程中影响了网络的内部对于真实数据的表示。同时，反向过程中尝试通过这个被影响过的表示方法重建数据。主要目的是可以使生成的数据与原数据尽可能相似，这个差异影响了权重更新。&lt;/p&gt;

&lt;p&gt;换句话说，这样的网络具有了感知对输入数据表示的程度的能力，而且尝试通过这个感知能力重建数据。如果重建出来的数据与原数据差异很大，那么进行调整并再次重建。&lt;/p&gt;

&lt;h3 id=&quot;section-16&quot;&gt;再看流行感冒的例子&lt;/h3&gt;

&lt;p&gt;为了说明对比差异，我们使用与上例相同的流感症状的数据集。测试网络是一个包含6个可见层神经元、2个隐含层神经元的RBM。我们用对比差异的方法对网络进行训练，将症状  v  赋到可见层中。在测试中，这些症状值被重新传到可见层；然后再被传到隐含层。隐含层的神经元表示健康/生病的状态，与自编码器相似。&lt;/p&gt;

&lt;p&gt;在进行过几百次迭代后，我们得到了与自编码器相同的结果：输入一个生病样本，其中一个隐含层神经元具有更高激活值；输入健康的样本，则另一个神经元更兴奋。&lt;/p&gt;

&lt;p&gt;例子的代码在 &lt;a href=&quot;https://github.com/ivan-vasilev/neuralnetworks/blob/master/nn-core/src/test/java/com/github/neuralnetworks/test/RBMTest.java。&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-17&quot;&gt;深度网络&lt;/h3&gt;

&lt;p&gt;到现在为止，我们已经学习了隐含层中强大的特征探测器——自编码器和RBM，但现在还没有办法有效的去利用这些功能。实际上，上面所用到的这些数据集都是特定的。而我们要找到一些方法来间接的使用这些探测出的特征。&lt;/p&gt;

&lt;p&gt;好消息是，已经发现这些结构可以通过栈式叠加来实现深度网络。这些网络可以通过贪心法的思想训练，每次训练一层，以克服之前提到在反向传播中梯度消失及过度拟合的问题。&lt;/p&gt;

&lt;p&gt;这样的算法架构十分强大，可以产生很好的结果。如Google著名的 “猫”识别 ，在实验中通过使用特定的深度自编码器，在无标记的图片库中学习到人和猫脸的识别。&lt;/p&gt;

&lt;p&gt;下面我们将更深入。&lt;/p&gt;

&lt;h3 id=&quot;section-18&quot;&gt;栈式自编码器&lt;/h3&gt;

&lt;p&gt;和名字一样，这种网络由多个栈式结合的自编码器组成。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-12.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;自编码器的隐含层 t会作为 t + 1 层的输入层。第一个输入层就是整个网络的输入层。利用贪心法训练每一层的步骤如下：&lt;/p&gt;

&lt;p&gt;1、通过反向传播的方法利用所有数据对第一层的自编码器进行训练（t=1 ，上图中的红色连接部分）。&lt;/p&gt;

&lt;p&gt;2、训练第二层的自编码器 t=2 （绿色连接部分）。由于 t=2 的输入层是 t=1  的隐含层，我们已经不再关心 t=1 的输入层，可以从整个网络中移除。整个训练开始于将输入样本数据赋到 t=1 的输入层，通过前向传播至t = 2的输出层。下面t = 2的权重（输入-&amp;gt;隐含和隐含-&amp;gt;输出）使用反向传播的方法进行更新。t = 2的层和 t=1 的层一样，都要通过所有样本的训练。&lt;/p&gt;

&lt;p&gt;3、对所有层重复步骤1-2（即移除前面自编码器的输出层，用另一个自编码器替代，再用反向传播进行训练）。&lt;/p&gt;

&lt;p&gt;4、步骤1-3被称为预训练，这将网络里的权重值初始化至一个合适的位置。但是通过这个训练并没有得到一个输入数据到输出标记的映射。例如，一个网络的目标是被训练用来识别手写数字，经过这样的训练后还不能将最后的特征探测器的输出（即隐含层中最后的自编码器）对应到图片的标记上去。这样，一个通常的办法是在网络的最后一层（即蓝色连接部分）后面再加一个或多个全连接层。整个网络可以被看作是一个多层的感机机，并使用反向传播的方法进行训练（这步也被称为微调）。&lt;/p&gt;

&lt;p&gt;栈式自编码器，提供了一种有效的预训练方法来初始化网络的权重，这样你得到了一个可以用来训练的 复杂、多层的 感知机。&lt;/p&gt;

&lt;h3 id=&quot;section-19&quot;&gt;深度信度网络&lt;/h3&gt;

&lt;p&gt;和自编码器一样，我也可以将波尔兹曼机进行栈式叠加来构建深度信度网络（DBN）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-13.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在本例中，隐含层 RBM  t  可以看作是 RBM  t+1  的可见层。第一个RBM的输入层即是整个网络的输入层，层间贪心式的预训练的工作模式如下：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;通过对比差异法对所有训练样本训练第一个RBM  t=1  &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;训练第二个RBM  t=1 。由于  t=2  的可见层是  t=1  的隐含层，训练开始于将数据赋至  t=1  的可见层，通过前向传播的方法传至  t=1  的隐含层。然后作为  t=2  的对比差异训练的初始数据。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;对所有层重复前面的过程。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;和栈式自编码器一样，通过预训练后，网络可以通过连接到一个或多个层间全连接的 RBM 隐含层进行扩展。这构成了一个可以通过反向传僠进行微调的多层感知机。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;本过程和栈式自编码器很相似，只是用RBM将自编码器进行替换，并用对比差异算法将反向传播进行替换。&lt;/p&gt;

&lt;p&gt;(注: 例中的源码可以从  &lt;a href=&quot;https://github.com/ivan-vasilev/neuralnetworks/blob/d2bbc296eca926d07d09b860b29c5a5a3f632f63/nn-core/src/test/java/com/github/neuralnetworks/test/DNNTest.java&quot;&gt;此处&lt;/a&gt; 获得)&lt;/p&gt;

&lt;h3 id=&quot;section-20&quot;&gt;卷积网络&lt;/h3&gt;

&lt;p&gt;这个是本文最后一个软件架构——卷积网络，一类特殊的对图像识别非常有效的前馈网络。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-5-11-14.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在我们深入看实际的卷积网络之臆，我们先定义一个图像滤波器，或者称为一个赋有相关权重的方阵。一个滤波器可以应用到整个图片上，通常可以应用多个滤波器。比如，你可以应用四个6x6的滤波器在一张图片上。然后，输出中坐标（1,1）的像素值就是输入图像左上角一个6x6区域的加权和，其它像素也是如此。&lt;/p&gt;

&lt;p&gt;有了上面的基础，我们来介绍定义出卷积网络的属性：&lt;/p&gt;

&lt;p&gt;*卷积层   对输入数据应用若干滤波器。比如图像的第一卷积层使用4个6x6滤波器。对图像应用一个滤波器之后的得到的结果被称为特征图谱（feature map, FM），特征图谱的数目和滤波器的数目相等。如果前驱层也是一个卷积层，那么滤波器应用在FM上，相当于输入一个FM，输出另外一个FM。从直觉上来讲，如果将一个权重分布到整个图像上后，那么这个特征就和位置无关了，同时多个滤波器可以分别探测出不同的特征。
*下采样层  缩减输入数据的规模。例如输入一个32x32的图像，并且通过一个2x2的下采样，那么可以得到一个16x16的输出图像，这意味着原图像上的四个像素合并成为输出图像中的一个像素。实现下采样的方法有很多种，最常见的是最大值合并、平均值合并以及随机合并。
*最后一个下采样层（或卷积层）通常连接到一个或多个全连层，全连层的输出就是最终的输出。
*训练过程通过改进的反向传播实现，将下采样层作为考虑的因素并基于所有值来更新卷积滤波器的权重。&lt;/p&gt;

&lt;p&gt;可以&lt;a href=&quot;https://github.com/ivan-vasilev/neuralnetworks/blob/9e569aa7c9a4d724cf3c1aed8a8036af272ec58f/nn-samples/src/test/java/com/github/neuralnetworks/samples/test/MnistTest.java&quot;&gt;在这&lt;/a&gt;看几个应用在  MNIST  数据集上的卷积网络的例子， 在这 还有一个用JavaScript实现的一个可视的类似网络。&lt;/p&gt;

&lt;p&gt;实现&lt;/p&gt;

&lt;p&gt;目前为止，我们已经学会了常见神经网络中最主要的元素了，但是我只写了很少的在实现过程中所遇到的挑战。&lt;/p&gt;

&lt;p&gt;概括来讲，我的目标是实现一个 深度学习的库 ，即一个基于神经网络且满足如下条件的框架：&lt;/p&gt;

&lt;p&gt;一个可以表示多种模型的通用架构（比如所有上文提到的神经网络中的元素）
可以使用多种训练算法（反向传播，对比差异等等）。
体面的性能
为了满足这些要求，我在软件的设计中使用了分层的思想。&lt;/p&gt;

&lt;p&gt;结构&lt;/p&gt;

&lt;p&gt;我们从如下的基础部分开始：&lt;/p&gt;

&lt;p&gt;NeuralNetworkImpl  是所有神经网络模型实现的基类。
每个网络都包含有一个  layer  的集合。
每一层中有一个  connections  的链表， connection 指的是两个层之间的连接，将整个网络构成一个有向无环图。
这个结构对于经典的反馈网络、 RBM  及更复杂的如  ImageNet  都已经足够灵活。&lt;/p&gt;

&lt;p&gt;这个结构也允许一个 layer 成为多个网络的元素。比如，在  Deep Belief Network （深度信度网络）中的layer也可以用在其 RBM 中。&lt;/p&gt;

&lt;p&gt;另外，通过这个架构可以将DBN的预训练阶段显示为一个栈式RBM的列表，微调阶段显示为一个前馈网络，这些都非常直观而且程序实现的很好。&lt;/p&gt;

&lt;h3 id=&quot;section-21&quot;&gt;数据流&lt;/h3&gt;

&lt;p&gt;下个部分介绍网络中的数据流，一个两步过程:&lt;/p&gt;

&lt;p&gt;定义出层间的序列。例如，为了得到一个多层感知机的结果，输入数据被赋到输入层（因此，这也是首先被计算的层），然后再将数据通过不同的方法流向输出层。为了在反向传播中更新权重，输出的误差通过广度优先的方法从输出层传回每一层。这部分通过  LayerOrderStrategy   进行实现，应用到了网络图结构的优势，使用了不同的图遍历方法。其中一些样例包含了  广度优先策略  和  定位到一个指定的层 。层的序列实际上由层间的连接进行决定，所以策略部分都是返回一个连接的有序列表。
计算激活值。每一层都有一个关联的  ConnectionCalculator ，包含有连接的列表（从上一步得来）和输入值（从其它层得到）并计算得到结果的激活值。例如，在一个简单的S形前馈网络中，隐含层的   ConnectionCalculator  接受输入层和偏置层的值（分别为输入值和一个值全为1的数组）和神经元之间的权重值（如果是全连接层，权重值实际上以一个矩阵的形式存储在一个  FullyConnected  结构中，计算加权和，然后将结果传给S函数。 ConnectionCalculator  中实现了一些转移函数（如加权求和、卷积）和激活函数（如对应多层感知机的对数函数和双曲正切函数，对应RBM的二态函数）。其中的大部分都可以通过  Aparapi  在GPU上进行计算，可以利用迷你批次训练。
通过 Aparapi 进行 GPU 计算&lt;/p&gt;

&lt;p&gt;像我之前提到的，神经网络在近些年复兴的一个重要原因是其训练的方法可以高度并行化，允许我们通过GPGPU高效的加速训练。本文中，我选择  Aparapi  库来进行GPU的支持。&lt;/p&gt;

&lt;p&gt;Aparapi 在连接计算上强加了一些重要的限制：&lt;/p&gt;

&lt;p&gt;只允许使用原始数据类型的一维数组（变量）。
在GPU上运行的程序只能调用 Aparapi  Kernel  类本身的成员函数。
这样，大部分的数据（权重、输入和输出数据）都要保存在  Matrix  实例里面，其内部是一个一维浮点数组。所有Aparapi 连接计算都是使用  AparapiWeightedSum  （应用在全连接层和加权求和函数上）、  AparapiSubsampling2D  （应用在下采样层）或  AparapiConv2D  （应用在卷积层）。这些限制可以通过  Heterogeneous System Architecture 里介绍的内容解决一些。而且Aparapi 允许相同的代码运行在CPU和GPU上。&lt;/p&gt;

&lt;h3 id=&quot;section-22&quot;&gt;训练&lt;/h3&gt;

&lt;p&gt;training  的模块实现了多种训练算法。这个模块依赖于上文提到的两个模块。比如， BackPropagationTrainer  （所有的训练算法都以  Trainer  为基类）在前馈阶段使用前馈层计算，在误差传播和权重更新时使用特殊的广度优先层计算。&lt;/p&gt;

&lt;p&gt;我最新的工作是在Java8环境下开发，其它一些更新的功能可以在这个 branch  下获得，这部分的工作很快会merge到主干上。&lt;/p&gt;

&lt;h3 id=&quot;section-23&quot;&gt;结论&lt;/h3&gt;

&lt;p&gt;本文的目标是提供一个深度学习算法领域的一个简明介绍，由最基本的组成元素开始（感知机）并逐渐深入到多种当前流行且有效的架构上，比如受限波尔兹曼机。&lt;/p&gt;

&lt;p&gt;神经网络的思想已经出现了很长时间，但是今天，你如果身处机器学习领域而不知道深度学习或其它相关知识是不应该的。不应该过度宣传，但不可否认随着GPGPU提供的计算能力、包括Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng在内的研究学者们提出的高效算法，这个领域已经表现出了很大的希望。现在正是最佳的时间深入这些方面的学习。&lt;/p&gt;

&lt;h3 id=&quot;section-24&quot;&gt;附录：相关资源&lt;/h3&gt;

&lt;p&gt;如果你想更深入的学习，下面的这些资源在我的工作当中都起过重要的作用：&lt;/p&gt;

&lt;p&gt;DeepLearning.net : 深度学习所有方面知识的一个门户。里面有完善的 手册 、 软件库  和一个非常好的  阅读列表 。
活跃的  Google+ 社区 .
两个很好的课程:  Machine Learning  and  Neural Networks for Machine Learning , 都在Coursera上。
The  Stanford neural networks tutorial ，斯坦福神经网络指南。&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>怎么培养数据分析的能力？</title>
   <link href="http://winares.github.com/2014/04/21/data-analysis"/>
   <updated>2014-04-21T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/04/21/data-analysis</id>
   <content type="html">
&lt;p&gt;&lt;a href=&quot;http://www.zhihu.com/question/19851900/answer/24234193&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果想深入学习数据分析的话建议了解一些数据挖掘的知识。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.zhihu.com/question/20751219/answer/24345252&quot;&gt;如何系统地学习数据挖掘？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.zhihu.com/question/19640095/answer/24240031&quot;&gt;做数据分析不得不看的书有哪些？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.zhihu.com/question/19637218/answer/24277701?group_id=238757668&quot;&gt;什么是数据挖掘？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;谈一些个人的工作经验，希望对后来人有帮助。首先总结下平时数据分析的一般步骤。&lt;/p&gt;

&lt;p&gt;—————————浓缩精华版——————————–&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一步：数据准备：（70%时间）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;获取数据（爬虫，数据仓库）
验证数据
数据清理（缺失值、孤立点、垃圾信息、规范化、重复记录、特殊值、合并数据集）
使用python进行文件读取csv或者txt便于操作数据文件（I/O和文件串的处理，逗号分隔）
抽样（大数据时。关键是随机）
存储和归档&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第二步：数据观察（发现规律和隐藏的关联）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;单一变量：点图、抖动图；直方图、核密度估计；累计分布函数
两个变量：散点图、LOESS平滑、残差分析、对数图、倾斜
多个变量：假色图、马赛克图、平行左边图&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第三步：数据建模&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;推算和估算（均衡可行性和成本消耗）
缩放参数模型（缩放维度优化问题）
建立概率模型（二项、高斯、幂律、几何、泊松分布与已知模型对比）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第四步：数据挖掘&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;选择合适的机器学习算法（蒙特卡洛模拟，相似度计算，主成分分析）
大数据考虑用Map/Reduce
得出结论，绘制最后图表&lt;/p&gt;

&lt;p&gt;循环到第二步到第四步，进行数据分析，根据图表得出结论完成文章。&lt;/p&gt;

&lt;p&gt;——————————业务分析版——————————–&lt;/p&gt;

&lt;p&gt;“无尺度网络模型”的作者艾伯特-拉斯洛·巴拉巴西认为——人类93%的行为是可以预测的。数据作为人类活动的痕迹，就像金矿等待发掘。但是首先你得明确自己的业务需求，数据才可能为你所用。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.数据为王，业务是核心&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;了解整个产业链的结构
制定好业务的发展规划
衡量的核心指标有哪些&lt;/p&gt;

&lt;p&gt;有了数据必须和业务结合才有效果。首先你需要摸清楚所在产业链的整个结构，对行业的上游和下游的经营情况有大致的了解。然后根据业务当前的需要，指定发展计划，从而归类出需要整理的数据。最后一步详细的列出数据核心指标（KPI），并且对几个核心指标进行更细致的拆解，当然具体结合你的业务属性来处理，找出那些对指标影响幅度较大的影响因子。前期资料的收集以及业务现况的全面掌握非常关键。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.思考指标现状，发现多维规律&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;熟悉产品框架，全面定义每个指标的运营现状
对比同行业指标，挖掘隐藏的提升空间
拆解关键指标，合理设置运营方法来观察效果
争对核心用户，单独进行产品用研与需求挖掘&lt;/p&gt;

&lt;p&gt;发现规律不一定需要很高深的编程方法，或者复杂的统计公式，更重要的是培养一种感觉和意识。不能用你的感觉去揣测用户的感觉，因为每个人的教育背景、生活环境都不一样。很多数据元素之间的关系没有明显的显示，需要使用直觉与观察（数据可视化技术来呈现）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.规律验证，经验总结&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;发现了规律之后不能立刻上线，需要在测试机上对模型进行验证。&lt;/p&gt;

&lt;p&gt;P.S.数学建模能力对培养数感有一定的帮助&lt;/p&gt;

&lt;p&gt;推荐两个论坛：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mathsccnu.com/forum.php&quot;&gt;数学建模与数学应用论坛(Mathematical Modeling and Mathematical Applications Forum)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.madio.net/forum.php&quot;&gt;数学中国 (数学建模)-最专业的数学理论研究、建模实践平台&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>推荐系统知识点汇总</title>
   <link href="http://winares.github.com/2014/03/14/recommendation-system-knowledge"/>
   <updated>2014-03-14T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/03/14/recommendation-system-knowledge</id>
   <content type="html">
&lt;p&gt;主要是对《推荐系统实践》和《推荐系统导论》两本书的知识点的整理归纳。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140314_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140314_2.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对推荐系统的建模数据进行分析，代表型数据：1)无上下文的隐形反馈数据；2) 无上下文的显性反馈数据；3) 有上下文的隐形反馈数据；4)有小上下文的显性反馈数据，其中显性的反馈数据就是用户对物品的评分，而隐形的就是用户对物品的浏览，时长等数据(不同的领域，用户对物品的行为种类不一样)，像我之前的做的都全是用有上下文的隐形反馈，都是通过点击、登陆、时长归纳出来的用户对物品的评分。&lt;/p&gt;

&lt;p&gt;有了用户数据以后，可以做一些行为的分析：1) 用户活跃度和物品流行度的分布(用户浏览过多少物品和物品被多少用户浏览过，符合长尾分布？)；2) 用户活跃度跟物品流行度的关系(是不是新用户趋近于接触热门物品？)；3) 用户的平均评分和物品的平均评分(流行度中等的物品的平均评分，可能平均分很高)&lt;/p&gt;

&lt;p&gt;有了上面的数据跟分析之后，接下来就开始运用算法来建模了，常用的有基于领域的算法，基于隐语义模型，基于图模型等。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;基于领域的算法&lt;/h3&gt;
&lt;p&gt;通常又分基于用户的和基于物品的CF，前一种算法的步骤:&lt;/p&gt;

&lt;p&gt;(1)找到和目标用户兴趣相似的用户集合；&lt;/p&gt;

&lt;p&gt;(2) 找到这个集合的用户喜欢听的，而且目标用户没有听过的物品&lt;/p&gt;

&lt;p&gt;后一种算法的步骤：&lt;/p&gt;

&lt;p&gt;(1)计算物品与物品之间的相似度；&lt;/p&gt;

&lt;p&gt;(2) 通过目标用户已经正反馈的物品，来找到相似度其它物品。&lt;/p&gt;

&lt;p&gt;上面2种算法的关键是找到用户/物品相似度集合，这里的用户/物品的相似度计算，不是用用户/物品的内在属性来衡量的(比如A物品是青苹果，B物品是红苹果，C物品是香蕉，用协同过滤的思想来计算的话，A跟B就不一定相似哦)，直观上来讲 就是 如果A用户跟B用户 的物品重合性高，那么A跟B就相似，类似如果A物品跟B物品的共同用户重合性高，那么A跟B相似。&lt;/p&gt;

&lt;p&gt;计算相似度的公式有很多种，余弦、皮尔逊、欧氏距离等。关于详细的公式请参考谷歌度娘。&lt;/p&gt;

&lt;p&gt;实际应用需要注意的一些点：&lt;/p&gt;

&lt;p&gt;1)余弦跟欧氏距离区别：我的感觉这两种方式，一个是定性，一个是定量，比如A用户对2个物品的评分是3,3，而B用户对这两个物品的评分是5,5，如果按余弦计算A,B就是相似的，而欧氏距离认为这两个用户还是有差异的；&lt;/p&gt;

&lt;p&gt;2)通过余弦计算的时候，通常会做一个预处理，评分的用户会预先把每个物品的评分减去该用户的平均分 或者 加一个惩罚项(按物品的流行度/用户的活跃度)。计算用户跟用户相似度时 惩罚那些物品流行度高的，换句话说 2个用户对偏重冷门物品的有相同行为比对热门的有相同行为的更相似&lt;/p&gt;

&lt;p&gt;3)对某用户活跃度太高的人，应该去除该用户&lt;/p&gt;

&lt;p&gt;4) 相似度的归一化，提高推荐的多样性&lt;/p&gt;

&lt;p&gt;user-cf的参数K值影响,K越大，结果越全局热门，覆盖面越小，流行度越大，通常运营与新闻类网站。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140314_3.png&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外需要关注的就是哈利波特问题，就是某个物品太热了，而导致好多物品都会跟热门物品关联&lt;/p&gt;

&lt;p&gt;最后，经常会问到的问题是：协同过滤跟关联规则有什么区别？&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;关联规则面向的是transaction，而协同过滤面向的是用户偏好（评分）。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;协同过滤在计算相似商品的过程中可以使用关联规则分析，但是在有用户评分的情况下（非1/0），协同过滤算法应该比传统的关联规则更能产生精准的推荐。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;协同过滤的约束条件没有关联规则强，或者说更为灵活，可以考虑更多的商业实施运算和特殊的商业规则。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;section-1&quot;&gt;基于隐语义模型&lt;/h3&gt;

&lt;p&gt;基于隐语义模型是近几年来研究比较火热的领域，特别是学术界，因为可以玩数学公式，出学术论文等。该模型的核心思想是通过隐变量(特征)来联系用户的兴趣跟物品。比较著名的方法有：PLSA,LDA,MF,LFM等，关于这些模型的目标损失函数，优化算法等请参考相应论文/技术博客&lt;/p&gt;

&lt;p&gt;由于数据集里面的都是用户有正反馈行为的物品，那么如何采集用户的负样本呢？1) 对于每个用户，保证正负样本均衡；2) 采样负样本时，对更热门的负样本 加大采样权重。&lt;/p&gt;

&lt;p&gt;案例：雅虎的新闻推荐，新闻在很短的时间内获得大量关注或是去关注，特别是刚出的新闻。这对于单纯的LFM很难实时推荐，因为需要在用户行为记录上反复迭代才能获取较好的性能。一个替代的方案是：预先利用新闻链接的内容属性(关键字、类别等)得到连接的内容特征向量跟用户对内容特征的兴趣程度(历史记录)，然后再叠加最近几个小时更新的LFM，拿到用户实时的兴趣。最后通过两步叠加生成最后的实时结果&lt;/p&gt;

&lt;p&gt;LMF跟基于领域的方法比较：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;理论基础，前者有明确的优化函数，而基于领域的则更多的基于统计的方法，并没有一个学习的过程；&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;离线计算的空间复杂度：假设M个用户N个物品，对于LMF则需要O(F&lt;em&gt;(M+N))的空间复杂度，F是隐变量的个数，对于user-cf需要O(M&lt;/em&gt;M)记录用户相关表，而item-cf要O(N*N)记录物品相关表&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;离线计算的时间复杂度：假设M个用户N个物品K条用户对物品的行为记录，对于LMF则需要O(F&lt;em&gt;K&lt;/em&gt;S)的空间复杂度，F是隐变量的个数，S是迭代次数，对于user-cf需要O(M&lt;em&gt;（K/M)^2)时间复杂度，而item-cf要O(M&lt;/em&gt;（K/M)^2) 时间复杂度&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;推荐解释，item-cf能给出很好的解释，而LFM则无法给出具体业务上的解释&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;section-2&quot;&gt;基于图模型&lt;/h3&gt;

&lt;p&gt;由于用户物品的行为都可以转化为二分图的表示，那么就可以根据历史数据构建出这种形式，然后度量两个顶点之间的相似度的问题。基于这个思想的著名算法包括随机游走和PersonalRank算法。适合社交关系较强的数据应用上。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;冷启动问题&lt;/h3&gt;

&lt;p&gt;常见的冷启动问题包括三类:1)用户冷启动(新用户没有历史行为，该怎么推荐？)；2)物品冷启动(新物品，该如何向对齐感兴趣的用户推荐? item-cf受影响)；3)系统冷启动(新开发的网站，没用户，只有一些物品信息，如何在网站发布的时候让访问的用户感受个性化推荐?)&lt;/p&gt;

&lt;p&gt;对于上述的几个问题，可以参考几个常见的解决方案&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;对于新用户可以先进行热门推荐或热门物品的随机推荐，对于新物品可以考虑基于内容的推荐思想计算与其它物品的相似度；&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;利用用户注册信息，如年龄，性别，地区等(结合简单分析物品的用户年龄、性别、地区的分布，建立相关表)，或者一开始让用户选一些自己感兴趣的tag，这样就可以进行粗粒度的个性化；&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;利用授权登陆获取到社交或其他信息，如淘宝跟新浪微博的相互打通；&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;系统冷启动时，可以引入专家(小编或运营人员等)建立起物品的相似表；&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;通常基于内容推荐通常是作为一个baseline，但是并不表示内容推荐就一定比基于领域的算法效果差，推荐系统实践一书举了个例子：如github的内容推荐就会相对比CF的要略好一点，因为用户的行为强烈的受到物品的某一属性影响，github浏览用户会受开源项目的作者影响，会关注这些知名作者的其他开源项目。&lt;/p&gt;

&lt;h3 id=&quot;tag&quot;&gt;基于标签tag的推荐&lt;/h3&gt;

&lt;p&gt;最基本的统计用户常用的tag，然后统计被tag次数最多的哪些物品，最后找那些很热且含有用户常用tag的物品进行推荐&lt;/p&gt;

&lt;p&gt;上面的问题：会给热门标签对于的热门物品很大的权重(用户常用的标签的热门物品)，因此会造成推荐热门物品，降低新颖性。&lt;/p&gt;

&lt;p&gt;改进1：类似的解决方法就是上面基于领域模型的惩罚热门标签(具体做法就是借鉴tf-idf思想记录常用标签被多少个其他用户使用过)跟热门物品&lt;/p&gt;

&lt;p&gt;改进2：数据稀疏性的问题(再别的模型一样都会遇到的问题)，把相似的tag聚类，例如某用户的tag是”推荐系统“，那么“个性化推荐”“协同过滤”tag应该也是用户会感兴趣的tag。放在别的算法可能就是对物品进行LDA聚类，抽象出来一类物品，稠密化数据。&lt;/p&gt;

&lt;p&gt;上面讲的推荐模型里面的数据都是最基本的例如用户，物品，评分/tag，光有这些数据能产生推荐，但是推荐结果的质量就不一定了，有些时候从业务上看会很离谱(例如假设通过协同过滤算法得到一件外套跟t恤很相似，但是在夏天的时候，某一个用户买过T恤，难道要他推荐外套？？)。所以除了上面讲的最基本的数据外，可以利用一些其他的信息来帮助改进推荐结果。这里统称为上下文信息(如时间，地点，情感心情等)&lt;/p&gt;

&lt;h3 id=&quot;user-cf&quot;&gt;基于时间上下文的user-cf算法&lt;/h3&gt;

&lt;p&gt;算法的场景，例如A用户1个月前喜欢苹果，2个月前喜欢香蕉，B用户1个月前喜欢苹果，3个月前喜欢香蕉，而C用户跟A用户一样，1个月前喜欢苹果，2个月前喜欢香蕉，如果不加时间上下文关系，A、B、C用户的兴趣是相等的，但是加入时间上下文，那么A跟C 就会 比 B跟C 更相似；同理基于时间上下文的item-cf算法，也是采用了类似原理场景。实际操作的时候就是，对相似度计算公式的分子上面加一个兴趣相似的时间衰减函数，突出最近行为。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;基于位置的推荐&lt;/h3&gt;

&lt;p&gt;给你推荐附近的酒店、餐馆等，移动时代这个显得更为重要，前段时间，百度公司出的春运，百度迁徙，火了互联网，就是因为掌握了用户的地理信息。再比如一个场景，淘宝的给用户推荐宝贝，是不是推荐也可以推荐一些离用户近的那些宝贝？还可以节省点路费，当然还需要其它因为，如成本，宝贝兴趣强弱关系等。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;利用社交网络数据&lt;/h3&gt;
&lt;p&gt;用户社交关系数据对推荐的重要性不言而喻，更甚都可以不用复杂的推荐算法，单纯看社交关系进行推荐。如最近火的不行的”天天系列“，腾讯下面的游戏，基于微信平台，利用社交关系把用户粘的紧紧的，天然的满足用户的需求，即时不是玩游戏的用户。&lt;/p&gt;

&lt;p&gt;社交数据的来源：电邮、用户注册(某个公司、某个学校、家乡等)、论坛/讨论组、即时聊天软件、社交网站等。&lt;/p&gt;

&lt;p&gt;算法方面也是多种多样，基于图的社交挖掘(图是社交关系表达的最好表达方式)、基领域+社交关系的推荐、基于社交关系的矩阵分解等。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/downtjs/p/3785320.html&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Git远程操作</title>
   <link href="http://winares.github.com/2014/02/16/git-operation-2"/>
   <updated>2014-02-16T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/02/16/git-operation-2</id>
   <content type="html">
&lt;p&gt;Git是目前最流行的版本管理系统，学会Git几乎成了开发者的必备技能。&lt;/p&gt;

&lt;p&gt;Git有很多优势，其中之一就是远程操作非常简便。本文详细介绍5个Git命令，它们的概念和用法，理解了这些内容，你就会完全掌握Git远程操作。&lt;/p&gt;

&lt;p&gt;git clone
git remote
git fetch
git pull
git push&lt;/p&gt;

&lt;p&gt;本文针对初级用户，从最简单的讲起，但是需要读者对Git的基本用法有所了解。同时，本文覆盖了上面5个命令的几乎所有的常用用法，所以对于熟练用户也有参考价值。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20140616-01.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;git-clone&quot;&gt;一、git clone&lt;/h3&gt;
&lt;p&gt;远程操作的第一步，通常是从远程主机克隆一个版本库，这时就要用到git clone命令。&lt;/p&gt;

&lt;p&gt;$ git clone &lt;版本库的网址&gt;
比如，克隆jQuery的版本库。&lt;/版本库的网址&gt;&lt;/p&gt;

&lt;p&gt;$ git clone https://github.com/jquery/jquery.git
该命令会在本地主机生成一个目录，与远程主机的版本库同名。如果要指定不同的目录名，可以将目录名作为git clone命令的第二个参数。&lt;/p&gt;

&lt;p&gt;$ git clone &lt;版本库的网址&gt; &lt;本地目录名&gt;
git clone支持多种协议，除了HTTP(s)以外，还支持SSH、Git、本地文件协议等，下面是一些例子。&lt;/本地目录名&gt;&lt;/版本库的网址&gt;&lt;/p&gt;

&lt;p&gt;$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git 
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
SSH协议还有另一种写法。&lt;/p&gt;

&lt;p&gt;$ git clone [user@]example.com:path/to/repo.git/
通常来说，Git协议下载速度最快，SSH协议用于需要用户认证的场合。各种协议优劣的详细讨论请参考&lt;a href=&quot;http://git-scm.com/book/en/Git-on-the-Server-The-Protocols&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;git-remote&quot;&gt;二、git remote&lt;/h3&gt;
&lt;p&gt;为了便于管理，Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候，git remote命令列出所有远程主机。&lt;/p&gt;

&lt;p&gt;$ git remote
origin
使用-v选项，可以参看远程主机的网址。&lt;/p&gt;

&lt;p&gt;$ git remote -v
origin  git@github.com:jquery/jquery.git (fetch)
origin  git@github.com:jquery/jquery.git (push)
上面命令表示，当前只有一台远程主机，叫做origin，以及它的网址。
克隆版本库的时候，所使用的远程主机自动被Git命名为origin。如果想用其他的主机名，需要用git clone命令的-o选项指定。&lt;/p&gt;

&lt;p&gt;$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
上面命令表示，克隆的时候，指定远程主机叫做jQuery。
git remote show命令加上主机名，可以查看该主机的详细信息。&lt;/p&gt;

&lt;p&gt;$ git remote show &lt;主机名&gt;
git remote add命令用于添加远程主机。&lt;/主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git remote add &lt;主机名&gt; &lt;网址&gt;
git remote rm命令用于删除远程主机。&lt;/网址&gt;&lt;/主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git remote rm &lt;主机名&gt;
git remote rename命令用于远程主机的改名。&lt;/主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git remote rename &lt;原主机名&gt; &lt;新主机名&gt;&lt;/新主机名&gt;&lt;/原主机名&gt;&lt;/p&gt;

&lt;h3 id=&quot;git-fetch&quot;&gt;三、git fetch&lt;/h3&gt;
&lt;p&gt;一旦远程主机的版本库有了更新（Git术语叫做commit），需要将这些更新取回本地，这时就要用到git fetch命令。&lt;/p&gt;

&lt;p&gt;$ git fetch &lt;远程主机名&gt;
上面命令将某个远程主机的更新，全部取回本地。
默认情况下，git fetch取回所有分支（branch）的更新。如果只想取回特定分支的更新，可以指定分支名。&lt;/远程主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git fetch &lt;远程主机名&gt; &lt;分支名&gt;
比如，取回origin主机的master分支。&lt;/分支名&gt;&lt;/远程主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git fetch origin master
所取回的更新，在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master，就要用origin/master读取。
git branch命令的-r选项，可以用来查看远程分支，-a选项查看所有分支。&lt;/p&gt;

&lt;p&gt;$ git branch -r
origin/master&lt;/p&gt;

&lt;p&gt;$ git branch -a
* master
  remotes/origin/master
上面命令表示，本地主机的当前分支是master，远程分支是origin/master。
取回远程主机的更新以后，可以在它的基础上，使用git checkout命令创建一个新的分支。&lt;/p&gt;

&lt;p&gt;$ git checkout -b newBrach origin/master
上面命令表示，在origin/master的基础上，创建一个新分支。
此外，也可以使用git merge命令或者git rebase命令，在本地分支上合并远程分支。&lt;/p&gt;

&lt;p&gt;$ git merge origin/master
# 或者
$ git rebase origin/master
上面命令表示在当前分支上，合并origin/master。&lt;/p&gt;

&lt;h3 id=&quot;git-pull&quot;&gt;四、git pull&lt;/h3&gt;
&lt;p&gt;git pull命令的作用是，取回远程主机某个分支的更新，再与本地的指定分支合并。它的完整格式稍稍有点复杂。&lt;/p&gt;

&lt;p&gt;$ git pull &lt;远程主机名&gt; &lt;远程分支名&gt;:&lt;本地分支名&gt;
比如，取回origin主机的next分支，与本地的master分支合并，需要写成下面这样。&lt;/本地分支名&gt;&lt;/远程分支名&gt;&lt;/远程主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git pull origin next:master
如果远程分支是与当前分支合并，则冒号后面的部分可以省略。&lt;/p&gt;

&lt;p&gt;$ git pull origin next
上面命令表示，取回origin/next分支，再与当前分支合并。实质上，这等同于先做git fetch，再做git merge。&lt;/p&gt;

&lt;p&gt;$ git fetch origin
$ git merge origin/next
在某些场合，Git会自动在本地分支与远程分支之间，建立一种追踪关系（tracking）。比如，在git clone的时候，所有本地分支默认与远程主机的同名分支，建立追踪关系，也就是说，本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。&lt;/p&gt;

&lt;p&gt;git branch –set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系，git pull就可以省略远程分支名。&lt;/p&gt;

&lt;p&gt;$ git pull origin
上面命令表示，本地的当前分支自动与对应的origin主机”追踪分支”（remote-tracking branch）进行合并。
如果当前分支只有一个追踪分支，连远程主机名都可以省略。&lt;/p&gt;

&lt;p&gt;$ git pull
上面命令表示，当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式，可以使用–rebase选项。&lt;/p&gt;

&lt;p&gt;$ git pull –rebase &lt;远程主机名&gt; &lt;远程分支名&gt;:&lt;本地分支名&gt;&lt;/本地分支名&gt;&lt;/远程分支名&gt;&lt;/远程主机名&gt;&lt;/p&gt;

&lt;h3 id=&quot;git-push&quot;&gt;五、git push&lt;/h3&gt;
&lt;p&gt;git push命令用于将本地分支的更新，推送到远程主机。它的格式与git pull命令相仿。&lt;/p&gt;

&lt;p&gt;$ git push &lt;远程主机名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;
注意，分支推送顺序的写法是&lt;来源地&gt;:&lt;目的地&gt;，所以git pull是&lt;远程分支&gt;:&lt;本地分支&gt;，而git push是&lt;本地分支&gt;:&lt;远程分支&gt;。
如果省略远程分支名，则表示将本地分支推送与之存在&quot;追踪关系&quot;的远程分支（通常两者同名），如果该远程分支不存在，则会被新建。&lt;/远程分支&gt;&lt;/本地分支&gt;&lt;/本地分支&gt;&lt;/远程分支&gt;&lt;/目的地&gt;&lt;/来源地&gt;&lt;/远程分支名&gt;&lt;/本地分支名&gt;&lt;/远程主机名&gt;&lt;/p&gt;

&lt;p&gt;$ git push origin master
上面命令表示，将本地的master分支推送到origin主机的master分支。如果后者不存在，则会被新建。
如果省略本地分支名，则表示删除指定的远程分支，因为这等同于推送一个空的本地分支到远程分支。&lt;/p&gt;

&lt;p&gt;$ git push origin :master
# 等同于
$ git push origin –delete master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系，则本地分支和远程分支都可以省略。&lt;/p&gt;

&lt;p&gt;$ git push origin
上面命令表示，将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支，那么主机名都可以省略。&lt;/p&gt;

&lt;p&gt;$ git push
如果当前分支与多个主机存在追踪关系，则可以使用-u选项指定一个默认主机，这样后面就可以不加任何参数使用git push。&lt;/p&gt;

&lt;p&gt;$ git push -u origin master
上面命令将本地的master分支推送到origin主机，同时指定origin为默认主机，后面就可以不加任何参数使用git push了。
不带任何参数的git push，默认只推送当前分支，这叫做simple方式。此外，还有一种matching方式，会推送所有有对应的远程分支的本地分支。Git 2.0版本之前，默认采用matching方法，现在改为默认采用simple方式。如果要修改这个设置，可以采用git config命令。&lt;/p&gt;

&lt;p&gt;$ git config –global push.default matching
# 或者
$ git config –global push.default simple
还有一种情况，就是不管是否存在对应的远程分支，将本地的所有分支都推送到远程主机，这时需要使用–all选项。&lt;/p&gt;

&lt;p&gt;$ git push –all origin
上面命令表示，将所有本地分支都推送到origin主机。
如果远程主机的版本比本地版本更新，推送时Git会报错，要求先在本地做git pull合并差异，然后再推送到远程主机。这时，如果你一定要推送，可以使用–force选项。&lt;/p&gt;

&lt;p&gt;$ git push –force origin 
上面命令使用–force选项，结果导致在远程主机产生一个”非直进式”的合并（non-fast-forward merge）。除非你很确定要这样做，否则应该尽量避免使用–force选项。
最后，git push不会推送标签（tag），除非使用–tags选项。&lt;/p&gt;

&lt;p&gt;$ git push origin –tags&lt;/p&gt;

&lt;p&gt;本文来自&lt;a href=&quot;http://www.ruanyifeng.com/blog/2014/06/git_remote.html&quot;&gt;网络&lt;/a&gt;。&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>如何选择机器学习算法</title>
   <link href="http://winares.github.com/2014/01/17/choosing-a-machine-learning-classifier"/>
   <updated>2014-01-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2014/01/17/choosing-a-machine-learning-classifier</id>
   <content type="html">
&lt;p&gt;译自&lt;a href=&quot;http://blog.echen.me/2011/04/27/choosing-a-machine-learning-classifier/）&quot;&gt;Edwin Chen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do you know what machine learning algorithm to choose for your classification problem? Of course, if you really care about accuracy, your best bet is to test out a couple different ones (making sure to try different parameters within each algorithm as well), and select the best one by cross-validation. But if you’re simply looking for a “good enough” algorithm for your problem, or a place to start, here are some general guidelines I’ve found to work well over the years.&lt;/p&gt;

&lt;p&gt;如何针对某个分类问题决定使用何种机器学习算法？ 当然，如果你真心在乎准确率，最好的途径就是测试一大堆各式各样的算法（同时确保在每个算法上也测试不同的参数），最后选择在交叉验证中表现最好的。倘若你只是想针对你的问题寻找一个“足够好”的算法，或者一个起步点，这里给出了一些我觉得这些年用着还不错的常规指南。&lt;/p&gt;

&lt;h3 id=&quot;how-large-is-your-training-set&quot;&gt;How large is your training set?&lt;/h3&gt;

&lt;h3 id=&quot;section&quot;&gt;训练集有多大？&lt;/h3&gt;

&lt;p&gt;If your training set is small, high bias/low variance classifiers (e.g., Naive Bayes) have an advantage over low bias/high variance classifiers (e.g., kNN), since the latter will overfit. But low bias/high variance classifiers start to win out as your training set grows (they have lower asymptotic error), since high bias classifiers aren’t powerful enough to provide accurate models.&lt;/p&gt;

&lt;p&gt;如果是小训练集，高偏差/低方差的分类器（比如朴素贝叶斯）要比低偏差/高方差的分类器（比如k最近邻）具有优势，因为后者容易过拟合。然而随着训练集的增大，低偏差/高方差的分类器将开始具有优势（它们拥有更低的渐近误差），因为高偏差分类器对于提供准确模型不那么给力。&lt;/p&gt;

&lt;p&gt;You can also think of this as a generative model vs. discriminative model distinction.&lt;/p&gt;

&lt;p&gt;你也可以把这一点看作生成模型和判别模型的差别。&lt;/p&gt;

&lt;h3 id=&quot;advantages-of-some-particular-algorithms&quot;&gt;Advantages of some particular algorithms&lt;/h3&gt;

&lt;h3 id=&quot;section-1&quot;&gt;一些常用算法的优缺点&lt;/h3&gt;

&lt;p&gt;Advantages of Naive Bayes: Super simple, you’re just doing a bunch of counts. If the NB conditional independence assumption actually holds, a Naive Bayes classifier will converge quicker than discriminative models like logistic regression, so you need less training data. And even if the NB assumption doesn’t hold, a NB classifier still often does a great job in practice. A good bet if want something fast and easy that performs pretty well. Its main disadvantage is that it can’t learn interactions between features (e.g., it can’t learn that although you love movies with Brad Pitt and Tom Cruise, you hate movies where they’re together).&lt;/p&gt;

&lt;p&gt;朴素贝叶斯: 巨尼玛简单，你只要做些算术就好了。倘若条件独立性假设确实满足，朴素贝叶斯分类器将会比判别模型，譬如逻辑回归收敛得更快，因此你只需要更少的训练数据。就算该假设不成立，朴素贝叶斯分类器在实践中仍然有着不俗的表现。如果你需要的是快速简单并且表现出色，这将是个不错的选择。其主要缺点是它学习不了特征间的交互关系（比方说，它学习不了你虽然喜欢甄子丹和姜文的电影，却讨厌他们共同出演的电影《关云长》的情况）。&lt;/p&gt;

&lt;p&gt;Advantages of Logistic Regression: Lots of ways to regularize your model, and you don’t have to worry as much about your features being correlated, like you do in Naive Bayes. You also have a nice probabilistic interpretation, unlike decision trees or SVMs, and you can easily update your model to take in new data (using an online gradient descent method), again unlike decision trees or SVMs. Use it if you want a probabilistic framework (e.g., to easily adjust classification thresholds, to say when you’re unsure, or to get confidence intervals) or if you expect to receive more training data in the future that you want to be able to quickly incorporate into your model.&lt;/p&gt;

&lt;p&gt;逻辑回归: 有很多正则化模型的方法，而且你不必像在用朴素贝叶斯那样担心你的特征是否相关。与决策树与支持向量机相比，你还会得到一个不错的概率解释，你甚至可以轻松地利用新数据来更新模型（使用在线梯度下降算法）。如果你需要一个概率架构（比如简单地调节分类阈值，指明不确定性，或者是要得得置信区间），或者你以后想将更多的训练数据快速整合到模型中去，使用它吧。&lt;/p&gt;

&lt;p&gt;Advantages of Decision Trees: Easy to interpret and explain (for some people – I’m not sure I fall into this camp). They easily handle feature interactions and they’re non-parametric, so you don’t have to worry about outliers or whether the data is linearly separable (e.g., decision trees easily take care of cases where you have class A at the low end of some feature x, class B in the mid-range of feature x, and A again at the high end). One disadvantage is that they don’t support online learning, so you have to rebuild your tree when new examples come on. Another disadvantage is that they easily overfit, but that’s where ensemble methods like random forests (or boosted trees) come in. Plus, random forests are often the winner for lots of problems in classification (usually slightly ahead of SVMs, I believe), they’re fast and scalable, and you don’t have to worry about tuning a bunch of parameters like you do with SVMs, so they seem to be quite popular these days.&lt;/p&gt;

&lt;p&gt;决策树: 易于解释说明（对于某些人来说 —— 我不确定我是否在这其中）。它可以毫无压力地处理特征间的交互关系并且是非参数化的，因此你不必担心异常值或者数据是否线性可分（举个例子，决策树能轻松处理好类别A在某个特征维度x的末端，类别B在中间，然后类别A又出现在特征维度x前端的情况）。它的一个缺点就是不支持在线学习，于是在新样本到来后，决策树需要全部重建。另一个缺点是容易过拟合，但这也就是诸如随机森林（或提升树）之类的集成方法的切入点。另外，随机森林经常是很多分类问题的赢家（通常比支持向量机好上那么一点，我认为），它快速并且可调，同时你无须担心要像支持向量机那样调一大堆参数，所以最近它貌似相当受欢迎。&lt;/p&gt;

&lt;p&gt;Advantages of SVMs: High accuracy, nice theoretical guarantees regarding overfitting, and with an appropriate kernel they can work well even if you’re data isn’t linearly separable in the base feature space. Especially popular in text classification problems where very high-dimensional spaces are the norm. Memory-intensive, hard to interpret, and kind of annoying to run and tune, though, so I think random forests are starting to steal the crown.&lt;/p&gt;

&lt;p&gt;支持向量机: 高准确率，为避免过拟合提供了很好的理论保证，而且就算数据在原特征空间线性不可分，只要给个合适的核函数，它就能运行得很好。在动辄超高维的文本分类问题中特别受欢迎。可惜内存消耗大，难以解释，运行和调参也有些烦人，所以我认为随机森林要开始取而代之了。&lt;/p&gt;

&lt;h3 id=&quot;but&quot;&gt;But…&lt;/h3&gt;

&lt;h3 id=&quot;section-2&quot;&gt;然而。。。&lt;/h3&gt;

&lt;p&gt;Recall, though, that better data often beats better algorithms, and designing good features goes a long way. And if you have a huge dataset, then whichever classification algorithm you use might not matter so much in terms of classification performance (so choose your algorithm based on speed or ease of use instead).&lt;/p&gt;

&lt;p&gt;尽管如此，回想一下，好的数据却要优于好的算法，设计优良特征是大有裨益的。假如你有一个超大数据集，那么无论你使用哪种算法可能对分类性能都没太大影响（此时就根据速度和易用性来进行抉择）。&lt;/p&gt;

&lt;p&gt;And to reiterate what I said above, if you really care about accuracy, you should definitely try a bunch of different classifiers and select the best one by cross-validation. Or, to take a lesson from the Netflix Prize (and Middle Earth), just use an ensemble method to choose them all.&lt;/p&gt;

&lt;p&gt;再重申一次我上面说过的话，倘若你真心在乎准确率，你一定得尝试多种多样的分类器，并且通过交叉验证选择最优。要么就从Netflix Prize（和Middle Earth）取点经，用集成方法把它们合而用之，妥妥的。&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>推荐系统中所使用的混合技术介绍</title>
   <link href="http://winares.github.com/2013/12/02/ensemble-recommendation"/>
   <updated>2013-12-02T00:00:00+00:00</updated>
   <id>http://winares.github.com/2013/12/02/ensemble-recommendation</id>
   <content type="html">
&lt;p&gt;在推荐系统实际运用中，各种混合技术是其中一项极为重要的核心技术。在工程实践中我们发现，混合技术对提升推荐效果、改进推荐系统的性能等都有重要意义，因此本文对该专题进行如下的一些总结和介绍。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;引言&lt;/h3&gt;

&lt;p&gt;在这个信息爆炸的时代，消费者面临众多选择、未知的领域、过载的信息时，往往无所适从；然而与此同时，内容的生产者（例如商家）也在苦苦寻觅合适的用户，寻找最便捷的渠道，而解决这两类矛盾的最好工具就是推荐系统。&lt;/p&gt;

&lt;p&gt;推荐系统缘起于搜索系统，在底层系统上两者有大量相通的技术，但是在相应用户需求和产生应用的场景上，推荐系统离用户更进一步：当用户的需求具体而明确时，他搜索；但当用户需求不明确或难以表达时，他需要推荐。另一方面，当用户需要找某个领域下公认的、热门的内容时，他搜索；但当用户需要找个性化的内容时，他需要推荐。很多场景下，用户的个性化需求是很难转化为简短明确的查询词的，例如“今天中午想找个附近的、符合我口味的、消费不贵的餐馆”这样的需求，非常常见但很难用查询词来表达清楚。推荐系统恰好可以填补这个空白，根据挖掘用户历史行为来将个性化的需求深入挖掘清楚，实现用武之地。&lt;/p&gt;

&lt;p&gt;目前在电商、视频、文学、社交网络等等各类网站或应用中，推荐系统都开始扮演起一个越来越重要的角色。但是无论应用于什么系统，归根结底最关键的是必须保证高质量的推荐效果。&lt;/p&gt;

&lt;p&gt;撇开产品、交互设计、基础数据等方面，如果从系统和算法的角度来看，混合推荐的思路是其中最为重要的部分。毫不夸张的说，在真实世界的应用中，无论产品规模的大或小、用户的多与少，只要是想要追求推荐效果的高水准，那么混合推荐一定是必不可少的一门绝技。原因为何？——下面来作个解释&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;为什么要有混合技术&lt;/h3&gt;

&lt;p&gt;推荐技术发展至今已经历了十余年，这期间众多的算法被提出并在业界运用，经过大量的实践，人们发现似乎没有任何一个方法可以独领风骚、包打天下，每种推荐方法都有其局限性，下面举些典型的例子说明：&lt;/p&gt;

&lt;p&gt;基于物品的协同过滤（Item-based Collaborative Filtering）是推荐系统中知名度最高的方法，由亚马逊（Amazon）公司最早提出并在电商行业内被广泛使用。但基于物品的协同过滤在面对物品冷启动，以及数据稀疏的情况下效果急剧下降。同时基于物品的协同过滤倾向于推荐用户购买过商品的类似商品，往往会出现多样性不足、推荐惊喜度低的问题。&lt;/p&gt;

&lt;p&gt;基于用户的协同过滤（User-based Collaborative Filtering）方法在推荐结果的新颖性方面有一定的优势，但是推荐结果的相关性较弱，且容易受潮流影响而倾向于推荐出大众性物品。同时新用户或低活跃用户也会遇到冷启动（Cold-Start）的棘手问题。&lt;/p&gt;

&lt;p&gt;在多个推荐算法竞赛中，我们发现隐语义与矩阵分解模型（Latent Factor Model）及其各种改进升级方法（包括SVD++等）是推荐精度最好的单一模型方法，但当数据规模大时其运算性能会明显降低，同时基于MF的方法依赖全局进行计算信息，因而很难作增量更新，导致实际工程中会遇到不少困难。另外，隐语义模型还存在调整困难、可解释性差等问题。&lt;/p&gt;

&lt;p&gt;基于内容的推荐算法（Content-based Recommendation）是最直观的推荐算法，这种方法实现简单，不存在冷启动问题，应对的场景丰富，属于“万金油”型打法。但在一些算法公开评测中，基于内容的方法效果都是垫底的之一。同时该算法依赖内容的描述程度，往往受限于对文本、图像或音视频内容进行分析的深度。&lt;/p&gt;

&lt;p&gt;基于统计思想的一些方法，例如Slope One，关联规则(Association Rules)，或者分类热门推荐等，计算速度快，但是对用户个性化偏好的描述能力弱，实际应用时也存在各种各样的问题，在此不多赘述。&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;怎样混合是个问题&lt;/h3&gt;

&lt;p&gt;解决各种推荐方法“硬伤”的一条最好的解决途径就是混合技术——它的思路非常明确，俗称“三个臭皮匠顶个诸葛亮”——即综合运用各种方法的优势、扬长避短，组合起来成为一个效果强大的系统。&lt;/p&gt;

&lt;p&gt;道理虽然简单，但是怎样组合才能真正发挥威力？联想到一个有趣的电影片段：周星驰的喜剧电影《国产零零漆》中，神志不清的特工达文西“发明”了一个“要你命3000”的武器，这个“超级武器霸王”把一堆街头武器——“西瓜刀、铁链、火药、硫酸、毒药、手枪、手榴弹、杀虫剂”——用绳子绑在一起，但是完全没有作用，被对手一枪击毙。&lt;/p&gt;

&lt;p&gt;在实际应用中，从系统、算法、结果、处理流程等不同的角度，都有一些具体的混合策略。下面依次从不同的角度来进行介绍。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;多段组合混合推荐框架&lt;/h3&gt;

&lt;p&gt;推荐系统一方面要处理海量的用户、物品的数据，一方面要实时相应线上用户的请求，迅速的生成结果并返回。在这里存在一个矛盾是，离线数据挖掘（例如常见的Hadoop系统）虽然擅长处理大量数据，但运算周期长（小时级或天级）、实时推荐能力差，而在线系统由于要迅速（例如几十毫秒）计算出推荐结果，无法承担过于消耗资源的算法。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-12-2-01.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;图1：Netflix的Online-Nearline-Offline混合推荐系统&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;在业界实际部署时，解决此类常见问题的流行方法是采用三段式混合系统：即Online-Nearline-Offline Recommendation（在线-近线-离线）三层混合机制。曾经举办过著名的国际推荐竞赛的Netflix公司，在所公开的后台推荐系统架构中，即采用了该混合系统（如图1）。&lt;/p&gt;

&lt;p&gt;其中Online系统直接面向用户，是一个高性能和高可用性的推荐服务，在这里通常会设计有缓存（Cache）系统，来处理热门的请求（Query）重复计算的问题。而当Cache不命中的情况下，Online推荐运行一个运算简单可靠的算法，及时生成结果。Online系统后是Nearline系统，这个系统部署在服务端，一方面会接收Online系统发过来的请求，将Online计算的一些缓存结果，采用更复杂的算法重新计算并更新后更新缓存。另一方面Nearline是衔接Online和Offline系统的桥梁，因为Offline结果往往会挖掘长期的、海量的用户行为日志，消耗的资源大、挖掘周期长，但是Offline推荐系统计算所得的结果质量往往是最高的，这些结果会通过Nearline系统输送到线上，发挥作用。&lt;/p&gt;

&lt;p&gt;另外一个不可忽视的问题是用户反馈的及时收集，并及时用于调整推荐结果。挖掘用户的反馈对调整推荐结果有莫大的帮助，但这个调整往往越及时越好，否则用户很容易对结果不满意而流失。这个点击挖掘和反馈的功能往往由Nearline推荐系统来承担，因为该系统收集前端反馈比较方便，又可以保证适当的处理时长。&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;加权型混合推荐技术&lt;/h3&gt;

&lt;p&gt;上面介绍了从系统架构的角度如何进行混合。而从算法的角度来看，则最常用的是采用加权型的混合推荐技术，即将来自不同推荐算法生成的候选结果及结果的分数，进一步进行组合（Ensemble）加权，生成最终的推荐排序结果。&lt;/p&gt;

&lt;p&gt;具体来看，比较原始的加权型的方法是根据推荐效果，固定赋予各个子算法输出结果的权重，然后得到最终结果。很显然这种方法无法灵活处理不同的上下文场景，因为不同的算法的结果，可能在不同的场景下质量有高有低，固定加权系统无法各取所长。所以更好的思路是设置训练样本，然后比较用户对推荐结果的评价、与系统的预测是否相符，根据训练得到的结果生成加权的模型，动态的调整权重。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-12-2-02.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;图2：加权混合技术能明显提高推荐精度&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;加权混合的模型有很多，除了简单的线性模型外，常用的有回归模型（Logistic Regression）、RBM（Restricted Boltzmann Machines）、GBDT（Gradient Boosted Decision Trees），这三种混合模型在推荐算法竞赛中大放异彩，在2009年结束的Netflix百万美元推荐竞赛中，优胜队伍将充分运用和多种加权混合模型的优势，组合后的算法推荐精度非常高。获胜队的Yehuda Koren在论文The BellKor Solution to the Netflix Grand Prize中对此有非常详细的介绍。另外值得一提的是台湾大学推荐团队，他们通过混合甚至二次混合的方式（如图2），将众多单独推荐算法的结果进行最合理的加权组合，在最近几届的KDD Cup数据挖掘竞赛中所向披靡，经常取得极为优异的推荐效果。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;分级型混合推荐技术&lt;/h3&gt;

&lt;p&gt;尽管上述加权组合型混合推荐技术有非常高的精度，但系统复杂度和运算负载都较高。在工业界实际系统中，往往采用一些相对简单的方案，其中分级型混合推荐技术就是一类思想简单但效果也不错的方法。这种混合推荐技术根据不同的推荐场景，将不同的推荐算法按照效果优劣进行层次性划分。在对应的推荐场景下，优先采用高可信度的推荐算法生成的结果，然后依次采用后续方法生成结果。&lt;/p&gt;

&lt;p&gt;在各种推荐场景中，Top-N推荐是最为常见的一类。这种推荐应用有时需要展示较多的推荐结果，而此时一种推荐算法的结果往往不够丰富，通常会采用分级型的混合技术，通过事先的数据挖掘，优先将推荐精度高的算法结果先列出，然后用依次用其他方法的结果递补。不同的推荐算法往往在精度（Precision）和召回（Recall）之间有所折衷，因此优先列出高精度结果，长尾部分则采用高召回的结果进行补足，能兼顾对推荐结果数量和质量的两种需求。&lt;/p&gt;

&lt;h3 id=&quot;section-6&quot;&gt;交叉调和技术&lt;/h3&gt;

&lt;p&gt;交叉调和技术有些类似西方酿造威士忌（Whisky）酒的过程——将纯麦威士忌、谷物威士忌、或者不同产地、口味的陈酿进行一定比例的调配后最终成品。交叉调和推荐技术（Blending Recommendation）的主要动机是保证最终推荐结果的多样性。因为不同用户对同一件物品的着眼点往往各不相同，而不同的推荐算法，生成的结果往往代表了一类不同的观察角度所生成的结果，交叉调和技术将不同推荐算法的生成结果，按照一定的配比组合在一起，打包后集中呈现给用户。&lt;/p&gt;

&lt;p&gt;交叉调和技术需要注意的问题是结果组合时的冲突解决问题，通常会设置一些额外的约束条件来处理结果的组合展示问题。另外我们发现为了让用户更多的注意到结果的多样性，对不同类型的推荐结果辅以展示不同的推荐理由，往往能获得更多收益。&lt;/p&gt;

&lt;h3 id=&quot;section-7&quot;&gt;瀑布型混合方法&lt;/h3&gt;

&lt;p&gt;瀑布型（Waterfall Model）的混合方法采用了过滤（Filtering）的设计思想，将不同的推荐算法视为不同粒度的过滤器，尤其是面对待推荐对象（Item）和所需的推荐结果数量相差极为悬殊时，往往非常适用。&lt;/p&gt;

&lt;p&gt;在瀑布型混合技术中，前一个推荐方法过滤的结果，将输出给后一个推荐方法，层层递进，候选结果在此过程中会被逐步遴选，最终得到一个高精确的结果。设计瀑布型混合系统中，通常会将运算速度快、区分度低的算法排在前列，逐步过渡为重量级的算法，这样的优点是充分运用不同算法的区分度，让宝贵的运算资源集中在少量较高候选结果的运算上。&lt;/p&gt;

&lt;p&gt;推荐基础特征混合技术&lt;/p&gt;

&lt;p&gt;数据是推荐系统的基础，一个完善的推荐系统，其数据来源也是多种多样的。从这些数据来源中我们可以抽取出不同的基础特征。以用户兴趣模型为例，我们既可以从用户的实际购买行为中，挖掘出用户的“显式”兴趣，又可以用用户的点击行为中，挖掘用户“隐式”兴趣；另外从用户分类、人口统计学分析中，也可以计算出用户兴趣；如果有用户的社交网络，那么也可以了解周围用户对该用户兴趣的投射，等等。另一方面，从物品（Item）的角度来看，也可以挖掘出不同的特征。&lt;/p&gt;

&lt;p&gt;不同的基础特征可以预先进行组合或合并，为后续的推荐算法所使用。这样处理的优点是将推荐算法切分得比较清楚，这样将一个整体的推荐问题，分解为特征的抽取、组合、使用等各个环节的优化问题，在进行个性化推荐时较为适用。&lt;/p&gt;

&lt;h3 id=&quot;section-8&quot;&gt;推荐模型混合技术&lt;/h3&gt;

&lt;p&gt;和特征合并的技术不同，多模型的合并技术在模型计算阶段，将整个模型作为第二种算法的输入。这种组合方式，事实上形成了一种新的独立的推荐模型。例如在进行基于用户的协同过滤计算的时候，在计算相邻用户的距离的基础上，可以进一步根据用户的属性内容（Content）信息、采用基于内容的推荐的思想，进一步生成相似用户的候选结果；或者利用用户的社交网络信息（Social Network）来扩展相邻用户集合。这种在算法设计阶段而不是特征利用或推荐结果合并阶段的混合技术，被成为推荐模型混合技术。&lt;/p&gt;

&lt;p&gt;这种技术往往适用于数据稀疏或质量较差时，单个推荐模型结果都比较差的情况。此时对多个较差的模型的最终结果进行合并无法获得满意的结果（因为候选结果都比较差），因此提前在模型计算阶段进行算法思路的合并，这样能提前召回好的结果，提升推荐效果。&lt;/p&gt;

&lt;p&gt;整体式混合推荐框架&lt;/p&gt;

&lt;p&gt;除了上述的系统架构、特征、算法、推荐结果等等角度的推荐融合技术，还有很多的内容是没有包括的，例如从商业逻辑的角度来分析，商家往往有一些特定的推荐需求或者推荐规则，需要对算法生成的结果进行调整。亦或者从交互设计的角度来看，推荐结果的展示方式等都有所不同；一些特殊的应用场景可能需要强调地域、时间等信息，对应的推荐挖掘方法和展现都有特殊的要求，这个时候对结果的混合往往要从整个产品的角度来进行设计和处理，从而能够满足不同的需要，这些可以被纳入整体式的混合推荐框架中考虑。&lt;/p&gt;

&lt;h3 id=&quot;section-9&quot;&gt;讨论和小结&lt;/h3&gt;

&lt;p&gt;推荐效果是一个推荐系统是否能获得成功的生命线，而混合推荐技术是其中最为重要的一个环节。在各种实际应用中，广大的研发工程师在处理很多问题时，往往都从直觉出发在不同程度的使用各种混合推荐技术，也解决了很多实际问题，取得了很好的效果。本文从理论角度对此进行了梳理，希望能帮助大家提升对推荐系统的领悟和理解。心中装着进行混合的意念，并理论联系实际，对开发一个成功的推荐系统会有莫大的帮助。&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Markdown语法示例</title>
   <link href="http://winares.github.com/2013/11/21/markdown-grammer-examples"/>
   <updated>2013-11-21T00:00:00+00:00</updated>
   <id>http://winares.github.com/2013/11/21/markdown-grammer-examples</id>
   <content type="html">
&lt;p&gt;在搭建好blog之后，下一步就是写博文了，而要想方便的进行博客写作，那么Markdown是必不可少的工具。本文将通过一些简单的例子来说明Markdown的用法。&lt;/p&gt;

&lt;p&gt;Markdown是一种轻量级标记语言，创始人为约翰·格鲁伯（John Gruber）和亚伦·斯沃茨（Aaron Swartz）。
它允许人们“使用易读易写的纯文本格式编写文档，然后转换成有效的XHTML(或者HTML)文档”。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;宗旨&lt;/h3&gt;

&lt;p&gt;Markdown 的目标是实现「易读易写」。&lt;/p&gt;

&lt;p&gt;可读性，无论如何，都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布，并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响，包括 Setext、atx、Textile、reStructuredText、Grutatext 和 EtText，而最大灵感来源其实是纯文本电子邮件的格式。&lt;/p&gt;

&lt;p&gt;总之， Markdown 的语法全由一些符号所组成，这些符号经过精挑细选，其作用一目了然。比如：在文字两旁加上星号，看起来就像&lt;em&gt;强调&lt;/em&gt;。Markdown 的列表看起来，嗯，就是列表。Markdown 的区块引用看起来就真的像是引用一段文字，就像你曾在电子邮件中见过的那样。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;标题&lt;/h3&gt;
&lt;p&gt;Markdown提供了两种方式（Setext和Atx）来显示标题。&lt;/p&gt;

&lt;h4 id=&quot;section-2&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;Setext方式
标题1
=================

标题2
-----------------

Atx方式
# 标题1
## 标题2
###### 标题6
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-3&quot;&gt;效果：&lt;/h4&gt;
&lt;p&gt;Setext方式 &lt;br /&gt;
标题1
=================&lt;/p&gt;

&lt;h2 id=&quot;section-4&quot;&gt;标题2&lt;/h2&gt;

&lt;p&gt;Atx方式 &lt;br /&gt;
# 标题1
## 标题2
###### 标题6&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-5&quot;&gt;换行&lt;/h3&gt;
&lt;p&gt;在文字的末尾使用两个或两个以上的空格来表示换行。&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-6&quot;&gt;引用&lt;/h3&gt;
&lt;p&gt;行首使用&lt;code&gt;&amp;gt;&lt;/code&gt;加上一个空格表示引用段落，内部可以嵌套多个引用。 &lt;/p&gt;

&lt;h4 id=&quot;section-7&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; 这是一个引用，
&amp;gt; 这里木有换行，   
&amp;gt; 在这里换行了。
&amp;gt; &amp;gt; 内部嵌套
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-8&quot;&gt;效果：&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;这是一个引用，
这里木有换行， &lt;br /&gt;
在这里换行了。
&amp;gt; 内部嵌套&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-9&quot;&gt;列表&lt;/h3&gt;
&lt;p&gt;__无序列表__使用&lt;code&gt;*&lt;/code&gt;、&lt;code&gt;+&lt;/code&gt;或&lt;code&gt;-&lt;/code&gt;后面加上空格来表示。  &lt;/p&gt;

&lt;h4 id=&quot;section-10&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;* Item 1
* Item 2
* Item 3

+ Item 1
+ Item 2
+ Item 3

- Item 1
- Item 2
- Item 3
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-11&quot;&gt;效果：&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Item 1&lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Item 3&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Item 1&lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Item 3&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Item 1  &lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;__有序列表__使用数字加英文句号加空格表示。 &lt;/p&gt;

&lt;h4 id=&quot;section-12&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;1. Item 1
2. Item 2
3. Item 3
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-13&quot;&gt;效果：&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Item 1&lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;Item 3&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-14&quot;&gt;代码区域&lt;/h3&gt;
&lt;p&gt;__行内代码__使用&lt;strong&gt;反斜杠&lt;/strong&gt;&lt;code&gt;`&lt;/code&gt;表示。 &lt;br /&gt;
__代码段落__则是在每行文字前加4个空格或者1个缩进符表示。&lt;/p&gt;

&lt;h4 id=&quot;section-15&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;Bash中可以使用echo来进行输出。
	$ echo &#39;Something&#39;
	$ echo -e &#39;\tSomething\n&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-16&quot;&gt;效果：&lt;/h4&gt;

&lt;p&gt;Bash中可以使用echo来进行输出。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo &#39;Something&#39;
$ echo -e &#39;\tSomething\n&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-17&quot;&gt;强调&lt;/h3&gt;
&lt;p&gt;Markdown使用&lt;code&gt;\*&lt;/code&gt;或&lt;code&gt;\_&lt;/code&gt;表示强调。&lt;/p&gt;

&lt;h4 id=&quot;section-18&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;单星号 = *斜体*
单下划线 = _斜体_
双星号 = **加粗**
双下划线 = __加粗__
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-19&quot;&gt;效果：&lt;/h4&gt;
&lt;p&gt;单星号 = &lt;em&gt;斜体&lt;/em&gt;&lt;br /&gt;
单下划线 = &lt;em&gt;斜体&lt;/em&gt;&lt;br /&gt;
双星号 = &lt;strong&gt;加粗&lt;/strong&gt;&lt;br /&gt;
双下划线 = &lt;strong&gt;加粗&lt;/strong&gt;  &lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-20&quot;&gt;链接&lt;/h3&gt;
&lt;p&gt;Markdown支持两种风格的链接：&lt;em&gt;Inline&lt;/em&gt;和&lt;em&gt;Reference&lt;/em&gt;。 &lt;/p&gt;

&lt;h4 id=&quot;section-21&quot;&gt;语法：&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Inline&lt;/em&gt;：以中括号标记显示的链接文本，后面紧跟用小括号包围的链接。如果链接有title属性，则在链接中使用&lt;strong&gt;空格&lt;/strong&gt;加&lt;strong&gt;“title属性”&lt;/strong&gt;。&lt;br /&gt;
&lt;em&gt;Reference&lt;/em&gt;：一般应用于多个不同位置使用相同链接。通常分为两个部分，调用部分为&lt;code&gt;[链接文本][ref]&lt;/code&gt;；定义部分可以出现在文本中的其他位置，格式为&lt;code&gt;[ref]: http://some/link/address (可选的标题)&lt;/code&gt;。 &lt;br /&gt;
&lt;em&gt;注：ref中不区分大小写。&lt;/em&gt;   &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;这是一个Inline[示例](http://winares.github.com &quot;可选的title&quot;)。
这是一个Reference[示例][ref]。
[ref]: http://winares.github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-22&quot;&gt;效果：&lt;/h4&gt;

&lt;p&gt;这是一个&lt;em&gt;Inline&lt;/em&gt;&lt;a href=&quot;http://winares.github.com&quot; title=&quot;可选的title&quot;&gt;示例&lt;/a&gt;。 &lt;br /&gt;
这是一个&lt;em&gt;Reference&lt;/em&gt;[示例][ref]。
[ref]: http://winares.github.com&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-23&quot;&gt;图片&lt;/h3&gt;
&lt;p&gt;图片的使用方法基本上和链接类似，只是在中括号前加&lt;strong&gt;叹号&lt;/strong&gt;。 &lt;br /&gt;
&lt;em&gt;注：Markdown不能设置图片大小，如果必须设置则应使用HTML标记&amp;lt;img&amp;gt;。&lt;/em&gt;   &lt;/p&gt;

&lt;h4 id=&quot;section-24&quot;&gt;语法：&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;Inline示例：![替代文本](/assets/images/jian.jpg &quot;可选的title&quot;)
Reference示例：![替代文本][pic]
[pic]: /assets/images/ship.jpg &quot;可选的title&quot;
HTML示例：&amp;lt;img src=&quot;/assets/images/jian.jpg&quot; alt=&quot;替代文本&quot; title=&quot;标题文本&quot; width=&quot;200&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;section-25&quot;&gt;效果：&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/image-11-21.jpg&quot; alt=&quot;替代文本&quot; title=&quot;标题文本&quot; width=&quot;200&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-26&quot;&gt;其他&lt;/h3&gt;

&lt;h4 id=&quot;section-27&quot;&gt;自动链接&lt;/h4&gt;
&lt;p&gt;使用&lt;strong&gt;尖括号&lt;/strong&gt;，可以为输入的URL或者邮箱自动创建链接。如&lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#116;&amp;#101;&amp;#115;&amp;#116;&amp;#064;&amp;#100;&amp;#111;&amp;#109;&amp;#097;&amp;#105;&amp;#110;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&quot;&gt;&amp;#116;&amp;#101;&amp;#115;&amp;#116;&amp;#064;&amp;#100;&amp;#111;&amp;#109;&amp;#097;&amp;#105;&amp;#110;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;。&lt;/p&gt;

&lt;h4 id=&quot;section-28&quot;&gt;分隔线&lt;/h4&gt;
&lt;p&gt;在一行中使用三个或三个以上的&lt;code&gt;*&lt;/code&gt;、&lt;code&gt;-&lt;/code&gt;或&lt;code&gt;_&lt;/code&gt;可以添加分隔线，其中可以有空白，但是不能有其他字符。&lt;/p&gt;

&lt;h4 id=&quot;section-29&quot;&gt;转义字符&lt;/h4&gt;
&lt;p&gt;Markdown中的转义字符为&lt;code&gt;\&lt;/code&gt;，可以转义的有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\\ 反斜杠&lt;/li&gt;
&lt;li&gt;\` 反引号&lt;/li&gt;
&lt;li&gt;\* 星号&lt;/li&gt;
&lt;li&gt;\_ 下划线&lt;/li&gt;
&lt;li&gt;\{\} 大括号&lt;/li&gt;
&lt;li&gt;\[\] 中括号&lt;/li&gt;
&lt;li&gt;\(\) 小括号&lt;/li&gt;
&lt;li&gt;\# 井号&lt;/li&gt;
&lt;li&gt;\+ 加号&lt;/li&gt;
&lt;li&gt;\- 减号&lt;/li&gt;
&lt;li&gt;\. 英文句号&lt;/li&gt;
&lt;li&gt;\! 感叹号&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;section-30&quot;&gt;结语&lt;/h3&gt;
&lt;p&gt;Markdown语法很大程度上减少了编辑的成本，但是在写作这篇文章的时候也发现某些标记对中文的支持似乎并不完美，虽然这些缺陷可以通过直接插入HTML代码解决（但这么做一点都不漂亮）。总的来说，能够在离线状态下使用命令行模式进行写作还是很爽的，相比在线写作模式精力可以更专注。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mahua.jser.me/&quot;&gt;MD在线编辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.atool.org/html2markdown.php&quot;&gt;html转MD&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>git使用--SSH配置</title>
   <link href="http://winares.github.com/2013/11/17/git-ssh-key"/>
   <updated>2013-11-17T00:00:00+00:00</updated>
   <id>http://winares.github.com/2013/11/17/git-ssh-key</id>
   <content type="html">
&lt;p&gt;First : 安装git,不多说&lt;/p&gt;

&lt;p&gt;Next : 设置SSH Key&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.  检查是否已经有SSH Key。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;如果说没有这个目录，就直接看第三步&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.  备份&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.  生成一个新的SSH&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;之后直接回车，不用填写东西。之后会让你输入密码。然后就生成一个目录.ssh ，里面有两个文件：id_rsa , id_rsa.pub&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.  把这个SSH放到github上。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;先在GitHub上注册一个用户，然后进入account-setting ，把id_rsa.pub的内容复制进去就可以了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20131117_1.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　然后把id_rsa.pub里的内容复制进去就可以了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20131117_2.jpg&quot; alt=&quot;Pic&quot; class=&quot;img-center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.  测试&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;输入命令：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;提示以下信息表示连接成功：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Hi user_name! You&#39;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>Git基本操作</title>
   <link href="http://winares.github.com/2013/11/16/git-operation"/>
   <updated>2013-11-16T00:00:00+00:00</updated>
   <id>http://winares.github.com/2013/11/16/git-operation</id>
   <content type="html">
&lt;p&gt;本文来自&lt;a href=&quot;http://phoenixtoday.blogbus.com/logs/33458940.html&quot;&gt;网络&lt;/a&gt;，仅作备忘之用。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git clone&lt;/strong&gt;: 这是较为简单的一种初始化方式，当你已经有一个远程的Git版本库，只需要在本地克隆一份，例如’git clone git://github.com/someone/some_project.git some_project’命令就是将’git://github.com/someone/some_project.git’这个URL地址的远程版 本库完全克隆到本地some_project目录下面&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git init&lt;/strong&gt;和&lt;strong&gt;git remote&lt;/strong&gt;：这种方式稍微复杂一些，当你本地创建了一个工作目录，你可以进入这个目录，使用’git init’命令进行初始化，Git以后就会对该目录下的文件进行版本控制，这时候如果你需要将它放到远程服务器上，可以在远程服务器上创建一个目录，并把 可访问的URL记录下来，此时你就可以利用’git remote add’命令来增加一个远程服务器端，例如’git remote add origin git://github.com/someone/another_project.git’这条命令就会增加URL地址为’git: //github.com/someone/another_project.git’，名称为origin的远程服务器，以后提交代码的时候只需要使用 origin别名即可&lt;/p&gt;

&lt;p&gt;现在我们有了本地和远程的版本库，让我们来试着用用Git的基本命令吧：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git pull&lt;/strong&gt;：从其他的版本库（既可以是远程的也可以是本地的）将代码更新到本地，例如：’git pull origin master’就是将origin这个版本库的代码更新到本地的master主枝，该功能类似于SVN的update&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git add&lt;/strong&gt;：是将当前更改或者新增的文件加入到Git的索引中，加入到Git的索引中就表示记入了版本历史中，这也是提交之前所需要执行的一步，例如’git add app/model/user.rb’就会增加app/model/user.rb文件到Git的索引中&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git rm&lt;/strong&gt;：从当前的工作空间中和索引中删除文件，例如’git rm app/model/user.rb’&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git commit&lt;/strong&gt;：提交当前工作空间的修改内容，类似于SVN的commit命令，例如’git commit -m “story #3, add user model”‘，提交的时候必须用-m来输入一条提交信息&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git push&lt;/strong&gt;：将本地commit的代码更新到远程版本库中，例如’git push origin’就会将本地的代码更新到名为orgin的远程版本库中&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git log&lt;/strong&gt;：查看历史日志&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git revert&lt;/strong&gt;：还原一个版本的修改，必须提供一个具体的Git版本号，例如’git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20’，Git的版本号都是生成的一个哈希值&lt;/p&gt;

&lt;p&gt;上面的命令几乎都是每个版本控制工具所公有的，下面就开始尝试一下Git独有的一些命令：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git branch&lt;/strong&gt;：对分支的增、删、查等操作，例如’git branch new_branch’会从当前的工作版本创建一个叫做new_branch的新分支，’git branch -D new_branch’就会强制删除叫做new_branch的分支，’git branch’就会列出本地所有的分支&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git checkout&lt;/strong&gt;：Git的checkout有两个作用，其一是在不同的branch之间进行切换，例如’git checkout new_branch’就会切换到new_branch的分支上去；另一个功能是还原代码的作用，例如’git checkout app/model/user.rb’就会将user.rb文件从上一个已提交的版本中更新回来，未提交的内容全部会回滚&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git rebase&lt;/strong&gt;：用下面两幅图解释会比较清楚一些，rebase命令执行后，实际上是将分支点从C移到了G，这样分支也就具有了从C到G的功能&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20131116_git1.png&quot; alt=&quot;pic&quot; title=&quot;rebase&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git reset&lt;/strong&gt;：将当前的工作目录完全回滚到指定的版本号，假设如下图，我们有A-G五次提交的版本，其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20，我们执行了’git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20’那么结果就只剩下了A-C三个提交的版本&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/media/20131116_git2.png&quot; alt=&quot;pic&quot; title=&quot;reset&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git stash&lt;/strong&gt;：将当前未提交的工作存入Git工作栈中，时机成熟的时候再应用回来，这里暂时提一下这个命令的用法，后面在技巧篇会重点讲解&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git config&lt;/strong&gt;：利用这个命令可以新增、更改Git的各种设置，例如’git config branch.master.remote origin’就将master的远程版本库设置为别名叫做origin版本库，后面在技巧篇会利用这个命令个性化设置你的Git，为你打造独一无二的 Git&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git tag&lt;/strong&gt;：可以将某个具体的版本打上一个标签，这样你就不需要记忆复杂的版本号哈希值了，例如你可以使用’git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20’来标记这个被你还原的版本，那么以后你想查看该版本时，就可以使用 revert_version标签名，而不是哈希值了&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>BLOG搭建手册</title>
   <link href="http://winares.github.com/2013/11/15/how-to-bulid-this-blog"/>
   <updated>2013-11-15T00:00:00+00:00</updated>
   <id>http://winares.github.com/2013/11/15/how-to-bulid-this-blog</id>
   <content type="html">
&lt;p&gt;这篇博文主要是总结自己在github上搭建blog的过程，因为在这其中还是有不少的心得和收获。
另外也是希望可以帮助那些想在github上建blog的同学少走一点弯路。&lt;/p&gt;

&lt;p&gt;我想编过程序的人对github一定都或多或少有些了解。它号称程序员的Facebook，有着极高的人气，许多重要的项目都托管在上面。
但是对于一个新手来说，看到一大堆源码，只会让人头晕脑涨，不知何处入手。他希望看到的是，一个简明易懂的网页，说明每一步应该怎么做。
因此，github就设计了Pages功能，允许用户自定义项目首页，用来替代默认的源码列表。所以，github Pages可以被认为是用户编写的、托管在github上的静态网页，而我们所搭建的blog正是基于github pages的静态网页。
github提供模板，允许站内生成网页，但也允许用户自己编写网页，然后上传。有意思的是，这种上传并不是单纯的上传，而是会经过Jekyll程序的再处理。&lt;/p&gt;

&lt;p&gt;Jekyll（”杰克尔”）是一个静态站点生成器，它会根据网页源码生成静态文件。它提供了模板、变量、插件等功能，所以实际上可以用来编写整个网站。
所以构建blog的思路到这里就很明显了。你先在本地编写符合Jekyll规范的网站源码，然后上传到github，由github生成并托管整个网站。&lt;/p&gt;

&lt;p&gt;下面就要是介绍一下blog搭建的一些具体步骤，主要是一些命令行的操作，还是比较容易上手的。
如果你对ruby完全没有了解，仅仅对html有初步的了解，这都没有关系，只要你懂一点点linux命令就行，
例如ls,cd,mkdir,cp,ssh命令等(不懂也没有关系),不懂请用到时Google。一切软件的下载见后面的软件汇总，具体步骤如下：&lt;/p&gt;

&lt;h3 id=&quot;ruby&quot;&gt;安装ruby环境&lt;/h3&gt;
&lt;p&gt;因为Jekyll是利用Ruby实现的，因此我们需要涉及到一些关于Ruby的东西，可能你对Ruby不是很了解，但这没关系，因为我们只是简单的使用一下而已。
这里我们使用RailsInstaller，它提供了一种轻松便捷的方式来创建Ruby on Rails应用。
目前的RailsInstaller提供了如下功能：
Rails、
Ruby、
SLQite、
Git、
DevKit。&lt;/p&gt;

&lt;p&gt;安装RailInstaller，因为它集成了一系列的软件，因此使用起来也会比较方便，在安装过程中尽量使用默认的设置，这会为后面的工作节省很多精力。&lt;/p&gt;

&lt;h3 id=&quot;git&quot;&gt;配置Git&lt;/h3&gt;
&lt;p&gt;在RailInstaller安装完成界面(程序安装的最后一步)，提示是否进行Git环境的配置，默认情况是选择是，选择“确定”就行。&lt;/p&gt;

&lt;p&gt;如果你之前配置好了git，这边会自动检测到你的相关信息，如git帐号，邮箱，key，以及会显示一些软件信息如：ruby，git版本之类的，
并且自动cd到目录 /c/Sites下面，今后你只要将博客放在该目录下就行。
在开始菜单里找到RailsInstaller –&amp;gt; Git Bash，执行它，就打开了下面的命令窗口，以后的配置操作都是在这个窗口下进行的，
首先测试是否git可以正常连接，如果不能，请回到第一步进行Git的配置(该命令在运行，开始-&amp;gt;程序-&amp;gt;RailsInstaller –&amp;gt; Git Bash 控制台下执行(该控制台我主要是为配置环境用))。&lt;/p&gt;

&lt;p&gt;ssh -T git@github.com
提示以下信息表示连接成功：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$  ssh -T git@github.com
Hi user_name! You&#39;ve successfully authenticated, but GitHub does not provide shell
access.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;jekyll&quot;&gt;安装Jekyll和相关包&lt;/h3&gt;
&lt;p&gt;首先更改一个镜像文件的地址：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem sources --remove http://rubygems.org/
gem sources -a http://ruby.taobao.org/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后用gem sources -l看看现在源列表&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem sources -l
*** CURRENT SOURCES ***
http://ruby.taobao.org/
http://ruby.taobao.org/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;安装jekyll&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install jekyll
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;github-pages&quot;&gt;建立github pages&lt;/h3&gt;
&lt;p&gt;在github.com上创建代码库，登录到自己的Github账户，选择New repository,比如新建一个名如：user_name.github.com的代码库，
然后在代码库页，选择右侧的下拉列表框：Settings，就会对该项目进行修改，找到Github Pages一栏，点击右侧Automatic Page Generator按钮，生成网页，稍等片刻系统就会将网页生成好。待生成好后，克隆自己的代码库&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone git@github.com:user_name/user_name.github.com.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;执行以后，git会把存放在github上的代码库文件下载到本地的，生成名为user_name.github.com的目录。删掉.git目录，并且将网站文件放置在该文件夹下。&lt;/p&gt;

&lt;p&gt;在这里你可以使用jekyll已有的模板，或者参考别人的模板进行编辑修改。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;发布博文&lt;/h3&gt;
&lt;p&gt;打开Git Bash控制台，我们将在这儿继续博文的推送工作。
编辑博文，并以文件后缀.md命名，博文开头格式如下&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;---
layout: post
title: 编程心得
category: blog
description: blablaaaaaaaaaaa
---
正文。。。。。
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;文件命名方式如下:
	2013-12-12-first-page.md
请确保你的文件被保存为不含 BOM 的 UTF-8(若不是将会出错，可以使用notepad++ 来进行格式转换) 
使用git命令推送到git服务器上，先加入本地库中&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git add .
git commit -m&quot;new blog“
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你在其他机器上修改过，那么先要执行 git pull否则会提示： non-fast-forward错误&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;C:\Sites\username.github.com&amp;gt;git push
To git@github.com:username/username.github.com.git
! [rejected]        master -&amp;gt; master (non-fast-forward)
error: failed to push some refs to &#39;git@github.com:username/username.github.com.git&#39;
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. &#39;git pull&#39;) before pushing again.  See the
&#39;Note about fast-forwards&#39; section of &#39;git push --help&#39; for details.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;blog&quot;&gt;访问你的BLOG&lt;/h3&gt;
&lt;p&gt;等待一段时间，github就会为你生成网页。用浏览器打开网址：user_name.github.com，到此blog的搭建工作就算基本完成。&lt;/p&gt;

&lt;p&gt;在整个过程中，要熟悉对git命令的使用，这其实是个基本功，熟能生巧。&lt;/p&gt;

&lt;p&gt;软件汇总：
- RailInstall下载链接：&lt;a href=&quot;http://inwake.com/ypchen/files/upload/railsinstaller-2.0.1.exe&quot;&gt;RailInstall-2.0.1&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 
</feed>