Thứ Tư

Lập trình với Kinect .NET SDK


Kinect đánh dấu thời kì chơi game tương tác, cho người chơi cảm giác như thật. Với những người lập trình, câu hỏi đặt ra là: "Làm sao để làm được điều đó"? Và điều này dễ dàng hơn khi Microsoft ra mắt thư viện Kinect .NET SDK. Bài viết giới thiệu các bạn làm quen với thư viện SDK.
 
I. Khởi động 
Để làm việc với Kinect .NET SDK chúng ta bắt buộc phải có môi trường làm việc như sau:

Hệ điều hành: Windows 7 (32bit hoặc 64 bit).

Phần cứng: Cấu hình máy tính với CPU dual-core, 2,66GHz trở lên; card màn hình hỗ trợ Microsoft DirectX 9.0c; RAM tối thiểu 2GB; Quan trọng nhất là thiết bị Kinect.

Phần mềm: Microsoft Visual Studio 2010 Express hoặc các phiên bản khác của Visual Studio 2010, tải tại địa chỉ http://www.microsoft.com/visualstudio/en-us; Microsoft .NET Framework 4.0 sẽ được cài đặt khi cài VS 2010; Kinect .NET SDK Beta, tải tại địa chỉ http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx.

II. Bước 2: Nhập cuộc
Bước tiếp theo chúng ta tạo một project để bắt đầu lập trình cho thiết bị Kinect. Bạn có thể tạo project theo dạng mà bạn thích: Windows Form, WPF… Tuy nhiên chúng tôi khuyên bạn nên sử dụng WPF để xử lí hình ảnh tốt hơn. Trong bài viết này chúng tôi tạo project theo dạng WPF.

Trong bài viết này chúng tôi cũng mặc định các bạn đã biết lập trình trên nền WPF nên chúng tôi chỉ tập trung vào cách khai thác thư viện Kinect .NET SDK.

Để sử dụng thư viện Kinect .NET SDK, chúng ta Add reference đến Microsoft.Research.Kinect.Nui ở thư mục C:\Program Files (x86)\Microsoft Research KinectSDK hoặc C:\Program Files\Microsoft Research KinectSDK
Sau khi đã Add reference thành công, chúng ta bắt tay vào khởi động và tắt thiết bị Kinect.

Khởi động thiết bị

Trước hết chúng ta khai báo đối tượng Runtime, đối tượng này là đại diện cho thiết bị Kinect

Runtime kinect = new Runtime();

Đối tượng Runtime thuộc namespace Microsoft.Research.Kinect.Nui do đó trước khi sử dụng chúng ta phải khai báo:
using Microsoft.Research.Kinect.Nui;
Sau đó tiến hành khởi tạo thiết bị với các thông số khởi tạo:

kinect.Initialize(RuntimeOptions.UseColor)

Có nhiều tùy chọn khởi tạo, tùy vào mục đích sử dụng mà chúng ta lựa chọn những thông số cho phù hợp:

RuntimeOptions.UseDepth: Khởi tạo thiết bị để lấy theo độ sâu

RuntimeOptions.UseSkeletalTracking: khởi tạo thiết bị để theo dõi hoạt động cử chỉ của người

RuntimeOptions.UseDepthAndPlayerIndex: khởi tạo thiết bị cho phép nhận dạng nhiều nhân vật.

Các thông số này có thể kết hợp với nhau bằng toán tử ( | )

kinect.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepth | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
Tắt thiết bị
 
Như vậy là thiết bị đã sẵn sàng cho chúng ta khai thác. Sau khi sử dụng xong, chúng ta tắt thiết bị bằng phương thức:
kinect.Uninitialize();
Tóm lại, để sử dụng và tắt thiết bị Kinect chúng ta thực hiện các phương thức sau:
Runtime kinect;
private void InitKinectDevice()
{
kinect = new Runtime();
kinect.Initialize(RuntimeOptions.UseColor| RuntimeOptions.UseDepth|
RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
}
private void ShutdownKinectDevice()
{
kinect.Uninitialize();
}
III. Thao tác với camera
  
Dạng chiều sâuDạng ảnh màu bình thường
Có hai việc mà chúng ta có thể làm được với Camera:

- Lấy hình ảnh ghi nhận được

- Điều khiển hướng quay.

1. Lấy hình ảnh ghi nhận được

Camera của Kinect hỗ trợ chúng ta lấy 2 dạng hình ảnh từ camera: hình ảnh màu bình thường và hình ảnh dạng chiều sâu.

Để lấy hình ảnh chúng ta cần làm những công đoạn sau:

• Mở camera với chế độ cần lấy hình ảnh

//Mở camera với chế độ màu bình thường

kinect.VideoStream.Open(ImageStreamType.Video, 2,ImageResolution.Resolution640x480, ImageType.ColorYuv);
//Mở camera với chế độ nhìn theo chiều sâu

kinect.DepthStream.Open(ImageStreamType.Depth, 2,

ImageResolution.Resolution320x240,ImageType.DepthAndPlayerIndex);

Tùy theo mục đích sử dụng mà chúng ta mở một trong 2 phương thức trên hoặc mở cả hai chế độ.
• Hiển thị hình ảnh ghi nhận được

Để hình ảnh ghi nhận được hiển thị một cách liên tục, thư viện Microsoft .NET SDK hỗ trợ 2 hàm sự kiện để lấy hình ảnh từ camera. Sự kiện này sẽ được thực hiện khi camera ghi nhận được hình ảnh.
// sự kiện lấy hình ảnh dạng màu bình thường

kinect.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(KinectVideoFrameReady);
// sự kiện lấy hình ảnh dạng chiều sâu

kinect.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(KinectDepthFrameReady);

Hình ảnh ghi nhận được sẽ được hiển thị lên control Image có tên là videoColor và depthVideo

void KinectVideoFrameReady(object sender,ImageFrameReadyEventArgs e)
{
PlanarImage Image = e.ImageFrame.Image;
videoColor.Source = BitmapSource.Create(Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32,null, Image.Bits, Image.Width * Image.BytesPerPixel);
}
void KinectDepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
PlanarImage Image = e.ImageFrame.Image;
byte[] convertedDepthFrame = convertDepthFrame( Image .Bits);
depth.Source = BitmapSource.Create(Image.Width, Image.Height,96,96,PixelFormats.Bgr32, null, convertedDepthFrame, Image.Width * 4);
}
2. Điều khiển hướng quay của thiết bị Kinect
Camera hướng lênCamera hướng xuống
Điều khiển hướng quay của thiết bị Kinect được điều khiển bởi thuộc tính ElevationAngle trong đối tượng camera.
Khởi tạo đối tượng:

Camera cam= kinect. NuiCamera

Cho camera hướng lên:

cam.ElevationAngle = camElevation Angle +5;

Cho camera hướng xuống:

cam.ElevationAngle = camElevation Angle -5;

Lưu ý là góc quay của camera chỉ là +25 và -25 thôi. Vượt ra khỏi giới hạn này thì sẽ bị lỗi.

private void btnUp_Click(object sender, RoutedEventArgs e)
{
cam.ElevationAngle += 5;
}
private void btnDown_Click(object sender, RoutedEventArgs e)
{
cam.ElevationAngle += -5;
}
IV. Bước 4: Nhận dạng cử động của con người

Để người chơi có thể chơi game dựa vào động tác thì chương trình game phải bắt được từng cử động của cơ thể. Và để làm điều này thì rất… dễ khi có sự hỗ trợ của thư viện Kinect .NET SDK. Thư viện hỗ trợ chúng ta lấy được 20 điểm khớp chuyển động trên cơ thể mình mà Microsoft gọi đó là các điểm Joint.

HipCenter, Spine, ShoulderCenter, Head, ShoulderLeft, ElbowLeft, WristLeft, HandLeft, ShoulderRight, ElbowRight, WristRight, HandRight, HipLeft, KneeLeft, AnkleLeft, FootLeft, HipRight, KneeRight, AnkleRight,FootRight, Count
Khung xương
Hiện tại, SDK chỉ mới hỗ trợ cho chúng ta nhận dạng được cử động của 2 người chơi. Hi vọng phiên bản chính thức sẽ hỗ trợ nhiều hơn.

Để làm được điều này, đơn giản bạn chỉ cần làm theo các bước sau:

Khai báo hàm sự kiện phát sinh khi SDK phân tích được chuyển động của người chơi, hàm này thường được khai báo cùng việc InitKinectDevice
kinect.SkeletonFrameReady += new
EventHandler<SkeletonFrameReadyEventArgs>(SkeletonFrameReady);

Lấy danh sách tọa độ các khớp chuyển động của người chơi thông qua thuộc tính SkeletonFrameReadyEventArgs.SkeletonFrame.Skeletons. Như đã nói ở trên các điểm này được trả ra dưới dạng các Joint, do đó để lấy được tọa độ x, y trên màn hình ta cần phải có hàm chuyển đối.

private Point getDisplayPosition(Joint joint)
{
float depthX, depthY;
nui.SkeletonEngine.SkeletonToDep thImage(joint.Position, out depthX, out depthY);
//đổi sang hệ quy chiếu tọa độ 320x240
depthX = Math.Max(0, Math.Min( depthX * 320, 320));
depthY = Math.Max(0, Math.Min(
depthY * 240, 240));
int colorX, colorY;
ImageViewArea iv = new ImageVie wArea();

nui.NuiCamera.GetColorPixelCoordinatesFromDepthPixel(ImageResolution.Resolution640x480, iv, (int)depthX, (int)depthY, (short)0, out colorX, out colorY);

return new Point((int)(skeleton.Width * colorX / 640.0), (int)(skeleton.Height * colorY / 480));
}
void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame skeletonFrame = e.SkeletonFrame;
skeleton.Children.Clear();
foreach (SkeletonData data in skeletonFrame.Skeletons)
{
if (SkeletonTrackingState.Tracked == data.Tracking
State)
{
// Draw bones
Brush brush = new SolidColorBrush(Color.FromRgb(255, 0, 0));
skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.Spine, JointID.ShoulderCenter, JointID.Head));
skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.ShoulderCenter, JointID.ShoulderLeft, JointID.ElbowLeft, JointID.WristLeft, JointID.HandLeft));
 
skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.ShoulderCenter, JointID.ShoulderRight, JointID.ElbowRight, JointID.WristRight, JointID.HandRight));

skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.HipLeft, JointID.KneeLeft, JointID.AnkleLeft, JointID.FootLeft));
skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.HipRight, JointID.KneeRight, JointID.AnkleRight, JointID.FootRight));
//Draw joints
foreach (Joint joint in data.Joints)
{
Point jointPos = getDisplayPosition(joint);
Line jointLine = new Line();
jointLine.X1 = jointPos.X - 3;
jointLine.X2 = jointLine.X1 + 6;
jointLine.Y1 = jointLine.Y2 = jointPos.Y;
jointLine.Stroke = new SolidColorBrush(Color.FromRgb (0, 255, 0));
jointLine.StrokeThickness = 6;
skeleton.Children.Add(jointLine);
}
}
}
}
V. Kết luận
Như vậy qua bài này chúng ta đã biết cách lấy hình ảnh ghi nhận được từ camera, điều khiển góc quay, và quan trọng nhất là lấy được tọa độ các khớp chuyển động của nhân vật. Ví dụ như lấy được tọa độ của bàn tay, của đầu, chân, hông. Từ đây chúng ta có thể tạo ra những game dựa vào cử chỉ của người chơi và để điều khiển nhân vật trong game.

Hãy tưởng tưởng một ngày nào đó chúng ta chơi trò Audition thay vì gõ bàn phím, chúng ta sẽ nhảy theo điệu nhạc của nhân vật trên game. Hoặc chúng ta có thể điều khiển máy tính từ xa, giả lập màn hình cảm ứng với Kinect… Vô số ứng dụng dạng tương tác (Interactive Application) cho chúng ta khai thác với thiết bị Kinect.

Email: nguyentankhtn@gmail.com

Thứ Hai

Facebook ngưng "theo dõi" người dùng

Hứng chịu “búa rìu dư luận” vì cho phép những cookie có chức năng theo dõi trình duyệt và vẫn hoạt động ngay cả khi người dùng đã thoát (log-out) khỏi mạng xã hội, Facebook đã nhận trách nhiệm và cho biết mọi thứ đã được khắc phục.
>>> Facebook cũng làm gián điệp theo dõi người dùng?


Facebook đang theo dõi chúng ta? 
(Ảnh minh họa: Internet)
Vụ việc rõ ràng đã như đổ dầu vào ngọn lửa vốn đã luôn âm ỉ về khả năng đảm bảo riêng tư và bảo mật trong chính sách hoạt động của mạng xã hội lớn nhất hành tinh.
Ngọn nguồn vụ việc

Blogger Úc Nik Cubrilovic là người đầu tiên lên tiếng về việc các cookie (được Facebook để lại trong máy) vẫn tiếp tục hoạt động ngay cả khi anh đã hoàn toàn đăng xuất khỏi mạng xã hội.
Cubrilovic cho hay anh đã liên lạc với Facebook khi phát hiện ra điều này, nhưng không nhận được bất cứ phản hồi nào. Tin tức về sự việc chỉ lên nhanh sau khi Cubrilovic đăng tải câu chuyện lên blog cá nhân.
Đại diện Facebook sau đó đã lên tiếng, cho biết họ sẽ khắc phục lỗi sớm cũng như chấm dứt việc thu thập thông tin sau khi người dùng đã ngừng sử dụng dịch vụ.
Lo lắng chưa tan

Theo Cubrilovic, cookie nguy hiểm nhất của vụ việc có tên “a_user”, vốn có nhiệm vụ nắm giữ ID của người dùng chiếc máy tính chứa cookie này. Đại diện Facebook cho biết đã có một lỗi gây ra việc cookie a_user không bị xóa sau khi người dùng đăng xuất, và sẽ khắc phục lỗ hổng này trong thời gian sớm nhất.
Tiếp đó, mạng xã hội của Mark Zuckerberg cho hay việc có một số “thứ hay ho” sót lại sau khi người dùng đã ngưng sử dụng dịch vụ cũng nhằm phục vụ cho việc phát hiện những hoạt động đăng nhập có dấu hiệu đáng ngờ, và bảo vệ tài khoản người dùng mỗi khi họ đăng nhập tại các máy tính công cộng.
Tuy nhiên, cá nhân Cubrilovic vẫn khuyến cáo người dùng nên xóa cookie (thủ công) sau mỗi lần đăng xuất Facebook, hoặc sử dụng một trình duyệt riêng biệt dành riêng cho việc sử dụng mạng xã hội. Anh cho rằng có thể lý do Facebook đưa ra là đúng trên một chừng mực nào đó, song không thể biện hộ cho việc đi “quá đà” khỏi những ranh giới pháp lý về bảo mật do chính công ty này đặt ra.
Lần gần đây nhất Facebook chạm phải những phản ứng tiêu cực từ phía cộng đồng sử dụng là vụ việc với chức năng tự động nhận diện và tag (tạm dịch: đánh dấu) ảnh người dùng, bất kể họ muốn hay không. Sau khi thừa nhận tính năng mới gây nhiều phiền toái hơn là tiện dụng, và xa hơn là có khả năng gây nguy hiểm đến sự bảo mật của người sử dụng, Facebook đã phải vô hiệu hóa tính năng tự động nhận diện và tag ảnh người dùng.
Hãy tưởng tượng nếu một ai đó thích bạn và tìm cách chụp lén ảnh, sau đó tải lên Facebook, lập tức mạng xã hội sẽ tự động dò tìm chủ nhân của bức ảnh, tag, cũng đồng nghĩa với việc người đã chụp bức ảnh kia lập tức sẽ có trong tay mọi thông tin về bạn, mặc dù bạn không biết gì về “người bạn lạ mặt” này.
Để tránh xảy ra tình huống đáng sợ này, người dùng nên thực hiện một thao tác nhỏ, để chủ động hơn trong việc bảo vệ sự riêng tư của mình:
Chọn mục Account (tài khoản) ở góc trên cùng bên phải, rồi chọn Privacy Settings (thiết lập riêng tư), trong Privacy Settings, chọn tiếp Customize Settings (tinh chỉnh thiết lập).
Tại đây, bạn sẽ nhìn thấy lựa chọn mang tên Suggest photos of me to friends (gợi ý hình ảnh của tôi đến bạn bè) trong phần Things others share (Những điều người khác chia sẻ). Hãy vô hiệu hóa lựa chọn này và bạn đã an toàn trong việc bảo vệ quyền riêng tư của mình.

Theo TTO

Thứ Tư

Lập trình viết ứng dụng Facebook


Cảm giác của bạn thế nào khi nhìn thấy được “thành phẩm” của mình trên Facebook? Bài viết sẽ gợi ý cho bạn cách tạo một ứng dụng nhỏ trên Facebook.
Hiện tại, theo thống kê danh mục ứng dụng của Facebook có chứa khoảng hơn 550.000 ứng dụng. Bạn muốn “nhúng” những bài trình bày trong hồ sơ Facebook của mình hay muốn chia sẻ những quyển sách và bộ phim yêu thích với bạn bè, hay chỉ muốn chơi một số trò chơi với những thành viên "không quen" khác trên Facebook. Tất cả điều nói trên sẽ được các ứng dụng hiện có trên Facebook đáp ứng cho bạn. Tuy nhiên, nếu bạn không thích dùng những ứng dụng được “dọn sẵn” và không muốn nhìn thấy những thương hiệu của hãng thứ 3 hay các mẫu quảng cáo, thì bạn có thể tự phát triển ứng dụng Facebook theo cách riêng. 
Dưới đây sẽ là một số bước để giúp bạn tạo ra ứng dụng nhỏ trên Facebook theo ý muốn; đây chỉ là những ví dụ đơn giản về viết ứng dụng Facebook dùng code HTML và ASP.Net.
Để viết ứng dụng Facebook, bạn cần một số kiến thức về các ngôn ngữ lập trình web và cần biết một số máy chủ (web server) cho phép bạn có thể đặt ứng dụng Facebook lên đó.
1. Ứng dụng Facebook dùng code HTML
Bước 1: Giả sử bạn đã có tài khoản trên Facebook, thêm ứng dụng Developer (https://www.facebook.com/developers/) vào hồ sơ Facebook của bạn, sau đó nhấn “Set Up New App”.
Bước 2: Bạn đặt tên cho ứng dụng Facebook, đồng ý với những điều khoản trên Facebook.

Tiếp tục nhập mã bảo vệ, sau đó bạn có thể tải lên một số hình ảnh để chọn làm biểu tượng (logo) cho ứng dụng của bạn.
Bước 3: Bạn có thể dùng công cụ trình biên tập WYSIWYG HTML hay notepad, để ghi nội dung bạn muốn hiển thị bên trong ứng dụng Facebook. Trong ví dụ này sẽ thiết lập ứng dụng máy tính điện tử (calculator).
<html>
<head>
<title>PC World VN Calculator by JavaScript</title>
<script type="text/javascript" src="calculate.js"></script>
</head>
<body>
<h1>PC World VN Calculator by JavaScript</h1>
<form name="calculator">
<table border="0" cellpadding="2" cellspacing="0" background="/images/background.jpg" width="233" height="259">
<tr><td align="center" style="padding-bottom:0px;padding-top:15px"><input type="text" name="win" value="0" style="height:30px;width:190px;text-align:right;font-size:20px;font-weight:bold;border:1px solid #666666;padding-right:2px;" maxlength='15'></td></tr>
<tr><td>
<table border="0" cellpadding="5" cellspacing="1" align="center">
<tr><td style="padding-top:0px"><input type="button" value="CE" style="width:40px" onClick="calc('CE')"></td>
<td style="padding-top:0px"><input type="button" value="C" style="width:40px" onClick="calc('C')"></td>
<td style="padding-top:0px"><input type="button" value="+/-" style="width:40px" onClick="calc('+/-')"></td>
<td style="padding-top:0px"><input type="button" value="%" style="width:40px" onClick="calc('%')"></td></tr>
<tr><td><input type="button" value="7" style="width:40px" onClick="calc('7')"></td>
<td><input type="button" value="8" style="width:40px" onClick="calc('8')"></td>
<td><input type="button" value="9" style="width:40px" onClick="calc('9')"></td>
<td><input type="button" value="/" style="width:40px" onClick="calc('/')"></td></tr>
<tr><td><input type="button" value="4" style="width:40px" onClick="calc('4')"></td>
<td><input type="button" value="5" style="width:40px" onClick="calc('5')"></td>
<td><input type="button" value="6" style="width:40px" onClick="calc('6')"></td>
<td><input type="button" value="x" style="width:40px" onClick="calc('*')"></td></tr>
<tr><td><input type="button" value="1" style="width:40px" onClick="calc('1')"></td>
<td><input type="button" value="2" style="width:40px" onClick="calc('2')"></td>
<td><input type="button" value="3" style="width:40px" onClick="calc('3')"></td>
<td><input type="button" value="-" style="width:40px" onClick="calc('-')"></td></tr>
<tr><td><input type="button" value="0" style="width:40px" onClick="calc('0')"></td>
<td><input type="button" value="." style="width:40px" onClick="calc('.')"></td>
<td><input type="button" value="=" style="width:40px" onClick="calc('=')"></td>
<td><input type="button" value="+" style="width:40px" onClick="calc('+')"></td></tr>
</table>
</td></tr>
</table>
</form>
</body>
</html>
Bước 4: Truy cập máy chủ web của bạn, tạo một thư mục con gọi là “facebook” và tải lên file code (index.php hay index.html) mà bạn đã tạo ở trên. Trong trường hợp này, ứng dụng được đặt trên máy chủ web www.thegioigame.vn.
Cavas Page: là đường dẫn URL cho ứng dụng (http://apps.facebook.com/tgvt_fb_app/).
Canvas URL: là nơi đặt dịch vụ web (web service) để lưu trữ ứng dụng sẽ được liên kết với Facebook (http://www.thegioigame.vn/facebook).
Hoàn tất xong bạn nhớ lưu lại các thao tác vừa làm. Bạn hãy quan tâm đến 2 khóa: API Key và App Secret, 2 khóa này cần khai báo trong ứng dụng khi có truy cập thư viện (API) của Facebook.  
Bước 5: Thành quả cuối cùng của bạn. Đó chính là ứng dụng của riêng bạn hiện đã có mặt trên Facebook.
Qua 5 bước này sẽ giúp bạn phần nào hình dung ra cách thức tạo một ứng dụng đơn giản trên Facebook. Các bạn cũng có thể tự tạo những ứng dụng khác theo sở thích và nhu cầu của riêng mình.
Từ ứng dụng đơn giản này, bạn cũng có thể xây dựng các ứng dụng có mức độ phức tạp hơn, chẳng hạn có kèm thêm RSS để cập nhật tin tức, chèn thêm các đoạn video clip… Hy vọng các bạn sẽ tạo được nhiều ứng dụng bổ ích và hữu dụng để chia sẻ cùng với bạn bè.
2. Ứng dụng Facebook với ASP.Net
Bước 1:
Đăng nhập vào facebook: https://www.facebook.com/
Vào phần phát triển ứng dụng: https://www.facebook.com/developers/ , nhấn nút “Set Up New App” để tạo ứng dụng mới.
Bước 2:
Điền tên ứng dụng và chọn đồng ý, nhấn nút khởi tạo.

Nhập mã xác nhận rồi submit.
Bước 3: 
Tab About: Có thể mô tả ứng dụng trong phần Description, chọn icon, logo cho ứng dụng…
Tab Facebook Integration
Application ID và Application Secret là 2 key của ứng dụng cho phép ta viết code truy xuất thông tin.
Canvas Page là trang ứng dụng facebook.
Canvas URL sẽ là trang ASP.Net mà ta viết code truy xuất thông tin.
Trong ví dụ này, mã lệnh (code) sẽ được đưa lên 1 host free http://phuonglam.somee.com. Các bạn có thể vào trang http://somee.com/ để đăng ký 1 host free để sử dụng, trang này hỗ trợ khá tốt ASP.Net tất cả framework, tuy nhiên trang hiển thị sẽ bị phần quảng cáo ở phía trên và dưới (chịu thôi, đồ “chùa” mà).
Hoàn tất, nhấn Save Changes

Đường dẫn của ứng dụng sẽ là: http://apps.facebook.com/pcwsample/
Bước 4:  
Download Starter Kit tích hợp vào Visual Studio.
Cài đặt Starter kit:
Bước 5:
Khởi chạy Visual Studio tạo website. Chọn Facebook Starter Kit v2.1

Bước 6: 
Code; chỉnh tập tin web.config các “key” cho đúng với ứng dụng Facebook đã tạo ban đầu.
 
Starter Kit sẽ tự tạo cho chúng ta trang Default.aspx có nội dung như hình vẽ:  
Ghi chú
Image1 hiện thị hình ảnh của người tạo ứng dụng.
Control FriendList1 sẽ liệt kê hình bạn bè của người tạo ứng dụng.
DropDownList1 thay đổi sẽ làm thay đổi Image2 hiển thị hình ảnh bạn trong danh sách bạn bè friend list.
Bước 7: 
Đưa website lên host free đã tạo.
Bước 8:
Chạy ứng dụng facebook: http://apps.facebook.com/pcwsample/ 
Hộp thoại Request for Permission hiện ra, chọn Allow.

Kết quả cuối cùng:

Chúc các bạn thành công! 
Nguồn pcworld.com.vn

Thứ Sáu

Tất cả các lệnh cấu hình trong CCNA theo chuyên mục

Phần 1. Routing - Định Tuyến (Các giao thức phức tạp)
OSPF.

Note: Tất cả những router có cùng area phải cấu hình giống nhau tất cả các thông số thì khu vực đó mới hoạt động đúng chức năng được.

1. Cấu hình cơ bản

Router(config)#router ospf process ID
Router(config-router)#network Network_number Wildcard_mask area_ID

2. Cấu hình priority ở các interface để bầu DR và BDR

Priority càng lớn thì khả năng được bầu làm DR càng cao, ngược với bầu Root brige của Switch, càng nhỏ thì lại càng được bầu.

Router(config)#interface fastethernet 0/0
Router(config-int)#ip ospf priority 55

Sau khi cấu hình xong priority có thể kiểm tra bằng lệnh.

Router# show ip ospf interface f0/0

3. Chỉnh sửa lại OSPF cost metric trong mỗi interface

Cost càng nhỏ thì tuyến đó càng được coi là best path

Router(config-int)#ip ospf cost 1

4.Cấu hình OSPF Authentication ở các interface và áp dùng vào router

Authentication key được hiểu như là password để các router trong cùng một vùng chia sẻ với nhau.

a.Cấu hình authentication đơn giản

Router(config-if)#ip ospf authentication-key password
Router(config-router)#area area number authentication

b.Cấu hình authentication theo dạng mã hoá, bảo mật cao.

Router(config-if)ip ospf message-digest-key key ID md5 encryption-type key
Router(config-router)#area area ID authentication message-digest

5.Cấu hình OSPF timer trong các interface

Router(config-if)ip ospf hello-interval timer
Router(config-if)ip ospf dead-interval timer

6.Cấu hình quảng bá một tuyến mặc định trong OSPF

Router(config-router)#default-information originate

7.Quảng bà một tuyến khác (không phải là default)

Router(config-router)#redistribute protocols subnets

8.Các lệnh show dùng để kiểm tra cấu hình OSPF

show ip protocol
show ip route
show ip ospf
show ip ospf interface
show ip ospf database
show ip ospf neighbor detail
clear ip route *
debug ip ospf events
debug ip ospf adj

EIGRP

1.Cấu hình cơ bản.

Router(config)#router eigrp autonomous number
Router(config-router)#network network number
Router(config-router)#eigpr log-neighbor-changes (Không có cũng được)
Router(config-router)#no auto-summary

2.Thay đổi băng thông và tự tổng hợp tuyến trong interface

Router(config-if)#bandwidth kilobits
Router(config-if)#ip summary-address protocol AS network number subnets mask

3.Cân bằng tải trong EIGRP

Router(config-router)#variance number

4.Quảng bá default route

Cách 1:
Router(config)#ip route 0.0.0.0 0.0.0.0 [interface/nexthop]
Router(config)#redistribute static

Cách 2:
Router(config)#ip default-network network number

Cách 3:
Router(config-if)#ip summary-network eigrp AS number 0.0.0.0 0.0.0.0

5.Quảng bá các tuyến khác trong EIGRP (không phải là default)

Router(config-router)#redistribute protocol process ID metrics k1 k2 k3 k4 k5
Ex: Router(config-router)#redistribute ospf metrics 100 100 100 100 100

6.Chia sẻ traffic trong EIGRP

Router(config-router)#traffic share {balanced/min}

7.Các lệnh kiểm tra cấu hình EIGRP

<!--[if !supLists]-->- <!--[endif]-->show ip eigrp neighbor
<!--[if !supLists]-->- <!--[endif]-->show ip eigrp interface
<!--[if !supLists]-->- <!--[endif]-->show ip eigrp topology
<!--[if !supLists]-->- <!--[endif]-->show ip eigrp traffic
<!--[if !supLists]-->- <!--[endif]-->debug eigrp fsm
<!--[if !supLists]-->- <!--[endif]-->debug eigrp packet

Phần 2. Switching - Chuyển mạch

1.Cấu hình cơ bản chung cho một Switch

Reset tất cả cấu hình của Switch và reload lại.

Switch#delete flash:vlan.dat
Switch#erase startup-config
Switch#reload

2.Cấu hình về Security và management

Switch(config)#hostname tên switch
Switch(config)#line console 0
Switch(config-line)#password mật khẩu
Switch(config-line)#login

Switch(config)#line vty 0 4
Switch(config-line)#pass mật khẩu
Switch(config-line)#login

3.Thiết lập địa chỉ IP và default gateway cho Switch

Switch(config)#interface vlan1
Switch(config-int)#ip address địa chỉ subnetmask
Switch(config)#ip default-gateway địa chỉ

4.Thiết lập tốc độ và duplex của cổng

Switch(config-int)#speed tốc độ
Switch(config-int)#duplex full

5.Thiết lập dịch vụ HTTP và cổng

Switch(config)#ip http server
Switch(config)#ip http port 80

6.Thiết lập, quản lý địa chỉ MAC

Switch(config)#mac-address-table static địa chỉ MAC interface fastethernet số vlan
Switch#show mac-address-table
Switch#clear mac-address-table

7.Cấu hình bảo mật cho cổng

Switch(config-if)#switchport mode acess
Switch(config-if)#switchport port-security

Cấu hình Static: Switch(config-if)#switchport port-security mac-address địa chỉ Mac

Cấu hình Sticky: Switch(config-if)#switchport port-security mac-address sticky (thông dụng nhất)

Switch(config-if)#switchport port-security maximum value
Switch(config-if)#switchport port-security violation shutdown

8.Tạo Vlan

Cách 1.

Switch#vlan database
Switch(vlan)#vlan number

Cách 2. Khi gán các cổng vào vlan, dù vlan chưa tồn tại nhưng Switch vẫn tự tạo.

Switch(config)#interface fastethernet 0/0
Switch(config-int)#switchport access vlan vlan-id

Muốn xoá vlan ta làm như sau:

Switch(config-if)#no switchport access vlan vlan-id
Switch#clear vlan vlan_number (xoá toàn bộ vlan )

9.Gán nhiều cổng vào trong vlan cùng một lúc, cấu hình Range

Đối với dãy cổng không liên tục.
Switch(config)#interface range cổng 1 , cổng 2 , cổng 3

Đối với một dãy liên tục.
Switch(config)#interface range cổng 1-n
Switch(config-range)#switchport access vlan vlan-id


Ví dụ:
Switch(config)#interface range f0/0 , f0/2 , f0/4
Switch(config)#interface range f0/0-10
Switch(config-range)#switchport access vlan 10

10.Cấu hình Trunk

Switch(config-if)#switchport mode trunk
Switch(config-if)#switchpor trunk encapsulation encapsulation-type
Switch#show trunk

11.Cấu hình VTP

Switch#vlan database
Switch(vlan)#vtp v2-mode
Switch(vlan)#vtp domain tên domain
Switch(vlan)#vtp {server/client/transperant}
Switch(vlan)#vtp password password (Tạo pass cho domain)
Switch#show vtp status

12.Cấu hình Inter-Vlan trên Router

Router(config)#interface fastethernet 0/0.1
Router(config-subif)#encapsulation type
Router(config-subif)#ip address địa chỉ subnetmask

Phần 3. Access-list và các cấu hình liên quan.

1.Nhắc lại về lý thuyết.

Có 2 loại access-list.

<!--[if !supLists]-->- <!--[endif]-->Loại thứ nhất: Standard IP Access-list chỉ lọc dữ liệu dựa vào địa chỉ IP nguồn. Range của loại này là từ 1à 99. Nên được áp dụng với cổng gần đích nhất.

<!--[if !supLists]-->- <!--[endif]-->Loại thứ hai: Extended IP Access-list lọc dữ liệu dựa vào
<!--[if !supLists]-->o <!--[endif]-->Địa chỉ IP nguồn
<!--[if !supLists]-->o <!--[endif]-->Địa chỉ IP đích
<!--[if !supLists]-->o <!--[endif]-->Giao thức (TCP, UDP)
<!--[if !supLists]-->o <!--[endif]-->Số cổng (HTTP, Telnet…)
<!--[if !supLists]-->o <!--[endif]-->Và các thông số khác như Windcard mask
Range của loại này là từ 100 à199. Nên được áp dụng với cổng gần nguồn nhất.

Hai bước để cấu hình Access-list
<!--[if !supLists]-->- <!--[endif]-->Bước 1: Tạo access-list trong chế độ cấu hình config.
<!--[if !supLists]-->- <!--[endif]-->Bước 2: Áp dụng access-list cho từng cổng tuỳ theo yêu cầu ở chế độ cấu hình (config-if)

Lưu ý:
<!--[if !supLists]-->- <!--[endif]-->Mặc định của tất cả Access-list là deny all, vì vậy trong tất cả các access-list tối thiểu phải có 1 lệnh permit. Nếu trong access-list có cả permit và deny thì nên để các dòng lệnh permit bên trên.
<!--[if !supLists]-->- <!--[endif]-->Về hướng của access-list (In/Out) khi áp dụng vào cổng có thể hiểu đơn giản là: In là từ host, Out là tới host hay In vào trong Router, còn Out là ra khỏi Router.
<!--[if !supLists]-->- <!--[endif]-->Đối với IN router kiểm tra gói tin trước khi nó được đưa tới bảng xử lý. Đối vơi OUT, router kiểm tra gói tin sau khi nó vào bảng xử lý.
<!--[if !supLists]-->- <!--[endif]-->Windcard mask được tính bằng công thức:
WM = 255.255.255.255 – Subnet mask (Áp dụng cho cả Classful và Classless addreess)
<!--[if !supLists]-->- <!--[endif]-->0.0.0.0 255.255.255.255 = any.
<!--[if !supLists]-->- <!--[endif]-->Ip address 0.0.0.0 = host ip address (chỉ định từng host một )

2.Cấu hình Standard Access-list (Ví dụ)

Router(config)#access-list 1 deny 172.16.0.0 0.0.255.255
Router(config)#access-list 1 permit any
Router(config)#interface fastethernet 0/0
Router(config-in)#ip access-group in

3.Cấu hình Extended Access-list (Ví dụ)

Router(config)#access-list 101 deny tcp 172.16.0.0 0.0.255.255 host 192.168.1.1 eq telnet
Router(config)#access-list 101 deny tcp 172.16.0.0 0.0.255.255 host 192.168.1.2 eq ftp
Router(config)#access-list 101 permit any any
Router(config)#interface fastethernet 0/0
Router(config-int)#ip access-group out

4.Cấu hình named ACL thay cho các số hiệu.

Router(config)#ip access-list extended server-access (tên của access-list)
Router(config-ext-nacl)#permit tcp any host 192.168.1.3 eq telnet
Router(config)#interface fastethernet 0/0
Router(config-int)#ip access-group server-access out

5.Permit hoặc Deny Telnet sử dụng Standard Acl (Ví dụ)

Router(config)#access-list 2 permit 172.16.0.0 0.0.255.255
Router(config)#access-list 2 deny any
Router(config)#line vty 0 4
Router(config-line)#password cisco
Router(config-line)#login
Router(config-line)#ip access-class 2 in

6.Xoá và kiểm tra Access-list

Muốn xoá thì ta dùng lệnh sau:
Router(config)# no ip access-list số hiệu

Kiểm tra Acl ta dùng các lệnh sau:

<!--[if !supLists]-->- <!--[endif]-->show access-list
<!--[if !supLists]-->- <!--[endif]-->show running-config
<!--[if !supLists]-->- <!--[endif]-->show ip interface

Phần 4. NAT – PPP – Frame Relay

I.Cấu hình NAT

* Cấu hình Static NAT

Cấu hình NAT trong chế độ Router(config). Các lệnh như sau

Router(config)#ip nat inside source static [inside local address] [inside global address]
Ví dụ:
R(config)#ip nat inside source statice 10.0.0.1 202.103.2.1 (Địa chỉ 10.10.0.1 sẽ được chuyển thành 202.103.2.1 khi đi ra khỏi Router)

Sau khi cấu hình xong phải áp dụng vào cổng in và cổng out, trong ví dụ dưới đây, cổng Ethernet là công in, còn cổng Serial là cổng out

Router(config)#interface ethernet 0
Router(config-if)#ip nat inside

Router(config)#interface serial 0
Router(config-if)#ip nat outside

* Cấu hình Dynamic NAT

Router(config)#ip nat pool [ tên pool] [A.B.C.D A1.B1.C1.D1] netmask [mặt nạ]
Router(config)#ip nat inside source list [số hiệu ACL] pool [tên pool]
Router(config)#access-list [số hiệu ACL] permit A.B.C.D windcard masks

Ví dụ:
R(config)#ip nat pool nat-pool1 179.9.8.80 179.9.8.95 netmask 255.255.255.0
R(config)#ip nat inside source list 1 pool nat-pool1
R(config)#access-list 1 permit 10.1.0.0 0.0.0.255

Sau đó áp vào cổng In và Out như Static NAT

Note: Giải địa chỉ inside local address và inside global address phải nằm trong giải cho phép của ACL

* Cấu hình PAT overload

*
o Cấu hình overload với 1 địa chỉ IP cụ thể.

Router(config)#ip nat pool [tên pool] [ip global inside] [subnet mask]
Router(config)#ip nat inside source list [tên số hiệu ACL] pool [tên pool] overload
Router(config)#access-list [số hiệu] permit [địa chỉ] [windcard mask]

Ví dụ:
R(config)#access-list 2 permit 10.0.0.0 0.0.0.255
R(config)#ip nat pool nat-pool2 179.9.8.20 255.255.255.240
R(config)#ip nat inside source list 2 nat-pool2 overload

*
o Cấu hình overload dùng địa chỉ của cổng ra.(Thường xuyên được dung hơn là trường hợp trên)

Router(config)#ip nat inside source list [tên số hiệu ACL] interface [cổng ra] overload
Router(config)#access-list [số hiệu] permit [địa chỉ] [windcard mask]

Ví dụ:
R(config)#ip nat inside source list 3 interface serial 0 overload
R(config)#access-list 3 permit 10.0.0.0 0.0.0.255

* Các lệnh Clear NAT/PAT

Lệnh xóa tất cả dynamic nat trên toàn bộ các interface.
Router#clear ip nat translation *

Lệnh xóa các single nat trên từng interface
Router#clear ip nat translation [inside/outside] [global ip - local ip]

Lệnh xóa các extended nat trên từng interface
Router#clear ip nat translation protocol [inside/outside] [global ip - global port – local ip – local port]

* Kiểm tra và Debug các NAT và PAT

Router#show ip nat translation
Router#show ip nat statics
Router#debug ip nat

* Cấu hình DHCP

Router(config)#ip dhcp excluded-address ip-address (end-ip-address)
Router(config)#ip dhcp pool [tên pool]
Router(dhcp-config)#network addess subnetmask
Router(dhcp-config)#default-router address
Router(dhcp-config)#dns-server address
Router(dhcp-config)#netbios-name-server address
Router(dhcp-config)#domain-name tên domain
Router(dhcp-config)#lease ngày/giờ/phút

* Kiểm tra và troubleshoot cấu hình DHCP

Router#show ip dhcp binding
Router#debug ip dhcp server events

* Trong trường hợp DHCP server không nằm cùng mạng với host

Note: khi DHCP server không cùng mạng với host thì ta phải dùng lệnh ip helper-address giúp host đến DHCP server.

Router(config)#interface [cổng nằm cùng mạng với host]
Router(config-if)#ip helper-address [địa chỉ của DHCP server]

Note: Trong trường hợp muốn gói tin của host được broadcast ở mạng chứa DHCP thì ta dùng thêm lệnh ip directed-broadcast ở cổng cùng mạng với DHCP server

Router(config)#interface [cổng nằm cùng mạng với dhcp]
Router(config-ì)#ip directed-broadcast

II. Cấu hình PPP

1. Cấu hình cơ bản:

R(config)#interface serial 0/0
R(config-if)#encapsulation ppp

2. Cấu hình PAP

Cấu hình PAP không yêu cầu hai Router giống nhau về password nhưng CHAP thì phải có.

(Cấu hình trên RA)
R(config)#host RA
RA(config)#username RB password 321
RA(config-if)#encapsulation ppp
RA(config-if)#ppp authentication pap
RA(config-if)#ppp pap sent-username RA password 123

(Cấu hình trên RB)
R(config)#host RB
RB(config)#username RA password 123
RB(config-if)#encapsulation ppp
RB(config-if)#ppp authentication pap
RB(config-if)#ppp pap sent-username RB password 321

3. Cấu hình CHAP. (yêu cầu phải giống nhau về password)

(Cấu hình trên RA)
R(config)#host RA
RA(config)#username RB password 123
RA(config-if)encapsulation ppp
RA(config-if)ppp authentication chap

(Cấu hình trên RB)

R(config)#host RB
RB(config)#username RA password 123
RB(config-if)encapsulation ppp
RB(config-if)ppp authentication chap


4. Các cấu hình khác của PPP

<!--[if !supLists]-->a. <!--[endif]-->Cấu hình Multilink

R(config-if)#encapsulation ppp
R(config-if)#ppp multilink

<!--[if !supLists]-->b. <!--[endif]-->Cấu hình Compression

R(config-if)#encapsulation ppp
R(config-if)#compress [predictor/stac/mppc]

<!--[if !supLists]-->c. <!--[endif]-->Cấu hình Error detection

R(config-if)#encapsulation ppp
R(config-if)#ppp quality [phần trăm]

5. Các lệnh kiểm tra cấu hình PPP

R#show interface (xem encapsulation)
R#debug ppp negotiation (Xem quá trình kết nối giữa 2 node)
R#debug ppp authentication (Xem quá trình xác thực giữa 2 node)


III. Cấu hình Frame-Relay

<!--[if !supLists]-->1. <!--[endif]-->Cấu hình đơn giản

R(config-if)#encapsulation frame-relay {ciso| ietf} (mặc định là cisco)

Khi lệnh này được thực thi, DLCI sẽ được Inverse ARP tự động map, người dùng không cần phải làm gì cả.

* Nhưng Inverse ARP không làm việc với các kết nối Hub-and-Spoke

<!--[if !supLists]-->2. <!--[endif]-->Cấu hình Frame-relay static map

R(config-if)#encapsulation frame-relay
R(config-if)#frame-relay map ip remote–ip-address local-dlci [broadcast] [cisco| ietf]
(ip address trong dòng lệnh trên chỉ lấy làm minh họa bởi nó rất phổ biến, chính xác phải là remote–protocol–address)
Broadcast trong câu lệnh trên có 2 chức năng:
<!--[if !supLists]-->§ <!--[endif]-->Forward broadcast khi multicast không được khởi động.
<!--[if !supLists]-->§ <!--[endif]-->Đơn giản hóa cấu hình OSPF cho mạng nonbroadcast sử dụng FRelay.
Ví dụ:

R(config-if)#encapsulation frame-relay
R(config-if)#frame-relay map ip 192.168.2.1 100 broadcast


<!--[if !supLists]-->3. <!--[endif]-->Cấu hình FR trong mạng None Broadcast MutiAccess

<!--[if !supLists]-->- <!--[endif]-->Trong mạng Broadcast khi 1 máy tính truyền frame tất cả các node lắng nghe frame nhưng chỉ có node cần nhận mới nhận được.
<!--[if !supLists]-->- <!--[endif]-->Trong mạng None Broadcast khi 1 máy tính truyền frame thì chỉ có node cần nhận mới lắng nghe và nhận được frame đó, các node còn lại thì không. Frame được truyền qua 1 virtual Circuit hoặc 1 thiết bị chuyển mạch.
<!--[if !supLists]-->- <!--[endif]-->Star topology có thể được coi như là 1 mạng Hub and Spoke.

<!--[if !supLists]-->4. <!--[endif]-->Giải quyết vấn đề với Routing Updates mà không disable Split Horizal

Giải pháp dùng Sub-interface

R(config)#interface s0/0
R(config-if)#encapsulation frame-relay
R(config-if)interface s0/0.1 [multipoint| point-to-point]

<!--[if !supLists]-->- <!--[endif]-->point-to-point: Mỗi subinterface có subnet riêng của mình. Broadcast và Split horizol không là vấn đề.
<!--[if !supLists]-->- <!--[endif]-->Multi-point: Tất cả các subinterface liên quan phải cùng chung 1 subnet và như vậy Broadcast và Split horizol sẽ có vấn đề.

Ví dụ:
(Point-to-point)
R(config)#interface s0/0
R(config-if)#encapsulation frame-relay
R(config-if)#interface s0/0.1 point-to-point
R(config-subif)#frame-relay interface-dlci 18

(Multipoint)
R(config)#interface s0/0
R(config-if)#encapsulation frame-relay
R(config-if)#interface s0/0.2 multipoint
R(config-subif)#frame-relay interface-dlci 19
R(config-subif)#frame-relay interface-dlci 20

<!--[if !supLists]-->5. <!--[endif]-->Cấu hình trên Frame-relay Switching (ví dụ)

R(config)#frame-relay switching
R(config)#interface s0/0
R(config-if)#encapsulation frame-relay
R(config-if)#frame-relay intf-type dce
R(config-if)#frame-relay route 103interface serial 0/1 301

theo hocit.com

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates