2012年9月26日 星期三

Reflection 反射吧!男孩

個人寫程式只有兩條大守則

第一條:比起效能我更在乎易維護

第二條:絕對不要違反第一條



範例:

有時候剋扈或牢版不希望網站上的圖片實體路徑被裸體公開

因為實體路徑被知道了就會被任意玩弄

想想我們的老朋友 泛型處裡常式

利用它可以搞些卑鄙手段防止被玩弄

例如檢查 登入 Session 之類的東東 確認 某些狀態

若是非登入狀態 將無法取得圖片

這裡沒搞什麼手段 就只是很簡單的藉由讀取路徑再 Response.BinaryWrite 輸出 圖片

圖片路徑就變成這樣 看不出原始路徑

http://localhost:4024/getImage.ashx?name=smile.jpg&type=Jpeg



但是上面說的東東跟這篇的主題沒啥關係 ._.

重點在於這裡為了將圖片轉成 byte[] 用到了一個 ImageFormat

裡面長這樣 用來告知圖片是何種類型

為了支援所有類型 不知不覺它就變成這樣



這樣寫有錯嗎? 當然沒錯 但是不夠優雅呀

打 GAME 要風騷走位優雅輸出 打CODE 也一樣

反射吧!男孩 請回想程式守則第一條



雖然我(有可能)犧牲了效能 但是程式碼變得更簡潔了

而且若是日後 ImageFormat 有任何屬性(Property)增減異動 我也不需要修改程式碼



P.S. 為了寫那個 switch 複製貼上手很酸 -.-

2012年9月6日 星期四

Linq to XML .First() InvalidOperationException

XML 抓單一 XElement 有兩招

.First()

.ToList().Find()

差在哪?

.First() 找不到的時候會丟 InvalidOperationException

這樣 .First() 很難用呀 -.-

2012年9月5日 星期三

前端 javascript 更新 UpdatePanel

AJAX 兔兒kit 用過的都說神 果斷牛逼

三兩下就搞定 無刷更新

這嘛神 相對的就是要付出代價 跟效能說掰掰

雖然本人沒什麼在用這些 兔崽kit 但是從資X會時代就有一個大疑問

AsyncPostBackTrigger 選 控制項 再選 事件 就能AJAX

阿如果我我用個 input 前端要怎麼觸發他更新?

結果發現 真●他媽無雙難

最後用個鳥蛋爛方法

用個 asp:Button 隱藏鈕當 AsyncPostBackTrigger

再用J蛞蝓 input click 的時候 去按那個隱藏鈕

要說效果..是有的 神馬前端事件都能觸發 只要最後去按隱藏鈕

但是不能接受啊啊啊啊啊啊啊啊啊啊

我討厭蠢方法 但是更討厭自作聰明的方法

要是哪天 IE出包(我最喜歡舉IE當例子 因為它真的天天出包)按鈕跑出來 使用者不就可以很愉悅的猛按了

但是離開資X會後就漸漸淡忘 反正我也不會用兔崽kit



直到最近身邊又有人遇到類似問題

又激起我冒險犯難轉搞鳥問題的性子



埋頭亂試 把最近練來的把戲都玩一遍 失敗

估狗 查了一堆沒用的東東 失敗

上 MSDN 把 UpdatePanel 跟 ScriptManager 相關的屬性方法事件看一遍 失敗



結果我都忘了最簡單的沒查過

關鍵字輸入 "JavaScript 更新 UpdatePanel"

第一筆就有解答

http://www.cnblogs.com/jeff377/archive/2007/12/27/1016226.html

這故事告訴我 問估狗大神的時候 記得擲杯問問 關鍵字對不對



2012年9月3日 星期一

javascript JSON 排序

排序這需求不用多說,今天來玩玩

值得一提的是這個排序是從之前的筆記中學來的

http://weisnote.blogspot.tw/2012/02/listbox.html

現在看看以前還真可愛 雖然是上課作業要用泛型克服 ListBox Sort 字串 排列會有問題

但是其實我做了兩次型別的判斷 真是多餘 =3=

重點在於這個排序法是從 MSDN 上學到的

http://msdn.microsoft.com/zh-tw/library/system.windows.forms.listbox.sort.aspx

應該是快速排序法吧

相較於一般很乖的用兩個 for 迴圈 跑半天

他直接使用兩個 while 來進行

每次走訪兩兩比較 並把大值前移

直到無值被交換 則排序結束

這也是少數用到 do while 迴圈的寫法 我喜歡



不說廢話 來看code

javascript 沒泛型 而且沒那麼嚴謹 只需要注意 是否為數值排序

如果以字串排序 "9","7","13","17" 會因為字首1 變成 "13","17","7","9"



2013/1/12 修正版

上面的 swap() 其實有蟲呀 而且是大肥蟲 ZZ

不解釋 順便包成 JQuery 版



(function ($) {
    $.parseJsonAndSort = function (jsonStr, field, isNumber) {
        var jsonObj = $.parseJSON(jsonStr);
        var counter = $(jsonObj).size() - 1;
        var swapped;
        var swap = function () {
            var tmp = jsonObj[counter];
            jsonObj[counter] = jsonObj[counter - 1];
            jsonObj[counter - 1] = tmp;
            swapped = true;
        };
        do {
            swapped = false;
            while (counter > 0) {
                if (isNumber) {
                    var a = parseInt(jsonObj[counter][field], 10);
                    var b = parseInt(jsonObj[counter - 1][field], 10);
                    if (parseInt(jsonObj[counter][field], 10) < parseInt(jsonObj[counter - 1][field], 10)) {
                        swap();
                    }
                } else {
                    if (jsonObj[counter][field] < jsonObj[counter - 1][field]) {
                        swap();
                    }
                }
                counter--;
            }
        } while (swapped);
        return jsonObj;
    };
})(jQuery);