2014年9月30日 星期二

Jquery Mobile


  1. install xampp
  2. download query mobile
  3. download query.min
  4. make dir in xampp/htdocs for query to use

  1. add css & js folder
  2. copy *.js to js folder
  3. copy *.css & images folder to css folder

  1. make index.html at jam folder

2014年9月26日 星期五

夜騎20km & 清晨36km

從華中橋出發,沿新北市岸經中正橋、永福橋、福和橋、秀朗橋、陽光橋抵達新店岸,回程沿台北市岸返回華中橋,歷經約一小時,衝刺最高時速32km/hr,平均時速約20-22km/hr,使用GH-625M記錄。

從華中橋出發,沿北市岸經光復橋、華江橋、中興橋、忠孝橋、臺北橋、重陽橋達社子島入口,繞社子島折返,歷時約二小時,總距離約36km,平均時數約16-20km/hr,回程腿已無力,慢慢踩踏回來,並練習以畫圓方式完成踩踏。

2014年9月24日 星期三

socket on iOS

you can use CFStream or NSStream which use Object-C

@ViewController.h
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 9000

@interface ViewController : UIViewController<NSStreamDelegate>
{
    int flag ; //動作標志 0為傳送 1為接收
}

@property (nonatomic, retain) NSInputStream *inputStream;
@property (nonatomic, retain) NSOutputStream *outputStream;

@property (weak, nonatomic) IBOutlet UILabel *message;

- (IBAction)sendData:(id)sender;
- (IBAction)receiveData:(id)sender;


@end
define input & output stream
- (void)initNetworkCommunication
{
    
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.100", PORT, &readStream, &writeStream);
    
    _inputStream = (__bridge_transfer NSInputStream *)readStream;
    _outputStream = (__bridge_transfer NSOutputStream
                     *)writeStream;
    [_inputStream setDelegate:self];
    [_outputStream setDelegate:self];
    [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                            forMode:NSDefaultRunLoopMode];
    [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                             forMode:NSDefaultRunLoopMode];
    [_inputStream open];
    [_outputStream open];
    
}
initialize Network, set ip address & port number
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
    NSString *event;
    switch (streamEvent) {
        case NSStreamEventNone:
            event = @"NSStreamEventNone";
            break;
        case NSStreamEventOpenCompleted:
            event = @"NSStreamEventOpenCompleted";
            break;
        case NSStreamEventHasBytesAvailable:
            event = @"NSStreamEventHasBytesAvailable";
            if (flag ==1 && theStream == _inputStream) {
                NSMutableData *input = [[NSMutableData alloc] init];
                uint8_t buffer[1024];
                int len;
                while([_inputStream hasBytesAvailable])
                {
                    len = [_inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0)
                    {
                        [input appendBytes:buffer length:len];
                    }
                }
                NSString *resultstring = [[NSString alloc] initWithData:input encoding:NSUTF8StringEncoding];
                NSLog(@"接收:%@",resultstring);
                _message.text = resultstring;
            }
            break;
        case NSStreamEventHasSpaceAvailable:
            event = @"NSStreamEventHasSpaceAvailable";
            if (flag ==0 && theStream == _outputStream) {
                //輸出
                UInt8 buff[] = "Hello Server!";
                [_outputStream write:buff maxLength: strlen((const char*)buff)+1];
                 //必須關閉輸出流否則,伺服器端一直讀取不會停止,
                [_outputStream close];
            }
            break;
        case NSStreamEventErrorOccurred:
            event = @"NSStreamEventErrorOccurred";
            [self close];
            break;
        case NSStreamEventEndEncountered:
            event = @"NSStreamEventEndEncountered";
            NSLog(@"Error:%d:%@",[[theStream streamError] code], [[theStream streamError] localizedDescription]);
            break;
        default:
            [self close];
            event = @"Unknown";
            break;
    }
    NSLog(@"event------%@",event);
}
當有stream時,會呼叫此函數

socket on mac

需要定義callback function
在callback function裏面再分別註冊讀或寫的callback function
server使用CFSocketCreate產生,裏面註冊accept callback
接下來設定參數
/* 設定通訊埠和位址 */
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));             //memset函數對特殊的位址進行記憶體覆制
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;                  //AF_INET是設定 IPv4
    addr.sin_port = htons(PORT);                //htons函數 無號短整數數轉換成網路位元組序
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   //INADDR_ANY有核心分配,htonl函數 無號長整數數轉換成網路位元組序
    
    /* 從指定位元組緩沖區複製,一個不可變的CFData物件*/
    CFDataRef address = CFDataCreate(kCFAllocatorDefault, (UInt8*)&addr, sizeof(addr));
    
    /* 設定Socket*/
    if (CFSocketSetAddress(sserver, (CFDataRef)address) != kCFSocketSuccess) {
        fprintf(stderr, "Socket綁定失敗\n");
        CFRelease(sserver);
        return -1;
    }
接著建立runloop
/* 建立一個Run Loop Socket */
    CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sserver, 0);
    /* Socket源新增到Run Loop */
    CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
    CFRelease(sourceRef);
    
    printf("Socket listening on port %d\n", PORT);
    /* 執行Loop */
    CFRunLoopRun();
在accept callback中建立stream pipe
/* 建立讀寫Socket */
    CFStreamCreatePairWithSocket(kCFAllocatorDefault, sock,
                                 &readStream, &writeStream);
    
    if (!readStream || !writeStream) {
        close(sock);
        fprintf(stderr, "CFStreamCreatePairWithSocket() 失敗\n");
        return;
    }

建立用戶端物件及callback以及runloop
CFStreamClientContext streamCtxt = {0, NULL, NULL, NULL, NULL};
    // 登錄兩種回調函數
    CFReadStreamSetClient(readStream, kCFStreamEventHasBytesAvailable, ReadStreamClientCallBack, &streamCtxt);
    CFWriteStreamSetClient(writeStream, kCFStreamEventCanAcceptBytes, WriteStreamClientCallBack, &streamCtxt);
    
    //加入到循環當中
    CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
    CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
    
    CFReadStreamOpen(readStream);
    CFWriteStreamOpen(writeStream);




2014年9月21日 星期日

2014年9月18日 星期四

how to manually install android sdk distribution

因為需要在離線的方式安裝安卓的開發環境,eclipse可以直接下載bundle包,但是如果要安裝個別的SDK包,而不使用SDK manager等工具,可以參考這裡
http://blog.csdn.net/fragmentalice/article/details/23000381
至於壓縮的安裝包可以到這裡找

接著把下來的壓縮包解壓至應該放置的地方,譬如我要裝的是Google API level 18

在專案的設定裡面可以勾選,這樣就可正常編譯了

2014年9月16日 星期二

JSP, Tomcat安裝, eclipse開發

設定環境變數 JAVA_HOME。假設 JDK 安裝在 c:\jdk,我們需要執行 set JAVA_HOME=c:\jdk
download tomcat archive file & unzip it, go to bin, run startup.bat

開啟你喜歡的瀏覽器,並輸入 http://127.0.0.1:8080/
因為我是用4.3版的eclipse,所以又安裝了7.0的tomcat,這次下載windows service安裝包,一鍵安裝,環境變數都不用設,接下來要在eclipse裏面開發,開啓新專案
後面執行環境runtime記得要選tomcat,告訴eclipse tomcat安裝的路徑,以便測試及除錯
接著新增一個jsp檔案
這裡面空空的,沒有內容,執行後,eclipse會自動叫出tomcat並直接顯示網頁



2014年9月15日 星期一

GAE, RPC

Create a Java interface which extend "RemoteService"

RPC主要是使用AJAX,書上的範例要定義介面及其實作類別與非同步介面,再完成相對應的代碼

在deploy到GAE出現問題,所以將書上原本的內容修改一下 <url-pattern>/*</url-pattern>


https://www.youtube.com/user/GWTLecturer/videos?flow=grid&view=0&sort=da


GAE, UiBinder


Generate 2 file (java & xml), Goto xml Design mode, will show the UI graphic

Goto another java file (use design mode) that you want to add UI component, click system->choose component, input widget name, then you can put it on the edit area

Create a class and Generate constructor using fields

這樣產生了一個contact的類別

產生一個UiBinder

對應的java class,產生相關constructor, setter, getter,新增一個Contact

在contact的setter中加入代碼
在目標class中加入UiBinder的class
修改class中相關代碼以產生contact變數內容
跑起來



GAE, JDO

When the local service is started up, use the followed link to open admin interface


2014年9月12日 星期五

GAE, GWT

add a new web application using google developments tools, and uncheck generate code, then add a new module







在這裡用GWT Designer開啓出現錯誤,上網也找不出答案,於是決定將環境改成與書上一致,JDK用7, eclipse用4.3
結果還是一樣
最後使用書附光碟中的環境,果然一試就成功。
不死心,重新安裝eclipse 4.4 & JDK 8,在安裝gwt plug-in時只勾選部分
新增專案時只選GWT,不選GAE,結果也能使用GWT Designer
上傳到google

View this Page at Browser
接著來增加新的EntryPoint及對應的Html


HelloServlet