2016年2月23日 星期二

智付寶Android sdk

因為智付寶沒有提供sdk所以自己寫了一個
以智付寶官方API製成
放在Github上,有需要請自取:
https://github.com/lutas2000/Pay2Go-Android-Sdk
下一版將在WebView上加入return button,並編譯成aar
目前只連接MPG API,暫時不會加入其他API

一、申請支付寶帳號

正式網址:https://www.pay2go.com/
測試網址:https://cweb.pay2go.com/
註冊完帳號後在銷售中心開立一個商店
記下以下資訊:商店代號、hashKey、hashIV

二、Import Module

在Android Studio -> File -> new -> Import module選擇pay2go資料夾

加入permission:

<uses-permission android:name="android.permission.INTERNET"/>

三、使用

在Activity中加入:
Mpg mpg = new Mpg(this);
// ============== 必填 =====================
mpg.setAmt(1000); //支付金額
mpg.setItemDesc("商品資訊");
mpg.setLoginType(false); //user是否需要登入支付寶
mpg.setShop("商店代號", "your hashKey", "your hashIV");
mpg.setMerchantOrderNo("自訂訂單編號");
mpg.setEmail("付款者emial");
mpg.setRespondType("JSON");
// ============== 選填 =====================
mpg.setCREDIT(true);
mpg.setWEBATM(true);
mpg.setCVS(true);
mpg.setVACC(true);
mpg.setTest(true); //設定使用test API,不填則使用正式API

mpg.start();

四、執行

mpg.start()後會自動開啟PayActivity
並載入智付寶支付MPG頁面
image
image

Andorid Studio 重新命名package

今天在stackoverflow上看到的實用技巧
  1. 在左側project欄點擊齒輪圖案 ( Gears icon )
  2. 取消選取 Compact Empty Middle Packages
  3. 然後package資料夾就會分解開來,在需要重新命名的資料夾上按右鍵->Refactor->Rename即可
文章原始位置:
http://stackoverflow.com/questions/16804093/android-studio-rename-package

2015年11月24日 星期二

(CS193p) Developing Applications for IOS 2013 筆記 Lecture2 Xcode5

Lecture2 Xcode5

這禮拜繼續講解他的紙牌遊戲

一、 Desk

1. - (void)addCard:(*Card)card atTop:(BOOL)atTop
這個method的名稱為addCard atTop
extra arguments的穿插方式比較特別
注意Objective-C中method名稱不可重複

2. NSMutableArray
NSArray通常不會改變,而MutableArray可以動態加入或刪除物件,類似Java的ArrayList

3. Lasy Instantiation
MutableArray的getter需要覆寫,如果getter中只有return _property,將永遠只return nil,因為MutableArray從來沒有被allocate過。所以應該把getter改成:
- (NSMutableArray *)cards
{
    if(!_cards)
      _cards = [[NSMutableArray alloc] init];
    return _cards;

}

4. 補充unsigned
unsigned修飾詞代表非負數,直接寫unsigned等於unsigned int非負整數

5. Paul教授補充
Q:為什麼不用NSNumber? 
A:因為NSNumber是Object,這裡只是個簡單的local變數,通常需要再多個method間傳遞時才會用Object

二、PlayingCard

繼承自Card,用來製造撲克牌

1. Properties
suit:花色  rank:點數

2. NSUInteger
= unsigned int,在iPhone4(32-bit)和iPhone5(64-bit)上長度不同

3. @
@在Object-C裡面代表Object
而String物件(NSString)需要表達成@""
@[]代表Object Array

4.Override
覆寫contents的getter,return花色和點數的String
覆寫suit的getter,如果suit=nil,return "?"
覆寫suit的setter,只能輸入♠,♥,♣,
注意!同時Override setter和getter時會出現錯誤,一定要在前面加上:
@synthesize myProperty = _myProperty;

5. Class Method
似乎有點像Java的static method,呼叫時是用[MyClass calssMethod]
method前面不是"-",而是"+"
send to class, not send to instance of an Object
use it when you're creating things
Paul在這邊這樣用不是為了效能,是為了可讀性,因為每次使用這些method時都要產生一次String array

三、 PlayingCardDeck

繼承自Deck,只有一個method,目的是初始化52張撲克牌。

1.init method
只能呼叫一次
包含alloc
always return self

2. instancetype
IOS7加入,代表和目前class相同的class type

3. self = [super init]
必須先呼叫super initializer
initializer 不能 initialize時會 return nil,以此來檢查是否有正常initialize

四、Xcode

xcode的基本操作,也是這周的作業,在投影片裡面有很詳細的步驟。




2015年11月23日 星期一

(CS193p) Developing Applications for IOS 2013 筆記 Lecture1

很久沒碰IOS了,決定重新學起
IOS經典課程 Stanford CS193p Developing Applications for IOS
是史丹佛大學在iTunesU上面的公開課
有完整的課程影片、字幕和投影片pdf檔
但在2014年後的課程都改採用Swift了
所以還是回去看2013的IOS7 in Objective-C
這是我邊看邊寫的筆記,會這著課程的堂數寫


一、IOS系統架構


很快速的介紹系統架構,由下而上分別為4層:

Core OS
Base on Unix Kernel
BFD-based mock
在這個課程不太會用到
Core Services
IOS是基於C寫成的,但是Objective-C是物件導向語言,所以在這裡實現OO的language tools還有Multithreading。另外還有GPS定位等東西
Media
就Media
Cocoa Touch
實現IOS的UI。值得一題的是Cocoa touch是從Mac OS搬過來的,所以也能在Mac OS上使用,而且有30年以上的歷史,比我還老。
這個課程將集中在Media和Cocoa Touch層


二、Platform Components

工具(IDE):Xcode5 (我用的是Xcode7)
語言     :Objective-C
Frameworks: Foundation(Array,Dictionries...), UIKit
設計模式 :MVC 相當重要的觀念,下面會繼續介紹


三、MVC模式


Model View Controller,這個模式關乎於你程式中classes的分類,Class應分為三類:

Model:What of your program. 負責程式的運算、邏輯等
Controller:How your Model is presented to user. 負責Model和View的溝通
View:負責顯示UI

MVC的溝通形式:
1. Controller -> Model / View

Controller 可以直接talk to Model or View


2. Model <-> View
model 和view必須是完全獨立的,絕對不能讓他們直接溝通


3. View -> Controller



A)View可以跟controller溝通,但是View並不清楚它將跟哪個controller溝通。

像是User在View上按下某個Button,然後View將觸發一個Action,這個Action將通知 Controller中的某個target。
(圖示:action是箭,target是靶。按下button後箭射向靶,View所知道的就只有"我發射了Action")

B)Protocol
這是一個物件導項的觀念。View有時候會遇到較複雜的問題,教授在這裡分出3項概念:Will,Should,Did
以一個Scroller View為例:
當User按下螢幕時它會滑動嗎?(Will)
這時後該允許滑動嗎?(Should)
已經滑動到某個點?(Did)
但是View不會知道這些問題的答案,它會把這些問題委派(delegate)給controller,讓controller回答。

C)Data source
Views不該擁有它們所顯示的data,data應存在於Model
所以Controller還有一種委派的形式:Data source
以音樂列表為例:User開啟音樂列表,此時View就會問Controller總共有多少歌?
Controller從Model得知有10,000首,回覆View,View便創造出10,000的空間。
User往下滑,這時View就告訴Controller下滑到哪裡,Controller就以此向Model要資料,像:給我第150條起的10項條目

4. Model -> Controller
A)Notification & KYO(key value object)
model一樣不會直接跟Controller溝通
model的data改變時,會發出一個廣播(broadcast),而controller中的接收器會接收這個廣播,並決定是否要處理。Controller可以收到廣播後立刻向Model要求改變的資料。


四、Objective-C

Paul教授的講解不是從Hello World開始,而是一個紙牌遊戲,這禮拜實作的Class是"Card"。

1. Objective-C 是基於C的,所以C的code在Objective-C上也能執行

2. implementation file & header file
header file: public API 副檔名是.h
implementation file: private API 副檔名是.m

3. Properties
就是實例變數(Instance variable)
每個property都需要有getter和setter,在header宣告完後Objective-C會自動產生setter和getter,IDE上不會顯示出來,但是仍要記得它們的存在。
nonatomic代表不能同時有多個線程(Thread)set這個property
getter=isChosen,因為這邊chosen的getter會自動命名為"chosen",但通常我們在使用boolean時會希望它叫做"isChosen",所以加上這段重新命名
private property可以加在implementation file的 @interface class名()@end 之間

4. @synthesize contents = _contents
代表contents這個property在這裡的名字是"_contents"

5. Automatic reference counting
類似於java的garbage collection但是更為強大。
Objective-C所有物件都存在於heap
Objective-C會自動處理物件的free和allocate
property的修飾詞strong / weak 關乎於IOS如何處理Object的Memory
strong: Objective-C 會在所有指向此物件的strong pointer消失後free掉這個物件
weak: Objective-C 會在所有指向此物件的strong pointer消失後free掉這個物件,並把這個pointer設成nil。(在Objective-C送訊息給nil pointer不會造成crash)
不存在heap中的property不需要strong/weak修飾詞,像是BOOL

6. 初始值
所有的properties的初始值都是0,而pointer的初始值是nil

7. 程式碼翻譯(to Java)
Objective-C      [card.contents isEqualToString:self.contents]
Java             card.contents.equals(this.contents)

Objective-C      for(Card *card in otherCards)
Java             for(Card card : otherCards)

2015年10月21日 星期三

安裝MariaDB與phpMyAdmin (XAMPP)

最近想把原本的MySQL資料庫換成MariaDB
維基百科-MariaDB
還好包含PHP,Apache,MySQL的懶人包:XAMPP 在5.5.30版之後也將MySQL換為MariaDB了
XAMPP官網下載最新版的安裝檔
支援Windows,Mac,Linux三種平台
安裝包裡面還有FileZilla和Perl等東西,可以自行決定要不要安裝
安裝完後開啟XAMPP control panel,然後開啟Apache和MySQL server(雖然已經換成MariaDB,上面仍然是寫MySQL)
再來到瀏覽器進入 127.0.0.1/phpmyadmin 即可使用

寫到這裡發生一個問題:
phpMyAdmin在MariaDB 10.0.21新增使用者時會出現error:
      #1065 - Query was empty
      使用者不在權限表上
好在已經有人在GitHub上反映這個問題
而且已經得到解決
你可以去下載最新的phpMyAdmin或是照以下的步驟手動解決
打開xampp\phpMyAdmin\libraries 中的server_privileges.lib.php
加入以下綠色的code(4915行開始)
修改完再重開MariaDB Server就可正常執行

if (PMA_MYSQL_INT_VERSION >= 50507
         && PMA_Util::getServerType() == 'MySQL'
         && isset($_REQUEST['authentication_plugin'])
     ) {
         $create_user_stmt .= ' IDENTIFIED WITH '
             . $_REQUEST['authentication_plugin'];
     }
     if (PMA_MYSQL_INT_VERSION >= 50707
         && PMA_Util::getServerType() == 'MySQL'
         && strpos($create_user_stmt, '%') !== false
     ) {
         $create_user_stmt = str_replace(
 @@ -4944,7 +4946,9 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password)
     );
     $real_sql_query = $sql_query = $sql_query_stmt;

     if (PMA_MYSQL_INT_VERSION < 50707) {
         || PMA_Util::getServerType() != 'MySQL'
     )


別忘了phpMyAdmin預設是不用密碼的裸奔狀態
為root加入密碼
刪除那些不需密碼的root
並修改xampp\php\php.ini

/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Lang'] = '';

2015年9月15日 星期二

Parse : 建立Cloud code (Mac OS)

Cloud code 顧名思義就是直接在Parse的資料庫執行自訂的code
code必須由javaScript寫成
因為Parse官方的中文說明步驟有點怪,特別做了這個筆記

1. 安裝Parse Command Line Tool

    Mac或Linux只要在終端機下一行指令就能安裝:
    curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash
  
  Windows請看這裡

2. 連結Parse帳號

    輸入指令: parse new
    然後會要求你輸入帳號(Email)和密碼,如果是用google或fb帳號登入的,記得到帳戶那邊設定密碼
    接著選則project或新建project
    最後輸入本機目錄名稱(Cloud Code的檔案會儲存在 /Users/使用者名稱/本機目錄名稱)

3. 上傳Cloud Code

    打開你的Cloud code資料夾可以看到裡面有Cloud和Public兩個子資料夾
    Cloud裡面有一個main.js的Hello world示範程式
    用XCode就可以修改它
    用cd指令跳到Cloud code資料夾
    例: cd test
    然後下parse deploy指令就可同步到你的Parse帳號(此時可能會再次要求帳號密碼)

2015年8月25日 星期二

Jackcess 無法修改Row的error

有時在update row的時後會跳出unsupported collating sort order或類似的error
似乎是資料庫用了Jackcess不支援的sort格式導致的
作者也表示不想花太多時間去支援各種sort格式...
所以必須用Access修改資料庫的排序法才行
已下用Access 2003示範,Acess 2007也可以,只是按紐位置不同而已

1. 打開你的資料庫

2. 工具 -> 選項

3. 一般 -> 新的資料庫排序 -> 選擇「一般」-> 確定
 

4. 工具 -> 資料庫公用程式 -> 壓縮及修復資料庫

再次用Jackcess開啟時就可以正常修改了喔