2013年4月8日 星期一

如何在 (老) Synology NAS 設置 GIT 伺服器 (2/2)

NOTE: (08/11/2015) 本文是多年前的老機器 DS107 的紀錄, 這台機器的 DSM 已經停止更新, 當時他是無法透過 DSM 安裝 GIT 套件, 所以只能手動(ipkg)安裝, 最近購入 DS214 發現新的 DSM 上已經有套件可以直接安裝, 如果你的 DSM 有支援線上安裝 GIT Server 請不要再看本文, 參見 Synology Git 套件說明 或新版的 如何在 Synology NAS 設置 GIT 伺服器 (新版) ^^

========================================
接...如何在 Synology NAS 設置 GIT 伺服器 (1/2)

以上軟體都安裝好了, 接著設置一個共用的 SSH 帳號(*)能在 GIT 專案裡使用...

NOTE: (*) 此採取一個共用的 SSH 帳號登入而已, 但各自能以 GIT client 端設置自己的名字 commit.

14. 在 NAS 建立新使用者及共享目錄
 
   a) 進入 NAS WEB 管理頁面
   b) 控制台 -> 共用資料夾, "新增" 一個新共用資料夾, 名稱 "git-repo"
   c) 控制台 -> 使用者帳號, "新增" 一個新使用者, 名稱 "git.user"
      在 "權限設定 - 共用資料夾" 頁面, 在 "git-repo" 的 "可讀寫" 打勾.

   P.S. 以上各名稱可以自訂.

15. 修改 git.user 登入的家目錄, 跟 shell
  
   a) 在 Windows 下執行 SSH client (PuTTY) 以 'root' 登入至 NAS
      NOTE: 要求輸入密碼時請直接鍵入網頁管理頁面(admin)用的密碼.

   b) 編輯 /etc/passwd 文件.

      DiskStation> vi /etc/passwd

      P.S. 1. vi 預設一進入為 command mode, 左下方有一個 '-' 號
              移動游標 (方向鍵, 或 'h/j/k/l') 至想要編輯的地方
     
      2. 按 'i' (進入 insert mode, 左下方有一個 'I' 號)          
           3. 結束編輯後, 按 'Esc' key 回到 command mode
 
          4. 不存檔離開, 輸入 :q! 按 'Enter'
         
    存檔離開, 輸入 :wq 按 'Enter' 或直接輸入 ZZ

   c) 修改 "git.user" 那一行由
      git.user:x:1029:100:(描述):/var/services/homes/git.user:/sbin/nologin
      -->
      git.user:x:1029:100:(描述):/volume1/git-repo:/bin/ash

16. 設置 /volume1/git-repo 目錄

   NOTE: 建議修改 /volume1/git-repo 權限, 只有擁有者可讀寫.

      DiskStation> chmod 700 /volume1/git-repo

 
   a) 切換至 git.user
  
      DiskStation> su - git.user

   b) 確認此時家目錄已經為剛剛修改的路徑.
  
      DiskStation> pwd
      /volume1/git-repo

  
   c) NOTE: 參考網站此時有做建立 .profile .ssh authorized_keys 的動作, 但我沒做, 目前示每次連線都要輸入密碼, 不確定是否還有其他影響.

17. 測試建立一個新的 git 庫

DiskStation> mkdir test
DiskStation> cd test
DiskStation> git init --bare
Initialized empty Git repository in /volume1/git-repo/test/
DiskStation> ls
HEAD config hooks objects
branches description info refs

18. 測試連線抓上面的 git 庫

   Windows 端開啟 GIT Bash, 要求輸入密碼的地方(**), 輸入建立 git.user 時的私人密碼.

$git clone ssh://git.user@11.22.33.44/volume1/git-repo/test
Cloning into 'test'...
git.user@11.22.33.44's password:
warning: You appear to have cloned an empty repository.
$ls -a test/
. .. .git


或用 TortoiseGIT clone 頁面, URL 處輸入 "ssh://git.user@11.22.33.44/volume1/git-repo/test" 後按確定, 會彈出要求輸入密碼, 輸入後按
確定.

NOTE: (**)參考網站有一個步驟我沒有做, 應該可以避免每次連線都要輸入 SSH 密碼...Add public keys of your git users in...authorized_keys, 等下次有空再來試試看這個設置.

19. 測試 commit and push (to server)
   (這裡省略了, 就是那些基本的 git 操作...)


參考 How to setup a git server on a Synology NAS

2013年4月2日 星期二

如何在 (老) Synology NAS 設置 GIT 伺服器 (1/2)

NOTE: (08/11/2015) 本文是多年前的老機器 DS107 的紀錄, 這台機器的 DSM 已經停止更新, 當時他是無法透過 DSM 安裝 GIT 套件, 所以只能手動(ipkg)安裝, 最近購入 DS214 發現新的 DSM 上已經有套件可以直接安裝, 如果你的 DSM 有支援線上安裝 GIT Server 請不要再看本文, 參見 Synology Git 套件說明 或新版的 如何在 Synology NAS 設置 GIT 伺服器 (新版) ^^

========================================
本來想放棄用 NAS(with Linux) 這樣做, 但 google 了一下 GIT server 架在 Windows 或 Linux 給外網的人使用, 要搭 HTTP 或 SSH 等等, 安裝看來沒有誰比較簡單, 內網不管權限最簡單, 就是一個內部目錄位置就好了, 不然就是得用 FREE 或收費的 GIT HOST 雲端的服務. 所以還是嘗試看看...

NOTE: 這是我的私人記錄, 不是教學!

環境:

1. Synology DS107+ DSM 3.1-1636 版
2. 有實體 IP 11.22.33.44 (此為亂寫)

How to setup a GITserver on a Synology NAS
-------------------------------------------


1. 開啟 SSH

 
   a) 用瀏覽器打開 NAS 的網頁管理頁面 "11.22.33.44:5000"
   b) 打開 "控制台" -> "終端機" 在 "啟動SSH功能" 打勾,按 "確定".


2. 在 Windows 下執行 SSH client 以 'root' 登入至 NAS
   NOTE: 1. 要求輸入密碼時請直接鍵入網頁管理頁面(admin)用的密碼.

         2. 可以使用 Cygwin 的 ssh, 或是 PuTTY

$ ssh 11.22.33.44 -l root -p 22
root@11.22.33.44's password: xxxx

BusyBox v1.16.1 (2011-10-23 04:33:17 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.



NOTE: 一般 SSH 預設 port 為 22 如果沒有改過, -p 22 可以不用加.

3.  進入 /volume1/@tmp

DiskStation> cd /volume1/@tmp
DiskStation> ls -al
drwxrwxrwx    4 root     root          4096 Mar 25 15:25 .
drwxrwxrwx   12 root     root          4096 Apr  2 11:10 ..
drwxrwxrwt    3 root     root          4096 Mar 25 15:25 php
drwxrwxrwx    2 root     root          4096 Apr  1 18:53 webfm

4. 抓取 bootstrap
   NOTE: 1. bootstrap 是安裝 ipkg 的執行劇本, 各 CPU 不一樣, 請先看好機

            型的 CPU.
            What_kind_of_CPU_does_my_NAS_have
            看好要下載正確的 xsh 文件 URL 位置:

            Modifying_the_Synology_Server,_bootstrap,_ipkg_etc
         2. 為避免網址輸錯, 建議直接複製 xsh 文件的網址, 下面 wget 後面直

            接 "貼上".

DiskStation> wget http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/syno-x07-bootstrap_1.2-7_arm.xsh
--16:47:02--  http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/syno-x07-bootstrap_1.2-7_arm.xsh
           => `syno-x07-bootstrap_1.2-7_arm.xsh'
Resolving ipkg.nslu2-linux.org... 140.211.169.161
Connecting to ipkg.nslu2-linux.org|140.211.169.161|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 250,349 (244K) [text/plain]

100%[====================================>] 250,349      190.89K/s

16:47:04 (190.41 KB/s) - `syno-x07-bootstrap_1.2-7_arm.xsh' saved [250349/250349]

DiskStation> ls -al
drwxrwxrwx    4 root     root          4096 Apr  2 16:47 .
drwxrwxrwx   12 root     root          4096 Apr  2 11:10 ..
drwxrwxrwt    3 root     root          4096 Mar 25 15:25 php
-rw-rw-rw-    1 root     root        250349 Feb 20  2012 syno-x07-bootstrap_1.2-7_arm.xsh
drwxrwxrwx    2 root     root          4096 Apr  1 18:53 webfm

5. 改變 script 為可執行屬性

DiskStation> chmod +x syno-x07-bootstrap_1.2-7_arm.xsh

6. 執行 script

DiskStation> sh syno-x07-bootstrap_1.2-7_arm.xsh
Optware Bootstrap for syno-x07.
Extracting archive... please wait
bootstrap/
bootstrap/bootstrap.sh
bootstrap/ipkg-opt.ipk
bootstrap/ipkg.sh
bootstrap/optware-bootstrap.ipk
bootstrap/wget.ipk
1226+1 records in
1226+1 records out
Creating temporary ipkg repository...
Installing optware-bootstrap package...
Unpacking optware-bootstrap.ipk...Done.
Configuring optware-bootstrap.ipk...Setting up ipkg arch-file
Modifying /etc/rc.local
Done.
Installing ipkg...
Unpacking ipkg-opt.ipk...Done.
Configuring ipkg-opt.ipk...WARNING: can't open config file: /usr/syno/ssl/openssl.cnf
Done.
Removing temporary ipkg repository...
Installing wget...
Installing wget (1.12-2) to root...
Configuring wget
Successfully terminated.
Creating /opt/etc/ipkg/cross-feed.conf...
Setup complete.

BusyBox v1.16.1 (2011-11-26 14:58:46 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

7. 刪除 script

DiskStation> rm syno-x07-bootstrap_1.2-7_arm.xsh

8. 如果是 DSM 4.0 還需要修改 /root/.profile

   (....P.S. 我是 DSM 3.1 所以此處我是跳過)

   請參考下面連結, 第八步驟 NEW: If you have DSM 4.0 there is an additional step...
   Modifying_the_Synology_Server,_bootstrap,_ipkg_etc

9. 執行 ipkg update

DiskStation> ipkg update
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/Pa
ckages.gz
Inflating http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/Pack
ages.gz
Updated list of available packages in /opt/lib/ipkg/lists/cross
Successfully terminated.

10. 執行 ipkg upgrade

DiskStation> ipkg upgrade
Nothing to be done
Successfully terminated.

11. 安裝 git

DiskStation> ipkg install git
Installing git (1.8.2-2) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/git_1.8.2-2_arm.ipk
package git suggests installing git-manpages
Installing zlib (1.2.5-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/zlib_1.2.5-1_arm.ipk
Installing openssl (0.9.7m-6) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/openssl_0.9.7m-6_arm.ipk
Installing libcurl (7.24.0-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/libcurl_7.24.0-1_arm.ipk
Installing diffutils (3.1-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/diffutils_3.1-1_arm.ipk
Installing rcs (5.7-2) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/rcs_5.7-2_arm.ipk
Installing expat (2.0.1-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/expat_2.0.1-1_arm.ipk
Configuring diffutils
update-alternatives: Linking //opt/bin/cmp to /opt/bin/diffutils-cmp
update-alternatives: Linking //opt/bin/diff to /opt/bin/diffutils-diff
update-alternatives: Linking //opt/bin/diff3 to /opt/bin/diffutils-diff3
update-alternatives: Linking //opt/bin/sdiff to /opt/bin/diffutils-sdiff
Configuring expat
Configuring git
Configuring libcurl
Configuring openssl
Configuring rcs
Configuring zlib
Successfully terminated.

13. 設置 git 的各命令可以不帶路徑直接叫用
    P.S. 這是因為 ipkg 安裝 git 是放在 /opt/bin 下, 非系統的 $PATH 下能找到, 有兩個方法:


    a) 最簡單的方式是...建立檔案連結 ("有點" 像 Windows 的捷徑).

DiskStation> for f in `ls /opt/bin/git*`
> do
> ln -s $f /usr/bin    
> done

    b) 在建立 git user 後修改的 login 環境變數.

       (....我是用 a 法, 所以此處我沒試)

       請參考下面連結, 第6步驟 ..."git-upload-pack" on the NAS was not found in the $PATH....
           

14. 建立 git 帳號及共享目錄

繼續...如何在 Synology NAS 設置 GIT 伺服器 (2/2)

參考:
http://ti57.blogspot.tw/2013/01/how-to-setup-git-server-on-synology-nas.html
http://www.wonko.de/2010/04/set-up-git-on-synology-nas.html


2012年11月8日 星期四

關於 Collider 與 Ragidbody (碰撞體與剛體) 的碰撞偵測與怎麼做

(最近開始試用 Unity3D, 寫一下心得筆記, 但先說明不代表我的觀點是完全正確的, 畢竟我才用沒兩小時...)


關於 Collider 與 Ragidbody 的碰撞偵測與怎麼做

p.s. 一開始我有些不明白這兩個的差異, 我知道 Collider 是用在碰撞偵測, Ragidbody 是用在物理計算的需求, 但為什麼單純兩個有 Collider 的物體相撞沒有任何事件 (OnTriggerEnter)發生?

研究了一下, 此簡要設定碰撞事件的步驟:

1. 每個能被撞倒的物體(範例是隕石與子彈)都要有一個 Collider 元件 (檢查一下 Collider 元件有被啟動, 並調整好適合的大小/位置)

2. 每個移動(要去撞人家)物體, 除自己也要有 Collider 外, 還需附加 Ragidbody 元件(*)
   a) 先點選要附加元件的 GameObject
   b) Menu->Component->Physics->Ragibody
   c) 暫時不考慮重力加速度, 核銷 Ragibody 參數的 'Use Gravity' checkbox
  
NOTE: (*)
擁有 Ragidbody 的物體才會即時對場景中的每一個 Colliders 做偵測(要去撞人家), 沒有 Ragidbody 的物體, 儘管也許他能藉由程式碼操作被移動, 但 Unity3D 不考慮對其他的 Colliders 做偵測 (為了加速吧).

例如: 場景中有 A B C  三個物件, A 為 Ragidbody, B/C 非 Ragidbody,  則 Unity3D 偵測  A<->B, A<->C 有沒有碰撞, 不偵測 B<->C

所以下面說法是正確的:
                 
場景中 "只有" 兩個移動物體(各有 Collider), 只要一個有設 Ragidbody 就足夠發生碰撞了!


3. 隕石(有加入 Ragidbody 元件)的 Collider 參數中, 核選 'Is Trigger' checkbox(**)
  
   在 GameObject 物件中加入

public class meteor : MonoBehaviour {
   ...
   void OnTriggerEnter(Collider other)
   {
//      if (other.tag == "bullet")          // 物件參數裡有指定 Tag
        if (other.name == "Bullet(Clone)")  // 用類別的名字
        {
            print("hit by bullet");    
        }
   }
}


   處理被碰撞時做什麼事, 注意: OnTriggerEnter 兩個相撞物件各自都會呼叫

public class bullet : MonoBehaviour {
   ...
   void OnTriggerEnter(Collider other)
   {
        print("OnTriggerEnter: " + other.name + " tag=" + other.tag);
        ...
   }
}


NOTE: (**)
這表示此碰撞體為一個觸發器, 產生碰撞事件, OnTriggerEnter/Exit/Stay(Collider other) 會被呼叫, 時此 Ragidbody 物件不會加入物理引擎做運算(彈跳 etc).(***)

4. 移動中隕石與子彈如果發生碰撞各自 OnTriggerEnter 就被呼叫了.
    (實際只要選擇其中一個處理即可 )


NOTE: (***)
如果 'Is Trigger' 不用, 則會 Ragidbody 有物理作用, 此時碰撞改用 OnCollisionEnter/Exit/Stay(Collision collision)
注意此處傳遞的是 Collision 不是 Collider!
 
以上這樣子就明瞭了, Collider 的 'Is Trigger' 主要的用途了, 他一般是使用在類
似進入/離開/停留一個區域要'觸發'事件, 在那種不需要有物理推擠的時機.

P.S. 一個 GameObject 可以附加好幾個 Collider, 所以可以按需求不同的作用一起發
生.