2012年1月20日星期五

Visual Studio Achievements - 寫程式開成就

對打機既人o黎講,"開成就"(Achievements)絕對唔會陌生。
一年前,有人戲言如果Visual Studio有Achievements會包含什麼?
What if Visual Studio had Achievements?Reddit上亦有很多人討論。引起Microsoft有關部門注意,並提出落實開發成就功能。

一年後,這個成就功能誕生了。
Visual Studio Achievements, now a reality!



這個東西不是隨便玩玩的,可以跟Windows Phone,Facebook等連動。
Channel 9上亦有很多頁面介紹
Visual Studio Achievements主頁:
http://channel9.msdn.com/achievements/visualstudio

[轉]Wiki為什麼抗議?一分鐘看懂SOPA

轉自: http://n.yam.com/8news/international/201201/20120120885993.html

【報導:張之杰/圖:Ason】 對於我們天天使用的網路來說,SOPA將會具有非常龐大而且深遠的影響力,不過到底什麼是SOPA,寫在維基上頭一大串英文,就算有耐性看完,還是搞不清楚狀況?沒關係,畫新聞用漫畫解釋,讓讀者們一分鐘看懂SOPA。

SOPA通過之後。

美國司法部:「你侵犯版權。」
網站:「我沒有,有證據嗎?」
美國司法部:「我說你犯法就犯法,是你要提出證據證明自己清白,在這之前先關閉。」
網站:(暫時關閉調查)
台灣人:「哈哈哈,這是美國法案,跟我們好像沒什麼關係。」
美國司法部:「Youtube、Facebook、Wiki、Google有侵犯版權的內容,請證明自己的清白,在這之前先關閉。」
台灣人:「…」

網路版權問題的確需要解決,畢竟這是屬於他人心血結晶的智慧財產。不過SOPA會造成很大的問題,特別是在這個網路無遠弗屆的現在,牽連範圍龐大真的很難想像。有人在youtube上傳了違反版權的影片,結果在臉書上有人轉貼,google上面能夠搜尋,或者PTT上有貼連結,那麼這些平台都有機會中槍。甚至使用者在不知情的情況下轉貼連結,也都很可能被牽連。

SOPA出發點不是不好,只是太過躁進,沒有顧慮到後果以及程序正義。清白還得要自己證明,這與法律精神完全不符合。因此各大網站以及網路使用者群起反對,白宮方面也表示不贊同。

不過不得不說,網路支持力量頗為驚人,wiki和google在首頁上表達抗議後,廣泛引起使用者關注。跟著就有10名參議員表達要放棄支持SOPA。看起來這場戰爭,目前網路似乎比較佔上風。

至於另外一個類似性質的法案PIPA,在今天(1/19)新增13名參議員反對後,確定了支持陣營崩潰。

2012年1月19日星期四

炒iPhone必備 Apple Store Checker - 開賣喇免費版

#18/JAN/2012 Update!!! - 支援Smartone iPhone 4S - 儲值咭組合。
有很多人要求我做埋Smartone,其實唔難....可能本身不是眼紅者,所以再改版既意慾不大。但現實中又有同事要求,咁即管支援埋Smartone喇。
新版本0.03使用方法都是一樣,但Smartone部份要等到真正開賣才知道Work唔Work,不過我估問題不大的。
另外Fix埋如果冇Network Connection時,會誤報iphone開賣的問題。

上星期首次投入炒賣iPhone行列,第一次感覺到炒iPhone那種不勞而獲的快感。
之後上網試試找有沒有程式可以長時間監察Apple Store,一有iPhone開賣就通知自己。

點知原來好多程式都係手機版,仲要收錢,都有唔少人買,有幾千個水魚,我即時心諗:(嘩~早知我早o的寫喇~)
Android Market : https://market.android.com/search?q=%E9%96%8B%E8%B3%A3&c=apps
App Store : http://itunes.apple.com/hk/app/id468658936?mt=8

呢句說話並不是馬後炮,我即使不是長時間在Apple Store打躉,但略有Web開發水平,而又懂得用Firebug之類的Debugger,花一點時間去分析一下Apple Store網頁就可以。

其實我有幾個想法係可以檢查Apple Store開賣情況,(以下內容含一點技術成份)

1. 用WebClient把Apple Store的頁面整個下載,如果字串長度有所變更,就進行通知。但這個方法有一定的誤中率。
2. 跟(1)一樣,下載網頁,不同的是偵測一下開賣時的綠色Checkout按鈕是否存在。但我沒有實行過,因為我寫這個Apple Store Checker時,沒有開賣,根本不知道那個按鈕的HTML含有什麼,是圖還是CSS3都不知道,但理論上是可行而且準確的。
3. 這個方法就是我程式使用的,直接模擬按下購買iPhone時的按鈕。當按下iPhone按鈕後,如果你用Firebug或類似IE Developer Tool監察Network活動時,你會發現Browser會Request一條URL,這條URL回應的內容已經十分明顯,如下圖。

20111221_171602_2-t.jpg

所以我要做的事十分簡單,只需要下載這個JSON字串做檢查已經可以,連deserialize那Json都不用。因為字串含有"暫無供應",那已不需要再問吧。

這個聖誕就送給各炒家一個程式,不用眼紅人了。
這個程式原理就如上述所說,不過我加入Timer每60秒做自動檢測,如果開賣的時候,那就大件事了。
右下角會有Notify彈出,程式本身都有Alert Window彈出,你不用怕會走漏眼。

程式本身開啟後會有一個藍色蘋果圖示在Windows右下方,點擊就可以開啟主畫面。而裡頭的Debug Mode其實是給我使用,Debug Mode是可以修改Json網址的,但不建議修改,除非有一天Apple Store把網址改了。
20111221_173517_4-t.jpg20111221_173431_3-t.jpg

原理,程式,用法就是這麼簡單,不要再花錢買那些App了。
Apple Store Checker下載網址 : http://dl.dropbox.com/u/19160547/Files/AppleStoreChecker.zip

#24/12/2011 Update
今天的流量嚇了一嚇,多了千多人到來,原來是高登眾巴打的捧場
而今天我自己終於都實際試驗到這程式,因為寫的時候到今天為止都沒有開賣,但今天早上10:10分左右,程式彈Pop-up,立即叫全公司所有人狗沖上Apple Store,証明程式是Work的。
但發現原來Apple Store是有配額制度。因為我的電腦和另外兩個同事的電腦,無論程式本身或實際上Apple Store都有不同的情況。

我自己在10:10am (左圖) 收到程式通知,上Apple Store,整個Checkout過程很快。同事A和同事B,遲過我上Apple Store幾分鐘,但奇怪的是程式沒通知,上Apple Store都是顯示未有得賣。
他們Clear Browser的Cache/Cookie,轉IE/FireFox/Chrome都是一樣。直到10:30am (右圖),他們才出現購買綠色按鈕。
所以我懷疑不只電話本身數量有限,而Apple Store是分批給人購買,並不是一開賣就全香港人都可以買到。
最後我仲發現自己打錯字,打左34GB...
20111224_ips4_sell_2-t.jpg20111224_ips4_sell_1-t.jpg

同埋我岩岩睇Post,話大陸人寫Bot Check埋係咪開賣,開賣仲自己買埋機,係就係有,
但係話"搵好多錢請左幾個精英編寫員黎寫",未免太誇張喇。
20111224_010424_7-t.jpg

其實呢o的Bot你地都可以寫到。
一般做Web Development或SQA既人,除左UnitTest呢類較Formal既測試,仲會有一樣o野,
你可以叫做WebTestAutomated Test。(較正確解說,自己上Google睇下係乜)
呢類Test正正就係可以做到自動檢查開賣,在某條件下,自己Click條Link,填埋Credit Card info等等。但當然寫呢類Test唔係o野少。
但Firefox就有一個叫iMacro既Extension俾你簡化做類似既事。其實Chrome都有,不過Chrome果個好Kai。
iMacro可以Load External Javascript去做Checking,網頁上既控制,當然有條件式Retry/Loop。

雖然我唔知大陸果款係點,但呢類都係Bot既一種。亦可以幫你地慳水慳力,我都想有條大水喉搵我寫個咁既o野。

2012年1月18日星期三

香港高登改版面,Userscript出動了

香港高登Admin又食飽飯冇事做更新版面,令到我一向用開的Firefox Extension - Helianthus.annuus部份功能失效。
諗都唔洗諗,立即左Keyboard右滑鼠花半粒鐘時間Fix返佢,順便造福人群。

呢個Userscript Fix返幾樣o野:
  1. 快速回覆會好似以前咁浮動形式+摺合。
  2. Helianthus.annuus果個Message Template,如果太多自訂訊息會按唔到OK制,亦新增唔到。
  3. 刪除阻住晒既討論區守則。
  4. 刪除阻住晒既咖啡色Menu bar。
  5. 刪除阻住晒既高登 Logo。
  6. 修正頁面闊度
  7. 放大Menu bar左手邊o的字
  8. 加返[返回吹水台]

暫時Fix返以上係我覺得對我好唔方便既野。

如果真係後繼無人,或者之後有時間再更新這個Post,增加一下功能。

使用方法一如以往新增一個Userscript,Copy And Paste,Save,搞掂。
18/Jan/2012 20:56 Update :
似乎好多巴打都有用,我岩岩再Update左一次,現在Resize browser後,條快速回覆Bar都會起度。
起高登不便出Post,有什麼想加或Bug可留言,因為林祖舜之前都因為我寫高登Post Parser而Bam過我一次。 :fuck:

// ==UserScript==
// ==UserScript==
// @name   HKGolden.js
// @namespace HKGolden.js
// @description 修正/增強HKGolden
// @include  http://forum*.hkgolden.com/topics.aspx?type=*
// @include  http://forum*.hkgolden.com/view.aspx?type=*&message=*
// @include  http://forum*.hkgolden.com/view.aspx?message=*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// @require  http://cachedcommons.org/cache/jquery-bbq/1.2.1/javascripts/jquery-bbq.js
// ==/UserScript==
var QrOpenTop = 27;
var QrCloseTop = 322;

function toggleNMTop() {
    var status = jQuery('#QrStatus').text();
    if (status == 'show') {
        jQuery('#newmessage').animate({
            top: window.innerHeight - QrOpenTop
        }, 400);
        jQuery('#QrStatus').text('hide');
    } else {
        jQuery('#newmessage').animate({
            top: QrCloseTop
        }, 400);
        jQuery('#QrStatus').text('show');
    }
    return false;
}

function PosQrDiv() {
    jQuery('#newmessage').css('top', window.innerHeight - QrOpenTop);
}
document.body.onresize = PosQrDiv;

jQuery(document).ready(function ($) {

    //Delete條咖啡色Menu bar
    jQuery('table table > tbody > tr:eq(1)').remove();

    //Delete 高登 Logo
    jQuery('table > tbody > tr:eq(1) table > tbody > tr:eq(0)').remove();

    //Remove 討論區守則
    jQuery('div.DivBoxContainer').remove();

    //Fix Helianthus.annuus Message template dialog size.
    jQuery('#ctl00_ContentPlaceHolder1_QuickReplyTable select:eq(2)').live("click", function () {
        if (jQuery('.an-forum').css('display') != 'none') {
            jQuery('div.an-forum').css('margin-top', -400);
            jQuery('#an-snippets').css('height', window.innerHeight - 100).css('overflow', 'scroll');
            jQuery('#an-snippets > div:eq(0)').css('float', 'left');
            jQuery('#an-snippets > div:eq(0) > input:eq(0)').css('width', '400px').css('float', 'left');
            jQuery('#an-snippets > div:eq(0) > textarea:eq(0)').css('width', '600px');
        }
    });

    //Fix 快速回覆
    jQuery('#newmessage').append("");
    jQuery('#QrStatus').text('hide');

    jQuery('#newmessage').css('position', 'fixed');

    jQuery('#ctl00_ContentPlaceHolder1_QuickReplyTable > tbody > tr > td > table > tbody > tr:eq(0)').css('cursor', 'pointer');
    jQuery('#ctl00_ContentPlaceHolder1_QuickReplyTable > tbody > tr > td > table > tbody > tr:eq(0)').click(function () {
        toggleNMTop();
    });

    jQuery('#ctl00_ContentPlaceHolder1_btn_Submit').live("click", function () {
        jQuery('#newmessage').animate({
            top: window.innerHeight - QrOpenTop
        }, 400);
    });
    PosQrDiv();

    //Fix Helianthus.annuus 頁面闊度
    var width = '80%'; //可設定為auto, 80%, 1000px等
    var maintable = jQuery('table > tbody > tr:eq(3) > td > table:eq(0)');
    jQuery(maintable).attr('width', width);
    jQuery('div.PageMiddleBox', 'table.repliers').css('width', width);
    jQuery('tbody > tr >td', maintable).attr('width', width);

    //放大Menu bar左手邊o的字
    var menubar_left = jQuery('table:eq(4)');
    jQuery('span,a', menubar_left).css('font-size', '16px');
    //加返[返回吹水台]
    jQuery('#ctl00_ContentPlaceHolder1_view_form > div:eq(4)').append("  返回吹水台");
});