Thứ Năm, 27 tháng 12, 2012

Media Player C# using MCI

I) Giới thiệu

Trong nhiều trường hợp, bạn cần sử dụng âm thanh trong ứng dụng của mình để thông báo hay tạo một hiệu ứng nào đó. Bạn nghĩ tới việc sử dụng lớp System.Media.SoundPlayer cho yêu cầu này, và bạn nhận ra nó có một hạn chế là chỉ chơi được các định dạng .wav. Một giải pháp khác là bạn dùng control Window Media Player có sẵn trong Windows, đây là một giải pháp hay. Nhưng nếu bạn không muốn lệ thuộc vào control này, bạn cần tìm một con đường khác và có thể bạn sẽ tìm được nó khi đọc phần tiếp theo của bài viết này.

Trong bài này, tôi sẽ trình bày cách tạo một chương trình để chơi các định dạng âm thanh và video với các chức năng cơ bản như play, pause, stop, seek…thông qua Media Control Interface (MCI). Để biết thêm các thông tin và cách sử dụng MCI bạn có thể tham khảo trên MSDN của Microsoft.

MCI Player

Giao diện mô phỏng của ứng dụng sau khi hoàn thành.

II) Thiết kế

Trước tiên, để ứng dụng của bạn OOP hơn, hãy tạo một lớp để quản lý chức năng chơi nhạc, ví dụ ở đây tôi đặt tên lớp là MciPlayer. Lớp này sẽ chứa những hàm cơ bản để ta điều khiển quá trình chơi nhạc.

Để sử dụng được MCI bạn cần thêm hàm API mciSendString nằm trong tập tin winmm.dll của Windows. Hãy thêm namespace System.Runtime.InteropServices vào trước khi import tập tin winmm.dll. Đây là đoạn mã import thư viện winmm.dll và khai báo hàm API mciSendString để sử dụng trong chương trình.

[DllImport("winmm.dll")]

private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

Trong đó bạn cần chú ý đển tham số strCommand, đây là chuỗi chứa lệnh MCI cần thực hiện. Bạn có thể xem danh sách lệnh tại địa chỉ bên dưới

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_multimedia_command_strings.asp

Sau đây là các phương thức căn bản trong lớp MciPlayer của ta.

1) Mở media:

public void Open(string filePath)

{

string sCommand = "open \"" + filePath +"\" type mpegvideo alias YinYangMedia";

mciSendString(sCommand, null, 0, IntPtr.Zero);

}

Trong chuỗi sCommand, chú ý rằng đường dẫn tập tin media của bạn phải chứa trong ngoặc kép nên ta phải dùng chuỗi \" để bao phần filePath lại. Ở đây chuỗi mpegvideo để xác định rằng chúng ta có thể chơi hầu hết các định dạng media hiện nay như mp3, avi, wav, mpeg, mpg and wmv…Ở đây tôi sử dụng tên định danh YinYangMedia cho tập tin Media, bạn có thể thay đổi tên khác tùy thích nhưng phải thống nhất trong những lần gọi hàm khác.

2) Play, Pause, Stop, Seek, Close media:

public void Play()

{

mciSendString("play YinYangMedia", null, 0, IntPtr.Zero);

}

public void Pause()

{

mciSendString("pause YinYangMedia", null, 0, IntPtr.Zero);

}

public void Stop()

{

try{

mciSendString("stop YinYangMedia", null, 0, IntPtr.Zero); }catch{}

}

public void Seek(long value)

{

value = value * 1000;

mciSendString("seek YinYangMedia to " + value.ToString(), null, 0, IntPtr.Zero);

Play();

}

public void Close()

{

try{

mciSendString("close YinYangMedia", null, 0, IntPtr.Zero);

}catch {}

}

Phương thức Seek sẽ nhảy đến vị trí xác định bằng tham số value truyền vào và play tại vị trí đó, tham số value truyền vào có đơn vị là giây vì thế ta nhân với 1000 để chuyển sang mili giây.

Trường hợp bạn muốn chơi một file media khác, trước tiên bạn cần đóng (close) media hiện tại. Để tiện hơn bạn có thể thêm phương thức Close() vào đầu phương thức Open() phía trên.

3) Hiển thị cửa sổ xem video

Chức năng play trên chỉ đơn giản làm nhiệm vụ phát âm thanh. Nếu bạn đang chơi một file video và cần hiển thị hình ảnh, hãy sử dụng phương thức sau:

public void DisplayMediaWindow()

{

mciSendString("put YinYangMedia", null, 0, IntPtr.Zero);

}

Phương thức này sẽ mở cửa sổ video với kích thước mặc định, nếu bạn muốn xác định vị trí và kích thước của cửa sổ được mở, hãy overload hoặc sửa lại phương thức này như sau:

public void DisplayMediaWindow(Rectangle rec)

{

mciSendString("put YinYangMedia window at " + rec.Left + " " + rec.Top +

" " + rec.Width + " " + rec.Height, null, 0, IntPtr.Zero);

}

Phương thức mới này truyền vào đối tượng Rectangle đại diện cho vị trí và kích thước của cửa sổ sẽ mở với gốc tọa độ là góc trên bên trái màn hình. Thay vì truyền vào một Rectangle, bạn cũng có thể overload thêm một phương thức truyền vào 4 tham số xác định vị trí left, top, width và height của cửa sổ.

4) Lấy trạng thái của player

Để xác định xem player của chúng ta đang ở trạng thái nào, bạn hãy viết một phương thức hoặc getter như sau:

public string Status

{

get

{

int length = 128;

StringBuilder strBuffer = new StringBuilder(length);

mciSendString("status YinYangMedia mode", strBuffer,

length, IntPtr.Zero);

return strBuffer.ToString();

}

}

Tham số strBuffer là biến lưu kết quả trả về, length là độ dài của độ dài của bộ đệm chứa kết quả tính bằng kí tự.

Bởi vì kết quả là kiểu string và chỉ thuộc một trong 3 trạng thái "playing","paused", "stopped". Bạn có thể tạo một enum chứa các trạng thái của player này, bổ sung thêm một trạng thái "Ready" nếu như hàm Open thực thi thành công, mỗi khi thực hiện lệnh nào đó, player của chúng ta sẽ tự động thay đổi trạng thái. Ví dụ như sau:

public enum PlayerStatus { Ready, Playing, Paused, Stopped };

Gợi ý: bạn thêm một thuộc tính kiểu PlayerStatus và danh sách các tập tin Media cần chơi vào player, khi chơi hết một bài hãy tiếp tục bài tiếp theo trong danh sách.

5) Lấy chiều dài, vị trí hiện tại của media:

Lấy tổng thời gian cần để chơi hết file tính bằng giây đã được làm tròn.

public long Length

{

get

{

StringBuilder fileleng = new StringBuilder(256);

mciSendString("status YinYangMedia length", fileleng, 256, IntPtr.Zero);

try

{

return (long)Math.Floor(Convert.ToDouble(fileleng.ToString().Trim()) / 1000);

}

catch { return 0; }

}

}

Vị trí đang chơi hiện tại của file tính bằng giây

public long Current

{

get

{

StringBuilder fileleng = new StringBuilder(256);

mciSendString("status YinYangMedia position", fileleng, 256, IntPtr.Zero);

try

{

return (long)Math.Floor(Convert.ToDouble(fileleng.ToString().Trim()) / 1000);

}

catch { return 0; }

}

}

Để hiển thị theo dạng mm:ss bạn cần viết thêm phương thức để tính số phút và số giây, sau đó format theo định dạng thích hợp. Ví dụ bạn tạo ở Form thực thi hương thức sau để format:

private string FormatSeconds(long seconds)

{

long minus = 0;

if (seconds <>

{

minus = seconds / 60;

seconds = seconds % 60;

return minus.ToString().PadLeft(2, '0′)

+ ":" + seconds.ToString().PadLeft(2, '0′);

}

// …

Hàm PadLeft sẽ lấp đầy bên trái chuỗi bằng kí tự '0' cho đến khi đủ số kí tự quy định. Giả sử số phút là 1 và giây là 2, kết quả trả về sẽ là '01:02'.

Phần cốt lõi của chương trình đã hoàn thành, bạn hãy tạo giao diện và thêm vào một trackBar để kiếm tra phương thức Seek và các chức năng khác của lớp MciPlayer.


Để lấy hoặc thay đổi giá trị volumn bạn có thể sử dụng 2 hàm waveOutGetVolume() và waveOutSetVolume() nằm trong cùng thư viện winmm.dll được sử dụng trong ví dụ trên.
Bạn khai báo 2 hàm trên như sau:

[DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

Tham số hwo bạn có thể đặt là IntPtr.Zero, còn dwVolume của 2 hàm trên chính là giá trị của volumn khi bạn lấy hoặc gán.

III) Phần kết:

Với các chức năng cơ bản của lớp MciPlayer vừa tạo, bạn có thể tự thiết kế cho mình một ứng dụng MultiMedia đa năng như quản lý nhạc, tự động tắt máy, màn hình, tạo playlist sử dụng các collection,…

http://yinyang-it.tk


Vubka Blog: Simple Way

Thứ Tư, 12 tháng 12, 2012

8 mẹo sử dụng tính năng hẹn giờ cho bài viết trên Facebook

Bạn có eo hẹp thời gian không?

Bạn có sử dụng một số công cụ tự động của Facebook không? Bài viết này sẽ giúp bạn.

Facebook cho phép bạn hẹn giờ cập nhật bài viết trên trang công cộng.

Rất nhiều người thích chức năng này bởi vì thuật toán xếp hạng trên Facebook và thói quen sử dụng các công cụ cập nhật khác như HootSuite hoặc SocailOomph khiến cho các bài viết của bạn không được thu hút bằng các bài viết được cập nhật theo cách thông thường.

Hãy xem xét vấn đề một cách kỹ càng hơn và tìm ra một số điểm khi bạn sử dụng tính năng hẹn giờ cho bài viết trên Facebook.

Đầu tiên, hãy tìm hiểu các bước để hẹn giờ cho bài viết và chỉnh sửa các bài viết đó.

#1: Làm thế nào để hẹn giờ cho bài viết

Hẹn giờ cập nhật cho bài viết rất đơn giản, bạn chỉ cần làm theo các bước sau:

Hãy viết cập nhật của bạn như cách thông thường. Bạn có thể đính kèm ảnh, link, video trên Youtube, gắn thẻ cho các trang khác hoặc sự kiện hoặc chỉ cần viết chữ.

schedule your post

Dưới góc trái của bài viết, hãy click vào biểu tượng đồng hồ như ảnh trên. Bạn có thể thêm năm, tháng, ngày và thời gian chính xác mà bạn muốn bài viết sẽ xuất hiện.
add the date

 
Bạn có thể gắn mốc thời gian trong quá khứ cho các bài viết để bổ sung vào Facebook timeline của bạn nếu muốn (tôi sẽ nói kỹ hơn ở phần sau của bài viết này).

Bạn có thể hẹn giờ bài viết tối đa 6 tháng (có nhiều hơn 6 tháng hiển thị trong khung chọn nhưng Facebook không cho phép bạn chọn nhiều hơn 6 tháng) theo số phút chẵn chục (00, 10, 20, 30, 40, 50). Vì thế bạn không thể hẹn giờ để bài viết của bạn hiển thị lúc 2h15.

Bạn cũng có thể thêm ngôn ngữ hoặc địa điểm khi hẹn giờ cho bài viết như khi bạn cập nhật bài viết thông thường. Bạn chỉ cần click vào biểu tượng Public và thực hiện các điều chỉnh cần thiết.

Khi bạn đã điều chỉnh mọi thứ, chỉ cần click vào nút Schedule màu xanh, thế là xong. Bây giờ bạn chỉ cần nhớ thời gian bài viết hiển thị để theo dõi số lượng bình luận thôi.

#2: Làm thế nào để tìm và sửa những bài viết đã được hẹn giờ

Để xem các bài viết bạn đã hẹn giờ và chỉnh sửa chúng, hãy vào phần lịch sử hoạt động (Activity Log) từ bảng điều khiển trên đầu trang (nếu bạn không thấy bảng điều khiển, hãy click vào nút Admin màu đỏ ở góc phải trên cùng của trang), sau đó chọn Edit Page và Activity Log. Bạn sẽ thấy tất cả các bài viết mà bạn đã hẹn giờ.

find activity log

activity log

Xem lại các bài viết bạn đã hẹn giờ.

Nếu muốn chỉnh sửa bài viết đã hẹn giờ, bạn chỉ có thể chỉnh sửa về mặt thời gian. Nếu bạn muốn chỉnh sửa câu chữ, bạn phải hủy bài viết và hẹn giờ lại. Để chỉnh sửa thời gian, hãy di chuột đến góc phải trên cùng của bài viết trong phần lịch sử hoạt động (Activity Log).

editing a post

Bạn chỉ có thể thay đổi thời gian đã hẹn hoặc hủy bài viết và hẹn giờ lại từ đầu.

Bạn có thể hẹn giờ cho bài viết bao gồm các đường link, ảnh, trạng thái và video (mặc dù tôi thấy tính năng hẹn giờ cho video hơi bị lỗi). Bạn cũng có thể hẹn giờ cho 1 link video trên Youtube, link này sẽ hiển thị như khi bạn cập nhật theo cách thông thường.

schedule a photo

Bạn có thể hẹn giờ cho một bức ảnh.

Bạn không thể hẹn giờ hiển thị cho album ảnh, sự kiện, câu hỏi và các mốc thời gian.
#4: Bạn có thể hẹn giờ bài viết cho thời điểm trong quá khứ

Bạn có thể hẹn giờ bài viết cho thời điểm trong quá khứ. Tôi không chắc tại sao bạn lại muốn sử dụng tính năng này trên Facebook ngoài lý do lấp đầy giao diện timeline. Nhưng nếu bạn có một sự kiện quan trọng đã diễn ra trong quá khứ, bạn nên đánh dấu chúng bằng mốc thời gian (milestones) thay vì bài viết.

Điều thú vị về việc hẹn giờ bài viết cho thời điểm trong quá khứ là bài viết đó sẽ không xuất hiện trong mục tin mới của mọi người theo dõi trên Facebook mà sẽ xuất hiện tại vị trí tương ứng với thời gian trên timeline của bạn.
back dating a post

Bài viết được hẹn giờ tại thời điểm trong quá khứ sẽ hiện lên trên dòng tin kèm thông báo về thời gian bài viết được thêm vào trên timeline.

#5: Các bài viết được hẹn giờ sẽ không được tự động cập nhật trên Twitter

Nếu bạn liên kết tài khoản Twitter với tài khoản Facebook để những gì bạn cập nhật trên Facebook cũng sẽ được hiển thị trên Twitter (tôi biết việc này không phải là một ý tưởng tuyệt vời lắm nhưng đôi khi nó cũng không tệ), hãy lưu ý rằng những bài viết được hẹn giờ của bạn sẽ không xuất hiện trên Twitter.

Nếu bạn phụ thuộc vào Facebook để cập nhật Twitter và muốn sử dụng tính năng hẹn giờ cập nhật, bạn cần phải cập nhật Twitter bằng một công cụ khác.

#6: Các bài viết hẹn giờ có thể gây chú ý hơn

Bạn mong đợi điều gì khi hẹn giờ bài viết? Điều này phụ thuộc vào trang Facebook hiện tại của bạn – tần suất cập nhật của bạn thế nào, mối liên kết của bạn với độc giả ra sao, bạn cập nhật những gì lên trang và một vài yếu tố khác.

Tính năng hẹn giờ có thể giúp bạn cập nhật trang thường xuyên hơn, tăng chất lượng nội dung trên Facebook và tiết kiệm thời gian cho bạn.

Randi Thompson, người sở hữu trang How to Market Your Horse Business (đồng thời là một thành viên tích cực của Câu lạc bộ kết nối mạng xã hội của chúng tôi) đã thử nghiệm tăng số lượng bài viết bằng cách sử dụng tính năng hẹn giờ trên 2 trang công cộng.

Trên trang How to Market Your Horse Business, cô ấy đã thay đổi tần suất cập nhật, từ 3 lần 1 ngày lên 3 tiếng 1 lần và 5 lần 1 ngày. Ở một trang khác, Horse and Rider Awareness, cô ấy không thường xuyên cập nhật gì cả. Cô ấy đã thử hẹn giờ 3 bài viết chất lượng trong 1 ngày. Dướu đây là kết quả thử nghiệm sau 5 ngày:
horse business horse awareness

Sử dụng chức năng hẹn giờ bài viết giúp tăng lượng bài viết và lượng độc giả tương tác với trang.

Tất nhiên đây không phải là một nghiên cứu chuyên sâu. Và bạn có thể tăng lượng độc giả tương tác với trang một cách thông thường mà không cần sử dụng tính năng hẹn giờ. Nhưng tính năng hẹn giờ có thể giúp mọi việc của bạn trở nên dễ dàng hơn khi biết rằng các bài viết sẽ xuất hiện đúng lúc bạn mong muốn và trong khi đó bạn có thể làm việc khác. Tôi khuyên bạn nên thử nghiệm tính năng hẹn giờ này trên trang công cộng và xem kết quả. Và bạn đừng quên theo dõi những bài viết và các bình luận cho bài viết đó nhé.

#7: Độc giả không bao giờ biết được bạn đã sử dụng tính năng hẹn giờ cho bài viết

Khi bạn cập nhật bằng các công cụ như HootSuite hoặc BufferApp, mọi người sẽ biết bạn đang cập nhật thông qua một công cụ. Nhưng đối với các bài viết được hẹn giờ trên Facebook, không ai có thể biết được điều đó.
buffer app

Tên công cụ bạn sử dụng để cập nhật sẽ xuất hiện dưới bài viết.

Sử dụng một công cụ khác để cập nhật Facebook không phải là ý kiến tồi. Đôi khi bạn nên tiết kiệm thời gian cho bản thân và cập nhật Facebook bằng công cụ hơn là không cập nhật gì cả. Nhưng Facebook luôn thiếu ưu tiên cho sự xuất hiện của các cập nhật sử dụng công cụ. Tôi biết rằng các công cụ cập nhật này hoạt động tốt trên Facebook nhưng chúng ta đều biết Facebook đã thay đổi thế nào.

#8: Tính năng hẹn giờ cho bài viết có thể sẽ có trên trang Facebook cá nhân

Tính năng này sẽ xuất hiện trên trang Facebook cá nhân, đây có thể là tin vui đối với những người sử dụng tài khoản cá nhân để quảng bá cho việc kinh doanh. Tuy nhiên trong khuôn khổ bài viết này, tôi không đưa ra điều gì cho thời điểm tương lai. Không phải ai cũng thấy những sự thay đổi lớn với tính năng hẹn giờ cho bài viết. Bạn vẫn phải chú ý đến nội dung bài viết trên Facebook. Nhưng tính năng hẹn giờ này cùa Facebook có thể giúp bạn tiết kiệm thời gian khi cho phép bạn hẹn giờ các bài viết cùng một lúc và sau đó bạn có thể dành thời gian làm việc khác.Bạn nghĩ sao về bài viết ngày? Bạn đã sử dụng chức năng hẹn giờ cho bài viết chưa? Bạn đã thu được kết quả thế nào? Hãy cho chúng tôi biết bằng cách để lại comment phía dưới.

nguồn : http://tranthutrangfc.wordpress.com/2012/08/16/8-meo-su-dung-tinh-nang-hen-gio-cho-bai-viet-tren-facebook

Mô hình 4P và Internet Marketing

Chuyên mục: Internet Marketing | 12/12/2012 | 1 Lượt xem | xếp hạng 9 | 68 bài đánh giá
Mô hình 4P và Internet Marketing

Rất nhiều người, thậm chí là những người đang làm marketing đôi khi có suy nghĩ, marketing chỉ gói gọn trong chữ Promotion

Trong marketing truyền thống, chúng ta có khá nhiều mô hình dùng để phân tích cho một chiến lược marketing. Dẫu là người thiên về thực hành hay thiên về lý thuyết, người chú trọng hiệu quả hay người thích mô phạm, dù ít dù nhiều khi bắt đầu một công việc marketing, chúng ta đều phải sử dụng một vài mô hình nào đó. Những mô hình này qua tháng năm đã chứng minh được những hiệu quả nhất định của nó, nó giúp cho marketer dễ dàng hơn và có hệ thống hơn trong các phân tích của mình.

5 năm trước khi bắt đầu vào Sony, chuyển từ làm marketing truyền thống sang internet marketing. Khi đó internet marketing còn khá mới mẻ, đặc biệt là ở Việt Nam – ngay cả trên thế giới khi đó cũng chưa phổ biến cụm từ này, đa số những người làm marketing online đều tự vạch ra những cách làm riêng cho mình. Khi đó tôi thường trăn trở một câu hỏi, làm thế nào để ứng dụng / hoặc nâng cấp những mô hình marketing hiện có sang cho internet marketing.

Xem tiếp :

Mô hình 4P và Internet Marketing

Thứ Hai, 10 tháng 12, 2012

C# – Tạo chương trình dạng Single-instance

C# – Tạo chương trình dạng Single-instance - chỉ có một phiên bản chạy

Đôi lúc chúng ta cần ngăn cản ứng dụng khởi chạy nhiều lần để làm giảm phiền toái cho người dùng. Vậy có cách nào để làm được điều này hay không. Sau đây tôi hướng đẫn bạn cách đơn giản nhất mà tôi hay dùng. Tuy nhiên tôi chỉ hướng đẫn phần cơ bản còn vận dụng như thế nào thì tùy ở mỏi người.
-Có 1 số cách để giải quyết vấn đề này, hay gặp là sử dụng Mutex và Process. Tuy nhiên chúng chỉ kiểm tra xem 1 instance của chuơng trình có đang chạy hay ko và ko thể điều khiển được instance đó (như việc active cửa sổ chính chẳng hạn).

Cách 1:
Sử dụng class System.Diagnostics.Process. Sau đây là đoạn code minh họa.
string current = System.Diagnostics.Process.GetCurrentProcess().ProcessName;  System.Diagnostics.Process[] procs;  procs = System.Diagnostics.Process.GetProcessesByName(current);  if (procs.Length >= 2)  {  MessageBox.Show("Process is already running!");  Application.Exit();  return;  }

Ở đây cần chú ý rằng. Cần phải kiểm tra Length >= 2 thì mới kết luận là ứng dụng đã khởi chạy rồi. Vì ứng dụng mình vừa chạy lên và ứng dụng cũ đang chạy là hai. Nếu có từ hai cái trở lên thì ứng dụng vừa chạy lên sẻ tắt process của nó đi. Vì vậy sẻ đảm bảo là một ứng dụng không có 2 Process chạy song song.
Cách này được tôi dùng phổ biến. Tuy nhiên phải tùy tùy biến lại chút ít cho trường hợp hai ứng dụng khác nhau nhưng được đặt trùng tên….

Cách 2  :

tận dụng thư viện Visual Basic trong .Net. Trước khi gõ code bạn hãy add reference thư viện Microsoft.VisualBasic vào.

AddReference

Phải add thư viện này bạn mới có thể dùng using Microsoft.VisualBasic.ApplicationServices mà ta sẽ sử dụng trong bài được.

Sửa file Program.cs như sau:

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsApplication1
{
static class Program
{
// Form chính cần gọi của chương trình phải đặt là static
static Form1 frm;
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
frm = new Form1();
SingleInstanceApplication.Run(frm, NewInstanceHandler);
}
public static void NewInstanceHandler(object sender,
StartupNextInstanceEventArgs e)
{
// Kích hoạt cửa sổ của instance đang chạy
// Bạn có thể thay thế bằng 1 hành động khác
frm.Activate();
}
/// <summary>
/// Lớp này dùng để gọi chạy form dạng single instance
/// </summary>
public class SingleInstanceApplication : WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form f,
StartupNextInstanceEventHandler startupHandler)
{
SingleInstanceApplication app = new SingleInstanceApplication();
app.MainForm = f;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
}
}


  Như bạn có thể thấy

Trích dẫn:
app.Run(Environment.GetCommandLineArgs());

Bạn có thể dễ dàng điều khiển instance đã chạy của mình bằng cách thiết lập các hành động sẽ xử lý tùy thuộc vào các tham số sẽ truyền vào thông qua dòng lệnh. Khi đó bạn có thể khởi tạo form như sau:

Code:

frm=new Form1(args[0]);

và trong constructor của Form1 bạn sẽ viết code kiểm tra và xử lý, ví dụ args[0]=="/scan" thì thực hiện lệnh scan máy chẳng hạn.

Hi vọng bài viết này giúp đỡ giải quyết 1 số vấn đề mà các bạn gặp phải.

(Sưu tầm)

Nếu thấy bài viết hữu ích hãy +1 giúp trang này : Dịch vụ Seo website giá rẻ có tại http://seowebsitegiare.com




Thứ Ba, 27 tháng 11, 2012

Kiểm tra các website cùng Server hoặc cùng IP

Nếu như bạn muốn biết trên server đặt web site của mình có những website nào thì bạn có thể kiểm tra thông qua website sau:

http://www.dedicatedornot.com

Sau khi điền địa chỉ IP hoặc tên miền website của bạn thì nó hiển thị danh sách các website nằm chung server với bạn.


Vì sao phải kiểm tra xem có những site nào chung server với bạn? Theo Manlivo đc biết  thì 1 server chỉ có đủ tài nguyên để cung cấp dịch vụ cho 1 số lượng website nhất định. Nếu như  server cung cấp dịch vụ share hosting mà đặt quá nhiều website thì sẽ làm tốn tài nguyên và rất có thể gây ra lỗi trên server. Điển hình như  lỗi connect đến dịch vụ mysql. Vì vậy biết được bao nhiêu site cùng server với chúng ta sẽ làm giảm rủi ro tối website cũng như  có thể biết trước và chọn một đặt website tại 1 server khác.

Chú ý tuy là nhiều website nhỏ thì cũng chưa chắc ảnh ưởng nhiều bằng việc chung server với 1 website có lượt truy cập cao.

Thứ Hai, 26 tháng 11, 2012

Tăng tốc cho ứng dụng ASP.NET MVC với Output Caching

Trong bài hướng dẫn này, bạn sẽ học cách tăng tốc độ ứng dụng ASP.NET MVC bằng cách sử dụng output caching. Bạn sẽ học cách cache kết quả trả về từ controller action do đó nội dung đó sẽ không cần phải tạo lại mỗi khi người dùng gọi đến action đó.

 

Trong bài hướng dẫn này, bạn sẽ học cách tăng tốc độ ứng dụng ASP.NET MVC bằng cách sử dụng output caching. Bạn sẽ học cách cache kết quả trả về từ controller action do đó nội dung đó sẽ không cần phải tạo lại mỗi khi người dùng gọi đến action đó.

Ví dụ như ứng dụng ASP.NET MVC của bạn hiển thị danh sách các dòng dữ liệu lấy từ Database ra một View có tên là Index, mỗi khi người dùng gọi controller action trả về view Index, dữ liệu trên sẽ được trả về từ CSDL bằng cách gọi một câu truy vấn đến CSDL.

Nhưng nếu như bạn sử dụng ouput cache thì bạn sẽ tránh được việc phải thực hiện câu truy vấn CSDL mỗi khi action đó được gọi. View sẽ được lấy lên từ cache (bộ nhớ tạm của ứng dụng) thay vì phải gọi action tạo ra dữ liệu và trả kết quả về. Caching giúp cho bạn tránh phải bắt server thực thi lặp đi lặp lại một hành động.

Hữu hiệu Output Caching

Bạn có thể cho phép output caching bằng cách thêm thuộc tính [OutputCache] cho controller action hoặc cho cả controller. Ở Mã minh họa 1, action có tên là Index sẽ được cache trong mỗi mười giây.

 

Mã minh họa 1 – Controllers\HomeController.cs

 


using System.Web.Mvc;    namespace MvcApplication1.Controllers  {      [HandleError]      public class HomeController : Controller      {          [OutputCache(Duration=10, VaryByParam="none")]          public ActionResult Index()          {              return View();          }        }  }     

 

 

Trong mã minh họa 1, nội dung trả về của action Index() được cache trong 10 giây. Nếu bạn thích, bạn có thể quy định thời gian cache (cache duration) dài hơn. Ví dụ, nếu bạn muốn cache một action trong một ngày, bạn có thể quy định thời lượng cach trong 86400 giây ( 60 giây * 60 phút * 24 giờ).

Tuy nhiên, không có gì đảm bảo nội dung sẽ được cache trong thời lượng bạn quy định. Khi tài nguyên bộ nhớ thấp, nội dung cache sẽ bị xóa tự động.

Controller Home trong mã minh họa 1 trả về view Index trong mã minh họa 2. View này chả có nội dung gì đặc biệt, nó chỉ hiển thị thời gian hiện tại (xem Hình 1).

Mã minh họa 2 – Views\Home\Index.aspx

 


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml" >  <head runat="server">      <title>Index</title>  </head>  <body>      <div>            The current time is: <%= DateTime.Now.ToString("T") %>                  </div>  </body>  </html>     

 

 

Hình 1 – view Index đã bị cache

Nếu như bạn gọi action Index() nhiều lần thì bạn sẽ thấy thời gian hiển trị trên view Index sẽ không thay đổi trong vòng 10 giây bởi vì kết quả này đã bị cache.

Bạn cũng phải lưu ý rằng, view này sẽ bị cache và kết quả sẽ được lấy từ cache để cung cấp cho bất cứ ai thăm ứng dụng của bạn. Điều này có nghĩa rằng, thời gian mà web server phải sử dụng để phục vụ view Index cho người dùng được giảm đi đáng kể.

Đừng dụng chỉ thị <%@ OuputCache %> trong view. Chỉ thị này dành riêng cho ứng dụng Web Forms và không nên được dùng trong ứng dụng ASP.NET MVC.

Các nội dung được cache ở đâu?

Theo mặc định, khi bạn sử dụng thuộc tính [OutputCache], nội dung được cache ở ba nơi: ở web server, bất kỳ proxy server nào và web browser. Bạn có thể quy định nơi nào được cache bằng cách thay đổi thuộc tính Location của [OuputCache].

Bạn có thể quy định các giá trị sau cho thuộc tính Location:

· Any

· Client

· Downstream

· Server

· None

· ServerAndClient

Giá trị mặc định của thuộc tính Location có giá trị là Any. Tuy nhiên, có những tình huống mà bạn chỉ muốn cache ở trình duyệt hoặc ở server mà thôi. Ví dụ, nếu bạn muốn cache thông tin được tùy biến cho người dùng, do đó bạn không nên cache thông tin ở server.

Ví dụ, controller ở mã minh họa 3 có một action GetName() trả về tên người dùng hiện tại. Giả sử có người tên "Minh" là người đầu tiên triệu gọi action này, thì những người dùng sau khi triệu gọi trong vòng 1 phút sẽ được trả về kết quả là "Hi Minh" vì nội dung đã được cache ở server.

Mã minh họa 3 – Controllers\BadUserController.cs

 


using System.Web.Mvc;  using System.Web.UI;    namespace MvcApplication1.Controllers  {      public class BadUserController : Controller      {          [OutputCache(Duration = 3600, VaryByParam = "none")]          public string GetName()          {              return "Hi " + User.Identity.Name;          }      }  }     

 

 

Bạn không nên cache nội dung mang tính cá nhân ở server. Thay vào đó, bạn nên cache chúng ở cache của trình duyệt để tăng tốc độ cho ứng dung. Nếu bạn cache nội dung ở trình duyệt và khi người dùng triệu gọi một action nhiều lần thì nội dung sẽ được trả về từ cache của trình duyệt thay vì được lấy từ server.

Ở mã minh họa 4, action GetName() đã được điều chỉnh để chỉ cache ở trình duyệt, và nhờ vậy, những người dùng khác nhau sẽ nhận được kết quả trả về là chính tên của họ chứ không phải tên của một người nào khác.

Mã minh họa 4 – Controllers\UserController.cs

 


using System.Web.Mvc;  using System.Web.UI;    namespace MvcApplication1.Controllers  {      public class UserController : Controller      {          [OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]          public string GetName()          {              return "Hi " + User.Identity.Name;          }      }  }     

 

 

Lưu ý rằng thuộc tính [OuputCache] ở Mã minh họa 4 có bao gồm thuộc tính NoStore. Thuộc tính NoStore với giá trị true có tác dụng yêu cầu proxy servers và trình duyệt không lưu bản sao của nội dung được cache.

Cache action theo tham số

Trong một số trường hợp, bạn sẽ muốn có các phiên bản cache khác nhau cho cùng một nội dung. Ví như khi bạn tạo một trang dạng master/detail. Trang master hiển thị danh sách các tiêu đề phim, khi bạn click chuột vào tên một phim thì bạn sẽ nhận được nội dung giới thiệu chi tiết về phim đó.

Nếu bạn cache nội dung trang chi tiết, thì chi tiết của phim được hiển thị chung nội dung phim được cache bất kể bạn click vào tên phim nào. Và nội dung phim mà người dùng đầu tiên xem sẽ được cache cho những người xem sau.

Bạn có thể khắc phục lỗi này bằng cách sử dụng thuộc tính VaryByParam của [OutputCache]. Thuộc tính này giúp bạn tạo các phiên bản cache riêng biệt tùy theo giá trị của tham số và người dùng truy vấn một action.

Ví dụ, controller ở Mã minh họa 5 có hai action có tên là Master() và Details(). Action Master() trả về danh sách tên các phim và Details() trả về nội dung chi tiết của mỗi phim.

Mã minh họa 5 – Controllers\MoviesController.cs

 


using System.Linq;  using System.Web.Mvc;  using MvcApplication1.Models;    namespace MvcApplication1.Controllers  {      public class MoviesController : Controller      {          private MovieDataContext _dataContext;            public MoviesController()          {              _dataContext = new MovieDataContext();          }            [OutputCache(Duration=int.MaxValue, VaryByParam="none")]          public ActionResult Master()          {              ViewData.Model = (from m in _dataContext.Movies                                 select m).ToList();              return View();          }            [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]          public ActionResult Details(int id)          {              ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);              return View();          }          }  }     

 

 

Action Master() có đính kèm thuộc tính VaryByParam với giá trị là "none". Khi Master() được gọi, nội dung được cache duy nhất của view Master() sẽ được trả về (xem hình 2).

Hình 2 – /Movies/Master 

Hình 3 – /Movies/Details

Action Details() đính kèm thuộc tính VaryByParam với giá trị là "Id".  Và do đó, khi giá trị của tham số Id được truyền vào action thì sẽ có một phiên bản cache được sinh ra và lưu lại.

Ngoài ra bạn có thể gán các giá trị sau cho thuộc tính VaryByParam:

* = Tạo ra các phiên bản cache khác nhau đối với tham số truyền lên khác nhau

none = Chỉ duy trì phiên bản cache chung cho mọi giá trị tham số

Danh sách các tham số (phân tách bằng dấu ;) = Tạo các phiên bản cache khác nhau tùy theo giá trị của các tham số mà bạn quy định.

Tạo Cache Profile

Nhược điểm của việc quy định các tham số trực tiếp trên thuộc tính [OuputCache] đó là bạn không thể thay đổi nó khi đã biên dịch thành tập tin dll. Và vì vậy Microsoft cho phép quy định các tham số của thuộc tính [OuputCache] tại tận tin cấu hình web.config. Cách này mang lại cho hai lợi ích chính, thứ nhất là cho phép bạn áp dụng một cache profile cho nhiều action khác nhau. Lợi ích thứ hai, quan trọng không kém, cho phép bạn tùy chỉnh các tham số cấu hình mà không cần phải biên dịch lại dự án, mọi thay đối ở tập tin web.config sẽ được xác định tự động và có hiệu lực ngay sau đó.

Ví dụ, mục <caching> trong tập tin web.config ở Mã minh họa 6 định nghĩa một cache profile có tên là Cache1Hour. Mục <caching> được định nghĩa bên trong mục <system.web> của tập tin web.config.

Mã minh họa 6 – Caching section ở web.config

 


<caching>  <outputCacheSettings>      <outputCacheProfiles>          <add name="Cache1Hour" duration="3600" varyByParam="none"/>      </outputCacheProfiles>  </outputCacheSettings>  </caching>     

 

 

Controller trong Mã minh họa 7 minh họa cho bạn cách áp dụng cấu hình Cache1Hour cho action với thuộc tính [OuputCache].

Mã minh họa 7 – Controllers\ProfileController.cs

 


using System;  using System.Web.Mvc;    namespace MvcApplication1.Controllers  {      public class ProfileController : Controller      {          [OutputCache(CacheProfile="Cache1Hour")]          public string Index()          {              return DateTime.Now.ToString("T");          }      }  }     

 

 

Nếu bạn triệu gọi action Index() cho Mã minh họa 7 thì action sẽ được cache trong 1 giờ.

Tổng kết

Ouput caching giúp cho bạn có thể dễ dàng tăng tốc các ứng dụng ASP.NET MVC. Ở bài viết này, bạn được học cách sử dụng thuộc tính [OuputCache] để cache kết quả trả về bởi các action. Bạn cũng đã được học cách điều chỉnh các tham số của thuộc tính [OutputCache] như là Duration và VaryByParam để điều chỉnh cách thức cache nội dung trả về. Và cuối cùng bạn học được cách quy đính cấu hình cache trong tập tin web.config của ứng dụng.


Cảm ơn tác giả :  tumivn - Link nguồn : d.jou.vn/Article/Tang-toc-cho-ung-dung-ASPNET-MVC-voi-Output-Caching/13

Thứ Bảy, 24 tháng 11, 2012

Tổng quan ASP.NET MVC Routing

Trong hướng dẫn này, bạn sẽ được giới thiệu với một tính năng quan trọng của mọi ứng dụng ASP.NET MVC ASP.NET gọi là định tuyến. The ASP.NET Routing module có trách nhiệm lập bản đồ các yêu cầu trình duyệt gửi tới các action cụ thể Controller MVC. Đến cuối này, bạn sẽ hiểu thế nào là con đường tiêu chuẩn bảng yêu cầu bản đồ để Controller Action.

Sử dụng mặc định Route Table
Khi bạn tạo một mới ứng dụng ASP.NET MVC, ứng dụng đã được cấu hình để sử dụng ASP.NET Routing. ASP.NET định tuyến được thiết lập tại hai nơi.

Trước tiên, ASP.NET định tuyến được kích hoạt trong tập tin cấu hình ứng dụng của bạn Web (web.config file). Có bốn phần trong file cấu hình có liên quan đến việc định tuyến: phần system.web.httpModules, phần system.web.httpHandlers, phần system.webserver.modules, và phần system.webserver.handlers. Hãy cẩn thận không để xóa những phần này vì không có các phần định tuyến sẽ không còn làm việc.

Thứ hai, và quan trọng hơn, một bảng tuyến đường được tạo ra trong file Global.asax của ứng dụng. File Global.asax là một file đặc biệt có chứa bộ xử lý sự kiện cho ASP.NET sự kiện vòng đời ứng dụng. Bảng lộ trình được tạo ra trong sự kiện Đơn Bắt đầu.

Các tập tin trong 1 danh mục chứa các file Global.asax mặc định cho một ứng dụng ASP.NET MVC.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,

public class MvcApplication : System.Web.HttpApplication
{
       public static void RegisterRoutes(RouteCollection routes)
      {
             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
             routes.MapRoute(
                   "Default", // Route name
                   "{controller}/{action}/{id}", // URL with parameters
                   new { controller = "Home", action = "Index", id = "" } // Parameter defaults
             );
       }
      protected void Application_Start()
     {
              RegisterRoutes(RouteTable.Routes);
      }
}
}

Khi một ứng dụng MVC đầu tiên bắt đầu, các method Application_Start() được gọi. method này, đến lượt nó, gọi RegisterRoutes(). Các method RegisterRoutes() tạo route table.

Mặc định route table có một con đường duy nhất (có tên mặc định). Các bản đồ mặc định phân tuyến đoạn đầu tiên của một URL để một tên điều khiển, phân khúc thứ hai của một URL cho một Controller Action, và đoạn thứ ba đến một tham số có tên là id.

Hãy tưởng tượng rằng bạn nhập URL sau đây vào thanh địa chỉ trình duyệt web của bạn: /Home/Index/3

Các mặc định bản đồ tuyến đường URL để các thông số sau:

controller = Home
action = Index
id = 3

Khi bạn yêu cầu URL /Home/Index/3, các code sau đây được thực thi: HomeController.Index(3)

Các tuyến đường mặc định bao gồm giá trị mặc định cho tất cả ba thông số. Nếu bạn không cung cấp một bộ điều khiển, sau đó điều khiển các thông số mặc định để các chủ giá trị. Nếu bạn không cung cấp một hành động, các tham số hành động mặc định theo Chỉ số giá trị. Cuối cùng, nếu bạn không cung cấp một id, các thông số mặc định id cho một chuỗi rỗng.

Hãy xem xét một số ví dụ về cách các tuyến đường mặc định bản đồ các URL để hành động điều khiển. Hãy tưởng tượng rằng bạn nhập URL sau đây vào thanh địa chỉ trình duyệt của bạn: /Home

Bởi vì các thông số mặc định mặc định đường đi, cách nhập URL này sẽ gây ra Index() phương thức của lớp HomeController trong danh mục 2 để được gọi.

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
        [HandleError]
        public class HomeController : Controller
       {
              public ActionResult Index(string id)
             {
                     return View();
             }
       }
}

Trong danh mục 2, class HomeController bao gồm một method đặt tên là Index() chấp nhận một tham số đơn Mã đặt tên. URL /Home làm cho method Index() có thể được gọi với một chuỗi rỗng như giá trị của tham số ID.

Bởi vì các cách mà framework MVC invokes Controller action, URL /Home cũng phù hợp với method Index() của lớp HomeController trong danh mục 3.

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
        [HandleError]
        public class HomeController : Controller
       {
                public ActionResult Index()
                {
                        return View();
                }
        }
}

Method Index() trong danh mục 3 không chấp nhận bất kỳ thông số. URL /Home này sẽ được gọi là method Index(). URL /Home/Index/3 cũng invokes phương pháp này(Mã là bỏ qua).

URL /Home phù hợp với method Index() của lớp HomeController trong danh mục 4.

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
         [HandleError]
         public class HomeController : Controller
         {
                 public ActionResult Index(int? id)
                {
                          return View();
                }
         }
}

Trong 4 danh mục, method Index() có một tham số Integer. Bởi vì tham số này là một tham số nullable (có thể có giá trị Null), Index() có thể được gọi là lỗi.

Cuối cùng, method Index() trong danh mục 5 với URL /Home gây ra một ngoại lệ từ các tham số ID không phải là một tham số nullable. Nếu bạn cố gắng gọi method Index() sau đó bạn nhận được lỗi hiển thị trong hình 1.

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
         [HandleError]
         public class HomeController : Controller
         {
                public ActionResult Index(int id)
               {
                       return View();
               }
         }
}
Liên kết quảng cáo :