2015/07/28
postgreSQL gem安裝失敗解決方法
brew update
brew install postgresql
gem install pg
2015/06/04
Rails 4.1的 Devise設定
安裝devise
在gem file中加入devise
使用 devise產生 user的model
rails generate devise user
手動新增Migration的欄位
first_name, last_name, nickname, address...
建立資料表
rake db:migrate
使用 devise產生 user的 view
rails generate devise:views
將views/devise/registrations底下的form加入自訂欄位
edit.html.erb 還有new.html.erb
跳脫Rails 3限制 mass assignment的作法是在 user model中加入attr_accessible
但在Rails 4則是要在user的controller中加入存取params的private method,加入可讓使用者存取的欄位
def user_params
params.require(:user).permit(:username, :email, :password, :password_confirmation)
end
Rails 4的 Strong parameters說明:https://github.com/rails/strong_parameters
接著使用migration開始建立user跟其他資料表的關係
rails generate migration add_user_relations_to_other_tables
add_column & add_index 完成後 rake db:migrate
2014/08/09
Ruby中的 replace跟 assign
舉例來說:
a="this is A"
b=a
這時候 a物件是"this is A"的 string
b物件是"this is A"的 string"
這時候重新 assign A
a="A had been changed"
此時來檢視b,b物件依舊是 "this is A"的 string,不會因為 a重新 assign受到影響
但如果從一開始
a="this is A"
b=a
a.replace("A had been changed")
這時候檢查 b
b物件就會自動的連動變成"A had been changed"的string了
2014/03/29
Ruby中string運算 methods
puts "first" + "second"
顯示
firstsecond
*
puts "first"*3
顯示
firstfirstfirst
<< 組合concatenate
puts "first"<<"second"<<"third"
顯示
firstsecondthird
<<與+的差異在於
1st_string = "first"
2nd_string = "second"
puts 1st_string + 2nd_string
puts 1st_string
puts 2nd_string
顯示
firstsecond
而puts 1st_string << 2nd_string
puts 1st_string
puts 2nd_string
顯示
firstsecond
firstsecond
second
用<<會將後者的string內容組合到前者的字串後端
在Ruby中的string其實被看待為array,因此array的method都可拿來用
str="abcde"
puts str[0]
puts str[1]
顯示
a
b
記憶體中分配的函數是字串中的ASCII號碼(DEC格式),使用puts的時候則會顯示出字元,所以在Ruby1.9環境的IRB中會看到ASCII的號碼,但到了Ruby2.0之後的IRB則是顯示字元
gets 等待鍵盤輸入分配
gets.chomp 等待鍵盤輸入分配後,去除前後端空白與分行值
gets.chop 等待鍵盤輸入分配後,去除後端空白與分行值
inspect會用""顯示字串中包含escape符號&特殊字元的完整字串資訊
include?("test string") 檢查是否包含字串"test string"
replace("replacement")會重新分配字串覆蓋原始值
index("partial")計算出partial example在字串中的序列位置
reverse 反轉字串中序列順序
upcase 全大寫
downcase 全小寫
swapcasee 改變大小寫狀態
length 計算string中的字元數,包含空白
size 計算string中的字元數,包含空白
split(" ")可用" "空白來分組Array中的成員,預設為"",也可改用","來拆csv等檔案
concat()跟<<一樣,在後方組合string
而在這些medhod後面加上!會永久改變參數值,!稱為Bang method
如
original_string = "original"
puts original_string.reverse
puts original_string
original_string.reverse!
puts original string
顯示
lanigiro
original
lanigiro
Ruby中String的特殊字元 \n, \t, \b, \v
\n 跳行
puts "first\nsecond"
顯示
first
second
\t 同於tab跳格
puts "first\tsecond"
顯示
first second
\b 等同backslash 往前刪除一個字元
puts "first\bsecond"
顯示
firsteond
把second的s給刪除了
\v 跳行接著顯示
puts "first\vsecond"
顯示
first
second
Ruby中的String分配語法
單引號:需要escape字元,無法interpolation(呼叫函數)
string_example = 'I love \'PIZZA\''
puts string_example
會顯示 I love 'PIZZA'
puts 'the user ID is #{user_id}'
會顯示the user ID is #{user_id}
雙引號:可以加入interpolation(呼叫函數)
"the user ID is #{user_id}" 可呼叫instance variable
採用雙引號來 puts "hello\nworld"則會顯示
hello
world
其中的\n可順利分行
[q決定是否啟用interpolation]
interpolation_value = "interpolation value"
string_example = %{showing #{interpolation_value}}
puts string_example
會顯示 showing interpolation value
string_example = %q{showing #{interpolation_value}}
會顯示 showing #{interpolation_value}
而把{}改成||也有同樣的結果
如用 =%|| 或=%q||來分配字串
[command line中分配]
string =<<- ABC
An apple is an apple,
and this is the second line
ABC
=<<- 啟動字串分配
ABC 這個全部大寫的代號來設定開始&結束
puts string 會顯示
An apple is an apple,\n
and this is the second line\n
其他\n為跳行符號
2014/03/28
Ruby 參數命名慣例
Ruby 保留字分類清單
[Truthy value/Boolean]
2013/06/13
物件導向程式簡述
物件導向程式設計 Object Oriented Programming第一次聽到的時候覺得好可怕,現在稍微理解一些,跟各位剛接觸 Progaming的朋友分享一下我的認知邏輯。
在圖片中我們看到三個大方塊,等於是三個層級的 Class,用一個容易理解的例子來看
動物 > 靈長類 > 人類
就可以看到上一層的 Class有許多特性,下一層的會有,例如在人類那一層可能會有其他的 class如大金剛。
為什麼寫程式的時候會想要這樣分層級呢?最大的好處是可以少寫很多程式碼。怎麼說呢?
各位可以看到圖片中的 Class後面,有functions跟 properties,先從properties來說..
動物、靈長類、人類有些共同的特點,例如,早晚會死掉。我在跟電腦定義這三個物件的時候,用物件導向的邏輯來規劃,只需要寫在動物那一個層級,這樣電腦就知道下面的物件,不論是靈長類、猴子或人類,早晚都會死掉。
所以在規劃的時候將每個物件的層級規劃好,我們可以把每個物件都共同會用到的公開資料、共同特性(限制、反映),還有共同可以做的事情(Function/Methods根據不同的語言定義有些不同,在此先不管)。就可以用來模擬許多現實生活中的資料互動規則,例如讀者都可以借書,然而我們看到每一個層級比較低的物件都可以另外定義自己專用的功能與屬性,拿讀者這個分類來說,我們可以往下建立一個教授身份的讀者,他們可以借書的數量就可以設置比較多,借閱時間比較長。
一般來說會將這種由上往下傳的屬性叫做繼承(inheritance),意思是上一層的屬性,下面會有,下面的屬性,不會往上傳。繼承的架構,有"一對一"與"一對多"兩種,我們用一個例子來重新瞭解"一對多"還有屬性不會往上傳的概念,馬跟驢他們兩種層級所產生的下一代“騾”的屬性繼承,就是“一對多”的一種表現,馬跟驢的某些特性都傳給了“騾”,而“騾”的屬性並不一定會往上傳遞。
各位可能會想,如果馬的屬性有一條“斑點 = 很多“,而我們需要定義“騾”沒有斑點怎麼辦?物件導向程式設計的邏輯是,我們這時候在“騾”的屬性定義好”斑點 = 沒有“就可以覆蓋掉上一層的包袱。用這樣的方式來規劃,我們可以從上層既成許多已經寫好的程式碼,在必要的時候加以修改下層物件的特殊屬性與功能即可。
然而對於如 Ruby這樣 1 to 1的程式語言,使用的方式則是用 mixin將其他的class的methods跟 property整合進來,或者用 require把其他原本屬於封閉的 module內容拉進去。許多人喜歡將一個大的系統給 abstract為很多很多 layer,就跟photoshops一樣,這樣往後需要抽換、刪除、修改、整合各個 layer中的程式碼,比較容易,而且不會造成系統太大的影響。
以上,報告完畢:)
2013/03/04
Windows 中Command line切換字碼方法:chcp
chcp 938/5033 繁體中文
chcp 936/5031 簡體中文
chcp 437 美國英
chcp 65001 UTF8
Windows很怪,會固定在65001 UTF8那邊,所以要改回950的時候需要變化一下字體關閉、重開才能固定回950。
2013/03/03
Rails 3.2.x出現 OpenSSL::SSL::SSLError錯誤之救急方式
Bundle install或者 bundle update的時候出現OpenSSL::SSL::SSLError錯誤訊息。
可將 source 'https://rubygems.org'修改成 source 'http://rubygems.org'
閃過 OpenSSL這個問題,不去解決它。
2013/01/07
優化 Rails效率 by Richard Schneeman
筆記整理自 My Server for Aiur: How Starcraft Taught Me To Scale by Richard Schneeman
http://www.youtube.com/watch?v=4wvtvc0C2SY
1. Don't queue web requests
2. 監測 Database/language/GC哪一端拖垮效率
3. Measure in production
*N+1 query
*在 Production config中加入監測指令
config/production.rb
config.
active_record.
auto_explain_threshold_in_seconds =
1
4. Add indexes
*New Relic
*Scout
5. Cache Expensive query
*Memcache [Building a Rails 3 Application with the Memcache Add-on]
*Rails.cache & Rails.cache.fetch("cache_key")
不要濫用
6. View Caching
cache最小單位
cache_digests gem <--rails4
7. avoid premature optimization
incremental improvement
Fast day Friday <--focus on speed every Friday
8. Split up Web/Workers/Datastore
將Database/web server分在不同的機器
Workers用第三方機器,或者改用排程,在空檔進行
active_queue <--Rails 4
9. 不夠用的時候怎麼辦
Scale UP
Scale Out : Ephemeral Web machines 不在 Server儲存 State
$ heroku ps:scale web=6
將state存在database/session/s3
10. Database怎麼 Scale
Master DB <-->Slave DBs
Split data to multiple DB machine
*Shared Data還是沒辦法 (facebook用MySQL, Instagram用 PostgreSQL)
建議閱讀: 7 databases in 7 weeks
11. Client side優化
JS, CSS:CDN,GZIP,縮小檔案大小
Content Distribution Network :Images/JS/CSS在各國 server
可使用 Akamai或 Cloudfront, 設定為
config/production.rb
config.action_controller.asset_host =
ENV["cloudfront_url"]
Browser caching
*Expires headers 把這些資訊在cache中保留久一點
config/production.rb
confib.static_cache_conrol=
"public, max-age=2593000"
*Rails assets fingerprints
config/production.rb
confib.assets.digest = true
建立MD5檔案
一般檔案: headers.css
有 fingerprint的檔案: headers.91234j12342341.css
Browser將會以新檔案對待
12. 總結
使用YSlow工具來測量前端表現 [Chrome , FireFox, 官網]
Don't block page parsing
Measure memcache, More-Instances!!
講者更多Rails教材: http://www.youtube.com/watch?feature=player_embedded&v=KDwElEeakuU
2012/12/10
Ruby中的 Expression
{} #{key}用來呼叫 key中的 value
array.each { |x|, puts}來執行 array中每一個 key
[a,b,c] 用來表示 array, array中文字需要加上雙引號"", 數字則直接寫就好
array[0] 則表示呼叫 array中第一個value
array中可包含 array如 array=[["nick","marry",3],["alright","baby",4]]
存入hash:hash["name"]="Mick"
呼叫hash中 key對應 value puts hash["name"]
(a,b,c)置放在 method後來指定 ARGVs
比較
== 等於
!= 不等於
>= 大於等於 *大於要放前面
<=小於等於
布林
|| 或者 or
&& 以及 and
! 非 not
2012/12/01
Ruby 文字資訊清單精簡寫法 %w()
names = [ "西瓜", "香蕉", "冬瓜"]
如果為了容易閱讀或者往後修改方便,通常會建議格式調整為
names = [
"西瓜",
"香蕉",
"冬瓜"
]
但當所有的資訊都為文字串的時候,就可以使用 %w()來省去雙引號跟逗點。
names =%w(西瓜 香蕉 冬瓜)
當然要修改為更容易閱讀的格式也可調整如以下,連空格都可省去。
names =%w(
西瓜
香蕉
冬瓜
)
當然在程式碼中使用中文的時候可採用 utf8碼來閃過亂碼的問題唷:Ruby中解決中文字碼 UTF8的方法
Ruby中解決中文字碼 UTF8的方法
1. 在文字編輯器中記得指定編碼為UTF8,如UltraEdit預設為ASCII。
2. 可在 rb檔案前端加入以下程式碼:
#!/bin/env ruby
# encoding: utf-8
3. 使用 magic_encoding這個 gem在所有的rb檔前端加入 UTF8編碼資訊
sudo gem install magic_encoding
2012/11/30
Ruby中的 Loop方式
比較常使用的 Loop方式有九種
1. Loop
最傳統也常見的 loop指令,指定起始的 number序號,每次執行過程中 number序號自動加上1,同時在前端加上 break if讓序號大於指定數字時中斷執行,這是七種方式中最不像 Ruby的 loop方式。
** Ruby自動產生的數字由 0開始,而不是 1
***中斷方式Break if
2. until
指定起始的 number 序號,使用 until number 大於指定數字持續的 do,每次執行過程中 number序號自動加上1。這種方式不需要加上 break,可以少打幾個字。
除了數字之外,until也可以用條件來決定flow。
3. While
指定起始的 number 序號,使用 while number 小於指定數字持續的 do,每次執行過程中 number序號自動加上1。這種方式也不需要加上 break。或者用條件式處理:
4. times
當我有一串數字或文字資料,依照清單中的數量一個一個接著執行。
例如:
6. each (range)
跟list.each的差別在於,rage著重在一段連續的序列值的運用。可以使用兩個整數代數的區間差異來決定 loop的頻率。
**兩個數值中間放兩個點跟三個點的差異在於
兩個點= count till 算到最後一個值
三個點 = count before 算到最後一個值<color=red>之前<\color>
7.for
for兩個數值之前 do,主要也是用在兩個代數中間的次數當作 loop的次數。
今天又看到兩種寫法,於此補充(可與for比較)
依照一個清單中的資訊數量來當作執行的次數
詳見 %w用法。
在Loop中如果要跳過某些 Array中的資料或序列的時候,可以用 NEXT IF
最後附上一個簡單的密碼產生器寫法,非常的不精簡,但比較容易讓剛接觸 Ruby的朋友們看得懂:)