時計坂一刻館三号室

归类于 笔记::千草 的日志存档

在 Firefox 中将 Thunderbird 设为默认 RSS 阅读器……

屈超(沙滩凉鞋) 发表于 2008 年 6月 3 日 7 时 42 分

Set ThunderBird as Default RSS Reader in Firefox

之前主要用 Google Reader ……
但在线工具毕竟是在线工具……
没有手感 -__- ……
在我还没下定决心用 Google Gear 之前……
我想到了用 ThunderBird ……

好歹自己也算是个 ThunderBird 的拥趸了……
不仅仅只是把它作为一个邮件终端……
还利用其强悍的 Filter 和 Tag 功能管理邮件列表、订阅新闻组……
然后配合 LightningGoogle Calendar 和 Treo 来实现 GTD ……
这次将其提拔为 RSS 阅读器实在是最近有点儿心痒……
想折腾折腾工作环境……

好吧……
入正题……
有人可能会问……
Firefox 不是允许选择线下 RSS 阅读软件么?」
是的……
的确可以……
但是你可以指定 ThunderBird 作为阅读器试试看……
点击 “Subscribe Now” 后除了呼出 ThunderBird 外并没有执行订阅操作……
自家人都不认自家人了……
像个什么话!

屡试屡爽之后……
我意识到这可能是个 Bug ……
二话不说上 Bugzilla 一搜……
果然就就是 Bug 350735 ……
不过前年的 Bug 至今还没解决还真是有点儿那啥……

继续搜索……
找到几种解决临时方案……
其中在 MozillaZine 论坛找到的方案应该是最通用的一种了……
作者 alta88 说是由于 Thunderbird 接受 Feed 的参数与 Firefox 发送的不符而造成的……
知道原因就好办了……
马上搜索 ThunderBird 源码……
在 components\newsblog.js 中找到了如下代码:
(Portable ThunderBird 位于 App\thunderbird\components\newsblog.js)

  1. /* nsICommandLineHandler */
  2. handle : function(cmdLine)
  3. {
  4. // we only care about "-mail someurl" where someurl is a feed: url
  5. // we also don't want to remove the parameter in case we don't end up handling it...
  6.  
  7. var mailPos = cmdLine.findFlag("mail", false);
  8. if (mailPos != -1 && cmdLine.length >= mailPos )
  9. {
  10. var uriStr = cmdLine.getArgument(mailPos + 1);
  11. if (/^feed:/i.test(uriStr))
  12. {
  13. var mailWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService()
  14. .QueryInterface(Components.interfaces.nsIWindowMediator).getMostRecentWindow("mail:3pane");
  15.  
  16. // if we don't have a 3 pane window visible already, then we can optimize and do nothing here,
  17. // that will let the default command line handler create a 3pane window for us using the feed
  18. // URL as an argument to that window when it gets constructed...so we only care about the
  19. // case where we want to re-use an existing 3 pane to subscribe to the feed url
  20. if (mailWindow)
  21. {
  22. cmdLine.handleFlagWithParam("mail", false); // eat up the arguments we are now handling
  23. cmdLine.preventDefault = true; // prevent the default cmd line handler from doing anything
  24.  
  25. var feedHandler = Components.classes["@mozilla.org/newsblog-feed-downloader;1"].getService(Components.interfaces.nsINewsBlogFeedDownloader);
  26. if (feedHandler)
  27. feedHandler.subscribeToFeed(uriStr, null, mailWindow.msgWindow);
  28. }
  29. }
  30. }
  31. },

显然可以看出……
ThunderBird 要求 Feed 作为 Mail 参数来传递……
具体格式为:

  1. thunderbird.exe -mail feed:URL

我在命令行下测试如下命令……

  1. thunderbird.exe -mail feed:http://www.quchao.com/feed/

果然成功地订阅成功……

问题找出来就好解决了……
两种方案……
让 Firefox 附上参数……
或让 ThunderBird 忽略参数……
显然添加参数比忽略参数要安全……
毕竟 ThunderBird 不只是 RSS 阅读器而已……
忽略掉参数怕会影响其它的服务哟……

那么就拿 Firefox 开刀吧……
看了 alta88 的解决方案……
他增加了两个 pref 变量用来保存参数和 Feed 协议……
很通用的方法……
但我个人觉得没有必要……
不如直接判断阅读器的文件名……
包含 Thunderbird 变添加参数后发送……
一来不必往 Pref 里添加并不常用的变量……(洁癖作祟?)
二来其它 RSS 阅读器没准就直接支持 Firefox 的方式……

我的修改方法如下:
找到 Firefox 的 components\FeedConverter.js 文件……
(Portable 版本位于 App\firefox\components\FeedConverter.js)
搜索:

  1. var ios =
  2. Cc["@mozilla.org/network/io-service;1"].
  3. getService(Ci.nsIIOService);
  4. var feedURI = ios.newURI(spec, null, null);
  5. if (feedURI.schemeIs("http")) {
  6. feedURI.scheme = "feed";
  7. spec = feedURI.spec;
  8. }
  9. else
  10. spec = "feed:" + spec;
  11.  
  12. var ss =
  13. Cc["@mozilla.org/browser/shell-service;1"].
  14. getService(Ci.nsIShellService);
  15. ss.openApplicationWithURI(clientApp, spec);

替换为:

  1. // Hacked by Chappell.Wat from http://QuChao.com @ 2008-6-3
  2. if (clientApp.persistentDescriptor.toLowerCase().indexOf('thunderbird') != -1) {
  3. var targetFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
  4. try {
  5. targetFile.initWithPath(clientApp.persistentDescriptor);
  6. }
  7. catch(e) {
  8. alert(e);
  9. return(false);
  10. }
  11. if (!targetFile.exists()) {
  12. alert('Client Does Not Exists.');
  13. return(false);
  14. }
  15. spec = 'feed:' + spec;
  16. var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
  17. process.init(targetFile);
  18. var arguments = ['-mail', spec];
  19. process.run(false, arguments, arguments.length,{});
  20. } else {
  21. var ios =
  22. Cc["@mozilla.org/network/io-service;1"].
  23. getService(Ci.nsIIOService);
  24. var feedURI = ios.newURI(spec, null, null);
  25. if (feedURI.schemeIs("http")) {
  26. feedURI.scheme = "feed";
  27. spec = feedURI.spec;
  28. }
  29. else
  30. spec = "feed:" + spec;
  31.  
  32. var ss =
  33. Cc["@mozilla.org/browser/shell-service;1"].
  34. getService(Ci.nsIShellService);
  35. ss.openApplicationWithURI(clientApp, spec);
  36. }

原理是判断阅读器文件名……
包含 “thunderbird” 便发送 -mail 参数……
至于为何要换 openApplicationWithURI 函数为 run ……
事出无奈……
openApplicationWithURI 似乎无法发送形如 -mail feed:URL 的参数……
且源码应该是被封在 browser.xpt 里……
不过使用效果一样就行了……

最后……
轮到测试时间了……
测试之前我建议还没有在 ThunderBird 里建立 RSS 账户的朋友去新建一个……
(File -> New -> Account… -> RSS News & Blogs)
我当初修改了好久均无法调用订阅动作……
看了代码才知道是没有 RSS 账户提供绑定……
(详见 components\newsblog.js 文件的 120-132 行 )

下面跟着我一起访问 feed:http//www.quchao.com/feed/
(要是觉得慢也可以自己随便找个源喔……)
浏览器会把你带到订阅界面……
在下拉菜单中选择 “Choose Application” 并定位于你的 ThunderBird ……
(如顶图)
接下来猛击 “Subscribe Now”……
不出意外 ThunderBird 应该被激活(或启动)来验证 Feed 地址……
如果验证无误……
这个 Feed 应该就乖乖躺在你的 RSS 账户里了……
如果没有它躺下……
您可以在本文后留下您遇到的问题……
我会尽力解答……

Use FolderPane Tools to change the order

题外话一:
如果你和我一样由于邮箱太多……
新建的 RSS 账户位于底部看不见的话……
我建议使用 FolderPane Tools 来调整账户的顺序……
(如上图)

题外话二:
如果你和我一样不习惯将 RSS 和 Mail 数据放在一起的话……
你可以看看这篇文章……
顺便说一下我的 RSS 账户 ID 是 11……
(现在你知道我到底在 ThunderBird 里放了多少东西了吧)
修改完后……
RSS、邮件和新闻组的数据放在不同的文件夹……
看着舒心……
用着也放心……

题外话三:
很早之前用过一个名为 RSS News Ticker 的软件……
相当好用……
但是该软件的更新是全局式的……
比如你设置 10 分钟更新一次……
那么不管 RSS 有没有显示完它都会“敬业”地进行更新……
我的想法是仅仅订阅一个源……
这个源包含所有我未读 RSS ……
是否能通过编写 Thunderbird 扩展来完成呢……
考虑ing……

2 则评论 | 永久链接 | Trackback | RSS 2.0

[080131] Portable Firefox 下 Vimperator 0.5.3 个性调整……

屈超(沙滩凉鞋) 发表于 2008 年 1月 31 日 19 时 54 分

很抱歉……
直到 Vimperator 0.5.3 发布一个多月之后的今天……
我才更新了本日志……

为 Firefox 2 之下最后的一个版本……
最令人咋舌的是 vimperatorrc 的引入……
(即配置文件…… 同 Vim 的 _vimrc ……)
建立的方法有两种……
第一种是先用 :set 命令对各项设置进行设定……
然后运行 :mkv 命令来自动生成配置文件……
这种方式生成的配置文件位于 HOME 文件夹……
如果你和我一样使用 Windows 系统……
那么 HOME 环境变量很可能没有设定……
系统会自动在 USERPROFILEHOMEDRIVE\HOMEPATH 下寻找配置文件……
那么很可能你会在 C:\Documents and Settings\Chappell.Wat 下找到它……
Chappell.Wat 是我的个人账户文件夹……)
这种方法虽然方便……
但配置文件被放置在系统文件夹……
要是重灌系统时忘了这茬儿……
后果就……
所以我选择了第二种……
也即手动建立 vimperatorrc 文件的方法……
由于 ~ 除了代表 HOME 之外还指代 VIMPERATOR_HOME 变量……
且后者的优先级高于前者……
因此我们只需要建立一个名为 VIMPERATOR_HOME 的环境变量……
并将其值指向 Vimperaotor 扩展所在的目录……
再将我们编写好的 vimperatorrc 文件扔进去……
(Win 下 _vimperatorrc 优先于 .vimperatorrc ……
*nix 下 反之……)
这样一来就毋庸担心重灌系统所带来的损失了……
至于配置文件的格式嘛……
很简单……
每行放一条命令即可……
比如我的……

set vb
set go=m
set hc=hjklasdgyuiopqwertnmzxcvb
set titlestring=Chappell.Wat’s Vimperator

这样每次启动 Vimperator 就会自动载入该配置……
而且重灌系统后重设环境变量就会恢复到重灌前的状态了……
是不是很方便咧……

花了大量篇幅介绍了 vimperatorrc 文件……
有了前面的基础……
下面只需要在 VIMPERATOR_HOME 的文件夹里建立路径为 vimperator\plugin 的文件夹……
即实现了其插件的功能……
该文件夹下的 js 插件将在 Firefox 启动时自动加载……
由于目前我对 vimperator 的插件尚无什么研究……
就不多说了……
不过我正着手挑一个常用的扩展为其编写一个 Vimperator 插件……
不知选什么比较合适……
要不选FlashGot……

另外一个令人欣喜的更新是可以自动识别 WYSIWYG 编辑器了……
而之前是需要输入 I 来启动 escape 模式的……
简而言之……
你现在用可视化编辑器编写日志、帖子时……
就不用先 escape 了……
直接就可以进行编辑……
支持 Ctrl - C 和 Ctrl - V 等熟悉的快捷键……
这与我之前的猜想一样嘛……
哦活活活……
其它比较有特色的更新……
比如……
Ctrl - g 可以在状态栏显示页面信息……
用 + 和 - 用于在状态栏显示历史状态……
这些都不说了……
还是让我们等待 Vimperator on FireFox3 吧……

今天的最后……
表达一下我想维护 Vimperator 中文版的想法……
但是我本身却习惯使用英文版……
矛盾中……

Read the rest of this entry »

8 则评论 | 永久链接 | Trackback | RSS 2.0

手动恢复系统 DLL 文件……

屈超(沙滩凉鞋) 发表于 2007 年 9月 15 日 23 时 08 分

凉鞋从北京回来之前就出现了这样的问题:
资源管理器的菜单项目变成了中文……
(一直以来俺用的是英文版……)
肯定是美化系统时替换文件留下的后遗症……
难道这就是装 13 的代价?

趁周末有空……
还是修复下好了……
否则看起来不伦不类的……

首先嘛……
是确定与问题相关的 DLL 文件……
Google 了一下……
大概是 browselc.dll ……
用 eXeScope 确认了一下……
果不其然……
根本就是中文的嘛……
(事实上后来发现还有残余……
几经查找后发现是 shdoclc.dll
不再话下……)

接下来就是找到原始的 DLL 文件……
如果你不幸和我一样没有备份的好习惯的话……
请翻出系统盘……
搜索了一下发现这两个文件都经过压缩……
名称格式为: Basename.DL_
既然压缩了咱就得解压……
用如下命令进行释放:

  1. expand H:\I386\Basename.DL_ X:\Basename.dll

其中 H 盘是光驱……
当然您也可以直接替换到系统目录的同名文件……
但是由于系统文件有写保护……
所以直接解压过去之前您恐怕得先用如下命令解除写保护……

  1. attrib -r -s C:\windows\system32\Basename.dll

但实际上Windows 提供了内部的替换命令……
所以我们在解出 DLL 文件后可以直接用该命令进行替换:

  1. replace X:\Basename.dll C:\windows\system32\Basename.dll /R

然后就重启一下吧……
完毕……
睡觉觉……

2 则评论 | 永久链接 | Trackback | RSS 2.0

MinGW + EditPlus/Vim 打造轻量 C/C++ IDE

屈超(沙滩凉鞋) 发表于 2007 年 9月 9 日 0 时 19 分

VC++ 实在太大了……
而且不符合一直以来凉鞋所推崇的 Portable 标准……
于是选择了 MinGW 配合 EditPlus 或 gVim 来构建自己的“IDE”……
(严格也算不上 IDE 啦……)
记录如下……

1.到 MinGW 的“私服”去下载必须文件……
我所需的文件罗列如下……

binutils-2.17.50-20060824-1.tar.gz
gcc-core-3.4.5-20060117-1.tar.gz
gcc-g++-3.4.5-20060117-1.tar.gz
mingw32-make-3.81-2.tar.gz
mingw-runtime-3.13.tar.gz
w32api-3.10.tar.gz

2.建立 MinGW 文件夹……
选择符合自己习惯的文件夹……
比如和编程工具放在一起……
因为本方法是 Portable 的……
重装(或移动)后稍作设置即可重新工作……
假设本例中我们选择了……

X:\Tools\MinGW

只要你不嫌麻烦……
路径稍微长一些无所谓……
尽量不要用中文路径……

3.解压 MinGW 各部分……
Read the rest of this entry »

3 则评论 | 永久链接 | Trackback | RSS 2.0

关于 Windows 服务器下 Serv-U 经常自动停止的解决方法……

屈超(沙滩凉鞋) 发表于 2007 年 9月 5 日 22 时 50 分

某服一直以来都有这样的问题……
还以为是版本或者流量的关系……
查来查去终于发现是开启了“屏保”……

分特……
我怎么没记得有开启过屏保?
难道被谁动了手脚?
调查中……

顺便做个笔记……

暂无评论 | 永久链接 | Trackback | RSS 2.0

最纯净的 Apache 2 && PHP 5 && Mysql 5 for WinXP 配置法

屈超(沙滩凉鞋) 发表于 2006 年 6月 25 日 21 时 05 分

完整显示   1 2 3 4 5 6 7 8
写在前面:

如果你有处女情结……
那么请选用我的伺服器配置方式吧……
(笑……)
笑归笑……
转载请注明作者 & 文章来源……

我的安装配置方式当然不是最好的……
(虽然我自己认为是最完美的……)
但由于我个人有”绿色情结“……
实在不想多往系统盘丢文件……
所以选择了这样一种尽量绿色的安装方法……
而且软体的选择了能稳定运行的尽量较新的版本……
(为了保证开发的适应性,
采纳了 vBulletin 官方的推荐方案……)
希望对大家有用……
(其实你是最近重装系统才顺便写了这篇文章吧?)

目录:

完整显示   1 2 3 4 5 6 7 8

暂无评论 | 永久链接 | Trackback | RSS 2.0

昨晚顿开的茅塞……

屈超(沙滩凉鞋) 发表于 2006 年 2月 28 日 13 时 30 分

注:真的不是“茅厕”……
取这个抬头真麻烦……
NND……

昨晚大叔研究 C 语言……
本想找出“ELSE IF”和“ELSEIF”的真正意义差别……
(因为实际使用效果是没有差别的……)
结果发现了一个以前从未注意过的问题:
“逻辑表运算符的优先次序 & 表达式的执行顺序”……

这两个问题综合到一起……
可以写出优美简洁的程式……
比如判断闰年:

  1. $year = 1985;
  2. if ((!($year % 4) && $year % 100) || !($year % 400)) {
  3. echo "$year is a leap year.";
  4. } else {
  5. echo "$year is not a leap year.";
  6. }

得到的输出是:1985 is not a leap year.
(用脚趾头也能算出来吧……)
至于为何说程序很优美简洁呢?
大叔来分析一下:

首先,我们确定一点……
闰年是少于一般年份的……
所以程序应该倾向于“排除”……

其次,我们看 “||” 符号……
根据其特性……
当左边的“!($year % 4) && $year % 100”值为 True 时……
就用不着做右边“$year % 400”的真值判断……
(显然,能被 4 整除且不能被 100 整除的年份比能被400整除的年份要多得多……
这样可以最大限度的避免执行右边的真值判断……)

再次,再看左边的“&&”符号……
根据其特性……
当只有当左边的“!($year % 4)”为 True 时……
才需要做右边“$year % 100”的真值判断……
(再显然,能被 4 整除的年份要比不能被 100 整除的年份少得多……)
这样也可以最大限度得避执行右边的真值判断……

如此这般那么以后……
大伙是否懂了呢?

如果哪位高人有不同看法……
麻烦面刺寡人……
谢鸟……

6 则评论 | 永久链接 | Trackback | RSS 2.0

国际麻将规则……

屈超(沙滩凉鞋) 发表于 2006 年 2月 16 日 6 时 20 分

完整显示   1 2 3 4 5 6 7 8 9
这次春节的同学聚会上……
大叔照例坐到麻将桌上……
要命的是……
大叔竟“诈胡”四把……
(她们用鸟“情感攻势”扰乱了我的军心……)
而某些女士更是声称自己“不会”……
结果大挫大叔的士气……
因此!!!
为鸟雪耻……
为鸟重建“赌圣”威名……
(星爷语:人人都叫我赌圣……
还是决定从国际规则读起……
要知道:
她们那些业余的和我们这种专业级别根本不能比……
啊哈哈哈哈哈哈哈哈……

整理如下:

目录:

  1. 引子
  2. 基本术语及一般规定
  3. 比赛程序规定
  4. 行牌规定
  5. 和牌的规定
  6. 番种的分值与计分
  7. 比赛成绩的计算
  8. 名次评定
  9. 比赛缺席的处理办法
完整显示   1 2 3 4 5 6 7 8 9

2 则评论 | 永久链接 | Trackback | RSS 2.0

播放器加载中……
读取中……
图书数据加载中……
读取中……
剧集数据加载中……
读取中……
专辑数据加载中……
读取中……
2008 Firefox+ Summit
歌曲数据加载中……
读取中……
通讯方式加载中……
读取中……
QR Code 加载中……
读取中……