Float/Double的一些新手陷阱

  1. Float和Double混用:

    比如下面的代码:要么都转化为float(2.8f),要么都转换为double:

        float f1 = 2.8f;

        if(f1 == 2.8){

            //do something

        }

  1. Float或者Double的计算:

    比如下面的代码:应该转换为long/int进行计算,根据小数点的位数决定乘以多大的数;

        double d1 = 2.8;

        double d2 = 1.8;

        if((d1-d2) == 1){

            //do something;

        }

比如:

        double d1 = 2.8;

        double d2 = 1.8;

        if((Math.round(d1*100)-Math.round(d2*100)) == (1*100)){

            //do something

        }

  1. 比较的精度问题:

    比如下面的代码:超出范围后,比较是错误的;用BigDecimal可以增加精度;

        double d1 = 2.8000000000000001;

        double d2 = 2.8000000000000002;

        if(d2>d1){

            //do something

        }

修改如下:

        BigDecimal bd1 = new BigDecimal(“2.800000000000000001”);

        BigDecimal bd2 = new BigDecimal(“2.800000000000000002”);        

        if(bd1.compareTo(bd2) == -1){

            //do something

        }

我对大脑与梦境的理解

梦境是潜意识的表现,也就是大脑潜能的一个缩影:

  • 有时候会梦见某些人,他们的言行举止简直就是现实一样,但是不做梦的时候你说不上来;
  • 有时候会梦见自己有超级口才,不但中文对答如流,而且英文毫无障碍,很多现实根本就想不起来的单词/句子滚滚而来;
  • 有时候会自编自导电影;
  • 有时候会有创意迸发;

人类的大脑是一个超级计算机,比当前任何超级计算机都要快。大脑主要做存储和逻辑判断,能够高速记录大部分的接收到的信息,但是对绝大部分人来说,他不知道存储在什么地方,只要偶尔在做梦时才能被随机取出来;只有非常少数的人能够对这部分记忆进行自主的存取,这就是“过目不忘”。

大部分人的大脑存储能力开发的都极少,表现为记忆力一般;

而体现智商的是逻辑判断力,存储一样的东西,但判断出来可能截然不同,判断速度也截然不同。做梦的时候,大脑就是一个超超级计算机,运算速度比现实要快得多,所以能够迸发很奇妙的场景。

那么如何挖掘自身大脑的潜能,提高自己的智商呢?鄙人不才,这是我想到的一些蠢法:

  1. 1. 多接触新鲜空气,永远保持轻松的头脑;
  2. 2. 接收有序的有用的东西,拒绝杂乱错误信息;
  3. 3. 多用图,少用文字;多看图,少看字;就像我这篇文章,用图形表现就非常简单;
  4. 4. 简单化一切事情;
  5. 5. 专注;
  6. 6. 少用脑子多记录:我是这样理解的,如果想刻意记住某些东西,就像不断的动用CPU去读取某块随机的内存,相当的浪费POWER,效率低下;还不如只记录索引,要用的时候才搜索。

理解Android的Service

Google做的东西,理解起来其实都是比较明了的,所以Androidservice机制在GoogleAPI中并没有写的很多,用中文的“服务”去理解还是相当的准确的,就是用来提供“后台、数据服务”的东东。

很狗血的问题“ServiceThread有什么区别”,其实根本就没有可比性。Service是一种实现机制,而Thread是实现Service某些功能的办法。Service是相对Activity来说的,应该没有人会问“ActivityThread有什么区别”吧。

什么时候会用到Service

1. 后台数据的采集、同步,需要常驻后台时;

2. 相对独立的功能模块,用于提供某种数据服务或者其他无界面的功能服务(比如声音),供Activity使用;

3. 需要执行“有保障”的事情时,相当Activity的Thread来说,Service的Thread会有保障的多!

Service需要了解哪些东西?

1. Local Service/ Remote Service

2. Foreground Service / Background Service

3. Start Service / Bind Service

推荐参考:Android 中的 Service 全面总结

温湿度自动发布系统

Demo: http://www.yeelink.net/devices/3836

这个系统非常简单,一个温湿度传感器(DTH11),一个Arduino主控板(UNO),一个联网的主机(Win7);

55

主机和Arduino可以通过串口或者蓝牙串口连接,主机使用Python脚本发送数据到Yeelink免费云server

Arduino代码: Github

Python脚本: Github

如果使用带wifiArduino主控板,可以直接使用yeelinkArduino SDK; 

如果只上传一个数据,比如只有一个温度,可以直接使用Yeelink的串口工具。

地址:https://github.com/dapingliu

Android的定时器

这篇主要是接上篇“多线程”,因为定时器只能用于多线程中。

Android实现定时器有这些方式:

1. 标准的Java类Timer+TimerTask+Handler; 而Android推荐使用ScheduledThreadPoolExecutor替代TimerTask,

API上写到:

When this thread is busy running a task, runnable tasks may be subject to delays.

This class does not offer guarantees about the real-time nature of task scheduling.

 

2. 简单化的Handler+Runnable,通过Handler.postDelayed实现;这个和Timer应该是相同的问题。

 

3. Thread+Handler方式,通过Thread.sleep来实现。

不推荐使用,因为这种方式最不靠谱,API文档上说:

The precision is not guaranteed – the Thread may sleep more or less than requested.

 

4. Alarm+Receiver方式,用于做长时间的timer。

Timer使用要注意,任何时候使用时都要考虑用户取消这个timer的实现;

Android多线程的理解

Android开发中,多线程用的非常普遍,比如异步加载、定时处理。常用的方式有Thread+Handler方式,Runnable+Handler方式,AsyncTask方式等。

Thread+Handler方式是最Java的模式,也是大部分GUI软件架构的处理方式。所有的对象其实都有一个Handler,处理消息的收发,底层OS(?)处理消息的队列,包括默认的线程和消息优先级处理。另外,Handler应该也是一个特殊的线程。在Android里面,所有的OnXXX都是回调函数,其实也是这种模式,Activity接收系统的消息,然后调用这些回调进行处理。(Android源码不得不看啊!)

对于开发者,只需要新建一个自己的Handler,然后将Handler引用给需要的Thread就行啦。因此用这种模式应该可以解决所有的多线程任务。

 

Runnable+Handler方式是上面模式的一个简化封装版,RunnableThread的简化版,只实现了run接口;这边的Handler一般也只是一个最基本的Handler,并不需要去写消息处理。通过Handler可以很容易实现延时处理任务、Cancel延时任务。

类似的还有Timer+TimerTask,RunOnUIThread等;

 

AsyncTask是最Android的模式,它是用Android模式来封装Thread+Handler模式。只要在UI线程新建一个它的子类,实现几个OnXXX回调方法,就可以实现多线程处理了。

 

从使用来说,我觉得基本原则应该是尽量使用AsynTask,毕竟是Android封装的,代码容易看懂;能用Runnable就不用Thread,简化代码;而对于复杂的、线程较多的、需要长时间运行或者在后台长保的得用Thread

更高级的,应该是使用线程池了。

使用禅道做项目管理

和大牌的项目管理软件Jira/redMine相比,禅道要简单的多,不需要收费,也不需要安装配置一堆插件,项目管理的思路也和小团队的敏捷开发比较接近,所以决定试用一番,如果好的话可以升级到专业版;如果不好的话就及时换掉,保存一份Excel的项目清单。

大体流程是这样的: 管理员是超级用户,什么都能干;产品经理次之;然后是项目经理、研发。

1. 管理员帐号创建组织人员,包括产品经理、项目经理、开发、测试等;

2. 产品经理添加产品、需求;

3.管理员增加项目(在敏捷中为sprint);

4. 产品经理关联项目需求;

5. 项目经理分配任务;

6. 大家开始执行任务。

坑爹的是,我既是管理员,又是产品经理,还是项目经理,更是开发,得建4个账户!

Gitolite无法新加用户的解决方案

上次写到在Ubuntu上通过gitolite创建git服务器(这里),刚开始没遇到啥问题,后来来了一些新员工,发现后面新加的key都用不了!

折腾了许久,Google了很多文章后,终于解决了这个问题。

1. 如何查看用户是否添加成功?

用户的添加步骤是,用户自己通过ssh-keygen -t rsa 方式生成key对,然后把公钥通过username.pub发给你(管理员);你给他通过git上传到gitolite-admin\keydir文件夹中。

commit后,你可以在ubuntu上的/home/git/.gitolite/keydir中看到新添加的公钥;如果正常,通过git用户登陆,可以在/home/git/.ssh/authorized_keys看到鉴权通过的用户。

如果失败,就是这个文件里没有你新加的用户!

2.为啥失败呢?

这是gitolite的一个已知的bug!看到很多文章写了不同的解决方案,不过这边就写一个我这边验证可行的方案,升级gitolite。

升级的步骤和安装一样,先clone代码,然后install&setup。另外需要注意的是,用puttygen生成的key对gitolite不认,必须使用ssh-keygen去生成key对。