在Ubuntu下编译CyanogenMod7

经常要从CM7源代码构建ROM,于是以Atrix4G为例写了这个脚本,实现自动编译新版CM7。
当然,脚本可能还有一些不完善的地方,欢迎大家提出来。

#!/bin/sh
#
# 编译环境 Ubuntu Desktop 11.10
# 参考文献 http://www.rehiy.com/post/261
# http://developer.android.com/sdk/installing.html
# http://source.android.com/source/initializing.html
# http://wiki.cyanogenmod.com/wiki/Motorola_Droid:_Compile_CyanogenMod_%28Linux%29
#

sudo su -
ulimit -S -n 1024

# 设定工作目录
export WORK=/media/workspace
export PATH=$PATH:$WORK/bin
mkdir -p $WORK/CyanogenMod
mkdir -p $WORK/bin

# 安装必要的软件包
apt-get install git-core zip curl gnupg flex bison \
  gperf pngcrush schedtool build-essential squashfs-tools \
  libsdl1.2-dev libesd0-dev libwxgtk2.6-dev libncurses5-dev zlib1g-dev

# 安装其他软件包
if [ $(getconf LONG_BIT) == 64 ]; then
  apt-get install lib32z1-dev lib32ncurses5-dev lib32readline5-dev g++-multilib
fi

# 安装java-sdk
apt-get install openjdk-6-jdk

# 安装android-sdk
cd $WORK/
wget http://dl.google.com/android/android-sdk_r14-linux.tgz
tar xvf android-sdk_r14-linux.tgz && rm android-sdk_r14-linux.tgz

# 手动选择并安装platform-tools
$WORK/android-sdk-linux/tools/android
export PATH=$PATH:$WORK/android-sdk-linux/platform-tools

# 安装repo工具
cd $WORK/bin/
wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
chmod 0755 repo

# 同步CM7源码
cd $WORK/source/
repo init -u git://github.com/source/android.git -b gingerbread
repo sync -j16

# 把编译选项-m64改成-m32
cd $WORK/source/external/clearsilver/
if [ $(getconf LONG_BIT) == 32 ]; then
  sed -i "s/-m64/-m32/g" cgi/Android.mk
  sed -i "s/-m64/-m32/g" cs/Android.mk
  sed -i "s/-m64/-m32/g" java-jni/Android.mk
  sed -i "s/-m64/-m32/g" util/Android.mk
fi

# 获取设备专属文件(需调试模式连接手机)
cd $WORK/source/device/motorola/olympus/
./extract-files.sh

# 下载Rom管理器
cd $WORK/source/vendor/cyanogen/
./get-rommanager

# 编译CM7源码
cd $WORK/source/
source build/envsetup.sh
brunch olympus

PHP获取腾讯QQ在线状态

想要自定义QQ在线图标,关键是要获取到QQ在线状态,为此写了如下函数以获取QQ在线状态。
我给出了4种状态,其实一般只需要判断是否在线(1/2)就可以,另外2种状态(0/3)用于调试。

此函数通过腾讯的两个接口判断,一定程度上增加了判断的稳定性。

注意:此函数需要服务支持file_get_contents读取URL。

/*!
 * 获取腾讯QQ在线状态
 * @param int $uin 腾讯QQ号码
 * @return int [0:服务器错误,1:离线或隐身,2:在线,3:异常]
 */
function get_qq_status($uin) {
  if($uin > 9999) {
    error_reporting(0);
    $data = file_get_contents("http://webpresence.qq.com/getonline?type=1&{$uin}:");
    $data || $data = strlen(file_get_contents("http://wpa.qq.com/pa?p=2:{$uin}:45"));
    if(!$data) { return 0; }
    switch((string)$data) {
      case '854': case 'online[0]=0;': return 1;
      case '834': case 'online[0]=1;': return 2;
    }
  }
  return 3;
}

JavaScript获取浏览器Flash版本

/*!
 * 获取浏览器Flash版本号
 */
function get_flash_version() {
  var SF, FV = 0, BR = window.navigator;
  if(BR.plugins && BR.mimeTypes.length) {
    SF = BR.plugins["Shockwave Flash"];
    if(SF && SF.description) {
      FV = SF.description.replace(/[^\d\.]/g,"").split(".")[0];
    }
  } else if(BR = window.ActiveXObject) {
    try {
      SF = new BR("ShockwaveFlash.ShockwaveFlash.7");
      FV = SF.GetVariable("$version").split(" ")[1].split(",")[0];
    } catch(e) {}
  }
  return +FV;
}

Ubuntu下搜索文件和文件内容

查找软件的安装路径

whereis < 程序名称>
-b 只查找二进制文件
-m 只查找帮助文件
-s 只查找源代码
-u 排除指定类型文件
-f 只显示文件名
-B < 目录> 在指定目录下查找二进制文件
-M < 目录> 在指定目录下查找帮助文件
-S < 目录> 在指定目录下查找源代码

在文件索引数据库中搜索文件

locate < 文件名称>
-d < 数据库路径> 搜索指定数据库
updatedb 更新文件索引数据库

查找文件

find [路径] < 表达式>
-name < 表达式> 根据文件名查找文件
-iname < 表达式> 根据文件名查找文件,忽略大小写
-path < 表达式> 根据路径查找文件
-ipath < 表达式> 根据路径查找文件,忽略大小写
-amin < 分钟> 过去N分钟内访问过的文件
-atime < 天数> 过去N天内访问过的文件
-cmin < 分钟> 过去N分钟内修改过的文件
-ctime < 天数> 过去N天内修改过的文件
-anewer < 参照文件> 比参照文件更晚被读取过的文件
-cnewer < 参照文件> 比参照文件更晚被修改过的文件
-size < 大小> 根据文件大小查找文件,单位b c w k M G
-type < 文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user < 用户名> 按归属用户查找文件
-uid 按UID查找文件
-group < 群组名> 按归属群组查找文件
-gid 按GID查找文件
-empty 查找空文件

批处理检测是否已安装VC2008运行库

在做iServer批处理版控制台时写了2种方法,测试环境WindowsXP/2003/Vista/7(x86)。这里给出来,供大家参考:

方法一:
这只是简单的检测,并不保证运行库完整可靠性,至于检测其他版本的运行库,可以修改find后面的字符串来实现。

@echo off
echo. && echo 测试VC++运行库...
dir %windir%\WinSxS | find /i /c "Microsoft.VC90" >nul || (
  echo 测试失败,尚未安装VC++2008
)
pause

方法二:
通过注册表搜索已注册的卸载信息来获取安装状态,相对比较准确,只是对微软更新比较敏感,需要随时更新注册信息。

@echo off
set "HKLMU=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
reg query %HKLMU%{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 Redistributable X86
reg query %HKLMU%{9A25302D-30C0-39D9-BD6F-21E6EC160475} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable X86
reg query %HKLMU%{1F1C2DFC-2D24-3E06-BCB8-725134ADF989} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update X86
reg query %HKLMU%{350AA351-21FA-3270-8B7A-835434E766AD} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 Redistributable X64
reg query %HKLMU%{8220EEFE-38CD-377E-8595-13398D740ACE} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable X64
reg query %HKLMU%{4B6C7001-C7D6-3710-913E-5BC23FCE91E6} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update X64
reg query %HKLMU%{2B547B43-DB50-3139-9EBE-37D419E0F5FA} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 Redistributable IA64
reg query %HKLMU%{5827ECE1-AEB0-328E-B813-6FC68622C1F9} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable IA64
reg query %HKLMU%{977AD349-C2A8-39DD-9273-285C08987C7B} >nul 2>nul && set VC2008=Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update IA64
if defined VC2008 (
  echo 已安装 %VC2008%
) else (
  echo 未安装 VC2008
)
pause

解决MySQL出现UnauthenticatedUser的问题

发现MySQL在上午的时候忽然发飙,不断的挂掉。看MySQL的error.log,只能看到类似如下的信息:
Forcing close of thread 12232 user: ‘root’

mysqladmin -uroot -p******** status -i 1

使用上述命令,发现Queries per second avg只有200左右,可以说很低,但是Threads确非常不稳定,居然会瞬间升至200以上,一般情况下这个线程这个值都是不会高于5的个位数。

mysqladmin -uroot -p******** processlist

使用上述命令,发现居然有大量的unauthenticated user进程。Google了一下,发现这算MySQL的一个BUG,不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过慢,大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会“假死”。

解决方案,结束这个反查的过程,禁止任何解析,打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:

skip-name-resolve

重新载入配置文件或者重启MySQL服务即可。

2011年10月起河南最低工资标准上调

大河报讯(记者杨凌)最低工资标准上调了!9月30日,省人力资源和社会保障厅举行新闻通气会向全省通报这一好消息:2011年10月1日起,河南月最低工资标准将由现行的800元、700元、600元分别调整为1080元、950元和820元。

省辖市最低工资标准过千元

据悉,河南月最低工资标准由现行的800元、700元、600元分别调整为1080元、950元、820元;小时最低工资标准由现行的9元、7.9元、6.8元分别调整为10.2元、8.9元、7.7元。月最低工资标准适用于全日制就业劳动者;小时最低工资标准适用于非全日制就业劳动者。调整后的最低工资标准从2011年10月1日起执行。

根据当地经济发展水平的不同,我省将各地区分别划分为一、二、三类行政区域,分别执行高、中、低档月最低工资标准和小时最低工资标准,如郑州市、洛阳市、开封市等18个省辖市及省直管县巩义市属一类行政区域范围;新乡县、安阳县、临颍县等属二类行政区域范围;开封县、淅川县、沈丘县等属三类行政区域范围。

据悉,今年以来,全国已有18个省、市、区调整了最低工资标准。

最低工资标准包含个人缴纳“三险一金”

通气会上,该厅有关负责人介绍,河南现行月最低工资标准和小时最低工资标准是从2010年7月1日起执行的。以往河南公布的最低工资标准不包含职工个人缴纳的养老、医疗、失业保险费和住房公积金,即“三险一金”,用人单位需另行支付。自今年10月1日起,河南最低工资标准包含职工个人缴纳的“三险一金”,在构成上将与原劳动部颁发的《最低工资规定》并轨。

该负责人强调,最低工资标准不包含的项目有:用人单位支付给劳动者的加班加点工资;中班、夜班、高温、低温、井下、有毒有害等特殊工作环境、条件下的津贴;通过贴补伙食、住房等支付给劳动者的非货币性收入;用人单位依法为劳动者缴纳的各项社会保险费和住房公积金;按照国家规定为劳动者提供的福利待遇等内容。

两个PHP可逆加密函数

第一个是我自己写的一个简单的PHP可逆加密函数
第二个是我根据Discux!X的函数改写的一个较为复杂的PHP可逆加密函数

//第一个
function anrip_authcode1($str, $opt = 'encode', $key = 'anrip') {
  $result = '';
  $self = __FUNCTION__;
  if($opt == 'mcrypt') {
    $key = md5($key);
    $key_length = strlen($key);
    $str_length = strlen($str);
    for($i = $m = 0; $i < $str_length; $i++, $m++) {
      $m = $m == $key_length ? 0 : $m;
      $result .= $str[$i] ^ $key[$m];
    }
  } elseif($opt == 'encode') {
    $rnd = md5(mt_rand().$key);
    $rnd_length = strlen($rnd);
    $str_length = strlen($str);
    for($i = $m = 0;$i < $str_length; $i++, $m++) {
      $m = $m == $rnd_length ? 0 : $m;
      $result .= $rnd[$m].($str[$i] ^ $rnd[$m]);
    }
    $result = base64_encode($self($result, 'mcrypt', $key));
    $result = str_replace('==', '', $result);
    $result = str_replace('+', '*', $result);
  } elseif($opt == 'decode') {
    $str = str_replace('*', '+', $str);
    $str = $self(base64_decode($str), 'mcrypt', $key);
    $str_length = strlen($str);
    for($i = 0; $i < $str_length; $i++) {
      $md5 = $str[$i];
      $result .= $str[++$i] ^ $md5;
    }
  }
  return $result;
}
//第二个
function anrip_authcode2($str, $opt = 'encode', $key = 'anrip', $expiry = 0, $length = 4) {
  //define some key
  $key = md5(defined(AUTH_KEY) ? AUTH_KEY : $key);
  $keya = $length > 0 ? substr($opt == 'encode' ? md5(microtime()) : $str, 0, $length) : '';
  $keyb = md5(substr($key, 0, 16)).md5($key.$keya);
  $keyc = md5(substr($key, 16, 16).$keya.$keyb);
  //set $rnd
  $rnd = array();
  for($i = 0, $j = strlen($keyb); $i < 256; $i++) {
    $rnd[$i] = ord($keyb[$i%$j]);
  }
  //set $box
  $box = range(0, 255);
  for($j = $i = 0; $i < 256; $i++) {
    $j = ($j + $box[$i] + $rnd[$i]) % 256;
    list($box[$i], $box[$j]) = array($box[$j], $box[$i]);
  }
  //get $result
  $result = '';
  $expiry = $expiry ? $expiry + time() : 0;
  $str = $opt == 'encode' ? sprintf('%010d', $expiry).substr(md5($str.$keyc), 0, 16).$str : base64_decode(substr($str, $length));
  for($a = $i = $j = 0, $l = strlen($str); $i < $l; $i++) {
    $a = ($a + 1) % 256;
    $j = ($j + $box[$a]) % 256;
    list($box[$a], $box[$j]) = array($box[$j], $box[$a]);
    $result .= chr(ord($str[$i]) ^ ($box[($box[$a]+$box[$j]) % 256]));
  }
  //return $str
  if($opt == 'encode') {
    return $keya.str_replace('=', '', base64_encode($result));
  }
  else {
    $str = substr($result, 26);
    $expiry = substr($result, 0, 10);
    if(($expiry == 0 || $expiry > time()) && substr($result, 10, 16) == substr(md5($str.$keyc), 0, 16)) {
      return $str;
    }
    else return '';
  }
}

JavaScript根据给定的时间获取Unix时间戳

因为项目需要,今天写了一个JS版的根据给定的时间获取Unix时间戳的转换函数,不多废话,直接上代码。

/*!
 * 根据给定的时间获取Unix时间戳
 * @time : 时间;字符:'yyyy-mth-dd hh:mm:ss'
 * @tzone: 时区;整数:[-12,+12]
 */
function timestamp(time, tzone) {
  if(time) {
    var t = time.match(/((\d{4})\D(\d\d)\D(\d\d))(\s(\d\d)\D(\d\d)\D(\d\d))?/) || [];
    if(t[8]) time = new Date(t[2], t[3]-1, t[4], t[6], t[7], t[8]);
    else if(t[4]) time = new Date(t[2], t[3]-1, t[4]);
    else return 0;
  }
  return Math.round((time||new Date()).getTime()/1000)+(tzone||8)*3600;
}

上述函数支持以下四种格式的参数:

timestamp(); //当前时间戳
timestamp('1970-01-01'); //表示当日0点
timestamp('1970-01-01 00:00:01'); //日期以-分割
timestamp('1970/01/01 00:00:01'); //日期以/分割

批处理检测本地网络是否可用

在做xServer批处理版控制台时写了这个方法,这里给出来,供大家参考:

:check_network
  echo. && echo 测试网络环境...
  ping 127.0.0.1 -n 2 >nul || (
    echo 测试失败,请检查网络连接.
    goto check_network
  )
  goto :EOF

本程序用于检测本地网络是否可用,不可用将循环检测,直到可用跳出循环。