What’re the basic qualities to a software engineer? Hard skills such as coding, testing, business knowledge and algorithm, and soft skills as communication, passion, attitude, resposibility and so on. Posted an article talked about the over estimation of algrithm, I would like to raise a similar po[……]阅读全文
JavaScript 3D 图表
在说 3D 图表以前,首先要明确两个概念,一个是数据的维度,一个是呈现数据载体的维度。对于数据的维度,一维的数据呈现,但是呈现的载体是二维的平面图,比如饼图:
已经能够很清晰地观察到数据的分布情况。数据如果增加一个维度,变成二维,呈现载体依然是二维的平面图:
数据表达依然是清晰的。但是,倘若再增加一维,这个时候就面临了两个问题:
- 数据的维度增加,复杂性也增大了;
- 计算机发展到现在,绝大多数情况下数据载体依然是二维的平面图,如何展示三维的数据呢?
这两个问题中,第一个问题从本质上说,无法解决。数据的维度越大,理解起来理所当然地,也越来越困难。
但是第二个问题,我们至少有两种解决办法。一种
[……]阅读全文
工程师的生活
我忽然很好奇,想知道其他软件工程师的生活是什么样的?人永远都没有活在别人心中的形象那么绚烂,生活中总有无数烂事烦事需要处理,但是每个人都有自己享受生活的方式。逛了逛了各式技术博客和论坛,我发现大家似乎都太严肃了,太谦逊了,太学术了。做软件本来是一件很有意思的事情,但是这些帖子和文章无非就包括这么几种:
- 技术文章,不解释,这部分当然是大头,虽然技术文章普遍不受欢迎;
- 牢骚,喵了个咪的薪水低啊,呜了个汪的加班苦啊;
- 心灵鸡汤,要励志、要发奋、要改变世界;
- 长者语气教育后辈,“ 给刚入职的程序员们的警示”;
- 无聊的纷争,Linux 就是比 Windows 牛逼
[……]阅读全文
Memcached 调优
项目中有一个对实时响应性比较高的服务,引入了 Memcached 以减少延迟和减少数据库压力。但是期间遇到了一些问题,这里记录一些调优细节。
客户端选择
- 最开始我使用的是 Memcached Java Client,但是最后放弃了,放弃原因包括:
- 有时会出现的 “No Thread For Socket” 异常,我记录在这里;
- 它不支持 NOREPLY 模式(在这种模式下,更新缓存的 set 操作可以不需要 Memcached 服务端响应,这使得 set 操作非常非常快)。
- 现在我使用的是 XMemcached。
统计信息
可以通过 nc 命令向 Memcached 服务端发送消息来获取统计信息,例如:
echo "
[……]阅读全文
使用堆外内存
有时候对内存进行大对象的读写,会引起 JVM 长时间的停顿,有时候则是希望最大程度地提高 JVM 的效率,我们需要自己来管理内存(看起来很像是 Java 像 C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的 EhCache(给它包装了个酷一点的名字,叫 BigMemory),以及现在项目中的 Memcached。在 nio 以前,是没有光明正大的做法的,有一个 work around 的办法是直接访问 Unsafe 类。如果你使用 Eclipse,默认是不允许访问 sun.misc 下面的类的,你需要稍微修改一下,给 Type Access Rules 里面添加一条所有类都可以访问的规则:

在使用 Uns
[……]阅读全文
自由地生活和工作
JVM 问题定位工具
JDB
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
We 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 插件开发
经常要访问一些工具网站,根据页面上特定的取值。这些行为其实完全可以被视作重复劳动,有机会被脚本或者插件的自动行为取代。iMacro 或者 Greasemonkey 都是做这件事的好工具,今天下午有时间,要不干脆写一个 Chrome 插件吧。
没有必要去 Google 什么教程,官方的文档已经非常详细,足够指导整个过程了。文档的质量非常好,又有很多例子,是很不错的示例。本质上,用到的技术还是 HTML、JavaScript 和 CSS。我不在这里说太多,推荐大家去浏览一下,即便不做插件开发这件事情,过一下文档也是有收获的。如果你想尽快上手,解决重复劳动的问题而已,对这种好似路边花花草草的小东西没有钻研的兴趣,那么不
[……]阅读全文
寻找 Mac 平台上 Windows Live Writer 的替代品
工作中大部分 Windows 上的软件我都可以在 Mac 上找到相应的替代品。我已经习惯使用 Windows Live Writer 来写博客了(有一个普遍的言论是,微软是一家没有品味的公司,但是也有一些可用性做得比较出色的软件,Windows Live Writer 就是其中之一),在 Mac 上我需要寻找这样的替代品。用客户端写博客比网页端有很多优势,比如网上的图片,截屏的图片,可以直接快捷键粘贴到博客中,再比如配合插件,可以很方便地实现我需要的代码高亮效果。
写博客的同学可以在这里下载到,代码高亮效果使用SyntaxHighlighter 插件完成:

如果你的博客是 WordPress,在服务端开启远程发布
[……]阅读全文
几道容易出错的 JavaScript 题目
下面这几道 JavaScript 题目大多来自于周五的一个小分享。都是很小的题目,但是很容易犯错。有一些是语言特性使然,有一些则是语言本身没有设计好而留下的陷阱。结果就是,遇到的人很容易陷进去骂娘,这些东西是略有些反直觉,感兴趣的不妨看看,平时我们还是尽量少些这样似是而非的代码。
1.
function Container( properties ) {
var objthis = this;
for ( var i in properties ) {
(function(){
var t = properties[i];
[……]阅读全文
做产品的主人
有很多回答,我曾经见过好些执着于界面美观的产品经理,见过执着于梳理用户需求的产品经理,甚至听说过化身为 “用户邮件/文档分析师” 的产品经理。我是程序员,是工程师,但我觉得这些人都很不靠谱。这三种不靠谱的产品经理中,第一种最不靠谱。产品经理最好懂技术,但是即便不懂技术,也绝不能化身成为界面设计师。如果我是产品经理,有人有一天对我说,产品经理不就是设计用户界面的人吗?我应该和他拼命。
产品的最大价值,是能够解决用户的问题。所以,产品经理的最大职能,是要设计出能够解决用户问题的产品。你做的东西再丑,举个例子,12306.cn,铁道部的网站,即便再丑,只要用户能够通过它网上购
[……]阅读全文
JVM 致命错误日志(hs_err_pid.log)解读
致命错误出现的时候,JVM 生成了 hs_err_pid<pid>.log 这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话 JVM 会尝试把文件写到/tmp 这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如:
java -XX:ErrorFile=/var/log/java/java_error%p.log
这个文件将包括:
- 触发致命错误的操作异常或者信号;
- 版本和配置信息;
- 触发致命异常的线程详细信
[……]阅读全文
用户积分功能的设计
有一个 SNS 应用,用户在使用的过程中积累积分,例如登陆+3 点,个人空间每次浏览+1 点,结交每个朋友+5 点等等。同时,很重要的一点是,用户需要看到自己的积分累计有多少,能够根据积分划分用户等级,在自己的空间展示积分。
在用户量比较大的情况下(例如超过三千万),这是一个比较典型的读写都很频繁的问题,而且写入的次数可能和读取的次数差别不大(大多数 SNS 应用中,读次数远超写次数的场景居多,例如用户的状态信息,更新一次以后有成千上万的访问)。
这实际是一个简单,但是典型的功能。试想,给文章投票(例如 “顶” 一下),给微博统计访问次数,给媒体打分……这些都是非常类似的功能。对于这样问题的思考和设计,考虑到
[……]阅读全文
自欺欺人的故事
不要看不起在生产线上干活,俺正经干过一个月,你对人生有很多体会。俺的一个朋友,一个非常大的跨国公司在中国的销售主管,大学毕业后第一份工作在宝洁,从一个偏远的城市蹬三轮买洗衣服做起。他讲有一次差点把他当盲流给抓了。我倒建议现在大学生毕业,下基层一年。
若是想强调 “体验” 和 “经历” 在人生中的重要价值,这番话的初衷自然是好的。比如这样的回复:
还是去一线做个两三年的好,想想现在很多所谓顾问根本没下过车间,却给工作几十年一步步走上来的主管做咨询,有时想想都害怕,只有理论就是空谈,譬如马克思害了多少人,空谈误事啊,切记!
我们见到太多的务虚主义者,太多的所谓咨询师和流程专
[……]阅读全文
笔记:Gamma 分布的转化
α 和β 均大于零,且令λ=1/β,假设 X 的密度满足:
就说 X 是服从参数为 (β,α) 的 Gamma 分布,记为Γ(β,α)。Gamma 分布的两个参数中,第一个β 决定了形状 (shape),第二个参数α 决定了尺度 (scale)。
右上图中的 k 即是α,θ 即是β;期望 E=β/α,方差 D=β/(α*α)。曲线有一个峰,左右不对称。在α 比较大时,曲线接近于正态分布。
[……]阅读全文
用 SOCKS5 代理翻墙
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
[……]阅读全文
互联网数据聚合
网络爬虫
最近在写一个程序,去爬热门事件和热门关键词网站上的数据。在这里介绍一下网络爬虫的种种。
基本组件
网络爬虫也叫做网络蜘蛛,是一种互联网机器人,把需要的网页撷取下来,组织成适当格式存储。它是搜索引擎的重要组成部分,虽然从技术实现上来说,它的难度往往要小于对于得到的网页信息的处理。
上面这张图来自维基百科,scheduler 调度多个多线程的下载器下载网页,并把信息和元数据存储起来。而通过解析下载网页的数据,找到链接,又把链接加入到工作队列中去准备下载。这看起来是一个迭代的过程。
网络爬虫相关的几项重要策略:
- 选择策略:哪些网页是需要被抓取的;
- 重访问策略:怎样的方式去检测网页是否被修改过;
[……]阅读全文
JavaScript 使用 for 循环时出现的问题
这个问题的讨论最初来自公司内部邮件,我只是把这个问题的讨论内容记录下来。
有一些项目组在定位问题的时候发现,在使用 “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
[……]阅读全文
这篇文章,算是理清和记录了一些我一直以来想说的话。在昨天的课程上,我们谈论目标、生活方式和工作,特别地,有一个具体问题——“ 五年后的你会是怎样的?” 其实我很好奇其他人的想法都是如何的,起码于我来说,这是一个很有趣的问题。