Cocoapods第三方套件管理 - iOS開發必吃的可可豆

  • 0

安裝Cocoapods

在終端機下,輸入:

$ sudo gem install cocoapods


建立podfile

在終端機下,cd切換到專案的資料夾,輸入:

$ vi Podfile

目的要建立一個檔案讓cocoapods讀取你要管理的第三方套件


建入文字輸入介面,然後輸入以下資訊

platform:ios, '7.0'
pod 'AFNetworking', '~> 2.4.1'
pod 'ECSlidingViewController', '~> 2.0.3’


pod後面接著的是你要的套件名稱,後面是版本號,若不加,預設是下載最新的版本。
輸入完成後,按Esc到指令模式,輸入:wq,存檔離開。


下載/更新套件

$ pod update
這時cocoapods會根據你設定的iOS版本號和套件做相依性檢查。

使用套件

完成後,套件就會下載到你的專案資料夾,此時的資料夾會多幾個資料夾和檔案。
裝了cocoapods之後都必須要用.xcworkspace開啟專案。


往後如果要新增或更新套件,就再去修改cocoapods,加入你要下載的套件名稱即可。

使用套件的方法也很簡單,直接在程式裡import “xxx.h”就可以囉!大功告成





參考資料

http://cocoapods.org/

GCD - dispatch_queue的基本用法

  • 0
Grand Central Dispatch(GCD),是Apple用來處理多執行緒的一個機制,執行緒交由OS管理,效能也更好。

Dispatch Queues有以下3種類型:

1.Serial Queue:串列執行block,會依照放入的順序執行。
2.Concurrent Queue:可以同時執行多個block,但是執行完成的順序是隨機的。
3.Main dispatch queue:在應用程式的main thread中執行block。


下面是幾個簡單的使用方式:

1.Serial Queue

建立Serial Queue的方法很簡單,首先先宣告一個dispatch_queue_create建立一個dispatch_queue_t,然後執行dispatch_async的block。

範例裡分別執行2個Serial Queue,尤於是Serial Queue一次只執行一次的特性的,所以會先執行Run1,結束後再執行Run2。

dispatch_queue_t createQueue = dispatch_queue_create("SerialQueue", nil);
    dispatch_async(createQueue, ^(){
        [self run1];
    });
    dispatch_async(createQueue, ^(){
        [self run2];
    });

- (void)run1{
    for (int i=0; i<5 br="" i="">     
[NSThread sleepForTimeInterval:1];
        NSLog(@"Run1:%d",i);
    }
}
- (void)run2{
    for (int i=0; i<5 br="" i="">     
[NSThread sleepForTimeInterval:0.3f];
        NSLog(@"*Run2:%d",i);
    }
}
執行結果

Run1:0
Run1:1
Run1:2
Run1:3
Run1:4
*Run2:0
*Run2:1
*Run2:2
*Run2:3
*Run2:4
有時,當我們需要在背景用執行緒讀取資料,完成後再更新UI,這時可以用以下的寫法:

    dispatch_queue_t createQueue = dispatch_queue_create("SerialQueue", nil);
    dispatch_async(createQueue, ^(){
        [self run1];
        dispatch_async(dispatch_get_main_queue(), ^(){
            [self run2];
        });
    });

執行結果跟上面的例子一樣,但不同的是,當run1執行完成後,run2是交由dispatch_get_main_queue(),也就是Main Thread來完成,所以當有需要更新UI的地方,可以採取這樣的寫法。


2.Concurrent Queue

建立Cocurrent Queue的方法如下,首先建立dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),DISPATCH_QUEUE_PRIORITY_DEFAULT的意思是交由OS來管理優先順序,開發者可以根據需求調整執行的優先權,系統提供4種:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^(){
        [self run1];
    });
    dispatch_async(queue, ^(){
        [self run2];
    });
執行結果
*Run2:0
*Run2:1
*Run2:2
Run1:0
*Run2:3
*Run2:4
Run1:1
Run1:2
Run1:3
Run1:4
可以看到,執行的結果完全是隨機的,也就是說,系統是同時在背景執行2個block。


3.Main dispatch queue

尤於是在主執行緒上執行,所以執行的時候,其它正在執行緒上跑的block都會排隊執行。

dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^(){
        [self run1];
        dispatch_async(dispatch_get_main_queue(), ^(){
            [self run2];
        });
    });

執行結果
Run1:0
Run1:1
Run1:2
Run1:3
Run1:4
*Run2:0
*Run2:1
*Run2:2
*Run2:3
*Run2:4 

後續還有Group of Queue,待我研究後補上。


參考資料
GCD介绍(一): 基本概念和Dispatch Queue
Austin's study note - 多工筆記 (GCD)

Xcode 6 建立 Universal Static Library 的方法

  • 0
有時候一個專案裡,常會加入自已常用的Framework,這些有可能是Open Source,或是別人分享的程式。

這時候會希望把他包成一個檔案較好管理,也方便在其他專案裡,同步更新。

這次就來說說如何在Xcode 6裡製作靜態函式庫(Static Library)。


1.首先,新建一個專案,選Cocoa Touch Static Library。



2.然後寫好你要獨立在Library的程式,設定要支援的iOS SDK版本,分別發佈Simulator和Device版。


3.在Build Phases->Copy Files,加入你要讓人別人呼叫的.h檔。



4.接下來在Product資料夾打開你Build好的資料夾


5.新建一個資料夾,分別把.a檔取名為youlibrary_simulator.a和youlibrary_device.a

6.然後用終端機打開這個資料夾,輸入以下命令,製作一個Universal的Static Library
lipo -create "youlibrary_simulator.a" "youlibrary_device.a" -output "youlibrary_universal.a" 7.將youlibrary_universal.a Add進你要用的應用程式專案。

8.在你的應用程式專案裡,打開Build Settings->Other Linker Flags,輸入「-Objc」。


9.大功告成,之後就可以在.m檔裡import "youlibrary.h"使用你製作的Library囉!

尤於靜態函式庫是一個.a檔,看不到裡面的標頭檔有那些,所以如果團隊中其它人要使用的話,還是要寫個說明文件,方便其它開發者閱讀。


[iOS] iOS App在Testflight上,接收Remote Push Notification的方法

  • 0
通常在處理Remote Push Notification的功能時,一定會先用自已的實機測試,也就是用XCode直接Build進iOS裝置做測試,這時候需要一個develope的pem來做為發送的憑證,然後等到實際上架後,再做1個Distribution的給正式上線的App使用。

但如果也要給別的使用者測試,諸如老闆、主管之類的,總不可能一個一個排隊來用XCode Build,會起肖,所以用Testflight(以下簡稱:TF)的服務可以幫我解決這個問題。

然後,沒有Remote Push Notification的App還算容易搞,發佈可以直上TF。但有的話,該怎麼辦?其實還是可以的。

因為要上TF時,一定要用發佈的Provisioning Profiles,所以就直接在Apple後台(iOS Dev Center)建1個專屬這個App用在TF的Distrubution,這個新建的Distrubution Profile發佈的時候要選擇Ad Hoc,不是App Store,否則最後不會出現Select Devices的頁面讓你勾選那個裝置可以裝,切記。

Distribution的類別


Select Devices-選擇那些裝置可以安裝App


好了,建好專屬的Distrubution Profile,下載丟到XCode去,再Archive一次吧,這樣就可以丟到TF上測試Remote Push Notification了。

Android GCM(Google Cloud Messaging) Client&Server端建置筆記

  • 0
最低需求2.3
模擬器測試最低需求4.2.2
1.Google API Library下載
開發環境請先下載Google APIs的library,把 /extras/google/google_play_services/libproject/google-play-services_lib/複製到你的專案資料夾底下,再Import進專案,File > Import, select Android > Existing Android Code into Workspace。可以參考Android官方

2.在AndroidManifest.xml,設定google api
然後在AndroidManifest.xml裡的Application加入
    <meta-data android:name=“com.google.android.gms.version" android:value="@integer/google_play_services_version" />

3.建立Google APIs專案,取得伺服器應用程式的金鑰
請先到Google APIs建立專案給GCM用,並建立一組「伺服器應用程式的金鑰」,產生的金鑰用來讓PHP發送Message用的。
https://console.developers.google.com/project
4.設定AndroidManifest.xml新增App背景服務與權限
在AndroidManifest.xml裡,設定以下權限
    <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.GET_ACCOUNTS" />     <uses-permission android:name="android.permission.WAKE_LOCK" />     <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />     <permission android:name=“com.app.yourapp.permission.C2D_MESSAGE"         android:protectionLevel="signature" />     <uses-permission android:name=“com.app.yourapp.permission.C2D_MESSAGE" />

裡面
同樣設定一些服務
    <receiver android:name=".GcmBroadcastReceiver” android:permission="com.google.android.c2dm.permission.SEND" >             <intent-filter >                 <action android:name="com.google.android.c2dm.intent.RECEIVE" />                 <category android:name=“com.app.yourapp" />             </intent-filter >     </receiver= >     <service android:name=".GcmIntentService" />

5.主程式MainActivity
宣告一個字串,這串數字是Google APIs專案中的專案編號。
String SENDER_ID “123456789”;

在OnCreate加入,主要判斷是不是有playerServices,及App有沒有取得RegistrationId。
        context = getApplicationContext();         //  GCM registration.         if (checkPlayServices()) {             gcm = GoogleCloudMessaging.getInstance(this);             regid = getRegistrationId(context);             if (regid.isEmpty()) {                 registerInBackground();             }             Log.d(TAG,"Regid"+regid);         } else {             Log.d(TAG, "No valid Google Play Services APK found.");         }

新增GcmIntentService繼承IntentService, 處理App通知收到後要做什麼事。
實際程式碼請參考Android Developer

新增GcmBroadcastReceiver繼承WakefulBroadcastReceiver, 這支程式要幹嘛不曉得,應該是常駐在背景,等待接收通知用的(請有緣人解釋給我聽)。

6.完成以上步驟,實際測試。
也可以用Simulator測試,只要把Simulator的Target設定成Google Api即可。

7.PHP Server端原始碼
//------------------------------
// The recipient registration IDs
// that will receive the push
// (Should be stored in your DB)
//
// Read about it here:
// http://developer.android.com/google/gcm/
//------------------------------

$data = array('title' => $title, 'message' => $message );
$ids = array($registration_id);
//------------------------------
// Call our custom GCM function
//------------------------------

sendGoogleCloudMessage(  $data, $ids );

//------------------------------
// Define custom GCM function
//------------------------------

function sendGoogleCloudMessage( $data, $ids )
{
//------------------------------
// Replace with real GCM API
// key from Google APIs Console
//
// https://code.google.com/apis/console/
//------------------------------

$apiKey = '金鑰'; // 貼上步驟3的伺服器應用程式的金鑰」

//------------------------------
// Define URL to GCM endpoint
//------------------------------

$url = 'https://android.googleapis.com/gcm/send';

//------------------------------
// Set GCM post variables
// (Device IDs and push payload)
//------------------------------

$post = array(
'registration_ids'  => $ids,
'data'              => $data,
);

//------------------------------
// Set CURL request headers
// (Authentication and type)
//------------------------------

$headers = array(
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);

//------------------------------
// Initialize curl handle
//------------------------------

$ch = curl_init();

//------------------------------
// Set URL to GCM endpoint
//------------------------------

curl_setopt( $ch, CURLOPT_URL, $url );

//------------------------------
// Set request method to POST
//------------------------------

curl_setopt( $ch, CURLOPT_POST, true );

//------------------------------
// Set our custom headers
//------------------------------

curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );

//------------------------------
// Get the response back as
// string instead of printing it
//------------------------------

curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

//------------------------------
// Set post data as JSON
//------------------------------

curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $post ) );

//------------------------------
// Actually send the push!
//------------------------------

$result = curl_exec( $ch );

//------------------------------
// Error? Display it!
//------------------------------

if ( curl_errno( $ch ) )
{
echo 'GCM error: ' . curl_error( $ch );
}

//------------------------------
// Close curl handle
//------------------------------

curl_close( $ch );

//------------------------------
// Debug GCM response
//------------------------------
echo $result;
}







Unity使用JSONObject解析json資料

  • 0
最近又要用到Json跟網路的功能,來做連線程式,於是找了一下Unity如何處理Json的方法。

我使用JSONObject來parser的函式庫,可以自行到Asset Store找下來安裝即可,免費的喔!

簡單講一下怎麼操作,分為Encoding與Decoding

Encoding
string ourPostData = "{\"Name\":\"Awei\"}"; 
假設你有一串Json的字串,如何轉成JSONObject呢?
JSONObject encodingObject = new JSONObject (JSONObject.Type.OBJECT);
encodingObject.AddField ("ID",1);
encodingObject.AddField ("Name", "Awei");
encodingObject.AddField ("Age", "18");
print ("Hello : " + q["Name"]);
執行結果
Hello : Awei

說明

第1行宣告1個JSONObject的物件,宣告同時,指定是一個空物件。
第2~4行把值塞入空物件,可以塞數值、字串或是陣列。
第5行將值讀出。




Decoding
string ourPostData = "{\"Name\":\"Awei\"}"; 
假設你有一串Json的字串,如何轉成JSONObject呢?
JSONObject output = new JSONObject(ourPostData);
print (output["Name"]);
執行結果
Awei

說明

第1行就是宣告1個JSONObject的物件,宣告同時,把json的字串帶入。
第2行就是印出output的物件,宣告的物件是1個陣列,可以帶Key的名字(ex:Name, Age),或是指定索引值(ex:0,1,2),取得該陣列的值。


用法大概是以上這樣,我是拿來做網路傳資料使用,所以在送出時,我需要把資料做Encoding然後處理成byte[]給網路去傳送,傳送的時候,直接在jsonobject後面加上.ToString(),即可轉成字串,丟給網路處理了;而接收的時候,就是使用Decoding將回傳的資料做解譯。

NGUI ScrollView加Button後不能拖拉的問題

在NGUI的ScrollView中,如果你的ScrollView有設定可以拖拉的話,當你又加入了Button到ScrollView,這時候你會發現,Button可以按,但ScrollView卻不能Drag了。

原因是BoxCollider,當我把Button的BoxCollider關閉就正常了,滿奇怪的原因。

而我目前解決的方法是在Button裡在加入UIDrag Scroll View這個Script,然後把ScrollView設定好,此時,Button可按又可拖拉囉!




iOS音樂背景播放功能

  • 1
這陣子在處理iOS背景音樂播放的功能,筆記一下


1.在UIViewController裡加上: 
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
[session setActive:YES error:nil]; 


2.在 info.plist 中加上「required background modes」Key ,  Value 選 App plays audio

3.若想要在螢幕鎖定或是多工列(按兩下Home)控制聲音播放的話,加上
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 
關閉加上
[[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
[self resignFirstResponder];
 設定canBecaomFirstResponder為Yes

- (BOOL)canBecomeFirstResponder {
    NSLog(@"canBecomeFirstResponder");    return YES;}


4. 加控制的事件偵測
-(void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent{
    if (receivedEvent.type == UIEventTypeRemoteControl) {
        switch (receivedEvent.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:                //開始or暫停
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:                //上一首
                break;
            case UIEventSubtypeRemoteControlNextTrack:                //下一頁
                break;
            case UIEventSubtypeRemoteControlBeginSeekingBackward:                //長按後退鍵
                break;
            case UIEventSubtypeRemoteControlEndSeekingBackward:                //長按後退鍵結束
                break;
              //還有其他事件等你自已發掘
            default:
                break;
        }
    }
}

5.可以加上以下這段,改變播放器的曲目資訊與專輯圖片
使用前請先 import MediaPlayer/MediaPlayer.h

- (void)configNowPlayingInfoCenter {
     
    Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
    if (playingInfoCenter) {
      
        MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];      
        // 當前播放歌曲的圖片        MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"Album.png"]];      
        NSDictionary*songInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"專輯名稱", MPMediaItemPropertyArtist,                                 @"專輯標題", MPMediaItemPropertyTitle,
                                 artwork, MPMediaItemPropertyArtwork,
                                 @"專輯介紹", MPMediaItemPropertyAlbumTitle,
                                 nil];
        center.nowPlayingInfo = songInfo;
      
    }
}


6.如果在Cocos2d裡想實現以上的功能,若有用到SimpleAudioEngine,請把以下程式碼插在步驟1.的程式碼之前,目的是讓SimpleAudioEngine暫停,不讓音效的資源佔住。
[SimpleAudioEngine end];

以上,就可以很輕鬆的把這個功能加到應用程式裡面了。




新年快樂2013

  • 0


我又孝年一次了,今年跨年已經不是去人擠人、倒數321這麼麻煩了,而是在家看完電視後,衝去墾丁看日出,超瘋的啦!大家一定會以為我有看到日出,然後一路很順的玩回來!錯了,事情永遠不是想像的那麼簡單,當天實際的情形事…(遠望)
我們5個人一台車,瘋瘋顛顛的從台南往墾丁出發,途中一切都很順利,到了墾丁後,發現也滿多人跟我們一樣瘋瘋顛顛的準備去看日出。好吧,人多就要排隊上接駁車,當然,我們也很順利的坐上接駁車上山前往龍磐公園,從鵝鑾鼻公園出發大約5分鐘的車程,很快就到了,到了公園後,也很順利的搶到了心目中的好位置、架好架腳,坐在地上等待2013年的第一道曙光,雖然當時的風超大,溫度有點低,但依然不減我們的興致。
時間接近太陽升起的時間,約莫6:10,天空漸漸的亮起,我也把相機準備好迎接聖光。眼看時間快到了,就在此時,所有的群眾突然開始往另一個方向移動,咦?不是會在我們正前方升起嗎?怎麼太陽會臨時決定從另一個地方升起,情報錯誤,剛剛的位置都白佔了,只好趕緊剛著跑到太陽的方向,繼續等待聖光的到來。
已經6:30分了,就在主持人倒數完5 4 3 2 1…的同時,我的心情也跟著down到了谷底,馬的B,雲層厚的跟棉花糖一樣,看得到太陽才有鬼咧,這時我的心情又浮現了另一個念頭,為何我現在在這裡吹風當傻子,決定在家睡覺不是更好嗎。俗話說的好,既有的事實改變不了,就改變自已的心境去接受它吧(其實心裡還是很嘟爛…),就走出去坐接駁車下山吧!
好了,故事講到這邊,從看不到日出開始,一連串的惡夢要來了。
人人人、人人人,那來這麼多人啊!要走10分鐘才走到開始排隊的地方,一行人決定,走下山…拖著疲備的身軀和扁扁的巴豆,走了1個小時,終於走到山下停車的地方。耶…終於可以坐車開始接下來的行程了,雖然沒看到日出,但至少來了墾丁,就暫時把聖光沒出現的事實擺一邊吧,開始今天的旅程囉!
碰…關好車門…發發發發發、發發發發發、發發發發發不動…怎麼發就是發不動,挫賽,車壞了發不起來,拎老師卡好咧,這三小朋友,日出沒看到就算了,車子也發不動,這三小朋友啦!無奈,只好找師傅來修了,幸好當時是已經是八點多了,找到當地的保養廠看了之後,說要拖回保養廠才能修,拖就拖吧,該修的也是要修,不然也回不了台南,就這樣,車修好後,時間也到了下午的1點。耶…沒錯,是1點,有夠餓的啦,過程中,我們只吃了一個簡單的漢堡跟紅茶,也斷斷續續的在等待的時間中補眠。
當時,在既定的行程中安排了去東港吃海產,所以當車一修好就立馬衝去東港,來吃個海鮮大餐,給它好好補充一下體力,至少讓這次的行程有夠漂亮的Ending。但真的事與願違,到了海產店後,被告知說,店家下午休息!.........拎老師咧…翻桌,又泡湯了。

最後,一群人帶著睡不飽、吃不到、沒看到的心情回到了台南。

下個結論,2013年的1月1日不適合出遊,適合在家睡著,但我卻跑了出去,享受了這一切的帶賽之旅。

開店與創業的理念

  • 0

創業就好像開店,目的都是去滿足顧客的需求,這中間,就要不斷的去調整你的產品以符合你的顧客,讓它成為一個循環,變成一門生意。

為什麼會突然打這些,因為最近我一個高中同學開店,在開幕的第二個禮拜,我就去找他一起聊聊天,畢竟當高中同學開店,這是我人生中的頭一遭,就像你出社會後,第一次聽到你的同學要結婚了的那樣驚訝。

在跟他聊天的過程,發現開店和創業是一樣的,都是在「解決問題」;嗯,還沒說我同學開什麼店,他開的是冰品店,裡面除了冰還有賣熱食類商品,當然賣什麼產品不是重點,重點在於他在當老闆的過程裡,我看到他必須要去「想」目前遇到什麼問題,該怎樣「解決」它。譬如,如何提升店的名氣?食物是否符合客人口味?剩下的沒賣出的食物該如何處置?…

於是在這過程中我發現了一個重點…「試」。除了試,還是試,一直試到多數顧客滿意的口味,一直試到店的名聲提高了,一直試到你心目中理想的方法。就跟創業一樣,很多產品你不做出來,不丟到市場上去受考驗,是不知道產品是不是符合使用者需求,或解決使用者的問題,所以你能做的就是試,然後逐步修正,即使不論是吃的、喝的、用的,公司的產品都要經歷過一個產品循環修正的過程,只是得到回應的速度快或慢之別了。

小蝦蝦並不想戰大鯨鯨,只是想做好服務

  • 0


新舊事物難免有衝突,遵尋讓用戶使用好的服務原則下,就可以讓創新服務繼續活下去。不過社會的底下是由人組成的,是人,就難免為了自已的利益而損害別人的利益,而無視於好的原則,變成大吃小,食物鏈的慘忍事件。


讓我們轉換到音樂這個領域,從過去的網路服務歷史來看,它一直都和網路科技有衝突,問題大多是 利益 版權所產生,如果當初沒有ezpeer的初試啼聲(結果是當時唱片業群起踏伐),也不會有後來收費的KKBOX和ezpeer,背後若沒有足夠的資源當後盾,來面對未來種種法律或版權等問題的話,小蝦米實在很難戰勝大鯨魚。

Now.in事件可以看出台灣的創業環境還有許多進步的空間,否則未來即使有更好的創新服務,開發者寫完程式後,要開始擔心某天會不會有陌生人到你房間命令你把服務關閉。再從創新服務的角度來看,音樂開始往社群和分享機制前進,KKBox和ezpeer音樂串流服務是否已經不能滿足社群和分享的需求了呢?這或許是另一個商機,就有待另個心臟大的創新者來開拓。




Now.in 創辦人 Victor 曾經,我有個夢想….
MR Jamie  YouTube、土豆網與 Now.in 的不同



讓自已休息一下

  • 0
來杯星巴克,偶爾享受一下悠閒的星期六下午,接下來一個星期都可以有滿滿的活力!

在店裡,看著店外的行人和路上的車,想起自已過去一個星期也是這麼忙著,除了為別人努力工作之外,當一下自已的主人,也給自已的身體和心靈慰勞一下。休息,是為了走更長遠的路,停下來,順便想想未來走的路是否正確,休息才有意義,否則,只是瞎忙。

當你生活開始變的無趣時,就試著用別人的角度,去體驗他幾個小時的生活,或許,你可以得到新的靈感,充實自已漸漸空虛的靈魂,同樣一天都是24小時再過,有人可以過的很精彩,有人卻虛度光陰,你呢?是那一種?

北海道蜜月

照片中的地點是北海道的小樽運河,也是我們去渡蜜月的地方。

北國真的好美呀,整片白茫茫的雪和零下的低溫,超適合新婚夫妻去渡蜜月的。

結婚之前,原本是想去大阪跟東京,跟本沒想說要到北海道渡蜜月,後來經友人的建議,推薦說北海道也不錯,然後再自已看看行程,真的覺得也不錯,安排好時間就去囉!

相簿裡還有很多照片,想看的可以點進去看看。期待下去再去大阪跟東京啦…

Google+相簿 : 北海道蜜月之旅
https://plus.google.com/photos/112880147482818240911/albums/5695141113121826833

喜喜

終於到了緊張的時刻,參加許多次的婚宴,這次的主人輪到我了,真的有種很妙的感覺。看著桌上的謝卡和舞台上螢幕播放的影片,似乎也透過這種方式來加深了我"真的結婚"的潛意識,告訴我,讓我知道,我有個家庭了,我終於從父母親的手上長大成人,要開始獨立過自已的生活了。

結婚,真的要有這些煩雜的過程,才會讓你記在心裡一輩子也不會忘,過程中,很辛苦,但結果很甜蜜!尤其看到許多認識和不認識的人給你祝福,那種甜甜的感覺,是經歷過的人才懂的。

文定之喜

  • 0

郭小威,恭喜你呀,這天是你的大日子,準備進入人生的下一個階段了,沒錯,是準備,還沒走進去,12月後才是正式進入冰河期甜蜜期,所以現在是準備期,好好的享受這段時間吧...XD。
話說,訂婚前的準備,該吵的沒少過,讓一個人成長不是因為經過訂婚這20分鐘,而是這20分鐘前的一個月準備時間,真的會讓人瘋狂兼抓狂,為了讓事情順利進行下去,讓大腦裡的理性大於情緒的經過是必須的,這才是主要讓一個人成長的原因。
原來能看到上面這張照片,是經過許多次的討論、安排時間、討論、安排時間、討論……就是這樣,所有的一切都是事前的準備,呼,怎麼感觸良多,我想結婚和宴客也一樣,再一個月就完成囉!

民國一百年10月10日~~永保安康車票

  • 0

我也三八的買了五張車票,映景嘛!100年的10月10號不做些白痴的事怎麼對得起自已…

好車票,不買嗎?


高雄隨便拍

  • 0


打給誰呢?
城市光廊







2011 Canon攝影馬拉松

  • 0
9/17這天是期待已久的攝影馬拉松,能成為高雄場350人其中一位的參賽者,真的太幸運啦。第一次拿著單眼參加這種大型的比賽,真是超High的,但也不愧是馬拉松,連續拍個12小時真的很累,尤其在高雄這種熱死人不嘗命的天氣,對參賽者來說,體力真的很重要,而且還需要在特定的時間回去領下一關的拍攝主題,才算完成該關卡,果真到了一個年紀體力還是有差...XD

高中同學會。大...成...功!

  • 1

第一次辦同學會,算是很新鮮的經驗,而且看到這麼多人捧場來參加,真的很開心,雖然只有幾個小時的聚會,沒辦法一一的跟所有人聊到天,但是能看到這麼多人聚在一起,聊工作的聊工作,打哈哈的打哈哈,身為主辦人的我,真的給它粉開心,尤其是看到結婚帶小孩來的同學,感觸真的很深,再過幾年,應該就有更多小鬼頭出現了。

另外,這次有參加的同學,我又另外設計了一張小卡送給你們,上面放了大家的姓名和畢業冊上的個人照片,方便大家"認人",沒想到大家還滿喜歡的,看到你們臉上驚喜的表情,再累我也值得啦。

參加過這麼多次的同學會,想說來辦一場不同的同學會,所以就規劃了3攤的活動,好讓大家聊個夠,看來這效果還不錯,下次辦的人或許可以參照這種方式來進行,而不是只是單純吃飯,然後就閃人了,而沒辦法參加的同學,也可以挑一場出現也不錯。

最後,沒出現的同學給我注意一下,我老早一個月前就跟大家講了,一開始說不能來就算了,但是說好又不來,畫一槓了啦!下次再不出現就拖出去...給我注意一點XD


LEGO Ninjago

  • 1
都老大不小了,很愛去百貨公司的玩具部看玩具,好像小孩喔,只怕以後會跟小孩一起搶玩具玩,金害金害。

這是樂高的新系列Ninjago,官網在這,我很喜歡武俠、忍者系列的玩意兒,這次看到樂高出了忍者系列,害我站在玩具他們面前好久(真的很像小朋友,只差沒有哭鬧而已),真的有被他們打到我的甜蜜點,好讚呀!而Ninjago和以往的不同,這次加入了卡片和戰鬥陀螺的元素,讓樂高不只是死板板的站在方塊上,還可以和同伴互相競賽,雖然新加入的元素不是讓我購買的衝動之一,但還是值得為樂高鼓勵一下,每次都會想出新的玩法,來騙死笨孩父母的錢,啊不是啦,是未來國家主人翁父母的錢,所以,我就被騙了(我還沒有小孩就被騙,有了就慘了...)。所以就敗了一組回家玩囉!

話說,回到家組完才發現,買了一組,會欲罷不能,就跟單眼一樣是個錢井深的世界,會想去買其他配件回來組合,因為單一隻太孤單了嘛,哈哈哈。老婆大人,以後可以讓我買嗎?XD