Category Archives: Programming

向Google日历中添加农历提醒

前一段时间忙于工作,差点忘了爸妈的生日,都是晚上才想起了打个电话问候一下。所以我觉得做个自动提醒的程序非常必要。Google日历很不错,阳历生日的话,直接就可以在Google日历里面添加成每年的周期性提醒。而且Google日历的提醒可以以短信的方式发送到你的手机上面。不过农历生日就很麻烦,你要计算每年的农历对应阳历的哪一天,然后一个一个加到google日历。所以我就写了个小程序,可以批量添加农历提醒。 http://lunarreminder.appspot.com/ 现在还有个尚未解决的问题,程序可能会让你的Google日历在一段时间内处于只能添加事件,不能修改和删除事件的状态,我不知道原因。按照我的经验,尝试重新登录几次,应该就可以解决。 在我写完这个程序不久,QQ邮箱的提醒功能就可以:1.添加农历提醒;2.把提醒发送到手机。不过QQ邮箱暂时只能把提醒发送到中国移动的手机上面。所以用联通的朋友,或者在国外的朋友,用Google日历还是方便点。

动态重载JS文件

我有一个test.js文件,里面有一个test()函数。我在开发过程中要经常修改这个test函数,为了看一下程序的运行效果,我在测试运行的时候,要重新刷新一下网页,然后登录,选菜单,经过好几次点击之后触发test()函数,很麻烦。考虑到我修改的仅仅是一个JS文件,我就想能不能在触发test()函数的地方,先重载一下我修改过的JS文件,类似于在python中用reload命令重载一个模块,这样我就不用刷新整个网页了。google一番之后,找到了答案。代码如下: 先定义一个动态加载js文件的函数 reload_script,它会重载js文件,在完成载入之后触发callback函数 然后在触发test函数的地方,不再直接调用test()函数。而是先调用reload_script,然后把test()函数作为一个callback传递给reload_script function reload_script(jsfile,callback ){ var head = document.getElementsByTagName(‘head’)[0]; var script = document.createElement(‘script’); script.type=’text/javascript’; script.src =jsfile; script.onload = callback; head.appendChild(script); } function reload(){ reload_script("test.js",function(){ // test()是定义在test.js中的函数 // 每次重载test.js之后,都会执行新的test()函数 test(); }); } 以上方法在万恶的IE中不起作用,但是我也只用Firefox调试,所以无视IE了。 VIA

如何在JavaScript中定义类?

这两天比较闲,所以补习点JavaScript的基础知识。 下面是定义一个Person类的代码示例,定义了三个成员变量和三个对应的成员函数。 var Person = function(name,age,gender){ this.name=name; this.age=age; this.gender=gender; // 第一种方式 this.getName=getPersonName; // 第二种方式 this.getAge = function(){ return this.age; } } function getPersonName(){ return this.name; } // 第三种方式 Person.prototype.getGender = function(){ return this.gender; } // 用new生成新的Person对象 var p1 = new Person(‘a’,25,’male’); var p2 = new Person(‘b’,24,’female’); alert(p1.getPersonName===p2.getPersonName); // true alert(p1.getAge===p2.getAge); // false alert(p1.getGender===p2.getGender); // true [...]

在Outlook中用VBA进行邮件过滤

微软出的东西总会有一些脑残的设计。Outlook的邮件过滤规则,我倒腾了半天都没整明白。最终决定用VBA脚本来实现邮件过滤。 使用VBA处理新邮件,一般有三种方式,各有利弊: 在邮件规则中调用VBA脚本 如果一次收取大量的邮件,可能会漏处理一些邮件。 可能会出现VbaProject.otm被损坏的情况。(TMD我就遇到了) 使用ItemAdd事件 当同时进入文件夹的邮件超过16个时,ItemAdd事件将不会被触发。致命啊~~ 使用NewMailEx事件 只有使用Exchange邮箱才能触发NewMailEx事件,只有Outlook处于启动状态时才能接收NewMailEx邮件。也就是说,当Outlook关闭后收到一些新邮件,再次打开Outlook收取这些邮件时,将不会触发NewMailEx事件。也很恶心啊~~ 所以,基本上就只有第一种方法比较符合我的要求。 我的需求,简化一下就是: 从a@example.com发送过来的邮件,移动到folder1 发送给b@example.com邮件组的邮件,移动到folder2 发送给c@exmpla.com邮件组的邮件,移动到folder3 OK,启动Outlook,按ALT+F11进入VBA编辑器,在ThisOutlookSession模块下,添加如下的函数: Sub EmailFilter(item As MailItem) ‘ 声明变量,好处是编辑器知道变量类型之后可以进行自动提示。 Dim id As String Dim email As Outlook.MailItem Dim objApp As Outlook.Application Dim objNS As Outlook.NameSpace Dim inbox, folderA, folderB, folderC As Outlook.Folder ‘ 取得收件夹和下面的三个子目录 Set objApp = Application Set objNS = objApp.GetNamespace("MAPI") Set [...]

用AJAX实现进度条(2.客户端)

上次提到的用AJAX实现进度条时,服务器端必须提供一个用于查询状态的接口。接下来,在浏览器客户端要做的事情就是: 发起服务请求 调用查询状态的接口进行状态轮询 用进度条显示状态 1.发起服务请求 接着上次的例子,发起服务请求也就是向服务器发起导出Excel的请求,请求export.php并传入参数export_id,export.php执行完毕之后,会返回导出的Excel文件的地址。下面是用AJAX调用的代码: finished = false; var xmlHttp = GetXmlHttpObject(); var stateChanged = function(){ if(xmlHttp.readyState==4){ finished = true; document.location.href=xmlHttp.responseText; } } xmlHttp.onreadystatechange=stateChanged; xmlHttp.open("GET","export.php?export_id=xxx",true); xmlHttp.send(null); 2.状态轮询 上篇的例子中,status.php每次返回的是一个JSON对象,包括了三个key:current_step、total_step和msg。下面的代码中用AJAX方式轮询状态,并将状态用文本显示出来。 var xmlHttp2 = GetXmlHttpObject(); var stateChanged2 = function (){ if (xmlHttp2.readyState==4){ if(xmlHttp2.status==200){ var obj = eval(‘(‘ + xmlHttp2.responseText + ‘)’); document.getElementById("t1").innerHTML= "["+obj.current_step+"/"+obj.total_step+"]"+obj.msg; if(!finished){ setTimeout(onTimerEvent, 1000); } [...]