Fluent Validation

Project Description
A small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules for your business objects.

LINK: http://fluentvalidation.codeplex.com/

DrivenDB

DrivenDb is a database accessor in the micro ORM tradition. Database access made easier without compromising performance with an emphasis on utilizing the database efficiently. Utilizing DrivenDb will result in minimal overhead, cleaner code, and fewer round trips to the database than when using other ORMs.

Latest Additions

  • Added partial before/after methods for property setters and serialization.
  • Added option to script “Unspecified” DateTime values into the property setters.
  • Corrected issue with computed columns being tracked for changes.
  • Added DbScope to provide simpler multi/write transactional support.
  • Added WinRT portable library support.
  • Added ability to capture “deleted” values via the Sql Server “output” clause
  • Added SqLite entity generator
  • Varbinary / IDataReader.GetBytes Support
  • Oracle support (Beta)
  • New Entity generator! (Currently working with Sql Server)
  • Read a query into any .NET type using the IDbAccessor
  • Use parallel mapping to speed up the loading of large result sets

Goals / Features

  • Standard micro ORM features
    • Simplicity
    • Low overhead
    • Speed (For those who feel the need for it)
    • Less extraneous coding
  • Improved micro ORM features
    • Reduced traffic to the database
    • Self tracking entities monitor changes made to the entity and it’s current state.
    • Entity generator included for several popular databases** Entity generator included for several popular databases.
    • Provide a custom implementation for an unsupported database.
  • Detailed change events for inserts, updates, and deletes (.net events / not triggers).

Philosophy

  • You write your own selects. You can include as many or as few fields in your result set as you like. You are not hindered by any kind of SQL translated wrapper classes or methods* You write your own selects. You can include as many or as few fields in your result set as you like. You are not hindered by any kind of SQL translated wrapper classes or methods.
  • Only the most banal SQL is written for you. (e.g. selects, updates, and deletes on a primary key)
  • Batch reads and writes to the database are more efficient. All entities inherit from the same base class. Pass an entire list of them to the database at once. All inserts, updates, and deletes are executed at once within a transaction.

LINK:  http://drivendb.codeplex.com/

app monitor signalr

1. http://www.dotnetcurry.com/showarticle.aspx?ID=913

2. https://github.com/SignalR/SignalR/wiki/Projects-Using-SignalR

3. http://www.slideshare.net/RoyCornelissen/signal-r-techdaysnl-2013

4. http://stevescodingblog.co.uk/real-time-system-resource-monitor-with-signalr-wcf-and-knockoutjs/

5. http://www.ryantomlinson.com/post/Building-a-real-time-exception-monitor-with-NServiceBus-and-SignalR.aspx

6. http://bartwullems.blogspot.com/2012/12/signalr-performance-counters.html

Introduction to SignalR

Introduction

This article gives you a basic idea about the new developer’s API called “SignalR”.

Background

In earlier ASP.NET applications, user refreshes a web page to see new data or a page uses “long polling” to retrieve new data, i.e., when new data arrives to server it will not be directly transmitted to all clients or specific clients, for that the user has to refresh the page, and the page will be updated.

For example, you can go to cricinfo.com, there you can see a page is refreshed for 1 or 2 seconds and many times you see the score is not updated. In such situations there is the need of the new Microsoft API called “SignalR”.

What is SignalR

SignalR is a new developer’s API provided for ASP.NET web applications, used to add “real time” web functionality to ASP.NET applications. “Real Time” web functionality is the ability to have server code to push contents to connected clients.

SignalR supports “server push” or “broadcasting” functionality. It handles connection management automatically. In classic HTTP connections for client-server communication connection is re-established for each request, but SignalR provides persistent connection between the client and the server. In SignalR the server code calls out to a client code in the browser using Remote Procedure Calls (RPC), rather than request-response model today. SignalR is an open-source API, and is accessible through GitHub.

Where to use:

  1. Chat room applications
  2. Real-time monitoring applications
  3. Job progress updates
  4. Real time forms

You can see the use of SignalR for a chat room application in the following image:

In the above example as soon as user2 sends some message, it will be received by all other users.

API Details

SignalR provides two models for communication:

    1. Persistent Connections

The Persistent Connection API gives developer direct access to the low level communication protocol that SignalR exposes. This API uses the format of the actual message sent that needs to be specified and if the developer prefers to work with messaging and dispatching model rather than a remote invocation.

    1. Hubs:

It’s a High Level API written over PersistentConnection. This API allows the client and server to call methods on each other directly. Hubs also allow you to pass strongly typed parameters to methods, enabling model binding.

Code

Steps:

    1. Open Visual Studio 2010.
    2. Create a new project, select ASP.NET Empty Web Application and name it ‘ChatRoomApplication’.
    3. Go to Tools and open Package Manager Console.
    4. If you don’t have a Nuget package manager console then download it. For that go to Tools–>Extension Manager, and in the Search textbox, enter ‘NuGet Package Manager’, and download it.
    5. Open Package Manager console (Tools –> Library Package Manager –> Package Manager Console).
    6. Give command ‘Install-Package Microsoft.AspNet.SignalR’.
    7. It will add references of SignalR DLLs to your application.
    8. In Solution Explorer right click on ChatRoomApplication and add class “ChatHub”. A ChatHub.cs file will be added.
    9. Derive the ChatHub class from ‘Hub‘. It should look like:
 Collapse | Copy Code
public class ChatHub : Hub
{
}

Write method Send in the ChatHub class as:

 Collapse | Copy Code
public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.sendMessage(name,message);
    }
}
    1. Now add the Global.asax file to your application. And in the application_start event map your hub byRouteTable.Routes.MapHubs(). It should look like:
 Collapse | Copy Code
protected void Application_Start(object sender,EventArgs e)
{
    RouteTable.Routes.MapHubs();
}
    1. Now add an ASPX page and name it default.aspx
    2. Copy the following code in the <head></head> section:
 Collapse | Copy Code
<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.0.1.min.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        // Proxy created on the fly          
        var chat = $.connection.chatHub;

        // Get the user name and store it to prepend to messages.
        $('#displayname').val(prompt('Enter your name:', ''));

        // Declare a function on the chat hub so the server can invoke it          
        chat.client.sendMessage = function (name, message) {
			var encodedName = $('<div />').text(name).html();
			var encodedMsg = $('<div />').text(message).html();
			$('#messages').append('<li>' + encodedName + 
			    ':  ' + encodedMsg + '</li>');
        };

        // Start the connection
        $.connection.hub.start().done(function () {
            $("#send").click(function () {
                // Call the chat method on the server
                chat.server.send($('#displayname').val(), $('#msg').val());
            });
        });
    });
</script>
    1. Copy the following code into the <body> part:
 Collapse | Copy Code
<div>
<input type="text" id="msg" />
<input type="button" id="send" value="Send" />
<input type="hidden" id="displayname" />
<ul id="messages">
</ul>
</div>
  1. That’s it, now run your application, open multiple instances of the browser and copy the same URL there…and type message in the text box, click on the Send button, and you can see the message will be displayed on all browsers.
  2. For more information, look at the submitted code.

LINK: http://www.codeproject.com/Tips/590660/Introduction-to-SignalR

5 Cách để học Photoshop cho người mới bắt đầu

Nếu bạn muốn học Photoshop, bạn có thể tìm thấy tài liệu ở rất nhiều nơi, từ những hiệu sách gần nhà đến những bài hướng dẫn trên internet. Dù bạn chỉ muốn nắm những kiến thức cơ bản để có thể chỉnh sửa kích thước của một tấm hình, hay muốn trở thành một chuyên gia Photoshop, tôi sẽ chỉ cho bạn những nơi có rất nhiều tài liệu, hầu hết số tài liệu này tôi đã từng học qua. Bạn hãy chọn một vài tài liệu trong số đó mà bạn cảm thấy phù hợp nhất, phụ thuộc vào điều kiện thời gian và túi tiền của bạn.

 

1. Học phải đi đôi với hành

Cách tốt nhất để học sử dụng phần mềm Photoshop là hãy bắt tay vào sử dụng nó ngay. Download phần mềm, cài đặt và nhảy vào vọc ngay. Nếu bạn cảm thấy choáng ngợp và không biết nên bắt đầu từ đâu, thì bạn hãy mở một tấm hình bằng Photoshop và nghịch với bất kỳ công cụ nào mà bạn nhìn thấy trong chương trình. Sử dụng chúng một cách ngẫu nhiên trong một thời gian và duyệt qua các menu, để có được cảm giác thân quen với phần mềm. Tất nhiên cách đó không giúp bạn được nhiều, vì vậy bước tiếp theo cần làm là đọc các hướng dẫn chính thức của hãng Adobe bằng cách nhấn vào nút Help. Bạn sẽ được chuyển đến trang tài liệu hướng dẫn trực tuyến, nơi có các bài hướng dẫn được sắp xếp và phân loại theo các chủ đề khác nhau. Bạn chỉ việc đọc và áp dụng ngay những kiến thức bạn vừa học được.

2. Tìm những nguồn tài liệu trực tuyến

Đây là nơi bạn sẽ tìm thấy hầu hết các tài liệu. Có hàng ngàn website dạy bạn cách sử dụng Photoshop theo cách này hay cách khác. Tôi sẽ liệt kê một số trang web ưa thích của tôi:

Các bài hướng dẫn thực hành

Như tôi đã nói ở trên, tốt nhất là học phải đi đôi với hành. Vì vậy mà các bài hướng dẫn thực hành rất phổ biến trong Photoshop. Cách dễ nhất để học Photoshop là làm theo các bài hướng dẫn thực hành theo từng chủ đề riêng, làm từng bước một, hơn là đọc nguyên một cuốn sách rồi quên luôn nội dung chương đầu tiên trước khi bạn bắt tay vào thực hành. Dưới đây là một vài trang web hướng dẫn thực hành rất bổ ích:

PSD Tutsplus

Trang này chứa những bài thực hành rất hay về Photoshop. Nó đã được xây dựng trong nhiều năm, và họ đăng những bài hướng dẫn mới mỗi ngày. Nếu muốn download các bài hướng dẫn nâng cao và các tài liệu đặc biệt thì bạn hãy đăng ký thành viên có trả phí.

Layers Magazine

Trang web này có rất nhiều bài thực hành và bài viết về các sản phẩm của Adobe. Đây là liên kết đến các bài thực hành Photoshop.

Smashing Magazine

Trang web này cũng có những bài thực hành Photoshop rất tuyệt vời.

Photoshop Lady

Bạn hãy bookmark những bài thực hành từ trang web này.

SpoonGraphics

Là một trong những trang web mà tôi ưa thích nhất, chứa rất nhiều bài thực hành và các hình ảnh truyền cảm hứng cho việc thiết kế.

Vandelay Design

Liên kết đến hàng trăm bài thực hành, đặc biệt có hẳn một trang hướng dẫn những vấn đề cơ bản về Photoshop cho người mới bắt đầu.

Adobe TV

Có một khối lượng khổng lồ các bài hướng dẫn thực hành bằng video, dành cho những người mới bắt đầu và cả những người chuyên nghiệp.

Youtube

Bạn có thể tìm thấy rất nhiều video hướng dẫn thực hành của hầu hết các kỹ thuật bằng cách tìm kiếm trên Youtube.

DeviantArt

Là một nơi để cộng đồng người làm thiết kế chia sẻ những sản phẩm của họ, bạn cũng có thể tìm thấy rất nhiều bài hướng dẫn thực hành và tài liệu ở đây.

Các diễn đàn

Một khi bạn đã học được các kiến thức cơ bản, và bạn vướng mắc một vấn đề nào đó cần giúp đỡ khi thực hành, bạn có thể sử dụng các diễn đàn này để nhận được sự trợ giúp, tìm được cách giải quyết chính xác.

Adobe Forum

Photoshop Gurus

Photoshop forums

Tutorialized

3. Học qua những cuốn sách hay

Nếu bạn muốn đọc thêm một số cuốn sách, thì tôi có thể đề xuất bạn nên đọc những cuốn sau:

Adobe Photoshop CS5 Classroom in a Book

Adobe Creative Team đã xuất bản một loạt sách cho các phiên bản Photoshop khác nhau trong nhiều năm, bạn cũng có thể tìm các cuốn sách cho phiên bản cũ hơn của phần mềm.

Photoshop CS5 All in One for dummies

Là một cuốn sách chỉ dẫn đầy màu sắc trong loạt sách dành cho người mới bắt đầu.

Graphic Design Portfolio Builder

Đây là cuốn sách đầu tiên về Photoshop mà tôi đọc. Đây là một cuốn sách thiên về thực hành thiết kế và dạy những vấn đề cơ bản về Photoshop và Illustrator. Người mới bắt đầu nên đọc cuốn này.

Teach yourself Photoshop CS5

4. Đọc một số tờ tạp chí về Photoshop

Mặc dù dạo gần đây tôi có xu hướng chuyển qua đọc rất nhiều bài blog trên internet, nhưng tôi vẫn có sở thích mua các tờ tạp chí hay, quan sát các sản phẩm do họ tạo ra và đọc các bài thực hành. Đây là một số tờ tạp chí mà tôi thích:

5. Đăng ký tham gia các khóa học

Nếu bạn có điều kiện và muốn thu được kết quả nhanh, dĩ nhiên đơn giản nhất là bạn có thể đăng ký một khóa học. Bạn có thể tìm các lớp học gần nhà bạn hoặc đơn giản là lên Google tìm kiếm các lớp học Photoshop có uy tín. Bạn cũng có thể tìm những khóa học và những buổi hội thảo trực tuyến, giống như lớp học trực tuyến này, được mở bởi chuyên gia Photoshop Scott Kelby.

Và dĩ nhiên, bạn có thể đọc các bài viết trên blog của tôi trong các bài hướng dẫn thực hành sắp tới, và những thủ thuật, mẹo vặt trong Photoshop cùng với các tài liệu khác.

LINK: http://vinacode.net/2013/04/28/photoshop-nguoi-moi-bat-dau/

Thiết kế website đúng cách với 5 cuốn sách

Trong bài “Ai cũng có thể Code”, tôi đã giới thiệu với bạn một số địa chỉ có thể học trực tuyến, miễn phí và có tính tương tác cao. Việc tham gia vào những khóa học như vậy rất bổ ích, nhưng có lẽ để làm một cái gì đó chuẩn mực và đúng cách thì chắc chắn chúng ta không thể quên đi những quyển sách.

Tôi vẫn tin rằng một trong những cách tốt nhất để học thiết kế web, đặc biệt với những người tự học là học thông qua đọc sách. Hôm nay, tôi sẽ giới thiệu với các bạn những cuốn sách mà một nhà thiết kết/phát triển website nên đọc.

Tôi khuyên bạn nên đọc những cuốn sách này theo tuần tự hoặc dựa trên mức độ thành thạo thiết kế web bạn có bây giờ.

Thiết kế website đúng cách với 5 cuốn sách
1. HTML and CSS: Design and Build Websites

Bất cứ khi nào tôi học một cái gì mới, tôi luôn muốn nhìn thấy kết quả nhanh nhất có thể, thay vì bị sa lầy vào những khía cạnh kỹ thuật quá nhiều. Và nếu bạn cũng muốn điều đó, thì bạn có thể rất thích thú với quyển sách được thiết kế bắt mắt, rõ ràng, ngắn gọn và đẹp đẽ như cuốn này.

HTML and CSS: Design and Build Websites

HTML and CSS: Design and Build Websites giúp bạn bắt đầu học các khái niệm và kỹ thuật cơ bản để biết cách tạo ra các trang web ở mức độ đơn giản, sơ khai.

Phương pháp trình bày của cuốn sách rất lôi cuốn, với nhiều hình ảnh đẹp, được bài trí một cách khoa học. Nội dung cũng được trình bày rõ ràng và thành từng khối nhỏ rất dễ đọc. Sự kết hợp khéo léo và khoa học giữa ảnh mình họa cùng với những đoạn nội dung nhỏ, khiến người đọc có cảm giác rất thoải mải và quan trọng nhất là đọc rất nhanh và hiệu quả. Hiệu quả bởi vì người đọc có thể dễ ràng hình dung ra những gì mà họ có thể làm được, với những đoạn code nhỏ.

Đó là toàn bộ lý do tại sao tôi khuyên bạn nên đọc cuốn sách này. Đây là cuốn sách đầu tiên cho những người mới bắt đầu học thiết kế web cần phải đọc.

2. Learning Web Design: A Beginner’s Guide

Sau khi bạn cảm thấy dường như mình đã thông thạo những điều cơ bản, đó là lúc bạn cần chọn một cuốn sách sâu hơn về kỹ thuật, đầy đủ hơn để bạn thực sự có thể bắt đầu làm chủ các khái niệm. Khi nói đến tính toàn diện và làm chủ kỹ thuật thông qua sách, không gì có thể đánh bại một cuốn sách của O’Reilly.

Learning Web Design: A Beginner’s Guide

Learning Web Design là một cuốn sách đồ sộ, dài hơn 600 trang, nó sẽ giúp bạn có một nền tảng vững chắc về thiết kế web. Nó có một tấn các bài tập, và tôi nghĩ bạn cần làm tất cả bài tập trong đó, để giúp bạn có thói quen kiểm tra và thử nghiệm với mã.

Trong cuốn sách này, bạn sẽ vượt qua ngưỡng HTML và CSS để rồi bắt đầu bước vào thế giới của JavaScript cũng như đồ họa web.

Mặc dù cuốn sách này hoàn toàn được thiết kế cho người mới bắt đầu, nhưng có lẽ đó không phải là cuốn sách đầu tiên bạn cần đọc, đặc biệt nếu bạn chưa có một nền tảng lập trình tốt, vì nó khá phức tạp, dễ hoảng trong mớ kiến thức kỹ thuật phức tạp. Và như tôi nhấn mạnh lúc đầu, bạn nên đọc các cuốn sách này sau khi đã đọc HTML and CSS: Design and Build Websites.

3. Designing with Web Standards

Sau khi đọc hai cuốn sách trên, bạn đã có một nền tảng khá vững chắc về các lệnh của HTML và CSS, giờ đã tới lúc bạn cần tìm hiểu kỹ thuật và những khái niệm ở mức độ chuyên nghiệp.

Bạn sẽ học cách làm thế nào và tại sao cần viết HTML và CSS tuân theo những tiêu chuẩn phù hợp, thông qua cuốn sách này. Designing with Web Standards, còn cung cấp cho bạn những khía cạnh kỹ thuật để đối phó với những vấn đề phổ biến trong thiết kế web.

Designing with Web Standards

Gần đây, cuốn sách này đã được làm mới với sự tham gia của Ethan Marcotte (người tạo ra thuật ngữ Thiết kế Web Responsive). Đó đúng là một tin tốt, và trên cả tuyệt vời!

4. Don’t Make Me Think: A Common Sense Approach to Web Usability

Đây có thể coi là một cuốn sách khá cổ – nó đã được 8 tuổi. Trong thời đại công nghệ thông tin phát triển chóng mặt như hiện nay, thì với một cuốn sách công nghệ thông tin với 8 tuổi đời, ta dễ có cảm giác đó là cái gì đó quá xưa cũ, có thể tưởng chừng như đã được viết trong thế kỷ 14 vậy.

Don’t Make Me Think: A Common Sense Approach to Web Usability

Tuy nhiên, các khái niệm được đề cập trong cuốn sách này là vô tận. Trong khi những cuốn sách tôi đã đề cập trước đó cho bạn thấy làm thế nào để xây dựng trang web, cuốn sách này sẽ cho bạn thấy làm thế nào để xây dựng nó một cách hiệu quả nhất cho người sử dụng trang web của bạn.

Don’t Make Me Think là một cuốn sách thực sự mang tính đột phá, và tôi hứa với bạn rằng bạn sẽ có rất nhiều khoảnh khắc “aha” khi bạn đọc nó.

Phiên bản làm mới của cuốn sách này sẽ có mặt tháng 12 năm 2013 (mặc dù bạn có thể cài đặt nó ngay bây giờ).

5. CSS Mastery: Advanced Web Standards Solutions

Cuốn sách này chứa các kỹ thuật thực tế để đối phó với vấn đề thiết kế web phổ biến mà bạn sẽ gặp phải. Để thực sự đánh giá cao cuốn sách này, hãy mua nó sau khi bạn đã dành giờ / ngày gỡ lỗi và viết lại HTML của trang web của bạn và CSS. Cuốn sách này sẽ mang lại cho bạn bước tiệm cận, gần hơn đến mức độ chuyên nghiệp của thiết kế web.

CSS Mastery: Advanced Web Standards Solutions

Các cuốn sách tôi đề cập ở trên, bạn có thể xem các phần rating và review trên Amazon để kiểm chứng lại thông tin trước khi mua. Chúc bạn có những trải nghiệm tuyệt vời cũng với những quyển sách trên.

LINK: http://vinacode.net/2013/12/25/thiet-ke-website-dung-cach/

15 Blog mà các lập trình viên web nên ghé thăm mỗi ngày

Nhiều nơi trên thế giới thường có một định kiến cho rằng công việc của các nhà thiết kế web (web designer) là khá đơn giản – họ chỉ việc tạo ra một vài trang web tĩnh, tập hợp chúng lại thành một website, đưa nó lên Internet là công việc coi như hoàn thành. Do đó mức thù lao trả cho công việc dạng này cũng thường bị xem nhẹ, giống như công việc này chỉ phù hợp với lũ nhóc, không có gì là quan trọng cả.

Về mặt cá nhân, tôi hoàn toàn phản đối định kiến đó, nhưng hiện nay lại có rất nhiều người dường như đồng tình với nó. Thế giới Internet đã phát triển với một tốc độ thần kỳ và đó cũng không phải là một việc hoàn toàn ngẫu nhiên, chúng ta phải cảm ơn những nỗ lực của các chuyên gia thiết kế web. Bởi vì, Internet không thể phát triển với tốc độ cực kỳ nhanh chóng như vậy nếu các designer không thường xuyên cập nhật những công nghệ mới nhất. Làm sao mà các thiết bị di động có thể trở nên phổ biến như ngày nay nếu như các lập trình viên và designer không có sự nghiên cứu và tìm thấy giải pháp cho vấn đề đa dạng kích thước màn hình? Bây giờ, tôi thực sự tin rằng tất cả độc giả sẽ hiểu công việc của các designer thì khó hơn rất nhiều so với những gì chúng ta thường nghĩ, họ phải bỏ ra hàng tấn nỗ lực và rất nhiều thời gian nghiên cứu để duy trì tính cạnh tranh và phát triển.

15 Blog mà các lập trình viên web nên ghé thăm mỗi ngày!15 Blog mà các lập trình viên web nên ghé thăm mỗi ngày!

Một trong những nguồn tài nguyên có giá trị là các blog về thiết kế web; ở đây hiện diện những sự cách tân mới nhất, các xu hướng công nghệ và nhiều hướng dẫn thực hành; nhiều bài viết chất lượng cùng với các sản phẩm mẫu để truyền cảm hứng đến người đọc. Điểm bất lợi của những blog này đó là lượng thông tin không được toàn diện như một cuốn sách, thật khó để tưởng tượng rằng bằng cách viết những bài viết dài thì số lượng độc giả sẽ tăng lên (nếu làm như vậy, độc giả sẽ thấy blog nhàm chán và sẽ không ghé thăm nữa). Tóm lại, bài học rút ra thì khá đơn giản: một blog về thiết kế web có nhiệm vụ giữ cho độc giả luôn được cập nhật thông tin, nhưng nếu bạn muốn có thêm nhiều kiến thức có chiều sâu thì những cuốn sách và các podcast là tốt hơn.

Danh sách này chứa 15 blog về thiết kế web, một vài trong số chúng là những trang web hạng nhất mà các web designer nên truy cập mỗi ngày. Danh sách này không hoàn toàn cố định, bất kỳ ai cũng có thể thêm hoặc bớt, phụ thuộc vào sở thích cá nhân và chủ đề liên quan. Tôi cũng không muốn mình bị bỏ lỡ một blog rất tuyệt vời nào đó hay đơn giản là bạn muốn giới thiệu một trang web mà mình cảm thấy thú vị. Bạn hãy chia sẻ với chúng tôi những suy nghĩ của mình bằng cách để lại những dòng bình luận nhé!

1. Smashing Magazine

Smashing Magazine chắc chắn là thương hiệu rất nổi tiếng trong lĩnh vực thiết kế, ở đây đăng các bài viết của một số designer thuộc loại giỏi nhất. Thông tin cung cấp khá rõ ràng với chất lượng rất cao; nó dựa trên nền tảng của một blog.

2. Web Design Tuts+

Blog này là một phần của mạng lưới Envato, một thương hiệu nổi tiếng khá quen thuộc trong giới designer. Các bài viết ở đây có nội dung đa dạng trên nhiều lĩnh vực, từ các sản phẩm mẫu về các website đẹp cho tới các khóa học ngắn hướng dẫn cách lập trình. Dù sao, đây cũng là một trang web mà bạn nên truy cập thường xuyên và đọc tất cả các bài viết trên đó.

3. SitePoint

Nếu bạn muốn biết về những tin tức mới nhất về sự phát triển trên Internet và những nơi mà công nghệ web dẫn đầu, thì đây là một nguồn thông tin rất tốt để tìm đọc. Site Point đăng rất nhiều bài viết có giá trị, nhiều bài trong số chúng liên quan đến các nhánh khác nhau trong lập trình, nhưng rõ ràng bất kỳ một designer nào cũng nên biết chút ít về jQuery, PHP hay các vấn đề về liên quan đến cross-browsers.

4. PSD Tuts+

Bất kỳ một web designer nào cũng nên sử dụng thành thạo Photoshop, và ở trang web này có rất nhiều nguồn tài nguyên hữu ích và ấn tượng của nhiều chuyên gia trong lĩnh vực này.

5. Instant Shift

Đây là một sự pha trộn rất tốt giữa các bài viết về lập trình và thiết kế, ngoài ra còn có nhiều bài viết rất “thực dụng” về các kỹ năng khác như hướng dẫn quản lý tiền bạc, cách đàm phán với những khách hàng xấu tính, hay chỉ đơn giản là truyền cảm hứng cho bạn. Tôi thực sự đánh giá cao hướng tiếp cận này, vì vậy tôi dám đảm bảo rằng bạn sẽ không phí thời gian khi viếng thăm trang web này.

6. Web Designer Depot

Web Designer Depot là một blog khác gây ấn tượng với độc giả bằng các bài viết có chất lượng và rất hữu ích. Các bài viết hay được đăng mỗi ngày và đặc biệt vào cuối mỗi tuần sẽ có mục “Tranh hài hước của tuần”, là một tập những câu chuyện vui bằng hình ảnh mà khiến ai cũng phải phì cười.

7. 1stwebdesigner

Như cái tên của nó đã nói lên tất cả, ở đây chủ yếu tập trung những bài viết thú vị trong thế giới thiết kế web và độc giả nào cũng có thể thu được cảm hứng cao nhất bởi sự đa dạng cũng như các sản phẩm mẫu tuyệt đẹp.

8. Noupe

Điểm đặc biệt của blog này là nó có một số lượng rất lớn các chủ đề khác nhau, đây là một website chủ yếu dành cho các designer, nhưng chất lượng các bài viết ở đây khiến nó xứng đáng được liệt kê vào danh sách này. Đừng lo lắng, nó rất có ích khi bạn bookmark trang web này.

9. Six Revisions

Six Revisions là một cái tên khá “cũ” trong lĩnh vực này, và nó không thể tồn tại mà không đáp ứng những chuẩn mực cao. Độc giả dường như đánh giá rất cao phong cách và những thông tin được cung cấp ở đây; có đầy đủ lý do để cân nhắc ghé thăm khi bạn đang tìm kiếm một điều gì đó liên quan đến lĩnh vực thiết kế.

10. Speckyboy

Người chủ của blog này, Paul Andrew là một người bạn tốt và anh cũng là một bậc thầy trong lĩnh vực thiết kế; trang web này chứa một nguồn tài nguyên hết sức ấn tượng để ghé thăm mỗi ngày.

11. Hongkiat

Hongkiat là một cái tên khác có sự kết hợp giữa các bài viết chất lượng và rất thú vị. Các bài viết ở đây thực sự rất hay và thêm một điểm nữa là trang web này có nhiều chủ đề khác nhau. Trang web không chỉ dành cho các web designer mà bất kỳ designer nào cũng có thể viếng thăm và bạn sẽ không phải hối tiếc vì điều đó.

12. A List Apart

Nó thực ra là một blog duy nhất; ưu điểm lớn nhất của blog này là mang đậm phong cách cá nhân, các bài viết trông giống như là các chương nhỏ trong một cuốn sách. Bạn cũng có thể đoán được rằng, thông tin ở đây có chất lượng rất cao và bạn chắc chắn sẽ thu được nhiều kiến thức đáng giá khi ghé thăm.

13. Vandelay Design

Đây không chỉ là một blog đơn thuần, như trang web kế trên. Vandelay Design là một portfolio (nơi đăng các sản phẩm của cá nhân để giới thiệu bản thân) và nó chữa những tài nguyên rất tuyệt vời. Tôi quan tâm đến nó bởi vì nó có tính năng như một blog, và dường như không có cách nào tuyệt vời hơn để quảng bá bản thân.

14. Onextrapixel

Cũng giống như Hongkiat, Onextrapixel là một blog tuyệt vời và các desginer đáng kính nên có nó trong danh sách bookmark.

15. Slodive

Blog cuối cùng nhưng không phải là kém hấp dẫn nhất, bởi nó là một nguồn tài nguyên về thông tin và có tác dụng truyền cảm hứng rất lớn. Slodive dường như là một blog hoàn hảo khi bạn muốn dành ra một khoảng thời gian giải lao (mà không cần phải rời khỏi nơi làm việc).

Cuối cùng, tôi hy vọng rằng bạn đánh giá cao bài viết này và dĩ nhiên nên ghé thăm những blog ở danh sách trên và thu được những thông tin bổ ích từ chúng.

LINK: http://vinacode.net/2014/01/13/blog-danh-cho-designer/

10 Ngôn ngữ lập trình bạn nên học trong năm 2014

Ngành công nghệ phần mềm đang phát triển như vũ bão trong thời gian qua. Nếu bạn có sử dụng một chiếc điện thoại thông minh (smartphone) hoặc có đăng nhập vào một chiếc máy tính ít nhất một lần trong vài năm vừa rồi, thì bạn có thể đã nhận thấy điều này.

Vì vậy, kỹ năng lập trình đang có nhu cầu rất lớn, và các công việc có liên quan đến lập trình thì thường được trả lương cao hơn nhiều so với mức lương trung bình của các ngành nghề khác. Trong thế giới công nghệ, việc biết thêm một ngôn ngữ lập trình sẽ tạo cho bạn thêm một điểm cộng trong con mắt của các nhà tuyển dụng.

Nên học ngôn ngữ lập trình nào để nắm bắt xu hướng tuyển dụng trong năm 2014 và các năm tiếp theo?Nên học ngôn ngữ lập trình nào để nắm bắt xu hướng tuyển dụng trong năm 2014 và các năm tiếp theo?

Có rất nhiều ngôn ngữ lập trình thịnh hành trong nhiều lĩnh vực khác nhau. Các hệ thống tài chính và doanh nghiệp cần phải xử lý những chức năng phức tạp, được tổ chức cao, thì yêu cầu những ngôn ngữ như Java và C#. Về lĩnh vực giải trí đa phương tiện, thiết kế web và phần mềm thì yêu cầu ngôn ngữ linh hoạt, có thiết kế mềm dẻo, viết ít code như là Ruby, PHP, JavaScript và Objective-C.

Được sự giúp đỡ cung cấp số liệu từ trang web dạy học nổi tiếng Lynda.com, chúng tôi đã tổng hợp và liệt kê ra danh sách 10 ngôn ngữ lập trình được ưa chuộng nhất để cung cấp tới bạn.

1. Ngôn ngữ Java

Ngôn ngữ Java

Java là một ngôn ngữ lập trình hướng đối tượng được phát triển bởi Sun Microsystems vào những năm 1990. Nó là một trong những ngôn ngữ lập trình có nhu cầu lớn nhất, là chuẩn cho các phần mềm doanh nghiệp, các trang web, games và các ứng dụng cho thiết bị di động, cũng như là cho hệ điều hành Android. Java được thiết kế để có thể làm việc trên nhiều nền tảng khác nhau, nghĩa là một ứng dụng viết trên hệ điều hành Mac OS X thì cũng có thể chạy trên hệ điều hành Windows.

Bạn có thể học ngôn ngữ Java tạiUdemyLynda.comOracle.comLearnJavaOnline.org

2. Ngôn ngữ C

Ngôn ngữ C

C là một ngôn ngữ lập trình đa năng, nó được phát triển từ đầu những năm 1970, và là ngôn ngữ lâu đời nhất và cũng là ngôn ngữ được sử dụng rộng rãi nhất, nó cung cấp những chức năng nền tảng để hỗ trợ cho các ngôn ngữ phổ biến khác như C#, Java, JavaScript và Python. C hầu như được sử dụng xây dựng các hệ điều hành và trong các ứng dụng nhúng.

Bởi vì nó cung cấp nền tảng cho nhiều ngôn ngữ lập trình khác, nên sẽ là hợp lý khi bạn học C (hoặc C++) trước khi chuyển sang học thêm các ngôn ngữ khác.

Bạn có thể học ngôn ngữ C tạiLearn-CIntroduction To ProgrammingLynda.com,CProgramming.comLearn C The Hard Way.

3. Ngôn ngữ C++

Ngôn ngữ C++

C++ là một ngôn ngữ lập trình ở mức trung gian cùng với các đặc trưng lập trình hướng đối tượng, ban đầu được thiết kế để nhằm mở rộng ngôn ngữ C. C++ được dùng để xây dựng các phần mềm nổi tiếng như FirefoxWinamp và Adobe. Nó thường được sử dụng để xây dựng các phần mềm hệ thống, các phần mềm ứng dụng, các ứng dụng mô hình client-server đòi hỏi khả năng xử lý cao và các video games.

Bạn có thể học ngôn ngữ C++ tạiUdemyLynda.comCPlusPlus.comLearnCpp.com,CProgramming.com.

4. Ngôn ngữ C#

Ngôn ngữ C#

Bạn phát âm nó là “C-sharp”, C# là một ngôn ngữ được phát triển bởi Microsoft như là một phần ban đầu của thư viện .NET của họ. Kết hợp các nguyên tắc từ C và C++, C# trở thành một ngôn ngữ đa năng được dùng để phát triển các phần mềm theo công nghệ Microsoft chạy trên hệ điều hành Windows.

Bạn có thể học ngôn ngữ C# tạiUdemyLynda.comMicrosoft Virtual Academy,TutorialsPoint.com.

5. Ngôn ngữ Objective-C

Ngôn ngữ Objective-C

Objective-C là một ngôn ngữ lập trình đa năng và hướng đối tượng, được sử dụng bởi hệ điều hành Apple. Nó tạo nên sức mạnh cho các hệ điều hành của hãng Apple như OS X và iOS, cũng như là các giao diện lập trình ứng dụng (APIs) khác, và nó có thể được dùng để viết các ứng dụng cho iPhone. Hiện nay có một nhu cầu tuyển dụng rất lớn cho ngôn ngữ một thời bị coi là “lạc mốt” này.

Bạn có thể học ngôn ngữ Objective-C tạiUdemyLynda.comMac Developer Library,Cocoa Dev CentralMobile Tuts+.

6. Ngôn ngữ PHP

Ngôn ngữ PHP

PHP (Hypertext Processor) là một ngôn ngữ kịch bản miễn phí chạy trên server, được thiết kế dành để phát triển các trang web động và các ứng dụng trên môi trường web. Nó có thể nhúng trực tiếp trộn lẫn vào mã HTML hơn là một file riêng bên ngoài, chính điều đó đã tạo nên sự phổ biến của ngôn ngữ này trong giới lập trình web. PHP hiện tại được sử dụng để xây dựng trên 200 triệu trang web, bao gồm một số “đại gia” như WordPressDigg và Facebook.

Bạn có thể học ngôn ngữ PHP tạiUdemyCodecademyLynda.comTreehouseZend Developer ZonePHP.net.

7. Ngôn ngữ Python

Ngôn ngữ Python

Python là một ngôn ngữ kịch bản mức cao chạy trên môi trường server để phát triển các trang web và các ứng dụng cho thiết bị di động. Nó được đánh giá là một ngôn ngữ sáng sủa dễ học cho người mới bắt đầu vì cú pháp dễ đọc và ngắn gọn, nghĩa là các lập trình viên có thể viết rất ít dòng code để thực thi một chức năng hơn là dùng các ngôn ngữ khác. Nó được dùng để xây dựng các ứng dụng web nổi tiếng như InstagramPinterest và Rdio thông qua framework kết hợp Django và nó cũng được sử dụng bởi các “ông lớn” như GoogleYahoo! và NASA.

Bạn có thể học ngôn ngữ Python tạiUdemyCodecademyLynda.comLearnPython.org,Python.org.

8. Ngôn ngữ Ruby

Ngôn ngữ Ruby

Ruby là một ngôn ngữ kịch bản động và hướng đối tượng dùng để phát triển các trang web và các ứng dụng dành cho thiết bị di động, viết code bằng ngôn ngữ Ruby thì rất đơn giản và dễ dàng. Nó được dùng để xây dựng framework nổi tiếng là Ruby on Rails (hay còn gọi tắt là Rails), framework này được dùng để xây dựng nên các trang web ScribdGitHubGroupon vàShopify. Giống như ngôn ngữ Python, Ruby được xem là ngôn ngữ có cú pháp sáng sủa rất phù hợp với người bắt đầu học lập trình.

Bạn có thể học ngôn ngữ Ruby tạiCodecademyCode SchoolTryRuby.orgRubyMonk.

9. Ngôn ngữ JavaScript

Ngôn ngữ JavaScript

JavaScript là một ngôn ngữ kịch bản chạy trên máy trạm, được phát triển bởi hãng Netscapevà có cú pháp bắt nguồn từ ngôn ngữ C. Nó có thể chạy được trên rất nhiều loại trình duyệt khác nhau và được xem là một yếu tố quan trọng để phát triển các chức năng tương tác và các hiệu ứng trên môi trường web. Ngoài ra nó cũng được sử dụng để phát triển game và các ứng dụng trên desktop. Bộ thông dịch JavaScript hiện được nhúng vào trong các extensions của trình duyệt Google Chrome, trình duyệt Safari của Apple, Adobe Acrobat và Reader và cả bộ Creative Suite của hãng Adobe.

Bạn có thể học ngôn ngữ JavaScript tạiCodecademyLynda.comCode School,TreehouseLearn-JS.org.

10. Ngôn ngữ SQL

Ngôn ngữ SQL

SQL (Structured Query Language) là một ngôn ngữ với mục đích rất đặc biệt, dùng để quản lý dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ. Nó hầu như được dùng phổ biến nhất ở chức năng “truy vấn”, tức là tìm kiếm thông tin trong database. SQL đã được chuẩn hóa bởi Viện Tiêu Chuẩn Quốc Gia Hoa Kỳ viết tắt là ANSI (American National Standards Institute) và tổ chức tiêu chuẩn quốc tế là International Organization for Standardization (ISO) vào những năm 1980.

Bạn có thể học ngôn ngữ SQL tạiLynda.comSQLCourse.comTutorialsPoint.com,SQLZoo.net.

Link: http://vinacode.net/2014/03/18/ngon-ngu-lap-trinh-nen-hoc/

Integrating Knockout with Twitter Bootstrap Popover

ntroduction

Knockout is a powerful and pretty useful javascript library to have the 2 way binding MVVM (Model-View-ViewModel) pattern implementation along with the templates and built-in binding support to
bind the data to the HTML controls.

Knockout also does support the developers to write the custom binding (out of the box) and can use those binding to bind the data to the HTML controls.

Twitter Bootstrap is a web UI toolkit (HTML / CSS and Javascript) to build the rich and responsive web application.

To know more about the Twitter Bootstrap Popover click here

The below code explain how to bind the model (data) using Knockout to the Twitter Bootstrap Popover.

For this code snippet, I have used Knockout Custom Binding Handler. To know more about the Knockout Customer Binding Handler click here

 

Look & feel

1. The initial data displayed in the table.

 

2. After clicking the “Edit”, the popover with the corresponding person’s data will be displayed.

 

 

3. On changing any data in the popover, the corresponding data will be updated in the view.

Using the code

Below is the working code for binding the knockout view model with the twitter bootstrap popover.

In the initial of the code, I have given the references to the CDN path for the Knockout, JQuery and Bootstrap.

Next is, I have created a Person ViewModel which is a collections of Persons (Observable Array) that will be bind to the Popover (View)

Now the key part is to define the Knockout Custom Binding Handler. The KO custom binding handler will have two methods i.e. init and update. Here I have set the properties in the init method like the element which binds this handler and passes the “id”, the dynamic template content. Using bindingContext, we can attach the ViewModel to the Popover HTML content.

Also to make sure, the popover trigger property should be set to “manual” and binding will be handled in the click event.

Using the Knockout template (“person-template”) and the View Model, the template will be rendered with the support of 2 way binding. Any changes made to any of the data in the popover will be reflected back to the view i.e. the Person Table.

 Collapse | Copy Code
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Knockout and Bootstrap Popover</title>
    <link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap-responsive.css" rel="stylesheet">
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>
    <script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
</head>
<body>
    <script>
        var personViewModel = function () {
            var self = this;
            self.persons = ko.observableArray();
            self.persons.push({
                id: 1,
                firstName: ko.observable("John"),
                lastName: ko.observable("Doe"),
                email: ko.observable("john.doe@email.com")
            })
            self.persons.push({
                id: 2,
                firstName: ko.observable("Greg"),
                lastName: ko.observable("Smith"),
                email: ko.observable("greg.smith@email.com")
            })
            self.persons.push({
                id: 3,
                firstName: ko.observable("Tom"),
                lastName: ko.observable("Walter"),
                email: ko.observable("tom.walter@email.com")
            });

            self.closePopover = function (person) {
                $('#popover' + person.id + "_click").popover("hide");
            };

        }

    </script>

    <script>
        ko.bindingHandlers.popUp = {
            init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
                var attribute = ko.utils.unwrapObservable(valueAccessor());
                var templateContent = attribute.content;
                var popOverTemplate = "<div class='popOverClass' id='" + attribute.id + "-popover'>" + $(templateContent).html() + "</div>";
                $(element).popover({
                    placement: 'right',
                    content: popOverTemplate,
                    html: true,
                    trigger: 'manual'
                });
                $(element).attr('id', "popover" + attribute.id + "_click");
                $(element).click(function () {
                    $(".popOverClass").popover("hide");
                    $(this).popover('toggle');
                    var thePopover = document.getElementById(attribute.id + "-popover");
                    childBindingContext = bindingContext.createChildContext(viewModel);
                    ko.applyBindingsToDescendants(childBindingContext, thePopover);
                })
            }
        }
    </script>

    <br />
    <br /><br /><br /><br /><br /><br />
    <table border="1" cellpadding="0" cellspacing="0" data-bind="foreach: persons">
        <tr>
            <td><span data-bind="text: firstName"></span></td>
            <td><span data-bind="text: lastName"></span></td>
            <td><span data-bind="text: email"></span></td>
            <td><a href="#" data-bind="popUp: {content: '#person-template', id: id}">Edit</a></td>
        </tr>
    </table>
    <script type="text/html" id="person-template">
        <table border="1" cellpadding="0" cellspacing="0">
            <tr>
                <td>First Name</td>
                <td><input type="text" data-bind="value: firstName, valueUpdate:'keyup'" /></td>
            </tr>
            <tr>
                <td>Last Name</td>
                <td><input type="text" data-bind="value: lastName, valueUpdate:'keyup'" /></td>
             </tr>
            <tr>
                <td>Email Address</td>
                <td><input type="text" data-bind="value: email, valueUpdate:'keyup'" /></td>
            </tr>
        </table>
        <br>
        <div>
            <center>
                <div>
                    <button data-bind="click:$root.closePopover">Close</button>
                </div>
            </center>
        </div>
    </script>
    <script>
        ko.applyBindings(new personViewModel());
    </script>
</body>
</html>

Conclusion

I hope it will helpful to the developers who are building the rich and responsive UI using knockout and Twitter bootstrap. Though I have used the pre-populated data but you can get data from any of the services.

Thanks for reading.

 

Link: http://www.codeproject.com/Tips/740940/Integrating-Knockout-with-Twitter-Bootstrap-Popove

Distributed Caching using Redis Server with .NET/C# Client

Introduction

In this article, I would like to describe my experience with installing and configuring Redis server in most compact way. Also, I would like to do a brief overview of usage Redis hashes and lists in .NET/C# client.

In this article:

Background

Redis is one of the fastest and most feature-rich in-memory key value data stores.

Disadvantages

  • No local data buffering (like synchronized local data buffering on the Azure caching)
  • No full clusterization support yet (expected in the end of this year)

Advantages

  • Easy configuration
  • Simple usage
  • High performance
  • Support of different data types (like hashes, lists, sets, sorted sets)
  • ASP.NET session integration
  • Web UI for viewing content of the cache

In this simple demo, I’m going to demonstrate how to install and configure Redis on the server and use it from the C# code.

Redis Installation

Download binaries from https://github.com/dmajkic/redis/downloads (win32 win64 direct link) unpack archive to the application directory (e.g. C:\Program Files\Redis)

Download Redis service compiled from https://github.com/kcherenkov/redis-windows-service/downloads, then copy to the program folder (e.g. C:\Program Files\Redis. If config file is missing, download it and copy to the application directory as well. Example of the valid Redis config file is at https://raw.github.com/antirez/redis/2.6/redis.conf.

The complete set of files for Redis application is also available in zip file (x64).

When you have the full set of the application files (like it is shown on the image below),

redis application folder conten

navigate to the application directory and run the following command:

 Collapse | Copy Code
sc create %name% binpath= "\"%binpath%\" %configpath%" start= "auto" DisplayName= "Redis"

Where:

  • %name% — name of service instance, example: redis-instance;
  • %binpath% — path to this project EXE file, example: C:\Program Files\Redis\RedisService_1.1.exe;
  • %configpath% — path to redis configuration file, example: C:\Program Files\Redis\redis.conf;

Example:

 Collapse | Copy Code
sc create Redis start= auto DisplayName= Redis binpath= "\"C:\Program Files\Redis\RedisService_1.1.exe\
" \"C:\Program Files\Redis\redis.conf\""

It should look like this:

Installing redis as windows service

Make sure that you have enough privileges to start the service. After installation, check that the service was created successfully and is running now:

redis running as a windows service

Alternatively, you can use installer, created by someone (I’ve not tried): https://github.com/rgl/redis/downloads.

Redis Server Protection: Password, IP Filtering

The primary way to protect Redis server is to set IP filtering using Windows firewall or properties of the active network connection. Additional protection can be set using redis password. It needs to update the Redis config file (redis.conf) in the following way:

First, find the line:

 Collapse | Copy Code
# requirepass foobared

Remove the # symbol in the beginning and replace foobared with new password:

 Collapse | Copy Code
requirepass foobared

Then restart Redis Windows service!!!

When instantiating the client, use constructor with a password:

 Collapse | Copy Code
RedisClient client = new RedisClient(serverHost, port, redisPassword);

Redis Server Replication (master – slave configuration)

This technique allows creation copy of the server data into the synchronized copy, this means that each time when master is modified, slave server gets notification and is automatically synchronized. Mostly replication is used for read (but not write) scalability or data redundancy and for the server failover. Setup two instances of Redis (two services on the same or different servers), then configure one of them as slave. To make Redis server instance to be slave of another server, change the config file in this way:

Find the line below:

 Collapse | Copy Code
# slaveof <masterip> <masterport>

replace with:

 Collapse | Copy Code
slaveof 192.168.1.1 6379

(specify real IP of the master server, and port in case you customized it). If master is configured to require password (authentication), change redis.conf as it is shown below, find line:

 Collapse | Copy Code
# masterauth <master-password>

remove the # symbol in the beginning and replace <master-password> with master password, to be like that:

 Collapse | Copy Code
masterauth mastpassword

Now this Redis instance can be used as a readonly synchronized copy of the master server.

Using Redis Cache from the C# Code

To use Redis in C# run the Manage NuGet packages addon, find ServiceStack.Redis pack, and install it.

Sample of using Set/Get methods directly from the instantiated client:

 Collapse | Copy Code
string host = "localhost";
string elementKey = "testKeyRedis";

using (RedisClient redisClient = new RedisClient(host))
{
      if (redisClient.Get<string>(elementKey) == null)
      {
           // adding delay to see the difference
           Thread.Sleep(5000); 
           // save value in cache
           redisClient.Set(elementKey, "some cached value");
      }
      // get value from the cache by key
      message = "Item value is: " + redisClient.Get<string>("some cached value");
 }

Typed entity sets are more interesting and practical, because they operate with exact types of objects. In the code sample below, there are two classes defined Phone, and Person – owner of the phone. Each phone instance has a reference to the owner. This code demonstrates how we can add, remove or find items in the cache by criteria:

 Collapse | Copy Code
public class Phone
{
   public int Id { get; set; }
   public string Model { get; set; }
   public string Manufacturer { get; set; }
   public Person Owner { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
    public string Profession { get; set; }
}

using (RedisClient redisClient = new RedisClient(host))
{
     IRedisTypedClient<phone> phones = redisClient.As<phone>();
     Phone phoneFive = phones.GetValue("5");
     if (phoneFive == null)
     {
          // make a small delay
          Thread.Sleep(5000);
          // creating a new Phone entry
          phoneFive = new Phone
          {
               Id = 5,
               Manufacturer = "Motorolla",
               Model = "xxxxx",
               Owner = new Person
               {
                    Id = 1,
                    Age = 90,
                    Name = "OldOne",
                    Profession = "sportsmen",
                    Surname = "OldManSurname"
               }
          };
          // adding Entry to the typed entity set
          phones.SetEntry(phoneFive.Id.ToString(), phoneFive);
     }
     message = "Phone model is " + phoneFive.Manufacturer;
     message += "Phone Owner Name is: " + phoneFive.Owner.Name;
}

In the example above, we instantiate the typed client IRedisTypedClient, which works with specific type of cached objects: Phone type.

ASP.NET Session State with Redis

To configure ASP.NET session state with redis provider, add a new file to your web project, namedRedisSessionStateProvider.cs, copy code from https://github.com/chadman/redis-service-provider/raw/master/RedisProvider/SessionProvider/RedisSessionProvider.cs, then add or change the following section in the configuration file (sessionState tag has to be inside system.web tag), or you can download attached sources and copy code.

 Collapse | Copy Code
<sessionstate timeout="1" mode="Custom" 
customprovider="RedisSessionStateProvider" cookieless="false">
      <providers>
        <add name="RedisSessionStateProvider" writeexceptionstoeventlog="false" 
        type="RedisProvider.SessionProvider.CustomServiceProvider" 
        server="localhost" port="6379" password="pasword">
      </add> </providers>
</sessionstate>

NOTE, that password is optional, based on the server authentication. It must be replaced with real value, or removed, if Redis server doesn’t require authentication. server attribute and port also have to be replaced according to concrete values (default port is 6379). Then in the project, you can use the session state:

 Collapse | Copy Code
// in the Global.asax
public class MvcApplication1 : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //....
    }

    protected void Session_Start()
    {
        Session["testRedisSession"] = "Message from the redis ression";
    }
}

In the Home controller:

 Collapse | Copy Code
public class HomeController : Controller
{
    public ActionResult Index()
    {
       //...
       ViewBag.Message = Session["testRedisSession"];
       return View();
    }
//...
}

Result:

redis aspnet session state

ASP.NET output cache provider with redis can be configured in the similar way.

Redis Sets and Lists

The major note is that Redis lists implement IList<T> while Redis sets implement ICollection<T>. Let’s see how we can use them.

Lists are mostly used when it needs to separate different categories of objects of the same type. For example, we have “most selling phones” and “old collection” two lists of phones:

 Collapse | Copy Code
string host = "localhost";
using (var redisClient = new RedisClient(host))
{
    //Create a 'strongly-typed' API that makes all Redis Value operations to apply against Phones
    IRedisTypedClient<phone> redis = redisClient.As<phone>();

    IRedisList<phone> mostSelling = redis.Lists["urn:phones:mostselling"];
    IRedisList<phone> oldCollection = redis.Lists["urn:phones:oldcollection"];

    Person phonesOwner = new Person
        {
            Id = 7,
            Age = 90,
            Name = "OldOne",
            Profession = "sportsmen",
            Surname = "OldManSurname"
        };

    // adding new items to the list
    mostSelling.Add(new Phone
            {
                Id = 5,
                Manufacturer = "Sony",
                Model = "768564564566",
                Owner = phonesOwner
            });

    mostSelling.Add(new Phone
            {
                Id = 8,
                Manufacturer = "Motorolla",
                Model = "324557546754",
                Owner = phonesOwner
            });

    var upgradedPhone  = new Phone
    {
        Id = 3,
        Manufacturer = "LG",
        Model = "634563456",
        Owner = phonesOwner
    };

    mostSelling.Add(upgradedPhone);

    // remove item from the list
    oldCollection.Remove(upgradedPhone);

    // find objects in the cache
    IEnumerable<phone> LGPhones = mostSelling.Where(ph => ph.Manufacturer == "LG");

    // find specific
    Phone singleElement = mostSelling.FirstOrDefault(ph => ph.Id == 8);

    //reset sequence and delete all lists
    redis.SetSequence(0);
    redisClient.Remove("urn:phones:mostselling");
    redisClient.Remove("urn:phones:oldcollection");
}

Redis sets are useful when it needs to store associated sets of data and gather statistical information, for example answer -> queustion, votes for an answer or question. Let’s say that we have questions and answers, it needs to store them in the cache for better performance. Using Redis, we can do it this way:

 Collapse | Copy Code
/// <summary>
/// Gets or sets the Redis Manager. The built-in IoC used with ServiceStack autowires this property.
/// </summary>
IRedisClientsManager RedisManager { get; set; }
/// <summary>
/// Delete question by performing compensating actions to 
/// StoreQuestion() to keep the datastore in a consistent state
/// </summary>
/// <param name="questionId">
public void DeleteQuestion(long questionId)
{
    using (var redis = RedisManager.GetClient())
    {
        var redisQuestions = redis.As<question>();

        var question = redisQuestions.GetById(questionId);
        if (question == null) return;

        //decrement score in tags list
        question.Tags.ForEach(tag => redis.IncrementItemInSortedSet("urn:tags", tag, -1));

        //remove all related answers
        redisQuestions.DeleteRelatedEntities<answer>(questionId);

        //remove this question from user index
        redis.RemoveItemFromSet("urn:user>q:" + question.UserId, questionId.ToString());

        //remove tag => questions index for each tag
        question.Tags.ForEach("urn:tags>q:" + tag.ToLower(), questionId.ToString()));

        redisQuestions.DeleteById(questionId);
    }
}

public void StoreQuestion(Question question)
{
    using (var redis = RedisManager.GetClient())
    {
        var redisQuestions = redis.As<question>();

        if (question.Tags == null) question.Tags = new List<string>();
        if (question.Id == default(long))
        {
            question.Id = redisQuestions.GetNextSequence();
            question.CreatedDate = DateTime.UtcNow;

            //Increment the popularity for each new question tag
            question.Tags.ForEach(tag => redis.IncrementItemInSortedSet("urn:tags", tag, 1));
        }

        redisQuestions.Store(question);
        redisQuestions.AddToRecentsList(question);
        redis.AddItemToSet("urn:user>q:" + question.UserId, question.Id.ToString());

        //Usage of tags - Populate tag => questions index for each tag
        question.Tags.ForEach(tag => redis.AddItemToSet
        ("urn:tags>q:" + tag.ToLower(), question.Id.ToString()));
    }
}

/// <summary>
/// Delete Answer by performing compensating actions to 
/// StoreAnswer() to keep the datastore in a consistent state
/// </summary>
/// <param name="questionId">
/// <param name="answerId">
public void DeleteAnswer(long questionId, long answerId)
{
    using (var redis = RedisManager.GetClient())
    {
        var answer = redis.As<question>().GetRelatedEntities<answer>
        (questionId).FirstOrDefault(x => x.Id == answerId);
        if (answer == null) return;

        redis.As<question>().DeleteRelatedEntity<answer>(questionId, answerId);

        //remove user => answer index
        redis.RemoveItemFromSet("urn:user>a:" + answer.UserId, answerId.ToString());
    }
}

public void StoreAnswer(Answer answer)
{
    using (var redis = RedisManager.GetClient())
    {
        if (answer.Id == default(long))
        {
            answer.Id = redis.As<answer>().GetNextSequence();
            answer.CreatedDate = DateTime.UtcNow;
        }

        //Store as a 'Related Answer' to the parent Question
        redis.As<question>().StoreRelatedEntities(answer.QuestionId, answer);
        //Populate user => answer index
        redis.AddItemToSet("urn:user>a:" + answer.UserId, answer.Id.ToString());
    }
}

public List<answer> GetAnswersForQuestion(long questionId)
{
    using (var redis = RedisManager.GetClient())
    {
        return redis.As<question>().GetRelatedEntities<answer>(questionId);
    }
}

public void VoteQuestionUp(long userId, long questionId)
{
    //Populate Question => User and User => Question set indexes in a single transaction
    RedisManager.ExecTrans(trans =>
    {
        //Register upvote against question and remove any downvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:q>user+:" + questionId, userId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:q>user-:" + questionId, userId.ToString()));

        //Register upvote against user and remove any downvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:user>q+:" + userId, questionId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:user>q-:" + userId, questionId.ToString()));
    });
}

public void VoteQuestionDown(long userId, long questionId)
{
    //Populate Question => User and User => Question set indexes in a single transaction
    RedisManager.ExecTrans(trans =>
    {
        //Register downvote against question and remove any upvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:q>user-:" + questionId, userId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:q>user+:" + questionId, userId.ToString()));

        //Register downvote against user and remove any upvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet"urn:user>q-:" + userId, questionId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:user>q+:" + userId, questionId.ToString()));
    });
}

public void VoteAnswerUp(long userId, long answerId)
{
    //Populate Question => User and User => Question set indexes in a single transaction
    RedisManager.ExecTrans(trans =>
    {
        //Register upvote against answer and remove any downvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:a>user+:" + answerId, userId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:a>user-:" + answerId, userId.ToString()));

        //Register upvote against user and remove any downvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:user>a+:" + userId, answerId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:user>a-:" + userId, answerId.ToString()));
    });
}

public void VoteAnswerDown(long userId, long answerId)
{
    //Populate Question => User and User => Question set indexes in a single transaction
    RedisManager.ExecTrans(trans =>
    {
        //Register downvote against answer and remove any upvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:a>user-:" + answerId, userId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:a>user+:" + answerId, userId.ToString()));

        //Register downvote against user and remove any upvotes if any
        trans.QueueCommand(redis => 
        redis.AddItemToSet("urn:user>a-:" + userId, answerId.ToString()));
        trans.QueueCommand(redis => 
        redis.RemoveItemFromSet("urn:user>a+:" + userId, answerId.ToString()));
    });
}

public QuestionResult GetQuestion(long questionId)
{
    var question = RedisManager.ExecAs<question>
    (redisQuestions => redisQuestions.GetById(questionId));
    if (question == null) return null;

    var result = ToQuestionResults(new[] { question })[0];
    var answers = GetAnswersForQuestion(questionId);
    var uniqueUserIds = answers.ConvertAll(x => x.UserId).ToHashSet();
    var usersMap = GetUsersByIds(uniqueUserIds).ToDictionary(x => x.Id);

    result.Answers = answers.ConvertAll(answer =>
        new AnswerResult { Answer = answer, User = usersMap[answer.UserId] });

    return result;
}

public List<user> GetUsersByIds(IEnumerable<long> userIds)
{
    return RedisManager.ExecAs<user>(redisUsers => redisUsers.GetByIds(userIds)).ToList();
}

public QuestionStat GetQuestionStats(long questionId)
{
    using (var redis = RedisManager.GetReadOnlyClient())
    {
        var result = new QuestionStat
        {
            VotesUpCount = redis.GetSetCount("urn:q>user+:" +questionId),
            VotesDownCount = redis.GetSetCount("urn:q>user-:" + questionId)
        };
        result.VotesTotal = result.VotesUpCount - result.VotesDownCount;
        return result;
    }
}

public List<tag> GetTagsByPopularity(int skip, int take)
{
    using (var redis = RedisManager.GetReadOnlyClient())
    {
        var tagEntries = redis.GetRangeWithScoresFromSortedSetDesc("urn:tags", skip, take);
        var tags = tagEntries.ConvertAll(kvp => new Tag { Name = kvp.Key, Score = (int)kvp.Value });
        return tags;
    }
}

public SiteStats GetSiteStats()
{
    using (var redis = RedisManager.GetClient())
    {
        return new SiteStats
        {
            QuestionsCount = redis.As<question>().TypeIdsSet.Count,
            AnswersCount = redis.As<answer>().TypeIdsSet.Count,
            TopTags = GetTagsByPopularity(0, 10)
        };
    }
}

Attached Sources Description

List of included packages is in the packages.config,
Funq IoC configuration, registering types and current controller factory – are in the Global.asax (property dependency injection)
Usage of a simple client – in the home controller
Usage of IoC based cache in the Question and Answer controllers, and Global.asax application file. To see how it works, you can run the project, and open in the browser following URL:http://localhost:37447/Question/GetQuestions?tag=test .
You can play with tags, like test3, test11, test2, etc.
Redis Cache configuration – in the web config (<system.web><sessionState> section) and in theRedisSessionStateProvider.cs file.
There are a lot of TODOs in the MVC project, so if you want to improve/continue please update it, and upload.

I would much appreciate if someone could help build MVC application with simple UI, using Redis (with Funq IoC) cache. Funq IoC is already configured, example of the usage is in the Question controller.

NOTE: Samples were partially taken from the “ServiceStack.Examples-master” solution

Conclusion. Optimization Caching in Application with Fast Local Cache

Since Redis doesn’t store data locally (no local replication), it might make sence to optimize performance by storing some light or user – dependent objects in the local cache (to skip serialization to string and client – server data transfering). For example, in the web application, it is better to use ‘System.Runtime.Caching.ObjectCache‘ for light objects, which are user dependent and used frequently by the application. Otherwise, when object has common usage, large size it must be saved in the distributed Redis cache. Example of the user dependent objects – profile information, personalization information. Common objects – localization data, information shared between different users, etc.

 

Link goc: http://www.codeproject.com/Articles/636730/Distributed-Caching-using-Redis