2012年11月30日 星期五

PMP考試甘苦談~


2012/11/20 小弟終於辛苦的考過PMP認證了。

說來拿到這張PMP的過程,真的是花了我很多時間和苦心。
我在公司原本是很單純的寫程式,但在去年一些同事離職後,
小弟也被指派上火線掛PM帶專案,工作除了原來的系統分析、設計,和寫系統,也要擠出時間做需求訪談、報告、寫文件和溝通。

剛開始的時候,每天都加班,而且還要惡補專案中同仁的業務系統流程。 去開會被USER質問(就是被釘的意思)也不是沒有,但是回來後,苦水只能往裡面吞,盡量避免負面的情緒影響團隊。

但是這也給了我一個好機會去嘗試管理面的工作,也在今年七月趁這個機會報名恆逸的PMP課程。
課堂上認識了張憲中老師,和很多其他公司的PM
第一堂課,張老師讓每個人分享自己的苦水,哇,大家講起苦水真是欲罷不能~~

至於張老師的PMP課程,學生真是受益良多。 老師用很多本身的實務經驗配合幽默的簡報技巧,並適時的讓學員互動,把原本看似很無聊的專案管理課程,變成一門很有趣的管理課程。
(我也偷偷的向老師學了幾招簡報技巧 J

恆逸也提供了很多考古題,讓學員可以作答。 所以八月結束總複習後,小弟馬上就上去PMI報名準備考試了,沒想到

竟然被抽中被稽核!!

傻眼,只好先弄一些審查的文件,考試只能往後延了。 結果九月的時候,剛好又碰上公司正忙 只好再延。 到了十一月,同時去上課的同學都已經順利通過了,小弟聽聞後,不知哪來的傻勁,馬上報名三天後的考試! (現在想想,我真的很衝!!

結果那三天,回家後就讀書到半夜,每天睡不到五個小時,超累!!
11/20 那天根本半睡半醒著去考場,考前真的超級緊張,開始作答後,前面五十題就花了我一個小時,幾乎每題都看得很仔細,但是其實很多都很像考古題,所以慢慢的就比較輕鬆作答了

但是有一些題目(尤其是計算題,ex 要徑問題),就有一些變化了。
另外有一些流程的工具 如柏拉圖,中文翻譯可能跟我們看的中文書不一樣,這時候就要回去看英文題目。 另外我也發現有一題的選項,中文翻譯不正確,遇到這種情形,還是都要往下看一下英文題目和選項才能確定答案。

最後四個小時到數完畢後,系統就會問你要不要做問卷(我當然想知道有沒有通過,所以跳過)。
接著命運的Loading齒輪就開始在畫面上旋轉 大概有三十秒吧!! 就跑出”PASS” 的字樣!

終於放下了心中的一顆大石!!

整體來說,小弟覺得只要把上課的教材和考古題看熟做熟,通過應該是沒有問題的!!
如果您正在準備考試的話,加油! 您一定可以低!

2012年11月26日 星期一

[C#] 快速了解泛型委派


Action & Func


Action<T, T…>  沒有回傳值的泛型委派
Func<T,T…>  可以回傳值的泛型委派

對小弟來說,泛型委派和Delegate最大的差別就是,不用先宣告一個Delegate定義名稱。
使用上較方便。

直接看範例

Sample


先定義一個CName物件,裡面會放要委派的方法。

public class CName :IDisposable
{
        private String sName;
        public CName(string name)
        {   this.sName = name;   }

        /// <summary>
        /// 沒有參數,沒有回傳值
        /// </summary>
        public void DisplayToConsole() {   //…     }

        /// <summary>
        /// 一個參數,回傳String型別
        /// </summary>
        public String DisplayToWindow(String sDesc) {   //…   }

        /// <summary>
        /// 兩個參數,回傳String型別
        /// </summary>
        public String DisplayToWindow(String sDesc01, String sDesc02) {   //…   }

        /// <summary>
        /// 泛型:兩個個參數,無回傳值
        /// </summary>
        public void Combine<T>(T itemA, T itemB) {    //…    }
       
        /// <summary>
        /// 泛型:兩個個參數,回傳String型別
        /// </summary>
      
        public String Combine_WithRtnVal<T>(T itemA, T itemB) {    //…    }
}



Delegate

public delegate void ShowName();
/* 測試Delegate */
using (CName cName = new CName("Delegate測試"))
{
   ShowName _showName = cName.DisplayToConsole;
   _showName();
}


Action 匿名委派

/* 測試Action匿名委派 */
using (CName cName = new CName("Action匿名委派"))
{
    Action _showNameActDel = cName.DisplayToConsole;
    _showNameActDel();           
}


Generic Action 泛型匿名委派

/* 測試Action泛型匿名委派 */
using (CName cName = new CName("Generic Action"))
{
   Action<String, String> _showNameActGen = (x, y) => cName.Combine(x, y);
   //Action<String> _showNameActGen = cName.Combine<String>;
  _showNameActGen("1", "2");           
}


PS. Action<String, String> 指的是委派的方法裡面須帶兩個String參數。


Generic Func

/* 測試Func泛型匿名委派 */
using (CName cName = new CName("Generic Func"))
{
    Func<int, int, String> _showNameFuncGen = (x, y) => cName.Combine_WithRtnVal(x, y);
    String sRslt = _showNameFuncGen(1, 2);
}
PS. Func<int, int, String> 指的是委派的方法裡面須帶兩個int參數,回傳String

如果意猶未盡,可以參考MSDN的詳細說明 !

           

2012年11月8日 星期四

[C#] Epplus (Excel元件)


Epplus Excel元件)


1.      先用NuGet直接加入Epplus (可參考 NuGet網站)
PM> Install-Package EPPlus

2.      使用C# Windows Form專案,建立如下的介面。
大概的功能是先從資料庫撈一個表格的資料出來,按下匯出就可以使用Epplus的語法匯出成Excel


3.      直接列出匯出成Excel的程式碼

//若存在該檔案則先刪除
                if (File.Exists(sFilePath))
                {
                    File.Delete(sFilePath);
                }

                //開檔
                FileStream fs = new FileStream(sFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

                //載入Excel檔案
                ExcelPackage ep = new ExcelPackage(fs);


                if (ep.Workbook.Worksheets[sNewSheetName] == null) //不存在該Sheet
                {
                    //加入一個WorkSheet
                    var ws = ep.Workbook.Worksheets.Add(sNewSheetName);
                    ws.View.ShowGridLines = true; //是否顯示格線
                }

                //取得WorkSheet
                ExcelWorksheet sheet = ep.Workbook.Worksheets[sNewSheetName ];

                //設定起始列為3
                int startRowNumber = 3;
                int DataRowNumber = startRowNumber+1;

                //寫入標題文字
                for (int i = 0; i < dataGridView.Columns.Count; i++)
                {
                    //設值為欄位名稱
                    sheet.Cells[startRowNumber, i + 1].Value = dataGridView.Columns[i].Name;

                    //設定樣式
                    sheet.Cells[startRowNumber, i + 1].AutoFitColumns(); //自動欄寬
                    //sheet.Column(i + 1).Width = 100;
                    sheet.Cells[startRowNumber, i + 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; //欄位置中
                    sheet.Cells[startRowNumber, i + 1].Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thin); //儲存格框線
                }

                //寫入資料
                int ColCnt = dataGridView.Columns.Count; //欄位數
                int RowCnt = dataGridView.Rows.Count; //資料數

                for (int i = 0; i < RowCnt; i++)
                {
                    for (int j = 0; j < ColCnt; j++)
                    {
                         //讀值
                        string cellValue = "";
                        if (dataGridView.Rows[i].Cells[j].Value != null)
                        {
                            cellValue = dataGridView.Rows[i].Cells[j].Value.ToString();
                        }
                        else
                        {
                            cellValue = "";
                        }

                        //寫值
                        sheet.Cells[DataRowNumber, j + 1].Value = cellValue;

                        //樣式設定
                        //sheet.Cells[DataRowNumber, j + 1].AutoFitColumns(); //自動欄寬
                        sheet.Cells[DataRowNumber, j + 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; //欄位置中
                        sheet.Cells[DataRowNumber, j + 1].Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thin); //儲存格框線
                    }
                    DataRowNumber++;
                }

                //存檔
                ep.SaveAs(fs);
                fs.Close();

                //關閉資源
                ep.Dispose();
                ep = null;

                MessageBox.Show("儲存成功! ");

4.      匯出的Excel內容~