🚫 Ad Blocker Detected

Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker

請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面

0%

裝飾者模式是一個很精美且優雅的模式

本篇範例 文字內容->AES加密->Zip檔附加密碼->輸出儲存

情境
有個需求要做

  • 文字內容->壓縮zip(附上密碼)->輸出儲存
    又改成…

  • 文字內容->AES加密->輸出儲存
    需求又改成….

  • 文字內容->AES加密->Zip檔附加密碼->輸出儲存

可發現需求一直在對於文字內容操作順序做變化,但他們核心離不開對於文字內容的操作

這種情境很適合來使用 [裝飾者模式]

裝飾者模式 有兩個主要角色 被裝飾物件(Decorated) & 裝飾物件(Decorator)

  1. 被裝飾物件(Decorated)就像蛋糕的一樣,
  2. 裝飾物件(Decorator)就是上的水果,奶油,巧克力…等等裝飾物品

一般先有蛋糕被裝飾物件(Decorated),後再將裝飾物品加上去裝飾物件(Decorator)

被裝飾物件(Decorated)如下圖 蛋糕的原型

Read more »

Base家族以Base64最為出名,這邊會用Base64編碼來做介紹

寫網站應該都用過Base64但你對於他的原理了解嗎?

此篇和大家分享Base家族的秘密


用途:

Base64主要用途是某些系統中只能使用ASCII字符,為了避免某些機器無法識別我們傳輸資料

Base64就是用來將非ASCII字符的數據轉換成ASCII字符的一種方法。

 base64特別適合在http,mime協議下快速傳輸數據(例如我們常使用 Email)

它使用下面表中所使用的字符與編碼。

http://www.asciitable.com/index/asciifull.gif

Read more »

如果要製作月報…但只有給起訖日

pic

要產生出如下的列表 要怎麼辦…

pic

第一個想到的解法 會使用 WHILE + [暫存表] 迴圈遍歷 把每個月新增入暫存表中

程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DECLARE  @t TABLE
(
StartDate DATETIME,
EndDate DATETIME
);

INSERT INTO @t
( StartDate, EndDate )
VALUES ( '2017/01/01', -- StartDate - datetime
'2018/01/01' -- EndDate - datetime
);

--宣告一個起始時間變數
DECLARE @TempStartDate DATETIME
DECLARE @TempEndDate DATETIME

--設置變數 最小時間(起始時間) 和 最大時間
SELECT @TempStartDate = StartDate,@TempEndDate=EndDate
FROM @t

CREATE TABLE #TEMP(Dates DATETIME)

WHILE(@TempStartDate < @TempEndDate)
BEGIN
--將資料新增入暫存表
INSERT INTO #TEMP (Dates) VALUES (@TempStartDate)
--每跑一次迴圈就加一個月
SELECT @TempStartDate = DATEADD(MONTH,1,@TempStartDate)
END

SELECT * FROM #TEMP

DROP TABLE #TEMP

但這個解法雖然簡單..但程式碼又臭又長..

Q: 有沒有更好看的解法又可達成目的呢?

ANS: 有!! 就是本次主角 CTE 遞迴

Read more »

如果要製作月報…但只有給起訖日

pic

要產生出如下的列表 要怎麼辦…

pic

第一個想到的解法 會使用 WHILE + [暫存表] 迴圈遍歷 把每個月新增入暫存表中

程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DECLARE  @t TABLE
(
StartDate DATETIME,
EndDate DATETIME
);

INSERT INTO @t
( StartDate, EndDate )
VALUES ( '2017/01/01', -- StartDate - datetime
'2018/01/01' -- EndDate - datetime
);

--宣告一個起始時間變數
DECLARE @TempStartDate DATETIME
DECLARE @TempEndDate DATETIME

--設置變數 最小時間(起始時間) 和 最大時間
SELECT @TempStartDate = StartDate,@TempEndDate=EndDate
FROM @t

CREATE TABLE #TEMP(Dates DATETIME)

WHILE(@TempStartDate < @TempEndDate)
BEGIN
--將資料新增入暫存表
INSERT INTO #TEMP (Dates) VALUES (@TempStartDate)
--每跑一次迴圈就加一個月
SELECT @TempStartDate = DATEADD(MONTH,1,@TempStartDate)
END

SELECT * FROM #TEMP

DROP TABLE #TEMP

但這個解法雖然簡單..但程式碼又臭又長..

Q: 有沒有更好看的解法又可達成目的呢?

ANS: 有!! 就是本次主角 CTE 遞迴

Read more »

小弟之前有分享過串接【財政部查詢類電子發票API】小框架使用文

使用文連結 快速使用財政部電子發票API 使用 C#
串接文件下載 電子發票查詢API 1.4.4
程式原始碼連結

這次想跟大家分享我做出此框架的歷程..


框架目的:希望可以做出方便日後維護擴展的API。

串接API時發現他們有幾個共同之處

  1. API請求參數名稱需降冪排列
  2. 請求參數最後會加上簽章
  3. 都有時間戳記
  4. 回應資料格式都是Json
  5. 都是使用Http (Get or Post)

 

我就想到可以使用 工廠模式來實作這系列產品 (工廠模式主要是切割產品的使用和生產)

產品解說

Read more »

小弟之前有分享過串接【財政部查詢類電子發票API】小框架使用文

使用文連結 快速使用財政部電子發票API 使用 C#
串接文件下載 電子發票查詢API 1.4.4
程式原始碼連結

這次想跟大家分享我做出此框架的歷程..


框架目的:希望可以做出方便日後維護擴展的API。

串接API時發現他們有幾個共同之處

  1. API請求參數名稱需降冪排列
  2. 請求參數最後會加上簽章
  3. 都有時間戳記
  4. 回應資料格式都是Json
  5. 都是使用Http (Get or Post)

 

我就想到可以使用 工廠模式來實作這系列產品 (工廠模式主要是切割產品的使用和生產)

產品解說

Read more »

今天和大家分享AwesomeProxy.Net小弟開源AOP輕型框架

簡單介紹 AOP (Aspect-Oriented Programming)

AOP 是 OOP(物件導向)一個變化程式撰寫思想。(非取代OOP而是擴充)

導入AOP幫助:
可幫我們分離核心邏輯非核心邏輯代碼,很好降低模組間耦合性,已便日後擴充。

  非核心邏輯代碼像:(日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來)

例如下圖:

https://ithelp.ithome.com.tw/upload/images/20180209/20096630UyP6I4l2MB.png

  原本寫法把寫日誌相關程式寫入,業務邏輯方法中。導致此方法非單一職則。我們可以把程式重構改寫成(右圖),將寫日誌方法抽離出來更有效達成模組化。

經典例子:

Asp.Net MVC中Contoller,Action過濾器(FilterAttribute)

Read more »

今天和大家分享AwesomeProxy.Net小弟開源AOP輕型框架

簡單介紹 AOP (Aspect-Oriented Programming)

AOP 是 OOP(物件導向)一個變化程式撰寫思想。(非取代OOP而是擴充)

導入AOP幫助:
可幫我們分離核心邏輯非核心邏輯代碼,很好降低模組間耦合性,已便日後擴充。

  非核心邏輯代碼像:(日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來)

例如下圖:

https://ithelp.ithome.com.tw/upload/images/20180209/20096630UyP6I4l2MB.png

  原本寫法把寫日誌相關程式寫入,業務邏輯方法中。導致此方法非單一職則。我們可以把程式重構改寫成(右圖),將寫日誌方法抽離出來更有效達成模組化。

經典例子:

Asp.Net MVC中Contoller,Action過濾器(FilterAttribute)

Read more »

我們在寫網站一定會使用到 Session
今天就跟大家分享自製微型 Asp.net Session

分析Session->實作Session->使用Session

在實作之前您必須先了解甚麼是Session
網路上一大堆介紹Session文章在此我就不多介紹
或可以點進之前小弟的介紹文來簡單了解 SessionID.cookie,Session傻傻分不清楚??

簡單說明:
Http協議是一個無狀態協議。

核心是 請求=>處理=>回應

每次請求都是獨立不會記住上一次做了甚麼
Session可以幫我們把資料存在Server記憶體,方便我們下次請求使用
上網連線眾多使用者,Server怎麼知道哪份資料,屬於哪個使用者的? 這就要依靠 SessonID
SessionID就像使用者的號碼牌,可以到Server拿相對應的資料

分析:

  1. 使用者請求頁面時會攜帶該網域下Cookies。
  2. Asp.net接收到並使用Key為SessionID的Cookie,使用Cookie的Value來SessionPool中查找屬於使用者的Session。
    如果是第一次請求或是沒有SessionID 會幫他產生一個新的並加入回應的Cookie中
  3. 取得Session物件後就可以在程式中使用。

分析如下圖:

Read more »

傳址,傳參考,傳址 是基本但重要的概念。此概念在很多語言都通用

我使用Gif動畫檔 快速帶領大家了解 傳址,傳參考,傳址

  1. 傳值(Call By Value)

    顧名思義 是把傳到 另一個記憶體位置

https://dotblogsfile.blob.core.windows.net/user/%E4%B9%9D%E6%A1%83/e39d0fd8-5258-4484-949c-3019082ff20e/1519627294_92268.gif

  1. 傳址 (Call By Adress)

是把記憶體位置傳到 另一個記憶體位置

補充:嚴格來說(Call By Adress)是不正統的說法,其實傳址也是傳值但傳的是記憶體位置

https://dotblogsfile.blob.core.windows.net/user/%E4%B9%9D%E6%A1%83/e39d0fd8-5258-4484-949c-3019082ff20e/1519627835_01874.gif

  1. 傳參考(Call By Reference)

    是把記憶體位置傳到 移到另一個記憶體位置上 (可看作同一個物件)

https://dotblogsfile.blob.core.windows.net/user/%E4%B9%9D%E6%A1%83/e39d0fd8-5258-4484-949c-3019082ff20e/1519627909_09266.gif

Read more »