Akawa

ETY001的博客

今天上午终于把持续了将近2个月的比赛作品弄完了(这也意味着我的解禁,后文解释),其实也不能算是弄完,因为提交的作品连个半成品都算不上。虽然心里很不甘,但是水平有限,时间不足,只能是尽自己的最大的努力去完成能完成的部分了。

不过话说回来,通过参加这次腾讯的这个Html5应用设计比赛,我还是学到了不少的关于Html5的知识。

首先就是来说一下一个很方便的开发库(也可以称其为工具),那就是jQuery Mobile(http://jquerymobile.com/)。这是一个非常好用的东西,只需要简单的几句代码就可以轻松的把view(MVC中的 V)做出来,并且jQuery Mobile库实现的界面是仿苹果app的,看上去及其的舒服。这样对于一个开发者来说,如果写Html5应用程序的话,剩下的主要任务就是写代码,来实现剩下的M和C了(这其中主要是来写JS代码)。

其次,就是发现了Html5的确正在流行,因为国外的进度明显的走在了内地之前的。我是4月底知道有这个比赛的,然后就开始在搜集相关的Html5的示例资料等等。我发现,国内很少有原创的资料,这就更不用说入门级的中文教程了,想了解更多的html5知识,只能是去国外的网站搜集资料。我用了几乎5月份一个月的时间去搞明白什么是html5,腾讯举办这次比赛的目的是什么。虽然用的时间很长,感觉有点浪费,但是最终还是有所收获的。作为正在兴起的一门技术,html5无疑是具有极强的吸引力的,这主要表现在html5应用的强大性上。就现在我对于html5应用的理解来说,html5代码实现了html5应用的view框架,而js等代码实现的则是M(Model)和C(Controller)。正因为html5应用几乎只需要使用html5代码和js即可实现很强大的功能,所以浏览器厂商尤其是手机浏览器,现在都想在这个领域投入力量,先占有市场,而我分析占有市场的方式就是能拥有相当数量的优质html5应用,然后形成一个App store(应用商店),最后通过这个进行盈利。另外期间还发现了很多优秀的应用,举个例子:http://taskbox.cn/

不过,这些东西终究离我还很遥远,当下里最重要的就是这次比赛暴露出来的问题,很多基础性的技术还没有掌握,比如说JS(这也包括jQuery),再比如说PHP框架。总之,在接下来的一年里,除了考研复习外,必须要自学一些必要的东西,并且能真正写出点什么有价值的程序(其实我一直对于我之前写的那个自习室查询平台因为学校的缘故,不能正常投入使用而耿耿于怀)。所以说接下来的半年依旧是艰巨的!

比赛的事情基本上就说这么多了,再就是说一说刚开头为什么说解禁。当我准备要参加这个比赛的时候,我的原计划是,4月下旬和5月的上旬进行资料收集,6月上旬结束前把作品提交,这期间作品交不上就不能写日志。由于比赛的难度远超出我的预料,所以一直拖到现在。其实中间有几次差点忍不住要写的,但是由于我自己平时总好犯制定了计划而不能自始至终的贯彻的毛病,所以这次我告诫自己一定要克制住,所以一直憋着不写,最后有点演化成自己与自己怄气的感觉,不过好歹是这次我实现了克己。

从开始停止写日志到今天恢复写日志,期间发生了太多的事情,有杯具有洗具,反正满茶几的都是东西,思考了很多事情和问题,不过可惜的是现在都已经忘记了到底发生过什么了,毕竟事情已经过去了,冲动也随之过去了。不过虽然现在想不起来,但是这些思考过的东西都已经记录在大脑的某个区域了,我想等我需要的时候,他们一定会再次出现的。

其实这段时间,最值得记录的事情就是我认识了我现在的女友。其实这很感谢这次腾讯的比赛阿,要不是这个比赛,我也不会在半夜里不睡觉而看英文技术文章,这也不会在121部落上结识到她~我也就不多说什么了,各位有空就来我们倆的人人网情侣空间帮忙给树浇浇水,我就已经感激不尽了~

另外,笨兔兔的王兄,我会抽时间写一下针对于wordpress的ntalker的,这个事情我还木有忘记。

今天就写这么多吧,没想到写着写着就跨天了,已经不是10号了……

这篇日志算是写给我自己看的吧,毕竟我自己的这个个人博客很长时间没有维护,现在已经算是荒草丛生了。最近一段时间各种事情各种忙碌啊,还认识了一个值得自己去爱的女孩,再加上自己有点时间就想休息了,一偷懒就更木有时间来打点博客了。之前曾经说到的关于我的这个博客域名的转移时出现的问题,我现在还暂时没有时间写,估计会放到暑假里写吧。现在域名已经转移成功了,我一定会好好的构思一下,写一写这次的经历,尤其是要写一写我的前域名服务商——卓汇互联(joz.cn)【终于可以写名字了,之前就怕没有转移完的时候,遭到报复】。
马上就要期末考试了,又要开始各种纠结和复习了。俗话说“一天不学习,赶不上刘少奇”啊……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312" />
title>HTML5 WebDatabase</title>
<script>
var db=""
window.onload=function(){
if(window.openDatabase){
//打开数据库,不存在数据库则会自动创建
db = window.openDatabase("test", "1.0", "HTML5 Database API example", 200000);
//创建表
db.transaction(
function(tx){
tx.executeSql(
"create table oo(id REAL UNIQUE, text TEXT)",
[],
function(tx){alert("创建表成功");},
function(tx, error){alert("创建表失败,错误信息:"+error.message );}
);
}
);
}
else{
alert("不支持WebDatabase");
}

}

//删除数据库表
function drop(){
db.transaction(
function(tx){
tx.executeSql(
"drop table oo",
[],
function(tx){alert('删除数据库表成功');},
function(tx,error){alert("删除数据库表失败,错误信息:"+error.message);}
);
}
);

//释放资源
db = null;
}

function add(){
var num = Math.round(Math.random() * 10000); // random data
var value = document.getElementById("text").value;
db.transaction(
function(tx){
tx.executeSql(
"insert into oo(id,text) values(?,?)",
[num,value],
function(tx){alert("添加成功");},
function(tx, error){alert("添加数据失败,错误信息:"+error.message);}
);
}
);
}

function show(){
db.transaction(
function(tx){
tx.executeSql(
"select * from oo",
[],
function(tx, result){
for(var i = 0; i < result.rows.length; i++){
var item = result.rows.item(i);
alert(item['id']+":"+item['text']);
}
},
function(tx,error){alert("查询数据失败,错误信息:"+error.message);}
);
}
);

}
</script>
</head>

<body>
<input type="text" id="text"/><br/>
<input type="button" value="增加" onclick="add()"/><br/>
<input type="button" value="查询" onclick="show()"/><br/>
<input type="button" value="删除表" onclick="drop()"/><br/>
</body>

</html>

1、背景
Javascript中的回调函数,相信大家都不陌生,最明显的例子是做Ajax请求时,提供的回调函数,
实际上DOM节点的事件处理方法(onclick,ondblclick等)也是回调函数。

在使用DWR的时候,回调函数可以作为第一个或者最后一个参数出现,如:

function callBack(result){
}
myDwrService.doSomething(param1,param2,callBack);//DWR的推荐方式
//或者
myDwrService.doSomething(callBack,param1,param2);

2、问题描述
最近在使用Dojo+Dwr的时候,碰到一个问题:
如果回调函数是属于某个对象(记为obj1)的方法,等到DWR执行该回调函数的时候,
上下文却不是obj1。
表现的现象就是在回调函数中访问obj1的任何属性都是undefined。

版本:Dojo1.3.1和dwr2

3、模拟问题的代码
下面的测试代码可以模拟这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<head>
<script>
var context="全局";
var testObj={
context:"初始",
callback:function (str){//回调函数
alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);
}
};//创建一个对象,作为测试回调函数的上下文
testObj.context="已设置";

function testCall(){
callMethod(testObj.callback);
callObjMethod(testObj,testObj.callback);
}
function callObjMethod(obj,method){
method.call(obj,"指定显式对象上下文回调");
}
function callMethod(method){
method("通过默认上下文回调");
}
</script>
</head>
<body>
<a href="javascript:void(0)" onclick="testCall()">调用测试</a>
</body>
</html>

在testCall方法中,我用了两种方式回调“testObj.callback”方法:
第一种方式:method(“通过默认上下文回调”);
没有指定上下文,我们发现回调函数内部访问context的值是全局变量的值,
这说明,执行该方法的默认上下文是全局上下文。

第二种方式:method.call(obj,”指定显式对象上下文回调”);
指定obj为method执行的上下文,就能够访问到对象内部的context。

4、研究DWR
因为06年使用DOJO+DWR(1.0)的时候,已经遇到过这个问题,当时没做太多功课,直接改了dwr的源代码。

现在用dwr2,于是想先看看DWR是不是对这个问题有新的处理方式,
将dwr.jar中的engine.js拿出来,查看了有关回调的相关代码(_remoteHandleCallback_execute),
发现对回调的处理方式似乎比1.0更简单,没办法将对象和方法一起传过去。

5、做进一步的研究
因为这次DWR在项目中的使用太广泛,而且我相信这样的需求应该是可以满足的,于是没有立刻修改源码,

首先,在Google上搜Dojo+dwr,没有查到什么结论,可能Dojo的用户不是太多。

于是又搜”javascript callback object context“,得到一篇文章专门介绍java回调函数的文章:
http://bitstructures.com/2007/11/javascript-method-callbacks
最重要的一句话:

When a function is called as a method on an object (obj.alertVal()),
"this" is bound to the object that it is called on (obj).
And when a function is called without an object (func()),
"this" is bound to the JavaScript global object (window in web browsers.)

这篇文章也提供了解决方案,就是使用Closure和匿名方法,
javascript中,在function内部创建一个function的时候,会自动创建一个closure,
而这个closure就能记住对应的function创建时的上下文。

所以,如果这样:

1
2
3
var closureFunc=function(){
testObj.callback();
}

那么无论在什么地方,直接调用closureFunc()和调用testObj.callback()是等价的。

详情参见上面提到的文章:http://bitstructures.com/2007/11/javascript-method-callbacks。

6、改进模拟代码
在模拟代码中,我们再增加一种回调方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<html>
<head>
<script>
var context="全局";
var testObj={
context:"初始",
callback:function (str){//回调函数
alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);
}
};//创建一个对象,作为测试回调函数的上下文
testObj.context="已设置";

function testCall(){
callMethod(testObj.callback);
callWithClosure(function(param){testObj.callback(param);});
callObjMethod(testObj,testObj.callback);
}
function callObjMethod(obj,method){
method.call(obj,"指定显式对象上下文回调");
}
function callMethod(method){
method("通过默认上下文回调");
}
function callWithClosure(method){
method("通过Closure保持上下文回调");
}
</script>
</head>
<body>
<a href="javascript:void(0)" onclick="testCall()">调用测试</a>
</body>
</html>

测试以上代码,我们可以发现,通过Closure和通过显示指定对象得到的效果一致。

由于我在办理域名转移时遇到了很垃圾的服务商,导致了我的域名转移过程中域名停止解析长达将近两周。现在网站的域名转移已经进入最后的接入商手续办理阶段,等全部结束此次域名转移后,我将详细向大家讲述一下这次的经历,到时候希望大家看后以后能够注意一下。

另外各位使用@domyself.me的各个朋友真是很抱歉,由于我个人之前没有备份过DNS配置信息,另加腾讯的域名邮箱功能的不完善,不得不迫使我把当前的域名邮箱注销掉,然后在24小时之后重新开通。对于近两周@domyself.me域名邮箱的不能使用给大家抱个歉,希望没有耽误大家什么重要的事情!

今天闲着的时候手绘的一些表情,现在拿出来跟大家分享一下,希望各位伸手党手下留情能留着我的水印哈,谢谢啦!

今天花钱买了个教训。之前一直都是无视各种地摊的U盘,知道便宜无好货。最近在一次机房上机后,把我原来的4GB的联想原装U盘给弄丢了,没办法只能去新买一块了。由于知道地摊货不好,即使是门面店也不会有好货,但是因为急用,于是就从学校边上的爱书人店里买了一块SONY 4GB的U盘。

当时买的时候,女老板一直在说这里进货都是正品,各种理由来阐明自己进的货是正品,我也没多少工夫和她磨这个嘴皮子,速战速决就回宿舍了。

回宿舍后就发现了问题。由于我的电脑是使用的win7+ylmf os 3.0的双系统,平时都是在ylmf os下工作,所以回宿舍测试U盘的时候,就是在ylmf下进行的,结果ubuntu不识别……杯具了,换到win7下面,从百度上搜了一个检测软件Chip Genius(芯片精灵),检测了一下,显示内容如下:

我的天,晕掉了,这个山寨u盘,我又从网上搜到了一条信息,sony人家只有记忆棒,从来没有出过u盘……

于是继续百度,看看能不能解决ubuntu不识别的问题。结果很好,有人也和我一样,并且已经搞定了。思路基本上和我想的是一样的,不过他成功了,那就不需要我再探索了,只要按照他说的做做看就OK了。方法在这里:http://wenku.baidu.com/view/178d7913a2161479171128b1.html

杯具的是通过量产工具低格后,4G变1G了…… 鸭梨

还是希望各位以后买U盘的时候能够去专卖店,比如说去联想专卖店买联想的U盘,还有就是真品U盘都有防伪码的,注意包装质量。

今天网站再一次搬家啦,并不是因为之前的服务器不好用,而是因为想上手个VPS玩玩,所以正好前一个8元/月的服务器空间马上到期,现在入手了一个便宜的VPS。

经过2个多小时的配置,服务器已经可以使用了,并且我还邪恶的下载了挂QQ软件,一口气挂了4个QQ在那上面。

现在的服务器的软件配置如下:

win2003+xampp+一个小ftp服务器软件
接下来,就要好好学习一下怎样配置和维护服务器了

整体来看52元/月的VPS速度对于我这样的一个小站完全可以接受,现在就是看看稳定性如何了。

如果大家感兴趣的话,可以来这里看看,http://vps.03host.com/page.aspx?c=referral&u;=12202

这几天一直憋着没写日记是有原因的,因为一直在开发ntalker插件(测试地址:999981.tk)。下面就说说开发的事情。

总体来说,对于此次的开发我不是很满意的,一共就需要写两个文件,加起来的代码量不足1000行,只是实现了最基本的聊天功能,并且其中70%是来自于ntalker提供的demo程序和ntalker提供的ucenterhome的插件,效率以及抗压能力太差了。主要是效率太低了,几乎每天都在马不停蹄的思考,阅读,编写,但是还是用了4天。本来以为3天的时间会很轻松完成任务的,但是预估错了……就现在这个状态,上社会上怎么能有竞争力呢?!

总结以下原因:

1、对于一些基本概念的理解还是不到位。

由于刚开始学C++,所以对于PHP的面向对象编程也不是很懂,这就导致了在阅读记事狗微博的源程序时耗费了很多时间,即使是现在对于一些概念的理解还是不够深入,比如说上节课C++老师刚重点强调的变量的作用域。

2、时间利用率不高。

工作期间开着QQ基本上就是个错误,即使自己隐身但是还是有很多的消息来影响你,因为貌似现在都知道我隐身了……所以说,以后再开发东西的时候,果断QQ离线!另外,在baidu未知知识的时候,总是被一些其他的信息所吸引,这个以后要注意!还有通宵并不总是明智的选择,当你没有思路的时候,又很困,那就没必要再通宵了,好好的去睡个觉。只有在你思路很清晰或者灵感来的时候,可以考虑通一下宵,借着热乎劲把东西写出来。

3、自我调节能力差。

遇到卡壳的问题的时候,不能一直在电脑前傻坐着,应该换个空间呆一会。

4、基础的一些类似算法,SQL等东西的掌握很不牢固,这条很第一条都差不多一个意思。之所以再写一编,就是因为这次这个原因对于我的触动真的是太大了!得好好反思和继续学习啊!

由于现在程序并不是很完善,我打算再完善一下后放出来插件程序供大家下载使用,还请各位有需要的朋友随时关注本博客~

如果时间不紧的话,我还打算把ntalker做到wordpress上来,这个先这么计划着吧~

调整两天后,进入新的压力测试!

今天在网上乱转的时候,发现了一个3美刀每月的便宜VPS。一直想试试VPS,看看是个什么效果,并且也想写个机器人放到VPS上运行运行看看,这次是有机会了,等这个空间到期后,我准备买一个试试。

他的具体配置如下:

磁盘空间20GB RAID10
内存128MB
突发内存256MB
月流量300GB
1个独立IP
SolumsVM控制面板

大家可以点击:这里去看看

0%