Fullstack Senior .NET developer in Vietnam

You should know most of these if you want to be called Senior .NET developer in Vietnam labor market. In return might be 1300$+++ net salary (from a source of one headhunter firm).

General

  • Proficient .NET 4/4.5 + ASP.NET Web API + SQL
  • Good JavaScript skills.
  • Proficient writing UTs with mocking.
  • Good OOP.
  • Basic knowledge or experience of using IoC container. (StructureMap)
  • Basic knowledge or experience of design pattern.
  • Knowledge or experience of NoSQL is a plus point.

Front-end

  • AngularJS – front-end framework.
  • Twitter Bootstrap 3 – grid layout & responsive CSS.
  • Telerik Kendo UI – HTML5 widgets & controls.
  • RequireJS – JS module loader & dependency injection
  • LESS – CSS compiler.
  • R.js – RequireJS optimizer
  • Gulp.js or Grunt.js – Build system
  • Bower – JS package management.
  • Karma & Jasmine & Phantom.JS – JS unit test framework & runner & browser simulator for test run.
  • JSHint – JS code style check.

Web API back-end

  • .NET 4.5
  • ASP.NET Web API – REST API framework
  • ASP.NET Identity – Web authentication
  • OWIN Katana – Light-weight web framework
  • SimpleInjector – Fast & light-weight IoC container
  • NUnit/xUnit – Unit Test framework & runner.
  • Moq – Mocking framework
  • Quartz.net – Task Scheduler
  • MassTransit + RapidMQ – .NET service bus working on message queue.
  • ElasticSearch – Full-text search engine.

 

Advertisements

what is .NET delay signing?

Signing

Signing an assembly basically certifies that assembly by the manufacturer and prevents tampering and hi-jacking of that assembly.

The signing is accomplished by using public key/private key encoding of parts of the assembly.

 

Delay signing

Delayed signing refers to a technique of partially signing assemblies while they are in development (embedded the public key in the assembly but still secures the private key).

 

Why?

An organization can have a closely guarded key pair that developers do not have access to on a daily basis. The public key is often available, but access to the private key is restricted to only a few individuals.

When developing assemblies with strong names, each assembly that references the strong-named target assembly contains the token of the public key used to give the target assembly a strong name. This requires that the public key be available during the development process.

So, after delay signing, the public key is embedded in the assembly and will be used by third-parties who want to reference (you can place a shared assembly (as if strongly named) in the GAC by signing the assembly with just the public key).

EPiServer tuyển người – Hà Nội

EPiServer is the world’s fastest growing provider of Web Content Management (WCM) and online social community platforms. Over 3000 customers worldwide use EPiServer CMS to create collaborative, engaging and attractive websites. The platform EPiServer CMS is the foundation of more than 9000 websites and is used on a daily basis by over 130,000 web editors. It enables true web engagement which allows customers to turn passive web visits into dynamic, personalized web experiences that drive new revenues. EPiServer delivers its WCM platform through a network of more than 340 competent partner companies in 25 countries.

Founded in 1994, the company has offices in the USA, Sweden Denmark, Norway, Finland, the Netherlands, Australia, South Africa and the UK.

http://www.episerver.com

Attached to this mail you will find five different profiles,

  • Profile Software Test Automation Engineer
  • Profile Software Tester
  • Profile Web Designer, User Interaction Designer
  • Profile Web User Interface Developer
  • Profile Product Support Developer

As the Development Manager coming to Hanoi on the January the 22 it is important for candidates to apply ASAP.

Send your CV to pelle[dot]niklasson[at]episerver.com

dùng Cache trong ASP.NET

Bài này đề cập tới DataCaching của ASP.NET. Các vấn đề outputCaching (cache cả trang aspx) và fragmentCaching (cache một ascx, một phần của trang Aspx) là khá dễ, chỉ cần setup vài thẻ trong mã aspx là xong nên không được đề cập trong bài.

Xem thêm tại http://aspnet.4guysfromrolla.com/articles/022802-1.aspx

Cache về bản chất giống như một HashTable, lưu key là một String, value là đối tượng .NET. Tuy nhiên Cache thì có tính năng đặc biệt là tự động gỡ bỏ các entry theo thời gian hoặc khi hết bộ nhớ để lưu.

Truy xuất Cache:

dùng đối tượng tĩnh HttpContext.Current.Cache
nếu trong Page aspx, dùng Server.Cache
nếu trong ashx, dùng context.Cache

tất cả đều truy xuất đến cùng một chỗ lưu cache của ASP.NET.

Có hai kiểu chính sách hết hiệu lực bạn có thể sử dụng khi lưu giữ dữ liệu trong cache.

  • Absolute expiration: hết hiệu lực vào một THỜI ĐIỂM xác định trong tương lai (VD: 10 phút nữa là huỷ đổi tượng).

Cache.Insert("cacheKey", ObjectToCache, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);

  • Sliding expiration: gỡ bỏ các đối tượng sau một khoảng thời gian không dùng đến. Mỗi khi đối tượng được truy xuất, thời gian sống của nó sẽ được reset. (VD: loại bỏ các đối tượng mà đã lâu (10 phút) không dùng tới)

Cache.Insert("cacheKey", ObjectToCache, null,DateTime.MaxValue, TimeSpan.FromMinutes(10));

Mẫu code chung để sử dụng Cache là:

T GetValue(){
string CACHE_KEY = "cacheKey";
object oValue = cache[CACHE_KEY];
if (oValue == null) {
oValue = GetValueFromSomeWhere();
// Lưu giữ đối tượng theo kiểu nào tuỳ bạn chọn
cache.Insert(CACHE_KEY, oValue, null, DateTime.MaxValue, TimeSpan.FromSeconds(60));
}
return oValue as T;
}

Hàm GetValueFromSomeWhere() là chỗ bạn lấy dữ liệu thực ở đâu đó (VD lấy từ Database, đọc từ file …)

.

Một  số bonus:
Hàm Cache.Insert() có đối số cuối cùng là CallBack. Tính năng này khá tiện, cho phép developer kiểm soát xem nên làm gì mỗi khi Cache entry bị gỡ bỏ (có thể kiểm tra, tạo lại mới luôn, hoặc thực hiện một số tác vụ …) .  Tips: Dùng cái này có thể tránh được việc pooling để kiểm tra xem Cache entry hết hạn chưa.

Callback này không được khởi chạy nếu cache entry bị gỡ bỏ có chủ ý (bằng cách gọi Remove(), hay gọi Insert() mới đè lên)

Hàm Cache.Insert() nếu cung cấp key trùng với key đã có rồi sẽ gỡ bỏ entry cũ, ấn entry mới vào với key tương ứng ấy

Gửi mail từ dot NET qua Gmail


MailMessage mailMsg = new MailMessage();
mailMsg.From = new MailAddress("username@gmail.com");
mailMsg.To.Add(sTo);
mailMsg.ReplyTo = new MailAddress("new_username@gurucore.com", "reply to guru");
mailMsg.Subject = "subject of the mail";
mailMsg.IsBodyHtml = true;
mailMsg.BodyEncoding = Encoding.UTF8;
mailMsg.Body = "this is body, format is html <strong>hTML</strong>";
mailMsg.Priority = MailPriority.Normal;
// Smtp configuration
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("username@gmail.com", "password");
client.Port = 587; //or use 465
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
try
{
client.Send(mailMsg);
}
catch (SmtpException ex)
{
Literal1.Text = ex.Message + ex.StackTrace;
}

Silverlight – lập trình viên .NET cần đón đầu công nghệ

http://weblogs.asp.net/scottgu/archive/2008/10/14/silverlight-2-released.aspx

http://weblogs.asp.net/scottgu/archive/2007/05/07/silverlight.aspx

http://weblogs.asp.net/scottgu/archive/2008/11/16/update-on-silverlight-2-and-a-glimpse-of-silverlight-3.aspx

http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx

Webserver push tới browser (client), kỹ thuật và đánh giá, Reverse Ajax / Comet / Ajax Push

(đang nghiên cứu và đánh giá, thực hiện)

Giới thiệu công nghệ

Reverse Ajax refers to an Ajax design pattern that uses long-lived HTTP connections to enable low-latency communication between a web server and a browser. Basically it is a way of sending data from client to server and a mechanism for pushing server data back to the browser.[1][2]

This server–client communication takes one of two forms:

* Client polling, the client repetitively queries (polls) the server and waits for an answer.
* Server pushing, a connection between a server and client is kept open, the server sends data when available.

Reverse Ajax describes the implementation of any of these models, including a combination of both. The design pattern is also known as Ajax Push, Full Duplex Ajax and Streaming Ajax.

Từ khoá: Reverse Ajax / Comet / Ajax Push

Slow load

http://www.obviously.com/tech_tips/slow_load_technique

So sánh Push và Pull khi dùng Ajax

http://www.infoq.com/news/2007/07/pushvspull

Các lựa chọn để cài đặt

Comet – http://cometdproject.dojotoolkit.org/

Cometd Bayeux Ajax Push: Cometd is a scalable HTTP-based event routing bus that uses a Ajax Push technology pattern known as Comet. The term ‘Comet’ was coined by Alex Russell in his post Comet: Low Latency Data for the Browser.

MeteorServer – http://meteorserver.org/

jquery

dojo

APE  http://www.ape-project.org/

Tomcat / Pushlets

http://www.pushlets.com/

http://www.icesoft.com/corporate/press_release_07_06_EE_1.0.html

http://www.icefaces.org/main/ajax-java/ajaxpush.iface

Apache

http://jha.rajeev.googlepages.com/web2push

PHP server push (chỉ xài với non-IE)
http://web.they.org/software/php-push.php

Đọc thêm

http://www.wired.com/wired/archive/5.03/ff_push_pr.html

http://www.patentstorm.us/patents/6381645/claims.html

http://www.itaware.eu/2008/11/03/push-push-push-on-the-browser/

http://www.itaware.eu/2008/11/03/push-push-push-on-the-browser/

http://www.openajax.org/member/wiki/Main_Page

http://www.theserverside.com/news/thread.tss?thread_id=40650

http://ajaxpatterns.org/HTTP_Streaming

http://cometdaily.com/

http://www.pathf.com/blogs/2006/05/not_there_yet_c/

Jetty 6 Servlet Container has it. It is called Continuation and is based on NIO

Scalability is a fundamental feature for a Comet Server, since a large number of concurrent TCP connections has to handled.
Lightstreamer is based on a staged event driven architecture, built over Java NIO classes, that allows it to handle an arbitrary number of connections with a fixed pool of threads.
Just to give you an idea of performance, on a single Pentium 4 CPU – 2.4 GHz, Lightstreamer Server was able to sustain 10,000 concurrent streaming connections with an outbound frequency of 1 update/sec per client.

.NET
http://www.codeproject.com/KB/aspnet/CometGrid.aspx?fid=1538113&select=3001476#xx3001476xx
http://www.codeproject.com/KB/aspnet/CometMultiClient.aspx

Móc nối toán tử ?? của C# để lấy tham số nhẹ nhàng hơn

C# từ bản 2.0 có toán tử ?? rất tiện. Toán tử ?? tương tự như hàm isnull() trong T-SQL của SQL Server vậy. Nó hoạt động như sau:

Nếu value1 là null thì sẽ trả ra value2;

VD:
Nếu dùng toán tử ??

string result = value1 ?? value2;

Nếu viết bình thường
string value1 = null;
string value2 = "Test1";
string result = value1 != null ? value1 : value2;

Cả hai trường hợp trên, biến result sẽ nhận giá trị “Test1”.

Sử dụng toán tử ?? thì bạn sẽ dễ viết hơn, ngắn gọn, bỏ đi được cả đống if() kiểm tra null. Với VD dưới đây, bạn có thể móc nối toán tử ?? để viết chỉ trên 1 dòng mã (chaining):

string partner = Request.QueryString["GoogleId"] ??
Request.QueryString["PartnerId"] ??
Request.QueryString["UserKey"] ??
string.Empty;

Câu lệnh trên sẽ dừng khi nó tìm ra giá trị querystring đầu tiên không null. Nếu tất cả querystring đều null thì nó sẽ trả ra chuỗi rỗng “”.

Nếu bạn sử dụng if()else thì sẽ phải viết rất nhiều mã, nhàm chán, lại phải lồng các if() vào nhau, khó đọc.

.

Nguồn: http://www.west-wind.com/weblog/posts/236298.aspx

Sử dụng YUI Compressor với Visual Studio

1. Minified (làm tối thiểu hoá) hay compress các file text. Công việc này thường là: bỏ các dấu xuống dòng, bỏ các dấu cách, dấu tab thừa (mà developer thường dùng trong khi viết mã – cho đẹp).
2. Khi làm web, nếu làm kỹ lưỡng thì tất cả các file JS, CSS đều phải được minified, giảm khá nhiều dung lượng truyền tải. Đôi khi còn phải ghép nhiều file thành 1 file nữa (để giảm số lần request, thay vì lấy 3 file 1.css 2.css 3.css thì chỉ lấy 1 file 123.css thôi, tiết kiệm 2 request)

YUICompressor là công cụ khá tốt (và nổi để làm việc này). Bài viết này hướng dẫn dùng YUICompressor (kèm) với VisualStudio. (Ngắn gọn là cấu  hình VS để nó gọi hộ mình chương trình Java YUICompressor)

Download YUI Compressor từ Yahoo và giải nén (unzip) nó vào thư mục nào đó.

Cấu hình External Tool của Visual Studio

Mở Visual Studio. Chọn (Tools -> External Tools…)

image

Nhấn Add, tạo một tool mới , đặt tên là YUI Compressor.  Nhập các thông số như sau:

Chỉnh lại đường dẫn đến file jar (chỗ mà bạn vừa giải nén YUI Compressor ở bước trước).
Bạn cũng cần phải có khả năng chạy Java trên máy (Cài JRE hoặc JDK rồi, đặt Path đến java.exe rồi java.exe is in your path)

  1. Title: Yui Compressor
  2. Command: java.exe
  3. Arguments: -jar “E:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar” $(ItemPath) –charset “UTF8” –type js -o $(ItemFileName).min$(ItemExt)
  4. Initial Directory: $(ItemDir)
  5. Đánh dấu vào “Use Output Window”

image

Để thử nghiệm, bạn hãy chọn file js trong cửa sổ Solution Explorer.  Sau đó mở menu Tool/Yui Compressor.  Refresh lại thư mục trong Solution Explorer, bạn sẽ thấy các file dạng *.min.js

Bạn hãy làm tương tự để tạo Tool YUI cho các file css, chỉ chú ý là thay đối số –type thành css chứ không phải js khi cấu hình tool (trong ô nhập Argument)

Tạo Toolbar trong VS để làm cho  tiện

Vào menu Tools->Customize.  Nhấn New…

image

Sang tab Command , chọn mục Tools.

image

Kéo thả External Command 1 vào toolbar của bạn.

Hy vọng các bạn dùng .NET thấy hữu ích với kỹ thuật này. Kỹ thuật này có các điểm lợi:

  • Bớt được việc mở commandline, gõ lệnh để chạy YUIC, mất thời gian, tốn công, khó setup, nhất là phải gõ đường dẫn. Giờ chỉ cần click chuột trên toolbar
  • Vẫn dùng nguyên xi code của YUICompressor (Java). Khi YUI nó có thay đổi hay nâng cấp, tải về bản mới là xong.

Bài gốc cho bài viết này đc lấy tại đây:
http://blog.lavablast.com/post/2009/05/YUI-Compressor-for-Visual-Studio.aspx

Cách khác

Nếu bạn cảm thấy ngại cài thêm Java trên máy, đây là một công cụ khác, cũng có chức năng tương đương. Tuy nhiên nếu dùng bản này bạn sẽ không có điểm lợi thứ 2 (trong cách dùng Java YUIC như trên)
http://www.codeplex.com/YUICompressor
Đây là bản code viết bằng .NET, convert từ dự án (viết bằng Java) Yahoo! UI Library’s YUI Compressor. Tác dụng của nó cũng là nén JS và CSS tới mức tối đa mà vẫn đảm bảo hoạt động như bình thường.
Phiên bản này dựa trên YUI Compressor version: 2.4.2 (từ ngày 2009-02-22).

Tính năng chính
* Stock Yui Css compression.
* Stock Yui JavaScript compression.
* MsBuild task which can be used in a Web Deployment Project build.
* The MsBuild task also compiles all compressed files into a single destination file (aka. file combining).
* Can now handle Encoding Types (eg. Unicode) from v1.2.2.0 onwards and ThreadCulture from v1.3.0.0 onwards.

Dùng C# viết windows service

Các bài hướng dẫn bằng tiếng Anh có vẻ có nhiều, nhưng phần lớn các bạn post những bài tiếng Anh ấy lên các diễn đàn đều không giải thích cũng như dịch lại, mà thuần là copy paste, cho nên LockeVN mỗ cảm thấy nếu viết một bài hướng dẫn nhanh bằng tiếng Việt thì vẫn hữu ích.

Viết bằng VS2008 và C# rất tiện, rất nhanh, dễ hiểu, gọn, chỉ cần làm theo vài bước đơn giản là được.

OK, rào trước đón sau đủ rồi, giờ bắt đầu, ngắn gọn.

1. Mở Visual Studio ra (dùng bản VS2008 cho tiện),
Tạo một Project mới, chọn C#, chọn windows, chọn Windows Service, đặt tên project “MyService”, OK.
2. Chỉnh vài setting nho nhỏ
Chuột phải vào project, chọn Startup Object là MyService.Program nhé
Nhìn vào Solution Explorer, chuột phải vào Service1.cs, chọn Rename, cho nó một cái tên mỹ miều hơn nhé “FirstService”, nhấn Yes để nó tự thay đổi các file khác.
Nhìn vào Solution Explorer, Nhấn vào FirstService.cs, Nhấn Shift F7, mở ra màn hình Design, chuột phải vào màn hình Design (ở giữa ấy) chọn Properties, chỉnh các thông số của nó trong khung Properties nhé, quan trọng nhất là cái ServiceName, đặt tạm là “mysvc”

3. Nhớ là dùng System.Threading.Timer, đừng dùng các Timer khác (kẻo bạn sẽ hối hận và tốn thời gian vô cùng)

4. Thêm bộ Installer
Sửa các thuộc tính sau

5. Cài đặt
mở Visual Studio 2008 Command Prompt
Để cài đặt, Gõ installutil /i “MyService.exe”
Để gỡ bỏ, Gõ installutil /u “MyService.exe”

Đôi khi việc gỡ bỏ service không hề dễ dàng (nhất là khi code lỗi, code lỗi phần installer, chỉnh sửa project setup), không thể uninstall đc, mà không uninstall được thì bạn sẽ không cài lại được, không thử tiếp được 😀 . Cho nên ta vẫn phải cần tới cách gỡ bỏ windows service bằng tay.

  • Vào menu Start, Run, gõ regedit, enter
  • Chuyển đến nhánh key (bên trái) HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
  • Xoá nhánh service nào bạn thấy bị lỗi.
  • Khởi động lại.

Chú ý: đừng làm việc gỡ bỏ bằng tay này nếu không hiểu rõ ràng bạn đang sửa cái gì, hoàn toàn tự chịu trách nhiệm đấy nhé.

Tham khảo

http://www.grinn.net/blog/dev/2008/01/windows-services-in-c-part-1.html
http://www.codeproject.com/KB/system/WindowsService.aspx
http://www.aspfree.com/c/a/C-Sharp/Timer-Objects-in-Windows-Services-with-C-sharp-dot-NET/

Port 25, Microsoft port for open source ship

About Port 25 by jcannon on March 22, 2006 09:47PM

<!– –>Healthy and productive discussion only occurs when there are two parties listening & responding to each other – the principle element of all communication. This is the foundation that Port 25 is built on. And everything we do will be guided by a set of 10 hard and fast rules based on that principle:

Port 25 is about having a healthy conversation with customers and the industry wherein people can talk openly and honestly about their biggest interoperability challenges, whether it is on UNIX, Linux, Windows, or among other open source packages.

using memcache with multi ClientAPI multi platforms and languages

When your system is large, compose by several programs, in several languages. If every programs need to access memcacheD, you should use the correct ClientAPI to make them talk with each other.
Of course, if you set value by PHP, you get value by PHP, it works. If you set value by Java, then you get value by other Java program, it work too.

BUT, this time (this post time), if PHP says, maybe Java can’t hear, C# can’t here, and vice versa.

in PHP, $memcacheClient->set(“test”,”lockevn”);     // it will go to memcache server

in Java, Object oValue = oMemcacheClient.get(“test”) ;      // it will return null, supprise!!! @:@

I have some experience with Java, PHP. PHP website (using default pecl extension module) set value to memcache, if Java program need to get that value, you should use http://bleu.west.spy.net/~dustin/projects/memcached/ ClientAPI (at the time of this post). The other won’t work. Follow this link to get more info.

I do not test .NET client   http://www.codeplex.com/EnyimMemcached

You also need to store value as native format, only use 32bit integer, or string. If you put PHP object, Java program can not understand it, neither the C# program.

If your really need to store object, serialize it (to XML, JSON, … encode with UTF-8) BEFORE put it in memcache. The others must deserialize after get that value. Believe me, do that will save you a lot of time.

There is a similar alternative project on Windows: Velocity from MS
http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&displaylang=en

And an alternate one
http://www.sharedcache.com/cms/

Summary

memcache is good, but it make only to store data, only data, it does not like “object” things, don’t push it too hard. If you want some program say and other “different language” program hear, check it carefully, ask the ClientAPI author if it does not work. You should use native data format for value (int and string only), do serialize by yourself if you want to store data object.