array 를 만들 때 크기는 상수로 주어야 한다. 그 이유는 실행 전에 메모리 할당 크기를 알아야 하기 때문이다.

대략, 다음과 같이

int array [10] = {0,};


NOTE: The elements field within brackets [] which represents the number of elements the array is going to hold, must be a constant value, since arrays are blocks of non-dynamic memory whose size must be determined before execution. In order to create arrays with a variable length dynamic memory is needed, which is explained later in these tutorials. [1]


그런데, 요상하게도 gcc 3.4.4 와 4.6.3 에서는 아래 코드가 잘 동작한다.

(비주얼 스튜디오 2010 에서는 바로 9 라인에서 컴파일 에러를 뱉어낸다.)


결과는 대략, (k 에 8을 입력하면)

i : 0x22ac2c

k : 0x22ac28

array : 0x22abd0  // k 와 88 차이 (실제 데이터는 64 바이트)

array2 : 0x22aba0  // array 와 48 차이 (실제 데이터는 32 바이트)

--------------

i : 0x22ac2c

k : 0x22ac28

array : 0x22abe0  // k 와 72 차이 (실제 데이터는 64 바이트)

array2 : 0x22abc0  // array 와 32 차이 (실제 데이터는 32 바이트. 이건 일치!)


원래 예상대로라면 k 주소와 array 주소의 값 차이는 64(4바이트 * 16)가 되어야 하지만,

첫 번째 케이스(func)에서는 88 이고,

두 번째(func2)에서는 72 이다.

각각 24바이트와 8바이트가 비는데, 그곳엔 과연 무엇이 존재하는 걸까 ㅡㅡ;

(시간 나면 더 알아보겠음)



비주얼 스튜디오 2010 에서 func2 만 호출해 본 결과는 아래와 같다.

i : 0018F668

k : 0018F65C

array : 0018F614  // k 와 72 차이 (실제 데이터는 64 바이트)

array2 : 0018F5EC  // k 와 40 차이 (실제 데이터는 32 바이트)





references : 

[1] Arrays, http://www.cplusplus.com/doc/tutorial/arrays/

:

부모 클래스에서 public 이고 자식이 이를 상속받아 private 으로 선언하면 어찌 될까 ?

대략 아래 코드와 같이, 부모의 탈을 쓴 자식 인스턴스를 만들면 멤버함수가 호출이 가능하다.


출력 결과 :

A print

:

객체를 반환하는 함수에서 무슨 일이 일어나는가 ?


$ gcc --version

gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

Copyright (C) 2004 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


일단 아래와 같이 시험용 클래스를 만든다.


객체를 선언한 후, 다음에 = 을 통해 값을 받으면,

출력 결과는 다음과 같다.

default constructor

default constructor

operator=

destructor

destructor


대략 2 라인에서 기본 생성자로 객체 생성

3라인의 getAAA() 내부에서 기본 생성자로 객체 생성 (임시 객체 생성)

3라인의 = 에서 대입연산자 호출

그리고 즉시 임시 객체 소멸

4라인에서 a 소멸



다음과 같이 이 두 줄의 코드를 한 줄로 변경하면,

default constructor

destructor


요렇게 된다.
이렇게 되는 이유는 대략 return value optimization. 아래 링크 참조

그런데 아무런 옵션이 없어도 저절로 이렇게 된다. 요즘 컴파일러는 똑똑하다.


레퍼런스 타입으로 함수를 호출하면 역시 동일하다.

default constructor

0 0

destructor



call by value 로 부르면,

default constructor

0 0

destructor



함수의 파라미터 타입이 const 여도, 그렇지 않아도 같은 결과가 나온다 @.@


[+]
c++11 에서는 move constructor 를 이용할 수 있다.


:

배열과 포인터


배열과 포인터는 거의 유사하게 사용된다.

차이점은, 배열은 값이 변하지 않는 const 속성을 갖는다는 점이다.

즉, 포인터는 주소값을 할당할 수 있지만 어레이 변수는 그게 안 된다.



포인터에 어레이 변수를 할당하면 어레이 변수와 동일하게 사용할 수 있다.


한편, [] 오퍼레이터는 계산은 다음과 같은데,
a[i] == *(a+i)

그래서 아래 두 문장은 서로 같은 값을 출력한다.


:

python gmail 계정으로 메일 보내기 예제




:

The Humane Interface

프로그래밍 2012. 12. 21. 10:59 |


Humane Interface
Jef Raskin 저/이건표 역 | 안그라픽스 | 2003년 02월
원제 : The Humane Interface: New Directions for Designing Interactive Systems (2000. March)

이미 이 책이 나온 지 10년이 다 되어간다. 이제는 고전이 되어버렸다.
내가 이 책을 본건 2007년 가을이다.
이때가 막 내가 UI/GUI 에 한참 관심을 가질 때였다.

interface
Wikipedia에 따르면 인터페이스는 두 시스템 간의 접점이라 한다.
여기서 두 시스템이란 보통은 인간과 컴퓨터(기계)이다.
인터페이스는 결국 사람이 컴퓨터를 조작하여 나타나는 반응을 말한다.
컴퓨터의 존재의 목적은 인간에게 유용한 기능을 제공하기 위함이며,
인터페이스는 사람이 컴퓨터의 기능등을 완전히 그리고 쉽게 사용하게 하는 것이다.

the simplicity
인터페이스에서 단순함은 최고의 미덕이다.
[The laws of simplicity (John Maeda, 2006)]에 따르면 단순함이란 기본에 충실하는 것이라 했다.
그렇다면 단순한 인터페이스란 그 목적인 기능을 쉽게 사용하도록 하는 기본에 충실한 인터페이스라 할 수 있다.
단순하면 사용하기 쉽다. 반대로 복잡해 지면 물론 사용하기가 어려워 진다.
흔히 착각하는 것이 기능이 많으면 좋은 제품이라 생각하기 쉽지만
많은 사람들이 어떤 제품의 모든 기능을 사용하지 않는다는 점은 매우 중요하다.
휴대전화의 두꺼운 매뉴얼 속의 모든 기능 가운데 당신은 몇 가지나 이용하고 있는가 ?
전화하고 메세지를 보내는 것을 제외하면 그 나머지는 몇 % 나 차지하는가 ?
좋다 당신이 카메라로 사진도 찍고 DMB도 시청한다고 하자. 그럼 당신은 전체 기능 중 얼마를 사용하고 있나 ?

소프트웨어의 관점에서 기능이 많아지고 시스템이 복잡해지면 버그가 발생할 확률이 비약적으로 증가한다.
그리고 그로인하여 생산비용도 크게 증가한다.
별로 사용하지 않는 기능으로 인하여 주요 기능까지 방해받는다면 그야말로 배보다 배꼽이 큰 경우가 될 것이다.

사용자 삽입 이미지


Apple 사의 iPod Suffle이다. 이 용감한 mp3 플레이어는 대놓고 simple 하다.
기능이라고는 음.악.재.생.뿐이다.
애플사 제품의 디자인 특징은 쉽게 말 할 수 있다. 바로 simplicity 이다. 디자인뿐 아니라 기능도 그렇다.
라디오도 되고 녹음도 되며 심지어 동영상도 재생되는 더 좋은(?) 플레이어들은 억울하겠지만,
이놈은 단순한 주제에 비싸기까지 하며 무려 잘팔리기까지 했다.

사용자 삽입 이미지


iPod Suffle 의 UI(User Interface)는 이게 다다.
세상에는 이런 물건이 잘 팔린다. 왜 나는 진작에 이런 생각을 못 했을까 ...


인간 중심 디자인
인간 중심 디자인이란 인간의 생물학적인 특성과 문화적 특성을 고려한 디자인을 말한다.
예를 들자면, 인간은 한 가지의 일에만 주의를 기울여 작업할 수 있다는 점,
그리고 또 다른 예로는 우리는 글을 왼쪽에서 오른쪽 그리고 위에서 아래 방향으로 읽고 쓴다는 점 등이 있다.
이런 저런 특성들을 잘 반영한 디자인이 좋은 디자인이다. (지당한 말씀-_-)
simplicity 의 관점에서 얘기해 보자면, 인간은 복잡한 건 싫어한다고 볼 수도 있지 않을까 (ㅋㅋ)

책에서는 인간 중심 인터페이스란 "필요로 하는 것을 만족시키고 인간의 실수를 고려한" 인터페이스라고 했다.
필요로 하는 것을 만족시킨다는 건 당연한 것이고 중요한 것은 '실수를 고려한' 이라는 대목이 되겠다.
실수는 매우 인간적인 것이다. 당연하겠지만 사람은 누구나 실수를 한다.
따라서 당연히 인터페이스는 실수를 감안해야 하고, 실수 하더라도 별 문제가 없으며
쉽게 원 상태로 회복이 되는 인터페이스를 만들어야 한다.
그런 의미에서 최고의 인터페이스는 Ctrl-Z 인가  ... (그냥 해 본 소리다. 하지만 중요하다^^)

컴퓨터는 인간의 행동에 즉각 반응해야한다.
내가 누군가의 이름을 불렀는데 아무런 반응이 없다면 ?
"못 들었나?" 하고 다시 그의 이름을 부를 것이고, 점점 그 목소리는 커 질 것이며
그래도 반응이 없다면 아마도 화를 낼 것이다.
만약 참을성이 없는 사람이라면 더 일찍 그리고 더 심하게 화를 낼 것이다.

그렇다면 이번엔 컴퓨터를 사용하는 사람이 뭔가를 하기 위해 버튼을 하나 클릭했다고 치자.
아무 반응이 없다면 ?

"내가 잘 못 눌렀나?" 하고 다시 한 번 눌러 볼 것이다. 그래도 반응이 없다면 ?
아마 키보드나 마우스를 투척할 지도 모른다.
우리는 우리 스스로가 참을성이 매우 없다는 것을 잘 알기 때문에 아래와 같은 아이콘이나 애니메이션을 만들었다.

사용자 삽입 이미지

사용자 삽입 이미지









신기하게도 이 그림들은 우리들의 인내심을 몇배로 늘려준다. 한마디로 기가 막힌다 (!)
물론 그렇다고 해서 이놈들이 만병통치약은 아니다. 몇 초 지나면 인간은 본연의 상태로 돌아온다.
따라서 키보드나 마우스가 무사하지 못 할 가능성이 높아진다.
(그렇기 때문에 컴퓨터따위가 감히 인간을 화나게 해서는 안 된다.)



아놔 ... 쓰다 보니 길어졌다. ㅠㅠ 졸려서 좀 있다가 써야 겠다...
(2010 년 7월에 쓴 글입니다.)


locus of attention (주의 소재)
"의도적으로 특정 소재에 주의의 초점을 맞출 수 있다."
의식과 무의식

:

cygwin 한글

프로그래밍/tips 2012. 11. 15. 20:19 |

 

1. 쉘에서 한글 쓰기

~/.inputrc 파일에 다음을 추가

# Allow 8-bit input/output
set meta-flag On
set convert-meta Off
set output-meta On


 

2. ls 에서 한글 파일명 제대로 보기


2.1. ~/.bashrc 파일에 다음을 추가함

alias ls='ls -hF --color=auto --show-control-char'


2.2. ~/.bash_profile 파일에 다음을 추가

source "$HOME/.bashrc"

 

references :

http://www.redwiki.net/wiki/wiki.php/cygwin/%BC%B3%C4%A1/%C7%D1%B1%DB%BC%B3%C1%A4

:

 

C++ implementations implicitly define the default constructor, copy constructor, move constructor,

copy assignment operator, move assignment operator, or destructor member functions

 

the implementation will implicitly define functions to make the definition of C equivalent to

:

Trigraph sequences

프로그래밍 2012. 11. 4. 17:23 |

Trigraph sequences

C++0x 문서를 읽다보니, Trigraph sequences 라는 녀석에 대해서 나오길래 써 둔다.

하지만 인생에 별 도움이 되지는 않을 듯.

대략 다음 테이블와 같이 자동 변환된다.

 코드

의미 

 ??=  #
 ??(  [

 ??/

 \
 ??)

 ??'  ^
 ??<  {
 ??!  |
 ??>  }
 ??-  ~

근데 이런 건 왜 있는 걸까 ...

생각해 보니, 유지보수가 어려운 코드를 만들기 위해 필요하긴 할 것 같다 ...

 

[references]

C++0x (ISO/IEC 14882:2011) 

http://ko.wikibooks.org/wiki/%EC%8B%9D%EB%B3%84%EC%9E%90

 

 

:

프로세스 이름으로 pid 찾기.

해당 이름의 프로세스가 없으면 -1 을 리턴하고, 있으면 가장 낮은 pid 를 반환한다.

while 문 안을 잘 고치면 모든 pid 를 반환하는 버전도 만들 수 있다.

 

: