Ruby 板


LINE

http://blog.xuite.net/retsamsu/diary/35334603 不過這個blog很久沒更新了(也沒空哈哈) 之前作一些project的心得,大家勉強看看吧~ 使用ruby也有一點時間了,最近大改一個之前寫的程式,發現有很多的心得, 想跟之前的心得合起來記在這,供日後的參考。 ruby是一個日本人Yukihiro Matsumoto(matz)開發的Object-Oriented Script Language,在新版的RPGMaker裡可以使用ruby寫腳本。如果你已經會了perl, shell scripts,java等語言,這個東西將很容易上手(我的第一個程式就是改廠商的 perl程式成ruby版本,至於為什麼要改,大概是主管對perl 的奇怪偏見吧:))。 以下是使用ruby 1.8(on fedora core 3)來寫作的心得。 一般來說跟perl的寫法幾乎一模一樣,只有一些地方不一樣(我碰到的): 1. 變數前面一般來說不用加$,因為加$是global變數。 hello # local variable $hello2 # global variable @hello3 # instance variable,可從其包含該值得object得到該值 HELLO4 # constant variable 2. 字串裡秀變數值,或是要把值從變數拿出來時,就在變數上加上#{}就可以 把值拿出來了。 puts "hello: #{var_1}\n" #印出含var_1的字串 3. 敘述句結束也不用加;號。 4. if-then-else-end,for,loop,更加的靈活。 2000.times { do_something } # 做2000次 do_something for i in collection # collection可以是一堆數字,一堆array... ... end 5. try-catch exception處理。使用rescue,raise等解決。 begin f = File.new("abc") ... rescue puts "files abc can not be created.\n" end 基本上我碰到修改與perl不同的大概就是這些。接下來就是實作程式時得到的一 些心得。我把原來的perl程式改寫成了一隻multi-thread的daemon,碰到了不少 問題,以下就是我的心得。 1. ruby連結mysql:裡面並沒內建連結mysql的函式,要去安裝ruby-mysql。 使用方法也很簡單,如下所示。 require "mysql" ... my = Mysql::new(mysqldbhost, mysqldbuser, mysqldbpasswd, mysqldbname) res = my.query(sql_query_language) res.each do |row| col1 = row[0] col2 = row[1] ... end 基本上我用的大部分是傳回一個hash,然後再根據名稱找值。 2. 建立一個daemon:用fork,loop就可以完成。加一個pid比較好控制。使用-kill 只會把之前的process砍掉。 # 外部呼叫砍掉之前的process if ARGV[0] == "-kill" then # pidfile存在,先把之前的process砍掉 if File.exists(pidfile) then f = File.open(pidfile) previus_pid = f.readlines()[0].to_i f.close Process.kill("SIGHUP", previus_pid) end exit end # pidfile存在,先把之前的process砍掉 if File.exists(pidfile) then f = File.open(pidfile) previus_pid = f.readlines()[0].to_i f.close Process.kill("SIGHUP", previus_pid) end # 寫新的pid到檔案裡 f = File.open(pidfile, "w") f.write("#{Process.pid}\n") f.close #主程式daemon開始 fork do loop do daemon_main_procedure end end exit 3. Thread的使用:ruby提供一系列的Thread函式,不過因為主程式沒有等其他 thread做完的特性,老是主程式馬上結束了,但是其他thread沒做完(其他thread 作一些IO與存取資料庫的動作)。一開始有想要用join,來等其他的thread,但是 被發現這樣其實不太像thread(一個一個做),結果使用array與while loop就可 以達成。 to_do_list = "" ... Thread.new(){|t| to_do_list.push(t) do_thread_thing to_do_list.pop(t) } while to_do_list.length!=0 # spin lock end 4. 使用pop3:因為我的程式有去讀信的動作,因此使用此函式,不過因為後來覺得 如果使用者很多的時候pop3 server會爆掉,然後原來的程式在consistence上會有 很大的問題,就用其他的方法了。 require 'net/pop' ... pop = Net::POP3.new(pop3server) pop.start(pop3user, pop3passwd) do |pop| msg = pop.mails[0] header = msg.header body = msg.gsub("\r\n\r\n") # 兩個enter後為內文 ... pop.mails[0].delete # 砍掉mail end pop.finish ... 5. 因為之前4的問題,因此改採直接從本地端的mailbox(/var/mail/username)來讀信。 好加在ruby有solution,差點又要回去找perl了:) 這樣一來也比較快,而且不會用到pop3 server,也減少被try站的機會。 require 'mailread' ... mailbox = File.open("/var/mail/username") until (m = Mail.new(mailbox)).header.empty? header = m. header body = m.body end File.truncate("/var/mail/username") # 砍掉mail 最後,說一下這個ruby其實還蠻好用的,不過文件總是很亂,也沒什麼固定的 (我覺得的),不過ruby-doc mailling list有人發起重新寫文件的計畫,希望能 寫的更好,讓programmer查的更方便。 Posted by retsamsu at 11:18.Sep 3, 2005 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.209.4
1F:推 fayhong:沒錯... ruby 文件很亂....XDDD 05/19 18:34
※ 編輯: retsamsu 來自: 140.113.209.4 (05/19 22:07)
2F:推 retsamsu:修改一下標題符合版規 05/19 22:07
3F:推 K60258:推 好 10/31 00:53
※ 編輯: retsamsu 來自: 140.113.209.21 (06/25 02:44)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP