这是个工具

先前看TED视频,关于 学校教育扼杀创造性的视频。
视频很好,也有中文字幕等。下面也提供高清版本下载,很是欣喜。
遗憾的是,字幕不提供下载。(或者说我没有找到)

俗话说,自己动手丰衣足食。直接拿Firebug找到字幕文件地址,下载下来看到是JSON格式的,随即想到直接用JS输出字符串就可以转换到srt字幕。
代码如下,非常简单的代码,实用就好,不求效率、安全和边界问题,只求最快解决我的问题~

不得不说,学一门编程语言很有意义,不论是什么,都能很方便解决一些实际的问题。这很开心。
JS仔细说来是一门很强大的语言,处理JSON和XML都很方便,大多数时候应付足够了。不过也会有力不从心的时候,尤其是对于系统的操作,总有很多缺陷。不过如果算上微软的JScript的话,也很可以了。曾经想学Python,现在也坦然了,随便用什么,喜欢就好。或许,这与我不再从事IT相关行业有关吧。够用就行咯~


//读取chi_hans文件
$.getJSON(“chi_hans”,function(json) {
var c=json.captions,o=[];
for (var i=0,l=c.length; i
+timeline(c[i].startTime+c[i].duration+18500));
o.push(c[i].content);
o.push(“”);
//if (i==5) break;
}
//这里我输出到一个textarea
$(“#output”).text(o.join(“\r”));
});
//这是根据JSON里时间得到srt字幕里的时间
function timeline(time) {
t=new Date(time);
return [
leadZero(t.getUTCHours()),
leadZero(t.getUTCMinutes()),
leadZero(t.getUTCSeconds())
].join(“:”)+”,”+leadZero3(t.getUTCMilliseconds());
}
//加入前导零
function leadZero(s) {
if (s<10) { return "0"+s; }else { return s; } } //这也是前导零,三位数的 function leadZero3(s) { var ret; if (s<10) { ret="00"+s; }else if (s<100) { ret= "0"+s; }else { ret=s; } return ret; }

圆角?抱歉,你的浏览器不支持。请升级以获得更好体验。

之前写过一篇博客,问是否敢对IE6说不。实际上,我虽然自己没有公然抗议,暗自的还是有一些的。

最常见的就是:hover伪类了。除了二级菜单这类关键部位之外,其他地方一律用此处应当使用的标签,而不滥用a。其:hover伪类IE6无法支持,大不了少了点效果而已,不会有功能损失。想获得更好体验?请升级。为此写脚本做兼容?抱歉,我没时间。实际上,很多时候需求方并不在意这些细节交互地方。他们都不在意,你在意什么?

圆角?对不起,我可不高兴用一堆标签弄出圆角来。九宫格之类的办法不是不会,只是嫌麻烦。一堆标签自己看得心烦。直接用border-radius,浏览器要支持你就圆角,不支持就方的好了,没什么了不起的。除非需求方强烈要求,那在说

阴影?呵呵,同样对不起,阴影如果方便直接背景就背景,不方便实在抱歉……我给一个box-shadow已经很不错了,兼容Chrome Firefox 3.5呢。没了阴影功能又不会缺失,可有可无。

文字阴影?text-shadow伺候,如果需求方执意要求,那只能做背景图了……只是Chrome下文字阴影效果真是颗碜。。。

其实CSS3有很多很美妙的特性,利用这些特性可以非常轻易制作很出众的效果,何苦为了一些效果而花费大量时间呢?
适当跟需求方说明这些。告诉他们实现这些所要消耗的人力成本有多高。让他们自己决定哪些一定要,哪些可以放弃一部分低级浏览器用户。
在完善的沟通下,才能说服老板,说服需求方逐步抛开低级的浏览器,才能促进整个大环境的改变。

适当转型——写点生活

之前一直是纯技术博客,现在打算逐渐转一点,逐渐加入些生活元素。
当然,我也有另外的博客,太过私人化的不会放在这里了。大家放心。(就算我想放你们也管不着,这是我的博客,灭哈哈哈哈~~)
虽然有了twitter,但有些时候还是博客可以积淀一些东西。
架设Dabr和twitter的api很容易,我也有架设,能猜到的话,欢迎一起用,但别声张~
你也可以自己架设自己用。很容易搜索到教程

另外,收到 likeren 邀请(他的博客很人文,搞技术测宅男们建议吸取一些人文素养),尝试了一下国外的基于软件同好的SNS Wakoopa有兴趣可以上面来一起玩。

再另外,最近接了个项目后,有了点感悟,想写博客,结果发现想要写的太多,纠结很久。在此次牢骚一下……

给账族写的快速入账命令行GM脚本

最近要开始记账,寻遍国内外各种在线记账的也未能找到完全诚心如意的。最终觉得账族整体界面、操作上都比较符合我要求。
源于在Todoist上任务管理的录入方式,通过一系列命令可以快速输入。所以希望这里入账也有命令行。
而这个网站又恰巧用了jQuery,就写起来更顺手了。
此外,这个网站貌似目前主要开发任务是论坛……我不说啥了……不指望他们近期能开发这个功能。
所以,为了进一步加速入账效率,则开发了这个脚本。

比如我输入:
工资 +5000
回车,早就自动往我工资帐户加上了5000元(其实我工资远不到5K。。。不过做的蛮开心,暂无跳槽之意。)

又比如输入:
3 旅游 1000 信用卡
就自动设置为3天前,旅游用信用卡花了1000,花费分类是旅游

就类似这种功能。

地址是:
http://userscripts.org/scripts/show/55688
我用着还挺爽。

json2select的全国城市数据

去年写过一个小插件,json2select 一直想要转换出配套的数据,但总有这样那样的问题之后,终于拖到了现在。
好在一切悲剧的日子已经过去了,新时代已经来临。猛击这里
三级联动,直辖市精确到城镇街道,一般城市到达区。强烈推荐。

这一切都要感谢 Asfman ,辛勤的工作,当然也少不了感谢搜狐白社会,是他们提供了这么好的数据,也要感谢我们伟大祖国,我们中华民族地大物博,省市也很多……

这套数据有100K多一点,但可以想办法压缩
把其中重复字符串替换掉,把街道替换成j,市替换成s,区替换成q,都可以减少文件体积。要用的时候先用正则替换后,再eval执行字符串就能得到数据了,可以达到68K左右
另外,保存成gb2312的话也可以减小体积。目前我手头的是52K左右大小了。但可能导致乱码,慎用。

进一步,如果通过词频分析,找出重复最多的前20个,替换的话,相信可以把体积维持在30K以下了。但手头没工具,最近也很忙,所以大家自己发挥吧。
我粗略压缩后的东西我就不单独发布了。

update:
在热心网友 Noker (虽然截止到目前位置似乎博客里还空着)的帮助下,已经把这套数据压缩到只有30K左右了。太棒了!
大家可以到 移步到这里下载 对应的数据,以及查看demo

update:
网友fantasy提出一个潜在的bug,由于这套数据中只有 标题 子元素 而没有对应的value值,所以后台无法获取到。为此需要修改一下源文件创建option的那一行

文字竖排

今日闲逛,走到了维基文库水调歌头 (明月几时有),恰巧发现他居然是文字竖排的,很有兴趣一看。

网上目前两种方法竖排,
一种是用 writing-mode:tb-rl;
另一种是用 layout-flow: vertical-ideographic;
但遗憾的是,这两种方法都基本是 IE Only 的……
那么维基文库是如何做到的呢?随便翻看一下代码,恍然大悟~

水調歌頭
 
蘇軾 
 
明月幾時有 
把酒問青天 
不知天上宮闕 
今夕是何年 
我欲乘風歸去 
又恐瓊樓玉宇 
高處不勝寒 
起舞弄清影 
何似在人間 
 
轉朱閣 
低綺戶 
照無眠 
不應有恨 
何事長向別時圓 
人有悲歡離合 
月有陰晴圓缺 
此事古難全 
但願人長久 
千里共嬋娟 

虽然代码不是很优雅(自动生成的……)但大概意思也知道了。设置宽度为1.5倍的字宽,保证列距,然后让所有div右浮动。
很简单又很有用的技巧,兼容各个主流浏览器~

最后引用一句,对于IE“不應有恨……”,他有些私有属性还是挺有趣的……
(注:原文中“恨”是遗憾的意思。)

控制函数队列

前一篇文章中探讨了关于jQuey中队列控制的两个函数 queue 和 dequeue,这两个极大方便了我们编写一些有时间差、并非立即执行完毕,却对次序要求很高的代码。

这里我再发布一个自己编写的处理队列的代码
注:这里的代码行为与jQuey的代码行为不完全一样!

测试页面: http://shawphy.com/lab/myqueue.html


var myQueue=function(fnArr){
//将队列放入fnArr
this.fnArr=fnArr||[];
};
myQueue.prototype={
fnArr:[],
queue:function(fn) {
//如果是函数数组,则依次放入
if (fn[0]) {
for (var i=0; fn[i];this.fnArr.push(fn[i++])){}
} else {
this.fnArr.push(fn);
}
},
dequeue:function() {
//弹出剩余的第一个函数并执行
(this.fnArr.shift()||function(){})();
},
clear:function() {
this.fnArr=[];
}
};

用法:
用new 创建一个实例:
var foo=new myQueue()
或者带一个函数数组:


var foo=new myQueue([
function() {
test.innerHTML+=1;
setTimeout(“foo.dequeue()”,1000);
},
function() {
test.innerHTML+=2;
setTimeout(“foo.dequeue()”,1000);
}
]);

还可以再添加一组或者一个函数


foo.queue([
function() {
test.innerHTML+=3;
setTimeout(“foo.dequeue()”,1000);
},
function() {
test.innerHTML+=4;
setTimeout(“foo.dequeue()”,1000);
}
]);

foo.queue(function() {
test.innerHTML+=5;
setTimeout(“foo.dequeue()”,1000);
});

开始执行当前队列中的第一个函数:

foo.dequeue();

清空队列:
foo.clear();