코딩 공작소

saintrv.egloos.com

포토로그 마이가든



bind1st, foreach를 잘 쓰기 위한 필수 함수... C++ & STL

STL foreach 정말 편합니다. for 쓰고 iterator 쭈욱 써야하는걸 라인 하나로 쭉 줄여주기도 하죠.
비슷하게 count_if나 transform과 같은 함수도 코딩 효율성을 높여 줍니다.
가령 아래와 같이 코드를 줄여줄 수도 있죠.

bool equal_ten(int x)
{
 if(x == 10)
  return true;
 else    
  return false;
}

int num[] = {0,1,2,3,10,5,10};
int cnt = count_if(num, num+7,equal_ten);    // 10이 몇개 있는지 개수 출력
cerr << "Cnt:" << cnt << endl;     // 10이 몇개 있는지 개수 출력

그런데 아쉬운점이 있습니다. 코드 효율성을 높이는 관점에서 볼 때, equal_ten을 일일이 정의하는게 여간 불편하지 않습니다.
STL에 있는 equal_to 같은 함수를 쓰려해도, 해당 함수가 인자를 두개 받기 때문에 foreach 같은 함수에서는 쓸 수가 없죠.
(해당 함수의 세번째 인자로는 ARGUMENT를 하나만 받는 unary_function이 와야합니다. 그렇지 않으면 컴파일이 안됩니다.)

이때, 필요한게 bind함수 입니다.
bind 함수를 쓰면 위와 같이 재정의할 필요 없이 아래 한 줄로 해결이 됩니다.

int num[] = {0,1,2,3,10,5,10};
int cnt = count_if(num, num+7,bind1st(equal_to<int>(),10));  

위의 bind1st를 뜯어보자면 equal_to<int> 함수의 첫번째 인자로 10을 넣어준 함수 오브젝트를 리턴해 줍니다.
따라서 count_if 입장에서 보자면 변수가 하나밖에 없는 equal_to<int>(10, int a) 가 세번째 인자로 들어오게 된거죠.
(즉 문법에 맞는 unary_function 오브젝트가 세번째 인자로 들어오죠)
따라서 count_if는 num을 돌면서 *num 값을 넣어준 euqal_to<int>(10,*num)을 매번 호출하게 됩니다.
그리고 컴파일도 잘 되고요.

bind1st 함수는 이런 동작을 합니다.

(bind2nd 함수도 있습니다. bind1st가 함수의 첫번째 인자로 값을 넣는다면, bind2nd는 두번째 인자로 넣어 줍니다. 위에서 bind2nd를 썼다면 결과적으로는 같은 동작을 하지만 실제는 eqaul_to<int>(int a, 10)과 같이 함수가 전달되겠죠)

자세한 레퍼런스는 아래를 참고하세요~
http://www.cplusplus.com/reference/std/functional/bind1st/



LVM 하드 추가하기 (새로 추가하는게 아니라 사용하던 하드 추가) Unix & Linux

http://bobpeers.com/linux/mount_logical_volumes

위 페이지를 참고하면 된다.

그러나, LVM의 이름이 똑같을 경우, (내 경우에는 VolGroup00)
참 난처해 진다. 이럴 때는 vgrename uuid new_name    명령어를 이용하면 된다.

아래와 같은 순서로 하면 됨

1. 볼륨 그룹 정보 보기
# /usr/sbin/vgdisplay

  --- Volume group ---
  VG Name               VolGroup00
  System ID            
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               931.41 GB
  PE Size               32.00 MB
  Total PE              29805
  Alloc PE / Size       29489 / 921.53 GB
  Free  PE / Size       316 / 9.88 GB
  VG UUID               OqUsNX-o8aY-FHtD-7zc3-Uy4D-TM2W-X8Z2FU
  
  --- Volume group ---
  VG Name               VolGroup00
  System ID            
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               931.41 GB
  PE Size               32.00 MB
  Total PE              29805
  Alloc PE / Size       29805 / 931.41 GB
  Free  PE / Size       0 / 0  
  VG UUID               RLxYwp-RyiS-qkFg-xCpe-if0W-gcNR-xLWMsK

--> 내 경우는 두개의 LVM이 크기도 똑같아서 뭐가 추가하려는건지 알 수 없었다 .orz
그래서 할 수 없이, 추가하려는 걸 때고 위의 명령어 사용하여 오리지날과 추가하려는 것 알아냄

2. 아래와 같이 실행

# /usr/sbin/vgrename OqUsNX-o8aY-FHtD-7zc3-Uy4D-TM2W-X8Z2FU VolGroup185

 Volume group "VolGroup00" successfully renamed to "VolGroup185" --> 이 메세지가 나오면 성공

3. Activating LVM

 # /usr/sbin/lvchange -a y /dev/VolGroup185

참고로, activate 됐는지 확인하려면 /usr/sbin/lvscan 실행

4. 드디어 마운트!

# mkdir /mnt/root
# mount -t ext3 /dev/VolGroup185/LogVol00 /mnt/root


몇 시간 삽질 끝에 성공했습니다 ㅠㅠ
도움이 되셨다면 리플이라도~~~

참고로, 윈도우에서 리눅스 마운트하는 프로그램이 있습니다만.... 볼륨그룹은 제대로 인식 못하는 것 같습니다.
(Ext2IFS, Ext2Fsd 로 검색하시면 해당 정보 얻으실 수 있을겁니다.)





VS2010, error MSB4018 오류 MFC

http://windowsforum.kr/?document_srl=1259747&mid=w7_02&sort_index=readed_count&order_type=desc

일단 위 페이지에 해결방법은 있으나,
나는 바로 못 알아먹고 헤매다 해결했음....

나 처럼 못 알아듣는 사람들을 위해 다시 정립니다.

1. 문제환경

    - 확실하지는 않으나, 램디스크를 사용하는 윈도우7 환경에서 문제가 되는 듯합니다. 
    더 정확히 말하자면 환경변수에서 TEMP, TMP를 램디스크로 지정한 경우에 문제가 됩니다.

2. 해결법

    - 그래서 제시하는 방법이, 위 환경변수를 램디스크가 이닌 위치로 지정하고, 그렇다고 램디스크를 안 쓰면 안되니깐
    mklink 기능을 이용하여 하드링크를 걸어주는 겁니다.
    (환경변수 설정은 "제어판\시스템 및 보안\시스템" 에서 중간 좀 아래, 오른쪽에 있는 설정변경, 고급탭, 환경변수에서 
    수정가능합니다.)
    - 그래서 위의 웹페이지에서 제시하듯이, 대충 c:\tmp 폴더 만들고, 그 폴더에 들어가 mklink /j s:\temp 명령 치면 됩니다.
    물론 환경변수 TEMP, TMP를 c:\tmp 로 할당하고, s:\ 드라이브에 temp 폴더는 미리 만들어 놔야 겠죠...



Boost library 빌드 (bJam 이용) C++ & STL

가장 간단한 방법(윈도우)은 아래 위치에서 installer를 다운 받아 사용하는 거다.
http://www.boost-consulting.com/ (해당 사이트에서 download로 이동해서 받고 설치한다.)


부스트를 현재 쓰고 있는 컴파일러 버전에 따라 빌드하기 위한 방법니다. (bJam 이용)

부스트는 대부분 hpp를 이용하여 라이브러리 없이 이용가능하지만, regular e-pression과 같은 코드는
라이브러리가 필요하다.


1. boost를 다운 받아 적당한 위치에 푼다. http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041
2. bJam을 다운 받는다. http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941
3. bJam 압출을 풀어, bJam.exe 파일을 boost 압축 푼 폴더에 복사한다.
4. bJam을 실행하면 라이브러리가 시스템의 default 컴파일러를 이용해서 자동으로 만들어진다.
    4.1 컴파일러는 지정하라면 argument로 toolset=컴파일러 이름을 추가하면 된다.
    4.2 컴파일러의 bin 파일이 PATH로 지정되어 있어야 한다.
    4.3 컴파일러를 지정할 때 이름은 다음을 참고한다. http://www.boost.org/doc/libs/1_41_0/doc/html/jam/building.html


Manifest 오류. 두 개의 CRT 내노라 아우성 칠 때 MFC

프로젝트 빌드 후, 실행하려는데 알 수 없는 에러가 난다.

"This application has failed to start because theapplicationconfiguration is incorrect. Review the manifest file forpossible errors 어쩌구 저쩌구..."

manifest 파일을 참고하니 아래 처럼 crt라이브러리를 두 개나 끌어 쓴다. 이건 뭔가요....
(참고로 manifest 관련 설명은 http://diehard98.tistory.com/entry/MSDN-Manifest-%ED%8C%8C%EC%9D%BC 참고)


Boost 설치 (Vistual Studio) C++ & STL

그 유명한 부스트를 직접 써보려고, 뒤적 거렸다.
물론 시작은 부스트 공식 사이트 (www.boost.org)

오픈소스가 대게 그렇듯 불친절한 설명으로 삽질 좀 해야 구동에 성공하는데,
부스트는 이럴수고, 설명도 너무 깔끔하고 인스톨 툴도 있다.

거의 뭘 공부할 필요가 없이 따라기기만 하면 되는 정도
http://www.boost.org/doc/libs/1_41_0/more/getting_started/windows.html#link-your-program-to-a-boost-library

위 링크로 가서 따라하기만 하면 된다.

그래도 조금만 정리하면,

1. 설치는 간단하게 http://www.boostpro.com/download 여기서 설치 툴 다운 받아서 하면 되고 (중간에 뭐 설치할지 고르는거 나오는데, 모르겠으면 다 체크하면 된다.)

2. 사용할 때는, 부스트가 기본적으로 hpp 파일안에 다 구현해 놓은 구조이기 때문에 include 만 잘하면 되나 (부스트 설치된 패스로... 1에서 나오는 걸로 설치 했다면 보통 'C:\Program Files\boost\boost_1_40' 위치, 레귤러 익스트레션 같은건 라이브러리로 되어 있으니 링크할 때 참조하면 된다. (C:\Program Files\boost\boost_1_40\lib에 있음)

이게 끝.... 그 다음은 사용만 하면 되고, 1과 2 과정 역시 처음 링크에 자세히 어케 하는지 설명되어 있음




url로 파일 다운받기 Unix & Linux

curl -o 파일이름.tar.gzab -L http://링크...g=.gzab

위처럼 다운 받으면 된다

라이브러리 합치기 Unix & Linux

리눅스에서 두개 이상의 라이브러리를 합쳐서 하나로 만드는 법.
mergelib를 쓰면 된다. 사용방법도 간단.

mergelib 합쳐질 library 흡수될 라이브러리

ERGELIB(1)
MERGELIB(1)




NAME

       mergelib - merge one library into another


SYNOPSIS

       mergelib to-library from-library [object-filename-prefix]


DESCRIPTION

       The mergelib program merges objects from one library into another.  The
names of object files in from-library will be prefixed by object-file-
name-prefix ("_" by default) to avoid name clashes. The merged library
will be left in to-library.


AUTHOR

       Jim Fulton wrote the mergelib program for the X Consortium.

Colin Watson wrote this manual page, originally for the Debian Project.


std::tr1::shared_ptr<typename T> C++ & STL

새로운 표준으로 거론되는 tr1에서 가장 유명한 것 중에 하나가
shared_ptr 다.

C++ 코더가 부러워마지 않는 자바의 가비지콜렉션을, 위의 shared_ptr를 이용하면
C++에서도 처리 가능하다.
shared_ptr이 레퍼런스 카운팅을 완벽히 해주며, 더이상 참조 되지 않을 때 스스로를 delete 해버리기 때문이다.

허나.... 역시나 속도는 안습이다.
자바의 가비지 컬렉션이 자바의 속도를 C나 C++에 비해 환상적으로 떨어뜨린 걸
당연하게도 shared_ptr 역시 극복하지 못한다.
게다가 레퍼런스 카운팅을 위해서 카운터를 둬야 하는데, 따라서 메모리 효율도 당연히 떨어진다.

속도나 메모리가 크게 중요하지 않고, 안정성이 더 중요한 시스템에서는 활용할 가치가 있겠으나,
내가 일하는 분야처럼 속도, 메모리 효율이 중요한 분야에서는 활용했다가는 욕 바가지로 얻어먹기 쉽상이다.


bash란 무엇인가? Unix & Linux

위키피디아에서 퍼옴 (http://ko.wikipedia.org/wiki/%EB%B3%B8_%EC%96%B4%EA%B2%8C%EC%9D%B8_%EC%85%B8)


본 어게인 셸(Bourne-again shell)은 유닉스에서 사용하는 커맨드 셸의 일종으로 GNU 프로젝트를 위해 만들어졌다. 일반적으로 bash로 줄여 부른다.

초기의 유닉스 셸인 본 셸(Bourne shell)과 새로 태어났다는 뜻의 영어 "born again"을 합친 이름이다. Bash는 1987년 브라이언 폭스에 의해 만들어졌다. 1990년 이후에는 쳇 레이미가 주로 관리하고 있다.

Bash 명령어의 문법은 거의 대부분이 sh와 호환되어 쓰일 수 있다. 또한 ksh, csh 에서 많은 아이디어를 받아서 명령 히스토리, 디렉터리 스택, $RANDOM POSIX 형식 명령어 치환 등을 지원한다. 또한 입력 중에 명령어나 파일 이름을 자동 완성해 주는 기능도 지원한다.

Bash는 다양한 리눅스 시스템, 맥 오에스 텐의 기본 셸이며, 수많은 유닉스 계열 운영체제에서 동작한다. 마이크로소프트 윈도에서도 시그윈 프로젝트 등에 의해 이식되어 있다.

Bash는 GNU GPL로 배포되고 있으며, GNU 프로젝트 FTP 사이트를 비롯하여 수많은 인터넷 사이트에서 내려받을 수 있다.


~/.bashrc (bash run control)


bash를 사용할 때, bash가 참고할 사항을 정의해 놓는 파일이다.

환경변수(JAVA_HOME 등)나 Alias(ls -al --> ll 등)등을 미리 정의해 놓고 사용할 수 있도록 한다.


~/.bash_profile


.bash_profile은 bash를 login shell로 사용할 때 참조된다. 즉 bash로 로긴하면 bash_profile에 정의되어 있는 걸 사용할 수

있다. .bash_profile에서 보통 .bashrc를 부르기 때문에 .bashrc에 있는건 자동으로 참조 된다.

리눅스 GUI에서 터미널을 열어 bash를 사용할 땐, .bash_profile이 참조 안 될 수 있으니 주의해야 한다.


/etc/bashrc

~/.bashrc가 개인용 환경 설정이라면 /etc/bashrc는 전체용 환경 설정이다.


/etc/profile

bashrc와 마찬가지로 시스템 전체 환경 설정 파일이다. (로그인시 수행되는...)


* 위에서 커맨드 셸이란?


도스에서 command.com 셸이 사용자의 명렁어(DIR 같은..)를 받아 특정 행동을 수행해주는 것 과 같이

사용자의 특정 명령어를 받아 OS한테 요로요러 한걸 해주세요라고 대신 말 해주는 놈이라 보면 된다.


* 참고로 shell에서 export 명령어는 환경변수를 지정하는 명령어이다.


1 2 3 4 5 6 7 8 9



메모장

이글루스를 함 써보렵니다