 |
|
 |
|
内容分类
| Java |
C++ |
| C# |
Php |
| Perl |
Ruby |
| 汇编 |
Asp/Asp.net |
| Visual Basic |
数据结构 |
| 算法 |
脚本 |
|
|
 |
|
 |
|
 |
|
 |
|
推荐文章
林白
|
作为一个电脑人的感悟
第一次接触电脑时,我是报着一种崇敬的心情来接触她的。所以当时我就很喜欢电脑。不过那是碰一下电脑是一件多么奢侈的一件事。当奢侈变成现实,我进深陷其中,不能自拔。现在回首,我才发现自己近一无所成。
所以我想努力一下来让自己真正的懂得电脑。
所以我选择了学习!
期待自己有所进步!
大家一起加油!
|
Peter
|
table
<table border="0"><tr><td>
[http://www.kingofcoders.com http://www.kingofcoders.com/images/KOC_logo2.jpg]
</td>
<td>
[http://hk.kingofcoders.com http://hk.kingofcoders.com/images/logo/logo.png]
</td>
<td>
[http://www.rmit.edu.au/compsci http://peter-bochs.googlecode.com/files/rmit.gif]
</td>
</tr>
</table>
|
自由翼
|
20条技巧,让Chrome超越Firefox (修正稿)
20条技巧,让Chrome超越Firefox (修正稿)
你们当中有多少人在坚持使用火狐浏览器,只因为火狐是IE的最佳代替品,而不是认为它是最完美的浏览器?请举手!应该很多人都认同这个观点。火狐浏览器可以长期稳坐第二大浏览器交椅的秘诀就在于:Mozilla公司很有先见之明的让火狐具有很强的扩展性。目前有成千上万的附加组件可供用户选择来自行定制这个开源浏览器,而且只要简单点几下鼠标就可以完成。火狐先讲到这里,我们开始谈 Google Chrome浏览器。目前,谷歌Chrome正式添加了之前只有Beta版才能实现的扩展支持功能。既然谷歌已然允许用户安装第三方插件,浏览器市场将会是一个全新的天地。你可能还不一定知道:Chrome同时还支持 Greasemonkey 脚本,有超过4万个脚本可供选择。但这些并不是唯一让我们重新审视Chrome的理由。尽管Chrome现在已经是一个体积小,反应快的智能浏览器,Google仍在持续的调整代码和功能。尽管仅仅从仍显单薄的浏览器界面我们无法看出,Chrome目前已是高度可定制。接下来,我们将向你透露下如何改装下Chrome,这样的话你就可以把Firefox束之高阁了。
英文:20 Instant Upgrades to Make Chrome Better than Firefox
中文:20条技巧,让Chrome超越Firefox
作者:Paul Lilly,2010-02-16
译者:cimigo、cjcj915007、ikenbe、jackey.jiang、jiamonre、keith1st、kprinceing、linjinran、lmjalex、mikelong.c、miyaonanhai、pandongzix、raychow.info、ren0065、sfufoet、summericeyl、wangq21、wujing591、xiangee、xiaoxingberyl、yy20560812、zhaopu2、zhzj.info等网友,于2010年3月。
1. 掌握Chrome常用快捷键
可能你花了很长的时间才掌握了Firefox的快捷键,那么无需烦恼,因为Chrome保留了火狐下的多数基本操作快捷键,比如打开新窗口或新标签。这样火狐用户就能够很轻松的过渡到Chrome,另外,Chrome还有不少自有的快捷键。以下是我们最常用的一些快捷键列表,有些可能是从火狐下移植过来的,有些是Chrome自有的:
Ctrl +N :打开一个新窗口
CTRL + T :打开新标签
Ctrl + Shift +N :隐身模式打开新窗口
按Ctrl +O,然后选择文件 :在Chrome浏览器中打开本机中的文件
按住CTRL键 , 点击链接(或者使用鼠标中键点击):在新标签页打开链接
按住Ctrl + Shift键并点击链接 :在新标签页中的打开链接并切换到新标签页
Ctrl + Shift + T :恢复已关闭的标签页(最多恢复10项)
Ctrl +1到Ctrl +8:切换到指定的标签页
Ctrl +B :显示或隐藏书签栏
Ctrl + Shift +B :打开书签管理器
Ctrl H :打开浏览器历史页面
Ctrl + Shift + J:打开开发者工具
F1 :在新标签页打开帮助中心
地址栏快捷键
Ctrl + Enter :自动添加前缀www和后缀.com并打开
Ctrl + K或Ctrl + E :地址栏输入?
Ctrl和左或右箭头 :将光标在地址栏输入的词组间前后移动
网页快捷键
Ctrl + F5或Shift + F5 :强制刷新
CTRL + D:当前页添加为书签
Ctrl + U:查看源文件
Ctrl +0:页面恢为正常尺寸
其他快捷键:
要快速删除地址栏下拉菜单中的特定浏览记录,先高亮选中项,然后按 Shift+Delete 。要选择在下拉菜单中的第一个或最后一个项目,只需要按Page Up或Page Down即可。这里只是列举了部分可以在Chrome(和Windows)中使用的快捷键。至于完整的快捷键列表,请参阅谷歌的帮助页面 ,其中还列出了适用于Mac和Linux用户的快捷键。
2. 充分利用鼠标
你已经掌握了一些常用的快捷键,下面我们讲如何利用好另外一个外围输入设备:鼠标。同时掌握这些技巧,你将会体验到前所未有网上冲浪速度。
我们最经常做的动作之一就是在我们的浏览历史中来来回回。我们经常在某一网站上点击不同的链接。大多数的用户认为回到最初的网页需要重复点击“后退”按钮N次,但又要谨防多点又错过了,其实还有一个更简便的方法:点击(不放开)“后退”或“前进”按钮即可显示刚才浏览过的页面地址的列表。你也可以右击弹出该下拉菜单中的链接。
Chrome拥有而Firefox中暂时没有的一个很使用的功能就是直接粘贴连接并转到,而不需要再敲回车键。在地址栏点击右键,选择“粘贴并转到”即可。
博主发博文、论坛发帖、在线发邮件或使用其他在线表格时,Chrome可以随意调整文本框的大小这点非常方便。只需要单击并拖动右下角即可实现。
如果需要快速缩放整个网页,按住Ctrl键并向上滚动鼠标滚轮(放大)或向下滚动鼠标滚轮(缩小)。要使页面恢复至正常大小,使用Ctrl+鼠标滚轮调节或按Ctrl +0即可。
3. 控制Chrome启动方式
也许你总是希望隐藏网络浏览的痕迹,只对Chrome的隐身模式感兴趣。或者你想通过禁用Java、flash、插件和其他功能来提高浏Chrome速度。通过修改启动方式,你可以控制Chrome的加载项。
具体方法如下:右击桌面或任务栏上的Chrome快捷方式,选择属性。“选择快捷方式”选项卡,找到“目标”处。这里可以输入相应的启动命令:因操作系统和Chrome安装目录而异,你应该可以看到类似这样的内容:
C:\Users\[USERNAME]\AppData\Local\Google\Chrome\Application\chrome.exe
当你想要使用一个启动命令,记得在chrome.exe后加空格然后输入命令。使用启动命令,我们可以实现很多功能,这里仅列几条供大家参考。要在Chrome工具栏中添加书签按钮,你可以使用 -bookmark-menu. 命令启动。“目标”栏内的完整路径应该为:
C:\Users \[USERNAME]\AppData\Local\Google\Chrome\Applications\chrome.exe -bookmark-menu
我们不建议使用所有的启动命令,但如果想尝试给Chrome提速,可以通过禁用某些功能启动(输入时每个开关之间必须使用空格分开): -disable-dev-tools -disable-hang-monitor -disable-images -disable-java -disable-javascript -disable-metrics -disable-metrics-reporting -disable-plugins -disable-popup-blocking -disable-prompt-on-repost。在这里可以找到更多的启动命令。当然,如果你不喜欢启动后的效果,只需要删除命令即可!
4. 设置多个首页
每天早上检查完邮件后你可能要先浏览多个网站后才会想到正式开始工作。比如先去ESPN看看体育新闻,去Maximum PC了解科技资讯,再到纽约时报网站浏览下世界新闻。那应该把哪个网站设为首页呢?在Chrome中,全部都可以作为主页!无论你打开浏览器时准备浏览多少页面,Chrome都会欣然从命。要实现此功能,点击“工具”按钮(扳手图标),选择“选项”。在“基本设置”选项卡的“在启动页上”分组中,选中“打开以下网页”按钮。单击“添加”按钮以选择最近访问的网站,或者手动输入网址均可。
5. 搜索技巧
你能不假思索说出几个搜索引擎?多数人可能想起5到6个,少数人或许可以想起10个或者更多。但是Chrome可以设置搜索引擎的数量是无限的要慢慢了解它,我们先看看如何更改默认选项。
Chrome把Google作为默认搜索引擎是自然,如果你希望使用Bing做默认的话也不错。只要选择“工具”-“选项”,然后单击“基本设置”选项卡。点击窗口下方的第三项的下拉菜单,就是可选搜索引擎的列表。下拉菜单中选择要你喜欢的然后单击关闭。
很简单,对不对?下边是更有趣的咯。Chrome可以辨认出任何内嵌搜索的网站,让搜索变得非常便利。要搜索YouTube中Die Antwoord的视频?在地址栏中键入YouTube的网址,右边将会提示:按Tab可在youtube.com内进行搜索。按提示操作(按下Tab键)并键入要搜索的内容即可。
要想更快的话,可以自定义每个搜索引擎的关键字。例如,要创建MaximumPC.com的关键字,你需要单击工具-选项,单击“基本设置”选项卡,然后单击“默认搜索引擎”右边的“管理”按钮,弹出一个窗口,里面列出了Chrome已经辨认出的所有搜索引擎。向下滚动并查找MaximumPC.com,如果已存在,高亮选择并单击“修改”;如不存在,单击“添加”按钮。
我们要创建一个关键字,告诉Chrome用谷歌搜索MaximumPC.com站内内容。有三个文本框要填,首先是名称。我们可以填 Maximum PC,如果要更具体,我们可以写 Maximum PC Google。关键字我们用首字母“mpc”。网址一栏,应该设置为:http://google.com/search?q=%s+site:maximumpc.com。从现在开始无论何时想要使用谷歌搜索MaximumPC.com的内容。这样只要在Chrome地址栏中键入 mpc并按下Tab键,再输入关键词即可。
别急,还有更精彩的!我们可以用类似的方法设置一个自己的搜索引擎。我们将再次使用MaximumPC.com作为示例,但这将对任何具有搜索功能的网站有效。我们需要的是执行搜索后弹出的URL,所以在这个例子中,在Maximum PC搜索“Intel”或其它内容。注意出现搜索结果时的网址,它应显示:http://www.maximumpc.com/search/node/Intel。复制该网址到剪贴板。接下来,右击Omnibar地址栏并选择修改搜索引擎。单击添加按钮,填写相应的名称、关键字、网址,注意在网址中用%s替换搜索字词('Intel')。各文本框看起来应该是这样:
名称:Maximum PC Search
关键字:max
URL:http://www.maximumpc.com/search/node/%s 。
如果你经常使用谷歌图片搜索,这个小技巧可以节省大量的时间。只要使用以下网址来创建自定义搜索引擎:http://images.google.com/images?gbv=2&hl=en&q=%s&btnG=Search+Images
6. 大胆使用Beta和Developer版本
没有人可以指责谷歌现在的地位,而Chrome与所有谷歌的产品中最酷的一件事,是它的不断发展。我们现在谈论的不是无用的补充(尽管Q&A中不可避免的要回答有些容易遗忘的功能),而是有用的,并且有些是独一无二的附件。你在使用Gmail邮件时应该对此深有体会,Gmail在实验室选项卡中提供了大量的的实验性附件,而Chrome也正是延续了这种思路。不幸的是,谷歌对于试用版新兴功能的考验时间实在是太长了。我们希望可以将此作为一种选择而不是视为一个不成熟的产品来对待,没有比焦急的等待Chrome对外部附件添加支持更为沮丧的事了。是的,你可能不知道。当对于Chrome来说支持扩展还是很新的功能的时候,测试用户已经享受这个便利很久了。想听一下好的消息吗?要成为测试版的用户,并不需要具备所谓的资格或是去填写用户登记表格,作为测试版用户你所需要做的仅仅是提供你在使用过程中所遇到的潜在性的缺陷代码罢了。如果不在此警告你,你可能甚至会考虑以购买测试版代码的方式加入Dev渠道。让我们来揭开它的神秘面纱吧。
Chrome Dev 渠道:Dev,正如你所猜到的,是Developer的简称,这也是这个渠道的目标群体。出乎意料的是任何人都可以无条件加入Chrome的Dev渠道中并享受新鲜的功能。需要注意的是,这些新功能可能尚未发展成熟,以致于他们可能会出现出错、不稳定,或最终被放弃的状况。
Chrome Beta 渠道:一般的beta版本软件所表现出来的特性随着软件开发商的不同其性能也是良莠不齐。令人喜悦的是Google的beta产品倾向于稳定而Chrome也很好的继承了这个优秀品质。这并不意味着使用Chrome的Beta版本你就不会遇到崩溃或其他的古怪行为,但我们发现这些情形是非常少见的。另外,Google仅仅把在Dev渠道中经过测试比较完整和稳定的特性加入到测试版中去,所以在公开发行之前就直接去享用这些将要发布的功能其实是很好的一种方式。
应该去哪里加入:加入这些渠道需要安装对应版本的Chrome(开发或测试版),一旦你安装了这些版本,以后当有最新版本可用时他们将会被自动更新。
使用这些链接:
更多信息:http://dev.chromium.org/getting-involved/dev-channel
Dev 频道:http://www.google.com/chrome/eula.html?extra=devchannel
Beta 频道:http://www.google.com/chrome/eula.html? extra=betachannel
7. 设置和管理多个配置文件
有一些原因使我们需要为Chrome创建多个独立的配置文件。举例来说,也许你有一个……“有趣的”网站,但你不想在其他人用这台电脑的时候通过搜索建议发现该网站的URL,是的,那就是隐身模式的用处了(当然,只是其中之一),但不是每个人都想为浏览某些网站而去装个专用的隐身浏览器。最重要的是,一旦你退出隐身模式,所有这次进程的浏览历史记录就都没了,不只是那些见不得光的内容。单独的配置文件的另一个好处就是一切将变得井井有条易于管理。如果你的孩子使用你的电脑,你真的想在上网时让Chrome的建议链接弹出海绵宝宝和暮光之城之类链接的东西?估计你不想吧,而且和越多的人共用一台电脑,你就越难通过历史记录找到你想要的地址。准备好创建一个配置文件?你需要打开你的计算机中的Chrome用户数据文件夹。取决于你的操作系统,你会发现该文件夹:Windows XP的 * C:\Document and Settings\[USERNAME]\Local Settings\Application Data\Google\Chrome\User Data Windows Vista和Windows 7 *C:\Users\[USERNAME]\AppData\Local\Google\Chrome\User Data * 请注意,你可能需要设置显示隐藏文件和文件夹。打开我的电脑,按Alt,选择工具-文件夹选项。选择查看选项卡,选中“显示隐藏的文件,文件夹和驱动器”。接下来,为上述地址中的Default文件夹做一份备份。只要右击并选择复制,然后粘贴到同一个目录中。为了节省空间,并给予新的配置一个纯净的开始,最好在这样做之前清除浏览器缓存。
当你粘贴被复制的文件夹时,Windows将其命名为 Default – 副本 或类似名称。把文件夹重命名为你想给新配置文件起的名字(右键单击,选择重命名)。当你完成后,回到Chrome的用户数据文件夹。右击chrome.exe并选择创建快捷方式。
右击新建的快捷方式并选择属性,弹出快捷方式选项卡,并在目标文本框剪切/粘贴以下信息:
Windows XP
C:\Documents and Settings\[USERNAME]\Local Settings\Application Data\Google\Chrome\Application\chrome.exe –user-data-dir="..\User Data\[PROFILE NAME] "
Windows Vista和Windows 7
C:\Users\[USERNAME]\AppData\Local\Google\Chrome\Application \chrome.exe –user-data-dir="..\User Data\[PROFILE NAME] "
保存更改,然后将新的快捷方式拖放到桌面上,重新命名以便确定哪个快捷方式对应你的资料。 如果你不希望那么麻烦地创建一个新的配置文件,有一个名为Google Chrome Backup 的免费程序(非谷歌官方程序)能简化该过程。你还可以用它来备份和恢复配置文件,你所要做的只是几次鼠标点击。你可以在这里下载该程序 。
8. 了解“About:”页
对于浏览器来说,特别的关于页面并不是什么新鲜东西,虽然Chrome没有像Firefox那样有一个含有调整设置的“关于”页面,但Chrome可以识别许多其他命令。要使用他们,你可以在Ominbar地址栏里像输入网址一样输入一些命令。下面是其中一些比较有用的命令。
About:DNS
这是一项叫做DNS快取的加快Chrome域名解析的功能,也称为预处理功能。这个功能的原理是,与其在打开页面时等待DNS解析域名,不如让Chrome在用户浏览网页的过程中,主动进行域名解析。谷歌称,比起传统的浏览器,这项功能使Chrome首次访问一个域名时,平均节省250ms的加载时间。在Omnibar地址栏中输入about:dns就可以看到哪些网站被缓存,有多少域名从这项技术中受益。
About:Cache
这一页面以超链接的形式列出了Chrome缓存中的所有项目。
Abouot:Memory
需要证明Firefox被诟病已久的内存泄漏仍然存在?有几种方法做得到,包括在Chromes的Omnibar地址栏里输入 about:memory。这样做会显示各个浏览器的内存使用状态,例如Chrome、Firefox和其它浏览器以及每个Chrome独立进程与选项卡的内存消耗量。
About:Plugins
显示已安装的插件,如Silverlight、QuickTime、Winamp、Hulu Desktop等。它还告诉你哪些插件被启用,某些插件还包括简短说明。
About:Version
就像工具菜单中的“关于谷歌浏览器”,但更加详细。除了浏览器版本,这里也显示了WebKit版本和V8引擎的信息。
还有其它一些有趣的About页面,包括:About:Stats、About:Network、About:Crash、About:Internets(只在Windows XP中有效)
9. 使用主题改变外观
Chrome的简约界面也许是最让人抱怨的(或是赞扬,取决于你调查的人群)。它没有什么可看的,坦白说,它很乏味。这在某些时候是不错的,可是既然你能花时间美化你的桌面(比如Rainmeter Guide中所示),那么为什么不花一些时间让你的浏览器也与之相配呢?
应用主题再简单不过了。只要转到Chrome主题库浏览一下,选择适合的主题单击“应用主题”。
尝试不同外观时可别害羞,如果你不喜欢,只要单击在安装主题后出现的“撤销”按钮。如果你已经关闭信息栏但想恢复默认外观,选择工具-选项,选择“个人资料”选项卡,然后单击“重置为默认主题”。当你浏览主题时,别忘了在www.chromethemes.org寻找更多漂亮的主题。
10. 保持Chrome的责任心
当你的系统开始变得迟钝,你要做的第一件事就是调出任务管理器(按Ctrl + Alt + Del键),这样你可以审核每一个进程和运行的软件。但是你知道Chrome有自己的任务管理器么?
它的确有,并且信息非常丰富。要访问它,只需按Shift + Esc键。默认情况下,你会看见包含Chrome运行的进程、占用的内存和CPU百分比以及网络统计信息的基本视图。如果碰到有问题的插件或占用太多内存的标签,只需按结束进程按钮。
虽然乍看之下很普通,Chrome内置的任务管理器包含了一些可以派上用场的隐藏监视器。右击任务管理器窗口的任意位置,选择显示或隐藏图片缓存、脚本缓存、JavaScript 使用的内存以及其它选项。要获得更多细节,单击左下角的“详细统计信息”链接,打开 about:memory 页面。
11. 别人的网页也能编辑!
不要担心,我们不准备昧着良心并告诉你如何破解别人的网站,至少不是用你想象的方式。然而我们将告诉你如何在网络空间中编辑任何网站,无论你是不是合法的所有者,不过修改只在你的电脑上有效。
要在本地修改别人的网站,只需右击页面上想改变的区域并选择“审查元素”。这将弹出你能够检查、边界与调试如HTML代码、CSS或JavaScript等各种成分。任何有网页设计经验的人都会感到非常亲切,但如果你不是代码谜可能对这个界面感到有压力。Elements选项卡一个很酷功能就是能够实时体现你对网页的修改。开发者和网站管理员也可以在Resources选项卡中检视每个元素消耗的资源。
12. 为任何网站或书签创建应用程序快捷方式
Chrome的特色之一是能够创建到你喜爱的网站、Web应用程序或书签的特定快捷方式。通过使用作为浏览特定站点的Chrome,你可以在单独的窗口中打开Facebook、Twitter、Gmail或其他网站或服务,并将快捷方式放置于桌面、开始菜单、快速启动栏或任何地方。以下是如何进行。
在一个独立的窗口打开网站。在这个例子中,我们将使用FaceBook。要打开新的Chrome窗口,按Ctrl + N,或在工具菜单中找到对应选项。
在载入你想创建快捷方式的网站后,打开网页菜单,选择“创建应用程序快捷方式…”在某些情况下,将会出现网站的简短描述,以及三个创建快捷方式的选项。选择想要的项目并单击“创建”。
当你使用你新创建的快捷方式,该网站将出现在独立的没有浏览器控制选项、书签和其它浏览相关内容的窗口。
13. 同步你的书签
不久以前,设置Chrome同步你的书签是一件相当麻烦的事件。它需要下载开发版本,创建快捷方式并添加一行代码。这样做之后(并保证你做对了所有步骤),选项就会出现在Chrome。
几个月后出现了多么大的变化啊。Chrome的开发者做到了,任何人都能轻松同步他们的书签,同步书签不再是那些玩程序代码的人的专利了。无论你使用的什么浏览器(稳定版,测试版或开发版),打开工具菜单,选择“同步我的书签…”你需要一个谷歌帐户,你很可能已经有了(如果还没有,请点击链接创建一个)。
填写你的信息后,谷歌将同步你的书签到 Google Docs。要在另外一台PC上同步和访问书签,只要重复上述步骤。非常容易,对吧?
如果你想停止谷歌同步你的书签,只需将单击工具-书签已同步…,进入个人资料选项卡。在最上方你会发现“停止同步此账户”。
14. 亲爱的,我缩小了我的标签 – 它很棒!
这是我们最喜欢的技巧之一。为什么要这样做?好,如果你仅仅只有较小的屏幕来工作,当打开浏览器时屏幕空间将更小。如果你是一个重度的网络冲浪者,一次打开多个选项卡并不稀奇。我们现在谈论的不是打开3个或4个选项卡,而是一打或者更多。它很快变得非常凌乱,但所有标签真的需要做那么多的空间?更糟的是,有一些网页你很可能会始终打开着,如Gmail,Facebook,Twitter或者任何其他的保持连接的网页。它并不需要很长时间占满你的浏览器,但在Chrome里面,你可以收缩的一个或多个标签到只显示他们的图标,释放大量的的浏览器空间。
将很长的选项卡变成只有小缩略图的选项卡,只需右键单击它并选择固定选项卡。这个选项卡将被移到其它长选项卡的左侧。
15. 更改(或禁用)搜索建议
每当你在Chrome的Omnibar地址栏输入时,浏览器“建议”它认为你正在输入的相似的网址,这不完全基于你的搜索历史。不难看出这将扭转一个尴尬的情况,如果别人坐在你旁边看你上网时你刚好把网址给忘记了。如果要禁用Chrome的搜索建议功能,点击工具-选项。进入高级设置选项卡,取消选中“显示针对导航错误提出的建议”复选框。有的时候,你可能会觉得Chrome搜索建议不够多,但你可以使用启动开关来得到更多的搜索建议(见本指南有关启动开关一节)。
找到桌面或任务栏上的Chrome的启动图标,右击并选择属性,进入快捷方式选项卡。在目标框中,追加 -ominibox-popup-count=xx,用你想要的建议数目替换 xx。最后看起来应该像这样:C:\Users\Paul\AppData\Local\Google\Chrome\Application\ -omnibox-popup-count=35
16. 通过五个超级扩展打造个性化Chrome
我们不知道为什么要花那么长的时间等待谷歌正式加入Chrome的扩展支持,但现在终于支持了。Mozilla?大概没有这么多扩展。许多用户不想做出转变的一个重要原因是缺乏扩展,但现在的大门已经打开,预计大量的扩展组件将会出现,就像Firefox当年一样。而最酷的一部分,你甚至不需要重新启动Chrome就可以激活扩展,太妙了!这里有一些我们必备的扩展。
Chrome Gestures
Chrome Gestures是知名的“鼠标手势”的等效扩展,和其它浏览器上的同类扩展一样出色。这应该是每个人必装的扩展。下载链接
IE Tab
即使我们非常喜欢Chrome,但还有一些网页,只能在Internet Explorer下正确显示。与其浪费时间启动IE,不如使用这个扩展以允许你在一个独立的Chrome选项卡中使用IE加载网页。换句话说,你得到了最好的浏览器!下载链接
Tab Sync
有时5点钟流逝的太早。也许你正沦陷于一个很重要的工作项目,或者你正娱乐到一半,但现在是时候出发了。一种解决方案是保存所有打开的标签为书签,打开书签同步,回家后一个一个的打开。或者你可以安装Tab Sync。顾名思义,这个工具同步你所有已打开的标签页。只要按一下按钮,你就可以安心出发。下载链接
The Camelizer
使用Camelizer 扩展使购物更加智能化。Camelizer跟踪产品价格的变化并可运作于很多的流行电子零售商,包括亚马逊、百思买、新蛋、Overstock等。它会告诉你一个产品的最低价格、最近的评价和其他有用的信息,确保你不会花冤枉钱。(译者注:对于非美国本土的使用者来说,这个拓展的用处也许不如它所描述的大。)下载链接
Tab Menu
这对于经常同时打开超过10个标签的人来说极其方便,并且你打开的标签越多,你就更多的使用这个扩展。轻松的在一个下拉菜单中完成诸如选择、关闭、重新排列、查找等更多功能。下载链接
17. 使用Greasemonkey
抛开Mozilla不谈,你的Firefox不再是唯一一个支持Greasemonkey的浏览器了。截止2010年2月1日,谷歌浏览器做到了。这是多么巨大的发展,我们某一天可能会回顾历史并把这作为Chrome历史上最关键的一个时刻而铭记。告你你一些背景资料,Greasemonkey是作为Firefox的扩展起步的。这不仅是一款扩展,Greasemonkey让用户安装脚本并在网站整合实时动态脚本(on-the-fly Javascript)。说透彻一点,Greasemonkey给用户提供了更多扩展,可以在userscripts.org找到40,000个以上。尽管不是所有的脚本都能正常运行,但是很多是可以的,而且这个数字会随着时间的推移而增加。不需要安装任何插件,Chrome的最新版本集成了Greasemonkey。只要单击上面的链接开始体验。这里有几个帮助你开始的扩展。
- Facebook Purity
嘿,我们很喜欢钱、在虚拟黑手党中歼灭很多敌人,但我们不关心你自己的黑手党。一个小行星在你的农场着陆并毁坏庄稼时我们不会感到悲伤,虽然听起来残酷,我们对你打算参加的任何测验中的表现也没有兴趣。我们不是天生讨厌一切东西,只是讨厌Facebook中出现的洪水般的废话。幸运的是,我们并不是唯一讨厌这些东西的人,有人有让Facebook闭嘴的好方法。此脚本做了你所谓的朋友们应该做的事情 – 它移除所有的问答游戏及应用程序的消息,让你像享受被移除前MySpace一样享受Facebook下载链接
- Ebay Hacks
Ebay买家们注意了,你需要安装此脚本。Ebay多年来都在改进反馈系统,但在线拍卖中有一点还没有做,就是可以容易地看到用户的负面或中立的言论。唯一的方法就是翻阅一个人的整个信用评价记录,当与卖家交易时,这可能非常浪费时间。这也是必要的,因为你真的想给有卖假货历史的卖家有机可乘么?Ebay Hacks增加了一对反馈标签并允许你通过所有“收到的投诉”和“仍存在的投诉”快速排序。下载链接
想了解更多?一定要阅读“11个适合Chrome的最佳Greasemonkey脚本”。
18. 在Chrome中实现类似NoScript的效果(以及关于AdBlock)
如果不谈AdBlock而只关注NoScript,看上去有点蠢。所以我们来谈谈现在流行的广告拦截服务。首先,我们需要澄清一点,总的说来,我们不同意使用AdBlock。其理由是,如果读者们都拦截在我们网站上的广告,我们将无法运营,就这么简单。我们也认识到,有一些网站恶意使用弹出式广告干扰读者。这也是明摆着的。所以我们的立场是:如果你必须要安装AdBlock(现在它可用于Chrome在这里下载 ),请对你信任和支持的网站禁用它,希望能包括MaximumPC.com。安装AdBlock扩展为浏览器按钮之后,(在这里
),你可以点击图标,选择“不要在这个域中运行”。好了,现在我们换个话题,让我们将注意力转向NoScript。NoScript有点不同,因为它对潜在的恶意(或者只是恼人的)JavaScript代码提供了一个额外保护层。它是Firefox用户的最爱之一,但Chrome上不可用。
这是个坏消息。好消息是你仍然可以在Chrome上实现NoScript的效果,但你必须使用开发版本(目前是5.0.xxx.x)。它并不华丽,但很有效。当你安装了开发版本(下载点此
),重启浏览器,进入工具>选项,选择“高级设置”标签。在“隐私权”下,单击“内容设置”按钮。
点击JavaScript标签,然后点击“不要让任何网站运行JavaScript”按钮。这将阻止执行所有JavaScript,但如果有某些网站要允许,请点击“例外”按钮,手动输入。或者你也可以允许JavaScript运行,然后建立黑名单,输入网址并从下拉菜单中选择“禁用”。在这里你还可以在其他各标签中控制图像,插件,弹出窗口,和cookies并调整设置。
19. 通过页面分割视图比较网页
标签式浏览是自从……呃,自从有这种浏览方式以来最伟大的事情。但如果你在同一时间查看两个网站,你必须打开另一个窗口。或者,你可以在两个标签之间反复切换。这都不是理想方案。
现在宽屏显示器已经非常普及,但不知道为何分屏浏览功能尚未被所有主要浏览器制造商采用。浏览器制造商步伐缓慢,但你可以自行添加书签项http://www.podobne.pl/splitscreen/
,将你的浏览器分割为两个带独立网址栏的页面。这不是一个完美解决方案——像新蛋之类的网站,仍会占据整个屏幕——但这是我们现在的最好选择,除非浏览器制造商解决这个问题。
20. 让Chrome便携化
有三种方式让你随身携带Chrome:
1.制造一个 LAN Box
2.购买笔记本电脑或上网本
3.下载便携式Chrome。
第三种选择最适合把chrome装进口袋,起码看起来不那么傻。它也不会占用太多U盘空间,约35MB。
只要点击以上链接,下载和“安装”这个应用程序。安装过程实际只是解压缩,你可以将其释放到桌面,然后将文件夹移至U盘,也可直接解压缩到你的U盘。完成后即可打开便携式Chrome开始浏览!(完)
ps:ch 前途无量的 因为 以后会做出os
http://xbeta.info/20_chrome_tweaks.htm
|
自由翼
|
新 开始
ie下恢复第1 篇
hope a new hope a life
peter 顶住啊
哥哥回来了
|
Peter
|
advertiser email domain count
SELECT COUNT( * ) , SUBSTRING( email, LOCATE( '@', email ) )
FROM email
GROUP BY SUBSTRING( lower(email), LOCATE( '@', email ) )
ORDER BY COUNT( * ) DESC
LIMIT 0 , 30
|
Peter
|
直接通过端口读硬盘数据
有时候BIOS提供的功能无法满足我们的要求,我们可以通过端口来读写硬盘。那么怎么来做呢?这两段代码将告诉你答案。里面包含了通过端口读和写两项功能的代码。我想,这两段代码一般情况下是没有什么用处的。但是通过这两段代码我们可以思考一下BIOS中的INT 13的实现方式。它给我们带来的启发是非常有意义的!
; Reading the harddisk using ports!
; +-------------------------------+ by qark
;
;
; This took me months to get working but I finally managed it.
; 让它工作起来耗费了数月的时间,不过最后我解决了它。
; This code only works for the 286+, so you must detect for 8088's somewhere
; in your code.(这个代码是工作的286及其以后的机型中的,因此,你必须检查一下
; 在你的代码中时候有针对8088的)
;
; Technical Information on the ports:
; Port Read/Write Misc
; ------ ------------ -------------------------------------------------
; 1f0 r/w data register, the bytes are written/read here(数据寄存器)
; 1f1 r error register (look these values up yourself)(错误寄存器)
; 1f2 r/w sector count, how many sectors to read/write(你要读写的扇区数)
; 1f3 r/w sector number, the actual sector wanted(你要读写的扇区号)
; 1f4 r/w cylinder low, cylinders is 0-1024(柱面号的低位,柱面号的取值是0-1024)
; 1f5 r/w cylinder high, this makes up the rest of the 1024(柱面号的高位,用来补足1024)(?)
; 1f6 r/w drive/head (驱动器/磁头号)
; bit 7 = 1(5,6,7为固定值)
; bit 6 = 0
; bit 5 = 1
; bit 4 = 0 drive 0 select(选择驱动器1)
; = 1 drive 1 select(选择驱动器2)
; bit 3-0 head select bits(磁头号)
; 1f7 r status register(状态寄存器)
; bit 7 = 1 controller is executing a command(正在执行一个命令)
; bit 6 = 1 drive is ready(驱动器就绪)
; bit 5 = 1 write fault(写出错)
; bit 4 = 1 seek complete(完成定位)
; bit 3 = 1 sector buffer requires servicing(扇区缓冲器需要修理?)
; bit 2 = 1 disk data read corrected(磁盘已被读校验)
; bit 1 = 1 index - set to 1 each revolution(索引,将每个revolution设置成1)
; bit 0 = 1 previous command ended in an error(上一次命令执行失败)
; 1f7 w command register(命令寄存器)
; commands:
; 50h format track(格式化磁道)
; 20h read sectors with retry(重复的读扇区,如果出错)
; 21h read sectors without retry(不重复读扇区,即便是出错)
; 22h read long with retry(重复的读长扇区,如果出错)
; 23h read long without retry(不重复长读扇区,即便是出错)
; 30h write sectors with retry(重复的写扇区,如果出错)
; 31h write sectors without retry(不重复写扇区,即便是出错)
; 32h write long with retry(重复的写长扇区,如果出错)
; 33h write long without retry(不重复长写扇区,即便是出错)
;
; Most of these should work on even non-IDE hard disks.(甚至是,在那些非IDE的硬盘上,应该也是可以工作的)
; This code is for reading, the code for writing is the next article.(这段代码是用来读的,写的那段代码在下一篇文章里)
mov dx,1f6h ;Drive and head port(驱动器和磁头端口)
mov al,0a0h ;Drive 0, head 0(第一个驱动器,第一个磁头)
out dx,al
mov dx,1f2h ;Sector count port(扇区记数端口)
mov al,1 ;Read one sector(读一个扇区)
out dx,al
mov dx,1f3h ;Sector number port(扇区号端口)
mov al,1 ;Read sector one(读一个扇区)
out dx,al
mov dx,1f4h ;Cylinder low port(柱面号低位端口)(注意:柱面号被分成了两部分,这个是低位部分)
mov al,0 ;Cylinder 0(第1个柱面)
out dx,al
mov dx,1f5h ;Cylinder high port(柱面号高位端口)
mov al,0 ;The rest of the cylinder 0(柱面号0的剩余的值,即高位值)
out dx,al
mov dx,1f7h ;Command port(命令端口)
mov al,20h ;Read with retry.(读,如果出错就反复的读)
out dx,al
still_going:
in al,dx
test al,8 ;This means the sector buffer requires servicing.(验证扇区缓冲器是不是处于修理(?)状态)
jz still_going ;Don't continue until the sector buffer is ready.(等待,直到扇区缓冲器的状态为就绪)
mov cx,512/2 ;One sector /2(设置计数器,为半个扇区的大小.)
mov di,offset buffer
mov dx,1f0h ;Data port - data comes in and out of here.(数据端口,硬盘上的数据就是从这个端口进出的)
rep insw ;反复的执行这一命令,直到计数器为0。
; 下面的程序是用来检查是不是已经读出了数据。检验的方法就是通过INT 13H再读一份,然后比较一下
mov ax,201h ;Read using int13h then compare buffers.
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h
mov cx,512
mov si,offset buffer
mov di,offset buffer2
repe cmpsb
jne failure ;如果有一个不一样,输出错误信息
mov ah,9 ;如果全部都是一样,输出成功信息
mov dx,offset readmsg
int 21h
jmp good_exit
failure:
mov ah,9
mov dx,offset failmsg
int 21h
good_exit:
mov ax,4c00h ;返回dos
int 21h
readmsg db ''The buffers match. Hard disk read using ports.$''
failmsg db ''The buffers do not match.$''
buffer db 512 dup (''V'')
buffer2 db 512 dup (''L'')
;
; Writing to the hard disk using the ports! by qark
; +---------------------------------------+
;
; The only differences between reading and writing using the ports is
; that 30h is sent to the command register, and instead of INSW you
; OUTSW.
; 在通过端口读和写硬盘时唯一的不同就是,使用30h功能号时,往命令寄存器
; 中送的命令是OUTSW,而原来是INSW
; I chose to write to sector 2 because some idiot would trash their MBR
; by running this.(我选择写扇区2是因为那些无聊白痴的MBR需要运行在这里)
;
mov dx,1f6h ;Drive and head port(驱动器和磁头端口)
mov al,0a0h ;Drive 0, head 0(第一个驱动器,第一个磁头)
out dx,al
mov dx,1f2h ;Sector count port(扇区记数端口)
mov al,1 ;Write one sector(写1个扇区)
out dx,al
mov dx,1f3h ;Sector number port(扇区号端口)
mov al,2 ;Wrote to sector two(写到第二个扇区)
out dx,al
mov dx,1f4h ;Cylinder low port(柱面号低位端口)
mov al,0 ;Cylinder 0(第1个柱面)
out dx,al
mov dx,1f5h ;Cylinder high port(柱面号高位端口)
mov al,0 ;The rest of the cylinder 0(柱面号0的剩余的值,即高位值)
out dx,al
mov dx,1f7h ;Command port(命令端口)
mov al,30h ;Write with retry.(写,如果出错反复的写)
out dx,al
oogle:
in al,dx
test al,8 ;Wait for sector buffer ready.(等待扇区缓冲器就绪)
jz oogle
mov cx,512/2 ;One sector /2(初始化计数器)
mov si,offset buffer
mov dx,1f0h ;Data port - data comes in and out of here.(数据端口,硬盘上的数据就是从这个端口进出的)
rep outsw ;Send it.(发送数据给它)
; 下面的程序是用来检查是不是已经读出了数据。检验的方法就是通过INT 13H读出刚才写数据的扇区,然后比较一下
mov ax,201h ;We''ll read in sector 2 using
mov bx,offset buffer2 ;int13h and see if we are successful.
mov cx,2
mov dx,80h
int 13h
mov cx,512
mov si,offset buffer
mov di,offset buffer2
repe cmpsb ;Compare the buffers.
jne failure
mov ah,9
mov dx,offset write_msg
int 21h
jmp w_exit
failure:
mov ah,9
mov dx,offset fail
int 21h
w_exit:
mov ax,4c00h ;返回DOS
int 21h
write_msg db ''Sector two written to using the ports.$''
fail db ''Writing using ports failed.$''
buffer db 512 dup (''A'')
buffer2 db 512 dup (''D'')
|
复兴
|
鼠标移走消息
OnMouseMove中添加:
TRACKMOUSEEVENT mouseevent;
mouseevent.cbSize = sizeof(TRACKMOUSEEVENT);
mouseevent.dwFlags = TME_LEAVE;
mouseevent.hwndTrack = m_hWnd;
mouseevent.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&mouseevent);
即可添加
ON_MESSAGE( WM_MOUSELEAVE, OnMouseLeave)
来相应鼠标移走
|
复兴
|
设置窗口的透明色
#pragma comment(lib, "ws2_32.lib ")
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
if (g_pSetLayeredWindowAttributes == NULL)
AfxMessageBox ("Layering is not supported in this version of Windows", MB_ICONEXCLAMATION);
if( g_pSetLayeredWindowAttributes != NULL )
{
g_pSetLayeredWindowAttributes(this->GetSafeHwnd(), 0, (BYTE)0, LWA_ALPHA); //0-255
::RedrawWindow(this->GetSafeHwnd(), NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
}
|
javaei
|
H2P倡议——一种新的互联网应用模式
From: "javaei" <javaei@163.com>
To: "webmaster" <webmaster@javaeye.com>; "admin" <admin@csdn.net>; "contact" <contact@cnblogs.com>; "banq" <banq@163.com>; "jackliu.aws" <jackliu.aws@gmai.com>; "oschina.net" <oschina.net@gmail.com>; "jrwebmaster" <jrwebmaster@javaresearch.org>; "support" <support@cjsdn.net>; "chris" <chris@matrix.org.cn>; "admin2" <admin2@staff.chinaunix.net>; "admin" <admin@oracle.com.cn>; "sangernten" <sangernten@gmail.com>; "software" <software@it168.com>; "admin" <admin@chinajavaworld.com>; "service" <service@360doc.com>; "sinamedia" <sinamedia@vip.sina.com>; "thomastang" <thomastang@tencent.com>; "ir" <ir@service.netease.com>; "webmaster" <webmaster@java-cn.com>; "webmaster" <webmaster@pfan.cn>; "yaoz" <yaoz@163.com>; "Webmaster" <Webmaster@contact.sohu.com>; "java2000_net" <java2000_net@hotmail.com>; "webmaster" <webmaster@staff.ccidnet.com>; "justin" <justin@chinaitlab.com>; "david" <david@kingofcoders.com>; "yanger1997" <yanger1997@yahoo.com.cn>; "admin" <admin@javatx.cn>; "eatfishlin" <eatfishlin@hotmail.com>; "eygle" <eygle@hotmail.com>; "fondofbeyond" <fondofbeyond@163.com>
Sent: Friday, August 07, 2009 10:44 AM
Subject: H2P倡议——一种新的互联网应用模式
各网站管理员:
我是javaei网站的管理员,近段时间,我站提出h2p概念,并推出h2p应用。h2p是html to pdf的意思,具体地说是根据批量URL生成一个有书签的pdf文档的解决方案,该方案是一个完整的解决方案。我觉得h2p是互联网应用的一种创新,值得推广,经过调查,得到不少人的认可。但是javaei网站的影响力有限,推广力度不够,为了能让h2p被大家认可并得到推广,特向各位发起倡议,一起来完善并推广这种应用,当然首先要得到各位的认可。H2p在技术上微不足道,重要意义体现在应用模式上。就像Rss一样,rss本身技术上没什么可说的,但应用模式上意义重大,rss从提出到被接受,也是经过了曲折的历程。我私下里希望,h2p也能像rss那样,被广为接受,最终成为一种大家接受的应用模式而确立下来,更重要的是,这是中国的程序员发起并推广的,这绝对是零的突破。
下面从三个方面来展开:h2p具体介绍,为什么要推广h2p,h2p完善和推广
一、H2P具体介绍
H2P是javaei网站发展的结果。H2P包括两个部分:h2p-file和h2p-tool。h2p-file其实是xml文件,用来描述批量的URL,主要描述两个信息,url的先后顺序和层次结构(用于处理书签)。h2p-tool是一个客户端工具,用途目前主要有三个,根据dtd校验h2p-file的合法性、编辑h2p-file和根据h2p-file生成有书签的pdf文档。
(1)h2p-file
在目前的方案中h2p-file包括两个xml文件,href.h2p.xml和outline.h2p.xml。
href.h2p.xml示例如下
<href-info>
<href id="KxgYaRxG">
<value><![CDATA[http;//www.163.com]]></value>
</href>
<href id="53Bw5A32">
<value><![CDATA[http://www.sohu.com]]></value>
</href>
<href id="eyEis6ra">
<value><![CDATA[http;//news.163.com]]></value>
</href>
<href id="DMQoSN2t">
<value><![CDATA[http;//sports.163.com]]></value>
</href>
<href id="5vaf3LN7">
<value><![CDATA[http://news.sohu.com]]></value>
</href>
</href-info>
这个xml很简单,之所以这样描述,是因为URL通常会有&而这个符号不能出现在xml里,而且作为属性的值,还不能用<![CDATA[]]>,所以就作为一个节点了。
h2p-tool根据这个xml生成的每个pdf文件,pdf文件的名字取id的值,后缀为pdf。
outline.h2p.xml示例如下
<book name="我的PDF书">
<chapter name="163" href="KxgYaRxG">
<chapter name="163新闻" href="eyEis6ra" />
<chapter name="163体育" href="DMQoSN2t" />
</chapter>
<chapter name="sohu" href="53Bw5A32">
<chapter name="sohu新闻" href="5vaf3LN7" />
</chapter>
</book>
这个xml描述了每个pdf合并的顺序,href的值和上一个xml的id值对应,chapter标签嵌套的层次就是书签的层次,name的值就是书签的名称。H2p-tool根据这个xml把每个pdf合并成一个pdf,并生成书签。
考虑到h2p的发展,完全有理由把这两个xml文件合并成一个xml文件,可以定义成如下格式:
<book name="我的PDF书">
<chapter name="163">
<href><![CDATA[http://www.163.com]]></href>
<chapter name="163新闻">
<href><![CDATA[http://news.163.com]]></href>
</chapter>
<chapter name="163体育">
<href><![CDATA[http://sports.163.com]]></href>
</chapter>
</chapter>
<chapter name="sohu">
<href><![CDATA[http://www.sohu.com]]></href>
<chapter name="sohu新闻">
<href><![CDATA[http://news.sohu.com]]></href>
</chapter>
</chapter>
</book>
对应的dtd可以定义如下
<!ELEMENT book (chapter+)>
<!ATTLIST book name CDATA #REQUIRED>
<!ELEMENT chapter (chapter*)>
<!ATTLIST chapter name CDATA #REQUIRED>
<!ATTLIST chapter href CDATA #IMPLIED>
在这个方案当中,h2p-file具有十分重要的意义,它作为一种资源被提供下载,也可以在线使用,h2p-file的格式作为一种协议,可以被各大网站支持,
(2)h2p-tool
h2p-tool是处理h2p-file的客户端工具,目前h2p-tool的功能主要有以下三个方面
根据dtd校验h2p-file的合法性,
编辑h2p-file编辑功能包括新建、修改、保存,
根据h2p-file生成有书签的pdf文档,先根据。
目前h2p-tool一部分是用C#开发的,一部分是用Java开发的。不管h2p-tool用什么开发,通过什么方式使用(在线或离线的),只要能处理h2p-file即可。
h2p-tool的功能还可以有如下扩充:
合并h2p-file,解析h2p-file在线阅读(这一点类似于google reader),也可以不需要h2p-tool,直接用xsl展示h2p-file。
下图是h2p生成pdf的一个示例。
二、为什么要推广H2P
其实就是要回答h2p有什么价值。自从有了h2p构想以来,我一直在思考这个问题。
从以下几个方面说明我的思考:
(1)各大网站已经积累了丰富的资料,随着pdf的风行,导出pdf是很多用户的需求,提供pdf导出功能的网站还不多,实际上技术已很成熟,原因在于没有很好的模式。导出pdf是个性需求,网站无法知道用户需要把哪些导出成pdf,而且在服务器端生成pdf,不仅会增加服务器端压力。而且会增加管理员工作量。而如果网站只是提供h2p-file下载,由用户利用第三方工具(也即h2p-tool)自行编辑h2p-file,自行生成pdf,上面的问题就解决了,服务器端压力没有了,只需生成h2p-file,用户可以根据自己的需要对h2p-file进行编辑,生成pdf既满足了个性需求,同时把生成pdf的压力转移了用户,这点小压力对单个用户是可以接受的。
(2)如果网站想支持pdf导出的话,那么只需提供h2p-file,就像rss一样,网站要提供订阅功能,只需提供rss就行
(3)网站可以根据用户的请求动态的生成h2p-file,从而间接的实现根据请求动态生成pdf的功能,这一点意义非凡。
(4)网站提供h2p-file,会导致对网站内容的整理和挖掘,从而促进站内智能搜索的应用。
(5)满足了用户的便捷,就是赢利的开始。关于盈利,在网站广告投放这方面一点都不会受影响,pdf超强的表现力足可以完美的表现广告效果,在h2p-file里可以适当放一些广告链接,同时,h2p-tool上也可以投放广告,h2p-tool在生成pdf的时候也能再适当位置加入广告。把广告固化到pdf文件里,这种方式比在浏览器里显示的广告生命周期要长得多,因为pdf是只读的。
(6)最后一点,是意义上的而非价值上的,那就是如果h2p推广开了,被人们接受了,那么这将是第一个由中国的程序员发起并推广的一个协议,一个互联网应用模式。Bbs、blog、wiki、twitter、rss等等,耳熟能详的东西,有技术含量吗?真正有价值的是这些应用模式,正是这些应用模式推动着互联网的飞速发展。而搜索引擎却集优秀的应用模式和先进的理论思想与技术于一身。
(7)有可能带来其他方面的影响,比如网站内容的提炼和聚合。
三、H2P完善和推广
H2P刚刚产生,是个雏儿,尽管核心思想已经体现出来了,但在形式上和应用上还有需要大幅度的完善。可从以下几个方面展开:
(1)齐心协力共同制定和完善h2p-file的格式,使h2p应用更加便捷和丰富。h2p-file可以分成两个文件独立描述,也可以合为一个,前面已经阐述了。
(2)确定了h2p-file的格式,进一步完善和重新开发h2p-tool,h2p-tool可以有三个方向,一个方向就是目前的方向,开发一个客户端工具,并且使用浏览器的内核,把浏览器的功能集成进来,在java开发方面已经有了JDIC这么一个框架了;第二个方向就是类似google reader的方向,在线解析h2p-file,以树形结构显示连接,提供在线的便捷阅读;第三个方向采取最简单的方式,直接用xsl显示h2p-file。
(3)博克文章、论坛帖子一般至少有三分之一的内容是广告或图片,直接根据URL生成的pdf就显得很臃肿,这是这个方案的缺陷,解决这个问题最简单的思路就是网站针对h2p应用再提供一个URL,根据这个URL得到的内容主要是文字形式的内容,之所以说它简单,是因为现在的界面的输出大多采用的模板技术,在模板上稍作变动,就可以输出没有太多广告和图片的内容。但考虑到网站需要投放广告,可以允许有少量广告,从而就产生了h2p-file质量这个概念,图片越少广告越少,那么生成的pdf就越干净体积就越小,h2p-file质量就越高;反之,生成的pdf就像现在的报纸一样,实质内容淹没在广告里而且体积还很大,h2p-file质量就越低。
(4)如果上面的思路得到了采纳,那么根据一条URL生成单个pdf 的技术就能很好的解决。目前的h2p-tool在这一部分的开发用的是一个C#组件(生成的pdf有水印,我估计这个组件是调用了IE浏览器的功能)。之所以采用这个组件,是因为要保证生成的pdf展现效果和浏览器里的效果完全相同,这无异于做一个浏览器,难度可想而知。如果专门为h2p应用再提供一个URL,根据这个URL得到的内容主要是文字形式的内容,没有复杂的标签和样式,这种情况下,使用iText等框架生成pdf是可行的。Javaeye网站提供的pdf下载和电字书制作得到的pdf就是这种情况,提取博克文章的主体内容生成pdf。
(5)各网站对h2p的支持很简单,只需发布网站内容的h2p-file即可,h2p-file从此就以协议或资源的身份出现在互联网中。
以上三方面的内容分别阐述了h2p应用模式、h2p的意义和价值和h2p完善和发展的方向,回答了为什么要发起这个h2p倡议。敬请各网站管理员考虑我的意见,推动这个新的h2p应用,不仅会各网站带来新的赢利,而且这将是我们这些中国程序员的集体荣耀。
2009-8-7
Javaei网站
相关介绍:
投票——你认为h2p实用吗
H2P介绍
根据批量URL生成有书签的PDF文档的解决方案
pdf生成的解决方案(H2p)之H2P技术细节
pdf生成的解决方案(H2p)之H2P展望
|
Peter
|
JAVA规则开发篇
本文介绍的JAVA规则的说明分为3个主要级别,本篇抛弃了平时开发中很少遇到的情况,那些用得比较少的以后再高级篇里面出现。并有六个有用的国际软件开发重要注意的有关String的问题,遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。
(1) 如果有JDBC连接没有关掉的话,需要在"finally"方法中关掉
如果数据库连接失败或者是没有释放连接,看上去无关紧要。但是其他的用户就需要用更长的时间等待连接,这样数据库利用效率就会下降。确保你的代码在任何情况下,包括出错或者程序异常终止的情况下都释放数据库连接。在"finally"方法中关掉连接,就可以确保这一点。
错误示例:
try {
Statement stmt = con.createStatement();
} catch(SQLException e) {
e.printStackTrace();
}
正确示例:
try {
Statement stmt = con.createStatement();
} finally {
if (con != null && !con.isClosed()) {
con.close();
}
}
(2) 尽量避免使用'Thread.resume ()', 'Thread.stop ()', 'Thread.suspend ()'和 'Runtime.runFinalizersOnExit ()' 方法。
这些方法在平时的开发或者是教科书里面也有用到过,但是这些方法会导致四锁的倾向。一下有充足的资料来说明为什么不建议用上述方法。
参考:1."java.lang.Thread" in the JDK API documentation
2. http://java.sun.com/j2se/1.3/docs/guide/misc/threadPrimitiveDeprecation.html
3.Paul Hyde: "Java Thread Programming"
Sams, ISBN: 0-672-31585-8 pp. 270
(3) 在表示长整常量的时候,用L来代替l.
因为l很容易和1混一起。
错误示例:
long temp = 23434l;
正确示例:
long temp = 23434L;
参考:Ken Arnold, James Gosling: "The Java Programming Language Second Edition"Addison Wesley, 1997, pp.108
(4) 最好在jsp开头写一条注释
在 jsp文件头上面写一条注释,这样可以帮助别人来理解你的代码。这条规则不仅适用于jsp,更是用于任何开发的文档。
正确示例:<%-- JSP comment --%>
(5)明确的初始化一个构造类里面的所有的字段
因为没有初始化的字段会是一个潜在的bug,所以最好初始化类里面的所有的字段。特别是静态的字段,最好在一开始就分配一个初始值
错误示例:
public class CSI {
public CSI () {
this (12);
k = 0;
}
public CSI (int val) {
j = val;
}
private int i = 5;
private int j;
private int k;
}
正确示例:
public class CSIFixed {
public CSIFixed () {
this (12);
}
public CSIFixed (int val) {
j = val;
k = 0;
}
private int i = 5;
private int j;
private int k;
}
参考:http://www.ambysoft.com/javaCodingStandards.pdf
(6) 国际化开发建议:逻辑操作符不要再一个单个的字符的前面或者后面
一个单个字符的前后不要用逻辑操作符,如果代码要在一个国家环境中运行的话。我们可以使用字符比较方法,这些方法使用统一字符比较标准来定义字符的属性的。
错误示例:public class CLO {
public boolean isLetter (char ch) {
boolean _isLetter = ( ch >= 'a' && ch <= 'z') //错误
|| (ch >= 'A' && ch <= 'Z');
return _isLetter;
}
}
正确示例:
public class CLOFixed {
public boolean isLetter (char ch) {
boolean _isLetter = Character.isLetter(ch);
return _isLetter;
}
}
参考: http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
更多的字符比较方法请参考:http://java.sun.com/docs/books/tutorial/i18n/text/charintro.html
(7) 国际化开发建议:不要对日期对象使用'Date.toString ()'
不要使用'Date.toString ()'方法,日期格式对于地区和语言不同的国家来说是不一样的,务必不要使用。
错误示例:'DateFormat'类提供了一个预定义的格式类型来指定本地的格式。
public void printToday () {
Date today = new Date ();
String todayStr = today.toString ();
System.out.println (todayStr);
}
正确示例:
public void printToday () {
Locale currentLocale = Locale.getDefault ();
DateFormat dateFormatter = DateFormat.getDateInstance (
DateFormat.DEFAULT, currentLocale);
Date today = new Date ();
String todayStr = dateFormatter.format (today);
System.out.println (todayStr);
}
参考:http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
http://java.sun.com/docs/books/tutorial/i18n/format/dateFormat.html
(8) 国际化开发建议:不要对数字变量使用'toString ()'方法
在全球化的开发中,不要对数字变量使用'toString ()'方法,对于java.lang.Number的任何子类都适用。包括:BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, and Short.对于这样的情况,java里也与定义了"NumberFormat"方法来格式化。
错误示例:
public class NTS {
public void method (Double amount) {
String amountStr = amount.toString ();
System.out.println (amountStr);
}
}
正确示例:
public class NTSFixed {
public void method (Double amount) {
Locale currentLocale = Locale.getDefault ();
NumberFormat numberFormatter =
NumberFormat.getNumberInstance (currentLocale);
String amountStr = numberFormatter.format (amount); //
System.out.println (amountStr + ' ' + currentLocale.toString ());
}
}
参考:http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
http://java.sun.com/docs/books/tutorial/i18n/format/numberFormat.html
(9) 国际化开发建议:不要使用'String.equals ()'方法
建议不要使用'String.equals ()'方法,因为在统一字符比较标准中不一定按照相关的顺序来比较。'Collator'提供的预定义整理规则来排序string,Collator类调用'getInstance ()'方法,一般来说,可以为默认的本地创建一个Collator。例如:Collator myCollator = Collator.getInstance ();创建Collator的时候你也可以指定一个特殊的locale。例如:Collator myFrenchCollator = Collator.getInstance (Locale.FRENCH);然后就可以调用'Collator.compare ()'来执行一个本地的字符比较myCollator.compare (s1,s2);从这里可以了解更多的有关Collator类的信息:http://java.sun.com/docs/books/tutorial/i18n/text/collationintro.html
错误示例:
public class SE {
public boolean compstr (String s1, String s2) {
boolean b = (s1.equals (s2));
return b;
}
}
正确示例:
public class SEFixed {
public boolean compstr (String s1, String s2) {
Collator myCollator = Collator.getInstance ();
boolean b = (myCollator.compare(s1,s2) == 0);
return b;
}
}
参考:http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
http://java.sun.com/docs/books/tutorial/i18n/text/locale.html
(10) 国际化开发建议:不要使用'StringTokenizer()'方法
错误示例:StringTokenizer st = new StringTokenizer(str);
可以从这里得到更多的信息:‘
参考:http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
(11) 国际化开发建议:不要使用'Time.toString ()'方法
因为时间的格式各个国家也不一样。如果你使用日期格式类,你的应用就能够在世界上各个地方正确的显示时间和日期了。首先,用'getTimeInstance ()'方法创建一个formatter。然后,调用'format ()'方法。
错误示例:
public class TTS {
public void printTime (Time t1) {
String timeStr = t1.toString ();
System.out.println (timeStr);
}
}
正确示例:
import java.sql.Time;
import java.text.DateFormat;
import java.util.Locale;
public class TTSFixed {
public void printTime (Time t1) {
DateFormat timeFormatter = DateFormat.getTimeInstance(
DateFormat.DEFAULT, Locale.getDefault ());
String timeStr = timeFormatter.format(t1);
System.out.println (timeStr);
}
}
|
|
|
 |
|
 |
|