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.但是我不会再给你机会了,再见~~

居然又能上了.....

最近感觉某组织对goole的封禁愈加严厉了.常常第一次查询时就连不上,还不用等google所引出违禁内容来.更匪夷所思的是,连tor都不管用了.这次的解禁,其实和上次wiki的解禁是一个意思吧?一紧一松,把人折腾得够呛,最后还是关上大门,总之就是逗你玩....


感觉自己最近又进入到了一个低潮期,虽然失眠和迟到的问题得到了遏制,但是上进心开始有点不足,想着某某游戏ms很好玩,某某日剧真是非看不可.之前做的学习计划拉下老长一段.虽然告诉自己,骄奢淫逸必将亡国,但是无可奈何地变懒了.


so,继续保持郁闷.