Wednesday, 2 January 2013

Cùng học ruby

Như bài viết trước vừa nói, tớ học ruby theo kiểu nhảy vào code vì bản thân RAM bé, ko hợp với kiểu nhồi sách rồi mới làm.

Cùng tên với rất nhiều topic trên các forum mạng, nhưng đây sẽ không phải kiểu kêu gọi, đăng ký và bỏ đấy :v

Mục tiêu của tớ là học ruby để config chef. Nhưng cái mục tiêu này hơi mơ hồ, vì thật ra tớ chưa dùng chef nên cũng không rõ phải học bao nhiêu, vậy nên mục tiêu đổi thành: học dùng các khái niệm thuộc core của ruby tương đương với python như list, dict, if else, for, while, viết function, viết class, cài đặt môi trường để code, sử dụng vài thư viện ...

Bạn cũng nên set 1 cái mục tiêu trước khi nhảy vào học: ví dụ như học ruby + ruby on rail để làm 1 cái blog cho bản thân, để giải 20 bài PE ... :v

Nội dung chính của post này:
- chia sẻ tài liệu
- giải thích thắc mắc
- chia sẻ kinh nghiệm

Ngày số 1:

Đầu tiên là thành quả của buổi chiều nay:
- cài ruby trên ubuntu12.04 ( sudo apt-get install ruby1.9.1-full)
- chạy irb, ruby file_name.rb

- học qua các tut cơ bản:
http://tryruby.org/levels/1/challenges/0 - chỉ lướt qua thôi, làm theo cái này hơi chán :v ai dùng ubuntu chú ý tắt gõ tiếng việt đi nếu không sẽ không gõ được trong này
http://www.ruby-lang.org/en/documentation/quickstart/ - ngắn gọn, đơn giản, thích cái tut này hơn.


Khi mà có cái language mới nào trong tay thì chỉ nghĩ đến ngay viết dãy fibonacci thần thánh :D
đọc xong 2 cái tut này đủ để viết hàm tính số fibonacci:
https://github.com/hvnsweeting/FAMILUG/blob/master/ruby/fibfunc.rb

Nếu biết python rồi thì học ruby cũng không khó khăn gì, bởi nhiều khái niệm tương đương như list, dict (hash), C thì sẽ khá vất vả. Nhưng không sao, hãy đọc bài này để lấy chút tinh thần :D
http://www.jamesfend.com/learned-ruby-rails-12-weeks-launch-freelancify

topic trên SO giới thiệu các tài liệu: http://stackoverflow.com/questions/6806/what-is-the-best-way-to-learn-ruby cá nhân tớ sau nhiều lần trải nghiệm cũng chọn cách :"Best way to learn any language is to use it. :)"

http://stackoverflow.com/questions/673964/should-i-learn-ruby-or-python
cho những ai vẫn hỏi học ruby hay python: câu trả lời của tớ vẫn luôn là cả 2

"Why's Poignant Guide": lướt qua quyển này thấy khá là hoa mắt @@, mai đọc thử xem

http://stackoverflow.com/questions/4176/why-should-i-learn-ruby?rq=1
đọc xong bài này thì hầu như đều nói rằng đã biết python không cần học ruby, thế nhưng tớ đã có mục tiêu , nên mọi ý kiến của họ không ảnh hưởng gì.

tất cả các ý kiến có chữ "thích", hãy xem đơn giản như việc người này thích ăn kem chanh, người kia thích ăn kem dâu, bạn không thử sẽ không biết được.

cảm nhận đầu tiên sau khi code vài dòng là thấy ruby dùng hơi nhiều "sugar syntax"

ruby:
(1..10).each do |n|
print n

python:
for i in range(1,11):
    print n

với mình phiên bản python dễ đọc hơn :D
mai tính tiếp :p

Ngày số 2: (ngại edit lại quá post tạm dạng thô vào đây)
tóm tắt: 
- tìm hiểu xem ruby gồm những tính năng chính nào, khác python ra sao
- tìm hiểu Ruby block, proc, lambda
- học theo 1 tài liệu tự chọn

http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
http://www.ruby-lang.org/en/about/

tớ cố tìm xem tác dụng của ruby sau khi ta đã học nó là gì. Cần một điều gì đó lớn hơn là 1 đống cú pháp, cần biết nó sẽ thay đổi suy nghĩ của mình như thế nào. Và vớ được câu hỏi này: Why learn Perl, Python, Ruby if the company is using C++, C# or Java as the application language?, câu trả lời tớ đã vote:
http://stackoverflow.com/a/89272/807703
I don't think anyone has mentioned this yet. Learning a new language can be fun! Surely that's a good enough reason to try something new.
Câu nói này không có gì mới với memb FAMILUG, nó đã ở ĐÂY từ lâu lắm rồi, và vẫn luôn đúng :D

Triết lý của ruby
http://en.wikipedia.org/wiki/Ruby_(programming_language)#Philosophy
http://www.ruby-lang.org/en/about/

Triết lý của python
http://en.wikipedia.org/wiki/Python_(programming_language)#Programming_philosophy
hay đơn giản mở console lên, gõ python, gõ import this.

var could be a local variable.
@var is an instance variable.
$var is a global variable.
-- http://www.ruby-lang.org/en/about/


doc của ruby
http://www.ruby-lang.org/en/documentation/
hãy kéo xuống phần Manuals và chọn lấy 1 quyển bạn nghĩ là ok, giờ ta không còn là newbie nữa
tớ chọn Ruby User’s Guide http://www.rubyist.net/~slagell/ruby/
quyển http://www.ruby-doc.org/docs/ProgrammingRuby/ đòi hỏi bạn phải làm từ đầu đến cuối vì nó thực hiện giải quyết 1 vấn đề chọn trước, qua đó giới thiệu các khái niệm của ruby cần dùng.

vài nhận xét: khi viết ruby, các câu lệnh điều khiển, khai báo hàm, lớp đều kết thúc bằng chữ end. Thế nên nếu editor của bạn không hỗ trợ auto-indent sẽ rất khó nhìn. Tớ dùng vim nên cái này không phải vấn đề gì đáng kể :D mặc dù code sẽ trông dài ra đáng kể với 1 loạt các dòng end end và end.

khi viết Python tớ hay viết kiểu C, tức không dùng class, chuyển sang ruby đang tập kiểu viết class ngay từ đầu. Cũng bởi ruby có cách tiếp cận OO hay hơn Python, nó không dùng các câu lệnh trông có vẻ không OO: len(my_list) mà là my_list.length

syntax của ngôn ngữ rất đơn giản (và hình như giống lisp)


Ruby block
block là 1 khái niệm hoàn toàn khác biệt của ruby đối với những người biết PHP, Python hay C. Bài viết này trình bày đầy đủ và chi tiết về ruby block
http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

lambdas check the number of arguments passed.
The second difference is that lambdas have diminutive returns
Procs in Ruby are drop in code snippets, not methods.
=> viết bài về closure và những nhầm lẫn về Procs, Methods, và Functions

http://www.rubyist.net/~slagell/ruby/examples.html
ruby không cần câu lệnh return vì nó sẽ tự động trả về kết quả cuối cùng nó tính tóan được trong hàm. (nếu không tính gì nó sẽ trả về nil)
method của ruby không cần phải gõ ()
It is unneeded because a ruby function returns the last thing that was evaluated in it. Use of a return statement here is permissible but unnecessary
ta sẽ down file http://www.rubyist.net/~slagell/ruby/eval.txt về và chạy
  ruby eval.txt  để có một "shell" gõ lệnh có màu mè, nếu không thích có thể dùng irb (gõ irb vào terminal)
 
   A double-quoted string allows character escapes by a leading backslash, and the evaluation of embedded expressions using #{}. A single-quoted string does not do this interpreting; what you see is what you get. Examples:
  
   note that characters are integers in ruby):
   ruby> word[0]
   102            # 102 is ASCII code of `f'
   ruby> s = "abcde"
   "abcde"

   ruby> s[0..1]
   "ab"
ruby> s[0,1]
   "a"

irb(main):001:0> ha = {1 => 2, "admin" => 123}
=> {1=>2, "admin"=>123}

puts # print


#  If you're used to C or Java, you might prefer this.
for element in collection
  ...
end

#  A Smalltalk programmer might prefer this.
collection.each {|element|
  ...
}
-- http://www.rubyist.net/~slagell/ruby/control.html

The verb iterate means to do the same thing many times, you know, so an iterator is something that does the same thing many times.

The for statement appearing in the previous chapter does iteration by way of an each iterator. String's each works the same as each_line
-- http://www.rubyist.net/~slagell/ruby/iterators.html


1. thực sự hiểu rõ khái niệm iterator và viết itorator 1 cách chóng mặt
2. trường hợp dùng các iterator khác nhau: "a\nb\nc" iterate qua từng chữ cái/ từng dòng

 yield moves control to the block of code that is passed to the iterator

the __iter__() method), or it must support the sequence protocol (the __getitem__() method with integer arguments starting at 0)
-- http://docs.python.org/2/library/functions.html#iter

http://www.rubyist.net/~slagell/ruby/iterators.html
viet lai: while, repeat.



SEO: hoc ruby, ruby tieng viet, tai lieu ruby, học ruby, ruby tiếng việt, tài liệu ruby, lap trinh ruby, lập trình ruby