2013年6月23日 星期日

[Xcode]在程式裡面加入Facebook Login的功能(一)

詳細的步驟在Facebook Developer的網站上。
事後來看,實作真的很簡單,(如果有仔細看文件的話! XD)
首先簡單說明一下步驟;
i. 下載並安裝Facebook SDK。
ii. 在Facebook上申請並取得一個app ID。
iii. 設定你的Xcode。
iv. 開始撰寫程式。


i. 下載安裝Facebook SDK:

1. 和字面上的意思一樣,首先先到FB的開發者網頁,然後下載他的SDK與範例回來。
 
螢幕快照 2013 06 24 上午7 03 12

下載回來的檔案會長這樣是個pkg檔,可以直接安裝。
螢幕快照 2013 06 24 上午7 13 02
2. 打開並且安裝SDK完成。
這時候和我一樣還不太熟悉OSX系統的人應該和我一樣,就看著他默默裝完了,然後還不知道他把東西放在哪。
沒有意外的話,檔案會放在文件->Facebook SDK這個資料夾底下。
第一個步驟下載安裝SDK完成嘍。

ii. 在Facebook上申請並取得一個app ID:

1. 回到Facebook Developer app頁面,選擇建立新的應用程式。
 
螢幕快照 2013 06 24 上午7 24 12
輸入所畫面要求的訊息,然後按下繼續,然後會跳出驗證碼視窗,輸入正確的驗證碼後繼續。
螢幕快照 2013 06 24 上午7 28 42
然後就會產生一個FB應用程式嚕,記下其中的App ID,等一下撰寫程式的時候會用到。
螢幕快照 2013 06 24 上午7 31 25
到此,第二個步驟也完成了。

iii. 設定你的Xcode;

1. 首先建立一個Project 在這裡我們選了一個Single View的 Project,首先加入這幾個framework
Account.framework
AdSupprot.framework 
Social.frameworkSecurity.framework
libsqlite3.dylib


然後點選Add Other
 
螢幕快照 2013 06 24 上午7 49 40
文件底下Facebook SDK的資料夾底下把Facebook.framework加入。
在Frameworks的資料夾上點右鍵,選擇Add Files to ..
 螢幕快照 2013 06 24 上午10 38 31
然後再到其下的Recourse 將FacebookSDKResources.bundleFBUserSettingsViewResources.bundle加進來。(這個步驟會影響到後面FB Login的View是否能正常顯示的出來。)

所需要加入的framework如下。
 螢幕快照 2013 06 24 上午7 58 09
2. 設定App ID
 首先先到plist底下新增兩個Row,名稱分別為
 FacebookAppID  輸入剛剛在Xocde所申請到的App ID
 FacebookDisplayName 輸入剛剛所申請的App 名稱
 
螢幕快照 2013 06 24 上午8 08 28
加油,還差一點!

 

2013年6月20日 星期四

[C#] DB schema To C# Class

因為我在寫程式的時候會先建構一個和 table相同結構的class,

(EX: table:CMD_MST 我就會建一個CMD_MST.cs結構和table的欄位相同。)

但是手動寫是一件很麻煩又routine的事情,所以找了一些資料,

最後在code project找到這篇: http://www.codeproject.com/Articles/8776/Automated-Class-Builder-for-Database-Tables

but,這篇是使用sqlconnection ,而且必須要在db裡面先作好預存程序getData,

所以就花了一點時間,把連結的部分,改成OleDBconnection,而且針對Oracle/MS SQL下去修改。

Enjoy it!

將DB Table轉CS class

[DP]深入淺出-設計模式(工廠模式1)

在Ptt soft_job看到這本書的推薦。

真是令人大開眼界,很多困混在書中都慢慢的可以找到解答。 原來,我一直搞不懂抽象到底是為什麼,什麼時候下用的,是因為這是一個大哉問, 要到設計階段後才會懂他的威力。

目前閱讀進度到工廠模式的1/2,目前的理解, 當在設計的時候,針對實體去設計,用抽象方式去設計,然後以宣告的時候在產生一個具體的實體。 大概就是這樣的感覺。

Laptop myLaptop01 = new MacBookPro();

Laptop myLaptop02 = new ASUSLaptop();

(當然,MacBookPro,ASUSLaptop必須要繼承自Laptop這個抽象型別) 然後一些共通會有的就可以在抽象型別裡面定義好,使得這些繼承他的實體必須要作這些事情。 舉例來說好了, 不管是MBP還是ASUS的筆電都是會有開機這個功能。 但是OS卻不一定相同,(但是基本上都會有os),OS基本上也是一個抽象的東西,OSX/Windows才算是實體。 利用抽象的方式,最大的優點就是可以克服,所謂大同小異的問題。

而不是一種類別就設計一個class,這樣對維護上比較輕鬆。 簡單來說,抽象型別用來處理,一定會有,但是有點不同的屬性上是很方便的。

目前理解大概就到這邊,如有謬誤,歡迎指正。 XD

[DP]深入淺出-設計模式(獨體模式)

well,這應該是設計模式裡面最簡單的一種模式。

邏輯上來說,建一個class基本上都是為了可以new很多物件出來, 但是有些時候,有些物件你需要跨method使用,所以你就讓它變成一個全域變數,

問題在於,你並不希望說她一開始就被分配空間,希望她是在用到的時候才被產生出來, 而且你希望當我呼叫這個物件的時候,基本上它是能呼叫到同一個物件。 獨體模式可以解決這個問題。

與其中文解釋不如看程式碼比較好了解的一種模式。 XD

//定義類別 using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace ConsoleApplication2 { class Program {

static void Main(string[] args) { Single testSingle = Single.Init(); testSingle.strName = "Hello!I’am the only One!"; Console.WriteLine("In Main function:"); Console.WriteLine(" {0}", testSingle.strName); Console.WriteLine("Call method ;DoSomething():"); DoSomething(); Console.ReadKey(); }

static private void DoSomething() { Single testSingle = Single.Init(); Console.WriteLine(" {0}", testSingle.strName); } }

//定義類別 public class Single { private static Single _Single; //建立一個物件 public string strName="";

public static Single Init() { if (_Single == null) _Single = new Single();

return _Single; }

private Single() //不允許外部存取的建構式 { }

} }

//程式碼2012/8/27更新。

不過其實讀到這邊的時候,第一個念頭就是, Object-C的 init 的method 一開始就是在用這種模式,目前手上幾本教學的書, 很自然的就把獨體模式視為"應該做的事情",相較之下,不知道是我書選得不好還是怎麼樣,似乎C#的書比較少著墨於這端。 o_oa

如有誤謬,歡迎指導。 囧

[DP]深入淺出-設計模式(裝飾者模式)

裝飾者模式,當一個抽象的東西擁有許多屬性的時候,

可以透過裝飾者模式來控制 以下的例子參考了HeadFirst 的深入淺出設計模式,

以衣服為例,衣服有些是可以免運費的, 假設T-Shirt 一件加上運費100,運費為50元,

可以經由裝飾者的方式,提供FreeShopping的字樣,並且這件的衣服的價錢就降成了50(100-50)。
撰寫這段code 的時候遭遇到一個問題, 首先是clothFreeshopping的description一直都會吃到基底的cloth,
查了一下原因是,在C#裡面,override 的method 在父項必須要有virual關鍵字,不然會執行父項的method。

namespace ConsoleApplication1 {

class Program { static void Main(string[] args) {

      Cloth cloth = new T_shirt();

      Console.WriteLine(string.Format("{0} ${1}",cloth.getDescription(),cloth.cost()));

      Cloth clothFreeShopping = new T_shirt(); clothFreeShopping = new FreeShopping(clothFreeShopping);

      Console.WriteLine(string.Format("{0} ${1}", clothFreeShopping.getDescription(), clothFreeShopping.cost()));

      Console.Read(); } }

//定義抽象類別

public abstract class Cloth {

     protected string description = "Unknown Cloth";

     public virtual string getDescription() { return description; }

     public abstract double cost();

}

     public abstract class CondimentDecorator : Cloth { //public abstract string getDescription(); }

     class T_shirt : Cloth{

           public T_shirt() { description = "T-Shirt"; }

           public override double cost() { return 100; }

      }

      class shirt : Cloth {

            public shirt() {

                 description = "T-Shirt";

             }

             public override double cost() { return 200; } }

             public class FreeShopping:CondimentDecorator {

                    Cloth cloth;

              public FreeShopping(Cloth cloth) {

                    this.cloth = cloth; }

              public override string getDescription() { return cloth.getDescription() + ", FreeShopping"; }

              public override double cost() { return -50 + cloth.cost(); }

   }

}

[VM]當.vmx檔案損壞/消失後的處理方式

好吧,我知道這種蠢事在正常操作的情況下是很難發生的, 
但是對於像我這種為了下班不惜讓電腦以及 VM 內重要的環境冒點"小"風險的傢伙來說,
備份一下作法似乎比較容易點。

 步驟其實不難。 
1. 找到另外一個.vmx,沒有的話新增一個虛擬機器,正常情況下都會有一個。 
2. 將該.vmx 移到已經找不到.vmx的資料夾下。
3. 用筆記本打開.vmx找到以下幾行:
    a. scsi0:0.fileName = "Windows XP Professional.vmdk"
    b. nvram = "Windows XP Professional.nvram"
    c. extendedConfigFile = "Windows XP Professional.vmxf"

然後通通把它改成該資料夾底下的檔案名稱。
再點擊你新的.vmx,發現本來不得其門而入的vm又可已被打開了(歡呼),
(雖然不是很令人滿意,例如說原本suspend的可能無法回復,只能從重開機開始跑。)

 下次請正常關閉你的VM!

謝謝收看。 :P

2013年6月19日 星期三

[序言]楔子

其實也沒有甚麼好寫楔子的,
只是因為發現如果不寫點甚麼東西,會進入犯懶的狀態。
那好吧!那就來寫個東西吧!

遇到問題,就想辦法解決,工程師就是這種生物。

可是,要寫東西總該有主題吧?
這倒是比較容易,就拿手邊正開始接觸而且練習的Object-C開發來著手吧。

目前預定Blog內容,會以Xcode的練習為主,將在書上/網路看到的例題或者功能,
實作並記錄下來,並且將可執行的檔案放到GitHub上。

原則上以一天一例題的方式。
不囉嗦,那就開始吧。