@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.
+ 0 - 0 | §奥运门票到手,就等梅西了。

原本对购买奥运门票并不是太感冒。一则觉得僧多粥少买起来费劲,一则到时候人全涌北京去了住宿也成问题。

奥运男足门票

后来偶然看到奥运男足A组的比赛会在上海体育场踢,而阿根廷正好是分在A组,不禁动了心。毕竟像世界杯这样的A级赛事也不知道这辈子有没有可能等到在家门口举行了,能看看实力超强的阿根廷在上海踢这样的B级赛事也是不容错过的 -- 何况如果梅西阿圭罗里克尔梅都能来的话,也就称得上半支国家队了:) 

等到第三阶段售票一开始,看新闻里面在银行排队的那阵势,本来又有些打退堂鼓了。登录到官方票务网站一看,倒没像上次那样被挤瘫掉。于是尝试注册了帐号直接购买了在上海踢的两场比赛门票,然后是用visa付款。整个过程还算顺利,但等周末去中国银行打算取票的时候却被告知这几天都已经被线下支付票款的给预约满了,要等过了线下付款的时间之后才会空下来出票。只好又等了俩星期。

8月10日
阿根廷vs澳大利亚
17:00
上海体育场
8月10日
塞尔维亚vs科特迪瓦
19:45
上海体育场

8月16日
A组第1vsB组第2(Q1)
21:00
上海体育场

现在门票终于到手,就等着看阿根廷啥时候公布最终参赛的22人名单了。但愿巴萨不会硬拉着梅西去踢什么垃圾欧冠外围赛。。

相信阿根廷拿小组第一应该是如探囊取物,要是碰巧荷兰给打成小组第二,那么这张四分之一决赛的门票就买的值了。

标签 ( 体育 ) :
+ 0 - 0 | §Firefox扩展开发学习杂记

最近玩了一把Firefox的扩展开发,感觉不错。倒腾出来一个ChinaStock,有兴趣的可以瞧瞧(现在还被放在Sandbox里面,必须登录才能下载安装;同时因为被放在sandbox里面,暂时还不能被自动更新版本)。如果您愿意的话,也可以直接在本站下载安装

扩展开发中用得着的扩展(有点拗口):

Extension Developer's Extension  (xpi download / install address) 快速将扩展目录打包成xpi文件,在不重启Firefox的情况下重新载入所有扩展以及其他实用小功能。必备!如果不使用该扩展快速重载扩展的话,每次修改代码之后都必须从Firefox的菜单栏选择“退出”关闭Firefox再打开才有99%的几率保证该Chrome内容是最新修改后的,那叫一个痛苦。即使设置参数 nglayout.debug.disable_xul_cache = true ,也只是减少了修改窗口或对话框之后的重启而已。

Chrome List + Extension Manager Extended 学习其他人写的扩展总是最快入门的方法。 Chrome List 提供了扩展浏览功能,可以查看扩展安装之后存在的问题和jar包里面的源代码;Extension Manager Extended 则扩展了Firefox的扩展软件列表功能,直接显示每个扩展的ID,通过右键可以直接打开扩展存放的目录,再不需要去资源管理器找深埋在 Application Data\Mozilla\Firefox\Profiles\!@#$%^.default\extensions 里的jar包,也不需要去猜测使用UUID作为ID的扩展到底对应在哪个子目录了。

DebugLogger + Console2 DebugLogger 是 dump() 的优化版本。可以按照每个项目分别查看各自的dump信息。像 Firebug 这样的大师级扩展属于开发必备不需多讲,这个 DebugLogger 相较而言属于轻量级并且原始的调试辅助工具。配合它,至少不需要再用alert来简单粗暴了。 Console2 则是错误控制台的加强版,实现了 Firefox 3 错误控制台的一些特性。

现有HTML代码的利用:

虽然并不被鼓励,但对于更熟悉HTML语法的开发者来说, 最快捷编写扩展界面的方法是在 XUL 中引入 HTML 命名空间(为根标签增加属性 xmlns:html="http://www.w3.org/1999/xhtml"),然后给所有使用到的HTML标签添加 html: 前缀(比如 <div>...</div> 应该写成 <html:div>...</html:div>)即可。当然,因为 XUL 是基于 XML 的语言,所以所有的标签属性都应该是小写格式,并且空tag必须进行关闭。

相应的,由于上述定义方式下HTML 元素标签定义不在主命名空间内,当进行 DOM 操作的 js 代码在创建 HTML 元素的时候,也不能直接使用 createElement ,而必须使用 createElementNS 。比如 document.createElementNS("http://www.w3.org/1999/xhtml","html:div");

关于扩展ID:

每个扩展软件都必须有个唯一的标识ID,建议是使用UUID,也可以使用形如 extensionname@my.domain(必须有@符号但不必是真实的域名) 的字符串。生成UUID的方法很多:windows下可以安装微软自己提供的GUID Generator,*nix 下直接敲命令 uuidgen ,或者访问这里在线生成一个。个人觉得虽然UUID不会造成ID冲突,但 @ 形式的可读性更强一些,否则不靠前面提到的扩展帮忙要把ID跟功能对应起来还真是件费力的事情。 

扩展描述的本地化:

在 Firefox 扩展管理器中,每个扩展的名字下面都有一段简短的描述(description),这段描述来自扩展根目录下的 install.rdf 文件。将这段描述进行本地化处理的方法是在扩展目录下创建子目录 defaults/preferences ,在子目录下新建一个 js 文件 myextname.js ,包含以下内容:

pref("extensions.ReplaceWithExtensionIDHere.description", "chrome://myextname/locale/myextname.properties");

同时在 locale 语言包文件 myextname.properties 中添加一行:

extensions.ReplaceWithExtensionIDHere.description = 经过本地化的描述内容

扩展的打包发布:

如果使用 Extension Developer's Extension 提供的extension builder 进行打包,它会在build的过程中自动将chrome.manifest中的目录配置替换成jar:chrome的形式,而不需要自己来回切换不同的chrome.manifest配置。当然前提是你的扩展工作目录按照约定的结构进行组织。如果你没有把content / skin / locale 目录放在工作根目录而是放在了 chrome 子目录下的话,打包之后xpi文件会同时包含jar文件和chrome整个目录。生成xpi文件之后,到 Firefox Add-ons 的开发者工具界面进行注册/登录/上传即可。

如果代码实际是兼容Firefox的最新版本的,只是因为在install.rdf里面的em:maxVersion设置了过老的版本号而导致你发布在AMO上的扩展被认为不兼容而无法下载的话,可以登录AMO后进入开发者工具管理界面,选择相应的扩展,点击版本历史列出的版本号链接进去,就可以快速修改该版本xpi的兼容版本范围(找这个修改的地方找了N久,OrZ)。

参考文档:
+ 0 - 0 | §Google PR查询接口checksum新算法

前些日子一篇N久之前的老文忽然成了被阅读的热点,检查之后才发现自己使用那段代码来做pr查询的页面已经不能正常得到URL的Page Rank值了,取而代之的是一大段“In your email, please send us the entire code displayed below”之类的Google terms_of_service错误提示信息。看来是原先的接口已经失效了。

但我装在Firefox工具栏的扩展插件SearchStatus仍然能够正常解析出每个受访页的PR值,找到 SearchStatus 的插件包解开来看源码,果然是使用了不一样的验证码生成算法,在原先的 checksum 生成之后,还需要再进行一次计算,两次演算之后得到的才是正确的ch参数。

于是拿现成的js代码改造一番之后,新的PHP版本的 Google PageRank 查询接口方法就出来了。经过本地测试之后,谁想传到服务器之后又出现了该死的 terms_of_service 错误提示。把checksum的计算过程一步步打出来,发现经过了几次右位移之后本地和服务器上的数字就不一样了。这才想到服务器是64位机,32位系统下位移之后应该被cut掉的bit在那里就活得好好的。加了个 trunkbitForce32bit 方法,对所有算术运算之后的数值进行高位屏蔽,算是搞定了64位系统下的多余位问题。结果拿到32位Linux环境下跑又不兼容了,原因是PHP在进行算术处理出现溢出时,会自动尝试将int转为float。当发生的是负数溢出时,这一操作在Windows下能正确保留精度,但在Linux下就有问题了。

下面这段代码:

$a = -4294967295;
echo dechex($a)."<br />\n";
if ( $a < 0 ) $a += 4294967296;
echo dechex($a)."<br />\n";

第一个echo在Windows下能够正确输出该负数低32位的补码,而在32位Linux机上输出的则是int类型所能表示的最大负数0x80000000了。只有通过取巧的方式给这个溢出的大负数加上一个超出整数范围的大整数来抵消掉溢出的部分,才能复原低32位应该有的样子。

使用这些非常规手段,终于炮制出这个更新版的兼容Linux32/Linux64/Windows的Google PR值查询接口的PHP脚本实现(含完整代码)

参考:
php异或运算的不可靠性
PHP vs. BIGINT vs. float conversion caveat
http://www.teamworksusa.com/RDS275/HydroWorks275/keygen.php

标签 ( PHPWebDev ) :
+ 0 - 0 | §曼联VS切尔西,5月22莫斯科见

刚写完这个标题,就看到埃辛一脚劲射被吹无效,我还以为利物浦的鸟运又要来了;没想转眼就吃进点球一粒,加上德罗巴的锁定胜局,切尔西总算是出了一口欧冠赛场被利物浦连K的恶气。

2007/08欧洲冠军杯--[冠军杯]切尔西vs利物浦

昨天凌晨巴萨已经以一种让人郁闷的方式被淘汰,我在八强名单出炉时候预测的两支决赛球队都没能杀到最后,5.22卢日尼基的决赛真正成了英超内战。现在看来,切尔西很有拿双料冠军的面相。。

标签 ( 体育 ) :
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号