2009/12/28

2009년 Best 프로그래밍 서적

흥배님의 블로그(合理的 Programmer jacking)에서 "2009년 Best 프로그래밍 서적"이란 글을 읽고 발췌해 놓았다. 다양한 분야에 대해서(나에 비해) 정리를 해 놓으셨는데 내가 읽어 보아야 할 책도 여러권 보였다.

  • Objective-C 오브젝티브 C: 맥과 아이폰 애플리케이션 프로그래밍
  • 제프리 리처의 Windows via C/C++
  • CLR via C# 2nd Edition
  • More Joel on Software 조엘 온 소프트웨어를 넘어서
  • Head First Software Development
  • WinDbg로 쉽게 배우는 Windows Debugging 윈도우 디버깅
  • 드리밍 인 코드: 천국과 지옥을 넘나드는 소프트웨어 개발 이야기
  • C++ 템플릿 가이드: 똑똑한 프로그래밍을 위한

    Original Post : http://neodreamer-dev.tistory.com/352

2009/12/23

CodeGear IDE Fix Pack 2009/2010 2.9 Released

Embarcadero의 RAD Studio IDE의 패치인 IDE Fix Pack 이 새 버전을 공개하였다.
아래 내용은 IDE Fix Pack 2.9에 대한 설명으로 홈페이지에서 발췌를 하였다.

The IDE Fix Pack 2009/2010 installs is a DLL-Expert that fixes the following Delphi/C++Builder 2009/2010 bugs at runtime. All changes are done in memory. No file on disk is modified. None of your projects are modified or benefit from the IDE Fix Pack.

RAD Studio 2010 fixes:
  • Undo destroys editor buffer
  • F1 key doesn’t work if invoked from the ObjectInspector
  • Vista compatible icons (256×256) aren’t supported
  • Stepping through the code can be slow

RAD Studio 2009 fixes:
  • Stepping through the code can be slow
  • Vista compatible icons (256×256) aren’t supported
  • Undo destroys editor buffer
  • 64 bit Debugger assertion (see also hotfix from Embarcadero for 2009)
  • QC #75738: Debugging extremly slow
  • QC #71575: Delphi 2009 literal string assigment
  • QC #47242: Possible AV when shutting down the IDE
  • QC #47807: Error insight fails to find TObject class
  • Possible deadlock when Error Insight calls ProcessMessages
  • QC #68493: Switching away and back to Delphi orphans focus on Code Editor
  • QC #37462: IDE may select the wrong file when performing a ctrl + left-click on a filename in the editor
  • QC #22880: Cannot resolve unit name
  • QC #58045: Component captions and component icons disappear from form designer
  • QC #69456: IDE dead lock when updating the editors
  • QC #55910: TDBText.Color always reverts to Parent.Color
  • QC #59963: Closing non-modal forms after a task switch can deactivate the application
  • QC #56252: TPageControl flickers a lot with active theming
  • QC #68730: TLabel is not painted on a themed, double-buffered TTabSheet in Vista
  • ToolsAPI IOTAProjectOptions.GetOptionNames destroys options.
  • QC #74646: Buffer overflow in TCustomClientDataSet.DataConvert with ftWideString

IDE Fix Pack 2009/2010 2.9
Original Post :
http://neodreamer-dev.tistory.com/351

2009/12/22

삼성 모바일 플랫폼 "바다" - API Reference 문서

기사 검색을 하던 도중 삼성 모바일 플랫폼에 대한 기사를 읽고 바다 사이트를 다시 방문해 보았다. 삼성의 글로벌 정책으로 인해서 인지 바다의 웹사이트는 온통 영어로만 되어 있다.(맘에 안 든다.)

플랫폼 바다를 발표하고 사이트를 방문했을 때와는 조금 바뀌었다. SDK나 다운 받아서 Hello bada 를 해 보려 했지만 삼성에서는 아직까지는 개인 개발자까지는 공개하지 않았다. 아직까지는 완성도라고 할만한 정도까지 만들어지지는 않았나 보다.

오늘은 사이트를 둘러보다 API 문서를 볼 수 있어서 링크를 걸어 두었다. 짬이 날 때 살짝 둘러 보아야 겠다.

bada API Refeence<

Original Post :
http://neodreamer-dev.tistory.com/350

Project 'xxx' is missing required source folder: 'gen' 해결하기

Hello Android 프로젝트를 하면서 프로젝트 생성시 발생하는 두 개의 에러를 해결하기 위한 방법이다.

프로젝트의 Property 대화상자에서 Java Build Path 의 내용 중 프로젝트에 해당하는 Android 버전을 가장 상위로 올려 준다.

그러면 두 개의 에러가 사라

Original Post : http://neodreamer-dev.tistory.com/349

Hello Android

안드로이드 개발 환경을 구축하고 난 뒤, 언어를 처음 배울 때 빠질 수 없는 Hello World 의 안드로이드 버전 Hello Android 를 출력 해 보았다.

설치된 Eclipse를 실행하여 Android 프로젝트를 생성한다.
사용자 삽입 이미지


프로젝트 이름은 HelloAndroid 를 하였고 Build Target 은 안드로이드 최신버전 2.0.1로 선택하였다. 프로젝트의 속성으로 Application name 을 HelloAndroid, Package name 을 임의로 com.android.hello 그리고 Activity 를 HelloAndroid로 설정 하고 Finish 를 선택하면 프로젝트가 만들어진다.
Eclipse의 Welcome 페이지를 닫으면 생성된 프로젝트를 볼 수 있다.
사용자 삽입 이미지



하지만 생성된 프로젝트에는 두 개의 에러가 있었다.
사용자 삽입 이미지


발생된 두 개의 에러를 조치하는 방법을 찾아 보았지만 찾을 수 없었다. Eclipse를 다시 시작하여 프로젝트를 열면 잠시 후 에러가 사라지는데 그 이유는 모르겠다. 좀 더 분석을 해 보아야겠다.

에러가 사라지고 난 후 프로젝트를 실행하면 실행하기 위한 가상 장치기 없을 경우 생성 여부를 묻는 대화상자가 나온다.
사용자 삽입 이미지
사용자 삽입 이미지


최고 해상도로 만들어진 프로젝트와 맞는 Target을 설정하여 가상 장치를 생성 하였다.
사용자 삽입 이미지


만들고 나면 장치를 선택하는 대화상자가 나오는데 이때 가상 장치를 선택하고 Refresh 버튼을 누르면 방금 전에 생성한 장치가 목록에 올라오는데 이때 이를 선택한다.
장치를 선택하면 안드로이드 가상 장치가 기동을 한다. 시뮬레이션 프로그램이라서 인지 부팅 속도가 많이 느리다.
사용자 삽입 이미지
사용자 삽입 이미지


드디어 부팅을 완료하고 프로그램이 기동된 모습이 나왔다.
사용자 삽입 이미지


이 상태 에서는 프로그램을 수정하고 실행을 하면 부팅과정을 거치지 않고 프로그램이 에뮬레이터에 실행이 된다. 하지만 그래도 컴파일 및 동작 속도는 많이 느린감이

Original Post : http://neodreamer-dev.tistory.com/348

2009/12/19

안드로이드 개발 환경 만들기 (윈도우즈 기반)

안드로이드 플랫폼에서 동작하는 프로그램을 만들기 위한 개발 환경을 만들어 보았다.
 
개발 환경에 필요한 사항은 다음과 같다.
  • JDK
  • Android SDK
  • eclipse IDE
 
Java Development Kit 설치하기
아래 주소에서 Java Development Kit (JDK) 를 설치하려는 PC에 맞는 것으로 다운 받는다.
http://java.sun.com/javase/downloads/widget/jdk6.jsp
JDK 버전 선택
현재 개발 환경을 꾸미기 위한 PC 는 Windows 7 64비트로 64비트용으로 다운 받았다. 다운 받을 때 로그인 대화상자가 나오는데 이는 무시(skip)하면 된다.
 


Android SDK 설치하기
아래의 주소에서  윈도우즈 용 Android SDK(android-sdk_r04-windows.zip) 를 다운 받는다.
http://developer.android.com/sdk/index.html
image
다운 받은 SDK(android-sdk_r04-windows.zip)를 하드디스크에 압축을 풀어 놓는다.
압축을 풀고 SDK setup.exe 를 실행시킨다. setup 프로그램이 실행이 되면 설치 가능한 Package가 있는지 인터넷을통해 확인을 하는데 아래와 같은 에러 메세지를 만날 때가 있다.
image
이때 Setting 에서 Force https://... source to be ftched using http:// 를 선택하여 http 프로토콜을 사용하도록 하고 Avaliable Packages 를 다시 확인해 본다.
image
image
여러 Package 중에서 Document 와 최신 API 그리고 USB 드라이버를 선택하여 설치 한다.
imageimage
 
eclipse IDE 설치하기
실제 개발 환경(IDE)로 사용할 eclipse 를 아래 주소에서 다운받아 하드디스크에 풀어 놓는다.
image
본인은 여러가지 버전 중에서 Classic 버전을 선택하였다.
이때 주의 할 점이 있다. JDK 나 JRE 가 64비트 버전만 설치되어 있다면 Eclipse도 64비트용을 사용하여야 한다. Windows 용 64비트 Eclipse는 Other downloads 에서 Latest Release 의 빌드 번호를 선택하여 나오는 페이지에 있다.
image
image
 
Eclipse 는 다운 받아 압축을 푸는 것으로 일단 설치가 끝난다. 그리고 나서 Eclipse 용 안드로이드 개발 툴킷을 설치한다.
Help 메뉴의 Install New Software... 를 선택하고 작업 경로를 추가 한다.
http://dl-ssl.google.com/android/eclipse/
image
추가를 하면 해당 경로에서 설치 가능한 프로그램 목록이 나온다.
image
개발 툴 항목을 모두 선택하고 Next 를 선택하여 설치를 한다. 설치 후 Eclipse 를 재시작 한 후 Preference 의 Android 탭을 선택하여 Android SDK 의 경로를 설정하고 Apply 를 선택하여 리스트가 갱신 되는 것을 확인한다.
image 
이것으로 안드로이드 개발에 필요한 프로그램들의 설치가 끝

Original Post : http://neodreamer-dev.tistory.com/347

2009/12/14

SQLite 3.6.21 Library ( VC x86, VC x64, BCC )

SQLite 3.6.21 버전의 라이브러리 파일이다.



VC 의 동적라이브러리는 새롭게 알게된 방법으로 만들었으며 테스트도 해 보았다.










+ 2009/12/16

이상하게도 Windows 7 에서 만들어진 Library가 XP 에서 정상동작을 하지 않는 것 같다. Visual C++ 을 최신 업데이트를 하면 동작을 하는 것 같은데 아직 확실치 않아서 Visual C++ 용 라이브러리를 XP 에서 다시 만들었다.



SQLite homepage<

Original Post : http://neodreamer-dev.tistory.com/346

2009/12/09

크기 조절이 가능한 CDialog 의 최소 크기 정하기

WM_GETMINMAXINFO 메시지 핸들러를 작성하여 최소 크기를 지정하면 된다.


void CxxDialog::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// Minimum Dialog Size
lpMMI->ptMinTrackSize.x = 800;
lpMMI->ptMinTrackSize.y = 600;

CDialog::OnGetMinMaxInfo(lpMMI);
}

Original Post : http://neodreamer-dev.tistory.com/345

SQLite3.dll 만들기 (Win32 & x64 with VC++ 2005)

얼마전에도 SQLite3.dll 을 만드는 방법에 대한 글을 올린적이 있었는데 그 글을 토대로 만들어진 64 비트용 dll 파일을 사용해 보려 했는데 동작을 하지 않아서 다른 방법을 찾아서 다리 정리를 해 보았다.


이 방법은 이전 방법과 유사하지만 보다 간단하고 정상 독작하는 64비트용 dll 을 만들 수 있다. ^^*


우선 필요한 파일은 아래와 같다.

sqlite-amalgamation-3_6_21.zip

     - sqlite3.c

     - sqlite3.h

     - sqlite3ext.h


sqlitedll-3_6_21.zip

     - sqlite3.def


이 작업은 Visual C++ 2005 에서 작업을 하였다.


먼저 Win32 콘솔 프로젝트를 sqlite3 이름으로 생성한다.



프로젝트 생성시 아래와 같이 설정을 한다.



생성된 프로젝트 폴더에 sqlite-amalgamation-3_6_21.zip에 압축된 파일들 과 sqlitedll-3_6_21.zip에 압축된 파일 중 sqlite3.def 파일을 풀어 놓고 프로로젝트에 소스 파일들을 추가 한다.



그리고 전처리기 정의에 아래의 세가지를 추가한다.

SQLITE_ENABLE_FTS3

SQLITE_ENABLE_RTREE

SQLITE_ENABLE_COLUMN_METADATA



이를 추가 하지 않으면 아래와 같은 링크 에러가 발생한다.

1>fts3_tokenizer.obj : error LNK2005: _sqlite3_api이(가) fts3.obj에 이미 정의되어 있습니다.

1>rtree.obj : error LNK2005: _sqlite3_extension_init이(가) fts3.obj에 이미 정의되어 있습니다.

1>rtree.obj : error LNK2005: _sqlite3_api이(가) fts3.obj에 이미 정의되어 있습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_database_name 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_database_name16 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_origin_name 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_origin_name16 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_table_name 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_column_table_name16 외부 기호를 확인할 수 없습니다.

1>sqlite3.def : error LNK2001: sqlite3_table_column_metadata 외부 기호를 확인할 수 없습니다.

1>D:\MyProject\VS\sqlite3\Debug\sqlite3.lib : fatal error LNK1120: 7개의 확인할 수 없는 외부 참조입니다.


마지막으로 sqlite3.lib 파일을 생성하기 위해 링크옵션의 모듈 정의 파일(Module Definition File)에 sqlite3.def 를 추가한다.



위와 같은 설정을 Debug 와 Release에 동일하게 해 주고 프로젝트를 빌드하면 Debug 및 Release 폴더에 dll 과 lib 파일을 볼 수 있다.


다음으로 64비트용을 작업한다.

먼저 64비트를 위핸 Configuration 을 추가한다.(Win32 설정으로부터 복사)







생성된 x64 Configuration 에서 전처리기 설정에서 WIN32를 WIN64로 변경한다. (Debug/Release 공통)



이제 빌드만 하면 된다

Original Post : http://neodreamer-dev.tistory.com/344

2009/12/06

Delphi IDE Fix Pack 2009/2010 2.8 Released

Embacadero RAD Studio 2009/2010 의 통합 개발 환경(IDE)의 버그를 수정한 IDE Fix Pack 이 2.8 버전을 공개하였다.

이번 버전에서 수정된 사항

RAD Studio 2010 fixes:
  • Undo destroys editor buffer
  • F1 key doesn’t work if invoked from the ObjectInspector
  • Vista compatible icons (256×256) aren’t supported
  • Stepping through the code can be slow

RAD Studio 2009 fixes:
  • Stepping through the code can be slow
  • Vista compatible icons (256×256) aren’t supported
  • Undo destroys editor buffer
  • 64 bit Debugger assertion
  • QC #71575: Delphi 2009 literal string assigment
  • QC #47242: Possible AV when shutting down the IDE
  • QC #47807: Error insight fails to find TObject class
  • Possible deadlock when Error Insight calls ProcessMessages
  • QC #37462: IDE may select the wrong file when performing a ctrl + left-click on a filename in the editor
  • QC #22880: Cannot resolve unit name
  • QC #58045: Component captions and component icons disappear from form designer
  • QC #69456: IDE dead lock when updating the editors
  • QC #55910: TDBText.Color always reverts to Parent.Color
  • QC #59963: Closing non-modal forms after a task switch can deactivate the application
  • QC #56252: TPageControl flickers a lot with active theming
  • QC #68730: TLabel is not painted on a themed, double-buffered TTabSheet in Vista
  • ToolsAPI IOTAProjectOptions.GetOptionNames destroys options.
  • QC #74646: Buffer overflow in TCustomClientDataSet.DataConvert with ftWideString
IDE Fix Pack 2.8 webpage
Original Post :
http://neodreamer-dev.tistory.com/343

2009/12/02

Firebird C API 데이터베이스 연결하기

char *szDBName = "e:\test.fdb";

char szSQL[2048] = {0,};
isc_db_handle db = NULL; // database handle
isc_tr_handle trans = NULL; // transaction handle
ISC_STATUS_ARRAY status; // status vector
long sqlcode; // SQLCODE
char *dpb_buffer = 0; // Database Parameter Buffer
short dpb_length = 0;

// Prepare parameter buffer
dpb_buffer = (char *)malloc(1);
*dpb_buffer = isc_dpb_version1;
dpb_length = 1;

// Set parameter User Name and Password
isc_expand_dpb( &dpb_buffer, &dpb_length
, isc_dpb_user_name, "SYSDBA"
, isc_dpb_password, "masterkey"
);

// Connect database
isc_attach_database( status, (int)strlen( szDBName ), szDBName, &db, dpb_length, dpb_buffer );

sqlcode = isc_sqlcode( status );
if ( status[0] == 1 && status[1] )
{
// Error occured
TRACE( "Fail to connect Database : %d\n", sqlcode );
return;
}

// Disconnect database
isc_detach_database( status, &db );

// Release parameter buffer
isc_free( dpb_buffer );


+ 2009/12/06
위의 코드는 메모리 1byte 의 메모리 누수가 생긴다. 누수가 발생하는 부분은 12번째 줄의 parameter buffer 에 버퍼 버전을 할당하는 부분으로 이부분을 주석처리하면 메모리 누수가 발생하지 않고 동작을 하게 된다. 버전을 명시하지 않아도 문제가 되는지 그리고 버전을 명시하고서도 메모리 누수가 발생하지 않도록 하는 방법이 있는지는 확인을 해 보아야 겠다

Original Post : http://neodreamer-dev.tistory.com/342

2009/12/01

Firebird C API를 이용하여 데이터베이스 생성하기


isc_db_handle db = NULL; /* database handle */
isc_tr_handle trans = NULL; /* transaction handle */
ISC_STATUS_ARRAY status; /* status vector */
long sqlcode; /* SQLCODE */

char *szSQL = "CREATE DATABASE 'e:\\ew.fdb' USER 'sysdba' PASSWORD 'masterkey';";

if ( isc_dsql_execute_immediate(status, &db, &trans, 0, szSQL, 1, NULL) )
{
sqlcode = isc_sqlcode(status);

TRACE( "Fail to create database : %d\n", sqlcode );
}
else
{
TRACE( "Database created!!!\n" );
}

Original Post : http://neodreamer-dev.tistory.com/341

2009/11/30

Firebird isql을 이용한 데이터베이스 생성하기(Windows)

Firebird 의 Interactive SQL Tool 인 isql 을 이용하여 데이터베이스를 생성하는 방법이다.

일단 Firebird를 설치하고 isql을 실행시켜 데이터베이스 생성 스크립트를 실행을 하면 아래와 같은 에러 메세지를 보게 된다.

C:\Program Files\Firebird\Firebird_2_1\bin>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'e: est.fdb';
Statement failed, SQLCODE = -902
Your user name and password are not defined. Ask your database administrator to
set up a Firebird login.


이 메세지는 사용자 이름과 암호를 설정하지 않아서 발생하는 에러이다. 사용자 이름과 암호를 설정하는 방법은 몇가지가 있다. 그중에서 환경 설정에 지정하는 방법과 isql 을 실행할 때 사용자 이름과 암호를 명시하는 방법이 있다.

우선 전자의 경우 도스 명령어의 Set 명령을 이용하여 사용자 이름과 암호를 지정하고 isql을 실행하여 데이터베이스를 생성하는 방법이다.

C:\Program Files\Firebird\Firebird_2_1\bin>SET ISC_USER=sysdba

C:\Program Files\Firebird\Firebird_2_1\bin>SET ISC_PASSWORD=masterkey

C:\Program Files\Firebird\Firebird_2_1\bin>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'e: est.fdb';
SQL>


두 번째로 isql 실행시 사용자 이름과 암호를 지정하는 방법이다.

C:\Program Files\Firebird\Firebird_2_1\bin>isql -user sysdba -password masterkey

Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'e: est1.fdb';
SQL>

Original Post : http://neodreamer-dev.tistory.com/340

2009/11/26

SQLite 3.6.20 Released (with Library)

이번 버전에서 수정된 사항




  • Optimizer enhancement: prepared statements are automatically
    re-compiled when a binding on the RHS of a LIKE operator changes or
    when any range constraint changes under SQLITE_ENABLE_STAT2.

  • Various minor bug fixes and documentation enhancements.




SQLite homepage

SQLite download



Visual C++ (32/64bit) 과 C++ Builder 용 동적라이브러리와 정적라이브러리



<

Original Post : http://neodreamer-dev.tistory.com/339

2009/10/26

블로그의 소스 문법강조 스크립트 SyntaxHighlighter 2.1.364 Released!!

SyntaxHighlighter 는 웹페이지의 프로그램 소스를 아주 보기 좋게 문법강조해 주는 스크립트로 현재 블로그에도 사용하는 스크립트 인데 오랜만에 가 업데이트 되었다.


이번 버전에서는 ColdFusion brush가 추가 되었고 많은 버그가 수정되었다.


자세한 변경 사항은 프로젝트 사이트를 참고하면 된다.


SyntaxHighlighter

SyntaxHighlighter:Changes:2.1.364

SyntaxHighlighter:Hosting
Original Post :
http://neodreamer-dev.tistory.com/338

Redmine 한글 PDF 출력 문제

얼마전 부터 Redmine 을 활용하여 프로젝트 관리를 해오고 있는데 Redmine 에서 지원하는 Gantt Chart 와 업무리스트를 PDF 로 출력을 시도해 보았는데 한글이 모두 이상한 문자로 출력이 되었다. 수정할 수 있는지 해서 인터넷에 검색을 해 보았는데 해당 문건이 많지 않았다.

검색된 자료 중 "Redmine pdf export 시 한글 깨지는 문제" 문서를 참조하여 해결을 하였다.

해결 방법은 PDF 출력 루틴과 한국어 출력 부분인데 "Redmine pdf export 시 한글 깨지는 문제" 문서에서 제시한 해결책이 그대로 적용되었다. 단, 버전의 차이에서 인지 수정해야할 파일들의 위치가 달랐다. 검색된 문서에서 제시된 redmine 버전은 0.8이고 현재 설치된 버전은 그 보다 상위 버전인 0.8.5 이다.

우선 PDF 출력 파일을 수정하였다.
파일의 위치는 lib\redmine\export\pdf.rb 이다. 이 파일의 내용중 "zh-tw" 의 내용을 복사하여 한글에 맞도록 수정한다.

  when 'zh-tw'
extend(PDF_Chinese)
AddBig5Font()
@font_for_content = 'Big5'
@font_for_footer = 'Big5'
# 한글 출력을 위해 추가된 부분
when 'ko'
extend(PDF_Korean)
AddUHCFont()
@font_for_content = 'UHC'
@font_for_footer = 'UHC'



다음 수정 사항은 폰트에 대한 것인데, 기본 적으로 명조체 출력을 지원하고 있는데 이 부분을 고딕체로 수정하는 내용이다. 명조체로 출력을 원하면 수정하지 않으면 된다.
수정해야할 파일은 vendor\plugins\rfpdf\lib\rfpdf\korean.rb

# HYSMyeongJoStd-Medium-Acro 를 HYGoThic-Medium로 바꾼다.
def AddUHCFont(family='UHC',name='HYGoThic-Medium')
#Add UHC font with proportional Latin
cw=UHC_widths
cMap='KSCms-UHC-H'
registry={'ordering'=>'Korea1','supplement'=>1}
AddCIDFonts(family,name,cw,cMap,registry)
end

def AddUHChwFont(family='UHC-hw',name='HYGoThic-Medium')
#Add UHC font with half-witdh Latin
32.upto(126) do |i|
cw[i.chr]=500
end
cMap='KSCms-UHC-HW-H'
registry={'ordering'=>'Korea1','supplement'=>1}
AddCIDFonts(family,name,cw,cMap,registry)
end



그리고 MultiCell 함수와 MBMultiCell 함수를 chinese.rb에서 복사해 온다.
아래 내용을 복사해 온 내용이다.

  def MultiCell(w,h,txt,border=0,align='L',fill=0)
if(@CurrentFont['type']=='Type0')
MBMultiCell(w,h,txt,border,align,fill)
else
super(w,h,txt,border,align,fill)
end
end

def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
#Multi-byte version of MultiCell()
cw=@CurrentFont['cw']
if(w==0)
w=@w-@rMargin-@x
end
wmax=(w-2*@cMargin)*1000/@FontSize
s=txt.gsub("\r",'')
nb=s.length
if(nb>0 and s[nb-1]=="\n")
nb-=1
end
b=0
if(border)
if(border==1)
border='LTRB'
b='LRT'
b2='LR'
else
b2=''
if(border.to_s.index('L'))
b2+='L'
end
if(border.to_s.index('R'))
b2+='R'
end
b=border.to_s.index('T') ? b2+'T' : b2
end
end
sep=-1
i=0
j=0
l=0
nl=1
while(i<nb)
#Get next character
c=s[i]
#Check if ASCII or MB
ascii=(c<128)
if(c.chr=="\n")
#Explicit line break
Cell(w,h,s[j,i-j],b,2,align,fill)
i+=1
sep=-1
j=i
l=0
nl+=1
if(border and nl==2)
b=b2
end
next
end
if(!ascii)
sep=i
ls=l
elsif(c==' ')
sep=i
ls=l
end
l+=ascii ? (cw[c.chr] || 0) : 1100
if(l>wmax)
#Automatic line break
if(sep==-1 or i==j)
if(i==j)
i+=ascii ? 1 : 3
end
Cell(w,h,s[j,i-j],b,2,align,fill)
else
Cell(w,h,s[j,sep-j],b,2,align,fill)
i=(s[sep]==' ') ? sep+1 : sep
end
sep=-1
j=i
l=0
# nl+=1
if(border and nl==2)
b=b2
end
else
i+=ascii ? 1 : 3
end
end
#Last chunk
if(border and not border.to_s.index('B').nil?)
b+='B'
end
Cell(w,h,s[j,i-j],b,2,align,fill)
@x=@lMargin
end



이제 redmine 을 재시작하고 Gantt Chart 나 작업 목록에서 PDF로 출력을 해보면 한글이 깨끗하게 나오는 걸 확인할 수 있다

Original Post : http://neodreamer-dev.tistory.com/337

2009/10/24

2009/10/15

SQLite 3.6.19 Released

이번 버전에서 수정된 사항
  • Added support for foreign key constraints. Foreign key constraints are disabled by default. Use the foreign_keys pragma to turn them on.
  • Generalized the IS and IS NOT operators to take arbitrary expressions on their right-hand side.
  • The TCL Interface has been enhanced to use the Non-Recursive Engine (NRE) interface to the TCL interpreter when linked against TCL 8.6 or later.
  • Fix a bug introduced in 3.6.18 that can lead to a segfault when an attempt is made to write on a read-only database.

SQLite homepage
SQLite download
Original Post :
http://neodreamer-dev.tistory.com/335

2009/10/10

CTreeCtrl의 각 노드에 사용자 정의 데이터 할당하기

MFC의 CTreeCtrl 의 함수 중 잘 사용하지 않지만 아주 유용한 멤버함수가 있다.



SetItemData(), GetItemData() 가 바로 그것 인데 이들 함수는 트리의 각 노드에 특정 데이트를 할당하거나 조회할 때 사용하는 함수이다.



데이터 형은 DWORD  형으로 32비트 포인터를 담을 수 있다. Visual Studio 2008 에서는 DWORD_PTR 로 변경되어 64비트 포인터를 담을 수 있다. 어떤 버전부터 DWORD_PTR 로 바뀌었는지는 모르겠지만 64비트 프로그래밍을 지원하는 버전에서는 DWORD_PTR 일 것으로 생각된다.



이 함수를 이용하면 트리의 각 노드에 포인터를 담고 있을 수 있어 어떠한 자료든지 쉽게 할당 할 수 있다.

아래 소스는 트리의 각 노드에 데이터를 할당하고 조회하여 사용하는 간단한 예이다.

// 트리 노드에 할당할 데이터 구조체
struct MyItem
{
int a;
float b;
double c;
};

// 트리에 노드를 추가하고 데이터 포인터 할당하기
HTREEITEM hRoot = m_tree.GetRootItem();
for ( int i = 0; i < 3; ++i )
{
CString strID;
strID.Format( "%d", i );
HTREEITEM hItem = m_tree.InsertItem( strID, hRoot );

// 노드에 할당할 데이터 객체 생성
MyItem* pMyItem = new MyItem;
pMyItem->a = i * 2;
pMyItem->b = (float)(i * 2.0f);
pMyItem->c = (double)(i * 2.0);

// 데이터 포인터 할당
m_tree.SetItemData( hItem, (DWORD)pMyItem );

CString strData;
strData.Format( "%p", hItem );

int nColumn = 1;
m_tree.SetItemText( hItem, nColumn++, strData );
}

// 각각의 노드와 노드에 할당되어 있는 데이터 조회하기
HTREEITEM hItem = m_tree.GetRootItem();
while ( hItem )
{
CString strData;

strData = m_tree.GetItemText( hItem, 0 );

// 노드에 할당되어 있는 데이터 포인터 가져오기
MyItem* pMyItem = (MyItem*)m_tree.GetItemData( hItem );
if ( pMyItem )
{
TRACE( "%s => %p (%d, %f, %f) \n"
, strData, hItem
, pMyItem->a, pMyItem->b, pMyItem->c
);
}
else
{
TRACE( "%s => %p \n", strData, hItem );
}

hItem = m_tree.GetNextSiblingItem( hItem );
}


// 조회 결과
0 => 00601CB8 (0, 0.000000, 0.000000)
1 => 00601D18 (2, 2.000000, 2.000000)
2 => 00601D78 (4, 4.000000, 4.000000)





이는 노드에 포인터를 할당하는 것으로 메모리 관리에 신경을 써야 한다. 그렇지 않을 경우에는 아래와 비슷한 메모리 누수 메세지를 보게 된다.

// 객체 삭제를 하지 않을 경우 보게되는 메모리 누수 메세지
Detected memory leaks!
Dumping objects ->
d:\xxx.cpp(134) : {559} normal block at 0x005BA618, 16 bytes long.
Data: < @ @> 04 00 00 00 00 00 80 40 00 00 00 00 00 00 10 40
d:\xxx.cpp(134) : {545} normal block at 0x005BA4F0, 16 bytes long.
Data: < @ @> 02 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40
d:\xxx.cpp(134) : {531} normal block at 0x005BA450, 16 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
<

Original Post : http://neodreamer-dev.tistory.com/334

CTreeCtrl 에 추가된 Item의 핸들(HTREEITEM)은 변하지 않는군...

특정 데이터를 Tree 컨트롤을 이용해 표현해 주고 트리 컨트롤의 조작으로 데이터를 조작해야 하는데 Tree 의 각 노드의 핸들이 고유한 값을 갖고 있는지 테스트 해 보았다.



간단한 트리를 만들고 각각의 노드의 핸들을 출력해 보고 트리를 정렬한 후 핸들을 출력해 보았다.







초기
0 => 00611CB8
0-0 => 00611D18
0-1 => 00611D78
0-2 => 00611DD8
1 => 00611E38
1-0 => 00611E98
1-1 => 00611EF8
1-2 => 00611F58
2 => 00611FB8
2-0 => 00612018
2-1 => 00612078
2-2 => 006120D8
3 => 00612138
3-0 => 00612198
3-1 => 006121F8
3-2 => 00612258
4 => 006122B8
4-0 => 00612318
4-1 => 00612378
4-2 => 006123D8

정렬 후
4 => 006122B8
4-2 => 006123D8
4-1 => 00612378
4-0 => 00612318
3 => 00612138
3-2 => 00612258
3-1 => 006121F8
3-0 => 00612198
2 => 00611FB8
2-2 => 006120D8
2-1 => 00612078
2-0 => 00612018
1 => 00611E38
1-2 => 00611F58
1-1 => 00611EF8
1-0 => 00611E98
0 => 00611CB8
0-2 => 00611DD8
0-1 => 00611D78
0-0 => 00611D18

<

Original Post : http://neodreamer-dev.tistory.com/333

2009/10/07

vector 복사하기

// copy 알고리즘을 이용한 복사
vDst.resize( (int)(vSrc.size()) );
std::copy( vSrc.begin(), vSrc.end(), vDst.begin() );
std::copy( vSrc.begin() + 2, vSrc.begin() + 5, vDst.begin() );

// assign 을 이용한 복사
vDst.clear();
vDst.assign( vSrc.begin(), vSrc.end() ); // 전체 복사
vDst.assign( vSrc.begin() + 1, vSrc.begin() + 4 );

Original Post : http://neodreamer-dev.tistory.com/331

2009/09/30

CTreeCtrl 의 CheckBox 상태 변경 이벤트 작성하기

#define WM_USER_TREE_CHANGE_CHECK        WM_USER + 100

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE, m_ctrlTree);
}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
:
ON_NOTIFY(NM_CLICK, IDC_TREE, &CTestDlg::OnNMClickTree)
ON_MESSAGE( WM_USER_TREE_CHANGE_CHECK, &CTestDlg::OnTreeChangeCheck )
:
END_MESSAGE_MAP()

void CTestDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
DWORD pos = ::GetMessagePos();
CPoint point( LOWORD( pos ), HIWORD( pos ) );

m_ctrlTree.ScreenToClient( &point );

UINT nFlags = 0;
HTREEITEM hItem = m_ctrlTree.HitTest( point, &nFlags );

if ( hItem )
{
if ( nFlags & TVHT_ONITEMSTATEICON )
{
PostMessage( WM_USER_TREE_CHANGE_CHECK, (WPARAM)pNMHDR->hwndFrom, (LPARAM)hItem );
}
}

*pResult = 0;
}

LRESULT CTestDlg::OnTreeChangeCheck( WPARAM wParam, LPARAM lParam )
{
HTREEITEM hItem = (HTREEITEM)lParam;

HTREEITEM hParent = m_ctrlTree.GetParentItem( hItem );
if ( hParent )
{
BOOL bCheck = m_ctrlTree.GetCheck( hItem );

m_ctrlTree.SetCheck( hParent, bCheck );
}

return 0;
}

Original Post : http://neodreamer-dev.tistory.com/330

CTreeCtrl 탐색하기

별 것 아니지만 안쓰면 자꾸 잊어버린다.


TCHAR szItem[256];

TVITEM tvItem;
tvItem.cchTextMax = 256;
tvItem.pszText = szItem;
tvItem.mask = TVIF_TEXT | TVIF_HANDLE;

HTREEITEM hItem = m_ctrlTree.GetRootItem();

while ( hItem )
{
tvItem.hItem = hItem;
m_ctrlTree.GetItem( &tvItem );

TRACE( _T("%s\n"), tvItem.pszText );

if ( m_ctrlTree.ItemHasChildren( hItem ) )
{
HTREEITEM hSubItem = m_ctrlTree.GetChildItem( hItem );

while ( hSubItem )
{
tvItem.hItem = hSubItem;
m_ctrlTree.GetItem( &tvItem );

TRACE( _T("--- %s\n"), tvItem.pszText );

hSubItem = m_ctrlTree.GetNextSiblingItem( hSubItem );
}
}

hItem = m_ctrlTree.GetNextSiblingItem( hItem );
}


Original Post : http://neodreamer-dev.tistory.com/329

2009/09/27

map 에서의 원소 추가 및 접근 ( insert, find, operator[] )

stl 의 컨테이너 중 하나인 map 에는 원소의 추가와 접근 할 때 operator 에 의한 방법과 함수에 의한 방법이 있다.

이 두 가지 방법에는 차이가 있다.



존재하지 않는 키에 대한 접근이 일어날 경우 operator[]는 빈 객체를 만들어 생성여 반환을 하고 find 함수는 맵의 마지막 포인터를 반환한다.

operator[] 에 의한 키의 접근시 존재가 확실하지 않는 경우라면 예기치 않은 원소를 만들 수 있다.

std::map< int, std::string > alias;
// alias [0]()

// operator[]에 의한 데이터 추가
alias[ 1 ] = "cat";
// alias [1]((1,"cat"))
alias[ 2 ] = "dog";
// alias [2]((1,"cat"),(2,"dog"))

// insert 함수에 의한 추가
alias.insert( make_pair( 3, "bird" ) );
// alias [3]((1,"cat"),(2,"dog"),(3,"bird"))
alias.insert( make_pair( 4, "flog" ) );
// alias [4]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"))

// operator[]에 의한 데이터 접근
std::string animal;
animal = alias[ 3 ];
// animal "bird"

animal = alias[ 5 ];
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
// animal ""

// find 함수에 의한 접근
std::map< int, std::string >::iterator itFind = alias.find( 2 );
// itFind (2,"dog")
if ( itFind != alias.end() )
{
animal = itFind->second;
// animal "dog"
}

itFind = alias.find( 6 );
// itFind (-842150451,<Bad Ptr>)
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
if ( itFind != alias.end() )
{
animal = itFind->second;
}


Original Post : http://neodreamer-dev.tistory.com/328

2009/09/21

윈도우에서 redmine + mongrel + apache (Load Balance) 설정하기

프로젝트 관리 프로그램인 redmine 에 대해서 이것 저것 테스트 해 보다가 실제 적용을 하기 위해 마지막 테스트를 하였다. 기존 XAMPP 기반에서 redmine 을 함께 서비스 하기로 하였고 그에 따른 방법을 찾아 보았다.

우선 redmine 을 서브 폴더(http://localhost:3000/redmine )로 접근 하도록 설치를 하려면 config/environment.rb 파일 맨 마지막에 아래의 코드를 추가 해 주어야 한다.
ActionController::AbstractRequest.relative_url_root = "/redmine" 


하지만 rails 2.3.x 에서 서브 폴더로 설치하면 접근을 할 수 없는 버그가 있다고 한다. 그러한 내용을 모르고서 작업을 하며 엄청난 삽질을 하다가 결국엔 다른 방법을 찾았다.

rails를 설치할 때 아래와 같은 명령으로  2.2.2 버전을 설치하였다.
gem install rails -v 2.2.2 --inlucde-dependencies -y



redmine을 최근 소스를 받을 경우 rails 를 2.3.4 버전을 사용해야 하기 때문에 0.8.5 버전으로 설치 한다.
Redmine - Windows XP 에서 수동 설치하기

그리고 redmine 의 config/environment.rb 파일에 아래의 코드를 추가 하였다.
ActionController::AbstractRequest.relative_url_root = "/redmine" 



Load Balancing 을 하기 위해 mongrel 을 이용하여 두 개의 서버스를 등록하였다.
mongrel_rails service::install -N redmine1 -D redmine1 -p 3001 -n 1024 -c C:\Dev
edmine -e production --prefix=/redmine

mongrel_rails service::install -N redmine2 -D redmine2 -p 3002 -n 1024 -c C:\Dev
edmine -e production --prefix=/redmine



net start redmine1

net start redmine2



서비스가 정상적으로 실행 되었는지 확인하기 위해서는 http://localhost:3001/redmine 과 http://localhost:3002/redmine 으로 접속하여 redmine 의 초기 화면이 출력되는지 확인 하면 된다.

이제 Apache와의 연결만이 남아 있다. 연결을 위한 코드는 매우 간단하다.
ProxyPass /redmine balancer://redminecluster

ProxyPassReverse /redmine balancer://redminecluster



<Proxy balancer://redminecluster>

BalancerMember http://127.0.0.1:3001/redmine

BalancerMember http://127.0.0.1:3002/redmine

</Proxy>



위의 코드를 Apache의 httpd.conf 파일의 마지막에 첨부 하던지 새 파일을 만들어서 Include 를 시켜주고 Apache 를 재 시작 해주면 된다.
브라우저로 http://localhost/redmine 로 접속을 하여 redmine 화면이 나오면 성공한 것이다.

마지막으로 시스템이 재 부팅 되었을 경우 redmine1 과 redmine2 가 자동으로 실행되게 하기 위해서 아래의 명령을 도스 창에서 수행한다.
sc config redmine1 start= auto depend= MySQL

sc config redmine2 start= auto depend= MySQL


위의 코드는 redmine1 과 redmine2 가 MySQL 서비스가 시작 된 후 자동으로 시작되도록 하는 명령이다.<

Original Post : http://neodreamer-dev.tistory.com/327

2009/09/17

STL bitset 사용 예

C++ STL 의 bitset 을 사용한 예를 기록삼아 정리해 보았다.


#include <string>
#include <bitset>
using namespace std;

// bitset 선언
bitset< 8 > bit;
//bit [8](0,0,0,0,0,0,0,0) std::bitset<8>


// 전체 비트 세트
bit.set();
//bit [8](1,1,1,1,1,1,1,1) std::bitset<8>


// 전체 비트 리셋
bit.reset();
//bit [8](0,0,0,0,0,0,0,0) std::bitset<8>


// 할당 된 비트 수
int bitsize = (int)bit.size();
//bitsize 8


// 세트 된 비트 존재 여부 감사
bool bAny = bit.any();
//bAny false bool
bool bNone = bit.none();
//bNone true bool


// 첫 번째, 세 번째 비트 할당
bit.set( 0, true );
//bit [8](1,0,0,0,0,0,0,0) std::bitset<8>
bit.set( 2, true );
//bit [8](1,0,1,0,0,0,0,0) std::bitset<8>


// 다섯 번째 비트 반전
bit.flip( 4 );
//bit [8](1,0,1,0,1,0,0,0) std::bitset<8>


// 모든 비트 반전
bit.flip();
//bit [8](0,1,0,1,0,1,1,1) std::bitset<8>


// 네 번째 비트 감사
bool bFlag = bit.test( 3 );
//bFlag true bool


// 여섯 번째 비트 감사
bFlag = bit[ 5 ];
//bFlag true bool


// 세트 된 비트 존재 여부 감사
bAny = bit.any();
//bAny true bool
bNone = bit.none();
//bNone false bool


// 세트 된 비트 수
int setcount = (int)bit.count();
//setcount 5 int


// 값 할당
bit = 0x01;
//bit [8](1,0,0,0,0,0,0,0) std::bitset<8>
bit = 0xF0;
//bit [8](0,0,0,0,1,1,1,1) std::bitset<8>


// 문자로 변환
string strBits = bit.to_string();
//strBits "11110000"


// 숫자로 변환
int nBitVal = bit.to_ulong();
//nBitVal 240


Original Post : http://neodreamer-dev.tistory.com/326

2009/09/16

Redmine 서비스로 등록하기

지난 포스팅에서 Redmine 을 XP 설치하는 글을 올렸었다.

2009/09/16 - [Dev Story] - Redmine - Windows XP 에서 수동 설치하기



지난 글에 이어 설치 된 Redmine 을 Windows의 서버스로 등록을 하여 실행을 시켜 보았다.



우선 서버스로 등록을 하기 위해서는 mongrel 가 필요하다. 설치 방법은 아래와 같다.



C:\Dev
uby>gem install mongrel mongrel_service --include-dependencies
INFO: `gem install -y` is now default and will be removed
INFO: use --ignore-dependencies to install only the gems you list
Successfully installed gem_plugin-0.2.3
Successfully installed cgi_multipart_eof_fix-2.5.0
Successfully installed mongrel-1.1.5-x86-mswin32-60
Successfully installed win32-service-0.5.2-x86-mswin32
Successfully installed mongrel_service-0.3.4-x86-mswin32
5 gems installed
Installing ri documentation for gem_plugin-0.2.3...
Installing ri documentation for cgi_multipart_eof_fix-2.5.0...
Installing ri documentation for mongrel-1.1.5-x86-mswin32-60...
Installing ri documentation for win32-service-0.5.2-x86-mswin32...
Installing ri documentation for mongrel_service-0.3.4-x86-mswin32...
Installing RDoc documentation for gem_plugin-0.2.3...
Installing RDoc documentation for cgi_multipart_eof_fix-2.5.0...
Installing RDoc documentation for mongrel-1.1.5-x86-mswin32-60...
Installing RDoc documentation for win32-service-0.5.2-x86-mswin32...
Installing RDoc documentation for mongrel_service-0.3.4-x86-mswin32...




아래는 Redmine 을 서비스로 등록하는 명령이다.



C:\Dev
uby>mongrel_rails service::install -N RedmineSvr -p 3001 -e production -c C:\Dev\Rails\Redmine
** Copying native mongrel_service executable...
Mongrel service 'RedmineSvr1' installed as 'RedmineSvr1'.




등록을 마쳤으면 서비스를 실행 시킨다.



C:\Dev
uby>net start RedmineSvr




이제 브라우저에서 http://localhost:3001/ 로 접속을 하면 Redmine 을 볼 수 있다. PC가 부팅될 때 마다 자동으로 실행 시키고자 할 경우 "내 컴퓨터" 에서 오른쪽 버튼 클릭시 나오는 메뉴 중 "관리" 메뉴에서 서비스 항목 중 RedmineSvr 를 찾아 자동실행으로 설정 해 놓으면 된다.<

Original Post : http://neodreamer-dev.tistory.com/325

Redmine - Windows XP 에서 수동 설치하기

버그및 프로젝트 관리 프로그램으로 Redmine 을 선택하려고 가상PC에 설치를 해 보았다.
쉽게 설치하려면 Bitnami Redmine Stack 을 이용하면 되지만 기존 운영중인 DB나 웹서버가 있을 경우 수동으로 설치하는 것이 나을 것 같아 설치를 해 보았다.

기본적인 설치 순서는 Redmine 사이트에 있는 Install 문서를 바탕으로 진행 했다. 하지만 추가적으로 진행 해야 할 사항도 있었다.

현재 시스템은 XAMPP 1.7.2 으로 되어 있고, Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] 버전과 Rails 2.3.4 버전이 설치 되어 있는 상태이다.
Ruby 와 Rails 설치는 2009/09/12 - [Dev Story] - XP에 Ruby on Rails 설치하기 를 참고하면 된다.

Redmine 을 수동 설치할 때는 Rails 의 버전을 고려해야 한다고 한다.  아래 테이블은 Redmine 사이트에서 발췌한 것으로 Redmine 구동에 필요한 Ruby 및 Rails 버전 테이블 이다.




















































Redmine versionSupported Ruby versionsRequired Rails version
current trunkruby 1.8.6, 1.8.7Rails 2.3.4
trunk from r2493 to r2886ruby 1.8.6, 1.8.7Rails 2.2.2
trunk before r2493ruby 1.8.6, 1.8.7Rails 2.1.2
0.8.xruby 1.8.6, 1.8.7Rails 2.1.2
0.7.xruby 1.8.6Rails 2.0.2

Rails 를 2.3.4 버전을 설치해 놓은 상태라서 현재 개발 중인 redmine 을 SVN (TortoiseSVN) 을 받았다. (r2888) (설치 경로는 C:\Dev\Rails\Redmine 으로 하였음.)

MySQL 서버 설정
먼저 데이터베이스를 준비한다. XAMPP 를 설치하면 MySQL이 설치되는데 redmine 에서 사용하기 위해서 유니코드를 지원토록 my.ini 에 아래와 같은 내용을 추가한다.
[mysqld]

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci



[mysql]

default-character-set=utf8



MySQL을 재시작 한 후 mysql에 접속하여 redmine 을 위한 데이터베이스를 생성위해 아래 Query 문을 실행한다.
create database redmine character set utf8;

create user 'redmine'@'localhost' identified by 'redadmin';

grant all privileges on redmine.* to 'redmine'@'localhost';



MySQL 접속 환경 설정
Redmine 프로젝트 폴더(C:\Dev\Rails\Redmine) 안에 config 폴더의 database.yml.example 파일을 database.yml 으로 바꾸고 아래와 같은 내용으로 작성을 한다.
production:

adapter: mysql

database: redmine

host: localhost

username: redmine

password: redadmin

port: 3306

encoding: utf8



Session store secret 생성하기
secret 을 Redmine Trunk r2493 이상 설치시 필요하며 아래와 같은 명령을 수행하여 생성한다.
C:\Dev
ails
edmine>rake config/initializers/session_store.rb

(in C:/Dev/rails/redmine)



데이터베이스 생성하기
Redmine 운영시 사용될 데이터베이스로 아래 명령을 수행하여 생성한다.
C:\Dev
ails
edmine>rake db:migrate RAILS_ENV="production"


위 명령을 수행할 때 루비가 설치된 경로(C:\Dev\Ruby)에 bin 폴더 안에 libmysql.dll 이 없을 경우 아래와 같은 에러 메세지를 만나게 된다.
C:\Dev
ails
edmine>rake db:migrate RAILS_ENV="production"

(in C:/Dev/rails/redmine)

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install

the mysql gem and try again: gem install mysql.

rake aborted!

126: 지정된 모듈을 찾을 수 없습니다. - c:/Dev/ruby/lib/ruby/gems/1.8/gems/mys

l-2.8.1-x86-mswin32/lib/1.8/mysql_api.so



(See full trace by running task with --trace)


MySQL 이 설치된 경로(C:\XAMPP\MySQL) 폴더의 bin 폴더 안에 있는 libmysql.dll 을 Ruby 의 Bin 폴더(C:\Dev\Ruby\Bin)에 복사해 준다.

그리고 아래와 같은 에러가 발생할 경우에는 Redmine 의 database.yml 파일의 설정을 확인하여야 한다.
C:\Dev
ails
edmine>rake db:migrate RAILS_ENV="production"

(in C:/Dev/rails/redmine)

rake aborted!

Access denied for user 'root'@'localhost' (using password: YES)



(See full trace by running task with --trace)


모든 설정을 확인하였는데 아래와 같은 에러가 나타날 때가 있다.
C:\Dev
ails
edmine>rake db:migrate RAILS_ENV="production" --trace

(in C:/Dev/rails/redmine)

** Invoke db:migrate (first_time)

** Invoke environment (first_time)

** Execute environment

** Execute db:migrate

rake aborted!

Mysql::Error: query: not connected: CREATE TABLE `schema_migrations` (`version`

varchar(255) NOT NULL) ENGINE=InnoDB

:

:


위 에러는 Redmine 의 설치 메뉴얼에 설명이 나와 있지 않아 구글 검색을 통해 찾았는데 libmysql.dll 버전 문제라고 한다. 최신 버전의 libmysql.dll 을 사용할 경우 발생한다고 한다. XAMPP 1.7.2 버전에는 MySQL 5.1.37 버전에 설치되어 있는데 이 버전도 문제가 되었다. 문제가 없는 libmysql.dll 파일을 다운받아 Ruby 의 bin 폴더에 복사하고 MySQL 을 재가동 시킨 후 데이터베이스 생성 명령을 수행한다.

C:\Dev
ails
edmine>rake db:migrate RAILS_ENV="production" --trace

(in C:/Dev/rails/redmine)

** Invoke db:migrate (first_time)

** Invoke environment (first_time)

** Execute environment

** Execute db:migrate

:

:

:

** Invoke db:schema:dump (first_time)

** Invoke environment

** Execute db:schema:dump


기본 설정 데이터 추기하기
이 과정은 옵션이지만 Redmine 의 설치 문서에는 강력하게 추천을 하고 있다. 아래 명령을 통해 기본 설정 데이터를 추가한다. 추가할때 언어를 물어 볼 때 ko 를 입력한다.

C:\Dev
ails
edmine>rake redmine:load_default_data RAILS_ENV="production"

(in C:/Dev/rails/redmine)



Select language: bg, bs, ca, cs, da, de, el, en, es, fi, fr, gl, he, hu, it, ja,

ko, lt, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sv, th, tr, uk, vi, zh, zh-T

W [en] ko

====================================

Default configuration data loaded.


이것으로 Redmine 설치가 끝이 났다. 이제 테스트를 위해 Redmine 을 실행 시킨다.

C:\Dev
ails
edmine>ruby script/server webrick -e production

=> Booting WEBrick

=> Rails 2.3.4 application starting on http://0.0.0.0:3000

=> Call with -d to detach

=> Ctrl-C to shutdown server

[2009-09-16 12:46:21] INFO WEBrick 1.3.1

[2009-09-16 12:46:21] INFO ruby 1.8.6 (2007-09-24) [i386-mswin32]

[2009-09-16 12:46:21] INFO WEBrick::HTTPServer#start: pid=2756 port=3000


브라우저를 실행하고 http://localhost:3000 로 접속을 해 보면 Redmine 을 만날 수 있다.

우상단의 로그인메뉴를 통해 접속하여 관리할 수 있다.


관리자 계정 : admin


관리자 암호 : admin

이대로 사용을 해도 되지만 XAMPP 와 연동을 하여 사용하면 더 좋을 것 같다. <

Original Post : http://neodreamer-dev.tistory.com/324

2009/09/14

vector 원소 복사하기

vector< int > vA;
vector< int > vB;

vA.push_back( 1 );
vA.push_back( 3 );
vA.push_back( 5 );
vA.push_back( 7 );
vA.push_back( 9 );

// 모든 원소 복사
vB.resize( vA.size() ); // 복사될 크기 만큼 공간 확보
copy( vA.begin(), vA.end(), vB.begin() );

// 결과
// vA [5](1,3,5,7,9) std::vector<int,std::allocator<int> >
// vB [5](1,3,5,7,9) std::vector<int,std::allocator<int> >


// 처음부터 3개만 복사할 경우
vB.resize( 3 ); // 복사될 크기 만큼 공간 확보
copy( vA.begin(), vA.begin() + 3, vB.begin() );

// 결과
// vA [5](1,3,5,7,9) std::vector<int,std::allocator<int> >
// vB [3](1,3,5) std::vector<int,std::allocator<int> >


// 두번 째 원소부터 3개를 복사할 경우
vB.resize( 3 ); // 복사될 크기 만큼 공간 확보
copy( vA.begin() + 1, vA.begin() + 4, vB.begin() );

// 결과
// vA [5](1,3,5,7,9) std::vector<int,std::allocator<int> >
// vB [3](3,5,7) std::vector<int,std::allocator<int> >

Original Post : http://neodreamer-dev.tistory.com/323

SQLite 3.6.18 Library

얼마전 공개 된 SQLite 3.6.18 버전의 라이브러리 파일들이다.

3.6.17 버전을 만든 프로젝트에 업데이트된 소스를 추가하여 만들었다.





SQLite 3.6.18 Library for C++ Builder ( 32bit Static 및 Dynamic  )







SQLite 3.6.18 Library for Visual C++ ( 32bit  / 64bit Static 및 32bit Dynamic  )

<

Original Post : http://neodreamer-dev.tistory.com/322

SQLite 3.6.18 Released!!

SQLite가 한달 만에 업데이트가 되었다.

사이트 에서는 이전 버전 3.6.12 이전 버전의 사용자는 업그레이드를 추천하고있다.

이번 버전에서 수정된 사항은 아래와 같다.
SQLite Release 3.6.18 On 2009 Sep 11 (3.6.18)
  • Versioning of the SQLite source code has transitioned from CVS to Fossil.
  • Query planner enhancements.
  • The SQLITE_ENABLE_STAT2 compile-time option causes the ANALYZE command to collect a small histogram of each index, to help SQLite better select among competing range query indices.
  • Recursive triggers can be enabled using the PRAGMA recursive_triggers statement.
  • Delete triggers fire when rows are removed due to a REPLACE conflict resolution. This feature is only enabled when recursive triggers are enabled.
  • Added the SQLITE_OPEN_SHAREDCACHE and SQLITE_OPEN_PRIVATECACHE flags for sqlite3_open_v2() used to override the global shared cache mode settings for individual database connections.
  • Added improved version identification features: C-Preprocessor macro SQLITE_SOURCE_ID, C/C++ interface sqlite3_sourceid(), and SQL function sqlite_source_id().
  • Obscure bug fix on triggers ([efc02f9779]).

    Original Post : http://neodreamer-dev.tistory.com/321

2009/09/12

Hello World on RoR ( Ruby on Rails )

Rails 를 설치하고 언어를 처음 접할때 마다 볼 수 있는 "Hello World" 찍어 보았다.


우선 아래 명령으로 프로젝트를 생성 하였다.


rails myproject


생성된 프로젝트로 이동하여 아래 명령을 실행하였다. 하지만 무슨 목적으로 아래 명령을 수행하는 지는 아직 모르겠으면 실행으로 인해 프로젝트에 어떠한 변화가 있는지 모르겠다. (모두 익혀야 할 것들이겠지...)


ruby script\generate controller myprj




명령을 수행 한 다음 프로젝트의 app\controllers 폴더에 myprj_controller.rb 파일이 생겼다.





app 하위 폴더의  views 폴더안에 "Hello World" 내용을 담고있는 index.rhtml 파일을 만들고 브라우저로 http://127.0.0.1:3000/myprj 로 접속을 해 보면 아래와 같이 친숙한 Hello World 를 볼 수 있다.


<

Original Post : http://neodreamer-dev.tistory.com/320

XP에 Ruby on Rails 설치하기

Redmine 에 대해 알아 보다 Ruby 플랫폼에서 동작하는 프로그램이라 하여 Ruby 시스템을 설치해 보았다.

아무것도 없는 상태에서 Ruby on Rails 만 사용하려면  instantrails 만을 설치하면 된다고 하는데 기존 XAPMM 시스템을 이용하기 위해 수동으로 설치해 보았다.


우선  http://rubyinstaller.org/ 에서 ruby186-26.exe 를 다운 받아 설치한다.

Ruby 배포 사이트

Ruby 배포 사이트



Ruby 설치 화면

Ruby 설치 화면



구성 컴포넌트 중 Ruby 외에는 선택사항인데 마땅한 편집툴이 없어 SciTE 를 선택했고, 업데이트 및 rails 설치를 위해 Enable RubyGems 를 선택하였다.

설치 구성 요소 선택 화면

설치 구성 요소 선택 화면



설치 경로는 기본 경로(C:\ruby)를 유지하였다.

Ruby 설치 경로 선택 화면

Ruby 설치 경로 선택 화면



Ruby 설치 화면

Ruby 설치 화면



Ruby 설치 확인하기


ruby -v


Ruby 설치 확인 화면

Ruby 설치 확인 화면



Ruby 를 설치하고 Rails를 설치해야 하는데 ruby 버전에 따라 다른지 모르겠지만 찾은 정보들은 대부분 곧바로 설치했다고 하는데 나의 경우는 gem 업데이트를 먼저 수행 해 주어야 정상적으로 설치가 되었다.


gem 업데이트는 아래의 명령을 이용하였다.


gem update -system


gem 업데이트 화면

gem 업데이트 화면



gem 업데이트를 마치고 난 후 아래의 명령을 이용하여 rails 를 설치하였다.


gem install rails --include-dependencies


Rails 설치 화면

Rails 설치 화면




마지막으로 mysql 드라이버를 설치하였다.


gem install mysql


MySQL 드라이버 설치

MySQL 드라이버 설치



이제 설치는 끝났다.


우선 인터넷에 얻은 정보로 첫 번째 프로젝트를 생성해 보았다.

firstproject 생성 화면

firstproject 생성 화면



rails 는 시스템에 path가 설정되어 었어서 아무 곳에서나 실행이 되지만 실행되는 곳 아래에 프로젝트 플더가 생성이 되었다. 프로젝트 생성시 rails 의 실행 위치도 고려해 보아야 할 것 같다.


ruby 가 동작하게 하려면 ruby script/server 를 실행하라고 되어 있던데 그냥 실행을 하게 되면 에러가 나왔다. 인터넷의 정보로는 어디에도 자세한 설명이 없었다.


C:\>ruby script\server

ruby: No such file or directory -- script/server (LoadError)


그래서 rails를 이용하여 프로젝트가 생성된 경로를 확인해 보니 script 폴더가 있어서 경로를 생성한 프로젝트로 변경을 하고 ruby script\server 를 실행 하였다.


Ruby 실행 화면

Ruby 실행 화면



Ruby 접속 화면

Ruby 접속 화면



<

Original Post : http://neodreamer-dev.tistory.com/319