2012年8月31日

jQuery Table 欄位合併

jQuery : 分享合併Table的欄位 (RowSpan、ColSpan) 語法
////合併上下欄位(colIdx)
jQuery.fn.rowspan = function(colIdx) {
    return this.each(function() {
        var that;
        $('tr', this).each(function(row) {
            var thisRow = $('td:eq(' + colIdx + '),th:eq(' + colIdx + ')', this);
            if ((that != null) && ($(thisRow).html() == $(that).html())) {
                rowspan = $(that).attr("rowSpan");
                if (rowspan == undefined) {
                    $(that).attr("rowSpan", 1);
                    rowspan = $(that).attr("rowSpan");
                }
                rowspan = Number(rowspan) + 1;
                $(that).attr("rowSpan", rowspan);             
                $(thisRow).remove(); ////$(thisRow).hide();
            } else {
                that = thisRow;
            }
            that = (that == null) ? thisRow : that; 
        });
        alert('1');
    });
}

////當指定欄位(colDepend)值相同時,才合併欄位(colIdx)
jQuery.fn.rowspan = function(colIdx, colDepend) {
    return this.each(function() {
        var that;
        var depend;
        $('tr', this).each(function(row) {
            var thisRow = $('td:eq(' + colIdx + '),th:eq(' + colIdx + ')', this);
            var dependCol = $('td:eq(' + colDepend + '),th:eq(' + colDepend + ')', this);
            if ((that != null) && (depend != null) && ($(thisRow).html() == $(that).html()) && ($(depend).html() == $(dependCol).html())) {
                rowspan = $(that).attr("rowSpan");
                if (rowspan == undefined) {
                    $(that).attr("rowSpan", 1);
                    rowspan = $(that).attr("rowSpan");
                }
                rowspan = Number(rowspan) + 1;
                $(that).attr("rowSpan", rowspan);
                $(thisRow).remove(); ////$(thisRow).hide();
                
            } else {
                that = thisRow;
                depend = dependCol;
            }
            that = (that == null) ? thisRow : that;
            depend = (depend == null) ? dependCol : depend;
        });
    });
}

////合併左右欄位
jQuery.fn.colspan = function(rowIdx) {
    return this.each(function() {
        var that;
        $('tr', this).filter(":eq(" + rowIdx + ")").each(function(row) {
            $(this).find('th,td').each(function(col) {
                if ((that != null) && ($(this).html() == $(that).html())) {
                    colspan = $(that).attr("colSpan");
                    if (colspan == undefined) {
                        $(that).attr("colSpan", 1);
                        colspan = $(that).attr("colSpan");
                    }
                    colspan = Number(colspan) + 1;
                    $(that).attr("colSpan", colspan);
                    $(this).remove(); 
                } else {
                    that = this;
                }
                that = (that == null) ? this : that; 
            });
        });
    });
}


CODE-以jQuery實現Table相同欄位的上下合併
<script type="text/javascript">
        $(function () {
            //模擬顯示資料
            var data =
            [
                { No: "1", Name: "Jeffrey", Date: "2011/05/07", Score: 2011 },
                { No: "1", Name: "Jeffrey", Date: "2011/06/21", Score: 9999 },
                { No: "1", Name: "Jeffrey", Date: "2011/06/22", Score: 32767 },
                { No: "2", Name: "Mulder", Date: "2011/06/01", Score: 999 },
                { No: "3", Name: "Darkthread", Date: "2011/06/10", Score: 100 },
                { No: "3", Name: "Darkthread", Date: "2011/06/15", Score: 100 }
            ];
            var h = [];
            for (var i = 0; i < data.length; i++) {
                h.push("<tr>");
                var obj = data[i];
                for (var p in obj)
                    h.push("<td class='c-" + p + "'>" + obj[p] + "</td>");
                h.push("</tr>");
            }
            $("#scoreboard tbody").html(h.join('\n'));
 
            //合併內容相同欄位的邏輯
            $("#btnShowMe").click(function () {
                var $lastCell = null;
                var mergeCellSelector = ".c-No,.c-Name";
                $("#scoreboard tbody td.c-No").each(function () {
                    //跟上列的td.c-No比較,是否相同
                    if ($lastCell && $lastCell.text() == $(this).text()) {
                        //取得上一列,將要合併欄位的rowspan + 1
                        $lastCell.closest("tr").children(mergeCellSelector)
                        .each(function () {
                            this.rowSpan = (this.rowSpan || 1) + 1;
                        });
                        //將本列被合併的欄位移除
                        $(this).closest("tr").children(mergeCellSelector).remove();
                    }
                    else //若未發生合併,以目前的欄位作為上一欄位
                        $lastCell = $(this);
                });
            });
        });
    </script>

<table id="scoreboard">
    <thead>
        <tr><td>No</td><td>Name</td><td>Date</td><td>Score</td></tr>
    </thead>
    <tbody>
    </tbody>
</table>
void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[0].CssClass="SubProjectTd";
        // 在每一個 row的第一個 column加上 class
    }
}

2012年8月30日

jQuery Multi Select 動態預設多選

如果選項是用 javascript在前台塞進去的
想要預選就得先將 select元件設定 multiple

$("#ddlSurvey").attr("multiple", "multiple");
$("#ddlSurvey").multiselect({...});
$("#ddlSurvey").multiselect('refresh');

2012年8月28日

Windows 虛擬桌面 Desktops v1.02

http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

http://download.sysinternals.com/files/Desktops.zip

Highchart 沒有顯示圖

有框 沒圖

1. 設定變數時,數字給成字串

    ex: var hy_legend_y  = "50";

    IE還是可以顯示;Chrome、Firefox就不能

2. Highcharts line chart does not work with jQuery 1.7.

     highchart not shown data graph

2012年8月23日

C# 讀取檔案

System.IO.StreamReader file = new System.IO.StreamReader(filePath);

string articleString = file.ReadToEnd();

中文亂碼
StreamReader預設是用 UTF-8做讀取 所以要再設定解碼方式
new System.IO.StreamReader(filePath, Encoding.Default);
default預設用 ANSI解碼

C# 讀取含中文的檔案

Ajax call Webservice

$.ajax({
   type: "POST",
   url: "../../WebService.asmx/FindPerson",
   data: params,                                   // 參數
   contentType: "application/json; charset=utf-8", // 參數格式
   dataType: "json",                               // 回傳格式 
   success: function(response) {
     // 將 WEB SERVICE 回傳的字串轉為物件
     var jsonObj = $.parseJSON(response.d);
  
     // 使用 chrome 按 F12 選擇 console 即可看到結果  
     console.log("Hello, I am " + jsonObj.name);
   }
   ,failure: function(msg) { }
   ,error: function(msg) { }
});

http://jax-work-archive.blogspot.tw/2011/09/jquery-textarea.html

2012年8月21日

jQuery Readonly v.s. Disable

input元件若設定為 disable submit時就會以空值的方式送到後台, 應用 readonly

2012年8月17日

ASP.NET 在 behind-code註冊 javascript

BasePage.Current.ClientScript.RegisterStartupScript(</pre>
   this.GetType(),
   "resetActiveTab",
   "<script language=\"javascript\" type=\"text/javascript\">
        jQuery(document).ready(function(){;
            alert(\"xxx\")
        }
    );
    </script>"
this.Page.ClientScript.RegisterStartupScript(...);

reference:
 Go to specific tab after refresh

jQuery div內字串比對總是回傳 false

ex:
result = ($(this).html()=="SubProject");
result: false


加上 .trim()即可
result = ($(this).html().trim()=="SubProject");
result: true

2012年8月15日

景氣差,總有更好事物值得追求!9件非做不可的事



1.理財:簡單為上

投資理財簡單化是很重要的原則。投資理財專家夏韻芬提醒,今年高風險性的投資商品少碰為妙,還是以自己看得懂的金融商品為主。

不景氣也是檢視自己過去投資比例的最好時機,生活支出、房貸、保費等項目的比重,不妨重新調整。

夏韻芬建議,目前房貸利率已經調降,許多人卻還在使用固定利率,很不划算,應該要趕緊改成機動利率。同時,也可減少保費的支出。不少人把保險當做儲蓄工具,假使你收入真的產生變化,不妨暫時把保費減少一些。

2.消費:聰明杜絕無謂浪費

降低支出,減少不必要的生活開銷也是一定要改變的消費習慣。夏韻芬舉例,很多人為了省錢,到大賣場、量販店購物,買回來的食物卻來不及吃就爛掉,一樣是無謂的浪費。

「蕭條時尚」是荷包縮水時,上班族可以多發揮的創意思維。她鼓勵大家不妨多點巧思,用搭配、混搭方式創造流行感,自己改造舊的牛仔褲、T恤,也是不過度浪費的好方法。

3.學習:多投資自己腦袋

景氣不好,更要投資自己的腦袋。夏韻芬笑說,頸部以上的多投資,頸部以下的不用花太多錢。

上班族不妨善用「不花錢」的學習管道,例如收聽ICRT,或是到BBC、CNN等網站下載免費的Podcast(播客)節目加強英文,或是到職訓局去充實一些專業技能,在職場由專業分工走向專業多工的時代,才能成為老闆最寶貴的資產。


平時不妨自我練習在3分鐘內說出自己對公司的貢獻。此外,如果碰上無薪休假,與其在家裡怨天尤人,抱怨公司,還不如去多聽免費演講、多看展覽、多讀書,或是參加社團,拓展人脈。

4.健康:愈運動,愈有希望

愈是不景氣,愈要保住健康,除了有強健的體魄才能對抗惡劣環境,萬一生病,還要額外再支付大大小小的醫藥費,更是得不償失。

最近才去龍門露營區騎自行車,Google台灣區總經理兼台灣工程研究所所長簡立峰鼓勵年輕上班族多走出戶外,不僅可以鍛鍊身體,更有助排遣負面情緒。畢竟體能與心態是一體兩面,先有健康的身體,才有高昂的鬥志。

5.親密關係:轉換心情陪家人

永遠不要忘記家人是人生中最珍貴的資產。

享受居家生活並不代表非得花大錢裝潢,有時你欠缺的只是一份「心情」。好好整理家裡環境,佈置一個喜歡的角落,和家人共享一張好CD、或喝杯好茶,反而能讓自己得到真正的歸屬與安定。

偶爾和家人到住家附近野餐,也是增進彼此感情的好方法。美食作家葉怡蘭表示,她經常帶著自己親手做的沙拉、輕食,和家人到住家附近的山坡散步、野餐,就能換得一天的快樂時光。

6.公益:多為別人想一想

不要成天想著自己為何最倒楣,做點善事,會發現力量更大。

2007年開始投身公益的作家王文華曾在部落格寫道:「成功如此boring(無聊)。Boring的原因,是因為我們除了自己,一無所有。100%只有自己的生活,就像100%的檸檬汁,令人反胃。」


他和趨勢科技董事長張明正創辦「若水公司」,開始做公益,推動社會企業的概念。他坦言,做公益,可以暫時「忘掉自己、只想別人,就像脫光了衣服,輕鬆舒適。」
2008年一場意外讓夏韻芬痛失愛子,將愛子意外身故的保險理賠金全數捐出後,更讓她產生推動「商業保險社會化」的公益想法。
夏韻芬有感而發地說,她以前常跟自己的小孩說,少吃一頓buffet自助餐,就可以幫助其他小孩都有飯吃,所以她跟她的小孩都認養了貧苦小孩。最近很多公益團體出現募款危機,她建議,每個人都有保險,只要願意提撥保費的10%、20%,就可以讓許多慈善、社福團體繼續運作下去,不需要多有錢,一般上班族就能做到。
7.生活:重新喚醒你的感官
你有多久沒有好好釋放身心靈,放慢速度讓五感享受生活?
不妨利用假日,好好為自己和家人下廚煮一頓飯,喚醒長久以來麻木的感官,也讓自己吃得更健康。
葉怡蘭認為,台灣人煮飯受到太多中式烹調的影響,以為做飯一定複雜,一定要三菜一湯、大火快炒,加上繁複的調味料,其實不盡然。有時候一份乾拌麵配涼拌小菜、一份豆腐,也可以是一餐;一盤綜合水果灑上葡萄乾、橄欖油沾麵包、加上一小杯白酒,也很美味。
「現代人什麼都要,要過頭了,應該開始改變,知道自己不要什麼。」她認為,2009年,大家不妨學習放慢速度生活,重新學習「重質不重量」,多珍惜限量、手工的東西。剝除不必要的包裝,反而會讓你重新體會事物的真實滋味。

8.視野:實踐一場夢寐已久的旅行

28歲的大男孩謝旺霖,一次單車橫跨中國滇藏的旅程,為他年輕的靈魂開啟了新視界,更寫出了令人驚豔的作品《轉山》。

這個世界,哪裡仍令你好奇?未必非要做到像背包客般長期壯遊,即使是三五好友結伴,去一個一直想去卻沒去的地方,都是拓展視野,增廣人生閱歷最直接的方式。

把目的地寫進你的圓夢記事本裡,為自己好好計畫一趟難忘的旅程。

9.自己:用記事本寫下夢想

向來有做筆記習慣的作家李欣頻表示,每到歲末年終,她都會在筆記本寫下10個明年想實現的夢想,例如明年她的夢想之一,就是到南極旅行。

如同她在最新的文案作品中寫道──

在這個信心低谷、創意用盡的時刻,我們不再需要「教我們該怎麼做事」的達人,而是需要「教我們如何作夢」的痴人。

痴人的靈魂是自由的,敢作與眾不同的夢,能看見未來的非凡,現實環境再怎麼無情,他們依然熱情,不管別人怎麼側目數落,他總能像個傻子般地堅持著,把所有的生命時間,放在別人看不到希望的地方,固執成痴,力求完美,自得其樂,自豪不餒。

新的一年到來,不論你有什麼偉大的圓夢計劃,現在就替自己準備一本「圓夢記事本」,把夢想一一寫下,努力去改變,去實現它吧!(李築音)


Cheers: 景氣差,總有更好事物值得追求!9件非做不可的事

21件25歲要開始做的事

勇敢追夢

1. 列出你人生中非做不可的「待辦事項」,開始一項項完成。

2. 嘗試一個人出國旅行,跟自己對話,照顧自己,傾聽心裡的聲音。

3. 至少進一次大公司,不一定是規模大的企業,而是在各行各業中,口碑和風評領先的公司。因為大公司的福利以及制度較完善,並可趁機累積相關工作資歷,以及人脈關係。也許中年之後,你會想要創業,資金、經驗和資源外,人脈是不可或缺的幫手。

4. 好好品嚐一次跌到谷底的感受。把自己逼到牆角時,往往是把人生看得最清楚的時候;唯有越過層層荊棘,才可能超越自我。

5. 找個時間做件善事,例如加入義工行列,在協助、服務其他人的同時,你會對目前所擁有的一切更加滿足。



財富自由

6. 對自己好好進行一次全盤財務診斷。問自己:真正讓你幸福的生活方式是什麼?有人喜歡住鄉下,有人卻想要住豪宅,想在短時間創造高財富,就必須承擔更高的風險。

7. 再問自己理想的生活方式,需要準備多少錢才夠?扣除現有資產存量,還需要準備多少?設定好目標後,才開始討論合適的投資工具。

8. 切勿「負債投資」;若有負債,應先擬定償還計劃,先理債、再理財。

9. 一切都得從「存錢」做起,否則都是空談。

10. 想要存錢,先從「記帳」開始。這是基本功,只要堵住不經意花掉的金錢,一定可以慢慢累積出投資的本金。

11. 辛苦存錢的同時,一定要慎防財務漏洞,比如人云亦云地亂買股票、辦房貸,甚至亂刷卡或用現金卡借錢。其中聽明牌買股票往往被套在高點;房貸利率的差別往往一年達數萬元;信用卡是很多現代人的理財盲點,也是現代人的財務殺手,試想你有錢放在銀行,拿到的是少少的利息,當這些錢被銀行經由信用卡或現金卡借出去,利差達10倍以上,這樣的錢當然不能借來用。

12. 既然理財是門學問,平時就應該做功課,無論從總體經濟,到世界趨勢,都應該有所涉獵。不要一昧相信「理財專家」或「股票名師」會替你帶來一夕致富的好運。

13. 最後,想要獲得財富自由,成為理想中的有錢人,就要有「成功致富」的信心。幾乎所有成功的投資人,都有一套自己的投資觀念,自律且具耐心,最重要的是,他們目標明確。



掌握未來


14. 要自由地揮灑未來,第一件要做的事是──建立生活的秩序。有秩序的人,通常能夠成就你意想不到的事。讓其他事情可以順利完成,便有更多時間享受「自由」。

15. 改變,從專心工作開始。面對你正在做的事,集中注意力,才能加快完成速度。

16. 養成固定時間睡覺和起床。不要再用種種理由佔用睡覺的寶貴時間,不要讓事情一拖再拖,這樣你將有更多時間補足精力。

17. 正確的飲食、運動習慣能讓身體保持清醒,沒有負擔。應該讓身體在35歲以前,都保持在最佳狀態。

18. 只有不斷學習才能保證競爭力。管理大師彼得‧杜拉克(PeterF.Drucker)說,你的知識和經驗,都是你的新財富。懂得學習,一半靠好奇心,一半靠自律。杜拉克即使再忙,每天也會擠出3~5小時讀書,唯有保持學習的自律,才能獲得一生受用的知識財富。

19. 在日常生活中,實踐「懶」人的智慧,用最少時間,達到最佳目的,且運用更舒適輕鬆的方法。例如:妥善保存隨手買的小配件,收納在同一個地方,要使用的時候就不會找不到。發展自己的懶人智慧,當事情忙亂起來,就不會一團糟,生活也能更有品質。

20. 學會說不。「拒絕」是一門藝術,做個心胸開闊、進退有禮的人,同時也要有自己的原則,才能過得自在、開心。

21. 儘可能讓生活豐富。嘗試著用一個圓圈,平分成6個部份,在每個部份寫上家庭、工作、經濟狀況、精神追求、健康、智慧,提醒自己人生不是只有工作的上班時間,與下班後的日常生活;儘可能讓自己的每個面向不斷拓展、延伸。

35歲前,學會讓自己輕鬆地應對一切,你就可以享受成功、自由的人生。


Cheers: 21件25歲要開始做的事

2012年8月14日

新技術?

最近接觸了 Report Builder、VS Test Project(Load Test)等軟體
雖然都是在學新東西
可是都是微軟家的
軟體是死的
那藏在這些工作裡面的那些活的技術呢?

VS Load Test Error&Exception

Http Error
500 - InternalServerError

System is overloaded Code: 1005
Search failed.exception: Item has already been added. Key in dictionary: 'jpconsportalfeed' Key being added: 'jpconsportalfeed'

2012年8月8日

ADO code

string connectionString = "Data Source=xxx;Initial Catalog=yyy;Integrated Security=True;Application Name=zzz"

string command = "SELECT ... FROM ... WHERE ... ";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(sqlInsertCommand, connection);
    command.Parameters.Clear();
    command.Parameters.AddWithValue("@Id", Id);

    command.ExecuteNonQuery();

    command.Cancel();
}

log 的一些技巧

● 寫入 log的 table要注意 table的特性
 比如umbraco的 umbracoLog就有 house keeping, 定時清理的動作

● 可以用 GUID來當 key, 這樣要查詢一整群的訊息較方便
_logGuid = Guid.NewGuid()

2012年8月7日

VS Load Test

  1. new → Test project
  2. add → web perfomance test 錄製腳本
  3. add → load test
  4. Tool bar → Test → Edit Test Settings → Role
    → Test excution method: Remote → Controller: tw-sps10-lt10
counter user: 25 x server 10: 250 user

result產生後, 報表結果已經直接儲存在 server上
可以按 Open and Manager Results選項, 指定 server, 開啟既有的 result


同一個 loadtest裡面加兩個以上的 scenarios是所有的 scenarios一起 run test
不是指定其中一個就只 run那一個

XmlNode 加入另一個 XmlDocument

doc.InnerXml = response.OuterXml;

ADO.NET integrate

寫 ADO的 connection string時 除了自己指定 uid, pwd外 可以用 integrated security ex:
string connectionString = "data source=id;initial catalog=table;integrated security=true;";

integrated security
true: 使用 windows身份驗證模式
false: 使用 uid, pwd
sspi (Security Support Provider Interface): 等同於 true (???)

reference
sql連接語句中的Integrated Security=SSPI/ture/false

2012年8月6日

Scrum Meeting 站會

上禮拜公司開始把站會 scrum meeting推廣到趨勢這裡 以後每天早上都需花個十至二十分鐘開站會 大家圍成一圈, 由主席主持會議 輪流報告昨天的進度及今天的工作內容 會後再把報告的東西寄給主席, 統一彙整後放上 redmine上 p.s. 報告的內容要著重在當天需要完成的部分, 而不是大方向(長時間)的計畫, 這樣才會一直去追, 而不是每天幾乎都報告相似的內容

2012年8月1日

ASP.NET 效能 ViewStateMode

如果不會用到 postback, 可以把 ViewStateMode 設定成 disable

UrlDecode, +, space

用 HttpUtility.UrlDecode() "+"會被轉換成空白字元 " " 空白字元 " "會被轉換成 "+"