2015年6月15日 星期一

create new git remote repo

當你要建立一個新的 git remote repository 的時後,最大的問題應該就是權限的設定了

下面的 script 就是要來處理這個問題

#create_git_repo.sh

#$1 為所要建立的 repo 名稱
if [ -z $1 ]; then
    echo "I need project name to create git folder";
    echo "$0 [project]";
    exit;
fi

mkdir $1.git
cd $1.git
# 建立 --bare 的 git repo
git init --bare
# If planning to serve via HTTP
git update-server-info 

#更新目錄的權限
echo "change project folder owner, I need sudo password"
sudo chown git:git . -R
chmod -R g+s .
chmod -R 775 .

Usage:

$ pwd
/home/git 
$ sudo create_git_repo.sh first_repo

建立好 remote repo 之後,需要將 user 加入 git 這個 group 中
在 client 端中使用 git 來將這個 repo clone 下來

Client:

$ git clone ssh://andy@10.1.1.101/var/git/cczone

當然,這個 user 必需要先在 server 中加好並加入 git 的群組中

Written with StackEdit.

2012年4月5日 星期四

iOS app validate Error

App 在開發的最後階段就是要用 Distribute Provision 來將 App 編譯成可以發佈的二進位碼。但在過程當中遇到了一個難解的問題。

error: Codesign check fails : /var/folders/7v/g9yf0z9w8vl5l1f_dn8f6_gc0000gn/T/jK3H6qVC8k/Payload/Immuno.app: valid on disk
/var/folders/7v/g9yf0z9w8vl5l1f_dn8f6_gc0000gn/T/jK3H6qVC8k/Payload/Immuno.app: satisfies its Designated Requirement
test-requirement: code failed to satisfy specified code requirement(s)



在編譯的過程中一切順利,但這個訊息一直出現在要用 Organizer 檢查 App 的合法性時一直出現。


後來在 Apple 的 Developer Forum 上找到了 解法


原來是在開發的過程當中使用了許多的 Provision 跟 憑證。而 Xcode 會自動的將他們記下來。只不過Xcode 記錯了。所以就是要將原先的憑證 及 provision 都清理乾淨。才能夠  Build 出可以正確認證的 Binary Code.

2012年1月11日 星期三

建立一個可以跨平台的 PhoneGap 目錄結構

PhoneGap 是一套讓你可以用 HTML & Javascript 的技術來寫 APP 的Framework。我覺得最大的特色是可以跨平台的來使用寫好的 HTML & JS code。

PhoneGap 在 ios 及 android 的專案上都會用到一個名為 www 的目錄來放 html/javascript, 但是所放置的位置卻不大相同,為了不讓同樣的 code 存放在不同的地方,所以需要一點點工具來達成。

為了要可以同時開發,所以這個專案是在Mac上開發的。

所設定的目錄結構如下

+-+[app folder]
|
+[android] 放android 的程式碼
|
+[iOS] 放 xcode 的程式碼
|
+[www] 放所需的 html & javascript



xcode 相當的簡單,將 www 直接拉到 project 下面就可以正常執行了


問題在 eclipse 上,試在 eclipse 中建立 link folder,用mac 建立[替身]?。都無法解決問題。


solution:


使用 mac 中的 symbolic link 將 www 指到 android 的 assets 目錄下


在 command line 中下這個指令


   1:  cd [app folder]/android/assets/
   2:  ln -s ../../www www



如此一來,便可以正常執行不會出問題了

2012年1月3日 星期二

NetBeans 編碼問題

NetBeans 的預設編是使用 ascii ,但在編輯 utf-8 的檔案時會出現問題

只要在 安裝 NetBeans 的目錄中找到這個檔案

C:\Program Files (x86)\NetBeans 7.0.1\etc\netbeans.conf

加入一個選項  netbeans_default_options: -J-Dfile.encoding=UTF-8

如此一來就可以正常的看見中文字了

2012年1月2日 星期一

[茶包] PhoneGap Android configChanges

當Android 手機的方向被改變的時後,會造成 Activity 被重啟。如此一來 Activity 的狀態會被清空會造成意外中的 bug

這次就是在送資料到 server 時的時間差,變換了手機的方向。造成 activity 被重啟,在接不到資料的狀態之下,程式就  crash 了。

如何設定讓Activity 不會被重啟??

要達到這個目的,要修改 AndroidManifest.xml 在 activity 的tag 中加入設定

   1: <activity android:name=".Activity"
   2:           android:configChanges="orientation|keyboardHidden"
   3:           android:label="@string/app_name">
   4:     <intent-filter>
   5:         <action android:name="android.intent.action.MAIN" />
   6:         <category android:name="android.intent.category.LAUNCHER" />
   7:     </intent-filter>
   8: </activity>

經過這個設定, Activity 就不會被重啟,而改呼叫 onConfigurationChanged 的 Event。


 


另外,也可以固定畫面方向不被改變


可以在 activity 中加入設定,看要使用 landscape 或是  portrait



   1: <activity
   2:       android:screenOrientation=["unspecified" | "user" | "behind" |
   3:                                  "landscape" | "portrait" |
   4:                                  "sensor" | "nosensor"]>
   5: </activity>

[Reference]


Activity 設定檔文件


http://developer.android.com/guide/topics/manifest/activity-element.html

[茶包] TransactionScope 的問題

當資料庫不在同一台機器的時後記得要設定 MSDTC 的權限, web server + sql server 都要設!!
1. 選擇 元件服務
image
2. 打開元件服務,找到 本機 DTC 按右鍵選內容
win 7:
  image
XP 的話是在 我的電腦上面按右鍵

3. 選擇 安全性 設定網路 dtc 存取,並將 網路 dtc 存取、允許遠端用戶端、選擇不需要驗證
image

[Update 2012/01/20]
其實還會有另外的因素會照成 msdtc 不通
1. Firewall 不通
2. Host Name ping 不到

當 firewall 不通時在 Command Line 直接開放 msdtc 的存取,記得兩台電腦都必需要開通
netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable

接下來再在兩台電腦 ping 對方的 HostName
如果有任何一方不通,請在 host 裡加入 hostname 與 ip 的對應

這樣子應該就可以使用了

[reference]http://darkthread.blogspot.com/2006/03/msdtc-on-windows-2003-sp1.html

2011年12月27日 星期二

[筆記]Javascript Patterns 一些好習慣 -- for loops

for Loops

1: // sub-optimal loop

   2: for (var i = 0; i < myarray.length; i++) {
   3:     // do something with myarray[i]
   4: }
   5:  
   6: //應使用下面的寫法
   7: for (var i = 0, max = myarray.length; i < max; i++) {
   8:     // do something with myarray[i]
   9: }

如果要套上剛剛所說的 single var 的寫法的話



   1: function looper() {
   2:     var i = 0,
   3:         max,
   4:         myarray = [];
   5:     // ...
   6:     for (i = 0, max = myarray.length; i < max; i++) {
   7:         // do something with myarray[i]
   8:     }
   9: }

還可以更簡單嗎?? 下面只用到兩個變數



   1: function foo(){
   2:     var myarray = [],
   3:         i = myarray.length;
   4:     while(i--){
   5:         // do something with myarray[i]
   6:     }
   7: }


for-in Loops



for-in loops 大部份是用在不是 array 的物件身上,雖然也可以用在 Array 上,但並不建議。


在使用上可以用 hasOwnProperty(i) 來過濾物件屬性。如下面的  code 該物件有一個 clone() 的 function,就可以用 hasOwnProperty 來將其濾除



   1: // the object
   2: var man = {
   3:     hands: 2,
   4:     legs: 2,
   5:     heads: 1
   6: };
   7: // somewhere else in the code
   8: // a method was added to all objects
   9: if (typeof  Object.prototype.clone === "undefined") {
  10:     Object.prototype.clone = function () {};
  11: }
  12:  
  13: // 1.
  14: // for-in loop
  15: for (var i in man) {
  16:     if (man.hasOwnProperty(i)) { // filter
  17:         console.log(i, ":", man[i]);
  18:     }
  19: }
  20: /*
  21: result in the console
  22: hands : 2
  23: legs : 2
  24: heads : 1
  25: */
  26: // 2.
  27: // antipattern:
  28: // for-in loop without checking hasOwnProperty()
  29: for (var i in man) {
  30:     console.log(i, ":", man[i]);
  31: }
  32: /*
  33: result in the console
  34: hands : 2
  35: legs : 2
  36: heads : 1
  37: clone: function()
  38: */

 

不要用 eval()


這個應該不用多說, eval 會有潛在的安全性問題。


parseInt() 的注意事項


如果使用者輸入日期格式的文字在要 parseInt 的值時,在 舊版本的 javascript 會將該文字當作 8 進位來計算,會造成錯誤。所以在用 parseInt 時要指定 radix 的值



   1: var month = "06",
   2:     year = "09";
   3: month = parseInt(month, 10);
   4: year = parseInt(year, 10);

在大多數的狀況下也可以用下面的方式



   1: +"08" // result is 8
   2: Number("08") // 8

雖然速度會比較快一點,不過因為 parseInt 還做了 parse 的動作,所以像 “08 hello” 這樣子的文字還是可以正常的 parse 出來,而 用上面方法的就只會回傳 NaN 了