Month: May 2013

iOS: FMDB with ARC Semantic Issue

Posted by – May 28, 2013

身為一個 iOS 界的菜菜子,很多元件的使用並不是很熟悉。最近有個案子需要跟 SQLite 打交道,FMDB 是一套頗受推祟的 SQLite wrapper,可以簡化 SQLite 的操作。

FMDB on Github 下載套件。解壓縮後將 src 資料夾加入 XCODE 專案就可以使用了。當然,別忘了要加 libsqlite3.dylib

不過久久沒用 FMDB,一按下 compile 就爆了.... 噴出四個 Arc Semantic Issue。

compile error

呃.... 喔,我忘了要移除 src/fmdb.m 這個檔案.... 移除掉再重新編譯就可以了。

Update Subversion on Mac OS X 10.8

Posted by – May 21, 2013

雖然現在程式碼管理已經以 Git 為主了,不過偶爾需要維護一些舊案子還是會用 SVN,懶得轉了

Mac OS 本身有內建 SVN,不過卻是 1.6 版,最近修改一個舊案子就有碰到 project 已經升 1.7,Versions 和 SmartSVN 也用 1.7,唯獨 Terminal 下的 command line 卻是 1.6 的窘境。所以想說來更新一下好了,用最簡單的方法。

先到 http://www.wandisco.com/subversion/download 下載 for Mac OS 的 SVN,目前最新的版本為 Subversion 1.7.9 for OSX 10.8.x。接著依一般 App 安裝方式進行,預設安裝路徑為 /opt/subversion。

接著在 Terminal 輸入 export PATH=/opt/subversion/bin:$PATH 來變更系統路徑。醬醬,完成。

可以用 svn --version 來看版本號碼。

$ svn --version
svn, version 1.7.9 (r1462340)
compiled Apr 3 2013, 13:49:20

Copyright (C) 2013 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

MySQL: Convert Negative Value to Zero

Posted by – May 15, 2013

在 MySQL 裡經常會變動一些關於計數的數值。例如

UPDATE table SET count = count + 1

碰到減一的情況時,為了避免計數變成負值,可以多加一個判斷。

UPDATE table SET count = GREATEST(count - 1, 0)

如果是碰到空值的話,再多一步。

UPDATE table SET count = GREATEST(IFNULL(count, 0) - 1, 0)

簡單。

MySQL: On Duplicate Key Update Do Nothing

Posted by – May 10, 2013

在 MySQL 資料庫中 Insert 資料時常會有些例外情況需要處理,像是碰到 UNIQUE 鍵值重複時,如果不處理就會出現錯誤。

最近碰到一個需求是如果 UNIQUE 值重複時... 就什麼也不做。

有兩種解法,INSERT IGNORE 和 REPLACE。不過各自有缺點,前者是忽略錯誤訊息,但仍有可能出現警告,尤其是當以下情況發生時:

  • 插入值遇到 PRIMARY KEY 或 UNIQUE 重複。
  • 在 NOT NULL 欄位插入空值。

而 REPLACE 實際上在碰到重複值的行為是先 DELETEINSERT,顯而易見的問題是 auto-increment ID 會變動.... 外來鍵馬上掛掉。而且多一步 DELETE 對效率有負面影響。

第三種解法是 ON DUPLICATE KEY UPDATE,當值重複時觸發一個 UPDATE 行為。

INSERT INTO table_tags 
   SET tag = 'tag' 
    ON DUPLICATE KEY UPDATE tag = tag;

碰到重複鍵時結果是

Query OK, 0 rows affected (0.07 sec)

什麼也沒做,讚啦。

雖然什麼事都沒做,不過流程上需要 insert id 去跑下一步.... 理論上沒有實際進行 INSERT 行為就沒有 insert id,不過還好一樣可以趁著觸發 UPDATE 的時候做個手腳。將上句改為...

INSERT INTO table_tags 
   SET tag = 'tag' 
    ON DUPLICATE KEY UPDATE tag = tag,
                            tag_id = LAST_INSERT_ID(tag_id);

就可以取得 insert id,碰到重複值也能取得現有資料的 id。

Knockout JS: Filter an Array

Posted by – May 7, 2013

雖然只在兩個小型專案中使用過 Knockout JS,儘管語法稍嫌囉嗦了點,但能大幅減少前端頁面互動功能開發的難度。

最近碰到一個功能是頁面載入後,透過 AJAX 向 Server 端取回 JSON 資料,接著用 KO 顯示成列表。需求是能像 Mac OS 的 Spotlight 那樣,輸入文字即時顯示搜尋結果。

mac_os_x_spotlight

因為這串資料的變動頻率不高,所以從 KO 的 observableArray 過濾就可以了。