GoogleAppEngine中如何使用EL表达式?

GoogleAppEngine中如何使用EL表达式?

方法是必须在页面里强制指定:

<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″  isELIgnored=”false”%>

我也尝试在web.xml中配置了el-ignore:false,但是这样做不行。

 This doesn't work for GAE
 <jsp-config>
  <jsp-property-group>
   <url-pattern>/*</url-pattern>
   <el-ignored>false</el-ignored>
  </jsp-property-group>
 </jsp-config>

 

除此之外,还要在WEB-INF/lib中加入JSTL,EL的jar文件。

update:自己加入JSTL和EL的jar文件可能会导致这个问题 java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;

但是如果不加入,使用eclipse编辑jsp的时候不能对JSTL进行代码辅助提示,权衡一下把jar加入classpath后运行app时还需要去掉,否则会有兼容性问题。

有用的参考资料:JavaEE的相关技术在Google App Engine中的兼容情况

Rate limit exceeded. Clients may not make more than 150 requests per hour

本文描述”Rate limit exceeded. Clients may not make more than 150 requests per hour” 的解决办法

昨天做空姐的twitter自动翻译+Retweet程序的时候遇到的问题(使用GAE+twitter4j+google translate API)

调用twitter4j API去查询空姐最新状态的时候,一直报这个错 “Rate limit exceeded. Clients may not make more than 150 requests per hour”,月光博客也遇到过这个问题,认为这个是GAE IP不是白名单的问题,难道没有解决办法了?

有很多基于GAE的twitter应用,如果大家都这样那岂不是要疯掉了。。。所以我想肯定不关白名单啥事情,一定有别的解决办法。

后来我在google code里查到一条类似的issue ,幸运的是已经fix了

所以这个问题解决办法就是:修改searchURL为 http://api.twitter.com/1/search.json (实效性不能保证,至少目前这个方法works)

如果遇到问题的各位童鞋也用的是twitter4j,大家会发现twitter4j jar已经封装好了,默认的searchBaseURL是http://search.twitter.com/search.json,我看了一下twitter4j的源码,对于[基于GAE的]web项目,我们可以在WEB-INF/下面新建一个twitter4j.properties,然后增加这一行searchBaseURL=http://api.twitter.com/1/

学车日志(4)

小路抽到限宽门,上车的时候倒是蛮自信的

第一次侧方停车,语音提示说考试结束,我晕,看提示屏幕说后车身出线

开过去再来一次,又停了一次侧方,这次没语音提示了,然后一路开到底没啥问题,结果没有提示通过,原来这一次侧方没成绩

又开过去补一次侧方停车,停的感觉蛮好的,拉手刹准备开出去的时候,又TMD的叫了,考试结束

 

郁闷,严重怀疑考试系统有问题,自己感觉的确停的很好啊

心情很不爽,开出去了,后来想想真后悔自己没有下车看看到底有没有后车身出线

唉,鄙视自己挂在侧方停车上了,太鄙视自己了

你应该使用的20个有用的jQuery方法

原文地址:20 Helpful jQuery Methods you Should be Using
原文作者:Andrew Burgess

这篇文章介绍了jQuery中有用的20个方法,1-20编号如下,本文没有对照原文逐句翻译,这个20个方法名称,我其实就是用下面第14个map()的方式取出来的,亮点如下,firebug真是个离不开的好工具。

说到工具,那就顺便再提一下一个简洁的jQuery代码调试工具:jQueryPad

支持代码高亮,不支持代码辅助,小问题是这个工具带的jQuery.js的版本旧了,需要自己更新一份到它的目录。

(当然,我还是最喜欢firebug,特别是网页复杂的时候)

1 after() / before()

这个无需多说了,上面的图就是个例子,就是在当前对象的前面或者后面插入内容,被插入的内容是当然对象的兄弟节点

2 change()

和click()或者hover()一样,它也是个事件处理器,这个change事件作用于 textarea, text input, select, 当目标元素的值改变的时候触发该事件。它不同于对象失去焦点时触发的事件foucusOut()和blur()。

change()事件对于客户端验证的任务最适合不过了,因为你不需要在输入字段值没有变化的时候重新验证字段。

$(document).ready(
    function() {
$('input[type=text]').change(function () {
    switch (this.id) {
/* some validation code here */
case "name":
alert(this.value+"....");
break;
default:
alert(this.id);
break;
    }
});
    });

// HTML Form
Name: <input id="name" type="text"/>

3 Context

在jQuery中,使用选择器,其实默认作用于document这个上下文上

了解了这一点话,Context就简单了,它是一个属性兼参数

作为属性:每个jQuery对象,都有个context属性

作为参数:当使用jQuery选择器时,可以使用第二个参数context,细化了查询的范围

用Firebug试验一下就明白了!

4 data() / removeData()

在元素上(确切的说应该是jQuery对象)上存储数据的一种办法

5 queue() / dequeue()

用在jQuery动画效果上,可以方便的增加或者移除一个特效

6 delay()

暂停一段时间的动画效果

7 bind(), unbind(),live(), and die()

以前的文章说过了,不废话了

8 eq()

用数组下标的方式取得一组元素中的某一个

9 get()

取得jQuery元素对应的Dom对象格式

10 grep()

这个我挺喜欢,第二个参数是个用于过滤的回调函数,很容易懂的

 var nums = '1,2,3,4,5,6,7,8,9,10'.split(',');

 nums = $.grep(nums, function(num, index) {
   // num = the current value for the item in the array
   // index = the index of the item in the array
   return num > 5; // returns a boolean
 });

 console.log(nums) // 6,7,8,9,10

11 Pseudo-Selectors

$(':animated'); // returns all elements currently animating
$(':contains(me)'); // returns all elements with the text 'me'
$(':empty'); // returns all elements with no child nodes or text
$(':parent'); // returns all elements with child nodes or text
$('li:even'); // returns all even-index elements (in this case, <li>s)
$('li:odd'); // can you guess?
$(':header'); // returns all h1 - h6s.
$('li:gt(4)'); // returns all elements with an (zero-based) index greater than the given number
$('li:lt(4)'); // returns all element with an index less than the given number
$(':only-child'); // returns all . . . well, it should be obvious

12 isArray() / isEmptyObject() / isFunction() / isPlainObject()

 $.isArray([1, 2, 3]); // returns true
 $.isEmptyObject({}); // returns true
 $.isFunction(function () { /****/ }); // returns true

 function Person(name) {
     this.name = name
     return this;
 }
 $.isPlainObject({})); // returns true
 $.isPlainObject(new Object()); // returns true
 $.isPlainObject(new Person()); // returns false

13 makeArray()

使用jQuery选择器返回的都是jQuery对象,所以$.makeArray()变得挺实用的

    var ps = $('p');
    $.isArray(ps); //returns false;
    ps = $.makeArray(ps);
    $.isArray(ps); // returns true;

14 map()

上面firebug的贴图中延伸过了,自己试试看吧

15 parseJSON()

把JSON格式的字符串结果解析成JSON对象

16 proxy()

$.proxy() 解决了函数调用的上下文问题

 var person = {
   name : "Andrew",
   meet : function () {
     alert('Hi! My name is ' + this.name);
   }
 };
 person.meet();   // 正常工作
 $('#test').click(person.meet); // 返回 Hi! My name is undefined 或者 Hi! My name is 空

$('#test').click($.proxy(person.meet, person));
// we could also do $.proxy(person, "meet")

17 replaceAll() / replaceWith()

用来替换内容的,replaceWith更顺脑

<div class="error1">error section 1</div>
<br/>
<div class="error2">error section 2</div>
<br/>
$('<span class=fixed>The error has been corrected</span>').replaceAll('.error1');
"$('.error2').replaceWith('<span class=fixed>The error has been corrected</span>');

18 serialize() / serializeArray()

看例子吧,易懂

 <form>
     <input type="text" name="name" value="John Doe" />
     <input type="text" name="url" value="http://www.example.com" />
 </form>
console.log($('form').serialize());​​​ // logs : name=John+Doe&url=http%3A%2F%2Fwww.example.com
console.log($('form').serializeArray());
// logs : [{ name : 'name', value : 'John Doe'} , { name : 'url', value : 'http://www.example.com' } ]

19 siblings()

返回所有兄弟节点

20 wrap() / wrapAll() / wrapInner()

在作用对象的外面,周围,或者里面,包一层东西

Conclusion

好好玩这些个方法吧!

美剧更新自动提醒服务

美剧自动提醒服务: http://jhnotifier.appspot.com/

源码host在: http://code.google.com/p/jhnotifier/

设想是做成一个通用的通知系统框,基于这个框架可以开发出很多爬网页发通知(邮件,短信)的应用

当前这个服务可以配置关心的Easytv上的美剧更新,但是仅支持向我自己的邮箱发邮件提醒

计划增加的功能:

1. 短信提醒

2. 支持任意用户,对关心的Easytv美剧提交自己的信息,收到更新通知

3. 增加其他的爬网页,发通知服务(例如美剧论坛BT种子更新,天气预报,或者是定制程度更高的应用)

欢迎有兴趣的加入这个项目,重构代码,加入更多的提醒服务!

系统主要结构也比较简单:

所有的爬网页任务实现ObservableTask接口,在doTask方法里实现逻辑,notify Observer

程序预先实现好的Observer有:Email通知,SMS通知(暂时只是框架代码)

public abstract class ObservableTask extends Observable{
public abstract void doTask() throws Exception;
}

public class EmailNotifier extends Notifiable implements Observer {
private static final Logger log = Logger.getLogger(EmailNotifier.class.getName());
public void update(Observable o, Object arg) {
for (User user : this.getNotifierList()) {
AppEngineEmailSender.send(user.email, ((Entity)arg).emailSubject(), ((Entity)arg).emailBodyText());
}
}
} 

做Easytv这个提醒服务的时候,开始是基于CLI的,后来玩了一下Google App Engine,目前对它的logging还不是100%清楚,不知道它怎么映射日志级别的,然后还有点数据存储服务的代码,一对多玩起来了,但是不全明白,貌似和EJB3还是有点不一样,有空了再玩吧!

学车日志(3)

Mark一下倒桩考试通过了,今早5点多就起床了,闹钟完全没听到!惨!!N年没起这么早了!!!

自我感觉在练习场倒的已经挺好的了,无奈上周五模拟的时候两次都挂在第二倒的时候,教练之前教的都是看到某个点,打死方向,我也是照着这么干的,反正模拟的时候就是没倒进去,今早考试前又模拟了一把,教练稍微调整了一下打方向的时机,考试的时候照做结果就过了,所以考试前模拟一下还是很有必要的,考试场地和练习场地不一样,车也有些差异,要做适当的调整适应。

还有就是深刻体会到打死方向,只是个应付考试的办法,不实用。

达人同学比较惨,平时倒车比我稳,模拟考两次都通过了,今天因为运气不佳加之身体不适,倒桩挂了,同情一下!

复活节多放假一天,第一次认真读了复活节的由来,总算明白,不是为了庆祝耶稣复活,是为了感谢耶稣替大家赎罪成功啊。

阴差阳错

话说上周日,天气不错,出去和老婆逛街,吃过午饭之后想起在读大学的表弟,就发了个短信过去问问他在忙啥,想找他一起吃晚饭的,于是有了下面的对话内容,结论是晚饭我去他学校找他吃饭。

逛街到5点时候,准备去他学校找他吃饭,算了一下,地铁要近一个小时,就发短信告诉他稍微晚点,让他别着急。

在5:50的时候,我从黄陂南路走到他学校,到了他宿舍门口,(注意:亮点在此时发生)然后就打电话给他,

用方言跟他讲的,这哥们接电话的时候,好像听不懂我说的是什么,又好像信号不好,说了很多喂喂,没办法,挂了电话,心存疑惑,以为他同学帮他接的手机,然后我就给他发了条短信

就是上面5:54分那条,他也回了,问我在前面还是后门,么办法,电话又打过去了,这哥们一直用普通话跟我说,你在前面还是后门,我说,我就在他宿舍门口,太崩溃了,以为撞邪了,只能挂了电话

然后我就直接去问宿管大叔,找到他宿舍,从他同学那确认了一下手机号,原来我弟弟的手机尾号是8756,终于我从篮球场上找到了我弟弟。

这时候,8765那哥们又打电话过来,说他在学校前门,我狂汗,问他哪个学校的啊,他说是交大的。。。

唉,交大也有这么短路的哥们啊。。。不知道把我当成谁了。。。

后来想想,电话号码差了一位,说明放号的时间差不多,所以8765也是个大学生是可以理解的。。。

阴差阳错还好最后目的达成,在百盛上面的渝乡人家吃了一顿,味道不错,牛蛙好辣,缺点就是酒水饮料太贵了。。。