libroxml

홈페이지: http://www.libroxml.net/

roxml

C로 제작된 xml 파서이며 사용하기 아주 쉽고.. 속도도 빠르다.
스크립트 언어로 바인딩하기 좋을것 같다.
아래는 특징.

– load / unload XML document from buffers or files.
– navigate throughout an XML tree using simple getter API.
– handle namespace.
– use xpath syntax to access some nodes in the XML tree.
– read nodes contents (text, attributes, comments …)
– create/modify XML trees and save them to a file or buffer.

다운로드: libroxml-2.3.0.tar.gz

Bohem Garbage Collector

그니까.. C나 C++로 프로그램을 작성하다보면..
메모리 누수가 종종 일어나고.. 잡기 힘들때가 있는데..

이럴땐.. Garbage Collector를 사용하면 됨.
물론 성능 저하가 일어나긴 하겠지만.. 메모리 해제를 신경 쓰지 않아도 되는 큰 장점이…
(GC에 대한 장/단점은 오른쪽의 pdf 문서를 보면 될 것 같고.. 할당한 것은 무조건 해제해야 한다? )

그중.. Boehm GC 는 다음과 같이 define만 해주고 재 컴파일하면 됨.

#define malloc(x) GC_malloc(x)
#define calloc(n,x) GC_malloc((n)*(x))
#define realloc(p,x) GC_realloc((p),(x))
#define free(x) (x) = NULL

MinGW 에서 테스트된 Bohem GC는 아래에서 받았음.

https://gitorious.org/w64/bohem-gc/source/cc848d064720e7dac418fae81a706bbfb2afa019:

SMTP 서버 + 보안연결 메일 보내기

출처: http://www.codeproject.com/Articles/98355/SMTP-Client-with-SSL-TLS

공개된 CSmtp 라이브러리를 사용하여.. 메일 보내기..

CSmtp_v2_3_ssl.zip

아래는 MinGW를 사용하여 gmail의 TLS 보안 연결로 메일 보내는 예제..
OpenSSL 라이브러리 필요하며, 리눅스에서도 사용 가능..

#include "CSmtp.h"
#include <iostream>

int main()
{
	bool bError = false;

	try
	{
		CSmtp mail;

#define test_gmail_tls

#if defined(test_gmail_tls)
		mail.SetSMTPServer("smtp.gmail.com",587);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_gmail_ssl)
		mail.SetSMTPServer("smtp.gmail.com",465);
		mail.SetSecurityType(USE_SSL);
#elif defined(test_hotmail_TLS)
		mail.SetSMTPServer("smtp.live.com",25);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_aol_tls)
		mail.SetSMTPServer("smtp.aol.com",587);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_yahoo_ssl)
		mail.SetSMTPServer("plus.smtp.mail.yahoo.com",465);
		mail.SetSecurityType(USE_SSL);
#endif

		mail.SetLogin("user_id");
		mail.SetPassword("user_password");
  		mail.SetSenderName("User");
  		mail.SetSenderMail("user@domain.com");
  		mail.SetReplyTo("user@domain.com");
  		mail.SetSubject("The message");
  		mail.AddRecipient("friend@domain2.com");
  		mail.SetXPriority(XPRIORITY_NORMAL);
  		mail.SetXMailer("The Bat! (v3.02) Professional");
  		mail.AddMsgLine("Hello,");
		mail.AddMsgLine("");
		mail.AddMsgLine("...");
		mail.AddMsgLine("How are you today?");
		mail.AddMsgLine("");
		mail.AddMsgLine("Regards");
		mail.ModMsgLine(5,"regards");
		mail.DelMsgLine(2);
		mail.AddMsgLine("User");

  		//mail.AddAttachment("../test1.jpg");
  		//mail.AddAttachment("c:\\test2.exe");
		//mail.AddAttachment("c:\\test3.txt");
		mail.Send();
	}
	catch(ECSmtp e)
	{
		std::cout << "Error: " << e.GetErrorText().c_str() << ".\n";
		bError = true;
	}
	if(!bError)
		std::cout << "Mail was send successfully.\n";
	return 0;
}

libcurl 을 이용하여 웹페이지 긁어오기

MingW용 libcurl을 빌드후에.. http 페이지 긁어오는 걸 테스트해 봄..
static 빌드시에.. curl.h 파일 include 전에 CURL_STATICLIB define 필요.

#include <stdlib.h>
#include <stdio.h>
#define CURL_STATICLIB
#include <curl/curl.h>

struct url_data {
    size_t size;
    char* data;
};

size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {
    size_t index = data->size;
    size_t n = (size * nmemb);
    char* tmp;

    data->size += (size * nmemb);

#ifdef DEBUG
    fprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endif
    tmp = realloc(data->data, data->size + 1); /* +1 for '\0' */

    if(tmp) {
        data->data = tmp;
    } else {
        if(data->data) {
            free(data->data);
        }
        fprintf(stderr, "Failed to allocate memory.\n");
        return 0;
    }

    memcpy((data->data + index), ptr, n);
    data->data[data->size] = '\0';

    return size * nmemb;
}

char *handle_url(char* url) {
    CURL *curl;

    struct url_data data;
    data.size = 0;
    data.data = malloc(4096); /* reasonable size initial buffer */
    if(NULL == data.data) {
        fprintf(stderr, "Failed to allocate memory.\n");
        return NULL;
    }

    data.data[0] = '\0';

    CURLcode res;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",  
                        curl_easy_strerror(res));
        }

        curl_easy_cleanup(curl);

    }
    return data.data;
}

int main(int argc, char* argv[]) {
    char* data;
    data = handle_url("http://www.findip.kr");

    if(data) {
        printf("%s\n", data);
        free(data);
    }

    return 0;
}
$ gcc http.c -o http.exe -I/workspace/ETC/tclpackages/3rdparty/lib/curl-7.42.1/release/win32/include -L/workspace/ETC/tclpackages/3rdparty/lib/libssh2-1.4.4-20140926/release/win32/lib -L/workspace/ETC/tclpackages/3rdparty/lib/curl-7.42.1/release/win32/lib -L/workspace/ETC/tclpackages/3rdparty/lib/openssl-1.0.2a/release/win32/lib -lcurl -lws2_32 -lcrypt32 -lssh2 -lssl -lcrypto -lws2_32 -lgdi32	-lcrypt32 -lwldap32 /workspace/ETC/tclpackages/3rdparty/lib/zlib-1.2.8/release/win32/lib/libz.a

Qt Patcher

이건.. 뭐하는 프로그램이냐하면..
이미 설치된 Qt 라이브러리를.. 다른 폴더로 옮기면.. 동작하지 않는데..
이는 Qt 라이브러리내의 특정 파일들이.. 설치된 패스로 고정이 되어 있어서 그럼.
이 프로그램을 사용하여 새로 옮긴 폴더를 지정하면 새로이 패스를 적용하여 줌.
일단 Qt 4.8 버전에서는 테스트 되었음.

qtpatcher

QtPatcher.7z
QtPatche_src.7z

mintty 컬러 셋팅

msys의 home 디렉토리내 .mintty 파일에 다음을 추가.

ForegroundColour    =   197,200,198
BackgroundColour    =   39,40,34
CursorColour        =   253,157,79
Blue                =   102,217,239
BoldYellow          =   244,191,117
BoldWhite           =   249,248,245
BoldCyan            =   18,207,192
Green               =   166,226,46
Magenta             =   174,129,255
BoldMagenta         =   225,163,238
BoldBlue            =   111,194,239
Red                 =   251,159,177
BoldBlack           =   56,56,48
Black               =   39,40,34
BoldGreen           =   172,194,103
BoldRed             =   222,175,143
Yellow              =   253,151,31
White               =   245,244,241
Cyan                =   161,239,228

아래와 같이 변경됨.

mintty