Author Archives: Enrico

warning C4819的處理

warning C4819: The file contains a character that cannot be represented in the current code page (950). Save the file in Unicode format to prevent data loss 選擇 File>Advanced Save Options => Encoding: Unicode (UTF-8 with signature) – Codepage 65001 … Continue reading

Posted in Tips | Leave a comment

VC++ pragma link

在VC++中 #pragma comment(lib, “my.lib”) 在link階段會搜尋 my.lib 一般配合_DEBUG與_MSC_VER 等巨集使用 可以根據編譯的特性來動態決定要link哪一個lib 例如 #if _MSC_VER >= 1400 #pragma comment(lib, “my.lib”) #elif … #endif 使用時建議放在單獨的cpp檔方便查找 MSVC++ 15.0 _MSC_VER == 1910 (Visual Studio 2017) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _MSC_VER … Continue reading

Posted in Tips | Leave a comment

boost build (visual studio 2015 winxp toolset)

for winxp support 以上是設定compile需要的參數與搜尋順序 (SDK v7.1A first)接下來build boost (這邊沒有使用icu or iconv) bootstrap.bat b2.exe -sBZIP2_SOURCE=D:\build\bzip2-1.0.6 -sZLIB_SOURCE=D:\build\zlib-1.2.11 toolset=msvc define=WINVER=0x0501 define=_WIN32_WINNT=0x0501 define=NTDDI_VERSION=0x05010000 define=PSAPI_VERSION=1 其他的選項 toolset=msvc link=static,shared (.lib or .dll) threading=multi runtime-link=static,shared (/MT or /MD) variant=debug,release address-model=32 or 64 安裝路徑 install –prefix= 其他注意: 需要安裝SDK … Continue reading

Posted in Library | Leave a comment

string::assign

#include #include int main() { std::string x(“0123456789”); x.assign(x.data() + 3, 5); std::cout size(), __n, “basic_string::assign”); if (_M_disjunct(__s) || _M_rep()->_M_is_shared()) return _M_replace_safe(size_type(0), this->size(), __s, __n); else { // Work in-place. const size_type __pos = __s – _M_data(); if (__pos >= __n) … Continue reading

Posted in C++ Language | Leave a comment

return void type

在C++ void function()中,如果要提前返回的話,只要加上return;那麼,是否可以return 一個void function呢? 答案是可以的,以下是C++03標準的摘錄 A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the expression is evaluated just before the function returns to its … Continue reading

Posted in C++ Language | Leave a comment

Message 訊息(消息) – 介紹

message – 消息或是訊息,無處不在。Inter-process communication(IPC)中有用shared memory的方式,也有的使用message passing的方式,在物件導向的世界裡物件接收與發送訊息(對應程式語言中method的呼叫),event driven的程式開發模型更是把訊息當成主角。事實上,我們甚至可以用訊息的觀點(或是模型)來理解這個世界,一切的人事物交互作用都是通過訊息來完成。 message一般可以用header + body(payload)來理解,message header所帶的是與資料內容以外的資訊(如metadata, message property),而body帶的是資料本身。

Posted in MOM | Leave a comment

Message 訊息(消息) – 邊界判定

在程式語言與資訊系統的世界哩,談到消息免不了要處理序列化的問題,畢竟如果message無法往外傳,這樣的系統等同是處於isolation的狀態。而一封封的message傳輸時,在接收端一般需要另外處理將stream bytes分割,才能還原為一封封的message,因此這時候會需要有消息邊界判定的機制。 消息邊界的判定可分為兩類方式 length prefix 描述消息的長度而知道邊界,下一封消息又往後再用同樣方式讀取,好處是可以預先知道整個消息的長度,缺點是需要知道消息的長度才能傳送(當然,這可由上層的application另外處理來傳送未知長度的消息),另外是如果因某些原因造成傳輸錯誤而未發現時(即使是TCP error rate也不是0),可能會造成訊息長度解析錯誤。這類型的作法在很多Message oriented middleware(MOM),也在DB的wire protocol也常見(如MySQL, MongoDB),主要原因是相對delimiter,不需要一直掃描內容,解析的效率較高。AMQP的作法也是採用這一種(參考amqp0-9-1) delimiter 分割字元 這種做法就是透過特殊的字元或byte組合來界定邊界,例如HTTP 透過\r\n\r\n 來區分 header, body。另外像H264 NAL也是利用特定的字元組合(start code eg. 00 00 00 01)來作為NAL unit的起始。這個方法的好處是,在設計的當的情況下,可以從消息流的中間開始解析,而不需要從一開始就一字不漏地接收。壞處是需要將整個內容掃過,因為要尋找delimiter並且內容中不能帶有與delimiter相同的位元組合。(若有則需要另外escape,接收時要將內容escaped的資料找出並且還原後再往application層傳) 當然﹐也可以利用delimiter + length prefix的組合來提高解析的效率。

Posted in MOM | Leave a comment

serialization 序列化

在C++程式語言中,語言本身所提供的資料表示可以用內建基礎型別(primitive type)如整型(integral type e.g. bool, char, int等)、浮點數(float, double),或是複合型別(array, class, pointer),但是當需要將程式語言理所表示的資料進行傳輸時,例如傳到磁碟上或是傳到另一個端點時,就會碰到要傳那些資料以及格式的問題,對於基礎型別來說,可以直接將整塊記憶體內容直接儲存傳送(但跨機器時可能會有其他問題,如byte ordering),對於牽涉到指標型別來說,就沒辦法指複製指標本身的值,而要考慮到所指的內容。物件的內容若牽涉到其他狀態(例如file handle)也沒辦法直接複製記憶體內容,因為這類資訊牽涉到當時的執行環境狀態。如果在重建端無法存取到所描述值的外部系統的狀態,這樣的重建是沒有意義的。 序列化有個最重要的原則: 序列化的資料足以重建回物件的狀態,跨越空間與時間。序列化的內容也可與外部系統相關,但前提是重建時要能夠存取的到,例如儲存DB table的row id,重建端要有辦法存取相關系統,才能還原。 這邊講物件重建回來原來狀態並非指結構上(structural)的值嚴格地完全相同,而是行為上(behavioral)要能夠一致。舉例來說,假如我有一個檔案讀寫的物件,那麼需要重建回物件的狀態使得接下來的操作行為可以與原來相同,這樣序列化至少就需要檔案路徑、開檔模式、讀寫的position offset等,而依照這樣資訊重建回來的物件,物件內部檔案handle的值一般來說不會相同,但對物件的操作結果應該會一致。 對於單純儲存值的物件,可以想成這些值本身就是狀態,我們去get/set value時,在序列化前和還原後行為應該一致。 常見的序列化格式 XML, JSON, Avro, Apache Thrift, Google ProtoBuf 等 在設計上從schema的自我描述、傳輸的效率、版本控制等各有特色。

Posted in MOM | Leave a comment

C/C++ comments

註解主要的目的是讓其他人可以快速的理解程式碼,或是原始作者在後來修改自己的程式碼,不至於深陷混亂的程式碼泥沼當中。但必須要注意註解過多過冗長不宜,因為註解本身不能取代程式碼,而程式碼才是主體。所以在註解上基本的原則是: 要說明function/class的目的,在function內部不易閱讀的地方註記使用的演算法或是方法的目的(rationale),讓閱讀者可以抓住開發者當時的思路。 workaround的部分也必須註記,因為通常workaround不是在原來的正常思路當中,如果不加以註記,有很大的機會在後來會完全摸不著頭緒 另外是如果整合了文件產生工具或是IDE整合,為了要讓工具提取重要的metadata,註解的格式就會有所規範,可以參考https://www.stack.nl/~dimitri/doxygen/manual/docblocks.html,XML Documentation (Visual C++) 在C/C++裡註解分兩種: 單行註解(single-line comments, C style) 與 多行註解(multi-line comments, C++ style)C89不支援單行註解,但C99標準加上了 將整段程式碼註解時一般可用多行註解的方式,但是多行註解不可nested,故若碰到段落內已有多行註解時則要改用全部單行或是用preprocessor裡的#if 0的方式處理,或是語言本身的 if(0)。 comment style有時候為了使註解醒目,會用一些排列方式呈現 一般來說,程式原始檔的註解會標記 檔案 作者 變更紀錄function, class 等的註解 相關參考資料:https://google.github.io/styleguide/cppguide.html#Commentshttp://en.cppreference.com/w/c/commenthttp://en.cppreference.com/w/cpp/commenthttp://www.oracle.com/technetwork/java/javase/documentation/index-137868.htmlalsoISO/IEC 9899:1999 6.4.9ISO/IEC 9899:1990 6.1.9

Posted in Tips | Leave a comment