2017年12月26日 星期二

設計模式 (簡述)

*要感謝Bill叔的課程教導,讓我透過很多實際的經驗來瞭解設計模式


設計模式的誕生主要是要來解決一些常出現的問題,並讓程式碼可以更方便為擴充跟維護,
我自己的理解也滿簡單的,就是簡化程式複雜程度。

通常只要多去想如何符合一些好的開發原則,如 SOLID原則,這樣自然能夠把不自覺的設計模式融入自己的程式中,不用刻意去套,只要能很好的解決需求的模式就是好模式..XD


以下我以解決問題的角度去做分類 :

處理生成問題 :
  • 工廠方法
    • 簡單工廠模式
    • 泛型工廠模式
    • 抽象工廠模式 (整族抽換)
  • Singleton模式
  • Prototype模式
  • Builder模式
處理分支問題
  • Chain of Responsibility責任鏈模式
  • Strategy策略模式
  • State狀態模式
處理結構問題
  • Facade模式
  • Decorator裝飾模式
  • Proxy代理模式
處理行為、流程問題
  • Template樣版模式
  • Memento模式

等等
之後有時間我會陸續補上其他部分



2017年10月5日 星期四

[SQL] 倒序搜尋

如果在sql中url欄位我需要撈出下述的1551066.html就好,該如何?

ex.http://you.ctrip.com//travels/taipeicity360/1551066.html

select right([Url], charindex('/', reverse([Url]) + '/') - 1)

2017年9月5日 星期二

[SQL] SELECT INTO跟INSERT INTO的差別

轉載 :  https://goo.gl/a6PvXF

SELECT INTO可以into進去暫存的table也可以into實體table,
INSERT INTO只能into實體的table。
實體:SELECT ~ INTO table2 FROM table1
虛擬:SELECT ~ INTO #table2 FROM table1


也就是說,如果使用SELECT INTO
後面的table2如果本來就有,他就直接塞資料;
如果本來就沒有table2,他會新建一個table2,再塞資料。


加了#的意義就是,into進去後,
把Query關掉,重新開啟一個Query,table2就不見了,等於是暫存性的。


當然假如不加#的話,table2就會一直保留著。


另外SELECT INTO如果是實體用法,可以等同於:
INSERT INTO table2 (.....)
SELECT ~ FROM table1

2017年8月4日 星期五

[SQL] 小數點去除多餘0

可以使用cast as float 先轉型~

image

結果

image

2017年8月1日 星期二

IIS 上使用到Office COM元件


最近網站有使用到excel內的函式運算 :

Microsoft.Office.Interop.Excel


在本機run都ok, 但放到IIS上卻出現error :

擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80070005 存取被拒。 (發生例外狀況於 HRESULT: 0x80070005 (E_ACCESSDENIED))。


解法 : https://dotblogs.com.tw/v6610688/2015/02/19/iis_office_access_word_excel_com_interop_api_configuration

原因就是要設定權限並打開~

2017年7月19日 星期三

[C#] dataset 是唯獨 不能修改問題

今天維護一個有點年紀的程式

此程式是用datareader 讀去資料後放到data set

我需要進一步修改data set 卻報出唯獨不能修改…orz

查了一下才發現使用data Reader來讀資料load 進 dataset還會是唯獨狀態

因此我必須改動狀態才能進行更新.

所以要再加上類似下述

datatable.columns["name"].ReadOnly = false;


---

參考 : https://goo.gl/53dtqt

2017年5月8日 星期一

[C#] 日期時間

 

以下是特定時間與當下時間差做比較,並以小時表示

var timeDiff = new TimeSpan(BeginTime.Ticks - DateTime.Now.Ticks).TotalHours;

2017年4月25日 星期二

[C#] 日期比較

 

DateTime.Compare(date1, date2) > 0) 表示 date1 > date2

DateTime.Compare(date1, date2) == 0) 表示 date1 == date2

DateTime.Compare(date1, date2) < 0) 表示 date1 < date2

2017年4月17日 星期一

[mvc] 加入多國語系


簡易流程 : 簡單說就是利用cookie紀錄瀏覽器的預設語系,然後在server端切換對應的語系檔(.resource)
1.在controller 加入切換語系的action

public ActionResult ChangeLang(String langCode, String bakCtrl, String bakAct)
      {
          //use Cookies save lang code
          HttpCookie LangCookie = Request.Cookies["lang"];
 
          if (LangCookie == null)
          {
              LangCookie = new HttpCookie("lang");
          }
 
          LangCookie.Value = langCode;
          LangCookie.Expires.AddDays(1);
          Response.Cookies.Add(LangCookie);
 
          if (String.IsNullOrEmpty(bakCtrl) || String.IsNullOrEmpty(bakAct))
          {
              return RedirectToAction("Index""Home");
          }
          else
          {
              return RedirectToAction(bakAct, bakCtrl);
          }
      }
 
 
2.在html加入切換語系
<a href="@Url.Action("ChangeLang""Home"new { langCode = "zh-TW" })">中文</a>

3.在Global.asax 設定cookie語言的資訊

protected void Application_BeginRequest(Object sender, EventArgs e)
      {
          HttpCookie myLang = Request.Cookies["lang"];
          if (myLang != null)
          {
              System.Threading.Thread.CurrentThread.CurrentCulture =
                  new System.Globalization.CultureInfo(myLang.Value);
              System.Threading.Thread.CurrentThread.CurrentUICulture =
                  new System.Globalization.CultureInfo(myLang.Value);
          }
      }
 

4.新增resource資源檔 增加欄位即可
參考 :  https://goo.gl/5gh9gw
編輯多國語系套件 : http://resxmanager.codeplex.com/

2017年3月28日 星期二

[Error][EF6] 使用Notracking 合併選項傳回物件時…

 

error : 使用Notracking 合併選項傳回物件時…不包含物件時呼叫Load

2017-03-28_104819

解 : 跟以前一樣,都不是本身的問題,是table 跟 table 之間關連的問題,記得使用metadata 加入 jsonignore 來忽略循環select的問題

2017年3月14日 星期二

[Filter] OnActionExecuting


如果需要在進Action前執行特定行為,如過濾

就需要額外新增一個class並繼承ActionFilterAttribute

裡面有四個基本功能

Action,Result執行前後

範例 :
//public override void OnActionExecuting(ActionExecutingContext filterContext)       
//{       
//    string currentDomain = filterContext.HttpContext.Request.Headers["HOST"];       
//    List<string> domains = WebConfigurationManager.AppSettings["AllowDomain"].ToString().Split(',').ToList();       
//    if (!domains.Any(i => i.Contains(currentDomain)))       
//    {      
//        throw new Exception("未允許的網域");       
//    }       
//}

2017年3月2日 星期四

{JS} IE11 遇到Get回傳參數是中文變成亂碼

 

感謝隔壁伙伴的相助,才能這麼快就解決這個問題

當IE遇到Get回傳參數是中文會變成亂碼, 也就是回傳一堆菱形,

這在chrome, firfox 沒問題。

 

因此請先利用js都先編碼encode後再傳送處理

ex. 範例來源

var uri = "https://w3schools.com/my test.asp?name=ståle&car=saab";
var res = encodeURIComponent(uri);

// 編碼後 : https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab

2017年2月2日 星期四

[SQL] 取得當前是第幾週? 跟下一週是

 

遇到一個狀況是2017/2/1  和 20172/3 是同一週就要歸在一起

所以我必須先轉換成同一週才能比較

SQL 上使用DATENAME 函式  參考網址

DATENAME(WK, ‘2017-02-01’) 其週數會和另一個同一週

 

另外如要join 本週跟上一週資料再搭配DATEADD (datepart , number, date )即可

ex.  SELECT DATEADD(week,1,GetDate()) --當前日期加一周後的日期

2017年1月23日 星期一

[Testing] 測試進程

 

很開心上完91的測試實戰,對我以往的開發觀念完全改觀!!

接下來我會一步一步紀錄學習的心得與練習

---

測試進程

BDD

確保你想的是使用者想要的

TDD

確保你先想清楚才動手寫

Unit Test

確保程式寫的跟你想的一樣

---

說明 :

所有的開始源自於一個需求,為了解決這個需求,我們透過多個實例來瞭解使用者的故事,並確保你的情境是符合使用者的狀況,這就是運用BDD,接著有了一些情境後,我們開始把情境轉化為一個測試案例,這個過程可以確保我們專注於當下並先想清楚才動手寫production code,這就是運用測試來驅動開發。

這是一個開發觀念上的改變,跟自己以往在腦袋想一遍就直接開始寫production code是完全不一樣,而且這種方式能夠清楚的量化程式碼的品質與需求,也是一個容易區分senoir 跟 junior的差異,實在令人感到興奮。

2017年1月17日 星期二

[重構] 重構的簡易流程


整理一下自己練習重構的基礎流程 :
1.靜態程式碼分析 :
尋找循環複雜度高的Code > 10
工具 : ex. CodeMaid Spade
2.錄製測試(Web – testing) :
進藤光有佐維,工程師有測試!
工具 : ex. selenium
3.重構 - 註解 :
先註解比較高層級的思維,瞭解主要功用是啥
4.重構 - 擷取方法 :
算是重構起手勢了,vs有熱鍵可以輕鬆擷取方法
目的是提升閱讀性
5.重構 - 職責分離 :
好記的方式是主動詞分離
主詞(類別),動詞(方法)
6.新增單元測試
幫新產生的類別增加單元測試,只要有測試在就不怕被改壞
7.重構 - 抽象相同性質的物件
利用介面來把相同性質的東西擷取出來,方便進一步簡化跟提升閱讀性
提醒 : 在這過程中,測試自己有沒有改錯的測試熱鍵,就按了數十次有了吧,
如果換成每次都自己按建置輸入資料,所花的成本會更高!!
慢慢把測試當作是開發的一部份,我想是成為更有價值工程師的重要一步呢!!

2017年1月11日 星期三

我跟新人之間的差別~

 

今天我體會到一件事,就是我跟新人之間的差別

我跟新人一樣,沒有比較聰明,也沒有比較有天分,唯一明顯的差別就是經驗

講經驗也太籠統,夠量化的說明就是遇到失敗的次數吧

因為我遇到失敗的次數比較多,所以我解決過的失敗問題也多

累積下來就是我在開發上比新人快,如此而已

 

簡單歸納,要讓自己更有價值,就快點開始累積錯誤的經驗,然後解決它,不二犯!

以上

2017年1月4日 星期三

[C#] 寫入資料至文字檔

string txt_name = "test.txt";
FileStream fileStream = new FileStream(txt_name, FileMode.Create);
fileStream.Close();   //要關!
 
using (StreamWriter sw = new StreamWriter(txt_name))
{
    // write...
    foreach (var item in List)
    {
        sw.WriteLine(item);
    }
}