리눅스/커널2012. 7. 1. 09:23

module_init() 매크로는 모듈형태로 컴파일시 module insertion time에 불린다.

만약 모듈형태로 컴파일 되지 않았으면, module_init()은 __initcall()과 같은 동작을 하는데 이는 boot time시에 불린다.


__initcall()은 다음과 같이 정의되어 있다.


#define __initcall(fn) \
static initcall_t __initcall_##fn __init_call = fn
#define __init_call __attribute__ ((unused,__section__ ("function_ptrs")))
#define module_init(x) __initcall(x);


'리눅스 > 커널' 카테고리의 다른 글

리눅스커널 timestamp 찍는 법  (0) 2012.07.18
__user  (0) 2012.07.01
리눅스 커널 분석 시 아키텍쳐별 tag 및 cscope생성  (0) 2012.04.16
Virtual Linux Manager 정리 1  (0) 2012.03.18
GCC, typeof  (0) 2012.02.23
Posted by code cat
samba 로그인 정보를 지우기 위해서는 다음과 같이 하면 된다

'net use /delete //192.168...'

현재 저장되어 있는 정보를 보려면 다음과 같이 하면 된다.

'net use'

iPhone 에서 작성된 글입니다.
Posted by code cat

가끔 svn에서 다음과 같이 충돌이 난다고 한다.


"svn: file_name remains in conflict"


이럴 땐, 당황하지 말고,


svn resolve --accept working file_name


하면 된다.   이래도 좀 더 꼬여서 안 될때가 있는데 그 때는 상위 디렉터리로 이동 뒤,


svn resolve --accept working -R .


하면 된다.


Posted by code cat
IT2012. 6. 12. 11:12

출처: engadget.com





 

 15 인치 맥북프로(2011)

15 인치 맥북프로(2012) 

레티나디스플레이 맥북프로(2012) 

 규격

 14.35 x 9.82 x 0.95 inches

 14.35 x 9.82 x 0.95 inches

 14.13 x 9.73 x 0.71 inches

 해상도

 1440 x 900

 1440 x 900

 2880 x 1800

 cpu

 Up to 2.4GHz quad-core Core i7 (Sandy Bridge)

 Up to 2.7GHz quad-core Core i7 (Ivy Bridge)

 Up to 2.7GHz quad-core Core i7 (Ivy Bridge)

 그래픽

 Intel HD Graphics 3000 + AMD Radeon HD 6750M / AMD Radeon HD 6770M

 Intel HD Graphics 4000 / NVIDIA Kepler GeForce GT 650M with up to 1GB of memory

 Intel HD Graphics 4000 / NVIDIA Kepler GeForce GT 650M with up to 1GB of memory

 메모리

 Up to 8GB

 Up to 8GB

 Up to 16GB

 저장용량

Up to 750GB

Up to 1TB or a 512GB SSD

Up to a 768GB SSD

포트지원

   Thunderbolt, FireWire 800, two USB 2.0, SD card slot, MagSafe power port, Kensington lock slot, audio line in, audio line out

   Two Thunderbolt, USB 3.0, FireWire 800, SD card slot, new MagSafe2 connector, Kensington lock slot, audio line in, audio line out

   Two Thunderbolt, HDMI, two USB 3.0, SD card slot, new MagSafe2 connector, Kensington lock slot, headphone port

 배터리수명

  7 hours

 7 hours 

7 hours

 무게

  5.6 pounds

 5.6 pounds 

4.46 pounds 

 가격

 $1,799 (2GHz Core i7, 500GB hard drive) / $2,199 (2.2GHz Core i7, 750GB hard drive)

 $1,799 (2.3GHz Core i7, 500GB hard drive / $2,199 (2.6GHz, 750GB hard drive)

 $2,199 (2.3GHz Core i7, 256GB SSD) / $2,799 (2.6GHz, 512GB SSD)


'IT' 카테고리의 다른 글

iPad with Retina display 스펙  (1) 2012.10.24
iPad 미니 스펙  (0) 2012.10.24
iOS 6 추가 된 기능들  (0) 2012.09.16
아이폰 5 스펙  (0) 2012.09.14
iPhone 5 (아이폰 5) vs 아이폰 4s vs 아이폰4  (0) 2012.09.14
Posted by code cat

출처: http://stackoverflow.com/questions/2966409/cpio-vs-tar-and-cp

 

cpio가 tar보다 나은 점은 뭘까?

 

우선 cpio는 하드링크를 보존한다.  또한 cpio는 파일이름길이에 대한 제한이 없다. timestamp 또한 보존한다. 

스크립트를 쓸 때 파일들에 대한 통제가 편리하다는 점도 있다. 


find . -type f -name '*.sh' -print | cpio -o | gzip >sh.cpio.gz

참고로 find를 써서 많은 파일들의 리스트를 넘기려고 하면 command-line length가 overrun될 가능성이 있다.  그래서 이럴 경우, 중간 파일을 사용해 주는게 좋다.

cp에 대해선 다음에 더 알아보자.

Posted by code cat

vim서 TAB(탭) 4 space



vimrc서 과 이 해 다.


set softtabstop=4                              ; TAB를 때 몇 을 동?

set tabstop=4                                  ; 하나의 TAB을 몇 칸으로 인식? 

set shiftwidth=4                               ; <<, >>을 눌렀을 때 몇 칸을 이동?

set expandtab                                  ; TAB을 space로 인식

;set noexpandtab                                ; TAB을 TAB으로 인식                         

Posted by code cat
프로그래밍/C++2012. 4. 28. 23:26

 

하기내용에서 사용된 코드는  Android Framework  분석을 위한 c++ 에서 사용된 코드임을 밝힙니다.

1. cout, endl의 원리

cout은 원래 객체이며, endl의 경우 함수이다. 아래는 cout과 endl를 구현해 본 소스코드이다.

추가로 tab이나 two_endl의 사용자정의 함수도 추가했다.

그럼 이게 기존거랑 충돌이 나느냐? 아래를 보자.

위와 같이 우리가 만든 함수들도 기존 std 네임스페이스와 같이 쓸 수 있다.

cout은 c와 달리 출력 형태가 무엇인지 정해주지 않아도 된다. 그렇다면 사용자 정의 객체 일 경우 어떻게 해야 할까?

아래는 사용자 정의 객체인 Point를 만든 코드이다.

cout << p; 이 부분은 결국 cout.operator<<(Point)가 있으면 된다.

'프로그래밍 > C++' 카테고리의 다른 글

C++에서 C 함수 사용하기  (0) 2013.02.02
생성자 뒤에 : 붙는 경우  (0) 2013.01.01
Android Framework 분석을 위한 C++ 4일차  (0) 2012.04.26
[C++] Smart Pointer  (0) 2012.04.25
Android Framework 분석을 위한 C++ 3일차  (0) 2012.04.25
Posted by code cat
프로그래밍2012. 4. 27. 12:08

출처: kldp

 

페어 코딩에 대한 좋은 글이 있어서  kldp에서 퍼왔다.

 

페어코딩을 하기 위한 자세 (원제는 아니였는데 그냥 제목을 붙여봤다)

 

* 소스코드의 소유와 책임이 개인이 아닌 팀에 있다. 아무나 다른 사람의 코드를 비판하고 고칠 수 있다.
* "우리"에 잘못이 있지, 특정인에게 잘못이 있지 않다. 코드는 비난하더라도 사람은 비난하지 않는다.
* 같이 일하다 결과가 있을 때마다 서로 축하한다. 하이 파이브나 괴성 등으로 서로의 감정을 공유한다.
* 급한 일이 있으면 상대에게 이야기하고 양해를 구한다. 서로 존중하면서 해결해야 할 사적인 문제는 바로 해결한다.
* 아무리 나보다 못한 사람에게도 배울점이 있음을 간과하지 말며, 나도 언제나 다른 사람이 저지르는 실수를 똑같이 저지를 수 있음을 잊지 않는다.
* 좋은 아이디어가 있으면 바로 바로 상대방과 상의하며 프로그래밍 한다.
* 짝이 틀린 것을 지적하면 고마움을 표한다.
* 짝이 틀린 길로 들어서면 바로 지적한다. 만일 그에 대해 짝이 멈추지 않게 계속 한다면 의중을 파악하려고 노력한 후 그래도 자신이 옳다는 생각이 들면 기회를 기다렸다가 조리있게 왜 그것이 틀렸는지 설명한다.
* 일이 안풀리고 막히면 바로 상대에게 넘긴다.
* 상대에게 프로그래밍을 해설 및 중계방송 하는 느낌으로 자신의 생각을 끊임없이 말해준다. 상대가 자신의 생각을 이야기 하면 귀담아 듣고 문제는 없는지 어떻게 앞으로 일들이 펼쳐져야 할지 머리속에 그리며 함께 일한다.
* 일을 마치기 전에 상대에게 얼마나 고마운지, 짝이 없었다면 자신이 얼마나 형편없는 결과물을 만들어 냈을지 서로 이야기 하고 격려한다.
* 열심히 일한 후에는 칼퇴근 한다.

Posted by code cat
프로그래밍/C++2012. 4. 26. 10:49

1. 순수 가상함수와 추상 클래스

 

추상클래스를 만들기 위해서는 가상함수를 선언해야 하며, 0으로 초기화 시켜주어야 한다.

추상클래스의 목적은 이를 상속하는 하위 클래스에게 구현의 임무를 부여하는 데 있다.

 

인터페이스의 탄생

 

좀 더 이쁘게 할려면, 이렇게 바꾸자.

 

인터페이스는 기능별로 나누는게 좋고, 다중상속으로 처리하면 된다.

 

 

 

 

다음은 메뉴만들기를 객체 지향적으로 구현해 본 것이다.

 

메뉴를 만든다면, 우선 여러가지 형태가 있겠지만,

추상메뉴

 |-  팝업 메뉴     Vector<"추상메뉴">

  `-  메뉴 아이템

 

팝업메뉴는 여러가지 메뉴가 있을테니, Vector<"추상메뉴">로 구현하면 되고,

모든 메뉴는 title 및 command가 있으니, 이는 추상메뉴에 구현한다.

 

이렇게 하위 객체를 부모로 싸잡아서 구현하는 걸 composite 패턴이라고 한다. 

 

밑은 composite 패턴으로 구현한 고객관리 메뉴 코드이다.  동작성은 없다.

 

 

자원 반납을 위해서, 소멸자를 추가하자.

 

 

 

가상 소멸자

이렇게 해서 자원을 해지하려면, B가 해지되는게 아니라, A가 해지된다.  이를 해결하기 위해선,

~A() {cout << "메모리A해지" <<endl;}

앞에 virtual을 붙여서

 virtual ~A() {cout << "메모리A해지" <<endl;}
이라고 정의하면 된다. 

 

근데 또 가상소멸자에 의한 가상테이블이 생기는 것을 없애려, protected로 선언해, 컴파일 시 에러가 나게 하는 방법도 있다.

소멸자는 delete static_cast<B*>(p);로 바꿔야 한다.

 

그러나 delete static_ca.. 아 쓰기도 어려운데, 그래서 할 수 있는 방법이 다음과 같다.

.... 걍 c++ 하지 말자.

 

정리하자면, 상속관계에 있는 클래스에서 부모 클래스이 소멸자는 항상 가상함수로 만들자.

 

갑자기 생각난  mix-in 하고 upcasting하고 어떻게 틀리더라...

 

 

가상함수를 쓰면 다음과 같은 결과를 얻는다.

주석에도 있듯이,

foo가 가상이 아니라면 : static binding => p의 포인터타입으로 결정
                                 A::foo()호출
foo가 가상이라면        : *p[1]() 라고 기계어 코드를 생성해 놓는다.

 

*p[1]은 실제로 가상함수테이블(Virtual Function Table)의 인덱스를 가리킨다.  보통 컴파일러는 가상함수의 기능을 구현하기 위해 가상함수 테이블과 가상함수 테이블 포인터를 사용하는데, 가상함수테이블은 가상함수의 모든 주소를 가지고 있는 배열이며, 가상함수 포인터는 이 테이블을 가리킨다.

 

즉 가상함수를 사용하면, 다형성을을 얻을 수 있으나,

 

1. 가상함수 테이블을 위한 메모리 할당,

2. 가상함수 테이블 포인터로 인한 객체의 크기 증가,

3. 함수 호출시 함수 포인터에 의한 호출로 오버헤드 증가,

4. Inline을 사용하지 못함

 

다는 단점도 있다.  그리고 한가지 더! 가상함수는 run-time에 호출 될 함수가 결정되지만, default paramemter는 compile-time에 결정된다.  따라서 예상치 못한 결과가 나올 수 있으니 주의하자.

 


composite 패턴 실습

 

다음은 composite 패턴을 이용해서 만들어 본 비디오 대여점 메뉴이다. 기본적인 메뉴만 구성되어 있다.

 

 

 

 

Observer 패턴 실습

위에서 생성된 메뉴의 메세지를 처리하기 위한 모든 객체는 인터페이스를 정하고, 그 인터페이스로부터 상속받은 형태로 구현 할 수 있다.

관찰자(Observer)패턴은 하나의 상태 변화를 여러 객체에게 알려주는 패턴이다.

 

 

 

객체의 이벤트 처리를 위해 인터페이스 방식(바로 전 예제)이 아닌 함수와 연결 하는 방식도 있다.

다음을 보자.

 

 

 

다중상속

 

다중상속에는 여러가지 문제점 있겠지만, 아래와 같이 (주석처리 된 부분) 다중상속시에 발생할 수 있는 문제점이 있다.

 

주석같이 상속 받으면,

 

                  RefBase

                 /           \         

        IInterface         BpRefBase

                 \            /

                  HelloWord

 

IInterface, BpRefBase 모두 mCount라는 변수를 상속 받았으니, 컴파일러는 어느 녀석을 써야 하는지 모른다.  그래서 대신, virtual 키워드를 써서 처리해야 한다.  아니 이런 구조를 아예 피하자.

 

 

 

다중상속과 캐스팅

 

reinterpret_cast<B*>(&c)는 c를 어떻게든 B처럼 보이게하라고 캐스팅 한다. 즉 C안에서 B의 위치를 찾는게 아니라, C가 B처럼 되는 것이다. 그래서 만약 우리가

 

한편 x와 y가 public으로 바뀌서, y에 값(10)을 대입해 보면 y가 아닌 x가 10으로 대입되는 걸 볼 수있다. (x가 먼저 상속받기 때문에, 그 주소에는 x가 먼저 위치하고, 그 다음에 y가 위치한다.)

 

 

 

 

RTTI (Run-Time Type Informationi)

런타임에 typeinfo를 가져온다.  typeinfo는 가상함수테이블 상위에 위치하고 있으며, 가상함수가 있을 때만 존재한다.

 

 

 

 

 

 

 

 

 

템플릿

 

템플릿과 타입

 

 


 

'프로그래밍 > C++' 카테고리의 다른 글

생성자 뒤에 : 붙는 경우  (0) 2013.01.01
cout , endl 의 원리  (0) 2012.04.28
[C++] Smart Pointer  (0) 2012.04.25
Android Framework 분석을 위한 C++ 3일차  (0) 2012.04.25
swap 함수  (0) 2012.04.25
Posted by code cat
프로그래밍/C++2012. 4. 25. 20:04

스마트 포인터란?

 

스마트 포인터는 다른 객체의 포인터 역활을 하는 객체이다.  여기서 중요한 것은 '포인터가 아닌' '객체'이다.

예제를 보자.

 

스마트 포인터가 추가되면 다음과 같다.

sp를 보면 포인터는 아닌데, sp->goo()를 하는 걸 보면 포인터 같기도 하고, 헷갈린다?

우선 Sptr sp = new Obj 는 Sptr sp(new Obj)와 같다.   C++에서 객체의 대입, a = new b 는 a(new b)라고 생각해도 무방하다.  Sptr의 생성자를 보면 Obj* p를 인자로 받고, Obj* s_obj를 p로 초기화 시켜준다.  결국 sp는 Obj* 를 멤버로 갖는 객체가 생성된 것이다. 

 

그럼 ->는 무엇인가?  그것은, 연산자 오버로딩을 통해 구현된 것이다.

 

Obj* operator->()   { return s_obj; }

 

결국엔 Obj* 타입인 s_obj를 리턴하는 것이다. 그럼 결국엔,

 

sp->goo()는  (sp.operator->())goo()

 

인 것이고 sp.operator->()는 Obj*를 리턴함으로,

 

(sp.operator->())->foo()로 해석하게 되어 마치 포인터로 함수를 호출하는 거처럼 작동한다.

 

다시 말해 스마트 포인터(sp)는 객체이지만 마치 다른 객체(Obj)의 포인터(Obj*)역활을 한다.

 

 

 

 

레퍼런스 카운팅

 

위에서 보다싶이, 내부적으로 포인터 변수를 가지고 있으므로, 얕은 복사(shallow copy)가 발생할 확률이 높다.

물론 이를 방지하기 위해, 깊은 복사(deep copy)를 구현할 수도 있으나, 이는 성능이슈 및 스마트(?)하지 않으므로, 대신 레퍼런스 카운팅 기법을 쓰는게 좋다.

 

 

'프로그래밍 > C++' 카테고리의 다른 글

cout , endl 의 원리  (0) 2012.04.28
Android Framework 분석을 위한 C++ 4일차  (0) 2012.04.26
Android Framework 분석을 위한 C++ 3일차  (0) 2012.04.25
swap 함수  (0) 2012.04.25
Android Framework 분석을 위한 C++ 2일차  (0) 2012.04.24
Posted by code cat