2009年5月9日星期六

利用 a 标签的 DOM 属性解析 URL 字符串(javascript)

James Padolsey 的 Blog中提到的一个技巧

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 播放插件

jPlayer
这个插件可以让你做这些事:
  • 在你的web页面播放控制mp3文件
  • 用html+css就可以创建自己的mp3 播放器风格
  • 在你的jquery项目中加入声音效果
这个插件其实使用了一小段flash来播放mp3文件,但是这个flash在页面里面是找不到的,被很好的隐藏起来了,播放器都是使用js来控制的。
比如下面这一段代码可以建立一个你自己的播放器:

$(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的一些小技巧

    1:打乱一个数组的顺序
    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日星期五

    zk框架的执行流程



    1:ZK Client engine 在浏览器客户端监听用户的事件,如果检测到用户移动鼠标或者改变了一个数值,他就会通知服务器端的Update Engine.
    2:收到Client Engine的请求后,Update Engine会在必要的情况下更新服务组件的内容,并通知相关的事件处理器。
    3:服务端的操作完成之后,Update Engine将更新的内容发回Client Engine,Client Engine再更新浏览器DOM树的元素。

    google 说:我们没有垄断

    Anonymous Analysis of Google Charm Offensive

    2009年5月7日星期四

    创业前要弄清楚的十件事

    rww列出了十条
    1. Is this your first venture?
    这是你第一次冒险吗?
    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的筛选算法

    Hacker News 所使用的公式非常简单,

    (p - 1) / (t + 2)^1.5

    其中,
    1)p 表示文章得到的投票数,之所以要使用 (p - 1),应该是想去掉文章提交者的那一票。
    2)(t + 2)^1.5, 这个是时间因子。t 表示当前时间与文章提交时间间隔的小时数。