随笔分类 -  Programming

Enjoy programming.
摘要:死锁示例 如果你开发一个简单的Windows Form程序,点击Button去使用async异步获取一个数据,然后显示在Label上,类似这样的代码 private void button1_Click(object sender, EventArgs e) { var task = GetCont 阅读全文
posted @ 2020-02-27 13:38 Jerry Chou 阅读(1234) 评论(0) 推荐(1) 编辑
摘要:一直对协程(coroutine)的概念不很很懂,看了Wiki中关于Coroutine的条目心里有点而谱了,至少知道协程是什么了。 通常我们的子例程,比如我们编程语言中的常用的函数,只有一个入口点(Entry Point),那就是你调用这个函数时执行第一行代码,出口点有可能有多个,比如正常执行完最后一行代码,再比如使用return语言在任意一点退出函数。而数据的交换通过参数和返回值来实现。并且这个... 阅读全文
posted @ 2015-01-01 17:53 Jerry Chou 阅读(637) 评论(0) 推荐(1) 编辑
摘要:术 最近在带几个兄弟完成互联网项目,我是中途才加入的,其实他们开始的时候已七七八八完成的差不多了,前端的小伙临时起意拍拍屁股走人了。我觉得可惜,决定尝试去带他们产出一个好的结果。项目管理这样的事,难的就是相信项目可以成,并且按照心中所设想的按部就班的完成一个个小任务。考验项目的成败的往往是心力,而不是能力。在团队遇到困难,迷茫的时候,你是否依然坚定。这个坚定来自于两方面: 首先,你相信,并且知... 阅读全文
posted @ 2014-09-08 22:59 Jerry Chou 阅读(479) 评论(0) 推荐(0) 编辑
摘要:最近在看DSL的东西,对于外部DSL,写一个解释器是必不可少的。我试图归纳一下我学到的,以写一个解释器为目标,讲一下如果来实现一个可用的解释器。一个解释器通常可以分为一下几个阶段: 词法分析(Lexer) 语法分析(Parser, BNF, CFG, AST) 语义分析(AST的处理, annotated AST) 目标语言生成(stack-based) 这里... 阅读全文
posted @ 2014-04-28 16:22 Jerry Chou 阅读(2606) 评论(0) 推荐(0) 编辑
摘要:两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客:理解JavaScript中原型继承JavaScript中的原型继承这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承,更重要的是站在一个继... 阅读全文
posted @ 2014-04-21 14:23 Jerry Chou 阅读(628) 评论(0) 推荐(0) 编辑
摘要:可能是移动应用的广泛普及,为了安全性的考虑现在的移动应用大都运行在一个沙箱中,无论是有系统支持的运行时沙箱还是逻辑上的沙箱。比如现在的应用大多数只能写自己的安装目录,从而将自己的运行环境和其他应用的运行环境隔绝开来。 早些时候我写过nodejs和git的库和配置文件可以选择安装位置,比如 global, system, local等。这是一个进步,他改变了我们对配置文件存放位置的思考。同时现在的... 阅读全文
posted @ 2014-01-03 14:20 Jerry Chou 阅读(757) 评论(0) 推荐(0) 编辑
摘要:Go摒弃了许多OO的概念,但是还是很好的继承了OO的精髓——消息传递。我猜这个是学了Smalltalk的。通常我们说OO,我们会说这三大特性:对象,继承,多态。1,Go中的对象对于GO来说他的类型系统也分为两类:value type和reference type。value type就是内存中的内容,reference其实也是类似引用地址的指针。这样Go中的对象很自然的分为两类的:内容和引用内容的地址。Go的一个哲学就是让“天下没有隐晦的东西”。所以Go的对象在内存中的表示和其定义是一一对应的。有点“what you see is what you get”的感觉。而在Go中,实现对象特征的是 阅读全文
posted @ 2013-08-21 14:24 Jerry Chou 阅读(3641) 评论(1) 推荐(1) 编辑
摘要:刚才看到一篇文章《21 nested callbacks》,作者吐槽了一下当时他学编程时的一个趣事:为了写一个HTML的动画,他写了有21层嵌套的函数。由于作者主要是抒情,所以这样的英文很不好阅读。我就把他最重要的思想提取出来。1,最初的实现,朴素的实现其实这个小哥就是想把20个div依次展现在用户的眼前。他用了JQuery库的animate函数,这个函数接受一个回调,当动画完成时这个回调函数被执行。小哥最初的想法很朴素,那就是,当第一个div被显示出来的时候,传入回调函数来显示第二个div,代码类似于:$(".disappear").click(function(){ $ 阅读全文
posted @ 2013-03-28 09:58 Jerry Chou 阅读(2237) 评论(1) 推荐(1) 编辑
摘要:微软系的工具以集成化著称,自动化构建一般也是基于Visual Studio或者它的插件。除此之外可能就是NAnt——Java中Ant的.NET版,很多开源的项目就是用NAnt来实现自动化构建的。我个人最不喜欢Ant的是他是基于XML的,我现在对XML有着本能的反感,他不符合DRY。XML中重复又没有意义的标签太多了,前几年对XML的替代可能是YAML,但是近几年随着Web开发的普及,JSON成了替代XML的不二选择,很多语言的标准库都有JSON的parser,这进一步推动了JSON这种数据交换格式的普及。Albacore是基于Ruby Rake的自动化构建工具,它语法和Rake保存一致,直接使 阅读全文
posted @ 2013-01-18 12:14 Jerry Chou 阅读(1697) 评论(1) 推荐(3) 编辑
摘要:《Structure and Interpreter of Computer Program》中第1章习题1.3说到:练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。其实这一段的中文版翻译错了,其实原版是说求最大两个数的平方和。但是意思是一样的。为了这个简单的问题我也思考了挺长时间,就是得不到让我满意的解。三个数如何知道其中的两个较大的?其中的一个办法就是两两比较。但是这样做比较啰嗦,至少要比较三次。特别是用Scheme的写法。而且你最好还要定义变量,去保存中间判断结果。洗碗时我想到一个解法:先求出最小的那个,然后用(x y z)之和去减去最小的那个值。代码:(defin 阅读全文
posted @ 2013-01-06 15:11 Jerry Chou 阅读(495) 评论(0) 推荐(0) 编辑
摘要:1,特点 1,强制Model和View的分离,也就是View负责呈现,不能修改Model。同时View中不用来包括任何业务逻辑,详见作者的论文(中文,英文)。 2,Lazy-Evaluation,所有的Attribute直到st.ToString()调用时才evaluate.这样的好处是setAttribute是Order Independent。 3,Recursive enable。 ... 阅读全文
posted @ 2012-12-12 16:38 Jerry Chou 阅读(7401) 评论(1) 推荐(0) 编辑
摘要:Meta Programming,元编程。我们通常是指那些编写程序的程序,也就是Paul Granham说过的类似这样的话:Programmer can write a program which write program for programmer.根据(程序)编写程序的时间点不同,我们可以将元编程分为:1,编译时元编程编译时元编程是指在编译时(compile-time)完成编写或修改程序的工作。像一些宏,代码生成器,C++中的模板技术都是属于编译时元编程。2,运行时元编程运行时(runtime)元编程是指在程序运行时根据需要生成,修改和执行代码。通常动态语言拥有这种能力。拥有这种能力的 阅读全文
posted @ 2012-10-14 23:14 Jerry Chou 阅读(1486) 评论(0) 推荐(0) 编辑
摘要:1,缘起 有的我们拿到一个文件,通常是我们不太清楚的文件,比如你拿到了一个朋友传给你的源代码,如果你可以一眼看出这个源代码的目录结构那该有多好啊。 我以前的做法是: $ls –R 但是这样看不出目录结构的层级,我们是否可以自己写一个类似pstree的工具来完成这个任务? 当然可以,比如我们想看GNU coreutils源代码目录结构: ~/repo/coreutils$ lst... 阅读全文
posted @ 2012-06-04 14:09 Jerry Chou 阅读(570) 评论(0) 推荐(0) 编辑
摘要:Ant是基于Java的自动化构建工具,它依赖于JDK,所以在使用Ant前先要安装JDK,并将JAVA_HOME和PATH环境变量指向JDK,比如在Windows下,环境变量看起来是这个样子的: JAVA_HOME = C:\Program Files\Java\jdk1.6.0_31 PTAH = %JAVA_HOME%\bin; Ant在使用和概念上很像GNU make,不过是... 阅读全文
posted @ 2012-05-28 10:55 Jerry Chou 阅读(739) 评论(0) 推荐(0) 编辑
摘要:想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以将函数复制给变量将函数当做参数返回一个函数函数在Python中给变量的用法一样也是一等公民,也就是高阶函数(High Order Function)。所有的魔法都是由此而来。1,起源我们想在函数login中输出调试信息,我们可以这样做def login(): print('in login')def printdebug(func): print('enter the login') func() print('exit the login')printd 阅读全文
posted @ 2012-05-23 17:56 Jerry Chou 阅读(27921) 评论(3) 推荐(9) 编辑
摘要:1,目录处理 >>> os.getcwd() #current working directory'/home/jerry'>>> os.path.realpath("/home/jerry/GitHub") #如果是symbolic link就找到真实文件'/home/jerry/GitHub'>>> os.path.relpath("/home/jerry/GitHub") ... 阅读全文
posted @ 2012-05-22 14:43 Jerry Chou 阅读(974) 评论(0) 推荐(0) 编辑
摘要:1,什么是跨域? 要说跨域先说说“同源策略(same origin policy)”,同源策略是指网页上的脚本只能访问只能访问跟自己同源(host+protocol+port)的网页属性和方法。比如你在你的index.html中用iframe加载了http://www.google.com/index.html,那么http://www.google.com/index.html上的脚本就这能操... 阅读全文
posted @ 2012-05-09 16:50 Jerry Chou 阅读(513) 评论(0) 推荐(0) 编辑
摘要:数据模型概念 - Tables, Items, and Attributes DynamoDB数据库有表(tables),数据项(items)和属性(attributes)构成。一个数据库有若干张tables,一张表有若干items,每个数据项有若干attributes。 在关系型数据库中,一张tables有columns组成。每个records都有相同的属性。然而DynamoDB是NoSQL... 阅读全文
posted @ 2012-04-26 11:13 Jerry Chou 阅读(4962) 评论(0) 推荐(0) 编辑
摘要:在看一些框架的时候,比如Tornado,在实现层面有的时候会提到non-blocking。有的框架会说使用async的技术。那么究竟non-blocking与async有没有什么区别呢? 下面是我的理解: 1,很多时候没有区别。当我们再谈论异步和非阻塞的时候,我们通常是指一个API调用需要多久,会不会因此而影响性能,让调用方等待。比如,我们在Window编程的时候,如果我们的UI线程做一些费时... 阅读全文
posted @ 2012-04-23 10:13 Jerry Chou 阅读(1326) 评论(0) 推荐(0) 编辑
摘要:基本在Windows下的录像程序在底层都是使用了Microsoft的DirectShow接口,对于DirectShow有一个.net的wrapper,称作DirectShowLib。但是封装地并不充分,换个角度说你还是需要知道DirectShow的API然后才能编写摄像头程序,有没有封装地更好地呢,当然有的:).我们可以使用AForge的封装在30分钟左右写出一个摄像程序。下面是关键代码:VideoFileWriter writer = new VideoFileWriter();VideoCaptureDevice videoSource = null;System.Diagnostics. 阅读全文
posted @ 2012-03-30 13:59 Jerry Chou 阅读(2151) 评论(6) 推荐(0) 编辑