自由地生活和工作

FogCreek这篇文章,算是理清和记录了一些我一直以来想说的话。在昨天的课程上,我们谈论目标、生活方式和工作,特别地,有一个具体问题——“ 五年后的你会是怎样的?” 其实我很好奇其他人的想法都是如何的,起码于我来说,这是一个很有趣的问题。

我不既不是那种得过且过、无所追求的人,也不是具备钢铁神经、顽强意志的人,更不是拥有无比天赋、才华横溢的人。我大概不可能成为什么名人伟人,但是还是有小小的野心和抱负,想做一些符合自己价值观的事情(参见 关于四火)。我很喜欢软件,也很喜欢学习和捣鼓新东西,但是我也并不刻意去拼命弥补自己的技术短板;我希望把代码写漂亮,但是始终觉得只有

[……]阅读全文

JVM 问题定位工具

VisualVMJDB

JDB 是基于文本和命令行的调试工具,Jikes 在 JDB 的基础上提供了 GUI。熟悉 JDB 还是有价值的,很多情况下需要我们在命令行下完成简单的 debug 问题定位。

jdb -classpath bin com.xx.Example
jdb -connect com.sun.jdi.SocketAttach:hostname=myhost,port=8000
jdb -connect "com.sun.jdi.CommandLineLaunch:main=Hello 1 2 3"

我们可能更熟悉使用下面这样的方式来进行调试,但本质上就是在使用 JDB:

-agentlib:jdwp=tran

[……]阅读全文

Issue record: “No thread for socket” about Memcached

MemcachedWe own a service supplying not-real-time data to the downstream clients. In order to reduce the average latency and the pressure on database, Memcached was imported as the cluster center cache, and our service consumed it. I encountered an issue when Memcached was firstly deployed on production envi

[……]阅读全文

Chrome 插件开发

plugin经常要访问一些工具网站,根据页面上特定的取值。这些行为其实完全可以被视作重复劳动,有机会被脚本或者插件的自动行为取代。iMacro 或者 Greasemonkey 都是做这件事的好工具,今天下午有时间,要不干脆写一个 Chrome 插件吧。

没有必要去 Google 什么教程, 官方的文档 已经非常详细,足够指导整个过程了。文档的质量非常好,又有很多例子,是很不错的示例。本质上,用到的技术还是 HTML、JavaScript 和 CSS。我不在这里说太多,推荐大家去浏览一下,即便不做插件开发这件事情,过一下文档也是有收获的。如果你想尽快上手,解决重复劳动的问题而已,对这种好似路边花花草草的小东西没有钻研的兴趣,那么不

[……]阅读全文

寻找 Mac 平台上 Windows Live Writer 的替代品

工作中大部分 Windows 上的软件我都可以在 Mac 上找到相应的替代品。我已经习惯使用 Windows Live Writer 来写博客了(有一个普遍的言论是,微软是一家没有品味的公司,但是也有一些可用性做得比较出色的软件,Windows Live Writer 就是其中之一),在 Mac 上我需要寻找这样的替代品。用客户端写博客比网页端有很多优势,比如网上的图片,截屏的图片,可以直接快捷键粘贴到博客中,再比如配合插件,可以很方便地实现我需要的代码高亮效果。

写博客的同学可以在 这里 下载到,代码高亮效果使用 SyntaxHighlighter 插件完成:

SyntaxHighlight

如果你的博客是 WordPress,在服务端开启远程发布

[……]阅读全文

几道容易出错的 JavaScript 题目

crazy下面这几道 JavaScript 题目大多来自于周五的一个小分享。都是很小的题目,但是很容易犯错。有一些是语言特性使然,有一些则是语言本身没有设计好而留下的陷阱。结果就是,遇到的人很容易陷进去骂娘,这些东西是略有些反直觉,感兴趣的不妨看看,平时我们还是尽量少些这样似是而非的代码。

1.

function Container( properties ) {
    var objthis = this;
    for ( var i in properties ) {
        (function(){
                var t = properties[i];

[……]阅读全文

做产品的主人

PM 产品经理怎样设计好产品?

有很多回答,我曾经见过好些执着于界面美观的产品经理,见过执着于梳理用户需求的产品经理,甚至听说过化身为“用户邮件/文档分析师”的产品经理。我是程序员,是工程师,但我觉得这些人都很不靠谱。这三种不靠谱的产品经理中,第一种最不靠谱。产品经理最好懂技术,但是即便不懂技术,也绝不能化身成为界面设计师。如果我是产品经理,有人有一天对我说,产品经理不就是设计用户界面的人吗?我应该和他拼命。

产品的最大价值,是能够解决用户的问题。所以,产品经理的最大职能,是要设计出能够解决用户问题的产品。你做的东西再丑,举个例子,12306.cn,铁道部的网站,即便再丑,只要用户能够通过它网上购

[……]阅读全文

JVM 致命错误日志(hs_err_pid.log)解读

java 致命错误出现的时候,JVM 生成了 hs_err_pid<pid>.log 这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话 JVM 会尝试把文件写到/tmp 这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如:

java -XX:ErrorFile=/var/log/java/java_error%p.log

这个文件将包括:

  • 触发致命错误的操作异常或者信号;
  • 版本和配置信息;
  • 触发致命异常的线程详细信

[……]阅读全文

用户积分功能的设计

image 有一个 SNS 应用,用户在使用的过程中积累积分,例如登陆+3 点,个人空间每次浏览+1 点,结交每个朋友+5 点等等。同时,很重要的一点是,用户需要看到自己的积分累计有多少,能够根据积分划分用户等级,在自己的空间展示积分。

在用户量比较大的情况下(例如超过三千万),这是一个比较典型的读写都很频繁的问题,而且写入的次数可能和读取的次数差别不大(大多数 SNS 应用中,读次数远超写次数的场景居多,例如用户的状态信息,更新一次以后有成千上万的访问)。

这实际是一个简单,但是典型的功能。试想,给文章投票(例如“顶”一下),给微博统计访问次数,给媒体打分……这些都是非常类似的功能。对于这样问题的思考和设计,考虑到

[……]阅读全文

自欺欺人的故事

cheat 看到吴军博士的一条微博:

不要看不起在生产线上干活,俺正经干过一个月,你对人生有很多体会。俺的一个朋友,一个非常大的跨国公司在中国的销售主管,大学毕业后第一份工作在宝洁,从一个偏远的城市蹬三轮买洗衣服做起。他讲有一次差点把他当盲流给抓了。我倒建议现在大学生毕业,下基层一年。

若是想强调“体验”和“经历”在人生中的重要价值,这番话的初衷自然是好的。比如这样的回复:

还是去一线做个两三年的好,想想现在很多所谓顾问根本没下过车间,却给工作几十年一步步走上来的主管做咨询,有时想想都害怕,只有理论就是空谈,譬如马克思害了多少人,空谈误事啊,切记!

我们见到太多的务虚主义者,太多的所谓咨询师和流程专

[……]阅读全文

笔记:Gamma 分布的转化

Gamma_distributionGamma 分布

α 和β 均大于零,且令λ=1/β,假设 X 的密度满足:

gamma

就说 X 是服从参数为 (β,α) 的 Gamma 分布,记为Γ(β,α)。Gamma 分布的两个参数中,第一个β 决定了形状 (shape),第二个参数α 决定了尺度 (scale)。

右上图中的 k 即是α,θ 即是β;期望 E=β/α,方差 D=β/(α*α)。曲线有一个峰,左右不对称。在α 比较大时,曲线接近于正态分布。

[……]阅读全文

用 SOCKS5 代理翻墙

scaleWall SOCKS 代理它分 SOCKS4 和 SOCKS5 两种类型,前者只支持 TCP 协议而后者支持 TCP/UDP 协议,还支持各种身份验证机制等协议。它和 HTTP 这种应用层的代理不同,它只负责传输数据包,不管应用层的协议,相较而言速度要更快。

3Proxy 是俄罗斯人 3APA3A 和 Vladimir Dubrovin 编写的开源代理服务软件,功能强大。我给我一台在美国的 VPS 主机安装了 3Proxy,开启了 SOSKS5 的代理服务:

system "echo 3proxy is running now"
daemon
nscache 65536
users username:CL:password
auth stro

[……]阅读全文

互联网数据聚合

我们经常需要从互联网上获取数据,在很多情况下,你需要的是特定信息,或者说是符合某些条件的信息,比如:

image

这条需求隐含着两个有普遍意义的步骤:

  1. 从互联网上聚合符合特定条件的信息;
  2. 当满足阈值条件时,以某种方式通知用户。

事实上有太多做互联网数据聚合的网站了,比如 酷讯机票 ,聚合了各大航空公司的机票信息:

image

再比如一些博客聚合网站等等。现在想想这样的场景:

  • 每到一个新地方,自动给我的各个微博账号发一条地点签到微博;
  • 我关注的明星有最新的动态,邮件通知我,第一时间获得消息;
  • 我的股票一旦涨到某个值,短信提醒我该抛售了;
  • ……

其实这些事情不难实现。

IFTTT

不知道你是不是和我一样,

[……]阅读全文

网络爬虫

最近在写一个程序,去爬热门事件和热门关键词网站上的数据。在这里介绍一下网络爬虫的种种。

基本组件

image

网络爬虫也叫做网络蜘蛛,是一种互联网机器人,把需要的网页撷取下来,组织成适当格式存储。它是搜索引擎的重要组成部分,虽然从技术实现上来说,它的难度往往要小于对于得到的网页信息的处理。

上面这张图来自 维基百科 ,scheduler 调度多个多线程的下载器下载网页,并把信息和元数据存储起来。而通过解析下载网页的数据,找到链接,又把链接加入到工作队列中去准备下载。这看起来是一个迭代的过程。

网络爬虫相关的几项重要策略:

  • 选择策略:哪些网页是需要被抓取的;
  • 重访问策略:怎样的方式去检测网页是否被修改过;

[……]阅读全文

JavaScript 使用 for 循环时出现的问题

javascript 这个问题的讨论最初来自公司内部邮件,我只是把这个问题的讨论内容记录下来。

有一些项目组在定位问题的时候发现,在使用“for(x in array)”这样的写法的时候,在 IE 浏览器下,x 出现了非预期的值。

具体说,如果自定义了 Array.prototype.indexOf 方法(譬如源于某 prototype 污染),也许是因为老版本 IE 浏览器并不支持 array.indexOf 方法,而开发者又很想用,那么这样的浏览器可能会出现这样的问题:

Array.prototype.indexOf = function(){...};
var arr = [1, 2];
for (x in arr) consol

[……]阅读全文

再谈大楼扔鸡蛋的问题

egg 这道题是说,100 层楼,两个一模一样的鸡蛋,某层之上扔鸡蛋就会碎。问要测试多少次才能找出这层楼来。我曾经在 去年初的这篇文章里面讨论过这个问题的解法 ,因为只想记录一下思路和讨论过程,写得很简略。现在,我想重新整理一下这个问题,再稍稍扩展和挖掘一下。希望可以用尽可能清晰易懂的描述,把这个问题的前后说清楚。

现在只有两个鸡蛋,而算法必须在各种合法输入下都是可行的,就是说要能找出这一层来,你得假设你的运气最差,这就意味着,我求解的是在每种扔鸡蛋的策略下都有一个需要扔的次数的最大值,而现在需要求解的是这些最大值中的最小值的问题。如果我只有一枚鸡蛋,这就意味着,我只能从第一层开始老老实实地一层一层往上试

[……]阅读全文

有趣还是无趣?

funny 这是一篇扯淡,一篇 rant,或者是一坨不靠谱的文字。有一些观点过于偏激,如果你没法接受,也请不要太在意。

无趣的接口封装

我记得刚工作的时候,我的第一个正式项目是去写一个基于 SOAP 的 WebService 接口,那个时候觉得新鲜,“原来 web service 是这样子的!”;到了现在,已经写过各种各样的 service 接口,再也没有觉得做这样的事情很有意思,或者很有新意、很有挑战性,尤其是一些并不复杂的增删改查的接口(当然业务逻辑是有够繁琐的)。

有同事说,做界面、做 portal 并没有什么意思,都是浮于表面的东西。虽然我不完全认可,但在这个前端工作被普遍瞧不起的国度,而且从某些层面上说也对,可是我

[……]阅读全文

行动、眼界和体验

action 这是一堆杂乱的文字。可以认为它是我从去年二月份正式跳槽到北京工作以来,这一年三个月的时间里,出现次数最多的感悟。

不知道有多少人和我一样,有选择焦虑症,总是思考要做出怎样的决定而浪费了时间。事实上,在大多数情况下我们总不能做出完全正确的选择,就像人生永远都会充满遗憾和后悔。做软件也是一样,想一猛子扎下去把东西设计完美,就走上了彻底的不归路。倒不如,像 Facebook 说的那样,“move fast and break things”,先弄出一个符合你基本预期的东西来,然后再来细细打磨和深加工,做所谓的“refactory”?

这看起来像个权衡的算术题对不对?到底是思考久一点,调查久一点,慢一点

[……]阅读全文

DNS 劫持

想谈一谈这个话题是因为最近有一位朋友抱怨他的博客在某些用户某些时候访问的时候,被莫名其妙地加上了广告,他检查来检查去,始终发现不了网站本身有什么问题,后来他才了解到了 DNS 劫持一说。

DNS 劫持

其实这不是一个新概念了,在几年前,中国一些不讲道德的运营商,尤其是地方运营商就开始捕捉用户浏览器的访问记录,然后根据不同用户的访问行为,有选择地往用户访问的网页里面推送广告。因为运营商掌握着 DNS 主机,所以他们可以为所欲为地强制改写网站 HTML 页面,采用往返回页面里写入 JavaScript 等方式,来注入广告:

image

这是访问 55BBS 网站时某些用户会在屏幕右下角看到一个京东商城的广告。这样的广告,

[……]阅读全文

Notes: Hadoop-based open source projects

Here's my notes about introduction and some hints for Hadoop-based open source projects. Hope it's useful to you.

Management Tool

Ambari: A web-based tool for provisioning, managing, and monitoring Apache Hadoop clusters which includes support for Hadoop HDFS, Hadoop MapReduce, Hive, HCata

[……]阅读全文

back to top