Show toolbar

2013年10月18日 星期五

Fluent Interface with Prototype

標題:流暢介面搭配Prototype屬性的用法
JavaScript (index.html):
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
<span id="fatty"></span> V.S. <span id="thin"></span>
<script type="text/javascript">
var Runner = function(e) {
this.speed = e.speed; //Meters per second
this.time = null; //Second
this.distance = null; //Meter
};
Runner.prototype.ready = function(e) {
this.time = 0; //Cost time
this.distance = e.starting; //Starting point
return this;
};
Runner.prototype.run = function(e) {
this.time += e.second;
this.distance += this.speed * e.second; // Distance = Speed * Time
return this;
};
Runner.prototype.halt = function(e) {
this.time += e.second;
return this;
};
Runner.prototype.result = function(e) {
document.getElementById(e.id).innerHTML = "Distance:" + this.distance + " m, Cost time:" + this.time + " sec";
return this;
};
var fatty = new Runner({speed:2}); //Speed: 2m/s
fatty.ready({starting:10}).run({second:30}).halt({second:5}).run({second:15}).result({id:"fatty"});
var thin = new Runner({speed:2.5}); //Speed: 2.5m/s
thin.ready({starting:0}).run({second:40}).result({id:"thin"});
</script>

範例結果:
Distance:100 m, Cost time:50 sec V.S. Distance:100 m, Cost time:40 sec

說明:
此程式使用流暢介面搭配Prototype屬性的方式撰寫,
計算胖與瘦的人100公尺跑步的時間(不計加減速),
條件項目:
1. 胖者速度為每秒2公尺 - Runner({speed:2})
2. 瘦者速度為每秒2.5公尺 - Runner({speed:2.5})
3. 瘦者禮讓胖者由10公尺處起跑 - ready({starting:10})
4. 胖者跑了30秒以後,休息了5秒,再繼續跑了15秒 - run({second:30}).halt({second:5}).run({second:15})
5. 瘦者跑了40秒全程無休息 - run({second:40})

2013年10月17日 星期四

Positive and Countdown Timer

標題:正倒數計時器
JavaScript (index.html):
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
<span id="loveboxy"></span>
<script type="text/javascript">
var TimerBoxy = function(e) {
this.id = e.id;
this.target = new Date(e.target);
};
TimerBoxy.prototype.show = function() {
var s = Math.abs(parseInt( (new Date().getTime() - this.target.getTime() )/1000,10));
var m = s/60;
var h = m/60;
var D = h/24;
document.getElementById(this.id).innerHTML =
parseInt(D,10) + "日" + parseInt(h%24,10) + "時" + parseInt(m%60,10) + "分" + parseInt(s%60,10) + "秒";
};
TimerBoxy.prototype.start = function() {
if(!this.timer) {
var that = this;
this.show();
this.timer = window.setInterval(function() {
that.show();
}, 1000);
}
};
TimerBoxy.prototype.stop = function() {
if(this.timer) {
window.clearInterval(this.timer);
this.timer = null;
}
};
loveboxy = new TimerBoxy({
id : "loveboxy",
target : "2011/11/11 11:11:11"
});
loveboxy.start();
</script>
使用範例:
4890日10時7分54秒

說明:
當目標時間小於當日時間則為正數計時,反之則為倒數計時。
(感謝TonyQ幫忙修正。)

2013年10月8日 星期二

Send Mail with Google Form

標題:Google表單指令碼寄信
Google App Script (sendmail.gs):
1
2
3
4
5
6
7
8
function sendmail(e) {
var currentItemResponses = e.response.getItemResponses();
var name = currentItemResponses[0].getResponse(); //姓名
var sex = currentItemResponses[1].getResponse(); //性別
var mail = currentItemResponses[2].getResponse(); //E-MAIL
var sexword = (sex=="男")?"先生":"小姐";
MailApp.sendEmail(mail, "報名成功", name + " " + sexword + "您好,\n" + "恭喜您報名成功。");
}

說明:
用於在表單新增寄信的指令碼。

2013年10月3日 星期四

Folder Access Restrictions in Node.JS

標題:Express資料夾權限控制
Node.JS (main.js):
var express = require('./node_modules/express');
var app = express();
var port = 1337;
var server = app.listen(port);
app.use(express.bodyParser());
app.use(express.cookieParser('_(:3_<)_...QQBoxy'));
app.use(express.session({secret : '_(:3_<)_...QQBoxy'}));
var session = {
maxAge : 10*1000, //Session存活時間長度(10秒)
login : function(req, res) {
var date = Date.now();
req.session.lastlogin = date;
req.session.cookie.expires = new Date(date + session.maxAge);
req.session.cookie.maxAge = session.maxAge;
},
logout : function(req, res) {
if(req.session.lastlogin) {
req.session.destroy();
}
},
renew : function(req, res, next) {
if(req.session.lastlogin) {
var date = Date.now();
req.session.lastlogin = date;
req.session.cookie.expires = new Date(date + session.maxAge);
req.session.cookie.maxAge = session.maxAge;
}
next();
},
check : function(req, res, next) {
if(req.session.lastlogin) {
next();
} else {
res.redirect('/login.html'); //權限不足,跳轉登入頁面
}
}
};
//延長時效
app.all('*', session.renew);
//權限檢查
app.all('/app*', session.check);
//開放目錄
app.use('/', express.static(__dirname + '/public/'));
//隱私目錄
app.use('/app/', express.static(__dirname + '/private/'));
//登入帳號
app.post('/login', function (req, res) {
if(req.body.account == 'admin' && req.body.password == 'test') {
session.login(req, res);
res.redirect('/app/'); //帳號密碼正確,跳轉私密頁面。(或 res.redirect('/app/index.html');)
} else {
res.redirect('/login.html'); //帳號密碼錯誤,跳轉登入頁面
}
});
//登出帳號
app.get('/logout', function (req, res) {
session.logout(req, res);
res.send("Logout.");
});
console.log('Start express server. port:' + port);
view raw main.js hosted with ❤ by GitHub

說明:
使用Express搭配Session的方式進行私用資料夾的權限控制。