Buy Reviews
Powered by MaxBlogPress  

Archive for the ‘Languages’ Category

GNU C Library – bindtextdomain

星期四, 三月 11th, 2010

函式: char * bindtextdomain (const char *domainname, const char *dirname)

bindtextdomain函式用於指定包含不同語言域名的訊息目錄,要正確的使用,就要有層次結構目錄中的目錄,下面會解釋這細節。

對程式設計師來說注意程式所要的翻譯被放在那個目錄結構開始是很重要的,像我們說/foo/bar,然後這個程式應該使用bindtextdomain呼叫來繫結目前程式對這個目錄的域名,所以要確認這個目錄可以找到,一支正確執行的程式不會依賴使用者設定一個環境變數。

bindtextdomain函式可以重複使用假如這個跟之前繫結的域名不同的domainname 參數沒有被覆寫時。

假如該程式想要在某個時間使用bindtextdomain,它就可以使用chdir函式來改變目前的工作目錄,dirname字串應該是絕對路徑名稱是很重要的,否則處理的目錄就會隨時間改變。

假如dirname參數是null指標,bindtextdomain會傳回目前domainname 域名所選擇的目錄。

bindtextdomain函式傳回一個含有所選擇目錄名稱的字串指標,這個字串會在函式內被配置耳且不能被使用者改變,假如系統在bindtextdomain執行時開始不用核心,傳回值會是NULL而且全域變數errno 會跟著被設定。

Amara XML工具包

星期三, 三月 10th, 2010

Amara XML工具包是針對XML處理的Python工具的開放原始碼收集,不只是工具,恰巧是用python編寫的,而且其工具是由底層到使用Python用語跟比其他程式語言有更多的優點的Python所建構。

Amara建構在4Suite上,而4Suite更著重在Python裡的XML標準的字面實施,Amara更增加了Python面對這些能力,Amara是開放原始碼,提供了Apache授權的4Suite變形,見檔案COPYING有更多詳細資料。

Akara是一個新的繖形專案,它包括了4Suite跟Amara 2.0做了全面的改善,見AkaraAmara2更多資訊, 我們強烈建議Amara使用這開始轉向Amara2

針對缺乏耐心的:快速安裝

Amara需要Python 2.4或之後的版本以及4Suite-XML 1.0rc4或之後的版本,它支援setuptools,所以你可以就這樣照下面的做:

easy_install amara

假如這沒有作用,你可能不能用easy_install來設定,那我建議你照這些簡單的操作來做。

easy_install會自動地幫你注意安裝的相依性,假如你不喜歡用easy_install,那就抓一個版本比1.0rc4新的Suite-XML套件來裝,然後使用一般方式來安裝Amara套件:

python setup.py install

或使用Windows安裝器,或其他的。

更多細節

Amara提供了你可以相信符合XML標準又不會失去熟悉Python感覺的工具,目前穩定的版本是1.0,開發版本是1.1.9,開發本有很多的效能跟API的改善,但是它不像穩定版那要有實地的測試,Amara最著名的組成部分是Bindery。

Amara Bindery: XML跟py一樣容易

Bindery將XML文件轉成Python物件樹對應使用在XML文件的詞彙,非常的清晰,例如,文件

<monty>
  <python spam="eggs">What do you mean "bleh"</python>
  <python ministry="abuse">But I was looking for argument</python>
</monty>

會變成一個資料結構所以你可以這樣寫:

binding.monty.python.spam

為了取得』eggs』值 (就像Python Unicode物件)或

binding.monty.python[1]

為了取得內容』But I was looking for argument』的元素物件,會有其它像這樣的Python工具,並且使得Bindery獨特之處就是針對繫結XML藉由一個很陳述規則基礎的系統驅動到Python的資料,你可以註冊那些由XPattern表現專門繫結的行為觸發的規則,它包括XPath支援而且很有效率,使用SAX來產生繫結,見使用者文件有更多細節。

使用者注意

開發者注意

stardict set gStarDictDataDir

星期一, 三月 8th, 2010

static void set_data_dir()
{
    //set gStarDictDataDir;
#ifdef _WIN32
    HMODULE hmod;

    if ((hmod = GetModuleHandle(NULL))==0) //取得目前 process的載入位址
        exit(EXIT_FAILURE);
    char tmp_buf[256];
    if (GetModuleFileName(hmod, tmp_buf, sizeof(tmp_buf))==0)
        exit(EXIT_FAILURE);

    gchar* buf = g_path_get_dirname(tmp_buf);
    gStarDictDataDir=buf;   
    g_free(buf);
#else
    gStarDictDataDir = STARDICT_DATA_DIR;
#endif
}

GetModuleHandle是Windows API的函式,函式庫是kernel32.dll,用來由模組名稱得到該模組的頭銜
GetModuleFileName也是Windows API的函式,函式庫是kernel32.dll,用來從已載入的模組得知該可執行檔的檔名及完整路徑

g_path_get_dirname是Glib函式庫裡雜項的實用函式,功能是取得取得檔案名稱的目錄部份。

g_free是釋放指向buf的記憶體。

這個函式的功能就是設定gStarDictDataDir的目錄,在Windows下我測到是指向C:\Program Files\StarDict,因為StarDict就是安裝在這裡!

Java SCJP 多型與轉型

星期五, 三月 5th, 2010

有下列程式:

class ClassA{}
class ClassB extends ClassA{}
class ClassC extends ClassA{}
public class Test{
public static void main(String[] args){
ClassA p0 = new ClassA();
ClassB p1 = new ClassB();
ClassC p2 = new ClassC();
ClassA p3 = new ClassB();
ClassA p4 = new ClassC();
}
}

下列程式何者正確?(請勾選出三項)
( )A. p0 = p1;
( )B. p1 = p2;
( )C. p2 = p4;
( )D. p2 = (ClassC)p1;
( )E. p1 = (ClassB)p3;
( )F. p2 = (ClassC)p4;

答案:A、E、F

起初做這題的時候,竟然把它看成是比較了,所以很簡單的題目,我就錯了!

php drupal 搜尋內容的警告

星期四, 三月 4th, 2010

2010-03-04_143925

主因是Trackback的6.x-1.2跟Spam的6.x-1.0不相容,好像Trackback參考舊的Spam模組,並且會用到spam_tracker資料表的probability欄位,但是Spam的6.x-1.0已沒有這個欄位,所以只能等待Trackback作者可以更新,我看了一下它的開發版本,已經將trackback.module裡的

define(‘TRACKBACK_WITH_SPAM’, module_exists(’spam’));

改成

define(‘TRACKBACK_WITH_SPAM’, FALSE);

這樣就不會有這個錯誤,只是就程式碼的意思來看,好像是要防trackback有垃圾的,所以改了之後,是不是可以防就不得而知了!

Dynamo 2.0 – Apache Cassandra

星期二, 三月 2nd, 2010

ㄚ琪最近讀Slashdot這一篇How Twitter Is Moving To the Cassandra Database,我特地查一下華文的新聞也看到有關碎碎念Twitter,這一則來自部落格MyNoSQL新的消息:Twitter用戶暴增20倍 計劃棄用MySQL,原來Twitter是用MySQL資料庫的,感覺就很親切,不過現在聽說要改用Cassandra資料庫,這個資料庫就真的很陌生了,進去Cassandra的網頁看看,它的slogan這樣寫:『A highly scalable, eventually consistent, distributed, structured key-value store. 』,這是一個高延展性的第二代分散式資料庫,Wiki上查到的應該是第一代的吧!至於第二代的分散式資料庫我就沒有sense了。Cassandra網站上說明它的由來,Dynamo的完整分散式設計跟Bigtable的欄位家族基礎的資料模式。

Dynamo跟Facebook又很有淵源,因為Cassandra是2008年由Facebook開放原始碼來的,它是由Avinash Lakshman跟Prashant Malik設計的,而Avinash Lakshman就是Amazon’s Dynamo的作者之一,在很多方面我們可以把Cassandra看成是Dynamo 2.0。

Bigtable就較熟悉了,之前的Google 應用服務引擎的筆記有提到這個資料庫的使用,因為太習慣用MySQL了,所以在用Bigtbale時可能就會稍微有點不習慣,不過這個問題應該很容易可以解決!

在MyNoSQL與Ryan King的對話中,有一些很有趣的地方,一個就是Ryan King曾經評估過的方案有哪些?『Various databases: HBase, Voldemort, MongoDB, MemcacheDB, Redis, Cassandra, HyperTable and probably some others I’m forgetting.』,裡面未曾提過我們所熟知的Oracle、MSSQL、DB2之類的,就覺得他的思維很奇特!

另外一個就是『How do you plan to migrate existing data?』,你如何計畫合併現有的資料,這可是很大的問題喔,就像ㄚ琪以前要把nuke的資料轉到drupal中,又或是在公司要作不同資料庫的資料轉移,這真的是很大的工程。

Ryan King提出的作法:

Write code that can write to Cassandra in parallel to Mysql, but keep it disabled by the tool I mentioned above

Slowly turn up the writes to Cassandra (we can do this by user groups “turn this feature on for employees only” or by percentages “turn this feature on for 1.2% of users”)

Find a bug :)

Turn the feature off

Fix the bug and deploy

GOTO #2

然後:

  1. Take a backup from the mysql databases
  2. Run an importer that imports the data to cassandraSome side notes here about importing. We were originally trying to use the BinaryMemtable[2] interface, but we actually found it to be too fast — it would saturate the backplane of our network. We’ve switched back to using the Thrift interface for bulk loading (and we still have to throttle it). The whole process takes about a week now. With infinite network bandwidth we could do it in about 7 hours on our current cluster.
  3. Once the data is imported we start turning on real read traffic to Cassandra (in parallel to the mysql traffic), again by user groups and percentages.
  4. Once we’re satisfied with the new system (we’re using the real production traffic with instrumentation in our application to QA the new datastore) we can start turning down traffic to the mysql databases.

只是聽聽人家在說Cassandra有多好,那沒什麼用,到不如實作一次看看,up and running with cassandra有提到怎麼安裝,我也來試試看!

用安裝CassandraCassandram 需有Java 6的環境才能跑!現在可以下載的版本是0.5.1
操作可以參考Cassandra Installation and Configuration這一篇,不過在Windows下跑有些另外要注意的是cassandra.bat這個檔,還有設定CASSANDRA_HOME的環境變數為D:\cassandra,cassandra.bat這個檔裡有

subst P: 『%CASSANDRA_HOME%\lib』
P:
set CLASSPATH=P:\

for %%i in (*.jar) do call :append %%i
goto okClasspath

:append
set CLASSPATH=%CLASSPATH%;P:\%*

SUBSET是建立路徑與磁碟機代號之間的關連。

所以要注意P槽是否正在使用中,如果使用中,就改成別的吧!還有-Dcom.sun.management.jmxremote.port=8080^這一行看來會使用8080 port,所以你有在用這個服務,需要把這服務關掉,或將這個port號改掉,不過我沒這樣試!

執行情形像這樣:
2010-03-02_175714

先擺著明天再繼續來玩玩看!

Java – StringBuffer、StringBuilder類別

星期五, 二月 26th, 2010

有下列程式:

public class String {
public String toString(){
StringBuffer buffer=new StringBuffer();
buffer.append(‘<’);
buffer.append(this.name);
buffer.append(‘>’);
return buffer.toString();
}

}

下列敘述何者為真?(請勾選出一項)
( )A. 這段程式不是thread-safe
( )B. 程式人員可以將StringBuffer 改為StringBuilder,而不會改變程式的執行
( )C. 要讓程式更有效率的話,這段程式應改為:rewritten: return』<』+ this.name+』>』;
( )D. 程式若改用 StringBuilder,也不會加強執行效率。

答案是A?,超奇怪的!

因為課本Java物件導向程式設計與SCJP認證明解在運用String、Date及包裝類別的StringBuffer、StringBuilder類別這節裡,提到「StringBuffer提供的方法都是執行緒安全(Thread-safe)的」,那A怎會是對的?我倒覺得檔案B較對!

__argc, __argv的功用

星期四, 二月 25th, 2010

在startdic的原始碼中,有這樣一段return stardict_main (__argc, __argv);

這也會讓人有點疑惑,查詢一下__argv的功用,你可以看到如何取得程式名稱在 Windows 架構應用程式和 Win32 架構的應用程式中這一篇,以C撰寫的MS-DOS應用程式,命令列可以取得從 argv 參數的 main ()。在特別程式名稱由 argv [0] 被指到]。

Windows 為基礎和以 Win32 基礎的應用程式使用 WinMain() 做為進入點。

在 32 位元應用程式中您就可以直接參考 __argv。在 stdlib.h 中有這樣的宣告:

extern int    _argc;
extern char**    _argv;

在 16 位元應用程式中 __argv 未宣告,而且您將需要宣告它。在您的來源或標頭檔中加入下列宣告。

   #ifdef __cplusplus
   extern "C"
   #endif
   extern char ** __argv;

這個__argc, __argv,主要是在接下來的gtk_init(&argc, &argv); 會用到,一般來說,我們不太會在命令列中執行這個,所以常會忽略到gtk-init的命令列參數有一些功用 ,可以參考GTK+ 2.0 教學-從這裡開始這篇的說明。

gtk+ vs WinMain

星期四, 二月 25th, 2010

在startdict的原始碼中,你會看到這樣的程式碼:

#ifdef _WIN32

#ifdef __GNUC__
#  ifndef _stdcall
#    define _stdcall  __attribute__((stdcall))
#  endif
#endif

int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
struct HINSTANCE__ *hPrevInstance,
char               *lpszCmdLine,
int                 nCmdShow)
{
stardictexe_hInstance = hInstance;
return stardict_main (__argc, __argv);
}
#endif

跟一般我們用int main開始寫程式,有一點差異,據說這是為了在跑的時候不要有命令視窗出現的關係,但是我測試好像沒這個問題,不過也沒關係,顯而易見的是這些原始碼,有很多可研究的!

StarDict 邁向更新路

星期一, 二月 22nd, 2010

[Linker error] undefined reference to `__cpu_features_init’

第一個碰到的問題就是這個,可以參考http://www.wretch.cc/blog/claytors/18277063,獲得解決,但是後來我有一個靈感,應該是Dev-C++的一個問題,所以嘗試用工具->檢查更新版本來安裝另外程式:

2010-02-22_144522

這個是MinGW runtime version 3.14

2010-02-22_144557

另一個是Mingw-utils。

確實是可以解決這個連結錯誤!