code-prettify

2014年3月27日 星期四

SQL DATEDIFF 日期差異,同一週、上一週、上上週,指定星期幾為起啟日。

一般來說,希望找到兩個日期是不是同一週可以使用 DATEDIFF 函式,
DATEDIFF(ww, @date1, @date2)

回傳值 0 表示同一週,1 表示 date1 是 date2 上一週,2 表示是上上週,-1 則表示是下一週,-2 是下下週。

而預設是以星期日為一週的開始,想說指定 SET DATEFIRST 1 來改變星期一為起始日。
但是怎麼設定都沒有效果。

上網路查,結果 MSDN 寫著「Specifying SET DATEFIRST has no effect on DATEDIFF. DATEDIFF always uses Sunday as the first day of the week to ensure the function is deterministic.」。

所以 DATEFIRST 對於 DEATEDIFF 是無效的。

那怎麼辦呢?網友已經提供了解法,解決了這個問題。

DATEDIFF(ww, DATEADD(dd, -@@DATEFIRST, @d1), DATEADD(dd, -@@DATEFIRST, @d2))

範例:
DECLARE @d1 DATETIME
DECLARE @d2 DATETIME
SET @d1 = '2014/10/05'
SET @d2 = '2014/10/06'

SET DATEFIRST 1

SELECT DATEDIFF(ww, DATEADD(dd, -@@DATEFIRST, @d1), DATEADD(dd, -@@DATEFIRST, @d2))

參考資料:
DATEDIFF (Transact-SQL)
http://technet.microsoft.com/en-us/library/ms189794.aspx

Is it possible to set start of week for T-SQL DATEDIFF function?
http://stackoverflow.com/questions/1101892/is-it-possible-to-set-start-of-week-for-t-sql-datediff-function

problem with Datediff and datefirst
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/8cc3493a-7ae5-4759-ab2a-e7683165320b/problem-with-datediff-and-datefirst?forum=transactsql

2014年3月18日 星期二

AWSome Day 2014 Taipei

2014/03/06 AWSome Day


因為有使用過 AWS (amazon web services) 的免費試用服務 (AWS Free Usage Tier),算算也快滿一年期限了,之後就要自己付費嘍!靠著自己胡亂摸索,感覺浪費了好多時間。剛好知道 amazon 在台灣有舉辦研討會,特別請假到台北一趟,順便跟好久不見的朋友們聚聚。

一開始到會場時,跑錯了方向,到了報到處的另一邊,害我想說雖然我早報到前半小時到達,但一個人都沒有也太奇怪了。還好有人提醒,不然不知道要在那傻傻的等多久。附上一張走錯方向的另一邊入口。(螢幕上寫著:AWSome Day Taipei 2014)



報到時出示之前寄到信箱的 QRCode 或紙本列印,拿到最新的教學手冊 (AWS Essentials Student Guide) 一本!上面有標示 6 March, 2014 Taipei ,表示這本是熱騰騰的喔!

會議開始,就是 amazon 發揮主場優勢的時候了,演講者 Tom O'Reilly在 推銷 介紹 AWS 的好處及優點,像是:

一、舉某家公司為例,擁有一千萬使用者,但只有5位 IT 人員。(因為使用 AWS)
因為 AWS 提供了完整的服務 (服務介紹請參考 第二十四個夏天後 的 AWSome Day 2014 Taipei),所以只需要少數的 IT 人員管理,相對的減少了薪資的成本。

二、按需付費 (Pay only for what you use.),只需要付費所需要的資源,不需要負擔沒有使用的資源。
一般來說,我們所提供的服務都會有高低峰的使用量。如果自備機房,當硬體必需滿足高峰使用量時,勢必在低峰期間會出現閒置,而我們卻負擔著同樣的成本。使用 AWS,只有當你有使用的時候才需要付費,當不需要時,把機器關掉,帳單也被關掉了。

三、高可用性 (High Availability)
你總不希望自己所使用的服務,時常無法提供服務吧。同樣的,我們會希望所提供的服務一直是在線的。

四、快速擴充性,Amazon EC2 (Amazon Elastic Compute Cloud) 提供了 Auto Scaling 功能,可以自動擴充,滿足突然增加的使用量。
現在的資訊流通太快速了,有時候本來只是一個小站,一夕之間,受到曝光之後,反而因為大量的流量而無法提供服務。這種曝光是很突然且短暫的,如果沒有好好把握這難得的人潮,實在是很可惜的。傳統的設備擴增,可能再快也要二~三個工作天才能搞定,透過  AWS,卡刷下去就好了啦!

五、低前置費用,快速 start up
如同前面提到的,自建機房的成本不少,更重要的是前期成本很高。今天當你有個想法,想要啟動 start up 時,卻可能受限於資金不足購買設備。舉例說來,我想提供一個像 EVE Online (詳細見 EVE Wiki) 的 MMOG (Massive Multiplayer Online Game),初步估計要至少要同時容納1萬人在線上。那是不是就得購買能容納萬人在線的設備呢?還沒開始設計遊戲,卻已經在忙著找錢了!那更不用說對於一個「連使用者在哪都不知道」的服務了,你說怎麼可能不知道使用者在哪?事實上,這種情況反而在 start up 很常見,start up,是新興的一個名詞,以往都是說創業,現在是先行者的概念。我有了一個點子,試著把他實現,這個服務可能沒人要用,也可能正好滿足某些人的需要。不確定性正是 start up 的特性,而 AWS 的彈性正滿足了 start up 的特性。

小結:說了這麼多,其實重點只有一句話:「專注在本業上」,其它的都都交給 AWS 吧

之後的會議是由 Denny Daniel 依序為大家說明 AWS 提供的幾個服務,主要幾個有
資料儲存 Amazon Simple Storage Service (Amazon S3)
運算服務及網路 Amazon Elastic Compute Cloud (Amazon EC2)
資料庫 Amazon Relational Database Service (Amazon RDS)
(註:一個人講了六個小時,真不簡單啊)

整場會議下來,除了中午有免費提供午餐外,休息時間還有提供咖啡、紅茶、小點心,只能說真的賺到了。



中途休息時,有個跑大地遊戲 (收集各個贊助夥伴的蓋章) 拿 T-Shirt 的活動,限量100位,可惜手腳太慢沒拿到。會後還有抽獎活動,可惜也沒抽到。

結論:其實這根本是一篇葉佩雯,辦研討場一場下來很燒錢喔

2014/03/26 Updated:

今天收到一封主題「Here are your USD50 AWS Credits and Resources: AWSome Day 2014」的信件。如果當天參加活動時有將填寫好的意見調查表繳回去的話,就會提供 50 美元的 AWS 折扣碼。可以輸入到 AWS 帳戶中,抵扣消費金額,對於快滿一年免費服務的我來說,真是一場及時雨啊,開心!

除此之外,在前幾天3/21也有一封主題「AWSome Day | Taipei - qwikLAB, Training and Certification」的信件,內容除了再次提醒大家可以去準備 AWS 的認證之外。我的重點是放在 qwikLAB,一個虛擬的 AWS 實驗室,專門用來教學的環境。跟原本的 AWS 帳號不同,是獨立帳號,要用收到這封信的 mail 註冊,在 3/31 前會收到一個課程 AWS Essentials (Version 3.1),有四個實驗內容,分別是S3, EC2, ELB, RDS。最重要的一點是,當你完成四個實驗後,就會收到 75 美元的 AWS 折扣碼,AWSome!

參考資料
AWS (amazon web services)
http://aws.amazon.com/

AWSome Day Taipei 2003 心得筆記
http://cloudtu.blogspot.tw/2013/05/awsome-day-taipei-2003.html

AWSome Day 2014 Taipei - 第二十四個夏天後
http://blog.changyy.org/2014/03/awsome-day-2014-taipei.html

AWS Architecture Center
http://aws.amazon.com/architecture/

2014年3月13日 星期四

AngularJS SPA 實作 - ngRoute - 使用 angular-seed 為範例

SPA 就是 Single Page Application,這次試著用 AngularJS 來實作 SPA,主要使用的是 Route 功能,這次的範例來源是 angular-seed,但是只保留所需要的部份。

需要的檔案分別如下

    index.html
    css/app.css
    js/app.js
    js/controllers.js
    partials/partial1.html
    partials/partial2.html

接著我們一個一個來看

index.html

<!doctype html>
<html lang="en" ng-app="myApp">
<head>
  <meta charset="utf-8">
  <title>My AngularJS App</title>
  <link rel="stylesheet" href="css/app.css"/>
</head>
<body>
  <ul class="menu">
    <li><a href="#/view1">view1</a></li>
    <li><a href="#/view2">view2</a></li>
  </ul>

  <div ng-view></div>

  <div>Angular seed app: v<span app-version></span></div>

  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular-route.js"></script>
  <script src="js/app.js"></script>
  <script src="js/controllers.js"></script>
</body>
</html>

第 11~12 行的連結位址是 #/view1,特別注意開頭是使用 # 宣告路徑,這會讓 AngularJS 的 Rount 去解析該路徑 view1 應該如何對應,連結按下後會到 index.html#/view1。
第 15 行宣告 ng-view,這個 div 就是各個 view 將會顯示的區域。
19~22 行一樣是載入所需要的 js 檔,這邊有刪除幾個原本 angular-seed 的 js 連結,有需要使用其它功能的時候再加進去。

app.js

'use strict';

// Declare app level module which depends on filters, and services
angular.module('myApp', [
  'ngRoute',
  'myApp.controllers'
]).
config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'});
  $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'});
  $routeProvider.otherwise({redirectTo: '/view1'});
}]);

第 1 行 'use strict' 請參考 [JavaScript]use strict(嚴格模式)-strict mode 介紹 這篇文章。
第 9~11 行就是 Rount 的主要用法,/view1 就是網址上 index.html#/view1 所對應到的路徑,這裡設定將會使用 partial1.html 為 template,MyCtrl1 為 controller,view2 以此類推。
第 12 行則表示,如果上述的路徑都不符合的時候,將會導向 view1 路徑。

其它的部份,像是 controllers.js 和 partial1.html, partial2.html 就不解釋了,有需要的話可以參考之前的文章:
AngularJS - 官方範例 - 01 - The Basics
AngularJS - 官方範例 - 02 - Add Some Control

所有的 Source Code 都可以從 DEMO 網頁取得:
DEMO 網頁

參考資料
angular-seed
https://github.com/angular/angular-seed

延伸閱讀
Single Page Apps with AngularJS Routing and Templating
http://scotch.io/tutorials/javascript/single-page-apps-with-angularjs-routing-and-templating

[JavaScript]use strict(嚴格模式)-strict mode 介紹
http://www.dotblogs.com.tw/blackie1019/archive/2013/08/30/115977.aspx

Open VPN - 免費 VPN Server 教學

以前一直覺得申請 VPN 很麻煩,沒想到軟體 VPN 還蠻容易的,當然這是「前人種樹、後人乘涼」的原因,使用 Open VPN,很方便就可以建立自己的 VPN Server。


首先到 Open VPN 網站,會看到三個大大的圖示,分別是:

VPN Service
        會連到 PrivateTunnel 網站,提供 VPN 出租服務,依流量收費,提供 100 MB 流量免費。
關於 Private Tunnel 的介紹請看 如何用 Private Tunnel 翻墙 。

VPN Solution
        Access Server,提供完整的 Open VPN 商業解決方案,因為沒有用過,所以實際上有什麼功能也不太清楚。依 Client 連線數量購買授權,預設有 2 個連線數量供連接測試使用。每個流線數一年7.5美元,一次至少要購買十個連線數,這裡有更詳細的定價
     
Community
        社群版,也是 Open Source 版本,免費使用,也就是這篇主要介紹的版本。點圖示後會出現許多關於社群版 Open VPN 的介紹,如果想要 Source 的話可以用 Git Clone 一份。


先點最右邊的 Community,會看到許多 OPEN VPN 介紹,
然後在上方 Menu 選擇 Downloads => Community Downloads。


就會看到下載頁面,或直接從這裡進入下載頁


這裡介紹 Windows 環境,依照要安裝的電腦是 32/64 位元,
選擇 Windows Installer (32-bit) / Windows Installer (64-bit) 下載。

基本上安裝都是「下一步」就好了,唯一要注意的地方是,
通常第一次安裝時需要製作 CA 憑證 和 RSA 公鑰私鑰,所以記得把「OpenVPN RSA Certificate Management Scripts」打勾,同時會一併把「OpenSSL Utillites」打勾。


接著到安裝目錄,預設在 C:\Program Files\OpenVPN 下,先看到一個 config 檔,一般來說設定檔都會放在這裡。然後我們再看到 sample-config 資料夾,裡面有設定檔的範例,
進 sample-config 資料夾 Copy 一份 server.ovpn 到 config 資料夾下。
然後 Copy 一份 client.ovpn 到 Client 的 config 資料夾下。
Server 的 config 資料夾還要有 ca.crt, dh2048.pem, server.crt, server.key 這些檔案,
Client 的 config 資料夾還要有 ca.crt, client1.crt, client1.key 這些檔案。
關於這些 CA 憑證 和 RSA 公鑰私鑰製作的部份可以參考 免費的OPENVPN,建立你的專屬區網 這篇文章。

接著是打開 client.ovpn 的設定檔,修改 remote my-server-2 1194 這一行,
將「my-server」改為 VPN Server 的IP。假如你的 VPN Server IP 是 127.0.0.2 的話,
就修改為 remote 127.0.0.2 1194。

接著在 Server 上對著 server.ovpn 按下右鍵就可以啟動了,Client 也是一樣。


其它 Server 設定項:
如果 Client 是使用同一個憑證登入的話,那此設定要開啟才不會多個 Client 取得同一 IP。
建議是不同的 Client 就使用不同的憑證登入。
duplicate-cn

如果希望 Client 跟 Client 可以互相通訊的話,那要開啟此設定。
client-to-client

參考資料:
Open VPN
http://openvpn.net/

免費的OPENVPN,建立你的專屬區網
http://www.dotblogs.com.tw/remhom/archive/2012/03/13/70717.aspx

2014年3月4日 星期二

WebSocket Server - Node.js

會有這一篇是想要試一下 HTML5 WebSocket 連線,本來是準備直接使用 www.websocket.org 的 Echo Test WebSocket Server,但是這個服務好像失效了,所以只好自己動手建立一個 WebSocket Server 嘍!

這次使用 Node.js 來建立一個 WebSocket Server,我們直接使用 ws 這個 Node.js 模組,ws 是一個 node.js 的 WebSocket 實作。

首先安裝好 Node.js,接著用 npm 安裝 ws 模組,然後使用這段程式碼:

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws) {
    ws.on('message', function(message) {
        console.log('received: %s', message);
 ws.send(message);
    });    
});

上面是從官方範例小改一下的 echo server,將上面的程式碼存成 websocketserver.js 檔,然後在命令列輸入 node websocketserver.js 就可以啟動 WebSocketServer 嘍,很快速吧!

參考資料:
www.websocket.org
http://www.websocket.org/echo.html

ws: a node.js websocket implementation
http://einaros.github.io/ws/