星期二, 12月 31, 2013

我的阿蛛

我的阿蛛,它一直住在我的房間裡,三不五時會出來嚇嚇我,也常常亂吐絲,讓我們走路的時候會沾到它的口水,但是我很愛它,每次都遠遠的看著它,偶而跟它拍拍照,跟它說說話…

clip_image001

但是,在 2013 年的最後一天,我洗完澡準備穿衣服,忽然發現有東西在我身上爬,我直覺的把那那東西甩開,用迅雷不及的右手邊的肥皂盒丟出去....阿....我的阿蛛中槍了 ><||..它全身萎縮,還有一隻腳在異處...

clip_image002

安息吧!我的阿蛛,我會想念你的..

TypeScript 相遇 (一)

一年前,微軟丟出了一個東西新東西 TypeScript, 當時看到 Anders Heijlsberg 的影片簡介,就對它相當有興趣,不過因為考量到新語言的一開始,通常都還一段不小的路要走,還有那時候也沒有多餘的時間,所以就一直放在的口袋名單之中。在兩三個星期前,微軟丟出了 TypeScript 0.9.5 beta 版本,也宣稱 1.0 也在開發者版本了,所以沒有啥好考慮的,直接開始使用了 ^^||

那 TypeScript 是什麼?引用官方網站的介紹
TypeScript is a language for application-scale JavaScript development.
TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.
Any browser. Any host. Any OS. Open Source.
上面這段,簡單的說,TypeScript 可以幫助程式設計師寫出系統層級的 JavaScript,TypeScript 是一個有型別的語言,編譯後可以轉出一般的 JavaScript,也可以跑在任何的環境以及瀏覽器。光這幾句話,就讓 Bibby 很心動了,有很多的亮點,大家有跟我一樣內心內心雀躍嗎? XD

當然學一個新東西,一定要上網 Google 一下有沒有相似的產品,畢竟太陽底下沒有新鮮事,要投入前一定要評估一下的,首先我們看看底下另一個東東..

Dart 這是 2011 年年底,由 goolge 丟出來的東西,看起來跟微軟的 TypeScript 很像,可以用 OO 的方式寫 JavaScript,也是有型別的概念,然後經過 Dart Editor 的編譯轉出 js 檔,Bibby 我很大概大概的看一下玩一下,語法真的很像 C#,想玩的可以先去 http://try.dartlang.org/ 線上編輯器玩玩

接下來,很簡單很粗略的比較一下兩者,比較後,TypeScript 就是我決定的嬪妃語言,Bibby 我把為啥選用 TypeScript 而沒有選 Dart 的理由列出來
  • 原生的 JavaScript 丟到 TypeScript 是支援的
    1. 代表如果之前有寫好的 Code,就不需要修改也可以被編譯
    2. 網路上滿山滿谷的 JavaScript Library 還是可以拿來用
  • 原生的 JavaScript 來設計 TypeScript 語法
    1. 會 JavaScript,學 TypeScript 沒有啥學習曲線(不過 OO 的觀念就?)
    2. 語法照著 ECMAScript 6 脈絡的方式設計,所以一次學兩個新東西 XD
    3. 寫起來還是感覺像 JavaScript

當然這些只是 Bibby 從語法還有官方文件看完的一些心得比較,實際上要去寫過後,才能有更深入更多的心得感想來分享,但是有人一定會問說,幹麻不直接寫 JavaScript,用這些有的沒有的最後還不是要轉成 JavaScript,這時候當然就是要當個理由伯,為啥多了薄薄一層隔山打牛的 fu 說出來 XD
  • 強型別
    1. 我可以在「編譯」時就可以知道我程式寫錯了
    2. Refactor 更簡單,因為原來在寫 JavaScript 編輯器都是用猜的方式來處理的,有了強型別每個變數跟 Method 連結更強烈
  • OO 寫程式
    1. 不是說原生的 JavaScript 的不能用 OO 來寫程式,而是 Bibby 我覺的用原生的 JavaScript 來寫 OO 好辛苦阿!因該是 Bibby 自己的問題 X
  • 模組化
    1. 原生的也可以分門別類的模組化,之前 Bibby 寫的 JavaScript 也都拆開來,但是由 Visual Studio 來處理這一塊簡單很
    1. 產出來的 JavaScript 超美麗,是之前 Bibby 想要寫出來的,只是能力不夠,寫不出來 XD
    2. 效能也更好,因為型別對了,JavaScript Engine 不需要幫你默默做些苦工(ex:轉型)

來結論一下,TypeScript 目前看起來還真不錯,但是現在還是 Beta 版,不算是成熟的東西,要用在正式的產品上,是有風險的,好消息是 Release 版應該快出來了,應該可以期待一下,投入一個語言的學習,是需要時間的投資,接下來 Bibby 我會陸續分享關於 TypeScript 的語法及心得,讓對 TypeScript 有興趣的人,可以有一些心得可以參考,一起努力吧!

參考:
http://www.typescriptlang.org/
http://blogs.msdn.com/b/ericsk/archive/2012/10/02/quick-look-on-typescript.aspx
https://www.dartlang.org/
https://code.google.com/p/dart/
http://zh.wikipedia.org/wiki/Dart
http://en.wikipedia.org/wiki/ECMAScript

星期五, 10月 04, 2013

Code First 紀錄

最近手頭有小案子,案子是一個人做,Database 部份可以完全自己控制,所以就把 Code First 的開發模式納入此專案,因為這種開發模式之前沒有經驗,所以在此記錄一下開發流程以及問題!

直接看圖說故事吧!

Nuget 下載 Entity Framework
 
clip_image001

設定 web.config

<connectionStrings>

    <add name="test" 
         connectionString="Data Source=(LocalDB)\v11.0;
AttachDbFilename=D:\Temp\CodeFirst\App\Database1.mdf;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
 
    <!--<add name="test"
         connectionString="Data Source=server;Initial Catalog=xxxxx;
Persist Security Info=True;User ID=test;Password=test;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"/>-->
</connectionStrings>

這兩個連線字串,看你的需求選一個來用,還有 providerName 很重要,Entity Framework 是靠著這 provider 來產生產生 Database 的 DDL(數據定義語言)、DML(數據操縱語言)和 DCL(數據控制語言)

class

public class User
{
    public User()
    {
        Roles = new List<Role>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime Birthday { get; set; }

    public IList<Role> Roles { get; set; }
}

public class Role
{
    public Role()
    {
        Users = new List<User>();
        Functions = new List<Function>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }

    public IList<User> Users { get; set; }
    public IList<Function> Functions { get; set; }
}

public class Function
{
    public Function()
    {
        Roles = new List<Role>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Key { get; set; }
    public IList<Role> Roles { get; set; }
}


public class TestContext : DbContext
{
    public TestContext() : base("test") { }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Function> Functions { get; set; }
}

這裡建立權限資料表,User、Role and Function 分別是多對多的關係

Command

這裡我是使用 command 來手動修改資料庫的方式

clip_image002

啟動 Migrations 機制,記得 Default porject 要選擇有裝 Entity framwork 5.0 的專案

clip_image003

> Enable-Migrations

接下來 visual studio 裡面模擬變更,「Init」可以自訂

clip_image004

> Add-Migration xxxxx

clip_image005

這檔案就是說明會對 Database 做哪些動作的檔案

最後更新 Database,後面參數是要把更新 database 的內容顯示出來

clip_image006

> update-database -Verbose

clip_image007

這樣就完成了,很簡單吧!如果我們之後要新增欄位,或是修改欄位名稱,只要修改完 Entity 後,執行「add-migration xxx」還有「update-database -Verbose」就可以更新完成了,還有這裡提醒一下,用 code first 開發方式,會在 database 裡面產生「__MigrationHistory」 這個 table, 沒事不要砍掉阿!因為所有更新的 schema 的更新紀錄都在裡面,砍掉後會有嚴重的後果(不要問,很恐怖) 一_一||

最後

這裡說一下我用這模式開發後的心得
  1. 用 linq to entity 去取得資料,條件變得簡單了,像是多對多的關係的 table,中間不用在卡一個關聯 table
  2. 開發起來真的像是在操作物件,不像之前 Database First 方式,感覺還是跟操作 table 一樣
  3. 方便直覺,幾乎都可以在 visual studio 裡面就把程式寫完了
所以這裡 Bibby 建議,如果有小案子,可以拿小案子來試試看,應該會有不錯的體驗喔 ^^

參考:
http://msdn.microsoft.com/zh-tw/data/ee712907

星期一, 8月 12, 2013

Json.NET 取代 JsonResult

最近在處理 AJAX 上遇到一個問題,當我後端 Action 傳資料到前端讓 Javascript 處理時,會遇到 Json 字串無法轉成 Javascript 物件,花了一些時間 Debug,原來是「Datetime」型別在 ASP.NET MVC 的內建 Json 處理方式跟 Javascript 的定義不同,所以當下就換了 Json.NET 來處理,問題就消失了

來問題重現一下
 
要序列化的型別

public class User
{
    public string Name { get { return "Bibby"; } }
    public int Age { get { return 22; } }
    public DateTime Birthday { get { return new DateTime(2001, 01, 01); } }
}

內建的序列化

{"Name":"Bibby","Age":22,"Birthday":"\/Date(978278400000)\/"}

Json.NET 序列化

{"Name":"Bibby","Age":22,"Birthday":"2001-01-01T00:00:00"}

兇手就是 Datetime 型別,因為也不太想去查內建的 JsonResult 是怎麼處理的,於是乾脆在 BaseController 把預設的 ASP.NET MVC 的內建 JsonResult 複寫(override)掉,下面就是 Code 的部份

public abstract class BaseController : Controller
{ 
    //override jsonresult
    protected override JsonResult Json(object data, string contentType
            , System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new JsonDotNetJsonResult()
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding,
            JsonRequestBehavior = behavior
        };
    }

    public class JsonDotNetJsonResult : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if ((this.JsonRequestBehavior == System.Web.Mvc.JsonRequestBehavior.DenyGet) 
                    && string.Equals(context.HttpContext.Request.HttpMethod, "GET"
, StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("MvcResources.JsonRequest_GetNotAllowed");
            }
            HttpResponseBase response = context.HttpContext.Response;
            if (!string.IsNullOrEmpty(this.ContentType))
            {
                response.ContentType = this.ContentType;
            }
            else
            {
                response.ContentType = "application/json";
            }
            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }
            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

有問題再討論吧!

Reference
http://www.servicestack.net/docs/text-serializers/override-mvc-jsonresult
http://stackoverflow.com/questions/726334/asp-net-mvc-jsonresult-date-format
http://www.dotblogs.com.tw/wadehuang36/archive/2012/02/05/jsonplusresult.aspx


星期四, 7月 25, 2013

Team Foundation Service 寄信通知

今天 partner 在使用 Team Foundation Service 的時候,問了我說:「有沒有辦法在 Commit 的時候,或是我被派到 Task 的時候,發個信通知一下!」,當下我還蠻篤定的跟他說,ALM 這種軟體工程軟體,寄 Email 都是必備的東西,只是找不找的到罷了,所以就花一點時間,把這個需求設定完成了,這裡就做個記錄,分享給需要的人吧!

首先,打點選畫面右上角的「設定」

clip_image001

開啟設定畫面

clip_image002

  1. 設定項目的分類「Alerts」
  2. 左方的「xxx Team alerts」
  3. 「Work Item Alerts」這是設定工作項目通知
  4. 「Push Alerts」上傳程式時通知
  這裡就用「Work Item Alerts」來做範例

clip_image003

  1. 編輯規則條件
  2. 編輯規則條件的細節內容
  3. 新增條件 
Bibby 我之前已經新增一個規則了,所以在「1」的部份有一條規則
 
點選一下「3」來新增一條

clip_image004

  1. 影響的單位(也可以選擇通知自己)
  2. 哪些事件會通知(Checkin, Build 等等)
  3. 內建規則(Bibby 我習慣是直接套規則,然後再微調)
選擇「A work item is assigned to me」

clip_image005

就把該有的條件都建立好了,只要依照自己所需的在微調就行了!
 
測試一下,新開一個 Task 給自己,收 email 就可以看到信了

clip_image006

簡單的設定方法,就可以達到需求了,另一個在設定 Commit 程式時,寄信的規則也差不多,所以就不再重複一次了,有遇到問題一起討論吧!!

星期三, 7月 17, 2013

ReSharper 好用快捷鍵

最近因為一些原因,把 Visual Studio 原本習慣用的 CodeRush 改成 ReSharper,換掉的原因就不多說了,畢竟 CodeRush 也陪伴我很長一段時間,不說它的壞話 XD..今天要來分享一下 ReSharper 這個很不錯的開發工具..

首先可以上 ReSharper 的官網看一下到底有啥好用的功能提供
  • Code quality analysis (程式品質分析)
  • Eliminate errors and code smells (程式壞味道提醒)
  • Safely change your code base (安全的改變程式碼)
  • Instantly traverse your entire solution (方便巡弋您的專案)
  • Code editing helpers (程式編輯幫助)
  • Compliance to coding standards (程式碼標準建議)

上面這些是在首頁主打的功能,看起來就蠻不錯的,如果沒有啥時間,官網首頁的 Video 看過一次,就大概知道可以幫你做哪些事情了 直接下載安裝吧!

clip_image001
 
安裝完後大致上就可以使用了,不過在 Bibby 的開發上,很多習慣都用快捷鍵去執行,所以馬上去設定快捷鍵的部份,去開啟「Options」

clip_image002
 
選擇「Keyboard & Menus」,設定「ReSharper 2.x」就行了,之後快捷鍵就會以 ReSharper 的為主了,還有如果以後有想恢復或是重置快捷鍵設定,在重做一次就行了

clip_image003
 
這樣設定完後,如果預設快捷鍵跟 ReSharper 快捷鍵有衝突,就會跳出提醒視窗

clip_image004
 
通常如果已經在 Visual Studio 常用的快捷鍵,如 Ctrl + E,C 這種,那我繼續 Visual Studio ,反之就用 ReSharper 就對啦!

當然這裡一定要分享一下 ReSharper 好用的快捷鍵給大家,下列是 Bibby 我常用的快捷鍵
 

Alt+Enter (Show available quick fixes and context actions)
 
clip_image005

只要「鎚子」圖示有出現,按下「Alt+Enter」就會出現建議值,這算是我最常用的一個功能
 

Ctrl+Shift+G (Super Go)
 
clip_image006

方便巡弋到你想到的程式,「Implementation」「Usages of Symbol」「Declaration」等,都是會常用到的
 

Ctrl+Shift+R (Refactor this)
 
clip_image007

重構的部份,會給你很多的建議值,會幫你省去很多的麻煩事

 
Ctrl+N / Ctrl+Shift+N (Search Type / Serach File)
 
clip_image008

把專案中關鍵字的「類別」列出來

clip_image009

把專案中關鍵字的「檔案」列出來
   

Ctrl+Shift+Space (Smart Completion)
 
clip_image010

可以提供建議,讓你知道要輸入哪些內容
 

Alt+Shift+L (Locate in Solution Explorer)
 
在檔案總管中指出正在編輯哪個檔案,這功能也相當好用
 

這些快捷鍵,都是 Bibby 日常在開發上用到的,使用 ReSharper 一段時間,慢慢了習慣 ReSharper 的開發方式,效率上也更增進,好的工具可以讓你上天堂,壞的..壞的就不多說了,如果有更好的使用方式,歡迎各位大大們可以補充分享!

PS:
  1. ReSharper 是個付費軟體,個人使用是199美金,如果你有 Open Source 的專案或是學生老師,就可以免費使用了
  2. 在 CodeRush 上有個「Tab」鍵可以在各個 method 上面巡弋,Bibby 我在 ReSharper 一直找不到相關的功能,如果知道的話,麻煩通知一下,感謝!
Reference:
http://www.jetbrains.com/resharper/


星期一, 5月 27, 2013

AngularJS 開發 ASP.NET MVC – twMVC #9

上週,在 twMVC 介紹了關於如何用 AngularJS 來開發 ASP.NET MVC 的觀念及心得分享,這裡把相關資源還有補充內容放在這篇文章,便於以後想投入學習的各位朋友

投影片:

https://speakerdeck.com/twmvc/angularjs-kai-fa-asp-dot-net-mvc-twmvc-number-9

投影片範例:

https://github.com/twMVC/twMVC-9-2

 

補充資料:

Batarang 相關教學
http://blog.angularjs.org/2012/07/introducing-angularjs-batarang.html

關於實作後的檔案分類方式,可以參考這篇文章
http://blog.artlogic.com/2013/05/02/ive-been-doing-it-wrong-part-1-of-3/

 

至於其他相關的問題,我之後都會補充上來!

星期日, 4月 21, 2013

開啟 Excel 記憶體或磁碟空間不足

這一定要來說說的,人品不好才會遇到這種鳥事,話說人家寄給我 Excel 今天都打不開,出現

SNAGHTML3644cd

找了半天,電腦開了好幾次,就是出現這麼問題,網路上的解法,都沒用啦!!!!!><||

最後自己亂試,在檔案屬性按右鍵,出現了「解除封鎖」按鈕

SNAGHTML3a54c4

按下去就順利開啟.....

天阿!是怎樣,還我青春XD

 

PS:我不知道為什麼會這樣子,不要問我我對電腦做啥事><||

星期四, 4月 11, 2013

Pretty Woman 新貨上架啦!

喜歡美女、熱愛美女,沒有美女就吃不下飯,就睡不著覺,甚至就活不下去的美女癡、美女狂、各位阿宅朋友大家好,這裡狂賀一下新貨「Pretty Woman」上線了!這是 NeverApp 團體(文後會介紹)的第一個 App,希望大家有空沒空去載下來,用手指感受一下看美女的樂趣!

這個 App 當初想法很簡單,希望能在手機裡看到很多"美"的事物,就在那時,阿宅魂忽然跑到筆者的腦袋中,對筆者歲歲念「正妹牆」…「正妹牆」…,擋不著阿宅魂歲歲念的大絕招,於是把正妹牆放在手機裡的想法就出現了,不過想的容易,做起來還真的有點不簡單,當初的小品,現在哩哩拉拉的一堆有的沒有的,一起和夥伴討論怎麼用才比較有感覺,怎麼用手機才不會爆掉,怎麼處理可以把第一版快速實作出來等等等..最後花了一段時間,沒有辜負阿宅神的期盼,成功上線丟出第一版,這裡就簡單介紹一下這個 「Pretty Womam」!

下載位置

http://www.windowsphone.com/zh-tw/store/app/pretty-woman/87549710-6858-4745-9f61-d3bae0f2d212

本 App 的主打星「正妹牆」,就是這面牆就是這面牆,使用方法很簡單,拿你的手指,別想太多,給它滑來滑去去就對了!

clip_image001

看了一堆讓人心癢癢正妹圖,當然要有「加入最愛」這個功能,這是阿宅魂每晚到我夢裡跟我千叮嚀萬叮嚀的XD..

clip_image002

在這個 App 裡面,點任何(妹)的小圖會變大圖喔!而且如果想看更仔細的話,請用兩根手指頭,讓兩根手指分開,這樣就會放大啦,嘿嘿,貼心吧!

clip_image003

看到這裡,其實筆者覺得,我寫再多,都沒有你自己去把這 App 載下來自己滑一滑的有感覺,不寫了不寫了,寫再多都是多說的啦!(其實是自己懶得寫..哈)

最後有有幾點跟大家補充的
  1. 目前這 App 只支援 Windows Phone 8 而已!還沒有時間把程式轉成 Windows Phone 7.8的版本,先跟那些不能安裝的朋友說聲抱歉了
  2. NeverApp 團體,這是筆者在 2013 年初創立的(才幾的月大),目前人數為三個人,由筆者和兩位很有才華想法的朋友組成的,當初創立的想法很簡單「保留簡單的想法」「珍惜珍貴的創意」「堅持不妥協的好品質」這幾點,詳情可上 NeverApp 網站 http://www.neverapp.com 以及粉絲團 http://facebook.com/neverapp 來關注喔!
如果各位對這 App 有任何的建議,請上 NeverApp 的粉絲團討論喔!