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

2009/09/08

열려있는 포트 확인하기

netstat 명령이 이용하여 현재 시스템의 열려있는 포트를 확인 할 수 있다.

netstat -a

사용 예
C:\>netstat -an | findstr "LISTENING State"
  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1110           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1947           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:2508           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:19780          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:43400          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49152          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49153          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49154          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49155          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49158          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:62516          0.0.0.0:0              LISTENING
  TCP    127.0.0.1:50152        0.0.0.0:0              LISTENING
  TCP    [::]:135               [::]:0                 LISTENING
  TCP    [::]:445               [::]:0                 LISTENING
  TCP    [::]:1110              [::]:0                 LISTENING
  TCP    [::]:1947              [::]:0                 LISTENING
  TCP    [::]:5357              [::]:0                 LISTENING
  TCP    [::]:19780             [::]:0                 LISTENING
  TCP    [::]:49152             [::]:0                 LISTENING
  TCP    [::]:49153             [::]:0                 LISTENING
  TCP    [::]:49154             [::]:0                 LISTENING
  TCP    [::]:49155             [::]:0                 LISTENING
  TCP    [::]:49158             [::]:0                 LISTENING
  TCP    [::]:62516             [::]:0                 LISTENING
Original Post : http://neodreamer-dev.tistory.com/318

2009/09/02

다각형의 면적과 무게 중심 구하기

업무 때문에 찾아 본 자료이다. 다각형의 면적과 무게 중심을 구하는 공식인데 생각보다는 심플 한데 이해가 쉽지는 않다. 공부를 해야겠지....





위와 같은 좌표 구성의 다각형이 있을때 면적과 무게 중심 값은 아래와 같다.











위 식을 이용하는 코드를 C++로 작성해 보았다.



for (i = 0; i < points; i++)
{
j = (i + 1) % points;

pt1 = pPoly->GetPointAt(i);
pt2 = pPoly->GetPointAt(j);

x1 = pt1.x;
x2 = pt2.x;
y1 = pt1.y;
y2 = pt2.y;

area += x1 * y2;
area -= y1 * x2;

centerx += ((x1 + x2) * ((x1 * y2) - (x2 * y1)));
centery += ((y1 + y2) * ((x1 * y2) - (x2 * y1)));
}

area /= 2.0;
area = fabs(area);

centerx = centerx / (6.0 * area);
centery = centery / (6.0 * area);





출처 : Calculating the area and centroid of a polygon

참고 : Polygon Area -- from Wolfram MathWorld
Original Post :
http://neodreamer-dev.tistory.com/317

설치하지 않고 .MSI 파일 풀기

Less MSIerables 라는 프로그램을 이용하면 쉽게 풀 수 있다.


사용법도 간단하여 .msi 파일을 불러 들여 Extract 버튼만 클릭하여 경로만 지정하면 된다.




Less MSIerables
Original Post :
http://neodreamer-dev.tistory.com/316