黄金时代

国庆期间和老婆在看完了稍煽情的“亲爱的”以及速食搞笑式的“心花路放”这两部热门电影后,补了团购的差价冲着文艺片的口号去看了电影“黄金时代”,看了一会儿才发现这原来是讲述作家萧红的传记式电影,我并不熟悉萧红的作品,尽管剧中大部分的作家我都有过耳闻,所以这篇并不是观后感,而是借题发挥,因为如果从黄金宝贵的含义来说,我即将步向三十岁,并同我的爱人结了婚,我生命中最为珍贵而且无忧无虑的生活也即属于我们的“黄金时代”已经划上了句号,因此即便看完电影已经过了三天,我都难以不想起我的黄金时代已经结束这样的一个现实,于是只好在这深夜里,随笔用我刚清理过的机械键盘打下下面这些文字吧。

看电影的过程中听着画外音所转述出的萧红那强烈画面感(或者我应该用即视感这样更为时髦的话语吧,但去他娘的,我就是这么的固执)的文字,我突然意识到,在我黄金时代的前二十几年,我也曾经对文字有过一种说不出的迷恋,而如今近十年过去,我却很少再能够静下心来,读篇散文或者长篇小说,心中柔软的地方已经变的坚硬,少有被触动了,这并不我所期望的一种状态,无论如何,在我未来的生命中,我都想再次疾呼并提醒自己,无论信息多么的碎片,我都应该试着再次软化心中的某块地方,毕竟,人并非机器,尽管人已经逐渐被机器所束缚,我们总需要情感来支撑自己活过。

假期陪老婆看装修材料,体验了老婆平日里跑装饰城的艰辛,看着老婆稍显稀疏的头发,心里涌起一阵阵的伤感,尽管老婆高中毕业,我曾经想去证明既便我们这样的搭配依然能过的很好,如今看来却有些荒唐与可笑了,我谁不需要去证明,也无需给自己证明,老婆同我度过的六年,同样也是她的黄金时代,我们一起笑过、哭过、闹过、打过,如今仍然相依为命在一起,生活也逐渐的稳定起来,我们都彼此都真心的付出过,就不再愧对于自己过往的时代了。

我并不是一个安份的人,既使如今定居在苏州三年,我心里仍一直有些躁动,渴望继续能够在不同的城市生活,老婆也很支持我这样的想法,我很期望这就是我们将来的时代所最明显的印记,时而漂迫,时而安定,永远生活在别处。

使用ghostscript合并多个pdf文件

最近用chrome从网上打印了一系列文章,于是弄出来了一堆pdf,很想把这些pdf合并成一个pdf,再编辑下书签水印的,很容易弄的有点像个书的样子。

搜索来发现还是ghostscript这个工具比较适合,gentoo上直接emerge即可,其他发行版应该比gentoo更为简单。

从ghostscript的官方网站的这句介绍的话:

Welcome to the Home Page for Ghostscript, an interpreter for the PostScript language and for PDF, and related software and documentation.

可以很容易看出,ghostscript做为PDF解释器,是能够理解PDF的内部构造的,那么合并PDF这样的事情,应该会做的不错。

闲话不多说,安装完ghostscript后,可以用如下命令行来合并一系列的pdf。

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf

简单解释一下上面的选项:

  • -dBATCH 批量处理,做完就乖乖退出
  • -dNOPAUSE 每页PDF都给我处理好,不要等我再下指令
  • -q 不必要告诉我你在正确处理
  • -sDEVICE=pdfwrite 使用内置pdfwrite设备来写文章
  • -sOutputFile=finished.pdf 合并后的文件名

怎么样,还是比较简单吧?

附:

[1] ghostscript官方主页

关于产品的思考(一)

最近百度一位30岁的副总引起了关注,在c114上甚至看到了有人发了将其与李一男对比谁更厉害的帖子,然而我对论坛口水战没有兴趣,我更关注是他们均随着成就产品的同时而成就了自己,前者搞火了百度贴吧、百度百科,使百度在移动互联网时代取得了不错的份额,后者则是用CC08程控交换机帮老任打了如今华为的坚实基础,人们需要好的产品。

上次我在京东购买了一条3.5mm的耳机插口延长线,其接口应该采用铜金属制成,直径约一厘米,长约三厘米,直到最近我才注意这样设计的好处,原来在桌子上,由于这么多的铜,使得这个东西对桌子的吸附力要比一般的普通延长线要好的多,也就不容易在听歌时掉到地上去,这款产品于我而言,就是很不错的产品,我如果再有类似的需求,也同样会优先考虑这样的产品。

以往在华为工作时,做为大公司里的一名螺丝钉,如果非要套上一个产品的话,我所负责的模块或者项目,可以称得上产品,交付一个少bug稳定的特性,或许就可以称得上交付了一个产品,然而正如那句经典的交换机上80%的特性都是无用特性的话所说,我不知道我所交付的这个所谓的产品,是否能让用户在用到时,有如同我上面的那样的感觉,而在敏感且对可靠性要求严格的路由器产品上,软件的稳定性尤其重要,这样的特性,即使用户不会使用,也将自此融入产品,再不敢轻易删除,从此软件越来越膨胀。

从华为辞职后,在新公司,因为公司规模的缘故,我与之前相比,更容易接近客户了,那么到底怎么样去衡量客户的需求是否合理,我们做出来的东西是否能让客户产生眼前一亮的感觉,惊叹一声这恰好就是我所期望的东西,如何避免上面软件膨胀的问题,对我而言都是具有挑战性的工作,使我越来越觉得如何评估如何做出好的产品,满足客户需要的产品的重要性了。

对于这样的问题,显然是不会现成的答案的,甚至我觉得,不同的领域,不同的客户,对于好的产品的定义,也自然是不同的,比如对于不爱听歌的人,显然无法给出什么样的随身播放器是一款好的产品。

如果要弄清楚这样的问题,首先就要对目标市场有深入的理解,甚至需要对目标市场的主要玩家的产品有深入的理解,真正了解客户目前在怎么用,是否遇到了什么问题,如果有机会的话,需要和客户做更多的交流,甚至在现场去了解,去分析。

其次,要多增加碰撞的机会,真理越辩越明,在相关人之间要着力创建思辩的氛围,在东西未经讨论之前,尽量要避免做老好人的角色,不能唯唯诺诺。

再次,在客户给予条件的时候,要尽早获得客户的反馈,这与敏捷开发的原理相似,借此可以快速迭代,快速优化,尽快让产品接近客户需求本质,避免走弯路。

如今我比以往更渴望,能够做出一款真正有人广泛应用的产品来,让人们的生活更美好,岂不是一件很有成就感的事情么?

AOSA之ZeroMQ阅读笔记

AOSA即《The Architecture of Open Source Application》是本不错的书,这本书的写成本本身也采源了开源社区的协作方式,目前已经出了两部,最新的版本为POSA即《The Performance of Open Source Application》,专注于开源软件的性能。

最近抽时间看了AOSA中关于ZeroMQ的章节,自己先前由于工作需求,简单了解到过ZeroMQ,这次可以借机会读读ZeroMQ创始人亲自写的章节,确实有不少的收获,记录在这里,在后续的项目实践中可以予以参考使用。

Library设计
The lesson here is pretty obvious: Don’t use global state in libraries. If you do, the library is likely to break when it happens to be instantiated twice in the same process.

ZeroMQ设计时经过分析和对比,最终采用了Library而非单一的消息服务器的方案,在设计Library时,得出了上述结论。

也即对于Library而言,最好避免全局状态,采用Context的方式较好,特别是存在library被额外的library依赖在同一程序中存在多份library实例时可以避免带来的竞争性问题。

了解真正的问题
There are many more pitfalls in benchmarking the messaging systems that we won’t go further into. The stress should rather be placed on the lesson learned: Make sure you understand the problem you are solving. Even a problem as simple as “make it fast” can take lot of work to understand properly. What’s more, if you don’t understand the problem, you are likely to build implicit assumptions and popular myths into your code, making the solution either flawed or at least much more complex or much less useful than it could possibly be.

原文附了一个很经典的双向消息交互的图片,解释了吞吐率和时延的评估上的思维误区,用户也许更关注的是从一个单点看到的吞吐率和时延而不是全局吞吐率和时延,这提醒我们要搞清楚到底我们面对的是什么样的问题,以便能够找出解决的办法。

写这个笔记时总让我想起自己这些年工作上的一些感悟,近来听到的一句很经典的话就网络设备商有时候是在自己发明方案,然后再去寻找问题,这样如何能做出真正满足客户需求的产品呢?

内存分配
Lesson learned: optimize where it makes difference. Optimizing pieces of code that are not on the critical path is wasted effort.

要在关键路径上做优化,在非关键路径上瞎优化是在浪费时间。

When thinking about performance, don’t assume there’s a single best solution. It may happen that there are several subclasses of the problem (e.g., small messages vs. large messages), each having its own optimal algorithm.

在做性能考量时,不要假定存在单一最佳方案,很可能一个问题下存在多个子类(如小消息和大消息,ZeroMQ的方案是小消息直接编码在消息句柄中,大消息则采用指针引用,避免内存拷贝),每个子类都有自己的最优算法。

批处理
Lesson learned: To get optimal throughput combined with optimal response time in an asynchronous system, turn off all the batching algorithms on the low layers of the stack and batch on the topmost level. Batch only when new data are arriving faster than they can be processed.

在异步系统中,在底层最好关闭批处理算法而让上层进行批处理操作。并且要按需开启批处理,在处理能力足够的情况,可以不进行批处理而减少开销。

并发处理
Lesson learned: When striving for extreme performance and scalability, consider the actor model; it’s almost the only game in town in such cases. However, if you are not using a specialised system like Erlang or ØMQ itself, you’ll have to write and debug a lot of infrastructure by hand. Additionally, think, from the very beginning, about the procedure to shut down the system. It’s going to be the most complex part of the codebase and if you have no clear idea how to implement it, you should probably reconsider using the actor model in the first place.

在追求高性能和弹性的时候,要考虑使用actor模型,ZeroMQ这里采用了多个线程,线程间采用Event进行通信(印象中好像基于Libevent),从而使得线程可以在CPU核上进行水平扩展,取得极大的并发性能。

这里ZeroMQ的创建中还额外提醒要在设计之初就考虑系统的关闭处理,这通常是系统中最为复杂的地方;以我们的经验来看,我们很多业务进程都不能良好的shutdown,或者说都不支持shutdown…

无锁算法
Lesson learned: Lock-free algorithms are hard to invent, troublesome to implement and almost impossible to debug. If at all possible, use an existing proven algorithm rather than inventing your own. When extreme performance is required, don’t rely solely on lock-free algorithms. While they are fast, the performance can be significantly improved by doing smart batching on top of them.

尽可能采用已知的无锁算法,避免自己造轮子发明一个(前面在公司我在开发一个软转发时,就参考了一个网上搜索到的无锁ring queue算法,实践证明比我自己想一个要好用的多,性能也比较好),另外,在无锁算法上再加上一些智能的批处理机制,会取得更大的性能提升。

API设计
Lesson learned: While code reuse has been promoted from time immemorial and pattern reuse joined in later on, it’s important to think of reuse in an even more generic way. When designing a product, have a look at similar products. Check which have failed and which have succeeded; learn from the successful projects. Don’t succumb to Not Invented Here syndrome. Reuse the ideas, the APIs, the conceptual frameworks, whatever you find appropriate. By doing so you are allowing users to reuse their existing knowledge. At the same time you may be avoiding technical pitfalls you are not even aware of at the moment.

这个经验与上面的类似,本质上就是尽可能减少造轮子,ZeroMQ参考BSD socket的API设计是非常成功的,从而使得用户学习起来非常容易;这就如同在通信业务里面,采用CISCO风格的CLI,显然用户会更容易上手一些。

附:

[1] The Architecture of Open Source Application

[2] WIKI百科上的Actor模型

自已动手打造wifi路由器

由于家里那台华为的HG8245越来越不给力,虽然是自己的前东家出品,这产品也真不耐用,用后门上去可以发现经常性出现kernel分配skb不到导致上网时断时连,妈的内存只有一M空余了,当然,也许他们也知道这东西电信是不给开路由的,既然咱自己动手hack开了路由,就别怪这种后果。

于是最近花了一周晚上的时间,买了个PCDuino板,自己搭建了一个家用wifi路由器,由于我家基本不存在WLAN间互访的问题,少了个LANSWITCH影响不大,做个NAT Router,PCDuino跑的比较Happy,网速快的很开心;至于HG8245,俺将之改回了bridge模式,给俺透传个报文,目前跑的很欢。

废话少说,以下拉个清单,供有需要打造wifi router的朋友参考交流。

原材料汇总

  • PCDuino v1,v2集成wifi实则非常鸡肋,不必花冤枉钱
  • 802.11n USB WIFI无卡 (需支持AP模式),京东上购得EDUPEP-MS15002一款,只需39元,采用RTL8192CU芯片,支持2T2R实现300Mbps数据传递,对于我那只有12Mbps上的光纤,已是足足有余
  • HDMI to DVI转接线 (如显式器支持HDMI则直接买HDMI线即可)
  • 5V/2A DC电源 (本人拿IPAD充电器替代)
  • 旧笔记本上拆下来的320G硬盘,用来做下载机硬盘
  • 4G左右的SDCARD,虽然PCDuino自带4G NAND flash,但这玩意显得得保护得当,启动盘与系统盘还是复制到SDCARD上比较好

背景知识

以下是我总结下来的需要了解的一些背景知识,似乎有点多,但科班出身的咱们码农们,不少是熟之又熟啦。

  • 基础Linux操作系统知识
  • 基础网络知识(交换与路由)
  • 交叉编译
  • 内核编译、内核模块编译
  • iptables使用
  • routing/bridging
  • PPPoE
  • HostAP配置(实现wifi认证接入)

打造过程

  1. 复制系统到SDCARD双系统设计算是全志A10这款SoC的亮点,默认的Linaro系统接电启动可以通过Ctrl-Alt-F1进入文本模式,启动板子配置工具,此时可选择将NAND Flash上的系统拷贝到SDCARD上,A10在下次启动就可以根据SDCARD上是否存在启动文件而从SDCARD启动,从而避免对Nand Flash的寿命产生影响。此后除非把SDCARD上的内核弄坏,一般情况下就无需Nand Flash启动了。(二般情况下,我就犯了错,替换SDCARD启动分区上的内核文件时,没注意到大小不对,使得还需要用Nand Flash启动,手工挂载SDCARD启动分区,拷贝可用的内核予以修复,其实也并不难办,只是稍显麻烦)。
  2. 升级SDCARD上的系统玩过Debian系OS的话,对apt-get比较熟悉了,轻车熟悉升级一把即可,Linaro源里的包还算丰富,由于A10主频有1GHZ,并且自带1G内存,所以系统默认就带了编译工具,对于像我这里用到的RTL8192CU驱动编译的话,在PCDuino上直接就可以编译完成了,无需进行交叉编译。
  3. Wifi AP设置wifi AP配置的一切麻烦都来自于8192CU这看似性价比高的芯片,A10所用3.4.29+内核里的驱动虽能用,但用起来还是不够好,所以RealTek官方还是给出了自己的源码,虽然会增加麻烦,但所幸官方提供了包括修改过的HostAPD源码,编译下内核再编译个HostAPD,就可以搞定了。官方给出的驱动包里的东西已经比较清除了,Linksprite上的链接提供了板子上直接编译该驱动的方法,以下附上链接:PCDuino编译 8192CU驱动
  4. IPtables规则设置IPtables依赖的netfilter功能在PCDuino默认内核上是没有开启的,因此需要重新编译内核和内核模块,理论上可以直接在PCDuino上完成,但内核编译显得耗时过长,生命有限,能少折腾还是少折腾了。Linksprite上的链接提供了在X86_64 Linux上交叉编译内核的方法,从文章的链接中也可以找到如何替换SDCARD上内核的办法,以下附上链接:PCDuino交叉编译内核需要注意的是,因为8192CU驱动为我们自己编译,建议下完内核代码后,把这款驱动的编译修改到内核编译过程里,避免每次需要手工复制,并且如果是在板子上编译的内核模块,与新交叉编译的内核文件并不配套,导致不能顺利加载,影响wifi接入功能的顺利调试。因为家里有多台设备需要通过此wifi router上网,IP tables的作就就是在ppp虚拟口(在未完成PPPoE拨号时,这里可以用内置接口eth0替换,相当于在HG8245下面又做了一级NAT)和WIFI接口间进行NAT,目前只用到一条MASQUERADE规则即可::::console iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
  5. PPPoE拨号在之前的步骤中,我一直还是通过HG8245 DHCP接入上网的,当上述设置完成后,就可以恢复HG8245为桥接模式了,在PCDuino上通过内置的RJ45 100M端口,通过HG8245光猫PPPoE拨号出去,自此但可享受远离HG8245频繁掉线的困扰了。Debian/Ubuntu系统上PPPoe拨号相对比较简单,网上有大把流程,这里就不再赘述了。

陷阱(坑啊坑)

  • PPPoE与TCP MSS问题由于PPPoE这样Overlay在Ethernet(最近研究了太多的overlay技术了)上,显然是有额外的封装代价的(需要在正常的以太报文上再额外消耗8个字节),这样就会与TCP协商时的MSS产生冲突,TCP采取本地网卡的MTU来填写TCP报文的MSS,而大部分终端默认网卡MTU都是1500,这样就会有可能在PPPoE封包过程(设想终端发过来的报文刚好1500,再加8字节的封装就大于1500了)中产生大于运营商链路MTU的报文,从而使和报文被丢弃,直接症状就是视频或图片加较缓慢或不能加载,影响家庭用户心情。以下链接提供了较为详细的介绍,可供参考:MTU and PPPoE详解对此问题,Linux Iptables提供了TCP Clamping的功能,直白点就是动态干预调整TCP MSS字段的设置(另外一种方法基于path mtu discovery,但容易受现网环境影响,不必折腾),具体命令如下::::console iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460

后记

PCDuino用着让人不爽的几个地方:

  • PCDuino V1有点大材小用,外置的一些如PWM接口、Arduino接口对WIFI router这个角色基本没用,全志A10实际上带了Audio DAC,然而却没有引入3.5mm插口,没有HDMI显示器的话,音频输出有点伤
  • PCDuino社区不如RaperryPI强大,Linaro这个For arm Soc的发行版也不怎么酷,A10的kernel源码还基于3.4.29+,比较旧
  • PCDuino V1所用A10的EMAC集成网卡驱动有点乱,也不支持DMA收发,有点无爱

基于Ubuntu的Linaro用着让人不爽的几个地方:

  • Upstart这套init系统用着有点不爽,看来被Systemd占了上风也是有道理的。

然而生命的意义就在于尝试和体验,折腾虽然累了点,但看着老婆上网相当开心的样子,我还是很满足的:)

错失的创业机会(续)

似乎是在一月十二那天给自己定下了闹钟,四个月后被准时提醒,昨晚突然再次想到这些年错失的创业机会,上一篇日志里分析了错失一些创业机会的原因,结合我昨晚的思考,这篇日志我打算回过头来,细数到底错过了哪些创业机会,这次细数的时间段从零零到一四年,也就是差不多十四年的时间跨度,以我上高中左右开始(补充一点,我大约是初中毕业考高中后开始在表哥那里了解到网络但我俩并未拨号连网成功,之后我借好友被接受网络技能培训的机会,于两千年在县城电信营业厅里第一次接触到网络的),到昨晚做为结束,细想这十四年间中国互联网发生的翻天覆地的变化,有公司湮灭不见,比如我早先注册电邮的润迅,如今这家公司的网站都应景的变成了地产商的网站,有的公司比如我很早就接触到的开发OICQ(用来给表哥发寻呼)的腾讯,如今已经市值已经9000亿,而如今我却坐在这里,看着这些巨大的变化也差异,唏嘘之外,也要鞭策自己,期望自己能够在以后能够找准发力点,用十年甚至二十年的光景,也取得不错的成就来。

下面就来逐一思考到底这些年错失了哪些创业机会,以便自己以后能变得更加警醒,抓住那些稍纵即逝的机会点;同时,我也无需悲观,毕竟造物弄人,自己还有足够的时间去反思改进,悟已往之不谏,知来者犹可追。

  • 运营一个论坛社区 自高中时开始,我似乎就在尝试着了解论坛是什么玩意,上大学初期,就试着搞了不少的论坛,同学录、新闻、政治类的都弄过,但无一例外都失败和湮灭了;但印象中比较深的,反倒是一个非科班出身的高中同学,向我打听了建立论坛的技术,若干时间后我再访问他的论坛,竟然已经发展到了几千会员,让我着实惊讶不已,并且同学那时就开始玩百度广告联盟,开始尝试把用户量/访问量来变现了,的确是很有商业头脑的人;只是后来同学因为各种原因,未再继续维护推广了,稍显可惜。 如今回过头来,反思在这点上,我觉得一方面是我显然欠缺对赚钱的兴趣,尽管家庭条件极为普通,但父母还是为我上大学提供了必备的基础,我只懂得了节流,却未懂得了开源的必要性,使得压制自己欲望成为了自己的习惯状态,从而只关心技术细节,而失去了对营利方面的思考,当然如果深入思考的话,同学父亲在家乡做自动门生意做的相当不错,高中阶段同学在物质上给了我很多帮助,从这点来看,他似乎也受到了家人的熏陶与影响;另一方面则是缺乏运营能力,我自己往往建立论坛后,将技术弄懂后,却未在运营上花费功夫,反思同学的论坛则起了一个相当有意思的名字“中国狼社区”,名字虽粗野倒也响亮,难怪也能小火了一把。 现如今论坛这种模式已经式微(虽然有人仍在不断换另外一种维度来重做论坛,本质上仍是类似,小圈子也许能做大,但赢利就未必了,但也许别人只是一个爱好,未尝不是一件好事),但倘若彼时我能够有效运营一个社区,并成功从上面赚到一些生活费的话,对自己的能力提升也为起到较大的帮助,同时这件事本身也提醒我,后代的成长与家庭环境有一定的因素,父辈自然要努力为自己的下一代做出表率。
  • DNS业务 大学那会儿除了免费主机外,我也花了不少精力到免费域名这上面去,注册了免费域名,自然要找免费的dns服务器,opendns、dnsever什么的,然后我却从未曾意识到dns这里面存在着不少的需求,安全,负载分担,线路智能优化等,于是有家大家都熟悉的dnspod如今被腾迅收购,从烟台这样的小城市走到了台前;而我印象中自己很早就注册了dnspod的账号,却未意识到当年的一个小公司,如今发展的这么红火了。 如今再次回头,在国外并不新鲜的技术,dnspod能在国内从免费模式做起,并及时发现中国互联网中一些独特的约束条件(如GFW),以及可能存在的庞大的市场,以及初期投资到一个也许并不那么红火的市场里(印象中当时dnspod是国内第一家免费的dns平台,我似乎还看到当时的广告),都是需要一定的魄力与眼光的,因此,眼光与魄力,对于创业成功的重要性,则是不言而喻的。
  • 虚拟主机 dns算是网络基础网络中一种,而另外一种,则是我当时同样玩过无数多的东西,有叫虚拟主机的,有叫免费空间的,当年用过的免费空间除了日本xrea,基本上全部阵亡了,现在想来通过扫描日本肉机申请到xrea账号,并以xrea账号换到多个7位qq号码,算是我这些年在网络中唯一一次有价植的操作了,当然这虽然是题外话,也能说明我这些年是如何的错失啊。 现在看来,当年的虚拟主机,只需要有少量的启动资金,租用一台服务器应该就可以开动,倘若运营的好,坚持到云计算网络大潮的到来前,如果再能顺势做一把云计算,不消说成为业界老大,也至少是前列了;我想在这方面,自己失误的原因与上面差异不大,一是不想赚钱而缺乏主动性,二是眼光有限。

趁着今天周日,我坐在桌前想了这些,这段时间我将继续反思,寻找错失原因的同事,也争取思考并挖掘一些新的技术机会。

继续更新:

  • 山寨last.fm音乐社区 记得毕业当时,我看到last.fm这种分享音乐的网站,立刻即被吸引起来,而那时适逢毕业季节,同学们都最终各奔东西,我有些想号召人来一起做这个东西,却被毕业时各种无体制的酒局和嬉闹所湮没,忘记到了一旁。 如今再次想来,毕业那时虽然一无所有,但一无所有也正好无所牵挂,是可以拼搏一把的大好时机,而此刻我无论有什么样的想法,都要面对房货与家庭,再不能冲动一回了;刚查了类似被阿里收够的虾米网,以及近来自己十分喜爱的网易云音乐,都做的十分之火,除了感叹之余,也提醒我自己要随时记录那些一闪而过的点子,虽然不能冲动,但仍可理性分析,静俟时机的到来。

创业公司里的一笔账

自零二年四月来苏州后,转眼已经过去两年多一个月的时间,借着SDN/OpenFlow技术的东风,我开始负责公司SDN/OpenFlow产品的系统研发工作,遗憾的是,两年过去了,抛开公司层面主来来说,我们团队的产品似乎还未实现赢利,而我粗算了一笔研发账后,更是心有戚戚,深知创业不易,且创且珍惜的道理了。

目前我们团队有研发人员五人,测试人员三人,按平均公司每月均摊在每个人头上的成本二万来计算(含工资社保、饭补、电费等),月支出就是十六万,年支出就是二百零八万(考虑年底双薪的情况),参考国外同类设备一台价格五万的话,差不多我们需要卖一百台应该才会有盈利,而一百台对于在大产商夹缝中求生存的小公司而言,其实是挺有挑战的。

从研发团队来看,一方面我们需要继续提高产品质量,从而减少不必要的支持成本,在客户层面建立口碑,以期为公司贡献更多的销售,一方面需要继续跟进技术发展趋势,提供更有竞争力和开放性的产品给客户,拓宽产品所能够面临的目标市场;而从目前的状态来看,产品质量这块我们还有优化的空间,技术竞争力方面目前我们还比较领先,需要继续保持。

抛开上述因素来看,我个人觉得团队战斗力与执行力决定了产品发展的好与坏,不否认某些稀缺产品即使躺着都能把钱赚了,但对于日渐式微的通信设备行业来看,跑着都未必能把钱赚了,有一个有高战斗力和执行力的团队,才能不断的拥抱变化,才能在夹缝中生存与拓展;而我们团队的战斗力与执行力,目前来看也同样有较大的提升空间,希望在后继的时间里,我能够和团们一起努力,打造一个精干的团队出来。

再回到开头的那句话,创业不易,且创且珍惜;感谢公司提供的环境,个人价值的体现与公司的发展正相关,期待公司能够走入发展的第二春。

Emacs批量重命名文件

对于Emacs党来说,最好什么事情都能在Emacs中用键盘完成,即酷又方便,今天在编码过程中决定对一批文件进行重命名,发现在Emacs里完成这件事是相当的直觉(intuitive,直觉很重要,我个人很喜欢这种方式,因为通过减少思考而能够形成潜意识,从而提高效率),总结下来一共如下四步:

1> 使用find-dired命令找到所有待修改的文件

/home/fortitude/tmp/:
find . \( -name "test*" \) -ls
1180244    0 -rw-r--r--   1 fortitude bigdog          0 1月 31  2013 test.py~
1224276    4 -rw-r--r--   1 fortitude bigdog         36 1月 31  2013 test.py
1180238    4 -rw-r--r--   1 fortitude bigdog        142 1月 31  2013 test.pyc

2> 使用wdired-change-to-wdired-mode命令切换dired模式到wdired模式,即可编辑的dired模式

注意modeline上将出现Editable Dired标识

3> 像替换buffer一样替换上面的test为test1,祭出Emacs的各种编辑功能:)

/home/fortitude/tmp/:
find . \( -name "test*" \) -ls
1180244    0 -rw-r--r--   1 fortitude bigdog          0 1月 31  2013 test1.py~
1224276    4 -rw-r--r--   1 fortitude bigdog         36 1月 31  2013 test1.py
1180238    4 -rw-r--r--   1 fortitude bigdog        142 1月 31  2013 test1.pyc

4> 使用wdired-finish-edit1(默认快捷键为C-c C-c)来保存配置,批量编辑完成

/home/fortitude/tmp:
总用量 100
drwxr-xr-x  3 fortitude bigdog 4096 5月   5 23:22 .
drwxr-xr-x 84 fortitude bigdog 4096 5月   5 22:47 ..
-rw-r--r--  1 fortitude bigdog   36 1月  31 2013 test1.py
-rw-r--r--  1 fortitude bigdog    0 1月  31 2013 test1.py~
-rw-r--r--  1 fortitude bigdog  142 1月  31 2013 test1.pyc

我认为这里最酷的东西就是wdired-change-to-wdired-mode这个命令了,使得编辑文件名如同编辑buffer一样,相当惊喜!

云计算网络中的Virtual Router

云计算中的Virtual Private Cloud是一个比较流行的概念,该概念最早源于Amazon AWS,用于将众多虚拟机组成一个虚拟网络,并通过一个虚拟网关将用户远程的办公网络接入到云中来。

国内IaaS服务商在不断提升虚拟机业务的同时,也有青云、Ucloud已经先后推出了VPC的支持,阿里云据说内部也已经在做,但估计大公司在推产品方面因为有多方力量的制约,至今还未见到商用。

对于企业用户而言,通过自己手工安装各种VPN软件,通过隧道技术连接到云中的虚拟网络,还需要手工配置路由这些操作,会存在管维上的一些困难,因此,有些大公司已经明显看到这种趋势,开始推出基于虚拟机的软件路由器,主流的产品如下:

Cisco CSR 1000V

运行IOS XE,在硬件交换机上,协议类软件比较接近于Linux应用程度,而IOS XE就是基于Linux而来,因此对于思科而言,推出这样的产品并不会有多大的困难。

Brocade Vyatta 5400 vRouter

收购Vyatta得来,与下面的Vyatta Core/VYOS同源

H3C VSR 1000V

H3C的路由虽然与华为V3同源,但似乎没有用DOPRA这样的OS抽象玩意,而是跑在Linux上,因此这个VSR的推出应该与CSR 1000V类似,不会太困难。

这些商用的路由均提供了Secure WAN gateway、Routing,H3C和Cisco甚至都提供了MPLS功能的支持,并支持主流的Hypervisor软件,如VMware ESXi/KVM等,Cisco的1000V甚至在AWS Marketplace上提供了实例镜像供用户直接部署。 对于普通用户而言,除了上述商用产品外,目前可以选择的几款开源类似产品如下:

Vyatta Core

VYOS

Vyatta Core社区版本fork而来

目前这两款软件均提供了普通X86版本以及虚拟化版本(后续本网站会考虑分享一些使用心得)。

从目前来看,国内VPC还处于比较初级的阶段,似乎也未见到比较典型的部署案例(以后本网站会持续关注并分享),但随着公有云的逐渐流行,这方面应该会有不错的发展,值得期待,估计华为也会比较快推出这样的东西了。

PS:

我个人后面会有计划在国内建立一个Vyatta的开源社区,提供一个供本地化的交流平台。

错失的创业机会

周六同学来苏州看房,晚饭时我们聊到他朋友成功的创业事迹,一款app由于在iphone推出后占据了前期地位,至今仍能创造年入百万的业绩,让人佩服的同时,也让我反思自己这些年来所错失过的创业机会。

大学期间,我鼓捣了很多东西,建过各种论坛,玩过linux各发行版,搞过各种博客,新东西我基本上都感兴趣,但却未有一件上了规模,创造了实际效益,相比之下,北美的zuckberg却创建了如今风风火火的facebook。

工作之后,iphone这种高大上的东西咱屌丝虽然没能用上,但android g1出来后,我还是飞速的买入了android g1,却未能把握住android market这样一个同样拥有众多机会的“市场”,却注定只能成为一个普普通通的用户。

根据我近来夜不能寐时的思考,加上和同学的讨论,错失这些创业机会的原因如下:

  • 心态上满足于彼时的现状,和上篇一样,我自己闲散惯了(比方说这个系列称为苏州闲思,看来今日得改个名字才好),没有强烈的创富意识(谈钱太俗,还是叫创富较雅观,我的装13由此可见)
  • 不够玩物丧志,有好奇但不追求深入,从而导致思考停留在较低层次,比如android market这里巨大的市场机会就没有深刻体会到
  • 唯技术论,不懂得协调资源,UI/UX什么的,倘若自己不能设计,可以求助甚至付费求助也可实现
  • 缺乏产品意识,关于产品意识,要铺开谈的太多,但根据我自己的总结,这点我的确非常之欠缺

而如今即然我已经思考创业机会到了夜不能寐的程度,看来经后很有必要在关注各种新奇东西之余,也需要花点心思,思考其下可能存在的机会,并抓住一起可以利用的资源,做出点成绩来。

就用和同学的告别语也是陶渊明的辞作(当然如今这个时代,陶渊明待我70岁之后再学吧)来结束今日之思:

悟已往之不谏,知来者之可追。