跳到主要內容

發表文章

twitter-bootstrap-rails使用font awesome

twitter-bootstrap-rails 已經把 font awesome 編譯在裡面了,不過用法有點不一樣,我是上stack over flow才知道, ,這種更動沒有寫在README裡面誰知道啊 這邊是 標準font awesome 的用法 譬如 <i class="fa fa-anchor"></i> 不過用twitter-bootstrap-rails編譯在裡頭的font awesome要這樣用 <i class="icon-anchor"></i> 第一個fa不用,第二個fa改成icon 或者直接使用它的Helper <%= glyph(:anchor) %> 用Helper是比較簡潔一點

ssh 直接複製到檔案結尾 (ssh append to file)

scp 沒辦法,scp會直接覆蓋。rsync沒辦法,會讓兩個檔案同步變成一模一樣... 這時候就只好用ssh 原始操作方式 ssh user@remote "要處理的指令" 那麼就簡單了,如果要抓取遠端的檔案,附加到本地,那就在遠端使用 cat 指令,然後用 >> 修改資料串流附加到本地的檔案不就行了嗎?沒錯 ssh user@remote "cat filename" >> /LocalPath/FileName 那我就舉一反三,資料串流改用 > 就是複製!!! ... 對不起,脫褲子放屁了,直接用 scp 或 rsync 不就好了... 這邊就是發現 scp 或 rsync 只能複製,我們才去找可以附加檔案的方式,別又把這個方法,重新拿回去當複製的的功能用,有句名言 當你手上拿著鎚子,你就覺得任何東西都像釘子 好,剛剛是抓遠端檔案附加到本地,那反過來,抓本地檔案附加到遠端呢?我上查到了一個很神奇的用法 cat local-source-file-name | ssh user@some.domain “cat >> remote-target-file-name“ 得改用管線的指令,如果用 ssh user@some.domain “cat >> remote-target-file-name“ < cat local-source-file-name ,一定失敗,因為那串指令會通通送到遠端去執行, cat local-source-file-name 這個指令也是在遠端執行,根本不是 cat 你本地的資料。 總結: 遠端到本地,直接ssh 遠端 cat 檔案 >> 本地檔案 本地到遠端,要做管線,cat 本地檔案 | ssh 遠端 cat >> 檔案

安裝zsh + oh-my-zsh 出現 /usr/bin/env: zsh: 沒有此一檔案或目錄 (/usr/bin/env: zsh -: No such file or directory)

zsh 跟 oh-my-zsh 安裝完,可能會出現類似下面錯誤訊息,雖然他沒任何影響,不過我總覺得怪怪的 # 中文系統 /usr/bin/env: zsh: 沒有此一檔案或目錄 # 英文系統 /usr/bin/env: zsh -: No such file or directory 通常會出現這類的訊息,都是指令找不到。 這邊指zsh這個指令找不到,試試看輸入 which zsh 看看是不是沒有把zsh這個加到 $PATH 裡面,沒有的話加入就好了。 如果加入了一樣找不到,我trace了一下zsh的執行過程,通常都是跟 oh-my-zsh 的安裝順序錯了的時候才會發生。 這時編輯家目錄底下檔案 vim ~/.zshrc ,會看到 # 他先執行了oh-my-zsh.sh source $ZSH/oh-my-zsh.sh # 然而oh-my-zsh.sh已經在使用zsh這個指令了 # 這裡才把宣告路徑,所以當然zsh指令找不到 export PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin:/root/bin:/usr/local/bin" 這時就把它們兩個對調一下就好了 # 像這樣把 export PATH 放到 source $ZSH/oh-my-zsh.sh 上面 export PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin:/root/bin:/usr/local/bin" source $ZSH/oh-my-zsh.sh # 這樣oh-my-zsh.sh裡面就可以用zsh指令了 存檔後,登出再進來,他就可以正常使用zsh指令,不再出現這種錯誤訊息了

CentOS zsh 自行編譯

CentOS用yum安裝的zsh版本有點舊,這邊記錄一下,怎麼下載自己安裝 # 下載最新版的 zsh (筆下日期 2014/03/11) 並存檔為 zsh.tar.bz2 wget http://sourceforge.net/projects/zsh/files/latest/download\?source\=files -O zsh.tar.bz2 # 解壓縮 tar xvjf zsh.tar.bz2 # 你的版本不一定是5.0.5,我筆下日期 2014/03/11 到5.0.5版,你的可能更新 cd zsh-5.0.5 # 普通編譯流程,configure後 看缺什麼lib 裝一裝 ./configure make sudo make install # 把"/usr/local/bin/zsh" 這串字加到 sudo tee -a /etc/shells 裡 echo "/usr/local/bin/zsh" | sudo tee -a /etc/shells # 上面那一步 你的 chsh -l 才查得到zsh # 可以切換到/usr/local/bin/zsh 了 chsh -s /usr/local/bin/zsh # 重新登入 shell就切換過去了 exit # and relogin # 跟bash一樣,放個.zshrc檔案在使用者根目錄,讓系統進入zsh前讀取 touch ~/.zshrc # 你的變數 或alias就可以加在這裡面了 # 有點跟bash不一樣的地方是,沒有.zsh_profile,讓系統只讀第一次的檔案 # 如果你有裝oh-my-zsh,建議直接建立軟連結(上面那一步touch就不用做了,做了就先把~/.zshrc刪掉就可以了) ln -s ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

Linux系統which與type指令,對比$PATH與Hashed路徑

我安裝Ruby後,為了搞定路徑花了老半天,後來弄懂了Linux指令在 which , type , $PATH 與 Hashed 就清楚多了。 如果你的系統有內建Ruby,打 which ruby ,會發現他的路徑在 usr/bin/ruby 底下,接著不管你用了什麼方法裝了新的Ruby,就把新的路徑在$PATH裡加到 usr/bin 的前面,系統通常就預設執行在$PATH裡面,放在前面先找到的那個Ruby。 但是有個情況,你加了$PATH以後沒有用,系統還是一直去執行舊的Ruby。可是打 which ruby 明明就是新的路徑呀? 我遇到的情況是這樣打 type ruby 會發現 ruby is hased(/usr/bin/ruby) ,這是什麼意思呢?為什麼 which ruby 跟 type ruby 的路徑會不一樣。這種情況是 ruby 這個命令,在系統一開始就被寫在系統的hash table裡面。這邊簡單分類一下 which 跟 type 的不同: which: 單純從$PATH裡面尋找到的路徑。 type: 指令真實被執行時使用的路徑。 which 只是單純顯示在$PATH, type 才是真實下命令按Enter後去執行的路徑。 所以安裝了新Ruby,可是系統若之前就把Ruby放在hash table裡面,他就會一直執行舊版本的Ruby,這時候只要重登目前這個Shell,讓hash table refresh一下就好了。如果還是不行,系統不曉得寫在什麼地方,他就是喜歡自動把舊Ruby放到hash table裡面。那就只好手動改了,在bash底下執行: hash -r #清掉hash table裡所有的資料 上面這樣子是全清掉,全部的hash table重新建立。或者也可以像下面這樣: hash -d ruby #單純在hash table清掉Ruby 這樣子hash table裡面沒有 ruby 了,系統就得乖乖執行$PATH裡面找到的 ruby 囉。 不只有ruby唷,不管安裝什麼 php , python 還是 sqlite 之類的,如果跟系統預設衝突,而且還是放在hash table裡面的,都可以用這個方法解決路徑的問題

陣列洗牌程式(shuffle array)

陣列如何把它的順序打亂,作出類似洗牌的效果,我一直都很頭痛,搞得非常的複雜。至從用了Ruby,Array物件包含 shuffle 方法之後,我就沒思考過陣列洗牌的問題了,反正Ruby幫我處理得好好的。 Ruby # 52張牌的牌堆 poker = (1..52).to_a # => [1, 2, 3, ... , 52] # 洗牌打亂 shuffled = poker.shuffle # => [22, 32, 12, ... # 也可以直接打亂原來的陣列 poker.shuffle! # => [39, 47, 3, ... Javascript Javascript我就頭痛了,我得自己寫洗牌的方法。我在網路上找到了這個演算法,仔細看了之後,才知道原來洗牌可以這麼簡單: // 原本for迴圈是一行程式,太難理解,這邊改寫成多行 function shuffle(o){ for(var j, x, i = o.length; i;){ j = Math.floor(Math.random() * i); // javascript的array是0-base // 所以迴圈第一次進入,--i後表示陣列最後一個位置。 x = o[--i]; o[i] = o[j]; o[j] = x; // 以上三行代表以x為temp, o[i], o[j]做交換 } return o; //回傳陣列,我一開始也看錯看成回傳0 }; 變數說明 引數o: 將被洗牌的陣列 for迴圈內 i : 將會從陣列的最後一個位置,慢慢往前移到第一個位置(但移到第一個位置時for迴圈不執行,因為Javascript的數值0也代表false,會離開迴圈。0代表flase這點跟Ruby不一樣) j : 將會被亂數選擇,選到要被交換的位置 x : 用來暫存o[i]的數值,幫助o[i]與o[j]做數值交換 就這樣從最後一個位置開始,依次往前隨機挑選一個位置與它交換(可能挑到自己,表示不交換),來達到洗牌的效果,陣列多大,就執行幾次,時間複雜度 O(n) ,...

Rails 在CSS裡使用圖片

暴力法 反正最後都會被編譯在public下面,可以下 rake assets:precompile 指令,看看最後圖片被放到哪裡去了,通常都在 public/asset 底下,而網頁伺服器的根目錄是 public/ 所以你的css就直接把圖片定位在 /assets/ 底下,例如: .your_class { background-image:url('/assets/your_img.png'); } 非常不建議用這個方法,程式碼非常不靈活 內嵌Ruby法 在Rails裡面,你的檔案想要內嵌Ruby,只要把檔名結尾加上 .erb ,就可以最常見的就是 page.html.erb ,但可沒這麼簡單唷,就連CSS檔以可以內嵌Ruby,一樣把你的CSS加上 .erb ,譬如 style.css.erb ,這樣CSS內就可以使用Ruby了。 既然可以使用Ruby了,那就大膽的把Rails內建的Helper拿出來用吧, asset_path("img.jpg") ,就行了,例如: .your_class { background-image:url('<%= asset_path("your_img.png") %>'); } 這樣至少靈活多了,至少你不用擔心Rails編譯之後,會把你的圖檔放到Public的哪裡去,被改了什麼檔名。 SCSS法 Rails預設使用SCSS,你打開你的Gemfile就可以看到了,預設已經有 gem 'sass-rails' ,在Rails的CSS裡面取圖,我推薦這個方法,因為這個方法程式碼最簡潔: .your_class { background-image: image-url("your_img.jpg"); } 發生什麼事?沒錯使用SCSS的話, image-url("your_img.jpg"); 就行了, image-url 是Rails的Helper,可別跟CSS原生的 background-image:url(your_img.jpg); 給搞混囉 .your_class { /* 這個是Rails的Helper */ back...