My experience of Ruby Education in TaiwanMu-Fan Teng
- Mu-Fan Teng introduced himself as the founder of 5xRuby, an education company in Taiwan that teaches Ruby and Rails.
- He discussed the growing Ruby job market in Taiwan, with both local and foreign companies hiring Ruby developers at increasing salaries. However, there remains a lack of experienced senior developers.
- 5xRuby offers a variety of courses, from free introductory classes to a commercial 13-week Ruby on Rails course. They also provide customized corporate training and outsourced development services.
- Through his teaching experience, Mu-Fan highlighted challenges like inconsistent student skill levels and environment issues, and solutions like using cloud-based development environments and online communication tools. He emphasized that education
This document introduces WebSocket and how it can be used for real-time communication between a client and server. It discusses:
1. The basics of WebSocket including how the handshake process works and how events and messages are exchanged.
2. Two approaches for integrating WebSocket into a Ruby/Rails application - as a standalone service or within the application stack. Using it standalone allows the service to run independently while integrating it brings challenges in handling long-running connections.
3. Key considerations for WebSocket including authentication, concurrency models, and whether the server process needs to run permanently to maintain open connections.
The document discusses using Ruby on Rails to extend the community features of the popular Discuz! forum system. It provides an overview of how to integrate a Rails application with Discuz! by mapping models and sharing the session, and summarizes some options for the technical implementation including using AJAX, iframes, or operating completely outside of Discuz!. Key aspects that are mapped between Rails and Discuz! include forums, topics, posts, members and the session.
50. 練習1 puts 'Hello there, and what apos; s your name?' name = gets.chomp puts 'Your name is ' + name + '? What a nice name!' puts 'Pleased to meet you, ' + name + '. :)'
109. CASE aaa = [ 1 , 'abc' , 1.3 ] p aaa printf( ' 你要確認哪一個 ?' ) idx = gets.to_i case aaa[idx] when String puts " 這是一個字串 " when Integer puts " 這是一個整數 " when Float puts " 這是一個浮點數 " when Numeric puts ' 這是一個數字 ' else puts " 這是其它類型的物件 " end
110. 三元運算子 EXPRESSION ? (True Condition):(False Condition) a = 10 ; b = 100 a > b ? ( "#{a} > #{b}" ):( "#{a} < #{b}" ) #=> "10 < 100"
111. 迴圈 10 .times do puts ' 那很好啊 ' end for i in 1 .. 10 puts i end x = 100 while x > 10 x = x - 10 puts x end x = 100 until x <= 10 x = x – 10 next if x == 50 # 跳過下一步繼續 puts x end abc = [ 1 , 2 , 3 ] loop do abc.pop p abc break if abc.empty? # 跳出 end
141. 定義類別 class Duck def initialize (name) @name = name end def quack # 實體方法 "#{ @name } is quacking!" end end d = Duck .new( ' 唐老鴨 !' ) puts d.quack # 唐老鴨 ! is quacking! 建構式 ! 物件實體變數
142. 定義類別 class Car @@amount = 0 def initialize (name) @name = name @@amount += 1 end def name= (val) @name = val end def name @name end def self . amount @@amount end end c1 = Car .new( ' 霹靂車 ' ); c2 = Car .new( ' 火戰車 ' ) c3 = Car .new( 'Focus' ); c3.name = 'Focus ST' puts " 現在有 " + Car .amount.to_s + " 台車了 " 物件類別變數 實體方法
143. 類別定義內也可以執行程式 class Car @@amount = 0 def initialize (name) @name = name @@amount += 1 end attr_accessor :name def self . amount @@amount end end class Car @@amount = 0 def initialize (name) @name = name @@amount += 1 end def name= (val) @name = val end def name @name end def self . amount @@amount end end =
144.
145.
146. 私有/保護 定義方式 class Abc def pub ... end def priv ... end def prot ... end private :priv public :pub protected :prot end class Abc public def pub ... end private def priv ... end protected def prot ... end end =
150. 繼承類別 class Vehicle attr_accessor :tires end class Tire attr_accessor :size end class Car < Vehicle def initialize (name) @tires = [] 4 .times{ @tires << Tire .new} end end class Motorcycle < Vehicle def initialize (name) @tires = [] 2 .times{ @tires << Tire .new} end end
151. 探索繼承類別 c = Car .new( 'Mondeo 2.0' ) puts c.is_a?( Vehicle ) #true puts c.class.superclass #Vehicle
152. 走訪迴圈 langs = [ 'VB' , 'C#' , 'C' , 'JavaScript' ] langs.each do |lang| puts " 我會 #{lang}" end 輸出: # 我會 VB # 我會 C# # 我會 C # 我會 JavaScript
170. 練習4 class String def find_capital_letters s2r = '' self .each_char{|c| cc = c[ 0 ].to_i s2r.concat(c) if cc >= 65 && cc <= 90 } return s2r end end puts 'SUSE Linux' .find_capital_letters
171. Yield and Method 在函式中使用 yield 來執行 code block def test_block puts "I love Ruby ," yield end test_block{ puts 'Ruby loves programmers!' } # 顯示 I love Ruby , Ruby loves programmers!
172. Yield and Method 在函式中使用 yield 來執行 code block def to_div (times) buffer = '<DIV>' times.times{|x| yield (buffer, x)} buffer.concat '</DIV>' end divhtml = to_div( 3 ) do |buf, x| buf.concat "<p>No.#{x+1}</p>" end puts divhtml # <DIV><p>No.1</p><p>No.2</p><p>No.3</p></DIV>
185. Module for Singleton Class module HtmlHelper HTML_ESCAPE = { '&' => '&' , '>' => '>' , '<' => '<' , '"' => '"' } def self . h (s) s.to_s.gsub( /[&"><]/ ){ |special| HTML_ESCAPE [special] } end end puts HtmlHelper .h( '<img src="abc.gif"/> 我是圖片 ' ) #<img src="abc.gif"/> 我是圖片
186. Module for Namespace module Forum class Member # 類別全名為 Forum::Member .... end class Topic #Forum::Topic end end
187. Module for Mix-in 多重繼承之實現 module ShareMod def subject ... end end class Forum include ShareMod end class SubForum include ShareMod end #Foum 和 SubForum 都會有 subject 的 instance method 間接實現了 多重繼承
188. 動態型別 (duck typing) 不管黑貓白貓,會抓老鼠的都是好貓 class PersianCat def find_mice # 抓老鼠 end end class RussianBlueCat def find_mice # 抓老鼠 end end
191. define_method class Movie def initialize (id, name) @id = id @name = name end QualityNames = [ :fullhd , :hd , :sd ] # 定義 fullhd_movie_file, hd_movie_file, sd_movie_file # 三個方法 QualityNames .each do |qt| define_method "#{qt.to_s}_movie_file" .to_sym do return "/movies/#{qt.to_s}/#{ @id }.mp4" end end end a = Movie .new( 123 , ' 阿凡達 ' ) puts a.hd_movie_file #/movies/hd/123.mp4
192. Domain-Specific Language 領域特定語言 Class MyApp < Sinatra :: Base get '/books/*.*' do # matches /books/ruby-guide.html end get '/rooms/:id/index.html' do # matches '/rooms/123/index.html end end HTTP 動詞對應網址樣式, 即可做 WEB 伺服器的處理
193. Method Missing class Wheel attr_accessor :radius def initialize (radius) @radius = radius end end class Car attr_accessor :wheels def initialize @wheels = [] 4 .times{ @wheels << Wheel .new( 30 )} end def method_missing (mname, *args) if mname.to_s =~ /wheel ( )/ return @wheels [ $1 .to_i] end end end my_car = Car .new p my_car.wheel_1 #<Wheel:0x8f6dea4 @radius=30> Car 並不預設 wheel_1 執行 method_missing
203. 練習5 class TextFileSearcher def initialize (fn) @file_path = fn end def search_word (word) open( @file_path , 'r' ) do |fc| while line = fc.gets line.downcase! ar = line.scan(word.to_s) unless ar.empty? puts "#{line} meets #{word} #{ar.size} times." end end end end end tt = TextFileSearcher .new( 'r.txt' ) tt.search_word( 'ruby' )
231. 傳遞變數到 Template get '/array' do @arr = [ "aaa" , "bbb" , "ccc" , "ddd" ] erb :array end <% @arr .each do |item| %> <p> <%= item %> </p> <% end %>
232. POST FORM get '/' do erb :index end post '/query' do params[ :keyword ] end <form action = "/query" method = "post" > <p><input type = "text" name = "keyword" value = "" ></p> <p><input type = "submit" value = "Submit" ></p> </form>
238. 練習6 #t6.rb require 'rubygems' require 'sinatra' get '/' do erb :index end post '/' do @text = params[ :text2parse ].gsub(params[ :word ], "<b>#{params[ :word ]}</b>" ) erb :post end
239. 練習6 #index.erb <form action = "/" method = "post" > <input type = "text" name = "word" value = "" /><br/> <textarea name = "text2parse" cols = "100" rows = "20" ></textarea><br/> <input type = "submit" value = " 送出 " /> </form> #post.erb <p> <%= @text %> </p>
246. 建立DB 編輯 db/migrate 下的第一個 .rb class CreatePosts < ActiveRecord :: Migration def self . up create_table :posts do |t| t.string :author t.string :subject t.text :message t.timestamps end end def self . down drop_table :posts end end
266. 也DSL化 namespace :gameclub do desc " 自動移除論壇的操作 " task :daily_remove => :environment do Billboard .should_remove.each do |bbs| if bbs.destroy puts " 成功刪除論壇 ID#{bbs.id}, #{bbs.full_url}" else puts " 刪除論壇 ID#{bbs.id}, #{bbs.full_url} 失敗 !" end end end end rake gameclub:daily_remove
276. 7 Actions URL VERB 用途 /posts get 列表 /posts post 建立新留言 /posts/:id get show完整留言 /posts/:id/edit get 進入編輯頁 /posts/:id put 提交修改 /posts/:id/delete get 刪除 /posts/new get 新增頁面
277. REST-STYLE URL PATTERN URL 行為 實體/類別 VERB /posts 無 類別 get /posts 無 類別 post /posts/:id 無 實體 get /posts/:id/edit edit 實體 get /posts/:id 無 實體 put /posts/:id/delete delete 實體 get /posts/new new 類別 get
278.
279. require必要的lib require 'rubygems' require 'sinatra' require 'active_record' $DBCONFIG = YAML ::load File .open( "config/database.yml" , 'r' ).read ActiveRecord :: Base .establish_connection $DBCONFIG [ "development" ] Dir .glob( 'app/models/*.rb' ).each{ |f| require f} get '/' do redirect '/posts' end
280. CONTROLLER get '/posts/new' do #new @post = Post .new erb :new end get '/posts' do #list @posts = Post .all erb :index end
281. CONTROLLER put '/posts/:id' do #update puts " 到了 put #{params.inspect}" @post = Post .find(params[ :id ].to_i) if @post .update_attributes( :author => params[ :author ], :subject => params[ :subject ], :message => params[ :message ]) p @post redirect "/posts" else erb :edit end end
282. CONTROLLER get '/posts/:id' do #show @post = Post .find(params[ :id ].to_i) erb :show end get '/posts/:id/delete' do #delete @post = Post .find(params[ :id ].to_i) @post .destroy redirect "/posts" end post '/posts' do #create puts " 建文章 " @post = Post .new( :author => params[ :author ], :subject => params[ :subject ], :message => params[ :message ]) if @post .save redirect "/posts" else erb :new end