안녕하세요. 오늘은 android junit 사용하기 입니다.

이곳을 클릭하시면 사용방법이 자세히 나와 있고 이 글에서는 그 후에 필요한 내용에 대해 블로깅하고 있습니다.

그 밖에 안드로이드펍에서 google의 문서를 번역해 놓았네요. 여기 클릭해주세요.

제 글은 Android JUnit 중 Activity의 unit 테스트를 하기 위함입니다. 위 링크들을 보시면 button 같은 객체들을 테스트하는 방법이 나와있습니다. 제 프로그램 중 메인 Activity의 onCreate 함수에서 생성된 초기화 데이터들(xml을 파싱해서 얻는)을 저장하는 부분이 있습니다. 이때, xml 파서를 직접만들었기 떄문에 정확한 데이터 검증이 필요하게 됩니다.

Android JUnit의 actvitiy를 테스트하기 위해선 ActivityInstrumentationTestCase2 클래스를 상속받아야 합니다. (google의 문서에 나와있습니다.)

Android JUnit 테스트 프로젝트를 만든 후 JUnit Test Case를 만들때 superclass 를 ActivityInstrumentationTestCase2를 지정합니다.

일단 전체 코드를 한번 보겠습니다.

MyClassActivity.java

package com.myclass;

import android.app.Activity;
import android.os.Bundle;

public class MyClassActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

myClassTest.java

import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
import com.myclass.MyClassActivity;

public class myClassTest extends ActivityInstrumentationTestCase2< MyClassActivity > {
	
	MyClassActivity myClassActivity;
	
	public myClassTest() { // 생성자 함수가 꼭 필요합니다.
		super( MyClassActivity.class );
	}

	@Override
	protected void setUp() throws Exception { // 각각의 테스트함수들이 실행되기 전에 실행되는 함수
		super.setUp();
		
		setActivityInitialTouchMode( false );
		myClassActivity = getActivity(); // 생성된 activity의 레퍼런스를 갖고옵니다.
		Log.d( "MyClassTest", "setUp()" );
	}

	@Override
	protected void tearDown() throws Exception { // 각각의 테스트함수들이 종료되기 전에 실행되는 함수
		// TODO Auto-generated method stub
		super.tearDown();
		Log.d( "MyClassTest", "tearDown()" );
	}
	
	public void testFunc1() {
		Log.d( "MyClassTest", "testFunc1()" );
	}
}


test case 를 처음 생성하시면 <T> 가 생기는데 T를 테스트하고 싶은 클래스로 바꿔 주세요.

그 후 생성자 함수를 만들어야 합니다. 생성자 함수는 위 코드에 나와있으니 참조하세요. 위 코드가 Activity TestCase class의 기본코드 입니다. setUp(), tearDown() 함수를 잘 쓰셔서 이용하면 될 것 같습니다.

참조해야 할 부분은 setActivityInitialTouchMode( false ) 부분인데요. 터치를 끄는 기능을 합니다. 아직 위 코드에 대한 필요성은 느끼지 못하고 있으나, 구글의 표준문서에 나와있네요. 

위 코드를 실행해 보시면 testFunc1() 함수가 실행이되고 아래 그림과 같은 결과를 확인 할 수 있습니다.


Log 화면


Test 결과화면



Bloger : molatk.net

3일차가...... 지브롤터던가.......

암튼 일단 고!

슬슬.... 너무 오래되서 기억이 가물가물하다...
하지만 간지나는 멋진 처롼햄ㅋㅋ

저기가...  말라가에서 론다를 가던 기차역이던가...
그라나다에서 말라가를 가던 역이던가... 이제 정말... 기억이 안난다.ㅠㅠ



쳐란햄에 비해... 난..............참 이게 뭐냐ㅋㅋㅋ
완전 폐인꼴이다 =_= 




아무튼 꼭 가고싶었던 지브롤터를 향해 고고고!



지브롤터는 위에 표시된 것처럼 작은 해협에 위치해있다.
지브롤터에 가면 반대편에 있는 아프리카 대륙이 보인다 +_+
정말 대박이지...  
게다가 지브롤터는 스페인령이 아니라 영국령!이다.
참 재미있는 곳이다.
지브롤터 해협은 내 나이대 친구들(대항해시대 게임을 즐긴 세대들)은 다 너무나 잘 아는 곳이다.
왜냐면 저곳 근처에 세우타항이 위치해있기 때문이다. 



잘 보이지 않지만....
저 멀리 구름 아래 보면 산이 보이는데...
저곳이 아프리카다 +_+
너무 멋지지 않음?? 아 감동감동 

지브롤터는 신기하고 재밌는 것들이 참 많은 곳인데
그 중 한가지는 아래 사진에서 보면 도로와 여객기 활주로를 같이 쓴다는 사실!



지브롤터에는 산이 있는데 그곳에는 많은 원슝이들이 살고있다.
이 원슝이들이 내 가방에 두번이나 달라붙고....(관광객들이 보통 가방에 먹을 것을 넣고 다닌다는 것을 알고 있는 원슝이들) 내가 손에 들고 있는 먹이를 낚아 채가고 ㅡㅅㅡ
정말 놀랐다... 


쩌~~ 멀리 보이는 지브롤터 산

내가 손에 들고 있던 것을 빼앗아 먹고 있는 원슝이 ㅡㅅㅡ

새끼도 품고

과일도 먹고

털도 골라주고


재미있었던 지브롤터
난 너무 신나서 ㅡㅅㅡ 방방 뛰어다녔더니 땀이 줄줄 나더라(꽤 덥기도 했음!)
우리끼리 사진도 찍고 경치도 감상하고... 


뭐보냐 =_=;

원슝이랑 인사도 했지만... 까였다



셋이 같이 사진 찍을때(이때 한 주민에게 여러번 찍힘을 당했지?ㅋ)
무슨 노래를 듣고 있었는데
나중에 이 노래를 다시 들으면 우리가 이곳에 있었던 것을 기억할 것이라고 이야기 했는데 
정작 노래가 기억이 안나고 그 상황만 기억난다.

형들과 함께 했던 지브롤터 너무너무 행복했다  




Bloger: moltak.net


'날 살아가게 하는 것들 > 여행' 카테고리의 다른 글

Spain 02일차 : 그라나다  (1) 2012.03.11
Spain 01일차 02 : 인천, 마드리드  (0) 2012.03.04
Spain 01일차 01 : 인천, 마드리드  (0) 2012.03.03
Spain Jan-2012 Route  (0) 2012.03.03
사실 이런것들이 얼마나 통할지 모르겠다.
현실과 이론은 항상 정확히 일치하지는 않으니
하지만 아래 링크에는 중요한 말들이 많이 포함되어있다.

http://blog.naver.com/dhow88?Redirect=Log&logNo=40018219360 

1. 끊임없이 이동한다. (성을 짓지 말라)
2. 빠른 속도(fast fail을 말하는 것일까)
3. 모든 이익의 공동 분배
4. 정보화


bloger: moltak.net 

'scrap' 카테고리의 다른 글

말라리아를 진단하는 스마트폰 이야기  (0) 2012.03.14
VMWare WinDBG Kernel Debugging 설정  (0) 2010.05.08
방화벽 정책에 관하여  (0) 2010.04.29
방화벽 정책(예)  (0) 2010.04.29
방화벽 정책  (0) 2010.04.29
너무나 멋지다. 이런 것을 나도 만들어 낼 수 있을 까. 모든 인간 사람에게 이득이 되고 희망이 될 수 있는 서비스를 만들어보고 싶다. 금전적인 이익을 떠나 나에게 너에게 우리 모두에게 꿈이 될 수 있는 그런 것들

원문:   http://health20.kr/2429 



스마트폰이 헬스케어 진단기기로서 이용할 수 있다면 얼마나 좋을까? 특히 건강과 관련한 접근성이 떨어지는 아프리카 대륙에서 그래도 보급이 많이 된 스마트폰이 이런 역할을 할 수 있도록 하는 연구가 진행되고 있다.  

아프리카 대륙에서는 29,000명에 이르는 5세 이하의 어린이들이 말라리아에 감염되어 매일 목숨을 잃고 있다. 치사율은 15~20%에 이르며, 전체 사망자의 85%가 5세 이하의 어린이들이다. 문제는 이들의 감염을 예방적 항생제를 이용하면 충분히 예방할 수 있다는 것이다. 이런 상황에서 말라리아를 빨리 진단할 수 있는 기술이 나온다면 많은 도움이 될 것으로 예측되는데, 현재 가장 빨리 간단한 진단이 가능한 방법은 면봉과 시약을 이용해서 진단하는 진단키트를 이용하는 것이다.  감염된 혈액과 접촉이 되면, 말라리아 항체가 면봉의 색상을 변화시키는 원리로 진단을 하게 되는데, 문제는 시약이 매우 불안정하고, 말라리아 감염과 관계없이 색상이 변하는 경우가 많아서 유용성이 매우 떨어진다는 것이다. 약 60% 정도의 검사가 위양성으로 나오고 있어서 치료받지 않아도 되는 어린이들에게 너무 많은 예방적인 항생제 투여가 이루어지고 있다.  또한, 이렇게 치료받지 않아도 되는 아이에게 처방된 약제는 말라리아 치료의 내성을 키우는 부작용까지 있어서 정확한 진단방법의 중요성은 아무리 강조해도 지나치지 않는다.

Lifelens라는 기술은 스마트폰을 이용해서 말라리아를 정확히 진단할 수 있다는 희망을 불러일으키고 있다는 점에서 주목할 만하다.  명확하지 않는 시약을 이용하는 방법에 비해, 스마트폰의 카메라로 바늘로 찌른 혈액 한 방울에서 적혈구의 모양을 직접 관찰할 수 있는데, 적혈구가 깨졌거나 말라리아 원충의 모습을 직접 확인할 수 있고, 일단 얻은 영상을 바탕으로 3차원 모델링을 통해 정교한 진단이 가능하다.  사용방법도 복잡하지 않아서, 스마트폰을 이용할 수 있는 기초적인 지식만 있으면 누구나 Lifelens로 검사를 할 수 있다.  핵심기술은 마이크로소프트의 닷넷 기반의 이미지 분석 소프트웨어에 있는데, 현재 윈도폰 7을 활용하여 진단을 할 수 있다.  현재는 말라리아 진단에 초점이 맞추어져 있지만, 간단히 혈액검사를 할 수 있다는 점에서 앞으로 더욱 다양한 용도로 활용될 수 있을 것이다.

2012년 MWC에서 노키아에서 4100만 화소를 지원하는 현미경급 카메라를 선보여 화제가 되기도 했는데, 스마트폰의 사용용도가 앞으로 어떻게 확대가 될지 기대가 된다.  아래는 이 기술과 관련한 동영상이다.





참고자료:

Life Lens 프로젝트 공식 블로그 



'scrap' 카테고리의 다른 글

유목문화에서 배우는 벤쳐경영  (0) 2012.03.16
VMWare WinDBG Kernel Debugging 설정  (0) 2010.05.08
방화벽 정책에 관하여  (0) 2010.04.29
방화벽 정책(예)  (0) 2010.04.29
방화벽 정책  (0) 2010.04.29
주소는  http://khjp.tistory.com 여기
개발자들도 포트폴리오를 갖고있어야 좋으니깐...
예전에 만들었던건 학생용이고 파일 형태라 불편함.
이번꺼는 웹에 게시하는 형태니 언제 어디서든 보여줄 수 있지ㅋㅋ



Bloger : moltak.net 

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

수원생활  (0) 2012.03.11
Out of the Box  (0) 2011.03.08
공부 테크니션의 여덟 가지 필살기  (2) 2010.10.11
이매진컵!! 자랑자랑..  (0) 2010.05.29
아아아아악  (0) 2010.05.08

그라나다. 스페인의 남부지역에 위치한 아주 따뜻한 도시입니다.
뜨거운 햇살. 낮은 습도. 아름다운 도시, 풍경, 사람들
너무나도 여유로운 그들



아침에 그라나다에 도착했는데 제가 좋아하는 아침햇살이 너무나 기분좋게 내리고 있었습니다.
버스 안에서 보이는 건물들도 아침햇살에 반짝거리고 있었습니다.

알람브라 궁전이라는 곳이 그라나다에 있는데 그곳을 가기위해 부지런히 걸음을 옮겼습니다.



가는 길에 찰칵 =_=


가족단위 관광객도 많더라구요! 어디에서 왔는지??


승환햄의 애교ㅋ


우리 셋이서 찰칵! (옷을 보면 왼쪽부터 가을, 겨울, 여름...... 뭐냐 이게ㅋㅋ)

곰의 애교 점프샷



곰의 애교 표정


궁전이 굉장히 넓어서 이것저것 다 봤는데 해가 슬슬 지려고 하고 있었습니다.
(겨울이라 해가 짧아...) 



저녁은 근처 바르에 가서 간단히(?) 스테이크 먹었던 기억이 나는데... 왜 에피타이저 사진밖에 없는지?
하루 두세잔찍 꾸준히 맥주 먹었던 기억이 납니다. (맥주 참... 맛있었는데)
우리는 지역음식 먹는걸 너무나 좋아하기 때문에 별걸 다 먹고 다녔는데. 사진에 있는 올리브는 정말 맛이없더라구요 =_=; 저만 먹었습니다. 

 



Bloger: moltak.net

'날 살아가게 하는 것들 > 여행' 카테고리의 다른 글

Spain 03일차: 지브롤터  (1) 2012.03.16
Spain 01일차 02 : 인천, 마드리드  (0) 2012.03.04
Spain 01일차 01 : 인천, 마드리드  (0) 2012.03.03
Spain Jan-2012 Route  (0) 2012.03.03


수원에서 생활하기 시작한지 딱 1년 정도 되었네요.
고향 친구들과 같이 생활하기 시작해서 그런지 외롭다는 생각도 별로 하지 않았었고 어려움도 별로 없었습니다.
하지만 겨울은 익숙해지지가 않더군요. 바람도 많이 불고 기온도 낮고

# 지난 1년을 살펴보면 제 인생중 가장 많은 변화가 있었던 한 해였네요.
처음으로 부모님 품에서 벗어났으며 처음으로 정식으로 회사에 취직하게 되었고 많은 직장 친구들도 생기게 되었으니까요.

# 겨울동안 몸을 만들었습니다. 어떤일을 하건간에 체력이 가장중요하다고 생각했으니까요. 매일 아침 헬스, 저녁에 검도를 했고 급하지 않다면 뛰거나 걸어다녔습니다. 지금 몸 상태는 정말 좋네요. 최고입니다. 이제 이 몸매와 체력을 쭉 유지 하려고 합니다.



# 에피톤 프로젝트의 유채꽃 이란 노래가 너무 좋더라구요. 자주 듣고 있습니다. 즐감하세요.

에피톤프로젝트 - 유채꽃-

 

푸른 바다 제주의 언덕

올레길마다 펼쳐져 있는 그리움을 따라

무얼 찾으러 이 곳에 온 걸까?

너는 혹시 알고 있니?

얼마나 더 걸어야 할까?

비, 바람 불고 모진 계절이 힘겨울 때마다

가만히 나를 안아주던 네게

다시 기대어도 되니?

 

사랑스런 노란꽃들은

 파도소리와 바닷바람을 끌어안고서

다시 그들의 노래 들려주려고 해

너도 같이 들었으면 해

 

사랑스런 노란꽃들은

파도소리와 바닷바람을 끌어안고서

다시 그들의 노래 들려주려고 해

너도 같이 들었으면 해

나는 여기에 있을게



# 밀려있는 책들도 많고 밀려있는 일들도 많은데 오늘 내내 잠만 잤네요. 이제까지 나를 잘 컨트롤하고 있었는데 요새 왜이렇게 안되는지.... 선배님이 경호야 정신차려라고 하셨는데. 빨리 정신차리겠습니다!!

 Bloger: moltak.net

여행 1일차는 비행기 + 숙소 잠자기 전 상황입니다. ㅋㅋ
아침에 마드리드에 뙇 내렸을 때 그 기쁨이란...
여행의 시작은 비행기 탈 때가 아니라 첫 목적지 근방에 왔을 때라고 자주 느껴지더라구요.  

몇시간 전 새벽에 내렸던 TIRSO de MOLINA 역 근처의 동상이예요.


한적한 TIRSO de MOLINA

 



이 아래부터는 일요일마다 열리는다는 일요일 장터 사진
하는지도 모르고 있었는데 비행기에서 우연히? 만난 여행자 분들(아래 여성분 두분)이 알려주셔서 같이 방문했습니다  




신기한 기념품들이 참 많았으나...
막상 사려고 하니 손이 잘 안가더라구요. 





오후 부터는 윗분들과 따로 행동했는데요.
저희는 마드리드 시내를 열심히 돌았습니다.
(박물관도 갔는데... 값은 엄청 비싸고 갈 이유를 모르겠습니다. 다음 여행부터는 안갈듯ㅋ) 



한국은 한 겨울이지만 이곳은 초봄? 늦가을? 날씨입니다.
너무너무 햇살이 따뜻하고 좋더군요.
공원에 사람들도 굉장히 많았습니다. 



여기까지가 마드리드에서 봤던 거의 대부분?? 헐....
거의 가본곳이 없군요!!

사실 가장 기억에 남는 곳이 딱 한군데 더 있는데요
보틴(Botin)이라는 세상에서 가장 오래된 레스토랑 입니다.



제가 음식은 거의 가리지 않는데... 위에 음식은 도무지 못 먹겠더라구요.
돼지껍질에 계란을 풀어서 만든 스프인데... 몇 숟가락 못 먹었습니다. 너무 느끼..


그저 그랬던 새끼돼지 통구이요리
보틴 주 메뉴이지만 한국인 입맛에는 안 맞는 듯 해요 =_=
 


가장 피곤했던 스페인 첫날이었습니다. 




Bloger: moltak.net

'날 살아가게 하는 것들 > 여행' 카테고리의 다른 글

Spain 03일차: 지브롤터  (1) 2012.03.16
Spain 02일차 : 그라나다  (1) 2012.03.11
Spain 01일차 01 : 인천, 마드리드  (0) 2012.03.03
Spain Jan-2012 Route  (0) 2012.03.03

Spain 여행 첫날 블로깅
어려움이 있었기 때문에 더 기억에 남는


인천공항에서 대기

여행 첫날... 연착된 KLM 항공. (5시간 더 대기했던가.)
좀 짜증은 났었지만 1만원 식사 쿠폰과 300유로 비행기 할인권(대박!)을 받았던 =_=

암튼 우린 그날 인천공항 이곳 저곳에 퍼져있었더라지..


북경 공항

북경 공항

북경은 눈이 막 쌓여있더라고?
추워 보였음 


스페인 어떤 역...에 붙어있던 글들


마드리드 공항 역이었던가? 암튼 가다 보니 무슨 소원 글같은게? 


숙소가 있던 [Tirso de Molina] 역

[Tirso de Molina] 근처 풍경

[Tirso de Molina] 근처 풍경

[Tirso de Molina] 근처 풍경처롼햄ㅋ


숙소 근처에 왔을 땐. 오전 7시? 밤을 꼴딱 샜더라지
근데 힘은 들지 않았지. 비행기에서 잘 잤기 때문 -_-a
암튼 우린 다 힘이 넘쳤고 사진 찍고 돌아 다녔다 




Bloger: moltak.net


'날 살아가게 하는 것들 > 여행' 카테고리의 다른 글

Spain 03일차: 지브롤터  (1) 2012.03.16
Spain 02일차 : 그라나다  (1) 2012.03.11
Spain 01일차 02 : 인천, 마드리드  (0) 2012.03.04
Spain Jan-2012 Route  (0) 2012.03.03
2012년 스페인 여행 루트입니다.
어플을 하나 만들어서 갔는데.. GPS 수집이랑 Viewer밖에 안되요 -_-
뭔가 기능을 더 추가할까 했는데 마땅히 떠오르는 것도 없네요....

비행기 경로

비행기 경로

비행기 경로인데... 뭐야.. 이건 -_-



Spain 여행 전체 경로

마드리드 여행 전체 경로 입니다. IN_Madrid->OUT_Madrid. 짧은 일정(8일정도...)이었기 때문에 장소를 잘 정해야했고, 안달루시아를 보기로 했죠.
말라가, 론다, 지브롤터, 그라나다를 방문했습니다. 



안달루시아

가장 마음에 들었던 Ronda



마드리드

바쁜 일정에 제대로 느껴볼 틈도 없었던 마드리드



사진은 천천히 업로드 해야겠네요. 햐... 참 좋았었는데
또 나가고 싶네 참


Bloger: moltak.net


책은 참... 신기해요
저자들은 자신이 알고 있는 것 중 최고의 지식들을 책에 써놓죠.
자신이 느낀것 사랑한것 경험한것 공부했던 것.

때론 말로 설명하기 힘든 것들도 있습니다.
그건 때론 노래이기도 하고 춤이기도 하고 여행에 관한 것이기도 하고 어떤 행위 장소 느낌에 대한 저자의 상태를 글로 표현합니다.

어떤 글은 우리에게 깊은 감동을 주고
어떤 글은 우리에게 깨달음을 주고
어떤 글은 우리에게 앞날을 제시해 주기도 합니다.

책은 인생에 있어서 매우 중요하다고 생각합니다.
어떤 분야에서 최고가 된 분들 역사책에 기록 된 분들 이런분들은 대부분 다독가였죠.
아니 이런 분들을 제외하더라도 경험을 쌓을 수 있는 가장 쉬운 방법이 독서라고 생각합니다.
책은 자신 혼자서 경험해 볼 수 없는 것을 간접적으로 경험하게 해줍니다.

책의 지식들을 여과 없이 받아들이게 될 경우 독이 될 수도 있지만
그것도 다독이 해결해 줍니다.
한명의 작가, 한가지 분야의 책을 읽지 않고 다양하게 다독을 하게 된다면 자기도 모르는 사이에 이런것들을 걸러낼 수 있는 경험이 쌓이고 능력이 생기게 되겠죠.

책을 읽고 있을 때 참 많은 생각이 떠오릅니다. 
나라면 여기서 어떻게 했을 까? 어떤 말을 했을 까? 지금의 나는 어떠나? 우리 사회는 어떤가?
반성과 좌절을 하기도 하지만 기회와 용기를 얻게 되는 경우가 더 많습니다.

그리고 무엇보다. 책이 좋은 점은 
너무나도 재미있습니다.
새로운 지식을 배우게 될 때의 그 즐거움.
새로운 깨달음을 얻고 힘을 얻고 용기를 얻게 되고 또 새로운 세상을 발견할 수도 있습니다.
세상은 책 안에 다 들어있습니다. 미래도 과거도 현재도 있습니다.

정말 재미있어 죽겠습니다.


Bloger: moltak.net
http://kkamagui.tistory.com 혼자서 커널 제작하시고(x86용) 운영체제도 만들고 책도 출판 하신 분.(우리회사 무선)
http://kldp.org/node/123910 arm용 운영체제 제작.



그리고...
http://uvicrabbit.tistory.com/ Windows 구조와 원리 를 출판하신 정덕영님...
매우 좋아하던 책. 언젠가 뵙고 싶었던 분인데.. 이제야 알았네요.

삼가 고인의 명복을 빕니다.

'Programming > __etc' 카테고리의 다른 글

옴니아 햅틱(진동) 프로그램  (0) 2010.04.05
C2146 구문오류  (0) 2010.03.18
패킷 만들기  (0) 2010.03.18
몇달 전에 제 2차세계대전에 큰 관심이 가서 여러 책들과 영화를 구해서 본적이 있습니다.

이 영화는 서부전선 노르망디 상륙 작전에서 시작합니다.
전쟁의 참혹함을 알 수 있습니다.....

상륙 중입니다. 오마하 해변.


내리지도 못하고 누군가의 아들들이 다 죽어 나갑니다.

라이언의 어머니와 아들들의 비보를 전해주러 오는 신부님과 군인... 아들 4중에 3명이 전사하고 막내만 남았습니다.
옆에 사진을 보면 4명의 남자가 보이는데 저들이 형제들인 것 같네요. (개인적으로 이 부분이 매우 슬펐습니다.)

앗 이사람은 빈 디젤... 여기에도 출연했군요.


멧 데이먼이 라이언이네요. 멋진 배우입니다.


이 영화는 스티븐 스필버그의 영화답게 가족, 동료간의 사랑을 이야기한 내용인데요.
In time 보다는 생각할 것이 적지만 더 흥미진진하고 감동도 많은 영화입니다.
예전에 봐서 잘 기억 안났던 영화인데. 다시 보니 너무 좋군요. 'ㅅ')/


Bloger : moltak.net

'날 살아가게 하는 것들 > 영화들' 카테고리의 다른 글

In Time  (0) 2011.12.11
Farinelli  (0) 2011.12.08

이 영화를 자본주의나 미국의 자유시장경제에 대한 텍스트들을 보지 않고 그냥 봤다면 별 생각없이 볼 수 있는 영화인 것 같습니다.
시간이 돈이 되는 개념은 이미 우리 삶에 많이 퍼져있으나 일반인들이 그것을 알아차리기에는 조금 어려운 것 같습니다.
이 영화는 우리에게 자유시장경제가 어떤 영향을 줄 수 있는지를 알려주고 있습니다.(좀 과장을 하긴 했지만)

우리는 좋은 기업에 들어가려고 노력을 많이 합니다. 거기서 큰 연봉을 받고 일하는 것이 인생의 최종 목적지라 생각을 하고 있는 사람도 꽤 많죠. 아니면 공기업, 공무원등...
위 그림은 자본주의 경제시스템에서 노동자들이 어떻게 살아가고 있다고 말을 해주고 있습니다.
우리는 모두 경영자에게 고용되어서 경영자의 시간(돈)을 벌어주는데 그때 우리는 돈을 받고 경영자에게 시간을 바치는 겁니다.
마르크스 자본론에 보면 [자본주의 경제 시스템에서] 어째서 경영자가 돈을 벌 수밖에 없는지 그 이유가 상세히 설명됩니다.
(300년 전의 인물이 300년 후의 상황을 자세히 설명하고 있죠. 정말 놀랍습니다.)

위 사진은 어머니가 돈(시간)이 없어서 버스를 타지 못해 아들을 만나자 마자 죽는 상황인데요. 이 장면을 보면서 미국의 의료보험 체계가 생각났습니다. 미국에서는 의료보험이 민영화되어 있어서 의료보험비가 아주 비싸고 돈이 없으면 치료를 못 받습니다. 실제로 죽는 사람도 부지기수입니다.

레너드!!ㅋㅋ


우리의 경영자(9860년을 살 수 있습니다. 음...)


한 여자가 은행에서 돈(시간)을 빌립니다. 그런데 이자가 자그마치 30%입니다....
대박... 조금 있으면 죽는데 이자가 문젭니까? 시간(돈)이 다 되는 순간 그냥 죽는데...
이 부분은 현대의 가장 하층 노동자들이 생각이 났습니다.
노동자들은 사는게 힘든데 현재 자유시장경제를 지배하고 있는 은행들은 폭리를 취할 뿐이죠.
은행, 증권사들이 미국의 자유시장경제에서 돈을 버는 방법은 아주 쉽죠.
빚과 엄청나게 어렵고 복잡한 파생상품들이죠.


은행이 갖고 있는.... 자그만치 100만년

그에 반해 일반인들이 25살이 되자 마자 받는 시간.. (51일? 51시간? 헷갈립니다.)
이 부분은 우리나라의 미친듯한 등록금을 이고 살아가는 대학생들이 생각이났습니다.
이 영화에서는 25살이 되면 자동으로 성장이 멈추고 자동으로 시장경제속으로 내던져 집니다. 개인의 생각 따위는 필요없이. 시스템이 그렇게 만들어져 있죠.
우리나라의 학생들은? 태어나자 마자 아무것도 모른 어릴때 놀지도 못하고 미친듯한 경쟁시스템에 빠지죠. 유치원 때부터 시작됩니다. 조기교육, 영어, 수학, 국어 등등 초등학교, 중학교, 고등학교 떄까지 유지됩니다.
아니죠 대학생이 되면 더 큰 문제가 있습니다. 사실 조기 유학같은걸 보낼 수 있는 집안은 괜찮을지도 모르지만 그렇지 못하는 학생들은 등록금을 벌어야합니다. 초,중,고의 경쟁이 사실 동갑들의 경쟁이었다면 대학교때부터는 선배, 후배, 동기 압뒤좌우 다 막히죠. 자신의 의지와는 상관없이요.

이 영화는 제게 많은 것들을 생각해 볼 수 있게 했네요. 액션은 좀 볼품 없지만 짜임새가 꽤 흥미진진합니다.
재밌었습니다.


Bloger: moltak.net

'날 살아가게 하는 것들 > 영화들' 카테고리의 다른 글

Saving Private Ryan(라이언 일변 구하기)  (0) 2011.12.11
Farinelli  (0) 2011.12.08
클래식을 공부하게 되면서 처음으로 본 영화입니다.

주인공의 이름은 파리넬리이며 그는 카스트라토 입니다.
영화를 보시면 알겠지만 노래가 정말 좋습니다.

주인공 파리넬리 입니다. 

파리넬리가 거의 마지막에 [헨델: 울게 하소서]를 부릅니다. 이 부분을 몇번을 봤는지....


이 부분은 파리넬리의 어린 시절입니다.
파리넬리를 안고 있는 사람은 형인데. 이 장면과 [울게 하소서]가 같이 나옵니다.

이 영화는 귀로 보는 영화라고 생각합니다.
보는 내내 행복했습니다.



Bloger: moltak.net
 

'날 살아가게 하는 것들 > 영화들' 카테고리의 다른 글

Saving Private Ryan(라이언 일변 구하기)  (0) 2011.12.11
In Time  (0) 2011.12.11
[참조: http://idrose1025.egloos.com/2628732]
[그림 참조: http://alghost.tistory.com/22
]

Doxygen 주석 사용법 


Doxgen은 많이 사용하고 있고 사용법도 간단하지만 가끔 어떤 식으로 주석을 해야하는지 까먹습니다. 
아래와 같은 형식이 가장 마음에 들고 좋은 것 같습니다.

\brief 나 \return 등이 보여주는 항목 이외에 다른 항목을 쓰고 싶다면 \par 명령어를 사용하면 된다.

/** \brief

        현재 시간을 얻는다.

    \remarks

        ST_TIME 구조체 형식으로 현재 시간을 얻는다.

    \par 요구사항

        time.h 선언이 필요하다.

    \return

        성공시 0을 반환한다. 에러가 발생하면 -1을 반환한다.

    \author

        이상호

**/




Blogger: moltak.net 

'Programming > 이것저것' 카테고리의 다른 글

[펌] valgrind 를 이용한 메모리 관리  (0) 2011.03.15
Doxygen - 작성중  (0) 2011.03.08
_Crt Debug Functions  (0) 2010.07.23
typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01

'SE > RF_DP' 카테고리의 다른 글

Decorator Pattern  (0) 2010.07.15

메모리 릭을 해결하기 위해 문서를 찾던중
[펌: http://adnoctum.tistory.com/555]


   C/C++ 의 골치거리 중 하나인 메모리 문제를 조금이나마 쉽게 해결하고자 나와 있는 프로그램 중 사용이 편리하고 open-source 인 valgrind 에 대해 알아 보자. valgrid는 leak 이 생긴/생길 가능성이 있는 코드의 부분을 찾아 주고, 잘못된 메모리 접근을 알려 주는 등의 기능을 한다. 이것은 특히 다른 사람이 작성한 소스 코드를 이용해야 할 때 유용한데, 코드의 전체적인 내용을 파악하지 못한 상태에서도 메모리 검사를 할 수 있기 때문이다. 나의 경우도 지금 남의 코드를 가져 와서 하고 있기 때문에, 일단 실행 시간 에러는 없이 실행되는 것을 확인했지만 정말로 문제없이 돌아가는 것인지 확인하기 위해 오랜만에 valgrind를 꺼내 들었다. 실제 사용 예는 다음과 같다. 

[adnoctum@bioism src]$ g++ ~/LJSLibrary/library/util.o cluster.o cluster.cpp -o c -g
[adnoctum@bioism src]$ valgrind --leak-check=full --log-file-exactly=memcheck.txt -v --error-limit=no ./c test.txt

첫 번째 줄은 test 로 사용할 프로그램을 컴파일 하는 부분. -g 옵션을 줘야 함수 이름과 정확한 코드의 위치(줄 수)가 나와서 보기 쉽다. valgrind 의 option 은 적당히 준다. valgrind --help 에 잘 나와 있다. 사용법은 아주 간단하다. 

valgrind [options] executible

을 따른다. option 은 적당히 주면 되고, executible 은 원래 프로그램을 실행시키는 것과 같다. 즉, 위의 경우 실행 파일이 c 이고 입력으로 test.txt 파일을 넣게 되어 있다. 그래서 이 프로그램을 실행시키려면 원래는

./c test.txt

를 하게 되는데, 바로 이 부분을 valgrind 의 입력으로 넣으면 되는 것이다. 그래서 위의 예에서 2 번째 줄처럼 된다. 

-v 옵션을 주면 내용이 많기 때문에 좀 복잡할 수 있는데, 차근차근 따라가면 별로 어렵지 않다. 결과 파일이 매우 길기 때문에 부분부분 가져와서 왜 문제가 생겼는지를 소스 코드와 비교해 보자. 

일단 가장 아래부분 근처에 보면 다음과 같은 요약이 있다. 

==9581== IN SUMMARY: 9 errors from 9 contexts (suppressed: 15 from 1)
==9581==
==9581== malloc/free: in use at exit: 0 bytes in 0 blocks.
==9581== malloc/free: 4,997 allocs, 4,997 frees, 243,658 bytes allocated.
==9581==
==9581== All heap blocks were freed -- no leaks are possible.

일단 메모리 누수는 없는 것으로 보인다. 제일 앞에 쓰여 있는 숫자는 PID 이다. 만약 --PID-- 이면 정보를 보여 주는 것이고, 만약 == PID == 라면 에러가 난 부분을 보여 주는 것으므로 참고한다. 그럼 이젠 제일 앞부분부터 살펴 보자. 

==9581== Invalid read of size 8
==9581==    at 0x805DC0F: main (cluster.cpp:149)
==9581==  Address 0x4096238 is 8 bytes after a block of size 224 alloc'd
==9581==    at 0x40053C0: malloc (vg_replace_malloc.c:149)
==9581==    by 0x805B067: treecluster (cluster.c:3656)
==9581==    by 0x805DB52: main (cluster.cpp:134)

내용인 즉, 8 바이트를 읽었는데, 원래는 읽으면 안되는 것이었다는 것이다. 직접적인 줄은 cluster.cpp 파일의 149 번째 줄이고, 밑에 call stack 이 나와 있다. 그래서, cluster.cpp 파일의 149 번째 줄 근처로 가보면, 


134   Node* tree = treecluster(nRow, nCol, data, mask, weight, transpose, metric, method, NULL);
135
136   int nNodes = 0;
137   if(transpose != 0){
138           nNodes = nCol;
139   }
140   else{
141           nNodes = nRow;
142   }
143   double* order = (transpose==0) ? new double[nCol] : new double[nRow];
144   for(i = 0; i<nNodes; i++) order[i] = i;
145   if (metric=='e' || metric=='b')
146   /* Scale all distances such that they are between 0 and 1 */
147   { double scale = 0.0;
148     for (i = 0; i < nNodes; i++)
149       if (tree[i].distance > scale) scale = tree[i].distance;
150     if (scale) for (i = 0; i < nNodes; i++) tree[i].distance /= scale;
151   }

위 코드인데, 149번째 줄에서는 tree를 접근하고 있다. 위에서 8 바이트라 했으므로, 아마도 double 형 요소인 distance 를 말하는 것일테고, 위 코드와 잘 맞는다. 그럼 왜 읽지 말아야 하는 부분을 읽었다고 했을까? 조건(148라인)을 보면 for 문에서 i 를 nNodes 까지 돌리고 있다. 즉, nNodes-1번까지 돌테고, 일반적으로 잘 맞는듯이 보인다. 그런데, 134 번째 줄을 보니 tree 는 treecluster 라는 함수의 반환값이고, nNodes 는 137번째 줄에서 적당히 설정되고 있다. 이 부분은 좀 이 예 의존적이긴 한데, 어쨌든 어떻게 풀어 나가는지에 대한 흐름만 따라가 보자. 위 코드는 Cluster 3.0 의 소스 코드를 가져 온 것인데, 메뉴얼에 보면 hierarchial clustering 결과 반환되는 노드 수는 원래의 item 보다 한 개 적다고 한다. 즉, 지금 nCol을 기준으로 clustering 을 하면 반환되는 노드 수는 nCol - 1 이어야 하는 것이다. 따라서 tree의 index 는 nCol - 2 까지만 가야 하겠지. 따라서 위의 코드 중에는 138, 141 번에서 - 1 을 추가해 주어야 한다. 이런 에러는 중요하다. 왜냐 하면, 이렇게 읽지 말아야 하는 곳을 읽을 경우 에러가 났다 안났다 하기 때문에 잡기 좀 어렵기 때문이다. 매번 죽으면 상관이 없는데, 같은 release mode라 해도 어떤 때는 잘 되고 어떤 때는 죽는 경우는 디버깅 하기 참 어려운데, 이렇게 접근하면 안되는 곳을 접근하는 경우 자주 그렇게 된다. 언뜻 봐선 에러 없이 끝난 것 같아도 실은 언제 터질지 모르는 고장난 시한 폭탄을 갖고 있는 격. 결국, 데모할 때 터지겠지, >.<"" 어쨌든, 이 부분은 이렇게 해결하고, 다음으로 넘어 가면, 

==9649== Mismatched free() / delete / delete []
==9649==    at 0x4004973: operator delete[](void*) (vg_replace_malloc.c:256)
==9649==    by 0x805E268: main (cluster.cpp:235)
==9649==  Address 0x4096E98 is 0 bytes inside a block of size 120 alloc'd
==9649==    at 0x40046FF: calloc (vg_replace_malloc.c:279)
==9649==    by 0x805D164: TreeSort(char, int, double const*, double const*, int const*, Node*, double**) (cluster.cpp:25)
==9649==    by 0x805DFF9: main (cluster.cpp:215)

malloc/free, new/delete, new []/delete [], 에 대한 대응이 잘못되었다는 얘기다. 실제로 235번째 줄은 delete [] neworder; 로 되어 있는데, 소스 코드를 보면 neworder 는 calloc 으로 할당이 된다. 따라서 이 부분에 맞게 free로 바꿔 주면 문제 해결. 원래의 코드가 ANSI  C 로 되어 있고 난 C++을 써버릇해서 이런 문제가 생겼다. 

   초기화되지 않은 변수에 의존해서 jmp 나 move, 즉 if 문 안쪽에 초기화되지 않은 변수에 의해 비교, 할당이 일어날 수 있다는 경고도 있는데 그것은 생략한다. 

'Programming > 이것저것' 카테고리의 다른 글

Doxgen 주석  (0) 2011.05.02
Doxygen - 작성중  (0) 2011.03.08
_Crt Debug Functions  (0) 2010.07.23
typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01
1.파일

/**

@file main.cpp

@date 2009/04/25

@author 홍길동(hong@aaa.com)

@brief 프로그램의 구동

*/

 

2.클래스

해당 클래스 선언부 위에 위치한다.

/**

@class main.cpp

@date 2009/04/25

@author 홍길동(hong@aaa.com)

@brief 프로그램의 구동

@warning 주의 사항이 있으면 이 곳에 입력한다.

*/

 

3.함수 설명

해당 함수 위에 위치한다.

/**

@return char * : 이름

@param strPersonNum : 주민등록번호

@brief 해당 주민등록번호의 이름을 가져온다

@warning 주민등록번호는 - 없이 입력한다.

*/

 

4. 간략설명

 해당 라인의 뒤에 위치한다.

unsigned logn nAssetIP;     ///< 자산 아이피

또는

unsigned logn nAssetIP;     /**< 자산 아이피 */

 

5.주석 내 사용되는 item 들

 @breif        간략한 설명을 쓴다.
 @remarks   자세한 설명을 쓴다.
 @file          파일 이름을 구별할때.
 @return      함수의 리턴값 나타낼때.
 @author     작성자 이름을 나타낼때
 @date        작성날짜를 나타낼때.
 @param      함수 파라메터를 나타낼때
 @see         참고할 함수나 페이지를 지정한다.
 @todo        해야할일들에 대한 기술, 전체 항목의 @todo에 대한 리스트가 생성됩니다
 @bug         버그에 대한 기술, 전체 항목의 @bug에 대해서 따로 리스트가 생성됩니다.
 @code       중요 코드를 설명할때 시작 지점 가리킨다.
 @endcode  중요 코드 설명할때 종료 지점 가리킨다.
 @exeception exception처리에 대한 설명
 @mainpage
 @section


 @throw: throw하는 객체나 변수등에 대한 설명

'Programming > 이것저것' 카테고리의 다른 글

Doxgen 주석  (0) 2011.05.02
[펌] valgrind 를 이용한 메모리 관리  (0) 2011.03.15
_Crt Debug Functions  (0) 2010.07.23
typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01
Out of the Box
  1. 살면서 듣는 말 중 긍정적인 말과 부정적인 말의 비율은 13:87이라고 한다.
  2. 87의 대부분은 자기가 자신에게 스스로 하는 ‘난 안 될 꺼야, 못할 꺼야' 이런 말이라고 한다.
  3. 자신에게 ‘난 내가 좋아' 라는 주문을 걸어주자.


Pattern Box(다른 사람의 성향 찾기)
  1. 사람의 성향은 아래 네 가지
  • V : 시각적(Visual) 시각적인 사고를 하는 사람
  • A : 청각적(Auditorium) 청각적인 사고를 하는 사람
  • K : 감각적(?? 까먹음ㅋ) 주로 감각에 의존하며 사고 하는 사람
  • AD : 분석적 지성적이고 수치적으로 판단 사고하는 사람

  1. Pattern Box에서 다른 사람의 성향을 찾는 방법은 ‘여행에 대해서 물어 보는 것이다'
    1. 여행 다녀와 보셨어요? 여행 중 가장 생각나는 것은 뭐예요?? 라고 묻고 경청하자
    2. 상대방이 시각적 설명을 많이하는지 아니면 청각, 감각, 분석적 인지 어떤 것인지 잘 생각하면서 듣도록 하자.


3S(남에게 편하게 다가가기)
  1. 내가 당신에 대해 모르는 것 하나 말씀해 주세요.
  2. 저의 장점을 하나 말씀해 주세요.
  3. 우리의 공통점이 뭘까요?



Value Matrix
사람의 취미를 통해서 좋아하는 이유 3가지를 통해서 그 사람의 가치 사슬을 이어나가는 방법
  1. 취미 묻기
  2. 그것을 좋아하는 이유 3가지 듣기
  3. 각각의 이유가 자신에게 의미하는 바를 묻기

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

포트폴리오, 이력서 블로그 작업 중!  (0) 2012.03.13
수원생활  (0) 2012.03.11
공부 테크니션의 여덟 가지 필살기  (2) 2010.10.11
이매진컵!! 자랑자랑..  (0) 2010.05.29
아아아아악  (0) 2010.05.08
안녕하세요. moltak 입니다.


메인 OS를 리눅스로 바꾼게 1주일 쯤 됐네요.
불편한 것은 거의 없었고. 아주 빠르고 쾌적한 환경에 매우 만족 중입니다.

다만... MS Office를 제대로 사용할 수 없다는 점이 좀 걸리긴 했었습니다.
(Wine으로 사용하는 MS Office는 반쪽 자리더군요. 기능이 잘 안되는....)
그래서 Virtual Box에 윈도우7을 깔아서 MS Office를 이용했습니다.
하지만 너무도 느린 속도 탓에(도대체 왜 이렇게 느린건지)
엄청난 메모리 사용량...(Win7 구동전 15% 구동후 90%)
그래서 가상화 프로그램과 OS를 바꾸기로 했습니다.

가장 많이 사용하는 가상화 프로그램 VMWare와 WindowsXP sp3으로 바꿨습니다.
WindowsXP를 사용 중인데 메모리는 24%정도 되네요.
그리고 MS Office도 훨씬 쾌적한 속도로 이용할 수 있습니다.




우분투에서 VMWare 설치법이 잘 나와있지 않았습니다. 
(검색해보면 VMWare에서 우분투 설치하기만 나오더군요.)

그래서 직접 부딪혔습니다.
검색 할 시간에 차라리 진작 해봤으면 됐을 껄 이라는 생각이 들더군요.
아주 쉬웠습니다.


VMWare Linux 로 검색을 해서 설치 파일을 받으시구요.
(전 토xx 를 이용...ㅋㅋㅋ)
chmod 777 주신 후에 그냥 설치하시면 끝납니다.
VMWare의 Unity 모드도 사용가능 합니다. 좋습니다. ㅋㅋ

궁금한 점들은 메일 주세요~~ㅋㅋ



Bloger : moltak.net
안녕하세요. molatk 입니다.

이번에 전 겨울 맞이로 해서....
그 좋은 윈도우를 버리고 리눅스로 완전 갈아 탔습니다. ㅋㅋ
메인 컴퓨터를 싹 밀고 우분투를 설치했습니다.
많이 사용해보지 않아서 무서웠지만....
좋은 툴이 굉장히 많더군요.!!

웹브라우저는 물론이고 개발 도구도 전혀 부족함이 없습니다.!!
(사실 개발 도구는 Visual Studio 진영이 너무 강력해서.... 부족합니다. ㅋㅋ)



툴 설명을 먼저 해드리겠습니다.
개발툴: Qt Creator
버전관리: RabbitVCS
Office: MS Office 2007(Wine으로 구동 중), Open Office(잠깐 써봤는데 좋습니다. 편해요ㅋㅋ)
웹브라우저: Chrome 
Design Tool: Visual Paradigm UML Community Edition
Messager: NateOn
그 밖에 Thunderbird, VirtualBox 등등 설치해서 사용 중입니다.

저 많은 프로그램을 띄워 놓고도 메모리는 26%밖에 사용하지 않네요.
3Gbyte * 26% = 780Mbyte 밖에
속도는 무지 빠르고ㅋㅋ

다른분들도 우분투에 도전해 보세요. ㅋㅋ
(근데 Word에서 원격 블로깅이 안됩니다. ㅠㅠ 더 찾아 봐야 할 듯.)



Bloger: moltak.net
Qt Creator 에서 외부 라이브러리를 사용하려면 옵션을 좀 설정해줘야 하는 군요.
좀 해멨습니다.

이번 블로깅의 목표는
Qt Creator를 이용해 프로젝트를 추가하고 gtest를 이용해 보자 입니다.

순서는 대략 아래와 같습니다.
1) Qt Creator 실행(설치는 이미 되어있다고 생각하겠습니다.)
2) 프로젝트 생성
3) 코딩
4) 프로젝트 파일 수정
5) 컴파일 & 링크
6) 실행


4)번을 보시면 아시겠지만. Qt Creator는 QMake를 사용하기 때문에 옵션을 조금 바꿔 줘야 합니다. 그것을 4)번에서 바꾸게 됩니다.


1) Qt Creator 실행, 프로젝트 생성 
(반드시 Qt Creator와 gtest가 설치되어 있어야합니다.)
Qt Creator를 실행하셔서 프로젝트를 생성합니다.

프로젝트 생성


이름은 마음데로 하시구요


저는 Qt Console Application을 선택했습니다.


프로젝트를 생성하실 때 Qt용 Console 프로젝트로 생성하시면 됩니다.

3) 코딩
위의 코드를 아래와 같이 변형해주세요.
코드를 보시면 아시겠지만 아주 간단한 코드 입니다.
다만 gtest를 사용하기 위해서 하나의 TEST를 추가해 주었습니다.

#include <iostream>
using namespace std;
#include <gtest/gtest.h>
TEST( test, test )
{
    EXPECT_EQ( 1, 1 );
}
int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest( &argc, argv );
    RUN_ALL_TESTS();
    cout << "test" << endl;
    return 0;
}

4) 프로젝트 파일 수정
자 여기가 제가 제일 헤멘 곳인데요.
프로젝트 탭에 보시면 프로젝트명.pro 파일이 보이실 겁니다.
그것을 열어서 아래 한 줄을 추가해 주세요.

LIBS += "/usr/local/lib/libgtest.a" 를 추가해주세요.


LIBS += "/usr/local/lib/libgtest.a"

gtest는 ./configure && make && make install 하면 한번에 설치가 끝나고, 컴파일때 생성된 파일들은 /usr/local/lib 에 생성됩니다. 그래서 위와 같이 라이브러리 파일을 링크해주시는 겁니다.


5) 컴파일 & 링크 & 실행

테스트 통과 화면 && "test" 출력 화면


자 끝났습니다.


이상으로 Qt Creator에서 gtest를 사용하는 것을 해봤습니다.

저는 리눅스를 거의 처음 사용해보기 때문에 고수님들이 보시기에는 매우 쉬운 것들도 굉장히 헤매게 되네요.

그럼 이만 물러가겠습니다.




Bloger: moltak.net

이 글은 개인적인 경험을 바탕으로한 해결책들이다.
100% 신뢰할수는 없으나, 적어도 나는 효과본 방법임을 미리 밝혀둔다.

본인은 단위테스트 도구로 c++unit을 쓰다, unittest++이 더 편한거 같아서 그쪽으로 옮겨갓다가
잠시 boost쪽도 써봣다.


문제는 다들 하나씩 문제가 있거나 뭔가 불편하다는 거엿다.
예를들어 c++unit과 boost는 테스트하기 위해 생산하고 관리할 코드가 산더미가 될수도 있었고
unittest++은 내가 몰라서 그런진 몰라도 테스트하기 껄끄러운 테스트케이스들이 있어서 좀 난감햇다.

하지만 어찌됫건 사용하기 편한건 unittest++이라 그쪽으로 계속 사용했는데...

최근 리눅스로 옮겨타서 뭔가 만들일이 있어서 netbeans를 쓰다 여기서 c++unit이 지원된다는걸 발견!
자동으로 코드도 만들어주니 잘 써먹으려 했으나 역시 몇가지 짜증나는 문제들이 있어서 안쓰기로 결정했다.

그러다 눈에 띈게 google test였는데...

이것도 사용하기 간편한 쉬운 단위 테스트 라이브러리라 일단 설치하고 쓰다보니 이거말고 다른걸 못쓰겟더라;;
(일단 능력 자체는 unittest++과 비슷한데, 더 쉽다. 쉽고 간단하다는게 아주 크다.)


어찌됫건 gtest를 쓰려다/쓰다 생기는 몇가지 문제를 해결하기 위한 트릭을 몇개 적어볼까 한다.



1.설치
일단 설치부터 난관인데...
우분투나 오픈수세같은 플랫폼의 gcc라면 그냥 아무런 생각도 하지 말고 

#./configure
#make
#make install

하면 된다.

설치위치는 /usr/local/ 이며, 라이브러리는 lib, 헤더는 include에 들어가 있다.

icc도 크게 다를건 없을꺼다.



2.컴파일이 안되요, 링커가 앙탈부려요
당연한 이야기지만 프로젝트 설정 같은데 보면 include설정하고 lib설정 있을 거다.
그걸로 설정하면 
헤더를 못찾겠는데요?, 라이브러리는 어딧나요?
같은 이야기는 대부분 사라진다.

넷빈의 경우 프로젝트 설정의 컴파일러 부분에 있는 include dir 부분과 링커의 librareies 부분을 만져주면 된다.
만약 full path 입력이 귀찮다면 환경변수 부분에 설정해 두고 입력하면 된다.

문제는 다음에서 발생한다.



3. undefined reference to `pthread_key_create' ..... 라는 형태로 링커 에러가 뜬다.
이거 아주 간단하게 해결된다.
gtest는 스레드 기반인듯한데...
당연하게도 -lpthread 를 붙여줘야 한다.

본인은 openmp 쓰느라 모르다가 어쩌다 딴거 테스트하다 본 에러라 쉽게 해결했다.


넷빈의 경우 프로젝트 설정의 링커 부분에 libraries 부분이 있는데 거기 들어가서 옵션 눌어 추가해주면 된다.


4. 실행파일이 libgtest.so.0 을 못찾겟단다
이거 의외로 해결하기 골치아프다.

실행파일을 ldd로 찍어보면 not found 찍히는데
/usr/local/lib 가면 libgtest.so.0 이녀석은 멀쩡하게 존제하고 잘 작동중이다.

왜이럴까?

결국 임시방편으로 ld_library_path로 쇼부치다(내가 리눅스를 아는 수준은 딱 이정도가 한계다;;) 

검색으로 다음과 같은 포스트를 찾아냇다.
http://www.openguru.org/2009/04/how-to-fix-shared-library-load-problem.html

맨 아래 보면 ldconfig를 만저서 해당 문제를 멋지게 해결해내고 있다.

저게 옳은 방법인지는 확실치 않지만, 어찌됫건 해결되면 장땡.



이로서 gtest준비는 끗~

이제 주 프로젝트와 여러개의 테스트 프로젝트를 굴리면서 프로그래밍을 하면 된다.

[펌: http://blog.naver.com/hsshee?Redirect=Log&logNo=70037637328]


간혹 어떤 프로그램에서 LoadLibrary와 GetProcAddress API를 사용하여,

어떤 dll 내의 함수를 사용하는 경우가 있다.

 

LoadLibrary와 GetProcAddress의 원형을 살펴보자.

 

◈ HMODULE LoadLibrary( LPCTSTR lpFileName );

> 인자로 준 DLL을 현재 프로세스의 주소공간으로 mapping 시켜서 사용할 수 있도록 해주는 API.

 

◈ FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

> DLL에서 Export한 함수의 번지를 찾아서 그 함수를 사용할 수 있도록 그 함수의 포인터를 리턴해 주는 API.

 

 

1. DLL 내의 함수를 사용하기 위해서는,

먼저 LoadLibrary를 이용하여 DLL의 모듈 핸들을 리턴 받는다.

( HMODULE or HINSTANCE와 같은 핸들을 통해 리턴받으면 된다. )

 

인자는 DLL의 경로를 문자열로 넘겨주면 되고, 끝에 널문자가 있어야 한다는 걸 잊지 말자.

 

참고로, 반드시 리턴된 모듈 핸들이 NULL이 아닌지를 체크하는 습관을 들이도록 하자.

 

 

2. 유효한 모듈 핸들을 가지고,

GetProcAddress를 이용하여 DLL에서 Export한 함수를 가져오자.

 

이 때의 인자는 LoadLibrary를 통해서 리턴 받은 모듈 핸들과

그 DLL 내에서 사용하기 원하는 함수의 이름을 문자열로 넘겨준다. 이 때에도 끝에 널문자가 있어야 한다.

 

GetProcAddress를 수행하면 프로그램에서 선언한 함수포인터 변수에

DLL에서 Export한 함수의 주소가 리턴되어 이 프로그램에서 선언한 변수를 통하여

DLL 내의 해당 함수를 사용할 수 있게 되는 것이다.

 

만약에 인자가 정확하게 들어가지 않았다면, 역시 NULL이 리턴된다.

 

 

3. LoadLibrary와 같이 모듈 핸들을 받아서 DLL을 사용하였을 경우,

FreeLibrary API를 이용하는 습관을 들이도록 하자.

 

◈ BOOL FreeLibrary(HMODULE hLibModule);

>해당 DLL의 사용 카운트를 1 감소시키고 사용 카운트가 0이 되었을 때에 메모리에서 해당 DLL을 삭제해준다.

   리턴형은 BOOL인데, 이 때에 DLL을 삭제하는 데에 성공했다면 TRUE를, 실패했다면 FALSE를 리턴하는 것이다.

 
4. GetProcAddress에서 NULL이 리턴되는 경우 중,

Name Mangling으로 인한 경우가 있다. 이 때의 해결책은 다음과 같다.

 

DLL 프로그래밍한 프로젝트에서 export하는 함수를 선언하는 헤더에 다음과 같이 추가하여 Rebuild하면 된다.

 

 cpp dll 을 c type으로 바꿔주는 코드

 

#ifdef __cplusplus
extern "C"
{
#endif

 

// export할 함수

 

#ifdef __cplusplus
}
#endif

 

 

어떤 함수를 위의 코드를 이용하지 않고 빌드한 경우와 위의 코드를 추가하여 빌드한 경우에

각각의 dll파일을 Peview를 통하여 어떻게 함수명이 저장되는지 확인해보자.

 

원하는 함수명은 GetOpcodeFirstByte이다.

 

1) 위의 코드를 이용하지 않고 빌드한 경우,

 

2) 위의 코드를 추가하여 빌드한 경우,

 

1)의 경우에 GetProcAddress에서 Export할 함수의 문자열을 "GetOpcodeFisrtByte"로 넘겨주면,

실제 dll의 export된 함수명과 다르기 때문에 NULL이 리턴된다.

 

※ 위의 코드를 추가하는 습관을 들이도록 하자.

'NativeCode > api' 카테고리의 다른 글

printf, scanf 함수 포맷 문자열  (0) 2010.07.07
IP, TCP, UDP, ICMP Checksum 계산  (0) 2010.07.05
IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
이미 정의되어 있습니다. 무시
/FORCE:MULTIPLE


Bloger : moltak.net
안녕하세요. moltak 입니다. 
우연히 "공부하는 독종이 살아남는다"라는 책을 볼 기회가 생겨서 일거 봤는데 매우 좋네요. ㅋㅋ
그 부분에서 가장 기억에 남는 또 바로 도움이 될 만한 챕터를 요약해 봤습니다. 


[공부하는 독종이 살아남는다.]
[정신과 전문의 이시형 박사 지음: 중앙 books]


1) 몸과 마음을 준비시키는 집중의 비법
-> 내게 맞는 곳에서 책을 펼쳐라 : 넓고 개방된 곳 보다는 적당한 크기의 폐쇄된 공간이 좋다. 너무 조용하면 정서적으로 안정이 안될 수 도 있다. 음악을 틀되 평소에 자주 듣거나 아주 좋아하는 음악은 피하는 게 좋다. 
-> 주변 환경이 조성되었으면 크게 심호흡을 해 보자. 바른 자세로 앉아 숨을 깊이 들이마시고 내쉬는 동안 우리 뇌에서는 세로토닌이 분비된다. 그 1분간의 명상으로도 뇌는 충분히 공부 준비를 한다. 공부 시작 전 학교 다닐 때 수업이 시작되기 전 반장이 일어나 '차렷, 경례' 하는 것처럼  '시작!' 이라고 기합을 외쳐보자.
-> 이제  책을 펴고 오늘의 목표를 정해라. : '몇 시까지 두 챕터를 읽겠다', '오늘 중으로 단어 50개를 위우겠다. 하는 식으로 구체적인 목표를 정해라.
-> 꾀가 나거든 하품을 하거나 기지개를 켜라. 각성 중추가 자극되어 가뿐한 기분이 든다. 그래도 집중이 흐트러지면 일어나라. 서있기만 해도 100개 근육이 이완과 긴장을 반복하여 뇌를 자극한다. 창문을 열고 방 안을 걷거나, 소리내어 읽어라. 찬물로 세수 하거나 '짝!' 소리가 나게 박수를 쳐라. 정 피로감이 심해지면 아예 큰대자로 누워라. 5분 정도 누워있는 것이 최고의 피로 회복제다.
-> 이렇게 온몸을 움직여서 머리를 쉬게 하자. 단 이 시간은 딱 10분이다. 10분이 넘으면 공부에의 뇌 회로 활성도가 차츰 떨어지기 시작한다.

2) 초고도 집중력을 기르는 일점 집중의 비법
-> '버리는 것'에서 시작한다. 이것도 저것도 다 하려면 안된다. 일단 여기다 싶으면 오직 여기에만 전력투구 하라. 렌즈의 초점이 두셋이 되면 불이 붙지 않는다.
-> 집중의 대상이 단순 명쾌해야 한다. '이번 시간에 단어 20개는 외운다' 처럼 구체적이고 실질적이어야 한다.
-> 전체를 개관해야 한다. 앞으로 남은 시간, 분량, 내 실력등 전체적인 판단이 서야 버릴 건 버리고 한점에 집중 할 수 있다. '이 시간엔 이것만 하면 된다'는 안심감이 집중을 잘할 수 있게 해준다.
-> 전체적인 흐름에서 감당할 만큼의 부하를 걸어야 한다. 처음 하는 공부라면 적정한 양을 마스터함으로써 달성감, 자신감을 얻을 수 있다. 하지만 차츰 그 수준을 넘어, 자기 허용 범위까지 넘어야 한꼐를 돌파할 수 있다.

3) 생각과 감정을 깔끔하게 정리하는 순간 전환의 비법
공부와 상관없는 생각과 감정은 학슴을 방해한다. 지금 하고 있는 것이나 앞으로 해야 할 것과 관련이 없는 생각은 다른 상자에 넣어 뚜껑을 닫아야 한다. 그리고 새로운 생각을 담을 상자의 뚜껑을 연다.
이것을 순간 전화의 기술, 컴파트먼트(Compartment)라고 한다. 
지금 하는 공부에 집중할 때 는 그 전에 한 공부는 잊어버리게 되어 있다. 그래야 지금 공부에 집중할 수 있기 때문이다. 둘 다 하려면 어느 것 하나도 잘 안 된다. 지금 하는 공부에만 집중해라. 그 전 것은 과감히 잊어도 된다. 잊어버린 것은 다음에 또 하면 된다.

4) 하루를 48시간 처럼 쓰는 시간 창출의 비법
-> 뇌과학에서 추천하는 가장 간단하고 효과적인 시간 창출의 방법은 아침 일찍 일어나는 것이다. 성공적인 인생을 살고 싶다면 잠은 6시간이면 충분하다. 그리고 점심 식사 후 15~20분간 낮잠을 자 두자.
-> 미리 공부 시간을 정해 놨다면 그 시간에 딱 책상 앞에 앉아라. 미루지 말고 당장 시작해라.

5) 긴장과 이완을 적절히 조화시키는 휴식의 비법
-> 하룻밤 8시간의 수면은 90분 단위로 5주기가 진행된다. 밤잠은 짧게, 그러나 6시간은 자되 낮잠을 자라.

6) 필요한 공부 정보만 골라 담는 정보 습득의 기술
-> 대충 읽기: 많이 읽는 것이 중요한게 아니라 핵심을 내 것으로 만드는 일이 중요하다. 대충 훑어보다가 어려운 부분은 건너뛴다. 시간은 없다. 중요하다가 생각되는 부분만 자세히 읽자.
-> 밑줄 그으며 읽기: 책은 아껴 보는 것이 아니다. 특히 공부용 책은 깨끗해서는 안 된다. 밑줄과 네모로 지저분한 책은 그만큼 열심히 공부했다는 증거다.
-> 저자와 토론하며 읽기: 내 기존 지시을 동원해 비판, 보완하고 새로 편집, 요약한 걸 선택적으로 입력해 기억 창고에 저장해 두어야 한다. 이게 크리에티브 리딩(Creative Reading), 크리에이티브 리스닝(Creative Listening), 창조적 입력이다.

->메모하며 읽기: 읽다 보면 뇌가 자극받아 여러 가지 생각이 고구마 줄기처럼 떠오를 때가 있다. 그 생각들을 여백에 가볍게 적어 둔다.

-> 다시 읽기: 꼼꼼하게 한 번 읽는 것보다 여러 번 읽는 것이 학습에는 더 효과적이다.



7) 잊거나 깜빡하지 않게 하는 정보 기억의 기술
-> 온몸을 동원해 기억하라: 프로이트는 라틴어와 그리스어를 공부하면서 단어를 외울 때 손으로 벽을 두드리며 온 집안을 돌아다녔다고 한다. 감각 기관이 많이 동원될수록 뇌의 활성화 범위는 넓어진다. 눈으로만 읽을 때는 시각야만 자극되지만, 온몸 학습법은 뇌의 활동 범위가 넓어져 활성도를 높인다. 공부할 때 기억의 저장고가 활짝 열리도록 온몸으로 뇌를 자극하자.
책을 읽을 때는 소리 내 읽어라. 암창법(暗唱法)은 옛날 서당에서 사용하던 학습법이다. 가급적 자극을 활용하는 것이 기억의 정착률을 높인다.

-> 기억과 감정을 연계해 기억하라: 기억과 본능이 바탕이 된 즉각적인 판단을 뇌과학에서는 감정 기억이라 한다.

-> 먹으며 기억하라: 공부할 때 커피를 적당히 마셔보자. 커피는 도파민 신경을 자극하고 알파파를 형성한다. 콩과 두부요리에는 뇌 세포의 주요 성분인 레시틴이 풍부하다. 레시틴은 뇌 신경 세포를 활성화시켜 머리 회전을 빠르게 해 주는 것으로 알려져 있다. 레시틴은 호두, 잣 등의 견과류에도 다량 함유되어 있어 공부할 때 간식거리로 좋다.

-> ‘끊어 가기’로 기억하라 : 공부가 힘든 이유 중 하나는 기억의 간섭 때문이다. 무언가를 기억하려고 할 때 그 전의 기억이 새 기억을 못하게 방해하는 현상이다. 혹은 새 기억이 들어옴으로써 그 전에 겨우 익혀 놓은 기억이 약해지고 흔들리기도 한다. 학술적으로는 이를 기억 억제 또는 간섭이라고 부른다. 이 현상이 발생하면 진도가 잘 나가지 않고 머리가 복잡해진다. 이럴 때는 공부를 잠깐 끊고 머리를 식혀야 한다. 머릿속에 이런 형상이 계속되면 실제로 뇌 속의 열이 오른다. 뇌는 체열보다 조금 낮은 온도에서 잘 돌아가기 때문에 찬바람이나 찬물로 식혀라.

-> 전체 맥락을 먼저 이해하라: 공부할 내용을 이해해야 공부할 부분에 체계가 선다. 공부의 체계를 잡는 것을 전문 용어로는 기준계라고 하는데, 계통적인 틀을 만든다는 뜻이다. 이해한 후 전체의 틀이 잡히면 절로 메모리 트리(Memory Tree)가 그려진다. 이 후의 단계는 복습이다.

-> 세 단계 복습으로 기억하라: 기억을 다지는 작업은 기억 후 수시간 내에 하는 것이 가장 효율적이며, 그 후엔 1일, 1주, 그리고 1개월의 사이를 두고 복습하는 것이 좋다.

8) 필요할 때마다 쏙쏙 꺼내 쓰는 정보 활용의 기술
-> 기억을 그루핑(Grouping) 한다 : 핵심을 최상위에 놓고 그 하위 개념으로 연관된 것들을 묶어 보자. 단어를 외울 때 기본형으로 기억의 틀을 잡자.

-> 디테일은 신뢰할 수 있는 자료로 따로 정리한다: 일단 개략적인 내용을 확실하게 잡고 디테일의 정보는 굳이 외우려고 노력하지 말자. 굳이 기억하지 않아도 공부에 큰 지장이 없는 디테일 정보들은 따로 메모를 해 놓거나 노트를 만들어 두는 것도 좋다. 필요할 때 언제든 꺼내 볼 수 있도록.

-> 장기 보관이 필요없는 정보는 과감히 삭제한다: 



Bloger : moltak.net

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

수원생활  (0) 2012.03.11
Out of the Box  (0) 2011.03.08
이매진컵!! 자랑자랑..  (0) 2010.05.29
아아아아악  (0) 2010.05.08
CodeEngn Basic 완료  (2) 2010.04.28
안녕하세요. moltak 입니다.
중학교 때부터 15년간 배운 영어...ㅠㅠ

얼마전 선배가 추천해준 큰 소리 영어 학습법에서 나온 말 적어 봅니다.
제게 도움이 되길 간절히 원하면서!!ㅋ

자, 이제 문법에 대한 결론을 독자 여러분에게 자신 있게 말할 수 있다.
1. 문법을 배우지 말라.
2. 대신 책을 많이 읽어라.
3. 특히 재미있는 책부터 시작해서 부담 없이 읽어가기 시작해라
4. 특히 큰소리를 내서 읽어라.
5. 반복해서 읽어라.
6. 또, 문법을 배우면 책을 읽는 능력은 퇴화 된다.

위 방법을 써도 노력을 하지 않으면 당연히 필요 없징. ㅠㅠ
노력하자!!


Bloger : moltak.net

안녕하세요. moltak 입니다.

윈도우에서 Eclipse로 개발하면 컴파일러를 gcc를 사용하게 됩니다.

 

 

Eclipse에 CDT를 설치해서 소스코드 작성하고 gcc를 이용해 컴파일하며 gdb를 이용해 디버깅 하게 됩니다. 리눅스에서는 아주 쉽게 되는 작업이지만 처음 사용하는 저는 굉장히 어려웠습니다.

 

 

이 포스팅의 목표는 GoogleTest(이하 gtest)를 윈도우에서 gcc를 이용해 컴파일하고 eclipse에서 사용하는 것을 목표로 하겠습니다. 먼저 Eclipse와 JDK, CDT가 없으신 분은 [Eclipse에서 C, C++ 개발환경 구축하기] 를 참고하셔서 먼저 설치를 하시기 바랍니다.

 

 

먼저 gtest를 다운로드 받습니다. http://code.google.com/p/googletest/downloads/detail?name=gtest-1.5.0.zip

그 후 압축을 푼 후 아래를 따라 합니다.

실행 -> cmd -> cd gtest directory -> cd make -> mingw32-make Makefile all -> mingw32-make gtest.a

Figure 1 MinGW32-make

 

 

Figure 2 Make 수행 후

제대로 되셨다면 gtest.a 가 생성이 됩니다. .lib 라이브러리 파일은 msvc에서만 사용하는 라이브러리 파일이고 gcc는 .a라는 라이브러리 파일을 사용하게 됩니다. gtest.a 가 제대로 생성이 됐다면 이제 gtest를 사용하는 일만 남았습니다.

 

 

Figure 3 GTest 예제 코드

 

위 코드는 gtest를 사용하는 예제 코드입니다. 이 코드를 돌려 보도록 하겠습니다.

Eclipse를 실행시켜주세요. C++ 프로젝트를 생성 하신 후 위 코드를 작성 합니다.

이제 이클립스에서 몇 가지 설정을 해줘야 하는데요.

 

프로젝트 속성 -> C/C++ Build -> Settings -> GCC C++ Compiler -> Directories 부분에 gtest\include 폴더 추가해 주세요.

 

그리고 제가 가장 헤멘 부분. [.a] 링크하기!! 처음에 .a파일을 생성해야 하는 이유도 몰랐고 어떻게 하는지도 몰랐죠. 몇 일간 헤메니깐 답이 보이더군요. (이클립스를 이용해서 윈도우 플랫폼에서 C++ 개발하는 분들이 별로 없나 봅니다. 검색해도 잘 나오지 않던…)

 

다시 프로젝트 속성에 가셔서 C/C++ Build -> Settings -> MinGW C++ Linker -> Miscellaneous -> Other objects에 [gtest.a] 파일의 경로를 지정해 주시면 됩니다. 그리고 컴파일 하시면 성공!!

 

Figure 4 실행 화면

Figure4 그림처럼 나오면 성공입니다. ^^

 

 

이 글을 작성하고 나니깐 지난 3일간이 제가 엄청나게 삽질을 했다는 것을 알겠네요. 블로깅 양이 엄청 적은… 하지만 이제 리눅스와 윈도우에서 똑 같은 개발 환경을 갖고 프로젝트를 진행 할 수 있다는 것이 너무나 기쁘네요.

 

GTest를 G++로 컴파일해서 eclipse로 컴파일해서 사용했다는 것은 이제 어떤 라이브러리도 사용할 수 있다는 것을 뜻합니다. 물론 좀 복잡하게 사용해야 하지만… MSVC가 너무 잘 만들어진 IDE라서 윈도우에서는 MSVC 말고는 사용하기 힘들기도 할 것 같습니다. 하지만 Eclipse의 매력도 얕볼 수가 없는데 리눅스에서도 똑 같은 자신의 환경을 갖고 프로그래밍 할 수 있다는 큰 매력이 있다는 것입니다.

 

 

 

Bloger : moltak.net

이클립스에서 C, C++을 개발 환경을 구축하기 위한 글입니다.
아주 상세히 정리를 해 놓으셨네요.

이 글은 http://blog.jidolstar.com/677 에서 첨부해왔습니다.


윈도우 환경에서 Eclipse Galileo 버전으로 C, C++ 개발을 위한 환경을 만드는 것을 설명하는데 목표가 있다. 기존에 Eclipse기반으로 Flash Builder 플러그인을 설치해 Flash 개발을 하거나 Java 개발하시는 분들이 같은 환경에서 C, C++을 개발하고자 한다면 이 글은 유용한 팁정도가 될 것이다.


1. MinGW를 설치한다. 
MinGW(한국어 발음 밍우?)는 무료로 쓰고 배포할 수 있는 MS 윈도우 헤더 파일과 라이브러리로, 어떠한 써드 파티 C 런타임 DLL에 의존하지 않고 네이티브 윈도우 프로그램을 만들 수 있는 GNU 툴을 제공한다. 쉽게 이야기해 MinGW는 윈도우에서 툴이나 dll에 의존하지 않는 동작하는 프로그램을 만들 수 있도록 도와준다.

MinGW에 대해 : http://ko.wikipedia.org/wiki/MinGW 

물론 C/C++를 개발하기 위해 Cygwin을 이용해도 된다. 하지만 cygwin 기반으로 제작한 것은 항상 cygwin1.dll이 필요한다. 또한 개발한 결과물은 라이센스 문제로 상용으로 팔기가 곤란하다. 게다가 윈도우에서 직접 개발한다기 보다 가상의 리눅스 콘솔을 이용하는 것이다. 그래서 여러가지로 MinGW이 장점이 많다.


1.1 MinGW 받기 
공식 사이트 http://www.mingw.org/ 로 간다. 좌측 메뉴에 Downloads 페이지로 이동한다. Download Now 버튼을 눌러 최신버전인 MinGW-5.1.6.exe(2010.04.20)를 다운로드 받는다. 


1.2 MinGW 설치
  • 다운받은 MinGW-5.1.6.exe를 실행한다.
  • Welcome 화면 Next를 클릭한다.
  • Download and install을 선택후 Next 버튼을 클릭한다.
  • I agree를 클릭한다.
  • Candidate를 선택후 Next를 클릭한다.
  • 설치하고자 하는 것을 선택후 Next를 클릭한다. g++ compiler와 MinGW Make는 반드시 선택한다.
  • 설치하고자 하는 디렉토를 선택한 다음 Next 클릭
  • Install을 클릭하면 이제 필요한 것을 다운로드 받아 설치를 시작한다.
  • 설치가 완료되면 Next 클릭후 Finish를 누른다.

 

1.3 GCC를 실행하기 위한 윈도우 환경변수 설정하기

이제 어느 경로에 있던지 gcc 컴파일러를 실행할 수 있도록 환경을 조성해줄 필요가 있다. 

이 방법은 Cygwin을 사용하지 않고 오로지 MinGW만 사용하는 경우에 해당한다. 만약 Cygwin을 함께 사용하시는 분이라면 배치파일을 만들어 사용하는 방법도 있다. (http://kldp.org/node/48962)

  • 제어판에서 시스템 폴더 클릭. window 7환경에서 개발한다면 검색창에서 시스템을 입력한뒤 시스템 환경 변수 편집을 선택한다.
  • 아래 표시된 방법대로 입력하면 되겠다. 최종적으로 MinGW 설치된 폴더에 Bin 폴더를 입력하는 것을 목표로 한다.


  • CMD창에서 gcc --version과 mingw32-make를 입력하고 다음과 같이 나오면 성공적으로 설치된것임

 이제 MinGW가 설치되었으므로 window 기반에서 C, C++등을 개발할 수 있는 환경이 만들어진 것이다. 다음에 나오는 Eclipse기반이 아니더라도 메모장에서 C코드를 짜고 GCC로 컴파일할 수 있다. 하지만 개발툴을 메모장을 사용할 수는 없는 노릇아닌가?


2. Eclipse Galileo 버전을 설치한다.
Eclipse는 기존에 설치했던 사람이 대부분일 것이다. 이 설명은 필요없는 내용일 수 있으나 그냥 적어본다.

일단 Eclipse는 아래 링크에서 자신의 개발하고자 하는 목적별(Java, C/C++, PHP등)로 다운로드 받아 설치할 수 있다. 

http://www.eclipse.org/downloads/

필자는 Java기반에서 개발하는 일이 많으므로 Java EE Developers를 위한 Eclipse IDE를 설치했다. Windows 32bit 기반을 다운로드 받았다. 설치는 받은 압축파일을 원하는 곳에 압축만 풀어주는 것으로 완료가 된다. 본인은 E:\eclipse 에 설치했다. C 드라이브에 설치하지 않은 이유는 나중에 운영체제를 다시 설치하는 경우에 Eclipse를 보존하기 위함이다.

Eclipse를 처음 설치하는 사람이라면 반드시 JRE가 자신의 컴퓨터에 미리 설치가 되어 있어야 Eclipse 구동이 가능하다. 다음 링크에서 JRE나 JDK 최신버전을 설치하면 되겠다.

http://java.sun.com/javase/downloads/index.jsp

만약 C/C++기반인 Eclipse를 다운로드 받아 설치하면 다음에 "3. CDT 플러그인을 설치한다"를 넘겨도 된다. 


3. CDT 플러그 인을 설치한다.

CDT는 C/C++ Development Tool이다. 기존에 이클립스 기반으로 개발하던 사람이라면 C/C++도 Visual Studio와 같은 툴을 활용하지 않고 개발하고자 하는 욕구(?)가 들지도 모르겠다. CDT를 Eclipse에 설치하면 C,C++ 개발이 가능한 환경이 된다. 

CDT는 개발하는 툴이지 컴파일러가 아니다. CDT를 설치했더라도 각각 운영체제 기반에서 제공하는 C/C++ 컴파일러와 연결하는 작업은 필요하다. 여기서는 CDT를 Eclipse에 설치하는 방법만 소개한다.

Eclipse 메뉴에서 Help > Install New Software... 를 선택한다.

아래와 같은 화면이 나오면 Add 버튼을 누른다.


http://www.eclipse.org/cdt/downloads.php 에 가면 최신버전(현재 CDT 6.0.x)을 다운로드 받을 수 있는 링크가 소개되어 있다. Eclipse가 Galileo버전이므로 http://download.eclipse.org/tools/cdt/releases/galileo 를 URL로 삼아 플러그인을 설치하면 되겠다. 

아래처럼 Add Site창에 Name과 Location을 입력한다. Name은 아무거나 입력하면 된다.


참고로 위처럼 등록하면 Windews > Preferences > Install/Update > Avaliable Software Sites에 아래처럼 등록되어 있다. 


이제 Work with 란에 CDT를 입력해보면 금방 등록했던 CDT 정보를 선택할 수 있다. 그럼 아래처럼 나온다. CDT Main Features, CDT Optional Features 모두 Check하고 Next버튼을 누른다.


아래처럼 설치할 목록들이 나온다. Next버튼을 누른다.



아래와 같은 화면이 나오면 I accept the terms of the license agreements를 선택후 Finish 버튼을 누르면 설를 시작한다. 시작이 완료된 다음에는 Eclipse를 재구동한다. 



Eclipse가 구동된 다음 C/C++ Perspective를 열어보자. Windows>Open Perspective>Other 를 선택한다. 아래처럼 창이 뜨면 C/C++를 선택한다. 
 

Perspective창에 아래처럼 추가 된것을 확인하자. 이제 Eclipse에서 

File > New를 가도 C, C++ 프로젝트를 만들 수 있게 되었다. 


4. 간단한 C/C++ 개발해보기

MinGW의 bin 폴더에 보면 gcc, g++등 각종 컴파일 도구가 있다. 이클립스의 CDT환경에서 C/C++로 개발할때는 MinGW의 컴파일 도구를 이용해 컴파일 한다는 사실을 기억하자.

다음과 같이 C++ 프로젝트를 만들어보자. 
  • 이클립스 메뉴에서 File > New > C++ Project를 선택한다.
  • 다음 그림과 같이 프로젝트를 만들기 위한 창이 나오면 Project name을 넣고 Project type을 Executable > Hello World C++ Project를 선택한다음 Toolchains를 MinGW GCC로 선택하도록 한다. 이렇게 하면 자동으로 Hello World CPP가 만들어지면서 컴파일은 MinGW의 g++컴파일러를 이용해 컴파일 할 수 있도록 설정 되는 것이다. Next 버튼을 누른다.
  • 간단한 셋팅을 하는데 이 설정에서 중요한 것은 Source 파일은 src 폴더에 들어가게 된다는 것이다. Next 버튼을 누른다.


  • 다음 그림과 같이 Debug, Release 두 버전으로 프로그램 결과를 별 수 있도록 셋팅된다. Finish 버튼을 누른다. 

 

이클립스의 Project > Build Automatically가 선택되어 있다면 위처럼 프로젝트를 만들게 되면 자동으로 MinGW의 g++을 찾아 컴파일을 실시하게 된다. 아래와 같은 메시지가 이클립스의 Console창에 나오면 제대로 실행된 것이다. 


위 메시지 처럼 컴파일을 하지 못하고  아래처럼 Nothing to build for Test1 메시지가 뜬다면 이것은 수정된 내용이 없으므로 컴파일할 필요가 없다는 것을 의미한다. 대신 Ctrl+B 하면 강제로 컴파일한다.


이 프로젝트는 C++ 프로젝트이므로 gcc 컴파일러가 연결되어야 한다. 만약 컴파일에 실패한다면 Mingw/bin에 gcc.exe를 확인해보자. 만약에 없다면 위에 Mingw 설치하기를 다시 한번 따라해보길 바란다.

실행해보자. 아래처럼 만들어진 프로젝트의 src폴더를 열어 Test1.cpp를 선택한다. 그리고 빨간 박스로 표시된 아이콘을 클릭하거나 Ctrl+F11을 하면 실행할 수 있다.

Console창에 아래처럼 Hello World가 출력된것을 확인하자.

Build Automatically를 체크한 경우에는 코드를 수정하고 저장할 때마다 자동 Build처리된다. 하지만 수동으로도 할 수 있는데 Ctrl+B 또는 아래 그림처럼 망치툴을 클릭해서 Build할 수 있다.



개발시에는 Debug버전과 Release 버전이 있다는 것을 기억하자. 아래 보이는 도구는 현재 개발 환경이 Debug인지 Release인지 결정해 주는 도구이다. Debug는 개발용이고 Release는 외부로 배포할때 사용한다.


실제로 이 도구를 이용해 Debug에서 Release로 바꿔보자. 아래처럼 Release 폴더가 생겨나고 컴파일 결과가 이 폴더안에 만들어진다. 이때부터는 실행할때 Release폴더에 있는 exe파일이 실행되게 된다.


참고로 makefile을 기반으로한 개발을 하고 싶은 경우가 있을 수 있다. 이런 경우에는 C++ 프로젝트를 생성시에 아래 그림처럼 Makefile Project를 선택해서 생성해야한다. 

하지만 실제로 이 상태로 프로젝트를 생성해 컴파일하면 Cannot run program "make": Launching failed 메시지가 console창에 보이면서 컴파일이 불가능하다. 이 메시지는 컴파일을 수행할 수 있는 make 명령어를 찾지 못한다는 것을 의미한다. Eclipse에서는 기본적으로 make가 지정되어 있지만 MinGW의 make 명령은 mingw32-make로 다르다. 그러므로 이 문제를 해결하기 위해 mingw32-make.exe를 복사해 같은 폴더에 make.exe로 이름을 바꿔주면 된다. (물론 찾아보면 다른 방법도 있지만 이 방법이 가장 빠르고 쉽다.) 

makefile을 이용해 개발해보는 간단한 예제는 다음글을 참고한다.
http://kkamagui.springnote.com/pages/446531


5. 간단한 win32용 프로그램 개발하기 
지금까지의 예제는 단순히 Console창에 결과가 나온다. MinGW는 Windows API를 이용한 개발도 지원하므로 앞서 설명한 같은 C++ 프로젝트로 만들고 아래 코드로 변경해도 컴파일이 가능하다.


01.#include <windows.h><windows.h>
02. 
03.int WinMain(HINSTANCE hInstance,
04.HINSTANCE hPrevInstance,
05.LPTSTR    lpCmdLine,
06.int       nCmdShow)
07.{
08.MessageBox(NULL, "Hello in EclipseCDT""EclipseCDT", MB_OK);
09.return 0;
10.}
11.</windows.h>


실행해 보면 아래와 같은 다이얼로그 창이 나온다.

경험자들에 따르면 Win32 로 개발하는 경우에는 한가지 중요한 C++ 링커 설정을 해야한다고 한다. 

먼저 해당 Win32 프로젝트를 선택후(필자의 경우 Test3) 이클립스 메뉴에서 Project > Properies로 들어갑니다. 아래처럼 창이 뜨면 C/C++ Build > Setting으로 들어가 Tool Setting 탭을 선택합니다. 거기에 MinGW C++ Linker>Miscellaneous를 선택해 Linker flags에 -mwindows를 입력한다. 완료하면 Apply버튼이나 OK 버튼을 누르면 적용된다.

이 설정을 해야 군데 군데 "undefined reference"와 같은 에러를 발생시키지 않는다고 한다. 수정했는데도 에러를 띄우면 File->Save all 또는 이클립스 종료후 다시 시작하면 된다. 

Windows API 학습을 위해 다음 링크를 참고한다.
http://www.winapi.co.kr/

6. 디버깅 환경 만들기
지금까지 개발환경으로 개발자체는 문제 없지만 디버깅은 할 수 없다. MinGW에 디버깅을 하기 위한 도구가 설치되어야 하는데 이를 가능하게 하는 것이 gdb이다. 

먼저 gdb를 다운로드 받자.
http://downloads.sourceforge.net/project/mingw/GNU%20Source-Level%20Debugger/GDB-7.1/gdb-7.1-2-mingw32-bin.tar.gz 

압축을 풀고 bin과 share 폴더를 그대로 설치된 MinGW 폴더에 복사해준다. 이것으로 MinGW의 C/C++ 디버깅 환경이 구축되었다.

이제 Eclipse에서 F11 누르거나 아래처럼 벌레모양의 아이콘을 눌러 Debugging을 할 수 있게 된다.


디버깅을 하게 되면 Debug Perspective창으로 바뀌면서 아래처럼 디버깅이 가능해진다.

참고로, 이클립스에서 디버깅 설정은 Run > Debug Configurations에서 할 수 있다. 좌측 리스트에서 C/C++ Application을 선택해 해당 exe를 선택한뒤 우측에서 Debugger 탭을 선택하면 Debugger를 선택할 수 있게 된다.

만약 gdb를 설치했음에도 불구하고 에러를 내면서 디버깅을 할 수 없는 경우 CMD창에서 다음과 같이 입력해보길 바란다.



만약 위처럼 메시지가 나오지 않고 libexpat-1.dll이 없다고 경고창이 나오면 현재 설치한 gdb버전이 libexpat-1.dll과 의존성이 있는 것이다. 이때는 libexpat-1.dll도 함께 다운로드 받아 MingGW/bin에 복사해줘야 한다. 

libexpat-1.dll은 아래 링크에서 다운로드 받는다.
http://downloads.sourceforge.net/project/mingw/MinGW%20expat/expat-2.0.1-1/libexpat-2.0.1-1-mingw32-dll-1.tar.gz

다음 글을 참고한다.
http://forums.codeblocks.org/index.php/topic,11301.msg77273.html

7. 정리하며 
프로젝트 중에 C와 MySQL을 연동하여 개발할 경우가 있어서 전체 환경설정을 정리한다는 마음으로 글을 적었다. 기존에 나와 있는 많은 글들이 너무 옛날 버전이라서 그런지 지금과 맞지 않는 부분도 있었다. 앞으로 MySQL과 연동하게 되면 관련 내용도 소개해 볼까 한다. 개발에 있어서 환경을 구축하고 적응하는게 반인 것 같다. ^^;


8. 참고글 

이클립스(Eclipse) CDT 설치
(Eclipse Galileo) C/C++ Developments User Guide
CDT를 이용한 Windows C/C++ 개발 환경 만들기 
Eclipse/CDT
Eclipse Project CDT (C/C++) Plugin Tutorial 1, 2By Brian Lee
이클립스(eclipse)를 이용해서 C/C++ 프로그래밍 환경설정
MinGW + Eclipse 를 이용한 Windows 개발 환경 구현 

글쓴이 : 지돌스타(http://blog.jidolstar.com/677)

+ Recent posts