What Is Software Design?

程式設計不是 “building software”,而是 “designing software”。

Is Design Dead?

軟體系統的設計是演進來的,不能一步到位,而是要藉由憑繁與使用者互動得到的回饋來修改系統設計。

Programming is Gardening, not Engineering

與其把程式設計比喻成蓋房子,實際上更像是園藝。

Orthogonality and the DRY Principle

所有程式設計活動其實都是維護,因為絕大部分的時間都在改code,寫一點改一點。即使是新專案,也很快需要回頭作修改。

2013年8月28日 星期三

mac 開發 android 安裝 IDE

step1

下載ADT Bundle
http://developer.android.com/sdk/index.html



step2
啟動Eclipse

step3

升級套件

如果遇到要求升級的錯誤訊息,可從Android SDK Manager升級套件 


step4

可從Window -> Android SDK Manager 打開Android SDK Manager 視窗





參考http://apphook.blogspot.tw/2013/08/adt-bundle.html

Mac 辨別 32it or 64bit





開terminal輸入uname -a, 出現i386事串就是32,x86_64就是64位元。


2013年8月20日 星期二

Phonegap LocalNotification 本地推播 Android

step1.
請先請到以下的網址 下載 phonegap-plugins
https://github.com/phonegap/phonegap-plugins/tree/master/Android/LocalNotification

step2.
複製LocalNotification.js 到你的 www資料夾內
並且在index.html 中把他加入進去
<script type="text/javascript" charset="utf-8" src="js/LocalNotification.js"></script>

step3.
創造一個 package  命名為com.phonegap.plugin.localnotification

AlarmHelper
AlarmOptions
AlarmReceiver
AlarmRestoreOnBoot
LocalNotification
以上的java檔加入

step4.
AlarmReceiver 來修改錯誤
將R檔選擇到你自己目前的drawable.ic_launcher

final Notification notification = new Notification(R.drawable.ic_launcher, tickerText,
System.currentTimeMillis());


LocalNotification來修改錯誤
這已經是舊版的
//import com.phonegap.api.Plugin;
//import com.phonegap.api.PluginResult;
改為新版的
import org.apache.cordova.api.CordovaPlugin;

import org.apache.cordova.api.PluginResult;

還有alarm 這 改為以下的Code
alarm = new AlarmHelper(this.cordova.getActivity());

step5.

Update your res/xml/plugins.xml file
加入以下的code


<plugin name="LocalNotification" value="com.phonegap.plugin.localnotification.LocalNotification" />

step6.

 AndroidManifest.xml 檔案裡面 找出<application>標籤
加入以下的code


<receiver android:name="com.phonegap.plugin.localnotification.AlarmReceiver" >
</receiver>

<receiver android:name="com.phonegap.plugin.localnotification.AlarmRestoreOnBoot" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

step7.
html 的使用方法

<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
        <link rel="stylesheet" type="text/css" href="css/index.css" />
        <script type="text/javascript" src="cordova_2.9.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
        <script type="text/javascript" charset="utf-8" src="js/LocalNotification.js"></script>
        <title>Hello World</title>

    <script type="text/javascript">
    document.addEventListener("deviceready", appReady, false);

    function appReady() {
        console.log("Device ready");
        if (typeof plugins !== "undefined") {
            plugins.localNotification
                    .add({
                        date : new Date(),
                        message : "Phonegap - Local Notification\r\nSubtitle comes after linebreak",
                        ticker : "This is a sample ticker text",
                        repeatDaily : false,
                        id : 4
                    });
        }
    }

    document.addEventListener("deviceready", appReady, false);
</script>

    </head>
    <body>


        <div class="app">
            <h1>Apache Cordova</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received">Device is Ready</p>
            </div>
        </div>

         <script type="text/javascript">
             //app.initialize();
         </script>
    </body>

</html>



2013年8月16日 星期五

ios Observer Pattern 的 NSNotificationCenter 使用 用法


在Design Patterns 中的 Observer Pattern 主要目是用來解決一對多的物件之間的依附關係 ,只要物件狀態一有變動,就可以通知其他相依物件做跟更新的動作,舉個簡單的例子 Observer 就像是一個班級裡負責聯絡的窗口一樣,當班級內有人有訊息需要通知給所有人時,只要告訴這個聯絡窗口,之後就由聯絡窗口統一通知班級內的所有人,當然也包含發佈消息的這個人。在 Objective-C 裡我們並不需要真的去實作出 Observer Pattern,透過使用 NSNotificationCenter 也可以達到相同的效果。


在開始前

先做一個.h  and .m


例如 Constant.h  and .m

先建立一組字串方便以後的處理

.h如下
extern NSString *const FoodChangeNoti;

.m如下


NSString *const FoodChangeNoti = @"FoodChangeNoti";


接下來要用到的viewcontroller  記得要把


#import "Constant.h"  加進去




NSNotificationCenter 可分為三個部分

第一個部分是
註冊

step1


在viewcontroller中

@interface FoodDateViewController () 

{
//宣告一個

id notiObserver;

}

step2

在viewcontroller 的viewDidLoad加入創建


    __weak FoodDateViewController *selfController = self;

    notiObserver = [[NSNotificationCenter defaultCenter] addObserverForName:FoodChangeNoti object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        [selfController updateUi];

    }];



-(void)updateUi
{
//在這裡面寫你要做的事情 例如更新畫面


}


第二個部分是
取消

step1

記得離開這個viewcontroller要把它釋放掉


-(void)dealloc
{
    if(notiObserver)
    {
        [[NSNotificationCenter defaultCenter] removeObserver:notiObserver];
        notiObserver = nil;
    }
    

}


setp2

在viewcontroller viewDidLoad 創建前也做一次釋放的動作

    if(notiObserver)
    {
        [[NSNotificationCenter defaultCenter] removeObserver:notiObserver];
        notiObserver = nil;
    }



第三個部分是
訊息通知

step1

發出通知


[[NSNotificationCenter defaultCenter] postNotificationName:FoodChangeNoti object:nil userInfo:nil];



參考文獻:http://furnacedigital.blogspot.tw/2011/09/observer-pattern-nsnotificationcenter.html

2013年8月12日 星期一

ios 6 and ios 7 處理 不能輸入未來時間的問題


step1

新增一個日期選擇器


MyPickerView *datePickerView;

step2

datePickerView = [MyPickerView getDatePickerViewWithBarForController:self title:@"select time" ];

datePickerView.datePickerView.datePickerMode = UIDatePickerModeDateAndTime;

datePickerView.datePickerView.maximumDate = [NSDate date];


[datePickerView.datePickerView addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];

設定最大日期不能超過今天

step3

因為ios6 在秒上沒有處理得很好

再加上dateChanged的方法來處理

-(void)dateChanged:(UIDatePicker*)sender
{
    if([sender.date compare:sender.minimumDate] == NSOrderedSame)
    {
        NSDate* oneSecondAfterPickersDate = [sender.date dateByAddingTimeInterval:1] ;
        [sender setDate:oneSecondAfterPickersDate animated:YES];
    }
}

2013年8月8日 星期四

ios objective c #ifdef #endif #define #if 用法

1.情況


#define _xxx


#ifdef _xxx

程序1

#else

程序2

#endif

這表示 如果 _xxx 的字符 是否有被 #define 定義過 如果定義了就會跑入程序1(如上所示)


2.情況


#define _xxx


#ifndef _xxx

程序1

#else

程序2

#endif

这里使用了#ifndef,表示的是if not def

跟上面相反  如果 如上面會跑 程序2


3.情況


#if 常量

程序1

#else

程序2

 #endif

這裡表示 常量 為真的  (非0 隨便的數字只要不是0) ,就執行程序1






2013年8月6日 星期二

ios UILabel 在同一段文字上 做不同顏色的調整

step1
創造出一個 Label
  eatLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 100, 30)];

  eatLabel.font = [UIFont systemFontOfSize:14];

step2.
創造出你要的文字 給予每ㄍㄜ

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"吃了  早餐"];
        [str addAttribute:NSForegroundColorAttributeName value:[UIColor 
orangeColor] range:NSMakeRange(0,2)];
        [str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(3,3)];

step3.

把字串接回 Label

    eatLabel.backgroundColor = [UIColor clearColor];
  eatLabel.attributedText = str;
        [self addSubview:eatLabel];