Posts
Jil - Serialize DateTime to ISO8601 Format
Jil 在做時間的序列化,預設出來的資料會跟 JavaSriptSerializer 一樣,會序列化成下面這個樣子:
"/Date(1290181373164)/" 若要改成 ISO8601 的格式,我們可以帶入 Options 進行指定:
... Console.WriteLine(JSON.Serialize(dt, new Options(dateFormat : DateTimeFormat.ISO8601))); Console.WriteLine(JSON.Serialize(dt, Options.ISO8601)); ... 完整的範例如下:
using Jil; using System; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { var dt = DateTime.Now; Console.WriteLine(JSON.Serialize(dt)); Console.WriteLine(JSON.Serialize(dt, new Options(dateFormat : DateTimeFormat.ISO8601))); Console.WriteLine(JSON.Serialize(dt, Options.ISO8601)); } } } {% img /images/posts/JilIso8601/1.png %}
read morePosts
Jil - Fast .NET JSON (De)Serializer
Jil 是 JSON 處理的套件,號稱比 JSON.NET 更快,甚至是當前套件中處理起來第二快的,僅次於 Protobuf。
{% img /images/posts/Jil/1.png %}
{% img /images/posts/Jil/2.png %}
{% img /images/posts/Jil/3.png %}
{% img /images/posts/Jil/4.png %}
{% img /images/posts/Jil/5.png %}
{% img /images/posts/Jil/6.png %}
只要加入 NuGet 參考,Using Jil 命名空間即可開始使用。
要序列化時,可將物件帶入 JSON.Serialize 方法,方法會回傳序列化後的 JSON 字串。
... var json = JSON.Serialize(larry); ... 解序列化時,可將 JSON 字串帶入 JSON.Deserialize,並利用範型指定所要解回的物件型態即可。
... larry = JSON.Deserialize<Person>(json); ... 此外,它也支援動態解析的能力,使用上只要將 JSON 字串帶入 JSON.DeserializeDynamic 即會回傳 Dynamic 物件。
... var person = JSON.DeserializeDynamic(json); ... 完整的操作範例如下:
read morePosts
Boxing amp; UnBoxing
Boxing 是種隱含的處理,當 Value Type 物件塞到 Reference Type 時發生,會幫我們在 Managed Heap 建立一塊空間,並將本來 Value Type 的值賦予其中。
舉個例子來說,像是這邊宣告個 int 變數 i,若我們像下面這樣將它塞到 object。
int i = 123; object o = i; // explicit boxing {% img /images/posts/BoxingUnBoxing/1.png %}
因為 int 為 Value Type,object 為 Reference Type,故會做 Boxing 的處理。
UnBoxing 是種明確的處理,當我們將裝箱的物件明確轉型時發生,會把裝箱的物件塞回到 Stack。
像是延續之前的例子,我們將 o 轉型成 int 時,裝箱在裡面的資料會被拆箱出來放到新的 Stack 位置。
int i = 123; // a value type object o = i; // boxing int j = (int)o; // unboxing {% img /images/posts/BoxingUnBoxing/2.
read morePosts
PL/SQL amp; SQL CODING GUIDELINE 5 - Avoid using literals in your code
條款五,避免在程式中直接使用字串。
像是下面這樣的程式:
SET SERVEROUTPUT ON Begin DBMS_OUTPUT.put_line('Root Account:' || 'Admin'); End; 可以像下面這樣改寫,建立一個 Package 統一存放常數字串,呼叫端改透過 Package 叫用。
SET SERVEROUTPUT ON CREATE OR REPLACE PACKAGE CONST IS ROOT_ACCOUNT CONSTANT varchar(50) := 'Admin'; END CONST; / Begin DBMS_OUTPUT.put_line('Root Account:' || CONST.ROOT_ACCOUNT); End; 這樣常數字串的宣告會集中在 Package 內,修改上也比較方便。
read morePosts
PL/SQL amp; SQL CODING GUIDELINE 2 - Always have a matching loop or block label
條款二,如果程式中有迴圈區塊,為其加上 label 讓他的區塊範圍更為清楚。
像是下面這樣的程式:
SET SERVEROUTPUT ON DECLARE i PLS_INTEGER; Begin FOR i IN 1..10 LOOP DBMS_OUTPUT.put_line('i =' || i); End LOOP; End; 可以像下面這樣改寫,在 For…Loop 前面加上 Label,然後在 End 後加上 Label Name。
SET SERVEROUTPUT ON DECLARE i PLS_INTEGER; Begin <<Print1To10>> FOR i IN 1..10 LOOP DBMS_OUTPUT.put_line('i =' || i); End LOOP Print1To10; End; 改完程式碼的區塊範圍清楚了許多。
read morePosts
PL/SQL amp; SQL CODING GUIDELINE 1 - Try to label your sub blocks
條款一,如果程式中有子 block,嘗試使用 label 讓他的區塊範圍更為清楚。
像是下面這樣的程式:
SET SERVEROUTPUT ON Begin DBMS_OUTPUT.put_line('Start'); Begin DBMS_OUTPUT.put_line('Processing...'); End; DBMS_OUTPUT.put_line('End'); End; 可以像下面這樣改寫,在子 Block 的 Begin 前面加上 Label,然後在 End 後加上 Label Name。
SET SERVEROUTPUT ON Begin DBMS_OUTPUT.put_line('Start'); <<Processing>> Begin DBMS_OUTPUT.put_line('Processing...'); End Processing; DBMS_OUTPUT.put_line('End'); End; 改完程式碼的區塊範圍清楚了許多。
read morePosts
PL/SQL Cop for SQL Developer
PL/SQL Cop for SQL Developer 是 SQL Developer 的外掛元件,能幫靜態分析 PL/SQL 程式碼中哪些地方是寫的不好的。
PL/SQL Cop for SQL Developer 的檢查遵照的是 Trivadis PL/SQL & SQL Coding Guidelines Version 2.0 內的規則,若有規則不清之處可參閱這份文件,內有詳細的說明。
首先進行安裝。開啟 SQL Developer,選取 [ Help | Check for Updates… ]。
{% img /images/posts/PLSQLCopForSQLDeveloper/1.png %}
{% img /images/posts/PLSQLCopForSQLDeveloper/2.png %}
這邊可以用 Update Centers 下去找尋套件, Update Center 的位置為 http://www.salvis.com/update/tvdcc。
也可以從本地檔案安裝,但要先至 PL/SQL Cop for SQL Developer 1.0.11 | Philipp Salvisberg’s Blog 這邊將套件下載下來。
{% img /images/posts/PLSQLCopForSQLDeveloper/3.png %}
設好後按下 Finish 按鈕進行安裝。
read morePosts
Code Analysis Error CA0058
最近抽空把開發中的專案設定了一下 Code Analysis,運行時發生了 CA0058 這個錯誤。
{% img /images/posts/CA0058/1.png %}
要解決這個問題,在 Visual Studio 2012 以前可以修改 FxCopCmd.exe.config。位置在
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Static Analysis Tools\FxCop\FxCopCmd.exe.config {% img /images/posts/CA0058/2.png %}
實際位置需視 Visual Studio 版本或是安裝位置下去調整。
將之開啟找到 AssemblyReferenceResolveMode 的值改為 StrongNameIgnoringVersion。
{% img /images/posts/CA0058/3.png %}
Visual Studio 2012 後我們要開啟專案檔進行編輯,在第一個 PropertyGroup 中加入 CodeAnalysisAdditionalOptions,將其設為 /assemblyCompareMode:StrongNameIgnoringVersion。
... <PropertyGroup> ... <CodeAnalysisAdditionalOptions>/assemblyCompareMode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions> ... </PropertyGroup> ... {% img /images/posts/CA0058/4.png %}
這樣設完問題應該就解決了。
Link c# - Visual Studio 2012 Code Analysis Error CA0058 - Stack Overflow c# - Using Microsoft.
read morePosts
LeetCode - Happy Number
LeetCode 的 Happy Number 題目如下:
Write an algorithm to determine if a number is “happy”.
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
read morePosts
SpecFlow - Getting Started
Specflow 使用前 Visual Studio 需先透過 Extension Manager 搜尋並安裝 SpecFlow Extension。
{% img /images/posts/SpecFlowGettingStarted/1.png %}
{% img /images/posts/SpecFlowGettingStarted/2.png %}
{% img /images/posts/SpecFlowGettingStarted/3.png %}
然後建立一個測試專案,並透過 NuGet 為其加入 SpecFlow Package。
{% img /images/posts/SpecFlowGettingStarted/4.png %}
{% img /images/posts/SpecFlowGettingStarted/5.png %}
{% img /images/posts/SpecFlowGettingStarted/6.png %}
套件加入後在專案中會多個 App.config 檔,若非使用 NUnut 去撰寫測試,這邊需加指定 unitTestProvider。
{% img /images/posts/SpecFlowGettingStarted/7.png %}
接著用 SpecFlow Extension 裝進去的 SpecFlow Feature File 範本建立一個 Feature 檔 。
{% img /images/posts/SpecFlowGettingStarted/8.png %}
Feature 檔建立後會長的像下面這樣:
{% img /images/posts/SpecFlowGettingStarted/9.png %}
read more