解說 FTP Protocol 的運作原理

我想 FTP 可能有人每天都在用,但卻很少人知道 FTP 運作原理,更尤其是在連不上 FTP 的時候常常都是一頭霧水,在問別人時也可能會發現有人可以連、有人不能連,有的人連的上可以登入成功但是卻無法列出檔案清單,種種的問題只要能了解 FTP 的運作原理就可以很輕易的了解問題出在哪裡,進而解決問題。

基本觀念

使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連線通道:

  • 一個為指令通道(Command Channel),預設使用 Port 21 建立連線,用來傳輸 FTP 指令,例如:列出檔案清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、......等。
  • 另一個為資料通道(DATA Channel),預設使用 Port 20,但是會因 FTP Client 選擇使用的「連線模式」不同而有所不同。

一般來說,指令通道的連線與下指令都沒有什麼問題,有問題的通常是在資料通道的建立,而資料通道的建立方式是由 FTP Client 所下的指令決定的,以 FileZilla 設定為例(如下圖):

image

FTP Client (e.g. FileZilla) 每次建立連線時都會下 PORT 或 PASV 指令,如下範例:

指令:    PASV
回應:    227 Entering Passive Mode (59,37,124,43,158,251)

而每次下指令傳輸資料時,都會建立一次 data connection,包括取得遠端的檔案清單(LIST)時回傳的檔案列表、下載檔案、或上傳檔案。

連線模式

FTP 的連線模式分兩種:主動模式 ( Active mode ) 與 被動模式 ( Passive mode )

  • 主動模式 ( Active mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PORT 指令提出 DATA Channel 連線的要求,如下:

指令:    PORT 10,18,53,171,17,114
回應:    200 Port command successful.

這裡的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出連線到 FTP Client 的主機,而 PORT 指令後的參數說明如下:

  • 前四個數字是 FTP Client 的 IP 位址:10.18.53.171
  • 後兩個數字是 FTP Client 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Client 接受的連線埠號是 17 * 256 + 114 = 4,466

由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的連線到 FTP Client 的主機,所以現在大部分的連線模式幾乎都建議使用者使用被動模式(Passive mode)。

  • 被動模式 ( Passive mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PASV 指令提出 DATA Channel 連線的要求,如下:

指令:    PASV
回應:    227 Entering Passive Mode (59,37,124,43,158,251)

你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 回應的時候出現了 (59,37,124,43,158,251) 字串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連接至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中 (59,37,124,43,158,251) 的說明如下:

  • 前四個數字是 FTP Server 的 IP 位址:59.37.124.43
  • 後兩個數字是 FTP Server 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Server 可接受的連線埠號是 158 * 256 + 251 = 40,699

由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定使用者是否可使用主動模式連線,但若改使用被動模式連線的話,就幾乎能讓所有人正常的使用 FTP 服務。

其他資訊

  • 在 IIS 的 FTP 服務中,當使用 Passive mode 時,IIS FTP 會自動開啟短暫的 Port 用以建立 DATA Channel 供 FTP Client 連接,IIS 預設會動態使用 Port 1024 ~ 65535 進行 DATA Channel 的連線,若要修改預設的 Port Range 可以參考我昨天的文章:如何調整 IIS FTP 在 Passive mode 使用的 Port Range
  • 在 Linux kernel 中,若有設定 MASQ 的話,Kernel 已經支援「動態開啟 FTP DATA PORT」功能,也就是說在 FTP Client 端在 NAT 內部也能以 Active mode 使用 FTP,這就是為什麼有些人在公司內部使用虛擬 IP 也能夠使用主動模式(Active mode)傳輸檔案的情形。

相關連結

  

此文章由 will 發表於 2008/6/29 下午 11:55:41

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: IIS | Linux | 心得分享 | 系統管理

標籤: ,

收藏:

將 Outlook 寄出的郵件儲存在原本回覆信件的資料夾內

我最近找到了一個 Outlook 的設定,可以不用將所有寄出的郵件放在「寄件備份」資料夾內,而是當回覆信件的時候,所寄出的郵件會自動儲存在原本信件所在的資料夾內。

我以往都沒有特別思考過為什麼寄出的郵件都要放在寄件備份裡,因為有時候還挺不方便的,有時後我在回顧過去郵件查資料的時候,會想找出該郵件曾經回覆給誰、何時回覆的,雖然我們可以點開郵件後點選郵件上方的資訊列,點擊「尋找相關訊息」搜尋,不過像我的「寄件備份」裡就有 3 千多封信,用 Outlook 內建的郵件搜尋功能來尋找相關訊息速度非常的慢。

用 Outlook 內建的郵件搜尋功能來尋找相關訊息

所以我調整了一下我 Outlook 的選項設定,如下圖點選「電子郵件選項」進去:

開啟 Outlook 選項設定

然後再點選「進階電子郵件選項」進去:

點選「進階電子郵件選項」進去

最後就勾選「回覆時在資料夾保留原郵件內容」即可:

image

不過這個選項在 Outlook 英文版的翻譯是 "In folders other than the Inbox, save replies with original message",也就是說如果你在「收件夾」回信的話,郵件還是會儲存到「寄件備份」去的,這點要特別注意,因為你可能會在「收件夾」測試這個功能試到抓狂!

而之後你可以設定不同的「檢視/排列」方式,將他切換到「交談主旨」模式,Outlook 就會自動將你的郵件依據交談主旨群組在一起了:

檢視/排列,切換到「交談主旨」模式

切換「交談主旨」過去後的郵件排列方式就會變成如下圖的樣子:

切換「交談主旨」過去後的郵件排列方式

我感覺這樣的排列比較有意義一點,下次就不用到處尋找郵件了。

  

此文章由 will 發表於 2008/6/22 下午 03:00:19

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Office | 心得分享

標籤:

收藏:

鬼打牆事件之『ASP.NET 無法刪除 Cookie 的問題』

先將我的執行環境說明一下:

  • 我有兩個網站,網域分別為 www1.domain.com 與 www2.domain.com
  • 自己實做單一簽入(Single Sign On, SSO)的機制,並透過 Web Service 進行網站會員登入、登出
  • 兩個網站共用同一組 Cookie 用以儲存 SSO 的 Token,且明訂 Cookie 的 Domain 為 .domain.com

我今天聚焦在「登出」這個簡單的功能就好,實作登出是在簡單不過的機制了,就是把 Cookie 清除掉就好啦!不過要是跟我一樣遇到 ASP.NET 怎樣也清除不掉 Cookie 的情況,那就真的是「鬼打牆」了,而且若要問人家:「請問 Cookie 要怎麼樣才能刪除掉?」這種問題問別人真的會被笑,也不知道怎麼開口。

因為我要共用 Cookie 在兩個網域,所以我的 Cookie Domain 是 .domain.com,所以照理說清除 Cookie 的方法應該是:

Response.Cookies["Token"].Expires = DateTime.Now.AddYears(-1);

或者是

Response.Cookies["Token"].Expires = DateTime.Now.AddYears(-1);
Response.Cookies["Token"].Domain = ".domain.com";

或者是

Response.Cookies["Token"].HttpOnly = true;
Response.Cookies["Token"].Expires = DateTime.Now.AddYears(-1);
Response.Cookies["Token"].Domain = ".domain.com";

反正能試的都試了,而且以我對 HTTP 底層協定的了解,幾乎在 Web 領域沒有什麼問題是無法解決的,但今天遇到 Cookie 清不掉這個問題,真的讓我滿面愁容,程式越寫越氣,用 Fiddler2 看 HTTP 封包看了幾十遍,就是看不出有任何問題,但 Cookie 就是殺不掉。

但是這問題非得要研究出來不可,就因為這個「無法登出」的「小問題」搞了我快 5 個小時才弄清楚所有來龍去脈,所幸問題有被我追根究柢的解決了,以下是要解決此問題的完整解法:

  • 若要清除跨 Domain 的 Cookie 必須清除兩次,例如說使用者在 www1.domain.com 要執行登出動作,必須要先將 Domain 為 www1.domain.com 的 Cookie 給清除掉,在接著將 Domain 為 .domain.com 的這個 Cookie 清除掉。
  • 因為這兩個 Cookie 為「同名」,全部都叫做 Token,所以無法在一個 HTTP Request 中清除掉兩個同名的 Cookie,所以必須要在不同的兩個 HTTP Request 中個別刪除不同 Domain 的 Cookie。

例如說:你必須先連到 Logout.aspx 頁面,在此頁面先將第一組 Cookie 清除:

HttpCookie cookie = new HttpCookie("Token", ""); 

cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddYears(-1); 
cookie.Domain = Request.Url.Host;
Response.SetCookie(cookie);

Response.Redirect("Logout2.aspx", true);

然後再轉址到 Logout2.aspx 將 Parent Domain 的 Cookie 給清除掉:

HttpCookie cookie = new HttpCookie("Token", ""); 

cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddYears(-1); 
cookie.Domain = ".domain.com";
Response.SetCookie(cookie);

Response.Redirect("index.aspx", true);

這樣就可以徹底將 Cookie 給清乾淨了,這真是難得的經驗,從沒想到有這種解法,不知道網路上有沒有其他人遇過跟我同樣的問題?

而我的登出程式最後是改成以下這段 Code,濃縮再一支程式裡:

protected void Page_Init(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 

    HttpCookie cookie = new HttpCookie("Token", ""); 

    cookie.HttpOnly = true;
    cookie.Expires = DateTime.Now.AddYears(-1); 

    if (Request.QueryString["domain"] == null)
    {
        cookie.Domain = Request.Url.Host;
        Response.SetCookie(cookie);
        Response.Redirect("Logout.aspx?domain=1"), true);
    }
    else
    {
        cookie.Domain = ".domain.com";
        Response.SetCookie(cookie);
        Response.Redirect("index.aspx", true);
    } 
}
  

此文章由 will 發表於 2008/6/4 下午 08:44:02

永久連結 | 評論 (5) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C# | Web | 心得分享

標籤: , , ,

收藏:

BlogEngine 1.3.0.0 出現嚴重安全性漏洞

如果有人使用 BlogEngine 1.3.0.0 版本的話,可能需要「立即」將你的版本升級至 BlogEngine 1.3.1.0 版,因為 1.3.0.0 有個嚴重的安全性漏洞可以將該網站所有使用者的帳號、密碼下載。這問題連 BlogEngine.NET 官方部落格 都被駭了。

我原本不想將這個漏洞的細節說的太清楚的,因為說的越清楚可能就會有越多人遭殃,不過這應該也是一場機會教育吧,所以我還是多說明一些好了,反正有使用 BlogEngine 1.3.0.0  Blogger 趕快升級就是了,如果自己改過很多程式的話,其實只要更新 DotNetSlave.BusinessLogic\Web\HttpHandlers\JavaScriptHandler.cs 這支程式就可以了,在這支程式的 RetrieveLocalScript 方法改掉即可。

原本的程式碼是這樣:

private static string RetrieveLocalScript(string file)
{
    string path = HttpContext.Current.Server.MapPath(file);
    string script = null;

    if (File.Exists(path))
    {
        using (StreamReader reader = new StreamReader(path))
        {
            script = reader.ReadToEnd();
            script = StripWhitespace(script);
            HttpContext.Current.Cache.Insert(file, script, new CacheDependency(path));
        }
    }

    return script;
}
然而在這個方法前面多加上幾行即可:
private static string RetrieveLocalScript(string file)
{
    if (!file.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
    {
        throw new System.Security.SecurityException("No access");
    }

    string path = HttpContext.Current.Server.MapPath(file);
    string script = null;
    
    using (StreamReader reader = new StreamReader(path))
    {
        script = reader.ReadToEnd();
        HttpContext.Current.Cache.Insert(file, script, new CacheDependency(path));
    }

    return script;
}

這問題主要是出在 js.axd 這支 HttpHandler,因為沒有將下載的路徑處理好,導致可以讓任何人透過這支Handler下載網站上任意檔案,包括 web.config 與網站內所有任意檔案,這問題我們在之前也犯過一次,但那一次發現就已經很震驚了,因為所有定義在 web.config 的資料庫連線參數、密碼都被看光光,不得已只好將所有帳號、密碼全部重設!

若有人剛開始寫 HttpHandler,並且是用 HttpHandler 下載檔案的人,一定要特別特別留意這個問題,多做一些檔名的判斷才能防止漏洞產生,例如說檔名中不能任意指定其他路徑名稱,你可以多判斷檔名中是否有 / 或 .. 等字元的出現。

剛剛花了兩個小時小心翼翼的將版本升級,因為我自己 Patch 了不少原本就有的 Bug,真怕升級後問題又出現,所以也把每一支更新的程式都看過一遍,還好我有用 Subversion 做版本管理,不然每次升級都要看完所有程式碼那還真的要熬夜了。

另外,我也透過 LogParser 工具幫我找出到目前為止有幾個人透過這個漏洞看到我的密碼了(還好我發現的早沒人看過),在此分享我的 LogPaser 指令,方便部落客查一下 IIS 的 Log,以進行確認有沒有人看過你的密碼了,如果有人看過了就趕快換密碼吧!以下是查詢的步驟:

  1. 先下載安裝 LogParser
  2. 進入命列提示字元 ( 開始 -> 執行 -> cmd.exe )
  3. 切換至你網站的 IIS Log 目錄,例如:C:\WINDOWS\system32\LogFiles\W3SVC1137020394
  4. 執行 LogParser 指令將篩選過的資料匯出:
    LogParser "SELECT date, time, cs-uri-stem, cs-uri-query, c-ip, cs(User-Agent) FROM *.log WHERE cs-uri-stem like '%js.axd%' and cs-uri-query like '%users.xml%'" -i:W3C -o:CSV

    輸出的結果大概長這樣,如果有可疑的IP那就是中標啦! (P.S. 底下的IP是我亂打的):
    2008-04-15,13:54:05,/js.axd,path=/app_data/users.xml,127.198.10.85
    2008-04-15,13:54:19,/js.axd,path=/app_data/users.xml,129.218.2.1
    2008-04-15,14:17:46,/js.axd,path=/app_data/users.xml,182.232.123.123
    
    Statistics:
    -----------
    Elements processed: 310655
    Elements output:    4
    Execution time:     8.72 seconds

相關連結

  

此文章由 will 發表於 2008/4/16 上午 12:38:00

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C# | 心得分享

標籤: , ,

收藏:

加快 Visual Studio 執行速度與提升工作效率

之前常聽到有人說他們在開發的時候,很大一部份的時間是用來「等待」Visual Studio 回應,這對程式開發的生產力的確是一大殺傷力,今天我要分享一些我自己加快 Visual Studio 執行速度的心得:

主機硬體與作業系統

  • CPU
    • 越快越好
  • 記憶體
    • 至少 2G 以上
    • 如昨天的文章 介紹好用工具:Gavotte Ramdisk 寫到的,記憶體夠大的可以切大約 512MB 出來當記憶體磁碟(RamDisk),將 ASP.NET 的暫存編譯目錄移至 RamDisk 下。
  • 硬碟
    • 硬碟的轉速一定要快
    • 或是採用 RAID 0 - Stripping 磁碟陣列,建議用硬體式的 RAID 卡
    • 定期做磁碟重組也會提升硬碟讀取效率
  • 螢幕
    • 越大越好
    • 螢幕越大工作效率越高
  • 應用程式
    • 在開發程式的時候,最好不要開啟會高度讀寫硬碟的程式,例如:
      • Outlook
      • Windows Desktop Search 或 Google Desktop Search ( 可暫時關閉即時索引功能 )
      • MSN ( 連絡清單多的時候讀寫會蠻頻繁的 )
      • 防毒軟體 ( 有時後我會暫時關閉 )
    • Internet Explorer
      • 說實在的,我的 IE 常常會莫名其妙的掛掉,尤其是目前如果開了好幾的視窗,而 Visual Studio 按下 F5 進行編譯與除錯時,這時的 IE 肯定掛掉,而我的解決方法竟然是透過設定停用指令碼除錯辦到的,反正 JavaScript 除錯對我來說還蠻容易的,不太需要開啟。

Visual Studio 2005/2008 開發環境設定 ( 我用的是英文版 )

  • 啟動設定
    • 可以用指令列啟動 Visual Studio 並加上 /nosplash 參數,讓 Visual Studio 不要出現 Splash Screen
      • devenv.exe /nosplash
      • P.S. 我個人是透過 WinKey 設定 Win + A 啟動 Visual Studio,啟動參數是直接設定在 WinKey 裡的。
  • 環境設定
  • 選項設定 ( Tools -> Options )
    • Environment -> General
      • 取消勾選 Animate environment tools
    • Environment -> Startup
      • 修改 At Startup 下拉選項到 Show empty environment
    • Projects and Solutions
      •  取消勾選 Track Active Item in Solution Explorer
    • Text Editor -> General
      • 取消勾選 Track changes
  • 操作技巧
    • 快速鍵
      • 多背一些快速鍵吧! 有背與沒背效率差很多! 
      • 一定要會的快速鍵 
        • F1 : 啟動 Document Explorer
        • F2 : 更名
        • F3 : 尋找下一筆
        • Shift + F3 : 尋找上一筆
        • F4 : 開啟屬性視窗
        • F5 : Build & Run
        • F6 : Build
        • F7 : View Code
        • Shift + F7 : View Designer
        • F9 : 插入中斷點
        • F10 : Step Over (單步執行)
        • F11 : Step Into (單步執行 & 進入副程式)
        • F12 : Go to Definition ( 移至定義 )
        • Shift+Alt+Enter : 將程式碼視窗變成全螢幕
        • Ctrl + E + C : 註解
        • Ctrl + E + U : 取消註解
        • Ctrl + E + D : 格式化文件
        • Ctrl + E + F : 格式化選取文字的部分
        • Ctrl + I : 遞增搜尋 
        • Ctrl + F : 尋找
        • Ctrl + Shift + F : 在檔案中尋找
        • Ctrl + H : 取代
        • Ctrl + Shift + H : 在檔案中取代
      • 提高大量重複工作時的生產力
        • Ctrl + Shift + R : 錄製巨集 / 停止錄製 ( 錄製還會儲存到暫存的巨集 )
        • Ctrl + Shift + P : 執行暫存的巨集
        • Alt + F8 : 開啟 Macro Explorer
    • 在 Solution Explorer 視窗
      • + : 展開一層目錄
      • -  : 收合一層目錄
      • *  : 展開所有目錄
    •  在 Toolbox 視窗
      • *  : 展開所有工具列
      • /   : 收合所有工具列
      • 左鍵 : 收合一層
      • 右鍵 : 展開一層
  • 安裝 Visual Studio 外掛程式
  • 其他技巧
    • 如果只是要執行看看你當寫的 Code 是否正確執行 ( 沒有要除錯的話 ) 就不要按 F5 啟動專案,建議用 Ctrl + F5 啟動比較快,也比較不容易當掉。
    • 有人提到刪除 C:\Documents and Settings\Administrator\Application Data\Microsoft\VisualStudio\8.0\windows.prf  這個檔案會使 Visual Studio 2005 跑得更順,我是沒試過,有興趣的人可以試試。

其他開發工具

  • WinKey - 自訂 Win Key 快速鍵
  • grepWin - 搜尋與取代的工具
  • StExBar - 批次更名與快速開啟 Command Window

真的很多,其實還有更多,實在寫不完,有時間的話我會再回來整理這篇文章。 若有人可以建議不錯的工具或技巧,也歡迎留言給我喔! ^_^

 

  

此文章由 will 發表於 2008/4/6 上午 12:05:00

永久連結 | 評論 (3) | 此文章的RSSRSS comment feed |

分類: Visual Studio | 心得分享

標籤: , ,

收藏:

我當選 Microsoft MVP 了 ( ASP/ASP.NET )

Will 保哥於 2008 年 4 月獲得微軟技術社群暨最有價值專家 第七屆第三回合微軟「最有價值專家」(Most Valuable Professional, MVP),主要得獎領域是在 ASP/ASP.NET 技術與線上社群部分。昨天晚上收到微軟的來信,說我獲得了 Microsoft MVP 肯定的獎項,全名還蠻長的:微軟技術社群暨最有價值專家 第七屆第三回合微軟「最有價值專家」(Most Valuable Professional, MVP),主要是在 ASP/ASP.NET 技術社群的部分獲獎的。

收到的當下還蠻驚訝的,因為我參與社群時間並不長,大約從去年 10 月才開始,且我的 Blog 也是從那時才開始寫的,到今年一月的時候想說申請 MVP 看看,申請不到就算了,結果竟然第一次申請就中,還蠻開心的。^_^

這段時間我貢獻許多知識在我的部落格與微軟技術社群討論區,我發現本身擁有知識所產生的價值有限,分享出去之後才發現獲得的更多。這些年來我不斷學習新知,累積的 Know How 多到無法整理,大多數的知識都很片段,也無法分享、更無法傳遞,在帶技術團隊的時候就會發現一直在花時間在表達你想傳遞出去的知識與技術,遇到不同的人就要重複講一遍,而且未經整理的資訊也是很難吸收的,除非對方跟你有相同的背景與基礎知識。當然,知識是會「過期」的,現在不分享,以後可能就沒用了。

我還蠻鼓勵技術人員有寫筆記的習慣,主要目的是幫助自己整理思緒,甚至於可以寫下某些特定技術的標準作業流程(SOP),避免下次遇到同樣的問題又要重新研究一遍,像我個人這幾年就整理了快上千條工作心得與技術筆記,每次遇到問題都可以用最短的時間解決,這也有另一個名詞,叫做:PKM ( 個人知識管理, Personal Knowledge Management )。

總之,還是很開心啦,跟大家分享我的喜悅。

  

此文章由 will 發表於 2008/4/3 上午 12:02:00

永久連結 | 評論 (6) | 此文章的RSSRSS comment feed |

分類: 心得分享

標籤: , ,

收藏:

在 Visual Studio 中搜尋文字的多種選擇

在 Visual Studio 中搜尋文字有許多選擇,今天介紹許多好用的搜尋技巧。

第一種大家耳熟能詳的,就是用 Ctrl + F 立即開始搜尋 ( Quick Find ),你可以選擇「目前文件(Current Document)」、「所有開啟的文件(All Open Documents)」、「目前專案(Current Project)」或「整個方案(Entire Solution)」,如下圖:

   

我個人在專案開發上雖然對這個功能很依賴,但有時後也蠻討厭的,因為每次都會跳出一個 Find and Replace 的視窗讓我選,大部分的時候我只是要搜尋目前文件的文字而已,沒必要每次都選擇這麼多選項,且你上一次搜尋 Current Project 的話,這次想搜尋 Current Document 就要重選一次 Look in 欄位,我自己是覺得蠻麻煩的。

第二種很特別,就是按下 Ctrl + / 快速鍵可以進入 command line 視窗, 直接輸入要查詢的文字後按下 Enter 就可以搜尋了,也可以連續按 Enter 搜尋下一筆,也可以按下 Shift + Enter 往上搜尋,真的很方便喔!

    按下 Ctrl + / 快速鍵可以進入 command line 視窗

除此之外,還可以利用 command line 視窗執行一些常見的 Macro 指令,你只要按下 Ctrl + / 之後先輸入一個大於符號 ( > ) 就可以輸入或選擇巨集了,像我最常用的指令有兩個:

>op           開啟專案

>of            開啟檔案

你如果有自訂的巨集(Macro)也可以用這種方式快速啟動!

第三種搜尋方式也是我蠻常用的,叫做 "遞增搜尋 (Incremental Search)",快速鍵是 Ctrl + I ,按下去之後畫面的正中央匯出線一個「望遠鏡」的圖示,如下圖示:

    遞增搜尋 ( Incremental Search )

出現之後就可以直接輸入關鍵字,打幾個字他就搜尋幾的字,只要有找到就會跳到那個地方去,直到按下 Esc 按鍵才會停止搜尋,如果你要搜尋下一個的話,可以直接按下 F3 或連續按下 Ctrl + I 就會重複上一次搜尋的關鍵字了繼續搜尋下一筆,如果要「往上搜尋」的話,可以按下 Shift + F3 或 Shift + Ctrl + I 即可。

以上就是快速搜尋「目前文件」的方式,應該是蠻實用的。

除了這些以外,還有很多「搜尋整個專案」的進階搜尋方式,例如說按下 Ctrl + Shift + F 會開啟 Find in Files (在檔案中尋找) 的視窗,可以過濾特定副檔名去搜尋,在專案檔案很多的時候很實用,例如說我想要找出所有 *.aspx , *.ascx 與 *.master 的檔案中有出現 Check.aspx 字串的地方,就可以透過 Find in Files 過濾特定副檔名, 你可以在 Look at these file types 中輸入多個過濾規則,並用分號 ( ; ) 分隔即可,如下圖示:

   

找到之後,就可以在搜尋結果視窗用滑鼠雙擊(Double Click)搜尋的結果行,檔案就會自動開啟並將游標直接定位到你搜尋到的那個字串前面!

    可以在搜尋結果視窗用滑鼠雙擊(Double Click)搜尋的結果行,檔案就會自動開啟並將游標直接定位到你搜尋到的那個字串前面

也可以在搜尋結果視窗選取多行,然後按下 Enter 鍵就會自動將你選取的所有檔案自動開啟,並將游標直接定位到你搜尋到的那個字串前面,這樣一來可以很方便的快速編輯搜尋到的文字。

    也可以在搜尋結果視窗選取多行,然後按下 Enter 鍵就會自動將你選取的所有檔案自動開啟,並將游標直接定位到你搜尋到的那個字串前面,這樣一來可以很方便的快速編輯搜尋到的文字

 

  

此文章由 will 發表於 2008/3/30 上午 12:00:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 心得分享 | Visual Studio

標籤: , ,

收藏:

ASP.NET 2.0 學習心得分享與推薦書單

在推薦書單之前,我想先分享一些學習的經驗,讓有有經驗、有潛力的程式設計師能夠快速上手,但針對缺乏程式設計經驗的人來說,這裡的建議也是有幫助的,只是需要更多時間看書、寫 Code、除錯、除錯、再除錯、然後改 Code、改 Code、再改 Code,改到自己滿意為止。

對於讀書這件事來說,沒人可以強迫你讀書的,一定要強烈的動機靜下心來讀,若不能自動自發有規律的吸收新知,進步是有限的。但我也相信有許多人不看書是因為網路資訊太多,有需要上網找就好,不過我是覺得網路資訊不連貫,若要串連起完整的觀念需要一段時間(可能好幾年),但透過書籍卻是有很清楚的知識脈絡可以遵循,我是覺得比較容易得到全面的資訊,但每個人的觀念見仁見智,你只要覺得有吸收到想知道的也行。

首先,我認為一直寫 Code 而不看書是不實際的,這樣的寫 Code 過程必須面對許多因為觀念不對而導致寫錯程式的狀況,必須不斷的嘗試錯誤、上 Google 查資料、改寫、Debug、完成,也許 Try and Error 的過程很有趣,是可以不斷的驗證自己的理解能力很強,成就感也很高,但是我個人認為過多的 Try and Error 是很浪費生命的。沒有完整的觀念會導致寫程式缺乏效率,光是查資料就花了許多時間,因為不斷打字也會對你的手造成負擔。雖然這種「一步到位」的寫程式不太可能,不過可以當成一個目標來追尋,等你的程式設計功力越來越強,就會感覺越來越深刻。

我知道大部分程式設計師都很忙,都在忙著寫 Code,真要讓所有人想清楚再寫是不太可能的,所以大多數的人都一樣先寫了再說,最後如果有時間再重整自己的程式碼,因為程式設計師都是蠻懶的,所以我還蠻懷疑有幾個人會主動重整自己的程式碼,大多應該是沒出 Bug 就得過且過吧!不過會自己主動重整自己程式碼的人大多是有潛力的人才,有沒有重整過看 Subversion 的 Log 就知道了。

簡言之,擁有豐富的基礎知識(例如: .NET 基礎觀念)不管對你寫程式來說或是學習新知,速度都會比較快,像我現在一個晚上花兩小時大約可以看 50 頁的技術原文書,五年前的我大概只能看 10 頁,我現在每天也都會上網看一些國內外知名的 Blog 文章,充實新知的速度也是慢慢培養訓練出來的。

想學習 ASP.NET 2.0 (以上),多少還是需要充實 .NET 的基本觀念,我會推薦由悅知文化出版的 Microsoft .NET Framework 2.0 應用程式開發基礎 系列,共兩本:

我學習 ASP.NET 2.0 進步最多的時候是看了一本名叫 Professional ASP.NET 2.0 Special Edition 的書,當初是先看到電子書,在某一個週末一口氣把整本書看完 (將近 1,500 頁),看這本書的時候我已經寫 ASP.NET 一年多了,對 ASP.NET 只瞭解一些些,大多是工作上用的技術範圍到才會去瞭解,且當時的中文書也都寫的很粗淺,很多經驗都是自己 Try and Error 出來的,但看完這本書後覺得寫的太好了,對於 ASP.NET 的各個領域都講解的很完整,雖然每個章節所提到的技術沒有很深入,但是夠全面,對初學者來說是個不可多得的好書,當時就是覺得電子書很難標記重點,所以就把原文書給買回來了,然後貼了一堆標籤在上面,但過了幾個月後才發現中文翻譯書已經出來了,但是只有翻譯這本書的一半而已,直到最近又出了另一本下集,有興趣的人可以去買來看。

如果你已經有點 Web 的開發經驗,也可以考慮底下這兩本書,可以幫你補強許多 ASP.NET 基本觀念,這兩本書中有許多印刷錯誤的地方喔,看書的時候不要「照單全收」,最好都要認真思考過,否則可能會被誤導:

而最近剛看完一本書 Programming Microsoft® ASP.NET 3.5 (原文書),這本書的作者 Dino Esposito 文筆很好,英文用詞淺顯易懂,很容易閱讀,書中提到的大部分都跟 ASP.NET 2.0 差不多,但是卻講了許多在開發實務上才會用到的細節與小技巧,我覺得很實用,有些壓根沒想到的用他他都有提出來討論,還有書中的許多備註的地方 ( Note ) 都有很多好東西,一定要看。

剛那本 Programming Microsoft® ASP.NET 3.5 看完後欲罷不能,又去買了 Dino Esposito 的另一本書叫做 Programming Microsoft® ASP.NET 2.0 Applications: Advanced Topics,當然也寫的不錯,只是這本已經非常進階了,如果你不熟 .NET 基礎的話,應該是看不下去的。

最近也剛在看一本書叫做 Developing More-Secure Microsoft® ASP.NET 2.0 Applications,才剛看完兩章而已,看的速度有點慢,但是很過癮,會讓你更加瞭解 ASP.NET 2.0 運作的所有細節,讓你開發出來的 ASP.NET 2.0 網站更加的安全、可靠、有效率。

現在 ASP.NET 3.5 越來越熱門,我們也已經都全面採用 ASP.NET 3.5 開發了,技術轉換的幅度不大,應該很容易上手,主要是針對 LINQ 語法的熟悉與 ASP.NET 3.5 的控制項,還有 LINQ to SQL 的部分都能夠掌握的話,就差不多夠了。

最後,就是多訂閱一些國內外知名的 Blog,每天吸收一些新知,還有我的 Blog 一定要每天看,以前的文章每一篇也都要看,包你功力大增。

 

  

此文章由 will 發表於 2008/3/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | 心得分享

標籤: , , ,

收藏:

保哥的軟體哲學

我本身帶領軟體開發團隊一段時間了,且近幾個月也在微軟技術社群討論區參與社群討論,偶爾會看到有人詢問一些軟體開發的觀念與學習的方法,我個人大致整理了一下這幾年來的心得,大略列出幾點跟大家分享:

保哥的軟體哲學(1)

在團隊中不一定要做老大,但有機會的話不要做老二,培養領導能力,學習如何建立團隊,這經驗不是每個人都有機會能得到的。 

保哥的軟體哲學(2)

培養負責任的態度,如果真的不適合寫軟體,也可以做一段時間再轉行,因為寫軟體可以培養你的邏輯思考能力。

保哥的軟體哲學(3)

有時間就多想:軟體只要規劃的好,可以節省10倍以上的開發時間。

沒時間就多做:連想的時間都沒有的話,就從寫 Code 的手感中尋找下一個靈感。

保哥的軟體哲學(4)

沒觀念就多看書,但有觀念者還是要多寫Code累積自信,寫軟體的自信是一行一行的 Code 累積起來的!

保哥的軟體哲學(5)

沒經驗就多做事、少抱怨,但有經驗者要少寫 Code 多思考 (但還是不能常抱怨)

// 做事 = 寫 Code

保哥的軟體哲學(6)

寫程式是很「個人」的事,寫程式的品質直接影響你的個人品牌,別讓負面情緒(抱怨,失望,討厭,灰心,逃避,拖延,...)影響你程式的品質。

保哥的軟體哲學(7)

寫程式是很「團隊」的事,團隊的紀律與規範非常重要,團隊成員有一致的流程與共通的習慣可以讓你避免陷入泥沼,也可以提升效率。

 

  

此文章由 will 發表於 2008/2/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 心得分享 | 團隊合作

標籤: , , ,

收藏:

本網站的搜尋引擎優化(SEO)終於有點成效摟

今天無意間用 Google 查詢了一下 "Will",想說看有沒有可能查到我自己的網站 ( 心裡想說是不可能 ),結果不但有找到,而且還出現在第一頁的第 9 筆耶!

本網站是用 BlogEngine.NET 架設的,整體來說我並沒有改什麼程式,大多都是用內建的功能而已,且這套軟體本身就已經做了許多 SEO 的規劃 (我也從中學到不少),讓我的網站不斷的在 Google 搜尋引擎中提升排名。當然,做好 SEO 卻沒有內容也是徒勞無功的,主因還是因為網站內容每天更新,才能讓網站的排行快速向上提升!

內容的部分,每張圖最好都加上文字說明,每個超連結也都最好加上 Title 說明,都有助於 SEO 的效果。

當然 SEO 不是三言兩語可以說完的,有興趣的人可以多上網查詢相關資料,以下是一些參考網址:

 

  

此文章由 will 發表於 2008/2/1 上午 12:00:00

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: 心得分享

標籤: ,

收藏: