accesskey是XHTML定义的快捷键属性, 适用于a, input等元素. 例如下面代码

<a href="...." title="" accesskey="z" >...</a>

则用户使用键盘快捷键ALT+z可以直接打开这个链接. 不同浏览器的前置键不同, IE为Alt, Opera为 shift+ESC, Firefox为alt+shift. 如果accesskey属性位于input/ label等元素里, 点击快捷键时对应输入框获得焦点.


本文的内容是, 对一个已经定义accesskey的a (或其他)元素, 在其title属性里增加快捷键提示, 这样鼠标悬停时会显示对应的快捷键. 类似维基百科顶部和左侧导航栏里鼠标悬停链接时的效果, 使用Javascript实现.代码参考了Mediawiki

代码中用到了jQuery

代码:
var ua = navigator.userAgent.toLowerCase();
var is_win = ( ua.indexOf('windows') != -1 );
var webkit_match = ua.match(/applewebkit\/(\d+)/);
if (webkit_match)
    var webkit_version = parseInt(webkit_match[1]);

var tooltipAccessKeyPrefix = 'alt-';
if( jQuery.browser.opera )
    tooltipAccessKeyPrefix = 'shift-esc-';
else if( !is_win && typeof(webkit_version) != "undefined" && webkit_version > 526 && jQuery.browser.safari )
    tooltipAccessKeyPrefix = 'ctrl-alt-';
else if( !is_win && ( jQuery.browser.safari || ua.indexOf('mac') != -1 || ua.indexOf('konqueror') != -1 ) )
    tooltipAccessKeyPrefix = 'ctrl-';
else if( jQuery.browser.mozilla )
    tooltipAccessKeyPrefix = 'alt-shift-';

jQuery("a, input").each(function(i) {
    if( this.getAttribute("accesskey") != null && this.getAttribute("accesskey") != "" ) {
        var title = "";
        if( this.getAttribute("title") != null && this.getAttribute("title") != "" )
            title = this.getAttribute("title") + " ";
        this.setAttribute("title", title + "[" + tooltipAccessKeyPrefix + this.getAttribute("accesskey") + "]");
    }
});


把上面代码保存为一个js文件, 然后在页面底部里导入这个js文件
<script src="...." type="text/javascript"></script>

保护你的上网隐私和视觉清爽

| | Comments (2) | TrackBacks (0)
可能标题有点难懂.本文内容是,如何在上网过程中保护自己的隐私(不泄露), 并维护一个清爽的浏览环境(避免网页广告干扰).

Section A: 保护你的隐私

当你上网时, 浏览器会向网站服务器提供自身的信息.这些信息位于http请求的headers里.有一些header是必须的,例如:

GET: /path/file
Host: abc.com

在极端情况下,上面两行就足够提交一个Http请求,然而,通常浏览器会提交更多header,其中有一些是无关紧要的(如控制缓存的), 但也有一些Header会泄露你的隐私:

Referer: http://domain.tld/path/file
Accept-Languages: zh-cn
User-agent: Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.8-gentoo-r3; X11;

Referer信息设置为你的浏览来源,当你从A页面上点击B页面的链接时,Referer被设置为A页面的URL, 除非直接在地址栏输入地址, 在大多数情况下,浏览器中会发送Referer (例外:通过javascript的location.href=""跳转和通过<meta http-equiv="reflesh" content="1; URL=http://domain.tld/path/file" />载入的链接不会发送Referer, 或者Referer会被设置为目标链接URL, 根据不同浏览器而定. ), 从而泄露你的隐私, 比如, 如果你从Google搜索引擎结果中点击A网站链接, A网站会知道你在Google搜索的关键字; 如果你认为这个无所谓, 那么,当你通过webmail点击邮件中链接时, 对方能通过Referer知道你使用的邮箱信息, 甚至是邮件地址!

因此, 我们绝对有理由阻止浏览器发送Referer, 在Firefox下,你需要更改about:config设置: network.http.sendRefererHeader 这个值默认是2或1,将它改为0,.  在Opera下, 点击Tools > Preferences > Advanced > Network, 清除 Enable referrer logging复选框即可.

这样做以后,浏览器不会再发送Referer头, 你可以点击这个链接测试一下, 如果没有更改设置,HTTP_REFERER会显示为本文的URL( http://code.oogami.name/...), 而按照上面的设置以后, 显示的HTTP_REFERER为空.


Accept-Languages指你浏览器倾向使用语言, 通常这个值预设为你的浏览器语言, 毫无疑问, 这将泄露你的隐私.强烈建议所有人, 把Accept-Languages设置为 en或空. 在Firefox下, Tools- Options - languages, 删除所有语言或只保留一个English(en). Opera下则在Tools - Perferences -Languages设置里更改.

你同样可以通过上面链接测试更改后效果.


User-agent泄露隐私情况更严重, 浏览器默认任何请求都会发送User-agent, 从UA中可以得知你的浏览器名称, 版本, 操作系统等. 这对于保护我们的隐私而言, 绝对是不可接受的.必须清除User-agent. 在Firefox下, 更改 about:config设置, 新建一个general.useragent.override项, 类型为 string, 把值设定为一个安全的值, 如 "Private Browser", 那么Firefox就会把它作为User-Agent值, 从而防止泄露我们隐私. 很遗憾, 在 Opera下, 没有找到修改 User Agent方法,通过 opera:config页里某项设置可以在Opera的user-agent字符串后附加一个子字符串, 但无法完全自定义UA值. 这就是自由的开源软件和商业软件(虽然免费)区别.

Javascript.
javascript会泄露你的隐私, 典型的是许多网站采用的统计系统
(如Google Analytics), 都是通过在页面中加入JS代码实现的. 这些代码会追踪你在网站的浏览过程, 分析你的浏览行为, 甚至收集你的个人信息.除了统计网站的JS代码, 任何JS代码都有可能泄露你的隐私, 一个恶意构造的代码甚至可能对你计算机安全造成威胁. 这里强烈推荐 Firefox的No scripts插件, 启用这个插件后, 默认所有网站的Javascript都不会执行, 你可以临时允许网站执行Javascript, 也可以把某个网站加入白名单以允许其执行JS脚本. 可以说安装这个插件后一劳永逸的解决了Javascript可能的隐私泄露问题.

Cookies
Cookies造成的隐私泄露可能远比上面所说的几种情况严重, 通过嗅探和截取, Cookies可能被第三方获得, 由于其性质, Cookies中可能含有一些非常机密信息(如你的网站用户名,密码,信用卡号...), 这些信息被泄露的后果是不可估量的. 理想的情况是对所有使用Cookies网站用HTTPS (SSL)浏览, 但这在现在是很难做到的. 并且, 启用Cookie对于很多网站是必须的 . 在将来, 通过SSL的普及或其它技术(如IPV6的底层加密)可能彻底解决Cookies隐私泄露问题, 但在目前, 并没有很好办法.

Section B 安全和视觉清新

对于我而言, 网页上任何形式广告都是绝对不可接受的. 因此我使用了Firefox的 Adblock Plus插件, 通过简单订阅几个广告源列表, 网页上大部分广告消失了, 虽然为了营造绝对清爽的浏览环境, 你有时仍可能需要手工设置屏蔽页面上某个元素, 或者自己写一个匹配某广告的正则表达式, 但这是完全值得的. ADblock表现无愧于它的Slogan: 广告已成往事.



 



给PHP弄的有些没脾气

| | Comments (2) | TrackBacks (0)
写某程序需要编译一个php extension.费了好大功夫,终于用phpize搞定(先前直接用gcc,冒出一堆错误- -), ./configure , ./make 都没问题 .结果把生成的so文件放到web目录下,用dl('name.so')载入一看:

Warning: dl() [function.dl]: Unable to load dynamic library './***.so' - ./***.so: undefined symbol: empty_string in /home/..../test.php on line 2

明明configure的时候没有任何错误的.试着改变configure的参数,结果根本不改变生成的config.h,(就是说make不会生成新的so文件)

没脾气了.谁能告诉我,这个错误是怎么回事?

WP Chinese Conversion Plugin 1.06

| | Comments (1) | TrackBacks (0)
Wordpress 繁简转换插件1.06版本 实现了我当初设想的全部功能.提供完整的中文转换解决方案.

下载本插件  或查看最新版本


使用说明和文档在插件发布页有.


PS:这个插件,最初是我为自己的WP博客写的.后来顺便就放到了wordpress.org上 - - .我不保证后继开发或维护本插件,也不提供任何支持.



Movable Type不支持夏时制?

| | Comments (1) | TrackBacks (0)
果然细节方面MT做的远不如WP好.

我刚刚在MT里发表了一篇文章,本地时间是21:05 .但页面显示的发表时间是22:05 .程序时区设置的是GMT+8:00没有问题 .所以基本确定原因是夏季时,即部分地方区域设置的日光节时,在3~8月份每天会提早一个小时(? 具体我也不是很明白)

可以肯定的是MT细节没有WP好 .我的WP Blog和这个MT Blog位于同一服务器,时区设置都是+8:00 .但WP里发表文章的显示时间从来没有错误.

WP Chinese Conversion Plugin

| | Comments (6) | TrackBacks (0)
Wordpress中文繁简转换插件

这是我昨天做的一个Wordpress插件.本插件为您的Wordpress博客增加中文繁简转换功能.转换过程在服务器端完成. 中文繁简转换映射表(ZhConversion.php)来源于Mediawiki.

/*
Plugin Name:  WP Chinese Conversion (WPCC)
Required WP Version: 2.7  ( 只在2.7中测试过)
Version: Beta 20090313
Download
*/

文档

== Installion ==


解压缩插件,WP后台激活

== Configuration & Usage ==


****注意,由于插件比较简单,而且偶也懒, 所以本插件没有后台- , - 如果你想修改任何设置或选项,必须直接编辑php文件 -_-_-_-_-_- ****

最简单的使用方法.直接添加本插件的Widget . Widget里将输出你Blog当前页面的繁体版本,简体版本和不转换版本链接.请自己定义CSS,Widget里已经设置了 每个标签的id和class ,请自己查看.

你也可以用在模板里调用 wpcc_output_navi() 函数输出导航链接.

本插件生成的繁体/简体版本URL形式类似下面这些: http://domain.com/?variant=zh-hant ,  http://domain.com/archive/18?variant=zh-hant , http://domain.com/date/2009/02?variant=zh-hans,  http://domain.com/?p=18&variant=zh-hans ...  其中zh-hans为简体代码 ,zh-hant为繁体代码 .转换后的页面里文章标题,文章内容,评论内容,分类名等都会被转为对应语言.大部分内部链接也会被转换为对应语言版本的链接.

==Other  Notes ==


* 转换后的繁体版/简体版里少数内部链接(例如"首页"链接)并没有更改为对应于语言版本,需要自己改模板.有些模板用了AJAX,那么情况更复杂,要改的地方更多,这里就不说了.许多WP插件也可能导致本插件工作不正常.

* 本插件仅在WP2.7中测试过. 与WP-Super-cache等缓存插件兼容.

* No Warranty &Support !  这个插件是我写的玩的.我不打算维护/升级它.因为已经有用JS实现WP繁简转换方法.比起服务器端转换代价要小的多 (虽然服务器端繁简转换更加专业.和可靠,但是以加大CPU时间为代价的). 如果你使用该插件,所有后继的维护,调试和升级工作都必须自己完成.

图在内存中组织方式

| | Comments (3) | TrackBacks (0)
节点/边

邻接表 / 邻接矩阵

图的组织/ 图文法 /图的转换

数据结构/ 算法 /编译原理 /C语言



Just a note for mysqlf

新年快乐.2009年的WEB空间备份计划

| | Comments (4) | TrackBacks (0)
新年好.2009年,到来了.

自2007年11月来,我一直在使用美国Dreamhost空间.目前这个空间上不仅有我几个网站和博客,还存放着本人的所有个人邮件,开发源代码和进度(位于SVN中),各种个人文档和资料.所有这些东西都是非常重要的,一旦丢失后果不堪设想 - -

去年12月,Dreamhost发生了一起严重事故,Spacey核心节点上的近百个服务器宕机超过一天.原因是文件服务器硬件问题.虽然最后大部分服务器都恢复了正常,但还有一个服务器上所有客户网站数据全部丢失!幸运的是,本人网站并不位于那个服务器上.但这次事故还是警醒我,有必要提高数据备份频率.

自2008年3月以来,本人一直维持着周期性的WEB空间备份计划.备份范围包括个人博客和网站的数据库和文件,svn源码库,个人wiki,个人资料库和其他所有个人信息.其中所有MySQL数据库是每日备份一次,并自动发送到Gmail邮箱.实际备份数据用gzip压缩后目前大约5MB左右一次,并不是很大,所以可以每次都全量备份并发送到邮箱.SVN源码库目前大小同样不大,可以也每日完全备份.

但文件的备份(包括我个人网站和博客文件及其他存储在空间上的个人文档),负担越来越大.本人所有个人文件和文档都存存放在resource.oogami.name域名下,总和已超过1GB.这样大小的文件,我根本无法进行每日都进行备份.目前我采取的策略是,不定期用FTP备份全部文件到本地.同时每日用rsync把文件同步备份到Dreamhost提供的备份服务器(backup.dreamhost.com).这样,除非DH的网站服务器和备份服务器同时出问题,我的文件不会丢失.

即使这样,我还是不放心,我正在考虑在今年提高备份频率,并采取其他备份措施.对于备份操作来说,备份成本和灾难发生以后的恢复成本及损失是成反比的.全量备份比增量备份成本大得多,但灾难发生后恢复却容易许多;备份的频率越高,灾难发生后损失的数据就越少.WEB空间数据备份在任何情况下都是很复杂的事情,即使Dreamhost提供SSH,crontab和专用支持rsync的备份服务器....

Just a post

| | Comments (263) | TrackBacks (0)
好吧.我承认是为了写一篇Post而写一篇Post.
So ,Just a post ?

哈哈

PS:圣诞快乐.Merry Chrismas

Wordpress怎么一天到晚更新啊

| | Comments (14) | TrackBacks (0)
2.6.5版发布了 - -修复了三个Bug和一个安全漏洞.也就是说自2.6以后,已经发布了5个版本

对于Web程序而言(实际上也是对所有软件),稳定(Stable)版本发布频率越慢越好.因为每次升级的成本都很大. - -

主程序本身升级并不难.对Web程序而言,通常只需一句svn co命令.但每次升级都得先备份文件和数据库,升级后还得检查各种主题,插件的兼容性 - - 如果对旧版本程序Hack过的话,还得重做一遍.对生产环境而言,整个过程的成本是非常巨大的.并且升级还可能造成系统需求和环境配置要求的变化,这都是未知因素和风险.

还记得Wordpress一个著名的BT插件 All in One SEO吗? 这个插件几乎一天更新一次.有时甚至一天更新几次, 刚升级完后台又提示有新版本 .- - 在WP2.5以前这几乎是恶梦啊,WP2.5加入了插件自动更新功能,日子才好过了点,每次升级时点一下即可,(这个插件原来本身也有one click update功能,不过需要allow_url_open ,DH上默认不能) .不过最近听说 All in One SEO的作者宣布停止维护这个插件了 - -,倒有些遗憾.





Categories

Pages