<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>C40's Blog - garyc40 at garyc40 dot com</title>
	<link>http://www.garyc40.com</link>
	<description></description>
	<pubDate>Wed, 26 Mar 2008 07:30:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<item>
		<title>Ruby và thú vui &#8220;code 1 dòng&#8221;</title>
		<link>http://www.garyc40.com/2008/03/ruby-va-thu-vui-code-mot-dong-2/</link>
		<comments>http://www.garyc40.com/2008/03/ruby-va-thu-vui-code-mot-dong-2/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 07:30:12 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Lập trình]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/03/ruby-va-thu-vui-code-mot-dong-2/</guid>
		<description><![CDATA[Từ hồi tớ học Ruby, lại bị tiêm nhiễm thêm một thói quen vừa tốt vừa xấu. Đó là khi thực hành giải mấy bài toán vớ vửn đơn giản, tớ toàn bị ám ảnh phải làm sao để code của mình ít dòng, ít chữ cái nhất có thể. Dần dần CodeGolf trở thành [...]]]></description>
			<content:encoded><![CDATA[<p>Từ hồi tớ học Ruby, lại bị tiêm nhiễm thêm một thói quen vừa tốt vừa xấu. Đó là khi thực hành giải mấy bài toán vớ vửn đơn giản, tớ toàn bị ám ảnh phải làm sao để code của mình ít dòng, ít chữ cái nhất có thể. Dần dần <a href="http://www.codegolf.com">CodeGolf</a> trở thành chỗ chơi của mình lúc nào không biết.</p>
<p>Thói quen đó xấu, là bởi vì nhiều khi &#8230; mất thời gian. Có nhiều bài chỉ mang tính ôn tập lại mấy cái chức năng của Ruby, thì mình lại bỏ ra 1 tiếng đồng hồ vò đầu bứt tai xem có cách nào ngon và ngắn hơn không. </p>
<p>Nhưng từ khi có thói quen đó, thấy đầu óc mình được optimized hẳn. Trước khi làm gì cũng bỏ ra vài trăm mili giây để đánh giá xem có cách nào nhanh hơn không, và nhờ đó mà nhiều khi lại tiết kiệm được thời gian. Quan trọng nhất là nó thay đổi tư duy của mình khi lập trình: đó là có nhiều cách để giải quyết 1 vấn đề, và không có cách nào là ngắn nhất cả, chỉ có cách ngắn nhất tạm thời, hoặc nói chính xác là &#8220;cách ngắn hơn&#8221;. Kể cả khi tớ tìm được cách để giải 1 bài mà chỉ dùng có 1 dòng code, tớ cũng chả thấy hài lòng: &#8220;chắc chắn còn cách cần ít chữ cái hơn&#8221;. </p>
<p>Tất nhiên khi lập trình thì có nhiều tiêu chí để nói code của mình đã được &#8220;tối ưu hoá&#8221; (không kể đến việc phải giải quyết được vấn đề):</p>
<p>- Chạy nhanh nhất.<br />
- Ít dòng code nhất.<br />
- Thuật giải rõ ràng và đẹp.</p>
<p>Gần như không có ai đạt được cả 3 tiêu chí đó 1 lúc cả. Và thường mọi người khi giải quyết vấn đề thường dựa vào tiêu chí thứ nhất và tiêu chí thứ ba nhiều hơn.</p>
<p>Giờ thì tớ muốn nhét thêm cái tiêu chí thứ 2 đó và phương trình của tớ:</p>
<blockquote><p>code-tối-ưu = nhanh + đẹp + ngắn</p></blockquote>
<p>Hồi gì học <a href="http://www.rubylearning.org">Ruby trên mạng</a>, tớ gặp 1 bài khá đơn giản như sau:</p>
<p>Cho 1 dãy số từ 1 đến 100. In ra lần lượt cho từng số:<br />
- Fizz nếu số đó chia hết cho 3<br />
- Buzz nếu số đó chia hết cho 5<br />
- FizzBuzz nếu số đó chia hết cho 15<br />
- nếu không phải các trường hợp trên thì in ra chính số đang xét.</p>
<p>Bài này có thể gọi là &#8220;siêu dễ&#8221;. Thế nhưng mà <a href="http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/">phần lớn dân tốt nghiệp lập trình không giải được bài này (hô hô).</a></p>
<p>Cách đơn giản nhất là mà phần lớn học viên ở rubylearning.org đưa ra là như sau:</p>
<pre name="code" class="ruby">

1.upto(100) do |number|
  if number % 15 == 0 then
    puts 'FizzBuzz'
  elsif number % 5 == 0 then
    puts 'Fizz'
  elsif number % 15 == 0 then
    puts 'Buzz'
  else
    puts number
  end
end
</pre>
<p>Như vậy là 11 dòng code. Có thể gọi đây là bản thô, chưa tinh xảo.</p>
<p>Một học viên khác (Marcos Ricardo) có vẻ đã quen với việc lập trình trong python từ trước, đưa ra lời giải khá là &#8220;pythonish&#8221; như thế này:</p>
<pre name="code" class="ruby">

1.upto(100) do |number|
  message = ''
  message &lt;&lt; &quot;#{'Fizz' if(number % 3 == 0)}#{'Buzz' if(number % 5 == 0)}&quot;
  puts message.empty? ? number.to_s : message
end
</pre>
<p>Như vậy là đỡ đi 1 lệnh điều kiện number % 15, vỏn vẹn 5 dòng.</p>
<p>Tớ thích cách này, vì trông nó rất là &#8230; nói chung là mã miếc các thứ lằng nhằng trông prồ. Với cả cách sử dụng lồng biểu thức khá là hay. Nhưng liệu mình có làm được cách nào ngắn gọn hơn và hay hơn không nhỉ?</p>
<p>Cùng lúc đó tớ đang học Drupal. Trong Drupal có 1 cái hệ thống xét loại menu item dựa trên thuộc tính khá là hay: sử dụng cờ (flag).</p>
<p>Các thuộc tính của menu item được biểu diễn dưới dạng các hằng, chứa giá trị thập phân tương ứng với các cờ nhị phân. Và mỗi loại menu đều là một tập hợp nhất định của 1 số thuộc tính nhất định. Chỉ cần cộng các cờ nhị phân của các thuộc tính này sẽ xác định được giá trị định nghĩa của mỗi loại menu item. </p>
<p>Áp dụng với bài toán fizzbuzz này, nếu tớ sử dụng 2 cờ là &#8220;chia hết cho 3&#8243; và &#8220;chia hết cho 5&#8243;, thì tớ chỉ cần cộng giá trị của 2 cờ này với nhau sẽ biết được liệu số này có chia hết cho 3, cho 5, cho cả 2 hay không cho số nào cả. Lời giải của tớ cho bài này trong Ruby chỉ có 2 dòng như sau:</p>
<pre name="code" class="ruby">

a = nil, 'fizz', 'buzz', 'fizzbuzz'
1.upto(100) { |a[0]| puts a[(a[0]%3 == 0 ? 1 : 0) + (a[0]%5 == 0 ? 2 : 0)] }
</pre>
<p>Dòng đầu tiên tớ định nghĩa &#8220;loại&#8221; cho các số.<br />
Ở dòng thứ 2, trong quá trình xét từ 1 đến 100, tớ gán luôn số đang xét cho a[0]. Sau đó tớ cộng tổng của 2 cờ a[0]%3 và a[0]%5, và lôi giá trị &#8220;loại&#8221; của nó ra từ chính mảng a.</p>
<p>Đến lúc này bạn Marcos Ricardo lại có 1 cách nữa, chỉ mất 1 dòng</p>
<pre name="code" class="ruby">

1.upto(100) {|number| puts &quot;#{'Fizz' if(number % 3 == 0)}#{'Buzz' if(number % 5 == 0)}&quot;.empty? ? number.to_s : &quot;#{'Fizz' if(number % 3 == 0)}#{'Buzz' if(number % 5 == 0)}&quot; }
</pre>
<p>Ngắn thì ngắn thật. Nhưng hơi bị rối mắt. Và mặc dù cho độ ngắn của lời giải này vượt lời giải của tớ, độ &#8220;đẹp&#8221; và &#8220;nhanh&#8221; của nó thì không bằng của tớ được.</p>
<p>Đó là bởi vì cách này phải dùng tới 4 lệnh điều kiện, trong khi của tớ chỉ mất có 2. Và nó phạm phải nguyên tắc <a href="http://en.wikipedia.org/wiki/DRY"> DRY (Don&#8217;t Repeat Yourself - đừng tự lặp lại mình)</a>. Lời giải của tớ thì không mắc phải vấn đề như vậy. Nó hoàn toàn không bị lặp lại, và hoàn toàn có thể được mở rộng để đáp ứng được những yêu cầu mới của bài toán nếu có.</p>
<p>Ví dụ như mở rộng thêm điều kiện cho bài toán như sau:</p>
<p>Cho 1 dãy số từ 1 đến 100. In ra lần lượt cho từng số:<br />
- Fizz nếu số đó chia hết cho 3<br />
- Blah nếu số đó chia hết cho 4<br />
- Buzz nếu số đó chia hết cho 5<br />
- FizzBuzz nếu số đó chia hết cho 15<br />
- FizzBlah nếu số đó chia hết cho 12<br />
- BlahBuzz nếu số đó chia hết cho 20<br />
- FizzBuzzBlah nếu số đó chia hết cho 60<br />
- nếu không phải các trường hợp trên thì in ra chính số đang xét.</p>
<p>Giả sử tớ thích dùng cách &#8220;thô&#8221; (cái cách mà mất những 11 dòng lúc nãy), tớ sẽ phải thêm đến 4 lệnh điều kiện nữa, và độ dài của chương trình khéo phải đến 20 dòng. Và nếu dùng cách &#8220;1 dòng&#8221; như trên thì chắc phải mất đến 14 câu điều kiện nhồi nhét vào trong 1 dòng đó. Còn nếu dùng cách của tớ? Chỉ mất 2 dòng và 3 câu điều kiện:</p>
<pre name="code" class="ruby">

a = nil, 'Fizz', 'Buzz', 'FizzBuzz', 'Blah', 'FizzBlah', 'BlahBuzz', 'FizzBuzzBlah'
1.upto(100) { |a[0]| puts a[(a[0]%3 == 0 ? 1 : 0) + (a[0]%5 == 0 ? 2 : 0) + (a[0]%4 == 0 ? 4 : 0)] }
</pre>
<p>Như vậy có thể coi lời giải của tớ có độ tối ưu hơn so với các lời giải khác cho đến &#8230; 1 tuần sau đó, khi tớ khám phá ra bài viết này:<br />
<a href="http://chalain.livejournal.com/68788.html">Oh, Go Ahead. Overthink FizzBuzz</a></p>
<p>Trong đó có lời giải chỉ mất 1 dòng, mà trông vẫn ngắn gọn, chỉ cần 1 lệnh điều kiện:</p>
<pre name="code" class="ruby">

(1..100).map {|i| srand(1781773465) if (i%15)==1; [i, &quot;Fizz&quot;, &quot;Buzz&quot;, &quot;FizzBuzz&quot;][rand(4)]}
</pre>
<p>Hãy nhìn kĩ nhé: srand(1781773465), và tác giả nói tìm ra con số 1781773465 mất 12 tiếng. Để nói thêm về cách làm này, có lẽ cho tớ khất đến một bài viết sau, vì có lẽ nó &#8230; quá sáng tạo (đối với tớ) (tất nhiên nếu mở rộng đề bài như tớ nói ở trên thì có lẽ nó hơi bị mất công, nhưng thực sự cách làm này quá sáng tạo và không ai &#8230; dám nghĩ đến). Ta sẽ nói đến lời giải này khi tìm hiểu về Pseudorandom number generator (thuật toán mô phỏng tạo số ngẫu nhiên) trong một bài viết sắp tới của tớ nhé <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>OK, tớ cuốn xuống phần comment của bài viết, và bắt gặp thêm 1 lời giải 1 dòng nữa, và số kí tự còn ngắn hơn lời giải vừa rồi:</p>
<pre name="code" class="ruby">

puts (1..100).map{|i|(s=(i%3==0?’Fizz’:”)+(i%5==0?’Buzz’:”))==”?i:s}
</pre>
<p>I&#8217;m speechless!! Sao cách giải đơn giản như vậy mà mình không nghĩ ra!! Và lại còn có bác ngồi mất 12 tiếng để tìm ra con số seed cho hàm random nữa chứ. =))</p>
<p>Và còn đây nữa:</p>
<pre name="code" class="ruby">

1.upto(100){|i|puts&quot;FizzBuzz#{i}&quot;[i%3&lt;1?0:i%5&lt;1?4:8,i%15&lt;1?8:4]}
</pre>
<p>Nhìn cách này chỉ muốn đập đầu vào tường! Những cách sáng tạo nhất và ngắn gọn nhất lại là những cách dựa trên những kiến thức cơ bản nhất. </p>
<p>Giờ nhìn lại miếng code 2 dòng mình viết trông thật tội. Áp dụng những cái quá phức tạp cho một bài đơn giản, trong khi có những cách cơ bản khác mà vẫn đạt được độ ngắn như thế. Tuy thế nhưng mà cũng rút ra được khá là nhiều bài học quan trọng:</p>
<p>1. Phải nắm vững lí thuyết và thực hành thành thạo trước khi bắt tay vào làm cái gì.</p>
<p>2. Phức tạp hơn chưa chắc đã là tốt hơn.</p>
<p>3. Nên nhìn nhận vấn đề một cách đơn giản, dựa trên những gì mình đã biết và đã học.</p>
<p>Nghĩ lại thì trò &#8220;code 1 dòng&#8221; này khá là bổ ích, vì nó vắt kiệt bộ não của lập trình viên và thúc đẩy sự sáng tạo, đồng thời cũng khiến cho việc lập trình trở nên thú vị hơn. Tớ tin chắc là còn có nhiều cách ngắn hơn cho bài này, nhưng có lẽ cũng nên biết điểm dừng thôi nhỉ :P. Tổng thời gian tớ dành ra cho bài toán này:</p>
<p>lời giải đơn giản nhất: 3 phút<br />
tham khảo lời giải của người khác: 30 phút<br />
lời giải 2 dòng: 5 phút<br />
tìm kiếm bài viết liên quan: 30 phút<br />
đọc bài viết và comments của bài &#8220;Overthink FizzBuzz&#8221;: 30 phút<br />
viết bài blog này: 30 phút</p>
<p>Tổng cộng là <strong>2 tiếng 8 phút</strong> <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> omfg!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/03/ruby-va-thu-vui-code-mot-dong-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Evernote 3.0 Beta - h&#227;y qu&#234;n đi Google Notebook</title>
		<link>http://www.garyc40.com/2008/03/evernote-beta-hay-quen-di-google-notebook/</link>
		<comments>http://www.garyc40.com/2008/03/evernote-beta-hay-quen-di-google-notebook/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 13:28:12 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Phần mềm]]></category>

		<category><![CDATA[evernote]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[notebook]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/03/evernote-beta-hay-quen-di-google-notebook/</guid>
		<description><![CDATA[ Tớ c&#243; th&#243;i quen l&#224; đọc được c&#225;i g&#236; hay ho, thi thường nh&#233;t v&#224;o Google Notebook để sau n&#224;y tiện tra cứu đọc lại. H&#244;m n&#224;o cũng đều đặn tạo 1 Notebook mới với ti&#234;u đề l&#224; ng&#224;y đ&#243; (v&#237; dụ 2008 Mar 22). 
Nhưng m&#224; giả sử thấy 1 c&#225;i biểu đồ [...]]]></description>
			<content:encoded><![CDATA[<p> Tớ c&#243; th&#243;i quen l&#224; đọc được c&#225;i g&#236; hay ho, thi thường nh&#233;t v&#224;o Google Notebook để sau n&#224;y tiện tra cứu đọc lại. H&#244;m n&#224;o cũng đều đặn tạo 1 Notebook mới với ti&#234;u đề l&#224; ng&#224;y đ&#243; (v&#237; dụ 2008 Mar 22). </p>
<p>Nhưng m&#224; giả sử thấy 1 c&#225;i biểu đồ to thế n&#224;y m&#224; note v&#224;o th&#236; &#8230; b&#243; tay (click v&#224;o).</p>
<p><a href="http://www.techcrunch.com/wp-content/ad-marketshare-barchart-large.png"><img height="304" src="http://www.techcrunch.com/wp-content/ad-marketshare-barchart-large.png" width="443" /></a></p>
<p>Hồi trước h&#236;nh như tớ cũng c&#243; lục lọi được 1 c&#225;i addon trong firefox t&#234;n l&#224; ClipIt, h&#236;nh như cũng take note được h&#236;nh ảnh. Nhưng m&#224; tớ lại hơi đ&#242;i hỏi một ch&#250;t. Tớ muốn search được cả nội dung b&#234;n trong h&#236;nh ảnh đ&#243;. V&#237; dụ như tớ kh&#244;ng muốn bỏ s&#243;t c&#225;i biểu đồ tr&#234;n khi tớ search &quot;Google advertising revenue&quot;.</p>
<p><a href="http://preview.evernote.com/">Evernote</a> l&#224;m được tất cả c&#225;c thứ n&#224;y, v&#224; c&#242;n tuyệt vời hơn. Chỉ c&#243; điều hiện giờ n&#243; vẫn đang trong giai đoạn beta v&#224; bạn chỉ c&#243; thể đăng k&#253; xếp h&#224;ng để được họ mời bạn d&#249;ng thử bản beta n&#224;y. Tớ nhận được invitation của họ từ 2 tuần trước, v&#224; trong 2 tuần đ&#243; tớ kh&#244;ng động tay v&#224;o google notebook 1 lần n&#224;o nữa khi cần ghi ch&#250; điều g&#236; mới. Giờ mọi người c&#249;ng &quot;lượn&quot; qua 1 v&#242;ng xem n&#243; thế n&#224;o nh&#233; <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Trước hết, Evernote hỗ trợ bạn ghi ch&#250; cả online lẫn cục bộ tr&#234;n m&#225;y v&#224; đồng bộ với phi&#234;n bản online. C&#243; nghĩa l&#224; bạn c&#243; thể chọn d&#249;ng n&#243; c&#249;ng với web browser để ghi ch&#250; c&#225;c trang web, hoặc bạn c&#243; thể download 1 bản chạy tr&#234;n m&#225;y trạm để ghi ch&#250; từ bất k&#236; ứng dụng n&#224;o. Sau n&#224;y khi bạn cần tra cứu lại bạn c&#243; thể d&#249;ng search engine tr&#234;n mạng hoặc bằng phần mềm của n&#243;.</p>
<p>Tớ th&#236; tớ down về m&#225;y (d&#249;ng vista) để chạy. Giao diện kh&#225; l&#224; đơn giản v&#224; th&#226;n thiện.</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen5.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="460" alt="screen5" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen5-thumb.jpg" width="459" border="0" /></a> </p>
<p>Bạn c&#243; thể tổ chức c&#225;c ghi ch&#250; của bạn bằng c&#225;c tag v&#224; c&#225;c notebook. Đồng thời bạn cũng c&#243; thể dễ d&#224;ng t&#236;m lại theo ng&#224;y th&#225;ng th&#244;ng qua cột ph&#237;a b&#234;n phải. Như vậy nghĩa l&#224; tớ chỉ cần 1 notebook v&#224; chả cần phải tạo mới cho mỗi ng&#224;y nữa.</p>
<p>Nếu bạn c&#243; tablet th&#236; việc ghi ch&#250; c&#242;n dễ d&#224;ng hơn. Evernote c&#243; chức năng nhận dạng chữ viết trong c&#225;c h&#236;nh ảnh, n&#234;n bạn c&#243; thể dễ d&#224;ng t&#236;m kiếm lại c&#225;c note m&#224; bạn ghi ch&#233;p bằng tay (tất nhi&#234;n l&#224; mới chỉ nhận biết được chữ c&#225;i tiếng Anh th&#244;i <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen6.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="224" alt="screen6" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen6-thumb.jpg" width="452" border="0" /></a> </p>
<p>C&#242;n như <a href="http://www.techcrunch.com/wp-content/ad-marketshare-barchart-large.png">c&#225;i biểu đồ tớ n&#243;i ở tr&#234;n</a>, c&#225;c bước take note rất l&#224; dễ d&#224;ng <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Chọn 1 phần (hoặc to&#224;n bộ) biểu đồ sử dụng Clipper của Evernote (n&#250;t b&#234;n tr&#225;i để ghi ch&#250; đoạn văn bản đang được chọn, n&#250;t b&#234;n phải để cắt h&#236;nh ảnh trong khung m&#224;n h&#236;nh hiện tại) .</p>
<p>&#160;<a href="http://www.garyc40.com/wp-content/uploads/2008/03/image.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="85" alt="image" src="http://www.garyc40.com/wp-content/uploads/2008/03/image-thumb.png" width="112" border="0" /></a> </p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/image1.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="390" alt="image" src="http://www.garyc40.com/wp-content/uploads/2008/03/image-thumb1.png" width="445" border="0" /></a>&#160;</p>
<p>Sau đ&#243; nếu tớ muốn th&#234;m thắt ghi ch&#250; bằng tay của m&#236;nh v&#224;o, chỉ cần nhất ph&#237;m D tr&#234;n b&#224;n ph&#237;m, v&#224; tha hồ ph&#243;ng b&#250;t.</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/image2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="304" alt="image" src="http://www.garyc40.com/wp-content/uploads/2008/03/image-thumb2.png" width="450" border="0" /></a> </p>
<p>Chữ tớ hơi xấu nhỉ <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Giờ click v&#224;o n&#250;t OK của khung Clipper, biểu đồ sẽ được đưa v&#224;o Evernote. Tiếp theo chỉ việc th&#234;m tag l&#224; xong.</p>
<p>Evernote tất nhi&#234;n c&#243; thể nhận dạng được cả chữ viết, v&#224; bất cứ văn bản n&#224;o c&#243; mặt trong 1 tấm h&#236;nh. Giờ nếu tớ quay trở lại cửa số Evernote v&#224; search &quot;advertising revenue&quot;, biểu đồ n&#224;y sẽ ch&#236;nh &#236;nh hiện ra ngay.</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/image3.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="389" alt="image" src="http://www.garyc40.com/wp-content/uploads/2008/03/image-thumb3.png" width="434" border="0" /></a></p>
<p>C&#242;n nếu bạn muốn biết đầy đủ c&#225;c t&#237;nh năng tuyệt vời của Evernote, tốt nhất n&#234;n <a href="http://www.evernote.com/prereg/">đăng k&#253; 1 ch&#226;n để d&#249;ng thử bản Beta</a>, v&#224; xem clip n&#224;y <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>
<div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:fd50af4b-87a2-4d17-b40a-1de04b662a91" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div><object width="425" height="350">
<param name="movie" value="http://www.youtube.com/v/MQfm-LpcG7E&amp;rel=0&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0"></param>
<param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/MQfm-LpcG7E&amp;rel=0&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></div>
</div>
<p>Hạn chế duy nhất của Evernote cho đến giờ m&#224; tớ biết, đ&#243; l&#224; kh&#244;ng chạy được tr&#234;n Linux. Tất nhi&#234;n l&#224; bạn vẫn c&#243; thể sử dụng web interface của n&#243;, nhưng r&#245; r&#224;ng l&#224; chức năng kh&#244;ng đầy đủ bằng.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/03/evernote-beta-hay-quen-di-google-notebook/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bản nhạc chỉ dựa tr&#234;n c&#225;c &#226;m thanh trong Windows XP v&#224; 98</title>
		<link>http://www.garyc40.com/2008/03/ban-nhac-chi-dua-tren-cac-am-thanh-trong-windows-xp-va-98/</link>
		<comments>http://www.garyc40.com/2008/03/ban-nhac-chi-dua-tren-cac-am-thanh-trong-windows-xp-va-98/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 15:28:45 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Giải trí]]></category>

		<category><![CDATA[98]]></category>

		<category><![CDATA[creativity]]></category>

		<category><![CDATA[sound]]></category>

		<category><![CDATA[windows]]></category>

		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/03/ban-nhac-chi-dua-tren-cac-am-thanh-trong-windows-xp-va-98/</guid>
		<description><![CDATA[Xem c&#225;i n&#224;y mới biết nhiều thằng s&#225;ng tạo d&#227; man!





]]></description>
			<content:encoded><![CDATA[<p>Xem c&#225;i n&#224;y mới biết nhiều thằng s&#225;ng tạo d&#227; man!</p>
<div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e1c31903-6fca-4bf3-9f6f-4d1d31cab3c4" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div><object width="425" height="355">
<param name="movie" value="http://www.youtube.com/v/dsU3B0W3TMs"></param>
<param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/dsU3B0W3TMs" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/03/ban-nhac-chi-dua-tren-cac-am-thanh-trong-windows-xp-va-98/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows Live Writer - hay!</title>
		<link>http://www.garyc40.com/2008/03/windows-live-writer-hay/</link>
		<comments>http://www.garyc40.com/2008/03/windows-live-writer-hay/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 15:01:26 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[windows live writer]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/03/windows-live-writer-hay/</guid>
		<description><![CDATA[B&#224;i n&#224;y l&#224; tớ d&#249;ng Windows Live Writer để viết. Thực sự bất ngờ v&#236; t&#237;nh năng đầy đủ của phần mềm n&#224;y. Bạn chả cần phải v&#224;o blog của m&#236;nh, log in, t&#236;m link post b&#224;i v&#224; g&#245; v&#224;o c&#225;i WYSIWYG của n&#243; nữa. D&#249;ng WLW (Windows Live Writer) bạn sẽ chủ động nh&#236;n [...]]]></description>
			<content:encoded><![CDATA[<p>B&#224;i n&#224;y l&#224; tớ d&#249;ng Windows Live Writer để viết. Thực sự bất ngờ v&#236; t&#237;nh năng đầy đủ của phần mềm n&#224;y. Bạn chả cần phải v&#224;o blog của m&#236;nh, log in, t&#236;m link post b&#224;i v&#224; g&#245; v&#224;o c&#225;i WYSIWYG của n&#243; nữa. D&#249;ng WLW (Windows Live Writer) bạn sẽ chủ động nh&#236;n thấy ngay b&#224;i post của bạn tr&#244;ng như thế n&#224;o l&#250;c soạn m&#224; kh&#244;ng cần phải truy cập v&#224;o trang blog của m&#236;nh thường xuy&#234;n.</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen1.jpg" target="_blank"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="453" alt="Windows Live Writer - Main window" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen1-thumb.jpg" width="453" border="0" /></a> </p>
<p>Bạn cũng c&#243; thể ch&#232;n ảnh v&#224;o từ ổ cứng m&#224; kh&#244;ng cần phải tỉ mẩn upload n&#243; l&#234;n trước v&#224; căn lề chỉnh lối:</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen2.jpg" target="_blank"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="449" alt="WLW Insert Picture" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen2-thumb.jpg" width="449" border="0" /></a> </p>
<p>C&#243; nhiều effect v&#224; option để bạn hiệu chỉnh cho ảnh của m&#236;nh trong b&#224;i viết:</p>
<p>&#160;<a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen3.jpg" target="_blank"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="255" alt="screen3" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen3-thumb.jpg" width="451" border="0" /></a> </p>
<p>Bạn cũng c&#243; thể c&#224;i th&#234;m một v&#224;i <a title="Windows Live Writer plug-ins" href="http://gallery.live.com/results.aspx?c=0&amp;bt=9&amp;pl=8&amp;st=5">plug-in</a> nữa để th&#234;m t&#237;nh năng sửa b&#224;i. V&#237; dụ ảnh sau l&#224; được xử l&#253; bởi plugin <a title="Polaroid Plug-in" href="http://gallery.live.com/liveItemDetail.aspx?li=6a125986-6550-4ce9-9c71-9a0fbbc3443f&amp;bt=9">Polaroid</a>:</p>
</p>
<div class="wlWriterSmartContent" id="scid:887EC618-8FBE-DEAD-BEEF-2339AF2EC721:dc48f536-8669-4b19-ac47-66ae73b7ac50" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.garyc40.com/wp-content/uploads/2008/03/img-3383-8x6.jpg" title="My cute cat" rel="thumbnail"><img border="0" src="http://www.garyc40.com/wp-content/uploads/2008/03/img-33831.jpg" /></a></div>
</p>
<p>C&#225;c t&#237;nh năng sửa b&#224;i của Wordpress đều đủ cả: </p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/03/screen4.jpg" target="_blank"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="468" alt="screen4" src="http://www.garyc40.com/wp-content/uploads/2008/03/screen4-thumb.jpg" width="458" border="0" /></a> </p>
<p>V&#224; c&#242;n nhiều t&#237;nh năng hay ho nữa. Bạn c&#243; thể t&#236;m hiểu <a title="D&#249;ng Windows Live Writer để viết b&#224;i cho Blog WordPress" href="http://viettut.info/windows-live-writer">c&#225;ch c&#224;i đặt v&#224; sử dụng tại viettut.info</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/03/windows-live-writer-hay/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tốt nhất là làm một mình&#8230;</title>
		<link>http://www.garyc40.com/2008/03/tot-nhat-la-lam-mot-minh/</link>
		<comments>http://www.garyc40.com/2008/03/tot-nhat-la-lam-mot-minh/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 04:35:35 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Lập trình]]></category>

		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/03/tot-nhat-la-lam-mot-minh/</guid>
		<description><![CDATA[Một trong những cái đau đớn nhất của việc làm việc theo nhóm, đó là: phải làm cùng 1 chú leader gà con đầu óc rỗng tuếch và quan liêu.
Điều đau đớn thứ hai, đó là khi mình thẳng thắn chỉ ra chỗ sai của hắn, thì những thằng cùng nhóm khác bỏ ngoài tai [...]]]></description>
			<content:encoded><![CDATA[<p>Một trong những cái đau đớn nhất của việc làm việc theo nhóm, đó là: phải làm cùng 1 chú leader gà con đầu óc rỗng tuếch và quan liêu.<br />
Điều đau đớn thứ hai, đó là khi mình thẳng thắn chỉ ra chỗ sai của hắn, thì những thằng cùng nhóm khác bỏ ngoài tai và quay ra liếm đ&#8217;t thằng leader.</p>
<p>Cũng phải công nhận mình chả giỏi giang gì nên mới sa chân vào những cái nhóm làm việc như thế, và cũng chả phải thằng có tinh thần teamwork lắm khi hay chê bai chỉ trích đứa khác. Tự làm mọi thứ 1 mình thì lại thấy workload quá lớn mình không kham nổi. Qua lần này rút ra một vài kinh nghiệm về làm việc nhóm.</p>
<p>Nếu bạn được chọn làm leader:</p>
<p>- <strong>Luôn nhớ rằng &#8220;you are leading people, not managing them&#8221;.</strong> Thử đặt mình vào vị trí 1 thằng developer, sẽ rất khó chịu khi bị chú leader không có trình độ chuyên môn mà cứ áp đặt những cách làm rất trâu bò và thiếu mềm dẻo cho mình. &#8220;Leader&#8221; khác &#8220;manager&#8221; ở chỗ, leader cần trình độ chuyên môn cao hơn, biết nhiều về chi tiết kĩ thuật hơn, và thực sự xét về mặt quyền lực thì ngang hàng với các thành viên khác, chỉ có thêm trách nhiệm &#8220;dẫn đầu đàn&#8221; và &#8220;điều phối hoạt động&#8221; cho toàn nhóm. Mọi quyết định là do đa số trong nhóm cùng nhau nhất trí, chứ không bị áp đặt bởi một ai cả.</p>
<p>- <strong>Vấn đề deadline cần được đối xử một cách tế nhị, nhất là đối với một project dính dáng đến phần mềm, ứng dụng web .v.v.</strong> Gia công phần mềm nó khác với việc &#8220;đánh cho xong bản report&#8221; hay &#8220;thắt cà vạt trong vòng 30 giây&#8221;. Bạn chỉ có thể đặt ra các mốc thời gian dự định mềm dẻo, chứ khó có thể kiểm soát được một hạn định cụ thể cho một dự án dù nhỏ hay to. Trên thực tế, việc cho ra sản phẩm chậm hơn hạn định dự kiến 3 tháng - 6 tháng là chuyện bình thường, và thậm chí đã có thể coi là &#8220;best practice&#8221;. Đó là do trong quá trình gia công, không thể lường được hết các thay đổi về mặt kĩ thuật, cũng như lỗi chương trình .v.v. Không nhận thức được điều này, và o ép các thành viên cùng nhóm khác phải hoàn thành trước deadline dĩ nhiên sẽ dẫn đến thất bại của dự án.</p>
<p>- <strong>Nếu được phép lựa chọn thành viên, thà chọn ít nhưng chất lượng còn hơn chọn nhiều mà thằng nào cũng làng nhàng.</strong> Tớ bị rơi vào hoàn cảnh này nhiều lần. Ghét nhất là phải học lớp nào mà thày không cho chọn nhóm, mà chỉ định nhóm cho từng thành viên. Kết quả là vào toàn nhóm ất ơ. Một nhóm có 6 đứa chẳng hạn, thì 3 đứa là &#8220;free rider&#8221; (cùng nhóm cho lấy lệ, chứ chả đóng góp gì sất!). Cuối cùng thì cả đội chán nản và một mình mình phải è cổ ra làm hết phần của bọn nó, hay nói cách khác là biến thành &#8220;servant&#8221; chứ chả phải &#8220;leader&#8221;. Hiện tại đang làm 1 cái project lèm nhèm của 1 đứa châu Phi nó lead. Do không có hiểu biết về chính lĩnh vực của cái dự án, nên nó toàn lôi bạn bè vớ vỉn vào, rồi chia 2 nhóm, 1 nhóm design (trong đó có thằng lít đờ) và 1 nhóm coder cho trang web. Trong khi mấy cha coder è cổ ra đọc documentation và &#8220;vừa xây vừa phá vừa sửa&#8221;, thì mấy ông designer thiết kế 1 cái logo mà tớ dùng paint tớ còn vẽ được đẹp hơn, rồi dựng ra 1 cái layout cho trang web mà trông như blog của mấy bạn 9x và cứ nghĩ chỉ việc thay image cho cái default theme của drupal là mọi thứ sẽ hiện ra như ý muốn. Nhưng đâu có đơn giản thế! Cuối cùng việc code cái template rồi lại sẽ phải vào tay bọn coder thôi!</p>
<p>- <strong>Gạch đầu dòng cuối cùng, và cũng là quan trọng nhất: Nếu không có trình độ kĩ thuật bằng bọn cùng nhóm, thì nên tập cách lắng nghe.</strong> Xét cho cùng thì nếu trình độ không bằng bọn khác thì cũng khó mà có thể đảm đương làm leader được, vì nói chả ai nghe. Nếu muốn người khác nghe mình, thì phải nghe người khác nói trước đã. Hồi trước tớ đọc trong Rich dad Poor dad, có ví dụ về ông Ford. Tớ cũng chả nhớ rõ chi tiết lắm, nhưng đại loại là có người chê Henry Ford (sáng lập ra hãng xe ô tô Ford) là giàu thì có giàu thật, nhưng trình độ văn hóa chưa quá lớp 3. Thế là Ford mới thách người kia hỏi bất cứ câu gì ông cũng trả lời được. Và khi được hỏi về lĩnh vực nào, Ford liền mời cố vấn của mình về vấn đề đó ra giải đáp đâu ra đấy. Tóm lại là, leader giỏi không hoàn toàn đòi hỏi trình độ kĩ thuật phải cao hơn người khác. Mà cái quan trọng là biết chọn người giỏi làm việc cùng mình, và biết nghe ý kiến của người ta, chứ không phải lúc nào cũng coi mình là nhất, và mọi người phải theo ý mình. <strong>Chả ai muốn bị một thằng dốt hơn mình giật dây cả.</strong></p>
<p>Còn nếu bạn không phải (hoặc không muốn) làm leader, sau đây có lẽ là vài lời khuyên cho bạn khi phải làm việc theo nhóm:</p>
<p>- <strong>Biết nói &#8220;không&#8221; khi cần thiết.</strong> Nếu bạn được mời vào làm cùng một project hứa hẹn lương lậu các thứ rất hấp dẫn đến mấy, nhưng nhìn vào đội hình các team mates mà khấp khểnh, thì nên cân nhắc kĩ trước khi đồng ý. Đến lúc &#8220;sa chân vào vũng lầy&#8221; không rút ra được, thì bạn sẽ bị dằn vặt vì đã để mình phí thời gian vào nhưng thứ vô ích và vì cảm giác mình bị kẻ khác lợi dụng.</p>
<p>- <strong>Biết thẳng thắn đưa ra ý kiến của mình và chả phải sợ bố con thằng nào cả.</strong> Nếu bạn gặp leader giỏi, ý kiến của bạn tức khắc được trân trọng dù đúng hay sai. Còn nếu gặp leader tồi, thì lại càng phải thẳng thắn, vì càng thẳng thắn thì cơ hội bị &#8220;đá đít&#8221; ra khỏi group càng cao. Và khi bị đá đít ra rồi thì bạn rảnh tay để làm việc khác mà không lo gì về trách nhiệm đối với group cũ cả. Hơn nữa thẳng thắn là đức tính tốt, còn &#8220;nói lươn nói lẹo&#8221;, ba phải cho vừa lòng kẻ khác thì là một biểu hiện của sự hèn nhát.</p>
<p>- <strong>Luôn có tinh thần học hỏi người giỏi hơn, và giúp đỡ người kém hơn.</strong> Sẽ chả phải hay ho gì nếu bạn chỉ ngồi một chỗ và than trời vì group của bạn toàn thằng kém hơn mình. Tốt nhất là nên xắn tay lên và giúp đỡ họ giỏi hơn bằng mọi cách có thể. Còn nếu bạn là &#8220;chú gà con xấu xí&#8221; trong nhóm, thì cũng chả việc gì phải mất tự tin. Nếu bạn không tỏ ra kiêu kì và bảo thủ, người giỏi hơn sẽ sẵn lòng chỉ dạy cho bạn. Nếu biết tiếp thu những cái giỏi và lọc ra những cái sai thì chả mấy chốc mà bạn giỏi bằng hoặc hơn người ta.</p>
<p>- <strong>Đừng ôm đồm trách nhiệm, chỉ cần làm tốt phận sự của mình và giúp đỡ người khác đúng mức.</strong> Nếu công việc của bạn được giao là &#8220;code cái template&#8221;, thì cứ code cho tốt cái đã. Còn nếu các thành viên khác không chịu làm việc, thì cũng chả việc gì phải lo lắng để mà làm hết các phần việc khác cho bọn nó. Chuyện thất bại là chuyện bình thường, và chả có gì đáng xấu hổ cả khi bạn đã cố gắng hết sức cho phần việc của mình. Tớ thì tớ thường hay lo bọn cùng nhóm nó không chịu làm việc, kéo điểm của mình xuống. Nên cuối cùng toàn là tớ lo việc type cái report, làm cái powerpoint và viết sẵn cái script cho bọn kia nó đọc lúc presentation. Nhưng từ giờ nhất định chả phải coi nặng chuyện điểm chác nữa, chỉ làm phần việc của mình, thời gian còn lại để làm việc khác có ích hơn.</p>
<p>Còn đây là một vài lời khuyên chung cho cả leader lẫn thành viên bình thường:</p>
<p>- <strong>Chỉ nên nêu ý kiến khi mình thật sự có kiến thức về những cái mình định nói.</strong> Nếu ba hoa bốc phét về một vấn đề mà mình không biết chắc thì sẽ làm giảm uy tín của bản thân, sau này nói chả ai muốn nghe nữa.</p>
<p>-  <strong>Luôn có tinh thần tích cực khi tham gia.</strong> Không nên bàn lùi hay quá bi quan về tiến độ của dự án.</p>
<p>- <strong>Trong đầu luôn phải tính toán cả những trường hợp xấu nhất (thất bại).</strong> Nếu bạn chưa lo xong các vấn đề nền tảng thì đừng nghĩ ngay tới việc quảng cáo cho sản phẩm khi thực sự chưa làm ra được nó. Và đừng quá nghiêm khắc khi kế hoạch của bạn thất bại, mà nên nhìn lại vấn đề một cách tích cực, đưa ra nhận xét và rút ra bài học.</p>
<p>- <strong>Tìm và thống nhất phong cách làm việc phù hợp nhất.</strong> Ví dụ như nếu các thành viên nhà ở xa nhau, hay không thể xếp lịch cho meeting được, thì nên tìm phương cách khác để communicate với nhau, ví dụ như sử dụng bulletin board, instant messenger .v.v. Có rất nhiều web app hỗ trợ project management miễn phí. Không phải cứ lúc nào cũng mặc vest và dắt díu nhau đi họp một cách formal là tỏ ra chuyên nghiệp. Chuyên nghiệp hay không là ở năng suất, không phải do hình thức.</p>
<p>- <strong>Và lời khuyên cuối cùng: tốt nhất hãy làm sao để bạn có thể hoàn thành công việc một mình, hoặc cùng lắm thì chỉ cần group nhỏ (dưới 4 người). </strong>Nếu bạn đang chuyên về flash chẳng hạn, thì hãy cố mở rộng sang web designing bằng XHTML/CSS, rồi theming in Drupal, Joomla, Wordpress .v.v. và cố master ít nhất 1 ngôn ngữ lập trình web nữa. Tất nhiên làm việc được một mình là trường hợp lí tưởng, còn không thì cùng làm với vài ba người thân cận nhất mà bạn tin tưởng được. Càng cho thêm các thành viên mà độ tin cậy chưa cao thì rủi ro của dự án lại càng lớn.</p>
<p>Tớ kết lại bài viết này bằng câu sau, trích trong bài phỏng vấn với <a href="http://en.wikipedia.org/wiki/Steve_McConnell">Steve McConnell</a> <a href="http://technetcast.ddj.com/hz-show-980417.html">khi nói về software engineering</a>, ý nghĩa thì cũng quá rõ ràng rồi nhỉ <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<blockquote><p>a quarter of the projects are canceled before they&#8217;re completed and another 50 percent are completed over budget or behind schedule. And 25 percent are completed on time and on schedule, but the piece that&#8217;s always missing from those surveys is how much of the original functionality was delivered in that 25 percent that was on time and on budget.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/03/tot-nhat-la-lam-mot-minh/feed/</wfw:commentRss>
		</item>
		<item>
		<title>6 câu chuyện vui và những bài học quý báu ;))</title>
		<link>http://www.garyc40.com/2008/02/6-cau-chuyen-vui-va-nhung-bai-hoc-quy-bau/</link>
		<comments>http://www.garyc40.com/2008/02/6-cau-chuyen-vui-va-nhung-bai-hoc-quy-bau/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 15:55:33 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Giải trí]]></category>

		<category><![CDATA[bài học]]></category>

		<category><![CDATA[chuyện vui]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/02/6-cau-chuyen-vui-va-nhung-bai-hoc-quy-bau/</guid>
		<description><![CDATA[Hôm qua lang thang trên mạng, tìm được bài này thấy hay hay  
&#160;
Lesson 1: Naked Wife
A man is getting into the shower just as his wife is finishing up her shower when the doorbell rings. The wife quickly wraps herself in a towel and runs downstairs. When she opens the door, there stands [...]]]></description>
			<content:encoded><![CDATA[<p>Hôm qua lang thang trên mạng, tìm được bài này thấy hay hay <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p class="journalentry">&nbsp;</p>
<h3>Lesson 1: Naked Wife</h3>
<p>A man is getting into the shower just as his wife is finishing up her shower when the doorbell rings. The wife quickly wraps herself in a towel and runs downstairs. When she opens the door, there stands Bob, the next door neighbor. Before she says a word, Bob says, <strong>I will give you $800 to drop that towel.</strong> After thinking for a moment, the woman drops her towel and stands naked in front of Bob. After a few seconds, Bob hands her $800 dollars and leaves. The woman wraps back up in the towel and goes back upstairs. When she gets to the bathroom, her husband asks: <strong>Who was that?</strong> <strong>It was Bob the next door neighbor</strong>, she replies. <strong>Great!</strong> the husband says, <strong>Did he say anything about the $800 he owes me?</strong></p>
<blockquote><p>Moral of the story: If you share critical information pertaining to credit and risk with your shareholders in time, you may be in a position to prevent avoidable exposure.</p></blockquote>
<h3>Lesson 2</h3>
<p>A sales rep, an administration clerk, and the manager are walking to lunch when they find an antique oil lamp. They rub it and a Genie comes out. The Genie says, <strong>I will give each of you just one wish</strong>. <strong>Me first! Me first!</strong> says the admin clerk. <strong>I want to be in the Bahamas, driving a speedboat, without a care in the world.</strong> Poof! She is gone. <strong>Me next! Me next!</strong> says the sales rep. <strong>I want to be in Hawaii,relaxing on the beach with my personal masseuse, an endless supply of Pina Coladas and the love of my life.</strong> Poof! He is gone. <strong>OK, you are up,</strong> the Genie says to the manager. The manager says: <strong>I want those two back in the office after lunch.</strong></p>
<blockquote><p>Moral of the story: Always let your boss have the first say.</p></blockquote>
<h3>Lesson 3</h3>
<p>A priest offered a lift to a Nun. She got in and crossed her legs, forcing her gown to reveal a leg. The priest nearly had an accident. After controlling the car, he stealthily slid his hand up her leg. The nun said: <strong>Father, remember Psalm 129?</strong> The priest removed his hand. But, changing gears, he let his hand slide up her leg again. The nun once again said:  <strong>Father, remember Psalm 129?</strong> The priest apologized <strong>Sorry sister but the flesh is weak.</strong> Arriving at the convent, the nun went on her way. On his arrival at the church, the priest rushed to look up Psalm 129. It said: <strong>Go forth and seek, further up, you will find glory.</strong></p>
<blockquote><p>Moral of the story: If you are not well informed in your job, you might miss a great opportunity.</p></blockquote>
<h3>Lesson 4</h3>
<p>A crow was sitting on a tree, doing nothing all day. A rabbit asked him: <strong>Can I also sit like you and do nothing all day long?</strong> The crow answered: <strong>Sure, why not.</strong> So, the rabbit sat on the ground below the crow, and rested.<br />
A fox jumped on the rabbit and ate it.</p>
<blockquote><p>Moral of the story: To be sitting and doing nothing, you must be sitting very high up.</p></blockquote>
<h3>Lesson 5: Power of Charisma</h3>
<p>A turkey was chatting with a bull <strong>I would love to be able to get to the top of that tree,</strong> sighed the turkey, <strong>but I haven’t got the energy.</strong> <strong>Well, why don’t you nibble on my droppings?</strong> replied the bull. <strong>They’re packed with nutrients.</strong> The turkey pecked at a lump of dung and found that it gave him enough strength to reach the lowest branch of the tree. The next day, after eating some more dung, he reached the second branch. Finally after a fourth night, there he was proudly perched at the top of the tree. Soon he was spotted by a farmer, who shot the turkey out of the tree.</p>
<blockquote><p>Moral of the story: Bullshit might get you to the top, but it wont keep you there.</p></blockquote>
<h3>Lesson 6</h3>
<p>A little bird was flying south for the winter. It was so cold the bird froze and fell to the ground into a large field. While he was lying there, a cow came by and dropped some dung on him. As the frozen bird lay there in the pile of cow dung, he began to realize how warm he was. The dung was actually thawing him out! He lay there all warm and happy, and soon began to sing for joy. A passing cat heard the bird singing and came to investigate. Following the sound, the cat discovered the bird under the pile of cow dung, and promptly dug him out and ate him.</p>
<blockquote><p>Moral of the story:<br />
1. Not everyone who shits on you is your enemy<br />
2. Not everyone who gets you out of shit is your friend<br />
3. And when you’re in deep shit, it’s best to keep your mouth shut!</p></blockquote>
<p>Bổ ích nhất là cái bài học cuối cùng <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/02/6-cau-chuyen-vui-va-nhung-bai-hoc-quy-bau/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby kỷ niệm sinh nhật tròn 15 tuổi</title>
		<link>http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-nhat-tron-15-tuoi/</link>
		<comments>http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-nhat-tron-15-tuoi/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 12:01:51 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Lập trình]]></category>

		<category><![CDATA[OOP]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/02/25/ruby-ky-niem-sinh-nhat-tron-15-tuoi/</guid>
		<description><![CDATA[Hic, hôm qua quên béng mất, hôm nay nhìn lại lịch thì đã là 25 mất rồi. Nói chung là các thứ mốc thời gian quan trọng tớ đều toàn bỏ lỡ cả  
Vào ngày 25/02/1993, Ruby được chính thức &#8230; &#8220;thụ thai&#8221; bởi  Yukihiro Matsumoto (tên gọi trên mạng là Matz) nhờ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.garyc40.com/wp-content/uploads/2008/02/ruby-logo-notext.png" title="Ruby Programming Language"><img src="http://www.garyc40.com/wp-content/uploads/2008/02/ruby-logo-notext.png" alt="Ruby Programming Language" align="left" /></a><a href="http://www.garyc40.com/wp-content/uploads/2008/02/100px-yukihiro_matsumoto.JPG" title="Yukihiro Matsumoto"><img src="http://www.garyc40.com/wp-content/uploads/2008/02/100px-yukihiro_matsumoto.JPG" alt="Yukihiro Matsumoto" align="right" /></a>Hic, hôm qua quên béng mất, hôm nay nhìn lại lịch thì đã là 25 mất rồi. Nói chung là các thứ mốc thời gian quan trọng tớ đều toàn bỏ lỡ cả <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Vào ngày 25/02/1993, Ruby được chính thức &#8230; &#8220;thụ thai&#8221; bởi  Yukihiro Matsumoto (tên gọi trên mạng là Matz) nhờ tình yêu mãnh liệt giữa anh và cái máy tính. Nói đúng hơn là anh ấy bắt đầu xây dựng Ruby kể từ ngày đó, và sau 2 năm, đến năm 1995 thì Ruby mới được chính thức ra đời. Có nghĩa là nói 25/02 là ngày sinh nhật của Ruby thì cũng không chính xác, nhưng mặc kệ, dẫu sao thì cũng là 1 ngày đáng nhớ.</p>
<p><strong>Vậy tại sao Matz lại chọn Ruby làm cái tên cho ngôn ngữ của mình tạo ra?</strong></p>
<p>Ruby không phải một cái tên viết tắt. Đơn giản chỉ là vì Ruby chịu nhiều ảnh hưởng từ Perl, và khi hoàn tất ngôn ngữ này, anh đã đùa với một người bạn rằng nên đặt tên thế nào nghe cho nó giống một thứ đá quý nào đó (Perl lúc đầu cũng được đặt tên là Pearl - ngọc trai). Và bạn của anh đã gợi ý cái tên Ruby. Sau này Matz cũng bất ngờ khi phát hiện ra Pearl là viên đá quý tượng trưng cho<a href="http://www.about-birthstones.com/junebirthstone.html" title="Pearl - June Birth Stone" target="_blank"> những người sinh tháng 6</a>, còn Ruby thì tượng trưng cho <a href="http://www.about-birthstones.com/julybirthstone.html" title="Ruby - July Birth Stone" target="_blank">những người sinh tháng 7</a>. Anh cho rằng cái tên Ruby như thế là phù hợp vì Ruby kế thừa và phát triển nhiều đặc tính từ Perl.</p>
<p><strong>Một số cột mốc quan trọng trong quá trình phát triển Ruby</strong></p>
<ul>
<li>24/02/1993: Matz bắt tay vào công việc &#8220;sáng tạo&#8221; ra ngôn ngữ Ruby.</li>
<li>Tháng 12/1994: Phiên bản alpha đầu tiên của ngôn ngữ được hoàn tất.</li>
<li>1997: Tài liệu hỗ trợ cho ngôn ngữ Ruby được chuyển sang tiếng Anh</li>
<li>Cuối năm 1998: thành lập mailing list ruby-talk cho cộng đồng người sử dụng Ruby ngoài Nhật Bản. Cho đến trước thời điểm này, không có nhiều lập trình viên nước ngoài biết đến Ruby, trong khi Ruby đã khá thành công ở Nhật. Từ đây, cơn bão Ruby dần dần hình thành.</li>
<li>2001: JRuby ra đời, đánh dấu bước tiến mới của Ruby. JRuby là trình dịch Ruby viết bằng Java, và giúp cho việc lập trình kết hợp giữa Ruby và Java trở nên dễ dàng hơn.</li>
<li>Tháng 7/2004: Ruby on Rails ra mắt cộng đồng lập trình viên ứng dụng web. Rails là một framework hỗ trợ xây dựng một cách nhanh chóng các ứng dụng web dựa trên nền tảng kiến trúc MVC (Model-View-Controller). Sau này Rails thu hút được rất nhiều sự chú ý từ các web developer nhờ tốc độ phát triển ứng dụng cũng như tính mềm dẻo của framework này, đồng thời cũng là do những đặc tính thú vị của Ruby. Từ đó trở đi, Rails trở nên phổ biến ngang ngửa với PHP, và Ruby nhờ đó cũng được càng nhiều người biết đến.</li>
<li>Tháng 5/2006: JRuby hỗ trợ Rails</li>
<li>30/4/2007: IronRuby được Microsoft chính thức công bố. IronRuby là nỗ lực của các lập trình viên nhằm đưa Ruby vào .NET framework của Microsoft.</li>
<li>23/7/2007: Bản pre-alpha của IronRuby ra mắt trước công chúng</li>
<li>25/12/2007: Ruby 1.9 chính thức ra mắt với nhiều tính năng mới (hỗ trợ Unicode tốt hơn, sử dụng YARV .v.v.), tuy nhiên các phiên bản số lẻ thường là phiên bản dành cho cộng đồng phát triển và thử nghiệm. Phải chờ đến phiên bản 2.0 thì lập trình viên mới có thể sẵn sàng tận dụng các tính năng mới mẻ cho sản phẩm của mình.</li>
</ul>
<p>Sau 15 năm kể từ khi được xây dựng từ những dòng code đầu tiên, Ruby đã có những bước tiến khá xa. Nhiều người vẫn phủ nhận sự thành công của ngôn ngữ này với lí do sau những 15 năm mà Ruby mới tiến tới phiên bản 1.9. Nhiều người khác thì lại trở nên dị ứng với cái tên Ruby vì sự nổi đình nổi đám của nó những năm gần đây. Dân học lập trình Việt Nam thì càng không muốn động tay vào ngôn ngữ có cái tên lạ hoắc này. Nhưng tớ tin là trong 1 thời gian ngắn nữa, Ruby sẽ là cái tên được nhắc đến rất nhiều tại Việt Nam, và sẽ ngày càng có nhiều người học Ruby hơn.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-nhat-tron-15-tuoi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kế hoạch năm mới</title>
		<link>http://www.garyc40.com/2008/02/k%e1%ba%bf-ho%e1%ba%a1ch-nam-m%e1%bb%9bi/</link>
		<comments>http://www.garyc40.com/2008/02/k%e1%ba%bf-ho%e1%ba%a1ch-nam-m%e1%bb%9bi/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 08:57:58 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Linh tinh]]></category>

		<category><![CDATA[Lập trình]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/02/22/k%e1%ba%bf-ho%e1%ba%a1ch-nam-m%e1%bb%9bi/</guid>
		<description><![CDATA[Năm mới dương lịch được gần 3 tháng, tết nhất thì cũng qua lâu rồi. Thế mà hôm nay mình mới khai bút đầu xuân ở cái blog này  
Đơn giản là vì bận quá, vướng mắc vào bao nhiêu thứ việc dù là kì nghỉ 2 tháng: bận học, bận làm và bận [...]]]></description>
			<content:encoded><![CDATA[<p>Năm mới dương lịch được gần 3 tháng, tết nhất thì cũng qua lâu rồi. Thế mà hôm nay mình mới khai bút đầu xuân ở cái blog này <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Đơn giản là vì bận quá, vướng mắc vào bao nhiêu thứ việc dù là kì nghỉ 2 tháng: bận học, bận làm và bận chơi.</p>
<p>Về VN nghỉ tết đợt này biết là sẽ chả tập trung vào làm được việc gì (mà thực ra là chưa bao giờ serious với cá gì cả). Năm mới thế là không ổn. Hôm trước còn bị sốt mất 1 ngày, và 3 ngày liền rồi chả học hành và làm việc gì sất, toàn ngồi xem phim, chơi game và lướt web vớ vỉn.</p>
<p>Có lẽ đến lúc phải serious trở lại vì tháng nữa là lại vào năm học, chả có thời gian nữa. Những mục tiêu phải hoàn tất trong vòng 1 tháng:</p>
<ul>
<li>Đuổi kịp <a href="http://www.rubylearning.org" title="Free Online Ruby Programming Course" target="_blank">lớp Ruby của bác Satish.</a></li>
<li>Cày xong quyển <a href="http://www.amazon.com/Pro-Drupal-Development-John-VanDyk/dp/1590597559/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1203670539&amp;sr=8-1" title="Pro Drupal Development book on Amazon" target="_blank">Pro Drupal Development</a> cho cái project của ông hiệu trưởng (đi đâu cũng khoe là tao làm cho ông hiệu trưởng nhưng thực ra chả chịu làm gì cả <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</li>
<li>Vọc dần <a href="http://www.drupal.org" target="_blank" title="Drupal Content Management System">Drupal 6</a>, đến khi ra CCK và Views thì làm 1 cái sản phẩm gì đó cho vui <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Ờ thì nói dễ hơn làm. Nhưng mà ít nhất có tí gọi là định hướng. Về Nhật không gian yên tĩnh, chắc dễ ngồi yên 1 chỗ làm các thứ một mạch hơn.</p>
<p>Tiện thể đang quyết tâm, thử &#8220;vạch kế hoạch&#8221; một phát cho năm sắp tới xem sao:</p>
<ul>
<li>Master lại XHTML/CSS</li>
<li>Học Javascript tử tế từ đầu</li>
<li>Tập trung vào Drupal</li>
<li>Học cho xong khoá Ruby, dịch xong đống tài liệu đó sang tiếng Việt</li>
<li>Động tay động chân vào Rails</li>
<li>Mục tiêu là ít nhất xong 1 sản phẩm gì đó trong năm <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Có vẻ hơi ôm đồm tẹo, nhưng tóm lại 3 cái quan trọng nhất phải xong trong năm là Drupal, Ruby, và Rails. Sang năm sau tính tiếp, nhưng đường hướng là trở thành một web developer.</p>
<p>Đã tiếp tục dịch thêm mấy chương tài liệu về Ruby. Hi vọng là đuổi kịp được lớp trong 2 tuần tới.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/02/k%e1%ba%bf-ho%e1%ba%a1ch-nam-m%e1%bb%9bi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chỉ số TIOBE – chỉ số phổ biến của các ngôn ngữ lập trình</title>
		<link>http://www.garyc40.com/2008/01/chi-so-tiobe/</link>
		<comments>http://www.garyc40.com/2008/01/chi-so-tiobe/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 14:06:53 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Lập trình]]></category>

		<category><![CDATA[Lua]]></category>

		<category><![CDATA[Ngôn ngữ lập trình]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Xếp hạng]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2008/01/06/chi-so-tiobe/</guid>
		<description><![CDATA[Hôm qua rong chơi trên mạng thì tìm được trang này: http://www.tiobe.com/index.htm?tiobe_index
TIOBE là 1 công ty phần mềm (hình như thế). Họ tự lập ra chỉ số TIOBE để xếp hạng các ngôn ngữ dựa trên mức độ phổ biến. Vậy họ dựa trên tiêu chí nào để đánh giá?
 
Bảng xếp hạng các ngôn [...]]]></description>
			<content:encoded><![CDATA[<p>Hôm qua rong chơi trên mạng thì tìm được trang này: <a href="http://www.tiobe.com/index.htm?tiobe_index">http://www.tiobe.com/index.htm?tiobe_index</a></p>
<p>TIOBE là 1 công ty phần mềm (hình như thế). Họ tự lập ra chỉ số TIOBE để xếp hạng các ngôn ngữ dựa trên mức độ phổ biến. Vậy họ dựa trên tiêu chí nào để đánh giá?</p>
<p align="center"> <a href="http://www.garyc40.com/wp-content/uploads/2008/01/tiobe.png" title="Chỉ số TIOBE"><img src="http://www.garyc40.com/wp-content/uploads/2008/01/tiobe.png" alt="Chỉ số TIOBE" /></a><em><br />
Bảng xếp hạng các ngôn ngữ phổ biến nhất dựa trên chỉ số TIOBE<br />
(Click vào để xem đầy đủ)</em></p>
<p><strong>Tiêu chí đánh giá</strong></p>
<p>Rất khó để có thể biết được chính xác đã có bao nhiêu dự án dùng ngôn ngữ A, bao nhiêu dòng mã được biết bởi ngôn ngữ B, bao nhiêu người đang sử dụng ngôn ngữ C .v.v. Vậy nên hiện giờ cách tốt nhất là xem xem ngôn ngữ nào được nhắc đến nhiều nhất trên mạng. Đó là cách làm của TIOBE.</p>
<p>Họ chọn các cỗ máy tìm kiếm phổ dụng nhất: Google, Google Blogs, MSN, Yahoo và cả dịch vụ chia sẻ video YouTube để xếp hạng các ngôn ngữ (bản thân các cỗ máy này cũng được chọn lọc dựa trên xếp hạng của alexa). Cách tính chỉ số như sau:</p>
<p>Họ sử dụng câu lệnh search +”{ngôn ngữ} programming” trên các cỗ máy tìm kiếm trên, và ghi lại số kết quả của mỗi cỗ máy. Sau đó dùng tổng số kết quả để sắp xếp các ngôn ngữ, và chọn ra 50 ngôn ngữ đứng đầu.</p>
<p>Tiếp theo họ tính chỉ số của từng ngôn ngữ trong 50 ngôn ngữ này bằng phép tính sau:</p>
<p>((hits(PL,SE1)/hits50(SE1) + &#8230; + hits(PL,SEn)/hits50(SEn))/n</p>
<p>Trong đó PL là ngôn ngữ lập trình đang xét. SE1, SE2 &#8230; SEn là các cỗ máy tìm kiếm (n = 5). hits(PL,SE1) là số kết quả tìm kiếm ngôn ngữ lập trình PL trên cỗ máy SE1. hits50(SE1) là tổng số kết quả của 50 ngôn ngữ đã chọn ra ở trên tìm được trên cỗ máy SE1.</p>
<p>Như vậy, TIOBE index (chỉ số TIOBE) đánh giá gần sát với thực tế về độ phổ biến của các ngôn ngữ trên internet.</p>
<p><strong>Chỉ số này được dùng để làm gì?</strong></p>
<p>Theo định nghĩa chính thức của chỉ số này, các ngôn ngữ được cho điểm A, A-, A&#8211;và B. Trong đó các ngôn ngữ điểm A là các ngôn ngữ được đánh giá là chính thống. B là không chính thống, còn A- và A&#8211;là nằm ở giữa 2 loại này. Nếu một ngôn ngữ nào giữ được chỉ số TIOBE ở khoảng 0.7% trong vòng ít nhất 3 tháng thì sẽ được điểm A. Trong hai tháng đầu có mặt trong bảng xếp hạng, ngôn ngữ đó sẽ có điểm A&#8211; và A-.</p>
<p>Như vậy dựa trên thang điểm đánh giá này, ta có thể đánh giá được xu hướng phát triển của các ngôn ngữ, từ đó xác định được mình nên bổ xung ngôn ngữ nào vào vốn kiến thức của mình để không trở nên lỗi thời.</p>
<p>Nhìn lại bảng xếp hạng, ta có thể để ý thấy vài điểm sau:</p>
<p><strong>Ngôn ngữ họ C đang mất dần ưu thế</strong></p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/01/history_c.png" title="Ngôn ngữ C"><img src="http://www.garyc40.com/wp-content/uploads/2008/01/history_c.png" alt="Ngôn ngữ C" /></a></p>
<p>Mặc dù đang đứng thứ 2 sau Java, chỉ số của C đang tụt xuống nhanh chóng. Cách đây 7 năm C vẫn chiếm 20% số kết quả search, nhưng giờ đây đã tụt xuống còn 13%. Ta cũng có thể thấy C là một trong số ít các ngôn ngữ lập trình cấu trúc còn trụ lại trong bảng này đến giờ (Pascal đứng thứ 19 nhưng không bị giảm sút “phong độ” quá nhiều). C++ cũng đang có chỉ số giảm dần và chắc năm sau sẽ mất vị trí vào tay Python.</p>
<p><strong>Các ngôn ngữ mới như Lua và Ruby đang được đón nhận nồng nhiệt</strong></p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/01/history_lua.png" title="Ngôn ngữ Lua"><img src="http://www.garyc40.com/wp-content/uploads/2008/01/history_lua.png" alt="Ngôn ngữ Lua" /></a></p>
<p>Nhìn vào biểu đồ có thể thấy các ngôn ngữ này trưởng thành nhanh như thế nào. Mặc dù đều được sáng tạo ra từ giữa thập kỉ 90, nhưng thời gian gần đây đã chứng kiến sự bùng nổ mối quan tâm về các ngôn ngữ mới này. Có thể hôm nay là lần đầu tiên bạn nghe thấy những cái tên đó, nhưng không biết năm sau bao nhiêu cái tên mới sẽ nổi lên và bao nhiêu cái tên cũ sẽ chìm vào quên lãng.</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2008/01/history_ruby.png" title="Ngôn ngữ Ruby"><img src="http://www.garyc40.com/wp-content/uploads/2008/01/history_ruby.png" alt="Ngôn ngữ Ruby" /></a></p>
<p><strong>Các ngôn ngữ bạn nên bắt đầu có kế hoạch học từ hôm nay</strong></p>
<p><strong><em>Java</em></strong> – chắc chắn phải một thời gian dài nữa mới chịu nhường lại ngôi vị của mình cho ngôn ngữ khác.<br />
<strong><em>Visual Basic</em></strong>  - khả năng phát triển ứng dụng nhanh chóng trong VB là thế mạnh lớn của ngôn ngữ này. Nhiều người chỉ trích VB là sẽ làm cho coder trở nên lười nhác, nhưng thực tế VB năng suất hơn C++ nhiều đối với những ứng dụng quy mô nhỏ và không đòi hỏi tài nguyên cấu hình cao.<br />
<strong><em>PHP</em> </strong>– học lập trình Web ít nhất nên biết qua.<br />
<strong><em>Ruby</em></strong> – Tớ cá với các bạn là năm nay bạn sẽ nghe thấy cái tên này rất nhiều. Ruby on Rails là bộ khung lập trình Web có năng lực ngang bằng với PHP (nhiều khi lại năng suất hơn).<br />
<strong><em>Lua</em></strong> – Chắc bạn nên dành ngôn ngữ này cho 1 hoặc 2 năm nữa sau khi được cộng đồng hỗ trợ nhiều hơn. Nhưng nên làm quen dần với cái tên này <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Tuy nhiên các bạn không nên dựa vào bảng xếp hạng này để quả quyết ngôn ngữ nào là hay hơn hay thông dụng hơn ngoài đời, vì những con số này chưa chắc đã chính xác. Các cỗ máy tìm kiếm thay đổi thuật toán thường xuyên, và với sự bùng nổ của Internet thì không có gì là tuyệt đối cả. Các bạn chỉ nên sử dụng chỉ số này để tham khảo xem mình nên học tiếp gì và định hướng nghề nghiệp sau này của mình ra sao <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Chúc may mắn <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2008/01/chi-so-tiobe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Belated Merry Christmas</title>
		<link>http://www.garyc40.com/2007/12/belated-merry-christmas/</link>
		<comments>http://www.garyc40.com/2007/12/belated-merry-christmas/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 06:57:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Linh tinh]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/27/belated-merry-christmas/</guid>
		<description><![CDATA[Hic, tuần trước thì phải thi rồi presentation giữa quarter nên bận. Mấy ngày nghỉ vừa rồi thì lại bận &#8230; đi chơi lung tung. Hôm nay 27 mới nhớ ra 2 ngày trước là christmas (rõ ràng hôm đấy còn đi xem pháo hoa christmas cơ mà  )
Thôi hôm nay chắc vẫn chưa [...]]]></description>
			<content:encoded><![CDATA[<p>Hic, tuần trước thì phải thi rồi presentation giữa quarter nên bận. Mấy ngày nghỉ vừa rồi thì lại bận &#8230; đi chơi lung tung. Hôm nay 27 mới nhớ ra 2 ngày trước là christmas (rõ ràng hôm đấy còn đi xem pháo hoa christmas cơ mà <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> )<br />
Thôi hôm nay chắc vẫn chưa hết không khí nhỉ <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<a href="http://www.garyc40.com/wp-admin/" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a><a href="http://odeo.com/flash/audio_player_gray.swf" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a></p>
<p><a href="http://www.garyc40.com/wp-admin/" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a><a href="http://odeo.com/flash/audio_player_gray.swf" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a></p>
<p><a href="http://www.garyc40.com/wp-admin/" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a><a href="http://odeo.com/flash/audio_player_gray.swf" style="left: 0px ! important; top: 16px ! important" title="Click here to block this object with Adblock Plus" class="abp-objtab-08072188633086211 visible ontop"></a><embed src="http://odeo.com/flash/audio_player_gray.swf" quality="high" name="odeo_player_gray" allowscriptaccess="always" wmode="transparent" type="application/x-shockwave-flash" flashvars="type=audio&amp;id=2133998" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" height="54" width="322"></embed><br />
<a href="http://odeo.com/audio/2133998/view" style="font-size: 9px; padding-left: 110px; color: #ff3399; letter-spacing: -1px; text-decoration: none">powered by <strong>ODEO</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/belated-merry-christmas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Stick fight - Shock (hay đáo để)</title>
		<link>http://www.garyc40.com/2007/12/stick-fight-shock-hay-dao-de/</link>
		<comments>http://www.garyc40.com/2007/12/stick-fight-shock-hay-dao-de/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 14:56:59 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Giải trí]]></category>

		<category><![CDATA[flash]]></category>

		<category><![CDATA[stick fight]]></category>

		<category><![CDATA[xiaoxiao]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/17/stick-fight-shock-hay-dao-de/</guid>
		<description><![CDATA[Còn nhớ hồi cấp 2, nhà dùng mạng dial-up chậm rề rề, mà lại đắt. Thế mà có tuần hôm nào cũng miệt mài load xiaoxiao movie về xem. Tại nó đánh nhau hay quá, mà bản thân tớ cũng thích vẽ hình người theo kiểu đấy, nên mê luôn. Sau khi nó ra xiaoxiao [...]]]></description>
			<content:encoded><![CDATA[<p>Còn nhớ hồi cấp 2, nhà dùng mạng dial-up chậm rề rề, mà lại đắt. Thế mà có tuần hôm nào cũng miệt mài load xiaoxiao movie về xem. Tại nó đánh nhau hay quá, mà bản thân tớ cũng thích vẽ hình người theo kiểu đấy, nên mê luôn. Sau khi nó ra xiaoxiao 9, nhạt dần, bẵng đi đến hôm nay lơ thơ lẩn thẩn lại vào 1 trang flash game, có 1 series 2 tập nữa, không phải xiao xiao mà là &#8220;Shock&#8221;. Khá hay và chất (có khi còn hay hơn xiaoxiao). Lâu lắm mới lại có cảm giác như hồi trẻ con mê mẩn xem mấy cái hình gậy đánh nhau.</p>
<p><a href="http://www.stickpage.com/shock1play.shtml">Shock phần 1</a><br />
<a href="http://www.stickpage.com/shock2play.shtml">Shock phần 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/stick-fight-shock-hay-dao-de/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby - có thật sự &#8220;Mọi thứ đều là đối tượng&#8221;</title>
		<link>http://www.garyc40.com/2007/12/ruby-co-th%e1%ba%adt-s%e1%bb%b1-m%e1%bb%8di-th%e1%bb%a9-d%e1%bb%81u-la-d%e1%bb%91i-t%c6%b0%e1%bb%a3ng/</link>
		<comments>http://www.garyc40.com/2007/12/ruby-co-th%e1%ba%adt-s%e1%bb%b1-m%e1%bb%8di-th%e1%bb%a9-d%e1%bb%81u-la-d%e1%bb%91i-t%c6%b0%e1%bb%a3ng/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 14:03:38 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[OOP]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/16/ruby-co-th%e1%ba%adt-s%e1%bb%b1-m%e1%bb%8di-th%e1%bb%a9-d%e1%bb%81u-la-d%e1%bb%91i-t%c6%b0%e1%bb%a3ng/</guid>
		<description><![CDATA[Hồi tớ mới bắt đầu học Ruby, hầu như quyển sách nào tớ đọc, câu đầu tiên trong định nghĩa về Ruby cũng là &#8220;In Ruby, everything is an object&#8221;. Và khắp mọi nơi trên net tớ search, ai cũng bảo thế cả. Tớ cũng dần dần tự mình cho thế là đúng.
Cho đến một [...]]]></description>
			<content:encoded><![CDATA[<p>Hồi tớ mới bắt đầu học Ruby, hầu như quyển sách nào tớ đọc, câu đầu tiên trong định nghĩa về Ruby cũng là &#8220;In Ruby, everything is an object&#8221;. Và khắp mọi nơi trên net tớ search, ai cũng bảo thế cả. Tớ cũng dần dần tự mình cho thế là đúng.</p>
<p>Cho đến một hôm lôi quyển &#8220;Programming Ruby 2nd Edition&#8221; ra đọc đến phần Variable, mới biết &#8220;Everything is an object&#8221; là không hoàn toàn chính xác.</p>
<h3>Có 1 thứ không phải là đối tượng&#8230;</h3>
<p>Chắc bạn cũng có thể đoán ra mang máng rồi. Đó chính là Biến.<br />
Trong Ruby, biến có cách làm việc khác với một số ngôn ngữ khác. Hãy cùng thử ví dụ này nhé:</p>
<pre name="code" class="ruby">
string = 'aha'
str = string
string[2] = 'o'
puts str
puts string
</pre>
<p>Bạn thử đoán xem kết quả cho ra màn hình là thế nào? Kết quả là cả 2 biến str và string sẽ đều mang giá trị là &#8216;aho&#8217;.</p>
<p>Nhưng trong đoạn code trên ta chỉ thay đổi biến string, chứ không hề động đến biến str1. Và ta thay đổi đó xảy ra sau khi str được gán giá trị cũ của string. Nếu như biến là đối tượng, thì khi ta gán string = &#8216;aha&#8217;, đối tượng string sinh ra với giá trị &#8216;aha&#8217;. Tương tự gán str = string sẽ tạo thêm ra một đối tượng nữa có giá trị mà string đang mang. Khi thay đổi giá trị của đối tượng string, đối tượng str sẽ không bị vạ lây.</p>
<h3>Biến không phải là đối tượng, thì biến là cái chi?</h3>
<p>Biến là giá trị tham chiếu. Khi ta gán cho một biến một giá trị mới, một đối tượng mới sẽ được tạo ra trong bộ nhớ, và biến đó sẽ &#8220;trỏ&#8221; vào đối tượng đó. Tưởng tượng mỗi lần bạn truy vấn giá trị của biến, biến sẽ lại truy vấn giá trị của đối tượng, và trả lại cho bạn giá trị của đối tượng. Vậy có nghĩa là, biến và đối tượng không phải là một.</p>
<p>Còn khi bạn gán cho một biến giá trị của một biến đã có sẵn, điều gì xảy ra? Biến mới sẽ lập tức được tham chiếu vào đối tượng mà biến có sẵn kia &#8220;trỏ&#8221; tới. Tóm lại, cả 2 biến này &#8220;trỏ&#8221; tới cùng 1 giá trị giống nhau.</p>
<p>Khi bạn thay đổi (thay đổi thôi nhé, chứ không phải là gán cho giá trị mới) giá trị của một biến, thực chất là bạn thay đổi giá trị của đối tượng gốc. Xin xem hình minh họa sẽ rõ:</p>
<p><a href="http://www.garyc40.com/wp-content/uploads/2007/12/16120701.gif" title="16120701.gif"></a></p>
<p style="text-align: center"><a href="http://www.garyc40.com/wp-content/uploads/2007/12/01.png" title="01.png"><img src="http://www.garyc40.com/wp-content/uploads/2007/12/01.png" alt="01.png" /></a></p>
<h3>Thế nếu tôi gán cho biến string một giá trị mới, str1 có thay đổi theo không?</h3>
<p>Cùng xem đoạn code này nhé:</p>
<pre name="code" class="ruby">
string = 'aha'
str = string
string = 'oho'
puts str
puts string
</pre>
<p>Bạn sẽ thấy ngay str1 vẫn &#8220;trỏ&#8221; đến giá trị &#8216;aha&#8217;, trong khi string thì lại là &#8216;oho&#8217;. Tại sao lại có sự khác biệt này?</p>
<p>Đơn giản là do khi gán string = &#8216;oho&#8217;, ruby nhận ra là string có 1 giá trị mới hoàn toàn (chứ không phải là chỉ thay đổi 1 chữ cái như ở ví dụ trên). Do đó ruby sẽ tạo ra 1 đối tượng mới (oho) để string &#8220;trỏ&#8221; vào.</p>
<p style="text-align: center"> <a href="http://www.garyc40.com/wp-content/uploads/2007/12/02.png" title="02.png"><img src="http://www.garyc40.com/wp-content/uploads/2007/12/02.png" alt="02.png" /></a></p>
<h3>Cách sao chép biến đúng trong Ruby</h3>
<p>Để thực sự sao chép giá trị của một biến, thay vì chỉ tham chiếu đến giá trị của biến đó, ta dùng phương thức &#8220;dup&#8221;. Câu lệnh gán sẽ phải như sau:</p>
<pre name="code" class="ruby">
str = string.dup
</pre>
<h3>&#8220;Not everything is an object&#8221;</h3>
<p>Tóm lại, Ruby vẫn là một ngôn ngữ thuần túy hướng đối tượng, bởi vì &#8220;Although not everything is an object, Everything you manipulate is an object&#8221; (Mặc dù không phải cái gì cũng là đối tượng, nhưng trong Ruby tất cả các thứ bạn tác động tới đều là đối tượng).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/ruby-co-th%e1%ba%adt-s%e1%bb%b1-m%e1%bb%8di-th%e1%bb%a9-d%e1%bb%81u-la-d%e1%bb%91i-t%c6%b0%e1%bb%a3ng/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Giáo trình &#8220;Tự học Ruby&#8221;</title>
		<link>http://www.garyc40.com/2007/12/giao-trinh-t%e1%bb%b1-h%e1%bb%8dc-ruby/</link>
		<comments>http://www.garyc40.com/2007/12/giao-trinh-t%e1%bb%b1-h%e1%bb%8dc-ruby/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 12:31:00 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Dịch thuật]]></category>

		<category><![CDATA[Giáo trình]]></category>

		<category><![CDATA[Sách]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/13/giao-trinh-t%e1%bb%b1-h%e1%bb%8dc-ruby/</guid>
		<description><![CDATA[Hị, sau một tuần dịch lấy đà, về cơ bản tớ đã dịch xong 4 chương đầu, nhưng mà còn chưa format lại để post lên trên blog. Tớ sẽ dần dần post lên sau.
Giáo trình của bác Satish này khá hay. Không mất thời gian giải thích lòng vòng, bác ấy đi thẳng luôn [...]]]></description>
			<content:encoded><![CDATA[<p>Hị, sau một tuần dịch lấy đà, về cơ bản tớ đã dịch xong 4 chương đầu, nhưng mà còn chưa format lại để post lên trên blog. Tớ sẽ dần dần post lên sau.</p>
<p>Giáo trình của bác Satish này khá hay. Không mất thời gian giải thích lòng vòng, bác ấy đi thẳng luôn vào vấn đề và dùng nhiều code mẫu. Thế nên tớ nghĩ là những bạn mới học lập trình, hoặc mới biết đến Ruby sẽ không gặp nhiều khó khăn cho lắm.</p>
<p>Tuy thế dịch một tài liệu tin học từ tiếng Anh sang tiếng Việt không phải là chuyện đơn giản. Kiến thức tin học lập trình của tớ thì cũng chưa phải là sâu rộng gì, nên chắc sẽ có một số chỗ tớ dịch không chuẩn xác. Ai bắt gặp lỗi nào thì bảo cho tớ biết nhá <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Tài liệu tớ dịch được post tại đây:</p>
<p><a href="http://www.garyc40.com/tu-hoc-ruby">Tự học Ruby</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/giao-trinh-t%e1%bb%b1-h%e1%bb%8dc-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tự học Ruby trên Internet</title>
		<link>http://www.garyc40.com/2007/12/t%e1%bb%b1-h%e1%bb%8dc-ruby-tren-internet/</link>
		<comments>http://www.garyc40.com/2007/12/t%e1%bb%b1-h%e1%bb%8dc-ruby-tren-internet/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 14:46:00 +0000</pubDate>
		<dc:creator>c40</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Hàng chùa]]></category>

		<category><![CDATA[Sách]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/10/t%e1%bb%b1-h%e1%bb%8dc-ruby-tren-internet/</guid>
		<description><![CDATA[Học gì chứ học lập trình, mà đặc biệt là Ruby, thì không bao giờ phải sợ tốn tiền mua sách. Lí do đơn giản: Có rất nhiều sách điện tử về Ruby được cung cấp miễn phí trên mạng (ý tớ là miễn phí hoàn toàn, chứ không phải hàng pirate đâu nhé  [...]]]></description>
			<content:encoded><![CDATA[<p>Học gì chứ học lập trình, mà đặc biệt là <a href="http://www.ruby-lang.org/en/" title="Ruby Programming Language" target="_blank">Ruby</a>, thì không bao giờ phải sợ tốn tiền mua sách. Lí do đơn giản: Có rất nhiều sách điện tử về Ruby được cung cấp miễn phí trên mạng (ý tớ là miễn phí hoàn toàn, chứ không phải hàng pirate đâu nhé <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Hầu hết những sách này được viết bởi những lập trình viên có nhiều kinh nghiệm và lên trình prồ rồi, nên chất lượng sách của họ thì cũng khỏi phải bàn.</p>
<p>Quyển đầu tiên tớ muốn nói đến là  quyển &#8220;<a href="http://poignantguide.net/ruby/" target="_blank" title="Why's (Poignant) Guide to Ruby">Why&#8217;s (Poignant) Guide to Ruby</a>&#8221; của <a href="http://whytheluckystiff.net/" title=".c( whytheluckystiff )o." target="_blank">_why</a> - một trong những thành viên kì cựu trong cộng đồng Ruby (đấy là tớ nói thế, chứ thật sự tớ chỉ đọc sách của bác này, chứ không biết gì nhiều về <a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" title="Why the lucky stiff" target="_blank">bác ấy</a>).</p>
<p>Quyển này khá thú vị và vui nhộn. Tác giả còn vẽ cả truyện tranh chèn vào, các ví dụ không nhất thiết là phải giải thích kĩ lưỡng, nhưng mà người đọc vẫn thấy dễ hiểu. Đọc quyển này thấy khá là có hứng. Bác _why này cũng làm cả trang <a href="http://tryruby.hobix.com/" title="Try Ruby!" target="_blank">try ruby!</a> Cũng nhờ trang này mà tớ thấy thích thú với ngôn ngữ Ruby mới này. Bạn nào chưa biết, hoặc mới nghe đến Ruby chứ chưa thử, thì vào try it out đi đã <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Đảm bảo sẽ thấy thích thú ngay. Bạn cũng có thể download <a href="http://poignantguide.net/sdtrk/" title="the soundtrack to why's (poignant) guide to Ruby" target="_blank">bản mp3 của quyển sách này</a>. Nhưng mà cách này thì tớ chưa thử, mà cũng chả tưởng tượng là ông ấy sẽ đọc code bằng mồm hay là thế nào nữa <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Quyển thứ hai là quyển &#8220;<a href="http://www.humblelittlerubybook.com/" title="Humble Little Ruby Book" target="_blank">Humble Little Ruby Book</a>&#8221; của <a href="http://www.jeremymcanally.com/" target="_blank" title="Jeremy McAnally">Jeremy McAnally</a>. Quyển này cũng có thể download free trên mạng nốt, nhưng có thêm một lựa chọn nữa là mua bản in của quyển này (chỉ có tầm 9$, quá rẻ so với những quyển khác).</p>
<p>Quyển này thì tớ chưa có động đến. Nhưng đọc qua mục lục cũng đoán được style của tác giả này khá là dễ đọc và không bị nhàm chán. Chỉ có điều đọc lướt qua tớ phát hiện ra hình như nó viết cho ruby 1.8.5, trong khi bản mới nhất bây giờ là 1.8.6, và sắp tới là 1.9 đến nơi rồi. Tuy nhiên thay đổi giữa version cũ và version mới của một ngôn ngữ không thành vấn đề lắm, miễn là bạn nắm được cái core philosophy của ngôn ngữ này.</p>
<p>Để down quyển này bạn cần đăng ký tài khoản tại <a href="http://www.infoq.com/minibooks/ruby" title="InfoQ" target="_blank">InfoQ</a> (trang này tổng hợp tin tức và các bài viết về CNTT và lập trình khá hay!). Hoặc là bạn cũng có thể đọc nó online trên <a href="http://www.scribd.com/doc/219543/Humble-little-ruby-book" title="Scribd: Humble Little Ruby Book" target="_blank">scribd</a>.</p>
<p>Quyển thứ ba, không hẳn là quyển sách, mà là <a href="http://rubylearning.org/class/" title="Free Online Ruby Programming Course by Satish Talim" target="_blank">một khóa học free về Ruby trên mạng</a> của bác Satish Talim. Bác này 29 năm làm trong ngành rồi. Khóa học đầu tiên bác ấy mở là vào tháng 8 năm 2005 (nếu tớ không nhầm). Sắp tới từ ngày 7/1/2008 <a href="http://rubylearning.com/blog/2007/12/08/free-online-ruby-programming-course/" title="Free, Online Ruby Programming Course" target="_blank">sẽ có khóa học mới</a>, bạn nào không ngại học bằng tiếng Anh thì nhanh tay vào đăng ký khóa học từ bây giờ. <a href="http://rubylearning.com/satishtalim/tutorial.html" title="Ruby Study Notes" target="_blank">Chương trình học và giáo trình</a> thì có cả trên trang của bác này rồi, bạn có thể tham khảo trước. Tớ thì chưa học bác này bao giờ, nên không biết là online course của bác ấy thế nào, nhưng chắc chắn là sẽ có tương tác giữa học sinh và thày giáo. Cái này hay, bởi vì sách bình thường thì chỉ tự đọc tự ngẫm thôi, còn có thày dắt theo thì sẽ đỡ bị mất thì giờ vào những vướng mắc không đâu. Bạn cũng nhớ đọc các bài viết trên blog của trang đó nhé, nhiều bài khá bổ ích.</p>
<p>Tớ cũng vừa đăng ký course của bác này (chờ mãi). Trước đó tớ đã xin phép bác ấy dịch giáo trình của bác sang tiếng Việt, để các bạn mới học lập trình, hoặc mới làm quen với Ruby ở Việt Nam có cơ hội tiến nhanh với Ruby hơn, mà đó cũng là một cách để tớ vừa học vừa ôn.  Bác ấy đã nhận lời cho phép, và hiện tại tớ đã dịch xong phần &#8230; mục lục. Sẽ dần dần post lên blog này để mọi người theo dõi và góp ý chỉnh sửa <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ngoài việc tự học theo sách, hoặc là học theo course như trên, bạn cũng có thể tìm <a href="http://rubymentor.rubyforge.org/wiki/wiki.pl" title="RubyMentor" target="_blank">&#8220;gia sư&#8221; Ruby</a> cho mình. Rất đơn giản, chỉ cần chọn lấy một bác trong list và gửi email cho người ta (bằng tiếng Anh). Mỗi người sẽ có hình thức dẫn dắt khác nhau. Nhưng học cái gì đó mà có người định hướng cho mình thì bao giờ cũng dễ dàng và đỡ tốn thời gian vô ích hơn.</p>
<p>Tất nhiên là để học Ruby hiệu quả thì chỉ có thế chưa đủ. Bạn còn phải subscribe một đống blog về Ruby, lướt các forum .v.v. rất nhiều nữa. Bài viết này tớ chỉ giới thiệu vài nguồn tài liệu Ruby miễn phí trên mạng để bạn có thể khởi đầu với ngôn ngữ khá thú vị và cũng đang &#8220;hot&#8221; này.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/t%e1%bb%b1-h%e1%bb%8dc-ruby-tren-internet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Xông nhà</title>
		<link>http://www.garyc40.com/2007/12/xong-nha/</link>
		<comments>http://www.garyc40.com/2007/12/xong-nha/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 07:54:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Linh tinh]]></category>

		<category><![CDATA[linh tinh]]></category>

		<category><![CDATA[xông nhà]]></category>

		<guid isPermaLink="false">http://www.garyc40.com/2007/12/09/xong-nha/</guid>
		<description><![CDATA[ 
Gọi là xông nhà bởi vì đây là bài viết đầu tiên trong blog.  Nhưng mà thật ra cũng chả phải là bài viết đầu tiên.
Cách đây hơn 6 tháng tôi mua domain và host này để làm một cái blog về CNTT. Nhưng sau đó mấy tuần thì &#8230; mất hứng. Thế là [...]]]></description>
			<content:encoded><![CDATA[<p> <img src="http://www.wired.com/images/article/full/2007/07/1_350px.jpg" align="left" height="125" width="125" /></p>
<p>Gọi là xông nhà bởi vì đây là bài viết đầu tiên trong blog.  Nhưng mà thật ra cũng chả phải là bài viết đầu tiên.</p>
<p>Cách đây hơn 6 tháng tôi mua domain và host này để làm một cái blog về CNTT. Nhưng sau đó mấy tuần thì &#8230; mất hứng. Thế là từ đó  trở đi cái host được tận dụng làm 1 cái rapidleech server, và để lưu trữ 1 số thứ khác.</p>
<p>Cho đến ngày hôm qua, đang vật lộn với đống sách vở Ruby, thấy mọi thứ lằng nhằng quá. Không có một cái gì đó để theo dõi cái learning progress của mình, đâm ra là sau mấy tháng vẫn thấy mình chỉ là 1 cu <a href="http://www.answers.com/n00b?cat=technology">n00b</a> không viết được 1 đoạn script Ruby nào ra hồn mà không phải giở sách ra coi lại. Haizz, học hành thế là không có được&#8230;</p>
<p>Thế nên sáng nay thức dậy một phát (lúc 12h trưa) là ngồi vào máy vọc ngay cái Wordpress lên để nghịch. Từ giờ blog này sẽ dùng để ghi chép những gì mà mình học và khám phá ra được (not limited to Ruby or IT stuffs), rồi thì cũng là để sau này lúc nào bored mà không dám động đến game (kẻo tái nghiện) thì lôi blog ra đọc đi đọc lại cho vui.</p>
<p>Viết 1 bài khởi động thế, lúc khác viết tiếp sau <img src='http://www.garyc40.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.garyc40.com/2007/12/xong-nha/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
