Android SDK Manager 无法打开的问题

一年多没写新文章了,我现在正在用着 32 位的 Windows 7 系统,虽然还有着诸多的不习惯,可另外一块硬盘上装着的 Windows XP 还是用的越来越少了。

昨天看到 Android Studio 1.0 正式版发布了,那个激动啊,赶紧下载下来学习,顺便把之前为了 Cordova 编译安装的 Android SDK 也更新一下,然后就杯具了……

打开 SDK Manager 时一闪而过就退出了,完全卸载重新安装 installer_r24-windows.exe 还是没用,

尝试在命令行运行 android.bat,在命令行输出了如下内容:

D:\android-sdk\tools>android.bat
'-v' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
无效路径
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
系统找不到指定的路径。
ERROR: SWT folder '' does not exist.
Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.

网上搜索了下相关问题,基本上都是修改下环境变量什么的,尝试了一下都没用。

自己找找看问题出在哪里,编辑 android.bat 注释掉第一行的 @echo off 后再次运行,发现在

call lib\find_java.bat

这个调用后出现错误,再编辑 find_java.bat 同样注释第一行的关闭回显代码,可以看到如下输出

for /F "delims=" %a in ('"D:\ANDROI~1\tools\lib\\find_java32 .exe" -s') do set java_exe=%a

仔细一看,find_java32 和 .exe 之间有一个空格,在 find_java.bat 中找到对应的代码为:

for /f "delims=" %%a in ('"%~dps0\find_java%arch_ext%.exe" -s') do set java_exe=%%a

也就是说 %arch_ext% 这个变量被设置成了 “32 “,再看看这个变量是哪来的:

find /i "x86" > NUL && set arch_ext=32 || set arch_ext=64

看到没,”32″ 和 “||” 之间有一个空格!

删除这个空格,重新打开 SDK Manager,可以打开了!

如果要保持代码留白一致的话可以用加括号的方法,即改成如下:

find /i "x86" > NUL && (set arch_ext=32) || (set arch_ext=64)

这就是一个空格引发的杯具,多年的软件开发经验告诉我,最经常犯的错误甚至是致命的错误往往都是极小的问题导致的,比如标点错误、拼写错误或者这里的多了一个空格……

集成MSYS的Shell到Windows资源管理器右键菜单

MSYS为Windows提供了丰富的Linux工具集的移植版本,比如bash、make、gawk、grep等,为了更方便的使用其提供的命令行工具,我把它添加到了Windows资源管理器的右键菜单中。

工具准备

MSYS-CN: https://code.google.com/p/msys-cn/
这里我使用了能更好的支持中文的MSYS-CN版本

打开加加: http://www.freewebs.com/dengdun/cn/openxx.htm
一个方便添加自定义右键菜单的小工具

配置右键菜单

安装好“打开加加”,并将下载的MSYS-CN解压,我这里解压在 D:\Dev\MSYS,按下图所示配置:
Open++
为了使界面看起来更友好,我这里使用rxvt来调用msys-bash,其中的参数为:

-tn msys -sl 3000 -fn Fixedsys -fg white -bg black -sr -e D:\Dev\MSYS\bin\bash.exe --login -i

注意将路径修改为你自己的MSYS所在路径

启动目录修正

MSYS在默认情况下会把当前目录重置为虚拟的当前用户主目录,这样便失去原本想要在当前目录执行命令的便利性,为了使msys-bash启动后停留在当前目录,我们需要做一些小改动。
打开MSYS中的\etc\profile文件,找到里面最后部分的

# Enter home dirctory
cd "$HOME"

将切换到用户主目录的代码注释掉,变成

# Enter home dirctory
#cd "$HOME"

大功告成!现在尽情享用MSYS工具的便利吧!
MSYS-CN

参见:

  1. MSYS – http://mingw.org/wiki/msys
  2. MSYS-CN – https://code.google.com/p/msys-cn/
  3. 打开加加 – http://www.freewebs.com/dengdun/cn/openxx.htm

在 Windows 下为 PHP 5.4 安装 PEAR、PHPUnit 及 phpDoc2

1.安装PEAR

官方网站: http://pear.php.net/

PHP 5.4 的 Windows 包中没有自带 PEAR,下载 http://pear.php.net/go-pear.phar 到PHP目录,并运行:

php go-pear.phar

安装完成后PHP目录下会产生一个名为 pear.bat 的批处理文件,并且会在系统中添加以下环境变量(用户变量,假定PHP安装在C:\php):

PHP_PEAR_BIN_DIR=C:\php
PHP_PEAR_DATA_DIR=C:\php\data
PHP_PEAR_DOC_DIR=C:\php\docs
PHP_PEAR_INSTALL_DIR=C:\php\pear
PHP_PEAR_PHP_BIN=C:\php\php.exe
PHP_PEAR_SYSCONF_DIR=C:\php
PHP_PEAR_TEST_DIR=C:\php\tests

在写使用了 PHP 的批处理脚本时可以好好利用下这些环境变量。

在命令行输入:

pear version

如果有显示类似如下信息,说明 PEAR 已经成功安装:

PEAR Version: 1.9.4
PHP Version: 5.4.4
Zend Engine Version: 2.4.0
Running on: Windows NT ACER-TM4750G 5.1 build 2600 (Windows XP Professional Service Pack 3) i586

2.安装 PHPUnit

官方网站: http://www.phpunit.de/
PHPUnit 3.6 需要 PHP 5.2.7 (或更改版本) 但强烈推荐使用 PHP 5.3.9 (或更高版本)。

PHPUnit 使用PEAR进行安装:

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

安装完成后PHP目录下会产生一个名为 phpunit.bat 的批处理文件。

在命令行输入:

phpunit --version

如果有显示类似如下信息,说明 PHPUnit 已经成功安装:

PHPUnit 3.6.11 by Sebastian Bergmann.

注意,在 PHP 官方 PEAR 频道上也有两个 PHPUnit 的包,名称分别为 PHPUnit 和 PHPUnit2 ,这两个包都是旧版本,分别是 1.x 和 2.x 的版本,如果你使用下面的方式直接安装:

pear install phpunit

那你安装的就是为 PHP 4.x 提供的旧版本 PHPUnit 1.x 了,要使用最新的 PHPUnit 3.x 版本,你需要使用 pear.phpunit.de 这个频道。

使用PHPUnit:

%PHP_PEAR_BIN_DIR%\phpunit test.php

3.安装 phpDocumentor 2

官方网站: http://www.phpdoc.org/
phpDocumentor 2 是为PHP 5.3 或更高版本的所有特性生成 API 文档而创建。

phpDocumentor 2 同样使用PEAR进行安装:

pear channel-discover pear.phpdoc.org
pear install phpdoc/phpDocumentor

安装完成后PHP目录下会产生一个名为 phpdoc.bat 的批处理文件。

在命令行输入:

phpdoc --version

如果有显示类似如下信息,说明 phpDocumenter 2 已经成功安装:

phpDocumentor version 2.3.1

使用方法,在要生成文档的项目所在目录运行:

%PHP_PEAR_BIN_DIR%\phpdoc -d . -t docs

PHP 5.4 中经 htmlspecialchars 转义后的中文字符串为空的问题

PHP 5.4.3 环境中测试了一个在 PHP 5.2 环境下运行正常的程序,却发现本应正常提交一个中文字符串到数据库的代码却提交了一个空字符串,经过排查,该字符串在经 htmlspecialchars 函数转义之前正常,而在转义之后却变成了空字符串。调用例子如下:

$str = '中文字符串';
$str_converted = htmlspecialchars($str);
echo $str_converted;

遂查看PHP手册,获知 htmlspecialchars 函数原型如下:

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

更新日志里面又有提到:

5.4.0 The default value for the encoding parameter was changed to UTF-8.  
5.4.0 The constants ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_XML1, ENT_XHTML and ENT_HTML5 were added. 

PHP 从 5.4.0 版本开始第三个参数字符串编码的默认值改成了 UTF-8,而我这段代码中的中文编码正好是 GB2312 编码的,跟现在的默认参数不一致,于是更改调用参数如下:

$str = '中文字符串';
# 为了与旧环境兼容,这里第二个参数没有组合使用 PHP 5.4 新加入的 ENT_HTML401 常量
$str_converted = htmlspecialchars($str, ENT_COMPAT ,'GB2312');
echo $str_converted;

这样,“中文字符串”就可以正常显示了。为了使 PHP 5.4 之前环境中编写的代码能够向前兼容,建议调用 htmlspecialchars 函数的的时候都提供字符串编码参数。

参考: http://php.net/htmlspecialchars

启用IPv6后MySQL客户端软件无法连接localhost的问题

一次在为了尝试使用 IPv6 网络而在 Windows XP SP3 环境中启用了 IPv6 协议之后,发现 HeidiSQL、Navicat Lite 9 这两个客户端均无法连接到在本机搭建的 MySQL 服务器 localhost ,而在 Apache + PHP 环境中运行的 phpMyAdmin 却是正常,虽然知道是 IPv6 引起的,但是卸载掉 IPv6 实在是个低级的办法,于是摸索着其它解决方法,估计是由于启用了 IPv6 后 MySQL 默认绑定到了 ::1 这个 IPv6 的回环地址上,然后找到了一个办法,在my.ini添加 bind-address 配置如下:

[mysqld]

# The TCP/IP Port the MySQL Server will listen on
port=3306

# 如果启用了IPv6,默认会绑定IPv6地址,某些MySQL管理软件不支持连接到IPv6的地址(如[::1]:3306),故此处设置绑定IPv4地址
bind-address = 0.0.0.0