Monday, October 15, 2007

drupal 5.2 使用心得

安装:推荐使用LAMP套装

设置:apache2-enable rewirte模块,在 /etc/apche2/sites-available(ubutu 7.04)添加drupal站点的虚拟主机。
sudo a2ensite yousite

mysql-建立与drupal相连的数据库及用户。

drupal:在sites目录中新建站点目录,copy default站点的 settings.php至站点目录。修改setttings.php中的base_url与数据库路径。

php5:添加drupal所在路径至php.ini文件中的include_path参数

Saturday, April 07, 2007

无题

已经千百次地告诉自己要决然回头就此陌路却只能痴痴地望着你的背影渐行渐远直到泪水模糊你纤弱的肩头萧索的脚印并在嘴角泛起一丝冰冷的苦,从此我将活在自己的世界那里是阳光下的黑暗罂粟上的芬芳玫瑰旁的毒蛇.我将高唱这卑浊的人世让它如潮水般淹没所有的喜怒哀伤踟蹰怅惘,我的心将和所有与你的笑与诗悲与曲缱绻共眠,用那记曾燃烧了我的灵魂的你的吻封印在那沧海深处.

Monday, April 02, 2007

将客户端的动态内容变成静态页面的一部分?

在设法实现如题所示的想法之前,我考虑的是这样做是不是有意义?诚然用户体验至上,但是没有人愿意让用户对自己的服务器乱来,"all input is evil",更何况是修改页面这样的事情.而且要实现的不仅是修改一下网页模板,增删文章内容这样简单,而是让用户对网页的DOM操作发送到服务器!

虽然如此,我还是要做下去,因为这件事看起来挺有难度,而且——很酷.整件事情可以分为两个部分,或者称步骤:将操作上传到服务器,储存到数据库;将数据库的更新数据写入静态页面.第一步使用的技术必然是AJAX,因为对DOM的操作信息最后用XML格式来异步发送是最合适的,但是目前对如何在servlet上解析传递的xml参数来更新数据库还有困惑,因此在写到发出异步请求时卡住了.第二步倒是基本实现,再假设数据库更新的前提下设置缓存页,读取数据库信息并写入原静态页面.只是过程中发生了久违的字符编码问题.晕,Filter不也是Servlet的子类么?为什么request.setEncording(String str)的方法显得毫无意义呢?

烦,明天再Google.咳,Oracle的进度已经落下好长一段了.

Thursday, March 29, 2007

转帖:我在重庆九龙坡查访最牛钉子户事件



原文作者:Zola,链接:

我在重庆九龙坡查访最牛钉子户事件



在我的新闻敏感性和企图一夜成名的欲望的驱动下,我星期一中午喝完朋友雄的喜酒后,到娄底市转(A73)火车到贵阳市,然后从贵阳市转火车(5608)到
重庆市,星期三的凌晨终于像一颗疯狂的石头一样滚到了重庆,准备利用私人BLOG来报道重庆九龙坡区杨家坪的"最牛钉子户"事件。



众所周知,这种涉及官方政府的新闻肯定会有一些报道不能面世,或者新闻稿件被不知名的"相关部门"的要求下删除。之前在新浪有一个BLOG在全程24小时
报道,但后来那个BLOG消失了。所以我意识到这是一次机会,我决定千里迢迢来重庆明查暗访,企图了解多方观点。这也许是一个于公于私都非常有益的举动。
于公,可以让更多的人了解到政府是不是依法办事的政府,拆迁户的户主吴苹和杨武是不是守法的公民;于私,如果我因此花上几天时间加上几百块钱路费而名声大
振的话,我将来可以有更多的社会资源用来成就一番事业。如果你能理解,请留言支持我。



从重庆火车站坐207到达杨家坪站,然后去吃米粉,顺便和米粉店老板交流了一下。米粉店老板所了解到的是,据说吴苹他们索价2000万,房地产管理局在报
纸上说"不会接受漫天要价",米粉店老板认为钉子户的户主做得太过份了。我吃完又麻又辣的米粉后,在他们指的方向下继续找"钉子",结果碰到一个正拿着报
纸去上班的男青年,他说让我跟他走就行。我询问他的看法,他表示支持吴苹和杨武,他还告诉我,吴苹他们的父辈是人大代表。快到钉子户大坑的时候,他指给我
看透过房子与房子之间的空隙看到的杨武的房子顶上的国旗,然后他就与我分手了。我于是找制高点拍摄这一奇景,结果发现旁边有一个轻轨站台,叫杨家坪站。重
庆没有地下铁,只有这种"地上铁",叫轻轨。我登上站台后才发现,杨武之所以在自家房顶上放一个写着"公民的合法私有财产不受侵犯"的白条幅,是因为这个
白色条幅会让来来往往的轻轨乘客看到,并且许多乘客在站台上以那个房子为背景用手机拍照留念。这也就是重庆钉子户之所以声名远扬的重要因素之一。并且这块
区域是一个黄金区域,附近有一个步行街,轻轨站也带来许多人流,这块区域更显得寸土寸金了。谁都知道,在上海、北京、广州和深圳等有地铁的城市,拥有地铁
站出口的便利的商品房就会特别贵。



我从站台上拍了几张照片后,然后绕到工地的围墙的大门口附近,也就是杨武的房子背向的那边。门口紧闭着,门内有六七个穿保安制服的人在里面聊天。门上面有
一块牌子,上面写着"施工场地,为了您的安全,未经引领允许,不得进入",我转了一圈,可能是去得太早的缘故,没有发现记者蹲守。然后我买了四份不同的报
纸,找了一个地方坐下来慢慢看,结果没有发现与"最牛钉子户"的报道,旁边有人告诉我,昨天的报纸就有报导。后来,来了一个五六十多岁的老人,我以为他也
想看报纸,我就把另一份报纸递给他,他没看,于是我问他知不知钉子户的事,想不到他居然不正面回答我,而是说了一句很让我震撼的话:" 啥子钉子户哦,那是当官的给他们起的名字!"
这让我很惊奇,我于是掏出手机打开录音功能,我求他再说一次以便我将这么深刻的说法放到网上给人听听,可是他说,录音我就不讲了,然后告诉我"他们只是维
权"就走开了。原来他们以为我是记者了。后来,又来了一位抱着孙子的退休教师,她告诉我,吴苹他们没有什么背景,长辈不是人大代表,杨武的儿子在读书(应
朋友们提醒,已经隐去儿子的相关介绍,请转载的朋友相应改动一下)"。杨武一家在那里开火锅店是开得最早的,生意是最好的,他们没有开价2000万,他们
的房子被估价250万,房地产开发商加100万价,共是愿意支付350万给钉子户,但他们只要求"原地点,原面积,原朝向"的房子,他们不要钱。她还告诉
我,她说她以前在铁马集团的房子也是被恐吓下拆迁的,当时是"工人下岗、干部撤职"的行政手段让他们屈服的,杨武他们之所以敢硬颈,就是因为他们是个体
户,不受体制内的胁迫。



后来,我再到杨家坪站台上时,发现有些人在讨论"钉子户",我于是站在旁边听。原来是两个有类似遭遇的人在诉说,一个是64岁的渝中区的老太,她的有房产
证的房子在渝中区化新村的房子被要求以低于市场价3000元/平800元的2200元/平的补偿价拆掉,安置房却是比补偿价还要贵的尾房;另一位先生是戴
军功章的48岁的陈先生,来自珠海。他的八层楼的房子在哄骗和毒打后被拆掉了,还有集资款被吞了,上访到北京,被一封"来事项转送告知单"推到广东省信访
局,广东省信访局开了介绍信到"珠海市信访局",结果珠海市信访局连信封都不打开,看都不看就报警了,他只好离开。他看到凤凰卫视报道了"重庆钉子户",
所以赶过来看能不能守到记者让记者报道一下。他们问我是不是记者,我说我不是,我只是弄了一个个人网站,我的网站的内容不会被删除。我说我想看一下相关资
料,于是,陈先生带我去他那里拿U盘里的资料,然后刘奶奶也说要我去化龙桥看一下,看能不能也报道一下。于是刘老太和我一起去陈生下塌的地方,拿了一些资
料,看了一些照片,我决定帮他发在我的网站上,利用SEO技术让更多的人知道这些事情。我拿了资料要走的时候,陈生掏出几百块钱塞给我,说是给我的路费。
我从来没有见过这种场面,我从来没有想过帮人家发稿子就能拿钱,我坚持不要,我说我只是出于正义感而帮你,也不一定有什么效果,我说你要感谢我,就请我吃
饭吧。他同意了。其实,我的真实想法是,我若收了他的钱,那我和蓝成长有什么区别?收了第一次辛苦费,也许我还会去收第二次,这会离我展现正义感的初衷会
越来越远。


告别了陈生,我和老太坐车去化龙桥。我接到陈生的电话,说是要帮我订一个房间,我也就心安理得的接受。反正我也要在九龙坡呆几天报道钉子户的事件。



在车上遇到一位中年教师,他用普通话告诉我,钉子户确实没有背景,但他们抓住了政府的软肋。这件事的关键的关键是,地产商还没有获得所有拆迁户的同意就擅
自破土动工,政府监管失职;还有就是,九龙坡区没有一块绿地,这块地在规划中是公园,但政府卖给房地产开发商建造商品房,这是政府不对。这才是19号下判
决,本应该在22日的时候就拆除,但至今仍未拆除的真正原因,这里面有内幕交易。他还说,并且还有搞笑的不合理的地方是,本来是房地产商应该上法院告杨武
吴苹夫妇,但居然原告是九龙坡房管局。也就是说,本来是房子可卖可不卖的民事纠纷变成了行政诉讼。



到了化龙桥,那里一片狼籍,很多信宅楼都空了,还有百分之十的住户由于无处可去而不得不留在那里,都是一些老头老太,他们"摆开龙门阵",跟我讲,政府用
"吓哄骗"的手段让他们服从,而且有不戴肩章的穿制服的人打人,不按市场价给补偿,安置房又是旧房。他们说他们的声音无法发出,所以希望我写写放在网上。
我拍了一些照片


精彩图片我稍候去网吧上传。我先用GPRS上网发了文字再说。欢迎转载,本站所有文章不制止商业转载,只需署名和注明出处。推荐使用标题:最牛网志作者Zola暗访最牛"钉子户"。欢迎关注本站的后续报道。



Monday, March 19, 2007

Java Web 日记:Ajax(三)

理所应当的,写js的高手都应该是对DOM认识深刻的人.对DOM的操作水准直接体现其能力.啥也不说了.以下方法属性纯为备忘.对于其中的Node的使用,IE可能很不上道,切记!

  • 节点属性
    • NodeName
    • nodeValue
    • parentNode
    • childNodes
    • firstChild
    • lastChild
    • previousSibling
    • nextSibling
    • attributes
  • 节点方法
    • insertBefore(newChild,srcNode)
    • replaceChild(newChild,oldChild)
    • removeChild(oldChild)
    • appendChile(newChild)
    • hasChlidNodes()
    • hasAttributes()
  • 文档节点(document)
    • createElement(elementName);
    • createTextNode(text);
    • createAttribute(attributeName);
  • 元素节点
    • getAttribute(name)
    • removeAttribute(name)
    • setAttribute(name,value);
    • getAttributeNode(name);
    • removeAttributeNode(node);
  • 属性节点
    • getAttribute(name);
    • removeAttribute(name)
    • setAttribute(name,value)
  • 文本节点
    • appendData(text);
    • insertData(position,text);
    • replaceData(position,length,text);
  • 节点类型常量
    • Node.ELEMENT_NODE;
    • Node.ATTRIBUTE_NODE;
    • Node.TEXT_NODE;
    • Node.DOCUMENT_NODE;

Java Web 日记:Ajax(二)

几乎立刻的,遇到了跨浏览器的问题.为什么IE就这么不让人省心呢?不但创建XMLHttpRequest有一前一后两个方法,许多相关的属性和方法也无法应用,比如onprogress,onerror;最烦的是对待同URL请求的返回结果的处理.FF是重新请求responseText,而IE先在XML缓存在客户端的数据中查找是否有返回结果,如果有,直接用;没有则再请求服务器.平心而论,这两种处理方式没有正邪之分,但是绝大部分程序员要的是更新后的数据.因此,IE的做法真是天怒人怨(好吧,有点夸大,但至少也是"少数不明真相的群众"的愤怒吧?).就因为这个不兼容,前天的试验项目最终把我的异步回调功能给砍了!简直无比郁闷.

后来上网查了下,解决的方法,一是使用临时URL参数让请求看起来是新的;而是xmlHttp.setRequestHeader("If-Modified-Since","0");每次请求前清空XML缓存.

郁闷,真郁闷.微软这家伙,总是想把世界变成自己的.真希望它也有那么一天,困惑地倒在人民的口水里,喃喃道:"为什么?这到底是为什么?我什么都给他们安排好了,为什么他们不感激我呐?"

Thursday, March 15, 2007

Java Web 日记:Ajax

最近越来越觉得,自己的学习笔记就像是对developerWork、W3shcools这些网站内容的复述.自己只不过是用更适合自己阅读的方式来记载而已.

Welcome Back.Ajax者,常常被认作是Asynchronous javascript and xml 的缩写.但Jesse Garrett否认了这一点.目前为止,只看到一个新玩意儿:XMLHttpRequest.

按照以前的思路,web提交表单数据,服务器执行操作,返回响应.在返回响应前,用户不能做任何事情.而Ajax正如它宣称的那样,实现了异步回调,但其实异步回调有一个暗示,即服务器不能在执行操作后跳转页面,这应该是用户做的事情,他想待在哪里就待在哪里.

据说Ajax导致了web程序业务逻辑和显示逻辑的混乱,没有一个清晰的分离.不过目前为止,我还没有感受到这一点(单从异步回调这个功能上讲).多出来的js代码并没有过多干预servlet上的事情.当然大家言之凿凿,相信我很快就会感受到这一点.这样的话,对程序员的要求就又高了.

Monday, March 12, 2007

触电人生

咳咳,不要误会,没有人陷入桃花劫中,而是,我货真价实的触电ing~~

显然我是无辜的,北京也没有犯错,只是这样的组合成为了悲剧.我相信这个世上没有人可以像我一样无时不刻被静电骚扰.当然,你很可能不屑:不就是静电嘛,又不会死人.那么,如果碰着门把手而触电的几率是60%呢?如果在这个名单中加入电梯、易拉罐、椅子、机箱乃至人、篮球?

有谁能够看到和听到在7/11的货架前伸向雪花啤酒易拉罐装的男子那欲进还退的右手和陡然上升到三位数的心跳?

有谁可以理解在电梯说出"放心摁吧,静电已经被我吸光了"的男子那咬牙切齿悲愤莫名的神情?

有谁可以习惯一边接地一边脱衣服?

......

偌大一个北京城,没有人可以体会我的悲伤.

Wednesday, January 17, 2007

Java Web日记:Servlet、JSP中的乱码

这IT世界由英语把持的弊端——或者称为给中国programmer带来的困扰——之一就是乱码吧.这也是小白我必经的一课.那么,且来认识一下字符转换问题.

之所以会出现乱码,原因在于使用的字符集(charset)不匹配.26个英文字母到哪里都OK,但是其他土著文字便没有这么轻松,如果使用的字符集没有提供相应的文字索引,那显示出来的便只有乱码.从底层来说,文字都是二进制代码形式存储.操作系统启动后便加载在内存里.我们所输出输出的,都是对文字的索引.不同字符集索引位置不一样.使用错误的字符集,便找不到正确的索引而只能是乱码.

在java编程中需要发生转码的地方.developerworks上有篇文章讲到了JSP/Servlet 中的汉字编码问题.

从我自己的体验出发,解决办法就是无保留地投向UTF-8字符集.GBK可以显示汉字,但是碰到其他东亚文字依然很糟糕.

Sunday, January 07, 2007

Java Web 日记:1.7-xml战记

其实之前对xml有过概念性的理解.xml就是一堆自定义标签的文本.因为想知道如何才能在ant构建web application时对web.xml进行操作,好像ant没有这样的语法(要有也太强了,ant成了编程语言...),所以想着不如写个java来生成web.xml.于是就陷入了JAXP、DOM、SAX、JDOM.DOM式解析器需要在内存中放下整个DOM树来进行解析,内存小数据量大是就非常吃瘪;SAX的推式处理不错,只是要编写的代码多了,毕竟需要程序员告诉机器该如何处理特定的事件;JDOM真是救星,我是说,写这个的程序员真是想到我心里去了,俺就要这样的模式.Jason Hunter,你是我的神!

Wednesday, January 03, 2007

Java Web 日记:1.3

这几天又稍稍深入了ant.好吧,上次看走了眼,其实全称是"another neat tool",随便鄙视我吧,反正在这里已经把脸面丢光了.
借助于xml的良好的可读性,看了不少示例.其实target就那么几个,但是写出来的脚本却是五花八门的,于是水准高下立分.我现在一看到那些注释太少,white space太少,代码过长,依赖关系混乱的构建文件就想死.
就像Paul Davall说的那样,"……however, if there's one thing I can't stand, anthropomorphically speaking, it's the odor of unmaintainable build scripts."
唔,总结几条:
  1. 灵活使用内置属性,降低硬编码数量.
  2. 宁用location,莫用value.力求清晰、准确.
  3. 目标明确,小而精悍.长行折短,随行注释.留足空行不用客气.
  4. IDE有许多方便,也有许多局限(例如Eclipse的ant代码提示里不会有最基本的tstamp).熟悉ant 的task和语法,做没有IDE气味的构建脚本.
  5. 是否要将构建脚本拆分为若干个脚本以及属性文件,仅取决于它对工程复杂性和平台迁移性的影响.

Monday, January 01, 2007

Java Web日记:1.1

说是要研究jsp语言,但没有想到被一个提交表格的问题困住了.tomcat的设置是没有错的.提交的表单数据也成功传给了控制器Bean,但是将数据写入数据库时发生了问题,虽然返回的executeupdate()的值等于1,但是实际上并没有向数据库写入数据,sql语句也没有发生问题.无法可想,只好放在一边,下次用更规范的MVC架构来写这个小web应用好了.看看能不能发现问题究竟在哪里.

另一方面,又尝试了用ant(Another Nest Tool)来build项目.以我看来,ant的好处就在于跨平台的项目可移植性和优秀的版本控制.ant的关键词就是两个:build、target.

Thursday, December 28, 2006

Java Web 日记:12.28

花了三天时间,才明白TomCat6.0是怎么连接数据池的。

虽说6.0的DBCP的部署有点变化,网上的文档有点过时。但是还是要怪自己太粗心,其实不是没有去注意%TOMCAT_HOME%\conf\server.xml里的Host标签,只是我没发现原来它隐藏在Service/Engine下面,server.xml里没有示例Context标签,这也是所有人都没有提及或干脆说错的.

真是越学越灰心,难道我不适合干这行?anyway,路要继续走,Java要继续学,强悍的人生,没有回头路!

下一任务:jsp语法

Tuesday, December 26, 2006

Java Web 日记....

12月23日:小心翼翼地按照网上地指点,配置并运行之,写出了一个最简的“hello TomCat”。没有感到什么难度,比起以前的JDBC连数据库简单多了,servlet的概念也不难理解,一个中间层的业务逻辑容器。

尽管如此,仍有一次次芒刺在背的感觉,目前为止,还不知道xml可以有多深,TomCat的能力和Eclipse面对 JSP、servlet、XML和Class综合考验的下的潜力如何,也不知道。但最感压力的,是再部署过程中,架构概念开始萌芽了,相比以前的轻量级编程,现在的感觉就像前面会有一座大山。真是摸着石头过河,不胜惶恐,不胜惶恐,谨慎谨慎,保持谨慎。

Well,某神的生日,我恐怕要和Eclipse一起过了。

教训一:要配置web.xml并重启服务器才能运行servlet,不重启就运行的方法......明天再识破.

12.25:这样的提示每次看了就烦:



INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path brbrbrrrrr...

于是回头又安装了一边TomCat6.0,把上次没有装上的native java library (听起来像是本地类库?)给装上,并copy到了jre/bin,在重启TomCat服务器果然OK了.上网看了看,ms这个小问题对Linux的新手比较困扰.咳,在Windows XP里用TomCat,该被鄙视的是我吧.

anyway,我现在最想知道的是如何修改文件而不重启服务器.修改不用重启的jsp肯定是一个;Eclipse下java及其编译出class也不用重启.也就是说,servlet只要在tomcat manager里reload一下就好了,烦的是配置文件:server.xml、web.xml还有.tld.OK,现在来做个试验.

我先写了个java,然后在一个新建的jsp中生成它的实例并调用它的方法.在浏览器中访问该jsp网页,提示信息:"HTTP Status 500-",看来这个java还没有编译成类,所以jsp调用时出了错.而在Eclipse里重新生成项目也是毫无效果.于是尝试TomCat的HttpManager,reload了该项目.控制台显示信息如下:

2006-12-25 22:46:39 org.apache.catalina.core.ApplicationContext log

信息: HTMLManager: restart: Reloading web application at '/HelloTomCat'

2006-12-25 22:46:39 org.apache.catalina.core.StandardContext reload

信息: Reloading this Context has started

计数器Servlet已释放资源

2006-12-25 22:46:40 org.apache.catalina.core.ApplicationContext log

信息: HTMLManager: list: Listing contexts for virtual host 'localhost'
虽然在classes文件夹中已经看到了编译出来的类,但是刷新jsp页面,依然时错误.再仔细检查jsp语法,原来没有import类。。。。。。。我真是废柴。于是在src下建了一个包mypackage,放入java,Eclipse自动生成了class。又试着访问这个新的jsp页面,成功了!看来javabean也不必重启来生成。

现在再来看看servlet和web.xml。在包mypackage里写了一个servlet,然后在web.xml添加它,在控制台可以看到,TomCat有一个listener监听配置文件的修改,并重载context.又费了一番功夫(我总是拼写错误,天啊~~),运行,OK,不用重启.好吧,那就玩大一点,我把刚才建立的servlet删除,虽然浏览器里还可以访问(这是必然的吧,已经贮存在内存中了),但reload项目后就不行了.删除掉web.xml与之相关的节点,重启服务器,再新建servlet,写入web.xml.最后浏览器中访问,OK!一切正常.

结论:在TomCat6.x中,jsp、class、servlet、web.xml(估计还有server.xml)可以动态修改,无需重启服务器甚至不必重载项目.口可口可,我总算赶上了好时代.

好吧,我收回关于server.xml可以动态修改这句话.目前来看,动态修改只限于具体的web应用程序上

Sunday, December 17, 2006

firefox在处理setInterval()、clearInterval()上与IE不一样吗?

在常去的firefox中文论坛上又看到了小白发问了:window.clearInterval(obj)为何不能停止循环计时呢?

随手测试了一下,确实不行,IE就不用问了,肯定是行的.反复调试和查阅后,可以发现,firefox对如何kill loop似乎另有看法.

<script type="text/javascript">
var intervalId;
var count=0;
function setUpInterval(){
intervalId=setInterval("showalert()",1000);
}
function showalert(){
count++;
document.getElementById("dispCount").value=parseInt(count);
}

function tran(){
clearInterval(intervalId);
}
</script>
<input name="btn1" type="button" id="btn1" value="开始循环" onclick="setUpInterval()" />
<input name="btn2" type="button" id="btn2" value="结束循环" onclick="tran()" />

按下“开始循环”按钮,执行上面的代码,循环不会终止.为了寻求答案.去MDC查看gecko的DOM文档,发现clearInterval()并没有什么特殊的值得注意的地方(想来也是,不就一个最基础的方法么?).于是仔细查看自己的代码,发觉在触发js事件的代码周围有一个

so,谜底揭晓了,答案就是这么简单:因为在某些位置的代码不规范,导致Firefox无法正确执行其它代码;而IE由于容错性高而爱怎么来就怎么来.第二个结论是:微软真阴险.

Thursday, December 14, 2006

我又博上了。。。

我终于还是回头博客了,俗话说“浪子回头“。但如果是回头作恶呢?我终于还是低估了自己的无聊。然而出师不利,再犹犹豫豫和欲拒还迎之间,偶的卡全输光了。更糟糕的是,由于操作的失误以及hoopchina管理层的恶心,马甲的账户被封了,唯一剩下的百八十卡也被银行冻结。这次可真是白手起家了。无奈,只好先写了个自动更新的脚本安在greasemonkey身上,刷一刷在线时间骗点卡了。我的天啊啊啊啊。无语了,接着奋斗吧。

Sunday, December 10, 2006

何处可寻Idaho?

已经很久没有体验这样的缓慢、忧伤,当我被现在的生活裹挟了快整整半年。半年长吗?不够我寻找Idaho;半年短吗?我已经遗忘了这份沉静的忧伤;半年快吗?这无味的人生还在继续;半年慢吗?鲜活的记忆以超乎估计的速度逐渐湮灭,即使我从不曾期待诸如“永远、一辈子“这样的宏大叙事。

无论我如何毫无压力的嘲笑Keanu Reeves——这个年过不惑的男人,他那片被指认为“呆”的眼神在1991可以显得如此清澈,映照着火堆旁蜷缩成一团的瘦弱男孩的无力的身影。那一刻,爱的前缀词是卑微、禁忌,Scott终究没有翻越自己心中的那座断背山,而Mike在登顶后坠落。从此,渐行渐远;从此,咫尺天涯。

Mike抽搐,失溺于黄色的回忆:空旷的荒草与原野,一个木屋,有时是黄的,有时是白的,门前走廊上的微笑的母亲,怀中的婴孩直愣愣看着自己。我忽然想起我有一阵子我爱上了回忆,以为自己真的心境老了,像狗屁的网上测试描述的那样,心理年龄是实际数字的两到三倍。现在看看,无非是对现状的不满,因此产生了与将来的人老后对当下岁月的流逝毫无珍惜的同等反应。

Mike追寻着最后的温暖,然后倒在了Idaho。而我,还要继续前行,借那辆状况不稳的小黄摩托——Norton Commando 750cc——来追寻我的温暖,我的Idaho。耳边的风传来他凄婉的笑和亦幻亦真的呓语...

"This road will never end.It probably goes all around the world."

Thursday, December 07, 2006

编写Adblock Plus 过滤器

本文翻译自Adblock Plus0.7.2.2的帮助文档《Adblock Plus:Writing Adblock Plus filters》,原文链接:Adblock Plus: Writing Adblock Plus filters.
将大家喜闻乐见的过滤规则(filter)翻译为过滤器,因为"过滤规则"这个词让位于"filter rules"了.
Creative Commons,诸君自便.
------Jacky-Q

目录

Writing Adblock Plus filters

当前版本的Adblock Plus允许你用许多不同的方法"优化"你创建的过滤器.本篇文档阐述 了你所能拥有的选择以及使用之道.
免责声明:本篇文档所提供的过滤器范例仅供参考,非用于直接使用.

Adblock Plus过滤器简介(Introduction to Adblock Plus filters)

本章节所描述的功能理应足够满足仅仅是偶尔创建些过滤器的用户的需求.

基本过滤规则(Basic filter rules)

你所能定义的最常见的过滤器当然就是你想要干掉的那些横 幅广告的地址.不过,它们常常是变动的.比如这样一个例子 http://domain.com/ads/banner123.gif ,123就是个随机数.直接干掉这个地址无甚大用处,你需要一个更通用的过滤器 ----比如 http://domian.com/ads/banner*.gif 或者可能甚至是 http://domain.com/ads/* .
小贴士:注意不要替换出太多的通配符.过滤器 http://domain.com/* 绝对会干掉所有的横幅广告但同时也会干掉domain.com上 剩下的你想浏览的瓜瓜枣枣.

定义白名单(Defining exception rules)

有时你会发现有某条过滤器把一些本不应被干掉的东西也干净利落地阻挡掉了,你不想移除这条过滤器但是也不想那些东西被“光荣匹配”。 这时便显出了白名单的好处来——它可以定义一些可以在过滤器下幸存的东西。比如你对过滤器 advhttp://domain.com/advice.html 过滤掉很不爽,你 就可以定义一个白名单规则@@advice .白名单规则和过滤规则并无不同,你可以使用通配符或正则表达式,只不过还必须在每条白名单前面加上@@来声明它是个百名单罢了. 白名单还有其他用处.如果一条白名单规则以 http://https:// 开头(可以在之前加个竖线),那么它可以让该地址下的所有页面处于白名单保护之中.例如: 如果你给个白名单规则 @@|http: //domain.com ,然后打开一些domain.com的页面——Adblock Plus将对这些页面无能为力,没有什么会被阻挡掉.

注释(Comments)

任何以惊叹号开头的规则都会被标识为一条注释,并在过滤器列表中以灰色显示。Adblock Plus会忽略这条规则而不是真的试图按图索骥,所以在这里写下任何你想说的话是安全的。你可以在某条过滤器上面添加这样地注释来描述这条过滤器到底在干什么。或者你可以在你的过滤器顶部放上注释来表明原创作者(正如大部分过滤器 列表写手做的那样)。

高级功能(Advanced features)

本章节所讲述的功能通常给强悍的用户和过滤器列表写手使用。爱看不爱。

匹配地址头/尾部(Matching at beginning/end of an address)

Adblock Plus通常会默认所有过滤器的头部和尾部都有个通配符,像 过滤器 ad 和*ad* 就无甚区别.虽说基本上这不会造成问题,不过你有时难免希望能够让定义的某些过滤器只匹配地址的头部或尾部.例如你也许其实是想干掉所有的 flash ,但是如果添加的过滤 器是swf,那么这个地址:http://domain.com/swf/index.html 将会玉石俱焚. 这个问题的解决方案是:给过滤器加个竖条符来告诉Adblock Plus到地址的尾部去开展工作.例如过滤器 swf| 将会干掉 http://domain.com/annoyingflash.swf 而不是http://domain.com/swf/index.html .而过滤器 |http://baddomain.com/ 将会干掉http://baddomain.com/banner.gif 而不是 http://gooddomian.com/analyze?http://badomain.com .

指定过滤项(Specifying filter options)

Adblock Plus允许你指定一揽子选项来修正过滤器的行为.做法是在过滤器尾部加上一个美元符,然后紧接着列出过滤项,并以逗号相隔.示例如下: */ads/*$script,match-case 这里 */ads/* 是真正的过滤器,script和match-case是它的过滤项.目前Adblock Plus的选项有:
  • 类型选项(Type options):决定过滤器可以过滤的网页元素类型(若是白名单则是非过滤元素类型).可以指定多个类型选项来通知过滤器对哪些元素类型下手.支持的类型包括:
    • script(脚本)——经由HTML的script标签对载入 的外部脚本.
    • image(图像)——一般图像,特别是由img标签载入的图 像.
    • background(背景)——背景图片,通常由CSS指定。
    • stylesheet(样式表)——外部层叠样式表文件.
    • object(对象)——由浏览器插件处理的内容.像Flash或Java
    • 链接 (link)——图像链接(需要启用"检查横幅链接"(check banner links)功能)
    • subdocument(子文档)——嵌套的页面,通常由框架载入.
    • document(文档)——页面本身(当且仅当白名单将之划 入保护范围)
    • other(其他)
  • 反类型选项 (Inverse type options):指定过滤器不会下手的网页元素类型。支持的类型包括: ~script,~image,~background,~stylesheet, ~object,~link,~subdocument,~document,~other
  • match-case——让过滤器只对匹配大小写的地址下手,例如过滤器 */BannerAd.gif$match-case 将会干掉 http://server.com/BannerAd.gif 而让http: //server.com/bannerad.gif 幸免于难.

使用正则表达式(Using regular expressions)

如果你想让过滤器匹配更多过滤策略但偏偏它却力有不逮, 你可以使用正则表达式.比如过滤器 /banner\d+/ 将会匹配 banner123baner321 而不是 banners,你可以查阅documentation on regular expressions来学习如何编写正则表达式。
小贴士:别指望用正则表达式来提高过滤器列表的工作效率.你可能经常听到那些建议但它是过时的——从Adblock Plus 0.7开始,基本过滤规则的工作效率已经超过了正则表达 式.

隐藏元素:基本规则(Element hiding: basic rules)

有时你会发现广告竟然干不掉,因为它们嵌入到了作为网页本体的文本当中去了.如果你查看网页的源代码你会发现像这样的玩意儿:
<div class="textad">
Cheapest tofu, only here and now!
</div>
<div id="sponsorad">
Really cheap tofu, click here!
</div>
<textad>
Only here you get the best tofu!
</textad>

你需要下载页面因此你也不得不下载了这些广告.此时你能做的就是隐藏这些广告,这样你就眼不见心不烦,这便是隐藏元素的意义所在. 上述的第一条广告被包含在一个类选择器(class)的属性值为"textad"的div元素里,以下的规则将准确隐藏掉这群乌合之众: #div(textad) .你也可以用同样的办法以它们的id属性隐藏之, #div(sponsorad) 将会隐藏第二条广告.你不需要指定元素名称, 规则 #*(sponsorad) 同样运转良好.你甚至仅凭元素名就隐藏掉元素.比如第三条广告就可以用上 #textad . 那么,如何知道该往元素隐藏规则里放点什么呢?你有两个选择:要么一头扎进网页源代码尝试找到广告在那里,要么使用 DOM Inspector(FFer 可以在安装FF时选择自定义安装并 勾选"Development Tools"来装上该扩展).不管哪条路,HTML的基础知识是 必不可少的.
小贴士:隐藏元素的规则和一般的过滤器非常不同.别说我没告诉你,它不支持通配符、过 滤次数统计以及白名单.

隐藏元素:特定域限定(Element hiding: limiting rules to certain domains)

通常你想要隐藏一个指定站点的指定广告,你不想规则匹配到别的站点上去.比如规则 #*(sponsor) 它将会隐藏到一些站点的无辜代码.不过如果你把它写成 domain.com#(sponsor) 它将会被应用到 http://domain.com http://something.domain.com/ 而不是 http: //otherdomain.com/ .你可以指定多个域——只要用逗号把域分隔开就好: domain1.com,domain2.com,domain3.com#*(sponsor) . 小贴士:由于隐藏元素的实现方式,你真的只能写出域的全称来加以限制.你不能仅使用 地址的一部分或是使用 domain 来替代 domain.com,domain.co.uk .
小贴士:带域限制的隐藏元素规则可以用来隐藏浏览器的用户界面元素.例如过滤规则 browser#menuitem(javascriptConsole) 将会隐藏FF的工具菜单中的错误控制台项。

隐藏元素:属性选择器(Element hiding: attribute selectors)

某些广告对 你而言还真不是吃素的——它们的文字广告既没有id也没有class属性。不过你可以使用 其他属性来隐藏之,比如 #table(width=80%) 将会隐藏width的值设为80%的表 格.如果你不想指明属性值的全部, #div(title*=adv) 将会隐藏所有的title属 性值中含有"adv"字符串的div元素.你也可以检索一个属性的头部或尾部,比如 #div (title^=adv)(title$=ert) 将会隐藏所有的title属性值中以"adv"起头"ert"结尾 的div元素.如你所见,你 还可以使用多属性的过滤策略—— table(width=80%) (bgcolor=white) 会匹配width值为80%bgcolor值为 white的表格.

隐藏元素:使用贫民CSS(Element hiding: using raw CSS)

如果连元素选择器也无计可施,试试 让CSS选择器大展身手.例如以下规则将隐藏所有"adbeader"类的div元素: ##div.adheader+* .两个井字符表明该隐藏元素规则应当被解释为一个 CSS选择器(this particular one is a adjacent sibling selector) 小贴士:此功能仅适用于高级用户,你应当对CSS选择器得心应手才好使用它.Adblock Plus无法对你添加的选择器做语法检查,如果你使用了非法的CSS语法可能导致其他的合 法规则感到郁闷.可以在错误控制台查看CSS错误.

兼容性提示(Adblock以及其他不同的Adblock Plus 版本) (Compatibility notes)

本文档描述了ADblock Plus0.7的各种用法.不过,如果你想 搞腾出自己的过滤器列表并将之共享出来,你可能需要考虑下其他的Adblock Plus版本或 者Adblock.以下是各版本间不同之处的简短总结:
  • 匹配地址的头部/尾部:仅被Adblock Plus 0.6.1.2及更高版本支持.
  • 白名单:在Adblock 0.5和Adblock Plus 0.5前缀为"@@"的白名单仅支 持处理单个目标,不支持多页面,多页面的白名单处理方式是不一样的.注意第一个支持白 名单的Adblock版本是0.5.3.40.
  • 注释:Adblock0.5和Adblock Plus 0.7将会把注释解释为真实的过滤规则.不过这一般不会阻止过滤器写手的使用,注释发生误杀的几率是极其低的.
  • 过滤项:仅被Adblock Plus 0.7.1及更高版本 支持.
  • 隐藏元素:在Adblock Plus0.6.1版本中得到推介,但仅支持基本的 规则.属性选择器,贫民CSS和域限制出现在Adblock Plus 0.7版本中.Adblock Plus 0.5有个"DIV过滤(DIV blocking)"功能可以实现相似功能.虽然语法(有意的)相似,但 实现方式是完全不同的.因此将DIV过滤规则转化成隐藏元素规则或是反过来,都是 前 路曲折的.

译者注:
⑴:本文以斜体表示。
⑵:事实上最好的方式就是FF的"查看选中源代码”,定位迅速准确可视范围大.DOM Inspector的处理效率与页面层次成正比.
⑶what the hell is this?lol

Sunday, December 03, 2006

XML学习笔记

粗浅认识,冒死推出....虽然writely 的blogpost开始支持beta.blogger.com的模板,但是在一些格式上还有冲突,无法顺利迁移,比如本文...........所以,还是贴链接吧.
xml学习笔记(一)
xml学习笔记(二)
xml学习笔记(三)

维京战记

我们可爱的祖国有许多操蛋的俗谚名言,虽然比人一直抱着批判吸收的精神,但其实总是批判-吸收-批判的总基调。但现在有句名言,让我有了更深的体会:终日打雁,反被雁啄瞎了眼


诚哉斯言。


前日从学校机房拷贝了一些项目资料,拷回自家机子上后就出了问题。后台出了不知名的进程,桌面的部分图标变得不清晰。心中嗝噔一下:中毒了!随即联想起在学校时听到的好友L的血泪控诉,讲述自己是如何倍受病毒的摧残。木有想到“秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人复哀后人也”。故事总是老套的,只不过这次主角成了我……


然则我还是低估了自己的实力和病毒的危害力.这个叫做"viking"的病毒,绑架了explorer,修改了注册表,偷换了.exe文件关联,甚至堂而皇之的直接在注册表里自称"Trojan Program".我冷笑着,按照搜到的清除方法逐一操作,心中升起"识破了"的快感.重启,坏了!.exe文件都打不开,这才明白之前全是幻觉.然后是接着两天的梦魇,我使尽了手段,才在无意中发现是网上的错误转载误导了我-_-#.在一切尘埃落定之后,得到的经验如下:


  1. 学会了如何在linux下挂在光盘镜像.
  2. 学会了如何硬盘安装windows XP系统.
  3. 学会了如何在控制台下更改文件关联.
  4. 认识了增删改查window服务的命令,提高了效率.
  5. 提高了浏览修改注册表的能力.
  6. 对windows开机启动的流程有了更深的认识.
  7. 提高了对网络提供的solution的警惕性.

哦!谢谢你,viking.但是我不会再给你机会了,再见~~