Archive

Archive for the ‘IT’ Category

Make Ibus-pinyin 1.2.99.20091211 Support Xiaohe Double Pinyin Schema

August 28th, 2010 Iron_Feet 4 comments
分享家:Addthis中国

自从某次因为安装 Windows 7 把我的 GRUB 弄坏了,我一直懒得修复(看来我不算一个比较忠实的 Ubuntu 用户),导致我很久没有进去过我的 Ubuntu 9.10。

Ubuntu 10.04 发布了一段时间了,看着这个全新 LTS 版本的出现又让我心动了,终于还是安装了。用 Linux 最纠结的还是输入法的问题。之前用过 SCIM ,小企鹅,感觉都不怎么好用。一直到 iBus 的出现,至少它的用户体验和记忆联想都做得很不错。

可惜本人是个双拼用户,而且用的还是目前比较小众的小鹤双拼方案(虽然比较小众,但是我个人觉得它的设置更科学)。这次的 Ubuntu 10.04 自带的 iBus-pinyin 1.2.99.20091211-1ubuntu1_i386 版本竟然支持双拼了,太兴奋了。高兴之余,也看到了遗憾,双拼方案里面还是没有小鹤双拼方案,而且还不支持自定义双拼方案,唉!

我抱着试试看的心情,查看了一下 iBus-pinyin 的相关文件,结果是:无任何和双拼配置相关的文件。无奈之下,我只能下了 iBus-pinyin 的源代码看看

apt-get source ibus-pinyin

意外地在在源码包 src 文件中找到了 DoublePinyinTable.h ,里面正是关于双拼方案的代码,我一直没法理解为什么不把双拼方案做在配置文件里面。我去了 Google Code 找到了 iBus-pinyin 的最新源码,再一次意外地发现,最新的 1.3.10 里面已经预设小鹤双拼方案,哈哈。

赶紧准备编译

./configure
make

竟然报错:

LookupTable.h: In member function ‘guint PY::LookupTable::orientation()’:
LookupTable.h:39: error: ‘ibus_lookup_table_get_orientation’ was not declared in this scope
LookupTable.h: In member function ‘void PY::LookupTable::setOrientation(gint)’:
LookupTable.h:50: error: ‘ibus_lookup_table_set_orientation’ was not declared in this scope

看了下源码, iBus-pinyin 的代码中 include 了一些 iBus 的头文件。而且这几个头文件,我已经安装了 libibus-dev 已经有了。于是下了最新版的 iBus 1.3.7 的源码一看,这个是新版本才有的新函数,看来如果不安装新版本的 iBus 即使利用最新版里面的文件通过了编译,使用也是有这个那个的问题。但是现在 Ubuntu 已经把 iBus 作为默认输入法框架了,针对系统做了优化整合,如果擅自通过非 Ubuntu 源内的安装包进行更新的话,有可能会出现问题,真是悲剧,看来还是得在 iBus-pinyin 1.2.99.20091211-1ubuntu1_i386 上面下功夫了。

DoublePinyinTable.h 里面放着的是支持的几个双拼方案中声母韵母的键盘映射。反正我不会用里面其他的双拼方案,我就挑了个和小鹤双拼最接近的自然码对应表下手,把自然码的映射换成小鹤的。

具体替换如下:

$ diff DoublePinyinTable.h Xiaohe/DoublePinyinTable.h
2c2
<     PINYIN_ID_VOID, // A
---
>     PINYIN_ID_ZERO, // A
6c6
<     PINYIN_ID_VOID, // E
---
>     PINYIN_ID_ZERO, // E
28c28
<     PINYIN_ID_VOID, // ;
---
>     PINYIN_ID_ZERO, // ;
60c60
<     PINYIN_ID_VOID, // A
---
>     PINYIN_ID_ZERO, // A
64c64
<     PINYIN_ID_VOID, // E
---
>     PINYIN_ID_ZERO, // E
90,92c90,92
<     { PINYIN_ID_OU,   PINYIN_ID_VOID }, // B
<     { PINYIN_ID_IAO,  PINYIN_ID_VOID }, // C
<     { PINYIN_ID_UANG, PINYIN_ID_IANG }, // D
---
>     { PINYIN_ID_IN,   PINYIN_ID_VOID }, // B
>     { PINYIN_ID_AO,   PINYIN_ID_VOID }, // C
>     { PINYIN_ID_AI,   PINYIN_ID_VOID }, // D
99,100c99,100
<     { PINYIN_ID_AO,   PINYIN_ID_VOID }, // K
<     { PINYIN_ID_AI,   PINYIN_ID_VOID }, // L
---
>     { PINYIN_ID_UAI,  PINYIN_ID_ING  }, // K
>     { PINYIN_ID_UANG, PINYIN_ID_IANG }, // L
102c102
<     { PINYIN_ID_IN,   PINYIN_ID_VOID }, // N
---
>     { PINYIN_ID_IAO,  PINYIN_ID_VOID }, // N
104c104
<     { PINYIN_ID_UN,   PINYIN_ID_VOID }, // P
---
>     { PINYIN_ID_IE,   PINYIN_ID_VOID }, // P
111,114c111,114
<     { PINYIN_ID_IA,   PINYIN_ID_UA   }, // W
<     { PINYIN_ID_IE,   PINYIN_ID_VOID }, // X
<     { PINYIN_ID_UAI,  PINYIN_ID_ING  }, // Y
<     { PINYIN_ID_EI,   PINYIN_ID_VOID }, // Z
---
>     { PINYIN_ID_EI,   PINYIN_ID_VOID }, // W
>     { PINYIN_ID_IA,   PINYIN_ID_UA   }, // X
>     { PINYIN_ID_UN,   PINYIN_ID_VOID }, // Y
>     { PINYIN_ID_OU,   PINYIN_ID_VOID }, // Z

改完后,马上试试吧。这会可不忙着马上编译。先看看 configure 文件里面的内容,发现它默认的文件夹和 Ubuntu 源安装用的文件夹不同。看来 configure 的时候需要加几个参数。

./configure --prefix=/usr --exec-prefix=/usr --libexecdir=/usr/lib/ibus-pinyin
make

编译通过后可别忙着安装,这是完全没有必要的。这套源码包是源里面最新版的,所以我们只需先安装源里面最新的 iBus-pinyin 先。

未安装 iBus-pinyin 的朋友只需

sudo apt-get install ibus-pinyin

就OK了。

已安装的则需要保证它是最新版本的。

sudo apt-get update
sudo apt-get upgrade

然后将刚刚我们修改了双拼方案编译出来的 iBus-pinyin 中的 ibus-engine-pinyin 覆盖掉系统中没有小鹤双拼方案的 ibus-engine-pinyin ,如果不放心的话就备份一下旧的(记得把 iBus-Daemon 关了,不然你是没法复制过去的,嚯嚯)。为了确保没有问题,记得修改一下用户组和用户。

killall ibus-daemon
sudo chown root:root ibus-engine-pinyin
cp /usr/lib/ibus-pinyin/ibus-engine-pinyin /usr/lib/ibus-pinyin/ibus-engine-pinyin_bak
cp ibus-engine-pinyin /usr/lib/ibus-pinyin/ibus-engine-pinyin
ibus-daemon &

这样子基本就OK了。哈哈!进入配置选择双拼,方案选择“自然码”(当然已经被替换成小鹤双拼方案了),开始使用我习惯的小鹤双拼方案。虽然还有不少不尽如人意的地方,不过至少能忍了

最近附上本文的一些相关数据,不保证文中一些方法在其他环境下适用。

  • 操作系统:Ubuntu 10.04
  • 内核:2.6.32-24-generic
  • iBus版本:1.2.0.20091215-1ubuntu4
  • iBus-pinyin版本:1.2.99.20091211-1ubuntu1
  • g++ gcc版本:(Ubuntu 4.4.3-4ubuntu5) 4.4.3

相关文件

对于输入法我只要可以暂时使用小鹤双拼方案就行了,所以直接把自然码替换成小鹤就OK了。相信我不少完美主义者会希望直接多了个小鹤的选项。

各位完美主义者们可以试试:直接在 DoublePinyinTable.h 添加了小鹤的映射数组,然后在 setup 文件夹中的界面文件 ibus-pinyin-preferences.ui 里面中增加一下小鹤的选择项,同时还需要把 po 文件夹中的各个语言包 po 文件中将小鹤选项的语言翻译添加进去,然后就OK了。当然如果用这种方法修改的,就不能用上面的替换法来做了,编译完后需要安装

sudo checkinstall

建议使用上面的 checkinstall ,通过这个命令安装后它会生成一个 deb 文件以备以后用来安装,如果安装失败的话它会回滚,以免残留垃圾文件。需要注意的是 checkinstall 需要另外安装一个包

sudo apt-get install checkinstall

先写到这吧。最后希望 iBus 能够早日支持自定义双拼方案,方便大众

Categories: IT Tags: , , , ,

Httpd.worker Confused Me

July 31st, 2010 Iron_Feet 1 comment
分享家:Addthis中国

最近因为一个服务需要改版,而且是前端和后端都需要更新。那就免不了要倒腾一下 MySQL 、 Apache 这些服务了。

其实我是很怕倒腾服务器搭建的,在我看来,这要比搞研发麻烦的多,因为每次倒腾这些东西总会因为一些自己莫名其妙的疏忽或者是服务的 bug 而引起一堆连锁反应。

这次的起因其实是个很不起眼的事情。优化完数据库之后需要把数据库搬迁到另外一台服务器上,无意间发现 Apache 的日志很大。看了下 httpd.conf 配置文件,似乎是把日志的级别调的太低了,导致出现了一堆没用的日志。那就改一下配置文件吧,然后输入命令重启apache服务让配置生效。

service httpd restart

Apache 服务关闭失败,给我的回复是一个错误,悲剧!

[crit] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. Pre-configuration failed

其实之前也遇到过这个情况,我怕重新编译 PHP 后搞出什么别的问题,每次都是

killall httpd
service httpd start

完事。

想想每次这样也不是办法,于是就把 PHP 重新更新编译了一下。

yum update php

重启 Apache ,成功。本以为 Apache 的折腾到目前为止就告一段落了,哪知道新的问题又冒出来了。PHP页面可以被解释执行,但是 PHP 只要一操作 MySQL 就出错。根据以前的经验,我下意识的认为这是 php-mysql 模块丢失或出错导致的问题。于是想都不想地重装一下 php-mysql 模块。

yum reinstall php-mysql

无效,看看

<?php
phpinfo();
?>

php的编译信息里面竟然有 –without-mysql ,太雷了,更新了 PHP 之后,竟然变成这个样子。

百思不得其解之时,我用 top 看了下执行的进程,原先的 httpd 竟然都变成了 httpd.worker。上网查了下发现 worker 是 apache 不同于默认 prefork 模式的另外一个运行模式。

不光通过 .worker ,通过命令也可以区分。

$ httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
$ httpd.worker -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c

更恼人的时候,这个模式不支持 php-mysql ,这真是要了我的命。得想办法切换回 prefork 模式试试看。

killall httpd.worker
/usr/sbin/httpd -k start

PHP 顺利连接 MySQL,由此可见问题出在了 service 上,它自作主张启动了 httpd.worker 。于是查看一下 /etc/init.d/httpd ,里面有一段清楚写着:

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

看来问题的根源找到了,把 /etc/sysconfig/httpd 中 HTTPD=/usr/sbin/httpd.worker 改为 HTTPD=/usr/sbin/httpd ,果然问题解决了,现在 PHP 可以连接 MySQL 了,service 启动 Apache 也正常了。哈哈~

唠叨了下这次改版遇到的问题。感觉自己遇到问题还是不够冷静,有些时候光靠经验不冷静思考还是挺容易走弯路的。其实在这次改版遇到的问题还不止这个,这篇已经够啰嗦了,就留到下次再说吧。
上面所提到的一些路径都是我用 yum 安装的默认路径,如果有些朋友是自己编译源码安装的,那路径会和文中有出入,请自行更换正确路径。嚯嚯!

Some Little Tools

July 7th, 2010 Iron_Feet 11 comments
分享家:Addthis中国

越来越临近毕业了!最近的生活也是按部就班地进行着:上班、等毕业、同学聚餐、找房子外加一些离校手续。

入职已经一个月了,也慢慢开始熟悉了组里的工作。最近的工作经常会和时间戳打交道,每次看到那一串整数我就犯晕不知道有没有高人,一看时间戳就能说出他的年月日和时间,那就太彪悍了。显然我不是那种高人,于是乎只能自己写个小工具来换算这一堆堆的时间戳。

后来想想这种小工具在需要的时候还是挺实用。虽然写起来很简单,但是很多人会因为太简单而懒得写,我何不把它放出来大家一起用呢。想到这,我决定在我的博客开一个新页面叫“Tools”(您可以通过这个链接进入,也可以通过本博菜单中的“Tools”进入),把一些小功能写出来了放在里面。既方便自己使用,也方便各位朋友使用。

想到了就开始行动了,第一个进驻Tools页面的当然就是“Timestamp”了,通过这个工具可以方便的实现时间戳和日期时间的互换。由于本工具是使用 RFC2822 标准的日期时间格式,所以任何时区的时间都可以用这个来转换成时间戳。当然前提是格式要对。如果不了解 RFC 格式的朋友可以直接照着页面中的格式写就OK啦。

我随后又添加了一个我个人觉得比较常用的功能——Encoding & Decoding,目前此页面只有 URL 编码解码和 MD5 编码功能。功能并不是很丰富。

现在 Tools 页面就两个功能。我会慢慢地加入一些新的工具,供大家使用,当然也包括我自己。各位有什么好的建议和想法都可以说来听听,集思广益嘛~嚯嚯

Categories: IT Tags:

Sth. About B/S & C/S , And Some Miscellaneous Things

June 7th, 2010 Iron_Feet 7 comments
分享家:Addthis中国

一段时间没更新了,把我这几天一些事情扯一下:


华丽的分割线

每每提到 B/S 和 C/S 结构,总会引起一些针对他俩孰好孰坏的唇枪舌战。 而这类口水战基本都是围绕着易用性等等问题展开的。

前几天和朋友的闲聊,突然让我有了扯扯这个话题的冲动。也许显得老生常谈了,但是我只想说说我对于这两类结构一些普遍说法的不同看法。

首先是易用性:很多人指出, B/S 结构可以让用户省去了安装客户端麻烦,用户可以随时随地地使用系统。 B/S 结构也可以减轻开发人员的负担,让开发人员不用花费太多精力在客户端的跨平台问题上,可以更专注于功能上。但是事实上真的是如此吗?

在很多人看来, C/S 结构面临的一个最大的问题就是跨平台问题。客户端程序如何在各种系统中都能游刃有余,势必成为开发过程中一个不可避免的问题。但是 B/S 难道就没有这个问题吗?

随着软硬件的发展,我们现在已经不能将“跨平台”看成仅仅是操作系统的兼容性问题了。“跨平台”中的“平台”应该从操作系统扩展到浏览器,甚至是分辨率等等了。

其实当开发人员为了 C/S 结构的客户端如何跨平台而发愁的时候, B/S 结构系统的开发人员也在为这个问题而纠结。万恶的 IE6 就不用说了,这个是兼容的头号杀手,也难免现在各大巨头(如 Google, Facebook, Twitter )表示终止支持该死的 IE6 了。除了 IE6 ,浏览器解释引擎之间的不兼容性也是个大问题,相信把“解释引擎”俗称为“浏览器内核”大家会更亲切,如 IE 的 Trident 、 Firefox 的 Gecko 以及 Chrome 的 Webkit 等等。当然随着移动智能终端的普及,移动设备的浏览器也日趋强悍,移动设备的小分辨率也会让开发人员着实折腾一下。

个人觉得,易用性这个东西总是相对而言的,他需要在用户和开发人员之间寻找到一个合理的平衡点。其实无论是 C/S 还是 B/S 结构,都没有什么绝对的易用优势。开发人员和用户的微妙的关系决定了:这个易用性通常只能存在于两方中的一方。如下现象应该也算是一些普遍现象了:一些极棒的 Windows 程序与 Linux 程序没有相应 Linux 版本和 Windows 版本;有些网络应用都是 IE Only (我这里并没有特指某些网上银行和招聘网站)。这些并不全都是技术层面上无法实现的问题,可能是开发人员的问题;也可能是开发人员懒得处理、觉得不值得不想处理,又或者技术不到家又不想学习,又又或者开发人员是个 Windows 或者 Linux 偏执狂等等。总之原因千变万化,但用户和开发人员之间的这种关系也是不会变的。

然后另外一个需要提到的是负载问题。 B/S 结构一般给人的第一感觉是,你无需一个强悍的 PC ,有一个浏览器和足够带宽的稳定网络,问题就解决了。它将大多数的操作交由服务器处理,减小了用户的配置要求和负担。但是随着同时使用用户的增多,对服务器的压力也越来越大。

有时候作为一个应用,给用户一个高自由度的选择比替用户做决定似乎更好一点。记得我曾经玩过一个网络游戏,它的客户端安装文件有两个版本:1、文件大小大,包含了游戏几乎所有素材。即安装后会占用本机很多空间,但即使用户网络带宽不够高和稳定,游戏也不会太卡;2、文件大小很小,安装后也不会占用多少空间,游戏时所有的素材以临时文件的形式下载使用,但对用户网络质量要求很高。我觉得这就是个很好的例子,不需要将负担全部由服务器扛着,也不需要担心用户的 PC 不够强悍,一举两得,当然这又和之前我们提到的易用性问题扯上了。这个设定会让用户觉得很惬意,但是对于开发人员就是更多的工作投入。其实归根结底还是个平衡点的寻找。

当然随着 HTML5 的发展, B/S 结构应用也会变得自由度越来越高。相信这对浏览器的发展也是一个重大的考验,要不然类似“Google Wave”这种很牛但却很卡的应用就层出不穷了。

终于把这老生常谈的话题扯到尾声了,其实没什么太大的新意。我对 B/S 和 C/S 没有绝对的倾向,只是觉得现在网络上的一些言辞把 B/S 结构说的太玄乎了,所以想针对我认为并不太正确的普遍看法说说自己的想法,给 B/S 和 C/S 的口水战添乱一下。


接下来的 PS 比较长,我想了下还是加个华丽的分割线吧

PS:很早前在 FRDC 实习过一段日子,也 Check out 很久了。最近开始了在 Sohu Rd 实习。比之前的忙碌了些,但是非常开心,组里面的气氛很好, Mentor 也给了我很多指导和帮助,非常的感谢他 。由于忙了一阵子,所以最近博客更新率变低了一些,不过好在我已经对“风云阁”有了强迫症,一但长时间不更新我就浑身不爽,也算是个割舍不下的感情了。风云阁一定会一直更新下去的,和各位多多交流,哈哈!

在此一定要补上对在 FRDC 时帮助过我的同事们的感谢(以认识时间先后为序):孙部、舒祺、Liang Su 、 Ppan 、 Yiwen Zhao 、老郭、老田、杨老师 、小崔、Lei Fu 、Wenting Mao 、夏总、 Zhenliutianyu 、 Shupeng Wang 、 Fujiang Ge 等等。

再PS:昨天我在地铁上彻底被雷到了。车抵地铁 10 号线某站的时候,上来一身材曼妙的黑丝“女”。我刚好低头在玩 ipt ,抬头一扫:细腿黑丝->蓝紫色连衣裙->小蛮腰->披肩发,接下来:我靠,那脸一看就知道是个男人。我竟然遇到个异装癖,天哪。然后他和旁边的几个朋友有说有笑,那粗粗的嗓音,我疯了。到下车的时候, Dorothy 无意间手臂外侧蹭到了那个“女”的胸部,只听“她”叫了声“哎呦,我的胸啊!”我彻底雷崩了。 Dorothy 和我说,她能感觉到里面是一些填充物。啊!服了服了,重口味

Categories: IT Tags: , ,

Data Backup With Robocopy

May 17th, 2010 Iron_Feet 11 comments
分享家:Addthis中国

信息时代发展到今日,电子产品也越来越精细和强大,但是依然存在着一个永恒不变的真理——没有不会坏的电子产品。

当我们把越来越多的资料塞进移动硬盘、光盘、闪存或者是其他电子设备中,无论这个设备多昂贵,口碑多好,我们多少总会担心,设备会不会出问题而导致数据的丢失,尤其当里面的数据是很重要的时候。

话说前几天,毕业答辩的时候,我就遇到了尴尬。我的U盘里面拷贝出来的 PPT ,竟然在演示 PC 中无法打开。幸亏事先带了两个 U 盘,把我的 PPT 各拷贝了一份,才没有让我的答辩成了个大笑话!

这种对数据丢失的不安感,使得备份变成了数据保存非常重要的一个环节。

近期,由于一些原因,我需要对几个站子进行集中备份,因此用到了在 Windows 下的一个复制神器—— Robocopy !

根据 Wikipedia 提到:

Robocopy, or “Robust File Copy”, is a command-line directory replication command. It has been available as part of the Windows Resource Kit starting with Windows NT 4.0, and was introduced as a standard feature of Windows Vista, Windows 7 and Windows Server 2008.

也许有朋友会认为,备份站子的话,用 SVN 的之类的源代码管理就OK了。其实不然!SVN毕竟只是个源代码管理工具,但是一个站点所包含的除了代码之外,还有媒体文件、数据库等等数据,这些都不是 SVN 所能驾驭的。我相信极少有人会用 SVN 备份媒体文件和数据库文件,当然非要有人这么做,那我也无话可说。

接下来我们就以站子备份为例:

  1. 站点备份必然是需要将其备份到另外一个服务器上(备份在本机就失去了备份的意义了),所以我们为了方便需要将另外服务器映射到本地盘符,方便以后的操作。
    net use n: \\10.167.174.60\ironfeet  "password" /user:"ironfeet" /persistent:yes
    rem n: 为目标服务器共享文件夹所要映射的盘符
    rem \\10.167.174.60\ironfeet 为目标服务器共享文件夹的地址
    rem "password" 目标服务器共享文件夹登录密码
    rem /user:"ironfeet" ironfeet 是目标服务器共享文件夹的用户名
    rem /persistent:yes 对提问始终选择 yes

    这样子目标服务器的共享文件夹就映射到了 n 盘。

  2. 数据备份要开始了,也就是说 robocopy 就要登场了!
    robocopy E:\PHP\newfiles\public_html n:\public_html /mir /e
    robocopy "D:\Program Files\MySQL" n:\MySQL /mir /e
    rem E:\PHP\newfiles\public_html 页面文件、媒体文件等等文件的目录; n:\public_html 备份的目标位置。
    rem "D:\Program Files\MySQL" 数据库文件目录(如果路径有空格,需要用双引号包围); n:\MySQL 备份的目标位置。
  3. 为了方便我们可以将这些操作放入一个批处理文件 Autobk.bat 。将以上内容都写入。
    rem Autobk.bat 自动备份文件
    net use n: \\10.167.174.60\ironfeet  "password" /user:"ironfeet" /persistent:yes
    robocopy E:\PHP\newfiles\public_html n:\public_html /mir /e
    robocopy "D:\Program Files\MySQL" n:\MySQL /mir /e
  4. 人总有忘事的时候,所以建立一个批处理文件,但不能定时去执行,那这个文件和废物没分别。这个时候会发现 Windows 的计划任务真是好东西啊。我们可以在 Windows 建立一个计划任务,设定每天 Windows 在凌晨一点自动运行该批处理文件,然后一切就不需要管他了。当然值得注意的是,凌晨一点,这两台机器可一定要处于开机状态哈
  5. Robocopy 在进行下一次备份时候,会和前一次备份的文件进行比对。如果有不同的他会在目标文件夹下建立一个 trash 文件夹,将有变化的原文件进行备份。

    如果需要对多个服务器中的数据集中备份到一个服务器,而且这些服务器并非都是 Windows 的,我的方法是找一个装有带 Robocopy 的 Windows 机器作为中介来实现。其中非 Windows 系统的文件夹可以利用 Samba 来实现和 Windows 之间的共享。

    我将几台源服务器和目标服务器都映射到中介PC中,进行计划任务的集中备份。如下:

    rem Autobk.bat 自动备份文件
    net use n: \\10.167.174.60\ironfeetA  "password" /user:"ironfeet" /persistent:yes
    net use o: \\10.167.174.60\ironfeetB  "password" /user:"ironfeet" /persistent:yes
    net use p: \\10.167.174.60\backup  "password" /user:"ironfeet" /persistent:yes
    robocopy n: p:\A /mir /e
    robocopy o: p:\B /mir /e

    本文并没有对 Robocopy 进行详解,此文的目的仅仅是希望能起到一个抛砖引玉的作用。

    Robocopy 还有很多参数开关值得挖掘,如 /LOG+: 可以实现日志文件的追加导出等等,都可以从官方技术页面找到。

    值得提到的是, XP 目前还属于用户群很大的 Windows 操作系统,遗憾的是 XP 并不自带 Robocopy 。当然把其他 Windows 系统中的 robocopy.exe 拷贝到 XP 的 windows\system32 文件夹中,一样可以运行。但是我觉得这个会涉及到一个版权问题。

    一般情况下,微软操作系统中工具,如扫雷等等,都是在您购买了正版的系统才认为您有使用它的权利。即使您用的是正版 XP ,但是用的却是 7、 Vista 或者其他 Windows 系统的工具,一样构成侵权。

    不扯版权问题了,我可不想这篇博文的评论区,变成正版用户和盗版用户的口水战!

Categories: IT Tags: ,

Network Sharing via WIFI Without Routers

May 5th, 2010 Iron_Feet 11 comments
分享家:Addthis中国

五一几天跑 Dorothy 家去玩来着。由于我那古老的 Dell Inspiron 6400n 和移动硬盘极其的重,每次都让我肩膀酸痛,因此去她家我一般都只带便携的东东。这不新入手的 iPod Touch 32G (以下用 ipt 代替) 有用武之地了。

Dorothy 家只能用一台本本通过 ADSL 上网~可怜的是,我和她看的网页风格的非常不同导致只能轮流排队上网。这样也不是个办法。想到我的 iPt 支持 WIFI ,手头又没有无线路由器,如果能把 ADSL 利用本本的无线网卡共享到我的 ipt ,那多好了。相互上网不干扰~既然想到了那就试试吧。

如果 Dorothy 本本的系统是 Windows 7 的话,那是非常方便的事情。有个叫 Connectify 的软件,它可以将你电脑上的无线网卡变成一个 WIFI 热点将 Internet 的访问共享给其他支持 WIFI 的设备。更可喜可贺的是此软件是免费的

官方提到:

Turn your Windows 7 laptop into a Wi-Fi hotspot to share the Internet with friends, co-workers, and mobile devices.

因此该软件只支持 Windows 7。

可惜 Dorothy 的本本是 Windows XP 系统,看来只能另选他法了,唉。

说到这,另外有个软件又不得不提一下,那就是闪联任意通。只要在有 Internet 访问能力的 PC 中安装上这个软件,并做相应主机设置。其他 PC 也需要安装这个软件做相应的从机设置,就可以分享主机的 Internet 访问能力。具体设置方法就不多说了,这个软件用户体验做得挺好,一看就懂怎么用

不过这个分享只能用于 PC 间的共享, ipt 无法安装闪联任意通,所以只能继续寻找别的方法~

在网上看到过一些用过网桥实现共享的方法,但是我试了无数次都无法成功~悲剧,不知道问题出在哪里,最后自己想到了以下方法,也总结了一些可能性的问题。

我们姑且将有 Internet 访问能力的电脑为 PC , iPod Touch 即为 ipt

  1. 右击 PC 的“无线网络连接”(名字也可能是“无线网络连接 1”或“无线网络连接 2”等等,视情况而定),选择“属性”,点击“无线网络配置”选项卡。把“用 Windows 配置我的无线网络设置”钩上,如果已经钩上的话就不用理睬了。
    WIFI1

  2. 点击上图的添加,在填出对话框中, SSID 我们可以填入 ipt ,“自动为我提供此密钥”前面的钩去掉,“这个是计算机倒计算机……”前面的钩钩上,输入密码 54321。点击“确定”。
    WIFI2

  3. 右击 PC 的“本地连接”(名字也可能是“本地连接 1”或“本地连接 2”等等,视情况而定) ,选择“属性”,点击“高级”选项卡。将 Internet 共享连接下面的两个钩全部钩上。点击“确定”。
    WIFI3
    此处有两点需要注意的,很多人无法成功都基本是缘于这两点:

    • 如果您的 PC 中有不止两个可用连接,在步骤2的点击“确定”后,会出现对话框让您选择将 Internet 网络共享给哪个网络连接。你需要选择共享给你的无线网络,一般为“无线网络连接”,当然也可能是别的。如果你实在不知道就每个试一遍 。此时 Windows 会自动将“无线网络连接”的IP静态设置为 192.168.0.1 ,子网掩码为 255.255.255.0 。这个无需我们干扰!
    • 部分朋友可能会遇到这个错误提示。
      WIFI4
      八成是因为 IP 冲突!

      因为 Windows 会把自动把你的无线连接 IP 设置为 192.168.0.1 。如果你的 PC 并非是通过 ADSL 联网,本来就置身于一个路由器内网之中,那你需要做的就是找到内网中是否有其他用户已占用了 192.168.0.1 这个 IP ,将其 IP 改为别的。还有个极大的可能就是你的路由器 NAT 的 Inside Global IP address 是 192.168.0.1 ,此时你不得不修改你的路由器 IP ,关于路由器密码如何修改,请参照路由器说明书

  4. 接下来是 ipt 的设置。开启 ipt 的 WIFI ,连接名为 ipt 的无线网络,输入密码 54321 。连接成功后 IP 地址选择“静态”, IP 地址输入 192.168.0.2 ,子网掩码为 255.255.255.0 ,路由器和DNS都填入 192.168.0.1 。接下来大功告成。ipt 可以上网冲浪啦,哈哈~

PS: 最近 Spirit 的完美越狱正在进行中,很多朋友都在为没有 WIFI 发愁,用这个可以很方便的解决这个问题。

同样上面的方便也适用于其他支持 WIFI 的移动设备,如 PSP 、 智能手机等等。

文中提到的是 Windows 7 和 Windows XP 的方法,至于 Windows Vista 的方法和 Windows XP 的方法大同小异就不再赘述了了(主要是目前手头没有 Vista 系统的 PC ,嘿嘿)。

Categories: IT Tags: , ,

Invitations 4 Microblogs

April 30th, 2010 Iron_Feet 19 comments
分享家:Addthis中国

我是个 twitter 拥护者。在我的概念里面 twitter 已经不仅仅是个微博了。 twitter 能让我看到一些不容易看到的,也让我多了一个唠嗑的地方。我现在已经渐渐把唠嗑根据地从风云阁转移到了 twitter 。

随着 twitter 的火爆。各大网络公司、门户网站都先后发布了自己的微博,我同样也很蛋疼地注册并尝试一下~

关于国内各大微博的评测网上到处都是,我对这些微博就不做评论了,况且这也不是我写此文的目的。此文主要是想把我的几个微博邀请码发出去,反正放着也是浪费~

首先感谢疾风Tinyfool 以及 Rick Lee 给了我凤凰微博新浪微博腾讯微博的邀请码。

新浪微博很早很早就开放注册了,凤凰和腾讯微博是需要邀请码的。目前我的凤凰微博账户下已有为数不多的邀请码;腾讯微博的账户下还没有邀请名额,据说过几天就会有的。

需要邀请码的朋友可留言索要,并请尊重以下规则:

  1. 先留先得原则
  2. 为了各位的隐私,您无需在留言正文写入您的邮箱地址,只需要在评论区的 Email 栏填入正确邮箱地址即可。
  3. 请尽量使用仅仅包含字母、数字和 @ 符号的邮箱地址
  4. 由于数量有限,暂时没有分发到的请见谅,禁止谩骂!一旦有新的邀请名额,我去继续分发。
  5. 请注明你索要是哪个微博的邀请码,即凤凰或者腾讯。对于不标明者或者两个都要的朋友,我会看心情随便给其中一个。由于腾讯的邀请名额还没到,所以需要腾讯微博邀请码的朋友需要多等几天。
Categories: IT Tags: ,

The Use of “do {/*…*/} while(false);” & Some Miscellaneous Things

April 19th, 2010 Iron_Feet 13 comments
分享家:Addthis中国

最近一段时间,意外的事情特别多。此处所指的意外指的是我意料之外的事情,不是所谓的 accident 。

接下来把最近遇到的几个我觉得值得一说的事情提一下。

上周某天,朱磊同学问我,如何可以比较好的把代码中的 goto 去掉。(朱磊背部玉照由 Bida 提供)

这个问题让我想到了 Dbger 学长的一篇日志,里面提到了如何用

do
{
	/***/
}
while(false);

来替代 goto 方法。

很多程序员都把 goto 看成是洪水猛兽,说他会破坏程序结构。当然破坏结构性的确不假,但其实 goto 也没这么一无是处啦。比方说下面这段代码。

bool Execute()
{
	// 分配资源
	int *p = new int;
	bool bOk(true);
 
	// 执行并进行错误处理
	bOk = func1();
	if(!bOk) 
	{
		delete p;   
		p = NULL;
		return false;
	}
 
	bOk = func2();
	if(!bOk) 
	{
		delete p;   
		p = NULL;
		return false;
	}
 
	bOk = func3();
	if(!bOk) 
	{
		delete p;   
		p = NULL;
		return false;
	}
 
	// 省略无数行代码
 
	// 执行成功,释放资源并返回
	delete p;   
	p = NULL;
	return true;
}

如果用了 goto 反而会清晰很多,

bool Execute()
{
	// 分配资源
	int *p = new int;
	bool bOk(true);
 
	// 执行并进行错误处理
	bOk = func1();
	if(!bOk) goto errorhandle;
 
	bOk = func2();
	if(!bOk) goto errorhandle;
 
	bOk = func3();
	if(!bOk) goto errorhandle;
 
	// 省略N多行代码
 
	// 执行成功,释放资源并返回
	delete p;   
	p = NULL;
	return true;
 
errorhandle:
	delete p;   
	p = NULL;
	return false;
}

当然,在一些 goto 的强硬抵制派眼里,这段代码绝对是一坨便便。这个时候就到了

do
{
	/***/
}
while(false);

展示其魅力的时候了。且看

bool Execute()
{
	// 分配资源
	int *p = new int;
 
	bool bOk(true);
	do
	{
		// 执行并进行错误处理
		bOk = func1();
		if(!bOk) break;
 
		bOk = func2();
		if(!bOk) break;
 
		bOk = func3();
		if(!bOk) break;
 
		// 直接喀嚓掉无数行代码
 
	}while(0);
 
	// 释放资源
	delete p;   
	p = NULL;
	return bOk;
}

不用我多说了,效果很明显了。

再次申明,以上是 Dbger 学长在工作中遇到的妙用。我看到后觉得非常棒,故予以提到。


其实本日志的重心是接下来提到的两件事。

话说某天,我走出实验楼很意外的遇见一肥阿婆尾行我。我甚是好奇她会有何行动,故放慢脚步。

见我放慢脚步后,她甚是激动,加快速度赶上,对我叽里咕噜说了一通,大意是:她从郊区过来,钱包被人偷了,肚子很饿。她说她是老师,不是坏人,可否给他买两个包子吃吃。

也许各位看官会觉得我内心太阴暗,我听到她说这些话的时候,第一个想到的是:此女是否是嘴角中藏了一包药粉。骗我给她买包子,她咬了一口包子后立马咬破药粉包,随后口吐白沫,讹我钱财?

我便问她:既然您是老师,您教什么的?她回:我教语文的。我便问:鲁迅原名为何?此女呆滞。我又问:《桃花源记》背一段,不会背说说作者是谁也行?此女呆滞。我又问:骆宾王的《鹅》总会背吧。持续呆滞ing。我呵呵一笑,扬长而去。

随后因为有事,我回实验楼,在途中远望到此肥婆在尾行一女子。我小步跟上,尾行并侧听。待听到她说“我是名老师”,我窜出插嘴道:你教什么的?她慌忙说:历史。我问道:说说长安是哪六朝的古都?此女呆滞。我又问:古代史你不行,那就现代史,说说三个代表。此女估计要吐血了。我再问:那问你近代史:什么代表了辛亥革命的胜利果实被袁世凯窃取了?此女依然茫然。我呵呵一笑,再次扬长而去。被其尾行的女子也走了。

晚上准备回宿舍,我离开实验楼,见此肥婆依然在那,我大步朝她走去,她如同见了鬼魅一般仓皇而逃!真不知道是我背——一天3次遇到同一个骗子,还是她背——一天被我郁闷3次。她也不知道换个阵地


以下内容都是网络信息,纯属道听途说,不知真伪,也不做任何评论,仅仅是复述而已!

这几天我的本科母校——江南大学又被顶到了风头浪尖。真是悲剧。

打从我毕业过后,咋就没怎么听到母校有啥正面新闻呢。真是应了一句话“好事不出门坏事传千里”。据相关报道,江大澡堂用的洗澡水竟然是炼钢的废水,里面的铅含量超标10倍。截止到现在,此澡堂依然营业中

而且此水已为学校服役两年之久。呃真庆幸我毕业不止两年了~

校方回应:此水完全符合标准。但是几名化工学院的学生检验后发现铅严重超标,据说这几个学生还蛋疼地去检验了食堂的米饭,发现米饭奇迹般地符合了牲畜的饮食标准,一阵内牛满面!

衷心希望,江大不要再搞出这么多新闻了。也希望中科院研究生院在我毕业之后,依然多多的出正面新闻

The Google Chrome Extensions I Used Recently

April 1st, 2010 Iron_Feet 15 comments
分享家:Addthis中国

Updated on Apr. 6,2010: 增加了对扩展 Turn Off the Lights 的介绍

从 Google Chrome 刚发布,我就被 Chrome 的快速、清爽和简洁所迷住。

更让我对 Chrome 爱不释手的是 Google 的敬业。我看到了 Chrome 的不断完善以及实用功能的不断增多。最令我兴奋不已的功能之一——对扩展的支持。

Google Chrome Extension 站上线之后没多久,我就开始使用 Chrome 的扩展。也发现了一些我比较欣赏的好插件。

下面我向各位介绍一下几个我目前在使用的扩展。以下插件排名不分先后,以首字母为序。

  1. Bookmark Sentry
    相信每位朋友在网上冲浪的时候,一旦看到有价值的页面都收藏下来,因此收藏夹也是可选方案之一。

    久而久之,收藏夹变得越来越臃肿,同样收藏夹里面的很多链接已经失效。但是面对着收藏夹中无数的页面链接,如何快速找出所有的死链接呢?

    相信 Bookmark Sentry 是最好的选择,它能够快速地把收藏夹中的死链接和重复链接找出来,并给予用户选择处理方法。而且此扩展可后台工作,用户可以自行设置扩展的检测间隔
    Bookmark Sentry

  2. Close duplicate tabs
    很多人在冲浪的时候都喜欢一下子打开 N 个页面标签,然后等留着慢慢加载。但有时会不慎打开相同的页面。但是如果遇到如下情况,完全开不清标签的文字,想找到重复的标签,谈何容易!
    Many Tabs
    只要点击一下 Close duplicate tabs 的按钮,它会迅速把重复的标签关闭的只剩一个。

  3. Cookie Editor
    我想这个插件,开发及测试人员应该用得比较多。开发人员可以随时查看该站的 Cookie ,具体就不多说了。

  4. Deng Google Bookmarks for Chrome
    我个人对于书签的使用习惯是:长期保留和使用的页面,我会保存在 Google Bookmarks 里;而暂时使用的页面,我只会保存在浏览器收藏夹。

    以前使用 IE 和 Firefox 的时候,我可以通过 Google Toolbar 轻松获取 Google Bookmarks 里面的标签,但是 Chrome 不支持 Toolbar ,所以我找到了 Deng Google Bookmarks for Chrome 来实现这个功能。

  5. FastestChrome – Google Faster
    扩展如其名,这个扩展可以在很大程度上提高你的冲浪速度。

    • 划词多引擎选择搜索
      search

    • 活化文本链接
      简单的说就是将页面中的地址文本和邮箱文本转换为可点击的链接

    • 把翻页变为页面底部延伸
      google.com 的效果如下图:
      Google Extend
      google 搜索的第二页被延伸到了第一页的底部

  6. IE Tab
    这个扩展我就不多说了,用它实属无奈。现在还是有不少 IE only 的站子和应用,唉

  7. One Number
    用一个数字将显示你在 Google 应用中的未读数目。可选应用有 Google Reader 、 GMail 、 Google Voice 以及 Google Wave 。
    One Number

  8. Proxy Switchy!
    这个就不用多说了,看名字也知道。通过它可以方便切换代理,而且这个插件支持 Socket 5.0 的 Remote DNS Resolve 。关于 Remote DNS Resolve 的作用,参见此文

  9. Search preview
    通过这个扩展, 百度、 Google 、 Yahoo 、 yandex 、 rambler 、 bing 的搜索结果将会有预览图片。我个人觉得非常方便和实用~

  10. Send using Gmail (no button)
    GMail 是我最常用的邮件服务。不得不说, Google 提供的这个免费的邮件服务非常之棒。

    通常情况下,网页中的邮件地址链接如下

    <a href="mailto:iron_feet@hotmail.com">Iron_Feet</a>

    但是令人不悦的是,点击该链接后,打开的是本机的默认邮件客户端,如 Outlook 、 Foxmail 等等。而使用该扩展后,页面中的邮件地址链接将会自动转换为如下

    <a href="https://mail.google.com/mail/?extsrc=mailto&url=mailto%3Airon_feet@hotmail.com">Iron_Feet</a>

    此链接点击后,将会打开 GMail 进行发送邮件的下一步操作。

  11. StayFocusd
    如果你是只网虫,而且是只自制力不行的虫子。那么这个扩展绝对是不二之选!

    通过这个扩展,你可以对你上瘾的站点设置浏览时间。一旦你的浏览时间超过了预设的时间,该扩展会阻止你访问此部分站点。
    StayFocusd

    如果你害怕会忍不住把这个扩展禁用了。那你可以开启 Require Challenge 功能。开启这个功能,你如果想修改设置需要毫无错误输入如下文本。

    The procrastinator is often remarkably optimistic about his ability to complete a task on a tight deadline; this is usually accompanied by expressions of reassurance that everything is under control. (Therefore, there is no need to start.) Lulled by a false sense of security, time passes. At some point, he crosses over an imaginary starting time and suddenly realizes, “Oh no! I am not in control! There isn’t enough time!”

    如果您使用的是 Firefox ,也向您隆重推荐 LeechBlock 这个有类似功能的外挂。也许很多人习惯把 Firefox 的外挂称为插件,根据官方的用词 Add-on ,应为外挂。

  12. Thunder,QQDownload,FlashGet Files Downloader
    相信有不少朋友会和我一样,特别痛恨类似于迅雷、网际快车、旋风等下载软件使用加密链接。而这个扩展会在你点击加密链接的同时,把加密链接进行解密,变为 Chrome 可识别的链接。

    目前该扩展支持迅雷、网际快车、旋风的链接。

  13. Turn Off the Lights
    这个是个很有趣的扩展。

    现在越来越多的人喜欢看 FLV 的在线视频。但是由于 FLV 一般都不够清晰,所以很多人没有全屏看 FLV 的习惯。

    但是看电影的时候,后面页面白白的背景使得影片的质量大打折扣。而这个插件可以让您再看 FLV 视频的时候把背景的页面变黑!是不是很有趣哈?

  14. XML Tree
    Chrome 对 XML 的支持实在是让我无法恭维。丑死了,丑的没法说。
    使用了这个扩展,效果会提升不少,有图为证:
    Douban XMLDouban XML Tree

  15. 网络硬盘文件搜索引擎
    不必多说,这个是一个 Google 的自定义搜索。可以搜索 Google 对各类网盘的索引。

对于 Chrome 的扩展我就介绍到这吧,也希望朋友们如果有好的插件的话,请介绍一下!

PS: 前几天大斌和表嫂喜得贵子。本月,烨兄弟就要结婚了。在此一并恭喜他们了。为他们高兴啊~

Categories: IT Tags: , , ,

Bypass Some Restrictions by Using JavaScript Injection

March 22nd, 2010 Iron_Feet 18 comments
分享家:Addthis中国

本文完成于昨天,本打算今日检查一遍后发布的。让我最难以料掉的是,本文用于测试的示例页面竟然很巧合的在今日改版了,不再对密码图片进行隐藏了。也许某天他又会开始隐藏吧

我找了好久都未找到和这个一样的既带有隐藏又具有 referer 限制的页面。唉。无奈还是发布了,毕竟写了这么多了。不过相信有一些前端基础的朋友还是看得懂这篇关于 JavaScript 注入的日志的。

给朋友带来的阅读上的麻烦,深感抱歉~

前几天 Solrex 告诉我一个很有趣的密码公布方式

该站是提供 Podcast 服务的,允许免费使用。但是免费用户需要向该站索取每n分钟更新一次的密码。可恶的是,获取密码的 Podcast password 链接按钮不停地在一个 Google Ad 前面漂浮。
hidepsw.JPG
为了避免不必要的麻烦,如广告嫌疑等等,我把图片的一些文字涂掉了!
点击那个按钮,就会显示出一个密码图片。但是有时候会一个不小心就点到广告。
getpsw.JPG

个人觉得,提供了服务收取相应费用也是很正常的,但是用这种获取免费密码的方式来折腾别人,我只能联想到两个字——变态!我想必然有绕过点击过程的方法。

通过查看源代码,发现密码图片的地址为 http://podcast.overseakids.com/text2png/show_psw_png.php 。我把这个地址直接输入地址栏,直接跳转到了首页。这也是意料之中,我想也应该做了一个限制的,如 referer 的检测等等。

于是,我进一步看了下免费密码获取页面的源代码和CSS,即 http://drupal.overseakids.com/node/17 。发现这么两段 HTML 和 CSS,如下:

<div id="psw"> 
	<img src="http://podcast.overseakids.com/text2png/show_psw_png.php" /> 
</div>
#psw { margin-top: 49px; margin-left: 260px; display: none; z-index: -1; }

由上面的 display: none; 看以看到,显示密码图片的层仅仅是把隐藏了而已。其实只要把 display 属性改为 block ,然后做一些相应的位置调整就 OK 了。

比较便捷的方法,就是直接利用 JavaScript 修改这个页面。代码如下:

function()
{
	var psw=document.getElementById("psw");
	//使 psw 层以“块”形式显示
	psw.style.display="block";
	//层边界为0
	psw.style.margin="0";
}

但是要让这段代码在页面中起到作用还需要做了小小的处理,写成直接可以在地址栏运行的 JavaScript ,即为 JavaScript 植入。如下

javascript:(function(){var%20psw=document.getElementById("psw");psw.style.display="block";psw.style.margin="0";})();

值得注意的是空格,即” “,需要被转换为”%20″。

到目前为止,先进入刚刚那个免费密码获取页面,然后直接在地址栏输入上面这段 JavaScript 代码,密码图片就会出现在那个 Google Ad 下面了。偶尔该站会出现一些问题,密码图片会是空白。

如果各位觉得每次都要复制粘贴这个 JavaScript 代码太麻烦的话,可以新建一个书签,书签的 URL 就是这段代码。当进入免费密码获取页面之后点一下该书签就 OK 了。

可以看到上述的解决方法并不是很完美,如果能让最后仅仅显示一个密码图片的话,那就更整洁和方便了。

其实这个密码图片的地址仅仅做了对 referer 的限制。一般情况下,用 PHP 、 ASP 等服务端脚本可以很方便的自定义一个 referer ,referer限制的问题也就解决了,但是 JavaScript 是客户端脚本,奢望他能自定义一个 referer 简直是天方夜谭。目前我可以想到一个简单的解决方法就是,用 JavaScript 在免费密码获取页面生成一个到密码图片的链接,并进行一个模拟点击。

function()
{
	var psw=document.getElementById("psw");
	//使 psw 层以“块”形式显示
	psw.style.display="block";
	//将 psw 层的内容改为一个 id 为 haha 的链接,改链接指向密码图片的地址。
	psw.innerHTML="<a id=haha href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";
	var haha=document.getElementById("haha");
	//接下来实现对链接的模拟点击
}

由于现在浏览器的种类太多,所以模拟点击的方法也不尽相同。不过大体还是分为 IE 和非 IE 两种。

  1. IE 的方法很简单

    haha.click();
  2. 非 IE 的需要新建事件

    //建立一个事件
    var evt=document.createEvent("HTMLEvents");
    //将该事件初始化为点击事件
    evt.initEvent("click",true,true);
    //针对 haha 链接,进行点击事件
    haha.dispatchEvent(evt);

加个浏览器的判断是很有必要的,目前我所知道的最简单的判断方法是

if("\v"=="v")
{
	//判断浏览器为 IE
}
else
{
	//非 IE
}

综上,结合一下,如下:

function()
{
	var psw=document.getElementById("psw");
	psw.style.display="block";
	psw.innerHTML="<a id=haha href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";
	var haha=document.getElementById("haha");
	if("\v"=="v")
	{
		haha.click();
	}
	else
	{
		var evt=document.createEvent("HTMLEvents");
		evt.initEvent("click",true,true);
		haha.dispatchEvent(evt);
	}
}

修改为可植入 JavaScript 代码:

javascript:(function(){var%20psw=document.getElementById("psw");psw.style.display="block";psw.innerHTML="<a%20id=haha%20href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";var%20haha=document.getElementById("haha");if("\v"=="v"){haha.click();}else{var%20evt=document.createEvent("HTMLEvents");evt.initEvent("click",true,true);haha.dispatchEvent(evt);}})();

这下大功告成,目前在 Chrome 和 IE 下,进入免费密码获取页面,然后再植入这段 JavaScript ,就会跳转到一个只有密码图片的页面,非常干净。
cleanpsw.JPG

目前模拟点击在 Firefox 3.6以及比较高版本的 Firefox 3.5.X 我无法顺利实现。查看了 Mozilla 的开发文档,代码并未看出明显的错误。而且这个代码在老版本的 Firefox 是可以实现的。

我怀疑可能是 Mozilla 公司为了保证 Firefox 的安全性,把一些功能默认关闭了。需要用户自己去 about:config 来开启。
比方说如下代码如今无法关闭 Firefox 的窗口了。

window.close();

如果要是这个代码有效,需要打开 Firefox ,在地址栏输入 about:config ,找到 dom.allow_scripts_to_close_windows 这项并改为 true。

虽然 Firefox 相对安全了,这也反而造成了开发人员的困扰。

如果哪位朋友知道比较好的在 Firefox 中模拟点击事件的方法,不吝赐教!

Categories: IT Tags: ,