ZET Blade 升级Gen1到Gen2

手中的第一部Android机子,ZET 中兴 V880 Orange Blade版本,买来以后就刷了CM ROM7.0.0,因为是非官方ROM,所以还是有部分不能兼容,比如收音机功能一直不能使用,WiFi在待机后,开机后不能自动连接,要使用补丁。后来厂家进行了软件升级,所以就有了Gen1版本和Gen2版本。不同版本号(GEN1、GEN2)的ZTE Blade机型的系统内核引导内存(System RAM)方式不同:

  • GEN1版本的ZTE Blade机型系统内核引导内存到0x02a00000
  • GEN2版本的ZTE Blade机型系统内核引导内存到0×02600000

所以GEN1与GEN2版本相关机型的系统ROM固件、ClockworkMod Recovery恢复模式等一些涉及系统内核的内容不能共用。如果强行刷机,将会造成不可挽救的错误。如何查看是Gen1还是Gen2版本,可以下载Ask Mr Pigfish或者在Google Play Store(Android Market)搜索Ask Mr Pigfish下载安装。
Continue reading

常用的Android软件

即上次手机被偷后已经有一年多了,去年淘宝代购了中兴V880 Orange Blade版本,1480元。芯片是高通MSM7227,和国内的比是内存和ROM都是512M,摄像头的像素为320万。英国邮寄,国产的绕了一圈又回来了,这真是个神奇的国度。这是我第一个Android手机。拿回来后刷了CM的ROM。这个ROM做的还是比较好的,界面很整洁。只是一开始的时候收音机功能不能使用,不过现在已经解决。一开始也不知道哪些软件好用,看着别人的推荐,摸索着往前走,使用了一段时间后,形成了自己的偏好软件,主要如下:

  • Advanced TaskManager: Task工具 开机启动 死机帮手
  • AirDroid:通过网络可以直接访问修改手机中的文件
  • Alarm Clock Xtreme:足够响
  • Aldiko Reader:Android下PDF阅读器,界面很清新。
  • Alipay:偶尔网上付钱失败会用到
  • Android Market Enabler:不解释
  • Barcode Scanner:简洁的二维码和条形码扫描器
  • BOC Currency Widget:中国银行外汇牌价
  • DopoolTV:没事的时候看看电视
  • DoubanFM:豆瓣电台
  • eTraning:sportal 的新版本 记录行车GPS路线
  • Evernote: 笔记
  • InstaFetch Lite:Android下最好的Instapaper客户端
  • Mini Fetion:比官方飞信好用
  • NetEase News:网易新闻
  • QC 归属地插件:来电显示地名
  • Qiyi Video:奇艺影视
  • RockPlayer lite:Android上最好用的全能播放器
  • SMS Buckup@Restore :短信备份
  • SouhuTV:搜狐视频,聊甚于无
  • Talking Tom 2:小孩子的好玩具
  • TouchPal Input:触宝输入法
  • Traffic Monitor:Android上流量管理软件
  • TuneinRadio:非常好用的广播聚合
  • Weibo: 新浪微博客户端
  • Weixin:现在很少用了和手机QQ功能模糊
  • 手机QQ:不解释
  • 下厨房:好男人的特征
  • 全国影讯:查看电影播放很有用
  • 墨迹天气:天气插件
  • 挖财:最近才开始用 好男人的特征
  • 金山词霸:手机版,很多人用有道
  • 拓词:手机上背单词
  • 美团:抽奖网站

Shell脚本实现自动备份VPS数据到Dropbox

由于买的是廉价的VPS,所以备份是十分重要的,不然辛辛苦苦写的东西,一下子就没有了,是十分痛心的。一说到备份,Dropbox是一个好的选择,这篇文章则讲了在VPS安装Dropbox Cli客户端来实现VPS的自动备份。但是Dropbox会占用一部分的内存,对于“惜内存如金”的小内存VPS,显然是不合适的。而且从文章来看配置也非常的麻烦。幸好有人写出了利用Dropbox API和CURL的脚本DropboxUploader,轻轻松松的解决了问题,基本不占什么内存。以下脚本就是参考了Dropbox Uploader的脚本,该脚本来自这儿,我稍微改动了一下,将数据库也一并打包入备份的包,使得本地也只有一个包,便于操作。

#!/bin/bash
DROPBOX_USER="your_dropbox_user_name"
DROPBOX_PASS="your_dropbox-password" 
DROPBOX_DIR="/backups" 
BACKUP_SRC="/srv/www/samnew.net /etc/nginx "
BACKUP_DST="/root/backup" 
MYSQL_SERVER="127.0.0.1"
MYSQL_USER="your_mysql_user_name" 
MYSQL_PASS="your_mysql_password" 
#
# Stop editing here.
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"
 
#
# Upload a file to Dropbox.
# $1 = Source file
# $2 = Destination file.
function dropboxUpload
  {
#
# Code based on DropBox Uploader 0.6 from http://www.andreafabrizi.it/?dropbox_uploader
	LOGIN_URL="https://www.dropbox.com/login"
	HOME_URL="https://www.dropbox.com/home"
	UPLOAD_URL="https://dl-web.dropbox.com/upload"
	COOKIE_FILE="/tmp/du_cookie_$RANDOM"
	RESPONSE_FILE="/tmp/du_resp_$RANDOM"
 
	UPLOAD_FILE=$1
	DEST_FOLDER=$2
 
	# Login
    echo -ne " > Logging in..."
	curl -s -i -c $COOKIE_FILE -o $RESPONSE_FILE --data "login_email=$DROPBOX_USER&login_password=$DROPBOX_PASS&t=$TOKEN" "$LOGIN_URL"
    grep "location: /home" $RESPONSE_FILE > /dev/null
 
		if [ $? -ne 0 ]; then
			echo -e " Failed!"
				rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
				exit 1
		else
				echo -e " OK"
		fi
	# Load home page
	echo -ne " > Loading Home..."
	curl -s -i -b "$COOKIE_FILE" -o "$RESPONSE_FILE" "$HOME_URL" 
		if [ $? -ne 0 ]; then
			echo -e " Failed!"
				rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
				exit 1
		else
            echo -e " OK"
		fi
 
        # Get token
        TOKEN=$(cat "$RESPONSE_FILE" | tr -d '\n' | sed 's/.*<form action="https:\/\/dl-web.dropbox.com\/upload"[^>]*>\s*<input type="hidden" name="t" value="\([a-z 0-9]*\)".*/\1/')
 
       # Upload file
		echo -ne " > Uploading '$UPLOAD_FILE' to 'DROPBOX$DEST_FOLDER/'..."
		curl -s -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DEST_FOLDER" -F "t=$TOKEN" -F "file=@$UPLOAD_FILE"  "$UPLOAD_URL"
	    grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null
 
	    if [ $? -ne 0 ]; then
	        echo -e " Failed!"
	                rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
	        exit 1
	    else
	        echo -e " OK"
	                rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
	    fi
	}
 
# Backup files.
echo "Dumping databases..."
DATABASE_BAK="$BACKUP_DST/$NOW-Databases.sql"
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p $MYSQL_PASS --all-databases > "$DATABASE_BAK"
 
echo "Packing files..."
tar czf "$DESTFILE" "$DATABASE_BAK" $BACKUP_SRC
dropboxUpload "$DESTFILE" "$DROPBOX_DIR"
 
echo "Cleaning the backups..."
rm -f "$DATABASE_BAK"
find $BACKUP_DST -mtime +7 -delete

将脚本用SCP传送到VPS,并且设定为cron任务,让其自动备份.用crontab -e来编辑,crontab -l来显示所建立的计划任务.如添加为每周日早上5点钟备份则为0 5 * * 0 /bin/bash /root/DropboxBackup.sh,该脚本已经运行2个月,基本正常。

可以改进之处:可以通过RSYNC来实现增量备份。

参考资料:
[1]: 在VPS中安装Dropbox实现网站的实时备份[转]
[2]: 利用Shell脚本实现自动备份VPS数据到Dropbox

VPS架设之Nginx-PHP-fpm

原来的Bluehost.com空间到期了,虽然空间挺好,用的挺顺,但是对于光光做个自己的Blog,记录记录自己的心沥路程并且一天也没几个PV的小站来说,续费有点小贵,已经超过了我对性价比的要求。再则,2011年的计划之一就是有一个自己的VPS,于是成功购买VPS并迁移到新主机。

出于我的价值观,我选择了最基础的VPS,分别购买了:
Alienvps.com的Xen VPS:1CPU,192MB,9G:$29.00 USD/yr
CheapVPS的OpenVZ VPS:1CPU,192MB:$15.00 USD/yr
BuyVM的OpenVZ VPS:1CPU,128MB/256MB,15GB:$15.00 USD/yr

从理论上来说Xen VPS不易Oversell(超售),而且可以做Swap 性能应该相对于OpenVZ的VPS应该会好点,并且支持VPN中的PPTP,而后者只支持OpenVPN(有的通过技术也支持PPTP,如上文的BuyVM VPS),PPTP对于Windoze用户来说设置上比较方便。但是经过我这么用下来之后,由于OpenVZ VPS可用内存虽然都标称只有192MB或者更小,但是他有BrustRAM,所以实际可用内存通常会更大一点达到256MB或者512MB,而Xen VPS虽然可以设置文件Swap,但是利用率不高,通常先榨干了物理内存,然后才用到Swap,即使设置过后也差不多,无论做多少性能优化,内存太小什么活也干不成,所以至少在小内存的比较上,我觉得Xen VPS是发挥不出他的优势的。三者VPS,最后我选择了BuyVM VPS,三者之中磁盘的读写速度是最快的,这估计也是BuyVM有这么多的粉丝,一上线就被抢光常年Out of Stock的原因吧。
Continue reading

回顾2011展望2012

现在是公元2011年12月31日,是2011年的最后一天,明天即将迎来的是2012年,科幻的一年。

根据以往的习惯,做一个回顾,来提醒自己不要虚度光阴。

下面列出来的是我2011年所要做的事(在2010年的总结里有计划过):

  1. 首先完成对博客的搬迁工作,空间已经到期,要搬到bluehost上,以后可以尝试VPS。
  2. 继续保持博客的写作,每月要发表有质量的技术短文2篇以上。
  3. 继续学习PHP,做到多实践,起码要读懂一个框架。
  4. 尝试开发一个PHP网站,如进存销系统。
  5. 学习手机编程,今后的技术方向也可以向手机开发上靠。
  6. 继续不断地完善wiki
  7. 无论怎么样都要把blog的theme的做一个出来
  8. 继续保持阅读,一年起码要24本以上,包括技术书籍。
  9. 买一部Andriod手机。
  10. 买一辆山地车,上下班骑。

Continue reading