March 2009 - Posts

Trên trang CodeProject.com, tác giả Josh Smith viết một bài khá thú vị về cách tạo hiệu ứng xoay các nội dung dạng hình chữ nhật theo các kiểu khác nhau.

Để sử dụng hiệu ứng, cần sử dụng thư viện Thriple có download tại http://thriple.codeplex.com/. Thư viện có kèm theo một số ví dụ rất trực quan để người dùng có thể thử nghiệm kiểm tra các loại hiệu ứng. Bạn nào có thời gian thử porting sang SilverLight nhé. Tôi nghĩ là hoàn toàn có thể.

Rotate3D

Đây là bài giảng về SilverLight của nhóm lập trình viên SilverLight của công ty Infoway, thành viên của chương trình BizSpark, thực hiện tại trung tâm Microsoft Innovation Center tại Hà nội.

 

CHƯƠNG II:

XAML - Extensible Application Markup Language

1 Tổng quan về XAML

1.1 XAML là gì

XAML được viết tắt bởi cụm từ: Extensible Application Markup Language là một ngôn ngữ dạng khai báo. Bạn có thể tạo ra các phần tử đồ họa(UI) với những khai báo thông qua thẻ trong XAML. Sau đó bạn có thể dùng file mã lệnh tách biệt của nó(code-behind) để trả về những sự kiện và điều khiển những đối tượng mà bạn đã định nghĩa trong XAML. Nó là một ngôn ngữ mô tả dựa trên XML là rất trực quan để xây dựng giao diện từ những bước phác thảo cho tới sản xuất sản phẩm, đặc biệt hữu ích cho đối tượng có kinh nghiệm thiết kế website và kỹ thuật.

1.2 Khai báo đối tượng

Có hai cách để khai báo đối tượng trong XAML:

1.2.1 Khai bao trực tiếp:

Sử dụng thẻ đóng mở để khai báo một đối tượng giống như là một phần tử XML. Bạn cũng có thể sử dụng cú pháp này để khai báo đối tượng gốc (root object) hoặc để xét các giá trị các thuộc tính.

1.2.2 Khai báo gián tiếp:

Sử dụng giá trị trực tiếp để khai báo một đối tượng. Bạn có thể sử dụng cú pháp này để thiết lập giá trị của thuộc tính.Thông thường, điều này có nghĩa là chỉ những thuộc tính mà được hỗ trợ bởi đối tượng mới có thể sử dụng được phương pháp này.

1.3 Thiết lập đặc tính cho đối tượng

Có những cách sau để khai báo đặc tính cho đối tượng:

1.3.1 Sử dụng cú pháp theo thuộc tính

Dưới đây là ví dụ xét giá trị cho các thuộc tính: Width, Height, Fill của đối tượng Rectangle:
<Rectangle Width="100" Height="100" Fill="Blue" />

1.3.2 Sử dụng cú pháp theo đặc tính của thành phần(element):

Dưới đây là ví dụ xét đặc tính Fill theo cách này cho đối tượng Rectangle:

<Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <SolidColorBrush Color="Blue"/>
  </Rectangle.Fill>
</Rectangle>
1.3.3 Sử dụng cú pháp theo nội dung

Dưới đây là ví dụ xét đặc tính Text cho đối tượng TextBlock(Giống như đối tượng Label trong Winform, Webform):

<TextBlock>Hello!</TextBlock>

1.3.4 Sử dụng theo một tập hợp

Đây là một trường hợp khá thú vị trong XAML, bởi có những cách khác nhau để thể hiện tập hợp này. Hơn nữa nó có thể xuất hiện ở phần đầu tiên của XAML cho phép bạn xét những đặc tính chỉ đọc (read-only) của đối tượng.

Dưới đây là ví dụ xét đặc tính theo những cách khác nhau sử dụng theo kiểu tập hợp.

Cách 1:

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- Ở đây thẻ GradientStopCollection được chỉ rõ. -->
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

Cách 2:

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!--Không cần khai báo GradientStopCollection, bộ phân tích sẽ hiểu và tạo ra nó-->
    <GradientStop Offset="0.0" Color="Red" />
    <GradientStop Offset="1.0" Color="Blue" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

Cách 3:

Ngoài ra, có những đặc tính mà chúng có những tập hợp đặc tính nhưng chúng được xác định như là đặc tính nội dung của lớp. Trong trường hợp này ta xét đến đặc tính GradientStops được xử dụng ở trên. Bạn có thể loại bỏ đặc tính này và sẽ có kết quả như sau:

<LinearGradientBrush>
  <GradientStop Offset="0.0" Color="Red" />
  <GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush>

1.4 Root elements và namespace trong XAML

Một file XAML chỉ được có duy nhật một Root element và phải thỏa mãn cả hai tiêu chí sau: well-formed XML(có mở và đóng thẻ) và valid XML(tuân thủ theo Document Type Definition(DTD)). Ví dụ dưới đây cho Root element điển hình của XAML cho Silverlight với Root element là thành phần UserControl.

<UserControl x:Class="MySilverlight.Page" xmlns="http://schemas.microsoft.com/client/2007" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> </Grid> </UserControl>

1.5 Sự kiện

XAML là một ngôn ngữ khai báo cho đối tượng và những đặc tính của chúng, nhưng nó cũng bao gồm những cú pháp cho sự kết hợp sự kiện cho đối tượng trong những thẻ đánh dấu. Bạn chỉ rõ tên của sự kiện như là một thuộc tính tên trên đối tượng mà sự kiện được nghe. Về giá trị của thuộc tính, bạn chỉ rõ tên của hàm nghe sự kiện mà bạn định nghĩa ở phần code-behind hoặc ở phần javascript.

Việc có khai bao hay không đặc tính x:Class ở thẻ root trong XAML có ảnh hưởng đến việc xử lý sự kiện. Nếu bạn khai báo x:Class tức là việc xử lý sự kiện của bạn sẽ được thực hiện trong code-behind, trường hợp này thường xuất hiện trong kiểu lập trình Managed API (chứa trong silverlight 2.0). Còn ngược lại thì việc xử lý sự kiện của bạn được thực hiện ngay trong thẻ Javascript chứa trong HTML, trường hợp này thường xuất hiện trong kiểu lập trình JavaScript API (chứa trong Silverlight 1.0).

- Ví dụ dưới đấy chỉ rõ cho bạn thấy cách tạo một sự kiện trong trường hợp kiểu lập trình Manged API

<UserControl x:Class="Chapter2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
  <Grid x:Name="LayoutRoot" Background="White">
    <Button Click="Button_Click" Content="Click me"></Button>
  </Grid>
</UserControl>

Doạn mã trên, trong thẻ root <UserControl> chúng ta đã khai báo đặc tính x:Class=" Chapter2.Page", điều này có nghĩa trong chương trình của chúng ta có một file chứa class Chapter2.Page. Class này sẽ đảm nhiệm việc xử lý các sự kiện đã khai báo ở file XAML (Page.xaml).

Trong thẻ <Grid> chúng ta tạo thêm một nút <Button> và khai báo trong nút đó một sự kiện

Click="Button_Click".Sự kiện này sẽ được xử lý ở trong code-behind như sau

namespace Chapter2
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //Xu ly su kien Button click o day
            MessageBox.Show("Xin chao!");
        }
    }
}

- Còn ví dụ dưới đây sẽ chỉ rõ cho bạn thấy cách tạo một sự kiện trong trường hợp kiểu lập trình JavaScript API

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
  <Grid x:Name="LayoutRoot" Background="White">
    <Button x:Name="button1" Click="Button_Click" Content="Button 1"></Button>
  </Grid>
</UserControl>

Doạn mã trên, trong thẻ root <UserControl> chúng ta không khai báo đặc tính x:Class. Việc xử lý sự kiện sẽ được thực hiện ngay trong trang HTML có chứa chương trình silverlight này.

<script type="text/javascript">
    function Button_Click() {
        alert("Xin chao!");
    }
</script>

2 Các namescope trong XAML

Trong Silverlight, một XAML namescope lưu trữ quan hệ giữa những tên từ khóa của XAML đã được định nghĩa của đối tượng và những khởi tạo tương đương của nó. Điều này cũng tương tự như ý nghĩa của “namescope” trong các ngôn ngữ lập trình và công nghệ khác. XAML namescope được tạo ra trong quá trình dịch mã XAML và trong quá trình tạo hình đối tượng. Những tên mà được tạo trong namescope sau đó được sử dụng ở code-behind thao tác lúc chạy chương trình để truy cập tới đối tượng được tạo bởi quá trình dịch file XAML. Để biết thêm chi tiết các bạn có thể tham khảo tại địa chỉ: http://msdn.microsoft.com/en-us/library/cc189026(VS.95).aspx

3 Sử dụng XAMLReader.Load

Sử dụng JavaScript API cho Silverlight, để tạo đối tượng trong lúc thực thi ứng dụng bắt buộc phải sử dụng qua phương thức CreateFromXaml. Sử dụng manged API những class hoặc cấu trúc (structure) cho phép có thêm các thành phần bên trong thực sự được khởi tạo nếu nó có trong cây thành phần của Silverlight. Trong hầu hết các trường hợp mà bạn muốn khởi tạo đối tượng trong lúc thực thi, bạn có thể đơn giản triệu gọi constructor của class liên quan tới nó.

Tuy vậy, Bạn vẫn có thể tạo đối tượng thông qua đầu vào là XAML thông qua managed API, qua việc sử dụng phương thức XamlReader.Load.

Phương thức Load trong managed API là tương ứng với CreateFromXaml trong JavaScript API, cũng giống như CreateFromXaml, đầu vào cho phương thức Load là những chuỗi và đầu ra là những đối tượng mà có thể thêm vào mạng đối dạng cây của Silverlight.

XamlReader đơn giản được thiết kể để đọc xml “XmlReader” có trong Silverlight cũng như trong các công nghệ khác của Microsoft . XamlReader là lớp được xây dựng theo kiểu static với những phương thức tạo đối tượng; nó tạo đối tượng song song với việc xử lý XAML để sinh ra trong lúc thực thi(run-time) những cây đối tượng từ XAML trong Silverlight

Các bạn cần lưu ý những điểm sau khi sử dụng phương thức Load:

- Nội dung chuỗi XAML phải định nghĩa một phần tử gốc (root element)

- Nội dung chuỗi XAML phải là well-formed XML, và valid XML

4 XAML và các Custom class

XAML hỗ trợ khả năng có thể định nghĩa tùy chỉnh lớp(custom class) hoặc cấu trúc(structure) trong bất kỳ ngôn ngữ runtime nào (CLR), và sau đó truy cập vào class thông qua thẻ đánh dấu của XAML(XAML markup), bao gồm cách sử dụng hỗn hợp của những thẻ Silverlight đã định nghĩa trong XAML và những thẻ XAML mà tham chiếu tới custom class tương ứng của nó (Mỗi custom class chứa tương ứng 2 file .cs và .xaml, ví dụ: myclass.xaml và myclass.xaml.cs)

4.1 Custom class trong ứng dụng hoặc Assemblies

Custom class dùng trong XAML có thể định nghĩa theo cách riêng biệt:

- Trong code-behind được đóng gói trong ứng dụng Silverlight

- Như là một class được định nghĩa trong một assembly tách biệt, như là một thư viện thực thi hoặc DLL

Mỗi cách trên đều có những ưu và nhược điểm như sau:

- Ưu điểm của việc tạo class và đóng gói riêng biệt là khả năng có thể chia sẻ và dùng được trong nhiều ứng dụng Silverlight khác. Đồng thời là khả năng quản lý phiên bản của control dễ dàng hơn và nó làm cho nó có khả năng tạo ra class mà bạn dự dịnh sử dụng như là một root element trong trang XAML.

- Ưu điểm của việc tạo custom class trong ứng dụng là về mặt kỹ thuật tương đối đơn giản và giảm thiểu kích cỡ và kiểm tra khi bạn gặp vấn đề trong dự án Silverlight dựa trên code-behind. Tuy nhiên có điểm hạn chế là bạn không thể dùng custom class như là một root element. Bạn phải tham chiếu custom class của bạn qua một assembly khác hoặc là giới hạn subclass sử dụng User Control hỗ trợ code-behind trong dự án Silverlight của bạn.

- Dù là định nghĩa trong cùng một assembly hay assembly khác nhau, custom class phải được ánh xạ qua CLR namespace và XML namespace để được tham chiếu trong XAML

4.2 Ràng buộc để Custom Class trở thành thành phần đối tượng trong XAML

Để được tạo đối tượng như là một thành phần đối tượng của XAML, custom class của bạn phải đáp ứng các yếu tố sau đây:

- Custom class phải để public và hỗ trợ khởi tạo mặc định không có tham số truyền vào (default constructure ‘parameterless’).

- Custom class không phải là class lồng(class lồng và dấu chấm ‘.’ ở cú pháp của nó ảnh hưởng tới những đặc điểm của Silverlight như là các property kèm theo.

Ngoài ra để đối tượng của bạn như là một thành phần đối tượng của XAML, bạn có thể cho phép sử dụng những property cho các public property của Custom class của bạn điều này làm cho Custom class của bạn như là một kiểu property. Điều này bởi vì bây giờ đối tượng có thể được khởi tạo giống như một thành phần đối tượng và có thể xét thuộc tính cho nó như là một property

4.3 Yêu cầu đối với sự kiện trong XAML đối với Custom class

Để sử dụng cú pháp theo kiểu thuộc tính để tương tác với sự kiện trong XAML, sự kiện phải được public trong class mà hỗ trợ constructure mặc định, hoặc sự kiện phải được định nghĩa trong class trừu tượng và sau đó sự kiện có thể truy cập được qua những class kế thừa.

5 XAML và Type Converter

6 Layout

Khi bạn xây dựng ứng dụng Silverlight, một trong những điều bạn cần làm đầu tiên đó là việc sẽ bố trí giao diện đồ họa của bạn như thế nào. Silverlight cung cấp cho bạn 3 kiểu bố trí khác nhau, đó là: Canvas, StackPanelGrid.

6.1 Canvas

Định nghĩa một khu vực mà trong đó bạn có thể chỉ ra vị trí của từng đối tượng thành phần bằng cách sử dụng các tọa độ tham chiếu. Bạn có thể sử dụng lồng các Canvas với nhau và những thành phần bên trong của Canvas phải là một UIElement. Trong nhiều trường hợp thì Canvas chỉ đóng vai trò như một đối tượng để chứa đựng những đối tượng khác và không có một thuộc tính hiển thị nào. Một Canvas sẽ không được hiển thị nếu nó có một trong những thuộc tính sau đây:

- Thuộc tính Height xét giá trị 0

- Thuộc tính Width xét giá trị 0

- Background bằng null hoặc là Nothing ở VS Basic

- Opacity xét giá trị 0

- Visibility bằng Visibility.Collapsed

- Một trong những Canvas ở mức độ cao hơn (parrent) của nó không được hiển thị.

Ví dụ dưới đây chỉ ra là hình chữ nhật được cách trái 30 pixels và cách trên 30 pixels

<Canvas Width="640" Height="480" Background="White">
  <Rectangle Canvas.Left="30" Canvas.Top="30" Fill="red" Width="200" Height="200" />
</Canvas>

clip_image002

6.2 StackPanel

Sắp xếp những thành phần bên trong nó thành một dòng và có thể hiển thị theo hai kiểu ngang hoặc là dọc. Giá trị mặc định được gán chọ thuộc tính Orientation là chiều dọc (Vertical) và giá mặc định được xét cho hai thuộc tính HorizontalAlignmentVerticalAlignmentStretch

Ví dụ dưới đây hướng dẫn cách tạo những những đối tượng trong StackPanel

<StackPanel Margin="20">
  <Rectangle Fill="Red" Width="50" Height="50" Margin="5" />
  <Rectangle Fill="Blue" Width="50" Height="50" Margin="5" />
  <Rectangle Fill="Green" Width="50" Height="50" Margin="5" />
  <Rectangle Fill="Purple" Width="50" Height="50" Margin="5" />
</StackPanel>

clip_image003

6.3 Grid

Định nghĩa dạng lưới phức tạp bao gồm những dòng và cột. Mặc định Grid chứa một cột và một dòng. Để định nghĩa nhiều cột hoặc dòng chúng ta dùng ColumnDefinitionsRowDefinitions. Mỗi ColumnDefinitionRowDefinition trong ColumnDefinitionsRowDefinitions xác định một dòng hoặc cột. ColumnDefinitionRowDefinition cũng định nghĩa kích thước của mỗi cột và dòng sử dụng đối tượng GridLength

Ví dụ: Dưới đây là ví dụ dùng Grid để lên một thiết kế giao diện cơ bản.

<Grid x:Name="LayoutRoot" Background="#DCDCDC" Width="400" Height="300" ShowGridLines="True">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="250" />
    <ColumnDefinition Width="150" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="2*" />
    <RowDefinition Height="*"/>
  </Grid.RowDefinitions>
  <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10" FontWeight="Bold" Text="Contoso Corporation" HorizontalAlignment="Center" VerticalAlignment="Center" />

  <Grid x:Name="FormLayoutGrid" Grid.Row="1" Grid.Column="0" ShowGridLines="True">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0" Grid.Column="0" Text="First Name" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Center" />
    <TextBox Grid.Row="0" Grid.Column="1" Margin="10" />
    <TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Center" />
    <TextBox Grid.Row="1" Grid.Column="1" Margin="10" />
    <TextBlock Grid.Row="2" Grid.Column="0" Text="Address" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Center" />
    <TextBox Grid.Row="2" Grid.Column="1" Margin="10" />
  </Grid>
</Grid>

Thêm vào một vài đối tượng qua code-behind C#

public Page()
    {
        InitializeComponent();
        LayoutDesign();
    }

    private void LayoutDesign()
    {
        //Tạo  Stackpanel cho ListBox Control
        StackPanel DeptStackPanel = new StackPanel();
        DeptStackPanel.Margin = new Thickness(10);

        LayoutRoot.Children.Add(DeptStackPanel);
        Grid.SetColumn(DeptStackPanel, 1);
        Grid.SetRow(DeptStackPanel, 1);

        TextBlock DeptListHeading = new TextBlock();
        DeptListHeading.Text = "Department";

        ListBox DeptList = new ListBox();
        DeptList.Items.Add("Finance");
        DeptList.Items.Add("Marketing");
        DeptList.Items.Add("Human Resources");
        DeptList.Items.Add("Payroll");

        DeptStackPanel.Children.Add(DeptListHeading);
        DeptStackPanel.Children.Add(DeptList);

        //Tạo StackPanel cho các nút
        StackPanel ButtonsStackPanel = new StackPanel();
        ButtonsStackPanel.Margin = new Thickness(10);
        ButtonsStackPanel.Orientation = Orientation.Horizontal;
        ButtonsStackPanel.HorizontalAlignment = HorizontalAlignment.Center;

        LayoutRoot.Children.Add(ButtonsStackPanel);
        Grid.SetColumn(ButtonsStackPanel, 0);
        Grid.SetRow(ButtonsStackPanel, 2);
        Grid.SetColumnSpan(ButtonsStackPanel, 2);

        Button BackButton = new Button();
        BackButton.Content = "Back";
        BackButton.Height = 30;
        BackButton.Width = 100;

        Button CancelButton = new Button();
        CancelButton.Content = "Cancel";
        CancelButton.Height = 30;
        CancelButton.Width = 100;

        Button NextButton = new Button();
        NextButton.Content = "Next";
        NextButton.Height = 30;
        NextButton.Width = 100;

        ButtonsStackPanel.Children.Add(BackButton);
        ButtonsStackPanel.Children.Add(CancelButton);
        ButtonsStackPanel.Children.Add(NextButton);

        BackButton.Margin = new Thickness(10);
        CancelButton.Margin = new Thickness(10);
        NextButton.Margin = new Thickness(10);
    }
}
 clip_image004

Đây là bài giảng về SilverLight của nhóm lập trình viên SilverLight của công ty Infoway, thành viên của chương trình BizSpark, thực hiện tại trung tâm Microsoft Innovation Center tại Hà nội.

CHƯƠNG I:

TỔNG QUAN VỀ SILVERLIGHT

1 Vì sao lại có Silverlight?

Sự khó khăn của các doanh nghiệp khi xây dựng chiến lược Web

Ngày nay khi phát triển các ứng dụng trên web các doanh nghiệp phần mềm thường đau đầu với những khó khăn về sự hỗ trợ trên trình duyệt và hệ điều hành. Điều họ muốn là với những ngôn ngữ và công cụ phát triển đã vốn quen thuộc từ trước đến giờ đều có thể làm cho họ những ứng dụng chạy tốt trên mọi nền tảng, mọi trình duyệt. Silverlight ra đời như một công nghệ phù hợp cho phép họ làm được những việc như thế. Nếu bạn đã quen thuộc với công nghệ .Net Framework thì khi tiếp cận với Silverlight bạn sẽ tích kiện được rất nhiều thời gian và chi phí cho công nghệ web mới

Nhu cầu cần thiết của thế giới đa phương tiện

Các công nghệ plug-in trên web trước đây không cho phép bạn truyền tải những dữ liệu hình ảnh chất lượng cao như 720p HDTV, Trong khi chất lượng đường truyền mạng ngày nay đang ngày càng tốt hơn và nhu cầu được xem những video chất lượng cao cũng tăng lên thì sự ra đời của Silverlight đã đem đến cho người đam mê thế giới đa phương tiện một sự thỏa mãn thật sự.

2 Silverlight là gì?

Silverlight là một dạng plug-in dựa trên công nghệ của Microsoft .Net, nó độc lập với đa nền tảng và đa trình duyệt, nó cho phép phát triển các ứng dụng đa phương tiện đặc biệt là các ứng dụng trên web. Silverlight cung cấp một mô hình lập trình lập trình mềm dẻo và đồng nhất, nó hỗ trợ Ajax, Python, Ruby và các ngôn ngữ lập trình .Net như Visual basic, C#.
Khả năng đa phương tiện của silverlight thể hiện ở mức độ truyền tải âm thanh và hình ảnh chất lượng cao một cách nhanh chóng và hiệu quả trên tất cả các trình duyệt chính như Internet Explorer, Firefox, Safari.

clip_image001
Với việc sử dụng Expression Studio và Visual Studio, các nhà thiết kế và phát triển có thể hợp tác một cách hiệu quả hơn bằng cách sử dụng chính kỹ năng của họ có hiện nay để làm phát triển các sản phẩm web tương lai “Light up the web”.

3 Các đặc tính của Silverlight

Silverlight kết hợp nhiều công nghệ vào một nền tảng phát triển, nó cho phép bạn được lựa chọn nhiều công cụ và ngôn ngữ lập trình thích hợp để giải quyết bài toán của bạn. Silverlight cung cấp các tính năng sau:

3.1 Sự kết hợp của WPF và XAML.

Silverlight là một gói nhỏ của công nghệ Windows Presentation Foundation (WPF). Nó được mở rộng nhiều hơn các Element trong trình duyệt để tạo giao diện người dùng. PWF cho phép bạn tạo ra đồ họa 3 chiều, hình ảnh động, đa phương tiện và nhiều tính năng phong phú khác trên máy khách. XAML (Extensible Application Markup Language) cung cấp các cú pháp đánh dấu đặc trưng cho việc tạo các Element.

3.2 Mở rộng cho ngôn ngữ kịch bản

Silverlight cung cấp việc mở rộng cho các ngôn ngữ kịch bản (Javascript) ở một số các trình duyệt phổ biến để thể hiện việc trình bày giao diện và thao tác người dùng một cách phong phú hơn.

3.3 Sự tích hợp với các ứng dụng đã có

Silverlight tích hợp liền mạch với ngôn ngữ javascript và mã Ajax của ASP.Net để bổ sung các chức năng bạn đã xây dựng được. Bạn có thể tạo những tài nguyên trên nền máy chủ có trong ASP.NET và sử dụng các khả năng của Ajax trong ASP.NET để tương tác với tài nguyên trên nền máy chủ đó mà không làm gián đoạn người dùng.

3.4 Sử dụng mô hình ngôn ngữ lập trình trên nền tảng .Net Framework và các công cụ để kết hợp.

Bạn có thể tạo các ứng dụng trên nền tảng Silverlight và sử dụng các ngôn ngữ động như InronPython cũng như là các ngôn ngữ C# và Visual Basic. Bạn cũng có thể sử dụng các công cụ phát triển như Visual Studio để tạo ứng dụng trên nền tảng Silverlight

3.5 Hỗ trợ mạng

Silverlight bao gồm các hỗ trợ cho HTTP qua TCP. Bạn có thể kết nối tới các dịch vụ của WCF, SOAP, hoặc ASP.NET AJAX và nhận về các định dạng theo cấu trúc XML, JSON hay dữ liệu RSS.

3.6 Hỗ trợ ngôn ngữ tích hợp truy vấn (LINQ)

Điều này cho phép bạn truy cập dữ liệu bằng cách sử dụng cú pháp trực quan tự nhiên và mạnh mẽ, được gõ bởi các đối tượng có trong các ngôn ngữ .Net Framework.

4 Kiến trúc tổng thể và các mô hình lập trình của Silverlight

4.1 Kiến trúc và các thành phần

Về cơ bản Silverlight là một nền tảng thống nhất của nhiều thành phần khác nhau. Tuy nhiên chúng tôi nhóm lại các thành phần chính của silverlight vào bảng dưới đây.

Thành phần

Diển tả

Nền tảng trình bày cơ sở

Các thành phần và dịch vụ hướng tới giao diện người dùng và tương tác người dùng, bao gồm các control cho dữ liệu cho người dùng nhập, thiết bị đa phương tiện, quản lý phân quyền số, trình bày dữ liệu, đồ họa vector, chữ, hình ảnh động. cũng bao gồm XAML để đặc tả việc bố trí giao diện

.Net Framework cho silverlight

Là một gói nhỏ trong .Net Framework, bao gồm các thành phần và cá thư viện, kể cả tương việc tương tác dữ liệu, khả năng mở rộng các control, mạng, garbage collection, và CLR

Cài đặt và cập nhật

Là thành phần để sử lý các tiến trình cài đặt làm sao để đơn giản hóa cho lần cài đặt đầu tiên, tiếp sau đó chỉ cung cấp cơ chế tự động cập nhật và tương tác ở mức thấp.

Dưới đây là hình ảnh mô tả những thành phần trong kiến trúc của Silverlight cùng với các thành phần và dịch vụ liên quan khác.

clip_image003

Core Presentation Components:

Tính năng

Mô tả

Dữ liệu vào (input)

Xử lý dữ liệu đầu vào từ các thiết bị phần cứng như bàn phím, chuột, bảng vẽ hoặc các thiết bị đầu vào khác

Trình bày giao diện người dùng (UI Rendering)

Trình bày vector và các đồ hoạ ảnh bitmap, ảnh động, và văn bản

Thiết bị nghe nhìn (Media)

Các tính năng phát và quản lý một vài thể loại file âm thanh và hình ảnh như .WMP và .MP3

Controls

Hỗ trợ mở rộng cho các control để có khả năng tùy chỉnh về kiểu dáng và khuôn mẫu

Xếp đặt Layout

Cho phép khả năng xếp đặt vị trí động các thành phần giao diện người dùng

Trình bày dữ liệu

(Data Binding)

Cho phép việc kết nối dữ liệu của các đối tượng và các thành phần giao diện người dùng

DRM

Khả năng Quản lý phân quyền số

XAML

Cung cấp trình phân tách cho XAML

Các lập trình viên có thể tương tác với thành phần nền tảng trình bày cơ sở trên đây bằng cách sử dụng XAML để đặc tả. XAML là một yếu tố quan trọng nhất trong việc tương tác giữa .Net Framwork và các kiểu trình bày Layout, ngoài ra các lập trình viên cũng có thể sử dụng cơ chế quản lý code bên trong để thao tác với lớp trình bày

.Net Frame work for Silverlight:

Tính năng

Mô tả

Data

Hỗ trợ ngôn ngữ truy vấn tích hợp (LINQ) và LINQ với đặc tả XML, dễ dang xử lý việc tích hợp và làm việc với dữ liệu từ nhiều nguồn khác nhau. Hỗ trợ việc sử dụng XML và các lớp biên đổi hóa (serialization) để xử lý dữ liệu

Base class library

Thuộc thư viện của .Net Framework, nó cung cấp các chức năng lập trình chủ yếu như việc xử lý chuỗi, biểu thức chính quy, đầu vào và đầu ra, ánh xạ, tập hợp và toàn cục hóa.

Window Communication Foundation

(WCF)

Cung cấp các tính năng để đơn giản hóa việc truy cập dữ liệu từ xa. Cơ chế này bao gồm một đối tượng trình duyệt, HTTP request và HTTP Response, RSS, JSON, POX, và các SOAP

Common language runtime
(CLR)

Cung cấp việc quản lý bộ nhớ, dọn dẹp bộ nhớ thừa, xử lý ngoại lệ…

Windows Presentation Foundation controls

(WPF)

Cung cấp các control giầu tính năng như Button, Calendar, CheckBox, DataGrid, DatePicker, HyperlinkButton, ListBox, RadioButton, and ScrollViewer.

Dynamic language runtime

(DLR)

Hỗ trợ việc biên dịch và thi hành với tính năng động của các ngôn ngữ kịch bản như Javascript và IronPython cho các chương trình trên nền tảng Silverlight.

4.2 Các mô hình lập trình của silverlight

Ở phiên bản Silverlight 1.0 cung cấp cho bạn duy nhất một mô hình lập trình là Javascript API, cho đến phiên bản Silverlight 2.0 đã cung cấp cả hai mô hình lập trình là Managed API và Javascript API. Trong khi Javascipt API chỉ cho phép bạn gõ mã lệnh Javascript để tương tác với trình duyệt thì Managed API đã sử dụng được cơ chế làm việc của Common Language Runtime (CLR) và kể cả Dynamic Language Runtime (DLR) để biên dịch và thi chương trình code (C#, VB…) của bạn.

4.2.1 Javascript API

Trong một chương trình silverlight nhúng theo kiểu Javascript API, nó tải chỉ một trang XAML đơn lẻ thay vì tải một gói ứng dụng. Trang XAML này có thể bao gồm các tham chiều URI từ những nguồn bên máy chủ khác như là các đoạn video và hình ảnh. Silverlight nhúng sử dụng XAML để tạo một cây đối tượng cái mà bạn có thể thao tác lập trình với javascript lưu trữ bên trong một trang HTML
Javascript API không cung cấp một mô hình ứng dụng có khả năng hỗ trợ các ứng dụng tổ hợp với sự điều hướng bên trong. Tuy nhiên nó cho phép làm những kịch bản theo kiểu Splash screan. Bạn cũng có thể làm các sự điều hướng trong Javascript API bằng cách tải lại trang XAML mới hoặc tải lại cả trang web đó trong trình duyệt.

4.2.2 Managed API

Trong lập trình silverlight theo kiểu Managed API, bạn có thể thao tác lập trình với cả file XAML và file code bên trong.
Khi một Silverlight nhúng tải file XAML, nó sẽ tạo một cây mô hình cái mà bạn cũng có thể gõ bằng các mã lệnh bên trong ( thường là C#, Visual basic…).

5 Khả năng hỗ trợ trình duyệt, hệ điều hành và các công nghệ liên quan

5.1 Hỗ trợ của hệ điều hành và trình duyệt được mô tả ở bảng dưới đây

Operating system

Internet Explorer 7

Internet Explorer 6

Firefox 1.5, 2.x, and 3.x

Safari 2.x and 3.x

Windows Vista

Windows XP SP2

Windows XP SP3

Windows 2000

Windows Server 2003 (excluding IA-64)

Mac OS 10.4.8+ (PowerPC)

Mac OS 10.4.8+ (Intel-based)

5.2 Các công nghệ và công cụ liên quan của silverlight.

Microsoft Expression Blend: Sử dụng công cụ này bạn bạn có thể tạo và thay đổi cách xắp xếp trình bày Layer của ứng dụng bằng cách thao tác đến canvas và control trong XAML, làm việc với các chức năng đồ họa, Lập trình với ngôn ngữ Javascript.

Visual Studio 2008: Visual Studio cung cấp các công cụ hiệu quả cho việc phát triển các ứng dụng có hỗ trợ thao tác code bên tron. Tất cả các phiên bản đã có của Visual Studio đều có khả năng hỗ trợ Silverlight,Tuy nhiên ở phiên bản mới này nó còn hỗ trợ các tính năng đặc biệt hơn như bao gồm khả năng IntelliSense, debugging và các template cho việc tạo mới một ứng dụng Silverlight.

ASP.NET AJAX: Bao gồm tập các Control, Service, và các thư viện cần thiết cho việc tạo và tương tác với nền ứng dụng web

Microsoft ASP.NET 3.5 Extensions Preview: Công nghệ này cung cấp chức năng thêm để việc tăng cường các ứng dụng ASP.NET AJAX. Nó bao gồm 2 control sử dụng hữu ích cho việc xây dựng ứng dụng nền tảng silverlight cũng như là một phần của ứng dụng ASP.NET:

- ASP.NET MediaPlayer Server Control

- ASP.NET Silverlight Server Control

Internet servers: Bao gồm IIS (Microsoft Internet Information Services), và Apache Web server

Microsoft Windows Communication Foundation (WCF) services.

6 Hướng dẫn cài đặt và sử dụng công cụ Silverlight 2 trên Visual studio 2008

6.1 Các bước cài đặt công cụ silverlight 2

- Tải file Silverlight_Tools.exe có trên trang: http://www.microsoft.com/downloads/details.aspx?familyid=C22D6A7B-546F-4407-8EF6-D60C8EE221ED&displaylang=en

- Bạn phải chắc chắn rằng máy tính của bạn đã cài đặt Visual Studio 2008 SP1

- Chạy file Silverlight_Tools.exe, chờ khoảng 1 phút để hiện thị Silverlight tools installation Winzard
clip_image005

- Bấm next để đến bước 2, tích chọn “I have read an accept the license terms”.

- Bấm Next để hệ thống tự động kiểm tra tương thích( lưu ý: phải đóng hết các trình duyệt web)

- Để hệ thống cài đặt và hoàn thành
clip_image007

7 Các ví dụ thực hành

7.1 Chương trình đầu tiên “Hello World”

- Tạo mới một Project: chọn File -> New -> Proeject
clip_image009

- Một cửa sổ mới “New Project” hiển ra. Chọn Visual C# (hoặc Visual basic) trong Project types, chọn Silverlight. Phía bên phải cửa sổ cho phép bạn chọn các Templale

clip_image011

- Chún ta chọn Silverlight Application trong Templates

- Đặt tên chương trình đầu tiên là “HelloWorld”, tùy chọn Location, bấm OK

- Bạn có thể chọn Project Type theo mặc định trong hội thoại Add Silverlight application, bấm OK

- Solution mới được tạo ra với 2 project: Silverlight project và web project( dùng để nhúng silverlight tạo bởi silverlight project)
clip_image013
Trong thư mục ClientBin của web project (HelloWorld.Web) chứa ứng dụng silverlight được đóng gói dưới dạng file HelloWorld.xap của project silverlight (HelloWorld)

clip_image015
Toàn bộ màn hình ứng dụng đầu tiên của bạn được nhìn thấy như sau

- Chúng ta làm 2 phương pháp một là viết code C# trong code ứng dụng, hai là viết trực tiếp trong XAML

7.1.1 Viết chương trình bằng Code C#

- Trong file Page.xaml.cs chúng ta bắt đầu với việc tạo một nút theo những dòng lệnh dưới đây

// Khai bao button
Button myButton;
public Page()
{
    InitializeComponent();
    // Khởi tạo button
    myButton = new Button();
    //Xác định các thuộc tính cho myButton
    myButton.Content = "Click Me";
    myButton.Height = 25;
    myButton.Width = 100;
    myButton.Margin = new Thickness(10, 10, 0, 0);            
    //Đưa myButton vào LayoutRoot
    LayoutRoot.Children.Add(myButton);

- Để tạo sự kiện cho một nút chúng ta cần thêm những dòng lệnh sau vào

//thêm phương thức xử lý sự kiện cho myButton
 myButton.Click += new RoutedEventHandler(myButton_Click);
void myButton_Click(object sender, RoutedEventArgs e)
{
//Hiển thị thông điệp trên trình duyệt
    System.Windows.Browser.HtmlPage.Window.Alert("Hello Silverlight World!");
}

- Bấm F5 để chạy chương trình

7.1.2 Viết chương trình bằng XAML

Lưu ý, với cùng project trên, muốn viết đặc tả bằng XAML tương đương ta cần xóa bỏ phần mã trình C# cũ đi, vì C# và XAML không thể cùng sinh một đối tượng.

Trong file Page.xaml ta thêm đoạn mã sau:

   1: <UserControl x:Class="HelloWorld.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   2: Width="400" Height="300">
   3:   <Grid x:Name="LayoutRoot" Background="White">
   4:     <Button Name="myButton" Content="Click me" Width="100"Height="25"></Button>
   5:   </Grid>
   6: </UserControl>

- Gán sự kiện xử lý khi click
clip_image017

- Bấm F5 để chạy ứng dụng. Cả hai phương thức viết trên đều cho ra một kết quả như hình vẽ sau
clip_image019

8 Tài liệu tham khảo

- Silverlight Deverloper center: http://msdn.microsoft.com/en-us/library/bb404708(VS.95).aspx

- Website chính của Silverlight: http://silverlight.net/

SharePoint 2007 Virtual Lab
Thay vì phải cài bạn có thể thực hành qua mạng Internet

SharePoint on Channel9
Video về SharePoint 2007 cùng với các công nghệ liên quan phụ trợ trên kênh Channel9

http://www.sharepoint-screencasts.com/
Trang này có một số screen cast miễn phí và thu phí

 

Tôi sẽ liên tục cập nhất thêm các địa chỉ hữu ích khác về SharePoint. Bạn nào có các nguồn thông tin khác về SharePoint hãy cùng chia xẻ nhé.

Sau khi các bạn có thể dùng SharePoint Designer 2007 để thay đổi giao diện portal bằng SharePoint, bước tiếp theo là chúng ta sẽ phải lập trình sâu hơn sử dụng Visual Studio 2008 Team System để lập trình web part, workflow,…. Để cho việc lập trình trở nên đơn giản chúng ta cần có một số đồ nghề giúp việc lập trình đơn giản hơn đó là:

SharePoint Server 2007 SDK: Software Development Kit
Download tại đây 165Mb

Windows SharePoint Services 3.0: Software Development Kit (SDK)
Download tại đây 41.2Mb

Visual Studio 2008 extensions for Windows SharePoint Services 3.0, v1.3 - Feb 2009 CTP
Download tại đây

Lưu ý bản VSeWSSv13_x86_Feb2009CTP_Build_429.exe không chạy được trên Windows Server 2008 64 bit
Bản VSeWSSv13_AMD64_Feb2009CTP_Build_429.exe chạy được trên Windows Server 2008 64 bit

 

Happy Coding

Hiện giờ tôi đang đọc quyển “Pro SharePoint 2007 Development Techniques” của Margriet Bruggeman và Nikander Bruggeman cùng các video training về SharePoint. Cứ khoảng 3-4 ngày, mời bạn quay lại blog của tôi để xem tôi cập nhật về các bước đơn giản để lập trình, mở rộng SharePoint.

SharePoint

Ngày 25/03/2009 tôi giảng về lập trình SilverLight 2.0 và 3.0beta tại văn phòng Microsoft tại tp HCM. Số lượng người tham dự: 70-75

Ngày 26/03/2009 tôi giới thiệu căn bản lập trình WCF 3.5.net. Số lượng người tham dự 80.  Do số lượng người tham dự quá đông mà số nghế trong văn phòng mặc dù đã huy động các loại ghế những vẫn không đủ. Một số bạn đã phải về. Tôi xin chân thành xin lỗi về sơ xuất trong khâu tổ chức.

Trong seminar WCF, tôi trình bày một số ý:

- Nhắc lại ASP.net web service ASMX thời .net 2.0

- Ưu điểm của WCF: Unified Model, Less Learning Curve, XML config

- Mô hình Address, Binding, Communication thống nhất cho hầu hết các kiểu truyền thông

- Các loại giao kèo Contracts: Service Contract, Operation Contract, Data Contract, Fault Contract, Message Contract

- One Way operation vs Request- Response

- Trong Request- Response có 2 kiểu: Synchronous vs Asynchronous. Với Asynchronous, bạn cần phải chuẩn bị một hàm hứng sự kiện lúc service trả về kết quả.

- Duplex: Symmetric – Đối xứng, Asymmetric-Phi đối xứng. Có thể dùng 2 binding khác nhau cho 2 kênh của Duplex.  Đơn giản hơn cả là dùng wsDualHttpBinding

- Service Behaviors:

Concurrent: Single, Multi-thread, Reentrant

Instance Mode: Single, per Call, per Session

Custom Bindíng

One service chứa nhiều endpoints: Ví dụ chỉ dùng một dịch vụ nhưng cho phép SilverLight client kết nối qua basicHttpBinding và WPF client kết nối qua wsHttpBinding.
Ví dụ lập trình Gadget bằng HTML, JavaScript kết nối với WCF service. Dịch vụ WCF service phải có binding webHttpBinding và behavior= enableWebScript để trả về JSON data.

 

Link download slide và mã nguồn 3Mb

Hẹn gặp lại các bạn trong buổi seminar tới. Tôi có thể làm về WorkFlow foundation hoặc Windows Presentation Foundation.

 

Happy Coding !

WebMixNgày 19/03/2009, tại hội nghị lớn nhất trong năm, WebMiX 09, cho các lập trình viên web sử dụng công nghệ Microsoft tại Venetian, Las Vegas, SilverLight 3.0 beta và Microsoft Expression Blend 3.0 beta được giới thiệu.

SilverLight 3.0 beta có thêm 50 tính năng mới quan trọng như High Definition Video and Audio encoding, true HD video streaming, giả lập 3D (3D Perspective), đổ bóng điểm ảnh (Pixel Shader), BitMap Caching, phong cách giao diện (Theme Support) thay đổi khi chạy, định nghĩa theo nhiều lớp (Cascading), bộ 60 control mới cùng source code trong SilverLight Toolkit 3.0, các tính năng hỗ trợ lập trình ứng dụng doanh nghiệp: binding (kết nối 2 chiều từ giao diện với dữ liệu), data form, phân trang (pagination)…..

Blend 3.0 beta, cho phép nhập các file Adobe Illustrator Photoshop, ghi chú khi thiết kế (Annotation), vẽ phác (Sketch) …

Đường link download ở đây http://silverlight.net/getstarted/silverlight3/default.aspx

Download SilverLight Toolkit 3.0 ở đây http://www.codeplex.com/Silverlight

Download Slide bài trình bày của tôi: Programing SilverLight 2+1. Source code khoảng 2GB, mọi người liên hệ em Giang để copy nhé. Email của Giang v-ginguy<acong>microsoft dot com

Ảnh buổi thảo

Sau đó một ngày, ngày 20/03/2009, anh em lập trình viên và thiết kế web tại Hà nội đã tham dự một buổi hội thảo lập trình SilverLight 2.0 và giới thiệu các tính năng mới của SilverLight 3.0 tại văn phòng Microsoft Việt nam. Ban đầu, tôi chỉ dự định trình bày các kỹ năng từ cơ bản XAML đến nâng cao SandBox, Multi-thread, giả lập 3D, các kỹ thuật animation cơ bản, Deep Zoom, Video Encoder… trên SilverLight 2.0. Tuy nhiên SilverLight 3.0 beta có tới những hơn 50 tính năng mới, bộ SilverLight Toolkit 3.0 có hàng loạt những control, theme mới đẹp long lanh, Tôi không thể cưỡng lại sự tò mò nên đã dành cả đêm 19/03/2008 để lập trình thử nghiệm SilverLight 3.0 và Blend 3.0 beta. Kết quả rất yên tâm, không một ví dụ nào từ SilverLight 2.0 chuyển lên 3.0 bị lỗi. Trong 12 tiếng lập trình thử liên tục, tôi chỉ gặp 2 vấn đề đó là khi Add service reference tới SilverLight enabled WCF service thì bị lỗi, (lỗi này hoàn toàn dễ dàng khắc phục bằng cách tạo WFC Service và đổi binding từ wsHttpBinding sang basicHttpBinding), ngoài ra lúc dùng kéo thả Wrap Pannel biên dịch thì được, nhưng lúc chạy báo lỗi do assembly System.WindowsControl không chứa Wrap Panel. Tóm lại, SilverLight 3.0 và Blend 3.0 beta chơi được, rất đáng để thử nghiệm. Tôi quyết định demo luôn bằng SilverLight 3.0 và Blend 3.0 beta tại hội thảo.

Trong buổi hội thảo, tôi demo khoảng 30 chương trình mẫu, trong khi slide PowerPoint của tôi chỉ trên 65 trang một chút. Nhiều ví dụ do chính tay tôi lập trình phần còn lại là của Jeff Prosise, Mike Snow, Tim Heure, Jess Liberty, Shine Draw….

SilverLight01 SilverLight02

 SilverLight03 SilverLight04

Số lượng người đăng ký trực tuyến để dự hội thảo là trên 100 người. Số người đến dự khoảng 75-80 người, trong khi sức chứa tối da của phòng hội thảo là 60 người. Chỉ có 4 người bỏ về sau giờ giải lao do công việc bận, còn lại đều ở lại đến phút cuối để tìm hiểu tường tận từng chức năng mới, cũng như nhưng công nghệ liên quan như: REST, JSON, Data Binding, LINQ…

Câu hỏi mà tôi chưa trả lời được: làm sao để kết nối dịch vụ WCF Service có bảo mật, mã hoá chứ không dùng chuẩn SOAP 1.1 và basicHttpBinding như hiện này. Tôi sẽ tìm hiểu và trả lời trong một ngày gần đây sau khi đi công tác HCM về. Ý tưởng kỳ quặc nhất mà tôi nghe được trong hội thảo đó là có thể tạo một SilverLight custom control text box hiển thị chữ gõ vào theo hình tròn hoặc hình bất kỳ uốn lượn run dế chả hạn. Câu trả lời của tôi là được, bởi vì bản chất control trong SilverLight và WPF là look less. Chúng ta có thể áp đặt, định nghĩa lại, thay đổi hình thù của control mềm dẻo, dễ dàng hơn rất nhiều so với control của Windows Form, ActiveX hay của MFC control.

Một tiết lộ nhỏ mà bây giờ tôi mới viết là tôi học lập trình SilverLight cách đây khoảng 2-3 tuần gì đó. Không phải ngày nào tôi cũng có thể dành chọn thời gian để học vì công việc cơ quan, việc gia đình,… chen ngang nhiều quá. Chỉ có đêm trước hội thảo là một đêm lập trình thăng hoa đến tận 2 giờ sáng. Những cái tôi sử dụng cho hội thảo toàn là những cái có sẵn trên mạng hoặc có thể tự mày mò lập trình không có gì là cao siêu cả :)

Ngoài trừ một điểm là SilverLight 2.0 và 3.0 beta chưa chính thức hỗ trợ Tween Motion, còn lại tôi cảm thấy  hài lòng với SilverLight 3.0 beta và đủ tự tin để viết các loại ứng dụng multimedia, giao diện… trên SilverLight 3.0

 

Happy Coding!

Trong tháng 4 tới đây, tôi sẽ đào tạo một số công nghệ:

- Windows Presentation Foundation. Công nghệ này rất hay. Nhưng ở Việt nam, nó im lìm quá. Mọi người có lẽ đã quá hài lòng với Windows Form rồi.

- ASP.net MVC cái này thì tôi không chắc chắn vì nó mới ở bản beta. Dạy xong không biết bà con có dùng hay không.

- Lập trình C++ trên Visual Studio 2008. Sử dụng VC++ để lập trình các ứng dụng cần performance cao, can thiệp sâu vào phần cứng, phát triển ứng dụng cho mobile…. Đây là đề tài tôi ấp ủ từ lâu, nhưng hình như ở VN bây giờ, bà con quên C++ mất rồi :(

Tối qua tôi đã cài SharePoint 2007 Enterprize Edition trên máy chủ Windows Server 2008 64bit tại nhà riêng. Mọi thứ diễn ra cực kỳ xuôn sẻ, không một lỗi phát sinh. Tôi sẽ bắt đầu lập trình trên SharePoint và sau đó có thể làm một buổi seminar về các kiểu lập trình trên SharePoint.

Chiều nay, tôi mới đi mua một số dụng cụ làm mộc của Bosch ở Melinh Plaza. Khi nào rảnh sẽ đóng các loại đồ mộc trong nhà. Lập trình mãi cũng cần phải lao động chân tay một tý vui. So với mua đồ gỗ đóng sẵn, dù đẹp hơn nhưng không phải do mình làm ra, không khoái.

Máy cưa đĩa GKS 190, chuyên cưa gỗ thẳng. Sản xuất tại Trung Quốc. Giá có 1.3 triệu, ở ngoài giá khoảng 1.5 đến 1.8 triệu.

Máy cưa lỏng PST 750 PE, sản xuất tại Thụy Sỹ. Giá 2.3 triệu.

BoschGKS190 Bosch PST 750 PE

http://blogs.msdn.com/saraford/archive/2009/03/16/how-i-learned-to-program-manage-an-agile-team-after-6-years-of-waterfall.aspx

Trong bài này Sara Ford chia xẻ những kinh nghiệm của bản thân khi chuyển sang quản trị dự án theo phương pháp Agile trong dự án CodePlex sau 6 năm làm việc với Water Fall. Vài điểm cần lưu tâm từ bài viết này:

  • One week iterations
  • Test driven development
  • Continuous integration
  • Pair programming
  • Shared workspace
  • Collective ownership of codebase among devs

1. Design and plan for the very next step, instead of designing and planning for the very next feature.

In traditional product groups, specifications can be as long as 60 pages. Every scenario must be known at design time and figured out, because you only get one shot of getting it right. The analogy here is firing a gun. You could spend a significant amount of time planning, calculating, aiming to achieve the perfect shot. Or using the agile approach, you could aim and fire, recalculate aim and fire, recalculate aim and fire. You could say that traditional product groups do this to some extent, but a few years is a long time to wait for a recalculated shot.

….

2. Break down work into smallest possible sets. Adding work is fun and rewarding; removing work is painful and risky.

Maybe it was light bulb moment #1 going off that enabled the “on” switch for light bulb #2.Towards the end of last summer, I was so exhausted from the book, trying to figure out agile, doing major speaking events, and of course not to mention promoting open source within Microsoft, I decided to “give up” for one particular release and just do the minimum amount of work possible to get the deployment out. I was just too exhausted to worry about enduring the potential wraith of my manager (see #4) for deploying such a small amount of work.

And of course, it turned out that was the ideal amount of feature work for the deployment. I discovered this simply based on the number of bugs that had to be fixed in the 3rd week of the cycle, and how there was no feature work that needed to be carried over to the next deployment cycle. In other words, when I finally “failed” in the traditional program management sense, agile clicked for me. And people wonder why I’m a nervous wreck all the time (see #4).

And to explain the second half of this light bulb moment: If there were any feature work we couldn’t squeeze in, it had to be carried over, but yet it wasn’t “planned” this way. Then it was a question of do we finish a half-written feature, or do we pull it out, not fully understanding what other aspects of the feature sets it could affect in this state? We would have to make a best guess decision right before deployment.

Another analogy is like Legos. Break all the pieces down into 1x1 blocks. Then it is easy to plan, add, remove. But the larger the pieces, the more connection points, the more cost, the more complexity. I’m sure there’s some analogy to the connection points (the little bumps on the lego square) and writing the code, but I’m not a developer on an agile team, so I’ll leave that open to interpretation.

3. Design and plan 80% of the way as the very next step. Use feedback to solve the remaining 20% in the very next step after that.

Immediately after light bulb moment #2 clicked, I saw the very reason why agile rocks for customer quality. Using agile, you actually can recalibrate, aim, and fire in a time period that is reasonable for customers (compare 3 weeks to 3 years.)  I’m not talking about overall feature set comparison, but a comparison of the quality of the features being released. It was finally at this point in time I could allow myself (see #4) to take advantage of this “aim fire recalibrate repeat” concept by actually planning the recalibration time period. In other words, I could say “okay, we’re going to go with this, and based on feedback, we’ll tweak as needed in the next deployment.”

MVC framework đã được manh nha từ khi .NET 3.5 mới ra lò. Đây là câu trả lời của Microsoft cho cộng đồng lập trình viên Microsoft mong muốn có một công nghệ web ASP.net ổn định, ngôn ngữ lập trình C# mạnh, đa năng lại muốn có frame work Model View Controller như Ruby On Rails hay Django Python. Công nhận lập trình viên bây giờ tham thật:

Chân thành mà nói, tôi lập trình MVC trên Ruby On Rails nhiều hơn. Thấy nó đơn giản, dễ phát triển, ý như là gọi một lon Coca kèm bánh Hamburger ở tiệm ăn nhanh vậy. Tuy nhiên viết ứng dụng phức tạp lên những cái lập trình hơi hiểm một chút là rất vất vả. Nên khôn ngoan hơn cả là ta chờ ASP.net MVC ổn định rồi ta chuyển qua lập trình cho lành.

MVCBook

Quyển sách ASP.NET MVC 1.0 mà tôi định nói đến do nhóm tác giả Rob Connery, Scott Hanselman, Phil Hack và Scott Guthrie. Guthrie thì các bạn biết rồi, kiên trúc sư trưởng dự án ASP và ASP.net. Tay này mới sinh năm 1975 mà đã là một cao thủ võ lâm ở Microsoft.

Theo tôi biết Rob Connery chính là cha đẻ của ý tưởng viết một framework MVC cho ASP.net. Hồi đó Rob mới chỉ là lập trình viên tự do, (free-lance dev). Cùng với MVC framework, Rob xây dựng cả một ORM rất hay đó là SubSonic. Cơ chế là quét schema của CSDL rồi xây dựng lên tập các đối tượng collection trong .NET để truy vấn, sửa đổi dữ liệu. Chưa hết SubSonic tận dụng nhưng cú pháp mới nhất trong ngôn ngữ C# 3.0 như extension function, lamba expression để tạo nên cú pháp na ná LINQ bây giờ. Giờ thì Rob đã về Microsoft làm việc.

Scott Hanselman thì rất nổi tiếng với blog của mình về đủ loại công nghệ lập trình Microsoft. Tuy nhiên sở trưởng của Han vẫn là lập trình web.

Phil Hack thì là tác giả của dự án Blog SubText. Nghe nói một nhà cung cấp dịch vụ web 2.0 ở Trung Quốc đã lấy code của Hack để dựng nên một dịch vụ Blog cả mấy trăm người đăng ký. Hack chả được nhận một xu tiền nhuận bút. Cãi nhau chán, chú quay về Microsoft.

 

Tình hình là như vậy. Trên blog của Guthrie, có cho download một phần thực hành của quyển sách này dạng ebook. http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx

Tạm thế nhé, tớ đi ngủ đây. Happy coding and enjoy life!

Tôi rất thích đọc trang này, đúng là “học sách không bằng học blog”:

http://silverlight.net/blogs/msnow/archive/2009/01/02/silverlight-tips-of-the-day-summary-outline.aspx

 

Happy Coding SilverLight !

Trong Blog viết về SilverLight của mình, MikeSnow đã so sánh các phương pháp tạo Animation:

1- Sử dụng DispatcherTimer

2- Sử dụng StoryBoard

3- Sử dụng CompositionTarget.Rendering.

Xem link

Dispatcher Timer for Animation and Game Loops

Tác cho rằng :

- StoryBoard được vận hành ở một thread riêng biệt không bị ảnh hưởng bơi UI thread mà DispatcherTimer ở đó.

- Độ mịn (resolution) của nhịp đồng hồ DispatcherTimer  không bằng nhịp đồng hồ (timer) của StoryBoard.

- StoryBoard chạy ổn định hơn trong các môi trường hệ điều hành và web browser khác nhau.

(Xem thêm so sánh sự khác biệt giữa Timer và DispatcherTimer ở trang timer-vs-dispatchertimer-in-wpf/)

Trong bài viết sau đó, khi đã nâng cấp lên SilverLight 2. tác giả nói rằng thay vì dùng DispatcherTimer hay StoryBoard’s timer, chúng ta có cách mới : dùng CompositionTarget.Rendering để kích hoạt một hàm tạo hiệu ứng hoạt hình (thay đổi tọa độ, màu sắc, bóp méo, co, dãn..). Lưu ý CompositionTarget.Rendering được gọi ngay trước khi SilverLight vẽ lại các đối tượng trong composition tree.

Tôi có một máy tính Laptop cài Windows 7 và một máy chủ Windows Server 2008. Ở cơ quan tôi lập trình trên Laptop còn ở nhà tôi lập trình trên Windows Server 2008. Tôi cần đồng bộ tự động dữ liệu giữa 2 thư mục lập trình mà không cần dùng đến công cụ quản lý mã nguồn. SyncToy là một tiện ích rất hay của Microsoft cho phép đồng bộ giữa 2 thư mục nằm trên 2 máy tính.

Download SyncToy 2.0

Để đồng bộ, ở máy remote, bạn cần phải chia xẻ thư mục đích (Right Folder) toàn quyền cho user login ở máy local, nơi có thư mục Left Folder.

SyncToy1 SyncToy2

 SyncToy3 SyncToy4

 SyncToy5 SyncToy6

Tôi liên tục phải chia xẻ mã nguồn với nhiều người. Mỗi lần vội gửi mà chỉ nén cả thư mục dự án, file đính kèm rất lớn (vì có file PDB, chưa thông tin để debug, tự sinh ra khi biên dịch), chưa kể lại bị phần mềm chống virus sẽ quét và cho vào mục Spam. Do đó tôi rất cần một cách đơn giản để xóa tất cả những file sinh ra sau khi biên dịch mà chỉ giữ lại những mà nguồn cần thiết để có thể tạo file nén nhỏ gọn.

Đây là một chương trình nhỏ miễn phí của Teknowmagic giúp xóa sách files sinh ra khi biên dịch

Download ở trang http://teknowmagic.net/SolutionCleaner.html

DebugFileCleaner0 DebugFileCleaner1

More Posts Next page »