10/23/2013
5:50:00 PM 0

Javascript 判斷 property 是否存在

在 Javascript 常有人使用 if(car.engine) 來判斷是 property 是否存在, 雖然方便, 但會有出錯的風險, 因為在使用 if(car.engine) 時, 如果不是 boolean 時, Javascript 內部會做一個自動轉型的動作, 因此 if (car.engine) 就等於 if (Boolean(car.engine)),而 car.engine 是 undified 的狀況下, if 測試會回傳 fasle, 但是當 car.engine 其值為 null, fasle, 0, "" 也都會回傳 false

所以測試 property 是否存在, 比較正確的做法是使用 hasOwnProperty, 使用上要特別注意的是 hasOwnProperty 並不會到 prototype chain 去尋找, 只會檢查本身是否有定義 property
> var car = {};
undefined
> Boolean(car.engine);
false
> car.engine = "e1";
"e1"
> Boolean(car.engine);
true
> car.engine = 0;
0
> Boolean(car.engine);
false
> Boolean(null);
false
> Boolean(0);
false
> Boolean("");
false
> car.hasOwnProperty("engine");
true
> delete car.engine;
true
> car.hasOwnProperty("engine");
false
5:47:00 PM 0

Javascript null & undefined

1. null 定義 : 基本型別, 不代表任何值
primitive value that represents the intentional absence of any object value

null 參與數值運算時會轉成 0
> 123 + null
123
> 123 * null
0
2.undefined 定義 : 基本型別, 宣告後沒有指定值
primitive value used when a variable has not been assigned a value

undefined 參與數值結果都是 NaN
> 123 + undefined
NaN
> 123 * undefined
NaN

因此在 Javascript 中 null 和 undefined 是不一樣的東西, 使用上要注意
> typeof null 
"object"  //ECMAScript 6 後改成 primitive
> typeof undefined
"undefined"
> null == undefined //兩個等號測試結果會是 true
true
> null === undefined
false
10/16/2013
1:37:00 PM 0

Strong-Named Assemblies 簡介

Strong Name 主要是為 .NET Framework 軟體組件開發者設計的一種機制, 除非是軟體公司, 一般使用者應該不太會用到這個功能

主要概念與使用方式,用故事的方式說明

1.Super軟體公司開發出一個超強函式庫, 並使用 Strong Name Compile 出 Super.dll

如何產生 Strong Name 的組件,
可參考 http://msdn.microsoft.com/en-us/library/8wxf689z.aspx
或在 Visual Studio 使用 Signing 功能
其概念就是利用憑證簽署的方式, 對 Super.dll 做簽署, 最大的好處就是檔案無法竄改

寫 ASP.NET 的開發者在 Web.config 一定有看過類似下面的字串
System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
PublicKeyToken 就是用來識別組件是否有效的一個資訊

另外組件要安裝到 GAC(Global Assembly Cache), Strong Name 是安裝的必要條件!!

2.Grace買了Super的函式庫,並且將這函式庫使用在開發專案中
引用後我們可以在 Visual Studio 看到 Properties 視窗 Strong name 屬性設定為 true

識別組件是否使用 Strong Name 的方法 http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly-dl-is-strong-named

3.Grace將專案開發完成,並計畫向客戶展示這超炫的功能, 不懷好意的同事Jeff想要破壞這次Demo, 因此換掉了Super.dll, 但是因為 Super.dll 有使用 Strong Name, Grace 的專案 Compile 後的執行檔內已有包含 Super.dll 的 Strong Name 資訊, 因此 Super.dll 如果被抽換掉, 程式一執行就會拋出 FileLoadException

例外狀況資訊:
    例外狀況型別: FileLoadException
    例外狀況訊息: 無法載入檔案或組件 'Super.Library, Version=2.0.0.0, Culture=neutral, PublicKeyToken=60016b5bca463827' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040)

總結
使用 Strong Name 可避免檔案被竄改, 並可確保更新版本來自同一廠商, 提高了安全性
廣義來看有助於避免 DLL Hell
可參考 http://www.iiiedu.org.tw/knowledge/knowledge20021130_1.htm
http://msdn.microsoft.com/en-us/library/ms973843.aspx
10/11/2013
4:28:00 PM 0

HTTP basic access authentication

HTTP basic access authentication 是一個很基本的認證方式, 安全性差, 採用 Base64 編碼傳送帳號密碼

認證流程

1.瀏覽器對 Server 端發出請求

2.Server 端檢查該 User 尚未認證, 回應 Status Code 401 和 WWW-Authenticate 資訊在 header 中, 告訴瀏覽器需做基本認證

HTTP/1.0 401 Unauthorised
Content-Type: text/html; charset=UTF-8
WWW-Authenticate: Basic realm="TestSite"
Connection: Close
Content-Length: 24

3.使用者在瀏覽器畫面鍵入 User Name 和 Password 送出請求, 送出的 header 中, 接續在 Authorization: Basic 之後的文字, 就是帳號和密碼的 Base64 編碼

GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Authorization: Basic QWRDSpc3RyYXRVVVVSU=

4.Server 端認證成功則回應 Status Code 200, 若認證失敗, 則回到步驟 2

HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Connection: Keep-Alive
Content-Length: 989

有些 Server 在認證失敗時, 會修改 Status Code 401 的訊息, Reason Phrase 會因 Server 實作而有所不同

HTTP/1.0 401 Invalid credentials
Content-Type: text/html; charset=UTF-8
WWW-Authenticate: Basic realm="TestSite"
Connection: Close
Content-Length: 0

5.若使用者在認證視窗按下取消按鈕, 同樣回應 Status Code 401, 但 Reason Phrase 改為 Access Denied, 訊息部分會因 Server 實作而有所不同

HTTP/1.0 401 Access Denied
Content-Type: text/html; charset=UTF-8
WWW-Authenticate: Basic realm="TestSite"
Connection: Close
Content-Length: 24

HTTP 協定允許自定 Reason Phrase, 詳細可參考 http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1

使用C#程式做自動認證登入
String userName = "Administrator";
String password = "password";
String header = "Authorization: Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + password)) + System.Environment.NewLine;

webBrowser.Navigate(String.Format("http://{0}:{1}@127.0.0.1", userName, password), null, null, header);
10/07/2013
3:56:00 PM 0

將 ASP .NET MVC 2 deploy 到 IIS6

1.首先當然要確認 ASP .NET 版本


2.新增副檔名對應(主目錄頁簽 \ 設定按鈕)

執行檔選擇對應版本的檔案 C:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

3.設定萬用字元應用程式對應

執行檔選擇對應版本的檔案 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
確認該檔案是否存在不可打勾

參考
Using ASP.NET MVC with Different Versions of IIS
10/01/2013

Amdahl's law

wikipedia => http://zh.wikipedia.org/zh-tw/%E9%98%BF%E5%A7%86%E8%BE%BE%E5%B0%94%E5%AE%9A%E5%BE%8B

假設我們用時間來做為評估效能的指標,如果要提升效能,最有效益的方式,就是直接改善執行時間最長的那個部份

例如

台灣用電的比例
工業    52%
服務業  19%
住宅    18%
其它    11%

如果要求住宅隨手關燈,購買節能家電,各種節電措施,就算改善了2%,對整體用電的改善,還是遠遠不及佔用電最大比例的工業用電改善1%