Book note:《我是沃兹》

父亲告诉我的方式是:不要死记硬背零件如何形成电路,而是理解电子流动在哪里才形成有用的电路;不要仅仅阅读线路图或是书上的内容,而要真正心领神会。

因为我已是成年人,有我自己的道德观——深刻关注人民的生活疾苦。我开始寻找生活真谛——如今我仍在这样做——我行事做人只为自己和他人拥有一个快乐的人生。

对政府行为,我所感受的震惊和恶心非笔墨所能形容:他们将我们的人生玩弄于股掌之间,并非如父亲所说,他们关心民众疾苦。

我具有幽默感,对生活我也保持这样的态度,只有快乐会成为我的选择。我认为是否快乐,取决于自己,只是自己。

我相当清楚自己要成为一位设计电脑的工程师,一位编写软件的工程师,一位风趣的工程师,一位愿意教授他人的工程师。

我清楚自己从不想玩社交游戏。即使到22岁,我也如此肯定自己并不想从工程领域调至管理层。我不愿进入管理层,进行政治性的争斗,或是踩着别人的肩膀往上爬。

大多上白班的人都喜欢在回家做些完全不同的事情。有些喜欢在家看电视,但我则喜欢做电子工程。我热衷于此,并以此为乐。

在我心中,道德举足轻重,至今我仍不能真正明白他为何对我撒谎。但是,[......]

继续阅读

Book note:《黑客与画家》

保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是:

1.搭建原型

2.上线运营

3.收集反馈

4.调整产品

5.成长壮大

他认为一定要特别关注用户需要什么,这样才有办法将一个坏项目转变成好项目。他说:"许多伟大的公司,一开始的时候做的都是与后来业务完全不同的事情。乔布斯创建苹果公司后的第一个计划是出售计算机零件,然后让用户自己组装,后来才变成开发苹果电脑。你需要倾听用户的声音,琢磨他们需要什么,然后就去做。"

创始人本身比他的创意更重要。

作者目的:通过这本书让普通读者理解我们所处的这个计算机时代。

作者试图从许许多多不同的方面解释这个时代的内在脉络,揭示它的发展轨迹,帮助你看清我们现在的位置和将来的方向。

想把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。

我们的时代是程序员主导的时代,而伟大的程序员就是黑客。

根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。
黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、[......]

继续阅读

一升庵经营之道

作为吃货一枚,对和饮食有关的影视作品有爱应该是很好理解的。在家看电视时,有些美食节目也会让我停下飞快换频道的手指。

看完《深夜食堂》后继续寻找,找到的第二部以食物为主题的剧集是同样来自日本的《料理仙姬》。故事并不复杂,讲述坚持传统的日本料理店一升庵里的大小事情,每集一个主题。抱着娱乐的心态来看,却从料理店的年轻老板娘半田仙(苍井优饰演)身上学到一些为人处事的道理:

1.让对方吃到美好食物的心情最重要。

这部剧给我留下最深印象的不是具体烹制食物的技法,而是工作反映出的态度。阿仙制作料理时自然发出的微笑以及对食物喃喃说出的"变得更好吃啊",透露出她对料理制作的热爱。她几次提到,让对方吃到美好食物的心情是最重要的,这话语里是爱人之心。出于爱,还是利润,还是炫技,效果会不同,因为这背后反映出不同的动机:为己还是为人。

2.对专业极致、完美的追求。

这其实是个老话题了,日本是个特别善于在某种技艺上极致追求并且取得巨大成就的国家,令人尊敬。茶道、剑道、插花等早已是日本文化象征,本剧中同样表现了这种文化:做味增时一粒粒的挑选黄豆,切食材时刀法一丝不苟,修缮房屋的木工[......]

继续阅读

用Lucene模糊搜索和ExtJs ComboBox实现搜索建议词效果

在搜索引擎输入框中输入搜索词时,会实时得到搜索建议:

这些建议词是从搜索引擎的搜索记录中按照一定算法挖掘出的高关联度短语。如果没有搜索记录,能不能实现相关搜索建议呢?本文介绍一个简单的处理方法,下面将分别说明如何得到相关建议词和前端的实现方式。

1.相关词语的获取

最直观的相关词语是:两个词语(短语)之间具有一部分相同字,另一部分不同,它们之间相同的部分所占比例越高,则两个词语越相关。例如,在这种情况下"计算机"和"计算器"是相关的,"计算机"和"计算机网络"是相关的。如果有一个词典包含足够的词语,并且支持这种模糊的词语匹配方式,就可以实现词语建议。

Lucene专门提供了模糊查询FuzzyQuery实现上述功能[1]。它采用编辑距离算法计算两个字符串之间的相似度,编辑距离用来计算从一个字符串转换到另一个字符串所需的最少插入、删除和替换的字母个数。例如,"three"和"tree"之间的编辑距离为1。使用FuzzyQuery查询时,和查询词距离越小的词评分越高,在结果中排名越高。这样就可以通过模糊搜索获得词库中最相近的词语。

实际操作中,[......]

继续阅读

ExtJS TreeGrid叶子节点拖拽问题和选择框使用方法

最近一直参与开发一个实验室项目,接触到了ExtJs。下面是工程中几个小问题的总结。

1.TreeGrid的叶子节点拖拽问题

我使用的是ExtJs3.1版本。ExtJs中默认在树(Ext.tree.TreePanel)的拖动中,一个节点是不能拖动到一个叶子节点中的。这样的设计有些武断,因为根据应用环境叶子节点是有可能变为父节点的。事件机制给这个问题带来了解决方案,许多地方都提到了在监听TreePanel的"nodedragover"事件时特殊处理使得叶子节点可以被drop。代码为:

tree.on("nodedragover", function(e){
var n = e.target;
if (n.leaf) {
n.leaf = false;
}
return true;
});

最后的返回值设为true使得目标叶子节点接受拖动的节点。

在使用TreeGrid(Ext.ux.tree.TreeGrid)时,同样面临上面的问[......]

继续阅读

浪潮与基因——读《浪潮之巅》

十一期间读了期待已久的《浪潮之巅》,这是一本阅读体验非常好的书。书中回顾百年来辉煌过的科技公司巨头并且梳理了IT行业的发展规律,很容易让人联想到那部回顾大国兴衰的纪录片——《大国崛起》。

这本书的主要观点有两点,一是势,也就是标题中的"浪潮"一词。二是公司基因论,即一家公司的发展命运很大程度上取决于它的基因。

关于浪潮的重要性书中已经充分论证——赶上了一波大潮足以保证一家公司在几十年的时间顺流前进。但我想,把握机遇的能力也很关键:在《硅谷传奇》中,比尔盖茨联系为Altair 8800提供Basic解释器,但当时已经有50家公司参与竞争。而《Facebook效应》中,扎克伯格在做Facebook网站前已经积累了软件开发、社交网站建设的经验,并且总是在思考、讨论可以用网络提供什么样的服务。没有做好准备,机会来临了也只能看着它溜走。

当然,从历史的角度看,强调机遇的重要性是从更高远的角度出发的。对已经同样优秀的参赛者来说,机遇远胜过实力的微小差别。

本书令人印象深刻的一点是作者展现出了非常宽广的视野、丰富的知识背景、深厚的人文素养和对技术的深刻理解,这些都是和作者自身[......]

继续阅读

Book note:《浪潮之巅》

近一百多年来,总有一些公司很幸运地、有意识或者无意识地站在技术革命的浪尖之上。一旦处在了那个位置,即使不做任何事,也可以随着波浪顺顺当当地向前漂个十年甚至更长的时间。在这十几年间,它们代表着科技的浪潮,直到下一波浪潮的来临。

对于一个弄潮的年轻人来讲,最幸运的莫过于赶上一波大潮。

第1章 AT&T公司

1877年由电话之父亚历山大·贝尔建立,最初叫贝尔电话公司。电话的发明和AT&T的建立,第一次实现了人类远程实时的交互通信。

1925年建立贝尔实验室——历史上最大最成功的私有实验室。

1984年根据反垄断法的要求,AT&T的市话业务分出去划分成7个小的贝尔公司。贝尔电话公司更名为AT&T公司。

1995年是AT&T公司的顶峰,接下来的10年,它便分崩离析不复存在了。

为了将电话设备卖给竞争对手,公司决定将设备制造部门拆分出去,使股票飞涨获取利益。利令智昏,杀鸡取卵。

1996年,AT&T拆分为AT&T(从事电信服务业务),朗讯(从事设备制造)和NCR。

贝尔实验室失去AT&am[......]

继续阅读

排序算法思维导图总结

常用的排序算法包括:

  1. 冒泡排序
  2. 插入排序
  3. 合并排序
  4. 堆排序
  5. 快速排序
  6. 计数排序
  7. 基数排序
  8. 桶排序

下面按照稳定性、复杂度、适用特点进行总结。

稳定性:具有相同值的元素在输出数组中的相对次序没有改变。当卫星数据随被排序的元素一起移动时,稳定性比较重要。

复杂度:时间复杂度和空间复杂度。

适用特点:算法需要根据具体条件进行选择。

1.排序算法分类,稳定性和时空复杂度[1]:


2.适用特点[1-4]:UTF8_EX[......]

继续阅读

中位数和顺序统计学

在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。
一个中位数是它所在集合的"中点元素"。当n为奇数,中位数出现在i=(n+1)/2处;当n为偶数,存在两个中位数,i=n/2和i=n/2+1。如果不考虑奇偶性,中位数出现在\lfloor(n+1)/2\rfloor处(下中位数)和\lceil(n+1)/2\rceil处(上中位数)。
形式化地定义选择问题:
输入:一个包含n个(不同的)数的集合A和一个数i,1\le i\le n
输出:元素x\in A,它恰大于A中其他的i-1个元素。
最小值和最大值
在一个有n个元素的集合中,要通过n-1次比较才能找到最小值或最大值。
如果同时找出最小值和最大值,则可以成对的处理元素,将一对输入元素进行比较,将较小者与当前最小值进行比较,将较大者与当前最大值进行比较,即每两个元素需要3次比较。这种情况下需要的比较次数是3\lfloor n/2\rfloor处(下中位数)
一般选择问题
一般选择问题和找最小值的运行时间是相同的,都是\Theta(n)。基于快[......]

继续阅读

桶排序

桶排序(bucket sort)假设输入均匀而独立的分布在区间[0,1)上,在满足假设时,可以以线性时间运行。

基本思想:把区间划分成n个相同大小的子区间,或称桶。然后将n个输入数分布到各个桶中,由于输入数在区间上均匀分布,一般不会出现一个桶中出现太多数的情况。然后对各个桶进行分别排序,最后将各桶中元素合并即可。

Java程序实现

(简便起见,程序中链表和排序部分使用Java自身的)
import java.util.LinkedList;
import java.util.Collections;

public class BucketSort{
@SuppressWarnings("unchecked")
public static Double[] sort(double[] A){
int n = A.length;
LinkedList<Double>[] B = (LinkedList<Double>[])new LinkedList[n];
for(int i = 0;[......]

继续阅读