离线下载Chrome扩展

今天算是写了第一个Chrome扩展了。早上在点点网上看到东京幻想的一组图,非常喜欢,习惯性地用谷歌类图搜索找大图。但是有个网站被Q了,死活打不开,这样的话就少了两张图,对于我这个强迫症来说是不能忍受的,于是开始酝酿写一个离线下载的玩意,更确切地说是一个代理下载。

在以前的VOA 聚合器项目中使用过一个HTTP 下载类,正好顺手就拿来用。这个类不知道是谁写的,其中有一个 SaveBinFile() 方法没有定义,我也不知道该如何修补,索性直接用 SaveToBin() 方法代替好了,加入一个判断目标文件是否是文本的逻辑,如果是文本的话给特殊扩展名(不是 htmhtml 的)加上 html 后缀。

这样折腾完之后呢,两张图片的地址作为 GET 方法的参数 url 传入进去,返回 json 字符串提示服务器端下载成功了,然后我访问 json 中提示的地址,两张图片轻松到手。

不过这样怎么配叫做不折腾会死星人呢。这种下载方式每次都这么折腾,何不来个舒服点的,做成一个Chrome 扩展,遇到无法访问的资源,直接右击链接就能下载,这样岂不快哉。随后参考了N 多资料(我比较笨),主要是官方的文档,终于做好了。顺便说一下,Chrome扩展程序开发人员文档(非官方中文版)这个站点翻译得不错。

现在的效果就是,右击链接,选择 CrossGet this!,扩展会在后台发送 Ajax 请求,文件下载完成之后,会自动新建一个标签页打开,可以浏览或是下载啦。如果下载失败的话,有桌面通知提示。

最后记一下用到的一些代码神马的。

// 右键菜单。
var options = {"title": title, "contexts": contexts, "onclick": genericOnClick}; // genericOnClick 是回调函数。
var context = chrome.contextMenus.create(options);
// 桌面通知。
var notification = webkitNotifications.createNotification(
  'icon.png', 
  'Error!', 
  'Server returned an error.'
);
notification.show(); // 不调用show() 方法的话通知是不会显示的。
// Ajax 的GET 请求。
XmlHttp.open("GET", finalurl, true); // finalurl 中预先将要发送的GET 参数拼接好。
XmlHttp.send();
// 右键菜单的回调中如何获取链接的url。
var genericOnClick = function(info, tab){ // 不需要实际传入这两个参数。
  var link = info.linkUrl; //这样获取链接的url。
  console.log(link); // 可以输出到console 看一下。
}

因为这个用到了我的 kilu.de 免费空间,所以只是个人使用。

Ajax异步の基础

任何 JavaScript 书上都会教你这样创建 Ajax 请求。

var XmlHttp;
if(window.ActiveXObject){
  XmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}else if(window.XMLHttpRequest){
  XmlHttp = new XMLHttpRequest();
}
XmlHttp.open("POST", "getlist.php", true);
XmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
XmlHttp.send("type=" + reqType);

但是我一直这样使用:

// ...
XmlHttp.open("POST", "getlist.php", false);
// ...
var response = XmlHttp.responseText;
// #actions...

这样是同步请求,就是说在等待的时候浏览器相当于冻住了,你无法执行其他他的操作。这就违背了 Ajax 异步的本意。我直到一个月前才理解了 Ajax 异步请求的基础。其实就是像下面这样。

// ...
XmlHttp.open("POST", "getlist.php", true);
// ...
XmlHttp.onreadystatechange = function(){
 if(XmlHttp.readyState == 4){
    // Actions here...
  }
}
// ...

VOA41Week小改进

虚拟机安装了XP ,IE 升级到IE 8了,顺手测试了一下VOA41Week ,发现列表根本就显示不出来。

在shownhide.jjs 中定义了Object 的show 和hide 方法,用于元素显示和隐藏的动画效果,但是在对元素调用这两个方法的时候,IE 提示"对象不支持此属性或方法"。找了很久找不到解决方法,在贴吧里问了一下,原来IE 中DOM 元素并不是继承自Object ,从http://msdn.microsoft.com/en-us/library/dd282900 来看,是继承自Element 。

然后改了下这两个方法,IE 、火狐和Chrome 测试都通过了。

ubuntu 12.04系统托盘不显示ibus输入法图标

在终端运行以下命令,然后注销,重新登录。

gconftool --type boolean -s /desktop/ibus/panel/show_icon_on_systray true
gconftool --type boolean -s /desktop/ibus/panel/show true
gsettings set com.canonical.Unity.Panel systray-whitelist "['all']"

PS,这个方法来自ubuntu 12.04系统托盘不显示ibus输入法图标的解决方法。我使用之后发现,不仅输入法图标出来了,原来一直没有图标的 Shutter 截图程序也能显示系统图标了。

学院网站の吐槽

由于时间久远,这篇文章吐槽的网站现在已经改版,读者请根据文章内容自行脑补。

话说我不得不吐槽一下学院的这个网站了。

这个“网站”。。。首先要吐槽的是端口,好端端地你用什么8088端口啊?!你服务器默认的80端口哪里去了啊?!其次你这个子域名也很蛋疼啊,www2是神马个意思啊!!!既然学校有自己的域名,搭一个cehui的子域名很难吗?!!!!还有你这个路径。。/ch/是神马???不知道的还以为你有多国语言支持啊!!找了一圈才发现只有中文啊!!只有中文你这是干毛啊!!!!

版面就更加令人发指了啊!!用的表格布局也就算了啊,你右上角那个导航是怎么回事啊!!!用图片做的链接,字体都能不一样啊!!!左上角那个logo下面的“Home | Site”是神马啊!!!导航下面那个一闪一闪亮晶晶的居然不是动画效果啊!!那就是一个gif动画啊!!!开始我还以为有链接可以进入不同的新闻啊!!!这个动画左边转呀转的flash是要表达什么啊!!!这货还把写着学院名字的图片挡住了啊!!!右边这个“推荐文章”的背景图错位了啊喂!!用表格布局都还能错位啊喂!!!!乃们把搜索按钮肿么了啊!!!它看起来好委屈啊!!!

用表格布局就用吧,可是每个板块的宽高都 不一样是怎么回事啊喂!!怎么有种感觉像是随手拖出来的啊!!左下角的友情链接没有内容啊喂!!!右边联系方式的图片看不清楚啊喂!!右下角的投票是个摆设啊我擦,有种被深深欺骗了的赶脚啊!!!

最下面的版权说明语义重复了好嘛。。。还有那个看起来崩坏了的版权图片是怎么回事???

吐槽完毕,接着工作。

图片夹带压缩文件之Ubuntu版

贴吧里貌似很流行一种做法,要提供一个小文件下载时,夹带在一张图片里,保存这张图片并把后缀改为 rar 就能看到压缩文件的内容了。而且这张图片是相当正常的,可以显示出来。

在网上搜索了一下方法, win 下是使用 copy 命令将两个文件合成一个。自己尝试了一下用 cat 命令合并文件。

cat 1.gif 2.zip > 1.gif

这样发现图片是可以显示,但是无法以压缩文件形式打开。又尝试了一下与声音文件合并。

cat 1.wav 2.zip > 1.wav

这回神奇了,这个文件既可以播放也可以提取压缩内容。但是声音毕竟没有图片传播方便,接着折腾图片。想起原来看压缩文件这一块的计算机史时有提到 zip 文件都是以 PK 两个字母开头的,觉得应该是这里有问题,可能是记录 zip 文件格式的数据混杂在图片数据里无法区分了。把资料压缩成 rar 格式,再合并,OK!

cd Desktop/
cat 1.rar 1.gif > 2.gif

情侣与杀人狂

以前在豆瓣看过一个关于情侣与杀人狂的段子,当时也没有想太多,不过后来大家的讨论越来越离谱了。今天在豆瓣翻看友邻的相册,发现一个概括性很好的回复,转过来留着吧。

故事一:有一对情侣,他们高中开始相识,彼此相爱,大学去了美国,那个城市有一个杀人狂,专杀恋人,他们成为了杀人狂的牺牲品,他们被装在机器上,一分钟腰部的刀会撕裂腹部,生还的办法是一个剪刀石头布的游戏机,胜方生存,他们决定共同摁拳一起死,可是女孩死了,因为他出了剪刀,女孩出了布。。

一楼女:那女的其实是为了男的死了,她太了解那男的了
二楼女:其实女孩早就知道男孩会出剪刀,她为了让男孩活下去才出布,那男的太贱了
三楼女:支持楼上,那男的太贱了
四楼男:也许是那女的好,可是那男的也没错啊……
五楼女回复四楼:他明知道自己女朋友了解他会出剪刀,他为什么不出石头?男人就每一个好东西,不是贱我是什么?
六楼女:这女孩死的真不值,天底下男的就没一个好东西
七楼男:我感觉女的是为了生存吧,如果真是为了让男孩活下去的话未免太像童话了
八楼女回复七楼:呵呵,告诉你,天底下的女孩子都是这么善良,童话?我看是你们这些男的太偏激了吧
九楼男:我想知道男的错在哪里了……
十楼女回复九楼男:错在哪里了你都不知道?女孩子都为他死了,天底下男的就没有一个好东西,这个世界怎么了

故事二:有一对情侣,他们高中开始相识,彼此相爱,大学去了美国,那个城市有一个杀人狂,专杀恋人,他们成为了杀人狂的牺牲品,他们被装在机器上,一分钟腰部的刀会撕裂腹部,生还的办法是一个剪刀石头布的游戏机,胜方生存,他们决定共同摁拳一起死,可是男孩死了,因为她出了剪刀,男孩出了布。。

一楼女:这男的就是贱,女孩看上他就是瞎了眼,男的就没一个好东西
二楼女:CNM这些男的怎么都不去死,要不是女孩太爱他就是自己死了,怎么会有这种人渣
三楼男:有没有这种可能,男孩知道女孩会出剪刀让自己生存,所以自己出了布……
四楼女回复三楼男:呵呵,你以为这是童话呢
五楼女:这男的死得好,哎呀怎么世界上就没有好男人,哎,男的怎么都不去死啊

我真不知道怎么内涵了

毕业季***你的遗憾

在豆瓣上看到一个活动——毕业季***你的遗憾。没有去统计前几名是什么呃,只是简单看了下。

等到我毕业,会有什么遗憾呢?专业课没学好并不算遗憾,至少现在看来不是,我不认为对一个专业真心无爱彻底不感兴趣会能学好;所以,没有拿过奖学金也就不算是遗憾了;遗憾可能就是,没有更早一点接触到计算机;遗憾可能就是,再也没有精力去认真地经营一份感情(包括友谊);遗憾可能就是,再也没有深入学习英语的动力;遗憾可能就是,没有读更多的书。

有哪一些是我现在能做的?我可以读更多的书;我可以更努力地学习我感兴趣的知识。经营感情之类的,我脑内的化学物质决定了我现在不可能去做。

这篇文章留到以后有遗憾了,或是毕业了再更新吧。