2008年12月26日

直接操作 Gridview 上的 增刪改 (程式碼篇)

由於廢話 上一篇 都講的差不多了 直接進入程式碼的部分吧
首先來回憶一下頁面上的配置

主要要寫的事件有 新增 修改 刪除 三個功能鍵
新增事件為 將上方輸入的資料 加入至 Gridview 中
修改事件為 將資料放至上方輸入框中 再按下上方的 新增 鍵 修改其資料
刪除事件為 將 Gridview 中該列資料給刪除 (廢話

先看來 新增 的按鈕事件
由上面所述可得知 這個按鈕會觸發 新增修改 兩個事件

首先 建立 DataTable 當 Gridview 的 DataSource 來源

接著這段是從目前的 Gridview 中把資料抓到 DataTable 中
這邊可以看出坎尼的動作很簡單
Gridview資料->DataTable->增刪改->指定給 Gridview

另外 坎尼用 CommandArgument 的有無 判斷目前的狀態為何

可以看到 CommandArgument 記錄的是 order 只要減1就是 RowIndex
index 相同時 則把上方修改過的資料填入 DataTable 中
否則把 Gridview 裡的資料取出來填入 DataTable 中

這邊會看到坎尼都會加上 Replace("& nbsp;" , "") 這段
這是因為 Gridview 資料繫結後 會在資料上加入個空白
以防沒有繫結時 Table 表格該格的顯示上會不好看
(想試的人可以把 replace 這段拿掉 看回填的資料長怎樣)

接下來還是同一個事件喔 其實看註解就差不多了 (逃


接著來看修改按鈕的事件 (謎:你還真的跳過不講了)

其實這個事件是和上面的 btnAdd_Click 事件有關
按下 Gridview 上的修改按鈕時 會先把原資料導到上方

所以這裡就是先利用 CommandArgument 找到該列的資料
再將資料填入上方的 資料輸入裝置組 (好像樂高玩具的感覺
剩下的步驟就是由 btnAdd_Click 去判斷是否為更新資料了

最後就是刪除資料
這裡比較單純 只是 Gridview 把資料回填到 DataTable 時 跳過該列即可

以下是執行畫面
修改前 有人發現坎尼謊報年齡 而且想加個動詞
(這邊可以看到 原本的 新增 鍵的文字改為 修改)

修改後 坎尼的資料確實被修改了 (新增鍵的文字又改回來了)

編資料的人對坎尼很不滿 想要直接刪除坎尼的資料

按下確定後 坎尼就蒸發消失了
這邊要注意順序不會因有人被刪除而亂掉
而是將後面的人序號往前推


最後把資料存入資料庫這段坎尼就不寫了
流程是 從Gridview取得資料 -> ADO.NET

以前有看過同學寫過 在某個頁面 要加入新的人員資料
那時同學是放個 "新增" 按鈕 按一下就跳出一組資料輸入 (上圖的資料輸入裝置)
要多幾個人就按幾下 儲存時還要判斷資料有沒有填入
雖然動態抓控制項沒有說很難 但不符合坎尼的風格 囧興

現在用這種作法雖然程式碼煩人了一點
但在畫面的呈現上坎尼是覺得好很多

補了兩篇回來 不過這週 Tim 抓狂的放了好多篇
等坎尼案子趕完再來追一下篇數 XDDD

最後補上個 source code 下載

直接操作 Gridview 上的 增刪改 (前言)

剛剛被 Tim 嗆說他這個月的文章數大勝
坎尼雖然月底要做好個案子 也只好放下工作來發個兩篇

話說這篇還真的不知道該怎麼去下標題 (汗
主要的精神就是 不經由 DataBase 來對 Gridview 做操作
由於內容很多 所以就不廢話了 直接進入主題

首先 在頁面上配置 資料輸入裝置 (也就是上方的 TextBox 們
以及 資料顯示裝置 Gridview

來看一下 資料顯示裝置 Gridview 的裝備 啊 是設定
除了上方輸入框的三個屬性外 還多加了個順序

並且加上了個 TemplateField 放入了 修改 刪除
兩個 LinkButton CommandArgument 繫結了 order 欄位

好了 準備完成 初心者可以準備出村外了
也許有人會有疑問 這和一般的 Gridview 配置有啥不同?
「當然相同啊!」坎尼極度的肯定 (背後響起了拔刀的聲音...
不過在資料存取上 並不是由資料庫做連結

以上圖的設計一般來講流程會是 新增->資料填入資料庫->取出做 Bind
但本篇的設計則是要去除資料庫這塊 直接操作 Gridview 的物件

此種設計用途在於
資料集合只是使用者暫存的輸入 要等到最終的 Save 按下才會存入 DB之中
若是用上述的第一種方式 每增加一筆就要進 DB 兩次 (Insert + Select)
最後要是使用者選擇放棄儲存 又要去把剛剛 Insert 進去的資料 Delete
DB Server 又不是閒閒沒事一直在處理這件事 XDDD

所以坎尼想到了先用 Gridview 儲存使用者的暫存資料 並可 增 改 刪
最後使用者確定儲存時 再將 Gridview 裡的資料批次送進 DB 裡
若是使用者填一半後悔按下放棄時 就直接讓 Gridview 裡的資料隨風去.....

本來想說解釋一下 沒想到已經講這麼多了 囧>
如果再講 source code 可能會讓篇幅過長
先看一下執行畫面吧

上圖完全沒有透過 DB 來達成 有興趣的人請等待 下篇

2008年12月25日

最近很紅的 SQL Server 漏洞 + 如何訂閱 Microsoft Security Advisory

最近跟 SQL Server 有關的新聞不少,一開始我是在一個印度的 SQL Server MVP 的 Blog 上看到關於 SQL Server 2005 SP3 的消息(12/18),沒想到很快的在 12/22 就收到微軟的窗口的 mail,提醒說微軟已經發布 Security Advisory 961040,結果昨天(12/24) iTHome 就已經看到相關的中文報導,還有祭司的 blog 上也有相關消息,最後是今天在保哥的 blog 上也看到相關的消息了,看來有在隨時注意新知的人都能很快跟上進度。

看以上那些報導就可以對這個漏洞有一定程度的瞭解,所以我就不多廢話了,
主要是今天忽然想到,到底 MS Security Advisory 有沒有 RSS Feed 可以訂閱呢?
 
於是我連回 Security Advisory 961040 的網頁,點了網頁上方的 Security Advisory 連結:
Microsoft_SecurityAdvisory

果然順利找到了 RSS Feed:
Microsoft_SecurityAdvisory_RSS

接下來又看到下面還可以訂閱 Windows Live Alert,於是繼續點進去(登入頁略):
WindowsLive_SecurityAlert_Choose

直接全選之後,還有進階設定,我就繼續全選:
WindowsLive_SecurityAlert

最後設定完成的樣子:
WindowsLive_SecurityAlert_MyAlerts

這樣以後就更不容易 miss 掉微軟重要的姿安訊息囉!
最後補充一下前天安裝 SQL Server 2005 SP3 的心得:
  • 安裝前大約花了 1.5 HR 看了 Readme, Installation Guide
    (裡面有說,裝了 SP3 之後,若 SQL Server 相關 Component 發生異常,則無法修復,請整個 server 砍掉重練。雖然聽起來有點恐怖,但發生機率應該極低)
  • 裝的過程大約 30 ~ 45 分鐘,沒什麼困難 (No SSAS, SSRS, Failover Cluster)
  • 共安裝兩台,一台從 RTM –> SP3,另一台從 SP2 –> SP3,裝完都沒甚麼副作用
  • 還沒有安裝的朋友,趕快安裝吧!!

2008年12月22日

[ASP.NET] Session 變數在網站(子)目錄更名/刪除後消失 (InProc Mode)

       最近處理了一個 Session 變數會莫名消失的問題,麻煩的地方在於,這個舊系統在.NET 1.1的環境上活的很愉快,但是努力升級到.NET 2.0之後,在某些狀況下 Session 變數就會莫名的消失,導致權控子系統判斷為 Session Timeout,而將 user 自動登出系統。(不會留下任何的Event Log / Error Log)

      遇到這種問題,當然首先要先釐清到底在甚麼狀況下 Session 變數會消失?一開始大家猜測是 ASP.NET 1.1 和 ASP.NET 2.0 的 Session 有不同的運作機制(升級到 .NET 2.0 之後系統就掛了),這個大方向是對的,但最後發現問題的癥結其實跟 Session 的運作機制無關,Session 變數消失只是一個很糟糕的副作用罷了 …

經過反覆的測試,最後終於將範圍縮小至「呼叫一個 WebService (撈外部系統的資料)」後,便會造成 Session 變數消失。此時一位資深的同事注意到,由於外部資料可能常常會有變化,因此系統有一個特殊行為是會將 WebService 回傳的資料寫入一個暫存目錄中,而每次呼叫 WebService 前都會先將整個暫存目錄(及其中的檔案)刪除,而這就是造成 Session 變數消失的關鍵!(跟權控子系統一點關係都沒有)

經過一番 Google,發現這個 Session 變數會消失的問題最早大約在 2005 年就開始被討論,原因是從ASP.NET 2.0 開始新增的「Dynamic Compilation」機制,此玩意兒是指 ASP.NET (2.0+) Runtime 會持續監控應用程式的根目錄(Application Root Folder)以及其下所有的子目錄,出於安全性的考量,當這些目錄被更名刪除時(不管是手動修改或是在 runtime 以程式修改),都會造成 Application Domain Restart!(也就是整個網站瞬間 shutdown、重新 compile 之後,再啟動)

當整個 w3wp process 都被砍掉重練了,Session 自然也不能倖免,直接就被刪除重建,其中的變數更是整個屍骨無存,最後導致 User 自動被登出系統。
      在瞭解了基本觀念之後,又有資深的同事們提出了幾個更深入探討的方向,包括:
      因此接下來又整理出以下各種 scenario,並逐一進行測試(X表示Session會被刪除重建,範例程式下載)。在開始進行測試之前,我的預期是,sessionStateMode 主要的差異在於儲存位置的不同(因此影響 scalability),儲存位置的差異對 ASP.NET Session 物件的運作機制應該沒有影響,因此不管選擇將 Session 的資料存在哪裡,在 Application Domain Restart 的時候,應該全部都會被清空吧!(這樣的話開發人員就不需要特別為了不同的 sessionStateMode 而設計不同的 Session 變數管理方法了)

以下為測試結果:
                                        SessionStateMode
Deployment Style
InProc StateServer SQL Server
Copy Web Site (直接將 Source Code 佈署出去) X
Pre-Compilation (for deployment) X
Pre-Compilation (for deployment and update)
(等於執行Visual Studio 內建的 Publish WebSite)
X

      但是!事情並不是懶惰的我所想的那麼簡單!由以上的測試結果可明確的看出:選擇不同的 sessionStateMode 對 Session 變數會有截然不同的影響!在 sessionStateMode 採用「InProc Mode」時,只要更名(或刪除)網站的子目錄就會造成 Application Domain Restart(新增、刪除檔案則沒有這個副作用),若採用 StateServer/SQL Server 來儲存 Session 資料,則不管 Application Domain 如何反覆的砍掉重練,Session 變數還是可以堅忍不拔的活的很快樂!(其餘的 sessionState 屬性都採用預設值

結論:
     
ASP.NET 2.0+ 的 Dynamic Compilation 行為是無法被改變的,若系統採用「InProc Mode」來儲存 Session 資料,且想要用程式在 runtime 清除暫存資料可以採取以下兩種作法:
  1. 迴圈的方式刪除暫存目錄下的所有檔案,不要把暫存目錄整個刪除,此作法的effort 較小,亦可將暫存目錄設置於網站根目錄下一併管理。
  2. 將暫存目錄的位置移出網站的根目錄,如此便可任意更名/刪除此暫存目錄,缺點為管理上的 effort 較大(多一個虛擬目錄要管理)。
後記:
 
      我不太懂為何 ASP.NET 會設計成,當採用 StateServer/SQLServer Mode 時就不清空 Session 資料。這樣就表示不同的 sessionStateMode 所代表的不僅僅是 Session 資料的儲存位置不同,連帶的 ASP.NET 對於 Session 資料的管理策略也是不同的,感覺對於開發人員來說這會是一個額外的負擔。

      從效能的觀點來看,若系統中有某個功能一旦被執行就會造成 Application Domain Restart,那絕對不是甚麼好事。但是在開發階段只有採用「InProc Mode」或者已經事先深入瞭解 Dynamic Compilation 的運作機制,才能避免效能低落的程式寫法。若是經驗不足,或是不小心採用了 StateServer/SQLServer Mode,那麼系統只會默默的把 Application Domain 砍掉重練,不會丟出任何警告訊息,也不會寫下 Event Log,而Session 變數的內容看起來都會是很正常的!(權控子系統都可正常運作)那麼效能也只能默默的變差了 …

      為了補足 ASP.NET 預設對於 Application Shutdown 事件不會寫 log 的缺憾,我在Microsoft Developer Division 的 VP - Scott Guthrie 的 blog 找到了一個方法,在Global.asax的「Application_End」事件中將Application Shutdown的資訊寫入到Event Log,如下圖所示,如此便可明確看出 Application Shutdown 的原因是因為「dir change or directory rename」:
ApplicationShutDown

Reference:
  1. ASP.NET Application Life Cycle Overview for IIS 5.0 & 6.0
    (See Community Content #1)
  2. Logging ASP.NET Application Shutdown Events
  3. ASP.NET Deployment Overview
  4. sessionState Element

2008年12月21日

Sara Ford 的 Visual Studio Tips 系列結束囉

前天看到 Sara 的 blog 上 po 了最後一個 VS 小技巧 (#382), 講的是如何從Command Prompt下指令執行”System Information”(好像沒甚麼用XD), 同時也宣告 VS Tips 系列的結束,剛剛用 Google Reader 看了一下她的 blog, 「Did you know…」系列的第一篇文章大約是 2007年7月發表的, 所以 382 個小技巧大約寫了將近一年半(都是用她自己的下班時間), 真是令人佩服(跟保哥有得拼)。

不過她又講說,明年會再另外開一個 blog 來延續這個系列@@
看來之後還是有辦法以多多學習如何增進使用 VS 的工作效率囉 ^_^
VS 中有非常多好用的小技巧,若不靠他們這些熟知內情的專家的說明的話,
相信一般人根本就不會注意到,而Sara自己也常說,很多技巧對她來說也很難發掘,
必須要追根究底的去問 VS Team 才能瞭解如何使用,所以這些技巧真是得來不易呀!
善用工具可以大大增進工作的效率,如果沒有看過她的 blog 的朋友,
建議抽空去晃晃,可以先看一下標題,很可能剛好就 hit 到你的需求哦!

以下是一些我覺得蠻有用的小技巧:

2008年12月16日

Microsoft patterns & practices - Application Architecture Guide 2.0 Released!

這是今年老闆丟給我們看的一份文件,年中的時候還只有 1.0,不過今天發表了 2.0 囉!
雖然這份文件份量蠻多的 (387頁),不過內容很充實,有空的話應該要花些時間讀一下。

稍微瞄了一下,除了傳統的 Layer & Tiers Archetype,這次的 release 強調 RIA 的部份,但是很奇怪的用了 Rich Internet Application 這個 Macromedia (Adobe) 提出來的 term,而不是微軟用的 Rich Interactive Application,結果查了一下 Wiki 之後發現, 目前看來應該是 Adobe 的 term 勝出了吧 XD (PS. SL3 的 3D 效果還蠻炫的)

App Arch Guide 內容如下:
Parts
Part I, Fundamentals
Part II, Design
Part III, Layers
Part IV, Archetypes
Forewards
Chapters
Part I, Fundamentals
Part II, Design
Part III, Layers
Part IV, Archetypes
Appendix

如何在 .NET 後端處理時加上等待訊息

坎尼的同事問到這個問題
由於舊系統的資料量太大 每次 Query 都會等待一段時間
可是 user 有時卻等不及想再按一下
這時除了讓所有 button diable 的方法 (請參考 這裡
還可以利用簡單的提示訊息 讓使用者明白目前的系統正在運作

由於舊系統是以 vs 2003 做開發 要加入 Ajax 套件的功能有點麻煩
所以坎尼想到了用 javascript 來控制訊息

這邊要提一下 Webform 執行指令的先後順序
當按下一個 asp button 要送回後端處理時
此時瀏覽器會優先執行 button 上的 javascript
(其他控制項的先後順序當然也是這樣)
所以可以利用 控制項Attributes.Add() 方法 加入前端觸發的事件
以下就按下 button 然後產生文字提示作示範

首先在畫面上佈置一個 label 及 button 控制項
坎尼把 label 的文字顏色改為 紅色 這樣比較醒目

接著在 page_load 事件加上前端的 onclick 事件
(若是使用 vs 2005 以上版本 button 可以改用 OnClientClick 屬性)
這邊可以看到 坎尼在按下 button 時 利用 javascript 將 label 的文字改變
另外第一句註解的地方 是 jquery 的寫法


再來看按下 button 的事件
這邊可以放置後端處理事件的 code (範例是利用 Thread 讓整個程序睡5秒
記得在事件結束前 把 label 的文字改為 「載入完成


以下是實際執行情況


由於客戶只要求能有個提示就好 所以坎尼也只幫同事研究到這邊
其實這類的應用應該古早以前就有人寫過了吧? (坎尼還沒 Google 過

除了文字改變的表示外
還可利用 javascript 去控制 css 樣式
讓文字標籤出現完成字樣後 再慢慢的淡出
(將顏色改為和背景色相同 或是改 alpha 值 有興趣的人請自行測試
更懶的人可以直接用 display 的屬性讓 Label 消失

(以下碎碎念
近年出現了許多很炫麗的網頁技術
但在寫程式之前 其實可以先思考開發的便利性及功能性
此類簡單的應用勝過研究許許多多的新技術 只為了導入一個簡單的功能
花費的時間人力成本可能勝過原本的想像

坎尼也是很喜歡去學新技術
不過還是不要只 Google 了一下 囫圇吞棗完就準備上陣
許多基礎原理還是要弄懂 免得後來 debug 到天明 :p

2008年12月14日

訓練程式邏輯 – Light-Bot

最近在好幾個地方都不約而同的看到有人推薦 Light-Bot 小遊戲,
說是可以訓練程式邏輯,玩了一下覺得還不錯(共12關),說明畫面是這樣:

image

關卡長得像這樣:

image

右邊有一個「MAIN METHOD」的區塊,就是最後執行的程式,
下面可以自訂「FUNCT.1」和「FUNCT.2」(這應該不用多解釋吧XD),
遊戲目標是要透過 MAIN METHOD 操縱畫面上的機器人走到藍色的格子上去點燈,
機器人可做的動作就是右上方那七種,用拖拉的方式拉到下面的程式區塊即可。

基本上關卡都不太難,不過我莫名的在第六關卡了一段時間,
而且之前同事寄給我第10關第11關的破關方法,害我很懶惰的跳過了第11關 Orz

Anyway,最後我在第10關的作法跟同事寄給我的不一樣(但是忘記抓圖了=.=),
很明顯的每一關都可能有好幾種解法,真的要比的話應該要比誰用的步驟最少,
不過這樣玩起來就有點太過嚴肅了 XD

如果不想在網頁裡面玩的話,也可以到這裡下載

WorldCommunityGrid(WCG) – The Clean Energy Project

話說…今年七月中的時候寫了一篇介紹 WCG 的文章,當時run了一個月左右,
排名在17萬多,不知不覺已經run了半年(2008/6/14 ~ 12/14),
排名變成2萬5千多,似乎很難再進步了 XD (砍泥這個偷懶的傢伙進步更慢…)
之前run的時候發現一件麻煩的事情,就是WCG Client必須要用administrator身份執行
因此每次開機就會在 Notification Area (工具列最右邊的區塊,一直搞不懂中文叫啥 =.=)
看到 WCG Client被禁止執行的訊息,真的是被這個UAC的機制搞得很煩,
但是為了安全只好每次都手動去啟動 WCG Client,但是現在可以避免這個麻煩 囉!
前陣子在看log檔的時候發現,有出新版的 Client,而且好像有接到新的project的task,
於是上去了久違的WCG官網,果然出了最新的「6.2.28 版」Client,更新之後發現,
現在不需要administrator的權限就可以順利的執行 WCG Client 囉!
相信這個修正對於使用 Vista 以上 OS 的 member 來說是個大好消息,
雖然 Vista 出了這麼久,這個更新來的有點慢 XD
(在 Win7 Blog 上 10 月初對 UAC 的討論中提到,目前大部分的軟體都已經不再需要 administrator 權限就可正確執行了,對於系統安全性有很大的幫助。)
除了 Client 的改進之外,前陣子也推出一個新的 project –> Clean Energy Project
剛好搭上最近很熱門的能源議題,感覺現在開始 run 是有點慢了 Orz
這個 project 是要利用電腦作分子的物理性質和電子結構的運算,
試圖找出最適合用來作為下個世代的太陽能電池的材料,
聽起來蠻複雜的,希望可以很順利的進行下去~
喔對了,WCG 計畫現在已經有 41萬8千多個 member (台灣有 2,293 人),
註冊的機器超過 114 萬台 (台灣有 11,044 台),累積運算時間超過 20 萬年,
共完成超過 2億2千萬個 task (統技數據)。

2008年12月9日

用javascript做下拉式日期選單

前兩週是坎尼爆肝週 晚上回去大多是該睡覺的時間 orz
發現已經積了不少篇文章 可是卻沒時間可以講 囧>
(而且坎尼的電腦灌 Vista 64 一直抓不到驅動 怒

今天來講個老梗吧
如何用 javascript 做下拉式日期選單

首先要了解月份的算法 1月大 2月小 3月大...... 相信大家幼稚園都有背過這個
不過這之間的例外就是2月 它每四年就會多一天 (也就是閏年
閏年的算法為 西元年 可被 4400 整除 但不被 100 整除
(想當年 坎尼和Tim的計概期末考是考這個 囧興

直接來看抓圖吧


首先在頁面上佈置三個 DropDownList (當然也可以用 select 來做
重點是要給它們一個 id 並把 id 傳入待會要講的 javascript function 中
這邊 onload 事件是初始時 判斷月份的天數
若後端在初始化時已經做完 這邊有沒有加入事件倒是沒啥差


後端初始化下拉選單的選項 並將選擇日期預設為今日

接著三張為 javascript 同一個 function
可以看到 function 要分別傳入 年 月 日 的下拉選單 id
這邊是為了較有彈性而設計 以免換頁面 id 不同 又要開.js 檔出來改
另外 create 三個 option 是用來增減天數選項 (因為會變的只有 29 30 31)

由上圖可以看到 若是為閏年
日期的下拉選單會加入 29 的option
反之 將 index 28 移除 (也就是第29個項目)

下面兩張同理 所以就跳過



突然發現 好像講完了 orz
.js 請到 這邊 下載

用下拉選單的好處就是 可以在三個動作就到達要選的日期
壞處就是.....它一定至少要三個動作 (日期不同的話)
然後一般以表格化的月曆 (也就是和 .net 的 calendar 長很像的那種)
缺點是 若是要點 1960 年的日期 可能要點上一年點到死掉 XD
但優點就是很直觀 所以網路上已有人將兩種方式結合起來

最後再提一下 AJAX Control Toolkit 的 CalendarExtend 就是這種
不過動作只要把 Extender 拉到畫面上 然後指定 TargetID就好
真是好用又簡單啊

2008年11月25日

自製無用小工具 - part 1

年底大家都在趕結案
不過坎尼這段時間內倒是做了不少東西就是
只是一直沒時間上來寫心得
沒想到 blogger 的版面都有點小改變了 囧rz

這次介紹一個坎尼自己寫的沒啥用小工具 -- 副檔名自動修改程式
先來看一下程式執行畫面吧!
首先是啟動畫面及要修改副檔名檔案所在資料夾

大家可以看到
瀏覽資料夾之後,程式會列出資料夾下的所有檔案的副檔名

接著可以在左方選取要修改之副檔名
右方的輸入框可填入要更改的新副檔名 (記得要加上. 例如 .doc
這邊的設定是 新副檔名若未填寫 則是消掉原本的副檔名
輸入完條件之後就點選轉換按鈕

噹噹噹噹噹 .jpg 的副檔名都被消掉了
要繼續體驗修改快感的人 請點 這裡 下載 (記得檔案先備份啊 XD

程式的寫作流程是
利用 System.IO.Directory.GetFiles("PathHere") 取得檔案名稱
再利用 string 的 lastIndexOf 取得副檔名
接著放入 System.Windows.Forms.CheckedListBox

要修改時 利用 System.IO.File.Move("OldFileName","NewFileName")
來作到 rename 的動作 (坎尼找不到 rename 的函數 orz

以上大概是流程 這邊就不放 source code 上來了
有需要的人再跟我要吧 XD

這是坎尼因為對於要一直改副檔的動作覺得很麻煩所做的
防呆還是一些使用上都是以坎尼使用需求為主
有不好用的地方請提意見吧 :p 坎尼視情況做下一版本的推出 XDDDD

2008年11月10日

Microsoft TechEd 2008 補完 -- 技術篇 (Oslo, Rosario)

呼 ... 接下來這篇是 MS TechEd 2008 Taiwan 系列的最後一篇了,主要記錄的是之前漏掉的細節,還有一些新的技術架構的相關資料。因為最後發現要補完太吃力累了,而且沒有實務經驗容易淪為嘴炮,因此以下是之前寫好的部份內容,暫時就先這樣囉!希望明年可以寫比較深入的文章 ...
  1. 第一天早上的主題演講:by Steve Guggenheimer (OEM事業群全球副總裁),主題是「IT Heroes: Changing the World of Information Technology」,有些報導可以參考 iTHome 這篇,裡面提到「Model Driven Development」和「Virtualization」是非常重要的主題之一,關於 MDD 下面會有一些資料,而虛擬化的部分,從2008年10月份的TechNer Magazine以虛擬化為主題就可以看出其重要性,其中這篇講到如何利用「Offline Virtual Machine Servicing Tool」來進行大規模的 VM 升級,還蠻有趣的,不曉得 VMWare 那邊相對應的 Solution 是甚麼。
  2. Oslo (官方網站
    Oslo 是一個全新的塑模平台 (Modeling Platform),涵蓋的範圍遠超過 UML,
    一方面微軟也不認為 UML 有取得非常顯著的成功。它將融合Visual Studio Team System和System Center,讓它們可以彼此協同運用,將應用程式與日常IT作業進一步整合在模型(Model)之下。

    .NET Framework則是企圖擴充WCF和WF這兩種環境,使它們也能具備以模型驅動的程式開發能力。

    SDK CTP下載,其中用來寫「M」的intellipad是個還頗有趣的工具。
  3. Rosario (Overview
    後來仔細讀了一下資料之後發現,Rosario 是下一代 VSTS 的  code-name,至於不是 VSTS 的版本應該還是統稱為 VS2010 吧。 (CTP Download

    (1) 正式支援五個 UML Diagram 
         包括 Activity, Component, Logical Class, Use Case, and Sequence.

    (2) 加強應用程式生命週期管理 (Application Lifecycle Management)
         參考 iTHome 的這篇報導,還有這篇。目標是讓所有貢獻軟體開發的核心開發人員、測試人員到專案經理人、設計人員及企業分析師都能夠參與整個ALM管理,讓參與軟體開發的各式成員將更容易在開發過程中進行協作。包括新的架構檢視工具(Architecture Explorer),Visual Studio 2010 Architecture提供技術人員或非技術人員都能以模型透過圖形化的方式協作,以及定義企業與系統功能。新版本同時支援統一建模語言(Unified Modeling Language,UML)及特定領域語言(Domain Specific Language,DSL)。

    (3) 增強對平行運算的支援

    在簡化平行運算方面,為了善加利用目前流行(且未來會更普遍)的多核心架構
    .NET Frameowrk 4.0將強化對平行運算開發的支援(見參考資料3, TPL, PLINQ),
    在 core library 中新增如 "AsParallel"、"Parallel.For"、"Parallel.Invoke"等語法,
    讓被包覆在其中的程式能夠交由System.Threading.Tasks中的類別來負責,
    有效的將底層複雜的實作隱藏起來,讓開發人員能更快上手。

    但就如同微軟之前將複雜的實作包裝起來的結果(e.g. MS Ajax),
    雖然有效降低開發的進入門檻,但也讓因粗心或不了解細節的開發人員寫出bug的機率大增(如果你根本不會寫,那麼你就不可能寫錯),因此在 tooling 上提供完整的 debug 支援也是很重要的,而這個工作理所當然的落到了 Visual Studio 身上。

    在將平行運算的複雜運作交給 .NET Framework 這個 black box 去執行後,
    底層會自動將運算切割為task,並交由多個CPU來執行,為了能夠更有效的在這樣的環境下 debug,VS debugger 新增了幾種View,包括 "MultiStack", "Task List" 和 "MultiWatch" 等,大致上就是用圖形化的方式讓開發人員能夠快速了解此運算 overall 的執行狀況。此外最重要的 Profiling 工具也沒有缺席。

    其他參考資料:
    (1) Microsoft Unveils Next Version of Visual Studio and .NET Framework
    (2) Improved Support For Parallelism In The Next Version Of Visual Studio
    (3) Microsoft Parallel Computing Developer Center
PDC中有許多更深入的探討,相關資源請參考這裡

雜記: MS PDC 2008 Content & .NET Framework 4.0

話說十一月的文章數量似乎很少:p 最近關於 PDC 的資料實在太多了,
而且只是看看而已也沒什麼特別的心得,so ... 先用這篇文章紀錄一下哪裡可以找到 PDC 完整的內容,還有哪裡可以找到最新版的 .NET Framework 4.0 海報吧!

2008年11月3日

Gridview 自訂分頁2

坎尼在 Gridview 自訂分頁 中講到了分頁的作法
剛好有人看到這篇 然後提出了以下疑問
(其他程式部分請參照上篇 這邊只挑重點部分來講)

HI~坎尼 我想請問 如果想讓上下方同時都有分頁的效果 是要設定 Gridview.PagerSettings.
Position = PagerPosition.TopAndBottom;

上方的下拉選單跳頁SelectedIndexChanged 該如何指定

因為上方的DropDownList 是要取TopPagerRow的FindControl 就無法共用同一個SelectedIndexChanged

而我目前測試的結果Grid 似乎不能有兩個PagerTemplate來區分上下的下拉選單

麻煩坎尼解答一下~3q

這邊的解法算還蠻簡單的 (其實是坎尼之前的寫法不太對
首先 先將 Gridview 裡 Page SettingsPosition 設定為 TopAndBottom

在設計畫面上就會看到以下的畫面

再來就是 PageSet 方法裡 加入 TopPagerRow DropDownList 相關設定
這邊要注意一下 如果沒開啟 TopPagerRow 可是會出現 Exception




最後是坎尼當時沒寫好的地方 跳頁事件
這邊只要很簡單的把傳進來的 sender 轉型即可
再將 Gridview 的 PageIndex 設定為所選的 index

大功告成


這邊可以看到 上下的自訂分頁長的不太一樣
這是坎尼故意做的區別 如果要做到上下都相同的話
則要把下圖圈起來的地方 加上找尋 TopPagerRow 裡的 Label 的動作



另外坎尼還是不曉得 直接回意見能不能貼圖? 囧>
坎尼對 blog 的撰寫還是沒啥 sense

owasp Day2 下

週末和閃光出門去慶祝記念日
本來想趕在萬聖節結束前多寫個一篇的
可惜.....最後還是沒趕上 XDD
今天來把剩下的 owasp 心得補完

兩天的行程終於到了最後半天
所謂行百里者半九十 可是坎尼在第75公里時就覺得撐不下去了
吃完好吃的便當後 坎尼逛了逛廠商的攤位
(經濟部做的檢測軟體坎尼還覺得蠻厲害的
回座位時已經快開始下半場 此時坎尼才驚覺...還沒休息啊 orz

下午第一場的 Dhruv & Pukhraj Singh 兩人所講的瀏覽器威脅
坎尼完全在昏睡中渡過 真是覺得很對不住他們兩位

第二場是來自 owasp Thailand分會的 Tim Bass
坎尼覺得他演講很有技巧 而且不會趕 讓聽眾不會覺得有壓力
他以 Google Docs 為例 來說明 proxy cache 所可能造成的資安威脅
起因是他某天不小心看到了別人的 Google Docs文件
經研究之後 發現是 proxy cache 造成 而且這威脅無法被避免 (要和ISP配合才可能
要是這種事情發生在重要的機密文件上 造成的損失可能就很難預估了

第三場是 Alexander Meisel所講的 Web Application Firewalls (WAF)
說真的 坎尼現在看著筆記 卻想不起那時 Alex 講的是什麼
不過坎尼有個印象比較深的就是
惡意的指令是可以用2進位編碼的方式 將之編成圖片格式
只要使用者讀取到圖片的內容 就會進行惡意行為

第四場是 Steven Adair 所講的 BotnetDdos 研究
Botnet (僵屍網路) 坎尼最近才知道這個名詞
DDoS 則是 Distributed DoS 的縮寫

坎尼以前寫過一支程式 專門用來抓取一些網路上的資訊
沒想到卻不小心對某網站造成 Denied Of Service 導致一下午該網站都連不上去
坎尼當時只是用單一台電腦 對單一台Server做不斷存取的動作
可是這DDoS可不同 它利用了被控制的眾多電腦 (也就是 Botnet) 來對目標進行攻擊
再強大的Server 面對這樣的攻勢 (如果又沒建白名單) 應該很難繼續有所動作

另外 Steven 還有提到 Botnet 還會自動變形
讓使用者防不勝防 更何況還有一堆人不曉得這東西的存在

最後是講師們的綜合會談
由聽眾提問題 再由台上的講師們提出看法
這邊坎尼就沒做筆記了

這兩天坎尼聽了很多以前沒接觸過的領域
也了解資安不能只依靠軟體 更要有良好的規劃
程設師更要有良好的寫作習慣 先讓風險從自己手上降低一半
接著才是從硬體及軟體上著手

2008年10月29日

owasp Day 2 上

昨天一路塞車塞回家 坎尼到家時已經快七點半了
然後看到忘了帶出門的手機.....老板 call 了四通啊 囧>
今天又要早起下高雄出差 所以昨晚吃過東西 盥洗完就上床了

好啦 交待完畢
今天就來回顧一下昨天的owasp第二天 (可是好多東西都沒印象了 orz

第一場是坎尼期待的 RSnake所講的 Clickjacking
本來坎尼只以為和之前看到的 就是控制使用者端的 Webcam 及 Microphone
但 Robert Hansen 提出來一些用法真的讓坎尼豁然開朗
像是設計一個 text input 利如 1 + 1 = [ Here is the TextBox ]
利用iFrame及css的排版方式 讓 allow button 位於這個位置
一般的使用者如坎尼...會有種很強烈的想點它的慾望...
此時....Webcam可能已經被人偷偷的開啟了.....

當然 Clickjacking 只是個手法
你可以利用 iFrame 的方式 令其他人將你加入他們社交網站的好友
也可以讓使用者點了下載按鈕
或是#@%$#$%$% click anything what you want

Wow....我只能這麼讚嘆.....
如同新聞稿所講 這東西是尚無解決方法的.....
即時你將 javascript關掉也是一樣 (如何 恐怖吧~~~
現在能做的 只是消極的更新及盡量使用 no script 的環境
還有上網時自己小心了

坎尼等這幾天忙完了也想來研究 clickjack的程式面
不過坎尼會很好心的先用幾個好友來測試啦 XDDD
(囧興 才一個人就講這麼一大篇了

第二場是 Chenxi Wang 博士
王博士有提到Web 2.0的進步其實不只增加了大家的便利性
也增加了更多采多姿的攻擊方式
Web App Security確是目前坎尼所看到的開發缺失
案子在規劃階段從不會將此議題納入 總是等到事情鬧大了才去補東補西

今天坎尼去出差時也順便看了一下這個案子的程式碼
囧興~ 程式碼裡竟然有 SQL Injection的危險存在
由於要改的數量可能不少 坎尼都不敢跟承辦人提起這件事
從這邊來看 我猜應該公司部分案子都有被入侵的危險
(有空是該跟同事交流一下coding的方式和觀念了

第三場是來自 Hong Kong 的 Anthony
不過 Anthony 自認中文不太好 所以還是全程講英文
讓坎尼避免了和 Tim 去 TechED 時相同的命運 XDDD

Anthony示範了如何利用工具去 Exploit
這段也讓坎尼嚇到屁滾尿流
坎尼知道駭客們多多少少會有些工具 不過這些工具也太厲害了
不僅寄存在對方的 process 中 還可以隨意變換
當然對方電腦裡的東西都一目了然 還可以做 upload & download
連同對方的 MS Sql server 的 Table Schema 下個指令就跑出來了
還可以分析弱點 囧興~ (這是坎尼派出的第幾隻囧烏龜??

Anthony講話也很好笑 尤其是開場的快速自我介紹令人印象十分深刻
還有那個改變自己寄存的process 導致 IE 自動關閉
「使用者只會以為IE又掛了。Thanks Microsofx」 (消音中)
可惜Anthony時間不是很足夠 只好匆匆的結束整個演說

這篇真的太長了 坎尼只好默默的在標題上補個 『上』
當然 有任何講錯的也請給與意見指教 感謝 :p

2008年10月27日

owasp Day 1

最近坎尼要趕案子 所以一直沒時間上來發表一些技術心得
這兩天剛好有請到假去參加 owasp 亞洲年會 官方blog
今天是第一天 坎尼稍微簡短的寫一下心得

由於資安是坎尼最近才接觸的領域
所以許多專業的東西還是交給專家們去講吧 XD
接下來可能還會寫些 Javascript 網頁掛馬的技術心得

今天很早起的坎尼 一大早就趕過去 TICC
不過由於人真的太多了 會議一直到約10點才開始
坎尼都已經快睡著了 (因為太早起 orz

開場為阿碼科技的CEO Wayne Huang
接著是資策會及 III 的長官為大家致詞

第一場是 Foundstone 的 YM Chen
他為大家介紹了近年的資安演進及駭客攻擊目標的轉變
另外還有資訊安全的生態模式
再來是用 Google News VS UAL 的例子 (前陣子坎尼有注意到這新聞
來講解為何自動化工具還不能被完全信任

第二場是 Wayne 和 Birdman (應該沒拼錯吧?
他們講解了今年初 Mass SQL Injection 事件
令坎尼驚訝的是 原來駭客們的分工極細 例子裡就有四個集團
不過最終目的就是 讓user瀏覽掛馬的網站 然後把rootkits下載至client端

再來是 birdman 為大家演示幾個例子 (這些等下篇開個標題再提 :p
接著說明了靜態源碼檢測的難度 (JS可變形 可動態產生可執行碼.....
另外 birdman 有講個笑話 (我不確定是不是真的是笑話啦 XDDD
國內N牌防毒有講 95%的掃描都是多餘的 應該是要讓電腦變慢 讓駭客不想攻擊

第三場是來自菲律賓孟買分會的 KK Mookhey
講的是 Web App Testing
由於 KK 的英語口音比較獨特點 坎尼有段時間就恍神了
還好坎尼的手還有自動在抄筆記 所以還有些印象
他有提到 Google的庫存頁面功能
他的客戶 (某網站書店) 的 某些user就利用Local Searching的方式
免費的得到一些書籍的 PDF 檔 而不是出錢來購買 利益因此損失

第四場是 Charmi Lin
他的題目很有趣 :修改密碼無效!駭客還是在收取你的電子郵件
裡面講到了 webmail 如何被駭客用具有 XSS 的信
讓使用者只要打開信件閱讀 即可將使用者的 cookie 資訊傳輸回去
再利用 cookie 來侵入使用者的 webmail

「改密碼不就好了」大家也都是這個疑問
不過別忘了題目所講的 修改密碼無效!!!
因為駭客進入只是第一步 第二步就是修改被進入Webmail的使用者的設定

比方講gmail裡的 寄副本給某信箱選項
坎尼其實用那麼久的gmail 還不曉得有這個選項 哪天被入侵還不曉得 orz
所以曾經有被入侵或密碼外洩的人 最好將整個webmail的設定都檢查一次

下一場是 PK和Jack所講的個資洩露案子
也就是前陣子很有名的 5000萬筆資料被駭的新聞
相信在看這篇文章的大家 資料應該都在人家手上了 orz
(被入侵的是健保局....唉唉....

PK還有Demo一個 MSNBOT
它可以把目前電腦的資訊傳回來 還可以抓圖 送指令
還Demo了某家DLP產品的漏洞 利用這個漏洞直接讓對方電腦藍白畫面

接下來是 Fyodor Yorochkin
不過由於都是他個人的遭遇的案例
所以坎尼沒記到什麼筆記 冏興

最後是來自 China 的 Frank Fan
他演講了中國大陸這幾年的駭客行為
還有講解自動化Mass Injection工具的設定檔
(說真的 這工具真的很簡單又很有破壞力
再來還有說到驗證碼 也有人利用OCR方式來做自動化攻擊
最近是黑箱及白箱測試的講解 (這邊坎尼還沒找到相關資料
簡單來講 黑箱就是單純看程式的運作方式 來推論其內部結構
白箱就是直接打開 source code 來看是否有資安的危險
中間坎尼有點漏掉 筆記沒抄的很完整

以上大概就是今天一天的概況
如果有講錯 請各方大德用力的鞭
其他心得等過幾天再來補上 坎尼在家加班趕東西了 Q_Q

ps. Tim 你們公司明明就是贊助商 怎麼不趁機和老板說要來聽 - -

2008年10月14日

Javascript 小技巧 Part1

雖然說可能從此就停留在 Part1 (或者 Part2 就交給坎尼了 XD),
不過還是彙整一些過去一年來比較值得紀錄的 js 訣竅。
(其實是 Rosario & Oslo 資料太多還是看不完XD)
  1. 如何讓使用者點了 <a> 的連結之後,另開視窗,但原視窗的定位點不變?
    這是昨天做的一個小小的 streaming 網頁用到的技巧,由於一般人習慣去點連結,
    但是因為我要拿來作 streaming 的檔案來源是用 PowerCam 錄的,
    播放的時候需要用到 fsPlayer,才能完全享受更好操控的 UI,
    而 fsPlayer 又會佔掉很大的版面,因此還是以另開視窗(window.open)為上策。

    我原本是寫 <a href="#" onclick="open()">Watch Video</a>,
    但是很快就發現這樣會讓網址變成「http://yourDomain.com/index.htm#」,
    雖然的確不會讓網頁連到其他地方去,但是網頁的定位點會被捲到網頁最上方

    稍微找了一下就發現還有另一種寫法(參考網頁在這裡):
    <a href="javascript://" onclick="open()">Watch Video</a>
    果然改寫成這樣之後就不但可以另開視窗,而且原本網頁的定位點都不會跑掉~
  2. 如何用一行程式碼計算出某年某月有幾天?
    這是 ... 快一年前作的 XD 趁這個機會彙整一下,主要是參考這個網頁
    記得以前像這樣的敘述可以當作程式的題目,要小心閏年、閏月等等,
    隨便寫應該都要好幾十行,但是有人發現其實只要一行就可以搞定了:

    return 32 - new Date(iYear, iMonth, 32).getDate();

    主要就是靠 js 允許讓 Day 產生 Overflow 這樣的特性來做的
    (詳細說明請看參考網頁),看到這個範例之後,我就手癢的寫了 ASP 版,
    還有 ASP.NET 版 (C#),雖然說在 .Net 的世界裡,Date 本身就有 DaysInMonth 這個 static method (ref),但是應用上面那個 js 的思維,一樣都可以實作出來唷!

    雖然好像只有 js 可以做到一行必殺,其他語言都還要轉型之類的多寫個兩三行,
    但是 js 的那行程式真的就有種藝術的感覺,用一種很超俗的手法來解決問題,
    真的是很厲害。這行程式還可以用來檢查你自己寫的閏年判斷是否正確。

    我自己寫的小小程式 (三個版本) 可以在這裡下載。
  3. 如何強制 IE7 關閉視窗 (Tab),而不會跳出確認視窗
    這個 ... 在 IE6 大家都會,IE7 一直過了很久才看到有人找出解法,
    因為不是我發現的,So ... 直接參考小喵的 blog 吧 XD
咳,好不容易湊出一小篇文章,真是有種很久沒寫程式的感覺 Orz
Part2 就交給坎尼啦 :p

SqlParameters 應用篇

雖然標題是應用篇  但坎尼好像也沒寫過入門篇 (抓頭

回正題
本篇的應用是 隨著 user 選項不同  而執行不同的 t-sql 語法
且參數部分不盡相同

「為什麼說不盡相同呢?」 先來看下面抓圖
假設這是一個複合條件選擇的頁面
坎尼會依 user 選擇 而從 t1、t2、t3 三個資料表中分別取出資料
t1可能是個人資料、t2則為職業、t3為連絡資料
(先把 join 給放一邊  這個只是範例)

可以看到
i = 0 時  需要參數 id name birth
i = 1 時  需要參數 id job
i = 2 時  需要參數 id name tel

有發現嗎? id 這個參數重覆出現了三次  name 則是兩次
這種情況下  大部份的人應該都會寫成上圖的方式
利用 if 判斷 再將 parameter 加入 SqlCommand 當中
但這樣不嫌重覆造了太多輪子了嗎?

這邊坎尼要提供個簡單的方式
不過這邊要注意的是  這個方法好像支援 .NET 2.0 以上
1.1 似乎不能這麼寫  SqlCe 似乎也不能這麼做 (這個會再發一篇詳細講解)
直接來看抓圖吧


可以看到  坎尼把參數通通移到 if 的外面
在這邊 ADO.NET 會自動的判斷 parameter 的 name
所以就算加了 10 個 parameters  但.NET執行Sql指令時
也只會抓取它所需的那3個 parameters (依給予的參數名稱
「這樣做不會有問題嗎?!」
坎尼用 vs 2005 來做 一直都是 ok 的  如果有問題請寄信給坎尼 :D

好啦  講完啦  XDDDD   (被踹飛

其實真正的應用不在於 select  (坎尼覺得用 select 當範例大家會比較了解
而是 insert update 時  許多資料表的欄位很像 但又不太一樣
應客戶要求又要做在同一頁  (對他們來說  這幾張 Table 可能是相同的)

此時  苦命的 Programmer 就要像第一張圖那樣
利用 if 或 switch 去做判斷  再將資料 insert (或update) 進去資料庫
(別懷疑  這是坎尼工作上遇到的實際例子)

為了讓自己可以早點下班  以後維護也比較簡單(這地方見人見智)
坎尼不小心發現了這個偷吃步的方式
不過效能上有沒有影響倒是沒有測過  哪天比較空閒時再來測測看

最後補充個一點  在加入 Parameters 之前  記得習慣將 Parameters 清空
尤其是要用 for 迴圈跑 insert 或 update 的人

2008年10月13日

Sql Server V.S. Sql Server Compact

繼昨天講解 ADO.NET 會自動判斷參數名稱 後
今天要來講 PC 和 PPC 的 SQL Server 的差異性比較

PC上是使用 System.Data.SqlClient
PPC 則是使用 System.Data.SqlServerCe (需安裝 .NET Compact Framework

再來是要了解一點
PPC上所支援的 API 較 PC 少  (為了縮減容量的關係吧?)
所以常常可以見到的是
同一個 Class 上  在 PPC 所支援的方法及屬性 大多會所剩無幾

MSDN 上查詢Class成員時
會看到某些 方法 或 屬性 前有個手機的 Icon   那就表示是支援 PPC 開發

以上大概是 PC 和 PPC 的一些小講解
再來是 PPC 上用的小型許多的 SqlServer -- SqlCe

如同之前所講的  PPC 許多 Class 都會受限
但是坎尼沒想到 SqlCe 上也有如此情況!?
比方講 isnull 這個在Sql常用的函式  到了SqlCe上竟然不在了 囧>
應該是說  它變成回傳 true/false ( 但MSDN上是寫不支援
坎尼只好用 case when 來做判斷

接下來是要承接 上篇 所講的SqlParameter

在 .NET Compact Framework 上寫入 SqlParamter 就不像上篇所講的那麼簡單
因為 SqlCe 會判斷目前 Sql 句子裡有幾個 Parameters
然後再將 SqlCeCommand 裡的 Parameters 的值給寫入   少傳多傳都會出現例外
講這麼多就是一句話 : 
子句的參數數目要和 SqlCeParameters 的數量相同啦!!!

因此坎尼 上篇 所介紹的這個傳入參數的方式就不適用
但是偏偏這個 PPC 的開發和上一篇所講的是同一個案子
坎尼打開 SqlCe 的資料庫  又看到了許多重覆欄位分散在不同的資料表 orz

山不轉 坎尼轉轉轉   綜合之前所提的兩種方式
坎尼將共同的 SqlParameter 寫於外層
內層的判斷則是依不同需求  傳入所需的 Parameter

可以看到  範例中只有 id 是共通  所以移到最外層
name 雖然也有兩個情況下會出現  但是..恩..很抱歉...你知道的...
(坎尼案子裡共同的parameter約有七八個 orz

傳入 Parameter的方法大概介紹到這邊
最後回應一下 Tim 上篇留言所說的
這個方式雖然可以分開管理共同及私用的 Parameters
但還是 Tim 所說的  直接再開個方法來寫  還比較好維護
這個四不像希望以後坎尼負責的案子不會再用到它
(那你幹嘛發明它  找死啊= =

這篇實在是寫得很亂   很感謝能看到這裡的人  <(_ _)>
下篇會挑個 scope 比較小的東西來寫

2008年10月9日

開發時好用的快速鍵 part2

雖然說坎尼好像沒寫過 part1
不過由於寫過類似的  所以標題還是給他 part2 啦

先來介紹 .NET 內建的快速鍵
1. 格式化文件 CTRL + E → CTRL + D
雖然 vs 2005 的格式自動化已經做的很好
但總會有那幾次格式沒自己自動化

所以此時  只需先按下 ctrl + e 再接著按 ctrl + d (其實好像按d就好)
.NET就會自動格式化目前的文件  這個快速鍵也可用於 aspx 頁面


2. 註解  CTRL + E → CTRL + C
    還原註解 CTRL + E → CTRL + U

這沒什麼好講的  就和工具列上的註解功能一樣
只是有時寫程式寫到一半  真的很懶的去動滑鼠時  可以試著用這個
不過坎尼還是習慣去點上面的工具列啦

WinXp 的快速鍵
1. 游標往前或往後移動一個區塊  CTRL +  ← → 
因為要抓遊標的圖實在很困難
所以就請各位自行練習吧  (練習啥小 = =

這邊所謂的一個區塊  是指用 半形空白 符號 隔開的文字

ex. This is my book , and Tim has one , too.
在 This 前面按下 ctrl + →  游標會跳到 This 後面
若是在 , 後面按下 ctrl + ← 則游標會跳到 , 前面

不過每個文字編輯器的設定多多少少會不同
所以 block 的定義也不太相同  就請各位自己試看看囉
補充一點  此快速鍵也適用於中文字

2. 往前刪除 1 個 block  CTRL + backspace
    往後刪除 1 個 block  CTRL + Delete

極好用!!!!!
有時要刪一大串的文字但又不能全刪實在很煩  
通常都會一直按著 backspace 或 delete  一不注意又會把其他文字給刪掉
此時只要 按著 Ctrl 再按 backspace 就可以很輕鬆的刪掉一大段字

範例裡想把 mule 刪掉改為 horse
粗體
若是用 backspace 要按四次   但 ctrl + backspace 只要按一次

如何  是不是很方便呢???

同理  ctrl + delete 也是一樣   不過它刪除的方向和 backspace 相反

3.還原上一步 Alt + backspace  
功能等同於 Ctrl + Z   所以就不介紹了


這些都是懶惰的坎尼不想用滑鼠不小心發現的一些潛在指令
下次等收集多一點新發現再來寫 part 3

2008年10月6日

第一次認真寫 VBA --> Report Generator

本篇範例可以到這裡下載。裡面的程式才是最正確的,下面抓的圖有點舊XD
由於最近公司要辦活動,必須統計每堂課的報名狀況,
無奈報名系統產出的 Excel 太過基本,無法快速產出老闆想要的報表,
因此開始試圖用 VBA 自動完成一些重複性高的手動作業
也是我第一次撰寫簡單的 VBA 應用程式,過程還蠻好玩的 (雖然害我少睡很多)
因此以下按照報表產生的步驟來介紹一些我用到的方法和心得:
  1. 首先我做了一張 sheet (Settings),裡面放了一些 Report 的相關設定,
    未來可以繼續擴充,目前最重要的設定是課程名稱和 Worksheet Name的對應,
    例如「A_Very_Long_Name_About_SaaS」對應到「SaaS」,像下面這樣:
    Blog_Set_Worksheet_Name
  2. 接下來是將報名系統產生的 Excel 資料貼到 "Original Data"中,
    並且調整適當的標題,做好資料的排序,再加上「統計資訊」的區塊: 
    Blog_Original_Data_Sortedjpg 
    其中在統計資訊的部分,公式長的像這樣:COUNTIF(D:D,J2)

    這樣的原始資料的問題在於,由於在報名過程中每天的報名人數都會變化,
    如果要用這張 Worksheet 來統計每日 (或每堂課)的報名人數,
    就必須每天調整公式中的 Range
    因此最好是能將每堂課的資訊各自獨立到一張 Worksheet 中,
    如此統計資訊的公式中的 Range 就可以使用整個「欄」, (像上面那樣)
    而不用根據每天的資料筆數來調整公式中的 Range。

    而上述這個「將每堂課的資訊各自獨立到一張 Worksheet 中」的動作,
    如果要每天手動去複製就相當的麻煩,而且複製前還必須要先刪掉舊資料,
    因此如果能透過 VBA 自動將每天報表中的每堂課的資料抽出來放到相對應的 Worksheet 中,統計的公式就會自動計算出最後結果,省時省力。

  3. 在主要的 VB Sub Routine 中,首先會先 loop 過整個 Workbook 內的 Worksheet,
    並且將目前 Worksheet 中已經存在的舊資料刪除,程式像下面這樣:
    Blog_Clean_Worksheet_Data 

  4. 若是第一次執行這個 Sub,要把以下的註解取消,以便根據 Worksheet 名稱來新增 Worksheet,如同註解中說的,看來 VBA 不支援 Try Catch
    Blog_Add_Worksheet
  5. 接下來就會抓取步驟一中設定的對應關係,並且將"Original Data"的標題以及統計資料列複製到每堂課程的 sheet中 (如此每張 sheet 的 Layout 都會是相同的):
    Blog_Main_Process

    其實以上就是這個 Sub 最主要的內容了,接下來會解釋「CopyTitleAndStatistics」和「ProcessData」做的事情。

  6. 實際上執行「複製標題列及統計資訊」的是「CopyTitleAndStatistics」,
    主要的程式像這樣:
    Blog_Copy_Title

  7. 而「ProcessData」則是分成兩段,首先要根據課程名稱,在 HR 原始報表中找出該課程的相關資料(With 區塊主要參考 Excel 內建的範例程式):
    Blog_Search_Source_Data_Area
  8. 接下來則是計算要負制的範圍,並且根據資料筆數來計算 Target Worksheet 要貼上的範圍:
    Blog_Calc_Targt_Data_Aea
  9. 最後產出的報表長的像這樣:
    Blog_Report

    在 "Original Data" 之後已經依據 "Settings" 內的設定自動產生好相對應的 Worksheet,並且將該堂課程的資訊貼進去,這樣就可以檢視每堂課的報名人數統計了。 

  10. 另外我還手動作了一張 "Report Overview" 的 Worksheet,有 summary 的功效:
    Blog_Overview
經過這次的練習,我有以下的心得:
  • 首先要先想好最終要產出的文件到底長甚麼樣子,才能分析裡面有哪些東西可以透過程式自動幫你完成 (或者透過痛苦的反覆人工作業來了解XD)
  • 其實 VBA 還蠻方便的,最大的好處是卡住的時候只要錄個巨集,就能很快的了解狀況,因此說明文件雖然不如 MSDN 好用,但還不致於會造成太大困擾。
  • VBA 也提供方便的 Debug 功能,像是即時運算視窗監看式等等,
    雖然用起來不太習慣,也有一些限制,但還是比 ASP 好太多了
Future Work:
  • 註解裡面有些記錄到嘗試失敗的部分,有空的時候可以再努力看看
  • 目前的 Report_Overview 中的儲存格內容是手動一格格設定的,應該VBA也辦的到
  • 在產生每堂課的 Worksheet 時,可以間隔的設定索引標籤顏色,這樣可讀性更高
平常實在沒甚麼機會接觸 VBA,除非遇到像這種久久才用到一次的報表,希望下次還有其他機會可以練習 :p

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D