2010年10月21日 星期四

remote git get back for the future


以後要更小心 不然很麻煩

想把小更動併進上一次的commit,一般來說只要做soft commit 就好了。但問題是我在上一回的commit後就push上github,併了新變更的commit和上傳的版本不同。push上去一回是災難,要是有人想pull下來又是另一場災難。於是順便被做了機會教育。

在local branch裡,再做一支branch(後面代稱二號枝)。把原本已經變動的一號枝用git rebase、像是剪下貼上一樣貼去二號枝。原本的一號枝再pull一次remote,讓兩邊資料同步。

再到二號枝,用git rebase將新的變動貼回一號枝。一路由git rebase做兩邊資料的合併(決定分叉部份的code去留),也就是將git merge的工作拆開逐步作業。結束後原本的一號枝就能繼續無痛同步remote,二號枝也能砍了。

這就是上面地鐵圖的由來。

2010年10月14日 星期四

[memo]mysql can't find /tmp/mysql.sock on Mac 10.6

裝mac的mysql(brew install mysql)時遇到的問題 記錄一下解法

brew install mysql

    mysql_install_db
    cp /usr/local/Cellar/mysql/5.1.47/com.mysql.mysqld.plist ~/Library/LaunchAgents
    launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist
    #mysql_secure_installation
    mysqladmin -u root password 'new-password'
    mysqladmin -u root -h MacBook-Pro.local password 'new-password'

2010年8月17日 星期二

把Ubuntu的gedit改成適合Railist的模樣

Rails又寫了一段時日。愈來愈多的plugin與gem逼迫我開始脫離使用NetBeans。雖然NetBeans仍有辦法做到支援gem下的rake等工作,但中間花的代價感覺實在不值得、不如先罷手不用NetBeans、順便練習原始的指令法。

於是開始用起vim與gedit...後來發現有人寫過適合網頁編程人員用的gedit,改一改倒也能抵過不少NetBeans的重點功能(比如我很依賴的autocomplete)。今天又挖到一個更棒的東西,GMate。照作者的說法。這主要是參考Rails界有名的textmate(這支IDE的最佳代言人就是RailCasts站長Ryan)。包括縮排、render切割等Rails常用的手續都有做,對於使用Ubuntu的Railist如我真的是很棒的福音\OvO/

2010年8月10日 星期二

繼承,多型,多對多表單指定的用法

情境解題:

一個流程有三階段的作業單要填寫(Order , Buildup , Endup ),中間都會經過驗收簽名(Check_order , ect)。
驗收簽名的資料都相似,因此利用Model繼承讓他們住在同一個資料表(Checklist)。利用N:M的多對多接續(參照)。
Rails的多對多是利用欄位名默認對照,但現在子資料表己經變成多型,從上方的表單無法找到指定的驗收資料。一般教學不大常提到這點,昨天花了點時間才試出。




#最上頭的Model Order.rb

#has_one :check_list , :as => :table
#過去一般用到這行,指定checklist便可,但現在要做的是指定checklist下的check_order,直接用下方的指定便可

has_one :check_order , :as => :table , :conditions => ["type = ? " , 'CheckOrder']


#中間層的Checklist.rb

self.inheritance_column = :type #歸類三種子表格的欄位名

belongs_to :check_order
belongs_to :check_buildup
belongs_to :check_endup


belongs_to :table , :polymorphic => true


#最下層的check_order.rb Class名改掉繼承便可
class CheckOrder < CheckList end

2010年7月27日 星期二

authlogic memo

記錄自己常用的authlogic設定


#  關閉email驗證

  acts_as_authentic do |c|
    c.validate_email_field = false
  end

2010年5月27日 星期四

[Gem]實作spread sheet

每個工程師都會遇到的挑戰就是處理微軟派的資料(在這裡假設你不是用微軟的作業系統在寫程式,this is Ruby on Rails blog!:D) 我在需求名單下剛好就有客戶說要有由Excel檔匯資料入庫的功能,於是從roo一路尋找,直到找出spread sheet。但真正實作卻是這週才做好的。

因為本人有點IO恐懼症。看了老半天的RubyIO,實在是不想這樣慢慢磨。於是直接開一個Model用Paperclip處理檔案上傳的問題(因為也剛好有三種EXCEL表要處理,開一個Model還不算太浪費(藉口啊!))

檔案可以穩定上傳後(Paperclip教學請參見RaislCasts,非圖型檔案只要再放上檔案位址便能直接連結下載)。再來就能開始寫匯入了,參考官網的說明。簡單的說我要做的就是抓出我要的資料頁並指定從哪一行開始,再來行迴圈與陣列應用create 或update便可。


這是做好後的結論。在還沒做好前,我一直遇到can't dup NilClassundefined method `XXXX' for nil:NilClass等等的問題。

後來實驗出來的結論如下:官網的教學手冊一切都沒有錯,但是你的Excel要是有巨集或是自訂的選擇器可能會引爆炸彈(我被這個炸了好幾次,後來特別存了把auto filter都關掉的版本試、總之盡量讓你的Excel表陽春,至於如何讓客戶方便使用我還在研究);中文匯入一切沒問題、想避開空資料就自己過濾一下Nil也罷;你的日期只要格式看起來有點像、欄位會自動幫你轉好格式(但是如果填的是民國年次就要再自己加個11年,因為自動轉是幫你加上1900年lol);在炸程式時先確認是否自己的model都有下對(三種表格寫到亂的下場就是欄位一直看走眼,欄位名稱下錯當然也是死路一條...)

如果你不要做匯入的動作,直接開啟顯示在畫面也可以。總之切記迴避Nil insert,一切都平安。

2010年3月30日 星期二

取消php的1440秒閒置逾時

在php.ini下找到
session.gc_maxlifetime = 1440
再自行調整

使用find方式

find 位置 -name 檔名

2010年3月12日 星期五

Searchlogic with prawn &2

這幾天在寫一份表單。因為懶惰‧於是舖了一張不經過post request的表單。再用searchlogic過濾條件,動態顯示客戶要的資料(基本教學見railscast)。記錄一下做這些事所遇到的問題

由於搜尋條件有一項是要用月份過濾,而日期格式的轉換實在是沒那閒時間慢慢研究,最後直接用Custom associated scopes的named scopes去定義所有月份,sql語法採用「month(欄位) = 月數」,取前端的boolean值確認條件(我是很想直接數字切進named scopes,但searchlogic的說明書內找不到方法,才會用此下策先做出個可用的替代品)

之後再加上prawn&prawnto(我必需要說我愛蝦子,這工具花了我兩小時就把第一張表格含下面會提的連結印出來),前陣子初次練習時不知哪裡鬼打牆...我猜說不定就是因為那時OS還是window...一直不順利,這次用半小時初步的畫面就做出來了(參考上連結,如果覺得Ryan的教學太神奇,這裡還有一篇比較簡易的教學文,另外還要注意這些教學都沒提到routes的format定義問題,如果發現網址一直吐錯誤,很可能是routes沒有設定網址的規格)
另外中文使用者還需要注意到,使用prawn時,得自己在gem內補上中文字型(參考),再到pdf的頁面下設定字型PATH

pdf.font "#{Prawn::BASEDIR}/data/fonts/LiHeiProPC.ttf"

最後是以前從沒遇過的問題,要在有searchlogic的參數下輸出pdf。假設搜尋後的url是http://lo.cal.host/reprot?search=xxx,那pdf的網址要是 http://lo.cal.host/reprot.pdf?search=xxx

要能印出上面這種網址,最後也是用暴力破解法:
request.path_parameters['controller'] +".pdf?"+ request.env["QUERY_STRING"]

我提過了...我的基本功很差的...為了查request有哪些能用,就花了我一小時....(參考見此)

引一下筆記

@client_ip = request.env["HTTP_X_FORWARDED_FOR"] #取得使用者的IP地址
@client_browser = request.env["HTTP_USER_AGENT"] #取得使用者浏览器信息
@http_referer = request.env["HTTP_REFERER"] #取得使用者來源(referer)
@client_language = request.env["HTTP_ACCEPT_LANGUAGE"] #取得使用者支持的语言
@server_port = request.env["SERVER_PORT"]
@request_uri = request.env["REQUEST_URI"]
@content_length = request.env["CONTENT_LENGTH"].to_i
@rails_relative_url_root = request.env["RAILS_RELATIVE_URL_ROOT"]
@script_name = request.env["SCRIPT_NAME"]
@request_method = request.env["REQUEST_METHOD"]
@path_info = request.env["PATH_INFO"]
@query_string = request.env["QUERY_STRING"]
@server_software = request.env["SERVER_SOFTWARE"]
@https = request.env["HTTPS"]
@potocol = request.env["HTTP_X_FORWARDED_PROTO"]
@content_type = request.env["CONTENT_TYPE"]

2010年2月25日 星期四

UBUNTU下匯入mysql(Big Dump)

遇到大型sql script 無法用phpmyadmin匯入時 最快的方法就是下下指令讓它一行行執行

但現在要下個指令也沒那麼容易

從SUSE改至UBUNTU後 又為了匯入35MB的SQL檔傷透腦筋

mysql -S /var/run/mysqld/mysqld.sock -u帳號名 -p ohya < ohya.sql


參考裡提供UBUNTU下的mysql.sock的相關設定

然後對照錯誤訊息扣除不該有的空table與架構

另備一下:開啟遠端連結 以及授權連結

2010年1月29日 星期五

complex form in TABLE

在照著RailsCast的Complex Form(現在要參考Nested Model Form了).因為自己需要寫在表格(TABLE)內,為了要讓分頁能乖乖一行行排在表格內,需要做點修改。

然後就這樣摸了兩個月(死眼)。

先看魔術表演的說明書

<%= link_to_function "新增資料" do |page| page.insert_html :after, :repairdetail , :partial => 'editdetail' , :object => Repairdetail.new
end %>


page.insert_html後面 after一參數為指定要第二個參數 repairdetail 的畫面標籤要after他(也可before等,railsCast是用div 在這裡我是指定tr標籤,對我的關鍵就是要換成tr T_T。順便一提,tr標籤就沒有bottom或top的用法了,會沒有反應),然後再呼叫partial分頁名,內容是Repairdetail.new

就這樣,因為沒有基礎而卡了那麼久,想來就嘔……

2010年1月22日 星期五

[bug]正常返回前頁

session[:original_uri] = request.request_uri

原本拿來作為返回上一頁的功能.卻在修改程式不久出現嚴重的問題.會自己連去莫名的地方

解法已忘了在哪裡找的.簡單來說.因為routing裡有不健康的link.因此卡住.最後自己找到.是因為我將新加的javascript內圖片砍除.但語法內連結還在.只要把連結清乾淨就行了