Categories
未分类

用Robolectric来做Android unit testing

作为一只本科非计算机专业的程序猿,手动写单元测试是我从来没接触过的东西,甚至在几个月前,我都不知道单元测试是什么东西。倒不是说没听过这个词,也不是不知道它的大概是什么东西——“用来测试一个方法,或者是一小块代码的测试代码”。然而真正是怎么做的?我并没有一个概念,或者说并没有一个感觉。 记得第一份工作在创新工场的时候,听当时的boss @王明礼 说,公司有个神级的程序员(。。。名字忘了。。。),他会写大量的单元测试,甚至50%以上的代码都是单元测试。当时崇拜之极,却仍然觉得写单元测试是很麻烦的一件事情。 扯远了,话说回来,当你接触多了国外的技术博客,视频之后,你会发现,单元测试甚至TDD,在国外是非常流行的事情。很多人甚至说离开了单元测试,他们便没有办法写代码。这些都让我对单元测试的好感度逐渐的上升。然而,真正让我下定决心,一定要研究一下这个东西的,是前段时间看大名鼎鼎的《重构:改善现有代码的艺术》里面的一段话: I've found that writing good tests greatly speeds my programming, even if I'm not refactoring. This was a surprise for me, and it is counterintuitive for many programmers… –Martin Fowler 《Refactoring: Improving the Design of Existing Code》 是的,你没看错,他说单元测试可以节约时间,提高开发速度!!!身为一个无可救药的懒癌患者,看了这句话简直就像看到了一道神光似的!既然都可以节省时间,那肯定是要看看的啊! 有趣的是,Martin Fowler在《重构》里面说他最初是因为 Dave Thomas说的一句话,让他走上了单元测试的不归路。而我这几天刚好又在看Dave Thomas写的《Programming Ruby 1.9 & 2.0》,也算是个巧合啊! Martin Fowler在《重构》里面还解释了为什么单元测试可以节省时间,大意是我们写程序的时候,其实大部分时间不是花在写代码上面,而是花在debug上面,是花在找出问题到底出在哪上面,而单元测试可以最快的发现你的新代码哪里不work,这样你就可以很快的定位到问题所在,然后给以及时的解决,这也可以在很大程度上防止regression(相信QE和QA们一定很喜欢哈哈。。。),这也是个大部分程序员和测试都很痛恨的问题。 之后不久,就开始花了点时间了解了一下Android里面怎么做unit […]

Categories
未分类

Otto: No More Callbacks

Otto: No more callbacks 你要做一个todo app,有一个Activity里面有一个ListView显示你所有的task,你的数据存储在服务器。假设你没采用任何的软件架构(MVC、MVP、MVVM等等),每次app打开的时候,你从服务器把数据load下来,load完了以后,通过callback把数据传给Activity,然后显示到listview里面。代码结构大概是这个样子 public class TasksActivity extends Activity { private ListView mListView; //… private void loadTasks() { TaskModel model = new TaskModel(); model.setTaskCallback(new TaskCallback() { public void onError(String msg, int code) { // handle error } public void onSucceed(List<Task> tasks) { updateTaskList(tasks); } }); model.loadTasks(); } private void updateTaskList(List<Task> tasks) { //Update […]

Categories
未分类

Regular expression: All you need to know

Regular expressions are nuts. You have spent lots of time studying them and later when you actually need to write one, you come up with nothing. That’s why you need a cheatsheet, like this one. ## Abbreviations used in this post RE for regular expression. /regular_expression_content/ regular_expression_content is the text of a regular expression, The […]

Categories
未分类

博客换回Jekyll,顺带简介一下Jekyll

个人网站开起来有一段时间了,当时目标是每周写一篇文章,不过到现在也没写多少篇哈哈。。 刚开始的时候是用Jekyll来做的,后来觉得不够自由,版式太固定不好扩展。于是又推倒,用Rails自己写了一个,用Jekyll的默认主题作为样式风格,用Redcarpet来做markdown的rendering。这些都很简单,唯一的问题在于,Jekyll的默认主题虽然简洁,但是太简陋了,于是自己试着去改一些布局啊,样式啊,都是CSS的东西。折腾了几次以后,我终于要承认,我并不是一个CSS guy,我并不是非常enjoy这个过程,而且还觉得挺烦人的。所以想想,还是算了,我想写东西,那就专注于写东西吧,样式的东西交给别人去做。 于是乎,又想到了Jekyll,心想像Jekyll这样一个popular的博客引擎,应该有很多很漂亮的主题吧,于是搜了一下,找到了这个,也就是你现在看到的这个,个人感觉这是个非常适合blog的主题,既漂亮,同时也是content focused,于是决定就用这个了。从Rails app搬回Jekyll,最大的遗憾,就是之前的一些评论不能一起搬走,好可惜的感觉! ### 关于Jekyll <!–more–> 稍微介绍一下Jekyll,Jekyll是一个static page generator,应该是如今用的最广泛的吧,因为github pages用的是这个。 Jekyll的工作原理,类似于一个文本转化器,它的原材料是markdown文本,经过它的转换以后,变成了由HTML/CSS/JS组成的静态页面,这些静态页面产生以后,你把他们放到nginx或apache的root directory,就可以通过互联网访问了。是的,没有“后台”!没有数据库!没有动态代码(除非你把前端的JS代码看作“动态代码”)!!!Everything is static, thus everything is simple! 要使用Jekyll也很简单,首先你要有Ruby,要有Gem,然后 gem install jekyll jekyll new my-blog cd my-blog jekyll serve 用浏览器打开localhost:4000,你就可以看到你创建的第一个jekyll博客网站了。以后你要写自己的文章,只需要用markdown编辑器写好,保存为.md文件,然后放到my-blog/_post里面。系统会自动将你在_post下面的文章一个个遍历出来,放在首页。 更多的信息你可以在Jekyll官网看到。 ### 免费托管到github pages 用Jekyll的一个好处是,你可以用github pages来免费托管你的博客,将你的blog目录(如前面的my-blog)关联一个github pages专用的github repo。然后只管git push到repo就好了,简直不要太方便。 具体操作请看这里。 ### 用Disqus来给你的blog加上评论功能 评论是很重要的,每一个写文章的人,除了希望自己写的东西能让别人看到,帮助到别人,还希望能得到读者的支持和鼓励,评论是最重要的一个途径。此外,评论还能让别人指出你文章中的错误,或者与别的读者的交流等等。 现在问题来了,前面提到,Jekyll产生的是静态页面,没有数据库,那么评论怎么保存呢?答案是我们不保存,或者说的更清楚一点,我们不自己保存评论。我们可以用第三方的专业的评论管理工具,来帮助保存,显示评论等等一系列相关功能。我这里选的是国外的Disqus,这是用的最广泛的评论管理服务。使用了以后,发现这里还有一个非常大的好处,那就是你注册一个账号,就可以直接用来评论别人的文章了。我的意思是,比如说,另外一个人也开了一个自己的博客网站,也使用了Disqus,那么你可以直接用你的Disqus账号评论他的文章,再也不用输入所谓的用户名,email等等一系列烦人的东西。 使用Disqus加上评论功能真的是非常非常简单,不信请看这里。 Disqus的简单让我产生了一个很严重的疑问,它是怎么来防伪的呢?我看了它的代码,并没有任何secret key这样的东西。它是怎么防止别人用我的账号来给他的文章加评论呢?或者说,它能不能防止? Anyway,这个东西很好用,就用这个了。 国内有类似的服务,叫“多说”,这个之前Rails版的博客有人评论,我才知道这个东西的,当时我上去看了一下,貌似界面很丑,所以还是冒着会被The Fucking GFW屏蔽的危险,继续使用Disqus。 ### […]

Categories
未分类

从AndroidStudio的启动参数开始,了解一下JVM的一些东西(内存使用,JIT等)

如果你使用AndroidStudio经常觉得很卡,那有可能是因为系统给AS分配的内存不够的原因。打开/Applications/Android Studio.app/Contents/bin/studio.vmoptions (Mac),可以看到有以下配置: -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=96m -XX:+UseCompressedOops 这些参数分别是什么意思呢? ####-Xms128m The -Xms option sets the initial and minimum Java heap size. The Java heap (the “heap”) is the part of the memory where blocks of memory are allocated to objects and freed during garbage collection. 就是JVM启动的起始堆内存,堆内存是分配给对象的内存。这里我把它改成了512m ####-Xmx750m This option sets the maximum Java heap size. […]

Categories
tech 未分类

在Rails app中使用Bootstrap

这篇文章基本上算是对railscast 328: Twitter Bootstrap Basics 的一个学习总结。提供一个step-by-step的guide。同时也加入了一些需要注意的地方,比如说这个video cast是2012年做的,到现在为止无论是rails还是bootstrap都变了很多,在rails里面使用bootstrap的方法也有所不同。 让rails支持LESS Rails使用的CSS precompiler是SASS,而Bootstrap使用的是LESS,因为Rails不支持LESS,所以首先要使用一个第三方的library让Rails支持LESS。 在Gemfile 里面加入 gem ‘less-rails’ gem ‘twitter-bootstrap-rails’ 在这里可以了解到更多关于LESS和SASS的信息。 注意:在railscast里面说的是将gem twitter-bootstrap-rails加入到Gemfile的assets group里面就好了。这里有两个问题,一是rails4里面将assets 这个group 去掉了,二是twitter-bootstrap-rails这个gem不自带less-rails,所以我们要手动添加。 2. 执行bundle install to install the gem。 3. 执行rails g bootstrap:install less –no-coffeescript 这句话的作用是将Bootstrap的一些CSS等文件加入到我们的rails app里面。这个命令的输出如下: 可以看到,这个命令增加了三个文件,修改了两个文件。到此为止,你就可以在rails里面使用Bootstrap的style了。至于怎么样使用Bootstrap把页面变得更漂亮,那就看你的CSS跟Bootstrap技术了。 当然,话说回来,twitter-bootstrap-rails作为一个ruby gem,如果它的作用只是将bootstrap,那也实在是有点弱。其实它还给我们带来了很多使用bootstrap的便利和快捷方法。在这个gem的github官网 可以看到详细的教程。这里介绍一个我试用过的,也是最基本的用法。 rails g bootstrap:themed [RESOURCE_NAME] Resource就是Entity在Rails里面的叫法,类似于一个JavaBean的概念,需要注意的是,这里要用Resource的复数。比如我们创建一个博客文章的评论的entity: rails g scaffold Comment content:string email:string post:references 那么这里的Comment就叫Resource。这时候我们可以使用 rails […]

Categories
未分类

Java 8的Lambda及其在Android 开发中的应用

上次在盆友圈发了一张照片 上面的两段代码是完全等效的,但是代码行数从11行降低到了一行,更不用说在第一段代码里面,我在run方法的前后以及内部都没有加入任何的空行。由此可以看出,使用lambda可以让你的Java代码在某些情况下达到何等的简洁。 那么问题来了。。。 什么叫lambda呢? Java 8 给我们带来了lambda,然而在Oracle的文档中,我没有找到lambda的定义,wikipedia里面也没有找到适合Java中的lambda的定义。写这篇文章的时候,我在这里 看到一篇很好的介绍lambda的文章,它里面给了一个定义,我觉得还挺合适的。 A lambda expression is a block of code with parameters. lambda的写法 首先列举一个完整的lambda expression: (int a, int b) -> { System.out.println(“Performing add operation…”); return a+b; } 一个lambda expression由三部分组成: – 参数:(int a, int b)是这个lambda expression的参数部分,包括参数类型和参数名 – 箭头:-> – 代码块:就是用”{}”包含着的那两句代码。 上面说的是一个完整的lambda表达式,在很多情况下,很多东西是可以省略的。比如说,当系统可以根据context自动推断出参数的类型的时候,参数类型是可以神略的。这样的话就可以写成: (a, b) -> { System.out.println(“Performing add operation…”); return a+b; […]

Categories
未分类

1分钟学会Markdown

发现很多人对markdown都有一种偏见,以为是像HTML一样,是多么复杂的东西。其实markdown真的灰常灰常简单,有多简单呢?简单到看完这篇文章,你就会了。标题说一分钟学会,其实也不夸张,如果你能在一分钟之内看完这篇文章,那么不用一分钟,就会了。 首先介绍一下,markdown是什么东西,他就是在没有任何格式的纯文本的基础上,加上一些特殊的格式(比如粗体,斜体等)的语法。听起来有点像HTML,其实他的工作原理就是将它的一些语法转化成一些HTML tag,只不过使用上比HTML要简单多了。 基本的markdown就8条规则。在日常码字中,这8条规则足以满足95%的需求了。 1. 斜体 如果你想让某些文字变成斜体,只需要用一颗星“*”包围着他们就好了。比如 hello *world*! 将显示成 hello world! 2. 粗体 如果你想让某些文字变成粗体,只需要用两颗星“**”包围着他们就好了。比如 hello **world**! 将显示成 hello world! 3. 链接 [link title](link url) 比如: [个人主页](http://www.chriszou.com) 将显示成 个人主页 注意“]”和“(”之间不能有空格 4. 图片 图片与链接之间的区别是,在前面多了一个”!” ![链接描述](image_url) 将显示image_url所链接到的那个图片,如: ![美国队长](https://images4blogs.oss-cn-hangzhou.aliyuncs.com/images/ca.jpg) 将显示: 5. 标题 如果你想让文字变得粗大,像文章的标题一样,可以在前面加上“#”,如 # 1分钟学会markdown 将显示成: 1分钟学会markdown 需要注意的是,#和后面的文字之间需要有一个空格。 前面一个“#”为一级标题,是最粗最大的。二级标题为两个“#”,以此类推,共6级 6. 列表 列表有三种,分别对应三种语法: A) 有序列表,就是分序号1,2,3,4的: hello world end 需要注意的是,数字序号和后面的文字内容之间需要一个空格。 […]

Categories
未分类

如何学习一样东西

学习一样东西,除了要学习这个东西是什么,是干什么的,还要尽量去理解这个东西是如何work的,此外,更关键的事,要知道这个东西什么时候用,什么时候不能用。这个是很关键的!