<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5965955994829958260</id><updated>2011-12-01T15:15:43.071+07:00</updated><category term='SEO'/><category term='java'/><category term='web'/><category term='English'/><category term='ajax'/><category term='Hibernate'/><category term='Others'/><category term='JSF'/><category term='Spring'/><category term='memory'/><category term='Tutorial'/><category term='Basic'/><category term='OS'/><category term='private'/><category term='langthang'/><title type='text'>Langthang</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-7403181689801063157</id><published>2009-07-16T19:32:00.001+07:00</published><updated>2009-07-16T19:32:20.701+07:00</updated><title type='text'>Ant visualize plugin</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thời gian gần đây, tôi có nhu cầu sử dụng Ant, mặc dù đã biết Ant từ khá lâu (hơn 1 năm) nhưng lần này thì mới&amp;#160; là ….”thực sự sử dụng” và trải nghiệm của tôi là : sao mà rắc rối thế.&lt;/p&gt;  &lt;p&gt;Ant thì tốt, tuy nhiên điều tôi thấy là nó thiếu một công cụ để hỗ trợ giao diện, như các bạn thấy, đọc một file Ant và thao tác trên nó, đặc biệt trên một file Ant lớn thì quả nhiên là….điên đầu.&lt;/p&gt;  &lt;p&gt;Cái khó nên tôi phải ráng ló cái khôn, sau khi cực nhọc cho xong cái project, tôi cũng quyết định viết một plugin cho nó(test và xài cho project sau).&lt;/p&gt;  &lt;p&gt;Tôi viết một “Ant Visualize plugin” với mục đích visualize một file Ant, chương trình sẽ đọc file Ant và vẽ một Graph, mỗi một task sẽ tương ứng một node trên graph nà, double click lên task để thực thi.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8djENh5xI/AAAAAAAAAOs/Rr5KvaeOR6g/s1600-h/image%5B5%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="429" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dkgVBbUI/AAAAAAAAAOw/dxpZ8sgkDLw/image_thumb%5B3%5D.png?imgmax=800" width="696" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Left: thông tin console khi chạy plugin.&lt;/p&gt;  &lt;p&gt;Right: Graph visualize của file Ant.&lt;/p&gt;  &lt;p&gt;Double Click lên&amp;#160; Task để thực thi.&lt;/p&gt;  &lt;p&gt;1. Cài đặt:&lt;/p&gt;  &lt;p&gt;Chương trình sử dụng thư viện GEF của eclipse, nếu phiên bản eclipse của bạn là myeclipse thì thư viện này đã được tích hợp sẵn (Tôi kiểm tra trên myeclipse 6.6, 7.0 và 7.5).&lt;/p&gt;  &lt;p&gt;Nếu sử dụng eclipse, chương trình có thể chạy được trên phiên bản eclipse 3.4 và 3.5 (ganymede và Galileo) với những version khác thì tôi chưa test, nhưng chắc chắn là nó cũng sẽ chạy được.&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;1.1 &lt;strong&gt;Cài đặt GEF cho eclipse:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Bạn download thư viện GEF từ địa chỉ sau:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.mediafire.com/file/qlz3tittnzz/GEF-ALL-3.5.0.zip" href="http://www.mediafire.com/file/qlz3tittnzz/GEF-ALL-3.5.0.zip"&gt;http://www.mediafire.com/file/qlz3tittnzz/GEF-ALL-3.5.0.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Sau đó giả nén vào thư mục gốc của eclipse:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dlb9uZoI/AAAAAAAAAO0/vZk40nRQjsA/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="147" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dl9P8P_I/AAAAAAAAAO4/448VN2O1kf8/image_thumb%5B5%5D.png?imgmax=800" width="494" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;giải nén vào thư mục gốc chứa eclipse.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Lưu ý : Khi giải nén vào thư mục gốc, winrar sẽ chép đè một số file, OK để tiếp tục.&lt;/p&gt;  &lt;p&gt;(Nhớ exit eclipse trước khi giải nén).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;1.2&lt;/font&gt;&lt;/strong&gt; &lt;strong&gt;&lt;font size="4"&gt;Cài đặt Ant Visualize Plugin:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;Cài đặt Ant Visualize hết sức đơn giản, bạn download file từ địa chỉ sau:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.mediafire.com/file/om0zwmyyj0y/antvisualize.rar" href="http://www.mediafire.com/file/om0zwmyyj0y/antvisualize.rar"&gt;http://www.mediafire.com/file/om0zwmyyj0y/antvisualize.rar&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;Chép file AntVisualizePlugin_1.0.0.jar vào thư mục dropins&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8dnB7pCwI/AAAAAAAAAO8/PMyfj9QBIfs/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="257" alt="image" src="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8dp5huDYI/AAAAAAAAAPA/fpYPlqL-VWU/image_thumb%5B8%5D.png?imgmax=800" width="524" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Khởi động (khỏi động lai) eclipse và bạn có thể sử dụng plugin này.&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;2. Hướng dẫn sử dụng:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Khởi động eclipse/myeclipse&lt;/p&gt;  &lt;p&gt;Nếu cửa sổ plugin chưa xuất hiện, bạn vào Window/Show view/Other…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8drGifoKI/AAAAAAAAAPE/D1dVeOzUONc/s1600-h/image%5B20%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="300" alt="image" src="http://lh6.ggpht.com/_tYqoXlRa1XY/Sl8ds6qHiaI/AAAAAAAAAPI/vbR9k-zBIz0/image_thumb%5B12%5D.png?imgmax=800" width="370" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Kéo xuống cuối và chọn Ant Visualize.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8duBLtJ8I/AAAAAAAAAPM/FDSrYnGetO0/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="405" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dvDXjbFI/AAAAAAAAAPQ/SBn4iR9bZqY/image_thumb%5B14%5D.png?imgmax=800" width="304" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Bạn cũng nên mở cửa sổ Console để theo dõi thông báo từ plugin(Window/Show View/Console).&lt;/p&gt;  &lt;p&gt;Trên cửa sổ Ant Visualize click Open Ant&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dvsxFzhI/AAAAAAAAAPU/5LHPmEhdF3E/s1600-h/image%5B32%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="115" alt="image" src="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8dxnJbydI/AAAAAAAAAPY/tpmadeHTNPs/image_thumb%5B20%5D.png?imgmax=800" width="539" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Cuối cùng chọn Load/Reload.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8dyTUwT-I/AAAAAAAAAPc/uHoq0Mho8aQ/s1600-h/image%5B41%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="444" alt="image" src="http://lh5.ggpht.com/_tYqoXlRa1XY/Sl8dzjubwlI/AAAAAAAAAPg/eNuUoXLY0Gw/image_thumb%5B25%5D.png?imgmax=800" width="554" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Double Click vào Node để chạy một task.&lt;/p&gt;  &lt;p&gt;(Lưu ý: để một task có thể thực thi được, Ant phải được cài đặt trên hệ thống gồm ANT_HOME và PATH=ANT_HOME/bin. Nói chung nếu máy bạn lâu nay chạy được Ant là được rồi).&lt;/p&gt;  &lt;p&gt;Trong quá trình chạy, Console có thể làm cho bạn bị rối, check vào CheckBox : “Clear console before execute task” console sẽ tự clear trước khi chạy một task khác.&lt;/p&gt;  &lt;p&gt;Nó được visualize từ file xml như sau:&lt;/p&gt;  &lt;pre&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
  &lt;br /&gt;&amp;lt;project name=&amp;quot;UKLights&amp;quot; default=&amp;quot;all&amp;quot; basedir=&amp;quot;.&amp;quot;&amp;gt; 
&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;src&amp;quot; value=&amp;quot;src&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;build&amp;quot; value=&amp;quot;build&amp;quot;/&amp;gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;build.jar&amp;quot; value=&amp;quot;build\jar&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;class.dir&amp;quot; value=&amp;quot;build\classes&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;lib&amp;quot; value=&amp;quot;lib&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;path id=&amp;quot;compile.classpath&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;fileset dir=&amp;quot;${lib}&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;include name=&amp;quot;*.jar&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/fileset&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/path&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;init&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;mkdir dir=&amp;quot;${build}&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;all&amp;quot; depends=&amp;quot;UKLights&amp;quot; description=&amp;quot;builds whole projects&amp;quot;&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;echo&amp;gt; Doing all &amp;lt;/echo&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;UKLights&amp;quot; depends=&amp;quot;compile,copygoogle&amp;quot;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; description=&amp;quot;Builds the main UKLights project&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;echo&amp;gt;Doing UKLights&amp;lt;/echo&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;compile&amp;quot; depends=&amp;quot;clean,init&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;mkdir dir=&amp;quot;${class.dir}&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Compile the java code --&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;javac srcdir=&amp;quot;${src}&amp;quot; destdir=&amp;quot;${class.dir}&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;classpath refid=&amp;quot;compile.classpath&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/javac&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt;

&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;jar&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;mkdir dir=&amp;quot;${build.jar}&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;jar destfile=&amp;quot;${build.jar}/HelloWorld.jar&amp;quot; basedir=&amp;quot;${class.dir}&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;manifest&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;attribute name=&amp;quot;Main-Class&amp;quot; value=&amp;quot;UKLights&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/manifest&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/jar&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;run&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;java jar=&amp;quot;${build.jar}/HelloWorld.jar&amp;quot; fork=&amp;quot;true&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;copygoogle&amp;quot; depends=&amp;quot;compile&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;copy file=&amp;quot;${src}/google.png&amp;quot; tofile=&amp;quot;${class.dir}/google.png&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt;
 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;target name=&amp;quot;clean&amp;quot; description=&amp;quot;Removes previous build&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;delete verbose=&amp;quot;true&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;fileset dir=&amp;quot;${build}&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/delete&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/target&amp;gt;
  &lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Lần đầu tiên mình viết một sản phẩm cho ….cộng đồng nên chắc là sản phẩm sẽ có những ….ngây ngô nhất định, mong bạn đóng góp để mình cải thiện trong thời gian tới.&lt;/p&gt;

&lt;p&gt;Nếu có thể xin comment trên blog này&lt;/p&gt;

&lt;p&gt;Blog : dangtritue.blogspot.com&lt;/p&gt;

&lt;p&gt;hay gửi một yêu cầu qua mail nhé:&lt;/p&gt;

&lt;p&gt;Email: &lt;a href="mailto:dangtritue@yahoo.com"&gt;dangtritue@yahoo.com&lt;/a&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Download một số ví dụ về Ant tại đây:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://www.mediafire.com/file/wqndkghyzdh/AntExamples.rar" href="http://www.mediafire.com/file/wqndkghyzdh/AntExamples.rar"&gt;http://www.mediafire.com/file/wqndkghyzdh/AntExamples.rar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nếu bạn nào gặp trục trặc về vấn đề download/Cài đặt, hãy liên hệ ngay nhé.&lt;/p&gt;

&lt;p&gt;Hy vọng là một công cụ hữu ích cho cộng đồng.&lt;/p&gt;

&lt;p&gt;Lang Thang.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-7403181689801063157?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/7403181689801063157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/07/ant-visualize-plugin.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/7403181689801063157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/7403181689801063157'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/07/ant-visualize-plugin.html' title='Ant visualize plugin'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_tYqoXlRa1XY/Sl8dkgVBbUI/AAAAAAAAAOw/dxpZ8sgkDLw/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-6987695133790670288</id><published>2009-06-03T13:18:00.001+07:00</published><updated>2009-06-03T13:18:56.953+07:00</updated><title type='text'>Tài liệu dành cho nhà phát triển của prototype.js</title><content type='html'>&lt;h5&gt;Nội dung chính&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Whatsthat"&gt;Tài liệu này là gì?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#RelatedArticle"&gt;Những mục có liên quan&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#UtilityFunctions"&gt;Những hàm tiện ích&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#DollarFunction"&gt;Sử dụng hàm $()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Dollar_Dollar_Function"&gt;Sử dụng hàm $$()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Dollar_F_Function"&gt;Sử dụng hàm $F()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Dollar_A_Function"&gt;Sử dụng hàm $A()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Dollar_H_Function"&gt;Sử dụng hàm $H()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Dollar_R_Function"&gt;Sử dụng hàm $R()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#TryThese"&gt;Sử dụng hàm Try.these()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Strings"&gt;Mánh khóe với Strings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Strings.gsub"&gt;Thay thế Strings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Strings.templates"&gt;Mẫu sẵn có của Strings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#UsingAjax"&gt;Đối tượng Ajax&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#UsingAjaxRequest"&gt;Sử dụng lớpAjax.Request&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#UsingAjaxUpdater"&gt;Sử dụng lớp Ajax.Updater&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Encoding"&gt;&amp;quot;?&amp;quot; và □ là cái gì?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Enumerating"&gt;Enumerating... Wow! Damn! Wahoo!&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Loops"&gt;Vòng lặp, theo kiểu của Ruby&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#EnumeratingArrays"&gt;Vài điều về mảng&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference"&gt;Tài liệu tra cứu cho prototype.js&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions"&gt;Phần mở rộng cho các lớp của JavaScript&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.Object"&gt;Phần mở rộng cho lớp Object&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.Number"&gt;Phần mở rộng cho lớp Number&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.Function"&gt;Phần mở rộng cho lớp Function&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.String"&gt;Phần mở rộng cho lớp String&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Array"&gt;Phần mở rộng cho lớp Array&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.DOM"&gt;Phần mở rộng cho đối tượng DOM document&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.Event"&gt;Phần mở rộng cho đối tượng Event&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.NewObjects"&gt;Những đối tượng và lớp mới được định nghĩa bởi prototype.js&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.PeriodicalExecuter"&gt;Đối tượng PeriodicalExecuter&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Prototype"&gt;Đối tượng Prototype&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Đối tượng Enumerable&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Hash"&gt;Đối tượng Hash&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.ObjectRange"&gt;Lớp ObjectRange&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Class"&gt;Đối tượng Class&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Ajax"&gt;Đối tượng Ajax&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Responders"&gt;Đối tượng Ajax.Responders&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Base"&gt;Lớp Ajax.Base&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Request"&gt;Lớp Ajax.Request&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;Đối tượng tham số options&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Lớp Ajax.Updater&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.PeriodicalUpdater"&gt;Lớp Ajax.PeriodicalUpdater&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Element"&gt;Đối tượng Element&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Element.ClassNames"&gt;Lớp Element.ClassNames&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract"&gt;Đối tượng Abstract&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Lớp Abstract.Insertion&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion"&gt;Đối tượng Insertion&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Before"&gt;Lớp Insertion.Before&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Top"&gt;Lớp Insertion.Top&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Bottom"&gt;Lớp Insertion.Bottom&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.After"&gt;Lớp Insertion.After&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Field"&gt;Đối tượng Field&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form"&gt;Đối tượng Form&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element"&gt;Đối tượng Form.Element&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.Serializers"&gt;Đối tượng Form.Element.Serializers&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.TimedObserver"&gt;Lớp Abstract.TimedObserver&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.Observer"&gt;Lớp Form.Element.Observer&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Observer"&gt;Lớp Form.Observer&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.EventObserver"&gt;Lớp Abstract.EventObserver&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.EventObserver"&gt;Lớp Form.Element.EventObserver&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.EventObserver"&gt;Lớp Form.EventObserver&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Position"&gt;Đối tượng Position (tài liệu dự bị)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a name="Whatsthat"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Tài liệu này là gì?&lt;/h5&gt;  &lt;p&gt;Trong trường hợp bạn chưa từng dùng thử, &lt;a href="http://prototype.conio.net/"&gt;prototype.js&lt;/a&gt; là một thư viện JavaScript được viết bởi &lt;a href="http://www.conio.net/"&gt;Sam Stephenson&lt;/a&gt;. Thư viện này có ý tưởng xuất sắc và là một mã &lt;strong&gt;tương thích chuẩn&lt;/strong&gt; được viết rất tốt, với hàng loạt các thành phần liên quan đến việc xậy dựng những trang web đa dạng và có tính tương thích cao để giúp bạn xây dựng các trang Web2.0. &lt;/p&gt;  &lt;p&gt;Nếu bạn cố gắng sử dụng thư viện này gần đây, bạn có thể nhận thấy rằng tài liệu kèm theo không phải là một điểm mạnh của nó. Như những nhà phát triển trước tôi, tôi phải cật lực xem toàn bộ mã lệnh và thực hành với nó. Tôi nghĩ sẽ là rất tuyệt nếu như để lại vài dòng ghi chú khi tôi học và chia sẻ nó với mọi người. &lt;/p&gt;  &lt;p&gt;Tôi cũng giới thiệu &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference"&gt;un-official reference&lt;/a&gt; cho các đối tượng, lớp, hàm số, và phần mở rộng kèm theo thư viện này. &lt;/p&gt;  &lt;p&gt;Khi bạn đọc những ví dụ và phần tham khảo, nhà phát triển quen thuộc với ngôn ngữ Ruby sẽ nhận thấy rằng có sự giống nhau có chủ ý các lớp có sẵn của Ruby và nhiều phần mở rộng khác được khởi tạo bởi thư viện này. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="RelatedArticle"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Mục có liên quan&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://www.sergiopereira.com/articles/advjs.html"&gt;Advanced JavaScript guide&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="UtilityFunctions"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Các hàm tiện ích&lt;/h5&gt;  &lt;p&gt;Thư viện này mang đến rất nhiều các đối tượng và các hàm tiện ích đã được định nghĩa sẵn. Mục tiêu chủ yếu của các hàm này là nhằm giúp bạn đỡ phải lập đi lặp lại việc đánh máy và các thành ngữ. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="DollarFunction"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h6&gt;Sử dụng hàm $()&lt;/h6&gt;  &lt;p&gt;Hàm $() là một cách tiện lợi thay thế cho 1 hàm rất quen thuộc đó là document.getElementById() của DOM.Giống như hàm DOM, hàm này trả về thành tố ứng với id được truyền dưới dạng tham số. &lt;/p&gt;  &lt;p&gt;Không giống với hàm DOM, hàm này đi xa hơn một bậc. Bạn có thể truyền 1 hay nhiều id và $() sẽ trả về một đối tượngArray với tất cả các thành tố được yêu cầu. Ví dụ dưới đây sẽ minh họa điều này. &lt;/p&gt;  &lt;pre&gt;&amp;lt;HTML&amp;gt;
&amp;lt;HEAD&amp;gt;
&amp;lt;TITLE&amp;gt; Test Page &amp;lt;/TITLE&amp;gt;
&amp;lt;script src=&amp;quot;prototype-1.4.0.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script&amp;gt;
	function test1()
	{
		var d = $('myDiv');
		alert(d.innerHTML);
	}

	function test2()
	{
		var divs = $('myDiv','myOtherDiv');
		for(i=0; i&amp;lt;divs.length; i++)
		{
			alert(divs[i].innerHTML);
		}
	}
&amp;lt;/script&amp;gt;
&amp;lt;/HEAD&amp;gt;

&amp;lt;BODY&amp;gt;
	&amp;lt;div id=&amp;quot;myDiv&amp;quot;&amp;gt;
		&amp;lt;p&amp;gt;Đây là một đoạn văn bản&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div id=&amp;quot;myOtherDiv&amp;quot;&amp;gt;
		&amp;lt;p&amp;gt;Đây là một đọan văn bản khác&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;input type=&amp;quot;button&amp;quot; value=Test1 onclick=&amp;quot;test1();&amp;quot;&amp;gt;&amp;lt;br&amp;gt; 
	&amp;lt;input type=&amp;quot;button&amp;quot; value=Test2 onclick=&amp;quot;test2();&amp;quot;&amp;gt;&amp;lt;br&amp;gt; 

&amp;lt;/BODY&amp;gt;
&amp;lt;/HTML&amp;gt;&lt;/pre&gt;

&lt;p&gt;Một điều thú vị nữa về hàm này đó là bạn có thể truyền được chuỗi id hoặc là đối tượng của thành tốt đó. Điều này làm cho hàm này rất hữu ích khi tạo các hàm khác mà có thể nhận được cả dạng tham số. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm $$()&lt;/h6&gt;

&lt;p&gt;Hàm $$() sẽ giúp bạn rất nhiều nếu bạn muốn tách biết các tập tin CSS ra khỏi khung nội dung. Nó truyền 1 hay nhiều bộ lọc(filter) CSS, từng cái một sẽ được dùng tuẩn tự để xác định thể hiện CSS. Nó sẽ trả về phần tử trùng khớp với bộ lọc CSS ấy &lt;/p&gt;

&lt;p&gt;Sử dụng hàm này rất dễ. Hãy xem ví dụ sau: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
function test$$(){
	/*
	  in case CSS is not your forte, the expression below says
	  'find all the INPUT elements that are inside 
	  elements with class=field that are inside a DIV
	  with id equal to loginForm.'
	*/
	var f = $$('div#loginForm .field input');
	var s = '';
	for(var i=0; i&amp;lt;f.length; i++){
		s += f[i].value + '/';
	}
	alert(s); // shows: &amp;quot;joedoe1/secret/&amp;quot;
	
	//now passing more than one expression
	f = $$('div#loginForm .field input', 'div#loginForm .fieldName');
	s = '';
	for(var i=0; i&amp;lt;f.length; i++){
		s += ( f[i].value ? f[i].value : f[i].innerHTML ) + '/';
	}
	alert(s); //shows: &amp;quot;joedoe1/secret/User name:/Password:/&amp;quot;
}


&amp;lt;/script&amp;gt;

&amp;lt;div id='loginForm'&amp;gt;
	&amp;lt;div class='field'&amp;gt;
		&amp;lt;span class='fieldName'&amp;gt;User name:&amp;lt;/span&amp;gt;
		&amp;lt;input type='text' id='txtName' value='joedoe1'/&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class='field'&amp;gt;
		&amp;lt;span class='fieldName'&amp;gt;Password:&amp;lt;/span&amp;gt;
		&amp;lt;input type='password' id='txtPass' value='secret' /&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;input type='submit' value='login' /&amp;gt;
&amp;lt;/div&amp;gt; 
&amp;lt;input type=button value='test $$()' onclick='test$$();' /&amp;gt;
			&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Một ghi chú về hiệu suất. Hàm $$() hiện tại trong prototype.js không được xem là có hiệu quả đặc biệt. Nếu bạn muốn đào sâu hơn về XHTML bằng cách sử dụng $$() thường xuyên, bạn có thể xem xét những thể hiện khác, có thể sẽ thay thế hàm $$(). &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Dollar_F_Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm $F()&lt;/h6&gt;

&lt;p&gt;Hàm $F() lại là một cách ngắn gọn khác. Nó trả về giá trị của vùng nhập dữ liệu, như hộp văn bản, hay là danh sách thả xuống. Hàm này nhận tham số là id của thành tố hoặc là chính đối tượng của thành tố ấy. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function test3()
	{
		alert(  $F('userName')  );
	}
&amp;lt;/script&amp;gt;

&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;userName&amp;quot; value=&amp;quot;Joe Doe&amp;quot;&amp;gt;&amp;lt;br&amp;gt; 
&amp;lt;input type=&amp;quot;button&amp;quot; value=Test3 onclick=&amp;quot;test3();&amp;quot;&amp;gt;&amp;lt;br&amp;gt; 
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Dollar_A_Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm $A()&lt;/h6&gt;

&lt;p&gt;Hàm $A() một tham số nó nhận được thành một đối tượng Array. &lt;/p&gt;

&lt;p&gt;Hàm này kết hợp với &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Array"&gt;phần mở rộng của lớp Array&lt;/a&gt;, làm cho nó dễ dàng có thể chuyển đổi hoặc sao chép bất cứ danh sách đếm được nào thành đối tượng Array . Có một số người khuyên là nên chuyển đổi đối tượng DOM NodeLists thành một mảng thông thường, để có thể tham chiếu dễ dàng.Xem ví dụ dưới đây. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;

	function showOptions(){
		var someNodeList = $('lstEmployees').getElementsByTagName('option');
		var nodes = $A(someNodeList);

		nodes.each(function(node){
				alert(node.nodeName + ': ' + node.innerHTML);
			});
	}
&amp;lt;/script&amp;gt;

&amp;lt;select id=&amp;quot;lstEmployees&amp;quot; size=&amp;quot;10&amp;quot; &amp;gt;
	&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;Buchanan, Steven&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;8&amp;quot;&amp;gt;Callahan, Laura&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Davolio, Nancy&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Show the options&amp;quot; onclick=&amp;quot;showOptions();&amp;quot; &amp;gt; 
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Dollar_H_Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm $H()&lt;/h6&gt;

&lt;p&gt;Hàm $H() chuyển đổi các đối tượng thành các đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Hash"&gt;Hash&lt;/a&gt; đếm được (enumerable) tương tự như các mảng. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function testHash()
	{
		//tạo một đối tượng
		var a = {
			first: 10,
			second: 20,
			third: 30
			};

		//chuyển nó thành mảng băm
		var h = $H(a);
		alert(h.toQueryString()); //displays: first=10&amp;amp;second=20&amp;amp;third=30
	}

&amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Dollar_R_Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm $R()&lt;/h6&gt;

&lt;p&gt;Hàm $R() đơn giản chỉ là cách ngắn gọn viết thay cho new ObjectRange(lowerBound, upperBound, excludeBounds). &lt;/p&gt;

&lt;p&gt;Đi đến phần &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.ObjectRange"&gt;ObjectRange&lt;/a&gt; để tham khảo đầy đủ về lớp này. Trong lúc ấy thì hãy xem qua ví dụ đơn giản sau để biết cách sử dụng vòng lặp với phương thức each. Xem thêm về phương thức này tại &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt; . &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function demoDollar_R(){
		var range = $R(10, 20, false);
		range.each(function(value, index){
			alert(value);
		});
	}

&amp;lt;/script&amp;gt;

&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Sample Count&amp;quot; onclick=&amp;quot;demoDollar_R();&amp;quot; &amp;gt; 
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="TryThese"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng hàm Try.these()&lt;/h6&gt;

&lt;p&gt;Hàm Try.these() làm mọi việc đơn giản hơn khi bạn có ý định thử gọi nhiều hàm khác nhau cho đến khi có 1 hàm trong số đó hoạt động. Nó lấy tham số là tên của các hàm và gọi tuần tự các hàm đó cho đến khi có 1 hàm hoạt động. Hàm trả về kết quả của hàm được gọi thành công. &lt;/p&gt;

&lt;p&gt;Trong ví dụ dưới đây, hàm xmlNode.text hoạt động trong một số trình duyệt, và hàm xmlNode.textContent hoạt động trong một số trình duyệt khác. Sử dụng hàm Try.these() chúng ta có thể trả về hàm có thể hoạt đọng. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
function getXmlNodeValue(xmlNode){
	return Try.these(
		function() {return xmlNode.text;},
		function() {return xmlNode.textContent;}
		);
}
&amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="UsingAjax"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Đối tượng Ajax&lt;/h5&gt;

&lt;p&gt;Hàm tiệc ích được đề cập phía trên là rất tốt nhưng, sự thật là nó không phải là cách tốt nhất để làm công việc này. Bạn có thể tự viết nó hoặc có thể có nhưng hàm tương tự trong mã lệnh của bạn. Nhưng những hàm đó chỉ là phần nổi của tảng băng mà thôi. &lt;/p&gt;

&lt;p&gt;Tôi chắc chắn là bạn thấy hứng thú với prototype.js là vì khả năng hỗ trợ &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;AJAX&lt;/a&gt; của nó. Bây giờ hãy cùng giải thích vì sao thư viện này sẽ làm cho bạn thấy thoải mái hơn khi bạn cần thực hiện các cấu trúc login của AJAX. &lt;/p&gt;

&lt;p&gt;Đối tượng Ajax là một đối tượng được định nghĩa sẵn, được tạo bởi thư viện nhằm gói gọn và làm đơn giản những đoạn mã khó hiểu khi viết các chức năng AJAX. Hàm này chứa một số lớp cung cấp các cấu trúc AJAX được gói gọn lại. Nào, hãy xem thử qua một số trong chúng. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Mánh khóe với String&lt;/h5&gt;

&lt;p&gt;Strings là một đối tượng rất mạnh. Prototype.js tận dụng sức mạnh và nâng nó lên một tầm cao khác về chất lượng. &lt;/p&gt;

&lt;h6&gt;Thay thế Strings&lt;/h6&gt;

&lt;p&gt;Khi nghĩ đến thay thế chuỗi trong Javascript, thường thì đã có sẵn các phương thức như String.Replace. Mặc dù nó vẫn có thể hoạt động với biểu thức chính qui(regular expression) nhưng nó vẫn không linh hoạt bằng phương thức thay thế mới trong prototype.js &lt;/p&gt;

&lt;p&gt;Hãy đến với phương thức String.gsub. Với phương thức này bạn không chỉ có thể tìm và thay thế 1 chuỗi cố định hay 1 biểu thức chính qui bạn còn có thể kiểm soát được nhiều hơn quá trình thay thế. Ví dụ: bạn có thể sử dụng 1 mẫu có sẵn để chỉ cho phương thức cách mà bạn muốn các kết quả tìm kiếm sẽ được biến đổi (thay vì chỉ là thay thế thông thường) &lt;/p&gt;

&lt;p&gt;Ví dụ dưới đây sẽ tìm kiếm những từ chứa 't' và thay thế cả cụm theo sau 't' bằng 'tizzle'. Trong trường hợp ví dụ không rõ ràng, biểu thức chính qui mà chúng ta chọn sẽ sẽ có dạng khai báo thành nhóm : &lt;strong&gt;\w+&lt;/strong&gt; được để trong ngoặc. Chúng ta có thể lấy được giá trị của nhóm này bằng cách sử dụng &lt;strong&gt;#{1}&lt;/strong&gt; trong chuỗi thay thế mẫu. &lt;/p&gt;

&lt;p&gt;Trong ví dụ, chúng ta tiến hành bắt lấy những gì phía sau 't' và thêm vào 'tizzle'. Nếu chúng ta có nhiều nhóm trong biểu thức chính qui, chúng ta có thể lấy các giá trị như sau strong&amp;gt;#{2}, &lt;strong&gt;#{3}&lt;/strong&gt;, ... &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
function talkLikeYouKnowSomething(){
	var s = 'prototype string extensions can help you';
	var snoopdogfy = /\b(\w+)t\w+\b/;
	var snooptalk = s.&lt;strong&gt;gsub&lt;/strong&gt;(snoopdogfy, '#{1}tizzle' );
	alert(snooptalk); // shows: &amp;quot;prototizzle stizzle extizzle can help you&amp;quot;				
}
&amp;lt;/script&amp;gt;
			&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Không nên chỉ dừng tại đây. Những thay thế mà chúng ta vừa thực hiện không phải là mạnh mẽ lắm vì chúng ta chỉ giới hạn chúng ở dạng khớp mẫu (pattern matching) và thay thế. Sẽ là thế nào nếu chúng ta có thể thao tác trên các mẫu khớp với những phép logic tùy ý, và từ đó tạo ra những giá trị thay thế mong muốn? Chúng ta có thể làm được như vậy nếu chúng ta truyền 1 hàm dưới dạng tham số thứ 2 vào gsub. Hàm này sẽ nhận 1 mảng với chuỗi khớp (index 0) và bất cứ giá trị nhóm nào(index 1 đến N.) &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
function scamCustomers(){
	var prices = 'book1 $12.5, magazine $5.50, pencil $1.20';
	var priceFinder = /\$([0-9\.]+)/;
	var r = prices.gsub(priceFinder, &lt;strong&gt;jackUp&lt;/strong&gt;);
	alert(r);//shows: &amp;quot;book1 $13.75, magazine $6.05, pencil $1.32&amp;quot;
}
&lt;strong&gt;	
function jackUp(matches){
	//increases the prices by 10%
	var price = parseFloat(matches[1]);
   	return '$' + Math.round(110 * price)/100;
}&lt;/strong&gt;
&amp;lt;/script&amp;gt;
			&lt;/code&gt;&lt;/pre&gt;

&lt;h6&gt;Mẫu sẵn có của Strings&lt;/h6&gt;

&lt;p&gt;Khi số lượng mã Javascript tăng lên, đồng nghĩa với việc bạn sẽ thấy xung quanh mình sẽ là tập hợp các đối tượng có cùng 1 kiểu, và bạn cần phải sắp xếp nó theo một trật tự nhất định. &lt;/p&gt;

&lt;p&gt;Trong ứng dụng của bạn, sẽ không phải là hiếm để bắt gặp những đoạn code chạy lặp lại qua danh sách các đối tượng, khởi tạo các chuỗi dựa trên đặc tính của đối tượng và trật tự nhất định của một số phần tử. Prototype.js có &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Template"&gt;Template class&lt;/a&gt;, nhằm giúp bạn với những tình huống nêu trên. &lt;/p&gt;

&lt;p&gt;Ví dụ dưới đây sẽ hướng dẫn cách để định dạng một danh sách các mục trong 1 giỏ hàng trong vài dòng HTML. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
function printCart(){
	//creating a sample cart
	var cart = new Object();
	cart.items = [ ];
	//putting some sample items in the cart
	cart.items.push({product: 'Book 123', price: 24.50, quantity: 1});
	cart.items.push({product: 'Set of Pens', price: 5.44, quantity: 3});
	cart.items.push({product: 'Gift Card', price: 10.00, quantity: 4});
	
	//here we create our template for formatting each item
	var itemFormat = &lt;strong&gt;new Template(
			'You are ordering #{quantity} units ' + 
			'of #{product} at $#{price} each'
			);&lt;/strong&gt;
	var formatted = '';
	
	for(var i=0; i&amp;lt;cart.items.length; i++){
		var cartItem = cart.items[i];
		formatted += itemFormat.&lt;strong&gt;evaluate&lt;/strong&gt;(cartItem) + '&amp;lt;br/&amp;gt;\n';
	}
	
	alert(formatted);
	/* SHOWS:
	You are ordering 1 units of Book 123 at $24.5 each&amp;lt;br/&amp;gt;
	You are ordering 3 units of Set of Pens at $5.44 each&amp;lt;br/&amp;gt;
	You are ordering 4 units of Gift Card at $10 each&amp;lt;br/&amp;gt;
	*/
}
&amp;lt;/script&amp;gt;
			&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Để tham khảo đầy đủ hơn về danh sách các hàm liên quan đến chuỗi, xem &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Extensions.String"&gt;String extensions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="UsingAjaxRequest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng lớp Ajax.Request&lt;/h6&gt;

&lt;p&gt;Nếu bạn không sử dụng bất cứ thư viện hỗ trợ nào, bạn có thể phải viết rất nhiều mã lệnh để tạo ra đối tượng XMLHttpRequest và phải theo dõi các tiến trình không đồng bộ (asynchronous) của nó. Sau đó thì tách ra những hồi đáp (response) và thi hành chúng. Và bạn có thể cho là mình may mắn nếu bạn không cần phải hỗ trợ nhiều hơn 1 loại trình duyệt. &lt;/p&gt;

&lt;p&gt;Để hỗ trợ các hứng năng của AJAX, thư viện định nghĩa lớp Ajax.Request. &lt;/p&gt;

&lt;p&gt;Cứ cho rằng bạn có một ứng dụng mà cần phải thông tin với máy chủ thông qua url &lt;em&gt;http://yourserver/app/get_sales?empID=1234&amp;amp;year=1998&lt;/em&gt;, mà trả về một hồi đáp XML như sau : &lt;/p&gt;

&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt; 
&amp;lt;ajax-response&amp;gt;
	&amp;lt;response type=&amp;quot;object&amp;quot; id=&amp;quot;productDetails&amp;quot;&amp;gt;
		&amp;lt;monthly-sales&amp;gt;
			&amp;lt;employee-sales&amp;gt;
				&amp;lt;employee-id&amp;gt;1234&amp;lt;/employee-id&amp;gt; 
				&amp;lt;year-month&amp;gt;1998-01&amp;lt;/year-month&amp;gt; 
				&amp;lt;sales&amp;gt;$8,115.36&amp;lt;/sales&amp;gt; 
			&amp;lt;/employee-sales&amp;gt;
			&amp;lt;employee-sales&amp;gt;
				&amp;lt;employee-id&amp;gt;1234&amp;lt;/employee-id&amp;gt; 
				&amp;lt;year-month&amp;gt;1998-02&amp;lt;/year-month&amp;gt; 
				&amp;lt;sales&amp;gt;$11,147.51&amp;lt;/sales&amp;gt; 
			&amp;lt;/employee-sales&amp;gt;
		&amp;lt;/monthly-sales&amp;gt;
	&amp;lt;/response&amp;gt;
&amp;lt;/ajax-response&amp;gt;			
			&lt;/pre&gt;

&lt;p&gt;Giao tiếp với máy chủ và nhận lại mã XML này thật là đơn giản khi dùng đối tượng Ajax.Request . Ví dụ sau sẽ cho thấy nó hoạt động thế nào. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function searchSales()
	{
		var empID = $F('lstEmployees');
		var y = $F('lstYears');
		var url = 'http://yourserver/app/get_sales';
		var pars = 'empID=' + empID + '&amp;amp;year=' + y;
		&lt;p&gt;
		var myAjax = new Ajax.Request(
			url, 
			{
				method: 'get', 
				parameters: pars, 
				onComplete: showResponse
			});
		&lt;/p&gt;
	}

	function showResponse(originalRequest)
	{
		//put returned XML in the textarea
		$('result').value = originalRequest.responseText;
	}
&amp;lt;/script&amp;gt;

&amp;lt;select id=&amp;quot;lstEmployees&amp;quot; size=&amp;quot;10&amp;quot; onchange=&amp;quot;searchSales()&amp;quot;&amp;gt;
	&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;Buchanan, Steven&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;8&amp;quot;&amp;gt;Callahan, Laura&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Davolio, Nancy&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;select id=&amp;quot;lstYears&amp;quot; size=&amp;quot;3&amp;quot; onchange=&amp;quot;searchSales()&amp;quot;&amp;gt;
	&amp;lt;option selected=&amp;quot;selected&amp;quot; value=&amp;quot;1996&amp;quot;&amp;gt;1996&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;1997&amp;quot;&amp;gt;1997&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;1998&amp;quot;&amp;gt;1998&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;textarea id=result cols=60 rows=10 &amp;gt;&amp;lt;/textarea&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Bạn có thể thấy được tham số thứ 2 được truyền cho phương thức khởi tạo (constructor) của đối tượng Ajax.Request hay không? Tham số {method: 'get', parameters: pars, onComplete: showResponse} thể hiện một đối tượng vô danh trong phần chú thích ngữ nghĩa (a.k.a. JSON). Điều này có nghĩa là chúng ta đang truyền 1 đối tượng có 1 thuộc tính là method chứa chuỗi 'get', và một thuộc tính khác là parameters chứa các chuỗi truy vấn của yêu cầu HTTP (HTTP request), và một onComplete thuộc tính/phương thức chứa hàm showResponse. &lt;/p&gt;

&lt;p&gt;Có thể có thêm một số thuộc tính nữa mà bạn có thể định nghĩa trong đối tượng này, như asynchronous, có thể là true hoặc false và xác định nếu lời gọi của AJAX đến máy chủ sẽ được thực hiện không đồng bộ (giá trị mặc định là true.) &lt;/p&gt;

&lt;p&gt;Tham số này định nghĩa một số tùy chọn cho lời gọi AJAX. Trong phần ví dụ, chúng ta đã gọi url trong phần tham số thứ 1 thông qua lệnh HTTP GET, truyền chuỗi truy vấn chứa trong biến pars, và đối tượng Ajax.Request sẽ gọi hàm showResponse khi nó kết thúc việc nhận phản hồi. &lt;/p&gt;

&lt;p&gt;Như bạn có thể đã biết rằng XMLHttpRequest thông báo tiến trình trong suốt quá trình gọi HTTP. Tiến trình này có thể cung cấp 4 bậc khác nhau: &lt;em&gt;Loading&lt;/em&gt;, &lt;em&gt;Loaded&lt;/em&gt;, &lt;em&gt;Interactive&lt;/em&gt;, hoặc &lt;em&gt;Complete&lt;/em&gt;. You Bạn có thể làm cho đối tượng Ajax.Request gọi một hàm tùy ý trong bất cứ bậc nào, &lt;em&gt;Complete&lt;/em&gt; là phần thông dụng nhất. Để xác định hàm cho đối tượng, đơn giản chỉ cần cung cấp thuộc tính/phương thức onXXXXX trong phần lựa chọn yêu cầu, như onComplete trong ví dụ của chúng ta. Hàm mà bạn truyền vào sẽ được gọi bởi đối tượng với 2 tham số, tham số thứ nhất là đối tượng XMLHttpRequest (a.k.a. XHR), tham số thứ hai sẽ là header của HTTP, phản hồi X-JSON (nếu có tồn tại). the second one will be the evaluated X-JSON response HTTP header (if one is present). Bạn có thể sử dụng XHR để lấy dữ liệu trả về và có thể kiểm tra xem thuộc tính status mà sẽ chứa các mã kết quả HTTP của lệnh gọi. X-JSON header rất hữu ích khi bạn muốn trả về một số mã lệnh nào đó hay dữ liệu dưới định dạng JSON. &lt;/p&gt;

&lt;p&gt;Hai lựa chọn hấp dẫn khác có thể được dùng để xử lý các kết quả. Bạn có thể chỉ định lựa chọn onSuccess như một hàm có thể được gọi khi AJAX gọi thi hành mà không có lỗi xảy ra. , và ngược lại lựa chọn onFailure có thể là hàm để được gọi khi lỗi máy chủ xảy ra. Giống như là các hàm onXXXXX, 2 hàm này sẽ được gọi để truyền XHR , trong có có hàm gọi AJAX và X-JSON header. &lt;/p&gt;

&lt;p&gt;Ví dụ của chúng ta không xử lý phản hồi XML với bất kì cách thức hấp dẫn nào cả. Chúng ta chỉ xuất XML ra vùng văn bản. Cách sử dụng tiêu biểu của phản hồi này có thể tìm những thông tin cần thiết bên trong XML và cập nhật một thành phần trang, hoặc có thể một số loại biến đổi XSLT để tạo ra mã HTML trong trang. &lt;/p&gt;

&lt;p&gt;Trong phiên bản 1.5.0, một mẫu dùng để điều khiển các sự kiện gọi lại(event callback handling) được giới thiệu. Nếu bạn có mã lệnh mà phải luôn xử lý một sự kiện đặc biệt nào đấy, mặc cho hàn AJAX nào được gọi, bạn đều có thể sử dụng đối tượng mới này &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Responders"&gt;Ajax.Responders&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Cứ cho rằng bạn muốn thể hiện một số hiển thị bằng lời gọi AJAX khi nó đang trong tiến trình, ví dụ như xoay icon hay là một vài thứ khác. Bạn có thể sử dụng 2 phần điều khiển sự kiện toàn cục để giúp bạn. Một cái là để biểu diễn icon khi lời gọi đầu tiên bắt đầu và một cái khác sẽ dấu icon khi lời gọi kết thúc. Xem ví dụ dưới đây. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	var myGlobalHandlers = {
		onCreate: function(){
			Element.show('systemWorking');
		},

		onComplete: function() {
			if(Ajax.activeRequestCount == 0){
				Element.hide('systemWorking');
			}
		}
	};

	Ajax.Responders.register(myGlobalHandlers);
&amp;lt;/script&amp;gt;

&amp;lt;div id='systemWorking'&amp;gt;&amp;lt;img src='spinner.gif'&amp;gt;Loading...&amp;lt;/div&amp;gt;
	&lt;/pre&gt;

&lt;p&gt;For more complete explanations, see the &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Request"&gt;Ajax.Request reference&lt;/a&gt; and the &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;options reference&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="UsingAjaxUpdater"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Sử dụng lớp Ajax.Updater&lt;/h6&gt;

&lt;p&gt;Nếu bạn có một máy chủ đầu cuối có thể trả về thông tin dưới dạng HTML, thư viện sẽ làm mọi việc dễ dàng hơn cho bạn với lớp Ajax.Updater. Với lớp này bạn có thể xách định thành phần nào sẽ được nhận mã HTML trả về từ lời gọi AJAX. Ví dụ sau đây sẽ làm rõ hơn điều này. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function getHTML()
	{
		var url = 'http://yourserver/app/getSomeHTML';
		var pars = 'someParameter=ABC';
		&lt;p&gt;
		var myAjax = new Ajax.Updater(
			'placeholder', 
			url, 
			{
				method: 'get', 
				parameters: pars
			});
		&lt;/p&gt;
	}
&amp;lt;/script&amp;gt;

&amp;lt;input type=button value=GetHtml onclick=&amp;quot;getHTML()&amp;quot;&amp;gt;
&amp;lt;div id=&amp;quot;placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Như bạn thấy, mã lệnh trông rất giống với ví dụ trước, trừ một ngoại lệ của hàm onComplete và id của thành phần được truyền cho phương thức khởi tạo. Hãy thay đổi mã lệnh một tí để xem nó có thể điều khiển được lỗi của máy chủ trên máy khách thế nào. &lt;/p&gt;

&lt;p&gt;Chúng ta sẽ thêm vào một số tùy chọn nữa chọn lời gọi, để chỉ định một hàm để bắt lỗi. Điều này được thực hiện bằng cách sử dụng lựa chọn onFailure . Chúng ta cũng sẽ chỉ định placeholder chỉ được nhiều hơn khi thao tác thành công. Để đạt được điều này chúng ta phải phải thay đổi 1 tham số từ 1 id đơn giản của phần tử đến 1 đối tượng với 2 thuộc tính, success (được sử dụng khi tất cả đều thành công) và failure (được sử dụng khi có lỗi). Chúng ta sẽ không sử dụng thuộc tính failure trong ví dụ, chỉ có hàm reportError bên trong lựa chọn onFailure. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function getHTML()
	{
		var url = 'http://yourserver/app/getSomeHTML';
		var pars = 'someParameter=ABC';
		&lt;p&gt;
		var myAjax = new Ajax.Updater(
					{success: 'placeholder'}, 
					url, 
					{
						method: 'get', 
						parameters: pars, 
						onFailure: reportError
					});
		&lt;/p&gt;
	}

	function reportError(request)
	{
		alert('Xin lỗi ! Có lỗi xảy ra.');
	}
&amp;lt;/script&amp;gt;

&amp;lt;input type=button value=GetHtml onclick=&amp;quot;getHTML()&amp;quot;&amp;gt;
&amp;lt;div id=&amp;quot;placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

			&lt;/pre&gt;

&lt;p&gt;Nếu máy chủ của bạn trả về mã JavaScript cùng với mã HTML, đối tượng Ajax.Updater có thể định giá trị mã JavaScript đấy. Để lấy một tượng để nhận phản hồi dưới dạng mã JavaScript, bạn đơn giản chỉ thêm evalScripts: true; vào danh sách thuộc tính trong tham số cuối cùng của đối tượng khởi tạo. Nhưng ở đây có 1 lỗ hổng. Những khối mã này sẽ không được thêm vào mã của trang. Với tên tùy chọn evalScripts gợi ý rằng những mã này sẽ được &lt;strong&gt;định giá trị&lt;/strong&gt;. Thế thì có khác biệt gì? Hãy giả định rằng URL được yêu cầu như sau : &lt;/p&gt;

&lt;pre&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
	function sayHi(){
		alert('Hi');
	}
&amp;lt;/script&amp;gt;

&amp;lt;input type=button value=&amp;quot;Click Me&amp;quot; onclick=&amp;quot;sayHi()&amp;quot;&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Trừ trường hợp bạn đã thử nó trước, bạn biết nó sẽ không chạy. Lý do là khối mã lệnh sẽ bị định giá trị, và việc định giá trị của mã như trên sẽ không tạo ra một hàm nào mang tên sayHi. Nó sẽ chẳng làm gì cả. Để tạo hàm này chúng ta cần thay đổi mã lệnh để &lt;strong&gt;khởi tạo&lt;/strong&gt; hàm. Xem bên dưới. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
	&lt;p&gt;sayHi = function(){
		alert('Hi');
	};&lt;/p&gt;
&amp;lt;/script&amp;gt;

&amp;lt;input type=button value=&amp;quot;Click Me&amp;quot; onclick=&amp;quot;sayHi()&amp;quot;&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Ghi chú rằng trong ví dụ trước chúng ta không sử dụng từ khóa var để khai báo các biến. Làm như thế sẽ tạo ra một đối tượng hàm mang tính cục bộ đối với khối mã lệnh (ít nhất thì cũng trong IE). Không có từ khoá var đối tượng hàm sẽ có phạm vi hoạt động trong cửa sổ đó, và đó là điều chúng ta muốn. &lt;/p&gt;

&lt;p&gt;Để có được giải thích rõ ràng hơn, hãy xem &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Ajax.Updater reference&lt;/a&gt; và &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;options reference&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;&amp;quot;?&amp;quot; và □ là cái gì?&lt;/h5&gt;

&lt;p&gt;Khi bạn viết mẫu thử 1 vài script để cập nhật trang bằng cách sử dụng đối tượng Ajax.Updater, và nó hoạt động rất tốt. Nó vẫn tốt cho đến khi bạn chạy script của mình với dữ liệu thật đột nhiên trong các chuỗi cập nhật xuất hiện những dấu '?' và '□' hay những dấu hiệu lạ khác tại những chỗ không phải là tiếng Anh chuẩn. &lt;/p&gt;

&lt;p&gt;Điều nghi ngờ đầu tiên của bạn là prototype.js. Nhưng khoang hãy đổ lỗi cho nó. Hãy hỏi xem là bạn đã thật sự hiểu về mã kí tự(character encoding), mã trang và cách mà trình duyệt xử lý nó hay chưa? &lt;/p&gt;

&lt;p&gt;Sau đây tôi sẽ trình bày một cách rõ ràng về vấn đề này, và cho bạn một số gợi ý để bạn có thể bắt đầu chỉnh sửa cho phù hợp với yêu cầu của mình. &lt;/p&gt;

&lt;p&gt;Đơn giản là hãy làm theo cách sau: hãy cho trình duyệt những gì mà nó muốn bạn cho nó. Ví dụ: nếu bạn cập nhật trang chứa các kí tự Unicode/UTF-8 thì hãy cho trình duyệt biết về điều ấy. &lt;/p&gt;

&lt;p&gt;Hãy bắt đầu với 1 trường hợp đơn giản khi bạn cập nhật trang với văn bạn ở dạng HTML tĩnh nằm trên server. Khi tạo ra tập tin đó, tùy vào công cụ biên tập của bạn mà rất có thể tập tin sẽ được lưu ở dạng ANSI(non-Unicode). Điều này là mặc định ở 1 số công cụ biên tập, đặc biệt là các công cụ biên tập mã nguồn vì kích thước tập tin sẽ nhỏ hơn, và cũng rất hiếm để có kí tự Unicode trong mã nguồn. &lt;/p&gt;

&lt;p&gt;Giả sử bạn có tập tin sau tên là static-content.html trên server. Bạn lưu nó dưới dạng ANSI. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
	Hi there, José. Yo no hablo español.
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Trang của bạn sẽ cập nhật bằng việc sử dụng vài dòng mã sau đây. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
	function updateWithFile(){
		var url = 'static-content.html';
		var pars = '';
		var myAjax = new Ajax.Updater(
				'placeholder', url, 
				{method: 'get', parameters: pars});
	}
&amp;lt;/script&amp;gt;
&amp;lt;div id=&amp;quot;placeholder&amp;quot;&amp;gt;(this will be replaced)&amp;lt;/div&amp;gt;
&amp;lt;input id=&amp;quot;btn&amp;quot; value=&amp;quot;Test With Static File&amp;quot; 
                 onclick=&amp;quot;updateWithFile()&amp;quot; type=&amp;quot;button&amp;quot;/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Khi bạn nhấn nút, tập tin sẽ được gọi nhưng những kí tự không phải tiếng Anh sẽ được thay thế bằng dấu ? và những kí tự khác. Nó sẽ trông giống như &lt;i&gt;&amp;quot;Hi there, Jos?. Yo no hablo espa?ol.&amp;quot;&lt;/i&gt; hay &lt;i&gt;&amp;quot;Hi there, Jos?Yo no hablo espa?&amp;quot;&lt;/i&gt;, tùy vào trình duyệt của bạn. &lt;/p&gt;

&lt;p&gt;Trong trường hợp này thì chỉ cần lưu tập tin lại với dạng phù hợp. Hãy lưu nó lại ở dạng UTF-8 và chạy lại. Bạn sẽ thấy rằng nó sẽ hiển thì đúng(bạn nhớ refresh lại trình duyệt để loại bỏ cache) &lt;/p&gt;

&lt;p&gt;Nếu HTML mà bạn dùng không phải là dữ liệu tính, và nếu nó được tạo ra bởi một số framework (như ASP.NET, PHP, Ruby hay Perl,), hãy chắc chắn rằng mã tạo ra HTML phải ở dạng phù hợp bao gồm cả HTTP headers. Mỗi hệ cơ sở đều có cách riêng để giải quyết vấn đề này, nhưng đều tương tự nhau cả. &lt;/p&gt;

&lt;p&gt;Ví dụ trong ASP.NET bạn có thể xác lập trong web.config &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;globalization requestEncoding=&amp;quot;utf-8&amp;quot; responseEncoding=&amp;quot;utf-8&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Trong ASP 3.0 bạn sử dụng dòng mã sau. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Response.CodePage = 65001
Response.CharSet = &amp;quot;utf-8&amp;quot; &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Trong PHP, cú pháp để thêm vào header trông như sau. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php header('Content-Type: text/html; charset=utf-8'); ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Trong trường hợp, mục đích cuối cùng của bạn là để có HTTP header sau gởi cùng với yêu cầu. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Content-Type: text/html; charset=utf-8 &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Chúng ta sử dụng UTF-8 trong ví dụ phía trên, nhưng nếu bạn cần những thiết lập khác bạn có thể dễ dàng thay đổi. &lt;/p&gt;

&lt;p&gt;&lt;a name="Enumerating"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Enumerating... Wow! Damn! Wahoo!&lt;/h5&gt;

&lt;p&gt;Chúng ta đã rất quen thuộc với vòng lặp. Bạn biết đấy, tạo ra một mảng, thêm vào nó các phần tử cùng type, tạo một cấu trúc lặp (for, foreach, while, repeat, ...), truy cập mỗi phần tử một cách tuần tự, bằng số chỉ vị trí của nó, sau đó thì thao tác gì đấy với các phần tử. &lt;/p&gt;

&lt;p&gt;Khi bạn nghĩ về nó, hầu hết bạn đều có một mảng trong mã lệnh của bạn, có nghĩa rằng bạn sẽ sử dụng mảng đó trong 1 vòng lặp sớm hay muộn. Sẽ không tốt hơn sao nếu đối tượng mảng có nhiều chức năng hơn để thao tác với các vòng lặp này. Và đúng thế, nó sẽ hay hơn rất nhiều. Và nhiều ngôn ngữ lập trình cung cấp những chức năng như thế cho các mảng hoặc những cấu trúc tương tự (như là tập hợp, danh sách) &lt;/p&gt;

&lt;p&gt;Và, ngỡ ra rằng prototype.js cho chúng ta đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt;, đối tượng này khởi tạo một loạt các mánh khóe giúp chúng ta thao tác với dữ liệu lặp. Thư viện prototype.js tiến xa hơn 1 bước nữa và &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Array"&gt;mở rộng lớp Array&lt;/a&gt; với tất cả các phương thức của Enumerable. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Loops"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Vòng lặp, theo type của Ruby&lt;/h6&gt;

&lt;p&gt;Trong javascript chuẩn, nếu bạn muốn thể hiện tuần tự các phần tử của một mảng, bạn phải viết rất đầy đủ như sau. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function showList(){
		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
&lt;p&gt;		for(i=0;i&amp;lt;simpsons.length;i++){
			alert(simpsons[i]);
		}&lt;/p&gt;
	}

&amp;lt;/script&amp;gt;

&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Show List&amp;quot; onclick=&amp;quot;showList();&amp;quot; &amp;gt; 
			&lt;/pre&gt;

&lt;p&gt;Với người bạn mới, prototype.js, bạn có thể viết lại vòng lặp này như sau. &lt;/p&gt;

&lt;pre&gt;	function showList(){
		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
&lt;p&gt;		simpsons.each( function(familyMember){
			alert(familyMember);
		});&lt;/p&gt;
	}
			&lt;/pre&gt;

&lt;p&gt;Bạn có thể nghĩ rằng &amp;quot;cần gì phải làm to chuyện, chỉ là nồi cũ vung mới thôi mà&amp;quot; Hãy khoan đã nào, ở ví dụ trên, đúng là chẳng có gì đặc biết cả. Sẽ chẳng có gì là thay đổi với một ví dụ đơn giản. Nhưng dù sao thì hãy cứ đọc tiếp đi nào. &lt;/p&gt;

&lt;p&gt;Trước khi chúng ta tiếp tục, bạn có thấy là hàm này được truyền dưới dạng tham số cho phương thức each hay không? Hãy bắt đầu thay nó bằng một &lt;strong&gt;hàm lặp&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="EnumeratingArrays"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Vài điều về mảng&lt;/h6&gt;

&lt;p&gt;Như chúng ta đã đề cập ở trên, việc tất cả các phần tử trong một mảng có cùng một type, cùng thuộc tính và phương thức là rất thông dụng. Hãy xem làm thế nào chúng ta có thể tận dụng ích lợi của các hàm lặp với các mảng mới này. &lt;/p&gt;

&lt;p&gt;Tìm một phần tử phù hợp với tiêu chuẩn. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function findEmployeeById(emp_id){
		var listBox = $('lstEmployees')
		var options = listBox.getElementsByTagName('option');
		options = $A(options);
		var opt = options.find( &lt;strong&gt;function(employee){
			return (employee.value == emp_id);
		}&lt;/strong&gt;);
		alert(opt.innerHTML); // hiển thị tên nhân viên
	}
&amp;lt;/script&amp;gt;

&amp;lt;select id=&amp;quot;lstEmployees&amp;quot; size=&amp;quot;10&amp;quot; &amp;gt;
	&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;Buchanan, Steven&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;8&amp;quot;&amp;gt;Callahan, Laura&amp;lt;/option&amp;gt;
	&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Davolio, Nancy&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Find Laura&amp;quot; onclick=&amp;quot;findEmployeeById(8);&amp;quot; &amp;gt; 
			&lt;/pre&gt;

&lt;p&gt;Bây giờ hãy thêm 1 mánh nữa nào. Xem làm sao chúng ta có thể lọc ra các phần tử trong các mảng, và chỉ lấy về 1 thành viên mong muốn của mỗi phần tử. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function showLocalLinks(paragraph){
		paragraph = $(paragraph);
		var links = $A(paragraph.getElementsByTagName('a'));
		//find links that do not start with 'http'
		var localLinks = links.findAll( function(link){
			var start = link.href.substring(0,4);
			return start !='http';
		});
		//now the link texts
		var texts = localLinks.pluck('innerHTML');
		//get them in a single string
		var result = texts.inspect();
		alert(result);
	}

&amp;lt;/script&amp;gt;
&amp;lt;p id=&amp;quot;someText&amp;quot;&amp;gt;
	This &amp;lt;a href=&amp;quot;http://othersite.com/page.html&amp;quot;&amp;gt;text&amp;lt;/a&amp;gt; has 
	a &amp;lt;a href=&amp;quot;#localAnchor&amp;quot;&amp;gt;lot&amp;lt;/a&amp;gt; of 
	&amp;lt;a href=&amp;quot;#otherAnchor&amp;quot;&amp;gt;links&amp;lt;/a&amp;gt;. Some are 
	&amp;lt;a href=&amp;quot;http://wherever.com/page.html&amp;quot;&amp;gt;external&amp;lt;/a&amp;gt;
	and some are &amp;lt;a href=&amp;quot;#someAnchor&amp;quot;&amp;gt;local&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;input type=button value=&amp;quot;Find Local Links&amp;quot; onclick=&amp;quot;showLocalLinks('someText')&amp;quot;&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Cần phải luyện tập nhiều thì mới có thể hoàn toàn quen thuộc với cú pháp này được. Hãy xem qua &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt; và &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Array"&gt;Array&lt;/a&gt; để tham khảo toàn bộ các hàm. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Tài liệu tra cứu cho prototype.js&lt;/h5&gt;
&lt;a name="Reference.Extensions"&gt;&lt;/a&gt;

&lt;h6&gt;Phần mở rộng cho các lớp JavaScript&lt;/h6&gt;

&lt;p&gt;Một trong số các cách mà thư viện prototype.js sử dụng để thêm các chức năng đó là mở rộng các lớp đã có sẵn của JavaScript. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.Object"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho lớp Object&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;extend(destination, source) 
  &lt;br /&gt;static 

  &lt;br /&gt;destination: bất cứ đối tượng nào, source: bất cứ đối tượng nào 

  &lt;br /&gt;Cung cấp 1 cách để khởi tạp sự kế thừa bằng cách sao chép toàn bộ các thuộc tính và phương thức từ source đến destination.&lt;/p&gt;

&lt;p&gt;inspect(targetObj) 
  &lt;br /&gt;static 

  &lt;br /&gt;targetObj: bất cứ đối tượng nào 

  &lt;br /&gt;Trả về một chuỗi dễ đọc biểu diễn cho targetObj. Nó mặc định là giá trị trả về của toString nếu đối tượng được gọi không định nghĩa phương thức inspect .&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.Number"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho lớp Number&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;toColorPart() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về con số dưới dạng thập lục phân. Hữu dụng khi muốn chuyển đổi thành phần màu RGB bên trong mã HTML.&lt;/p&gt;

&lt;p&gt;succ() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về số kế tiếp. Hàm này được sử dụng trong hoàn cảnh liên quan đến vòng lặp. &lt;/p&gt;

&lt;p&gt;times(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: đối tượng hàm phù hợp với Function(index) 

  &lt;br /&gt;Gọi lặp lại hàm iterator bằng cách truyền chỉ số hiện tại cho tham số index. &lt;/p&gt;

&lt;p&gt;Ví dụ dưới đây sẽ hiển thị hộp cách báo từ 0 đến 9. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	function demoTimes(){
		var n = 10;
		n.times(function(index){
			alert(index);
		});
		/***************************
		 * you could have also used: 
		 *           (10).times( .... ); 
		 ***************************/
	}

&amp;lt;/script&amp;gt;

&amp;lt;input type=button value=&amp;quot;Test Number.times()&amp;quot; onclick=&amp;quot;demoTimes()&amp;quot;&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho lớp Function&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;bind(object) 
  &lt;br /&gt;instance 

  &lt;br /&gt;object: đối tượng sở hữu phương thức 

  &lt;br /&gt;Trả về một khởi tạo của hàm có liên kết với đối tượng hàm (phương thức)chủ. Hàm trả về sẽ có cùng các tham số như hàm gốc.&lt;/p&gt;

&lt;p&gt;bindAsEventListener(object) 
  &lt;br /&gt;instance 

  &lt;br /&gt;object: đối tượng sở hữu phương thức 

  &lt;br /&gt;Trả về một khởi tạo của hàm có liên kết với đối tượng hàm (phương thức)chủ. Hàm trả về sẽ có đối tượng của sự kiện hiện tại là tham số của nó.&lt;/p&gt;

&lt;p&gt;Hãy xem những phần mở rộng này trong thực tế. &lt;/p&gt;

&lt;pre&gt;&amp;lt;input type=checkbox id=myChk value=1&amp;gt; Test?
&amp;lt;script&amp;gt;
	//declaring the class
	var CheckboxWatcher = Class.create();

	//định nghĩa toàn bộ việc khởi tạo lớp
	CheckboxWatcher.prototype = {

	   initialize: function(chkBox, message) {
			this.chkBox = $(chkBox);
			this.message = message;
			//assigning our method to the event
			&lt;p&gt;
			this.chkBox.onclick = 
			   this.showMessage.bindAsEventListener(this);
			&lt;/p&gt;
	   },

	   showMessage: function(evt) {
		  alert(this.message + ' (' + evt.type + ')');
	   }
	};


	var watcher = new CheckboxWatcher('myChk', 'Changed');
&amp;lt;/script&amp;gt;

			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.String"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho lớp String&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;stripTags() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một chuỗi mà không có thẻ HTML hay XML&lt;/p&gt;

&lt;p&gt;stripScripts() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về chuỗi mà không có các khối &amp;lt;script /&amp;gt;&lt;/p&gt;

&lt;p&gt;escapeHTML() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về chuỗi với các kí tự HTML đã được đánh dấu&lt;/p&gt;

&lt;p&gt;unescapeHTML() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Ngược lại với escapeHTML()&lt;/p&gt;

&lt;p&gt;extractScripts() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một đối tượng Array chứa các khối &amp;lt;script /&amp;gt; được tìm thấy với chuỗi.&lt;/p&gt;

&lt;p&gt;evalScripts() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Định giá trị của khối &amp;lt;script /&amp;gt; được tìm thấy trong chuỗi.&lt;/p&gt;

&lt;p&gt;toQueryParams() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Chia câu truy vấn thành các mảng có chỉ số bằng tên tham số (giống một mảng băm).&lt;/p&gt;

&lt;p&gt;parseQuery() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Giống như toQueryParams().&lt;/p&gt;

&lt;p&gt;toArray() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Chia chuỗi ra thành các mảng chứa các kí tự.&lt;/p&gt;

&lt;p&gt;camelize() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Chuyển đổi chuỗi không có dấu ngang thành chuỗi camelCaseString. Hàm này hữu dụng khi viết mã liên quan đến thuộc tính type, ví dụ như.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Array"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho lớp Array&lt;/h6&gt;

&lt;p&gt;Để bắt đầu, lớp Array mở rộng lớp Enumerable, do đó tất cả các phương thức tiện lợi trong đối tượng Enumerable đều có sẵn. Bên cạnh đó, những phương thức được liệt kê dưới đây cũng được khởi tạo. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;clear() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Làm rỗng mảng và trả lại chính mảng ấy.&lt;/p&gt;

&lt;p&gt;compact() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả lại mảng không chứa phần tử null hoặc undefined nào. Phương thức này không làm ảnh hưởng gì đến mảng.&lt;/p&gt;

&lt;p&gt;first() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về phần tử đầu tiên của mảng.&lt;/p&gt;

&lt;p&gt;flatten() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về mảng một chiều. Điều này được thực hiện bằng cách tìm mỗi các phần tử của mảng và thậm chí là các mảng. Sau đó thì hợp tất cả các phần tử vào mảng được trả về theo type truy hồi.&lt;/p&gt;

&lt;p&gt;indexOf(value) 
  &lt;br /&gt;instance 

  &lt;br /&gt;value: cái bạn cần tìm. 

  &lt;br /&gt;Trả về vị trí của value được cho nếu nó được tìm thấy trong mảng. Trả về -1 nếu value không có trong mảng. &lt;/p&gt;

&lt;p&gt;inspect() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Ghi đè lên để trả về một chuỗi có định dạng đẹp biểu diễn cho mảng đó bằng chính những phần tử của nó.&lt;/p&gt;

&lt;p&gt;last() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Returns the last element of the array.&lt;/p&gt;

&lt;p&gt;reverse([applyToSelf]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;applyToSelf: xác định nếu mảng này cần phải đảo ngược hay không. 

  &lt;br /&gt;Trả về mảng với vị trí đảo ngược. Nếu không có tham số nàm được cho hoặc nếu tham số có giá trị là true thì mảng cũng sẽ bị đảng ngược. Ngoài ra mảng sẽ được giữa nguyên. &lt;/p&gt;

&lt;p&gt;shift() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về phần tử đầu tiên của mảng, xóa nó ra khỏi mảng, giảm chiều dài của mảng đi 1.&lt;/p&gt;

&lt;p&gt;without(value1 [, value2 [, .. valueN]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;value1 ... valueN: giá trị sẽ được bỏ qua nếu nó có trong mảng. 

  &lt;br /&gt;Trả về mảng mà không chứa các phần tử đã được liệt kê trong danh sách tham số. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.DOM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho đối tượng DOMdocument&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;getElementsByClassName(className [, parentElement]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;className: tên của lớp CSS có liên quan đến các phần tửname of a CSS class associated with the elements, parentElement: đối tượng hay id của phần tử mà có chứa phần tử sẽ được nhận về. 

  &lt;br /&gt;Trả về tất cả các phần tử có liên quan đến lớp CSS được cho. Nếu không có id của parentElement thì toàn bộ phần thân văn bản sẽ được tìm kiếm. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Extensions.Event"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Phần mở rộng cho đối tượng Event&lt;/h6&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;KEY_BACKSPACE 
  &lt;br /&gt;Number 

  &lt;br /&gt;8: Hằng số. Mã cho phím Backspace.&lt;/p&gt;

&lt;p&gt;KEY_TAB 
  &lt;br /&gt;Number 

  &lt;br /&gt;9: Hằng số. Mã cho phím Tab.&lt;/p&gt;

&lt;p&gt;KEY_RETURN 
  &lt;br /&gt;Number 

  &lt;br /&gt;13: Hằng số. Mã cho phím Return.&lt;/p&gt;

&lt;p&gt;KEY_ESC 
  &lt;br /&gt;Number 

  &lt;br /&gt;27: Hằng số. Mã cho phím Esc.&lt;/p&gt;

&lt;p&gt;KEY_LEFT 
  &lt;br /&gt;Number 

  &lt;br /&gt;37: Hằng số. Mã cho phím mũi tên trái.&lt;/p&gt;

&lt;p&gt;KEY_UP 
  &lt;br /&gt;Number 

  &lt;br /&gt;38: Hằng số. Mã cho phím mũi tên lên.&lt;/p&gt;

&lt;p&gt;KEY_RIGHT 
  &lt;br /&gt;Number 

  &lt;br /&gt;39: Hằng số. Mã cho phím mũi tên phải.&lt;/p&gt;

&lt;p&gt;KEY_DOWN 
  &lt;br /&gt;Number 

  &lt;br /&gt;40: Hằng số. Mã cho phím mũi tên xuống.&lt;/p&gt;

&lt;p&gt;KEY_DELETE 
  &lt;br /&gt;Number 

  &lt;br /&gt;46: Hằng số. Mã cho phím Delete.&lt;/p&gt;

&lt;p&gt;observers: 
  &lt;br /&gt;Array 

  &lt;br /&gt;Liệt kê danh sách các bộ theo dõi . Đây là một phần chi tiết khởi tạo bên trong của đối tượng.&lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;element(event) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event 

  &lt;br /&gt;Trả về phần tử của sự kiện ban đầu.&lt;/p&gt;

&lt;p&gt;isLeftClick(event) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event 

  &lt;br /&gt;Trả về true nếu phím trái chuột được nhấn.&lt;/p&gt;

&lt;p&gt;pointerX(event) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event 

  &lt;br /&gt;Trả về tọa độ x của con trỏ chuột trên trang hiện hành.&lt;/p&gt;

&lt;p&gt;pointerY(event) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event 

  &lt;br /&gt;Trả về tọa độ y của con trỏ chuột trên trang hiện hành.&lt;/p&gt;

&lt;p&gt;stop(event) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event 

  &lt;br /&gt;Sử dụng hàm này để thoát khỏi hành vi mặc định của sự kiện, và ngăn không cho nó được truyền đi.&lt;/p&gt;

&lt;p&gt;findElement(event, tagName) 
  &lt;br /&gt;static 

  &lt;br /&gt;event: đối tượng Event, tagName: tên của thẻ mong muốn. 

  &lt;br /&gt;Duyệt lên trên cây DOM, tìm kiếm phần tử đầu tiên với tên thẻ được cho, bắt đầu tự phần tử của sự kiện ban đầu.&lt;/p&gt;

&lt;p&gt;observe(element, name, observer, useCapture) 
  &lt;br /&gt;static 

  &lt;br /&gt;element: đối tượng hay id, name: tên sự kiện (như 'click', 'load',... ), observer: hàm để điều khiển sự kiện , useCapture: nếu là true, điều khiển sự kiện trong phần &lt;em&gt;capture&lt;/em&gt; và nếu là false thì là trong phần &lt;em&gt;bubbling&lt;/em&gt;. 

  &lt;br /&gt;Thêm hàm điều khiển sự kiện vào sự kiện.&lt;/p&gt;

&lt;p&gt;stopObserving(element, name, observer, useCapture) 
  &lt;br /&gt;static 

  &lt;br /&gt;element: đối tượng hay id, name: tên sự kiện (như 'click'), observer: hàm để điều khiển sự kiện , useCapture: nếu là true, điều khiển sự kiện trong phần &lt;em&gt;capture&lt;/em&gt; và nếu là false thì là trong phần &lt;em&gt;bubbling&lt;/em&gt;. 

  &lt;br /&gt;Xóa hàm điều khiển sự kiện ra khỏi sự kiện.&lt;/p&gt;

&lt;p&gt;_observeAndCache(element, name, observer, useCapture) 
  &lt;br /&gt;static 

  &lt;br /&gt;Phương thức riêng, không cần quan tâm đến nó.&lt;/p&gt;

&lt;p&gt;unloadCache() 
  &lt;br /&gt;static 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức riêng, không cần quan tâm đến nó. Xóa toàn bộ các bộ theo dõi ra khỏi bộ nhớ.&lt;/p&gt;

&lt;p&gt;Hãy xem làm sao để sử dụng đối tượng này để thêm bộ điều khiển sử kiện, để nạp sự kiện của đối tượng window. &lt;/p&gt;

&lt;pre&gt;&amp;lt;script&amp;gt;
	Event.observe(window, 'load', showMessage, false);

	function showMessage() {
	  alert('Page loaded.');
	}
&amp;lt;/script&amp;gt;			
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.NewObjects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Các lớp và đối tượng mới được định nghĩa bởi prototype.js&lt;/h6&gt;

&lt;p&gt;Thư viện hỗ trợ bạn bằng cách cung cấp nhiều đối tượng được khởi tạo để hỗ trợ cho thiết kế hướng đối tượng và hỗ trợ các chức năng tổng quát. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.PeriodicalExecuter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng PeriodicalExecuter&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp phép logic để gọi nhiều lần 1 hàm, với số lượng thời gian được cho. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](callback, interval) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;callback: hàm không có tham số, interval:số giây 

  &lt;br /&gt;Tạo một khởi tạo của đối tượng mà gọi lặp lại hàm.&lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;callback 
  &lt;br /&gt;Function() 

  &lt;br /&gt;Hàm sẽ được gọi. Không có tham số nào sẽ được truyền vào.&lt;/p&gt;

&lt;p&gt;frequency 
  &lt;br /&gt;Number 

  &lt;br /&gt;Khoảng thời gian (giây)&lt;/p&gt;

&lt;p&gt;currentlyExecuting 
  &lt;br /&gt;Boolean 

  &lt;br /&gt;Xác định xem nếu hàm đang được gọi&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Prototype"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Prototype&lt;/h6&gt;

&lt;p&gt;Đối tượng Prototype không có vai trò quan trọng gì ngoài việc khai báo phiên bản của thư viện đang sử dụng. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;Version 
  &lt;br /&gt;String 

  &lt;br /&gt;Phiên bản của thư viện&lt;/p&gt;

&lt;p&gt;emptyFunction 
  &lt;br /&gt;Function() 

  &lt;br /&gt;Một đối tượng hàm rỗng&lt;/p&gt;

&lt;p&gt;K 
  &lt;br /&gt;Function(obj) 

  &lt;br /&gt;Một đối tượng hàm trả về tham số được cho.&lt;/p&gt;

&lt;p&gt;ScriptFragment 
  &lt;br /&gt;String 

  &lt;br /&gt;Biểu thức chính qui dùng để xác định mã lệnh&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Enumerable"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Enumerable&lt;/h6&gt;

&lt;p&gt;Đối tượng Enumerable cho phép viết mã gọn gàng hơn khi phải lặp lại nhiều phần tử trong cấu trúc tương tự như danh sách. &lt;/p&gt;

&lt;p&gt;Có rất nhiều đối tượng thừa kế đối tượng Enumerable để sử dụng hiệu quả hơn giao diện(interface) của nó. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;each(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Gọi lặp lại hàm được cho, truyền mỗi phần tử trong danh sách vào tham số thứ 1, và vị trí của phần tử vào tham số thứ 2.&lt;/p&gt;

&lt;p&gt;all([iterator]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Hàm này dùng để kiểm tra toàn bộ các giá trị bằng cách sử dụng hàm được truyền. all sẽ trả về false nếu hàm lặp trả về false hoặc null cho bất cử phần tử nào. Ngược lại, nó sẽ trả về true. Nếu không có iterator nào được truyền vào, thì sự kiểm tra này sẽ tốt nếu bản thân phần tử là khác false hoặc null. Bạn có thể hiểu đơn giản như sau &amp;quot;kiểm tra tất cả các phần tử mà không phải là false.&amp;quot; &lt;/p&gt;

&lt;p&gt;any(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index)(tùy chọn). 

  &lt;br /&gt;Hàm này dùng để kiểm tra toàn bộ các giá trị bằng cách sử dụng hàm được truyền. any trả về true nếu hàm lặp không trả về false hoặc null cho bất cứ phần tử nào. Ngược lại, nó sẽ trả về false . Nếu không có iterator nào được truyền vào, thì sự kiểm tra này sẽ tốt nếu bản thân phần tử là khác false hoặc null.Bạn có thể hiểu đơn giản như sau &amp;quot;kiểm tra bất cứ phần tử mà không phải là false.&amp;quot; &lt;/p&gt;

&lt;p&gt;collect(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Gọi hàm lặp cho mỗi phần tử bên trong tập hợp và trả về mỗi kết quả trong một Array, một kết quả cho mỗi phần tử bên trong tập hợp theo cách tuần tự. &lt;/p&gt;

&lt;p&gt;detect(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Gọi hàm lặp cho mỗi phần tử trong tập hợp và trả về phần tử đầu tiên khiến cho hàm lặp trả về giá trị true (hoặc không false). Nếu không có phần tử nào trả về giá trị true thì detect trả về null. &lt;/p&gt;

&lt;p&gt;entries() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Giống như toArray(). &lt;/p&gt;

&lt;p&gt;find(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator:một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Giống như detect(). &lt;/p&gt;

&lt;p&gt;findAll(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator:một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Gọi hàm lặp cho mỗi phần tử trong tập hợp và trả về một Array với tất cả các phần tử mà làm cho hàm lặp trả về giá trị true. Hàm này ngược lại với hàm reject(). &lt;/p&gt;

&lt;p&gt;grep(pattern [, iterator]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;pattern: một đối tượng RegExp dùng để so sánh các phần tử, iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Kiểm tra giá trị chuỗi của mỗi phần tử trong tập hợp với pattern của biểu thức chính qui (regular expression). Hàm này sẽ trả về một Array chứa toàn bộ các phần tử phù hợp với biểu thức chính qui. Nếu hàm lặp được truyền thì Array sẽ chứa kết quả của lời gọi từ hàm lặp này tương ứng với mỗi phần tử. &lt;/p&gt;

&lt;p&gt;include(obj) 
  &lt;br /&gt;instance 

  &lt;br /&gt;obj: bất cứ đối tượng nào 

  &lt;br /&gt;Cố gắng tìm đối tượng được cho trong tập hợp. Trả về true nếu đối tượng được tìm thấy, false nếu ngược lại. &lt;/p&gt;

&lt;p&gt;inject(initialValue, iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;initialValue: bất cứ đối tượng nào được dùng như giá trị khởi đầu, iterator: một đối tượng hàm có dạng Function(accumulator, value, index) 

  &lt;br /&gt;Kết hợp tất cả các phần tử trong tập hợp bằng cách sử dụng hàm lặp. Bộ lặp (iterator) sẽ được gọi để truyền kết quả của vòng lặp trước vào bộ đếm (accumulator). Vòng lặp đầu tiên lấy initialValue trong tham số bộ đếm . Kết quả cuối cùng là cái cuối cùng trả về giá trị. &lt;/p&gt;

&lt;p&gt;invoke(methodName [, arg1 [, arg2 [...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;methodName: tên của phương thức sẽ được gọi bởi mỗi phần tử, arg1..argN: các tham số sẽ được truyền vào phương thức. 

  &lt;br /&gt;Gọi các phương thức được xác định bởi Phương thứcName đối với mỗi phần tử của tập hợp , truyền các tham số đã cho (arg1 ... argN), và trả kết quả về trong đối tượng Array. &lt;/p&gt;

&lt;p&gt;map(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Giống như collect(). &lt;/p&gt;

&lt;p&gt;max([iterator]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator:một đối tượng hàm có dạng Function(value, index)(tùy chọn) 

  &lt;br /&gt;Trả về phần tử có có giá trị lớn nhất trong tập hợp hoặc kết quả lớn hoặc kết quả lớn nhất có được từ lời gọi các hàm lặp đối với mỗi phần tử nếu hàm lặp được chỉ định. &lt;/p&gt;

&lt;p&gt;member(obj) 
  &lt;br /&gt;instance 

  &lt;br /&gt;obj: bất cứ đối tượng nào 

  &lt;br /&gt;Giống như include(). &lt;/p&gt;

&lt;p&gt;min([iterator]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Trả về phần tử có có giá trị nhỏ nhất trong tập hợp hoặc kết quả lớn hoặc kết quả nhỏ nhất có được từ lời gọi các hàm lặp đối với mỗi phần tử nếu hàm lặp được chỉ định. &lt;/p&gt;

&lt;p&gt;partition([iterator]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator:một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Trả về Array chứa 2 mảng khác. Mảng đầu tiên chứa toàn bộ các phần tử mà làm cho hàm lặp trả về giá trị true và mảng thứ 2 chứ các phần tử còn lại. Nếu hàm lặp không được chỉ định, thì mảng đầu tiên sẽ chứa các phần tử có giá trị true và mảng thứ 2 chứa các phần tử còn lại. &lt;/p&gt;

&lt;p&gt;pluck(propertyName) 
  &lt;br /&gt;instance 

  &lt;br /&gt;propertyName: tên thuộc tính sẽ được đọc bởi các phần tử. Và cũng có thể là vị trí của các phần tử 

  &lt;br /&gt;Trả về giá trị của thuộc tính xác định bởi propertyName ứng với mỗi phần tử trong tập hợp và trả về kết quả cho một đối tượng Array. &lt;/p&gt;

&lt;p&gt;reject(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Gọi hàm lặp cho mỗi đối tượng trong tập hợp và trả về một Array với tất cả các phần tử làm cho hàm lặp trả về giá trị false. Hàm này ngược với hàm findAll(). &lt;/p&gt;

&lt;p&gt;select(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Giống như findAll(). &lt;/p&gt;

&lt;p&gt;sortBy(iterator) 
  &lt;br /&gt;instance 

  &lt;br /&gt;iterator:một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Trả về một Array với tất cả các phần tử được sắp xếp dựa và kết quả của gọi của hàm lặp. &lt;/p&gt;

&lt;p&gt;toArray() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một Array với tất cả các phần tử của tập hợp. &lt;/p&gt;

&lt;p&gt;zip(collection1[, collection2 [, ... collectionN [,transform]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;collection1 .. collectionN: những tập hợp cần được hợp lại, transform: một đối tượng hàm có dạng Function(value, index) 

  &lt;br /&gt;Kết hợp mỗi tập hợp được cho vào tập hợp hiện tại. Hành động kết hợp này trả về một mảng mới với cùng 1 số lượng phần tử với tập hợp hiện tại và mỗi phần tử là một mảng (hãy gọi nó là mảng con) của những phần tử có cùng vị trí từ những tập hợp được ghép lại. Nếu hàm chuyển đổi (transform function) được chỉ định, thì mỗi mảng con sẽ được chuyển đổi bởi hàm này trước khi được trả về. Ví dụ nhanh : [1,2,3].zip([4,5,6], [7,8,9]).inspect() returns &amp;quot;[ [1,4,7],[2,5,8],[3,6,9] ]&amp;quot; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Hash"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Hash&lt;/h6&gt;

&lt;p&gt;Đối tượng Hash khởi tạo một cấu trúc băm (hash structure), ví dụ: một tập hợp của các cặp Key:Value . &lt;/p&gt;

&lt;p&gt;Mỗi phần trong đối tượng Hash làm một mảng với 2 phần tử: đầu tiên là key, sau đó là value. Mỗi phần có 2 thuộc tính key và value . &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;keys() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một Array chứa các key của mọi thành phần. &lt;/p&gt;

&lt;p&gt;values() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một Array chứa các giá trị của mọi thành phần. &lt;/p&gt;

&lt;p&gt;merge(otherHash) 
  &lt;br /&gt;instance 

  &lt;br /&gt;otherHash: đối tượng Hash 

  &lt;br /&gt;Kết hợp đối tượng băm này với đối tượng được truyền vào và trả về một kết quả băm mới. &lt;/p&gt;

&lt;p&gt;toQueryString() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về toàn bộ các thành phần của đối tượng băm dưới dạng chuỗi, giống như chuỗi truy vấn. 'key1=value1&amp;amp;key2=value2&amp;amp;key3=value3'&lt;/p&gt;

&lt;p&gt;inspect() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Ghi đè để trả về một chuỗi có định dạng đẹp biểu diễn hash với các cặp key:value của nó. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.ObjectRange"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp ObjectRange&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Biểu diễn một vùng các giá trị, với giới hạn trên và dưới. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;start 
  &lt;br /&gt;(any) 

  &lt;br /&gt;instance 

  &lt;br /&gt;Giới hạn dưới của vùng&lt;/p&gt;

&lt;p&gt;end 
  &lt;br /&gt;(any) 

  &lt;br /&gt;instance 

  &lt;br /&gt;Giới hạn dưới của vùng&lt;/p&gt;

&lt;p&gt;exclusive 
  &lt;br /&gt;Boolean 

  &lt;br /&gt;instance 

  &lt;br /&gt;Xác định các giới hạn được cho có phải thuộc vùng đó không. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](start, end, exclusive) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;start: giới hạn dưới, end: giới hạn trên, exclusive: bao gồm cả giới hạn của vùng? 

  &lt;br /&gt;Tạo một đối tượng vùng, bắt đầu từ start đến end. Cần phải nhớ rằng start và end cần phải là đối tượng của cùng một type và chún phải có một phương thức succ() . &lt;/p&gt;

&lt;p&gt;include(searchedValue) 
  &lt;br /&gt;instance 

  &lt;br /&gt;searchedValue: giá trị cần tìm 

  &lt;br /&gt;Kiểm tra xem giá trị được cho có nằm trong vùng hay không. Trả về true hoặc false. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Class"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Class&lt;/h6&gt;

&lt;p&gt;Đối tượng Class được sử dụng khi khai báo các lớp khác trong thư viện Sử dụng đối tượng này khi khai báo một lớp mà được tạo để hỗ trợ phương thức initialize(). Phương thức này được sử dụng như phương thức khởi tạo. &lt;/p&gt;

&lt;p&gt;Xem ví dụ phía dưới. &lt;/p&gt;

&lt;pre&gt;//khai báo lớp
var MySampleClass = Class.create();

//định nghĩ toàn bộ khởi tạo lớp
MySampleClass.prototype = {

   initialize: function(message) {
		this.message = message;
   },

   showMessage: function(ajaxResponse) {
      alert(this.message);
   }
};	

//khởi tạo một đối tượng mới
var myTalker = new MySampleClass('hi there.');
myTalker.showMessage(); //hiển thị thông báo

			&lt;/pre&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;type 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;create(*) 
  &lt;br /&gt;instance 

  &lt;br /&gt;(any) 

  &lt;br /&gt;Định nghĩa một phương thức khởi tạo cho lớp mới&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Reference.Ajax"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Ajax&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp các chức năng AJAX cho nhiều lớp khác. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;activeRequestCount 
  &lt;br /&gt;Number 

  &lt;br /&gt;instance 

  &lt;br /&gt;Số lượng các yêu cầu AJAX hiện đang thực thi.&lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;type 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;getTransport() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về một đối tượng XMLHttpRequest&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.Responders"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Ajax.Responders&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Đây là đối tượng duy trì một danh sách các đối tượng sẽ được gọi khi các sự kiện Ajax xảy ra. Bạn có thể sử dụng đối tượng này , ví dụ khi bạn muốn tạo một phương thức điều khiển ngoại lệ toàn cục (global exception handler) cho các thao tác AJAX. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;responders 
  &lt;br /&gt;Array 

  &lt;br /&gt;instance 

  &lt;br /&gt;Danh sách các đối tượng được đăng kí cho các thông báo về sự kiện AJAX. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;register(responderToAdd) 
  &lt;br /&gt;instance 

  &lt;br /&gt;responderToAdd: đối tượng mà có những phương thức được gọi 

  &lt;br /&gt;Đối tượng được truyền vào tham số responderToAdd phải có những phương thức liên quan đến sự kiện của AJAX (ví dụ onCreate, onComplete, onException, ...). Khi sự kiện tương ứng xảy ra, tất cả các đối tượng đã được đăng ký mà chứa một phương thức phù hợp sẽ được gọi. &lt;/p&gt;

&lt;p&gt;unregister(responderToRemove) 
  &lt;br /&gt;instance 

  &lt;br /&gt;responderToRemove: đối tượng sẽ được xóa khỏi danh sách. 

  &lt;br /&gt;Đối tượng được truyền vào tham số responderToRemove sẽ được xóa khỏi danh sách những đối tượng đã được đăng ký. &lt;/p&gt;

&lt;p&gt;dispatch(callback, request, transport, json) 
  &lt;br /&gt;instance 

  &lt;br /&gt;callback: tên sự kiện AJAX sẽ được thông báo, request: đối tượng Ajax.Request tương ứng với sự kiện, transport: đối tượng XMLHttpRequest mang lời gọi AJAX , json: X-JSON header để hồi đáp (nếu có) 

  &lt;br /&gt;Duyệt qua danh sách các đối tượng đã được đăng ký để tìm xem có phương thức nào được xác định trong tham sốcallback. Và sau đó những tham số được gọi sẽ được truyền vào 3 tham số còn lại. Nếu lời hồi đáp của AJAX có chứa X-JSON HTTP header với một số thành phần JSON, thi nó sẽ được định giá trị và truyền vào tham số json. Nếu sự kiện là onException, thì tham số transport sẽ có ngoại lệ, và tham sốjson sẽ không được truyền. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.Base"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Ajax.Base&lt;/h6&gt;

&lt;p&gt;Lớp này được sử dụng như lớp nền tảng cho hầu hết các lớp khác được định nghĩa trong đối tượng Ajax. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;setOptions(options) 
  &lt;br /&gt;instance 

  &lt;br /&gt;options: &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;AJAX options&lt;/a&gt; 

  &lt;br /&gt;Xác lập &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;options&lt;/a&gt; mong muốn cho thao tác AJAX&lt;/p&gt;

&lt;p&gt;responseIsSuccess() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về true nếu thao tác AJAX thành công, ngược lại thì false&lt;/p&gt;

&lt;p&gt;responseIsFailure() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Ngược lại với responseIsSuccess().&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Ajax.Request&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Base"&gt;Ajax.Base&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Đóng gói các thao tác AJAX &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;Events 
  &lt;br /&gt;Array 

  &lt;br /&gt;static 

  &lt;br /&gt;Danh sách các sự kiện/tình trạng có khả năng được báo về trong quá trình diễn ra thao tác AJAX. Danh sách chứa: 'Uninitialized', 'Loading', 'Loaded', 'Interactive', và 'Complete'&lt;/p&gt;

&lt;p&gt;transport 
  &lt;br /&gt;XMLHttpRequest 

  &lt;br /&gt;instance 

  &lt;br /&gt;Đối tượng XMLHttpRequest có mang thao tách AJAX. &lt;/p&gt;

&lt;p&gt;url 
  &lt;br /&gt;String 

  &lt;br /&gt;instance 

  &lt;br /&gt;URL được yêu cầu(request) nhắm đến.&lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](url, options) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;url: url sẽ được mở, options: lựa chọn AJAX 

  &lt;br /&gt;Tạo một khởi tạo của đối tượng sẽ gọi url được chỉ định và sử dụng options. Sự kiện onCreate sẽ được gọi khi phương thức khởi tạo được gọi. &lt;strong&gt;Quan trọng:&lt;/strong&gt; Nó không đáng là gì nếu như url được cho dính dáng đến đến cài đặt bảo mật của trình duyệt. Trong nhiều trường hợp, trình duyệt sẽ không mở url nếu nó không phải từ một máy ( hay tên miền) so với trang hiện tại. Bạn chỉ nên sử dụng những url cục bộ để tránh phải chỉnh sửa hay hạn chế trình duyệt của người dùng.(Cám ơn Clay) &lt;/p&gt;

&lt;p&gt;evalJSON() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi từ bên trong để định giá trị nội dung của X-JSON HTTP header hiện diện trong hồi đáp của AJAX.&lt;/p&gt;

&lt;p&gt;evalResponse() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nếu hồi đáp của AJAX có header Content-type là text/javascript thì phần thân của hồi đáp sẽ được định giá trị và hàm này sẽ được sử dụng.&lt;/p&gt;

&lt;p&gt;header(name) 
  &lt;br /&gt;instance 

  &lt;br /&gt;name: HTTP header name 

  &lt;br /&gt;Lấy về nội dung của bất cứ HTTP header nào của hồi đáp AJAX. Chỉ gọi hàm này sau khi lời gọi AJAX đã kết thúc.&lt;/p&gt;

&lt;p&gt;onStateChange() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó sẽ tự gọi chính nó khi trạng thái của lời gọi AJAX thay đổi.&lt;/p&gt;

&lt;p&gt;request(url) 
  &lt;br /&gt;instance 

  &lt;br /&gt;url: url cho lời gọi AJAX 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó đã được gọi trong khi phương thức khởi tạo được gọi.&lt;/p&gt;

&lt;p&gt;respondToReadyState(readyState) 
  &lt;br /&gt;instance 

  &lt;br /&gt;readyState: số biểu diễn trạng thái (1 to 4) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó sẽ tự gọi chính nó khi trạng thái của lời gọi AJAX thay đổi.&lt;/p&gt;

&lt;p&gt;setRequestHeaders() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng này để thu tập HTTP header mà sẽ được gởi trong quá trình yêu cầu HTTP (HTTP request).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.options"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng tham số options&lt;/h6&gt;

&lt;p&gt;Một phần quan trong trong các thao tác AJAX là tham số options. There's no options class per se. Tất cả các đối tượng sẽ được truyền cho đến khi nó vẫn còn những thuộc tính phù hợp. Việc tạo một đối tượng vô danh chỉ cho lời gọi AJAX là bình thường. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Mặc định 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;String 

  &lt;br /&gt;'post' 

  &lt;br /&gt;Phương thức của yêu cầu HTTP&lt;/p&gt;

&lt;p&gt;parameters 
  &lt;br /&gt;String 

  &lt;br /&gt;'' 

  &lt;br /&gt;danh sách các giá trị được truyền cho yêu cầu&lt;/p&gt;

&lt;p&gt;asynchronous 
  &lt;br /&gt;Boolean 

  &lt;br /&gt;true 

  &lt;br /&gt;Xác định xem lời gọi AJAX sẽ được làm bất đồng bộ&lt;/p&gt;

&lt;p&gt;postBody 
  &lt;br /&gt;String 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Nội dung sẽ được truyền vào phần thân của yêu cầu trong trường hợp của HTTP POST&lt;/p&gt;

&lt;p&gt;requestHeaders 
  &lt;br /&gt;Array 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Danh sách các HTTP header được truyền cho yêu cầu. Danh sách này phải có một số chẵn các mục ,mục mang số lẻ nào cũng là tên của header tùy ý,và mục chẵn tiếp theo đó là giá trị chuỗi của header đó. Ví dụ:['my-header1', 'đây là giá trị', 'my-other-header', 'một giá trị khác']&lt;/p&gt;

&lt;p&gt;onXXXXXXXX 
  &lt;br /&gt;Function(XMLHttpRequest, Object) 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Hàm tùy ý sẽ được gọi khi đến sự kiện/trạng thái tương ứng trong quá trình gọi AJAX. Ví dụ var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. Hàm được dùng sẽ nhận 1 tham số, có chứa đối tượng XMLHttpRequest có mang thao tác AJAX và một tham số khác có chứa hồi đáp HTTP header X-JSON.&lt;/p&gt;

&lt;p&gt;onSuccess 
  &lt;br /&gt;Function(XMLHttpRequest, Object) 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Hàm tùy ý sẽ được gọi khi lời gọi AJAX kết thúc thành công. Hàm được dùng sẽ nhận 1 tham số, có chứa đối tượng XMLHttpRequest có mang thao tác AJAX và một tham số khác có chứa hồi đáp HTTP header X-JSON.&lt;/p&gt;

&lt;p&gt;onFailure 
  &lt;br /&gt;Function(XMLHttpRequest, Object) 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Hàm tùy ý sẽ được gọi khi lời gọi AJAX kết thúc có lỗi. Hàm được dùng sẽ nhận 1 tham số, có chứa đối tượng XMLHttpRequest có mang thao tác AJAX và một tham số khác có chứa hồi đáp HTTP header X-JSON.&lt;/p&gt;

&lt;p&gt;onException 
  &lt;br /&gt;Function(Ajax.Request, exception) 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Hàm tùy ý sẽ được gọi khi có ngoại lệ xảy ra trên máy khách khi gọi AJAX, như hồi đáp,tham số không hợp lệ. Hàm được dùng sẽ nhận 2 tham số, có chứa đối tượng Ajax.Request. Đối tượng này bao gồm các thao tác AJAX và các đối tượng ngoại lệ.&lt;/p&gt;

&lt;p&gt;insertion 
  &lt;br /&gt;an Insertion class 

  &lt;br /&gt;undefined 

  &lt;br /&gt;Một lớp sẽ xác định xem nội dung mới sẽ được thêm vào như thế nào. Nó có thể là &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Before"&gt;Insertion.Before&lt;/a&gt;, &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Top"&gt;Insertion.Top&lt;/a&gt;, &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.Bottom"&gt;Insertion.Bottom&lt;/a&gt;, hoặc &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Insertion.After"&gt;Insertion.After&lt;/a&gt;. Chỉ áp dụng cho các đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Ajax.Updater&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;evalScripts 
  &lt;br /&gt;Boolean 

  &lt;br /&gt;undefined, false 

  &lt;br /&gt;Xác định xem các khối mã sẽ được định giá trị khi hồi có hồi đáp hay không. Chỉ áp dụng cho các đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Ajax.Updater&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;decay 
  &lt;br /&gt;Number 

  &lt;br /&gt;undefined, 1 

  &lt;br /&gt;Xác định sự chậm trễ trong tần số làm tươi của đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.PeriodicalUpdater"&gt;Ajax.PeriodicalUpdater&lt;/a&gt; khi hồi đáp nhận được là giống với cái trước đấy. Ví dụ, nếu bạn sử dụng 2, thì sau khi làm có kết quả làm tươi giống với cái trước đó thì đối tượng sẽ phải chờ nhiều gấp 2 lần thời gian cho lần làm tươi tới. Và nếu nó lặp lại, thì lần sau đối tượng phải chờ nhiều gấp 4 lần thời gian, và cứ như thế. Không ghi hoặc sử dụng 1 để tránh sự chậm trễ này. &lt;/p&gt;

&lt;p&gt;frequency 
  &lt;br /&gt;Number 

  &lt;br /&gt;undefined, 2 

  &lt;br /&gt;Chu kỳ (không phải tần số) giữa các lần làm tươi . Chỉ áp dụng cho các đối tượng &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.PeriodicalUpdater"&gt;Ajax.PeriodicalUpdater&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.Updater"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Ajax.Updater&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Request"&gt;Ajax.Request&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Được sử dụng khi url được yêu cầu trả về mã HTML, và bạn muốn thêm mã này trực tiếp vào một phần tử xách định trong trang. Bạn có thể sử dụng đối tượng này khi url trả về các khối &amp;lt;mã&amp;gt; mà sẽ được định giá trị khi kết thúc. Sử dụng tùy chọn evalScripts để làm việc với mã lệnh. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;containers 
  &lt;br /&gt;Object 

  &lt;br /&gt;instance 

  &lt;br /&gt;Đối tượng này có 2 thuộc tính: containers.success sẽ được dùng khi lời gọi AJAX thành công và ngược lại containers.failure sẽ được dùng.&lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](container, url, options) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;container:có thể là id của một phần tử, hoặc chính phần tử đó, hay là một đối tượng có 2 thuộc tính - phần tử (hoặc id) của &lt;strong&gt;object.success&lt;/strong&gt; element (or id) that sẽ được dùng khi lời gọi AJAX thành công, và ngược lại phần tử (id) của &lt;strong&gt;object.failure&lt;/strong&gt; sẽ được dùng. url: url sẽ được mở, options: &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;AJAX options&lt;/a&gt; 

  &lt;br /&gt;Tạo một khởi tạo của đối tượng sẽ gọi url sử dụng options được cho.&lt;/p&gt;

&lt;p&gt;updateContent() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng đó khi hồi đáp được nhận. Nó sẽ cập nhật phần tử tương ứng với HTML hoặc gọi hàm được truyền vào lựa chọn insertion. Hàm này được gọi với 2 tham số, phần tử sẽ được cập nhật và trả lời. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Ajax.PeriodicalUpdater"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Ajax.PeriodicalUpdater&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Base"&gt;Ajax.Base&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hàm này lặp lại việc khởi tạo và sử dụng đối tượng Ajax.Updater để làm tươi một phần tử của trang, hoặc để thực hiện một số nhiệm vụ khác mà lớp Ajax.Updater có thể thực hiện. Xem &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Ajax.Updater reference&lt;/a&gt; để có thêm thông tin. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;container 
  &lt;br /&gt;Object 

  &lt;br /&gt;instance 

  &lt;br /&gt;Giá trị này sẽ được truyền thẳng vào phương thức khởi tạo của Ajax.Updater.&lt;/p&gt;

&lt;p&gt;url 
  &lt;br /&gt;String 

  &lt;br /&gt;instance 

  &lt;br /&gt;Giá trị này sẽ được truyền thẳng vào phương thức khởi tạo của Ajax.Updater.&lt;/p&gt;

&lt;p&gt;frequency 
  &lt;br /&gt;Number 

  &lt;br /&gt;instance 

  &lt;br /&gt;Chu kỳ (không phải tần số) giữa các lần làm tươi (giây). Mặc định là 2 giây. Số này sẽ được nhân với decay hiện tại sử dụng đối tượng Ajax.Updater. &lt;/p&gt;

&lt;p&gt;decay 
  &lt;br /&gt;Number 

  &lt;br /&gt;instance 

  &lt;br /&gt;Giữ mức độ decay hiện tại khi xử lý lại tác vụ. &lt;/p&gt;

&lt;p&gt;updater 
  &lt;br /&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.Updater"&gt;Ajax.Updater&lt;/a&gt; 

  &lt;br /&gt;instance 

  &lt;br /&gt;Đối tượng Ajax.Updater được sử dụng gần đây nhất&lt;/p&gt;

&lt;p&gt;timer 
  &lt;br /&gt;Object 

  &lt;br /&gt;instance 

  &lt;br /&gt;Timer của JavaScript được sử dụng để báo cáo đối tượng khi đã đến thời gian cho lần làm tươi kế tiếp.&lt;/p&gt;

&lt;p&gt;Loại &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](container, url, options) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;container:có thể là id của một phần tử, hoặc chính phần tử đó, hay là một đối tượng có 2 thuộc tính - phần tử (hoặc id) của &lt;strong&gt;object.success&lt;/strong&gt; element (or id) that sẽ được dùng khi lời gọi AJAX thành công, và ngược lại phần tử (id) của &lt;strong&gt;object.failure&lt;/strong&gt; sẽ được dùng. url: url sẽ được mở, options: &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Ajax.options"&gt;AJAX options&lt;/a&gt; 

  &lt;br /&gt;Tạo một khởi tạo của đối tượng sẽ gọi url sử dụng options được cho.&lt;/p&gt;

&lt;p&gt;start() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng đó khi bắt đầu thực hiện những tác vụ có tính chu kỳ. &lt;/p&gt;

&lt;p&gt;stop() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Làm đối tượng dừng thực hiện các tác vụ chu kỳ của nó. Sau khi dừng lại, đối tượng sẽ gọi callback được xác định trong lựa chọn onComplete (nếu có). &lt;/p&gt;

&lt;p&gt;updateComplete() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi đối tượng Ajax.Updater được sử dụng gần đây, sau khi nó đã hoàn tất yêu cầu. Nó được dùng để sắp xếp cho lần làm tươi kế tiếp. &lt;/p&gt;

&lt;p&gt;onTimerEvent() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi từ bên trong khi đã đến thời gian cho lần cập nhật kết tiếp. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Element"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Element&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp những hàm tiện ích để chỉnh sửa các phần tử trong DOM. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;addClassName(element,className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, className: tên của lớp CSS 

  &lt;br /&gt;Thêm tên của lớp được cho vào tên của lớp phần tử. &lt;/p&gt;

&lt;p&gt;classNames(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element:đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về đối tượng Element.ClassNames biểu diễn tên của lớp CSS có liên quan đến phần tử được cho.&lt;/p&gt;

&lt;p&gt;cleanWhitespace(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Xóa những khoảng trắng giữa 2 nút con của phần tử&lt;/p&gt;

&lt;p&gt;empty(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về giá trị Boolean xách định xem nếu thẻ của phần tử có rỗng hay không (hoặc chỉ có khoảng trắng)&lt;/p&gt;

&lt;p&gt;getDimensions(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về kích thước của phần tử.Giá trị trả về là một đối tượng với 2 thuộc tính: height và width. &lt;/p&gt;

&lt;p&gt;getHeight(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về giá trị offsetHeight của phần tử&lt;/p&gt;

&lt;p&gt;getStyle(element, cssProperty) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, tên cssProperty của một thuộc tính CSS (dạng 'prop-name' hay 'propName' đều hoạt động). 

  &lt;br /&gt;Trả về giá trị của thuộc tính CSS trong phần tử được cho hoặc null nếu không có.&lt;/p&gt;

&lt;p&gt;hasClassName(element, className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, className: tên của lớp CSS 

  &lt;br /&gt;Trả về true nếu phần tử có tên lớp được cho là một trong những tên lớp của nó.&lt;/p&gt;

&lt;p&gt;hide(elem1 [, elem2 [, elem3 [...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;elemN: đối tượng phần tử hoặc id 

  &lt;br /&gt;Giấu các phần tử bằng cách đặt giá trị style.display là 'none'. &lt;/p&gt;

&lt;p&gt;makeClipping(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id&lt;/p&gt;

&lt;p&gt;makePositioned(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Thay đổi style.position của phần tử thành 'relative'&lt;/p&gt;

&lt;p&gt;remove(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Xóa phần tử ra khỏi văn bản.&lt;/p&gt;

&lt;p&gt;removeClassName(element, className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, className: tên của lớp CSS 

  &lt;br /&gt;Xóa tên lớp được cho trong các tên lớp của phần tử. &lt;/p&gt;

&lt;p&gt;scrollTo(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Cuộn cửa sổ đến vị trí của phần tử. &lt;/p&gt;

&lt;p&gt;setStyle(element, cssPropertyHash) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, cssPropertyHash: đối tượng Hash với các type(style) được áp dụng. 

  &lt;br /&gt;Đặt giá trị của các thuộc tính CSS vào đối tượng được cho tùy thuộc vào các giá trị trong tham số cssPropertyHash.&lt;/p&gt;

&lt;p&gt;show(elem1 [, elem2 [, elem3 [...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;elemN: đối tượng phần tử hoặc id 

  &lt;br /&gt;Thể hiện mỗi phần tử bằng cách đặt lại style.display thành ''. &lt;/p&gt;

&lt;p&gt;toggle(elem1 [, elem2 [, elem3 [...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;elemN: đối tượng phần tử hoặc id 

  &lt;br /&gt;Bật khả năng khả hiện của mỗi phần tử.&lt;/p&gt;

&lt;p&gt;undoClipping(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id&lt;/p&gt;

&lt;p&gt;undoPositioned(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Đặt style.position của phần tử thành ''&amp;lt;/SPANCLASS=&amp;quot;CODE&amp;quot;&amp;gt;&lt;/p&gt;

&lt;p&gt;update(element,html) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, html: nội dung html 

  &lt;br /&gt;Thay thế html bên trong (inner html) của phần tử với tham số html được cho. Nếu html được cho có chứa khối &amp;lt;script&amp;gt; nó sẽ không được thêm vào nhưng sẽ được định giá trị. &lt;/p&gt;

&lt;p&gt;visible(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về một giá trị Boolean xác định xem phần tử có hiện thị hay không.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Element.ClassNames"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Element.ClassNames&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kết thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Reference.Enumerable"&gt;Enumerable&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Biểu diễn tập hợp tên các lớp CSS có liên quan đến một phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element:bất kỳ đối tượng phần tử hoặc id DOM nào 

  &lt;br /&gt;Tạo một đối tượng Element.ClassNames biểu diễn tên lớp CSS của phần tử được cho. &lt;/p&gt;

&lt;p&gt;add(className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;className: tên lớp CSS 

  &lt;br /&gt;Thêm tên lớp CSS được cho vào danh sách tên lớp liên quan đến phần tử. &lt;/p&gt;

&lt;p&gt;remove(className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;className: tên lớp CSS 

  &lt;br /&gt;Xóa tên lớp CSS được cho ra khỏi danh sách tên lớp liên quan đến phần tử. &lt;/p&gt;

&lt;p&gt;set(className) 
  &lt;br /&gt;instance 

  &lt;br /&gt;className: tên lớp CSS 

  &lt;br /&gt;Gắn phần tử với tên lớp CSS được cho, xóa những tên lớp khác ra khỏ phần tử này. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Abstract"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Abstract&lt;/h6&gt;

&lt;p&gt;Đối tượng này đóng vai trò gốc rễ cho các lớp khác trong thư viện. Nó không có các thuộc tính hay phương thức nào. Các lớp được định nghĩa trong đối tượng này cũng được xem như là các lớp trừu tượng (abstract class)truyền thống. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Abstract.Insertion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Abstract.Insertion&lt;/h6&gt;

&lt;p&gt;Lớp này được sử dụng như một lớp nền tảng cho các lớp khác, mà các lớp này sẽ cung cấp tính năng thêm nội dung động. Lớp này được sử dụng như một lớp trừu tượng. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, content) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, content: HTML sẽ được thêm 

  &lt;br /&gt;Tạo một đối tượng giúp đỡ cho việc thêm nội dung động. &lt;/p&gt;

&lt;p&gt;contentFromAnonymousTable() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none)&lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;type 

  &lt;br /&gt;Loại 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;adjacency 
  &lt;br /&gt;String 

  &lt;br /&gt;static, parameter 

  &lt;br /&gt;Tham số mà sẽ xác định đâu sẽ là nơi nội dung được đặt có liên quan với phần tử được cho. Các giá trị có thể là: 'beforeBegin','afterBegin', 'beforeEnd', và 'afterEnd'.&lt;/p&gt;

&lt;p&gt;element 
  &lt;br /&gt;Object 

  &lt;br /&gt;instance 

  &lt;br /&gt;Đối tượng phần tử liên quan với việc thêm vào. &lt;/p&gt;

&lt;p&gt;content 
  &lt;br /&gt;String 

  &lt;br /&gt;instance 

  &lt;br /&gt;HTML sẽ được thêm vào.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Insertion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Insertion&lt;/h6&gt;

&lt;p&gt;Đối tượng này đóng vai trò gốc rễ cho các lớp khác trong thư viện. Nó không có các thuộc tính hay phương thức nào. Các lớp được định nghĩa trong đối tượng này cũng được xem như là các lớp trừu tượng (abstract class)truyền thống. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Insertion.Before"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Insertion.Before&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thêm HTML vào trước một phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, content) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, content: HTML sẽ được thêm vào 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;. Tạo một đối tượng giúp đỡ cho việc thêm nội dung động.&lt;/p&gt;

&lt;p&gt;Mã lệnh sau đây &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt;

&amp;lt;script&amp;gt; new Insertion.Before('person', 'Chief '); &amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Sẽ chuyển HTML thành &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, Chief &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt;	
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Insertion.Top"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Insertion.Top&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thêm HTML như một phần con đầu tiên dưới phần tử. Nội dung sẽ được đặt ngay sau thẻ mở của phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, content) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, content: HTML sẽ được thêm vào 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;. Tạo một đối tượng giúp đỡ cho việc thêm nội dung động.&lt;/p&gt;

&lt;p&gt;Mã lệnh sau đây &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt;

&amp;lt;script&amp;gt; new Insertion.Top('person', 'Mr. '); &amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Sẽ chuyển HTML thành &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Mr. Wiggum. How's it going?&amp;lt;/span&amp;gt;	
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Insertion.Bottom"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Insertion.Bottom&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thêm HTML như một phần con cuối cùng dưới phần tử. Nội dung sẽ được đặt ngay sau thẻ mở của phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, content) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, content: HTML sẽ được thêm vào 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;. Tạo một đối tượng giúp đỡ cho việc thêm nội dung động.&lt;/p&gt;

&lt;p&gt;Mã lệnh sau đây &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt;

&amp;lt;script&amp;gt; new Insertion.Bottom('person', &amp;quot; What's up?&amp;quot;); &amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Sẽ chuyển HTML thành &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going? What's up?&amp;lt;/span&amp;gt;	
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Insertion.After"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Insertion.After&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thêm HTML vào ngay sau thẻ đóng của phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, content) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, content: HTML sẽ được thêm vào 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.Insertion"&gt;Abstract.Insertion&lt;/a&gt;. Tạo một đối tượng giúp đỡ cho việc thêm nội dung động.&lt;/p&gt;

&lt;p&gt;Mã lệnh sau đây &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt;

&amp;lt;script&amp;gt; new Insertion.After('person', ' Are you there?'); &amp;lt;/script&amp;gt;
			&lt;/pre&gt;

&lt;p&gt;Sẽ chuyển HTML thành &lt;/p&gt;

&lt;pre&gt;&amp;lt;br&amp;gt;Hello, &amp;lt;span id=&amp;quot;person&amp;quot; style=&amp;quot;color:red;&amp;quot;&amp;gt;Wiggum. How's it going?&amp;lt;/span&amp;gt; Are you there?	
			&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Field"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Field&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp một số hàm tiện ích để làm việc với trường nhập liệu trong form. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;clear(field1 [, field2[,field3[...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;fieldN: phần tử đối tượng trường hoặc id 

  &lt;br /&gt;Xóa giá trị được truyền vào phần tử trường. &lt;/p&gt;

&lt;p&gt;present(field1 [, field2 [, field3 [...]]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;fieldN: phần tử đối tượng trường hoặc id 

  &lt;br /&gt;Trả về true chỉ khi tất cả các trường của form có chứa giá trị rỗng. &lt;/p&gt;

&lt;p&gt;focus(field) 
  &lt;br /&gt;instance 

  &lt;br /&gt;field: phần tử đối tượng trường hoặc id 

  &lt;br /&gt;Chuyển tiêu điểm vào trường của form được cho. &lt;/p&gt;

&lt;p&gt;select(field) 
  &lt;br /&gt;instance 

  &lt;br /&gt;field: phần tử đối tượng trường hoặc id 

  &lt;br /&gt;Chọn lựa giá trị trong các trường mà hỗ trợ chọn chữ. &lt;/p&gt;

&lt;p&gt;activate(field) 
  &lt;br /&gt;instance 

  &lt;br /&gt;field: phần tử đối tượng trường hoặc id 

  &lt;br /&gt;Di chuyển tiêu điểm và chọn giá trị trong các trường mà hỗ trợ chọn chữ. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Form&lt;/h6&gt;

&lt;p&gt;Đối tượng này hỗ trở một số hàm tiện ích để làm việc với các form dữ liệu và các trường nhập liệu của nó. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;serialize(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form: đối tượng phần tử form hoặc id 

  &lt;br /&gt;Trả về một danh sách có định dạng url, bao gồm các tên trường, và giá trị của nó. Như 'field1=value1&amp;amp;field2=value2&amp;amp;field3=value3'&lt;/p&gt;

&lt;p&gt;findFirstElement(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form: i tượng phần tử form hoặc id 

  &lt;br /&gt;Trả về phần tử trường đầu tiên có hiệu lực trong form.&lt;/p&gt;

&lt;p&gt;getElements(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form: i tượng phần tử form hoặc id 

  &lt;br /&gt;Trả về một Array có chứa toàn bộ các trường nhập liệu trong form.&lt;/p&gt;

&lt;p&gt;getInputs(form [, typeName [, name]]) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form: fi tượng phần tử form hoặc id, typeName: kiểu của phần tử nhập (input element),name: tên của phần tử nhập. 

  &lt;br /&gt;Trả về một Array chứa tất cả các phần tử &amp;lt;nhập&amp;gt; trong form. Tùy chọn thì danh sách có thể được lọc bởi thuộc tính type hoặc name của các phần tử.&lt;/p&gt;

&lt;p&gt;disable(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form:đối tượng phần tử form hoặc id 

  &lt;br /&gt;Làm mất hiệu lực tất cả các trường nhập liệu trong form. &lt;/p&gt;

&lt;p&gt;enable(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form:đối tượng phần tử form hoặc id 

  &lt;br /&gt;Làm hiệu lực tất cả các trường nhập liệu trong form.&lt;/p&gt;

&lt;p&gt;focusFirstElement(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form:đối tượng phần tử form hoặc id 

  &lt;br /&gt;Lấy tiêu điểm vào trường nhập liệu có hiệu lực thứ nhất trong form. &lt;/p&gt;

&lt;p&gt;reset(form) 
  &lt;br /&gt;instance 

  &lt;br /&gt;form: đối tượng phần tử form hoặc id 

  &lt;br /&gt;Xóa toàn bộ form. Giống với gọi phương thức reset() của đối tượng form.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.Element"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Form.Element&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp một số hàm tiện ích để làm việc với các phần tử của form (thấy được hay không thấy được). &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;serialize(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về cặp name=value của phần tử, như 'elementName=elementValue'&lt;/p&gt;

&lt;p&gt;getValue(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng phần tử hoặc id 

  &lt;br /&gt;Trả về giá trị của phần tử.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.Element.Serializers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Form.Element.Serializers&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp một số hàm tiện ích được sử dụng phía bên trong thư viện để giúp đỡ việc lấy giá trị hiện tại của các phần tử form. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;inputSelector(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng hoặc id phần tử form thuộc tính &lt;em&gt;checked&lt;/em&gt;, như nút radio hay checkbox. 

  &lt;br /&gt;Trả về một Array với tên và giá trị của phần tử, như ['elementName', 'elementValue']&lt;/p&gt;

&lt;p&gt;textarea(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng hoặc id của một phần tử form có thuộc tính value &lt;em&gt;value&lt;/em&gt;, như textbox, button hoặc trường password. 

  &lt;br /&gt;Trả về một Array với với tên và giá trị của phần tử ['elementName', 'elementValue']&lt;/p&gt;

&lt;p&gt;select(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng của một phần tử &amp;lt;select&amp;gt; 

  &lt;br /&gt;Trả về một Array với tên phần tử và tất cả các giá trị lựa chọn hoặc text, ['elementName', 'selOpt1 selOpt4 selOpt9']&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Abstract.TimedObserver"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Abstract.TimedObserver&lt;/h6&gt;

&lt;p&gt;Lớp này được dùng như lớp nền tảng cho các lớp khác, để theo dõi một phần tử cho đến khi giá trị (hoặc bất cứ thuộc tính trong lớp con định nghĩa) của nó thay đổi. Lớp này được sử dụng như một lớp trừu tượng. &lt;/p&gt;

&lt;p&gt;Các lớp con sẽ được xem tạo ra để theo dõi các thứ như giá trị nhập của một phần tử, hoặc một trong các thuộc tính kiểu (style property), hoặc số lượng dòng trong một bảng, hoặc bất cứ gì bạn muốn theo dõi. &lt;/p&gt;

&lt;p&gt;Các lớp con sẽ khởi tạo phương thức nào để xác định xem giá trị hiện tại của phần tử được theo dõi là gì. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, frequency, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, frequency: chu kỳ (s), callback: hàm được gọi khi phần tử thay đổi. 

  &lt;br /&gt;Tạo một đối tượng để theo dõi phần tử. &lt;/p&gt;

&lt;p&gt;registerCallback() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng để bắt đầu theo dõi phần tử. &lt;/p&gt;

&lt;p&gt;onTimerEvent() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng một cách định kỳ để kiểm tra phần tử. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;Kiểu 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;element 
  &lt;br /&gt;Object 

  &lt;br /&gt;Đối tượng phần tử được theo dõi.&lt;/p&gt;

&lt;p&gt;frequency 
  &lt;br /&gt;Number 

  &lt;br /&gt;Đây là chu kỳ (s) giữa các lần kiểm tra. &lt;/p&gt;

&lt;p&gt;callback 
  &lt;br /&gt;Function(Object, String) 

  &lt;br /&gt;Hàm được gọi khi phần tử thay đổi. Nó sẽ nhận đối tượng phần tử và giá trị mới.&lt;/p&gt;

&lt;p&gt;lastValue 
  &lt;br /&gt;String 

  &lt;br /&gt;Giá trị cuối cùng được xác nhận trong phần tử.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.Element.Observer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Form.Element.Observer&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.TimedObserver"&gt;Abstract.TimedObserver&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Khởi tạo của một lớp Abstract.TimedObserver để theo dõi các phần tử giá trị nhập form. Sử dụng lớp này khi bạn muốn theo dõi một phần tử mà không phơi bày ra sự kiện mà báo cáo giá trị thay đổi. Trong trường hợp đó bạ n có thể dùng lớp &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.EventObserver"&gt;Form.Element.EventObserver&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, frequency, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, frequency: chu kỳ (s), callback: hàm được gọi khi phần tử thay đổi 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.TimedObserver"&gt;Abstract.TimedObserver&lt;/a&gt;. Tạo đối tượng để theo dõi thuộc tính value của phần tử.&lt;/p&gt;

&lt;p&gt;getValue() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về giá trị của phần tử.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.Observer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Form.Observer&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.TimedObserver"&gt;Abstract.TimedObserver&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Khởi tạo của một lớp Abstract.TimedObserver để theo dõi bất cứ thay đổi dữ liệu này của phầt tử trong form. Sử dụng lớp này khi bạn muốn theo dõi một phần tử mà không phơi bày ra sự kiện mà báo cáo giá trị thay đổi. Trong trường hợp đó bạ n có thể dùng lớp &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.EventObserver"&gt;Form.Element.EventObserver&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](form, frequency, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;form: form object or id, frequency: chu kỳ, callback: hàm được gọi khi dữ liệu của phần tử trong form bị thay đổi. 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.TimedObserver"&gt;Abstract.TimedObserver&lt;/a&gt;. Tạo một đối tượng để theo dõi sự thay đổi của form.&lt;/p&gt;

&lt;p&gt;getValue() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về sự tuần tự hóa (serialization) của toàn bộ dữ liệu form.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Abstract.EventObserver"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Abstract.EventObserver&lt;/h6&gt;

&lt;p&gt;Lớp này được sử dụng như một lớp nền tảng cho các lớp khác, mà được dùng để kích hoạt hàm callback bất cứ khi nào sự kiện thay đổi giá trị xảy ra đối với một phần tử. &lt;/p&gt;

&lt;p&gt;Nhiều đối tượng của kiểu Abstract.EventObserver có thể được gắn với cùng một phần tử, mà không phải xóa đối tượng kia. Hàm callback sẽ được thực thi theo thứ tự mà chúng được gán vào phần tử. &lt;/p&gt;

&lt;p&gt;Sự kiện khởi tạo (triggering event) là onclick cho nút radio ,các checkbox, và onchange cho các textbox. Và tổng quá thì cho hộp danh sách(listbox) / hộp thả xuống (dropdown). &lt;/p&gt;

&lt;p&gt;Lớp con sẽ khởi tạo phương thức này để xác định giá trị nào của phần tử sẽ được theo dõi. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, callback: function to be called when the event happens 

  &lt;br /&gt;Tạo đối tượng sẽ theo dõi phần tử.&lt;/p&gt;

&lt;p&gt;registerCallback() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng để gắn chính nó với sự kiện của phần tử. &lt;/p&gt;

&lt;p&gt;registerFormCallbacks() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó được gọi bởi chính đối tượng để gắn nó với những sự kiện của các phần tử dữ liệu trong form. &lt;/p&gt;

&lt;p&gt;onElementEvent() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Phương thức này thường không được gọi từ bên ngoài. Nó sẽ gắn với sự kiện của phần tử. &lt;/p&gt;

&lt;p&gt;Thuộc tính 
  &lt;br /&gt;Kiểu 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;element 
  &lt;br /&gt;Object 

  &lt;br /&gt;Đối tượng phần tử đang được theo dõi.&lt;/p&gt;

&lt;p&gt;callback 
  &lt;br /&gt;Function(Object, String) 

  &lt;br /&gt;Hàm được gọi khi phần tử thay đổi. Nó sẽ nhận đối tượng phần tử và giá trị mới. &lt;/p&gt;

&lt;p&gt;lastValue 
  &lt;br /&gt;String 

  &lt;br /&gt;Giá trị cuối cùng được xác nhận trong phần tử.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.Element.EventObserver"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Form.Element.EventObserver&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.EventObserver"&gt;Abstract.EventObserver&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Khởi tạo của Abstract.EventObserver sẽ thực thi hàm callback với sự kiện tương tứng của phần tử dữ liệu của form, để phát hiện sự thay đổi giá trị trong phần tử. Nếu phần tử không có bất cứ sự kiện nào có thay đổi, bạn có thể dùng lớp &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Element.Observer"&gt;Form.Element.Observer&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](element, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;element: đối tượng phần tử hoặc id, callback: hàm được gọi khi sự kiện xảy ra 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.EventObserver"&gt;Abstract.EventObserver&lt;/a&gt;. Tạo ra một đối tượng để theo dõi thuộc tính value của phần tử.&lt;/p&gt;

&lt;p&gt;getValue() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về giá trị của phần tử&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Form.EventObserver"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Lớp Form.EventObserver&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.EventObserver"&gt;Abstract.EventObserver&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Khởi tạo của một lớp Abstract.EventObserver để theo dõi bất cứ thay đổi dữ liệu này của phần tử trong form, sử dụng sự kiện của phần tử để phát hiện sự thay đổi. Nếu form có chứa những phần tử mà không phơi bày ra sự kiện mà báo cáo giá trị thay đổi. Trong trường hợp đó bạn có thể dùng lớp &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Form.Observer"&gt;Form.Element.EventObserver&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;[ctor](form, callback) 
  &lt;br /&gt;constructor 

  &lt;br /&gt;form: form object or id, callback: Hàm được gọi khi phần tử dữ liệu trong form thay đổi 

  &lt;br /&gt;Kế thừa từ &lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#Abstract.EventObserver"&gt;Abstract.EventObserver&lt;/a&gt;. Tạo một đối tượng để theo dõi sự thay đổi của form.&lt;/p&gt;

&lt;p&gt;getValue() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Trả về sự tuần tự hóa (serialization) của toàn bộ dữ liệu của form.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html#toc"&gt;toc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="Position"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;Đối tượng Position (tài liệu dự bị)&lt;/h6&gt;

&lt;p&gt;Đối tượng này cung cấp một loạt các hàm giúp bạn khi làm việc với vị trí của phần tử. &lt;/p&gt;

&lt;p&gt;Phương thức 
  &lt;br /&gt;Loại 

  &lt;br /&gt;Các tham số 

  &lt;br /&gt;Mô tả&lt;/p&gt;

&lt;p&gt;prepare() 
  &lt;br /&gt;instance 

  &lt;br /&gt;(none) 

  &lt;br /&gt;Điều chỉnh thuộc tính deltaX và deltaY để phù hợp với thay đổitrong vị trí cuộn. Nhớ gọi phương thức này trước khi gọi tới đối tượng withinIncludingScrolloffset sau khi trang đã cuộn. &lt;/p&gt;

&lt;p&gt;realOffset(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element:đối tượng 

  &lt;br /&gt;Trả về một Array với vị trí cuộn chính xác của phần tử,bao gồm bất cứ vị trí cuộn nào làm ảnh hưởng đến phần tử. Mảng kết quả tương tự như [total_scroll_left, total_scroll_top]&lt;/p&gt;

&lt;p&gt;cumulativeOffset(element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element:đối tượng 

  &lt;br /&gt;Trả về một Array với vị trí chính xác của phần tử, bao gồm bất cứ vị trí nào bị ảnh hưởng bởi các phần tử mẹ. Mảng kết quả tương tự như [total_offset_left, total_offset_top]&lt;/p&gt;

&lt;p&gt;within(element, x,y) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng, x and y: tọa độ của điểm 

  &lt;br /&gt;Kiểm tra xem tọa độ được cho có nằm trong vùng chữ nhật của phần tử được cho không.&lt;/p&gt;

&lt;p&gt;withinIncludingScrolloffsets(element, x, y) 
  &lt;br /&gt;instance 

  &lt;br /&gt;element: đối tượng, x and y: tọa độ của điểm&lt;/p&gt;

&lt;p&gt;overlap(mode,element) 
  &lt;br /&gt;instance 

  &lt;br /&gt;mode:'vertical' hoặc 'horizontal', element: đối tượng 

  &lt;br /&gt;within() cần được gọi trước khi gọi phương thức này. Phương thức này sẽ trả về một số thập phân ở giữa 0.0 và 1.0 biểu diễn một phân số của tọa độ mà chồng lên phần tử. Như ví dụ, nếu phần tử là một hình vuông DIV với cạnh 100px và có vị trí ở (300,300), sau đó within(divSquare, 330, 330); overlap('vertical', divSquare); sẽ trả về 0.70, có nghĩ rằng điểm này đang ở vị trí 70% (100px - 30px = 70px) tính từ cạnh dưới của DIV. Các dễ nhất để hiểu rõ là hãy nghĩ cặp tọa độ được cho như là góc phía trên bên trái (top-left corner) của một hình chữa nhật khác, đè lên cái đầu tiên. Con số sẽ là phần trăm của chiều rộng hoặc chiều dài mà bị đè lên (giả sử rằng hình chữ nhật thứ 2 đủ rộng). &lt;/p&gt;

&lt;p&gt;clone(source, target) 
  &lt;br /&gt;instance 

  &lt;br /&gt;source: đối tượng phần tử hoặc id, target: đối tượng phần tử hoặc id 

  &lt;br /&gt;Điều chỉnh lại kích thước, hoặc vị trí của phần tử target mà giống với phần tử source. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nguồn:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html" href="http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html"&gt;http://cntt.tv/system/repos/prototype.js.vi/prototype.js.vi.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tác giả &lt;a href="mailto:sergio_pereira@msn.com"&gt;Sergio Pereira&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Được dịch bởi &lt;a href="mailto:gavintran@gmail.com"&gt;Giang Trần&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-6987695133790670288?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/6987695133790670288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/06/tai-lieu-danh-cho-nha-phat-trien-cua.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6987695133790670288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6987695133790670288'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/06/tai-lieu-danh-cho-nha-phat-trien-cua.html' title='Tài liệu dành cho nhà phát triển của prototype.js'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-6072794166205363633</id><published>2009-06-02T11:26:00.001+07:00</published><updated>2009-06-02T11:26:50.671+07:00</updated><title type='text'>Sự khác biệt giữa Static AOP và Dynamic AOP</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nếu bạn chưa có kiến thức về Aspect oriented programming hãy tham khảo những kiến thức cơ bản về AOP trong bài viết dưới đây:&lt;/p&gt;  &lt;p&gt;AOP là một cài đặt bổ sung cho Object oriented programming,(nó chưa thật hoàn chỉnh). Nói một cách khác, với AOP bạn có thể thực thi một đoạn mã (được gọi là &lt;b&gt;&lt;i&gt;advice&lt;/i&gt;&lt;/b&gt; trong thuật ngữ của AOP) ở một điểm được định nghĩa trước (được gọi là &lt;b&gt;&lt;i&gt;joinpont&lt;/i&gt;&lt;/b&gt;) trong quá trinh thực thi ứng dụng của bạn.&lt;/p&gt;  &lt;p&gt;Một ví dụ với joinpont có thể được thực thi một phương thức. Bạn có thể gom nhóm một tập hợp các lời gọi phương thức trong một gói riêng biệt (vì thế đây là một ví dụ về pontcut, nhón các joinponts được gọi là pointcut).&lt;/p&gt;  &lt;p&gt;Sự kết hợp các advice (các đoạn mã mà sẽ chạy trên một joinponts) và pointcuts được gọi là aspect. (aspect =advice +pointcuts)&lt;/p&gt;  &lt;p&gt;Để giúp bạn hiểu rõ hơn. Bây giờ, bạn biết rằng với aop bạn có thể lựa chọn những phương thức (pointcuts) và sau đó cấu hình một lớp Logging để gọi (advice) trước và sau mỗi phương thức trong ứng dụng. Vì thế bạn không cần gọi những phương thức này và thay đổi chúng theo thời gian, hãy làm điều này với AOP. Điều thú vị ở đây là những đoạn mã này không nằm trong code mà liên quan tới business của ứng dụng.&lt;/p&gt;  &lt;p&gt;Thuật ngữ weaving tham khảo tới tiến trình chèn các aspects vào trong đoạn mã của ứng dụng tại những điểm phù hợp. sự khác biệt giữa Static hay Dynamic AOP xảy ra ở đây.&lt;/p&gt;  &lt;p&gt;Với Static aop, tiến trình weaving xảy ra trong thời gian biên dịch, có nghĩa advices được chèn trực tiếp và bytecode của class được biên dịch.&lt;/p&gt;  &lt;p&gt;Với Dynamic aop, tiến trình weaving xảy ra khá linh động, nó thi hành việc chèn các mã bytecode lúc runtime. Vì thế không có bất kỳ mã bytecodes liên quan đến aop trong mã nguồn được biên dịch. Tôi nhắc lại là chúng được chèn vào trong thời gian chạy.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_tYqoXlRa1XY/SiSp3ezkFcI/AAAAAAAAAMA/e4S-oLZ1ffY/s1600-h/clip_image002%5B4%5D.gif"&gt;&lt;img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="401" alt="clip_image002" src="http://lh6.ggpht.com/_tYqoXlRa1XY/SiSp4LWh32I/AAAAAAAAAME/nRpzxcWwnIQ/clip_image002_thumb%5B1%5D.gif?imgmax=800" width="620" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Static aop cho tốc độ tốc hơn, đơn giản vì nó không phải tốn công cho việc xử lý lúc runtime. Ở bên kia, dynamic aop thì linh động bởi vì bạn không cần biên dịch lại mã của bạn khi aspects thay đổi.&lt;/p&gt;  &lt;p&gt;Hãy tưởng tượng, một thư viện đã có sẵn, được cung cấp bởi bên thứ 3 chẳng hạn, static aop là điều không thể (trừ khi dowload source và...build lại -hay đơn giản hơn làm một class wrapper)&lt;/p&gt;  &lt;p&gt;Thực tế, static aop không phải sẽ đem đến một hiệu quả vượt trội, trong khi đó nó trở nên trơ cứng khi phát triển ứng dụng, đôi khi aop bị ràng buộc chặt vào ứng dụng và tính sử dụng lại bị mất đi đáng kể, mặt khác chúng ta sẽ bị trở ngại về vấn đề biên dịch.&lt;/p&gt;  &lt;p&gt;examples:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_tYqoXlRa1XY/SiSp4tiBZ5I/AAAAAAAAAMI/22BQMvtvZPQ/s1600-h/clip_image004%5B7%5D.gif"&gt;&lt;img title="clip_image004" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image004" src="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSp5HsY7pI/AAAAAAAAAMM/8OK_gL9vDGU/clip_image004_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/_tYqoXlRa1XY/SiSp5mMbtcI/AAAAAAAAAMQ/GM8sKGBy-I4/s1600-h/clip_image004%5B1%5D%5B2%5D.gif"&gt;&lt;img title="clip_image004[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image004[1]" src="http://lh4.ggpht.com/_tYqoXlRa1XY/SiSp6Wvau0I/AAAAAAAAAMU/BdVCQKtjqNA/clip_image004%5B1%5D_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;public class Car {&lt;/p&gt;  &lt;p&gt;private String color;&lt;/p&gt;  &lt;p&gt;public String getColor() {&lt;/p&gt;  &lt;p&gt;return color;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;public void setColor(String color) {&lt;/p&gt;  &lt;p&gt;this.color = color;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSp7Ii0g_I/AAAAAAAAAMY/sBeYORKz1Z0/s1600-h/clip_image004%5B2%5D%5B2%5D.gif"&gt;&lt;img title="clip_image004[2]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image004[2]" src="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSp7fcXnJI/AAAAAAAAAMc/riBMIpStms8/clip_image004%5B2%5D_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/_tYqoXlRa1XY/SiSp7wmybJI/AAAAAAAAAMg/Mu82PtVJt9w/s1600-h/clip_image004%5B3%5D%5B2%5D.gif"&gt;&lt;img title="clip_image004[3]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image004[3]" src="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSp8XmrRCI/AAAAAAAAAMk/740mb1fDAGY/clip_image004%5B3%5D_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;public class CarDriver {&lt;/p&gt;  &lt;p&gt;public static void main(String args[]) {&lt;/p&gt;  &lt;p&gt;Car mycar = new Car();&lt;/p&gt;  &lt;p&gt;mycar.setColor(”blue”);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_tYqoXlRa1XY/SiSp9yu02vI/AAAAAAAAAMo/R4UrGm3C7mM/s1600-h/clip_image006%5B3%5D.gif"&gt;&lt;img title="clip_image006" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image006" src="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSp-i2qqII/AAAAAAAAAMs/GEQS5HCCPrQ/clip_image006_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/SiSp--zf9lI/AAAAAAAAAMw/vMYVU1bFr2c/s1600-h/clip_image004%5B4%5D%5B2%5D.gif"&gt;&lt;img title="clip_image004[4]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image004[4]" src="http://lh4.ggpht.com/_tYqoXlRa1XY/SiSp_X3y6xI/AAAAAAAAAM0/_kiFhuklZWs/clip_image004%5B4%5D_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;public aspect CarAspect {&lt;/p&gt;  &lt;p&gt;pointcut setColorCall(): call(public void Car.setColor(String));&lt;/p&gt;  &lt;p&gt;before(): setColorCall() {&lt;/p&gt;  &lt;p&gt;System.out.println(”The car color has changed!”);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/SiSp_2Pv8nI/AAAAAAAAAM4/uJFlCddoLqk/s1600-h/clip_image008%5B3%5D.gif"&gt;&lt;img title="clip_image008" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image008" src="http://lh6.ggpht.com/_tYqoXlRa1XY/SiSqAblkCuI/AAAAAAAAAM8/spNg5989Gz4/clip_image008_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSqAvbyL6I/AAAAAAAAANA/7DvwEu0EgxU/s1600-h/clip_image010%5B3%5D.gif"&gt;&lt;img title="clip_image010" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image010" src="http://lh4.ggpht.com/_tYqoXlRa1XY/SiSqBE_DhFI/AAAAAAAAANE/nsoMKofTD50/clip_image010_thumb.gif?imgmax=800" width="24" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ajc CarAspect.aj CarDriver.java Car.java&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Theo ý kiến cá nhân của tôi, trừ phi một class bị đặt yêu cầu khắt khe về tốc độ, nếu không hãy chọn dynamic aop.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/SiSqBx0dGUI/AAAAAAAAANI/E4bzoEb3Jx4/s1600-h/clip_image012%5B5%5D.jpg"&gt;&lt;img title="clip_image012" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="503" alt="clip_image012" src="http://lh3.ggpht.com/_tYqoXlRa1XY/SiSqCff1p3I/AAAAAAAAANM/0-I_9eV-Jx4/clip_image012_thumb%5B2%5D.jpg?imgmax=800" width="660" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bạn có thể tham khảo thêm những bài giới thiệu và tutorial cơ bản với 2 liên kết dưới đây :&lt;/p&gt;  &lt;p&gt;Static aop : với AspectJ : &lt;u&gt;&lt;a href="http://javatouch.googlepages.com/aspectjtutorial"&gt;http://javatouch.googlepages.com/aspectjtutorial&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Dynamic aop: với Spring framework : &lt;u&gt;&lt;a href="http://javatouch.googlepages.com/springaop-helloworld"&gt;http://javatouch.googlepages.com/springaop-helloworld&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Dựa trên bài viết của &lt;/p&gt;  &lt;p&gt;Kaan Yamanyar&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-6072794166205363633?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/6072794166205363633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/06/su-khac-biet-giua-static-aop-va-dynamic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6072794166205363633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6072794166205363633'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/06/su-khac-biet-giua-static-aop-va-dynamic.html' title='Sự khác biệt giữa Static AOP và Dynamic AOP'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_tYqoXlRa1XY/SiSp4LWh32I/AAAAAAAAAME/nRpzxcWwnIQ/s72-c/clip_image002_thumb%5B1%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-6008488610300645514</id><published>2009-05-31T10:38:00.001+07:00</published><updated>2009-05-31T10:41:27.159+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='langthang'/><title type='text'>Bàn về AJAX</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ajax đã có từ rất lâu, nếu nhắc lại nữa có chăng cũng chỉ là một câu chuyện cũ được xào nấu lại, đến bây giờ ajax đã là không thể thiếu cho các ứng dụng web, thế nhưng đôi khi có vẻ như chúng ta đã lạm dụng nó một cách quá mức. Bài này trích dẫn một bài viết về Ajax. Có lẽ bài viết này thích hợp hơn với nhà quản lý (teachnical lead, cấp team leader hay PM ở công ty phần mềm nhỏ), tuy nhiên hãy bỏ chút thời gian đọc nó.&lt;/p&gt;  &lt;p&gt;10 điều các chuyên gia CNTT cần biết về Ajax&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Bất kỳ một công nghệ Web mới nào cũng sẽ đều ảnh hưởng tới một cơ sở hạ tầng của mạng theo nhiều góc độ khác nhau từ những việc không quan trọng đến làm choáng váng cả thế giới. Ajax là một trong các công nghệ mới đang được sử dụng nhiều trên các mạng ngày nay. Để giúp các bạn có thể tối thiểu hóa những ngạc nhiên về mạng của mình, chúng tôi phác thảo ra 10 vấn đề cần biết về Ajax.&lt;/strong&gt;&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;img height="190" alt="itGatevn_2008060211.jpg" src="http://www.itgatevn.com/pictures/web/news/2008_005/10/itGatevn_2008060211.jpg" width="230" align="left" border="0" /&gt;1) Ajax là một ý tưởng, không phải là cụm từ&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Ajax tuy đã được giải thích rõ ràng là viết tắt của cụm từ Asynchronous JavaScript and XML nhưng tên đầy đủ này vẫn không hoàn toàn thích hợp vì nó đơn giản hóa quá mức lịch sử của công nghệ cũng như những tùy chọn bổ sung nằm trong chính bản thân nó. Chính xác hơn, Ajax bao gồm ý tưởng trong đó các ứng dụng web có thể được xây dựng để chọn trong số vòng lặp “post-wait-repeat” được sử dụng trong các ứng dụng Web trình chủ. Ajax cho phép các ứng dụng web chuyển một cách liên tục và mềm dẻo hơn, nhưng việc update lại tăng lên. Nó cung cấp cho người dùng một phương pháp phong phú và khả năng tương tác tốt hơn với những gì nằm bên dưới ứng dụng Web. Để được thành phần này thì các chuyên gia về mạng càng phải thực hiện nhiều công việc trong kiểm tra và giám sát bảo mật cần thiết cũng như khả năng tiềm ẩn sự biến đổi của mạng và máy chủ.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2) Thực sự tất cả theo JavaScript&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Các ứng dụng Ajax được viết theo ngôn ngữ JavaScript và thường dựa vào đối tượng XMLHttpRequest để thực hiện việc truyền thông, cách làm này sẽ tạo ra đường đi của nó thông qua việc xử lý World Wide Web. Cũng giống như các công nghệ Web khác, công nghệ Ajax lúc này cũng chỉ là một chuẩn công nghệ đặc biệt, những điểm khác nhau nổi bật có thể phát hiện thấy trong các bổ sung vào các trình duyệt khác nhau của nó. Ajax có thể sử dụng các cơ chế truyền tải dữ liệu khác – có hoặc không có sự hỗ trợ rộng rãi trong CNTT – với các ứng dụng Ajax, như frame truyền thống và các phương pháp image-cookie cũng như sử dụng các cầu binary để liên kết với Flash hoặc Java&lt;/p&gt;  &lt;p&gt;Không quan tâm đến phương pháp truyền tải được sử dụng bởi các chuyên gia phát triển, Ajax đã làm cho JavaScript trở nên quan trọng hơn bên trong một ứng dụng web so với những gì nó làm được trước đây. JavaScript lúc này hiện nắm giữ vai trò sưu tập các dữ liệu quan trọng, truyền thông và hoạt động, chính vì vậy nó có thể được coi như một công nghệ web lớp thứ hai không có các tác động nghiêm trọng.&lt;/p&gt;  &lt;p&gt;Các chuyên gia phát triển phần mềm cho rằng công nghệ JavaScript mang tính độc và muốn né tránh ngôn ngữ này bằng một công cụ hoặc framework tạo nó từ một ngôn ngữ khác như Java (Google Web Toolkit là một ví dụ), hoặc dấu các thành phần code ẩn hoặc các tag (như với .Net hoặc Ruby). Mặc dù vậy JavaScript vẫn là một ứng dụng. Việc tìm hiểu ứng ngôn ngữ này và nắm được nó một cách trực tiếp sẽ giúp bạn rất nhiều vì nếu muốn sử dụng Ajax thì bạn sẽ sử dụng đến rất nhiều JavaScript.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3) Không cần đến XML&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mặc dù có chữ “X” trong nhóm từ của Ajax nhưng thực sự nó không cần đến XML. Đối tượng XMLHttpRequest có thể truyền tải bất kỳ một định dạng văn bản nào. Với nhiều chuyên gia phát triển phần mềm Ajax, ký hiệu đối tượng JavaScript (JavaScript Object Notation) hoặc thậm chí các đoạn mã JavaScript thô cũng tạo ra nhiều ý nghĩa như một định dạng dữ liệu, cho rằng JavaScript là môi trường chi phối. Với đầu vào trực tiếp trong các tài liệu, các chuyên gia phát triển phần mềm khác có thể sử dụng văn bản thô hoặc các đoạn HTML. Vẫn còn một số thành phần khác sử dụng các định dạng dữ liệu như vậy như ngôn ngữ markup YAML ít được biết đến.&lt;/p&gt;  &lt;p&gt;Rõ ràng hoàn toàn có thể và hợp lý để sử dụng XML, nhưng Ajax vẫn không yêu cầu bắt buộc. Sử dụng các định dạng nhị phân cho việc upload các file vẫn không được hỗ trợ bởi đối tượng XMLHttpRequest, nhưng nên cần biết rằng Flash sử dụng một định dạng nhị phân được gọi là Action Message Format, chính vì vậy các tính năng tương tự như vậy sẽ một sớm một chiều có trong các ứng dụng của Ajax. Bạn nên biết định dạng nào đang được sử dụng trên mạng vì nó không phải lúc nào cũng là XML, và cũng bảo đảm bạn có thể phân tích định dạng cho vấn đề hiệu suất và bảo mật.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4) Kế hoạch cho việc tăng các request HTTP     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Vấn đề nổi cộm nhất đối với các quản trị mạng trong việc hỗ trợ các ứng dụng Ajax là mẫu lập trình kiến trúc đã thay đổi vấn đề sử dụng mạng của các ứng dụng web từ việc như xử lý khối, sự phản ứng không liên tục với hàng trăm KB đến sự thay đổi mang tính liên tục trong các đáp trả HTTP nhỏ hơn. Điều này có nghĩa rằng Web và các máy chủ ứng dụng có thể bận rộn hơn trước rất nhiều. Những gì Ajax sẽ thực hiện với mạng và máy chủ của bạn phụ thuộc vào cách ứng dụng được thiết kế như thế nào, hãy bảo đảm cho các chuyên gia phát triển ứng dụng hiểu được sự ảnh hưởng của các ứng dụng của họ với mạng như thế nào.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5) Tối ưu hóa các yêu cầu Ajax một cách thận trọng     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Các ứng dụng web nên gắn với trong việc phân phối mạng đó là gửi ít dữ liệu. Tuy vậy điều này không có nghĩa rằng nguyên lý này cần phải tuân theo một cách rộng rãi bởi các chuyên gia phát triển phần mềm. Một ưu điểm cho mạng, việc nén HTTP cho các đáp trả của Ajax có thể giảm được kích thước và được hỗ trợ trong nhiều trình duyệt hiện đại. Tuy vậy vì overhead của file nén mang tính động nên tốc độ có thể không được cải thiện nhiều nếu các đáp trả tương đối nhỏ. Điều này có nghĩa rằng các quản trị viên mạng nên cho phép nén trên máy chủ Web, nhưng họ cần phải hiểu được rằng với các ứng dụng Ajax thì hiệu suất của việc này không lớn bằng các ứng dụng web trước kia.&lt;/p&gt;  &lt;p&gt;Để gửi dữ liệu ít đi, chúng ta thường sẽ sử dụng đến vấn đề caching. Tuy vậy hầu hết các bổ sung của Ajax đều có thể là thù địch của caching với một giả định là các trình duyệt mà không liên quan đến các re-fetching URL trong cùng một session. Thay cho làm việc với caching thì nhiều chuyên gia phát triển Ajax lại thủ tiêu caching thông qua thiết lập header hoặc URL đơn nhất.&lt;/p&gt;  &lt;p&gt;Hoàn toàn có thể nhắm đến các vấn đề caching với Ajax cache ở trình khách được viết bằng JavaScript, nhưng hầu hết các thư viện của Ajax lại không bổ sung tính năng như vậy. Các chuyên gia về mạng nên giới thiệu cho các nhà phát triển về lợi ích của caching vì Ajax có thể sẽ mang lại nhiều lợi ích từ vấn đề này hơn nén.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6) Thừa nhận về sự hạn chế two-connection     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Các ứng dụng Ajax bị hạn chế bởi HTTP đối với hai kết nối đồng thời với cùng một URL. Đây chính là cách giao thức HTTP được thiết kế, không bị hạn chế. Tuy nhiên có nhiều chuyên gia phát triển phần mềm Ajax vẫn xa lầy vào một máy chủ một cách tình cờ dẫu cho Internet Explorer 8 của Microsoft được hỗ trợ để thực hiện vượt ra khỏi các hạn chế này. Một số ứng dụng không hay của Ajax có thể có vấn đề và với các trình duyệt đang thay đổi, các quản trị mạng cần phải nắm bắt được số lượng các yêu cầu tạo ra và làm việc với các chuyên gia phát triển ứng dụng để tránh sử dụng các mẫu thiết kế như poll hoặc các kết nối trợ giúp dài.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;7) Xem xét đến thứ tự xử lý     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Với các ứng dụng web truyền thống, sự ảnh hưởng truyền thông TCP/IP (như việc thiếu thứ tự đáp trả HTTP nào sẽ được nhận) nhìn chung không được chú ý. Tài liệu HTML được nhận trước các đối tượng khác và sau đó nó sẽ kích hoạt yêu cầu. Bất kỳ một yêu cầu xảy ra sau đều kích hoạt một tài liệu mới hoàn toàn, do đó vẫn bảo đảm được thứ tự. Tuy nhiên Ajax lại không hề sử dụng đến việc phân định thứ tự như vậy chính vì vậy sự phụ thuộc của một ứng dụng theo đúng thứ tự cần đến một hàng đợi xử lý. Ajax framework cũng không nhất quán thừa nhận mối quan tâm này. Chính vì vậy cần phải bảo đảm cho các chuyên gia phát triển ứng dụng Ajax hiểu được vấn đề này.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img alt="8)" src="http://tuanvuong.phancungvn.com/wp-includes/images/smilies/icon_cool.gif" /&gt; Thừa nhận sự ảnh hưởng của việc loại trừ sửa lỗi “Layer 8″      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Một vài năm trở lại đây, người dùng đã khắc phục chất lượng trong việc phân phối Web bằng cách reloading các trang hoặc nhất nút Back. Đơn giản, người dùng thực hiện như vậy để giúp giảm các vấn đề về mạng vì lỗi thường xuất hiện tại các thời điểm giữa các page paint. Tuy vậy với Ajax, lỗi ứng dụng lại không hiển nhiên như vậy. Người dùng thường bị báo sai về các lỗi vì vòng quay GIF động cung cấp quá ít thông tin về trạng thái đúng của yêu cầu.&lt;/p&gt;  &lt;p&gt;Các chuyên gia phát triển phần mềm là những người thiệt nhiều nhất vì nhiều thư viện không có hiệu quả trong việc thừa nhận các timeouts đó xảy ra, những lần retry phải xuất hiện, máy chủ và các lỗi dữ liệu ngày càng nhiều. Các chuẩn đoán JavaScript hiển thị việc truyền thông và các lỗi mã ít khi đúng trên phía trình khách, chính vì vậy mà người dùng thường không hay biết. Do đó cần phải có nhiều kiểm tra mức ứng dụng được yêu cầu cho các quản trị viên để hỗ trợ Ajax một cách hợp lý.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;9) Những mối đe dọa về bảo mật cũ lại xuất hiện lần thứ hai     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Nếu bạn lắng nghe các chuyên gia, thì Ajax có thể gây tăng thêm bề mặt tấn công nhưng quả thực nó không kém an toàn hơn các môi trường phát triển ứng dụng web truyền thống nào vì các đầu vào HTTP đến trình chủ tin cậy đều có cùng các header, chuỗi truy vấn và body văn bản. Tuy nhiên nếu mã trình khách được tin tưởng hoàn toàn và nhập vào dữ liệu không được ngăn chặn trong nhóm phát triển web thì Ajax có thể gây ra những vấn đề về bảo mật tương tự như các ứng dụng web truyền thống.&lt;/p&gt;  &lt;p&gt;Cross-site scripting (XSS) không phải là lỗ hổng mới trong Ajax; nó là một lỗi chung, đặc biệt nếu một ứng dụng nào đó cho phép dữ liệu trạng thái được điều chỉnh với JavaScript. Đầu vào HTML cần được không cho phép trong hầu hết các trường hợp và HTTP Only Cookies nên được áp dụng ngay lập tức để giảm việc tấn công cookie và các tấn công khác thông qua XSS.&lt;/p&gt;  &lt;p&gt;Cũng vậy Cross Site Request Forgery cũng không phải là một lỗi mới của Ajax, nhưng nếu các chuyên gia phát triển ứng dụng của bạn không kiểm tra HTTP Referer (sic) header và quản lý session đúng cách bên trong các ứng dụng Ajax thì có thể để hổng vấn đề này.&lt;/p&gt;  &lt;p&gt;Các Hacker, cũng giống như các chuyên gia phát triển phần mềm hiện đang rất quan tâm đến việc sử dụng và lạm dụng JavaScript, điều đó càng làm tăng thêm các lỗ hổng tiềm tàng. Các chuyên gia về mạng nên bảo đảm cho chuyên gia phần mềm biết được rằng mã trình khách có thể bị thay đổi, vì vậy các dữ liệu đầu vào luôn cần được lọc và xem xét.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;10) Vấn đề về chính sách cùng gốc     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Một mặt “positive” (mang tính ưu điểm) về bảo mật, các chính sách cùng gốc của JavaScript sẽ vẫn có hiệu lực trong ứng dụng Ajax sử dụng XMLHttpRequest. Chính sách này bảo đảm cho các kịch bản đó không liên kết với các miền bên ngoài. Từ quan điểm của các chuyên gia phát triển phần mềm, điều này có thể khá bực mình vì nó có nghĩa rằng các trang đó được đáp ứng, ví dụ là từ ajaxref.com lại không thể liên kết với URL được host trên www.ajaxref.com; thậm chí nếu nó nằm trên cùng một máy chủ thì cũng không cùng chính xác miền. DNS tương đương không có vấn đề ở đây; nó là một string-check được sử dụng bởi SOP.&lt;/p&gt;  &lt;p&gt;SOP sẽ làm vướng khả năng của các chuyên gia phát triển trong việc thực hiện một số cố gắng cho dịch vụ Web trên phía trình khách. Rõ ràng phương pháp tốt nhất là sử dụng proxy trên máy chủ để đưa ra các yêu cầu đến máy chủ khác và kết hợp các kết quả. Tuy vậy, nhiều chuyên gia phát triển phần mềm Ajax lại cố gắng ngắt các hạn chế cùng gốc. Việc sử dụng &amp;lt;script&amp;gt; tag như phương tiện truyền tải thay cho đối tượng XMLHttpRequest cũng có thể gây ra những mối nguy hiển và điều đó dẫn có thể đến gốc gác của nhiều vấn đề có liên quan đến bảo mật của Ajax.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Những gì bạn mong đợi&lt;/strong&gt; &lt;strong&gt;     &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;Với Ajax, các tiện ích ứng dụng phong phú sẽ là một điều thú vị, nhưng nhiều vấn đề có thể làm cho nó bị đắm chìm. Nếu hứa hẹn của một ứng dụng Ajax phong phú được cung cấp trong một môi trường mạng rất yếu thì người dùng sẽ vỡ mộng với tính không ổn định của ứng dụng mà không cần quan tâm đến giao diện bắt mắt. Để cho phép có được chất lượng, các chuyên gia về mạng cần đào tạo chuyên gia phát triển phần mềm về các nền tảng bảo mật và nền tảng mạng, cung cấp một nền tảng vững chắc và được kiểm tra thường xuyên, có các chuẩn đoán trình khách về chức năng của JavaScript và hiệu suất mạng từ các người dùng tương ứng.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;(theo QTM/ CIO)&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-6008488610300645514?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/6008488610300645514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/05/ban-ve-ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6008488610300645514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6008488610300645514'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/05/ban-ve-ajax.html' title='Bàn về AJAX'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-4566973516803672973</id><published>2009-05-31T09:44:00.001+07:00</published><updated>2009-05-31T09:44:08.991+07:00</updated><title type='text'>Sun sẽ kinh doanh qua Java App Store</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Sun Microsystems có kế hoạch tung ra “cửa hàng” ứng dụng Java App Store lớn hơn Apple App Store rất nhiều.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Hôm 18/5/2009, CEO Jonathan Schwartz cho biết, Sun hy vọng tăng doanh thu và kinh doanh qua Java App Store. Sun đang bị Oracle mua lại và Oracle tỏ ý rất quan tâm tới công nghệ Java của Sun.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://img505.imageshack.us/img505/4145/zrclip015p4171438d.png" /&gt;Một App Store dựa trên ngôn ngữ lập trình Java của Sun sẽ rất có tiềm năng vì có hàng triệu nhà phát triển phần mềm đã tạo ra nhiều ứng dụng với Java. Sun ước đoán, các ứng dụng phần mềm trên nền Java đã được sử dụng trên khoảng 4,5 tỷ máy tính, ĐTDĐ và nhiều thiết bị khác khiến Java trở thành một thị trường tiềm năng lớn. Ông Schwartz cho biết, App Store sẽ nhắm vào cộng đồng người dùng PC có chừng 1 tỷ người.&lt;/p&gt;  &lt;p&gt;Để so sánh, App Store của Apple đã bán được hơn 1 tỷ lượt tải phần mềm về dù trên thị trường chỉ có khoảng 21 triệu chiếc iPhone. Tuy nhiên, Sun đang trong tình trạng khốn khó để bắt chước sự thành công của Apple.&lt;/p&gt;  &lt;p&gt;Hồi năm 2005, Sun đồng ý phân phối thanh công cụ trình duyệt của Google với Java Runtime Environment (phần mềm cho phép chạy các ứng dụng Java trên Windows PC) và mang về cho Sun khá nhiều thu nhập. Sau đó, Sun đồng ý phân phối thanh công cụ MSN của Microsoft cho các bản JRE được phân phối tại Mỹ vì được trả giá cao hơn.&lt;/p&gt;  &lt;p&gt;Sun tung Java ra vào giữa những năm 1990. Java là ngôn ngữ lập trình được Sun phát triển để Internet và các trình duyệt web mang tính tương tác hơn như chơi game trực tuyến, chat, xem ảnh 3D… Sun sẽ tiết lộ thêm nhiều chi tiết về Java App Store tại hội nghị JavaOne sẽ diễn ra từ ngày 2/6/2009 ở San Francisco (Mỹ).&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;em&gt;(Theo PCWorld Vietnam&lt;/em&gt;)  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-4566973516803672973?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/4566973516803672973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/05/sun-se-kinh-doanh-qua-java-app-store.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4566973516803672973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4566973516803672973'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/05/sun-se-kinh-doanh-qua-java-app-store.html' title='Sun sẽ kinh doanh qua Java App Store'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-7363635138126157458</id><published>2009-05-31T09:42:00.001+07:00</published><updated>2009-05-31T09:42:43.073+07:00</updated><title type='text'>Sun đặt tham vọng 1 tỷ người dùng Java</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Sun đặt tham vọng 1 tỷ người dùng Java&lt;/p&gt;  &lt;p&gt;&lt;img hspace="4" src="http://3c.com.vn/Uploaded/hoant/3C_050309/java.jpg" align="left" vspace="4" border="0" /&gt;Sun vừa công bố dự án Java mới với quy mô kết nối một tỉ khách hàng mong muốn sử dụng công nghệ này. Dự án Java mới sẽ được triển khai dưới hình thức kho ứng dụng trực tuyến - “mốt” kinh doanh dịch vụ của nhiều đại gia lớn về công nghệ hiện nay.&lt;/p&gt;  &lt;p&gt;Tên mã hiện tại của dự án trên là &amp;quot;Project Vector&amp;quot;, tuy nhiên để cho dễ phân biệt với các kho ứng dụng trực tuyến khác và cũng là để cho dễ gọi, nó sẽ được đổi tên thành “Java Store”. Mô hình này đã được CEO Sun, Jonathan Schwartz, mô tả là “dịch vụ mạng” giúp kết nối các công ty và doanh nghiệp quy mô khác nhau, và kết nối khoảng một tỉ người dùng Java trên toàn thế giới.&amp;#160; &lt;br /&gt;“&lt;em&gt;Vector sẽ là nơi cung cấp những trải nghiệm công nghệ cho các nhà phát triển, doanh nghiệp yêu thích Java và JavaFX&lt;/em&gt;”, Schwartz cho biết. “&lt;em&gt;Nhiều người nghĩ rằng Sun chỉ là một công ty tiêu dùng, nhưng thực sự chúng tôi có thể tiếp cận một số lượng lớn khách hàng hơn bất cứ công ty nào trên toàn cầu&lt;/em&gt;”, khẳng định của Schwartz.     &lt;br /&gt;Hồi tháng 4 vừa qua, khi Oracle công bố kế hoạch thâu tóm Sun hãng này đã từng nói rằng Java đã, đang và sẽ là nền tảng quan trọng nhất mà Oracle muốn sở hữu. Schwartz cũng đề cập tới việc Sun đã có thỏa thuận với một số công ty tìm kiếm để phân phối bản nâng cấp Java qua mạng. Kênh phân phối này cũng sẽ giúp mang lại những giá trị kinh tế cho Sun.     &lt;br /&gt;“&lt;em&gt;Doanh thu của Sun đang ngày càng lớn hơn, và chúng tôi buộc phải tính tới việc xây dựng một hình thái kinh doanh chính thức hơn nhằm phân phối sức mạnh Java. Đó cũng chính là mục tiêu thiết kế ban đầu của Project Vector&lt;/em&gt;”, Schwartz cho biết thêm.     &lt;br /&gt;Theo như vị CEO này thì các ứng dụng mà các nhà phát triển muốn gửi cho Sun sẽ được thông qua một giao diện web đơn giản, rồi trải qua các thủ tục kiểm định trước khi được bày trên Java Store. Tiền thu về sẽ được trả cho các nhà phát triển, còn Sun chỉ giữ lại phần % doanh thu.     &lt;br /&gt;Các chi tiết về mô hình kinh doanh, công nghệ và lộ trình phát triển của Project Vector sẽ được công bố tại Hội nghị JavaOne tại San Francisco hôm 2/6/2009. &lt;/p&gt;  &lt;p&gt;Nguồn : &lt;a title="http://3c.com.vn/Story/vn/tintucvasukien/doanhnghiep/2009/5/54234.html" href="http://3c.com.vn/Story/vn/tintucvasukien/doanhnghiep/2009/5/54234.html"&gt;http://3c.com.vn/Story/vn/tintucvasukien/doanhnghiep/2009/5/54234.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-7363635138126157458?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/7363635138126157458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2009/05/sun-at-tham-vong-1-ty-nguoi-dung-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/7363635138126157458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/7363635138126157458'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2009/05/sun-at-tham-vong-1-ty-nguoi-dung-java.html' title='Sun đặt tham vọng 1 tỷ người dùng Java'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-4411039402769752332</id><published>2008-11-22T10:50:00.001+07:00</published><updated>2008-11-22T11:14:01.333+07:00</updated><title type='text'>Theo dõi hệ thống database (Audit Database)</title><content type='html'>&lt;p&gt;Trong một số dự án tôi từng trải qua, việc theo dõi lại những hành động đã xảy ra trong cơ sở dữ liệu là một việc làm hết sức quan trọng, giải pháp của nó rất nhiều, khó khăn cũng rất nhiều, hôm nay, tôi giới thiệu một cách tiếp cận khá đơn giản mà cực kỳ hiệu quả, nếu bài viết này có ích với bạn, xin đừng ngần ngại đóng góp ý kiến của bạn dưới bài viết này.&lt;/p&gt; &lt;p&gt;Bạn sẽ theo dõi những thay đổi trong database như thế nào, khi người dùng xóa, sửa dữ liệu. Bạn sẽ có một vài cách tiếp cận sau:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Tạo ra một cột tên là isDeleted: thoạt nhìn phải công nhận ý tưởng này rất tốt, bất cứ khi nào dữ liệu trên cột bị xóa nó sẽ không xóa bỏ hoàn toàn mà chỉ đánh dấu mà thôi, cách giải quyết này sẽ giải quyết được vấn đề delete, tuy nhiên nó vấp phải vấn đề về ràng buộc dữ liệu. Hãy tưởng tượng tôi có một bảng username tôi sẽ tổ chức như sau:&lt;br&gt;ID-UserName-Password. và cột isDeleted. Và bạn đã hiểu chuyện gì trong này USERNAME phải là duy nhất trong hệ thống. Nó chỉ được đang ký lại khi một người đã hủy nó đi hoặc chưa tồn tại.&lt;br&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/SSeBe6bGydI/AAAAAAAAALI/xTU9hPy-Xbc/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="192" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBfjyhFKI/AAAAAAAAALM/NYd9VZXgoVo/image_thumb%5B1%5D.png?imgmax=800" width="436" border="0"&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bây giờ tôi xóa username =xyz, nghĩa là username =xyz là isDeleted, sau đó tôi tiếp tục insert username là xyz.&lt;/p&gt; &lt;p&gt;Lúc này vấn đề tôi đã phải ràng buộc toàn vẹn trên database là nằm trên cột isDeleted, Constraint của tôi phải ràng buộc username và isDeleted là duy nhất, tuyệt, nhưng riêng trong chuyện này thế đã là không ổn, bạn đã phải tính tới chuyện tạo một constrain cho một cột không tham gia vào bussiness của hệ thống, điều này lẽ ra nên tránh.&lt;/p&gt; &lt;p&gt;Mặt khác, chuyện gì sẽ xảy ra nếu tôi insert username=zyz, sau đó xóa, rồi tạo lại, rồi lại xóa.&lt;/p&gt; &lt;p&gt;Vấn đề bây giờ bạn phải luôn kiểm tra trước khi insert dữ liệu, có bao giờ bạn tự hỏi, vậy constraint trong database đã sinh ra để làm gì không??&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Tạo một bản sao database: nếu đã làm qua Oracle bạn đều biết có một loại audit table mà oracle hỗ trợ để quản lý việc insert, delete , update. Không nhất thiết phải Oracle, trong database khác bạn cũng có thể dễ dàng cài đặt chức năng này, đơn giản như sau:&lt;br&gt;Tạo một Database log y hệt database gốc, mỗi bảng thêm một cột là action cho update, delete (insert là tùy chọn của bạn)&lt;br&gt;Tạo trigger cho từng bảng, khi có thay đổi trên database gốc, nó sẽ insert vào bảng log với sự kiện tượng ứng.&lt;br&gt;Cách giải quyết này theo tôi là rất tốt: thứ nhất nó không làm nặng nề database gốc của chúng ta, khi dữ liệu bị xóa đi, nó sẽ chuyển sang database log và không làm phình to database gốc và dễ hiểu như thế khi truy vấn database gốc sẽ cho tốc độ tốt hơn vì ít dữ liệu hơn.&lt;br&gt;Vấn đề của nó là khó quản lý, bạn phải viết chương trình quản lý cho từng bảng, cực đấy chứ nhỉ. &lt;br&gt;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBgDZTGQI/AAAAAAAAALQ/o6BztfRXNzs/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="216" alt="image" src="http://lh5.ggpht.com/_tYqoXlRa1XY/SSeBgxBSDqI/AAAAAAAAALU/0RUlMoNaZ5g/image_thumb%5B3%5D.png?imgmax=800" width="472" border="0"&gt;&lt;/a&gt;  &lt;li&gt;Sử dụng một bảng duy nhất làm bảng Audit.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBhqDtJII/AAAAAAAAALY/D6aUxnn5I3E/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="307" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBiv7lMNI/AAAAAAAAALc/g7i7MSr6ukU/image_thumb%5B9%5D.png?imgmax=800" width="515" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Đoạn script để tạo bảng này như sau:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;CREATE TABLE Audit &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Type CHAR(1), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TableName VARCHAR(128), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PK VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FieldName VARCHAR(128), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OldValue VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NewValue VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpdateDate datetime, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserName VARCHAR(128))
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Với cách tiếp cận này, tôi sẽ giải thích các field như sau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AuditID :là một id tự tăng. 
&lt;li&gt;Type: một action nó có thể là D (Delete) I (Insert) U (Update). 
&lt;li&gt;TableName : action xảy ra trên bảng nào. 
&lt;li&gt;PrimaryKeyField : khóa chính của dòng bị xóa (với bảng 1 khóa chính -Theo Agile, nếu bạn mong muốn khác đi, hãy customize code) 
&lt;li&gt;PrimaryKeyValue: giá trị của cột chứa khóa chính. 
&lt;li&gt;FieldName : Cột bị xảy ra action. 
&lt;li&gt;OldValue : Giá trị cũ trước khi bị thay đổi. 
&lt;li&gt;NewValue : Giá trị mới sau khi bị thay đổi. 
&lt;li&gt;UpdateDate : Ngày giờ xảy ra action. 
&lt;li&gt;UserName : người dùng (Tôi sẽ sử dụng user của hệ thống, hãy sử dụng username trên một table khác như bạn muốn)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tYqoXlRa1XY/SSeBjsuPdmI/AAAAAAAAALg/4h99rVa4zxQ/s1600-h/image%5B24%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="image" src="http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBkcdK3DI/AAAAAAAAALk/zceAxIFH6e0/image_thumb%5B16%5D.png?imgmax=800" width="665" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nhìn vào bảng kết quả chắc bạn đã hình dung được vấn đề.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre style="width: 637px; height: 2315px"&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;-- Set up the tables&lt;br&gt;-- Firstly, we create the audit table.&lt;br&gt;-- There will only need to be one of these in a database 
&lt;p&gt;IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[dbo].[Audit]') &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND OBJECTPROPERTY(id, N'IsUserTable') = 1)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CREATE TABLE Audit &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Type CHAR(1), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TableName VARCHAR(128), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PK VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FieldName VARCHAR(128), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OldValue VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NewValue VARCHAR(1000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpdateDate datetime, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserName VARCHAR(128))&lt;br&gt;GO 
&lt;p&gt;-- now we will illustrate the use of this tool&lt;br&gt;-- by creating a dummy test table called TrigTest. 
&lt;p&gt;IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[dbo].[trigtest]')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND OBJECTPROPERTY(id, N'IsUserTable') = 1)&lt;br&gt;DROP TABLE [dbo].[trigtest]&lt;br&gt;GO&lt;br&gt;CREATE TABLE trigtest &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (i INT NOT NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j INT NOT NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s VARCHAR(10), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t VARCHAR(10))&lt;br&gt;GO 
&lt;p&gt;--note that for this system to work there must be a primary key to the table&lt;br&gt;--but then a table without a primary key isn't really a table is it?&lt;br&gt;ALTER TABLE trigtest ADD CONSTRAINT pk PRIMARY KEY (i, j)&lt;br&gt;GO 
&lt;p&gt;--and now create the trigger itself. This has to be created for every&lt;br&gt;-table you want to monitor 
&lt;p&gt;CREATE TRIGGER tr_trigtest ON trigtest FOR INSERT, UPDATE, DELETE&lt;br&gt;AS 
&lt;p&gt;DECLARE @bit INT ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @field INT ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @maxfield INT ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @char INT ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @fieldname VARCHAR(128) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @TableName VARCHAR(128) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @PKCols VARCHAR(1000) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @sql VARCHAR(2000), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @UpdateDate VARCHAR(21) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @UserName VARCHAR(128) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Type CHAR(1) ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @PKSelect VARCHAR(1000)
&lt;p&gt;--You will need to change @TableName to match the table to be audited&lt;br&gt;SELECT @TableName = 'trigtest' 
&lt;p&gt;-- date and user&lt;br&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @UserName = SYSTEM_USER ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @UpdateDate = CONVERT(VARCHAR(8), GETDATE(), 112) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' ' + CONVERT(VARCHAR(12), GETDATE(), 114) 
&lt;p&gt;-- Action&lt;br&gt;IF EXISTS (SELECT * FROM inserted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF EXISTS (SELECT * FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @Type = 'U'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @Type = 'I'&lt;br&gt;ELSE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @Type = 'D' 
&lt;p&gt;-- get list of columns&lt;br&gt;SELECT * INTO #ins FROM inserted&lt;br&gt;SELECT * INTO #del FROM deleted 
&lt;p&gt;-- Get primary key columns for full outer join&lt;br&gt;SELECT @PKCols = COALESCE(@PKCols + ' and', ' on') &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' i.' + c.COLUMN_NAME + ' = d.' + c.COLUMN_NAME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk , 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INFORMATION_SCHEMA.KEY_COLUMN_USAGE c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp;&amp;nbsp; pk.TABLE_NAME = @TableName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONSTRAINT_TYPE = 'PRIMARY KEY'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.TABLE_NAME = pk.TABLE_NAME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME 
&lt;p&gt;-- Get primary key select for insert&lt;br&gt;SELECT @PKSelect = COALESCE(@PKSelect+'+','') &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + '''&amp;lt;' + COLUMN_NAME &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + '=''+convert(varchar(100),&lt;br&gt;coalesce(i.' + COLUMN_NAME +',d.' + COLUMN_NAME + '))+''&amp;gt;''' &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INFORMATION_SCHEMA.KEY_COLUMN_USAGE c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp;&amp;nbsp; pk.TABLE_NAME = @TableName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONSTRAINT_TYPE = 'PRIMARY KEY'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.TABLE_NAME = pk.TABLE_NAME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME 
&lt;p&gt;IF @PKCols IS NULL&lt;br&gt;BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAISERROR('no PK on table %s', 16, -1, @TableName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN&lt;br&gt;END 
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @field = 0, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @maxfield = MAX(ORDINAL_POSITION) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName&lt;br&gt;WHILE @field &amp;lt; @maxfield&lt;br&gt;BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @field = MIN(ORDINAL_POSITION) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM INFORMATION_SCHEMA.COLUMNS &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE TABLE_NAME = @TableName &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND ORDINAL_POSITION &amp;gt; @field&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @bit = (@field - 1 )% 8 + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @bit = POWER(2,@bit - 1)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @char = ((@field - 1) / 8) + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF SUBSTRING(COLUMNS_UPDATED(),@char, 1) &amp;amp; @bit &amp;gt; 0 OR @Type IN ('I','D')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @fieldname = COLUMN_NAME &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM INFORMATION_SCHEMA.COLUMNS &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE TABLE_NAME = @TableName &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND ORDINAL_POSITION = @field&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @sql = '&lt;br&gt;insert Audit (&amp;nbsp;&amp;nbsp;&amp;nbsp; Type, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TableName, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PK, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FieldName, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OldValue, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NewValue, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpdateDate, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserName)&lt;br&gt;select ''' + @Type + ''',''' &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + @TableName + ''',' + @PKSelect&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ',''' + @fieldname + ''''&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ',convert(varchar(1000),d.' + @fieldname + ')'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ',convert(varchar(1000),i.' + @fieldname + ')'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ',''' + @UpdateDate + ''''&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ',''' + @UserName + ''''&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' from #ins i full outer join #del d'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + @PKCols&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' where i.' + @fieldname + ' &amp;lt;&amp;gt; d.' + @fieldname &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' or (i.' + @fieldname + ' is null and&amp;nbsp; d.' + @fieldname + ' is not null)' &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + ' or (i.' + @fieldname + ' is not null and&amp;nbsp; d.' + @fieldname + ' is null)' &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC (@sql)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;END 
&lt;p&gt;GO 
&lt;p&gt;------------------------------------------------------- 
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;Đoạn mã trên sẽ làm việc hoàn hảo, nó sẽ đi vào sơ đồ của hệ thống và tìm ra tất cả những bảng có trong schema, sau đó tạo từng trigger theo một template nhất định- Hãy giới hạn table hay column bằng cách customize lại code này.&lt;/p&gt;
&lt;p&gt;Lưu ý: Đoạn mã này thực hiện trên Microsoft SQL Server và sử dụng trigger&amp;nbsp; hãy sửa đổi cho phù hợp trên những database khác. Điều này không thể thực hiện trên CSDL không hỗ trợ trigger.&lt;/p&gt;
&lt;p&gt;Lợi ích : tiếp cận thông qua chỉ một table, điều này mang đến sự thuận tiện và dễ dàng khi quản trị, nếu hệ thống tiếp tục sinh sôi ra các bảng, đó không phải là vấn đề.&lt;/p&gt;
&lt;p&gt;Bất lợi : Một chút về vấn đề Perfomance, với các Database trung bình và nhỏ, việc audit là bình thường, tuy nhiên nếu database lớn khi sử dụng nhiều câu Insert và Delete&amp;nbsp; sẽ tạo ra những dữ liệu khổng lổ trên từng dòng (vì nó lưu 1 field trên một dòng audit ).&lt;/p&gt;
&lt;p&gt;Trong mọi loại database dù lớn hay nhỏ, nếu chỉ sử dụng để tracking Update action, đây là một cách tiếp cận tốt nhất. Với Delete, hãy customize lại mã để sử dụng tối thiểu trường cần phải tracking hoặc có thể áp dụng phương pháp logging thứ 2 dựa trên đoạn mã này.&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;Vắng nhà một thời gian dài, hy vọng bài viết trở lại này giúp ích cho các bạn&lt;/em&gt;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-4411039402769752332?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/4411039402769752332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/11/theo-di-h-thng-database-audit-database.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4411039402769752332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4411039402769752332'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/11/theo-di-h-thng-database-audit-database.html' title='Theo dõi hệ thống database (Audit Database)'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_tYqoXlRa1XY/SSeBfjyhFKI/AAAAAAAAALM/NYd9VZXgoVo/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-2495203033247317965</id><published>2008-10-21T17:22:00.001+07:00</published><updated>2008-10-21T17:22:37.643+07:00</updated><title type='text'>Có kinh nghiệm, nhưng vẫn thất bại, vì sao?</title><content type='html'>&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Arial"&gt;&lt;b&gt;Có những nhà quản lý lão luyện, làm việc hiệu quả và tích lũy được những thành công nhất định nhưng họ lại gặp những thất bại cay đắng khi điều hành tổ chức. Trong trường hợp này, nguyên nhân có thể nằm ở chính những thói quen xấu của họ. &lt;/b&gt;&lt;br&gt;Những nguyên nhân bề nổi và bề sâu dẫn đến thất bại của những người này:&lt;br&gt;- Quan niệm quản lý có vấn đề khiến tổ chức không nhận thức đúng đắn những vấn đề mới nảy sinh hay những biến đổi.&lt;br&gt;- Lạc quan quá mức, không nhìn thẳng thực tế trong thời gian dài.&lt;br&gt;- Nảy sinh những trở ngại về giao tiếp giữa các cấp trong tổ chức hay thiếu nhanh nhạy với thông tin bên ngoài.&lt;br&gt;- Người quản lý thiếu sự kiên định vì quá trình làm việc trước đó chưa gặp nhiều khó khăn.&lt;br&gt;Tất cả những nguyên nhân này cho thấy sự thất bại của người quản lý không chỉ bởi họ không thể hoàn thành công việc nói chung mà còn vì họ thiếu khả năng ứng biến với những thay đổi tiêu cực. Những thói quen chi phối xu hướng này của họ gồm:&lt;br&gt;&lt;b&gt;1. Tâm lý tự tin thái quá&lt;/b&gt;&lt;br&gt;Rất nhiều người quản lý không nhìn thấy điểm yếu này của mình, tự cho rằng mình là trung tâm của tổ chức. Chỉ đạo mà không sâu sát, ra lệnh mà muốn được thành công ngay, những người này tự tin đến mức luôn cho rằng thành công của tổ chức không phải là kết quả của sự cố gắng chung mà là do năng lực của bản thân. Nhân viên sẽ ngấm ngầm phản đối bằng sự thiếu cố gắng vì họ hiểu được rằng có tích cực đến mấy cũng là sếp được hưởng lợi mà thôi.&lt;br&gt;&lt;b&gt;2. Lẫn lộn giữa công ty và bản thân&lt;/b&gt;&lt;br&gt;Những người công tư lẫn lộn này quá coi trọng cảm xúc cá nhân, lãnh đạo và đánh giá nhân viên theo cảm hứng. Đa phần những công việc họ làm không xuất phát từ lợi ích của công ty mà thường theo tiêu chí mang lại lợi nhuận lớn nhất cho bản thân. Họ thường chọn những đối tác chịu chi tiền hoa hồng lớn hay những lĩnh vực mà bản thân đã quen việc.&lt;br&gt;&lt;b&gt;3. Ôm đồm, nghĩ mình biết tuốt&lt;/b&gt;&lt;br&gt;Trong một thế giới mà hoàn cảnh khách quan luôn biến đổi như hiện nay, dù kinh nghiệm làm việc có phong phú đến đâu thì không ai có thể tự tin rằng mình nắm vững mọi lĩnh vực. Những người lãnh đạo vốn đươc coi là quyết đoán, nhanh nhạy thì hay đưa ra những quyết định mà nguy cơ để lại hậu quả là rất lớn. Những người này tự nhận việc, tự chịu trách nhiệm và khăng khăng một phương án mà không quan tâm rằng, có những việc chịu trách nhiệm thôi là chưa đủ.&lt;br&gt;&lt;b&gt;4. Khăng khăng ý kiến của mình&lt;/b&gt;&lt;br&gt;Nhiều nhà quản lý có kinh nghiệm đều cho rằng nên duy trì sự đồng thuận và thống nhất trong công ty, khi đã đưa ra một quyết định chỉ cần áp dụng phương pháp ai làm việc đó, tập trung không ý kiến là mọi việc sẽ suôn sẻ. Thực tế cho thấy, với một thế giới đang thay đổi từng ngày thì việc thiếu giao lưu phản hồi với mọi thành viên trong tổ chức sẽ không đưa ra được phương án giải quyết linh hoạt, hiệu quả nhất cũng như làm mất đi khả năng ứng phó của tổ chức.&lt;br&gt;&lt;b&gt;5. Coi trọng hình tượng công ty quá mức&lt;/b&gt;&lt;br&gt;Vẫn biết rằng một người quản lý luôn cần cố gắng để xây dựng một hình tượng đẹp cho tổ chức của mình nhưng nếu chỉ chú tâm vào xây dựng và quảng bá hình ảnh thì không phải biện pháp hiệu quả nhất để duy trì và nâng cao lợi nhuận. Hệ quả của chứng coi trọng quá mức hình tượng công ty mình thể hiện ở việc tập trung tài chính vào quảng cáo, xây dựng thêm nhiều nhà xưởng và trang bị những thiết bị chẳng bao giờ dùng đến hay chi dùng với mục đích làm đẹp bản thân.&lt;br&gt;&lt;b&gt;6. Coi thường mọi trở ngại&lt;/b&gt;&lt;br&gt;Tâm lý của những người có kinh nghiệm là thường đánh giá thấp mức độ nguy hiểm các thử thách phải đối mặt và thường chỉ đạo nhân viên cấp dưới một cách võ đoán và phó mặc, “cứ thực hiện đi, có khó khăn gì đâu mà”. Bản thân vị sếp này cũng không đánh giá được đúng những năng lực của nhân viên để có phương án dùng người hiệu quả trong từng trường hợp. Nước đến chân mới nhảy, dù có nhảy cao đến mấy cũng có lúc không tránh khỏi chết chìm.&lt;br&gt;&lt;b&gt;7. Áp dụng mãi những kinh nghiệm xưa cũ&lt;/b&gt;&lt;br&gt;Có những biện pháp thực sự hiệu quả và đã đem lại thành công nhiều lần không phải là một sự đảm bảo chắc chắn rằng lần tiếp theo sẽ thành công. Không chừng những đối thủ xưa cũ đã quá quen với những chiêu thức này có thể bật lại bạn bằng những chiêu khống chế. Đổi mới tiềm ẩn những rủi ro nhưng nhiều hơn cả là những cơ hội. Người quản lý cần nắm vững những thay đổi thời cuộc, tìm tòi đổi mới không ngừng để làm chủ mọi tình huống, đảm bảo thành công.&lt;br&gt;( Theo Tạp Chí Lãnh Đạo Trung Quốc ) &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-2495203033247317965?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/2495203033247317965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/c-kinh-nghim-nhng-vn-tht-bi-v-sao.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/2495203033247317965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/2495203033247317965'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/c-kinh-nghim-nhng-vn-tht-bi-v-sao.html' title='Có kinh nghiệm, nhưng vẫn thất bại, vì sao?'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-3350084817523936437</id><published>2008-10-18T00:47:00.001+07:00</published><updated>2008-10-18T00:47:21.961+07:00</updated><title type='text'>Các phương thức thường dùng của Session trong Hibernate</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img alt="V&amp;#242;ng đời của Hibernate" src="http://javasimple.files.wordpress.com/2008/07/hibernate-life-cycle.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Trong Hibernate một đối tượng c&amp;#243; thể thuộc 3 trạng th&amp;#225;i:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Transient&lt;/strong&gt;: Đối tượng kh&amp;#244;ng c&amp;#243; quan hệ với Session hiện tại của Hibernate.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Persistent&lt;/strong&gt;: Đối tượng c&amp;#243; quan hệ với Session hiện tại của Hibernate v&amp;#224; trạng th&amp;#225;i của n&amp;#243; được đồng bộ với cơ sở dữ li&amp;#234;u&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Detache&lt;/strong&gt;: Đối tượng đ&amp;#227; từng c&amp;#243; trạng th&amp;#225;i persistent nhưng hiện tại đ&amp;#227; kh&amp;#244;ng c&amp;#242;n giữ quan hệ với Session.&lt;/p&gt;  &lt;p&gt;Ở đ&amp;#226;y ch&amp;#250;ng ta n&amp;#243;i một đối tượng c&amp;#243; quan hệ với Session nghĩa l&amp;#224; Session c&amp;#243; tham chiếu đến đối tượng đ&amp;#243;, hay một c&amp;#225;ch kh&amp;#225;c l&amp;#224; chịu sự quản l&amp;#253; của Session (d&amp;#249;ng tiếng Việt giải nghĩa kỹ thuật kh&amp;#243; kinh khủng).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;save()&lt;/strong&gt; d&amp;#249;ng để lưu một đối tượng với trạng th&amp;#225;i transient th&amp;#224;nh đối tượng persistent, trả về id persist() giống save nhưng kh&amp;#244;ng trả về g&amp;#236; cả. &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;saveOrUpdate()&lt;/strong&gt; nếu l&amp;#224; đối tượng mới th&amp;#236; lưu xuống db, nếu kh&amp;#244;ng th&amp;#236; update xuống db, c&amp;#225;i n&amp;#224;y sẽ select để kiểm tra trước khi save hoặc update &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;merge()&lt;/strong&gt; kiểm tra xem c&amp;#243; đối tương n&amp;#224;o với id như thế tồn tại trong session kh&amp;#244;ng, nếu c&amp;#243; th&amp;#236; update v&amp;#224;o đối tượng đ&amp;#227; tồn tại đ&amp;#243;, nếu kh&amp;#244;ng th&amp;#236; tạo mới một đối tượng v&amp;#224; save xuống &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;load() &lt;/strong&gt;d&amp;#249;ng để load một đối tượng từ database l&amp;#234;n, n&amp;#243; sẽ c&amp;#243; trạng th&amp;#225;i persistent, throw exception nếu id kh&amp;#244;ng tồn tại &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;get() &lt;/strong&gt;giống load(), trả về null nếu kh&amp;#244;ng tồn tại &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;refresh()&lt;/strong&gt; refresh một đối tượng đang ở trạng th&amp;#225;i persistent &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;delete()&lt;/strong&gt; load đối tượng l&amp;#234;n v&amp;#224; xo&amp;#225; n&amp;#243; đi, nếu kh&amp;#244;ng muốn load l&amp;#234;n th&amp;#236; d&amp;#249;ng session.createQuery(&amp;#8221;delete from user where &amp;#8230;&amp;#8221;).executeUpdate() &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;evict() &lt;/strong&gt;t&amp;#225;ch một đối tượng ra khỏi session, biến n&amp;#243; từ trạng th&amp;#225;i persistent th&amp;#224;nh transient &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;isDirty()&lt;/strong&gt; kiểm tra xem session c&amp;#243; sync với db kh&amp;#244;ng &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Ch&amp;#250; &amp;#253; sự kh&amp;#225;c nhau giữa saveOrUpdate v&amp;#224; merge&lt;/em&gt;      &lt;br /&gt;&lt;em&gt;saveOrUpdate()       &lt;br /&gt;-Nếu đối tượng đ&amp;#227; được persistent th&amp;#236; kh&amp;#244;ng l&amp;#224;m g&amp;#236; cả        &lt;br /&gt;-Nếu c&amp;#243; đối tượng kh&amp;#225;c được persistent với c&amp;#249;ng id th&amp;#236; throw exception        &lt;br /&gt;-Nếu đối tượng kh&amp;#244;ng c&amp;#243; id hoặc c&amp;#243; id mới th&amp;#236; gọi save        &lt;br /&gt;-Trường hợp kh&amp;#225;c th&amp;#236; update (c&amp;#243; id đ&amp;#227; c&amp;#243; trong db nhưng chưa được persistent)        &lt;br /&gt;merge()        &lt;br /&gt;-Nếu c&amp;#243; đối tượng trong session với c&amp;#249;ng id th&amp;#236; cập nhật gi&amp;#225; trị từ thằng ngo&amp;#224;i v&amp;#224;o. Như vậy thằng ngo&amp;#224;i vẫn detach.        &lt;br /&gt;-Nếu trong session kh&amp;#244;ng c&amp;#243; đối tượng v&amp;#224;o với c&amp;#249;ng id như thế th&amp;#236; load l&amp;#234;n từ db. Nếu load l&amp;#234;n kh&amp;#244;ng c&amp;#243; th&amp;#236; tạo đối tượng mới. Xong rồi cập nhật dữ liệu từ thằng ngo&amp;#224;i v&amp;#224;o thằng trong session.        &lt;br /&gt;-Đối tượng trả về ở trạng th&amp;#225;i detach&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt; Theo b&amp;#224;i viết của&amp;#160; &lt;a href="http://javasimple.wordpress.com"&gt;L&amp;#234; Mạnh Cường&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-3350084817523936437?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/3350084817523936437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/cc-phng-thc-thng-dng-ca-session-trong.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/3350084817523936437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/3350084817523936437'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/cc-phng-thc-thng-dng-ca-session-trong.html' title='Các phương thức thường dùng của Session trong Hibernate'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-8616557207022545116</id><published>2008-10-18T00:44:00.001+07:00</published><updated>2008-10-18T00:44:52.222+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><title type='text'>Với ODF nhìn về tương lai và OOXML nhìn vào quá khứ</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;B&amp;#224;i được đưa l&amp;#234;n Internet ng&amp;#224;y: 05/10/2008&lt;/p&gt;  &lt;p&gt;Nội dung b&amp;#224;i:&lt;/p&gt;  &lt;p&gt;Tuần trước, 13 trong số 23 th&amp;#224;nh vi&amp;#234;n của uỷ ban cơ quan ti&amp;#234;u chuẩn quốc tế ISO của Nauy đ&amp;#227; từ chức. Họ đ&amp;#227; từ chức để phản đối quyết đinh ch&amp;#237;nh thức của Nauy chấp thuận cho định dạng t&amp;#224;i liệu OOXML của Microsoft như một ti&amp;#234;u chuẩn ISO, mặc d&amp;#249; 21 trong số 23 th&amp;#224;nh vi&amp;#234;n của uỷ ban n&amp;#224;y bỏ phiếu chống &amp;#8211; n&amp;#243;i &amp;#8220;kh&amp;#244;ng&amp;#8221;. (chỉ c&amp;#243; 2 phiếu &amp;#8220;c&amp;#243;&amp;#8221; l&amp;#224; của Microsoft v&amp;#224; Statoil Nauy).&lt;/p&gt;  &lt;p&gt;Một tuần trước đ&amp;#243;, IBM đ&amp;#227; l&amp;#234;n tiếng kh&amp;#244;ng thoả m&amp;#227;n với qu&amp;#225; tr&amp;#236;nh chấp thuận OOXML n&amp;#224;y, v&amp;#224; đ&amp;#227; đe doạ rời bỏ ISO nếu tổ chức n&amp;#224;y kh&amp;#244;ng bảo vệ c&amp;#225;c quyết định của m&amp;#236;nh khỏi &amp;#8220;sự ảnh hưởng th&amp;#225;i qu&amp;#225;&amp;#8221;. Hiện nay c&amp;#243; một v&amp;#224;i lo lắng rằng Microsoft đang cố gắng tiếp quản qu&amp;#225; tr&amp;#236;nh của định dạng t&amp;#224;i liệu mở ODF trong một mưu toan kiểm so&amp;#225;t hoặc huỷ hoại đối thủ cạnh tranh định dạng t&amp;#224;i liệu của họ.&lt;/p&gt;  &lt;p&gt;H&amp;#227;y nh&amp;#236;n v&amp;#224;o sự đối nghịch từ quan điểm của người sử dụng một ch&amp;#250;t. Hai &amp;#8220;định dạng t&amp;#224;i liệu phổ biến&amp;#8221; cạnh tranh nhau n&amp;#224;y l&amp;#224; kh&amp;#244;ng tốt, việc c&amp;#243; nhiều hơn 2 phi&amp;#234;n bản của Javascript hoặc HTML l&amp;#224; kh&amp;#244;ng tốt. Trong thời kỳ giữa những năm 1990, JavaScript v&amp;#224; HTML đ&amp;#227; c&amp;#243; nhiều triển khai c&amp;#224;i đặt kh&amp;#244;ng tương tương th&amp;#237;ch nhau, v&amp;#224; n&amp;#243; l&amp;#224; tổn hại tới t&amp;#237;nh tương hợp. N&amp;#243; đ&amp;#227; kh&amp;#244;ng tốt cho tới khi những triển khai n&amp;#224;y đ&amp;#227; hội tụ v&amp;#224; c&amp;#225;c nh&amp;#224; lập tr&amp;#236;nh ph&amp;#225;t triển đ&amp;#227; c&amp;#243; khả năng triển khải được c&amp;#225;c ứng dụng Ajax m&amp;#224; ch&amp;#250;ng đ&amp;#227; c&amp;#243; một người cầu nguyện về l&amp;#224;m việc tr&amp;#234;n c&amp;#225;c tr&amp;#236;nh duyệt kh&amp;#225;c nhau.&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;Last week, 13 of 23 members of Norway's International Standards Organization (ISO) committee &lt;/font&gt;&lt;a href="http://www.theinquirer.net/gb/inquirer/news/2008/10/02/norway-standards-members-walk"&gt;&lt;font color="#408080"&gt;resigned&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt;. They were resigning in protest to Norway's official decision to favor Microsoft (NSDQ: &lt;/font&gt;&lt;a href="http://www.techweb.com/financialCenter/index.jhtml?Account=techweb&amp;amp;Page=QUOTE&amp;amp;Ticker=MSFT"&gt;&lt;font color="#408080"&gt;MSFT&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt;)'s &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Office_Open_XML"&gt;&lt;font color="#408080"&gt;OOXML document format&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt; as an ISO standard, despite a &amp;quot;no&amp;quot; vote by 21 of 23 committee members. (Microsoft and Statoil were the Norway committee's only two &amp;quot;yes&amp;quot; votes.)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;A week earlier, IBM (NYSE: &lt;/font&gt;&lt;a href="http://www.techweb.com/financialCenter/index.jhtml?Account=techweb&amp;amp;Page=QUOTE&amp;amp;Ticker=IBM"&gt;&lt;font color="#408080"&gt;IBM&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt;) &lt;/font&gt;&lt;a href="http://www.nytimes.com/idg/IDG_852573C400693880002574CD0027DDFF.html?ref=technology"&gt;&lt;font color="#408080"&gt;voiced dissatisfaction&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt; with the OOXML approval process, and threatened to leave ISO if the organization didn't protect its decisions from &amp;quot;undue influence.&amp;quot; Now there is some concern that Microsoft is trying to &lt;/font&gt;&lt;a href="http://www.groklaw.net/article.php?story=20080825162905645"&gt;&lt;font color="#408080"&gt;take over the Open Document Format (ODF) process&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt; in an attempt to control or destroy its document-format competitor.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;Let's look at this controversy from the user's standpoint for a minute. Two competing &amp;quot;universal document formats&amp;quot; are not good, any more than two versions of JavaScript or HTML are good. During the mid-1990s, JavaScript and HTML had multiple incompatible implementations, and it made interoperability a pain. It wasn't until those implementations converged that developers were able to deploy &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;&lt;font color="#408080"&gt;Ajakx&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt; applications that had a prayer of working on different browsers.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Mục ti&amp;#234;u của c&amp;#225;c định dạng t&amp;#224;i liệu n&amp;#224;y phải l&amp;#224; để m&amp;#244; tả c&amp;#225;c t&amp;#224;i liệu hiện h&amp;#224;nh theo một c&amp;#225;ch tương hợp được, v&amp;#224; để hướng tới được những cải tiến hoặc mở rộng trong tương lai. D&amp;#249; tốt xấu thế n&amp;#224;o, th&amp;#236; OOXML t&amp;#243;m lược trong một dạng mẫu của XML, tất cả h&amp;#224;nh l&amp;#253; của c&amp;#225;c định dạng tệp của Office. Những thứ n&amp;#224;y đ&amp;#227; được x&amp;#226;y dựng như một c&amp;#225;i vỏ đ&amp;#227; từ 25 năm qua theo sự tiến ho&amp;#225; của Microsoft Office. ODF c&amp;#243; thể l&amp;#224; tốt hơn trong nhiều kh&amp;#237;a cạnh, nhưng n&amp;#243; chỉ c&amp;#243; thể đại diện cho một tập con của c&amp;#225;c t&amp;#237;nh năng hiện h&amp;#224;nh trong Office.&lt;/p&gt;  &lt;p&gt;C&amp;#226;u hỏi của t&amp;#244;i l&amp;#224;, v&amp;#236; sao OOXML phải được chứng minh trước khi đưa ra được sức mạnh của một ti&amp;#234;u chuẩn quốc tế? C&amp;#225;c định dạng nhị ph&amp;#226;n của Office sẽ được chứng minh, nhưng bản th&amp;#226;n OOXML vẫn c&amp;#242;n rất nhiều c&amp;#225;c kh&amp;#237;a cạnh m&amp;#249; mờ v&amp;#224; c&amp;#225;c c&amp;#226;u hỏi xung quanh c&amp;#225;c chi tiết. Tr&amp;#236;nh chuyển đổi sang nguồn mở của Microsoft giữa c&amp;#225;c định dạng nhị ph&amp;#226;n của Office v&amp;#224; OOXML dường như l&amp;#224; đang c&amp;#243; một v&amp;#224;i tiến bộ, song n&amp;#243; chưa được l&amp;#224;m xong. T&amp;#244;i lo rằng để xử l&amp;#253; OOXML một c&amp;#225;ch c&amp;#243; hiệu quả, c&amp;#225;c ứng dụng kh&amp;#244;ng phải của Microsoft sẽ buộc phải nhận th&amp;#225;ch đố 25 năm đối với những h&amp;#224;nh l&amp;#253; v&amp;#224; sự thừa mứa của Office.&lt;/p&gt;  &lt;p&gt;Giữa tất cả c&amp;#225;c cuộc c&amp;#227;i v&amp;#227; mang t&amp;#237;nh ch&amp;#237;nh trị n&amp;#224;y về ODF v&amp;#224; OOXML, h&amp;#227;y giữ lấy những nhu cầu của người sử dung v&amp;#224; c&amp;#225;c doanh nghiệp trong đầu. Microsoft sẽ kh&amp;#244;ng được chặn cướp qu&amp;#225; tr&amp;#236;nh n&amp;#224;y, nhưng điều cơ bản thực tế l&amp;#224; những xem x&amp;#233;t về t&amp;#237;nh tương th&amp;#237;ch của t&amp;#224;i liệu Microsoft Office đang &amp;#8220;chặn cướp&amp;#8221; qu&amp;#225; tr&amp;#236;nh n&amp;#224;y, &amp;#237;t nhất l&amp;#224; cho OOXML. Nếu ODF kh&amp;#244;ng thể đại diện cho tất cả c&amp;#225;c t&amp;#237;nh năng của c&amp;#225;c t&amp;#224;i liệu của Office, th&amp;#236; n&amp;#243; sẽ kh&amp;#244;ng sử dụng được cho 2 người sử dụng m&amp;#224;m họ muốn trao đổi c&amp;#225;c t&amp;#224;i liệu của Office. Trong trường hợp đ&amp;#243;, c&amp;#243; thể 2 thứ n&amp;#224;y cần phải đứng ri&amp;#234;ng rẽ, với OOXML nh&amp;#236;n về qu&amp;#225; khứ v&amp;#224; ODF nh&amp;#236;n về tương lai.&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;The goal of these document formats should be to describe existing documents in an interoperable way, and to accommodate future enhancements or extensions. For better or worse, OOXML encapsulates, in an XML form, all the baggage of the Office file formats. Those have built up like a barnacle-encrusted hull over the past 25 years as Microsoft Office has evolved. ODF may be better in various ways, but it can only represent a subset of the features currently in Office.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;The question I have is, why shouldn't OOXML be proven before being given the weight of an international standard? The Office binary formats are proven, yes, but OOXML itself still has a lot of fuzzy areas and question marks surrounding the details. &lt;/font&gt;&lt;a href="http://b2xtranslator.sourceforge.net/"&gt;&lt;font color="#408080"&gt;Microsoft's open-source translator&lt;/font&gt;&lt;/a&gt;&lt;font color="#408080"&gt; between Office binary formats and OOXML does seem to be making some progress, but it's not done yet. I'm concerned that in order to process OOXML effectively, non-Microsoft applications will be obligated to take on those 25 years of Office baggage and bloat.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;In the midst of all this political wrangling about ODF and OOXML, let's keep the needs of users and businesses in mind. Microsoft shouldn't hijack this process, but it is practically essential that considerations about Microsoft Office document compatibility &amp;quot;hijack&amp;quot; the process, at least for OOXML. If ODF can't represent all the features of Office documents, then it won't be usable for two users that want to exchange Office documents. In that case, perhaps the two do need to stay separate, with OOXML looking backward and ODF looking forward.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Dịch t&amp;#224;i liệu: L&amp;#234; Trung Nghĩa&lt;/p&gt;  &lt;p&gt;Theo: &lt;a href="http://www.informationweek.com/blog/main/archives/2008/10/microsoft_ooxml.html"&gt;http://www.informationweek.com/blog/main/archives/2008/10/microsoft_ooxml.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-8616557207022545116?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/8616557207022545116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/vi-odf-nhn-v-tng-lai-v-ooxml-nhn-vo-qu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/8616557207022545116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/8616557207022545116'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/vi-odf-nhn-v-tng-lai-v-ooxml-nhn-vo-qu.html' title='Với ODF nhìn về tương lai và OOXML nhìn vào quá khứ'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-6358538866944228850</id><published>2008-10-12T21:30:00.002+07:00</published><updated>2008-10-13T08:55:28.946+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Basic'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>ORM với Hibernate (step by step bài số 2).</title><content type='html'>&lt;p&gt;Hibernate, một opensource về ORM đ&amp;#227; được phổ biến rộng r&amp;#227;i trong cộng đồng java. B&amp;#224;i viết n&amp;#224;y được viết theo dạng tutorial, l&amp;#224; b&amp;#224;i viết cơ sở để tr&amp;#236;nh b&amp;#224;y tiếp những bước ph&amp;#225;t triển tiếp theo của c&amp;#225;c opensource ORM sau n&amp;#224;y như đưa ra những cấu h&amp;#236;nh mạnh mẽ hơn, viết m&amp;#227; tu&amp;#226;n theo chuẩn JPA, v&amp;#224; n&amp;#243;i về những bước ph&amp;#225;t triển tiếp theo của Hibernate m&amp;#224; c&amp;#243; thể LINQ l&amp;#224; c&amp;#225;i m&amp;#224; Hibernate phải học hỏi.&lt;/p&gt;  &lt;p&gt;B&amp;#226;y giờ ch&amp;#250;ng ta đi v&amp;#224;o kiến tr&amp;#250;c của Hibernate&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Kiến tr&amp;#250;c của Hibernate:&lt;/h2&gt;  &lt;br /&gt;  &lt;p&gt;Trong b&amp;#224;i n&amp;#224;y ch&amp;#250;ng ta sẽ t&amp;#236;m hiểu về kiến tr&amp;#250;c của hibernate. Biểu đồ sau đ&amp;#226;y m&amp;#244; tả tổng thể về Hibernate:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/dangtritue/SPIKE6e3N1I/AAAAAAAAAKo/8LHdPIaszAI/image%5B28%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="417" alt="image" src="http://lh4.ggpht.com/dangtritue/SPIKF_PqkwI/AAAAAAAAAKs/lGlYzg8vH7I/image_thumb%5B27%5D.png" width="417" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;Theo biểu đồ tr&amp;#234;n ta thấy Hibernate đ&amp;#227; sử dụng database v&amp;#224; c&amp;#225;c file cấu h&amp;#236;nh (.properties hay XML) để cung cấp một dịch vụ persistence cho ứng dụng của ch&amp;#250;ng ta.     &lt;br /&gt;&lt;font size="4"&gt;Kiến tr&amp;#250;c của Hibernate bao gồm 3 phần:&lt;/font&gt;&lt;/p&gt; &lt;font size="4"&gt;&lt;/font&gt;  &lt;ul&gt;   &lt;li&gt;Quản l&amp;#253; kết nối: Dịch vụ quản l&amp;#253; kết nối của Hibernate cung cấp việc quản l&amp;#253; hết sức hiệu quả c&amp;#225;c connection đến database. Database connection lu&amp;#244;n l&amp;#224; phần đắt đỏ v&amp;#224; nhiều rủi ro trong việc kiểm so&amp;#225;t, ch&amp;#250;ng ta tốn nhiều t&amp;#224;i nguy&amp;#234;n để mở v&amp;#224; đ&amp;#243;ng một connection, hơn nữa, việc xử l&amp;#253; dữ liệu phức tạp v&amp;#224; c&amp;#243; thể dẫn đến&amp;#8230;&amp;#8230;.qu&amp;#234;n s&amp;#243;t việc đ&amp;#243;ng kết nối hoặc đ&amp;#243;ng một c&amp;#225;ch kh&amp;#244;ng hợp l&amp;#253;. Điều n&amp;#224;y ho&amp;#224;n to&amp;#224;n kh&amp;#244;ng đơn giản v&amp;#224; dẫn đến một ứng dụng đổ vỡ. (&lt;em&gt;Một v&amp;#237; dụ l&amp;#224; đ&amp;#243;ng nhiều kết nối trong 1 khối try...catch&lt;/em&gt;) &lt;/li&gt;    &lt;li&gt;Quản l&amp;#253; transation (giao t&amp;#225;c):dịch vụ quản l&amp;#253; giao t&amp;#225;c cung cấp khả năng cho ph&amp;#233;p user thi h&amp;#224;nh nhiều ph&amp;#225;t biểu (statement) v&amp;#224;o một thời điểm. &lt;/li&gt;    &lt;li&gt;Object relational mapping:      &lt;br /&gt;C&amp;#244;ng nghệ mapping dữ liệu dưới database th&amp;#224;nh dữ liệu tr&amp;#234;n object. Hibernate sẽ sử dụng SELECT, INSERT, UPDATE v&amp;#224; DELETE tr&amp;#234;n c&amp;#225;c records v&amp;#224; đưa thao t&amp;#225;c dứoi database tương ứng với việc thao t&amp;#225;c t&amp;#234;n Object java. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mục đ&amp;#237;ch sau c&amp;#249;ng của hibernate đ&amp;#243; l&amp;#224; ORM, nhưng n&amp;#243; phải th&amp;#234;m v&amp;#224;o c&amp;#225;c dịch vụ quản l&amp;#253; Connnection v&amp;#224; Transaction v&amp;#236; ph&amp;#225;t sinh từ vấn đề performance v&amp;#224; sự kh&amp;#243; khăn khi tự m&amp;#236;nh xử l&amp;#253; những dịch vụ n&amp;#224;y tr&amp;#234;n Object được persistent. Hibernate buộc phải sử dụng những c&amp;#244;ng cụ quản l&amp;#253; kết nối v&amp;#224; transation của b&amp;#234;n thứ 3 để ho&amp;#224;n thiện m&amp;#244; h&amp;#236;nh của m&amp;#236;nh. Một v&amp;#237; dụ l&amp;#224; Apache DBCP thường được sử dụng trong connection pooling với Hibernate. &lt;/p&gt;  &lt;p&gt;Hibernate rất uyển chuyển, n&amp;#243; c&amp;#243; thể t&amp;#237;ch hợp với những c&amp;#244;ng nghệ kh&amp;#225;c để nhận đươc sự hỗ trợ tốt nhất, ti&amp;#234;u biểu c&amp;#243; Spring. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Bắt đầu với Hibernate:&lt;/h2&gt;  &lt;p&gt;   &lt;br /&gt;Trong phần n&amp;#224;y t&amp;#244;i sẽ tr&amp;#236;nh b&amp;#224;y cho bạn c&amp;#225;ch tạo một chương tr&amp;#236;nh đơn giản để insert một d&amp;#242;ng dữ liệu v&amp;#224;o MySQL. Bạn cũng c&amp;#243; thể chạy chương tr&amp;#236;nh n&amp;#224;y bằng commandline. Tuy nhi&amp;#234;n t&amp;#244;i sẽ d&amp;#249;ng MySQL v&amp;#224; eclipse cho demo n&amp;#224;y.     &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Cấu h&amp;#236;nh Hibernate:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;   &lt;br /&gt;Trước ti&amp;#234;n ta đi v&amp;#224;o cấu h&amp;#236;nh cho Hibernate, trong ứng dụng demo n&amp;#224;y, ch&amp;#250;ng ta sẽ sử dụng connection pooling v&amp;#224; transaction management. Trước ti&amp;#234;n, ch&amp;#250;ng ta đi v&amp;#224;o file hibernate.cfg.xml, đ&amp;#226;y l&amp;#224; file cấu h&amp;#236;nh chung nhất cho hệ thống sử dụng Hibernate, n&amp;#243; c&amp;#224;i đặt những cấu h&amp;#236;nh m&amp;#224; Hibernate sẽ hoạt động. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;&lt;p&gt;&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt; 
&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-configuration PUBLIC 
&lt;br /&gt;&amp;quot;-//Hibernate/Hibernate Configuration DTD//EN&amp;quot; 
&lt;br /&gt;&amp;quot;&lt;a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" ?="?"&gt;http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd&amp;quot;&lt;/a&gt;&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;hibernate-configuration&amp;gt; 
&lt;br /&gt;&amp;lt;session-factory&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.connection.driver_class&amp;quot;&amp;gt; &lt;/p&gt;&lt;p&gt;com.mysql.jdbc.Driver&amp;lt;/property&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.connection.url&amp;quot;&amp;gt; &lt;/p&gt;&lt;p&gt;jdbc:mysql://localhost/hibernatetutorial&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.connection.username&amp;quot;&amp;gt;root&amp;lt;/property&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.connection.password&amp;quot;&amp;gt;root&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.connection.pool_size&amp;quot;&amp;gt;10&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;dialect&amp;quot;&amp;gt;org.hibernate.dialect.MySQLDialect&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;hibernate.hbm2ddl.auto&amp;quot;&amp;gt;update&amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Mapping files --&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;mapping resource=&amp;quot;contact.hbm.xml&amp;quot;/&amp;gt; 
&lt;br /&gt;&amp;lt;/session-factory&amp;gt; 
&lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;V&amp;#224; để tr&amp;#225;nh mọi bối rối khi bạn mới l&amp;#224;m quen với Hibernate, tutorial n&amp;#224;y sẽ tr&amp;#236;nh b&amp;#224;y đầy đủ c&amp;#225;c bước tối thiểu v&amp;#224; đảm bảo chương tr&amp;#236;nh của sẽ chạy, k&amp;#232;m một điều kiện l&amp;#224; bạn nh&amp;#236;n v&amp;#224;o cấu h&amp;#236;nh ph&amp;#237;a tr&amp;#234;n, t&amp;#244;i đ&amp;#227; tạo một kết nối đến database với &lt;strong&gt;&lt;em&gt;username&lt;/em&gt;&lt;/strong&gt; v&amp;#224; &lt;strong&gt;&lt;em&gt;password&lt;/em&gt;&lt;/strong&gt; được cung cấp. Bạn h&amp;#227;y chỉnh lại username v&amp;#224; password cho đ&amp;#250;ng với hệ thống mysql của bạn, v&amp;#224; một điều nữa đ&amp;#243; l&amp;#224; h&amp;#227;y tạo một database t&amp;#234;n l&amp;#224; &lt;strong&gt;&lt;em&gt;hibernatetutorial&lt;/em&gt;&lt;/strong&gt; . &lt;/p&gt;

&lt;p&gt;Một số chi tiết trong file &lt;strong&gt;hibernate.cfg.xml&lt;/strong&gt; như sau: 

  &lt;br /&gt;Server l&amp;#224; localhost với database name l&amp;#224; hibernatetutorial, sử dụng jdbc:mysql://localhost/hibernatetutorial. 

  &lt;br /&gt;username=root 

  &lt;br /&gt;password=root 

  &lt;br /&gt;connection pooling =10. 

  &lt;br /&gt;show_sql=true chỉ thị khi hệ thống hibernate chạy sẽ show ra những c&amp;#226;u truy vấn m&amp;#224; thực tế hibernate sẽ y&amp;#234;u cầu database thực thi, chỉ thị n&amp;#224;y sử dụng để debug chương tr&amp;#236;nh, n&amp;#243; n&amp;#234;n bị tắt đi khi đ&amp;#243;ng g&amp;#243;i triển khai cho kh&amp;#225;ch h&amp;#224;ng. &lt;/p&gt;

&lt;p&gt;Mapping với c&amp;#225;c Object v&amp;#224; Table th&amp;#244;ng qua file contact.hbm.xml(chỉ thị mapping resource) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Viết Class Persistent:&lt;/strong&gt; 

  &lt;br /&gt;Hibernate sử dụng POJOs để map Database v&amp;#224; Object ch&amp;#250;ng ta sẽ cấu h&amp;#236;nh c&amp;#225;c biến để map v&amp;#224;o c&amp;#225;c cột tương ứng trong database. H&amp;#227;y xem đoạn m&amp;#227; sau: &lt;/p&gt;

&lt;p&gt;POJO persistence &lt;/p&gt;

&lt;p&gt;Ch&amp;#250;ng ta đ&amp;#227; c&amp;#243; Object bằng Java, kế tiếp ch&amp;#250;ng ta sẽ map n&amp;#243; v&amp;#224;o database như sau, sử dụng file contact.hbm.xml &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; 
&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-mapping PUBLIC 
&lt;br /&gt;&amp;quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&amp;quot; 
 &lt;br /&gt;&amp;quot;&lt;a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ?="?"&gt;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&amp;quot;&lt;/a&gt;&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;hibernate-mapping&amp;gt; 
  &lt;br /&gt;&amp;#160; &amp;lt;class name=&amp;quot;com.tutorial.hibernate.Contact&amp;quot; table=&amp;quot;CONTACT&amp;quot;&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;id name=&amp;quot;id&amp;quot; type=&amp;quot;long&amp;quot; column=&amp;quot;ID&amp;quot; &amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;generator class=&amp;quot;assigned&amp;quot;/&amp;gt; 
&lt;br /&gt;&amp;#160; &amp;lt;/id&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160; &amp;lt;property name=&amp;quot;firstName&amp;quot;&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;column name=&amp;quot;FIRSTNAME&amp;quot; /&amp;gt; 
&lt;br /&gt;&amp;#160; &amp;lt;/property&amp;gt; 
 &lt;br /&gt;&amp;#160; &amp;lt;property name=&amp;quot;lastName&amp;quot;&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;column name=&amp;quot;LASTNAME&amp;quot;/&amp;gt; 
&lt;br /&gt;&amp;#160; &amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;#160; &amp;lt;property name=&amp;quot;email&amp;quot;&amp;gt; 
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;column name=&amp;quot;EMAIL&amp;quot;/&amp;gt; 
&lt;br /&gt;&amp;#160; &amp;lt;/property&amp;gt; 
&lt;br /&gt;&amp;lt;/class&amp;gt; 

&amp;lt;/hibernate-mapping&amp;gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Thế l&amp;#224; xong, lu&amp;#244;n lu&amp;#244;n ch&amp;#250;ng ta cần 2 file, một file java l&amp;#224; POJO- class java, một file hbm.xml để map n&amp;#243; v&amp;#224;o database. Như ch&amp;#250;ng ta đ&amp;#227; thấy ở tr&amp;#234;n, một cột trong database sẽ tương ứng một biến trong POJO. &lt;/p&gt;

&lt;p&gt;H&amp;#227;y kiểm tra lại file hibernate.cfg.xml một lần nữa để xem cấu h&amp;#236;nh kết nối đến database đ&amp;#227; đ&amp;#250;ng chưa, chủ yếu l&amp;#224; h&amp;#227;y quan t&amp;#226;m đến username v&amp;#224; password. Kế tiếp ch&amp;#250;ng ta sẽ tạo một h&amp;#224;m main để chạy demo cho chương tr&amp;#236;nh. &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;package com.tutorial.hibernate; &lt;/p&gt;&lt;p&gt;import org.hibernate.Session;
&lt;br /&gt;import org.hibernate.SessionFactory;
&lt;br /&gt;import org.hibernate.Transaction;
&lt;br /&gt;import org.hibernate.cfg.Configuration; &lt;/p&gt;&lt;p&gt;public class FirstExample {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static void main(String[] args) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Session session = null;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Transaction tx=null; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // This step will read hibernate.cfg.xml and prepare hibernate for
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // use
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SessionFactory sessionFactory = new Configuration().configure()
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .buildSessionFactory();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session = sessionFactory.openSession();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tx=session.beginTransaction();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Create new instance of Contact and set values in it by reading
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // them from form object
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;Inserting Record&amp;quot;);

&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Contact contact = new Contact();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contact.setId(6);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contact.setFirstName(&amp;quot;Deepak&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contact.setLastName(&amp;quot;Kumar&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contact.setEmail(&amp;quot;deepak_38@yahoo.com&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.save(contact);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tx.commit();
 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;Done&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (Exception e) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(e.getMessage());
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } finally {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Actual contact insertion will happen at this step
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.flush();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.close(); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }
&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;H&amp;#227;y chạy chương tr&amp;#236;nh v&amp;#224; v&amp;#224;o database kiểm tra, nếu c&amp;#225;c Table được tạo, v&amp;#224; một d&amp;#242;ng dữ liệu được insert v&amp;#224;o bảng contact, bạn đ&amp;#227; th&amp;#224;nh c&amp;#244;ng. &lt;/p&gt;

&lt;p&gt;Bạn download demo tại đ&amp;#226;y : &lt;a href="http://upload.knightage.net/download.php?file=7ccacb1a4ee961490fbe9f66b77f6919"&gt;Hibernate tutorial b&amp;#224;i 2&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;(http://upload.knightage.net/download.php?file=7ccacb1a4ee961490fbe9f66b77f6919)&lt;/p&gt;

&lt;p&gt;Ngo&amp;#224;i demo đơn giản t&amp;#244;i giới thiệu ở tr&amp;#234;n n&amp;#243; c&amp;#242;n cung cấp đầy đủ những truy vấn th&amp;#244;ng thường bao gồm:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Demo về generator &lt;/li&gt;

  &lt;li&gt;Hibernate với truy vấn UPDATE. &lt;/li&gt;

  &lt;li&gt;Hibernate với truy vấn DELETE. &lt;/li&gt;

  &lt;li&gt;Hibernate với truy vấn SELECT. &lt;/li&gt;

  &lt;li&gt;Hibernate với truy vấn COUNT. &lt;/li&gt;

  &lt;li&gt;Hibernate với truy vấn AVG(). &lt;/li&gt;

  &lt;li&gt;MAX &lt;/li&gt;

  &lt;li&gt;MIN &lt;/li&gt;

  &lt;li&gt;WHERE &lt;/li&gt;

  &lt;li&gt;GROUP BY &lt;/li&gt;

  &lt;li&gt;ORDER. &lt;/li&gt;

  &lt;li&gt;CRITERIA: bằng, nhỏ hơn, lớn hơn, and, or. &lt;/li&gt;

  &lt;li&gt;V&amp;#224; một số demo kh&amp;#225;c.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mỗi demo được t&amp;#225;ch biệt ra từng file ri&amp;#234;ng lẻ n&amp;#234;n rất dễ theo d&amp;#245;i.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Hibernate thật l&amp;#224;&amp;#160; đơn giản.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
(Tham khảo b&amp;#224;i viết v&amp;#224; demo tr&amp;#234;n&amp;#160; roseindia.net)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-6358538866944228850?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/6358538866944228850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/orm-vi-hibernate-step-by-step-bi-s-2.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6358538866944228850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/6358538866944228850'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/orm-vi-hibernate-step-by-step-bi-s-2.html' title='ORM với Hibernate (step by step bài số 2).'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/dangtritue/SPIKF_PqkwI/AAAAAAAAAKs/lGlYzg8vH7I/s72-c/image_thumb%5B27%5D.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-2146358818937377817</id><published>2008-10-12T15:48:00.001+07:00</published><updated>2008-10-12T15:52:33.841+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS'/><title type='text'>Tương lai của hệ điều hành – Ubuntu hay Windows?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img title="Ubuntu hay Windows_H1.jpg" height="90" alt="Ubuntu hay Windows_H1.jpg" src="http://www.dientuvietnam.vn/images/stories/ITLab_Tuvan/HDH%20tuong%20lai_Ubuntu%20hay%20Windows/Ubuntu%20hay%20Windows_H1.jpg" width="200" align="left" /&gt;Tr&amp;#234;n tạp ch&amp;#237; AjaxWorld, Paul Nowak ph&amp;#225;t biểu: &amp;quot;Sau khi d&amp;#249;ng Ubuntu, t&amp;#244;i nhận thấy rằng Windows đang trở n&amp;#234;n tồi tệ, cũ kĩ v&amp;#224; kh&amp;#244;ng được th&amp;#226;n thiện...&amp;quot;. C&amp;#242;n anh bạn của t&amp;#244;i th&amp;#236; từ t&amp;#226;m l&amp;#253; lưỡng lự khi c&amp;#224;i đặt Ubuntu nay đ&amp;#227; quyết định chỉ d&amp;#224;nh chỗ trống tr&amp;#234;n ổ cứng cho anh ch&amp;#224;ng Ubuntu &amp;quot;năng động, trẻ trung&amp;quot;. Ubuntu c&amp;#243; g&amp;#236; kh&amp;#225;c biệt? Liệu c&amp;#243; sự ganh đua mới sẽ xảy ra như đ&amp;#227; từng xảy ra với Linux? Ch&amp;#250;ng ta sẽ v&amp;#233;n m&amp;#224;n b&amp;#237; mật l&amp;#253; do người d&amp;#249;ng đang c&amp;#243; xu thế chuyển đổi sang d&amp;#249;ng Ubuntu trong b&amp;#224;i viết n&amp;#224;y. &lt;/p&gt;  &lt;p&gt;Trước khi đề cập tới b&amp;#224;i viết, ch&amp;#250;ng t&amp;#244;i xin đưa ra phương ph&amp;#225;p v&amp;#224; ti&amp;#234;u ch&amp;#237; đ&amp;#225;nh gi&amp;#225;, so s&amp;#225;nh như sau:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sản phẩm thử nghiệm&lt;/strong&gt;: Windows Vista v&amp;#224; Ubuntu 8.04 LTS.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Cấu h&amp;#236;nh thử nghiệm&lt;/strong&gt;: Cả hai hệ điều h&amp;#224;nh đều được c&amp;#224;i tr&amp;#234;n laptop HP Presario V3739AU (AMD Turion 64x2 TL60 2.0Ghz, 1GB RAM, VGA NVIDIA Geforce GO 7150 256MB) v&amp;#224; hai m&amp;#225;y PC với cấu h&amp;#236;nh:&lt;/p&gt;  &lt;p&gt;&amp;#8226; CPU: Intel Celeron 2.26GHz, 512 MB RAM, VGA onboard 96 MB Intel 82865G Graphic.   &lt;br /&gt;&amp;#8226; CPU: Intel Core 2 Duo 6600 2.4GHz, 3.5 GB RAM v&amp;#224; card m&amp;#224;n h&amp;#236;nh NVIDIA GeForce 9800 GTX 512MB.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;C&amp;#225;c ti&amp;#234;u ch&amp;#237; so s&amp;#225;nh, đ&amp;#225;nh gi&amp;#225;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;1. Chi ph&amp;#237; sở hữu.   &lt;br /&gt;2. Y&amp;#234;u cầu phần cứng.    &lt;br /&gt;3. T&amp;#237;nh dễ c&amp;#224;i đặt.    &lt;br /&gt;4. Hỗ trợ phần cứng.    &lt;br /&gt;5. Hỗ trợ phần mềm ứng dụng.    &lt;br /&gt;6. Giao diện sử dụng.    &lt;br /&gt;7. Bảo mật.&lt;/p&gt;  &lt;p&gt;Sau đ&amp;#226;y ch&amp;#250;ng ta sẽ lần lượt kh&amp;#225;m ph&amp;#225; sự kh&amp;#225;c biệt giữa 2 hệ điều h&amp;#224;nh dựa tr&amp;#234;n c&amp;#225;c ti&amp;#234;u ch&amp;#237; kể tr&amp;#234;n.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;1. Chi ph&amp;#237; sở hữu: Người Việt Nam x&amp;#224;i &amp;quot;free&amp;quot; l&amp;#224; &amp;quot;the best&amp;quot;&lt;/font&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;X&amp;#233;t về điều kiện kinh tế hiện nay đối với đại đa số người sử dụng m&amp;#225;y t&amp;#237;nh tại Việt Nam th&amp;#236; việc bỏ tiền để mua phần mềm m&amp;#225;y t&amp;#237;nh phục vụ cho nhu cầu c&amp;#225; nh&amp;#226;n l&amp;#224; rất kh&amp;#243; khăn. Với c&amp;#225;c doanh nghiệp,việc trang bị phần mềm hợp ph&amp;#225;p l&amp;#224; điều n&amp;#234;n l&amp;#224;m v&amp;#236; bản th&amp;#226;n c&amp;#225;c phần mềm đ&amp;#243; ch&amp;#237;nh l&amp;#224; c&amp;#244;ng cụ tạo ra lợi nhuận cho doanh nghiệp. Nhưng với những người sử dụng thu nhập chưa cao m&amp;#224; phải chi một khoản tiền kh&amp;#225; lớn, thậm ch&amp;#237; c&amp;#242;n lớn hơn gi&amp;#225; phần cứng m&amp;#224; chỉ để học tập v&amp;#224; giải tr&amp;#237; th&amp;#236; kh&amp;#244;ng phải ai cũng c&amp;#243; khả năng. Vậy đ&amp;#226;u l&amp;#224; giải ph&amp;#225;p ph&amp;#249; hợp để người c&amp;#243; thu nhập thấp như người d&amp;#226;n Việt Nam tiếp cận c&amp;#244;ng cụ t&amp;#226;n tiến n&amp;#224;y?. Đ&amp;#227; c&amp;#243; những xu hướng chuyển sang Linux hay Ubuntu v&amp;#236; được cung cấp v&amp;#224; hỗ trợ ho&amp;#224;n to&amp;#224;n miễn ph&amp;#237;. V&amp;#226;ng, đ&amp;#243; ch&amp;#237;nh l&amp;#224; giải ph&amp;#225;p duy nhất nếu bạn t&amp;#244;n trọng luật bản quyền. Bạn c&amp;#243; thể tải v&amp;#224; c&amp;#224;i đặt miễn ph&amp;#237; từ nh&amp;#224; cung cấp Canonical tại địa chỉ sau &lt;a href="http://www.ubuntu.com/getubuntu/download"&gt;http://www.ubuntu.com/getubuntu/download&lt;/a&gt;. X&amp;#233;t về ti&amp;#234;u ch&amp;#237; chi ph&amp;#237; sở hữu th&amp;#236; giống như người anh em Linux, Ubuntu tr&amp;#234;n điểm Windows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;2. Y&amp;#234;u cầu phần cứng m&amp;#225;y t&amp;#237;nh: Ubuntu thắng tuyệt đối.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Để c&amp;#243; thể c&amp;#224;i đặt v&amp;#224; chạy trơn tru Ubuntu với c&amp;#225;c hiệu ứng đồ họa v&amp;#224; ứng dụng kh&amp;#225;c, Ubuntu chỉ y&amp;#234;u cầu RAM l&amp;#224; 256 MB, 3GB dung lượng đĩa cứng v&amp;#224; card m&amp;#224;n h&amp;#236;nh t&amp;#237;ch hợp tr&amp;#234;n bo mạch chủ l&amp;#224; vừa đủ. Ubuntu c&amp;#243; thể chạy trực tiếp tr&amp;#234;n đĩa LiveCD - rất th&amp;#237;ch hợp cho những ai muốn x&amp;#224;i thử, l&amp;#224;m quen. Vista th&amp;#236; đưa ra ti&amp;#234;u chuẩn qu&amp;#225; cao: bộ xử l&amp;#253; 1GHz, RAM 1GB, ổ cứng &amp;#237;t nhất 15GB, bộ nhớ đồ họa tối thiểu l&amp;#224; 128MB để c&amp;#243; thể chạy tạm ổn Aero Glass - một t&amp;#237;nh năng hỗ trợ đồ hoạ mới của Vista. Như vậy Ubuntu lại &amp;quot;dẫn điểm&amp;quot; trong ti&amp;#234;u ch&amp;#237; n&amp;#224;y. Tất nhi&amp;#234;n, những g&amp;#236; Vista y&amp;#234;u cầu cũng xứng đ&amp;#225;ng với những g&amp;#236; bạn nhận được sau khi c&amp;#224;i đặt. Tuy nhi&amp;#234;n, c&amp;#225;i ch&amp;#250;ng ta cần c&amp;#226;n nhắc l&amp;#224; muốn đẹp hơn, tiện hơn th&amp;#236; phải tốn nhiều tiền. Nếu bạn &amp;quot;rủng rỉnh&amp;quot; th&amp;#236; xin đừng đọc tiếp v&amp;#236; b&amp;#224;i n&amp;#224;y chỉ đề cập tới vấn đề tiết kiệm chi ph&amp;#237; phần mềm v&amp;#224; phần cứng m&amp;#224; kh&amp;#244;ng phải hy sinh hay mất đi qu&amp;#225; nhiều t&amp;#237;nh năng cơ bản của một hệ điều h&amp;#224;nh.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(255,0,0)"&gt;3. T&amp;#237;nh dễ c&amp;#224;i đặt: Vista l&amp;#224; chuẩn mực. Ubuntu rườm r&amp;#224;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Qu&amp;#225; tr&amp;#236;nh c&amp;#224;i đặt một c&amp;#225;ch tự động v&amp;#224; dễ d&amp;#224;ng l&amp;#224; ti&amp;#234;u ch&amp;#237; m&amp;#224; c&amp;#225;c phần mềm mong muốn đạt được, điều n&amp;#224;y Vista l&amp;#224;m kh&amp;#225; tốt. Với Ubuntu tổng thời gian c&amp;#224;i đặt diễn ra nhanh hơn so với Windows Vista nhưng lại phải trải qua qu&amp;#225; nhiều bước thiết lập trước khi c&amp;#224;i đặt v&amp;#224; g&amp;#226;y kh&amp;#243; khăn cho người sử dụng chưa th&amp;#224;nh thạo m&amp;#225;y t&amp;#237;nh. Do vậy, về ti&amp;#234;u ch&amp;#237; n&amp;#224;y, Vista vượt tr&amp;#234;n Ubuntu.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;div class="img_caption null" style="width: 500px"&gt;&lt;a href="http://lh3.ggpht.com/dangtritue/SPG5d3l-MJI/AAAAAAAAAJ0/nr4E-NKcwGA/image%5B6%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="image" src="http://lh5.ggpht.com/dangtritue/SPG5gDLn4JI/AAAAAAAAAJ4/LDBgXxQoJTQ/image_thumb%5B2%5D.png" width="595" border="0" /&gt;&lt;/a&gt;     &lt;p&gt;Ph&amp;#226;n v&amp;#249;ng ổ đĩa c&amp;#224;i đặt Windows Vista&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/dangtritue/SPG5g12d1XI/AAAAAAAAAJ8/c7rgQmWoTQk/image%5B10%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="360" alt="image" src="http://lh6.ggpht.com/dangtritue/SPG5iBqgTnI/AAAAAAAAAKA/nxsoGBZSzVA/image_thumb%5B4%5D.png" width="521" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;div class="img_caption null" style="width: 500px"&gt;&amp;#160; &lt;p&gt;Ph&amp;#226;n v&amp;#249;ng ổ đĩa c&amp;#224;i đặt Ubuntu&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(255,0,0)"&gt;4. Hỗ trợ phần cứng: Windows vượt trội&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Về ti&amp;#234;u ch&amp;#237; n&amp;#224;y, Windows lấn lướt v&amp;#224; nhiều lợi thế hơn so với Ubuntu. Giống như Linux, 2 hệ điều h&amp;#224;nh n&amp;#224;y l&amp;#224; m&amp;#227; nguồn mở n&amp;#234;n c&amp;#225;c h&amp;#227;ng phần cứng sợ lộ c&amp;#244;ng nghệ qua tr&amp;#236;nh điều khiển n&amp;#234;n họ rất &amp;#237;t, hoặc kh&amp;#244;ng tiết lộ ra cho cộng đồng. Do đ&amp;#243;, cộng đồng người sử dụng Ubuntu v&amp;#224; Linux tự phải x&amp;#226;y dựng c&amp;#225;c tr&amp;#236;nh điều khiển thiết bị thay v&amp;#236; được hỗ trợ từ c&amp;#225;c h&amp;#227;ng sản xuất. B&amp;#249; lại, Ubuntu hỗ trợ rất tốt c&amp;#225;c thiết bị phần cứng tr&amp;#234;n hệ thống 64bit v&amp;#224; c&amp;#243; thể chạy tr&amp;#234;n PowerPC của Apple. Tuy vậy, x&amp;#233;t cho c&amp;#249;ng, Ubuntu thua Vista về ti&amp;#234;u ch&amp;#237; n&amp;#224;y.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(255,0,0)"&gt;5. Hỗ trợ phần mềm ứng dụng: Vista - Nhiều nhưng phải trả tiền. Ubuntu - Nhiều, miễn ph&amp;#237; nhưng chưa tốt&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Phần mềm ứng dụng chạy tr&amp;#234;n nền Ubuntu cũng kh&amp;#225; phong ph&amp;#250; v&amp;#224; đ&amp;#225;p ứng đầy đủ nhu cầu người d&amp;#249;ng th&amp;#244;ng thường như Office, Multimedia, Internet, Graphics. Tuy nhi&amp;#234;n, do c&amp;#225;c ứng dụng n&amp;#224;y mới ph&amp;#225;t triển n&amp;#234;n chưa được th&amp;#226;n thiện v&amp;#224; kh&amp;#243; d&amp;#249;ng. C&amp;#225;c bảng dưới đ&amp;#226;y sẽ cho thấy rằng, khả năng đ&amp;#225;p ứng c&amp;#225;c phần mềm theo mục đ&amp;#237;ch sử dụng của Ubuntu kh&amp;#244;ng hề thua k&amp;#233;m Windows v&amp;#224; c&amp;#243; nhiều lựa chọn kh&amp;#225;c để người d&amp;#249;ng lựa chọn.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh3.ggpht.com/dangtritue/SPG5jUdEU9I/AAAAAAAAAKE/3TeBpj_G0Lo/image%5B14%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="394" alt="image" src="http://lh6.ggpht.com/dangtritue/SPG5k7cN91I/AAAAAAAAAKI/cL189IlZ8-k/image_thumb%5B6%5D.png" width="526" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p style="text-align: justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Bảng 1: So s&amp;#225;nh lựa chọn phần mềm văn ph&amp;#242;ng tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bảng t&amp;#237;nh &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Excel &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;OpenOffice.org              &lt;br /&gt;Calc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;KSpread, Gnumeric &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Soạn thảo văn              &lt;br /&gt;bản &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Word &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;OpenOffice.org              &lt;br /&gt;Writer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;KWord, Abiword, LaTeX &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Tr&amp;#236;nh chiếu &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS PowerPoint &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;OpenOffice.org              &lt;br /&gt;Impress &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;KPresenter, LaTeX+Beamer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 38.25pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lịch l&amp;#224;m việc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.25pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Outlook &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.25pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Evolution &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.25pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Mozilla SunBird, c&amp;#244;ng cụ mở              &lt;br /&gt;rộng (extension) Lightning cho               &lt;br /&gt;Mozilla Thunderbird &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Kế to&amp;#225;n &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;EBP, CIEL &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;N/A&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Gnucash, OpenSI, Phpcompta &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 43.65pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.65pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xuất bản điện              &lt;br /&gt;tử &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.65pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Adobe InDesign,              &lt;br /&gt;Quark Xpress,               &lt;br /&gt;MS Publisher &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.65pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;OpenOffice.org              &lt;br /&gt;Draw &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.65pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Scribus &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; cơ sở              &lt;br /&gt;dữ liệu &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Access &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;OpenOffice.org              &lt;br /&gt;Base &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Kexi &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.55in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.55in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; t&amp;#224;i              &lt;br /&gt;ch&amp;#237;nh c&amp;#225; nh&amp;#226;n &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.55in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Microsoft Money &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.55in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;N/A&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.55in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Grisbi, Gnucash, Kurush,              &lt;br /&gt;Myphpmoney, KMyMoney,               &lt;br /&gt;Money Manager EX &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Đọc tập tin              &lt;br /&gt;dạng PDF &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Adobe Reader &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Evince &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ghostview, Gpdf, Xpdf, Adobe              &lt;br /&gt;Reader (*2) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;Bảng 2: So s&amp;#225;nh lựa chọn phần mềm Internet tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoTableGrid" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 13pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 13pt; background-color: transparent" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 13pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 13pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 13pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 26.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Chat (qua IRC) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;mIRC, Trillian &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Pidgin &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;XChat, Chatzilla (extension              &lt;br /&gt;Firefox), Irssi, KVIrc, emesene &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 44.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;FTP &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;MS Internet              &lt;br /&gt;Explorer,               &lt;br /&gt;FileZilla, FTP               &lt;br /&gt;Expert &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Nautilus &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;KFTPGrabber, gFTP,              &lt;br /&gt;IglooFTP,virgoFtp, NCFTP,               &lt;br /&gt;Filezilla, FireFTP (extension               &lt;br /&gt;Firefox) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 26.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Thư điện tử (&lt;em&gt;e                &lt;br /&gt;mail&lt;/em&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;MS Outlook,              &lt;br /&gt;Outlook Express &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Evolution &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Mozilla Thunderbird, Sylpheed,              &lt;br /&gt;Claws Mail &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 53.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Trao đổi tệp              &lt;br /&gt;(P2P) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Kazaa, Emule,              &lt;br /&gt;soulseek &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Gnome-Bittorrent &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Transmission, Kmldonkey,              &lt;br /&gt;Apollon, eMule, aMule, GTK-               &lt;br /&gt;Gnutella, Limewire, mldonkey,               &lt;br /&gt;Frostwire, Nicotine Plus, Deluge,               &lt;br /&gt;Azureus &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Quản l&amp;#253; c&amp;#244;ng              &lt;br /&gt;việc tải xuống               &lt;br /&gt;tệp &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;GetRight,              &lt;br /&gt;Download               &lt;br /&gt;Accelerator &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;wget &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Gwget, KGet, d4x, curl, aria &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 53.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Chat (.NET              &lt;br /&gt;Messenger               &lt;br /&gt;Service) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Windows Live              &lt;br /&gt;(MSN)               &lt;br /&gt;Messenger,               &lt;br /&gt;Yahoo!               &lt;br /&gt;Messenger &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Pidgin &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;aMSN, Mercury, Emesene,              &lt;br /&gt;Monkey Messenger, KMess &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 26.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Chat (giao thức              &lt;br /&gt;Jabber) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Psi, Exodus,              &lt;br /&gt;Pidgin &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Pidgin &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Gossip, Psi, Gnome-Jabber,              &lt;br /&gt;Gajim &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 26.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Chat (giao thức              &lt;br /&gt;kh&amp;#225;c) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;ICQ, AIM, Yahoo!              &lt;br /&gt;Messenger &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Pidgin &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 26.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Tr&amp;#236;nh duyệt web &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Internet Explorer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Mozilla Firefox &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 26.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span lang="ES-MX" style="font-size: 8pt; color: black; font-family: verdana"&gt;Bộ Mozilla, Epiphany, Opera,              &lt;br /&gt;Galeon &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 53.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Điện thoại IP &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Windows Live              &lt;br /&gt;Messenger,               &lt;br /&gt;Skype,               &lt;br /&gt;GoogleTalk,               &lt;br /&gt;Gizmo &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Ekiga &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Twinkle, Wengophone, Kphone,              &lt;br /&gt;Skype (*), gizmo (*), GoSIP               &lt;br /&gt;(*), Jabbin, Linphone &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Họp qua mạng &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;MSN, Windows              &lt;br /&gt;Meeting Space,               &lt;br /&gt;Skype &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Ekiga &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; color: black; font-family: verdana"&gt;Linphone, Wengophone &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoTableGrid" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;Bảng 3: So s&amp;#225;nh lựa chọn phần mềm ph&amp;#225;t triển v&amp;#224; lập tr&amp;#236;nh tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 43.85pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xuất bản trang              &lt;br /&gt;web&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.85pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Frontpage,              &lt;br /&gt;Adobe               &lt;br /&gt;Dreamweaver,               &lt;br /&gt;Adobe GoLive &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.85pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Gedit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.85pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bluefish, Kompozer, Quanta+,              &lt;br /&gt;Screem, Scite, Geany, Amaya &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 41.9pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;IDE C/C++ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Visual Studio,              &lt;br /&gt;Borland C &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gcc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;g++, KDevelop, Anjuta, Magic              &lt;br /&gt;C++, NetBeans c&amp;#249;ng với C/C++               &lt;br /&gt;Development Pack, Eclipse,               &lt;br /&gt;Code::Blocks, Geany, Borland &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;C&amp;#244;ng cụ x&amp;#225;c lập              &lt;br /&gt;m&amp;#225;y chủ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;EasyPHP,              &lt;br /&gt;WampServer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span lang="FR" style="font-size: 8pt; font-family: verdana"&gt;Serveur LAMP (Apache + PHP +              &lt;br /&gt;MySQL), XAMPP &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;Bảng 4: So s&amp;#225;nh lựa chọn phần mềm đồ họa tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 42.35pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 42.35pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xuất bản trang              &lt;br /&gt;web&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 42.35pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Frontpage,              &lt;br /&gt;Adobe               &lt;br /&gt;Dreamweaver,               &lt;br /&gt;Adobe GoLive &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 42.35pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Gedit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 42.35pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bluefish, Kompozer, Quanta+,              &lt;br /&gt;Screem, Scite, Geany, Amaya &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 45.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 45.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;IDE C/C++ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 45.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Visual Studio,              &lt;br /&gt;Borland C &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 45.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gcc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 45.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;g++, KDevelop, Anjuta, Magic              &lt;br /&gt;C++, NetBeans c&amp;#249;ng với C/C++               &lt;br /&gt;Development Pack, Eclipse,               &lt;br /&gt;Code::Blocks, Geany, Borland &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.6pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;C&amp;#244;ng cụ x&amp;#225;c lập              &lt;br /&gt;m&amp;#225;y chủ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;EasyPHP,              &lt;br /&gt;WampServer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span lang="FR" style="font-size: 8pt; font-family: verdana"&gt;Serveur LAMP (Apache + PHP +              &lt;br /&gt;MySQL), XAMPP &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 43.25pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xuất bản trang              &lt;br /&gt;web&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS Frontpage,              &lt;br /&gt;Adobe               &lt;br /&gt;Dreamweaver,               &lt;br /&gt;Adobe GoLive &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Gedit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bluefish, Kompozer, Quanta+,              &lt;br /&gt;Screem, Scite, Geany, Amaya &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 41.9pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;IDE C/C++ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Visual Studio,              &lt;br /&gt;Borland C &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gcc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;g++, KDevelop, Anjuta, Magic              &lt;br /&gt;C++, NetBeans c&amp;#249;ng với C/C++               &lt;br /&gt;Development Pack, Eclipse,               &lt;br /&gt;Code::Blocks, Geany, Borland &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;Bảng 5: So s&amp;#225;nh lựa chọn phần mềm Multimedia tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Chuyển c&amp;#225;c định              &lt;br /&gt;dạng &amp;#226;m thanh &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;SoundJuicer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xcfa, ConvertIt, Audacity &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 29.75pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 29.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Xử l&amp;#253; &amp;#226;m thanh &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 29.75pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;SoundForge,              &lt;br /&gt;Cool Edit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 29.75pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 29.75pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ardour, Rezound, Sweep, Sonik,              &lt;br /&gt;Wavesurfer, Audacity, Kwave,               &lt;br /&gt;Snd &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 44.6pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.6pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;M&amp;#227; ho&amp;#225;              &lt;br /&gt;audio/video &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.6pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;FairUseWizard,              &lt;br /&gt;Ri4m, m4ng,               &lt;br /&gt;MediaCoder &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.6pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 44.6pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;ffmpeg, Mencoder, DeVeDe,              &lt;br /&gt;dvd::rip, avidemux, OGMRip,               &lt;br /&gt;K9copy, k3b, Winki The Ripper,               &lt;br /&gt;Thoggen &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 36.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;M&amp;#227; ho&amp;#225; nhạc              &lt;br /&gt;(giải m&amp;#227; [&lt;em&gt;rip&lt;/em&gt;] v&amp;#224;               &lt;br /&gt;ghi) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Media              &lt;br /&gt;Player &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;SoundJuicer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Banshee, Grip, Xcfa,              &lt;br /&gt;soundKonverter, KAudioCreator &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Đọc đĩa CD &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Media              &lt;br /&gt;Player &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;SoundJuicer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;KsCD &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 41.9pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Chơi nhạc (k&amp;#232;m              &lt;br /&gt;theo bộ quản l&amp;#253;               &lt;br /&gt;b&amp;#224;i nhạc) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Media              &lt;br /&gt;Player &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Rhythmbox &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41.9pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;BMPx, Banshee, Listen,              &lt;br /&gt;QuodLibet, Exaile &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.6pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Chơi nhạc (cơ              &lt;br /&gt;bản) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Winamp, Zinf &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Totem (qua              &lt;br /&gt;gstreamer) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;XMMS, Audacious, Beep Media              &lt;br /&gt;Player, Zinf, RealPlayer, VLC,               &lt;br /&gt;Mplayer &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Chơi phim video &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Media              &lt;br /&gt;Player &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Totem (qua              &lt;br /&gt;gstreamer) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Totem-xine, Mplayer, VLC              &lt;br /&gt;(VideoLAN Client) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 43.25pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 77.4pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="103"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;PM dựng video &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 81pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="108"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Adobe Premiere,              &lt;br /&gt;Microsoft               &lt;br /&gt;Windows Movie               &lt;br /&gt;Maker &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&amp;#160;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 2in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 43.25pt; background-color: transparent" width="192"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Cinelerra, Kdenlive, Avidemux,              &lt;br /&gt;Kino, CinePaint, Lives, Jahshaka &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 5.2in; border-collapse: collapse" cellspacing="0" cellpadding="0" width="499" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;Bảng 6: So s&amp;#225;nh lựa chọn c&amp;#225;c loại phần mềm kh&amp;#225;c tr&amp;#234;n Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lựa chọn kh&amp;#225;c &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;M&amp;#225;y t&amp;#237;nh cầm              &lt;br /&gt;tay &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Calculator&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gcalctool &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Qalculate, SpeedCrunch, xcalc &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 31.1pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 31.1pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Tr&amp;#236;nh soạn văn              &lt;br /&gt;bản đơn giản &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 31.1pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows              &lt;br /&gt;Notepad &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 31.1pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gedit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 31.1pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Mousepad, XEdit, Leafpad,              &lt;br /&gt;Kedit &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;M&amp;#244;i trường đồ              &lt;br /&gt;họa &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;GNOME &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;XFCE &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 34.25pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 34.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; tệp n&amp;#233;n &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 34.25pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;WinZip, WinRAR,              &lt;br /&gt;WinACE, 7-zip &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 34.25pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;File-Roller &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 34.25pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;7-Zip, PeaZip, rar/unrar (*),              &lt;br /&gt;unace &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.6pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; cửa sổ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows,              &lt;br /&gt;Windows Aero &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Metacity,              &lt;br /&gt;Compiz-Fusion &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.6pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Blackbox, Openbox, Fluxbox,              &lt;br /&gt;Enlightment, Xfwm &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; ph&amp;#226;n              &lt;br /&gt;v&amp;#249;ng &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Partition Magic &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;fdisk &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;gParted &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 35.15pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.15pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; Cửa              &lt;br /&gt;sổ               &lt;br /&gt;X Window &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.15pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.15pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;GDM &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 35.15pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;XDM &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 38.75pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ghi đĩa CD &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.75pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Nero,              &lt;br /&gt;DeepBurner &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.75pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Nautilus,              &lt;br /&gt;Serpentine &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 38.75pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Brasero, GnomeBaker,              &lt;br /&gt;Graveman, Devede, NeroLinux               &lt;br /&gt;(PMTM) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 32.9pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 32.9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ghi đĩa DVD &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 32.9pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Nero,              &lt;br /&gt;DeepBurner &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 32.9pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Nautilus &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 32.9pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Brasero, GnomeBaker,              &lt;br /&gt;Devede,               &lt;br /&gt;ManDVD, NeroLinux (PMTM) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 40.1pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 40.1pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; v&amp;#224;              &lt;br /&gt;tạo               &lt;br /&gt;ra tệp h&amp;#236;nh ISO &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 40.1pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Alcohol 120%,              &lt;br /&gt;Daemon Tools &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 40.1pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;mount -t              &lt;br /&gt;iso9660 &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 40.1pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;GisoMount, Gmount-iso, Kiso,              &lt;br /&gt;AcetoneISO, FuseISO &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 41pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quản l&amp;#253; bản cập              &lt;br /&gt;nhật &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Update,              &lt;br /&gt;Microsoft               &lt;br /&gt;Update1) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Synaptic v&amp;#224;              &lt;br /&gt;Tr&amp;#236;nh quản l&amp;#253;               &lt;br /&gt;bản cập nhật &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 41pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;KPackage &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 53.6pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.6pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bức tường lửa              &lt;br /&gt;(firewall) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.6pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;ZoneAlarm &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.6pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;IPTables &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 53.6pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Shorewall, Guarddog,              &lt;br /&gt;Firestarter               &lt;br /&gt;(giao diện đồ hoạ cho               &lt;br /&gt;IPtables),               &lt;br /&gt;Kmyfirewall &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 36.5pt"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Phần mềm quản              &lt;br /&gt;l&amp;#253; đồ hoạ 3D &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Windows Aero              &lt;br /&gt;Glass&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;X.org/Aiglx &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 36.5pt; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;XFree86, Xgl &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Hệ vỏ (Shell) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;MS-DOS (Batch) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Dash &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bash, Csh, sh, zsh, etc ... &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.4in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 0.95in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="91"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Terminal &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 1in; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="96"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Lệnh MS-DOS &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 63pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Gnome-              &lt;br /&gt;Terminal &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: rgb(243,242,249); padding-bottom: 0in; width: 135pt; border-top-color: rgb(243,242,249); padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.4in; background-color: transparent" width="180"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;xterm, eterm, xterminal,              &lt;br /&gt;YaKuake, Tilda &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;(*) C&amp;#225;c phần mềm bản quyền c&amp;#243; ph&amp;#237;. Cột thứ Ubuntu liệt k&amp;#234; c&amp;#225;c phần mềm được c&amp;#224;i sẵn.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Để gia tăng khả năng c&amp;#224;i đặt c&amp;#225;c ứng dụng viết cho Windows nhưng c&amp;#243; thể chạy tr&amp;#234;n nền Ubuntu, g&amp;#243;i phần mềm Wine (Wine is not an emulator) - một phần mềm m&amp;#227; nguồn mở, sẽ cho ph&amp;#233;p bạn c&amp;#224;i đặt hầu hết c&amp;#225;c chương tr&amp;#236;nh phổ dụng cho Windows như MS Office, Photoshop, Yahoo Messenger, Haft Life, Counter Strike, Call of Duty 4,... tr&amp;#234;n nền Ubuntu v&amp;#224; Linux. Điều n&amp;#224;y l&amp;#224;m gia tăng đ&amp;#225;ng kể khả năng c&amp;#224;i đặt c&amp;#225;c tr&amp;#236;nh ứng dụng m&amp;#224; Ubuntu c&amp;#242;n thiếu. Như vậy, c&amp;#243; thể thấy, phần mềm ứng dụng chạy tr&amp;#234;n nền Windows Vista rất nhiều, nhưng tất cả phải trả tiền v&amp;#224; chất lượng th&amp;#236; &amp;quot;tiền n&amp;#224;o của ấy&amp;quot;. Đối với Ubuntu, cũng c&amp;#243; nhiều tr&amp;#236;nh ứng dụng đ&amp;#225;p ứng gần như đầy đủ c&amp;#225;c nhu cầu của bạn nhưng chất lượng chưa được kiểm chứng v&amp;#224; thiếu t&amp;#237;nh ổn định. Ở ti&amp;#234;u ch&amp;#237;, ch&amp;#250;ng t&amp;#244;i cho rằng nếu bạn l&amp;#224; người d&amp;#249;ng gia đ&amp;#236;nh th&amp;#236; Ubuntu c&amp;#243; vẻ th&amp;#234;m điểm nhưng với doanh nghiệp th&amp;#236; c&amp;#242;n phải đ&amp;#225;nh gi&amp;#225; kỹ t&amp;#237;nh ổn định của c&amp;#225;c ứng dụng. Ch&amp;#250;ng t&amp;#244;i cho điểm 1-1 cho hai hệ điều h&amp;#224;nh n&amp;#224;y.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;div class="img_caption null" style="width: 500px"&gt;&lt;a href="http://lh3.ggpht.com/dangtritue/SPG5mxuGQGI/AAAAAAAAAKM/dIvRmsNNHuU/image%5B18%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="445" alt="image" src="http://lh4.ggpht.com/dangtritue/SPG5p_5XzpI/AAAAAAAAAKQ/8PcrB8z7qvk/image_thumb%5B8%5D.png" width="603" border="0" /&gt;&lt;/a&gt;     &lt;p&gt;Sử dụng Adobe Photoshop tr&amp;#234;n Ubuntu kh&amp;#244;ng c&amp;#242;n l&amp;#224; điều kh&amp;#244;ng tưởng&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(255,0,0)"&gt;6. Giao diện sử dụng: Windows quen thuộc. Ubuntu cải tiến.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Bạn sẽ cho rằng Windows dễ d&amp;#249;ng hơn! Điều n&amp;#224;y l&amp;#224; đ&amp;#250;ng v&amp;#236; ch&amp;#250;ng ta đ&amp;#227; c&amp;#243; qu&amp;#225;n t&amp;#237;nh sử dụng Windows từ phi&amp;#234;n bản Windows 95 v&amp;#224; l&amp;#224; kh&amp;#244;ng đ&amp;#250;ng nếu ch&amp;#250;ng ta chịu kh&amp;#243;...học c&amp;#225;ch sử dụng Ubuntu. Trong thử nghiệm, với tr&amp;#236;nh độ &amp;quot;amauter&amp;quot;, giao diện với người sử dụng của Ubuntu kh&amp;#244;ng hề thua k&amp;#233;m Windows. Trong khi Windows chỉ c&amp;#243; duy nhất một kh&amp;#244;ng gian l&amp;#224;m việc (desktop) th&amp;#236; Ubuntu cho ph&amp;#233;p bạn d&amp;#249;ng nhiều desktop v&amp;#224; dễ d&amp;#224;ng di chuyển qua lại giữa c&amp;#225;c desktop n&amp;#224;y (Ubuntu gọi l&amp;#224; workspace), điều n&amp;#224;y gi&amp;#250;p bạn rất thoải m&amp;#225;i khi mở nhiều ứng dụng c&amp;#249;ng l&amp;#250;c.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Tr&amp;#234;n Ubuntu/Linux c&amp;#243; 2 tr&amp;#236;nh quản l&amp;#253; giao diện ch&amp;#237;nh l&amp;#224; GNOME v&amp;#224; KDE. Giao diện của bạn sẽ dễ d&amp;#224;ng chuyển đổi qua lại v&amp;#224; c&amp;#224;ng tuyệt vời hơn gấp bội nếu bạn nh&amp;#250;ng th&amp;#234;m Emerald Theme Manager của Compiz. Bạn c&amp;#243; thể t&amp;#236;m hiểu th&amp;#234;m về Compiz Fusion tại địa chỉ: &lt;a href="http://www.opencompositing.org"&gt;http://www.opencompositing.org&lt;/a&gt;. Nếu một lần nh&amp;#236;n thấy giao diện 3D v&amp;#224; c&amp;#225;c hiệu ứng uyển chuyển của Ubuntu, bạn sẽ kết luận rằng, Aero Glass chưa phải l&amp;#224; tuyệt vời nhất!&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh4.ggpht.com/dangtritue/SPG5rrWos3I/AAAAAAAAAKU/YxdtG-SNx04/image%5B22%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="397" alt="image" src="http://lh5.ggpht.com/dangtritue/SPG5uLMDxcI/AAAAAAAAAKY/Qb2Ojv-CRww/image_thumb%5B10%5D.png" width="521" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="img_caption null" style="width: 500px"&gt;&amp;#160; &lt;p&gt;Giao diện 3D Compiz với theme MAC OSX tr&amp;#234;n Ubuntu&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;div class="img_caption null" style="width: 500px"&gt;&lt;a href="http://lh6.ggpht.com/dangtritue/SPG5wOdkLdI/AAAAAAAAAKc/nuGl_M2lLHc/image%5B26%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="383" alt="image" src="http://lh4.ggpht.com/dangtritue/SPG5yprAfgI/AAAAAAAAAKk/Y3tiFEWfAXM/image_thumb%5B12%5D.png" width="596" border="0" /&gt;&lt;/a&gt;     &lt;p&gt;Flip 3D của Windows Vista chỉ ph&amp;#249; hợp tr&amp;#234;n phần cứng cao cấp&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Vậy kết quả v&amp;#242;ng n&amp;#224;y, nếu bạn l&amp;#224; người d&amp;#249;ng bận rộn th&amp;#236; Ubuntu th&amp;#234;m điểm v&amp;#224; nếu bạn &amp;#237;t d&amp;#249;ng nhiều ứng dụng c&amp;#249;ng l&amp;#250;c th&amp;#236; Windows vẫn rất dễ d&amp;#249;ng như l&amp;#250;c bạn &amp;quot;gặp n&amp;#243;&amp;quot; lần đầu. Điểm 1-1 cho 2 &amp;quot;đội&amp;quot;.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(255,0,0)"&gt;7. Bảo mật&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Windows Vista n&amp;#243;i ri&amp;#234;ng hay Windows n&amp;#243;i chung tất nhi&amp;#234;n l&amp;#224; bị d&amp;#242;m ng&amp;#243; nhiều hơn so với Ubuntu v&amp;#224; Linux v&amp;#224; điều n&amp;#224;y khiến n&amp;#243; kh&amp;#244;ng an to&amp;#224;n. Trong d&amp;#224;i hạn, nếu Ubuntu hay Linux phổ biến th&amp;#236; ch&amp;#250;ng ta cũng sẽ &amp;quot;l&amp;#227;nh đủ&amp;quot; tr&amp;#242; của giới hacker. Do vậy, x&amp;#233;t tại thời điểm hiện tại, Ubuntu vẫn ngo&amp;#224;i v&amp;#249;ng phủ s&amp;#243;ng của giới hacker.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;span style="color: rgb(0,0,255)"&gt;Kết quả chung cuộc&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Trong bối cảnh nước ta đang l&amp;#224; nước c&amp;#243; tỷ lệ vi phạm bản quyền cao, kết quả so s&amp;#225;nh, đ&amp;#225;nh gi&amp;#225; những n&amp;#233;t cơ bản của 2 hệ điều h&amp;#224;nh n&amp;#224;y sẽ gi&amp;#250;p người sử dụng c&amp;#243; th&amp;#234;m những th&amp;#244;ng tin để lựa chọn về hệ điều h&amp;#224;nh. qua 7 ti&amp;#234;u ch&amp;#237; cơ bản kể tr&amp;#234;n, tỉ số chung cuộc l&amp;#224; 4-5 nghi&amp;#234;ng về Ubuntu. Nhận định của ch&amp;#250;ng t&amp;#244;i l&amp;#224; nếu với những người d&amp;#249;ng gia đ&amp;#236;nh, c&amp;#243; hiểu biết kỹ thuật m&amp;#225;y t&amp;#237;nh nhất định v&amp;#224; t&amp;#244;n trọng luật bản quyền th&amp;#236; n&amp;#234;n sử dụng Ubuntu hay Linux m&amp;#224; kh&amp;#244;ng phải hy sinh qu&amp;#225; nhiều t&amp;#237;nh năng, thậm ch&amp;#237; c&amp;#243; 1 số t&amp;#237;nh năng c&amp;#242;n vượt trội Windows, để tiết kiệm chi ph&amp;#237;. Với m&amp;#244;i trường doanh nghiệp, nếu loại h&amp;#236;nh quản l&amp;#253; v&amp;#224; kinh doanh chỉ d&amp;#249;ng lại ở những như cầu ứng dụng văn bản, chia sẻ tập tin, thư t&amp;#237;n điện tử v&amp;#224; internet th&amp;#236; Ubuntu sẽ tiết kiệm rất nhiều ch&amp;#237; ph&amp;#237; cho doanh nghiệp m&amp;#224; hệ thống th&amp;#244;ng tin tin học vẫn đ&amp;#225;p ứng đầy đủ y&amp;#234;u cầu. Đối với m&amp;#244;i trường quản l&amp;#253;, t&amp;#225;c nghiệp trong loại h&amp;#236;nh sản xuất, thương mại, dịch vụ quy m&amp;#244; vừa v&amp;#224; lớn hay c&amp;#243; t&amp;#237;nh chuy&amp;#234;n ng&amp;#224;nh cao như thiết kế, kiến tr&amp;#250;c, phim ảnh th&amp;#236; Windows vẫn l&amp;#224; lựa chọn số một cả về ứng dụng lẫn phần cứng của h&amp;#227;ng thứ 3.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Diễn biến &amp;quot;trận đấu&amp;quot; giữa Windows v&amp;#224; c&amp;#225;c hệ điều h&amp;#224;nh m&amp;#227; nguồn mở sẽ c&amp;#242;n tiếp tục gay cấn, ch&amp;#250;ng ta h&amp;#227;y chờ đ&amp;#243;n Ubuntu sẽ ghi điểm ra sao v&amp;#224; liệu Microsoft c&amp;#243; những ch&amp;#237;nh s&amp;#225;ch g&amp;#236; để cải thiện c&amp;#225;c &amp;quot;nhược điểm&amp;quot; ch&amp;#237;nh l&amp;#224; gi&amp;#225; cả trong thời gian tới hay kh&amp;#244;ng.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Bảng tổng kết tỉ số c&amp;#225;c ti&amp;#234;u ch&amp;#237; so s&amp;#225;nh giữa Ubuntu v&amp;#224; Windows&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 257.4pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="343" border="1"&gt;&lt;tbody&gt;     &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="175" rowspan="rowspan"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;&lt;o:p&gt;&amp;#160;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 1.75in; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="168" colspan="2"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: center" align="center"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Kết quả&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span lang="VI" style="font-size: 8pt; font-family: verdana"&gt;Windows &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Ubuntu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Chi ph&amp;#237; sở hữu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Y&amp;#234;u cầu phần cứng&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Quy tr&amp;#236;nh c&amp;#224;i đặt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Hỗ trợ phần cứng&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Hỗ trợ phần mềm&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Giao diện sử dụng&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; background: rgb(255,255,204); padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Bảo mật&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height: 0.2in"&gt;       &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: windowtext 1pt solid; width: 131.4pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="175"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;Tổng kết&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: rgb(243,242,249); padding-left: 5.4pt; padding-bottom: 0in; border-left: rgb(243,242,249); width: 63pt; padding-top: 0in; border-bottom: windowtext 1pt solid; height: 0.2in; background-color: transparent" width="84"&gt;         &lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: verdana"&gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p style="text-align: justify"&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 257.4pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="343" border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;!-- JOM COMMENT START --&gt;(Theo &lt;a href="http://www.dientuvietnam.vn/index.php/cong-nghe-thong-tin/itlab-tu-van/13-itlab-tu-van/1413-tuong-lai-cua-he-dieu-hanh-ubuntu-hay-windows"&gt;Nguyễn Văn Đ&amp;#244;)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="clear: both; padding-right: 0px; padding-left: 0px; padding-bottom: 0px; padding-top: 0px; height: 1px"&gt;&lt;/div&gt; &lt;!-- Sharing toolbar --&gt;  &lt;div style="position: relative"&gt;   &lt;div class="commentBlogView commentTools" id="commentTools"&gt;     &lt;div class="jctools jcfav"&gt;&lt;font face="ar"&gt;&lt;em&gt;&lt;strong&gt;&amp;#221; kiến của LangThang:&lt;/strong&gt;&lt;/em&gt; &lt;/font&gt;&lt;/div&gt;      &lt;div class="jctools jcfav"&gt;&lt;font face="ar"&gt;Ở Việt Nam, tiếc l&amp;#224; mọi sự so s&amp;#225;nh vẫn c&amp;#242;n kh&amp;#225; v&amp;#244; nghĩa khi&amp;#160; gi&amp;#225; vista l&amp;#224; 20000 v&amp;#224; ubuntu cũng khoảng 10000 VNĐ, gi&amp;#225; của XP cũng l&amp;#224; gi&amp;#225; của Ubuntu, thiết nghĩ c&amp;#242;n rất l&amp;#226;u nữa để ubuntu được chấp nhận tại Việt Nam, n&amp;#243; c&amp;#243; sống được ở VN hay kh&amp;#244;ng c&amp;#242;n t&amp;#249;y thuộc v&amp;#224;o lộ tr&amp;#236;nh của luật bản quyền. D&amp;#249; sao, lựa chọn d&amp;#249;ng song song Vista v&amp;#224; Ubuntu l&amp;#224; một sự lựa chọn vừa kh&amp;#244;ng lỗi thời, vừa kh&amp;#244;ng lỗi nhịp.&lt;/font&gt;&lt;/div&gt;      &lt;div class="jctools jcemail"&gt;&lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-2146358818937377817?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/2146358818937377817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/tng-lai-ca-h-iu-hnh-ubuntu-hay-windows.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/2146358818937377817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/2146358818937377817'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/tng-lai-ca-h-iu-hnh-ubuntu-hay-windows.html' title='Tương lai của hệ điều hành – Ubuntu hay Windows?'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/dangtritue/SPG5gDLn4JI/AAAAAAAAAJ4/LDBgXxQoJTQ/s72-c/image_thumb%5B2%5D.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-4746624279979715267</id><published>2008-10-10T09:26:00.001+07:00</published><updated>2008-10-14T11:57:08.072+07:00</updated><title type='text'>Firefox 3.1 sẽ nhanh gấp 7 lần Firefox 3.0</title><content type='html'>&lt;p&gt;&lt;a href="http://vistavietnam.net/home/2008/08/firefox3-1-se-nhanh-gap-7-lan-firefox3.html#respond"&gt;&lt;/a&gt;&amp;nbsp; &lt;p&gt;&lt;img title="ff31" height="185" alt="" src="http://vistavietnam.net/home/wp-content/uploads/2008/08/ff31.jpg" width="500"&gt;  &lt;p&gt;Theo như Mike Schroepfer, phó chủ tịch kỹ thuật của Mozilla, thì bản nâng cấp sắp tới của Firefox 3.0 là Firefox 3.1 trong một số trường hợp có thể hoạt động và xử lý thông tin nhanh gấp 7 lần so với phiên bản tiền nhiệm.  &lt;p&gt;Schroepfer nhấn mạnh rằng với sự trợ giúp của JavaScript, phiên bản 3.1 của trình duyệt web mã nguồn mở này sẽ hoạt động vượt trội so với phiên bản 3.0 nhờ vào sự tối ưu hóa từ các bản thử nghiệm Alpha2, Beta 1 đã và sẽ được phát hành . Sức mạnh của Firefox 3.1 được tạo nên dựa vào sự ra đời và phát triển của engine SpiderMonkey JavaScript – nền tảng của Mozilla Firefox.  &lt;p&gt;John Resig, người phát triển JavaScript cho tập đoàn Mozilla đã tiết lộ: “Một cải tiến tuyệt vời đối với engine JavaScript của Mozilla (có tên SpiderMonkey) đã được thực hiện. Được đặt tên là TraceMonkey, engine này tận dụng công nghệ “trace trees” (PDF) để thêm ngay lập tức những bản biên tập mã gốc vào SpiderMonkey. Một thành tựu chính của dự án là đưa JavaScript vào cạnh tranh bằng các mã gốc được biên tập. Điều này có nghĩa rằng người dùng sẽ được chứng kiến tốc độ xử lý vượt trội hoàn toàn so với các trình duyệt hiện tại.”  &lt;p&gt;Việc thêm vào những bản biên tập mã gốc cho SpiderMonkey đã thực sự khiến cho Firefox3.1 có thể “bay” trong không gian internet. Phó chủ tịch kỹ thuật thứ hai của Mozilla, ông Mike Shaver cho biết hãng đã bỏ ra hơn hai tháng để phát triển và hoàn thiện SpiderMonkey. Ông cũng hứa hẹn rằng Firefox3.1 sẽ đưa khả năng xử lý của JavaScript lên một mức mới so với Firefox3.0. Điều đó được thể hiện qua sự tăng tốc nhanh gấp 3 lần so với phiên bản 2.0 của trình duyệt mã mở này. Mozilla hiện đang hoàn thiện nốt việc phát hành bản thử nghiệm Alpha 2 cho Firefox, cùng với đó là dự định cho bản Beta1 vào tháng 9 năm 2008.  &lt;p&gt;Shaver tuyên bố vào ngày 21 tháng 8: “Mozilla đã hoàn tất việc đưa TraceMonkey vào trong sơ đồ phát triển Firefox 3.1, và thiết lập thành mặc định. Chúng tôi có một vài lỗi cần phải sửa, và một số lượng lớn các tối ưu hóa cho trình duyệt đang chờ lựa chọn, tuy nhiên chúng tôi vẫn đang thực hiện hết sức mình để hoàn thành những phần cần thiết còn lại của Firefox3.1. Tùy thuộc vào chuẩn bạn chọn, bạn sẽ thấy được sự tăng tốc mạnh mẽ hay nhẹ nhàng, hoặc có thể là chậm hơn ở Firefox mới. Trường hợp cuối cùng xảy ra chỉ có thể là vì lỗi, do vậy nếu bạn báo cáo chúng qua bugzilla, điều đó sẽ giúp ích cho chúng tôi rất nhiều.”&lt;/p&gt;(Theo &lt;a href="http://vietbao.vn/Vi-tinh-Vien-thong/Firefox-31-se-nhanh-gap-7-lan-Firefox-30/80100331/222/"&gt;Việtbáo&lt;/a&gt;/Softpedia)  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-4746624279979715267?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/4746624279979715267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/firefox-31-s-nhanh-gp-7-ln-firefox-30.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4746624279979715267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/4746624279979715267'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/firefox-31-s-nhanh-gp-7-ln-firefox-30.html' title='Firefox 3.1 sẽ nhanh gấp 7 lần Firefox 3.0'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-323518452662710667</id><published>2008-10-03T17:32:00.015+07:00</published><updated>2008-10-03T20:18:23.313+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Những tính năng mới trong EJB 3.1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.theserverside.com/tt/articles/content/NewFeaturesEJB31/clip_image002.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; width: 320px; cursor: pointer" alt="" src="http://www.theserverside.com/tt/articles/content/NewFeaturesEJB31/clip_image002.jpg" border="0" /&gt;&lt;/a&gt;   &lt;br /&gt;  &lt;h2&gt;Những t&amp;#237;nh năng mới trong EJB 3.1&lt;/h2&gt; Trong loạt b&amp;#224;i của articles n&amp;#224;y ta xem trước những thay đổi ejb3.1 Nh&amp;#243;m chuy&amp;#234;n gia đang l&amp;#224;m việc cho phi&amp;#234;n bản kế tiếp của đặc tả JEE. Đ&amp;#226;y l&amp;#224; c&amp;#225;c t&amp;#237;nh năng được cung cấp cho bạn để c&amp;#243; thể c&amp;#243; &amp;#253; kiến v&amp;#224; phản hổi lại nh&amp;#243;m chuy&amp;#234;n gia để c&amp;#243; những thay đổi ph&amp;#249; hợp. EJB3.0 mang lại t&amp;#237;nh đơn giản cho JEE5 bằng c&amp;#225;ch chuyển m&amp;#244; h&amp;#236;nh lập tr&amp;#236;nh hạng nặng dễ d&amp;#224;ng hơn. EJB3.1 nhắm tới việc x&amp;#226;y dựng tr&amp;#234;n những th&amp;#224;nh c&amp;#244;ng của EJB3 bằng c&amp;#225;ch tiếp tục đơn giản h&amp;#243;a c&amp;#244;ng việc lập tr&amp;#236;nh cũng như th&amp;#234;m v&amp;#224;o những t&amp;#237;nh năng hữu dụng. Trong loạt b&amp;#224;i n&amp;#224;y, t&amp;#244;i sẽ cho bạn biết về tiến tr&amp;#236;nh được thực hiện bởi nh&amp;#243;m chuyện gia qua một v&amp;#224;i th&amp;#225;ng tới.   &lt;br /&gt;  &lt;br /&gt;Trong b&amp;#224;i đầu ti&amp;#234;n, t&amp;#244;i sẽ đề cập đến 2 t&amp;#237;nh năng m&amp;#224; đ&amp;#227; được thảo luận rất nhiều, sự t&amp;#249;y chọn Interface cho EJBs v&amp;#224; Singleton Beans. T&amp;#244;i sẽ cung cấp những t&amp;#237;nh năng c&amp;#243; thể c&amp;#243; để thảo luận. Nhớ rằng, chưa c&amp;#243; c&amp;#225;i n&amp;#224;o l&amp;#224; cuối c&amp;#249;ng; Tất cả vẫn đang được l&amp;#224;m việc bởi JCP, n&amp;#243; sẽ thay đổi sau khi nhận được những phản hồi từ cộng đồng khắp nơi tr&amp;#234;n thế giới.   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold; font-size: 130%"&gt;T&amp;#249;y chọn cho EJB Interfaces&lt;/span&gt; Thay đổi trước nhất m&amp;#224; nh&amp;#243;m chuy&amp;#234;n gia đề cập đến l&amp;#224; loại bỏ những trở ngại cuối c&amp;#249;ng để l&amp;#224;m cho EJBs tr&amp;#244;ng giống với POJO hơn dưới h&amp;#236;nh thức đơn giản nhất bằng c&amp;#225;ch cho ph&amp;#233;p t&amp;#249;y chọn việc sử dụng Session Bean Interfaces.   &lt;br /&gt;  &lt;br /&gt;Lập tr&amp;#236;nh dựa tr&amp;#234;n Interface r&amp;#245; r&amp;#224;ng l&amp;#224; một kỹ thuật hữu dụng để viết loosely-coupled, tăng khả năng test cho ứng dụng. Đ&amp;#243; l&amp;#224; l&amp;#253; do tại sao cả EJB 2.1 v&amp;#224; Spring th&amp;#250;c đẩy &amp;#253; tưởng c&amp;#225;c th&amp;#224;nh phần Interface. Trong thực tế (EJB3), lu&amp;#244;n y&amp;#234;u cầu phải c&amp;#243; &amp;#237;t nhất một cho EJB 3.0 Session Beans (Kh&amp;#244;ng y&amp;#234;u cầu cho Message Driven Beans).   &lt;br /&gt;  &lt;br /&gt;Điều phiền to&amp;#225;i l&amp;#224; c&amp;#225;c Interface th&amp;#236; hiếm khi cần thiết trong nhiều trường hợp. Nhiều khi, chỉ cần một Java Object b&amp;#236;nh thường l&amp;#224; đủ, đặc biệt khi bạn chả cần nhiều unit test hay loose-coupling trong ứng dụng của bạn.   &lt;br /&gt;  &lt;br /&gt;EJB 3.1 cho ph&amp;#233;p bạn l&amp;#224;m điều đ&amp;#243;. B&amp;#226;y giờ bạn kh&amp;#244;ng cần bất kỳ Interfaces n&amp;#224;o cho Session Beans, giống như Entities JPA v&amp;#224; Message Driven Beans. Tất cả những g&amp;#236; bạn phải l&amp;#224;m ch&amp;#250; th&amp;#237;ch một POJO với @Stateless hay @Stateful để nhận được đầy đủ chức năng của EJB. H&amp;#227;y xem v&amp;#237; dụ dưới đ&amp;#226;y được sửa đổi từ chương Session Bean trong EJB 3 in Action:   &lt;br /&gt;  &lt;br /&gt;  &lt;pre&gt;
&lt;strong&gt;@Stateless&lt;/strong&gt;
public class PlaceBidBean {
@PersistenceContext
private EntityManager entityManager;
public void placeBid (Bid bid) {
entityManager.persist(bid);
}
}&lt;/pre&gt;

&lt;br /&gt;Tiếp tục với những th&amp;#250; vị, h&amp;#227;y th&amp;#234;m v&amp;#224;o một v&amp;#224;i t&amp;#237;nh năng : 

&lt;br /&gt;

&lt;br /&gt;

&lt;pre&gt;&lt;strong&gt;@Stateless
@WebService&lt;/strong&gt;
public class PlaceBidBean {
@&lt;strong&gt;PersistenceContext&lt;/strong&gt;
private EntityManager entityManager;
@&lt;strong&gt;WebMethod&lt;/strong&gt;
public void placeBid (Bid bid) {
entityManager.persist(bid);
}
}&lt;/pre&gt;

&lt;br /&gt;

&lt;br /&gt;Trong v&amp;#237; dụ tr&amp;#234;n, ch&amp;#250;ng ta đang sử dụng JAX-WS 2.0 để th&amp;#244;ng b&amp;#225;o phương thức placeBid l&amp;#224; một web service. Ch&amp;#250;ng ta cũng sử dụng JPA để persistent một Bid entity. PlaceBidBean c&amp;#243; một loạt c&amp;#225;c t&amp;#237;nh năng sẵn c&amp;#243; của Stateless Session Bean bao gồm : pooling, thread-safety, life-cycle, interceptors, security v&amp;#224; declarative transactions. Trong v&amp;#237; dụ n&amp;#224;y c&amp;#243; lẽ&amp;#160; bạn cũng đ&amp;#227; biết nếu bạn đ&amp;#227; quen thuộc với EJB 3.0, phương thức placeBid được bao bọc trong một tr&amp;#236;nh quản l&amp;#253; giao t&amp;#225;c JTA. Remoting dựa tr&amp;#234;n RMI cũng sẽ được hỗ trợ cho những bean n&amp;#224;y, 

&lt;br /&gt;

&lt;br /&gt;&lt;font size="5"&gt;Singletons Beans ra đời: 
  &lt;br /&gt;&lt;/font&gt;

&lt;br /&gt;EJB 3.1 Singleton Beans th&amp;#236; giống như GOF Signleton pattern. Trong bối cảnh Java EE, ch&amp;#250;ng chủ yếu được sử dụng để lưu trữ những dữ liệu được chia sẻ tr&amp;#234;n diện rộng. 

&lt;br /&gt;Nhiều lần bạn cần phải cache một v&amp;#224;i dữ liệu trong bộ nhớ m&amp;#224; kh&amp;#244;ng bắt database cứ phải truy vấn ho&amp;#224;i. Stateless Session Beans hay Stateful Session Beans đều kh&amp;#244;ng đ&amp;#225;p ứng được y&amp;#234;u cầu n&amp;#224;y. Trong khi Stateful Session Beans c&amp;#243; thể được duy tr&amp;#236; tr&amp;#234;n cache một session, n&amp;#243; thật sự kh&amp;#244;ng thể chia sẻ giữa c&amp;#225;c tầng ứng dụng dễ d&amp;#224;ng được. 

&lt;br /&gt;C&amp;#243; nhiều c&amp;#225;ch để giải quyết vấn đề n&amp;#224;y ngay b&amp;#226;y giờ. C&amp;#225;ch đơn giản nhất l&amp;#224; sử dụng static fields hay GOF Singleton POJOs. Với những chiến lược phức tạp hơn, c&amp;#243; thể l&amp;#224;m việc xuy&amp;#234;n qua những ứng dụng ph&amp;#226;n t&amp;#225;n bao gồm sử dụng Servlet container application scope, JBOSS cache, OSCache, JCS v&amp;#224; SwarmCache. C&amp;#225;c giải ph&amp;#225;p thương mại bao gồm Tangosol Coherence v&amp;#224; Terracotta. Trong khi c&amp;#225;c giải ph&amp;#225;p l&amp;#224;m việc trong phần lớn thời gian, ch&amp;#250;ng c&amp;#243; nhiều điểm yếu. Một v&amp;#224;i c&amp;#225;i th&amp;#236; kh&amp;#244;ng thread-safe (static fields, Singleton POJOs), một v&amp;#224;i c&amp;#225;i kh&amp;#244;ng hỗ trợ transactional (Singleton POJOs, Servlet với tầm vực Application, OSCache, JCS, Swarmcache), kh&amp;#244;ng c&amp;#225;i n&amp;#224;o c&amp;#243; khả năng remotable v&amp;#224; kh&amp;#244;ng c&amp;#243; c&amp;#225;i n&amp;#224;o c&amp;#243; cơ chế bảo mật. . C&amp;#225;c giải ph&amp;#225;p đơn giản hơn, d&amp;#249;ng sản phẩm của third-party nhưng n&amp;#243; kh&amp;#244;ng chuẩn. Ch&amp;#250;ng ta h&amp;#227;y đến với EJB 3.1 Singletons. 

&lt;br /&gt;Container sẽ bảo đảm để duy tr&amp;#236; một thể hiện duy nhất cho EJB 3.1 Singleton. C&amp;#243; nghĩa l&amp;#224; Singletons c&amp;#243; thể cache c&amp;#225;c trạng th&amp;#225;i xuy&amp;#234;n qua tầng ứng dụng. Bởi v&amp;#236; n&amp;#243; l&amp;#224; một EJB, Singletons c&amp;#243; tất cả những dịch vụ trung gian m&amp;#224; bạn mong đợi &amp;#8211;declarative transaction management, security, remoting, concurrency management, dependency injection, component life-cycle callbacks, interceptors v&amp;#224; hơn thế nữa. Giống như tất cả những EJBs kh&amp;#225;c, Singleton l&amp;#224; POJOs được ch&amp;#250; th&amp;#237;ch đơn giản. Đ&amp;#226;y l&amp;#224; một v&amp;#237; dụ : 

&lt;br /&gt;

&lt;pre&gt;@&lt;strong&gt;Singleton&lt;/strong&gt;
public class DiscountRateBean {
@PersistenceContext
private EntityManager entityManager;
private Rate rate;

@&lt;strong&gt;PostConstruct&lt;/strong&gt;
private void init() {
rate = entityManager.find(Rate.class, 1);
}

@&lt;strong&gt;PreDestroy&lt;/strong&gt;
private void destroy() {
entityManager.merge(rate);
}

public void setRate(Rate rate) {
this.rate = rate;
}

public Rate getRate() {
return rate;
}

}&lt;/pre&gt;

&lt;br /&gt;

&lt;br /&gt;V&amp;#237; dụ đang sử dụng JPA v&amp;#224; bean life-cycle callbacks để tải dữ liệu l&amp;#250;c bắt đầu v&amp;#224; lưu dữ liệu khi bean bị x&amp;#243;a bỏ (th&amp;#244;ng thường khi ứng dụng bị shut-down). Bất kỳ bean n&amp;#224;o cọi getRate v&amp;#224; setRate th&amp;#236; được bảo đảm truy cập để chia sẻ dữ liệu trong một thể hiện của DiscountRateBean. Bạn để &amp;#253; một vấn đề th&amp;#250; vị --bất kỳ updates n&amp;#224;o cũng sẽ bị mất nếu container kh&amp;#244;ng c&amp;#243; cơ hội để gọi pre-destroy callback. Ch&amp;#250;ng ta sẽ thấy l&amp;#224;m thế n&amp;#224;o để tr&amp;#225;nh tối thiểu vấn đề n&amp;#224;y bằng c&amp;#225;ch sử dụng cron-like timers trong một b&amp;#224;i viết sau n&amp;#224;y. 

&lt;br /&gt;

&lt;br /&gt;Mặc định, tất cả những phương thức Singleton th&amp;#236; được thread-safe v&amp;#224; transactional. C&amp;#243; nghĩa l&amp;#224; tất cả những truy cập đa luồng đến bean th&amp;#236; được Serialized v&amp;#224; tất cả c&amp;#225;c phương thức được giả định c&amp;#243; thuộc t&amp;#237;nh REQUIRED transaction attribute (bạn c&amp;#243; nghĩ l&amp;#224; một gi&amp;#225; trị mặc định tốt kh&amp;#244;ng? Tại sao). 

&lt;br /&gt;

&lt;br /&gt;Bạn c&amp;#243; thể thay đổi h&amp;#224;nh vi giao t&amp;#225;c bằng c&amp;#225;ch sử dụng @TransactionManagement v&amp;#224; @TransactionAttribute annotations giống như khi bạn l&amp;#224;m cho Stateful hay Stateless Session Bean. Nếu bạn đ&amp;#227; từng l&amp;#224;m việc tr&amp;#234;n một dữ liệu lớn, bạn biết rằng Serialized cả setRate v&amp;#224; getRate sẽ dẫn đến t&amp;#236;nh trạng thắt cổ chai một c&amp;#225;ch nghi&amp;#234;m trọng. Trong thực tế.bạn cần chỉ định một read-lock cho getRate trong khi read-write-lock th&amp;#236; d&amp;#249;ng cho setRate. Bạn c&amp;#243; thể l&amp;#224;m điều n&amp;#224;y bằng @Concurrency như thế n&amp;#224;y: 

&lt;br /&gt;

&lt;br /&gt;

&lt;pre&gt;&lt;p&gt;
@&lt;strong&gt;Singleton&lt;/strong&gt;
public class DiscountRateBean {

@PersistenceContext
private EntityManager entityManager;
private Rate rate;

@&lt;strong&gt;PostConstruct&lt;/strong&gt;
private void init() {
rate = entityManager.find(Rate.class, 1);
}

@&lt;strong&gt;PreDestroy&lt;/strong&gt;
private void destroy() {
entityManager.merge(rate);
}

@&lt;strong&gt;ConcurrencyAttribute(READ_WRITE_LOCK)&lt;/strong&gt;
public void setRate(Rate rate) {
this.rate = rate;
}

@&lt;strong&gt;ConcurrencyAttribute(READ_LOCK)&lt;/strong&gt;
public Rate getRate() {
return rate;
}&lt;/p&gt;&lt;p&gt;
}
&lt;/p&gt;&lt;/pre&gt;
Trong một v&amp;#224;i ứng dụng việc chia sẻ dữ liệu chỉ l&amp;#224; read-only. Locking n&amp;#224;o sẽ kh&amp;#244;ng cần thiết nữa. Trong trường hợp n&amp;#224;y bạn c&amp;#243; thể tạo một Singleton bất đồng bộ như thế n&amp;#224;y: 

&lt;br /&gt;

&lt;br /&gt;

&lt;pre&gt;
@&lt;strong&gt;Singleton&lt;/strong&gt;
&lt;strong&gt;@ConcurrencyAttribute(NO_LOCK) // READ_LOCK would also work...&lt;/strong&gt;
public class DiscountRateBean {

@PersistenceContext
private EntityManager entityManager;

private Rate rate;

&lt;strong&gt;@PostConstruct&lt;/strong&gt;
private void init() {
rate = entityManager.find(Rate.class, 1);
}

public Rate getRate() {
return rate;
}

}&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;br /&gt;Một v&amp;#224;i sự thay đổi tr&amp;#234;n thuộc c&amp;#225;c thuộc t&amp;#237;nh &lt;em&gt;@ConcurrencyAttribute(READ_LOCK), @ConcurrencyAttribute(READ_WRITE_LOCK) v&amp;#224; @ConcurrencyAttribute(NO_LOCK) được chuyển qua @ConcurrencyReadLock, @ConcurrencyReadWriteLock v&amp;#224; @ConcurrencyNoLock&lt;/em&gt;. C&amp;#225;c thuộc t&amp;#237;nh &lt;em&gt;@TransactionAttribute sẽ chia th&amp;#224;nh @TransactionRequired, @RequiresNewTransaction, @TransactionNotSupported&lt;/em&gt;. Một số người đ&amp;#227; chỉ ra rằng lối suy nghĩ n&amp;#224;y sẽ l&amp;#224;m cho annotation ph&amp;#236;nh to l&amp;#234;n, v&amp;#224; l&amp;#224;m một bổ sung mới trở n&amp;#234;n phức tạp. T&amp;#205;nh chất của annotation n&amp;#224;y cũng kh&amp;#244;ng ph&amp;#249; hợp với khai b&amp;#225;o transations của Spring v&amp;#224; C#.NET. Một số nh&amp;#224; t&amp;#224;i trợ của m&amp;#244; h&amp;#236;nh n&amp;#224;y lại chỉ ra m&amp;#244; h&amp;#236;nh n&amp;#224;y lại dễ d&amp;#224;ng hơn d&amp;#249;ng @ConcurrencyAttribute(READ_WRITE_LOCK). C&amp;#242;n bạn, bạn nghĩ g&amp;#236; về điều n&amp;#224;y ?. 

  &lt;br /&gt;

  &lt;br /&gt;Bạn cũng c&amp;#243; thể tự m&amp;#236;nh quản l&amp;#253; Singleton concurrency v&amp;#224; muốn container sẽ kh&amp;#244;ng l&amp;#224;m g&amp;#236; hơn l&amp;#224; một dịch vụ trung gian. N&amp;#243; được hỗ trợ th&amp;#244;ng qua c&amp;#225;i được gọi l&amp;#224; bean managed concurrency (tương tự như bean managed transactions). Đ&amp;#226;y l&amp;#224; một v&amp;#237; dụ: 

  &lt;br /&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;
&lt;strong&gt;@Singleton&lt;/strong&gt;
&lt;strong&gt;@ConcurrencyManagement(BEAN)&lt;/strong&gt;
public class DiscountRateBean {&lt;/p&gt;&lt;p&gt;
@PersistenceContext
private EntityManager entityManager;
private Rate rate;

&lt;strong&gt;@&lt;/strong&gt;PostConstruct
private void init() {
rate = entityManager.find(Rate.class, 1);
}

&lt;strong&gt;@&lt;/strong&gt;PreDestroy
private void destroy() {
entityManager.merge(rate);
}

public synchronized void setRate(Rate rate) {
this.rate = rate;
}

public synchronized Rate getRate() {
return rate;
}

}
&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;Lưu &amp;#253; rằng l&amp;#250;c n&amp;#224;y bạn đang tự m&amp;#236;nh quản l&amp;#253; concurrency bằng c&amp;#225;ch sử dụng từ kh&amp;#243;a synchronized. V&amp;#236; container sẽ kh&amp;#244;ng can thiệp, bạn được tự do để sử dụng bất cứ cơ chế quản l&amp;#253; concurrency n&amp;#224;o bạn th&amp;#237;ch, bao gồm kh&amp;#244;ng giới hạn sức mạnh của g&amp;#243;i java.util.concurrent. Cho tới giờ, t&amp;#237;nh năng quản l&amp;#253; đồng thời th&amp;#236; giới hạn ở EJB3.1 singleton, nhưng ch&amp;#250;ng c&amp;#243; thể được mở rộng qua những loại bean kh&amp;#225;c. 

  &lt;br /&gt;

  &lt;br /&gt;Singletons cũng cung cấp cho bạn cơ chế tải lazy/eager ngầm định. 

  &lt;br /&gt;

  &lt;br /&gt;&lt;strong&gt;EJB3.1 th&amp;#234;m những t&amp;#237;nh năng sau:&lt;/strong&gt; 

  &lt;br /&gt;

  &lt;br /&gt;Hai t&amp;#237;nh năng được thảo luận ở đ&amp;#226;y l&amp;#224; dựa v&amp;#224;o tips của nhiều người. C&amp;#243; nhiều t&amp;#237;nh năng th&amp;#250; vị kh&amp;#225;c được liệt k&amp;#234; trong JSR. Dưới đ&amp;#226;y l&amp;#224; những c&amp;#225;i đặc biệt đ&amp;#225;ng ch&amp;#250; &amp;#253;: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hỗ trợ trực tiếp sử dụng EJBs trong servlet container, bao gồm cả sự lựa chọn đ&amp;#243;ng g&amp;#243;i đơn giản hơn, hiện nay c&amp;#243; thể nghĩ l&amp;#224; EJBs cho ph&amp;#233;p đặt ở trong thư mục WEB-INF/classes , tương tự cho ph&amp;#233;p ejb-jar.xml đặt b&amp;#234;n trong thư mục WEB-INF(giống như file web.xml). Theo đ&amp;#243;, bạn c&amp;#243; thể đặt EJB jar trong thư mục WEB-INF/lib.&lt;/li&gt;

  &lt;li&gt;Cải tiến EJB Timer Service để hỗ trợ lập lịch dạng cron, tạo timer deployment-time, v&amp;#224; Stateful Session Bean timed objects. &lt;/li&gt;

  &lt;li&gt;Hỗ trợ Stateful web services th&amp;#244;ng qua Stateful Session Bean web services endpoints. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;br /&gt;Ngo&amp;#224;i ra, c&amp;#242;n một số t&amp;#237;nh năng hiện kh&amp;#244;ng nằm trong JSR, nhưng c&amp;#243; thể rất tốt: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tiếp tục đơn giản h&amp;#243;a JMS, JavaMail v&amp;#224; database injected resources. V&amp;#237; dụ, bạn c&amp;#243; thể cắm MessageSenders v&amp;#224;o Queues v&amp;#224; ConnectionFactory. Gavin King quyết t&amp;#226;m rất lớn cho th&amp;#224;nh phần n&amp;#226;ng cao n&amp;#224;y. 
    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;Một Service Provider Interface (SPI) cho EJB. Điều n&amp;#224;y c&amp;#243; nghĩa sẽ thực hiện t&amp;#237;ch hợp một loạt c&amp;#225;c s&amp;#225;ng tạo của b&amp;#234;n thứ 3 như l&amp;#224; iBATIS, Spring, ACEGI, Quartz hay thậm ch&amp;#237; l&amp;#224; Groovy Beans. Bill Burke, Mike Keigh v&amp;#224; Reza Rahman sẽ hỗ trợ mạnh mẽ t&amp;#237;nh năng n&amp;#224;y. 
    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;Khả năng hỗ trợ cho EJB c&amp;#243; thể chạy tr&amp;#234;n một container servlet hạng nhẹ như Tomcat. N&amp;#243; tương tự những open source đ&amp;#227; c&amp;#243; tr&amp;#234;n thế giới như Embedded JBoss, OpenEJB v&amp;#224; EasyBeans. T&amp;#237;nh năng n&amp;#224;y sẽ thực hiện nếu bạn nghĩ rằng n&amp;#243; tốt. 
    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;C&amp;#243; thể sử dụng local transations hỗ trợ th&amp;#234;m cho JTA trong EJB. T&amp;#244;i nghĩ n&amp;#243; hữu dụng cho những ứng dụng web nhỏ hơn m&amp;#224; thật sự kh&amp;#244;ng cần đến JTA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Lược dịch v&amp;#224; tổng hợp từ internet)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-323518452662710667?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/323518452662710667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/nhng-tnh-nng-mi-trong-ejb-31.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/323518452662710667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/323518452662710667'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/nhng-tnh-nng-mi-trong-ejb-31.html' title='Những tính năng mới trong EJB 3.1'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-8862662621525506557</id><published>2008-10-01T00:07:00.001+07:00</published><updated>2008-10-01T00:09:11.908+07:00</updated><title type='text'>Spring Remoting - Spring và RMI (P.2)</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://wheelersoftware.s3.amazonaws.com/articles/spring-cxf-web-services/frog.jpg" align="right" /&gt;&amp;#160; Trong phần trước, t&amp;#244;i đ&amp;#227; giới thiệu viết một ứng dụng &lt;a href="http://dangtritue.blogspot.com/2008/09/spring-remoting-spring-v-rmi-remote.html" target="_blank"&gt;RMI cơ bản&lt;/a&gt; như thế n&amp;#224;o, ch&amp;#250;ng ta đ&amp;#227; thực hiện một c&amp;#225;ch tiếp cận mới gi&amp;#250;p cho việc tạo một ứng dụng trở n&amp;#234;n đơn giản hơn, bằng c&amp;#225;ch kh&amp;#244;ng cần tạo stub v&amp;#224; skeleton nữa, cũng kh&amp;#244;ng cần phải khởi động cửa sổ rmiregistry đen thui v&amp;#224; kh&amp;#225;.........v&amp;#244; dụng. Ch&amp;#250;ng ta đ&amp;#227; đăng k&amp;#253; tất cả qua một bootstraps đơn giản.&lt;/p&gt;  &lt;p&gt;Nhưng mong muốn mọi thứ đơn giản c&amp;#224;ng đơn giản hơn l&amp;#224; y&amp;#234;u cầu ch&amp;#237;nh đ&amp;#225;ng, vậy th&amp;#236; mời bạn tiếp tục với phần 2 Sự kết hợp Spring v&amp;#224; RMI.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="6"&gt;Phần 2: Spring v&amp;#224; RMI:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ứng dụng demo l&amp;#224; một chương tr&amp;#236;nh ph&amp;#226;n phối t&amp;#234;n, tại client, người sử dụng sẽ nhập v&amp;#224;o t&amp;#234;n của một người n&amp;#224;o đ&amp;#243;, kết th&amp;#250;c bằng exit. Sau khi kết th&amp;#250;c, Server sẽ th&amp;#244;ng b&amp;#225;o cho client biết tất cả những th&amp;#244;ng tin n&amp;#243; đ&amp;#227; nhận được từ l&amp;#250;c khởi tạo, chi tiết t&amp;#234;n từng người được nhập v&amp;#224; v&amp;#224;o thời gian n&amp;#224;o.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/dangtritue/SOJcqSwZAzI/AAAAAAAAAJE/SbtyjO3K4WM/s1600-h/deliveries%5B5%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="243" alt="deliveries" src="http://lh4.ggpht.com/dangtritue/SOJcrMCdUbI/AAAAAAAAAJI/cynLRYvxVho/deliveries_thumb%5B3%5D.jpg?imgmax=800" width="612" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Nh&amp;#236;n v&amp;#224;o kết quả n&amp;#224;y hy vọng bạn đ&amp;#227; h&amp;#236;nh dung phần n&amp;#224;o ứng dụng demo của ch&amp;#250;ng ta.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;T&amp;#244;i sẽ bắt đầu từ phần Server trước, đơn giản n&amp;#243; lu&amp;#244;n l&amp;#224; người phải bắt đầu mọi thứ trước khi c&amp;#243; ai đ&amp;#243; sử dụng.&lt;/p&gt;  &lt;p&gt;&lt;font size="5"&gt;&lt;strong&gt;Server:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;font size="3"&gt;IDeliveryService&lt;/font&gt;&lt;/code&gt; c&amp;#243; 2 phương thức để xử l&amp;#253; tr&amp;#234;n đối tượng Delivery, dưới đ&amp;#226;y l&amp;#224; 2 đoạn m&amp;#227; cho những đối tượng n&amp;#243;i tr&amp;#234;n:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Delivery.java&lt;/strong&gt; &lt;/p&gt;  &lt;pre&gt;&lt;p&gt;package com.test.rmi.common; &lt;/p&gt;&lt;p&gt;import java.io.Serializable;
&lt;br /&gt;import java.util.Date;
&lt;br /&gt;import java.text.SimpleDateFormat; &lt;/p&gt;&lt;p&gt;public class Delivery implements Serializable { &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private static final long serialVersionUID = 1L;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private String requesterName;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private Date deliveryDate; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public Delivery(String requesterName, Date deliveryDate) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.requesterName = requesterName;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.deliveryDate = deliveryDate;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public String getRequesterName() {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return requesterName;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void setRequesterName(String requesterName) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.requesterName = requesterName;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public Date getDeliveryDate() {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return deliveryDate;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void setDeliveryDate(Date deliveryDate) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.deliveryDate = deliveryDate;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public String toString() {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SimpleDateFormat fmt = new SimpleDateFormat(&amp;quot;dd-MMM-yyyy hh:mm:ss&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;quot;[Name =&amp;quot; + requesterName + &amp;quot;, Time of delivery =&amp;quot;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + fmt.format(deliveryDate) + &amp;quot;]&amp;quot;;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }
&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;v&amp;#224;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IDeliveryService .java&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;package com.test.rmi.common; &lt;/p&gt;&lt;p&gt;import java.util.List; &lt;/p&gt;&lt;p&gt;public interface IDeliveryService { &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void newDelivery(Delivery delivery); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;Delivery&amp;gt; getDeliveries();
&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dịch vụ của ch&amp;#250;ng ta bao gồm 2 phương thức, phương thức thứ nhất c&amp;#243; nhiệm vụ ph&amp;#226;n phối một đối tượng mới (Delivery object) v&amp;#224; phương thức thứ 2 sẽ b&amp;#225;o c&amp;#225;o chi tiết lại to&amp;#224;n bộ object Delivery m&amp;#224; n&amp;#243; đ&amp;#227; ph&amp;#226;n phối.&lt;/p&gt;

&lt;p&gt;Điều lưu &amp;#253; nhất ở đ&amp;#226;y l&amp;#224; IDeliveryService kh&amp;#244;ng cần phải thừa kết Interface java.rmi.Remote, v&amp;#224; do đ&amp;#243; n&amp;#243; cũng kh&amp;#244;ng cần n&amp;#233;m ra ngoại lệ java.rmi.RemoteException, Spring sẽ lo liệu điều n&amp;#224;y cho ch&amp;#250;ng ta.&lt;/p&gt;

&lt;p&gt;V&amp;#224; c&amp;#243; một c&amp;#224;i đặt cho dịch vụ n&amp;#224;y l&amp;#224;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DeliveryServiceImpl.java&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;package com.test.rmi.server; &lt;/p&gt;&lt;p&gt;import com.test.rmi.common.IDeliveryService;
&lt;br /&gt;import com.test.rmi.common.Delivery; &lt;/p&gt;&lt;p&gt;import java.util.List;
&lt;br /&gt;import java.util.ArrayList; &lt;/p&gt;&lt;p&gt;public class DeliveryServiceImpl implements IDeliveryService { &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private List&amp;lt;Delivery&amp;gt; deliveries = new ArrayList&amp;lt;Delivery&amp;gt;(); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void newDelivery(Delivery delivery) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deliveries.add(delivery);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;Delivery&amp;gt; getDeliveries() {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return deliveries;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }
&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sau khi c&amp;#243; những đoạn m&amp;#227; phục vụ cho login dịch vụ của ch&amp;#250;ng ta, b&amp;#226;y giờ l&amp;#224; phần quan trọng nhất, cấu h&amp;#236;nh bean trong IoC container của Spring:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;rmi-server-context.xml&lt;/p&gt;&lt;p&gt;&amp;lt;beans&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bean id=&amp;quot;deliveryService&amp;quot;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class=&amp;quot;com.test.rmi.server.DeliveryServiceImpl&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bean class=&amp;quot;org.springframework.remoting.rmi.RmiServiceExporter&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;serviceName&amp;quot; value=&amp;quot;delivery-service&amp;quot; /&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;service&amp;quot; ref=&amp;quot;deliveryService&amp;quot; /&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;serviceInterface&amp;quot;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value=&amp;quot;com.test.rmi.common.IDeliveryService&amp;quot; /&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;registryPort&amp;quot; value=&amp;quot;1234&amp;quot; /&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;
&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Đầu ti&amp;#234;n ch&amp;#250;ng ta tạo một ID cho bean com.test.rmi.server.DeliveryServiceImpl. Sau đ&amp;#243; sử dụng RMIServiceExporter để tạo ra một RMI Service:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;serviceName : chỉ định t&amp;#234;n dịch vụ sẽ được map l&amp;#234;n Server. &lt;/li&gt;

  &lt;li&gt;service : POJO m&amp;#224; n&amp;#243; sẽ tạo RMI Service. &lt;/li&gt;

  &lt;li&gt;serviceInterface : như t&amp;#234;n của n&amp;#243;, đ&amp;#226;y l&amp;#224; interface m&amp;#224; POJO ở tr&amp;#234;n đ&amp;#227; c&amp;#224;i đặt, n&amp;#243; l&amp;#224; Proxy để &amp;quot;Giữ chỗ&amp;quot;. &lt;/li&gt;

  &lt;li&gt;registryPort : cổng ch&amp;#250;ng ta sẽ mở dịch vụ. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kết quả th&amp;#244;ng qua RmiServiceExporter ch&amp;#250;ng ta sẽ tạo ra một dịch vụ như sau:&lt;/p&gt;

&lt;p&gt;rmi://[ServerName]:[Port]/[serviceName]&lt;/p&gt;

&lt;p&gt;Tương ứng với khai b&amp;#225;o tr&amp;#234;n, khi deploy tr&amp;#234;n m&amp;#225;y cục bộ l&amp;#224; :&lt;/p&gt;

&lt;p&gt;&lt;a title="rmi://localhost:1234/delivery-service" href="rmi://localhost:1234/delivery-service"&gt;rmi://localhost:1234/delivery-service&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/dangtritue/SOJcr0XDMII/AAAAAAAAAJM/4B-X-ATiGis/s1600-h/rmiserverspring%5B5%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="206" alt="rmiserverspring" src="http://lh3.ggpht.com/dangtritue/SOJctKUEjhI/AAAAAAAAAJQ/n2i8VaKx30Y/rmiserverspring_thumb%5B3%5D.jpg?imgmax=800" width="696" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;V&amp;#224; đương nhi&amp;#234;n ch&amp;#250;ng ta cần một bootstraps cho dịch vụ của ch&amp;#250;ng ta:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;public class RmiServerTest { &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static void main(String[] args) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ApplicationContext ctx = new ClassPathXmlApplicationContext(
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;com/test/rmi/server/rmi-server-context.xml&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }
 &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.itjobswatch.co.uk/charts/permanent-demand-trend.aspx?s=java+rmi&amp;amp;l=uk" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;Client:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Phần việc c&amp;#242;n lại của Client cũng kh&amp;#225; dễ d&amp;#224;ng vời Spring, RmiProxyFactoryBean sẽ gi&amp;#250;p ch&amp;#250;ng ta nhận một dịch vụ đ&amp;#227; được đăng k&amp;#253; tr&amp;#234;n server:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;&amp;lt;beans&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bean id=&amp;quot;deliveryService&amp;quot; class=&amp;quot;org.springframework.remoting.rmi.RmiProxyFactoryBean&amp;quot;&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;serviceUrl&amp;quot; value=&amp;quot;rmi://localhost:1234/delivery-service&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;serviceInterface&amp;quot; value=&amp;quot;com.test.rmi.common.IDeliveryService&amp;quot;/&amp;gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;
&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ch&amp;#250;ng ta chỉ cần cung cấp địa chỉ của dịch vụ, tiếp theo l&amp;#224; chỉ định Interface thế chỗ cho Object tr&amp;#234;n Server kia.&lt;/p&gt;

&lt;p&gt;V&amp;#224; kết th&amp;#250;c ứng dụng của ch&amp;#250;ng ta, một ứng dụng client sử dụng dịch vụ delivery-service ra đời :&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;p&gt;public class RmiClientTest { &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static void main(String[] args) throws IOException {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ApplicationContext ctx = new ClassPathXmlApplicationContext(
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;com/test/rmi/client/rmi-client-context.xml&amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IDeliveryService deliveryService = (IDeliveryService) ctx
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .getBean(&amp;quot;deliveryService&amp;quot;);&lt;/p&gt;&lt;p&gt;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String name = &amp;quot;&amp;quot;;
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.print(&amp;quot;Please input Name: &amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (!(name = br.readLine()).equals(&amp;quot;exit&amp;quot;)) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;Hello &amp;quot; + name);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.print(&amp;quot;Please input Name: &amp;quot;);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deliveryService.newDelivery(new Delivery(name, new Date()));
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Delivery&amp;gt; deliveries = deliveryService.getDeliveries();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;Total number of deliveries: &amp;quot; + deliveries.size());
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Iterator&amp;lt;Delivery&amp;gt; it = deliveries.iterator();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (it.hasNext()) {
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Delivery delivery = (Delivery) it.next();
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;	-&amp;quot; + delivery);
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }
&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Người d&amp;#249;ng sẽ lần lượt nhập v&amp;#224;o t&amp;#234;n m&amp;#224; họ muốn ph&amp;#226;n ph&amp;#225;t l&amp;#234;n server (&lt;strong&gt;&lt;em&gt;th&amp;#244;ng qua phương thức newDelivery&lt;/em&gt;&lt;/strong&gt;), kết th&amp;#250;c bằng lệnh &amp;quot;exit&amp;quot;, khi đ&amp;#243; server sẽ th&amp;#244;ng b&amp;#225;o to&amp;#224;n bộ delivery m&amp;#224; n&amp;#243; đ&amp;#227; nhận được (&lt;strong&gt;&lt;em&gt;Phương thức getDeliveries&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;H&amp;#227;y chạy ứng dụng demo của ch&amp;#250;ng ta, kết quả bạn đ&amp;#227; thấy ở đầu trang v&amp;#224; cảm nhận sự th&amp;#250; vị về RMI m&amp;#224; Spring mang lại, tất cả POJO đều c&amp;#243; thể trở th&amp;#224;nh một &lt;strong&gt;RMI Service&lt;/strong&gt; m&amp;#224; kh&amp;#244;ng c&amp;#242;n cần một interface mang &amp;#253; nghĩa &amp;quot;&lt;strong&gt;Đ&amp;#225;nh dấu&lt;/strong&gt;&amp;quot; nữa java.rmi.Remote.&lt;/p&gt;

&lt;p&gt;Dowload demo: &lt;a title="Spring v&amp;#224; RMI Demo" href="http://upload.knightage.net/download.php?file=182e98c2a9f1372b478c170f7ac768ad" target="_blank"&gt;Spring v&amp;#224; RMI&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5965955994829958260-8862662621525506557?l=dangtritue.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dangtritue.blogspot.com/feeds/8862662621525506557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dangtritue.blogspot.com/2008/10/spring-remoting-spring-v-rmi-p2.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/8862662621525506557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5965955994829958260/posts/default/8862662621525506557'/><link rel='alternate' type='text/html' href='http://dangtritue.blogspot.com/2008/10/spring-remoting-spring-v-rmi-p2.html' title='Spring Remoting - Spring và RMI (P.2)'/><author><name>Langthang</name><uri>http://www.blogger.com/profile/00337891865369277477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/dangtritue/SOJcrMCdUbI/AAAAAAAAAJI/cynLRYvxVho/s72-c/deliveries_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5965955994829958260.post-724020244961954686</id><published>2008-09-27T22:59:00.001+07:00</published><updated>2008-09-28T22:02:43.108+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Basic'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Spring Remoting- Spring và RMI (Remote Method Invocation)(P.1)</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Trong loạt b&amp;#224;i giới thiệu về Spring v&amp;#224; Remoting, t&amp;#244;i đ&amp;#227; giới thiệu phần trước sử dụng &lt;a title="Spring v&amp;#224; JMS" href="http://dangtritue.blogspot.com/2008/08/spring-jms-with-pojos-s-dng-jms-vi_25.html" target="_blank"&gt;Spring v&amp;#224; JMS&lt;/a&gt; th&amp;#244;ng qua thư viện ActiveMQ. H&amp;#244;m nay, t&amp;#244;i giới thiệu sử dụng Spring v&amp;#224; RMI, c&amp;#225;ch thức c&amp;#224;i đặt một ứng dụng RMI được hỗ trợ bởi Spring như thế n&amp;#224;o, n&amp;#243; mang lại những lợi &amp;#237;ch g&amp;#236;.&lt;/p&gt;  &lt;p&gt;V&amp;#224; để tr&amp;#225;nh những bối rối cho những ai chưa l&amp;#224;m quen nhiều với RMI, t&amp;#244;i nhắc lại một v&amp;#224;i kh&amp;#225;i niệm cơ bản về RMI.&lt;/p&gt;  &lt;p&gt;Trong b&amp;#224;i n&amp;#224;y t&amp;#244;i tr&amp;#236;nh b&amp;#224;y 2 phần.&lt;/p&gt;  &lt;p&gt;RMI cơ bản : tr&amp;#236;nh b&amp;#224;y một c&amp;#225;i nh&amp;#236;n tổng quan về RMI, sau khi kết th&amp;#250;c, ch&amp;#250;ng ta sẽ hiểu RMI l&amp;#224; g&amp;#236;, thực hiện viết một chương tr&amp;#236;nh thuần t&amp;#250;y RMI, bi&amp;#234;n dịch tr&amp;#234;n commanline v&amp;#224; kết nối gọi phương thức từ Client- m&amp;#225;y Linux(Ubuntu) về Server-m&amp;#225;y Windows(XP).&lt;/p&gt;  &lt;p&gt;RMI v&amp;#224; Spring : RMI với sự hỗ trợ của Spring, v&amp;#224; tại sao ch&amp;#250;ng ta lựa chọn sự kết hợp n&amp;#224;y.&lt;/p&gt;  &lt;p&gt;&lt;font size="6"&gt;Phần 1: Giới thiệu về RMI&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.cs.swan.ac.uk/~csneal/InternetComputing/RMI.web.gif" /&gt; &lt;/p&gt;  &lt;p&gt;RMI l&amp;#224; g&amp;#236;?&lt;/p&gt;  &lt;p&gt;RMI l&amp;#224; một cơ chế gọi phương thức từ xa giữa 2 m&amp;#225;y c&amp;#224;i đặt m&amp;#225;y ảo Java, d&amp;#249;ng để gọi một phương thức tr&amp;#234;n một đối tượng từ xa giống như tr&amp;#234;n m&amp;#225;y cục bộ.&lt;/p&gt;  &lt;p&gt;RMI hoạt động như thế n&amp;#224;o:&lt;/p&gt;  &lt;p&gt;RMI hoạt động dựa tr&amp;#234;n cơ chế stub/skeleton nghĩa l&amp;#224; ph&amp;#225;t sinh bộ khung sườn của đối tượng remote, đặt tr&amp;#234;n m&amp;#225;y remote v&amp;#224; m&amp;#225;y local. Bộ khung sườn n&amp;#224;y đ&amp;#243;ng vai tr&amp;#242; như những nh&amp;#224; ngoại giao, nhờ đ&amp;#243; 1 c&amp;#244;ng việc được lREMOTELY th&amp;#236; b&amp;#226;y giờ c&amp;#243; t&amp;#237;nh LOCALLY.&lt;/p&gt;  &lt;p&gt;Stubs hoạt động ph&amp;#237;a client v&amp;#224; Sekeleton hoạt động ph&amp;#237;a server, trong đặc tả mới hiện nay, khi viết code kh&amp;#244;ng cần tạo ra Skeleton nữa, ch&amp;#250;ng ta chỉ cần tạo ra stub cho client l&amp;#224; đủ, phần c&amp;#242;n lại, RMI sẽ lo liệu cho ch&amp;#250;ng ta.&lt;/p&gt;  &lt;p&gt;Stub v&amp;#224; Skeleton sẽ c&amp;#243; nhiệm vụ trao đổi dữ liệu cho nhau, khi c&amp;#243; một y&amp;#234;u cầu dưới client, stub c&amp;#243; nhiệm vụ Serialize mọi tham số (l&amp;#224; object) v&amp;#224; truyền l&amp;#234;n Server, sau đ&amp;#243; Skeleton sẽ deSerialize đối tượng n&amp;#224;y v&amp;#224; xử l&amp;#253;, sau đ&amp;#243; l&amp;#224; một qu&amp;#225; tr&amp;#236;nh ngược lại với qu&amp;#225; tr&amp;#236;nh tr&amp;#234;n, dữ liệu được trả về cho Client.&lt;/p&gt;  &lt;p&gt;Ch&amp;#250;ng ta hiểu n&amp;#244;m na l&amp;#224; client sẽ ch&amp;#233;p một t&amp;#224;i liệu l&amp;#234;n server nhờ sự hỗ trợ của stub, sau đ&amp;#243; Skeleton sẽ mở file đ&amp;#243; ra v&amp;#224; đọc th&amp;#244;ng tin trong đ&amp;#243;, sau khi đọc xong t&amp;#224;i liệu anh ta sẽ chuyển cho cấp tr&amp;#234;n (server) xử l&amp;#253;, sau khi nhận được kết quả anh ta sẽ tạo ra một t&amp;#224;i liệu kh&amp;#225;c v&amp;#224; ch&amp;#233;p về m&amp;#225;y ph&amp;#237;a Client, Stub ph&amp;#237;a Client sẽ mở t&amp;#224;i liệu ra đọc v&amp;#224; trao trả lại cho cấp tr&amp;#234;n của m&amp;#236;nh, sau đ&amp;#243; l&amp;#224; phần xử l&amp;#253; kết quả đ&amp;#243; của cấp tr&amp;#234;n ở Client. V&amp;#224; như vậy, trong chương tr&amp;#236;nh sẽ c&amp;#243; sự đ&amp;#243;ng g&amp;#243;p của 4 người, 1 phụ t&amp;#225; v&amp;#224; sếp tr&amp;#234;n server (service v&amp;#224; Skeleton), 1 phụ t&amp;#225; v&amp;#224; kh&amp;#225;ch h&amp;#224;ng dưới client (customer v
