2017年3月26日 星期日

[odoo] 在Mac上安裝odoo

什麼是odoo?


Odoo(先前曾名為OpenERP,更早之前則為TinyERP),是一套企業資源規劃(ERP)及客戶關係管理(CRM)系統。以Python語言開發,資料庫採用開源的PostgreSQL,系統以GNU GPL開源協定釋出。
系統提供較靈活的模組架構,常用模組包括:採購管理、銷售管理、庫存管理、財務管理、貨品管理、行銷管理、客戶關係管理、生產管理、人事管理及服務支援等等。用戶可以直接從模組庫中選擇安裝適用模組,或進行模組解除安裝、升級的管理操作。
用戶端使用者介面是基於GTK的,同時支援Linux和Windows平台。目前還有開發中的基於TurboGears的eTiny Web用戶端。
--上述引用wiki


安裝開始


首先打開Mac上的終端機. (Finder > 應用程式 > 工具程式 > 終端機)

接著安裝Homebrew -套件管理工具

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝好之後,執行下面兩個指令來安裝python

brew update
brew install python

接著安裝postgresql

brew install postgresql

設定postgresql,以便在開機時自動啟動

ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

接著安裝一些環境所需的套件

brew install freetype jpeg libpng libtiff webp xz

安裝虛擬環境套件

pip install virtualenv

透過剛剛的虛擬環境套件建立一個叫odoo-env的目錄

virtualenv ~/odoo-env

下載odoo (這邊我們使用的是社群版)

git clone https://github.com/odoo/odoo.git

進入剛創立的虛擬環境

. ~/odoo-env/bin/activate

確認現在是否在虛擬環境內

which python

應該可以看到下面的結果

/Users/youruser/odoo-env/bin/python

進入剛下載的odoo目錄中

cd odoo

安裝odoo所需的相關資源

pip install -r requirements.txt

啟動odoo (注意,10版之前的啟動檔案叫odoo.python)

python ./odoo-bin

預設位址應該是: 127.0.0.1:8069

試著開啟瀏覽器輸入上面位址看看吧~

--安裝步驟參考網址

2016年9月24日 星期六

[Unity] 筆記: 2D物件移動

Unity物件移動

在Unity中,有兩種方式可以使物體移動,一種是對物體施力,而另一種則是直接強制改變座標位置 .

利用2D剛體(Rigidbody2D)移動物件 (施力)


Rigidbody2D.AddForce(Vector2 Force,ForceMode2D mode)


對物件的中心(世界座標)施加力量使物件移動,該移動力量會受剛體質量(Mass)跟線性阻力(Linear Drag)以及其接觸到的碰撞器(collider)摩擦係數所影響,也就是說當質量阻力及摩擦係數越大時,所需施加的力量也需要更大.


        
在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.

另一個參數ForceMode2D是個ForceMode2D型別的參數,可分為Force及Impulse兩種,在程式中直接以ForceMode2D宣告就可以.

Force mode: 對物件施加具方向性的力,同AddForce基本定義.
Impluse mode: 對物件施加一個脈衝力,該力量一樣具有方向性.

ForceMode2D是optional參數,沒有加入這個參數時,預設就是Force mode.

Script範例:

float horizontal = Input.GetAxis ("Horizontal");

rb2D.AddForce (new Vector2(horizontal,0));
rb2D.AddForce (new Vector2(horizontal,0),
ForceMode2D.Force);
rb2D.AddForce (new Vector2(horizontal,0),ForceMode2D.Impulse);


Rigidbody2D.AddForceAtPosition(Vector2 Force, Vector2 Position, ForceMode mode)


從世界座標中的特定位置(Position)與物件中心形成一個虛擬力矩,然後對特定位置施加力量造成物件移動同時也產生扭力使物件旋轉,移動力量跟AddForce一樣會受質量跟阻力及碰撞器摩擦係數影響,而旋轉的扭力會受到角度阻力(Angular Drag)所影響.


在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.

Position也是一個二維向量,不過在這邊只用來表示位置,並不具方向性,在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.

ForceMode2D的部分與AddForce中一樣.

Script範例:

float horizontal = Input.GetAxis ("Horizontal");

rb2D.AddForceAtPosition (
new Vector2(horizontal,0),new Vector2(-1f,1f))
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f)
                         ,ForceMode2D.Force);
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f)
                         ,ForceMode2D.Impulse);     



Rigidbody2D.AddRelativeForce(Vector2 Force, ForceMode mode)


與AddForce作用相同,唯一不同的是AddForce, AddForceAtPosition都是對世界座標系統作用,而AddRelativeForce則是對本地座標系統作用.下圖左方為物件旋轉前,右圖為旋轉後,當物件旋轉後,本地座標會跟著旋轉,此時施力方向與旋轉前就不一樣了.



在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.

另一個參數ForceMode2D是個ForceMode2D型別的參數,可分為Force及Impulse兩種,在程式中直接以ForceMode2D宣告就可以.

ForceMode2D的部分與AddForce中一樣.

Script範例

float horizontal = Input.GetAxis ("Horizontal");

rb2D.AddRelativeForce (new Vector2 (horizontal, 0));
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Force);
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Impulse);



Rigidbody2D.AddTorque(float torque, ForceMode2D mode)


對物件的世界座標中心Z軸(因為是2D平面)施加扭力,torque > 0 時,會逆時針扭動,反之則順時針扭動.

在方法中的參數Torque,是float.

ForceMode2D的部分與AddForce中一樣.

Script範例

float horizontal = Input.GetAxis ("Horizontal");

rb2D.AddTorque (horizontal*2);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Force);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Impulse);



Rigidbody2D.MovePosition(Vector2 Position)

透過將物件直接位移到指定位置達到移動的效果,不受剛體其他參數影響.


Rigidbody2D.MoveRotation(float Angular)

透過改變物件角度達到旋轉的效果,不受剛體其他參數影響,Angular > 0 時,物件旋轉方向為逆時針,反之為順時針.


利用Transform移動物件 (改變座標)

Transform是每個物件都會有的元件,其中包含了物件的位置(Postion),旋轉角度(Rotation)以及大小(Scale).

transform.position

改變或取得物件座標,回傳及代入值皆為三維向量(Vector3),在處理2D物件時,記得保持z軸座標.

Script範例

Debug.Log(transform.position); //印出物件目前位置
transform.position = new Vector3(1,1,0); //給予物件新的位置

transform.position.set(float x, float y, float z)


改變物件座標,直接給定三個軸向的位置即可.

Script範例

transform.position.set(1,2,0);

transform.position.axis

用來取得物件位置的某個軸向數值,取得的數值為float型態.

Script範例

float x = transform.position.x;
float y = transform.position.y;
float z = transform.position.z;

transform.rotation

改變或取得物件的旋轉參數,回傳及代入值皆為四元數(Quaternion).

Script範例

Debug.Log(transform.rotation);
transform.rotation = Quaternion.Euler(1,1,1);
transform.rotation = Quaternion.Euler(new Vector3(1,1,1));


transform.RotateAround(Vector3 Point, Vector3 Axis, float Angle)

使物件針對某個點(Point)上的某個軸(Axis)旋轉,Point及Axis皆為三維向量,Angle為float.

Script範例

transform.RotateAround (new Vector3 (1, 1, 0), new Vector3 (0, 0, 1), horizontal);

2016年7月21日 星期四

[Unity][PlayMaker] 練習九 : 資料型態轉換

資料型態


這邊我們先簡單介紹一下先前以及這次會用到的資料型態 :

int (整數) :就是沒有小數點的數字啦~int的範圍可以在-2147,483,648 ~ 2147,483,647之間

float (浮點數) :就是最多可以到小數點第六位的數字,範圍在1E-37 ~ 1E37之間

vector3 (3維向量) :就是有XYZ三個軸的向量,無限制範圍 ((吧?

vector2 (2維向量) :就是只有XY兩個軸的向量,應該也是無限制範圍((吧?

(向量 :具有方向及大小的量,你試著畫出X = 1, Y = 2的座標,然後從(0,0)連過去(1,2),連出來的那條線就是向量了,具方向又有長度)

String (字串) :就是文字.

boolean (布林值) :只有包含兩個狀態的值,例如true/false,yes/no或是on/off.


資料轉換練習

這次的練習我們會用到整數與字串的轉換,再將字串顯示在畫面上用來做計數器,請大家試著照著影片練習一下吧~




試著應用到其他不同地方吧~下次再會XD

[Unity][PlayMaker] 練習八 : 物體碰撞

碰撞與觸發

先前我們提到過觸發,是指當物件進入某個有形或無形的範圍時的進,出及停留可以自動發動某些我們期望的行為.

那麼碰撞呢?碰撞是指兩個無法互相穿透的物件互相接觸到時,就叫碰撞. 碰撞時依然可以觸發某些我們期望的行為,而除了這些行為以外,還會視這兩個物件的剛體設定產生一些物理影響,比方說A物件比B物件重,當A物件移動去推擠B物件時,B物件就會被A物件推著走.


物體碰撞練習


接著請試著照影片練習一下簡單的的碰撞行為吧~





記得要練習才是王道~不要看過就算了QQ

[Unity][PlayMaker] 練習七 : 預製物件

預製物件

預製物件,顧名思義就是事先準備好在場景中所需要使用到的物件,包括物件的相關動作邏輯等等,然後將做好的物件轉換成預製物件,如此一來就可以在任意場景中量產該物件. 

舉例來說,在一款射擊遊戲中,敵方角色不斷出現,這時候的敵方角色並不是設計者先準備好一堆物件在特定位置上隱藏著,等時間到才解除隱藏,而是先做好敵方角色的預製物件,等到場景滿足特定條件時才會生成並出現在畫面上.

那麼,這兩種做法的差異性在哪裡呢?答案是系統效能. 事先產生好放在特定位置等待,這種做法在遊戲一開始系統就會被這些還不需要使用到的物件佔用掉許多資源,反而造成遊戲效能變差. 事先做好預製物件的話,在場景需要這些物件時才會被生成,如此一來資源就可以有效地被利用.

蛤?還是看不懂嗎?你家倉庫本來只能放一個月的所有日常用品的備品,結果某天你買了一年份的衛生紙塞滿了倉庫,結果導致你沒地方放其他東西的備品,大概是這種概念.


預製物件練習

接下來就可以開始照著影片練習如何預製物件,很簡單也很方便der!!



謝謝大家收看,記得多練習!!

2016年7月20日 星期三

[Unity][PlayMaker] 練習六 : 物件移動-自動

自動移動

所謂的自動移動,就是指物件有自己固定或隨機的自發行為,不需要透過人為去操作,最簡單的一種就是指定目標移動.

自動移動的運用幾乎在所有遊戲都可以看得到,像是NPC的移動或是攝影機切換視角都會用到.


自動移動練習


這次的練習很簡單,我們會建立一個物件自動在兩個定點間規律移動,接著請大家試著照著影片實作看看吧!!




謝謝大家~

2016年7月13日 星期三

[Unity][PlayMaker] 練習五 : 全域事件與物件隱藏

物件消失

在畫面上使物件消失(指看不到),大致上有三種方式 : 描繪(Render)失效,物件失效以及摧毀(Destroy)物件.

描繪失效

物件在畫面上可以被看見,主要是依賴描繪元件 (Render component),描繪元件中有許多設定,這個以後再慢慢介紹,當描繪元件失效時,物件本身無法以任何可視形式出現在畫面中,但是在這種情況下,物件本身還是存在於場景中,也就是它的其他元件功能還是健在的.
描繪失效將在這次的練習中介紹給大家使用.

物件失效

物件失效,會使物件中所有元件一併失效,當然也包括狀態機及成像. 在這種狀況下,物件是可以透過其他物件重新啟用,但是無法靠自己.,然而物件的所有參數也都不會因此被改變.物件失效我們在練習一的電燈開關裡面就有應用到了.

摧毀物件

摧毀物件,顧名思義就是毀屍滅跡了,在場景中被摧毀的物件就永遠消失了,所以它的任何功能跟設定也就跟著消失了.


全域事件觸發隱藏物件


在這次的練習中,我們將會練習之前提到過的全域事件來透過觸發器控制物件的描繪失效,請大家照著影片練習唷!



下一回會跟大家介紹如何讓物件自動移動,謝謝大家!