1) 安裝 AppServ
2) 安裝成功後你會在AppServ的bin資料夾中照到openssl.exe
3) 在cmd執行以下指令:

openssl req -config C:\AppServ\Apache2.2\conf\openssl.cnf -new -out C:\AppServ\Apache2.2\conf\server.csr -keyout C:\AppServ\Apache2.2\conf\server.pem

openssl rsa -in C:\AppServ\Apache2.2\conf\server.pem -out C:\AppServ\Apache2.2\conf\server.key
openssl x509 -in C:\AppServ\Apache2.2\conf\server.csr -out C:\AppServ\Apache2.2\conf\server.crt -req -signkey C:\AppServ\Apache2.2\conf\server.key -days 365

4) 在 C:\AppServ\Apache2.2\conf\httpd.conf 將
#LoadModule ssl_module modules/mod_ssl.so 的註解去掉
#Include conf/extra/httpd-ssl.conf 的註解去掉

5) 在 C:\AppServ\Apache2.2\conf\extra\httpd-ssl.conf 設定如下:
SSLCertificateFile "C:\AppServ\Apache2.2\conf\server.crt"
SSLCertificateKeyFile "C:\AppServ\Apache2.2\conf\server.key"

6) Window 鍵 + R
7) 輸入 services.msc
8) 重新啟動 Apache Server
9) 在瀏覽器輸入 https://localhost, 成功!

註: 如果PORT 443, 剛好被別的應用程式所使用, APACHE SERVER會重開失敗喔! 要怎麼知道伺服器PORT443 是否被使用? 請參考本篇文章 Windows 如何知道哪個應用程式正在使用哪個PORT?

Google Cloud Platform 開始支援PHP了!
雖然還是在BETA階段, 但還是讓人忍不住要測試一下呀~
這次的測試是使用CodeIgnitor來使用,
結合Google Cloud SQL,
在本機連資料庫MYSQL是沒問題,
但DEPLOY之後發現正式機一直沒辦法連上.
錯誤資訊如下:

A Database Error Occurred
Unable to connect to your database server using the provided settings.
Filename: core/Loader.php
Line Number: 346

查了stackoverflow之後才發現 /application/config/database.php的設定需要微調才能連到資料庫:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'mysqli';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = FALSE;
$db['default']['stricton'] = FALSE;
$db['default']['socket'] = '/cloudsql/PROJECT-ID:INSTANCEID';

最後一行的SOCKET是codeignitor預設沒有的參數,
要記得加上才能成功連線

連線之後, 你會發現網站雖然可以啟動了,
但都沒有資料!怎麼回事呢?
原來是因為他會一直預設連到localhost,
這時必須要修改mysqli的drivers.

到 application/system/database/drivers/mysqli/mysqli_driver.php 將 db_connect 取代成以下的函數:

function db_connect()
{
    if(isset($this->socket)){
        return mysqli_connect(null, $this->username, null, $this->database, null, $this->socket);
    }
    elseif ($this->port != ”)
    {
        return mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
    }
    else
    {
        return mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
    }
}

就大功告成拉!

1. 先將UI透過Builder拉好

2. 將控制項都對應到CODE(按住CTRL直到CODE中)

3. 輸入相對應的CODE。


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initView];
}

- (void) initView {
//Field init

//Behavior Binding
self.webView.delegate = self;

//Other init logic
NSString * filePath = [[NSBundle mainBundle] pathForResource:@"home" ofType:@"html"];

NSURL * url = [NSURL fileURLWithPath:filePath];
NSURLRequest * req = [NSURLRequest requestWithURL:url];

[self.webView loadRequest:req];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)dealloc {
[_webView release];
[super dealloc];
}
@end

4. 此時需要調整Build Phase的一些設定,把Jquery.js從Compile Sources移到下方的Copy Bundle Resources

5. 這時JavaScript就可以Works了

6. 最後再處理下方的BUTTON對應Js的CODE(剛好都有overview的div)

(home.html 相對應的HTML)

日期: 2013年10月24日
活動: AWS Cloud Kata for Start-Ups and Developers
地點: 台大醫院國際會議中心

我們公司有不少的應用程式都搬上了AWS,所以這次難得Amazon到台大辦了一場研討會,就決定出席參加,研究看看還有甚麼服務是我不熟悉的。參加的另外一個原因是研討會中也有好幾個主題是跟Start-Ups相關的。本人是Start-Ups的一份子,當然要湊一腳聽聽啦~聽了幾個Session後主辦單位就開始宣傳在下午4點會舉辦一個現場Coding Challenge大賽,邀請大家在一個小時內寫出一個Photo Sharing的應用程式,參加的人都可以獲得USD50的AWS Credit。

參加就有錢拿,當然就邀了同行的阿里一起來玩玩。

比賽很快就開始了,主辦單位把題目公開給大家看。

有沒有從這個題目裡面看出一些玄機?一個小時內要寫出完整的應用程式是不可能的,主辦單位的主軸其實是站在「巨人的肩膀上」(我記得SESSION中Fandora的主講者也有放了進擊的巨人的照片),可以使用線上所有的第三方外掛。這就有趣了,要比的不是誰演算法最好最快,而是誰最厲害找外掛。就這樣,我的基本應用程式-Photo Sharing完成了。並且趕在很短的時間內的用FTP給上到了我新開設的EC2上(事先裝了LAMP的基本配備,來不及裝PhpMyAdmin)。

在這個比賽獲勝需要掌握幾個技巧,可以跟大家分享:

  1. 時間很短, 網路不快, 你不可能在短時間內上傳太多的外掛到SERVER, 所以一切都要精簡
  2. 能用third-party的software就盡量用, 但基本的功能要先在本機的環境測好再上(才不會被網路害死)
  3. 一開始就要布局整個時間的應用,我環境架設+上傳檔案的時間是半小時, coding的時間是半小時
  4. LAMP的環境要熟悉, 我都是用yum install的方式去安裝了httpd, php, mysql-server, php-mysql, php-gd
  5. 縮圖的功能使用WideImage, 順利將圖片等比例縮小, 不需要另外寫gd相關的函數(因為來不及呀)
  6. 獲勝的關鍵是使用了ADDTHIS, 上面充滿了不同社群網站的外掛,一個外掛+10分,所以我就這樣破表了(Joe Ziegler事後說他是故意這樣做的, 看看有沒有會發現這個破綻)

就這樣, 時間到了, 宣布冠軍, 很意外得分最高的竟然是我自己>.<

雖然得到的不是現金,但對於公司來說可以省了不少錢呢,除此之外還意外獲得了Kindle,真是太開心啦~哈哈哈。

P/S 之前就有聽說Amazon有出自己的平板,後來才知道其實他是個不傷的眼閱讀器。
以下是Kindle開箱文:


開啟盒子後可以看到上方有一張使用說明卡


使用說明卡


電源線


Kindle背部


單手拿剛剛好


使用的過程中很難感覺他是一個電子產品, 因為他沒有面板的反光(不像IPAD可以調整亮度大小)


內容物都可以透過Amazon的商店購買


在設定裡面還有一個實驗功能, 是Kindle自己的瀏覽器喔!

使用心得: 優點是看久了眼睛不容易疲勞(就像看書一樣), 缺點是沒辦法觸控, 所有EVENT都需要透過下方的控制盤去處理, 少了直覺的快速操作. 我想我會下載(購買)一本書來試玩看看~

最後附上這次活動的AGENDA,我想會有人有興趣 (其是這次的研討會的內容有很多東西值得討論,我有空會再跟大家分享)

PhoneGap Tutorial

Windows 方法

Android
1. 找到/PhoneGap/lib/android

2. 開啟「Eclipse」確定其中已安裝Android SDK,並找出安裝路徑
3. 在PATH環境變數中加入(以下的變數請按照使用者的實際環境做調整, 勿照抄):
…;/Android SDK/platform-tools;/Android SDK/tools;C:\ANT\bin;
4. 執行「cmd」,並切換路徑至/PhoneGap/lib/android/bin
5. 執行建立專案的指令:
create.bat ~/Desktop/app/HelloWorld_android com.test.HelloWorld HelloWorld

6. 從「Eclipse」建立新專案對應到剛到剛才建立的專案並測試執行

iOS專案
在Windows上建立iOS專案後還是得去MAC作打包的動作,所以乾脆直接在MAC OS建立吧。

MAC OS 方法

How to Create Android Project?
1. 終端機上
export PATH=${PATH}:/Users/username/android-sdks/platform-tools:/Users/username/android-sdks/tools

2. cd ~/Desktop/app/phonegap-2.9.0/lib/android/bin

3. ./create ~/Desktop/app/AppName_android com.test.appname Appname

————

How to Create iOS Project?

1. 終端機上
cd ~/Desktop/app/phonegap-2.9.0

2. ./create ~/Desktop/app/AppName_ios com.test.appname Appname

@property 的使用

在物件導向設計方法中我們會使用封裝來保護類別成員(成員亦包含了attribute與method),我們通常會寫method來存取attribute,命名為getter與setter,以下示範objective C的getter setter作法:

A.h

#import <Foundation/Foundation.h>

@interface A : NSObject {

int attr;

}

-(int)attr; //習慣上objective C不會在getter寫上get, 而是直接使用attribute作為getter

-(void)setAttr:(int)a;

@end

A.m

#import "A.h"

@implementation A

- (int)attr {

return self->attr; //原則上不加self也可以, 加了就可以跟method內的變數作區隔

}

-(void)setAttr: (int) a {

self->attr = a;

}

@end

當你使用以上的寫法作為getter與setter時,您在程式中使用實體物件時,就可以用"."的方式來作存取, 方在 assignment的左邊代表setter, 在右邊代表getter,示範如下:

main.m

#import <Foundation/Foundation.h>

#import "A.h"

int main(int argc, const char * argv[]) {

A *a = [A alloc];

[a.attr 30]; // assign 30 給這個物件的attribute

printf("The attribute of A is %d", a.attr); //取出a.attr的值, 會印出The attribute of A is 30

[a release];

}

是不是每次都要用傳統的作法才能達成"."的取用呢? 其實Objective C安排了一個比較簡單的作法,就是@property,那為甚麼要先介紹上面的做法呢?很簡單因為使用任何捷徑都應該先知道他的原理吧?知道了原理未來才不會在debug中苦哈哈。使用@property的寫法如下:

A.h

#import <Foundation/Foundation.h>

@interface A : NSObject {

int attr;

}

@property int attr; //這樣就會自動建立gettery與setter

@end

A.m

#import "A.h"

@implementation A

@synthesize attr; // 舊版的xcode需要成雙寫property與synthesize,新版的只要寫property其實就可以了,

//synthesize可以讓你改property的名字, 寫法是 @synthesize attr = ppp; (就改成ppp了)

@end

main.m

#import <Foundation/Foundation.h>

#import "A.h"

int main(int argc, const char * argv[]) {

A *a = [A alloc];

[a.attr 30]; // 一樣可以使用

printf("The attribute of A is %d", a.attr); //取出a.attr的值, 會印出The attribute of A is 30

[a release];

}

基本上使用@property 會自動作三件事情:

  1. 建立了 setPropertyName (setter)
  2. 建立了 propertyName (getter)
  3. 建立了 propertyName (attribute)
*這些method是可以被override的, 所以使用了@property後, 你也可以改寫成自己想用的方式。
@property的設定 //用來設定property的參數
讀寫控制
  1. readwrite (預設): 可以讀寫,setter和getter方法都會自動加入
  2. readonly: 只能讀, 只會加getter的方法

setter相關部分

  1. assign(預設): 用於只會和可量度的數值作用的情況, _abc = b;
  2. retain/strong 在指定時會呼叫物件的retain指令, 然後前一個數值會release掉
  3. copy: 在指定時會呼叫物件的copy指令, 然後前一個數值會release掉 (一定要實作NSCopy的Protocol, 否則會掛點)
atomicity (單一性)
  1. atomic (預設): 會讓屬性有執行緒安全(thread-safe)的特性
  2. nonatomic: synthesize的存取者會直接回傳數值

基礎

  1. Objective C其實是C的superset,所有之前學過的C語言語法在Objective C裡面都可以使用,而Objective C為C增加了一些功能。
  2. 學習Objective C有個要注意的地方,它不像.NET與JAVA那樣會有系統作Garbage Collection,一切記憶體管理都要自己來。
  3. 建議在建立Objective C專案的時候不要使用Automatic Reference Counting,因為他並不是像Garbage Collection那麼的自動化,純粹只是在編譯的時候幫你加一些跟記憶體相關的statement而已,處理不好可能還會造成memory的問題。
  4. 為甚麼Objective C的NSString,NSOject這些物件前面都有"NS"? 其實NS的是"NeXtStep" 的縮寫, 由這家公司所開發的程式語言。
  5. Nil 與 Null的差別?Nil是一個物件,他可以被操作[nil message],但NULL就是一個空物件,操作空的物件程式會死掉,但nil不會。
  6. include的部分 < … > 與 ""…"" 的差別? 前者是系統提供的.h檔,後者是使用自己建立的。
  7. NSLog 與 printf 的差別? NSLog 是真的會寫進程式日誌檔,所以如果只是平常程式debug其實可以用printf (如果不是寫iOS的話)
  8. NSString 的表示方法 @"…" 與 C的char array 用法完全不同, 不能當成同一種東西。
  9. 變數的命名要有意義,原則上如果程式碼寫得夠好,它本身就是一個註解。

使用方法 Method

  1. [myObject someMethod:argument];
  2. 它不像JAVA是用 "." (如 myObject.someMethod), "." 在Objective C有別的意義存在,稍後會解釋。
  3. Method的參數寫法相當特別,它的原意是希望整個Method念起來就像一個句子一樣,參數之間用空格間隔,格式如下:
    -(void)setBrand:(NSString *)brandname isA:(NSString *)type whichcost:(int) price;

Header File

  1. 用來宣告這個物件/協定有哪些成員(如attribute與method),記得在Objective C中不能制定初值(慣性上會在init裡面作初值的指定)
  2. 格式如下:(import後面不需要分號), attribute都是包在{ }之間,method寫在{}之後,"-" 代表的是實體方法。"+"代表的是靜態方法
#import <Foundation/Foundation.h>
@interface A : NSObject {
NSString *brand;
CGFloat size;
BOOL power;
NSDate *creationDate;
}
-(void)ma;
@end
補充: 一般上我們的認知是void是一種不會回傳東西的方法,但事實上(void)本身就是一個型態,回傳的也是void。

建立實體物件的方式

  1. 儘量不要用 new, 用 alloc, 因為 new 其實包含了兩個動作: alloc 加 init, 並不是所有的物件都會以init開始, 可能會initWithXXX, 所以與其這樣不如就自己alloc之後再挑init的方法,我們常看到的寫法就會這樣:
A *a = [[A alloc] init];
[a release]; //物件都要記得release, 他們會成對出現