分类 编程相关 下的文章

Volley是Google于2013年推出的Android网络数据传输框架。用起来非常简单。但是字符编码的问题让人头痛。Volley默认获取Response Headers中Content-Type来转换字符编码。若该值获取不到,则默认ISO-8859-1。问题就在于很多网站都没有设置该值。只能自己改为默认UTF-8。

把收集到的相关资料记录一下:
1)Transmitting Network Data Using Volley
http://developer.android.com/training/volley/index.html

2)Android Volley完全解析
(一),初识Volley的基本用法
http://blog.csdn.net/guolin_blog/article/details/17482095

(二),使用Volley加载网络图片
http://blog.csdn.net/guolin_blog/article/details/17482165

(三),定制自己的Request
http://blog.csdn.net/guolin_blog/article/details/17612763

(四),带你从源码的角度理解Volley
http://blog.csdn.net/guolin_blog/article/details/17656437

使用“搬瓦工”的vps已经接近半年了。期间升级过配置,拥有128m内存“大内存”(真是泪流满面)和2GB硬盘空间。于是把blog和自己的网站都丢上去,抛弃那个又慢又小的虚拟空间。把过程中的问题都记录一下。

域名
第一次绑定域名和IP,走了点弯路。一开始不知道域名提供商不提供DNS服务,要自己找一个。
1)申请DNSPod,国内的免费DNS服务。添加域名,然后针对该域名添加两条A类型的记录,主机分别是“@”和“www”。
2)设置域名的DNS服务器地址为DNSPod的地址:
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
3)剩下就只有等待了。不过不用等多久就开通了。

Nginx
主要是PHP相关的设置:

location ~ \.php(\/.+)?$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock; #用SOCK比较快
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_buffers 8 16k; #避免跳转报502错误
    fastcgi_buffer_size 32k; #避免跳转报502错误
}

后面还要设置HTTPS,用于部署OwnCloud。

PHP和PHP-FPM
这里基本用的是默认配置,后面再考虑优化。

MySQL
前面已经配好了,而且是针对小内存的机器来优化的。

VIM
增加支持显示中文字符。修改 /etc/vim/vimrc 文件,字啊末尾增加如下代码:

set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc

Wordpress迁移Typecho
主要是Wordpress太臃肿了,对于一个几乎只有自己看的Blog来说,不需要那么多东西。于是直接部署Typecho。利用相关的插件,导入Wordpress的数据即可。

大概就这样完成了迁移。后面的计划是部署OwnCloud,用来同步一些小文件。对了部署个私有SVN或者GIT服务器也是不错的。然后就是Laravel框架的学习了。

在128MB内存的VPS上折腾了一下MySQL,把过程总结一下记录下来。

1)配置文件
备份原配置文件,把官方配置样例中最低配置的配置文件复制过来,就可以了。命令如下:

mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
cp /usr/share/doc/mysql-server-5.5/examples/my-small.cnf /etc/mysql/my.cnf

2)禁用InnoDB
禁用InnoDB,为了节省内存。

详细参考:
小内存VPS上MySQL5.5内存优化——禁用Innodb引擎
http://hxs.fd.fj.cn/?action=show&id=48

简单来说,就是修改my.cnf,在[mysqld]下增加以下配置:

default-storage-engine = MyISAM
loose-skip-innodb
innodb=OFF

文中还提到MySQL 5.5,还需要添加以下配置,否则程序会很容易退出的:

loose-innodb-trx = 0
loose-innodb-locks = 0
loose-innodb-lock-waits = 0
loose-innodb-cmp = 0
loose-innodb-cmp-per-index = 0
loose-innodb-cmp-per-index-reset = 0
loose-innodb-cmp-reset = 0
loose-innodb-cmpmem = 0
loose-innodb-cmpmem-reset = 0
loose-innodb-buffer-page = 0
loose-innodb-buffer-page-lru = 0
loose-innodb-buffer-pool-stats = 0

3)设置默认字符集UTF-8
登录MySQL后,用以下命令查看字符集设置:

show variables like ‘character%’;

默认字符集一般是latin1,最简单是修改my.cnf文件
[client]增加:

default-character-set = utf8

[mysqld]增加:

character-set-server = utf8

[mysql]增加:

default-character-set = utf8

4)重启MySQL服务

PS. MySQL的错误日志在 /var/lib/mysql/*.err

使用“搬瓦工”的超级便宜VPS已经快3个月了,除了有时晚饭时间比较卡以外,其它方面都工作良好。于是心里开始发痒,想再利用它做更多的事情。

首先,肯定是升级Micro中最高性能的服务,128MB内存版。用过64MB版后,才深深感受到内存的重要性,而“搬瓦工”的空间就是内存比较少。升级过程很简单,用PayPal花费足够的美刀就OK了。付款后立刻看到效果!第一次感受到128MB原来也可以很爽(记得第一台电脑的内存也有256MB啊)。

然后是重装Shadowsocks服务。就为了以后升级方便,因为一开始是用源码编译安装的。关于Shadowsocks服务,真心推荐shadowsocks-libev,用C写的就是效率高、省内存,小内存主机必备。详细安装教程见:http://shadowsocks.org/en/download/servers.html

简单来说就是加入安装源,再用apt-get install安装。

wget -O- http://shadowsocks.org/debian/1D27208A.gpg | sudo apt-key add -
echo "deb http://shadowsocks.org/debian wheezy main" >> /etc/apt/sources.list
apt-get update
apt-get install shadowsocks

再然后是想学下Laravel这个PHP框架(感觉没CodeIgniter那么容易上手),慢慢来吧。

PS.昨天一个网友说也买了个“搬瓦工”的VPS,但是3个月后开始变得好慢。虽然有点担心,但是起码还有三个月可以玩玩,重点是就算不能用,损失也不会很严重(毕竟我的那个才5.99美刀/年)

某天发现“搬瓦工”的特价优惠,推出4美元/年的VPS!(https://bandwagonhost.com/cart.php)配置如下:
Micro-64
Self-managed
HDD: 1.5 GB
RAM: 64 MB
CPU: 1x Intel Xeon
BW: 100 GB/mo

虽然配置很差,但是比我原来用的国外空间还要便宜!除了内存比较难看以外,其它配置都非常满意,而且这是VPS,不是普通网站空间!最后,经过胖子的试用和帮助付费后,终于入手了属于我自己的VPS!

入手后,第一件事是装上Debian 7 x86_64 minimal,然后是部署现在比较流行的Shadowsocks,解决接上Google的问题。

Shadowsocks服务,选择用shadowsocks-libev,部署起来比Python的版本简单。详细部署过程参考了这个:http://www.lucong.com.cn/lulu/centos-debian-shadowsocks-libev.html
简单总结了一下命令如下:

apt-get install build-essential autoconf libtool libssl-dev gcc -y
apt-get install git -y
git clone https://github.com/madeye/shadowsocks-libev.git
cd shadowsocks-libev 
./configure 
make && make install

运行服务:

nohup /usr/local/bin/ss-server -s IP地址 -p 端口 -k 密码 -m 加密方式 &

设置开机启动

echo "nohup /usr/local/bin/ss-server -s IP地址 -p 端口 -k 密码 -m 加密方式 &" >> /opt/ss_start
echo "ssh /opt/ss_start" >> /etc/rc.local

然后,为了安全起见,新建了一个普通用户来登录ssh。这时才发现没学好Linux。经过一番Google后勉强新建了一个用户,但是登录后发现方向键乱码。按这个 http://bbs.chinaunix.net/thread-1942074-1-1.html 去修改默认的shell后解决。

总结一下吧。首先,深深感受到国外的美好生活,这么便宜的VPS在国内是永远找不到的,更不要提那几百块/月的云服务。其次,Linux的命令需要努力学习。

通过一晚的测试与实验,终于用YUMI,把Android-x86 4.4.2 RC2装到U盘上,并且启动成功。记录一下吧:

1)打开YUMI并选择U盘,Step 2选“Try Unlisted ISO (via SYSLINUX)”,Step 3选ISO文件,如“android-x86-4.4-RC2.iso”。然后就等待YUMI自动处理完成。

2)进入刚弄好的U盘,找到文件 X:\multiboot\android-x86-4.4-RC2\isolinux\isolinux.cfg 并用编辑器打开。修改 kernel 和 initrd 的路径前缀为 /multiboot/android-x86-4.4-RC2 。具体修改后的文件内容如下:

default vesamenu.c32
timeout 600

menu background android-x86.png
menu title Android-x86 Live & Installation CD 4.4-RC2 
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffff00 #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ffffff00 #ff000000
menu color hotkey 7 #ffffff00 #00000000

label livem
    menu label Live CD - ^Run Android-x86 without installation
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet SRC= DATA=

label vesa
    menu label Live CD - ^VESA mode
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet nomodeset vga=788 SRC= DATA=

label debug
    menu label Live CD - ^Debug mode
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 vga=788 DEBUG=2 SRC= DATA=

label install
    menu label Installation - ^Install Android-x86 to harddisk
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 INSTALL=1 DEBUG=

PS. Android-x86项目越来越完善了,非常适合上网本安装。但要注意驱动的问题,特别是无线网卡!

4月中,终于换了个公司,重新投入到软件开发的行业。公司给我配置了个笔记本,Thinkpad E440(等了一个月才拿到手),于是今天装上Lubuntu 14.04。

安装过程比以前的台式机、前两个笔记本,都简单。iso文件用YUMI弄成启动盘,然后就图形化界面中点“下一步”。然而问题总是出现在安装之后的配置过程,比如内核没带该网卡的驱动,自带了很烂的iBUS输入法,任务栏没显示音量控制图标,大量的软件需要重新安装配置等等。直到写本文时,还没弄好。

过程中,突然感慨,好像我就一直在用Linux,都只停留在系统安装和软件设置上,没弄出个像样的东西。例如,昨天同事问我Linux中如何把禁掉的端口打开,我都没想到用iptable处理。

换上第3个笔记本了,希望能继续努力~

折腾RaspberryPi已经一段日子了,期间还因接错GPIO的线而报废了一个。重新入手了英国版后,却没再怎么玩了。

昨天搜索相关资料时,找到一个很简单的关机按钮方法(http://spaceblogs.org/flipdot/2013/06/shut-down-your-raspberry-pi-on-button-press-and-add-reset-function/)就是利用2.0版新增的P5接口,直接连上个开关,实现关机功能。根据该文章,还可以直接在P6上连个按钮,实现重启。

RaspberryPi针脚相关的资料,可以参考:http://elinux.org/RPi_Low-level_peripherals

今晚测试了一下,该方法可行。然后就是折腾了整晚的钻孔……还是入手个小电钻吧。期待明天可以接线。

PS。关机按钮的作用是保护SD卡,以免强制断电关机后,发生数据损坏或丢失的情况~

记得刷上Android 4.0之后,想过为什么系统自带了流量监控功能,还要装个监控流量的软件呢?系统自带的流量控制,最大的缺点是不能把流量统计情况显示在桌面上。于是想做个Widget,直接显示系统统计的流量情况。一直拖到上几个星期,终于开工了。但是,面临着一大堆问题……

首先是API。Android统计流量的API都是系统不开放的,就是带了@hilde的类、属性、方法等。

方案1:直接源码编译。首先想到是把android framework的源码下载下来,重新编译成jar包。问题是,CM提供的源码(http://github.com/CyanogenMod/)可能跟Android SDK的对不上。而采用SDK自带的源码,又不能编译。于是直接否决此方案。

方案2:采用Java的反射(Java Reflection)。比编译源码简单多了,什么类都可以拿来用。但是,要写一堆try catch代码,太麻烦了!

方案3:反编译虚拟机上的jar包,即把已编译成dex的jar还原成JVM的jar。由于虚拟机上的jar已被odex化,所以还要先合并。
1)用smali把odex文件转化为dex文件(smali项目:https://code.google.com/p/smali/)。
2)用dex2jar把dex文件转为class文件(dex2jar项目:https://code.google.com/p/dex2jar/)。
3)把class文件打包,并替换SDK上的platforms/android-17/android.jar文件。
这样就可以只用系统的所有api了。但是有个问题,就是system权限的问题未解决。要获得system权限,必须要获得rom的签名。就是说,只能放到rom里面,不能做成通用的软件。

所以,这个项目就研究到这里,然后无限期的暂停了……

在G1时代,入手了蓝牙耳机之后,就一直想把蓝牙耳机当成无线快门来用。虽然很屌丝,但是很实在的一个功能,特别是当年还一个人到处乱逛。

这几天终于启动这个项目。一开始的想法,肯定是参考一些音乐播放软件,利用BroadcastReceiver接受蓝牙耳机的按键事件,再广播一个Camera按键事件,实现从蓝牙的“播放键”到相机的“快门”的动作转换。但是,静态注册了BroadcastReceiver后,不起作用,怀疑是受其它音乐播放软件的影响,但也查不到原因。

后来灵机一动,想起直接修改Android的按键影射文件,把“播放键”直接改成“快门键”。于是修改 /system/usr/keylayout/AVRCP.kl 文件,把 key 200 MEDIA_PLAY WAKE 中的 MEDIA_PLAY 替换成 CAMERA。连上蓝牙后,测试通过,但还有个问题,就是相机不会先自动对焦后拍照,而是直接就拍照。然后就是写个Shell脚本(主要是sed命令吧)来自动修改影射文件。再然后就是写个app来实现这个功能了。当然,这是后话,希望不会成为屁话……

后面还有个想法,通过老G1来自动拍照,上传到服务器,实现监控功能。好吧~继续努力~