2012年12月26日

SQL Server 2005 插入多筆資料

 SQL Server 2005

同時插入多筆資料不能寫在同一句 query內

ex:
INSERT INTO [table]
([field1], [field2], [field3])
VALUES
(@fieldA1, @fieldA2, @fieldA3), (@fieldB1, @fieldB2, @fieldB3)

2012年12月14日

2012年12月11日

AJax Loading

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="Pages_test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript" src="<%=Page.ResolveUrl("~/") %>js/jquery-1.8.3.min.js"></script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <img id="img1" src="<%=Page.ResolveUrl("~/") %>images/ajax-loader.gif" /><input id="btn1" type="button" value="Click" /><br />
        <img id="img2" src="<%=Page.ResolveUrl("~/") %>images/ajax-loader.gif" /><input id="btn2" type="button" value="Click" /><br />
        <img id="img3" src="<%=Page.ResolveUrl("~/") %>images/ajax-loader.gif" /><input id="btn3" type="button" value="Click" /><br />
    </div>
    </form>
</body>
</html>

$(function () {
        $('img').hide();
        $('img').hide();

        $('#btn1').click(function () {
            $('#img1').show();
            $.ajax({
                url: "/mjib/Services/CaseManageServices.ashx",
                type: 'POST',
                cache: false,
                data: {
                    OperationType: 'test'
                },
                success: function (response) {
                    $('#img1').hide();
                },
                error: function (response) {
                    $('#img1').hide();
                }
            });
        });

        $('#btn2').click(function () {
            $('#img2').show();
            $.ajax({
                url: "/mjib/Services/CaseManageServices.ashx",
                type: 'POST',
                cache: false,
                data: {
                    OperationType: 'test'
                },
                success: function (response) {
                    $('#img2').hide();
                },
                error: function (response) {
                    $('#img2').hide();
                }
            });
        });

        $('#btn3').click(function () {
            $('#img3').show();
            $.ajax({
                url: "/mjib/Services/CaseManageServices.ashx",
                type: 'POST',
                cache: false,
                data: {
                    OperationType: 'test'
                },
                success: function (response) {
                    $('#img3').hide();
                },
                error: function (response) {
                    $('#img3').hide();
                }
            });
        });
    });
</script>

2012年12月3日

SqlBulkCopy

using (SqlConnection Bulkconn = new SqlConnection(conn.ConnectionString))
{
    Bulkconn.Open();

    using (SqlBulkCopy sqlBC = new SqlBulkCopy(Bulkconn))
    {
        sqlBC.DestinationTableName = "dbo." + dt.TableName;

        foreach (DataColumn dc in dt.Columns)
        {
            sqlBC.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
        }

        sqlBC.WriteToServer(dt);
    }
}

Popbox

<div id="divAddFolder" class="hideUC">
    <table>
        <tr>
            <td>
                資料夾名稱
            </td>
            <td>
                <input id="txtNewNodeName" type="text" />
            </td>
        </tr>
    </table>
    <input id="btnAddNode" type="button" value="確定" />
    <input id="btnCancelAddNode" type="button" value="取消" />
</div>

function PopupboxAdd() {
    $.blockUI({
        message: $('#divAddFolder'),
        css: {
            top: ($(window).height() - 300) / 2 + 'px',
            left: ($(window).width() - 300) / 2 + 'px',
            width: '300px'
        }
    });
}

jqueyr.blockUI.js
popbox.js

p.s. popupbox 會使 asp.net runat server onclick無法執行

2012年10月24日

趨勢 #00

在做 Membership Tool凸槌後
先是被通知可能會被調去 loading比較輕的 SharePoint team
心情有點小受挫

今天 Yilin除了來幫我解決 session的問題
Renee也跟著來告訴我月底可能就會被調回公司的現實

比起面試時被告知不需要,這樣做了後才被認為能力不足 其實更讓我容易受傷 氣餒

加油吧  정신 자려!!

IsNewSession

參考: [ASP.Net] Session.IsNewSession 與 Session.SessionID

佈署時要記得把 Global.asax放到根目錄底下 .....................

2012年10月22日

2012年10月18日

Http Handler Web Service

.ashx

front-end
ajax ...
scuess(response):{
    var result = eval(response);  // trans text to json
}

ASP.NET Http Handler

使用 .ashx

HttpContext.Request["..."]


HttpContext.Response.ClearContent();
HttpContext.Response.ClearHeaders();
HttpContext.Response.Clear();
HttpContext.Response.ContentType = "application/json";
HttpContext.Response.Write(resultResponse);
HttpContext.Response.Flush();
HttpContext.Response.End();

web.config
<configuration>
    <system.web>
        <httpHandlers>
            <add name="DownloadHandler" verb="*" path="*.zip" type="... .XXXHandler"/>

verb: get, post, ...
path: *, *.zip, *.jpg, ...
type: (namespace).(class name)

2012年10月16日

1012 Meeting Record With Yilin

1. 對自己要求時程縮短一半  才有足餘的時間去做修改
  (MacGyver: 一個禮拜的切一道,或者切兩道、三道)

2. 試著只 build一次就過  不要邊 build邊找出 code內的語法錯誤等

3.

Umbraco Debug Mode

<compilation defaultLanguage="c#" debug="false" batch="false" targetFramework="4.0">

=>

<compilation defaultLanguage="c#" debug="true" batch="false" targetFramework="4.0">

2012年9月17日

Grid can not be used in this quirks mode

應該是 DOCTYPE非正規導致

ex:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

=>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">





jqGrid not rendered when the html page containing the grid is loaded through an ajax call

2012年9月14日

jqGrid on IE7 IE8

jqGrid 4.4.1 load data at once 在 IE8以下 高度會過長、pager會被蓋住看不到 solution: 用 3.7.2版本 & $('.ui-jqgrid-bdiv').css("height", "89%"); $("#jqgridRaw").jqGrid("setGridHeight", "90%");

Ajax 後 網頁重新導向


async
類型:Boolean
默認值: true。
默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。
注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行。

$.ajax({
    url: '/usercontrols/ExportHighchartPhotoServices.ashx',
    type: 'POST',
    async: false,
    data: { ... },
    error: function (xhr, ajaxOptions, thrownError) {
        ...
    },
    success: function (response) {
        ...
    }
});

jQuery ajax - ajax() 方法

2012年9月13日

jQuery window.location.href 保留字(escape)

window.location.href escape: #

錯誤訊息 Could not load file or assembly 'Svg ... '

Could not load file or assembly 'Svg, Version=0.5.2.17984, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 可能是 dll沒找到、版本錯誤等 連 dll都沒進去,當然沒進入 function,也不會有 catch

2012年9月12日

EPPlus Worksheet Name

EPPlus Worksheet Name 不能有問號 '?'

ExcelWorksheet Worksheet = Package.Workbook.Worksheets.Add(dt.TableName.Replace("?", ""));

2012年9月11日

Highchart Serverside Export

構想

1.在 client自動產、存圖後
後台程式 再撈出圖片  塞進 iTextSharp

2.把參數傳回後台,再呼叫自己寫的 webservice
ws再呼叫 export module.axd
傳回圖片的 string/stream,再塞進 iTextSharp

2012年9月4日

jQuery 字串取代 replace

"Hello".replace(/ll/g,"qq");
var reg = new RegExp(billNumber + ',', 'g');
$("#number").html($("#number").html().replace(reg, ''));

replaceAll是用於取代元件

2012年9月3日

css hack for IE

padding:10px;
padding:9px\9; /* all ie */
padding:8px\0; /* ie8-9 */
*padding:5px; /* ie6-7 */
+padding:7px; /* ie7 */
_padding:6px; /* ie6 */

Ref:IE6-IE9 CSS hack 寫法

jQuery Text 字串改變偵測

$('#id').keyup(function() {
   alert("Key up detected");
});

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() "+"會被轉換成空白字元 " " 空白字元 " "會被轉換成 "+"

2012年7月31日

.NET Postback 流程

Page_Load(object sender, EventArgs e) {
    if (Page.IsPostBack) {
        /* step 1 */
    }
    else {
        /* step 4 */
    }
    /* step 5 */
    ...
    /* step 2 6 */
}
aspResultPager_Init(object sender, EventArgs e) {
    /* step 3 */
}

Fast search error:unexpected token

fast search的 query中若有空白字元, 直接塞進 QueryString就會出現 [error:unexpected token]的訊息

解決方式:
在 serchview.Search(...)之前, 先把 query做 and變更的處理
ex: QueryString="web android" → QueryString="and(web,android)"

// process when query contains space char
if (_customizeQuery.Contains(" ")) 
{
    string[] splitString = _customizeQuery.Split(' ');
    _query.QueryString 
       = string.Format("and({0})", string.Join(",", splitString));
}
_searchView = _searchFactory.GetSearchView(config.collection);
_searchResult = _searchView.Search(_query);

2012年7月26日

SQL inner join v.s. exist

exist 是 left去比對 right, 找到符合的就回傳 (true)
inner join是兩邊全部 join後, 再去找符合的

#.exist在處理上遇到 null值可能會有問題

2012年7月25日

Report Builder not showing default value as select all

先看一下 query撈出來的資料是不是有 null或 blank""的值

如果有的話就會產生此情況

可以在 general勾選 allow blank value ("")來解決
或在 query裡先濾掉

where [field]<>'' or [field] is not null



reference:
My MDX SSRS report is not showing default value as 『Select All' (SSRS 2008R2)

2012年7月24日

Umbraco root element is missing

scripting files

後台在抓元素( ex: Model.keyImage)時
可以用 Model.HasProperty("name") 來測有沒有這個元素存在

Model.keyImage 回傳值為 umbraco.MacroEngines.DynamicXml型態
(Model.keyImage.InnerText)
沒有值的時候為 string, 長度為 0
(Model.keyImage.Length>0)


最快的方法還是直接用 try catch來忽略掉抓不到元素的錯誤訊息
並賦予 bool型態的 flag以 false, 方便後續的程式碼處理

2012年7月23日

趨勢 Note #005

Main: Slide Show

1. ===========================================

RepeatableCustomContentPrevalueEditor.cs
→ private DropDownList CreateUmbracoDataTypesList(string idSuffix) { }
→ → ConfigHelper.cs
→ → → DefaultDataType
string[] strArray = new string[] { "EAD69342-F06D-4253-83AC-28000225583B", "158AA029-24ED-4948-939E-C3DA209E5FBA", "C2D6894B-E788-4425-BCF2-308568E3D38B" };<

這三組是 data type的代碼
因為 safeqa和 cspqa的 textstring的 uid不同, 所以再剛搬到 safeqa時, Slide Image Picker底下找不到 textstring的選項

2. ===========================================

Slide Show 的箭頭符號是塞在另一個 css檔來設定 .slide-prev, .slide-next的樣式並指定圖片
害我看 cshtml內的設定看半天都不知道為什麼可以做出箭頭的效果
幹!!
<style type="text/css">
  .slide-prev, .slide-next { 
  position:absolute;
  background-image: url(/media/assets/apt/arrow.png);
  background-repeat: no-repeat;
  background-position: 0 0;
  display: block;
  height: 45px;
  width: 27px;
  padding: 0px 10px;
  z-index:9999;
  opacity:0.7;
  cursor:pointer;
}
.slide-next {
  background-position: 0 -46px;
}
</style>

2012年7月18日

jQuery .keyup() 即時偵測輸入字串

$(function () {
    $("#aspQueryString").keyup(function () {
        if ($(this).attr("value").length > 100) { 
        }
    });
});

2012年7月17日

ListView 自訂DataSource Eval("...") 找不到項目

ex:
DataBinding: 'BA.JPCONS.Search.Page.SearchResult+NavigatorData' 沒有包含名為 'name' 的屬性。

ListView用自己訂的 class去當作 DataSource
變數定義後面須加上  { get; set; } 而不是分號 ;

2012年7月16日

趨勢 Note #004

開發獨立原件時
最好先確認開發環境有一致 (ex: .NET Framework版本)
免得寫好的東西合併到專案底下卻不能用了

compile後, dll(參考)從專案裡神隱

把 esp-searchapi.dll加入專案參考後
在物件瀏覽器是看得到 api的

compile後, 物件瀏覽器裡的 api就消失了
但是 bin裡面還是可以看得到有參考該 dll

解決:
專案屬性中, 把目標 Framwork從 .NET Framework 4.0 Client Profile改成 .NET Framework 4.0

2012年7月13日

加入 web服務

寫好 web service後, 我竟然還在別的專案裡用 HttpWebRequest, 傳 url來獲得回傳值, 超笨的, 不過至少是學了一下 HttpWebRequest怎麼用

在專案中, 用加入 web服務(填入 web service的 url), 不用 using, 可以直接把 web service當作型別來宣告使用
ex:
trendmicro.safeqa.BetaPortalUrls4FAST _result = new trendmicro.safeqa.BetaPortalUrls4FAST();<

2012年7月11日

加入服務參考(Service References)錯誤


加入服務參考時若出現"嘗試尋找位於 ... 的服務時發生錯誤"

可能是
1. IIS處沒加入站台
2. 要先建置/發行

7/12新增:
BA.JPCONS內沒有加入服務參考, 直接發行後佈版, 直接可以使用

2012年7月10日

趨勢 Note #000

New Tech
  • Umbraco 建置(x), 開發(x), 使用(12%)
  • Web Service
  • FAST
  • C# Console
  • HttpWebRequest
  • xpath (xml)
  • jQuery Cycle

Review
  • jqGrid
  • Xml

IIS加入站台並更改應用集區

IIS 加入站台
  1. IIS → 新增網站
  2. 選擇實體路徑
  3. 填入站台名稱、本機名稱 (localhost)

更改應用集區為 ASP.NET 4.0

  1. 網站上按右鍵 → 管理網站 → 進階設定
  2. 應用程式集區 → 選 ASP.NET v4.0

Umbraco using NodeFactory

using presentation.nodeFactory;
using umbraco.NodeFactory;

用到 Node型態時,若引用 umbraco.NodeFactory會導致以下錯誤:
型別 'umbraco.interfaces.INode' 是定義在未參考的組件中。您必須加入參考至組件 'interfaces, Version=1.0.4085.20549, Culture=neutral, PublicKeyToken=null'

也會導致無法將該 web service加入服務參考

需要改用 presentation.nodeFactory

2012年7月9日

趨勢 Note #003


YC還說等另一個人回來
會希望大家輪流看別人的 code
算是有 code review的效果
也可以避免會的人請假要掛一起掛的情況

FAST search engine

今天 YC丟了個新工作給我
要我研究一下 FAST這個搜尋引擎
好把 betaportal的網頁都塞進搜尋引擎裡

page, node {url, title, content, (meta-tag)}
 => FAST doc.fields(url, title, content)
=> web api => FAST server

不要 hardcore, 要能調整權重 (藉 xml吧)

擴充性, ex: 可加入別的 fields

最大的困難應該是如何列出所有的 node

補:
寫一個 web service放在 umbraco site裡面
再寫一個 console透過該 web service去讀取 umbraco的資料

聽到要寫 web service就覺得胃痛, 總覺得是很難的東西
google查了一下, 發現沒有想像中的難 ~
+++ Web Service 入門與觀念 / ASP.NET的五篇文章&範例 


建立 web service
加入參考 umbraco.dll (in folder External)
using umbraco.presentation.Factory; // or umbraco.NodeFactory

2012年7月6日

趨勢 Note #002

這裡的系統是怎麼架的才能有不能在本機端 debug
只能靠寫 log來觀察程式運作的狀況?

搞得這麼不方便是基於什麼鬼考量 
為什麼? 為什麼? 為什麼?

도대체 왜? 왜? 왜?


沒辦法隨意更改程式內容然後即時得到結果
太痛苦了

2012年7月5日

該如何評估需要多久才能上手一個工作(任務)

每次接觸一個新的挑戰

總是會被上面問及:需要多久?

重點是,我不知道如何評估

如果是接管系統,系統的大小

如果是新的專案,專案的 ...

以什麼為標竿來評估自己的能力

又或者,僅是回答對方想得到的答案?

2012年7月4日

趨勢 Note #001

設定 IIS站台

開啟專案資料夾 ISUR權限

不用專案建置,用發行

佈版:1. dll檔案 2. usercontorls/ascx ashx aspx ... etc

2012年7月2日

Code Review

輸入文字有沒有做 html encode或用:
 jQjuery
$("<option>").text(xxx.val(xxx));

search->match
javascript
寫在 head的東西
會比網頁物件先 or 慢載入?
預防此情況就把 script寫在 ready裡面

2012年6月28日

jQuery .hover()

("area").hover(
    function () {
        clearInterval(change_Interval);
    }, 
    function () {
        change_Interval = setInterval (changeIMG, 5000);
    }
);

jQuery setInterval、clearInterval 循環動作 始、止

function Action(){ ... };
var interval = setInterval(Action, 5000);
clearInterval(interval);

2012年6月25日

jQuery eq()、gt()

eq()  指定第 N個元素 (index:0↑)
$("div#postlist > div:eq(1)").hide();

gt()  所有大於指定 index的元素
$("div#postlist > div:gt(3)").hide();
lt  所有小於指定 index的元素

Javascript日常運用有感

最近終於感到平常工作才會用到的 Javascript、jQuery也有在非上班時間運用到的時候了!!

那就是 ~ 類似 Firefox上的 GreaseMonkey這個套件的功能
可以讓使用者在自己的瀏覽器上掛載 script語法,直接對自己瀏覽的頁面動手腳

這樣在逛論壇時,就可以自己寫 script把根本就不會去看的東西給隱藏起來,網頁頓時精簡許多!!


不過平常愛用 Chrome的人,可沒有 GreaseMonkey可用
還好 Chrome的擴充功能上有一款 Blank Canvas Script Handler,也有同樣的效果啦!!

2012年6月19日

Win Server 2003 R2 + SQL Server 2008 安裝

需先安裝 .NET Framework 3.5 SP1

Features:
  • Instance Features
    • Database Engine Services
      • SQL Server Replication
      • Full-text Search

    要做分析及報表再勾選 Analysis Services、Reporting Services

  • Shared Features
    • Integration Services
    • Management Tool - Basic
      • Management Tool - Compelete





Server 2003 SP2 安裝 SQL Server 2008 失敗的解決方法
裡面提及若是已經安裝 MS XML 6 SP2,會導致 SQL Server 2008安裝失敗
可以先刪除後再用 Windows Update安裝

Win Server 2003 R2 + IIS6 安裝

Windows Server 2003 Enterprise Edition

  1. 控制台 → 新增/疑除程式 → 新增/移除 Windows功能

  2. Windows Components Wizard
    Deafult:
    • Accessories and Utlities
    • Update Root Certificates
    • Internet Explorer Enhanced Security Configuration
    Click:
    • Application Server

    IE Enhanced Security Configuration 用於開發時可以關掉...超煩的

  3. Application Server
    Deafult:
    • Application Server Consle
    • Enable network DOM+ access
    • Internet Information Services (IIS)
    Click:
    • ASP.NET

    Message Queuing 有空可以研究

  4. Internet Information Services (IIS)
    Deafult:
    • Common Files
    • Internet Information Services Manager
    • World Wide Web Service
    Click:
    • FrontPage 2002 Server Extensions

    BITS不需要
    SMTP Service 有需要用郵件的話開啟

  5. World Wide Web Service
    Deafult:
    • World Wide Web Service
    Click:
    • Active Server Pages

    Remote Administration(HTML)不需要

安裝 IIS6時,不知道是哪個元件需有 Server 2003光碟才能安裝

2012年6月15日

jQuery select元件取得selected、index

var now = $("#list1 option:selected").val();
var pos = $("#list1")[0].selectedIndex;

jQuery .each()

$.each(arr, function (ind, text) {
    $("[id=list" + index + "]")
        .append($("")
        .attr("value", text)
        .text(text));
});

jQuery .grep() 條件過濾

arr = $.grep(arr, function (obj) {
    return obj != now;
});

jQuery select元件新增 option


$("[name=FromStation]").append(
    $("<option></option>").attr("value", 0).text("請選擇"));

jQuery 元件 enable、disable

$("#FromCity").attr('disabled', 'disabled');
$("#FromStation").removeAttr('disabled');

2012年6月11日

Trengo Code Note

   
  1. 字串比對
    groupName == "ansvalue"
    ↓↓↓
    groupName.Equals("ansvalue", StringComparison.CurrentCultureIgnoreCase)
  2. SQL指令 join
  3. string strValue = "(@AnalysisVarID,@AnalysisGroupID,@GroupCode{0},@GroupValue{0})";
    ...
    DbCommand cmd = db.GetSqlStringCommand("INSERT INTO AnalysisGroupCode Values" + string.Join(",", lstValue.ToArray()) +";");
  4. TransactionScope
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    {
    ...
    }
  5. Trim()
  6. IDataReader
    using (IDataReader reader = db.ExecuteReader(cmd))
    {
      if(...)
      {
        admin.ID = (reader.IsDBNull(0) ? 0 : reader.GetInt32(0));
        ...
       }
    }

2012年6月7日

IUSR Account 匿名使用者帳號

設定 IUSR:

IUSR預設是沒有密碼的,可以透過 IIS管理員去更改匿名驗證帳號及密碼:
  1. [IIS管理員] → [驗證]
  2. 在[匿名驗證]項目上點右鍵 → [編輯]
  3. [特定使用者] → [設定]
  4. 輸入 [使用者名稱] 及 [密碼]

查詢本機的使用者名稱:
  1. [控制台] → [系統管理工具] → [電腦管理]
  2. [本機使用者和群組] → [使用者]

參考資料:
網站
    IIS and Built-in Accounts
    IIS7權限簡述
    理解IIS 7中內建賬號(IUSR)以及IIS_USERS組

2012年6月6日

Application Pool 應用程式集區

Application Pool 的概念:

Application Pool(以下簡稱 A-Pool)是 IIS7管理網站應用程式的一個機制,每個網站都會執行至少一個的應用程式,而 A-Pool底下則會管理一至數個不同網站的應用程式。

管理者可以建立多個 A-Pool,把網站分別放在不同的 A-Pool中執行,數支 A-Pool在伺服器上運作時,會佔用不同的記憶體空間,產生各自的執行程序,並運作在不同的 Session內,藉此分隔網站應用程式,不使其互相影響。

當其中一個 A-Pool被停止或回收時,該 A-Pool底下管轄的所有網站應用程式都會同時被停止或回收掉;若 A-Pool中有某個網站應用程式出現問題時,同一個 A-Pool內的其他網站應用程式也都會因為運作在同一個 Session內而受到影響(例如執行速度變慢,甚至同時當掉)。 

要注意的是,網站開發時採用哪個版本的 .NET Framework,部署到 IIS時,就必須使用相同 .NET Framework版本的 A-Pool。


Application Pool的優點:
  • 增進伺服器及應用程式效能:可以把資源密集型(註1)的應用程式指派給專屬的 A-Pool,使其他 A-Pool中的網站應用程式效能不會受到影響而下降。
  • 改善應用程式可用性:如果一個 A-Pool中的網站應用程式出了問題,也不會影響到另一個 A-Pool中的網站應用程式。 
  • 增強安全性:透過 A-Pool做隔離,可以降低一個網站應用程式存取另一個網站應用程式資源的機率。
註1:需要較長的處理時間,或使用大量資源的程式


整合模式和傳統模式:

A-Pool的模式會影響伺服器對 Managed程式碼處理要求的方式。
  • 整合式模式:IIS7以一條整合的要求處理管線
                            (Request Processing Pipeline)來處理 IIS和 ASP.NET的
                            要求。
  • 傳統模式:IIS7以兩條各自獨立的 IIS和 ASP.NET要求處理管線來處理
                        ASP.NET的要求(如同IIS 6)。
回收:

    Application Pool可以設定隔多久時間,或是在固定的時間回收一次資
    源,還可以設定此 A-Pool的佔用記憶體上限。


參考資料:
網站
    在 IIS 7 中管理應用程式集區
    IIS 7 基礎觀念:網站、應用程式、與虛擬目錄
    App Pool vs. App Domain
    設定應用程式集區(AppPool)防止Server上的Web應用程式彼此干擾
    IIS 7五大核心元件之5: 工作者處理序

2012年6月5日

核心精神

昨天要編寫 SQL Injection的東西到 Redmine裡面

才發現之前討論的小組口號已經定下來了

Patient, Listen, Satisfaction

耐心、傾聽、滿意

跟那時我們討論出來的八竿子打不著關係啊 ~ ~ ~


順便提一下公司的:

Quality, Effectiveness, Professional

品質、效能、專業

IIS7 安裝

作業系統:Windows 7
  1. [控制台] → [程式集] → [開啟或關閉 Windows功能]
  2. 按 [Internet Information Services] 以安裝預設功能,然後選取其他需要的功能。
  3. 下一步到安裝完成。

作業系統:Windows Server 2008 / 2008 R2
  1. [開始] → [系統管理工具] → [伺服器管理員]。
  2. 在 [角色摘要] 中,按 [新增角色]。
  3. 使用 [新增角色精靈] 新增 [網頁伺服器 (IIS)] 角色。
  4. 在 [選取角色服務] 頁面上,選取需要的角色服務。
  5. 下一步到安裝完成。
若有安裝成功,在網頁瀏覽器輸入 http://localhost 即可看見 IIS7的預設歡迎畫面。



加入角色服務(功能模組)
    正式上線的伺服器不需要完全安裝,也不建議安裝沒有用到的模組 。
    測試或評估用的伺服器,最好也跟正式環境保持一致,否則容易出現
    開發時正常,導入正式上線的伺服器卻發生不能執行的狀況。


  • 靜態內容伺服器(預設):
        靜態內容網頁伺服器是最基本的設定,提供對 HTML網站的支援。
        安裝 IIS7時即會預設安裝提供支援靜態內容網頁伺服器的所有模
        組。
  • 靜態內容(Static Content)
  • 預設文件(Default Document)
  • 瀏覽目錄(Directory Browsing)
  • HTTP錯誤(HTTP Errors)
  • HTTP記錄(HTTP Logging)
  • 記錄工具(Logging Tools)
  • 要求監視器(Request Monitor)
  • 要求篩選(Request Filtering)
  • 靜態內容壓縮(Static Content Compression)
  • IIS管理主控台(IIS Management Console)
  • 傳統 ASP伺服器:
  • ASP(ASP)
  • 要求篩選(Request Filtering)
  •  ISAPI擴充功能(ISAPI Extensions)
  • ASP.NET 伺服器:
  • ASP.NET(ASP.NET)
  • .NET擴充性(NetFxExtensibility)
  • 要求篩選(Request Filtering)
  • ISAPI(ISAPI)
  • ISAPI 擴充程式(ISAPI Extensions)

所有模組及描述可見 IIS 7.5 中的可用網頁伺服器 (IIS) 角色服務 說明


參考文章:
網頁

2012年6月1日

Security 項目

管理權限

用戶驗證

TIPS-SqlConnection的ConnectionString保密機制
http://blog.darkthread.net/post-2008-03-13-persist-security-info-in-connectionstring.aspx 

不要使用GET方式接收指令進行資料更新
http://blog.darkthread.net/post-2009-04-16-dont-use-get-ajax.aspx 

伺服器端驗證
http://blog.darkthread.net/post-2011-01-28-serverside-validation.aspx 






網頁安全事件列表
http://forum.icst.org.tw/phpbb/viewtopic.php?f=29&t=15921
Web, HTTPS(SSL) and XML Vulnerabilities
針對Web、HTTPS以及 XML的程式漏洞產生的攻擊


SQL Injection
SQL指令碼注入攻擊


Session Hijacking
Session劫持


Cross Site Scripting (XSS)
跨網站腳本攻擊(XSS)


Form Field Tampering
表單欄位字串竄改


Known Worms
已知蠕蟲


Zero Day Web Worms
Zero Day Web蠕蟲


Buffer Overflow
緩衝區溢位攻擊


Cookie Poisoning
在Cookie中下毒/竄改


Denial of Service
阻絕服務攻擊(DOS)


Malicious Robots
惡意機器人


Parameter Tampering
網頁程式參數竄改


Brute Force Login
暴力破解登入


Malicious Encoding
含惡意編碼的網頁


Web Server and Platform Attacks
Web服務軟體與作業系統弱點/漏洞攻擊


Directory Traversal
目錄遍歷漏洞、資訊泄露漏洞、非授權文件包含漏洞


Site Recon
網站掃描


OS Command Injection
系統指令碼注入攻擊


Cross Site Request Forgery(CSRF)
跨網站偽造請求,會將使用者導至偽造的網站(CSRF)


Google Hacking


Remote File Inclusion Attacks
遠端夾檔攻擊


Illegal Encoding
非法編碼


Credit Card Exposure
信用卡卡號外漏


Patient Data Disclosure
病患個人資料洩漏


Corporate Espionage
企業間諜


Phishing
釣魚式攻擊


Data Destruction
資料破壞

2012年5月31日

Security 資訊安全 2. Cross-Site-Scripting (XSS)

在留言或論壇文章等文字內容中,輸入了夾帶 javascript的文字,使得網頁在顯示內容時,順帶的執行其中的 javascript,進而對瀏覽此網頁的其他使用者造成影響。
沒有做 XSS防範措施的網頁,很容易因此就被掛上木馬等糟糕的內容。

所以,不能盡信使用者輸入的內容,最好在傳送前及顯示時,對使用者輸入的內容加做 html編碼解碼。

在 ASP .NET已經有功能強大的 Anti-XSS Library可以對付 XSS攻擊,目前最新的版本為 4.2版。


參考資料:
網站
 XSS(Cross Site Scripting)攻擊會讓您遺失Cookie中的資料
 [資訊安全]防範Cross-Site-Scripting(XSS)
PDF
 ASP.NET 防駭指南

2012年5月30日

Security 資訊安全 1. SQL Injection

SQL Injection是一種設計邏輯上的疏失造成的系統漏洞,不管用什麼程式語言、資料庫,都可能會中獎。
一個不小心,就足以讓整個系統門戶大開,赤裸裸的給人看光。

舉一個簡易的例子:
string selectCommand = 
@"SELECT UserName FROM UserAccount WHERE UserID='" + Request("UID") + "' AND UserPWD='" + Request("PWD") + "'";

如果輸入 UID為 ' or 1=1 --
這樣上方例子中的 SQL指令變成:
SELECT UserName FROM UserAccount WHERE UserID='' or 1=1 -- ' AND UserPWD=''";
就可以直接登入

如果管理者帳號為 admin,輸入 UID為 admin'--
SELECT UserName FROM UserAccount WHERE UserID='admin'-- ' AND UserPWD=''";

瞬間就可以以管理員權限登入,想做什麼就做什麼!!

再衍生下去則可以利用錯誤訊息獲得管理者權,停掉資料庫、刪除資料或卸除資料庫等,甚至取得伺服器主機管理權限等,不可不防。


另外,辛辛苦苦完成的網站上線後,若沒有做自訂錯誤頁面,直接暴露出所有 error、exception訊息,則使用者也可以利用錯誤訊息,摸透資料庫的內容,接著幹出一堆很邪惡很邪惡的事。
(詳細步驟可看 SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上))


重點!!
1. 過濾使用者輸入的資料。
2. 不要直接以字串串接組合出 SQL指令。
3. 不要把錯誤訊息顯示給使用者。


解決方式:
ASP .NET
  • 使用 Command物件或 SqlCommand類別,透過參數執行 SQL 語法。
  • 正式環境中,將 web.config內的 customErrors設為 "On"。
  • 在伺服器端檢查與限制輸入變數的型別與長度,過濾掉不需要的內容,不要完全信任使用者輸入的內容。
  • 登入 SQL Server的帳號不使用 sa或任何屬於 Sysadmin群組的帳號,避免有過大的權限。


參考資料:
網站
    SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上) (下)
    『資料隱碼』SQL Injection的源由與防範之道
    SQL Injection 緊急應變建議
PDF
    ASP .NET 防駭指南
    你的網站在裸奔嗎? 一個SQL Injection實例的啟示

2012年5月29日

趨勢科技 面試

自我介紹
專案

對資料庫,除了 SQL語法,還懂多少

MVC概念
執行流程圖
空專案 ... Global.aspx、Routing、...

List
輸入數字陣列  13, 2, 1, 5, ...
輸出偶數數字
foreach() {} ... 直接 remove 會當
for() {}... 移除2 下一個顯示 5

月曆
月份平移

JQuery選擇器

接別人的程式做維護等,要怎麼做,從哪裡開始切入 (寫test追蹤程式行為)

對新語言、新技術的上手速度、如何學習

抗壓性


Team Leader 註:

1. 自我介紹
2. 資料庫到Javascript間的實作
3. 自我學習Highcharts的經驗
4. ASP.Net的學習經驗
5. Web開發的經驗
6. 是否有參與系統分析
7. jQuery的學習經驗
8. 圖表的類型有哪些
9. 開發經驗中印象最深的事
10. 專案中如何存取資料(庫), ADO, SQL, etc.
11. Stored Procedure的經驗.
12. 請畫出MVC的架構
13. Server如何透過URL知道哪些Controller, Model, View該處理資料.
14. 請試從一個空的專案說明MVC的開發.
15. 除了ActionResult, 還有哪些可以回傳的ViewResult.
16. List<int> num = new List<int>(new int[]{13, 2, 1, 5, 6, 10, 7});
刪除偶數, print剩下的奇數. foerach的remove風險與for的實作.
17. 用月份推算是第幾季.
18. 假如7, 8, 9三個月是第一季, 推算的公式是.(年度亦要考慮)
19. 用jQuery取出div下所有class=classA.
20. 面試者反問.
21. 面試者對新東西的反應與興趣, 以及如何熟悉的方式.
22. 對於維護別人的程式, 會如何進行.



2012年5月28日

SQL Injection

今天在跟組長做面試練習時,組長問了怎麼防止 SQL Injection

我直接回答:不知道什麼是 SQL Injection

所以 組長 就簡單的解釋了一下 SQL Injection的做法

我頓時:哦 ~

然後在面試練習結束後,上網查了一下 SQL Injection
看到黑暗執行緒的 你的網站正在裸奔嗎? (裡面有個 pdf連結,下載來看)
才更清楚的了解了 SQL Injection的嚴重性

還好當初專案開發時就有被告知盡量不要用字串串接做 SQL查詢句

Interview Pratice

session multiple server
sessionstate
1. port
A B C - D(session server)  IP:port 導向同一台處理 session的 server

2. DB
用一個資料庫儲存server (ASPState),以空間去換

MVC
概念
MVC把 View抽離出來,能夠讓設計師方便使用
若只要動 View,就不用更動 Model、Controller
反正 Web Form要改就是全都要 (compile)
View裡就不會有一堆 asp tag,設計師可以專注在 html(html helper)、css、js
***YL: 對方並沒有要問 MVC的好跟 Web Form的不好

熟悉度
再寫一次 新增修改刪除,會快很多
但若要求不刷新頁面做新增修改刪除?



專案介紹
人數  功能數(model數、table數)  資料量  負責的功能
後台 C:42  M:52
前台 C:16  M:64+6+3
T: 55(data)+33(analysis)
資料: 17x萬

依照我回答的方式,對方的問題延伸會著重在資料庫數據處理部分
ex: 數據發生問題時,怎麼處理 (完整、正確)
***客戶會從你所描述的東西去延伸問題
***YL: 你會不會去幫客戶(全國)思考還需要什麼功能

若主機掛掉了怎麼辦
因為全國是在測試機上確認好程式都沒問題後才佈版到主機上
所以測試機上的資料會跟主機的一樣
把測試機上的資料還原到主機上就好


SQL injection
select *
from login
where u=" ' "+uid+" ' "
and pw=" ' "+upw+" ' "
如果 uid = " ' ' or 1=1 -- "
狠一點還可以再加 delete ... --
http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm

用 SQL parameter杜絕
where u=@uid and pw=@upw

雖有用 MD5對密碼加密編碼
但侵入者若是直接回傳 id跟 md5pw,那不就沒差?


為什麼沒有做購物車儲存的功能
客戶是拿其他的購物網站來比
回答: 商品數小、跟客戶談的結果是不需要,所以就沒有做這個功能
***從發問者的角度來思考對方想要知道什麼(YL:客戶真的想知道你的系統做了什麼?)
***從談需求的角度去回答問題,而非工程師一直線的往系統如何完成去思考

2012年5月25日

Interview Questions

Q:Session 、Cookie 如何選擇?  怎麼判斷何時該用?
      cookie將使用者資訊存在 client


      session將使用者資訊存在 server,使用者關閉 cookie功能,session仍可用
      關閉瀏覽器並重新開啟後,session 就會消失
      session 生存期限到時後,session 自動消失


  http://www.php5.idv.tw/bb-6243.htm

  使用Cookie機制
  瀏覽第一頁時,使用一個Cookie名稱紀錄你瀏覽過第一頁的一些資訊,
  瀏覽第二頁時,紀錄第二個Cookie名稱的一些資訊,瀏覽第三頁時,
  紀錄第三個Cookie名稱的一些資訊...依此類推。
  假設都要記錄Cookie,那麼每次瀏覽網頁,都會跟web Server溝通
  你有這些Cookie要處理。也就是你會傳送這麼多資料給Web Server。

  換成Session機制
  瀏覽第一頁時,僅使用一個Cookie紀錄Session ID,瀏覽第二頁時,
  也使用第一頁的那個Session ID,所有資料僅傳送這個Cookie遍可以
  記錄相關的資訊(存在server)。

  理論上第一個方式將會有比較大的流量,第二個則會比較少。
  而在安全性上,網頁動作每次傳送都會經過很多點,會被攔截,
  Cookie傳送的資訊通常清晰可見(很少人編碼後在傳送),
  而Session只是一個編碼id 資訊,資訊都是在Server上。
  所以通常Session通常運用在登入機制,Cookie則通常用在無關緊要
  的個人化習慣性機制。

安全性:session只需要在 cookie儲存一個 session id(或用 URL重寫),使用者資訊則存在 server,而 cookie卻是會記錄網頁的部分資訊
流量:


  嗯~~
  突然我想要加上一個功能
  就是一些會員資料可以隨時拉出來用
  保存在Session是一個方式
  但是Session的預設逾時值是20分鐘
  而且也挺浪費伺服器效能跟記憶體
  怎麼辦咧?
  我也不想一直從資料庫拉資料


  OK~
  那我利用Cookie來記錄好了
  Cookie是放在客戶端
  這樣也可以把負擔分攤給其他瀏覽者


  基本上別把一些很重要的資料寫到Cookie就好
  例如會員的密碼(明碼格式)
  免得被人竊取了會員的帳密
  不過千萬要記得Cookie如果沒有設定逾期的時間的話
  只要一關閉瀏覽器就失效了
  所以一定得注意
  ================說故事完畢=================
  其實最主要的就是注意點如下:


  Session ==> 資料是儲存在伺服器上,消耗的是伺服器的資源,
  並且預設逾時為20分鐘沒有操作就會失效


  Cookie ==> 資料儲存在客戶端上,可以減少伺服器的負擔,
  建議儲存一些不是很重要的資料使用,預設逾時為結束瀏覽器就結束


  http://blog.51yip.com/php/938.html



Q:用Session為何沒有意見?  (為何 PM能放心讓我們使用 session)
      (session存在哪?  用在多主機時會有甚麼問題?)

  http://www.heiqu.com/show-2910-1.html
  稍大一些的網站,通常都會有好幾個服務器,每個服務器運行著不同功能的模塊,
  使用不同的二級域名,而一個整體性強的網站,用戶系統是統一的,即一套用戶名
  、密碼在整個網站的各個模塊中都是能登錄使用的。
  各個服務器共享用戶數據是比較容易實現的,只需要在後端放個數據庫服務器,各
  個服務器通過統一接口對用戶數據進行訪問即可。但還存在一個問題,就是用戶在
  這個服務器登錄之後,進入另一個服務器的別的模塊時,仍然需要重新登錄,這就
  是一次登錄,全部通行的問題,映射到技術上,其實就是各個服務器之間怎麼實現
  共享 SESSION 數據的問題。

Q:MVC 有無幫助?好或不好在哪(對系統開發的幫助及壞處)? 若走回web form  抗拒在哪?




交易面
藍新說有打回交易資料給我們,我們的系統卻沒有記錄,何解??


價格預防機制
全國的員工只有測試機的 url,不會碰到線上主機
在測試機上都完成後才佈上線 (一季一次)


主機佈在雲端,我們對主機還需要付什麼責任??


客戶回報無法使用或交易失敗,如何追蹤錯誤?  圖表、交易


各個功能背後的用意是什麼??

REST:Representational State Transfer

因為 Service Stack裡面有提到 REST-ful

所以來研究一下

  1. http://zh.wikipedia.org/zh-tw/REST
  2. REST[轉貼]

  • 資源是由URI來指定。
  • 對資源的操作包括獲取、創建、修改和刪除資源,這些操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。
  • 通過操作資源的表現形式 (指定URI)來操作資源。


優點:
  • 可以利用緩存Cache來提高響應速度
  • 通訊本身的無狀態性可以讓不同的伺服器的處理一系列請求中的不同請求,提高伺服器的擴展性
  • 瀏覽器即可作為客戶端,簡化軟體需求
  • 相對於其他疊加在HTTP協議之上的機制,REST的軟體依賴性更小
  • 不需要額外的資源發現機制
  • 在軟體技術演進中的長期的兼容性更好


REST-ful Web API 定義:
  • URI。
  • Web服務接受與返回的網際網路媒體類型,如 json、xml等。
  • Web服務在該資源上所支持的一系列請求方法(如:post、get、put、delete)。

疑問:

  1. 在REST[轉貼]中提到,一般網址:
    http://www.some_site.com/user/find/123
    到了 REST會變成 :
    http://www.some_site.com/user/123  搭配 http的「Get」

    http://www.some_site.com/user/123  搭配 http的「Put」
    這兩個 REST的網址都長得一樣,那沒有動詞的 URL要怎麼知道現在是要做 get還是 put ??
  2. MVC是否符合 REST設計風格??


2012年5月23日

Service Stack Example_1 Hello

1.安裝 Service Stack:
透過 NuGet下載 ServiceStack.Host.AspNet 或 ServiceStack.Host.Mvc

2.開新專案

3.將 Service Stack套用至此專案  //加入參考 ServiceStack.dll
可分:希望有 Web Framework (host from the root path:/)
<location path="servicestack">
  <system.web>
    <httpHandlers>
      <add path="*" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack" 
           verb="*"/>
    </httpHandlers>
  </system.web>

  <!-- Required for IIS 7.0 -->
  <system.webServer>
    <handlers>
      <add path="*" 
           name="ServiceStack.Factory" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack" 
           verb="*" 
           preCondition="integratedMode" 
           resourceType="Unspecified" 
           allowPathInfo="true" />
    </handlers>
  </system.webServer>
</location>
          希望沒有 Web Framework (host web services at :/custompath)
<location path="servicestack">
  <system.web>
    <httpHandlers>
      <add path="*" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack"
           verb="*"/>
    </httpHandlers>
  </system.web>

  <!-- Required for IIS 7.0 -->
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <add path="*" 
           name="ServiceStack.Factory" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack"
           verb="*" 
           preCondition="integratedMode" 
           resourceType="Unspecified" 
           allowPathInfo="true" />
    </handlers>
  </system.webServer>
</location>

4.建立 Web Service

......吧啦吧啦一堆程式碼


5.在 URL中設定用不同的方式(檔案格式)呼叫 Web Service的方法
XML (POX), JSON, JSV, CSV urls:
/servicestack/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

Http post from data:
<form action="servicestack/xml/syncreply/Hello" method="post">
    <label>Name:</label>
    <input type="text" name="Name" value="World!">
    <input type="submit">
</form>


SOAP Web Service urls:
/servicestack/[soap11|soap12]







User defined REST-ful urls:
Accessible via any REST-ful urls defined using the [RestService] Attribute. e.g. in this case:
/servicestack/hello/{Name}



......待續

Service Stack

前幾天被 Cindy分派研究一下 Service Stack

嗯 ... 好難懂

目前稍微理解的有 Code-First是在幹嘛

還有 Service Stack的一個優點: 可以在 URL上做手腳,要求回傳的資料為 JSON、XML、HTML等多種格式

繼續研究

2012年5月18日

Highchart IE8的圓餅圖 無法輸出

解決方法:

打開 highcharts.src.js

找到
 /**
  * Override the base drawDataLabels method by pie specific functionality
  */
  drawDataLabels: function () { ...

在底下的

for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
    slots.push(pos);
}

改為

if (labelHeight == 0)
    labelHeight = halves[0][0].dataLabel.height;

for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
                        slots.push(pos);
}

在網頁中加入引用 highcharts.src.js