2014年12月18日 星期四

怎麼關閉舊的分支呢???

當一些分支的任務完成後, 想要關閉這些分支, 不要在分支列表中出現, 有什麼方法呢???
Git其實沒有關閉分支的功能, 若不要在分支列表中出現, 就要刪除分支...
但...刪除了, 就回不去啦~~~

那...怎麼辦呢???
雖然沒有關閉分支的功能, 但透過tag也是可以做到相似的效果:

1. 在要關閉的分支貼標籤(local端作業)
請確認local的branch狀態是最新的, 才不會tag錯位置
git tag archive/BranchName BranchName

2. 刪除分支(local端作業)
git branch -d BranchName

3. 上傳到remote(將local端的作業更新到remote端)
git push origin :BranchName
git push --tags

以上步驟就能達成分支封存的效果啦~~~
若之後想要把分支叫回來...
git checkout -b BranchName archive/BranchName

是不是還滿簡單的呢:)

參考連結: http://www.aaronwest.net/blog/index.cfm/2011/6/7/Git-Workflows-Archiving-Old-Branches

2014年12月9日 星期二

新增僅次於root身份的user

不想使用root身份來操作, 但又希望能做root能做的事
比如: MIS不想給開發人員Server的root密碼, 但開發人員在Server上架設開發或營運環境, 幾乎需要root權限來安裝及設定...
那...那...那就讓user有root的權限吧!!!

1. 新增使用者
# useradd developer
# passwd developer

2. 設定sudo權限
# visudo

按i進入編輯模式

找到下列段落, 加入粗體那行
## Allow root to run any commands anywhere
root            ALL=(ALL)       ALL
developer       ALL=(ALL)       ALL
...
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
developer       ALL=(ALL)       NOPASSWD: ALL

按Esc鍵離開編輯模式後, 輸入:wq, 存檔並且離開文書編輯程式
(若要不存檔離開, 可輸入:q!)
也可以使用wheel群組來做到一樣的效果


Done!!!
剛新增的使用者, 就可以使用root權限來執行囉
# sudo 要執行的命令


2014年9月22日 星期一

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

使用open uri執行https的網址, 發生了SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed的錯誤!!!

google找了一些solution:
1. http://stackoverflow.com/questions/5711190/how-to-get-rid-of-opensslsslsslerror
2. http://stackoverflow.com/questions/10728436/opensslsslsslerror-ssl-connect-returned-1-errno-0-state-sslv3-read-server-c
3. http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html

主要是嘗試了config/initializers/fix_ssl.rb的方法(參照第3個連結):
require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=
    
    def use_ssl=(flag)
      self.ca_file = Rails.root.join('lib/ca-bundle.crt')
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end
但問題仍然無法解決...


重新正視問題, 發現有SSL憑證的網址(ex: https://www.facebook.com/), 不會出現錯誤; 沒有SSL憑證的網址, 在browser也會出現憑證錯誤或未受信任(不安全)的連線等等的警告頁面, 這類網址才會出現錯誤~~問題可以釐清了!!

一開始找的solution方向比較偏向certification authority certificates(CA Certs)過期或找不到的狀況, 而現在真正要解決的狀況是讓沒有SSL憑證的網址不要出現錯誤...所以不要做驗證不就好了嗎:P

OpenSSL::SSL::VERIFY_NONE就是關鍵
網路上找到一些方案, 有滿多是全域性的設定, 但並非所有https都不做驗證, 所以此法不妥~~~
那要怎麼樣才能針對目前要連的網址不做驗證呢?
在open uri時, 設定驗證模式就搞定了...
require 'open-uri'

open(uri, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
問題找對方向, 沒想到這麼簡單就解決了XD


也可以用Net::HTTP來取代open uri的用法
require 'net/https'

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == "https"  # enable SSL/TLS
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # important!!!
http.start {
  http.request_get(uri.path) { |res| 
    print res.body
  }
}

若有遇到相似問題的人, 以上方法可以參考看看囉:)

2014年9月5日 星期五

Rails Girl教練初體驗Day 1

之前參加LTRT的活動, 從各個教練學到許多:)
這次主辦單位舉辦Rails Girl 4, 有幸成為教練的一員
很開心有機會能分享所學, 貢獻小小的一己之力
雖然沒有教的很好, 但也謝謝學員們相當認真的在完成目標XD

分享一下我的教學歷程:

當然是follow Rails Girl 台灣官網 的教學是最順的啦:P

1. 第一步先來安裝環境啦~
因為我們都是Windows的使用者, 所以就是下載RailsInstaller來安裝啦
依照官網教程Rails 安裝食譜 - Windows 安裝教學, 很快就能完成安裝~~
在安裝時, 也順便把git給裝起來吧(選項要打勾)
現場網路有時會塞車, 安裝過程多半在等待下載, 因此就有空檔跟學員們說明什麼是Ruby, 什麼是Rails了...

2. 了解Ruby & Rails
還好有之前做的簡報可以用:P


只是簡介而已, 所以很快就講完了...
那...接下來...就...
Try Ruby吧XD
這網站真是自學教學兩相宜丫~

3. Try Ruby
透過Try Ruby網站, 可以學習Ruby的基本語法
把它當成遊戲來學習也不錯哦~~

和學員們邊練習邊說明, 學到Hash其實第一天的時間也差不多要接近尾聲了...
所以和學員們小聊了一下, 不管是想要多了解軟體開發流程或者覺得和電腦對話很有趣, 都可以感受到學員們認真的學習心態, 真的很棒:)

晚了, 也累了...期待第二天再繼續囉:P


2014年4月18日 星期五

我的Rails環境安裝(CentOS)

1. Linux環境準備
1.1. 在Windows上安裝VM & CentOS
VM使用VirtualBox or VMware皆可
CentOS挑釋出的最新版本download後, 在VM上安裝即可
基本上安裝都有操作界面可以按下一步, 所以沒有什麼難度, 其中有兩項我的選擇如下
  • Disc Found: 我選Skip the media test, 因為沒有什麼要測試的XD
  • 選擇要安裝的軟件: 我選Basic Server, 因為我沒打算要用桌面(有GUI), 也不想從Minimal什麼都沒有的情況下開始安裝開發工具:P
完整安裝步驟可參考:
http://wiki.debian.org.hk/w/Install_CentOS

1.2. 設定網路環境
查看目前的網路環境
# ifconfig
若只有看到local 127.0.0.1的資訊, 設定透過dhcp自動取得IP
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
按i進入編輯模式, 輸入下列內容
ONBOOT="yes"
BOOTPROTO="dhcp"

按Esc鍵離開編輯模式後, 輸入:wq, 存檔並且離開文書編輯程式
(若要不存檔離開, 可輸入:q!)
啟動網路
# ifup eth0
方便內部環境測試, 直接關閉防火牆
# service iptables stop

1.3. 若安裝的CentOS不是最新版, 也可以安裝後直接更新
# yum clean all
# yum -y update
若發生Error: Package: matahari-XXX的錯誤, 因matahari在新版本已過時, 所以要刪掉
# yum remove matahari*
再執行一次update的指令來完成更新

1.4. 建立可以使用sudo執行屬於root權限指令的使用者, 使用者名稱以railsgirl為例
# useradd railsgirl
# passwd railsgirl
# visudo
找到root ALL=(ALL) ALL, 在該行下輸入下列內容
railsgirl ALL=(ALL) ALL

按Esc鍵離開編輯模式後, 輸入:wq, 存檔並且離開文書編輯程式

1.5. 切換使用者為railsgirl
# su railsgirl
上列的指令操作皆為root身份, 之後的操作皆以railsgirl的身份來進行
(因root為最高權限, 避免不小心去任意刪除到系統任何檔案, 對系統造成永久性損害, 我們以可以使用sudo的使用者來進行操作)


2. 開始安裝Rails
2.1. 安裝開發環境所需的工具
# sudo yum install make automake gcc gcc-c++ kernel-devel patch libffi-devel libtool bison openssl readline readline-devel curl git-core zlib zlib-devel openssl-devel libyaml-devel sqlite sqlite-devel libxml2 libxml2-devel libxslt-devel autoconf glibc-devel nodejs -y

2.2. 安裝圖像處理的工具
# sudo yum install ImageMagick -y

2.3. 安裝RVM(Ruby Version Manager)以及Ruby
指令參考來源:
https://rvm.io/rvm/install
http://ruby-china.org/wiki/rvm-guide
# curl -L get.rvm.io | bash -s stable --ruby
若發生下列錯誤
curl: (6) Couldn't resolve host 'rubygems.org'
There was an error while trying to resolve rubygems version for 'latest'. 
Halting the installation.
Gemset '' does not exist,       'rvm ruby-2.1.0 do rvm gemset create ' first, or append '--create'.
改手動安裝Ruby 2.0.0
# rvm install 2.0.0-p247

2.4. 使用一個Ruby版本並設為預設
# rvm use 2.0.0-p247 --default

2.5. 安裝Bundler(是管理應用程式Gem dependencies的管理工具, 會根據Gemfile的設定自動下載及安裝Gem套件, 並且能解決不同套件之間的依存關係)
Gem指令參考:
http://guides.rubygems.org/command-reference/
# gem install bundler --no-rdoc --no-ri

2.6. 安裝Rails
# gem install rails --no-rdoc --no-ri

2.7. 測試Rails
# rails new demo
# cd demo
# rails server
若發生下列錯誤
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
表示nodejs沒裝好, 再裝一次即可
# sudo yum install nodejs -y
若都沒有問題, 便可在Windows開啟browser去連剛啟動的rails網站囉!

最後, 來重開機(VM的Linux重啟), 再做一次測試, 若發現找不到指令的情形, 表示要再執行一次rvm use哪個ruby版本的指令
我們也可以直接在~/.bash_profile檔案裡最後一行加上該指令(rvm use 2.0.0-p247 --default), 就不用每次都要再執行一次啦~

2014年1月13日 星期一

初探Ruby on Rails

有緣人: 妳有聽過Rails嗎...
空空的我: 蛤~什麼??? 什麼Rails???

因緣際會, 有緣人讓我初步認識了Rails, 全名是Ruby on Rails(RoR), 是一套使用Ruby程式語言的Web開發框架. 據說能簡單且快速開發網站應用程式, 對沒有程式語言基礎的人來說似乎學習上也能很快樂:)

雖然我不認識她(Rails), 但我對她感興趣了...因此請google大神提供給我一些資訊.
什麼是Ruby on Rails, 以下連結已說明的非常清楚啦~
http://ihower.tw/rails3/intro.html
http://zh.wikipedia.org/wiki/Ruby_on_Rails

Ruby先鋒ihower寫的bible(http://ihower.tw/rails3/)是一本非常詳細的中文教學書籍, 因我還未準備好開發環境(打算在Windows上安裝VM再安裝Linux), 所以目前只拜讀到簡介就停擺了:P
沒想到過沒多久就從有緣人收到了一個很棒的資訊, 我的身份是可以參加Railsgirls讀書會的.

在台灣推廣Ruby以及Rails的先鋒們都有持續在舉辦一些技術交流的分享會, Rails Girls的活動是其中一項. 簡單來說, 該活動是希望能讓更多人感受Rails的魅力, 而且目標是要讓對程式這門領域較不熟悉的女性能透過Rails來實現技術面的想法; 更直白的來說, 就是不會寫程式的女性來參加活動, 也能輕易的學會架站及撰寫網頁啦~
不過很可惜活動已結束了, 但好佳在後續還有讀書會的活動可以和教練們交流, 所以我就去參加啦~

先來分享一下參加完讀書會的心得~
只能說主辦單位以及教練們真是佛心來著, 除了要繳場地費, 去學習是不用繳學費的. 而且每位學員都能配到一位教練, 一對一的教學; 偷偷觀察下來, 教練都超有心的, 依照學員的程度很有耐心的在指導, 內容甚至廣泛到一些電腦操作的技巧也有在教呢~
去要繳費的補習班上課都還享受不到這等待遇呢, 這時真心覺得身為女性...真是太好了:P
目前的讀書會報名網址: http://ltrt.kktix.cc/

在讀書會中, 我也確實學習到了Rails的開發以及利用Rails的框架工具來快速產生網站程式, 分享幾個學習的連結:
http://tryruby.org -> 15分鐘學Ruby程式語言, 透過互動模式, 學習挺有趣的~
http://railsgirls.tw/ -> Rails Girls指南, 提供相關入門教學, 必看~
http://railsgirls.tw/app/ -> 打造第一個App教學; 我的第一個App就是從這來的~
https://www.nitrous.io/#aio -> 雲端開發環境; 還未安裝好環境 , 就先用這個來學習吧~

我在雲端開發環境的第一個App~Step by Step分享~
1. 開啟Nitrouse.IO rails IDE環境, 如下圖
左視窗為目錄結構, 右為文字編輯器, 下則為命令列視窗

2. 輸入cd workspace指令, 切換到workspace目錄(該開發環境預設的工作路徑); 輸入rails new railsgirls來產生一個App
rails new可視為產生一個rails app的指令, 後面接的是要將app產生到哪個目錄下

3. 輸入cd railsgirls, 切換到railsgirls目錄; 輸入ruby bin/rails server來啟動伺服器(也可只輸入rails server來啟動)
成功啟動的訊息如下

4. 開啟測試伺服器的網頁
開啟的網頁畫面如下

5. 在命令列視窗Ctrl+C結束剛啟動Server的狀態, 回到可以輸入的狀態, 命令列有$的符號就是可以輸入的狀態了. 在接下來下一個步驟, 神奇的事即將要發生囉~

6. 輸入rails generate scaffold idea name:string description:text picture:string透過鷹架的功能來產生增(新增)/刪(移除)/改(編輯)/查(列出和檢視)皆具備的網頁; 輸入rake db:migrate讓資料庫更新, 能正確的和剛產生的網頁功能做串連.
rails generate scaffold可視為產生增/刪/改/查網頁功能的指令, 後面第一個參數接的就是該網頁的名稱, 再接下來則是功能對應的欄位及欄位屬性. 指令執行成功後, 會看到如下圖訊息, 列出自動產生出來的檔案.
資料庫更新完後, 會出現如下圖訊息

7. 最後, 依照之前的步驟來啟動伺服器及開啟測試頁面; 網頁開啟後, 在網址列最後加上/ideas, 會看到如下畫面
嘗試一下增/刪/改/查的功能吧
我的第一個App就這樣完成啦~
後續要美化頁面或者加強功能, 只要照著Rails Girls指南, 一步一步的去實作, 就能讓App更完整囉!

上述簡單的幾個步驟, 就能完成以往要寫好幾行程式以及頁面的功能, 真是太有效率啦~
所以我們回頭看一下, 她到底自動幫我們產生了哪些檔案:
controllers/ideas_controller.rb -> 處理ideas頁面的request, 與model互動後將資料輸出給view
models/idea.rb -> 包裝了資料管理與商業邏輯. 自動產生的model預設繼承了ActiveRecord, 所以基本的資料庫操作不需額外撰寫就都有囉
views/ideas/ -> ideas各個使用者介面, 顯示及編輯表單, 可內嵌Ruby程式的HTML
views/ideas/_form.html.erb -> 表單畫面, 以上述ideas為例, 為新增頁面及修改頁面裡的表單
views/ideas/index.html.erb -> 該功能首頁, 以上述ideas為例, 為Listing ideas列出頁面
...
在這些檔案修修改改, 也能很快的變成自己想要的樣子了吧~


因為剛認識Rails, 也還只是在初探的階段, 有很多不了解, 因此再拜了一下google大神, 查了一下我有興趣的內容; 其中一個議題是加上網頁框架後的老牌PHP和Rails的比較, 另一個議題則是效能上的問題了. 目前我還再參詳中, 先將連結筆記起來:)
Rails衝擊PHP(早期的文章)
http://www.ithome.com.tw/itadm/article.php?c=41491&s=3
Rails少就是多簡介(早期的文章)
http://guides.ruby.tw/creatingmoreusinglesseffortwithrubyonrails/
Ruby與PHP程式語言的比較(含Python)
http://www.nowamagic.net/librarys/veda/detail/2504
PHP 2013年前4名的框架
http://www.oschina.net/news/36494/the-best-php-framework-for-2013
效能問題探討(經驗分享)
Ruby去Rails化(指出Ruby本身效能是好的)
http://robbinfan.com/blog/40/ruby-off-rails

有一些問題, 就等著下次讀書會, 要來請教教練們啦~

最後要特別感謝有緣人(慕凡, 主辦者之一)以及讀書會教練(Vincent), 讓我有這個機會好好的認識Rails囉~

2013年12月25日 星期三

Unity網路好簡單:)


Unity, 一款強大易入手的遊戲開發工具, 除了在跨平台圖像呈現上表現已相當優異, Unity本身也提供了網路多人連線的功能.

Unity網路功能在使用上相當有彈性, 但說簡單也不簡單, 開發上若未規劃好如何使用, 很容易產生不必要的Component及多餘的傳輸量, 在除錯上也會變的相當不容易.

之前看到一篇文章, 教大家以"簡單"的方式來使用Unity的網路功能. 將文章消化吸收後, 在此分享給大家:)

原文出處(連結已不存在): http://lakehomegames.com/2012/12/05/unity-fps-networking-sample/
其它出處: http://www.gamasutra.com/blogs/DarrelCusey/20130221/187128/Unity_Networking_Sample_Using_One_NetworkView.php

-本文正式開始囉-

為了避免以上提及的問題, 原著提出需避免下列3個元素的使用:
  1. NetworkViews: 在需要同步的物件上加上NetworkView Component, Unity便會將其物件的資料同步, 但若未適當規劃管理, 便會造成多餘的網路傳輸量.
  2. Network.Instantiate: 在新的Player/Client加入時, 同樣會產生大量的網路傳輸量.
  3. RemoveRPCs: 使用Network.Instantiate才有作用的功能, 所以跟著一併不使用.

原著採用a Single World NetworkView的概念來設計網路資料傳輸的架構, 示意圖如下:
fps_sample_overview
圖片來源: http://www.lakehomegames.com/images/fps_sample_overview.png

因Unity內建網路溝通的功能必須透過NetworkView, 所以在整個設計架構下會使用到一個(只要一個哦)NetworkView來進行RPC的傳送及接收. 只要將NetworkView Component附加在任一空的GameObject, 並設定State Synchronization=OFF, Observed=NONE就能達成.

在網路架構下, 每個在Server產生的Player(Client連線)都必須要有唯一的識別ID, 以便Server辨識及管理. 通常要完成這項功能(產生唯一ID), 可能會去引用額外的套件, 此法CP值甚低, 因此原著提出一個簡單的技巧就能完成: 使用Network.AllocateViewID()來產生唯一ID.

了解以上技巧後, 接下來就是要來看在single NetworkView架構下, 需要負責管理哪些事啦:
  1. 需設計好要傳送的訊息, 要了解哪些訊息是傳給自己, 傳給Server, 或者是傳給其它Clients.
  2. 當有Player/Client連線成功加入Server或中斷連線時, 需處理對應的Player Object生成或消滅.
  3. NetworkPlayer和其對應的GameObject管理, 可利用像是dictionary的集合類型將其儲存起來以維護管理.

範例示意如下:
simple_fps
圖片來源: http://www.lakehomegames.com/images/simple_fps.png

請下載原著提供的原檔, 在networkController script裡就可看出整個流程. 針對比較重要的處理流程說明如下(請對照原始碼來看):

Server端的OnPlayerConnected()在收到玩家連線時, 透過Server端的NetworkView來告訴所有已連線的玩家以及Server本身(RPCMode.All), 有新玩家加入了.
networkView.RPC("JoinPlayer", RPCMode.All, newViewID, Vector3.zero, p);

當收到JoinPlayer() RPC時, 需生成對應的Player Object, 並存入HashTable做管理.
players.Add(p,newPlayer);

同理, 當有玩家斷線, 收到DisconnectPlayer() RPC時, 需消滅對應的Player Object, 並從HashTable中移除.
players.Remove(player);

在收到由Server傳送的Player加入訊息, 即JoinPlayer() RPC裡, 有一段關鍵的判斷式, 以Local IP判斷是不是Player/Client自己本身, 若是的話, 就可以在此處理Local Player Object的生成或操控.
if(Network.isClient)
{
    if(p.ipAddress==LocalAddress)

除了自己本身的連線加入訊息, 也需要知道已連線玩家的資訊. 在Unity內建的OnConnectedToServer()裡, 表示和Server連線完成, 可在此時向Server要求我要知道其它連線玩家的資訊.
void OnConnectedToServer()
{ 
   networkView.RPC("SendAllPlayers", RPCMode.Server);
}

Server收到SendAllPlayers() RPC, 可從Server管理的Player List裡將NetworkPlayer及NetworkViewID的資料透過呼叫JoinPlayer() RPC傳送給要求的Client. 當然要注意不要把Client自己的資料再送回去囉.

到目前為止的流程, 已充份利用single NetworkView架構來傳送及接收訊息, 以最精簡的網路傳輸來達到網路連線溝通. 以此繼續延伸設計, 不管是client-server或peer-to-peer架構, 在實際程式設計上都能簡單不複雜的完成啦:)

-本文結束-

註: 本文非直接翻譯原文, 若有任何問題或弄錯的地方, 歡迎提出討論:)