Feeds:
文章
迴響

Archive for 2008 年 06 月

終於有個好理由讓我使用 GAE,我的婚禮網站的網址 http://cwcwebapp.appspot.com/

雖然我預計打算採用如下架構

1. 後端: GAE

2. 前端:Ext.JS + Flex + Silverlight

不過,現階段我的需求前端技術即可滿足,還不需要使用 GAE 提供的 API。未來實作留言板功能就會使用。

目前頁面看起來像下圖

Snap4

Snap3

Read Full Post »

搜尋一下網路上針對這次的 GDD 分享,發現還蠻多人分享的,我也來說說我的心得。
老實說從高雄衝到台北參加 GDD 真的蠻累的,希望未來有高雄場次,總之…整天的議程都是透過咖啡和綠茶撐過去
 
不過,真的不枉我跑這一趟,總算對 Google 的相關技術有全面的瞭解
本次參加主要感興趣的主題是 GAE, Android, Gear,當然 Open Social 和 Map 也相當不錯,不過和目前我工作比較沒有直接相關
但是礙於時間,我選擇聽 GAE 和 Android 兩大主題,Gear 先被我放棄的原因是我覺得還不夠成熟
我來談談今天聽的五個議程
1. GAE 入門–Pete Koomen
這個議程比較簡單,很單純的 GAE 產品介紹。基本上大部分的資料都可透過 GAE 官方頁面找到。沒有太多的技術含量,至於 Demo 部份的留言板,因為之前已經有看過影片,所以也沒有特別的感動。
 
GAE 基本上想提供一個罐裝的開發環境,讓產品開發人員可以專注於 Domain,而不用分神於硬體、底層環境和架構等問題。他的目標是達到容易使用和容易延展。對於目前只支援 Python 來說,容易使用的目標還很遠,不過多學一種語言也沒什麼不好。GAE 依據統計結果,給出一個平均值的使用限制。在這個限制之內都可以正常使用。如果你的應用相當受到歡迎,可以付費取得更大的支援。
 
2. GAE 進階-Brett Blatkin
這個議程比較艱澀,談到 BigTable 的使用和限制以及與關聯式資料庫不同的思考方式,雖然在 BigTable 無法使用 Join,也無法得知資料 Count 數,可是確可透過平行運算快速計算出來。這部份要改變思維的如何有效率的取得你要的資料,並且如何將查詢以平行運算的思維來進行撰寫。是一個蠻特別的體驗
 
另外也解釋 Entity, Entities Group 名詞的涵義以及介紹一些比較有效率的寫法,還有以 Blog 張貼內容為範例解釋 BigTable 的運作,都是相當有趣的內容。
最後也特別提到可使用 memcache 來快取資料,以獲得最佳的程式效能 
 
在 GAE 部份有蠻多人提出問題,就我自己而言,想問下面兩個問題
1. 如何多人協同運作開發:因為目前 SDK 提供上傳程式卻沒有提供下載功能,因此,多人撰寫程式時,開發人員必須自行架設 CVS/SVN 等軟體來管理程式,希望未來能夠提供類似的功能。
2. 現有資料庫如何移轉:目前大部分的應用都採用關聯式資料庫,可是 GAE 採用 BigTable,若要讓現有的應用移轉到 GAE,是否有提供工具或便捷的方式。
可惜我的英文能力不好,沒有勇氣提問 T_T
 
3. Andriud 簡介–Jason Chen
a.  解釋 Activity, IntentReceiver, ContentProvider, Service 等名詞涵義。
b.  APK 封裝格式
c. TraceView 效能工具
d. 安全性議題
 
這個議程談到許多項目,也有許多然談到程式下載時,如何防堵病毒感染等有趣問題。Android 提供的是一個平台,對於安全性的基本保護是透過 Process 隔離,不同 Process 無法相互存取資料。但是要提供全面性的防護機制,必須透過第三方支援。
 
另外,應用程式可移植性,從功能面來說,只要符合標準 API 都可運作,不過對於不同尺寸的顯示裝置,可能還是需要微調。即便使用相對位置來進行 Layout 仍是如此。
在討論 Android 時,他的架構圖是不可少的,我比較注意其中的 OpenGL, WebKit, Video, Audio 等比較相關的部份。不過今天並沒有對這些部份提出討論。
 
4. Dalvik VM Internals — Ben Cheng
這個議程相當精彩。許多 Blog 也有紀錄,是因為主講人說中文的關係嗎?
首先探討為 Android 量身打造的 JVM,透過許多 Register, Constant Pool, 採用類似 RISC 的指令集減少 CPU, Memory 的使用,
也不使用 JIT 編譯器而透過 JNI或硬體 來並提高執行效率。
然後是 GC 採用 Parallel mark bit 方式實作, .dex 格式的介紹
最後探討手動最佳化程式的技巧
 
另外我也觀賞了別人的 mobile 作品,其中透過 gtalk 作為傳訊通道的想法相當有趣,未來我應該也有可應用的地方
 
基本上今天聽完這四個議程,我有相當多的獲得,不過還需要時間消化和測試,期待有更多的機會參加這樣的研討會
 
對於這次的研討會,我覺得辦的相當好,尤其是提供現場語言直譯,對於英文不靈光的我來說,真是一個最棒的服務
雖然我看大家都沒有租借,我還是想說大老遠跑來,還是不要礙於面子勉強聽英文,要聽回家慢慢聽
所以還是厚著臉皮租了 T_T
對於上午兩場的口譯人員,我覺得翻譯的相當好而且快速,下午的則稍嫌遜色~
 
最後…. 累了一天我還在這邊打心得…. 真的該去睡了…. 至於技術細節我就改天在整理 ~_~

Read Full Post »

原先系統安裝了 VS2008 且系統包含 C:Program FilesMicrosoft SDKsWindowsv5.0 目錄,所以,我一開始認為已經有安裝 Windows SDK,誰知道編譯 1.35 的 bjam 一直出現找不到 windows.h。重新將 INCLUDE 和 LIB 環境變數設定到 v5.0 下的 include 和 lib 目錄,編譯成功但連結會失敗。後來我才發現 v5.0 目錄下的 Lib 是空的,且只有提供 IA64 版本的 Library。

於是下載了最新的 Windows SDK for Windows Server 2008 and .NET Framework 3.5,這個是比較新的 v6.1 版本,映像檔位置如下

http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=f26b1aa4-741a-433a-9be5-fa919850bdbf&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2ff%2fe%2f6%2ffe6eb291-e187-4b06-ad78-bb45d066c30f%2f6.0.6001.18000.367-KRMSDK_EN.iso

下載安裝之後,會多出 C:Program FilesMicrosoft SDKsWindowsv6.1 目錄,使用 v6.1 內附的 "Microsoft Windows SDK v6.1 | CMD Shell",C++ 編譯器和 VS2008 內附的同為 v15.00.21022.08。

1. 首先將 boost 1.35 解開到 c:boost_1_35_0 (以下用 [boost] 取代)

2. 切換到 [boost]toolsjam ,執行 build_dist.bat

3. 複製 [boost]toolsjamstageboost-jam-3.1.16-1-ntx86bjam.exe 到 [boost]

4. 如果 boost 要支援 ICU, bzip, zlib, python 請事先安裝,執行 bjam.exe  –toolset=msvc-8.0 –build-type=complete stage install

5. 完成,產生 c:Boost 目錄,其中包含 includeboost-1_35 和 lib 子目錄

以上就是我的編譯過程,測試部份我就忽略啦~

相關文章
1. [C++]VS2005(VC8) 使用Boost

2. C++ Builder 6 編譯Boost 1.34.1

Read Full Post »

最近某個元件一直在 Debug 和 Release 模式間切換產生執行檔。因為參數不同,所以每次都需要重新編譯,浪費不少時間。

在 VS 環境,同一個專案可以有不同編譯參數設定和輸出目錄,所以,不同模式不會導致程式需要重新編譯。

可是 BCB6 專案一次只能設定一種模式(Full Debug or Release) ,於是想了一個克難的方式:產生兩個 .bpr

也就是 Debug 模式的相關編譯參數設定好,將編譯產出的中間檔(ex: .obj)輸出到 obj_debug 目錄,最終程式輸出到 final_debug,先存成 xxxx_debug.bpr。

然後複製一份 xxxx_debug.bpr 改成 設定 xxxx_release.bpr,用 BCB6 開啟並設定關編譯參數,然後中間檔設定輸出到 obj_release 目錄,最終輸出設定為 final_release 目錄。

然後用兩個 BCB6 分別開啟 xxxx_debug.bpr 和 xxxx_release.bpr 專案,

如此就可以在相同程式之下,分別在 final_debug 和 final_release 目錄取得 debug 和 release 模式的程式。

由於中間檔也分存於不同目錄,所以,彼此編譯也不受影響 ^^

不過這個方式也是有缺點的,當專案新增移除檔案時,另一個模式必須手動同步,否則可能編譯出不同的結果~

Read Full Post »

最近要將一個原有專案切割出不常變動的 Library 使其降低編譯的時間,可是 Library 包含 TForm 一直無法測試成功,會出現類似如下的錯誤訊息:

[Linker Error] Unable to open file ‘UNIT2.DFM’

原來 DFM 也需要讓 Link 才能成功。因此只要將 DFM 所在目錄加入到 LIB 路徑即可順利 Link~

ps. 測試程式下載

Read Full Post »

try…finally 的一個用途

今天看到一篇"Finally, the alternative fix for IE6’s memory leak is available"探討 IE6 記憶體洩漏的好文章,其中談到利用 try…finally 解決記憶體洩漏的問題,我簡單描述一下他的作法,如下:

function createButton() {
  var obj = document.createElement("button");
  obj.innerHTML = "click me";
  obj.onclick = function() {
    //handle onclick
  }
  obj.onmouseover = function() {
    //handle onmouseover
  }

  //this helps to fix the memory leak issue
  try {
    return obj;

  } finally {
    obj = null;
  }

}

一般的寫法會導致 obj 仍然 Reference 到記憶體,倒置 IE6 最後仍然無法釋放這塊記憶體,解法就是將 obj 設定為 null,可是,一般函數遇到 return 敘述就返回沒有辦法執行 obj=null 敘述。此時作者將 try…finally 用在這個不常見的地方,透過 finally 一定會執行的語言規則。將 return 放置在 try 區段,obj = null 放在 finally 一定會執行區段,來解決 IE6 記憶體洩漏的問題。

這樣的寫法讓我想起了 VB 的 Function 寫法,VB 的執行結果是透過 FunctionName = ReturnValue 方式來回傳,但是執行這個敘述並不會馬上返回函數呼叫點,而是執行到整個 Function 結束或是 Exit Function。因此,其他諸如 Javascript, C++, C# 都可用這個方式模擬 VB 函數回傳寫法。

假如有一個 VB 程序如下:

Public Sub PrintLine(ByRef msg As String)
    Debug.Print (msg)
End Sub

Public Function MyCalc(ByVal value As Integer) As Integer
    PrintLine "MyCalc before"
    MyCalc = value * 2
    PrintLine "MyCalc After"
End Function

Sub main()
    PrintLine "Before"
    MyCalc 2
    PrintLine "After"
End Sub

執行結果

Before
MyCalc before
MyCalc After
After

要透過 try..finally 模擬類似的語法,我嘗試用幾個目前常用的工具來實作

C++ Builder 6.0 測試

#include <vcl.h>
#include <string>
#include <iostream>
#pragma hdrstop

//—————————————————————————
int PrintLine(std::string msg){
    std::cout << msg << std::endl;
}

int MyCalc(int value){
    PrintLine("MyCalc before");
    try{
        return value*2;
    }__finally{
        PrintLine("MyCalc after");
    }
}
#pragma argsused
int main(int argc, char* argv[])
{
    PrintLine("before");
    MyCalc(2);
    PrintLine("after");
    return 0;
}

VC8 測試

#include "stdafx.h"
#include <iostream>
//—————————————————————————
void PrintLine(const char* msg){
    std::cout << msg << std::endl;
}

int MyCalc(int value){   
    PrintLine("MyCalc Before");
    __try{       
        return value*2;
    }__finally{
        PrintLine("MyCalc After");
    }

}

int main(int argc, char* argv[])
{
    PrintLine("Beforen");
    MyCalc(2);
    PrintLine("Aftern");
    return 0;
}

C# 測試

using System;

namespace ConsoleApplication1 {
    class Program {
        static void PrintLine(String msg){
            Console.WriteLine(msg);
        }

        static int MyCalc(int value) {           
            try {
                PrintLine("MyCalc before");
                return value*2;
            } finally {
                PrintLine("MyCalc After");
            }

        }
        static void Main(string[] args) {
            PrintLine( "Before");
            MyCalc(2);
            PrintLine("After");
        }
    }
}

總之對我而言是一個相當新穎的用法,未來應該有應用的地方。

Read Full Post »

Sysinternal 提供的 AutoRuns

開機啟動緩慢,不清楚開機時系統自動執行什麼程式,這個時候使用 AutoRuns 就可以一目瞭然,這個免費工具我覺得比市面上付費軟體還實用,如下的官方截圖可以看出他的項目非常繁多,對於熟悉系統的人員,可透過此工具微調系統,或是 IE 被安裝奇怪的軟體,都可透過此軟體輕鬆修改。

Autoruns

Read Full Post »

Older Posts »