2011.12.15일, QT 4.8.0이 출시되었습니다.


출처: https://plus.google.com/101835980341258435094/posts/M6u96M1u8hW

Qt 4.8.0 정식 버전이 출시됐습니다. 이번 버전에서 가장 큰 변화는 Qt를 다른 윈도우 시스템이나 장치로 쉽게 포팅할 수 있는 Qt Platform Abstraction(Lighthouse 프로젝트로도 불림) 기능 지원과 OpenGL의 쓰레드 지원, HTTP 요청의 멀티쓰레드 처리, 파일시스템 접근에 대한 최적화 작업, Qt WebKit 2.2.1 지원, Qt Quick의 성능 향상이 이루어졌습니다. 


Buy me a coffeeBuy me a coffee


구글에서는  Google API와 개발자 제품들을 주기율표(periodic table,元素周期表,週期律表) 형식으로 표현한 표를 웹사이트로 올렸습니다.

Google's Product Table

 

 

구글이 제공하는 API들과 개발자 사이트들이 많다 보니 이렇게 깔끔하게 정리를 해서 보여주네요.

Buy me a coffeeBuy me a coffee



이 글은 C++11 표준을 다룬 Elements of Modern C++ Style 을 읽고 나서 쓴 간단 평입니다.


C++ 언어를 만든 덴마크 사람인 비야네 스트롭스트룹(Bjarne Stroupstrup)은 아래와 같은 말을 했습니다.

“C++11 feels like a new language.” – Bjarne Stroustrup

Wikipedia - Bjarne Stroustrup

Elements of Modern C++ Style 에 나온 코드를 보면 이게 C++ 맞음 하면서 의심할 정도로 현재 쓰이는 C++98 표준과 C++11 표준의 차이를 보여주고 있습니다.


C++11 이 기존의 C++98과 다른 새로운 언어로 느끼게끔 만든 이유를 아래와 같이 설명하군요.( 출처: Elements of Modern C++ Style)

  • They change the styles and idioms you’ll use when writing C++ code, often including the way you’ll design C++ libraries. For example, you’ll see more smart pointer parameters and return values, and functions that return big objects by value.
  • They will be used so pervasively that you’ll probably see them in most code examples. For example, virtually every five-line modern C++ code example will say “auto” somewhere.

(번역이 매우 난감할정도로 한국어로 표현하기 어렵군요. 영어로 읽으면 와닿는 글귀를 한국어로 번역하면 이상하게 발번역되는 상황이라 원문만 넣었습니다.)


Elements of Modern C++ Style 에 나와있는 C++11 표준의 내용을 보니 기존의 C++가 너무 많이 달라서 새로운 언어라고 느낄 정도입니다.


밥벌이로 C++ 코드가지고 난리 치는 사람에게 새로 나온 C++11은 Legacy를 고려하지 않고 아예 새로 만든 거라고 생각될 정도이니깐요.


이제 C++11 표준에 맞춰서 프로그래밍을 해야하는 시기가 오겠군요. (공부할 것은 산더미)

Buy me a coffeeBuy me a coffee

웹캠으로 영상처리작업한다고 VFW(Video for Window)관련 라이브러리를 사용하여 프로그래밍을 하였다.

 캡쳐된 비디오 프레임을 화면에 보여주는 콜백함수를 쓰다 아래와 같은 에러가 발생할 경우가 있다.


error C2440: '형식 캐스팅' : 'LRESULT (__stdcall CCapture::* )(HWND,LPVIDEOHDR)'에서 'LPVOID'(으)로 변환할 수 없습니다.


이 경우엔 header에 선언된 부분에서 static을 빼먹을때 발생한다.


static LRESULT  CALLBACK onCaptureVidio(HWND hWnd, LPVIDEOHDR lpheader);


위와 같이 static을 써야 한다.


Buy me a coffeeBuy me a coffee




만약 Visual C++ 6.0에서 작성된 MFC 어플 소스코드를 가지고 작업하다 컴파일이 안될 경우가 있습니다.

아래와 같은 예가 나오면


playmmsound.cpp(53) : error C2440: 'static_cast' : 'LRESULT (__thiscall CPlayMMSound::* )(WPARAM,LPARAM)'에서 'void (__thiscall CWinThread::* )(WPARAM,LPARAM)'(으)로 변환할 수 없습니다. 대상 형식과 일치하는 범위에 이름이 같은 함수가 없습니다.


함수의 선언과 구현부의 LRESULT를 void로 바꿔야 제대로 돌아갑니다.



// for Thread messages

#define ON_THREAD_MESSAGE(message, memberFxn) \

    { message, 0, 0, 0, AfxSig_vwl, \

        (AFX_PMSG)(AFX_PMSGT) \

        (static_cast< void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM) > \

        (memberFxn)) },


위가 ON_THREAD_MESSAGE의 매크로의 정의입니다. 위에서 보면 void 함수를 받도록 되어 있습니다.

그러나 LRESULT 타입과 void 타입은 다르기 때문에 문제가 있습니다.

Visual Studio 2008,2010에서는 Visual C++ 6.0보다 엄격한 규칙을 적용하기 때문에, 기존에 허용되던 형변환이 허용되지 않아서 생기는 문제인것 같습니다.

쉽게 말해서 LRESULT로 선언된 메소드와 구현 부분을 전부 void type으로 바꿔야 제대로 돌아간다는 이야기입니다.


Buy me a coffeeBuy me a coffee



Unicode(유니코드)에 대해서 얼마나 아신가요?

홍민희님께서 작성한 Unicode 이해의 다양한 단계들 이란 글에서 심심풀이로 테스트를 하였습니다.

7단계중에서 저는 1~5단계까진 모두 경험해보고 해당되겠다는것을 알겠는데, 6~7단계는 잘 모르겠더군요.


5단계.
특정 문자셋을 사용하는 문자(열)을 바이트열로 인코딩하는 방식이 인코딩이며, UTF-8이 곧 Unicode가 아니라는 것을 아는 사람. Python에서unicode 타입과 str 타입이 왜 함께 있는지 이해하며 잘 사용한다. 혹은 C/C++에서 wchar_t[]/std::wstring으로 Unicode 문자열을 담아 사용하고 입출력 시에 그것을 인코드해서 char[]/std::string으로 변환해서 쓸 줄 안다. (또한 wchar_t가 곧 Unicode 문자를 뜻하는 것은 아니라는 것도 이해하고 있다.)


어릴때부터 컴퓨터를 사용해서 완성형과 조합형은 알았지만, 완성형은 DOS, 조합형은 한글과 컴퓨터사의 아래아한글에서 쓴다는것만 알았습니다.

그러다 MS사의 Windows95에서 한글 코드를 MS사에 맞는 문자코드(CP949, UHC)로 나온다고 해서 난리났던 잡지 기억도 나군요^^


문자 코드에 대해서 직접 접하게 된건 리눅스를 처음 설치하게 되었던 2004년 말 고3때였습니다.

2004년말 2005년초 정도부터 Linux에서 Unicode를 쓰는 것이 대세가 되어, 기본 서버에서 한글 설정이 UTF-8로 됨에 따라, 리눅스를 데탑으로 쓰는데 깨나 고생했던 기억이 나군요. (Windows와 Linux를 동시에 쓰는데 한글이 당연히 깨지는것이 부지기수)

(제가 처음 접한 Mandrake Linux에선 커널 2.4에서 2.6으로 올라가고 유니코드로 변경되는 등의 격변기를 겪던 시절)

그래서 UTF-8을 쓰면 Unicode를 완비할수 있겠다는 생각을 하였죠. (그러나 정태영님의 글 "컴퓨터 속의 한글"을 보는 순간 역시 나는 꼬꼬마였구나를 알게 되었죠@.@) 

그러다 모 학회 서버를 관리하게 되었습니다. 하드디스크 문제가 생겨서 리눅스 설치후에 복구를 하니 이런 썅이라는 소리가 나오면서 인코딩 문제때문에 정말 애 먹었지요.

그당시 리눅스의 기본 설치는 UTF-8인데, 기존 자료들은 EUC-KR이니 당연히 안깨질리는 없구요.

iconv로 삽질 하고, MySQL덤프 뜬거 억지로 UTF-8에서 끼워 넣는 식으로 겨우 돌렸던 기억이 납니다.

그러다 2008년 Ruby, 2010년 Python를 공부하다 보니 인코딩이 특정 문자셋을 사용하여 문자열을 바이트열로 인코딩 하는 방식이 인코딩(Encoding)이라는 걸 그냥 알게 되더군요.


문자열과 문자셋, 유니코드 같은 건 많이 경험해보고, 삽질을 해보고, 직접 프로그래밍을 많이 해봐야, 이해를 쉽게 하게 되더군요.

말로만 들으면 왜 저렇게 해야하는지 이해를 못했다, 직접 부딫쳐봐야  Unicode, 문자셋, 인코딩의 개념를 제대로 알게 되더군요.


대학 1~3학년때 워낙에 문자 인코딩때문에 억수로 삽질을 한 덕택에 5단계까지 온듯 합니다.


6단계 Unicode에 여러 평면(plane)이나 카테고리(category), 스크립트(script) 등의 분류가 존재한다는 것을 알고 있다. UCD의 존재를 알고 있다.

와 7단계 Unicode전문가는 저도 잘 모르는 거라... (먼산)


아래는 블로그에서 썼던 문자 인코딩때문에 겪었던 삽질기록들 (대학 입학전에도 UTF-8의 존재는 알았고, 대학 2학년때 wchar_t로 사용했던 과거도 있는데 많이 쓴 기록은 없고, 있다는건 알았다 정도?)


2005/02/08 - [분류 전체보기] - [TIP]Gmail 사용시 한글이 깨질 때


2006/09/23 - [독서(讀書)] - 질렀습니다


2007/08/04 - [컴퓨터/DB] - MySQLdump할때 한글 깨짐 방지


2007/08/05 - [컴퓨터/DB] - 꼬인 DB를 복구 완료 및 셋팅중.


2007/08/06 - [컴퓨터/DB] - DB 문자셋을 통일 시켜버릴까?




Buy me a coffeeBuy me a coffee


관련포스트
Inside the C Programming - 아쉽지만 원 저자의 요청으로 비공개가 되었습니다.

관련내용
GNUPro Toolkit Manuals 4. Basic Principles of the Tools


2010년 5월 30일 오후 2시경.

강남구 아무개동 아무개회사에서 GNU Korea의 blueguy님의 세미나가 있었습니다.

제목은 Inside the C Programming 이라는 것이였습니다.

세미나 내용은 Inside the C Programming 의 내용 그대로 진행하였습니다.

Inside the C Programming 의 내용을 보면 학부 3~4학년때 배우는 과목인 System Programming+Operating System+Compiler(앞부분)을 종합하여 넣은 것이라 내공이 상당하게 쌓이지 않은 이상 쉽게 설명하려고 해도 안드로메다로 넘어갈수 있습니다.

학부를 졸업한 사람에게도 내용이 이해되는건 몇개 있고 약간 모르는 내용들이 여러 개씩 나오긴 하지만, 학부생에게 이런 내용 알려주면 거의 상모돌리고 졸아 버릴 위험성이 높겠군요.

Inside the C Programming 에서 다루는 내용을 아래와 같이 압축하여 간단하게 설명하겠습니다.


1. (우선 C언어를 학부때 배웠다는 전제하에서) gcc(the GNU Compiler Collection-GNU C Compiler가 아님.)는 IDE를 가지지 않은 command line compiler이다.

gcc가 하는 일

(1) 사용자에게 옵션과 소스 파일명들의 입력을 받는다.

(2) 소스 파일명의 확장자를 보고 어떤 단계를 처리해야 할지 결정합니다.

(3) 사용자의 옵션을 각각의 단계를 맡고 있는 실행파일의 옵션으로 변경합니다.

(4) 각각의 단계를 맡고 있는 실행파일을 호출(fork와 exec이겠죠?)하여 단계를 수행하도록 한다.

2. gcc는 껍데기이고 내부에서 cpp, as, ld 등에서 처리된다.  (참조: GNUPro Toolkit Manuals 4. Basic Principles of the Tools)

3. 전처리(preprocessing)과정에서는 프로그래밍 컴파일을 하기전 소스코드의 매크로 치환을 합니다. 여기까지는 소스 코드의 parsing을 하지도 않고, 컴파일 과정도 거치지 않으므로 여기까진 어느 플랫폼의 컴파일러가 돌아가던 문제 없이 처리할수 있습니다.
(※ 참고로 전처리 과정은 매크로 치환을 할 뿐이고 에러를 잡을 수 없습니다.)

4. 전처리과정이 끝났으면 C언어 소스의 파싱을 합니다. 여기에서 모든 에러를 걸려줍니다. 전처리과정에선 매크로 치환만 하지 에러는 파싱과정에서 대부분을 잡습니다.

5. 파싱이 끝나고 나선 Assemble 과정을 거칩니다 as(GNU assembler)가 어셈블리 언어로 변환을 해 줍니다.

5. 이후 relocatable object과정을 거칩니다. Assemble과정이 끝나면 Object파일이 생성됩니다. 이 Object파일들을 모아서 어떤 symbol을 참조하는지에 대해서 조사하고 Linking을 하고 메모리상에 Loading을 하게 됩니다. 이를 Linking and Loading이라고 부릅니다.

2시간 동안 진행 되었던 Inside the C Programming (원 저자 요청으로 비공개) 세미나 내용을 매우 압축하여 표현하였으나 여기선 설명이 부족한듯 합니다. -_-;; 상세한 내용은 Inside the C Programming (원 저자 요청으로 비공개)을 보시기 바랍니다.

(참조: GNUPro Toolkit Manuals 4. Basic Principles of the Tools)
Compilation involves up to four stages, always in the following order:

  • preprocessing

  • compiling

  • assembling

  • linking


컴파일러가 컴파일을 하면 preprocessing, compiling, assembling, linking 등의 4단계로 진행된다고 설명할 수 있습니다. 컴파일러가 컴파일하는 것의 내부를 더 뜯어보면 Parsing은 물론이고 컴퓨터 메모리 구조등의 OS 기본지식이 있어야 알수 있는 내용들이 들어있습니다.

역시 컴퓨터공학부 3~4학년 과정 과목인 System Programming, Operating System, Compiler(앞부분) 3과목의 내용을 통틀어 설명하기 때문에 2시간의 세미나가 부족하긴 하더군요. 더 많은 정보를 얻고 싶은 분들은 gcc, cpp, as, ld 등의 manpage와 manual을 참조해야 되는 사실을 보고나선... (한글화가 된 자료는 joinc.co.kr의 내용을 다 읽어보면 빠른 시간내에 이해되실겁니다.)

공부할 것은 많고, 시간은 부족하다.


'컴퓨터 > 프로그래밍' 카테고리의 다른 글

Unicode의 이해 단계는?  (1) 2010.10.11
Inside the C compiler  (0) 2010.05.30
suvbersion 설치 및 사용법 링크  (1) 2010.03.31
Google App Engine으로 Twitter 봇을 구현!  (3) 2010.01.24
Regualr Expressions  (0) 2009.09.15
Buy me a coffeeBuy me a coffee


Subversion-HOWTO

PYRASIS님이 작성하신 Subversion-HOWTO라는 문서를 보고 연구실 서버에 subversion을 설치하고 어디든지 작업하고 커밋하고를 반복하여 프로그램 관리를 편리하게 만들려고 노력함.

사용법은 예전에 알고 있었지만, 서버 설치는 처음해보았음...


Subversion 이거 아니였으면 USB로 옮기고 작업하고, 그러다 파일 망가지고등의 끔찍한 일들로 고생 많이 했을것이다.

서브버전의 사용법에 대해선 아래의 책을 보면 됨.


서브버전을 이용한 실용적인 버전 관리
카테고리 컴퓨터/IT
지은이 Mike Mason (정보문화사, 2006년)
상세보기




Buy me a coffeeBuy me a coffee

오랜만의 프로그래밍 관련 포스팅입니다.

저는 이번에 제 Twitter 계정에 시간을 알려주는 봇을 구현하였습니다.
(봇[bot] : 특정시간이나 행위에 자동반응하는 형식의 실행하는 서비스를 말합니다)

저의 Twitter 계정에 "현재, 한국시간으로 2010년 1월 24일 오전 6시 를 알려드립니다." 라는 식의 시계 봇을 구현함.


위의 화면를 보시면, 제 트위터를 Following하시면 제가 현재 시간을 알려드리는 걸 알수 있습니다.

(봇은 어떻게 구현했나구요? Google AppEngine이라는 서비스로 Java로 구현했답니다^^)


Google AppEngine book
Google AppEngine book by Channy Yun 저작자 표시

(참고로 Google App Engine은 무료로 제공되는 Java/Python 기반 웹 호스팅 서비스입니다)


제가 간단한 트위터에 시간 알려주는 봇을 구현한 이유는 트위터에서 @xguru 라는 닉을 사용하는 권정혁님이 개발한 트위터 봇들에 영감을 얻고, 나도 프로그램을 작성할 수 있는 학생인데 한번 만들어 봐야지라는 문제의식으로부터 시작하였습니다.

트위터의 xguru님께서 만든 Twitter bot들입니다.


위의 시간을 알려주는 봇을 구현하는데엔 기본적인 Java지식, 그리고 Java Server Page(JSP), Servlet, Twitter API등을 알아야됩니다.

Java기반 지식들은 아 알겠다는 가정하에 트위터 API들을 알아봐야겠죠?

Twitter의 API에 대해선 Twitter에서 제공하는 사이트에서 검색을 하면 나옵니다.
Twitter API wiki

Twitter API는 REST API와 Search API라 나눠집니다.

  • Twitter REST API
    개발자들이 update timeline, status data, 사용자 정보등의 Twitter의 핵심 데이터를 작성, 수정등의 접근할 수 있게 허용해줍니다.
  • Twitter Search API
    Search API는 개발자들에게 Twitter 검색 서비스와 상호작용할수있도록 해주며, 검색 트랜드 관련 데이터에 접근 할수 있도록 해준다.
  • 위의 글의 출처는 아래와 같습니다. http://apiwiki.twitter.com/API-Overview

    The Twitter REST API methods allow developers to access core Twitter data. This includes update timelines, status data, and user information. The Search API methods give developers methods to interact with Twitter Search and trends data.

참고로 Twitter API를 사용할때 주의해야할 점은 일정시간 안에 전송되는 요청을 제한을 합니다.

Twitter API를 사용하였을 경우에 시간당 최대 호출을 150개로 제한을 하고 있죠.

최대 호출을 150개 넘게 호출하면 아래 화면과 같이 Limit라는 것에 걸려서 글을 작성 못하는 일이 발생합니다.

리밋에 대해선 트위터 리밋에 관하여…라는 글을 읽어보시기 바랍니다.

트위터 리밋에 걸릴때 나오는 문구입니다. 이것은 누군가 잘못된 암호를 보내려는 공격시도가 있을때 보이는 리밋문구입니다.


만약 프로그램을 작성한 봇이 요청을 시도할때 이유 없이 에러 발생하면 100% 리밋에 걸렸는지 의심을 해봐야됩니다.

여기서는 Twitter에 글을 작성할 것이기 때문에 Twitter REST API를 사용합니다.

Twitter REST API를 가지고 직접 구현해서 Twitter bot을 구현할 수 있습니다. 그러나 삽질이긴 합니다 =_=.

이미 트위터의 API를 구현한 3rd Party 라이브러리들이 많이 제공하고 있답니다.

http://apiwiki.twitter.com/Libraries 여기에서는 각종 언어로 Twitter REST API를 구현한 라이브러리들이 있습니다.

저는 간단하게 코딩을 하려는데 Twitter4J라는 라이브러리를 선택하였습니다.


Twitter4J는 Yusuke Yamamoto가 Java로 구현한 라이브러리입니다. 오픈소스이며, maven과 통합가능하며, Google App Engine과 친화적인 Java 라이브러리입니다. Twitter4J는 BSD 라이센스을 가지고 있습니다.

Twitter4J는 다음과 같은 기능을 제공한답니다.

  • 100% 순수 자바로 구현 되었으며, JDK 1.4.2 이후의 버전에서 동작한다.
  • Google Android Platform에서도 지원가능
  • 의존성이 없음. 추가적으로 필요한 jar 파일이 없어도 됨.
  • OAuth를 지원함
  • 빠른 수행을 위해서 데이터를 gzip으로 압축해서 전송함

Twitter4J 홈페이지 - http://twitter4j.org/en/index.html



Twitter4J 라이브러리를 사용하고 Eclipse와 Google App Engine을 이용하여 트윗 봇을 구현하였습니다.


Servlet mapping은 web.xml에 있으며 서블릿 클래스를 추가하고 싶으면 web.xml을 추가하면 됩니다.

자바코드를 작성하여 트윗에 올라갈 적절한 내용을 구현합니다.

자바로 트윗 봇을 구성하였으면, 매 시간마다 트윗을 올리기 위해서는 cron 기능을 이용해야합니다. cron설정을 하면 원하는 시간에 트윗을 올릴 수 있습니다.

Google App Engine에서 제공하는 cron을 사용하려면 war/WEB-INF 폴더에 cron.xml을 생성하여 cron.xml에 원하는 시간을 작성해서 올리면 됩니다.

cron 기능 수행에 대한 자세한 내용은 Google App Engine - Scheduled Tasks With Cron for Java 링크를 참조하기 바랍니다.

저는 트윗을 한시간에 하나씩 올리려고 아래와 같이 cron.xml을 구성하였습니다.


<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/mashuptime</url>
    <description>Execute time bot every 1 hours</description>
    <schedule>every 1 hours</schedule>
    <timezone>Asia/Seoul</timezone>
  </cron>
</cronentries>


작성을 하고 나선 Deploy를 하여 올리면 간단한 트윗봇이 완성됩니다^^

Java로 작성한 Twitter bot을 Google App Engine에 Deploy하고 올리려는 화면


Google AppEngine으로 Java로 된 웹 페이지를 코딩하고 나선, 갑자기 이런 생각을 하더군요.

Google AppEngine에서 cron기능을 제공하여 매 시간마다 Servlet을 작동시켜 아래와 같은 봇을 구현을 하는데엔 30분도 걸리지 않았습니다.

참 쉽조잉?



이번에 뭔가 Feel을 받으면 매쉬업으로 Twitter bot들을 계속 양산할 느낌이 들더군요. @.@

Buy me a coffeeBuy me a coffee

+ Recent posts