jQuery utility functions
jQuery提供了很多以$为命名空间的工具方法(utility function)。这些方法都是不具体操作结果集(wrapped set)或是非面向对象的,其实就是一些全局的方法。
具体的方法用法参考jQuery API在线查看器 ,这里就只是简单的列一下好了:
- 浏览器和特性探测
- $.browser.xx(可选值为safari/opera/msie/mozilla)布尔型,是否为特定的浏览器
- $.boxModel 布尔型,true为w3c 标准box model,false为ie box model
- $.support 可以查看更多的浏览器特性,具体看文档
- 字符串方法
- $.trim(str)
- $.param(obj) 将form元素数组或对象序列化成url参数
- 数组与对象
- $.merge(first,second)合并数组,在first中添加second中的元素,并返回first
- $.unique(array)array中的元素去重,array中的元素仅限dom元素,不能是数字和字符串
- $.grep(array,callback,invert)用callback方法过滤数组元素
- $.map(array,callback)用callback方法将数组元素逐个处理
- $.each(object,callback) 遍历执行object中的元素,执行callback
- $.extend(deep,target,object1,…,objectN) 和prototype.js类似的extend对象机制
- $.inArray(value,array) $.isArray(obj) $.isFunction(obj)看名字就知道什么意思了
- 脚本加载
- $.getScript(url,callback)加载url制定脚本后执行callback,加载的脚本会被执行
值得说明的几处:
jQuery in Action中介绍的$.map和$.grep中callback是可以为字符串类型,以实现类似lambda形式的操作,在jQuery的1.2.3版本中由于要兼容Adobe AIR已经被去掉了,书中的写法“$.grep(originalArray,'a>100');”已经不能使用了。
看到书中的小标题 - "Will the real $ please stand up?” - 时不禁一笑(让我想起了我酷爱的Eminem的The Real Slim Shady 中的歌词“Will the real Slim Shady please stand up”)。这个$的冲突问题以前在第一章的时候说过,如果jQuery要和其他框架联合使用,很有可能$会冲突。之前介绍了通过使用jQuery.noConflict()解决问题.但还是有如下的情况,某段由jQuery写的代码被移植到一个页面,而这个页面也用了prototype.js,所以需要jQuery.noConflict()调用,然后把那段移植代码中的$符号都换成jQuery,如果万一少替换了几处,就很可能会导致代码有问题,还是有一点儿让人烦躁了吧。其实可以用书中介绍的技巧来解决这个问题:
(function($){
//
// Plugin definition or your jquery code goes here
//
})(jQuery);
先声明一个方法,然后传入jQuery做参数,在函数体内$就可以用来表示jQuery了,不会和函数体外面产生冲突,上面提到的移植代码只要由这个包装一下就不需要替换了,实际上jQuery的插件定义也都应该用这种形式,很妙的技巧。
链接: 《jQuery in Action》 in action系列
Google App Engine原本是不支持后台任务的,毕竟人家是免费开放资源,不可能让大家随意使用CPU。同时也有每个http请求最高执行时间10秒的限制,因此必须借助外部服务器才能实现某些长期运行的后台运算任务。不过最近俺又看了看Google App Engine的网站,发现前一阵子上线的Cron Jobs功能,再搭配最新公测的Task Queue 已经可以完美的实现后台任务的功能了。
我们假设一个简单的在线RSS Reader,它需要后台定期的取很多feed的更新,如果我们使用自己服务器的环境,多半会写一个程序,遍历一遍所有的Feed去抓取更新,然后把这个程序配置为cron任务在服务器上定期执行,当然要是Feed比较多,就一个程序一直不停的在后台运行也可以。
但是在GAE的环境下就不行了,因为GAE有每次请求10秒的执行时间限制,所以即使在推出Cron Jobs的功能后,还是不能很容易的实现我们上面说的功能,因为遍历一次所有的feed并取数据肯定要超过10秒钟。一个可能的方法是只能处理很小的任务(肯定不超时),就把所有的执行状态都存在memcache中,然后等下次job的时候继续上次的位置处理。
最近上线的Task Queue功能可以改变这种状态,还是通过Corn Jobs定期执行任务,这个任务只是把“遍历一遍所有Feed”这种大任务拆分成许多可以在10秒中内完成的小任务,比如取一个feed的更新做一个任务,通过Task Queue api添加到Queue(如果你要做实验,默认的队列就可以),只添加不执行因此不会超时,之后Queue会逐渐的消费这些任务 - 这样就完成了原定的后台任务。
其实有意思的是前后两个后台运行方案的比较。我们第一印象的方案和最终用GAE实现的方案的最大不同就是可伸缩性(Scalability)。比如系统要求所有的Feed都要15分钟内更新一次,而Feed的数量大到一定的规模后,遍历获取所有Feed的更新要超过15分钟,那么肯定需要修改程序进行多进程处理。如果是固定的多进程数那么Feed的规模再变大还是有问题,如果是随Feed量控制进程数,又要设计每个进程的Feed分配问题,总而言之肯定不容易。而GAE的版的方案则完全没有这个问题,随着Feed的增加,我们只要不断加强Queue的消费能力就可以了(对应GAE就是bill更多的quota),也就是有一个明确的有效的可扩展点。
这其实是GAE的特征,说到底它是靠可伸缩性赚钱的 - 人们编写的程序在负荷小的时候可以免费运行,等到负荷上去了,不用修改程序,只要给GAE钱买更多的资源不需要大改才程序。如果做不到这样的可伸缩性,也就没人愿意在GAE上付费,GAE也就没有生命力,商业云计算都是以可伸缩性为商业模式的基础吧。其实我是想说,上面的例子给我的提示就是,评估一个软件架构的扩展性的时候,可以想想这个方案能否用GAE实现,无论最后应用是否用GAE来做,能用GAE实现的方案一定有很强的可伸缩性,不能用GAE实现的方案可能可伸缩性会差一些。
外汇学院 - 交易单类型
原文地址 国内原文镜像 School of Pipsology课程表
术语“交易单”或“订单”("order") 指的是你开始或结束一桩交易的操作。这里我们来讨论一下在外汇交易市场中能见到的几种交易单类型。一定要确认你的代理商(broker)都支持哪些类型,不同的代理商通常支持的类型不同。
基本交易单类型
一些基本的类型是大多数代理商都支持的,而另外一些则比较听起来比较另类,基本类型包括:
- 市价单(Market order)
是以当前价格买入或卖出特定货币对的交易单。比如EUR/USD目前价格为1.2140,而你就想在此价格购买,你可以在你的交易平台上直接选择市价单购买,这样就会立刻在当前价格购买成功。如果你曾经在Amazon.com上购物,市价单就类似于他们的“一键购买”(1-click ordering),你认可现在的价格,下了单,它就是你的了!唯一的区别就是前者是买入或卖出货币对而后者是买入小甜甜的CD。 - 限价单(Limit order)
限价单是在指定价格成交的交易单。比如,EUR/USD目前价格为1.2050,你想在价格达到1.2070后做多。这时你可以傻坐在电脑前一直等到价格达到1.2070,然后下一个市价单;或者你可以下一个1.2070买入的限价单,然后离开电脑去上你的舞蹈课 - 如果价格真的上升到1.2070,你的交易平台会自动下达买入指令在这个价格买入。你需要设定交易单的货币对/买卖方向/具体价格,同时还可能需要设定一个限价单有效的时限。 - 止损单(Stop-loss order)
止损单是一种当汇率不利于你时能够帮助你避免更多损失的特殊的限价单。止损单直到你进行平仓或是取消了止损单之前都是一直有效的。例如你已经在1.2230价格买入EUR/USD,为了控制你的损失不至于太大,你设置了一个位于1.2200的止损。这意味着,如果当初你的判断真的错了,EUR/USD没有上涨反而下降到1.2200,交易平台会自动平仓,执行在1.2200的卖出操作。如果你不想整天坐在你的显示器前为赔了老本担惊受怕,止损单是非常有用的。
另类的交易单类型
- GTC(Good ‘til canceled)
一个GTC单会一直处于有效状态直到你取消它。代理商不会在任何时候取消它,这样你就有责任记住你曾经下过哪些GTC单 - GFD(Good for the day)
一个GFD单会一直有效直到当天交易结束。因为外汇市场是一个24小时开放的市场,所以通常情况下有效日的截止时间是5pm EST(北京时间凌晨5点)也就是美国市场关闭时间,不过你最好向你的代理商确认一下。 - OCO(Order cancels other)
一个OCO单是两个限量单或止损单的混合,这两个单分别位于当前价格的上下两侧。当其中一个单被自动执行后,另外的一个就自动取消。例如EUR/USD的价格是1.2040,你打算或者在1.2095突破阻力位时买入或者在价格低于1.1985时卖空。如果价格真的到达了1.2095,那么你的买入单会自动触发,而卖空单就自动取消了。
特别要检查一下你的代理商在超过一天未平仓时是否会收取隔夜利息,保持下单规则简单是最好的策略。
一般的交易者应该只会用到基本交易单类型,除非你是个大牛,否则不要幻想设计同时下大量交易单的自动交易系统(system of trading),先学会搞定基本的东西。
确认你完全理解并且可以熟练使用代理商的交易系统后再开始执行交易。再强调一次,一定要在你彻底完全掌握了交易系统后再进行真正的交易。
School of Pipsology 是 BabyPips.com的免费在线新手外汇交易教程,在叽歪上的好友尝鲜一族的推荐下,我也尝尝鲜,趁着比较闲也让自己懂一点儿外汇的东西。整套教程是英文的,当初和尝鲜一族沟通的时候他就感叹从来找不到这样浅显易懂的中文教材。所以打算趁着这个学习的机会可以把这个教程翻译一下,也可以加深自己的学习效果。
School of Pipsology中文版使用学生从托儿所到大学的比喻把课程进行划分,下面就是详细的课程表(偶然间在网上找到了前人已经翻译的一部分,所以前面一部分就直接链到外部网站了),让我想起了哈利波特在霍格沃兹魔法学校的7年教程:
Flickr Post:
其实只是景点的介绍牌子,并非古物,但是看着陌生的文字顿生好感就拍下来了
老妈生日,陪她去拜佛,可惜我不信佛...人是不是应该有点儿精神寄托?我的精神寄托是什么呢?
sprucing up with animations and effects
jQuery框架提供的动画和效果只包含最基本的显示/隐藏,淡入/淡出和滑入/滑出,其他更高级的特效都通过设计好的接口分配给Plugin去做了。
以隐藏元素举例: hide(speed,callback)如果两个参数都不传,就是最简单的隐藏元素。speed接受毫秒为单位的整数或字符串,是指整个动画所需的时间,也可以传递“slow””fast””normal”。callback是指动画执行完毕后进行的回调。其他jQuery的动画方法大都类似。通过调用stop()方法停止某元素上的正在进行的动画,不过已经完成一半的动画效果会继续保留,不会回滚到动画初始状态。
如果这些简单的动画不能满足你的页面的UE设计,可以去找jQuery的特效插件,或者利用jQuery的动画接口自己实现:
animate(properties,duration,easing,callback)
所有数字化的css属性变化动画都可以用这个接口来实现,类似大小/透明度/颜色等,不是数字类型的属性理论上也没有“动画”的可能。因为大多数人应该不会去亲自去做特效Plugin,所以贴一段代码演示一下就不说明了:
$('.animateMe').each(function(){
$(this)
.css('position','relative')
.animate(
{
opacity: 0,
top: $(window).height() - $(this).height() -
$(this).position().top
},
'slow',
'swing',
function(){ $(this).hide(); });
});
上面的代码实现的就是为了强调某些删除动作时常用的渐变丢弃效果。
链接: 《jQuery in Action》 in action系列