如何在开发和发布环境使用 Android Map Key

在项目中第一次使用并涉及 Google Map 的功能,而由于 Google 的限制,Google Map 模块出来需要单独下载模块之外,对于每一个应用还都必须具有一个 Google Map Key,这点和使用 Web 开发调用 Google Map API 是一致的。

对于 Android 采用的 Google Map Key 来说,是由一串 MD5 值(类似这样:94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98)生成的。那么这个 MD5 是哪来的呢?

1. 开发环境的 Google Map Key

这个比较简单,网上大面积教程所采用的 android 系统默认带有一个 debug.keystore。假如开发使用 Eclipse,在其 windows -> Preference -> Android -> Build 下,其中 Default debug keystore 的值便是 debug.keystore 的路径。

在命令行或者终端执行下面命令(注意指明 debug.keystore 的路径)即可获取到 MD5 值。

keytool -list -keystore debug.keystore

2. 发布环境的 Google Map Key

假如你的应用需要上线到官方的 Google Market 上面,则需要根据其 apk 的签名证书(keystore)的 MD5 值去生成,方法也很简单,发布的签名同样可以使用 Eclipse 的 Export 工具制作。制作完毕后(或许这个生成的签名没有 .keystore 后缀,不用在意)。同样也使用上面的命令获取其 MD5 值。

# 比如,证书路径 /home/icyleaf/android/ews
keytool -list -keystore /home/icyleaf/android/ews
...
#  查询到了 MD5 值
Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98

使用其 MD5 值在 Sign Up for the Android Maps API 页面填写生成即可。

接下来的步骤就没什么了,又是搜索出千篇一律的教程,大家 Google 之。

OSX: Finder 和 Terminal 的切换

在 Finder 打开 Terminal 并切换到当前目录

安装一个开源的 Finder 辅助工具:cdto。功能只有一个就是实现在 Finder 打开 Terminal 并切换到当前 Finder 目录。找到你系统的版本的 app (支持当前 OS X 10.4 以上版本,应该都是雪豹了 吧)拷贝到 Applications 下并把它拖到 Finder 的工具栏上即可。

从 Terminal 中用 Finder 打开当前路径的目录

open .

PS,如果是 Ubuntu 系统的话请安装 nautilus,然后在 Terminal 里面输入

nautilus .

使用 Git Hooks 实现自动项目部署

最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式。

关于部署,奇迹上是自动部署,起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码,后来记得 Git 带有 Hooks,索性在 ProGit 一书翻了翻:

Git 本身可以调用自定义的挂钩脚本,其中有两组:客户端和服务器端。客户端挂钩用于客户端的操作,如提交和合并。服务器端挂钩用于 Git 服务器端的操作,如接收被推送的提交。详情请查看 ProGit 相关章节

如果这样就简单了,利用服务器端调用想要的挂钩(Hook),即可实现自动部署的方案,为了保证不被肆意部署,特加了一个对需要部署 commit 的判断,利用读取 commit subject 并匹配想要的字符串才去部署,这样我认为是一个比较安装的部署方案。

Git的挂钩(Hook)主要包含:

  • applypatch-msg
  • post-update
  • pre-rebase
  • commit-msg
  • pre-applypatch
  • update
  • post-commit
  • pre-commit
  • post-receive
  • prepare-commit-msg

这里我们只需要使用 post-receive 这个 Hook:在接收 post(push) 请求之后执行。其他大部分我也没有大多研究,不过看名字不算难理解,我觉得其中大部分包含 commit 的属于客户端。

好了,部署开始:

1. 在服务器 git 仓库(注意是 bare 仓库,不是代码仓库)的 Hooks,编辑 post-receive(如果没有自行创建),贴入下面代码(Feed 用户请看这里):

这里会先判断脚本所在目录是否是 bare git 仓库,然后获取最新 commit 的 subject,并匹配是否包含 [deploy] 字样,如果包含,则继续检查产品代码仓库路径是否存在,如果存在则执行 git pull 操作。

2. 对刚才编辑的 post-receive 执行下面命令以保证脚本可执行:

$ chmod +x post-receive

3. 完成!

————————————-

对于自定义脚本,其实不仅限于 bash shell,你可以使用你熟悉的语言,然后把你的脚本路径在 hooks 脚本中加载即可。

脚本还会继续更新,下面需要增加关于测试部分的相关判断和部署。 bash shell 还需要进一步学习,上面脚本是我第一次写,如有不妥之处,请指教,感谢!

如何获取 Element 的 XPath [PHP/Javascript]

这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径,由于使用的是 PHP Simple HTML DOM Parser 开源库,这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢,依稀记得 Firebug 有一个功能,选择某个元素在它的控制台可以显示 XPath。嗯,着手实践一下发现不仅可以显示而且还可以复制 XPath。

于是想,如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的,结果在 Google 搜索找到了…

var elt = document.getElementById('table');
var xpath = getElementXPath(elt);
alert(xpath);

// Get full XPath of an element
function getElementXPath(elt)
{
	var path = "";
	for (; elt && elt.nodeType == 1; elt = elt.parentNode)
	{
		idx = getElementIdx(elt);
		xname = elt.tagName;
		if (idx > 1) xname += "[" + idx + "]";
		path = "/" + xname + path;
	}

	return path;
}

// Get Idx of an element
function getElementIdx(elt)
{
    var count = 1;
    for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling)
    {
        if(sib.nodeType == 1 && sib.tagName == elt.tagName)	count++
    }

    return count;
}

PHP 改进版:

// Use it before import PHP Simple HTML DOM Parser
$html = file_get_html('http://www.google.com/');
// find a sample element by id
$elt1 = $html->find('#footer', 0);
// find a sample element by tag name
$elt2= $html->find('div', 10);

// it will return if found it: //*[@id="footer"]
$xpath = getElementXPath($elt1);

// it will return if found it: html/body/div[10]
$xpath = getElementXPath($elt2);

function getElementXPath($elt)
{
	$path = '';
	$first = TRUE;
	for(; ($elt AND $elt->nodetype == 1); $elt = $elt->parent())
	{
		$xname = $elt->tag;
		$idx = getElementIdx($elt);

		if ($first AND isset($elt->attr['id']))
		{
			$path = '//*[@id="' . $elt->attr['id'] . '"]';
			break;
		}

		if ($idx > 1)
		{
			$xname .= '[' . $idx . ']';
		}

		$path = '/'.$xname.$path;

		$first = FALSE;
	}

	return $path;
}

function getElementIdx($elt)
{
    $count = 1;
    for($sib = $elt->prev_sibling(); $sib ; $sib = $sib->prev_sibling())
    {
        if($sib->nodetype == 1 && $sib->tag == $elt->tag)
        {
        	$count++;
        }
    }

    return $count;
}

大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。

克隆 Ubuntu 安装程序

原文链接:Cloning your Ubuntu Installation

对于两台以上的不同配置的机器,对于初学者来说(我也算,呵呵)想要每台机器安装同样的软件是非常麻烦的事情。下面在这篇文章中原作者提供了一种简单的方式解决了这个问题,核心思路为:如何把一台 Ubuntu 的已安装包列表导出并把它们导入到到其他机器的 Ubuntu 系统之中。

复制系统软件源文件
复制 /etc/apt/sources.list 文件到U盘(或其他移动设备)上面。

导出已安装包列表

$ dpkg --get-selections | grep '[[:space:]]install$' | \\
awk '{print $1}' > ~/package.list

复制 package.list 文件到U盘(或其他移动设备)上面。

设置目标系统
更新软件包列表,以确保获得最新版本的软件包

$ apt-get update

导入包列表

$ cat ~/package.list | xargs apt-get install

完成!所有包列表的程序都会导入到新的系统当中,但这并不意味着所有的设置已经克隆。为了完成这一点,您可能会需要从 /etc 目录复制配置文件。