熱門文章

2016年10月31日 星期一

[Rails]資料庫可以使用哪些資料型態?如何存array,json ?

Here are all the Rails 4 (ActiveRecord migration) datatypes:
  • :binary
  • :boolean
  • :date
  • :datetime
  • :decimal
  • :float
  • :integer
  • :bigint
  • :primary_key
  • :references
  • :string
  • :text
  • :time
  • :timestamp
If you use PostgreSQL, you can also take advantage of these:
  • :hstore
  • :json
  • :array
  • :cidr_address
  • :ip_address
  • :mac_address
They are stored as strings if you run your app with a not-PostgreSQL database.
Edit, 2016-Sep-19:
There's a lot more postgres specific datatypes in Rails 4 and even more in Rails 5.

[rails]do each 用法 (with index)

在ruby裡面,大家都用do each 的方法來完成其他程式的for 迴圈

基本的用法  each do


irb(main):013:0> a=[1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):022:0> a.each do |b|
irb(main):023:1* puts b    
irb(main):024:1> end
1
2
3
4
5
6
=> [1, 2, 3, 4, 5, 6]



這樣可以達到for loop的功效 且很簡短 不用再寫 當...大於...時..i++ 這麼長了
但,有一個問題,那當我要有 i++ 這樣遞增或遞減的序號時怎麼做?

答案很簡單  each_with_index do

irb(main):030:0> b=[12,22,23,44,66,22]
=> [12, 22, 23, 44, 66, 22]
irb(main):031:0> b.each_with_index do |b,index|
irb(main):032:1* puts "我是第#{index+1} 筆資料,為'#{b}' 謝謝"
irb(main):033:1> end
我是第1 筆資料,為'12' 謝謝
我是第2 筆資料,為'22' 謝謝
我是第3 筆資料,為'23' 謝謝
我是第4 筆資料,為'44' 謝謝
我是第5 筆資料,為'66' 謝謝
我是第6 筆資料,為'22' 謝謝
=> [12, 22, 23, 44, 66, 22]


參考:http://ruby-doc.org/core-1.8.7/Enumerable.html#method-i-each_with_index


畜牧業的陰謀






1.溫室氣體
-溫室氣體總排放量的18%來自畜牧業,超過運輸排放之總合。
-溫室氣體的總排放量,所有運輸業合計占13%。
-家畜及其副產品每年產生320億噸CO2,佔全球溫室氣體總排放量的51%。
-甲烷20年間的破壞力是二氧化碳的25到100倍。
-甲烷20年間之全球暖化潛勢為CO2的86倍。
-氧化亞氮(N2O)之生命期長達150年,其暖化效應為CO2的296倍,而人為排放中有65%來自畜牧業。
-畜牧業的溫室氣體排放量,預計2050年將增加80%。
-能源相關的溫室氣體排放量,預計2040年將增加20%。
-美國由牲畜排放的甲烷,與燃燒天然氣產生的相差無幾。
-牛每天產生5700億公升的甲烷。
-欲以風力和太陽能取代(非再生能源),將耗資43兆美元需時至少20年。
-即使不使用石化燃料,在2030年,畜牧養殖產生的等效CO2仍將超過5650億噸的年排放上限。
-減少甲烷排放對改善溫室效應有立竿見影之成效。

2. 水資源
-運用水力壓裂法開採天然氣每年使用約2600億~5300億公升的水資源。
-畜牧業每年使用約128~288兆公升的水資源。
-農業消耗美國80%~90%的水資源。
-牲畜飼料的栽植,消耗美國56%的水資源。
-加州人每日平均使用5700公升的水,近一半緣於食用肉品和乳品。
-生產半公斤牛肉耗水約9500公升 。
-生產半公斤雞蛋耗水約1800公升;生產半公斤起司耗水約3400公升 。
-生產4公升牛奶耗水約4000公升 。
-在美國,家庭用水佔5%;畜牧業用水佔55%。 
-畜牧業消耗全球1/3的水資源。

3. 土地
-地表1/3牧場及可耕地用於畜牧養殖及其飼料栽植。
-地表45%的土地供畜牧使用。
-畜牧業是物種滅絕、海洋死區、水源污染和棲息地破壞的頭號兇手。
-畜牧養殖產生的氮汙染,已導致全球超過500個海洋死區。
-畜牧業導致6千5百萬年以來最大規模的物種滅絕。
-每隻牛使用約「1~2公頃的土地」
-畜牧業使用美國近一半的土地。
-地球1/3的土地沙漠化,頭號殺手便是畜牧業。

4. 廢棄物
-在美國,畜牧養殖每分鐘產生3千噸的排泄物。
-一座有2500頭乳牛的牧場,產生的廢棄物相當於一座有41萬人口的城市。
-家畜產生的廢棄物為人類的130倍,在美國,有14億噸來自肉品業,相當於每人每年製造5噸廢棄物。
-畜牧業產生的大量廢棄物足以覆蓋舊金山、紐約和東京等城市。

5. 海洋
-全世界3/4的漁場已過度捕撈或枯竭。
-最遲2048年魚群將被捕撈殆盡。
-人類每年從海洋中奪取 9000萬~1億噸的魚獲。
-人類每年從海洋中捕撈2.7兆隻動物。
-額外5倍的動物因補魚而死並遭丟棄。
-約40%(每年290萬噸)的魚獲遭扔棄。
-科學家估計捕漁船隊每年殺害高達65萬隻鯨魚、海豚和海豹。
-每年全球漁獲量可高達8500萬噸。
-每年遭漁線及漁網纏絞至死的鯊魚有4千~5千萬隻。

6. 雨林
-91%亞馬遜雨林消失肇因於畜牧業。
-每秒便有0.5~1公頃的雨林被夷平。
-毀壞雨林的頭號殺手便是畜牧養殖及其飼料栽植。
-每日有 137種動植物及昆蟲因雨林濫伐而絕種。
-棕櫚油的生產砍伐了10萬平方公里的雨林。(3倍台灣面積)
-畜牧使用則已砍伐超過55萬平方公里的雨林。(15倍台灣面積)
-巴西在過去20年裡,有超過1100名土地保育者遭殺害。
-進一步了解桃樂西.斯唐修女的生平。(http://www.sndohio.org/sister-dorothy/)

7. 野生動物
-美國農業部殺害恐獵食牲畜的野生肉食動物。
-華盛頓州將野生狼群趕盡殺絕。
-野馬及野驢於政府飼育場內的數量較放養者更多。
-一萬年前,生態系有%99是野生動物;而今,98%為人類和經濟動物。

8. 人類
-畜牧業轉嫁4千多億美元的外部成本給社會大眾。
-美國80%的抗生素用於家畜。
-1812年的世界人口是10億;1912年是15億;2012年已到達70億。
-人類每年飼育700億隻經濟動物,每小時屠宰超過600萬隻動物作為食物。
-牛每日耗水超過1700億公升的水和6100萬噸的飼料。
-我們種植的作物足以餵飽100億人口。
-世界上50%以上的穀物用於餵養家畜。
-82%飢荒兒童居住的國家,其種植作物餵養家畜,以供應西方人食用。
-任何土壤用於植物栽植,及所能供給的蛋白質為用於肉類生產的15倍。
-每位美國人平均每年消耗95公斤的肉品。
-攝取乳製品會促發乳房腫塊。
-攝取乳製品可能導致男性女乳症。
-世界人口數每天增加22萬8千多人。 
-674平方公尺的土地可供給純素者一年所需的糧食;蛋奶素者需3倍;肉食者則需18倍。
-6000平方公尺的土地能生產17噸蔬食,卻僅能生產170公斤的肉。
-與典型肉食者相比,純素飲食產生的CO2僅50%,消耗僅1/11的石油、1/13的水及1/18的土地。
-純素飲食者每天能節省超過4000公升的水、20公斤的糧食、2.8平方公尺的森林、9公斤的等效CO2排放及拯救一隻動物的生命。


來源:https://www.youtube.com/watch?v=TtyRHb-WNp8&feature=share#t=5355.944126287

2016年10月17日 星期一

[Rails]AJAX筆記-使用內建方式

使用內建ajax的方法

  1. 在from_for 加入 remote:true
  2. 在controller的相對應action,加入format.js (create action)
  3. 新增相對應action的js擋( create.js.erb)











when there is a file field in a form is submitted via AJAX.
在使用Ajax時,如果form裡面有file_field遇到問題

ActionController::InvalidAuthenticityToken error. 



ActionController::InvalidAuthenticityToken in StoresController#create

Avoiding ActionController::InvalidAuthenticityToken on AJAX calls



Missing Authenticity Token in Remote Forms w/ File Upload Field(s) #22807




解決方法一:在form_for 加入  :authenticity_token => true
可以成功執行Create Action,但是不會以Ajax的方式執行

<%= form_for @some_model, :remote => true, :authenticity_token => true do |f| %>
<% end %>


解決方法二:

當form_for 改為 :remote=>true時 ,form 將不會包含 authenticity_token
因為以下預設值為false
config.action_view.embed_authenticity_token_in_remote_forms = false 


將其改為true即可修正錯誤

config.action_view.embed_authenticity_token_in_remote_forms = true
官方解釋
  • config.action_view.embed_authenticity_token_in_remote_forms allows you to set the default behavior for authenticity_token in forms with remote: true. By default it's set to false, which means that remote forms will not include authenticity_token, which is helpful when you're fragment-caching the form. Remote forms get the authenticity from the meta tag, so embedding is unnecessary unless you support browsers without JavaScript. In such case you can either pass authenticity_token: true as a form option or set this config setting to true.

2016年10月13日 星期四

[Rails][Gem] 搜尋引擎 searchkick

Gemfile 加入

gem 'searchkick'


bundle install

➜  eat git:(master) brew install elasticsearch
==> Downloading https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.4/elasticsearch-2.3.4.tar.gz
######################################################################## 100.0%
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/elasticsearch
/usr/local/bin is not writable.

You can try again using:
  brew link elasticsearch
==> Caveats
Data:    /usr/local/var/elasticsearch/elasticsearch_QJpioneer/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_QJpioneer.log
Plugins: /usr/local/Cellar/elasticsearch/2.3.4/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/Cellar/elasticsearch/2.3.4/libexec/bin/plugin

To have launchd start elasticsearch now and restart at login:
  brew services start elasticsearch
Or, if you don't want/need a background service you can just run:
  elasticsearch
==> Summary

🍺  /usr/local/Cellar/elasticsearch/2.3.4: 59 files, 29.4M, built in 1 minute 16 seconds


➜  eat git:(master) brew link elasticsearch
Linking /usr/local/Cellar/elasticsearch/2.3.4... 
Error: Could not symlink bin/elasticsearch

/usr/local/bin is not writable.



重新安裝 homebrew
➜  eat git:(master) /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"



再試一次

➜  eat git:(master) brew install elasticsearch
==> Using the sandbox
==> Downloading https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz
######################################################################## 100.0%
==> Caveats
Data:    /usr/local/var/elasticsearch/elasticsearch_QJpioneer/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_QJpioneer.log
Plugins: /usr/local/Cellar/elasticsearch/2.4.1/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/Cellar/elasticsearch/2.4.1/libexec/bin/plugin

To have launchd start elasticsearch now and restart at login:
  brew services start elasticsearch
Or, if you don't want/need a background service you can just run:
  elasticsearch
==> Summary

🍺  /usr/local/Cellar/elasticsearch/2.4.1: 60 files, 29.1M, built in 1 minute 14 seconds


查看安裝訊息

➜  eat git:(master) brew info elasticsearch
elasticsearch: stable 2.4.1, devel 5.0.0-beta1, HEAD
Distributed search & analytics engine
https://www.elastic.co/products/elasticsearch
/usr/local/Cellar/elasticsearch/2.3.4 (59 files, 29.4M)
  Built from source on 2016-10-12 at 06:08:24
/usr/local/Cellar/elasticsearch/2.4.1 (60 files, 29.1M) *
  Built from source on 2016-10-12 at 13:28:01
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/elasticsearch.rb
==> Requirements
Required: java >= 1.7
==> Caveats
Data:    /usr/local/var/elasticsearch/elasticsearch_QJpioneer/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_QJpioneer.log
Plugins: /usr/local/Cellar/elasticsearch/2.4.1/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/Cellar/elasticsearch/2.4.1/libexec/bin/plugin

To have launchd start elasticsearch now and restart at login:
  brew services start elasticsearch
Or, if you don't want/need a background service you can just run:

  elasticsearch


在最下方有啟動方式

To have launchd start elasticsearch now and restart at login:
  brew services start elasticsearch
Or, if you don't want/need a background service you can just run:

  elasticsearch


我使用第一個方式

➜  eat git:(master) brew services start elasticsearch
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
Checking connectivity... done.
Tapped 0 formulae (36 files, 46.1K)

Service `elasticsearch` already started, use `brew services restart elasticsearch` to restart.





接著在瀏覽器輸入:http://localhost:9200 可以看到以下資訊

{
  "name" : "Yandroth",
  "cluster_name" : "elasticsearch_QJpioneer",
  "cluster_uuid" : "KJCz3pnURXGzuM5Q2mCzlQ",
  "version" : {
    "number" : "2.4.1",
    "build_hash" : "c67dc32e24162035d18d6fe1e952c4cbcbe79d16",
    "build_timestamp" : "2016-09-27T18:57:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.2"
  },
  "tagline" : "You Know, for Search"
}


Add searchkick to models you want to search.
現在,將 searchkick 加入到要實現搜尋的model


     


接著 command line

rake searchkick:reindex CLASS=Store

出現警告
➜  eat git:(master) rake searchkick:reindex CLASS=Store
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)

DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)


ake searchkick:reindex:all
還是錯誤,但最下面有reindex 完成

➜  eat git:(master) rake searchkick:reindex:all        
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/QJpioneer/railsbridge/railsfun/ruby12weeks/eat/config/application.rb:7)
Reindexing Store...

Reindex complete



routes.rb

在該model 下加入

   collection do
  get 'search'
  end






Rails c

irb(main):002:0> Store.reindex
  Store Load (0.3ms)  SELECT  "stores".* FROM "stores" ORDER BY "stores"."id" ASC LIMIT ?  [["LIMIT", 1000]]
  Store Import (154.7ms)  {"count":13}

=> true



➜  eat git:(master) rake routes

就可以看到

           search_stores GET    /stores/search(.:format)                     stores#search






2016年10月8日 星期六

[JS]什麼是 element.style ?



我想要修改下圖左側的星星為一行,但是我發現我從更改css width 卻無法變動。
一直看到一個 element.style 的width: 100px;
而css 設定的被阻擋掉了。



後來google找到這篇
https://www.drupal.org/node/229348

element.style is the style that's defines on the element - directly - using style=""
It's the royal flush of element selectors. It's the most specific, un-over-ridable setting.
It's in the source!
so it's coming from the jquery code itself, written in at runtime. And nothing to do with Drupal or your theme for that matter.
You gotta debug jCarousel to find out why it thinks that's a good size. Maybe its calculations are wrong, or maybe it's just hard-coded some padding it thinks looks beter.
You should have seen it in the DOM inspector.

大意就是說這個寬度是由 jquery 即時產生的,所以覆蓋掉css的寬度設定。只能從原本的jquery檔案裡面去更動。
jquery.raty.js 底下,後來在102行找到,將寬度乘上3倍!


更改後的樣子








[Rails]ActiveRecord::Migration - 改變欄位資料型態

Step 1:
Generate a new migration file using this code:
rails g migration sample_name_change_column_type
Step 2: 
Go to /db/migrate folder and edit the migration file you made. There are two different solutions.
  1. def change
        change_column(:table_name, :column_name, :new_type)
    end
2.
    def up
        change_column :table_name, :column_name, :new_type
    end

    def down
        change_column :table_name, :column_name, :old_type




    end
Step 3:
Don't forget to do this command:
rake db:migrate


實際操作:
在command 下,新增migration 檔案
➜  eat git:(master) rails g migration sample_name_change_column_type
Running via Spring preloader in process 74424
      invoke  active_record

      create    db/migrate/20161008204016_sample_name_change_column_type.rb

在sublime text 開啟

自行修改欄位,依序是資料表名稱、欄位名稱、新的資料型態。

在此示範的是將 reviews資料表裡的rating欄位改成float 資料型態。
 change_column(:table_name, :column_name, :new_type)



在command 下

➜  eat git:(master) rake db:migrate
== 20161008204016 SampleNameChangeColumnType: migrating =======================
-- change_column(:reviews, :rating, :float)
   -> 0.0064s

== 20161008204016 SampleNameChangeColumnType: migrated (0.0065s) ==============


在rails c 下測試
可以看到紅色處由integer改為float

irb(main):002:0> a = Review.last
  Review Load (0.2ms)  SELECT  "reviews".* FROM "reviews" ORDER BY "reviews"."id" DESC LIMIT ?  [["LIMIT", 1]]
=> #<Review id: 14, rating: 3, comment: "3.5", created_at: "2016-10-08 08:15:48", updated_at: "2016-10-08 08:15:48", user_id: 3, store_id: nil>
irb(main):003:0> a.rating.class
=> Fixnum
irb(main):004:0> a.rating.class
=> Fixnum
irb(main):005:0> exit
➜  eat git:(master) rails c
Running via Spring preloader in process 74494
Loading development environment (Rails 5.0.0.1)
airb(main):001:0> a= Review.last
  Review Load (0.2ms)  SELECT  "reviews".* FROM "reviews" ORDER BY "reviews"."id" DESC LIMIT ?  [["LIMIT", 1]]
=> #<Review id: 14, rating: 3.0, comment: "3.5", created_at: "2016-10-08 08:15:48", updated_at: "2016-10-08 08:15:48", user_id: 3, store_id: nil>

irb(main):002:0>