2016年10月28日 星期五

git的各種還原方式

使用git時常會遇到還原問題,要如何回復到某一個commit,或取消commit、add

我整理的個人筆記如下

git checkout HEAD filename  
# 只針對一個檔,commit,addj都刪掉,回到當次commit;檔案修改的內容也會刪掉

git reset HEAD filename  
# 取消add的動作。但是commit後就固定了。

git reset 的三個參數選項
git reset SHA
# 不會動到檔案內容。但是git 的commit流程/次數/進度,會回那個 SHA。
# 在那個 SHA之後的add, commit就會取消。有三個選項。
# 預設/沒打選項會取消add, commit,檔案不變。

git reset SHA --mixed
# 只取消add的動作

git reset SHA --soft
# 只取消commit;add動作和檔案修改都還在

git reset SHA --hard  
# 全部回到SHA那次的commit;檔案內容也是



只刪掉add記錄:

git reset HEAD filename
# 取消add動作,回到最近一次commit,但不會改檔案

git rm --cached 檔案名稱
# 還沒commit ,可以移除git索引中的內容;變成untracked以後不會再更新git;
# 但不會刪原檔案

註:SHA就是git log 出現所有commit記錄時,每筆commit後那一長串英數混合字串,如:
$ git log
commit c1050b8d522e37591b6d4706baacb9aa8fbc87ea
Author: Lee-KangChen
Date:   Fri Oct 28 15:06:45 2016 +0800

使用時只要打前七個字就可了。
如:
git reset SHA --hard  
註:使用前請自行測試

2016年10月27日 星期四

Model 關聯的筆記

Rails的 Model 主要用來設定 table 之間的關聯

關聯有:一對一、一對多、多對多

一對一,最簡單
比如一個男生擁有一個女朋友,注意都是單數

# app/models/boy.rb

class Boy < ActiveRecord::Base

  has_one :girlfriend

end



# app/models/girlfriend.rb

class Girlfriend < ActiveRecord::Base

  belongs_to :boy

end



一對多,假設一個男生有很多女朋友(舉例而已不要激動),要注意到has_many後面接的是複數,因為是一對多
# app/models/boy.rb

class Boy < ActiveRecord::Base

  has_many :girlfriends

end



# app/models/girlfriend.rb

class Girlfriend < ActiveRecord::Base

  belongs_to :boy

end




多對多的觀念比較複雜

舉例來說有一個男生班和一個女生班,於是我們有兩個 table 各自記錄男女生的資料

男生班的男生,和女生班的女生約會,約會記錄就要記在另一個date table

因為一個男生可能和很多女生約會,一個女生也可能和很多男生約會,總之一次約會一筆記錄,如下(同樣請注意單複數)

# app/models/boy.rb

class Boy < ActiveRecord::Base

  has_many :dates

  has_many :girls, through: :dates

end



# app/models/girl.rb

class Girl < ActiveRecord::Base

  has_many :dates

  has_many :boys, through: :dates

end



# app/models/date.rb

class Date < ActiveRecord::Base

  belongs_to :boy

  belongs_to :girl

end



date table至少有三個欄位,id, boy_id, girl_id;它自己的id做為約會序號,以及記錄該次約會是哪個男生女生的boy_id, girl_id

這個date table就是join table


還有一個多對多的設定方法 has_and_belongs_to_many
# app/models/boy.rb

class Boy < ActiveRecord::Base

  has_and_belongs_to_many :girls

end



# app/models/girl.rb

class Girl < ActiveRecord::Base

  has_and_belongs_to_many :boys

end


這在實務上很少用,因為你不能去設join tbale的欄位,略知即可

2016年10月24日 星期一

Controller Action 的筆記

Rails 透過 Controller 來溝通 Model 和 View

Controller 做為資料庫和表單的中介,具體的做法是在其中做出類似副程式的Action。

像這樣

# app/controller/posts_controller.rb
def index
  @posts = Post.all
end

右邊的大寫 Post 物件代表資料庫的Post table(如果你對理論有更多興趣,這叫ORM物件),點後的 all 是此物件的方法,就是它做的動作。

左邊的@posts 則用來連到view裡,在app/views裡的同名資料夾(複數)裡面,和Action 同名的erb檔裡面(如 index action 對應 index.html.erb)

# app/controller/posts_controller.rb
# app/view/posts/index.html.erb
# 這兩個是對應的。


注意,兩邊的變數名稱要相當。如果new action裡用 @post 那new.html.erb 裡也要用@post

變數名稱 = 物件名稱.方法

Rails 就是這樣連資料庫的。


Action 共有七個:
index, new, create, show, edit , update, destroy

其中new, create 是同一組用來新增資料列; edit , update是同一組,用來修改資料

new作用在表單, create 作用在資料庫; 同樣地,edit 作用在表單, update作用在資料庫。

其他的Action故名可以思議。index叫出table的所有資料、show列出其中一筆。

掌握到這裡,就大致了解 rails 裡 view - controller - DB之間的互動關係。

呈現在view的資料都是從資料庫來的,資料庫則裡controller連過去;model 則是主要設定table之間比如一對多的關係。

2016年10月19日 星期三

Xdite 直播筆記 20161019_如何上癮?實現自我價值。


先講結論:
X大的理論很簡單,學到東西,趕快拿去用,趕快做出來,趕快產生效果,趕快產生回饋。行動-正面回饋/自我實現,變成循環,就上癮了。

http://v.youku.com/v_show/id_XNzczODAyMTc2.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0
X大大說她看了這個遊戲上癮症自白的影片後,得到「實現自我價值-造成上癮」的結論,也將她的認知填補完整。

本次直播主題:實現自我價值,會造成上癮
問:如何上癮?
答:就是實現自我價值!
行動實現自我價值-造成上癮!
其他只是小手段!
學東西,讓你學到到的技能趕快實現自我價值!就會上癮!

以上是直播內容。這次的直播很短,但餘韻和反思卻很長。


以下我的感想。

自我價值/成就感/證明自己,這些字都是很相關相近的。

上面X大大的觀念,套用在學習上,流程應該是樣:學到技能-行動產生效果-得到稱讚/報酬/成就感/實現自我價值。行動得到正面回饋,你就會再行動嘛,一再recycle,就上癮了。

正向回饋=成就感=證明了自己=自我實現。

講結論:
X大的理論很簡單,學到東西,趕快拿去用,趕快做出來,趕快產生效果,趕快產生回饋。行動-正面回饋/自我實現,變成循環,就上癮了。

如果你在學畫畫,那就每天拿畫冊到處畫,什麼都畫,畫了給人看,或者傳上網,得到讚,就是正回饋。

如果是學程式,寫出小工具、寫出網站,給人觀看使用。趕快弄出來東西產生效果,產生回饋。

學做菜也是做出來找人試吃,而不是天天在紙上研究食譜。

那麼如果學習沒有正回饋/成就感什麼的,會怎麼樣呢?

我的經驗是,技能是學成了,可是卻不會那麼熱中地去天天做,就放著。等於沒有把你學會的技能發揮最大價值,很可惜。

當然你一定會擔心,回饋不是正向的怎麼辦?被笑、被譏諷怎麼辦?被潑冷水怎麼辦?

通常大部分的回饋是正向的。

有極少部分人會回饋你如何做會做得更好,這時候你雖然會很不爽有人居高臨下來指導你,但是要放下我執,理性的去分辨參考,可能真的會有幫助。要知道無關的人願意給你資訊,是很值得感謝的。

至於無意義的謾罵、沒有建設性的話語什麼的,就不用浪費時間注意。

現在講的是初學者的狀況-保持初心/熱忱,是最重要的。至於要如何成為高手大神,就是另一個題目了,我也想知道。如果你知道,請務必告訴我。


PS.文章開頭的影片非常棒,是一個遊戲上癮者到自我實現者的生命歷程,很值得一看。


另,我想通了另一個觀念,很重要,非說不可。

因為,正向回饋=成就感=證明了自己=自我實現。

於是我導出了自我實現的道路

簡單說,重覆的成就感,造成自我實現。

當你做一件事得到正向回饋-得到成就感;當成就感一再出現,會影響自我認知。

比如你學畫,當你畫了一副畫,得到正向回饋-成就感;於是你一畫再畫,然後你的自我認知就改變了。你從「我畫一副畫畫得不錯」變成「我是一個會畫畫的人」。

再來分析一下「自我實現」這個詞。自我是名詞,實現是動詞,那後面還缺一個名詞啊!缺什麼?缺了你要實現什麼,你要成為什麼!

自我實現就是我轉變成什麼。因為你實現了某個特質/潛能,所以你轉變成什麼。你發揮繪畫潛能,成為畫家。發揮理性思維能力,成為程式設計師⋯⋯

我轉變成什麼是自我認知的改變,這個自我認知是現實的回饋造成的。因為你在現實當中實現了你的潛能,所以就叫自我實現。

結語:

自我實現的道路,就是在重覆的正向回饋中前進,得到現實回饋,並造成自我認知的改變。

方法:

你已經找到自我實現的道路了,就是去做。

這話有沒有很熟悉?

快去做,做出來,生效果。

以上。

2016年10月18日 星期二

Xdite 直播筆記 20161018_讓自己掉坑

本直播主題:如何讓自己掉坑

提問:遊戲為何讓人上癮?
答:因為遊戲有套路。

遊戲的套路在於:做這個會得到那個,重覆去做,會展開世界規則;人沉迷下去就一兩小時,玩一兩天才會刪掉。這就是手機遊戲的生命週期。

周郁凱:玩家之旅四時期
1,dicovery 發現這個遊戲
2,onboarding 用戶接觸-達成好印象,得到勝利
3,scaffold 用戶知道所有規則和選項,讓他達到small win
4,end game 都會,無聊了

讓人上癮的遊戲特性:
有很多small win,按這個得那個;剛開始都很簡單,莫名其妙就會得到很多獎勵;然後獎勵愈來愈少,你知道會出現什麼,又無聊了。
但有些人會繼續玩下去,因為當他感到無聊時,系統出現一些變動獎勵,造成沉迷。

Xdite(自述)為何會喜歡fremwork?
因為xdite是SA,安裝架站的困難基本不存在(如何架站對被學者是大問題),故很快進入small win;然後被scaffold震撼,安裝了一些gem,覺得自己是天才;他買一本書,教你用rails做社群網站,照做,寫出來很震撼!接著用了兩星期做了諷刺網站very XD,結果大紅;很多好運-變動獎勵滾滾而來;後來做很多小網站-得到更多獎勵,就著魔了。

歸納職業運動員-學成專業的人,都會在某個點得到相當大的變動獎勵,而且會有非常密集的變動獎勵,就著魔,成為職業。

因此,如何讓自己著魔?
1,初速足夠大;按既有理論去做,初速會不夠大-很慢才拿到samll win,故你不會著迷;應該要這樣做:隻字不漏抄教程,抄框架,得到第一次勝利,就會自己被自己騙是天才;就是讓自己很快有small win。
2,scaffold 這階段會讓你感覺無聊;如rails也要學很多技術;不如為自己製造變動獎勵

Xdite的獨特心得:如何讓自己上癮?
就是去做好事。實施意義和使命感:不要只想學技能,要想說學技能是為了一個更偉大的事情;比如他學教學法,是為了教很多人rails,很多人可以利用此技能去改變世界,因為要做這件事,就會更無私去幫人

被你幫助的人會反饋你,甚至會擦撞奇妙的火花。
做好事會生出隨機的獎勵,你會上癮,所以會重覆做。

利用技能-去做好事-觸發獎勵

不要只教初學者,最重要是拿技能去做更偉大的事!而不是滿足於教新手-會很慢升級。

免費教程式不見得是好事,因為教學雙方有付出,不然雙方只是在浪費時間。
(記得Xdite 曾有文說如何有智慧的去幫人)

做好事沒有損失,還可以練習技能。

如果你封頂了,就要去接觸更多的人。

Xdite:我做事不講目標,日行一善就好。
小勝利、小幫人就好,舉手之勞幫人。

如果你不一定很快收到成效,那表示你不夠好心(我笑了),總之要附與高於自己的意義。

2016年10月10日 星期一

內容與整理-認知心理學學習法

日前程式教育家Xdite開直播,我發問道:「請問,如何把關掉左腦的學習方法,用在學習數學、科學?」

她回答說,她在大學應用數學系的自教法:把課本習題做一遍,不會的題目找學長,叫學長寫一遍,再思考;再寫理論、寫自己的武功秘笈。

這就是貝蒂・愛德華Betty Edwards教學理論的絕佳應用。

我過去在練畫時也用過Betty Edwards的書,很有幫助,卻沒有像Xdite觸類旁通。


我摘要這套學習的方法的基本原則就是:

先用右腦input,再用左腦routing。就是先輸入內容,再整理路徑。什麼路徑?對錯、因果、關聯⋯⋯

輸入內容(不論對錯),你就有記憶的內容;再訂正整理(自己googele或找人),你就有了理性的認知、判斷。

精髓就是如此。

一定要訂正整理,不然你就只是多了一堆沒處理過的內容而已,也就是打發時間,沒有達到學習的效果。

而當你再整理出你的教學、秘笈時,你的左腦路徑就更強化,你的認知、判斷就更完整。這就是教學相長的原因。


有了基本原則,我們再延伸應用。

數學、科學如此,那麼經濟金融等科目是否也是如此?應該是,這些學科的結構很相似,都有基本的知識對應很多題目,所以略讀-作題-訂正,這個模式應該是可行的。

那麼哲學呢?音樂呢?或者其他沒有很多題目的學科如文學歷史呢?

我還沒有答案,但是沒有題目,也可以設計出題目。總之就是設計出輸入內容的形式。

那語言呢?有本韓國人寫的書《我要把英文學好:只要大聲說英語,就可以做到!》,有興趣可以一閱。書裡主張學語言最重要是大聲唸小說+背單字。大聲唸小說就是一種輸入內容到你大腦的形式。


在不久的未來(可能已是現在式),因為這種基於認知心理學的學習方法的擴散,各種知識領域的學習範本將會有如雨後春筍般誕生。人們的學習速度、能力也會提高一個層次。

甚至應該會形成新的教育產業,因為過往的教科書、教育形式全部都要翻新一次。


傳統教育的問題,在於在課堂上就要學生一次到位,甚至是反其道而行,還沒有輸入內容,就要先理解。當然大部分學生都無法做到。這不是學生笨,而是人的大腦本來就沒有辦法這樣運作。

人是先有感性的內容,才有理性的認知。

沒有錯,傳統教育也有輸入內容-就是背誦。但是背誦是背,做題目是做,有一樣嗎?應該是不一樣,一個是背一個是做,做題目在大腦留下的路徑必定比較有活性。

想到此,感覺有如令狐沖看到的武學新境界。

這是教育與學習的新境界。

2016年10月5日 星期三

Rails 如何做出自己的 gem

接續之前
Rails 如何將兩個重覆的 model 打包成 Module
我們再把做出來的 module 打包成 gem 並且上傳到官網讓任何人都可以下載來用。

首先你要到 https://rubygems.org/ 註冊帳號
然後 bundle gem 你的_gem_名稱
$ bundle gem vote_gem_test
會產生很多檔案,主要是專案底下的 vote_gem_test 資料夾(當然這名字會因你取的名字而定,以下同)
找到這個檔案 vote_gem_test/vote_gem_test.gemspec
註解幾行程式碼
# vote_gem_test/vote_gem_test.gemspec 註解這幾行
  spec.homepage      = "TODO: Put your gem's website or public repo URL here."

  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
  end

到這裡看看 http://guides.rubygems.org/specification-reference/,注意它的範例和你的.gemspec的不同,改成它的格式;如下
# vote_gem_test/vote_gem_test.gemspec
Gem::Specification.new do |spec|
  spec.name          = "vote_gem_test"
  spec.version       = '0.1.0'
  spec.authors       = ["你的名字"]
  spec.email         = ["你的mail"]

  spec.summary       = "你的gem摘要"
  spec.description   = "說明"
  spec.license       = "MIT"
  spec.homepage    = '你的部落格網址記得加http://'

複製貼上之前原專案/lib裡的vote.rb的程式碼到這個檔裡面,貼到提示# Your code goes here...那裡
# vote_gem_test/lib/vote_gem_test.rb

接著到這個資料夾
$ cd vote_gem_test

執行
$ gem build vote_gem_test.gemspec
  # Successfully built RubyGem
  # Name: vote_gem_test
  # Version: 0.1.0
  # File: vote_gem_test-0.1.0.gem

上面檔名vote_gem_test-0.1.0.gem就是做出來的gem了
最後,gem push .gem檔的名稱
$ gem push vote_gem_test-0.1.0.gem
 # Pushing gem to https://rubygems.org...
 # Successfully registered gem: vote_gem_test (0.1.0)

Successfully!
這時你可以去 rubygems.org 看看,你的帳號會有這個gem,任何人也都可以下載到他們的 Gemfile 來用了。

Rails 如何將兩個重覆的 model 打包成 Module

首先,假設你有兩個model檔
# app/controllers/posts_controller.rb
class Post < ActiveRecord::Base
  belongs_to :user

  has_many :comments
  has_many :categories_posts
  has_many :categories, through: :categories_posts
  has_many :votes, as: :voteable

  def up_votes
    self.votes.where(vote: true).length
  end

  def down_votes
    self.votes.where(vote: false).length
  end

  def total_votes
    up_votes - down_votes
  end
end

和
# app/controllers/comments_controller.rb
class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
  has_many :votes, as: :voteable

  validates :content, presence: true, length: {minimum: 5}

  def up_votes
    self.votes.where(vote: true).length
  end

  def down_votes
    self.votes.where(vote: false).length
  end

  def total_votes
    up_votes - down_votes
  end
end

兩個model有相同的程式碼。
再到 /lib 底下,新增一個檔案 voteable.rb
# lib/voteable.rb
module Voteable
  def up_votes
    self.votes.where(vote: true).length
  end

  def down_votes
    self.votes.where(vote: false).length
  end

  def total_votes
    up_votes - down_votes
  end
end

把原本兩個model檔重覆的程式刪掉,並且加上一行引用的程式碼:include Voteable
# app/controllers/posts_controller.rb
class Post < ActiveRecord::Base
  include Voteable

  belongs_to :user

  has_many :comments
  has_many :categories_posts
  has_many :categories, through: :categories_posts
  has_many :votes, as: :voteable
end

另一個model檔也同樣處理
# app/controllers/comments_controller.rb
class Comment < ActiveRecord::Base
  include Voteable

  belongs_to :user
  belongs_to :post
  has_many :votes, as: :voteable

  validates :content, presence: true, length: {minimum: 5}
end

最後通知 rails 載入 /lib 路徑下的檔案
到 config/application.rb 加一行程式碼:config.autoload_paths += %W(#{config.root}/lib)
# config/application.rb
module ProjectName # module 後是你的專案名;會預設好
  class Application < Rails::Application
# 中略,加上下面這行
    config.autoload_paths += %W(#{config.root}/lib)
# 略
  end
end

開rails s 測試,沒問題就成功了。

2016年10月3日 星期一

jQuery基本使用筆記

資料夾結構:
home-  
  CSS-      
    style.CSS  
  js-      
    main.js  
  index.html

程式碼
//index.html
 <head> <link rel='stylesheet' type='text/css' href='css/styles.css'> </head>

<body>
  <script src='https://code.jquery.com/jquery-3.1.0.min.js'></script>
  <script src='js/main.js'></script>
</body>


這樣就能使用CSS和JavaScript了。在上述兩個檔各自輸入CSS, JS的程式碼就可以開始了。

2016年10月1日 星期六

Rails 的命名慣例

1, migration 的 tables名,複數
class CreatePostTable < ActiveRecord::Migration
  def change
    create_table :posts do |t|
    end
  end
end
2, controller名,複數
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
end
3, models名,單數
# app/models/post.rb
class Post < ActiveRecord::Base
end
4, views名,資料夾是複數
# app/views/posts/index.html.erb