apache2/php/mysql/phpmyadmin部分配置

想在老服务上部署wecenter,结果总是报错,缺了好几个模块;

结果把那几个模块安装了,apache又起不来了;重装apache,配置又都变了;所幸是mysql数据库的数据没挂!

apache2的配置现在和以前不一样了,可以说是简化了,多域名都在/etc/apache2/sites-available/000-default.conf配置!

配好了,发现phpmyadmin又神经的不能用了,缺mcrypt扩展! 还好找到这个小神的文章(http://my.oschina.net/u/727594/blog/193862?p=1)搞定!

 

总之,现网的服务器少动的好!!

发现越来越不愿意折腾啦~~~

从0开始学Android

有个小孩想学Android,没有Java背景,基本没编程经验。这是一个简单的2+2+2方案:

1.  2个学习网站

超经典的入门教程: https://code.google.com/p/androidbmi/wiki/DiveIntoAndroid
权威的教程(英文好一点其实这就足够了): http://developer.android.com/training/index.html

2. 2本参考书

Java2参考大全(第五版)(高清晰文字版)(Herbert.pdf)

Android应用开发入门教程(经典版).pdf

3. 2个论坛

 http://www.apkbus.com/
http://www.eoeandroid.com/

Java里byte和int对比问题

蓝牙或者串口读数据一般用byte数组,数据协议如果这样写 0xa5 0xaa, 新人往往会犯这样的错误:

(1)if(buffer[0] == 0xa5 && buffer[1] == 0xaa)…

(2)int value =  buffer[0] ;

结果却不尽人意,为什么呢?

有时候会这么改,

if((int)buffer[0] == 0xa5 && buffer[1] == 0xaa)…,怎么还不对呢?

其实应该这么改:

(1)if(buffer[0] == (byte)0xa5 && buffer[1] == (byte)0xaa)…

(2)int value = buffer[0] >0?buffer[0]:(buffer[0]+256);

为什么呢?

(1)对比的时候,0xa5实际上是int类型,它的值是165,超过了byte的范围;而buffer[0]在计算机中会做一个int转byte的计算,因为字节不同,就变成了负数-91了。

前面增加(int)就相当于(int)(-91),无济于事;

(2)协议里面往往是0~255,,而Java里面却是-127~127,所以负数往往都是错误啦!

 

 

AndroidStudio一些内存设置

AndroidStudio是越用越依赖了,再也无法回去用Eclipse了。

有时候AndroidStudio会抱一些内存错误,比如“outofmemory”,比如“unable create VM”啊,一般是内存设置太大或者太小了。

简单的配置如下:

1. 修改VM的大小:  安装目录下找到“studio64.exe.vmoptions”文件,然后将前面的值增大下,比如:

-Xms512m
-Xmx1500m

修改完后,打开AndroidStudio就可以看到右下角内存大啦;

2. 修改Setting -》compiler-》Android DX Compiler

这里面的大小平时可以降低,避免创建虚拟机失败。

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

        }

理解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的实现;