摘要: $ history | awk '{print $2}' | sort | uniq -c | sort -nr | head 124 dir 80 vi 77 echo 60 cd 58 vim 53 jobs 38 gcc 33 ls 33 less 31 lua124 dir虽然linux下也有dir,但明显没有ls来的正统,甚至很多linux党都不知道这个命令的存在 - 这个是windows下面比较经典的命令 阅读全文
posted @ 2013-06-22 06:45 lzprgmr 阅读(530) 评论(0) 推荐(0) 编辑
摘要: 工作8年,前6年基本是Windows环境下,也就是个鼠标党;两年前换工作开始用linux,也就开始了领略了命令行的强大,无论是直接在命令行组合命令,也还写几行简单的shell脚本,其能完成的功能往往令人难以置信。关于命令行强大的一个例子:csdn泄露的10个最常用的密码awk '{print $3}' www.csdn.net.sql |sort |uniq -c |sort -nr |head (陈硕同学写的)关于脚本强大的一个例子:提高分布式环境中程序启动性能的一个方法如果说我工作中第一次感觉“哇”是08年左右开始使用perl处理文本 - 发现脚本原来可以如此强大,自动化那 阅读全文
posted @ 2013-06-22 06:42 lzprgmr 阅读(1648) 评论(0) 推荐(0) 编辑
摘要: 假设在linux下,你有一个可执行文件,其依赖于100个动态库,而这100个动态库来自网络中不同的位置,甚至可能来自不同的region,即使网路用的是专用光纤,其网络延迟也不可忽视,那么在启动该可执行文件时发生了什么:100个rpath100个动态库为了加载任意一个动态库,都需要在这100个rpath逐个寻找,假设其实一一对应,那么查找的次数为:1+2+3+...100=5050,在分布式的环境中,这个代价是非常大的(根据网络环境的不同,有的甚至能达到10分钟以上)。但其实有个蛮简单的方法,可以完全消除这些无谓的查找:把rpath设为只有一个entry,比如当前目录,然后把这个可执行文件所有的 阅读全文
posted @ 2013-06-22 06:10 lzprgmr 阅读(716) 评论(2) 推荐(0) 编辑
摘要: lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样:【例子程序】-- debug.luagvar1 = 100function foo() local var2 = 10 function bar() debug.debug() return var2 end bar()enddebug.debug()foo()【设置断点】这个比较麻烦一点,需要修改代码加入一句:debug.debug()如果... 阅读全文
posted @ 2013-01-01 11:40 lzprgmr 阅读(19241) 评论(3) 推荐(2) 编辑
摘要: 很多时候,针对大部分情况,你能有一个完美的设计,但是当一些边边角角的情况被考虑进来之后,这个“完美”的设计就不在完美,甚至无法工作,这个时候,你其实有两个选择:重新设计,找到一个对这些rare case也适用的设计保持原有设计,但找到一个让这些rare case能够正常工作的work around第一种选择的是牺牲了整理设计,妥协后的方案可能能工作,但非常的丑陋; 而第二种选择则是牺牲了部分用户,但保证了整体设计的优美。选择的关键在于这些rare case到底有多rare,以及这些rare case有多重要。我的观点是:如果可以,请尽量选择第一种方案。我这里有个例子:一般对于C++工程,我们需 阅读全文
posted @ 2012-12-10 18:19 lzprgmr 阅读(510) 评论(0) 推荐(0) 编辑
摘要: 一般面试C++,都会很无聊的问到虚拟函数的实现机制,接着就会问到vtable放在哪里 - 实现细节中的细节,我个人觉得这个除了卖弄没啥大意义,但面试嘛,一般就这吊样。写个小程序:#include <iostream>using namespace std;// .data - read-write dataint rwdata = 100;// .rodata - read-only dataconst char* rodata = "hello, world";// .bss - non-initialized dataint bssdata;// .text 阅读全文
posted @ 2012-12-08 20:56 lzprgmr 阅读(1682) 评论(2) 推荐(0) 编辑
摘要: 最近一直在做一个build system的依赖管理,感觉其中某些内容可以抽取出来,作为一道很不错的面试题:假设你在同时编译n个项目,他们相互之间有依赖关系,比如:现在,让你写一个算法,把每个项目的依赖拍平:即把其所有间接依赖+直接依赖的项目都输出。比如上面这个图的输出就为:a: b c d e f gb: c dc: dd:e: f gf: gg:然后,还可以有后续的问题:如果有环,如何判断并输出环?如果这些项目有可能有一些外部的依赖,请改变你的算法以适合这种情况。好,面试到此结束。下面是个扩展题,没在工作中做到,但后来想了下,觉得挺有意思:为了提高编译速度,现在需要找出那些可以并行编译的项目 阅读全文
posted @ 2012-12-07 20:45 lzprgmr 阅读(685) 评论(0) 推荐(0) 编辑
摘要: 这里说的Bundle,是software library范畴的,我把它定义为: 一系列版本兼容的软件库。对于比较小的项目,用的library不多,升级不勤快,这不是个问题,但是对于大型项目,bundle是非常有用的 - 当然,这需要build system的支持。(但加一个这样的功能蛮简单的)bundle的格式大概为一个library=version的列表:boost = 1.50qt = 4.8.3opencv = 2.4.2意思是我把这几个lirary打成一个包,经测试(例子是假设的)发现这几个版本的library是可以在一起工作的 - 也就是说兼容的。bundle的使用就是用户不需要去烦 阅读全文
posted @ 2012-12-07 20:23 lzprgmr 阅读(524) 评论(1) 推荐(0) 编辑
摘要: 觉得有必要记录一下这类问题,都打个[design decision]的标签吧。目前项目中遇到这么个问题:我们build system的用户,需要为他的每个项目提供一个文件,用来描述该项目产生的libary,以及依赖的其他项目。 这个文件很重要,需要在install的时候与最终产生的库文件放在一起,以便被其他项目使用时访问,从而把整个依赖链串起来。 已知该文件总是放在一个固定的位置,之后gmake install时会被安装到一个固定的位置。好,问题来了,既然文件在哪里,要被安装到哪里都是已知的,是不是build system可以自动把这步包含进来,无须用户做任何事,从而提供了方便?我一开始的想法 阅读全文
posted @ 2012-12-07 20:21 lzprgmr 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 当然,这个在这里谈的很多了, 但这里只是说说我们这边用的几种模式, 主要针对发布比较频繁发布的情况,比如两周一次,一个月一次之类的。【一、major.minor】比如1.0, 1.2, 2.5, 3.0等等。 major是主要版本号,major相同,minor不同的版本,是后相兼容的 - 也就是说不会有schema change(如果读文件的话),也不会有breaking api(如果暴露api的话)。当然,你觉得一个major不够用,完全可以扩展为major.major.minor, 如果你在乎后向兼容,这个的确蛮好用的。major.minor的问题在于如何比较两个版本哪个更新:比如:5.8 阅读全文
posted @ 2012-12-07 20:17 lzprgmr 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 看上一个域名,恰好处于pendingDelete状态,就是别人不要了,但还没放出来 - 估计这域名比较火,一出来很有可能会被大家抢走,于是想写个自动运行的crontab来监控其可用性,并在可用时自动发信通知。基于目前linux下可用的命令/工具,这可以是一个简单的shell script,但我还是用自己比较熟悉的perl把这些命令粘合起来【1】 - 我的观点是shell script只是用来配置环境的,如export一些变量,设置一些alias之类的,其他一些逻辑,文本操作,perl做的很好了,而且win+linux两个平台下都可用,就不费那个神了。【用curl获得网页内容】太简单了:curl 阅读全文
posted @ 2012-12-02 09:20 lzprgmr 阅读(619) 评论(0) 推荐(0) 编辑
摘要: 其实是蛮简单的一个功能,就是读取这个页面:http://61.129.89.226/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=2012138, 把某一个期的中奖号码抽取出来。【luarocks安装library】首先,如果是想用某个库,真没必要自己wget再make, install啥的,太烦。lua社区提供了一个非常好用的工具,用法和apt(advanced package tools)很类似:apt-cache search xxxsudo apt-get install xxxluarocks search xxx 阅读全文
posted @ 2012-11-25 19:03 lzprgmr 阅读(3254) 评论(0) 推荐(0) 编辑
摘要: tesseract这个东西,之前朋友有个项目,问到我的时候看了一下,因为那个项目难度比较高,不敢接,也就作罢了。这次翻出来看看纯属兴趣 - 感觉手机拍照然后识别些东西,并且联网查询,还是蛮有意思的。tesseact其实全称是tesseract-ocr,是个自动识别字符的程序,项目网址是:http://code.google.com/p/tesseract-ocr/。虽然其主流平台是三大系统(Win/Linux/Mac OS),但在android和iphone上也是可以跑的 - 这点对我来讲非常重要。你可以直接想在其命令行工具使用,或者下载其SDK开发自己的程序。tesseract支持多种语言 阅读全文
posted @ 2012-11-23 18:06 lzprgmr 阅读(25055) 评论(4) 推荐(3) 编辑
摘要: 先大概描述一下环境:这是一个C++的build system, 基于premake扩展而来,可以管理各个package[1]/library之间的dependency关系,每个package都会随binary发布一个lua文件用来描述其导出的library和依赖的package,比如:LIBRARIES = {}DEPENDENCIES = {}从而把整个dependency closure给串起来。现在的需求要用户可以在这个lua文件中定义自己的函数,让用户在定义他们的project的时候调用,目的是为consumer在使用library时提供更精确的控制。比如在boost的use.lua中 阅读全文
posted @ 2012-11-22 22:18 lzprgmr 阅读(589) 评论(1) 推荐(0) 编辑
摘要: 读《Programming In Lua》协程那一章,比较困惑的还是procuer-consumer那个例子:function consumer(prod) while true do local x = receive(prod) print(x) endendfunction receive(prod) local status, value = coroutine.resume(prod) return valueendfunction send(x) coroutine.yield(x) -- go back to where ... 阅读全文
posted @ 2012-11-17 21:24 lzprgmr 阅读(4556) 评论(1) 推荐(0) 编辑
摘要: 最近的工作是基于premake做一个适合我们公司的C++的编译系统,了解一下已经比较成熟的CMake,是非常有参考价值的。【CMake初印象】CMake和premake一样,都是meta build system,可以针对不同的平台产生相应的编译系统,比如Windows上的VS Projects, Linux下的Makefile。但CMake要比premake更加成熟,这点可以从其支持的feature,使用的项目,以及完善的文档、社区支持可以看出来,premake简直就是一个小娃娃。所以,让我来评价,CMake之于premake,最大的优势在于功能强大且久经考验,除了基本的静态库、动态库、可执 阅读全文
posted @ 2012-11-11 17:23 lzprgmr 阅读(5572) 评论(2) 推荐(0) 编辑
摘要: 这篇主要记录一下学习陈硕同学的对下面这道题的算法思想与代码。题目是这样的:有10个文件,每个文件1G,每个文件的每行存放的都是用户的query(请自己随机产生),每个文件的query都可能重复。要求你按照query的频度排序。(当然,这里的重点是大文件,所以10个1G的文件,或者1个10G的文件,原理都是一样的)陈硕的代码在这里:https://gist.github.com/4009225这是一段非常漂亮的代码,解法与代码都非常值得一看。【解法】基本步骤就是不断读入文件,并做初步统计,到了某个内存的极限时写出文件,写的方式是按query的哈希值分配到10个不同的文件中,直到读完所有文件内容, 阅读全文
posted @ 2012-11-11 11:51 lzprgmr 阅读(5586) 评论(9) 推荐(3) 编辑
摘要: 最近在设计一个编译系统的依赖管理部分,如果一个project的dependency closure(所有直接和间接的依赖)中有某个相同的library的不同版本,我们就认为这里有一个版本冲突, 那么在检测到版本冲突的时候,是报一个warning让警告用户,还是报一个错误直接退出,要求用户先解决版本冲突呢? 事实上,无论在windows上,还是在linux中,我们都有相应的机制来保证不同版本的library是可以在同一个程序中工作的,在windows上是side-by-side assembly,通过manifest和activation context实现,而在linux下则是通过设置RPAT 阅读全文
posted @ 2012-11-10 11:38 lzprgmr 阅读(1001) 评论(0) 推荐(0) 编辑
摘要: lua发布的代码中,本身提供了makefile用来在多个平台上编译lua,但是针对windows,它提供的是mingw:mingw: $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \ "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe 阅读全文
posted @ 2012-10-28 13:47 lzprgmr 阅读(5144) 评论(0) 推荐(0) 编辑
摘要: 和同事聊起了这个话题,下面是一些思考与问题:【思考】基本套路与Java应该是一致的,也就是Mark - Sweep - Compact:C++中可分为两种类型:一是用户自定义类型;一种是内置的类型。每次分配内存时候,都把内存地址保存到一个hashmap中,key为内存地址,value为false。这是准备工作,然后在某个时间点需要做垃圾回收的时候:寻找以下三种用户自定义类型的对象:全局的;静态的;当前栈上的,把这些对象作为根,然后递归寻找他们所引用的内存(成员), 并在hashmap中把这些内存地址为key的项的值设为true,表示不应回收。(Mark)遍历hashmap,把value为fal 阅读全文
posted @ 2012-10-26 17:10 lzprgmr 阅读(705) 评论(0) 推荐(0) 编辑

黄将军