Microsoft Visual Studio 2015 Team Foundation Server Serial

Visual Studio được  phát triển bởi Microsoft, là một phần mềm hoàn chỉnh giúp việc lập trình (ứng dụng,web,..) một cách đơn giản, nó hỗ trợ rất nhiều ngôn ngữ như: html, js, java, asp.net, aspx.net, php…..Visual Studio có rất nhiều phiên bản với các chức năng khác nhau. Ở bài viết này mình chỉ nói qua về Visual Studio Team Foundation Server (TFS) thôi ^^

Visual Studio Team Foundation Server (TFS) phù hợp với:

– Các nhóm lập trình viên sử dụng Visual Studio để phát triển ứng dụng.

– Các bạn sinh viên đã/ đang/ sẽ làm các đồ án nhóm về lập trình.

– Các nhóm Freelancer đang tìm kiếm công cụ làm việc.

Team Foundation Server (TFS) là một chương trình server được sử dụng để quản lý mã nguồn của các lập trình viên trong các dự án chung.

Với các tính năng nổi bật như:

– Lưu trữ mã nguồn online.

-Tự động tổng hợp và đưa ra so sánh về mã nguồn từ các phiên bản được upload.

– Lưu trữ các phiên bản của mã nguồn và cho phép tải lại khi cần.

– Quản lý thay đổi trong project.

 

Link tải

Download Team Foundation Server 2015

License

PTBNK-HVGCM-HB2GW-MXWMH-T3BJQ

Tính khoản cách giữa 2 điểm bằng sql server và C#

sql server 

 --[dbo].[sp_DuAnGetKhoangCach] 10.7756587, 106.70042379999995, 0.5

CREATE PROCEDURE [dbo].[sp_DuAnGetKhoangCach]

    @ZipLatitude float, 
    @ZipLongitude float,
    @Radius  float
AS  
SELECT * FROM DuAn

WHERE dbo.TinhKhoanCach2Diem(lat, lng, @ZipLatitude, @ZipLongitude) < @Radius



CREATE FUNCTION TinhKhoanCach2Diem(
    @Latitude1 float,
    @Longitude1 float,
    @Latitude2 float,
    @Longitude2 float
)
RETURNS float 
AS  
    BEGIN 
    -- CONSTANTS
    DECLARE @EarthRadiusInMiles float;
    SET @EarthRadiusInMiles = 6371 -- 3959 for miles, 6371 for KM

    DECLARE @PI  float;
    SET @PI = PI();
    -- RADIANS conversion
    DECLARE @lat1Radians float;
    DECLARE @long1Radians float;
    DECLARE @lat2Radians float;
    DECLARE @long2Radians float;
    SET @lat1Radians = @Latitude1 * @PI / 180;
    SET @long1Radians = @Longitude1 * @PI / 180;
    SET @lat2Radians = @Latitude2 * @PI / 180;
    SET @long2Radians = @Longitude2 * @PI / 180;
    RETURN Acos(
    Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) + 
    Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) + 
    Sin(@lat1Radians) * Sin(@lat2Radians)
    ) * @EarthRadiusInMiles;
END

C#

/// <summary>
/// Specifies a Latitude / Longitude point.
/// </summary>
public class LatLng
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }

    public LatLng(){
    }

    public LatLng(double lat, double lng)
    {
        this.Latitude = lat;
        this.Longitude = lng;
    }
}

/// <summary>
/// Returns the distance in miles or kilometers of any two
/// latitude / longitude points.
/// </summary>
/// <param name="pos1">Location 1</param>
/// <param name="pos2">Location 2</param>
/// <param name="unit">Miles or Kilometers</param>
/// <returns>Distance in the requested unit</returns>
public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit)
{
    double R = (unit == DistanceUnit.Miles) ? 3960 : 6371;
    var lat = (pos2.Latitude - pos1.Latitude).ToRadians();
    var lng = (pos2.Longitude - pos1.Longitude).ToRadians();
    var h1 = Math.Sin(lat / 2) * Math.Sin(lat / 2) +
                  Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) *
                  Math.Sin(lng / 2) * Math.Sin(lng / 2);
    var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));
    return R * h2;
}

public enum DistanceUnit { Miles, Kilometers };

var Offices = GetMyOfficeList();
for(int i = 0; i< Offices.Count; i++)
{
    Offices[i].Distance = HaversineDistance(
                            coord,
                            new LatLng(Offices[i].Lat, Offices[i].Lng),
                            DistanceUnit.Miles);
}

var closestOffice = Offices.OrderBy(x => x.Distance).Take(1).Single();

 

 

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tầm quan trọng của Validation

Giả sử nếu bạn làm một website và không kiểm tra việc nhập dữ liệu của user, chuyện gì xảy ra nếu một đoạn mã độc được gởi lên server.
Kiểm tra dữ liệu luôn là 1 thách thức đối với một lập trình viên. Bạn không chỉ kiểm tra dữ liệu ở trình duyệt mà còn phải kiểm tra dữ liệu (bao gồm cả phần logic) trên server. Việc kiểm tra ở phía client sẽ mang lại những thông tin cần thiết khi người dùng nhập dữ liệu trên form và việc kiểm tra trên server là 1 điều hết sức cần thiết, vì đây là nơi nhận bất kỳ thông tin từ 1 mạng nào đó.

ServerSide Validation

Việc kiểm tra thông tin trên server nên hoàn thành dù có kiểm tra dữ liệu ở client hay không. Người dùng có thể vô hiệu hóa Javascript hoặc làm 1 cách nào đó để vượt qua sự kiểm tra dữ liệu ở client, và server là nơi phòng vệ cuối cùng trước những dữ liệu không mong muốn. Một vài quy tắc kiểm tra đòi hỏi chỉ được thực hiện ở server, vì đây là nơi tiếp cận nguồn dữ liệu an toàn hơn so với việc tiếp cận từ trình duyệt.

Validation với Data Annotations

Data Annotations được giới thiệu trong phiên bản .NET 3.5, là 1 bộ tập hợp các thuộc tính và các class được định nghĩa trong System.ComponentModel.DataAnnotations, dùng để bổ sung thông tin cho class với metadata. MetaData gồm 1 bộ các quy tắc được dùng để chỉ ra đối tượng nào cần được kiểm tra.
Ngoài ra, các thuộc tính trong Data Annotations còn dùng để điều khiển việc hiển thị dữ liệu (ví dụ như DisplayName, DataType…)
Các attribute dùng để Validation:

  • CompareAttribute: So sánh 2 giá trị của 2 thuộc tính trong Model. Nếu bằng nhau, trả về true.
  • RemoteAttribute: Dựa trên JQuery Validation, dùng để gọi hàm trên Server thực hiện việc kiểm tra
  • RequiredAttribute: Dữ liệu không được phép rỗng.
  • RangeAttribute: Dữ liệu là số, được nhập vào thuộc phạm vi được chỉ ra
  • RegularExpressionAttribute: Dữ liệu được nhập vào được so sánh hợp lệ với biểu thức được chỉ ra.
  • StringLengthAttribute: Chỉ ra số ký tự được phép nhập vào.

Client Side Validation

Để việc kiểm tra dữ liệu thực hiện phía client, bạn cần thiết lập thuộc tính true cho 2 thuộc tính:

<add key="ClientValidationEnabled" value="true">
<add key="UnobtrusiveJavaScriptEnabled" value="true">

Ngoài ra bạn phải nhúng thêm thư viện JQuery:

<script src="@Url.Content("~/Scripts/jquery.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

Ví dụ Thiết kế Model: Ngoài việc mô tả các thuộc tính (properties), bạn phải thêm vào các attribute để thực hiện việc kiểm tra dữ liệu.

public class Person
{
    [Required]
    [StringLength(160)]
    public string FirstName { get; set; }

    [Required(ErrorMessage="Your lastname is required")]
    public string LastName {get; set; }

    [Range(1, 150)]
    public string Age { get; set; }

    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
    public string Email { get; set; }

    [Compare("Email")]
    public string EmailConfirm { get; set; }

    [Remote("CheckUserName", "Account")]
    public string UserName { get; set; }
}

Attribute Compare: Bạn chỉ ra tên property cần so sánh giá trị.
Attribute Remote: chỉ ra tên Controller và Action thực hiện việc kiểm tra dữ liệu bằng Ajax.

public class AccountController : Controller
{
    //
    // GET: /Account/        

    public JsonResult CheckUserName(string username)
    {
        if (username == "anbinhtrong")
            return Json(false, JsonRequestBehavior.AllowGet);
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

Thực hiện đoạn code hiển thị dữ liệu ở View:

@using(Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <div class="editor-label">@Html.LabelFor(m => m.UserName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.UserName)
            @Html.ValidationMessageFor(m => m.UserName)
        </div>  
        <div class="editor-label">@Html.LabelFor(m => m.FirstName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.FirstName)
            @Html.ValidationMessageFor(m => m.FirstName)
        </div>        
        <div class="editor-label">@Html.LabelFor(m => m.LastName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.LastName)
            @Html.ValidationMessageFor(m => m.LastName)
        </div>  
        <div class="editor-label">@Html.LabelFor(m => m.Age):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.Age)
            @Html.ValidationMessageFor(m => m.Age)
        </div>   
        <div class="editor-label">@Html.LabelFor(m => m.Email):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)
        </div>   
        <div class="editor-label">@Html.LabelFor(m => m.EmailConfirm):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.EmailConfirm)
            @Html.ValidationMessageFor(m => m.EmailConfirm)
        </div>             
        <input type="submit" value="Ok"/>
        <input type="reset" value="Làm lại"/>
    </fieldset>  
}

ValidationMessageFor: Hiển thị thông báo khi dữ liệu bị lỗi ở ô tương ứng. Kiểm tra dữ liệu phía Server:

[HttpPost]
public ActionResult Index(Person person,FormCollection form)
{            
    if (ModelState.IsValid)
    {
        //Do something
    }
    return View("Index");
}

ModelState.IsValid: mang giá trị false khi 1 thuộc tính nào đó mang giá trị không hợp lệ.

Kết luận 

Việc kiểm tra dữ liệu tương đối được đơn giản hóa nhờ sự hỗ trợ của thư viện Data Annotations. Nhưng đôi khi chúng ta gặp phải những tình huống phức tạp, vượt ra ngoài khả năng hỗ trợ của asp.net mvc, lúc đó chúng ta cần quay lại tìm hiểu jquery validation và tự viết riêng cho phần kiểm tra đó.

Download ví dụ: MediaFire 

ModelValidation.rar (2,16 mb)

 

 

 

AutoMapper

AutoMapper là gì?

AutoMapper là một thư viện dùng để mapping object tới object (object-to-object mapper). Nó cho phép bạn mapping các thuộc tính trong cùng một object tới các thuộc tính của một object kiểu khác. Ví dụ, bạn có thể mapping một heavy enity (một entity có nhiều thuộc tính) Customer tới một đối tượng thuộc lớp CustomerDTO hoàn toàn tự động bằng cách sử dụng AutoMapper.

Vấn đề

Đã bao giờ bạn viết đoạn code như này chưa:

Customer customer = GetCustomerFromDB();

CustomerViewItem customerViewItem = new CustomerViewItem()
                           {
                               FirstName = customer.FirstName,
                               LastName = customer.LastName,
                               DateOfBirth = customer.DateOfBirth,
                               NumberOfOrders = customer.NumberOfOrders
                           };

ShowCustomerInDataGrid(customerViewItem);

Chúng ta có entity Customer, và chúng ta sắp bind các đối tượng Customers lên DataGrid, nhưng như chúng ta đã biết, entity Customer quá nặng, và có quá nhiều thuộc tính không cần thiết, chúng ta cần một object nhẹ cân và duyên dáng hơn, do đó chúng ta sẽ ưu tiên bind object CustomerViewItem lên grid.Khác...

ViewData, ViewBag và TempData – các tùy chọn truyền dữ liệu trong ASP.NET MVC

ASP.NET MVC cung cấp 3 tùy chọn ViewData, ViewBag và TempData để truyền dữ liệu từ controller vào view và trong request kế tiếp. ViewData và ViewBag tương tự như nhau, TempData thực hiện thêm nhiệm vụ. Chúng ta sẽ nói về điểm chính của 3 đối tượng:

Sự giống nhau giữa ViewBag và ViewData:

1. Giúp duy trì dữ liệu khi bạn di chuyển từ view vào controller

2. Được dùng để truyền dữ liệu từ controller vào view tương ứng

3. Chu kỳ tồn tại ngắn, giá trị sẽ thành null khi redirect xuất hiện. Đây là bởi vì mục tiêu thiết kế các đối tượng này là để giao tiếp giữa controller và view

Sự khác nhau giữa ViewBag và ViewData:

1. ViewData là 1 từ điển các đối tượng (dictionary) kế thừa từ lớp ViewDataDictionary và có thể truy cập dùng chuỗi key.

2. ViewBag là thuộc tính động (dynamic) mang đến thuận lợi từ đặc tính mới của C# 4.0

3. ViewData yêu cầu chuyển kiểu với các kiểu dữ liệu phức tạp và kiểm tra giá trị null để tránh lỗi

4. ViewBag không yêu cầu chuyển kiểu với các kiểu dữ liệu phức tạp

Ví dụ về ViewBag và ViewData:

public ActionResult Index()
{
    ViewBag.Name = "Ngoc Dinh NGUYEN";
    return View();
}
public ActionResult Index()
{
    ViewData["Name"] = "Ngoc Dinh NGUYEN";
    return View();
}

Trong View:

@ViewBag.Name 
@ViewData["Name"]

TempData:

TempData cũng là 1 từ điển đối tượng (dictionary) kế thừa từ lớp TempDataDictionary, được lưu trong 1 chu kỳ rất ngắn. Điểm khác biệt chính là chu kỳ sống của đối tượng. TempData giữ thông tin trong khoảng thời gian HTTP Request. Điều này có nghĩa là chỉ từ 1 trang đến 1 trang khác. Điều này cũng hoạt động với 302/303 redirection bởi vì nó cùng HTTP Request. Giúp duy trì dữ liệu khi bạn di chuyển từ 1 controller sang 1 controller khác hoặc từ hành động này sang hành động khác. Nói cách khác, khi bạn redirect, TempData giúp duy trì dữ liệu giữa các redirect. Nó là biến cục bộ dùng trong session. Nó yêu cầu chuyển kiểu cho các kiểu dữ liệu phức tạp, và kiểm tra giá trị null để tránh lỗi. Thông thường nó dùng để lưu error message hoặc validation message.

public ActionResult Index()
{
    var model = new Review()
                {
                    Body = "Start",
                    Rating = 5
                };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model = TempData["ModelName"];
    return View(model);
}