2011年7月31日 星期日

如何在Ubuntu/Linux中使用 Objective C + Blocks?



接續上篇"Objc Hello範例: Ubuntu上使用GNUstep and gobjc"一文。
當使用Blocks 語法時,卻發現不能使用,原因是Blocks 並未正式通過GNU GCC允許加入內建;
在不斷實驗並尋找後,終於找到一個解法:clang + BlocksRuntime。
BlocksRuntime 是 compiler-rt 專案的一部分。
首先使用svn指令下載: svn checkout http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
接著依序來編繹 ./BlocksRuntime/libBlocksRuntime.so
    1. cd compiler-rt/BlocksRuntime/
    2. 建立 ./config.h 包含下兩行內容
        #define HAVE_SYNC_BOOL_COMPARE_AND_SWAP_INT 1
        #define HAVE_SYNC_BOOL_COMPARE_AND_SWAP_LONG 1
    3. make
demoblocks 程式編繹
  - make run prefix=<你的路徑中包含compiler-rt>
  (註: 筆者的環境中已將 "BlocksRuntime/" 目錄複製到demoblocks 目錄中)
demoblocks範例:
main.m
#include <stdio.h>
#include "Block.h"
typedef int(^ablock)(void);
ablock dosth(int difference)
{
        __block int a = 1;
        int b = difference;
        return Block_copy(^{
                a += b;
                return a;
        });
}
int main()
{
        ablock a = dosth(10);
        int i;
        for (i = 0 ; i < 3; i++) {
                printf("%d\n", a());
        }
        Block_release(a);
        return 0;
}

Makefile
prefix?=.
BLOCKS_RT_DIR=$(prefix)/BlocksRuntime/
BLOCKS_RT= -I$(BLOCKS_RT_DIR) -L$(BLOCKS_RT_DIR) -lBlocksRuntime
all: demoblocks
demoblocks: main.m
        clang $(BLOCKS_RT) -fblocks $^ -o demoblocks
run: demoblocks
        export LD_LIBRARY_PATH=$(BLOCKS_RT_DIR) ; \
        ./demoblocks
clean:
        rm -f ./demoblocks
執行結果:make run prefix="./compiler-rt"

clang -I./BlocksRuntime/ -L./BlocksRuntime/ -lBlocksRuntime -fblocks main.m -o demoblocks
export LD_LIBRARY_PATH=./BlocksRuntime/ ; \
        ./demoblocks
11
21
31
由此下載範例源始碼
可參考Blocks 相關的文章:

2011年7月28日 星期四

Objc Hello範例: Ubuntu上使用GNUstep and gobjc


最近使用Objective-C越順手,想在Ubuntu環境中也能寫,
以及使用Mac/iOS 的Foundation函式,經參考 GNUstep on Linux 這篇文章,記錄以下心得。

環境安裝 Ubuntu 10.10:

  • sudo apt-get install gobjc 
  • sudo apt-get install gnustep
  • sudo apt-get install gnustep-devel


範例:
hello.h, hello.m and main.m
#include <foundation foundation.h>
@interface Hello: NSObject {
}
- (void) show;
@end

@implementation Hello

- (id) init
{
self = [super init];
NSLog(@"%s", __FUNCTION__);
return self;
}
- (void) show
{
NSLog(@"Hello GNUObjc with GNUstep");
}
- (void) dealloc
{
NSLog(@"%s", __FUNCTION__);
[super dealloc];
}
@end

int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Hello *obj = [[Hello alloc] init];
[obj show];
[obj release];
[pool drain];
return 0;
}

Makefile

STEPFLAGS= $(shell gnustep-config --objc-flags) -lgnustep-base
OBJCFLAGS= -g $(STEPFLAGS) -O
OBJCFILES= hello.m main.m
OBJS = $(OBJCFILES:.m=.o)

.SUFFIXES: .m .o

all: hello

.m.o:
$(CC) $(OBJCFLAGS) -c $<

hello: $(OBJS)
$(CC) -o $@ $^ -lobjc -lgnustep-base

run: hello
./$^

clean:
rm -f *.o *.d hello

執行結果:

2011-07-28 21:53:25.540 hello[12151] -[Hello init]
2011-07-28 21:53:25.541 hello[12151] Hello GNUObjc with GNUstep
2011-07-28 21:53:25.541 hello[12151] -[Hello dealloc]

請由此下載範例源始碼

(ps: 圖片來源為http://wiki.gnustep.org 所有)

2011年7月24日 星期日

試用FreeNas 8.01 Beta4

近來想將重要資料做個備份,所以稍微研究一下NAS系統相關資料。

巿面上最常看到 SynologyQnap兩家,而各其優勢如下:
Snology : DiskStation Manager (利用網頁技術開發出類視窗的使用者經驗)
Qnap: VioStor NVR (較強的BT功能,監控效能,安全監控中心

而我的需求大致只有三個功能:
  •  CIFS (網路上的芳鄰)
  •  FTP (檔案傳輸)
  •  Rsync (同步備份)
且對於資料安全性而言:
  • 當壞掉一顆硬碟時,還可正常運作
當我發現FreeNas 8,可能滿足需求時,立刻試裝了FreeNas 8到虛擬機器上。意外發現缺少Rsync功能,最後找到在FreeNas 8.01 Beta 4才提供支援,馬上升級。

FreeNas8檔案系統,選用ZFS,以及設定mirror 兩個虛擬硬碟(分別放在兩台實體硬碟上)。
實測上,寫入速度的快慢,因以同步方式寫入兩個硬碟,故會受到實體硬碟本身速度的限制。

結論:
個人使用的NAS,就筆者而言,功能不需要太多,只要滿足需求即可。
以下是我的配置:
VMware Esxi 4.1 + FreeNas 8.01Beta4 (ZFS, Rsync, FTP, CIFS, SSH)

更新08-01: 使用VMWare Player  來進行同配置的FreeNas 也運作順暢。
(Player 使用版本為3.1.4-385536)

更新09-16: FreeNas 8.01 RC1 發佈,請由此下載。主要更新:
  • Netatalk 2.2功能提供給OSX Lion Time machine 備份機制
  • ZFS 功能更新,提供給進階使用者所使用
  • 系統提供停用產生SWAP分割區對每一磁碟裝置
  • UFS提供掛載固定磁碟裝置至任意目錄
更新10-01: FreeNas 8.01 RC2 發佈,請由此下載。主要更新:
- django 更新到1.3.1版本修正安全漏洞. - istgt 更新至 20110928 - 更新FreeBSD 8.2-p3相關修補檔 http://security.freebsd.org/advisories/FreeBSD-SA-11:05.unix.asc http://security.freebsd.org/advisories/FreeBSD-SA-11:04.compress.asc




更新10-04: 類似ZFS的Linux檔案系統 btrfs for Linux

更新10-14: FreeNas 8.01 已正式發佈

更新 2012-05-26:
  重要更新8.04 p1: 如有使用CIFS (SAMBA 的安全性漏洞) 請儘速更新
  原版本更新資訊: http://www.freenas.org/about/news/item/release-notes-for-freenas-804-release-p1

更新 2012-12-25:
 有另一個分支使用 FreeBSD 9.x based:  nas4free.org key_features

延伸閱讀:

2011年7月13日 星期三

Python使用pyGUI實作動態LineChart




源起小筆最近忙著實作 Ubuntu 的前端UI, 因要需求最短時間做出 Prototype,
所以便選用 Python + PyGUI組合。另外PyGUI的文件相對來說比較詳細,也是選用的主因之一。

程式主要功能:

  • 背景執行緒+亂數產生器並紀錄到資料區,通知元作重繪。
  • 前景Linechart View元件,以資料區繪製線圖。
當小筆完成時,看到圖形動態繪出,隨時間移動變化時,非常感動。

如有興趣,可參考小筆的JuluCharts源碼GitHub分享,歡迎交流經驗或提供建議(JuluCharts的Wiki)

2011年7月10日 星期日

使用node.js 試作的網站測試程式Webtester

續前篇 Node.js 初體驗,輕輕鬆鬆寫網站!!!


本人試寫了Webtester相關程式,主要功能

  • 用來檢測網站內容是否正常
  • 產生檢測成功或失敗的統計資訊

程式碼在GitHub上分享,有興趣的人可參考看看。


其中包含下列程式:


2011年7月7日 星期四

Node.js 初體驗,輕輕鬆鬆寫網站!!!

最近在玩一些新的技術,其中有一個讓我覺得很酷一個東西 "Node.js",在觀賞天才作者的經驗分享影片,就花了一些時間將影片中的範例試寫,並附上自己的註解,源碼可參考本人的GitHub分享


話說Node.js 是一個有Event-I/O 的 V8 Javascript (google 出的 Javascript V8引擎)。
它十分容易上手,你只要略通Javascript,再參考說明文件,馬上就能寫一個簡單的網站。
例如:
Sample-web-server.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');


執行:
     node sample-web-server.js
結果:
伺服器端:
Server running at http://127.0.0.1:1337/


使用者瀏覽器:
Hello World


網友們可依下列順序對照影片參考GitHub上分享程式:
hello-world.js
hello-world2.js
tcp-server.js
web-server.js
web-server2.js
chat-server.js
complaint.js
complaint2.js
hello-world-server.js
animals-inherit.js 實驗Javascript OOP與Node.js 
include-module.js 測試使用modules
modules/
如想看細部的公用函式說明,可參考說明文件v0.4.9
註:node.js 正在快速發展中,目前已有說明文件v0.5.0可供參考新增的功能。