2009年5月9日星期六
利用 a 标签的 DOM 属性解析 URL 字符串(javascript)
function parseURL(url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':',''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function(){
var ret = {},
seg = a.search.replace(/^\?/,'').split('&'),
len = seg.length, i = 0, s;
for (;i<len;i++) {
if (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
hash: a.hash.replace('#',''),
path: a.pathname.replace(/^([^\/])/,'/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
segments: a.pathname.replace(/^\//,'').split('/')
};
}
jQuery mp3 播放插件
- 在你的web页面播放控制mp3文件
- 用html+css就可以创建自己的mp3 播放器风格
- 在你的jquery项目中加入声音效果
$(document).ready(function(){$("#jquery_jplayer").jPlayer({ // 初始化ready: function () { // 载入后执行$("#jquery_jplayer").changeAndPlay('elvis.mp3'); // 自动播放mp3文件}});$("#jquery_jplayer").jPlayerId("play", "play_button"); // 设置播放按钮$("#jquery_jplayer").jPlayerId("pause", "pause_button"); //设置暂停按钮$("#jquery_jplayer").jPlayerId("stop", "stop_button"); //设置停止按钮$("#jquery_jplayer").onSoundComplete( function() { // 播放结束后执行代码$("#jquery_jplayer").play(); // 重新播放});});播放 暂停 停止
javascript的一些小技巧
var list = [1,2,3,4,5,6,7,8,9];
list = list.sort(function() Math.random() > 0.5 ? 1 : -1);
Print(list); //可以得到类似下面的结果: 4,3,1,2,9,5,6,7,8
2:从数组中移除一个对象
function RemoveArrayElement( array, element ) !!let (pos=array.lastIndexOf(element)) pos != -1 && array.splice(pos, 1);
3:把浮点数转换为数值
(123.345456).toFixed(); // is: 123
typeof (1.5).toFixed(); // is: string
4:返回一个对象属性的个数
({ foo:55, bar:99 }).__count__ // is: 2
5:检查一个对象是否为空
javascript 1.5下:
function isNotEmpty(obj) {
for ( var tmp in obj )
return true
}
javascript 1.8下:
function isNotEmpty(obj) obj.__count__;
6:单件模式
function MySingletonClass() {
if ( arguments.callee._singletonInstance )
return arguments.callee._singletonInstance;
arguments.callee._singletonInstance = this;
this.Foo = function() {
// ...
}
}
var a = new MySingletonClass()
var b = MySingletonClass()
Print( a === b ); // prints: true
2009年5月8日星期五
2009年5月7日星期四
创业前要弄清楚的十件事
2. Are you really an entrepreneur?
3. Does your venture involve something you understand really well?
4. Can your mother understand the value proposition?
5. Can you see the right wave?
6. What does your startup want to be when it grows up?
7. Starting a company is hard and uncertain.
8. Get a partner or fly solo?
9. Would you refuse a well-paying job to do this?
10. Can you raise appropriate financing?
社群的智慧,摸象记
不过,盲人摸象这个故事如果从另外一个角度的话,反而有大大的智慧在。
举一个简单的例子,如果你有一罐子硬币,找一百个人,让他们猜里面有多少个,他们中的人很大部分是答错的,但是把他们的结果汇总一下,找出最中间的数字,这个数字基本上和瓶子中的硬币数量是一致的。
这就是社群的智慧。google的搜索结果排名算法以及BT的下载原理都用到了社群的智慧,这些伟大的产品大大便利了我们的生活。
社群并不是总是能产生智慧的,乌合之众也大量存在。一篇文章谈到,要实现社群的智慧,有一些条件是必须的:
第一:你的问题要足够简单,不要让别人想很久。比如猜硬币的个数。
第二:结果可以汇总。
第三:参与者最好各式各样,这样保证他们的角度不会太相似。你也可以得到好的均衡结果。
第四:参与者是自私的,各自盘算。这一条估计是从古典经济学来的。
参考:The Wisdom of Community
《群众的智慧》
2009年5月4日星期一
Reddit的筛选排名算法
Reddit:
定义
t = (t1 - epoch)
两个时间 A 和 B,其中,t1 为某篇文章的具体发布时间,精确到秒;epoch 为一个固定的时间常量,2005-12-8 7:46:43。则可以计算得到 t1 和epoch 间隔的秒数t,
定义x为某文章得到支持票数减去得到的否定票数
然后定义y为,
- 1如果支持票数大于否定票数 ,
- -1 如果支持票数小于否定票数,
- 0两者的数目相等.
现在定义:
z = max({x,1})
然后我们就得到了排名
ranking = C log10(z) + yt1
这里C是一个常量 (C = 45000).
1)时间点 epoch,2005-12-8 7:46:43,是一个固定的值,猜测应该是 Reddit 的上线时间。t 反映了文章的新鲜程度。引入 epoch 是一个非常优雅的技巧,它使得新鲜度的度量可以独立于系统当前时间。
2)y 表示支持数和否定数之间的相对关系。被否定多的文章得负分,这是合乎常理的。
3)45000 代表的是一个 12.5 小时周期内的总秒数。它 与 yt 一起使用,随着时间的推移,新文章的得分会逐渐超越高投票数的老文章,从而实现自动更新的效果。
4)log10 的使用是另外一个技巧,它可以使得早期的投票获得更大的权重。比如,前 10 票获得的权重,与 11 到 101 票所获得的权重是一样的。
整个公式的效果可以简单解释为:在 00:00:00 发布的一个帖子 a,如果它想在 12.5 小时之后,能够取得与在 12:30:00 发布的帖子 b 同样的得分,则必须在 00:00:00 点到 12:30:00 这段时间内,把它的得票数扩大 10 倍。注:这个解释不精确,但容易理解一些,不然写着太绕。
不过,其中 45000 与 log10 的选择不是通用的,得根据自己网站实际的情况进行修正。这是一个 trial-and-error 的过程,也是作算法的人最头大的部分。
Hacker News的筛选算法
(p - 1) / (t + 2)^1.5
其中,
1)p 表示文章得到的投票数,之所以要使用 (p - 1),应该是想去掉文章提交者的那一票。
2)(t + 2)^1.5, 这个是时间因子。t 表示当前时间与文章提交时间间隔的小时数。


