今年過年大樂透史無前例地加開了100組百萬獎金,但顯然彩券公司小看了大家想發財的決心,彩券公司網站在昨天晚上八點公佈百組額外獎號,"據說"還很貼心地提供了對獎程式(真的是據說,我到現在還沒看到它長什麼樣子),但河道上持續看到噗友回報,台彩網站始終出現Server Is Busy訊息,連凌晨三點都不例外。

針對這種一窩蜂的使用流量,理論上是使用雲端的大好時機,雲端架構可依臨時需求快速擴充伺服器數量,之後再動態調節回復常態,正是因應此種極端式尖峰離峰落差的有效解決方案。只是不知是流量被低估、技術沒導入,還是經費不充足,彩券網站並未嘗試時下正夯的雲端技術,而在大家發財夢的DDoS猛攻之下,網站到現在都還是處於掛點狀態。

其實,既是純粹的小資料量結果公佈與查詢,理論上用HTML+Client Script寫查詢程式就可滿足需求,應該可大幅提高伺服器負載上限,反正開獎結果項目有限,也無需保密,用Javascript寫未嘗不可。

在網路上找到熱心網友提供的開獎結果,用Excel欄位值過瀘的點子很棒! 對獎後,我也很快就確定今年仍要繼續努力工作...

不過,既然提了HTML + Client Scripting減少伺服器負載的做法,為了證明自己不是嘴砲王,一時興起就改寫了jQuery自動完成懶人包,小調一下就寫成一個完全不需要Server端程式的中獎號碼自動完成範例

由於傳統jQuery自動完成都是用AJAX呼叫後端程式進行關鍵字查詢,所以我改寫了jquery.autocomplete.js,加入四行程式,如此當我們在options.url中傳入Javascript函數時,就可以取代呼叫Server端程式,直接寫Javascript程式比對使用者輸入的文字,組合出提示結果後傳回。

    function requestData(q) {
        if (!options.matchCase) q = q.toLowerCase();
        //2009-05-21 by Jeffrey, add noCache flag to disable cache
        var data = (!options.noCache && options.cacheLength) ? loadFromCache(q) : null;
        // recieve the cached data
        if (data) {
            receiveData(q, data);
            // if an AJAX url has been supplied, try loading the data now
        }
        //2011-02-03 by Jeffrey, support Javascript function as data provider
        if (typeof options.url == "function") {
            data = options.url(q);
            addToCache(q, data);
            receiveData(q, data);
        }
        else if ((typeof options.url == "string") && (options.url.length > 0)) {
            $.get(makeUrl(q), function (data) {
                data = parseData(data);
                addToCache(q, data);
                receiveData(q, data);
            });
            // if there's been no data found, remove the loading class
        } else {
            $input.removeClass(options.loadingClass);
        }
    };

加入支援Javascript函數資料源功能後,先製作一個中獎號碼的資料物件陣列,再用簡單的迴圈逐一比對(理論上可以再改成更有效率的演算法,但號碼只有100組,實測此速度已堪用),並透過事前排序縮小比對範圍增加一點速度,就完成了對獎邏輯

<script type="text/javascript">
    var dataPool = [];
    dataPool.push({ Key: '01 02 03 04 33 45', Name: '第68組: 01 02 03 04 33 45' });
    dataPool.push({ Key: '01 03 09 22 31 34', Name: '第6組: 01 03 09 22 31 34' });
    //...省略...
    dataPool.push({ Key: '19 32 37 42 47 48', Name: '第29組: 19 32 37 42 47 48' });
    dataPool.push({ Key: '22 25 34 36 38 44', Name: '第36組: 22 25 34 36 38 44' });
</script>
<script type="text/javascript">
    $(function () {
        $("#txtNumbers").autocomplete(
        function (q) {
            var res = [];
            //此處使用逐一列舉比對的單純寫法,要提高效能應改用更有效率的比對演算法
            for (var i = 0; i < dataPool.length; i++) {
                var data = dataPool[i];
                var cmp = data.Key.substr(0, q.length);
                if (cmp == q)
                    res.push([data.Key, data.Name]);
                if (cmp > q || res.length >= 10)
                    break;
            }
            return res;
        },
        {
            delay: 10,
            width: 250,
    //...省略...

薑薑薑薑,一個不需要Server端程式的樂透中獎號碼jQuery自動完成網頁就完成囉!

最後,補上產生中獎資料陣列的程式:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Linq" %>
<script runat="server">
    string rawData =
@"1 05 10 16 19 42 44
2 09 12 17 24 30 49
...省略...
98 13 18 25 37 39 46
99 13 39 40 42 43 48
100 03 07 08 12 38 43";
    void Page_Load(object sender, EventArgs e)
    {
        var q = from s in rawData.Split('\n')
                select new
                {
                    Seq = s.Substring(0, s.IndexOf(" ")),
                    Numbers = s.Substring(s.IndexOf(" ") + 1).TrimEnd('\r')
                };
        
        
        Response.ContentType = "text/plain";
        Response.Write("var dataPool = [];\r\n");
 
        foreach (var d in q.OrderBy(s => s.Numbers))
            Response.Write(
                string.Format(
                "dataPool.push({{ Key: '{1}', Name: '第{0}組: {1}' }});\r\n", 
                d.Seq, d.Numbers));
        Response.End();
    }                      
</script>

有趣吧! 祝大家新年快樂,早日中奬發大財~~~


Comments

# by Beata

是說.... 我就是屬於那見不到「小幫手」真身的眾網友之一吶! 所以也悲憤的寫了一支可離線的樂透對獎 http://tools.nahoya.com/lotto/ 因為連不上台灣樂透線,所以沒做線上拉開獎號碼的功能 只能手動填寫開獎號碼....

# by ChaN

還在用asp跟big5的公司不要奢求太多了 XD

# by khcat

很多人都佛心來著(新春對不到獎會很落寞說)製作了針對這百組號碼對獎的網頁,我是靠下面這個來對獎的, http://goeswin.us/special_draw.php 我也好好奇樂彩公司的對獎網頁到底長怎樣啊?到早上好像還是看不到...

# by 鐵衛

呵呵,由黑大來寫這個程式感覺是殺雞用牛刀了,不過我發覺這次的號碼怪怪的,因為如果是用開號球或者亂數不可能會發生這種情形 第一個號碼介於 1~22(23 以後的號碼一個都沒有) 第二個號碼介於 2~39 第三個號碼介於 3~40 第四個號碼介於 4~44 第一個號碼介於 17~48(17 之前的號碼一個都沒有) 第六個號碼介於 26~49(25 之前的號碼一個都沒有) 感覺像是把亂數寫在迴圈裡面開出來的(早期電腦因為速度慢執行時間太短,導致時間種子不夠,所以亂數會變成連號或同號 ...)還是有其他人為成分在裡面,不過也可能是我多濾了 囧

# by 鐵衛

二樓的大哥你說錯了,人家只有首頁用 big5 內頁 例如:100 組百萬獎金之類的是用沒宣告的 UTF-8 編碼呢 XD PS.上一篇打字沒注意把 第五個號碼打成第一個了,在此更正一下

# by 鐵衛

哈,大家買大樂透的怨念實在太重 連 khact 大大提供的對獎頁都出現連線超額的訊息了 Warning: mysql_pconnect() [function.mysql-pconnect]: User goeswinu_myadmin already has more than 'max_user_connections' active connections in /home/goeswinu/public_html/special_draw.php on line 128 Can't Connect

# by Jeffrey

to 鐵衛,結果已將六顆彩球數字重新排序過方便大家對獎(因為彩券上的數字也都是由小到大排序的),開獎過程電視新聞有播出片段及部分結果,應該沒什麼做手腳的空間,不過看到一組有趣的號碼: 01 02 03 04 33 45,1到4連號,若開成頭彩,應該會摃龜吧 LOL

Post a comment