2013年2月15日 星期五

改寫一支用Ruby 寫的大量快速 ping 的程式

年紀大  記憶力不好  記一下筆記做紀錄........

約莫在一年前    網管工作有個需求
希望能及時得知所有新北市連線學校 L3 與 Firewall 偵測即時連線狀態
最早期寫的版本是呼叫系統的 ping
但因是線性的
整個跑完需要約 25 分鐘    有夠慢  不夠及時
後來改寫成一個多執行緒版本
將他編譯成 windows 可執行檔
方便工程師除錯用

在教網環境下
多執行緒版整個跑完只需要 25 秒
從 internet 執行  也只需約 30 秒
執行時間僅需線性版的約不到 2% 時間
偵測結果也較為即時

最近需求也有些異動     因此著手改寫程式
原本的程式是在 Ruby 1.8.7 下寫的
新的電腦環境 Ruby 是1.9.1
對了 需安裝 net-ping library
結果悲劇發生......


挖    竟然主要的函式庫不支援 Ruby 1.9  挖哩咧......
好   冷靜     找另一台 PC 
裝上 Ruby 1.8.7
gem install  net-ping  成功   
再執行一下程式

咦  奇怪  之前執行這之程式 沒提到需要這個 library (也許之前已經有裝了  我也不知道???)
失敗   還得要安裝一個  win32-security
好吧    gem install win32-security
再執行一次    喵的咧    還是失敗

我的天啊  居然是 library 原始碼就有錯
這個 library 也太.....
居然逼我要去改原始碼
路徑在 Ruby1.8.7\lib\ruby\gems\1.8\gems\win32-security-0.2.0\lib\win32\security
改寫  sid.rb  第262行  "use_ptr"
後面逗號去掉  存檔
再執行一次  咦?  還是不行?

google 了許久   才發現原來需要再安裝 windows-pr
gem install windows-pr

最後這個程式需要在系統管理員權限下執行
再裝個 ocra library  打包成 exe檔
大功告成

我的心得是:
Ruby 每個 distribution 打包套件差異甚大
且許多函式庫相依性甚高  也依賴不同的 Ruby 版本平台
沒 A函式不能跑,後來裝了A才知道還要裝B函式
B函式裝完還需要裝C函式
過程還真的是有點瑣碎  許多地方得注意
一度想用 Python 改寫
但發現  好像也挺麻煩的
所以還是偷懶一下
乖乖用 Ruby 囉