Multi-Architecture Compiling

아주 가끔가다 32 bit와 64 bit에서 동시에 사용가능한 라이브러리를 컴파일해야 할 필요가 있다. 이 때에,

  • CFLAGS+=”-arch i386 -arch x86_64″
  • CXXFLAGS+=”-arch i386 -arch x86_64″
  • LDFLAGS+=”-arch i386 -arch x86_64″

위 세개를 컴파일과 링크시에 잘 넣어주면 된다. 물론 make할 때 넣어줘도 된다.

컴파일 중간에

  • -E, -S, -save-temps and -M options are not allowed with multiple -arch flags

이런 에러가 난다면, configure 시에

  • –disable-dependency-tracking

옵션을 추가해서 하면 에러가 안난다.

참고:
사실 이게 라이브러리를 벗어나서 실행파일에도 되는지는 확실히 모르겠다. Mac에서 Xcode를 이용해서는 32 bit와 64 bit에서 동시에 사용가능한 바이너리를 만드니까 안될 것 같지는 않지만….

참고문헌

  1. http://blog.omega-prime.co.uk/?p=102

Static, Shared & Dynamic Libraries

내가 이해한대로 적자면, 라이브러리라는건 문자 그대로 “도서관”이라고 보면 된다. A라는 코드에서 B라는 것을 썼는데, B에 대한 정의가 A에 나와있지 않을 때, 다른 라이브러리를 참조해서 B를 가져온다.

이 도서관이 3가지 종류가 있는데, 프로그램을 통째로 이사가 가능한 대학이라고 치면

  • Static Library
    • 도서관이 붙어있는 대학. 대학이 이사갈때마다 도서관도 같이 딸려간다.
  • Shared Library
    • 도서관이 있지만 붙어있진 않은 대학. 대학과 도서관이 독립적으로 존재하지만, 대학 문을 열때마다 도서관 문도 같이 연다.
  • Dynamic Library
    • Shared Library와 대부분 같지만, 대학에서 특별히 요청하지 않는 한 도서관 문을 열지 않는다. 필요할때만 도서관 문을 여는 대학.

참고: Dynamic Library 파일은, 최종본이기 때문에 링킹이 되질 않는다!

참고문헌

  1. http://blog.naver.com/xogml_blog?Redirect=Log&logNo=130138049704

몸을 찔렀을 때, 어디가 아픈지 어떻게 알까?

  • 궁금점

    • 예를들어 엄지손가락 가운데를 바늘로 찌른다고 하자. 그럼 이 신호는 뇌에 어떻게 전달되고 처리될까?
  • 생각

    1. 엄지손가락 가운데를 찌르면, 엄지손가락 가운데 있는 통점과 압점이 자극이 된 후, 전기신호를 발생시킬 것 같다.
    2. 중·고등학교때 배운 생물지식에 따르면, 자극된 통점과 압점에서 발생한 전기신호는, 한쪽 방향으로(손에서 뇌로)만 흐를 것이다.
    3. 뇌로 전달된 신호는 뇌에서 “엄지손가락 끝이 눌렸다”와 “아프다”로 해석된 후, 합쳐져서  “엄지손가락 끝이 눌려서 아프다”가 될까?
    4. 3번 처럼 된다면, 압점이 있는 모든 부분은 뇌에 1대1 대응으로 위치가 맵핑 돼있다는 말인가?
  • 알아봐야 할 것 같은 것들

    1. 중·고등학교 수준 이상의 신경에 관한 내용

awk & grep

리눅스랑 맥에 기본적으로 깔려있는 awk랑 grep을 이용해서 파일 리스트를 원하는 형태로 조작하는 연습을 하며 이 두 프로그램에 대해 알아보자. 먼저 주어진 리스트는 다음과 같다.

2013-07-20_22-38-44여기서 raw라는 확장자를 가진 파일만 추려서 확장자를 떼고, rawToROOT라는 실행파일의 인자로 넘겨주는 형태로 rawToROOT파일을 실행시키는 문장을 만들려고 한다. 물론 아무생각 없이 ls > run.sh 로 ls 내용을 run.sh에 입력한다음 vi를 이용해서 손으로 하나하나 혹은 매크로로 입력해주는 방법도 있다. 그게 편한 사람은 그걸 그냥 써도 된다. 일단 해보고 생각해보자.

먼저 raw 확장자를 가진 파일만 추려내보자.

ls | grep .raw$

2013-07-20_23-10-47

위 명령어는 ls에서 나온 결과에서 “.raw”로 끝나는 문자를 가진 결과만 출력한다. “$”가 문장의 끝을 의미한다. 결과는 다음과 같다.

이제 이 결과에서 “.raw”확장자를 가진 파일만 추려서 .raw를 떼버리고 앞쪽에 “./rawToROOT ”를 붙이면 완성이다.

ls | grep .raw$ | awk -F.raw ‘{printf(“./rawToROOT %s\n”, $1)}’

2013-07-20_23-11-28끝! awk를 이용해서 “ls | grep .raw$”에서 나온 결과를 편집해서 출력한 것이다. awk의 “-F.raw”옵션은 “.raw”를 기준으로 결과에 있는 문자열을 자른다. 순서대로 자르는 기준의 앞쪽 문자열은 $1에, 뒷쪽 문자열은 $2에 할당된다. 자르는 기준의 문자가 “.”이나 “,”여서 잘리는 위치가 여러군대라면 순서대로 “$숫자”형태로 저장된다. (10 이상까지 되는지는 모르겠다. 한번 해보길….)
그 다음 자른 문자를 printf를 이용해서 “./rawToROOT ”라는 문자를 붙여서 출력한다. printf 문법은 다들 아시시라 생각하고 생략한다.

이제 적당히 뒤에 “> run.sh”를 붙여서 결과를 파일로 출력한다음 실행시켜주면 끝!

 

Makefile

  • 기본구조
    • 목표: 의존파일들
      (탭문자)명령
  • 명령에 쓸 수 있는 특수 문자들
    • $@ – 목표 그대로를 의미함
    • $^ – 의존파일 전체 리스트를 의미함
    • $< – 의존파일에서 제일 첫번째 있는 파일을 의미함
    • $* – 목표에서 확장자를 뗀 파일명만을 의미함
    • ; \ – 명령 문장 끝에 써줘서 다음 줄이 같은 쉘에서 실행되도록 한다. 예를들어 첫번째 명령이 A라는 폴더로 들어가는거고 두번째 명령이 거기에 B라는 폴더를 만드는거라고 하면, 이 문자를 쓰고 안쓰고에 따라 A안에 B가 있느냐 A와 B가 같은 폴더안에 있느냐가 갈리게 된다. 두 문자가 셋트임에 주의.
    • @ – 명령 문장 제일 앞에 써서 명령어가 실행될때 쉘에서 보이지 않게 한다.
    • % – 모든것을 의미 (쉘에서의 * 같은 의미)
  • .PHONY
    • 이것도 나중에
  • .SUFFIXES – 지정된 확장자를 가진 파일에 대해 동일한 처리를 하도록 하는 명령어인데….
    아래 명령어로 대체 가능하다길래 무시하기로 하고 정리 안함

    • %.o: %.cc
      (탭문자)명령
  • 변수 정의법
    • VARIABLE = 어쩌구저쩌구 # 정의
    • $(VARIABLE) # 사용
  • 환경변수가 정의돼있는지 확인할 때 if문
    • ifdef ENVIRONMENT_VARIABLE
    • 어쩌구
    • else
    • 어쩌구
    • endif
  • 쉘에서 실행한 결과를 사용하고 싶을 때
    • $(shell 명령어)
  • 뒷쪽 이름에 앞쪽 이름을 다 붙이고 싶을 때
    • $(addprefix 앞, 뒤)
    • 출력되는 결과는 “앞뒤”. 만약 “뒤”에 오는 내용이 스페이스로 구분된 문자라면, 스페이스 다음에 나오는 문자에는 다 앞이 붙는다. 예를들어 “뒤 = a b c d” 라면 위 명령의 결과는 “앞a 앞b 앞c 앞d” 가 된다.
  •  쉘에서 ls를 쳐서 나오는 모든 cc확장자를 가진 파일을 리스트로 만들고 싶을 때
    • $(wildcard *.cc)
    • 만약 어떤 디렉토리 안에 들어가서 가져오고 싶으면 앞에 경로도 같이 써주면 된다.
  • 어떤 문자에서 단어를 치환하고 싶을 때
    • $(patsubst 이거를, 이걸로, 여기서)
    • 예) $(patsubst %.c, %.o, x.c.c bar.c)
      결과) x.c.o bar.o
  • 변수에 여러개의 아이템이 있는데, 한개만 지우고 싶을 때
    • $(filter-out 이거를,여기서)
    • 예)
      HEADER = A B C D
      HEADER2 = $(filter-out D,$(HEADER)) # 결과는 HEADER2 = A B C
  • 조건문도 사용할 수 있다. (ifeq, ifneq)
    • ifeq (A,B)
      내용
      else
      내용2
      endif

Root Mean Square (RMS)

우리말로 평균 제곱근이라고 하는 이 값은 수학에서는 다음과 같이 정의한다.

\[x_\text{rms}=\sqrt{\frac1n\sum_{i=1}^n x_i^2}\]

ROOT v5.34.04 버전 기준으로 TH1의 GetRMS()라는 메소드와, 특정 집단의 사람들이 RMS라고 말을 하면서 표준편차를 사용하는 경우가 있으니 주의하자. 참고로 GetRMS()에서 나오는 값은 표준편차이고 다음과 같이 정의된다.

\[\sigma=\sqrt{\frac1n\sum^n_{i=1}(x_i-\mu)^2}\]

물론 \(\mu\)는 분포의 평균이다. 자유도 글을 잘 생각해보면 \(n\)으로 나누는것이 아니라 \(n-1\)로 나누는게 더 좋은 값을 준다는 것을 알 수 있다.