Joinc 팀블로그 리눅스 메뉴얼 정리 Joinc 위키
댓글

Recent Comments

Powered by Disqus
팀블로그 카테고리
  전체 (1105)
   공지사항 (1)
   검색엔진 (21)
   기술동향 (58)
   게임 (2)
   독서 (6)
   리눅스 (12)
   보안 (1)
   사회문제 (22)
   어셈블리 (43)
   영화 (3)
   오픈소스 (10)
   음악 (9)
   인물 (1)
   포인터 (4)
   프로그래머 (23)
   팀블로그 (20)
   테터툴즈 (29)
   C/C++ (152)
   FireFox (11)
   Gimp (2)
   Google (98)
   Java (13)
   Perl (2)
   Pthread (11)
   STL (13)
   TCP/IP (8)
   Tools (31)
   Web2.0 (42)
   Wiki (1)
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
2008/10/01 00:01

Erlang 공부 Sequential Programming


1 Sequential Programming

이번장은 Erlang프로그래밍언어의 대략적인 모습을 보여줄 목적으로 만들어졌다.

몇개의 문서를 놓고 공부하면서 만들어진 문서들이라 순서들이 매끄럽지 못할 수 있다. 또한 용어선택에 그리 신중을 기하지 않았다. 그래도 대략 읽기에 큰 문제는 없으리라 생각된다.

1.1 Erlang Shell

Unix, Linux, windows를 포함한 모든 운영체제는 명령어해석기 - command interpreter - 혹은 shell을 가진다. Erlang도 Erlang 코드의 입력과 실행을 위한 자체의 shell을 가진다. 이 Erl shell을 이용하면, 즉시 코드를 입력하고 그 결과를 확인할 수 있다. erl shell은 운영체제의 쉘에서 erl을 입력하는 걸로 실행시킬 수 있다.
$ erl 
Erlang (BEAM) emulator version 5.6.3 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.3 (abort with ^G)
1>
이제 "2+5."를 입력해서 그 결과를 보도록 하자.
1> 2+5. 
7
2>

윈도우에서는 Erlang shell을 더블클릭 하는 것으로 실행할 수 있다고 한다. 어물쩍 넘어가는 이유는 이 문서가 순전히 리눅스 환경을 기준으로 작성되기 때문이다. 이하 윈도우는 고려하지 않고 다룰 것이다.

Erlang shell은 각 줄에 1> 2>와 같이 라인번호를 가지고 있다. Erlang은 코드가 완성되었다는 것을 .을 통해서 알려준다. .이 carriage return의 역할을 하는 셈이다. 다른 종류의 shell들과 마찬가지로 백스페이스를 이용한 문장의 수정도 가능하다. 이외에 다른 편집명령을 알고 싶다면, erlang 메뉴얼 문서를 참고하기 바란다.

이제 좀더 복잡한 계산을 해보도록 하자.
2> (42+77) * 66 / 3. 
2618.0
괄호와 곱셈, 나눗셈등의 일반적인 연산자들을 사용할 수 있음을 알 수 있다.

Ctrl+C를 입력하면 Erlang 시스템을 종료할 수 있다. 키를 입력하면 다음과 같은 내용들이 출력된다.
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded 
(v)ersion (k)ill (D)b-tables (d)istribution
a
#
여기에서 "a"를 입력하면 Erlang를 종료한다.

Erlang를 종료하는 다른방법으로 halt()를 입력하는 방법이 있다. 마지막에 .을 입력하는 건 잊지 말도록 하자.
3> halt(). 
#

1.2 모듈과 함수

많은 프로그래밍 언어들이 쉘로부터 코드를 직접입력하는 방법외에도 외부로 부터 코드를 불러오는 방법을 사용한다. 보통은 함수들의 모음을 파일로 저장하고, 이 파일들을 불러온다. 그럼 간단한 함수를 포함한 Erlang 파일을 만들고 이를 읽어들이도록 해보자. 'tut.erl이라는 파일을 만들도록 한다. 이 파일은 다음과 같은 내용을 포함한다.
-module(tut). 
-export([double/1]).

double(X) ->
2 * X.
이 파일은 double 라는 함수를 포함하는데, 주어진 수에 2를 곱한 값을 리턴한다. 이제 tut.erl 을 컴파일 해보자.
1> c(tut). 
{ok,tut}
{ok,tut}는 컴파일을 성공적으로 마쳤음을 의미한다. 실해할경우 "error"를 출력할 것이다.

이제 컴파일된 프로그램을 실행시켜보도록 하자.
2> tut:double(20). 
40

20에 2를 곱한 값 40이 출력되었음을 알 수 있다.

이제 tut.erl의 코드를 분석해보기로 하자.
-module(tut). 
모듈의 이름을 tut로 하겠다는 의미다. .은 라인의 끝을 의미한다. 모듈이름은 반드시 모듈을 포함하는 파일의 이름 - 확장자 .erl을 제외한 - 과 같아야 한다. 여기에서 파일의 이름을 tut.erl 로 했으므로 모듈의 이름도 tut가 되어야 한다. 모듈이 포함한 함수는 module_name:function_name(arguments)형식으로 호출할 수 있다. 이제 다음 코드가 이해갈 것이다.
2> tut:double(20). 
tut 모듈의 double 함수를 인자 20을 줘서 호출하겠다는 의미다.

tut.erl의 두번째 줄을 보자.
-export([double/1]). 
이것은 tut 모듈이 double라는 함수를 포함하고 있음을 알려준다. 뒤에 1은 double함수가 하나의 인자를 가지고 있음을 명시한다.

이제 좀더 복잡한 함수를 포함한 모듈을 만들어 보도록 하자. 모듈명은 tut1으로 하겠다. 이 모듈은 factorial 함수를 포함한다.
-module(tut1). 
-export([fac/1]).

fac(1)->
1;
fac(N)->
N * fac(N-1).

모듈을 컴파일 한다.
2> c(tut1). 
{ok,tut1}

이제 5에 대한 팩토리얼을 계산해보도록 하자.
3> tut1:fac(5). 
120

다음 라인을 보자.
fac(1)-> 
1;
이것은 1팩토리얼이 1임을 의미한다.

다음줄이다.
fac(N)-> 
N * fac(N-1).
N 에 (N-1)을 곱한다. 이 함수는 fac에 1이 인자로 넘어갈때까지 재귀호출됨을 알 수 있다.

이제 tut1 모듈에 두개의 함수를 정의해보도록 하자.
-module(tut1). 
-export([fac/1, mult/2]).

fac(1) ->
1;
fac(N) ->
N * fac(N-1).

mult(X, Y)->
X * Y.
2개의 인자를 가지는 mult 라는 함수가 추가 되었다.

complie:
3> c(tut1). 
{ok,tut1}

함수를 실행:
4> tut1:mult(21,31). 
651

1.3 Pattern Matching

여기에서 말하는 패턴매칭이란 Perl등에서 사용되는 정규표현식에 따른 패턴매칭이 아니라는 걸 먼저 확실히하고 넘어갈 필요가 있을 것 같다.

Erlang에서 말하는 패턴매칭이란 수학에서 변수와 값을 매칭시킨다라는 개념으로 이해해야 한다. 이것은 매우 큰차이다. 다음 식을 보자.
X = 1+2 
C에서라면 1+2의 결과가 X에 assigned(할당)된다로 해석이 된다. 그러나 Erlang는 우항과 좌항이 같다즉 매칭된다로 해석이 된다.

아래와 같은 코드가 있다고 가정해보자 C에서라면 문제가 될리가 없지만 Erlang에서는 문제가 된다.
X = 1+2 
X = 5
C에서야 값의 할당이기 때문에 문제가 없지만, 수학적 관점에서 보자면 X가 3이면서 또한 X가 5인 경우라는 건 있을 수 없는 일이기 때문이다. Erlang Shell에서 직접 테스트 해보자.
1> X=1+2. 
3
2> X=5.
** exception error: no match of right hand side value 5
matching 에러가 떨어지는 것을 확인할 수 있다.

Erlang가 수학과 마찬가지로 single assignment language이기 때문으로 하나의 값은 반드시 하나의 변수와 매칭이 되며, 일단 매칭이 되면 그 값은 바꿀 수 없다. 즉 Erlang은 C, C++, Java, Perl 에서의 할당개념이 없다.

1.3.1 함수 호출에서의 패턴 매칭

간단한 온도변환 프로그램을 이용해서 패턴매칭에 대해서 알아보도록 하자. 이 프로그램은 fahrenheit -화씨-, celsius -섭씨-, Reaumur -열씨-에 대한 온도변환 프로그램이다.

다음은 온도변환과 관련된 함수를 담고 있는 모듈이다.
-module(temp). 
-export([convert/2]).
convert({fahrenheit, Temp}, celsius) ->
{celsius, 5 * (Temp - 32) / 9};
convert({celsius, Temp}, fahrenheit) ->
{farenheit, 32 + Temp * 9 / 5};
convert({reaumur, Temp}, celsius) ->
{celsius, 10 * Temp / 8};
convert({celsius, Temp}, reaumur) ->
{reaumur, 8 * Temp / 10};
convert({X, _}, Y) ->
{cannot,convert,X,to,Y}.

convert가 호출되면, 각 인자의 패턴과 함수의 패턴을 검사해도 일치되는 함수를 실행한다. 매칭되는 함수를 발견하면 '->'이후의 코드를 수행한다.
2> temp:convert({fahrenheit, 98.6}, celsius). 
{celsius,37.0}
3> temp:convert({reaumur, 80}, celsius).
{celsius,100.0}
4> temp:convert({reaumur, 80}, fahrenheit).
{cannot,convert,reaumur,to,fahrenheit}

1.3.2 match 연산자 "="

Erlang에서의 "="는 다른언어에서의 대입이 아닌 패턴매칭을 위해서 사용된다. 사용은 Pattern = Expression 형식을 따른다.
5> N = {12, banana}. 
{12,banana}
6> {A, B} = N.
{12,banana}
7> A.
12
8> B.
banana
9>

match 연산자는 복잡한 데이터구조를 unpack 하기 위해서 사용할 수 있다.
2> {A, B} = {[1,2,3], {x,y}}. 
{[1,2,3],{x,y}}
3> A.
[1,2,3]
4> B.
{x,y}
5> {_,L,_}={fred,{likes, [wine, women, song]},
{drinks, [whisky, beer]}}.
{fred,{likes,[wine,women,song]},{drinks,[whisky,beer]}}
6> L.
{likes,[wine,women,song]}
7>

1.4 데이터 타입

erlang는 다음의 데이터 타입들을 지원한다.

Constant 데이터 타입
  • Numbers : Integers, Floats
  • Atoms
  • Pids : 프로세스 이름을 저장.
  • References : 시스템에서 유일한 레퍼런스를 저장.

Compound 데이터타입
  • Tuples
  • List

1.4.1 Number

숫자는 다음과 같이 사용할 수 있다.
   123 -34567 12.345 -27.45e-05 

$<Char>를 이용하면 문자(character)의 ASCII값을 얻어올수 있다. 예를들어 $A라면 65가 된다.

<Base>#<Value>를 이용해서 10진수 이외의 표현도 가능하다. 16#ffff는 10진수 65535가 된다. base는 2..16 범위에서만 사용할 수 있다. 이 범위 안에만 있다면 3진수, 4진수 계산도 가능하다. 쓸일이야 없겠지만

1.5 Atoms

Atoms는 Erlang의 독특한 데이터형이다. 이것은 일종의 기호상수인데, C의 define 상수와는 달리 어떤 수치나 다른 상수값을 대신하지 않는다는 특징이 있다.

atom은 첫문자가 a-z로 시작되어야 한다 따움표로 묶을 경우에는 어떠한 문자라도 사용할 수 있다.

다음은 Atoms의 간단한 사용예다. inch를 centimeter로 centimeter를 inch로 바꾸는 프로그램이다.
-module(tut2). 
-export([convert/2]).

convert(M,inch)->
M / 2.54;
convert(N,centimeter)->
N * 2.54.
테스트를 해보자.
1> c(tut2). 
{ok,tut2}
2> tut2:convert(5,inch).
1.968503937007874
3> tut2:convert(5,centimeter).
12.7

만약 C를 이용해서 구현을 했다면, 다음과 같이 분기문을 사용해야 했을 것이다.
#define inch 1 
#define centimeter 2

float convert(int a, int type);
int main()
{
printf("%lf\n", convert(5,inch));
printf("%lfu\n", convert(5,centimeter));
}

float convert(int a, int type)
{
if (type == inch)
{
return a / 2.54;
}
else if(type == centimeter)
{
return a * 2.54;
}
}

1.6 tuple

tuple은 수학에서 사용된다. 값을 연속으로 나열한 자료구조로 ordered list라고 부르기도 한다. 근본적으로 tuple와 list는 그 차이가 없다고 할 수 있다. tuple이 n개의 원소를 포함할때 이것을 n-tuple 이라고 부른다. 예를들어서 개인의 생일정보를 저장하기 위해서는 Name,Day,Month,Year4개의 원소를 가지는 4-tuple가 필요할 것이다.

원소가 0인 것에서 부터 12개인것 까지의 tuple에 대해서는 사용하기 쉽게 특별한 이름이 붙여져 있다. 심심해서 정리해 보았다. unit, singletone, pair, triple 등과 같은 익숙한 용어들도 눈에 띈다.
0 Unit 4 Quadruple 8 Octuple 12 Duodecuple
1 Singleton 5 Quintuple 9 Nonuple

2 Pair 6 Sextuple 10 Decuple

3 Triple 7 Septuple 11 Undecuple


수학의 관점에서는 tuple과 list의 차이가 없겠지만 소프트웨어 공학에서는 tuple와 list를 mutable한지 immutable한지를 가지고 서로 구분을 한다.
list mutable 값을 변경할 수 있다.
tuple immutable 값을 변경할 수 없다.
프로그래밍언어에서 tuple은 구조체나 record와 같은 용도로 사용할 수 있다

다음은 tuple의 예다.
{yundream, 1974, 'programmer'} 
{1, 2, {3, 4}, {a, {b, c} } }
{}

그럼 실제 Tuple를 사용해보도록 하자. tut2C보다 훨씬 세련된 프로그래밍 형식을 보여주고 있다.
tut2:convert(3,inch) 
위에서 우린느 3이 inch라는 것을 알 수 있다. 그렇지만 변환된 결과가 centimeter라는 것은 프로그램은 알 수 없다. 예를들어서 convert프로그램이 제대로 작동하는지를 검증할려고 한다면, 다음과 같이 두번 convert 함수를 호출하면 될 것이다.
9> F=tut2:convert(3,inch). 
1.1811023622047243
11> tut2:convert(F,centimeter).
3.0
9번에서 넘겨준 값 1.1811은 centimeter이라는걸 프로그램은 모르기 때문에, 11번에서 인자로 값과 함께 centimeter를 넘겼다.

tuple를 이용한다면 값과 함께 값의 단위까지를 함께 넘겨주고 넘겨 받을 수 있다.
-module(tut3). 
-export([convert_length/1]).

convert_length({centimeter,X})->
{inch, X/2.54};

convert_length({inch,Y})->
{centimeter, Y * 2.54}.
{단위,값}을 원소로 가지는 tuple를 인자로 넘기고, 역시 {단위,값}의 tuple을 리턴하고 있다. tuple에 단위가 있으므로, 이제 프로그래머가 번거롭게 단위를 명시해줄 필요가 없게 된다.

다음은 테스트 결과다.
2> c(tut3). 
{ok,tut3}
3> tut3:convert_length({inch,5}).
{centimeter,12.7}
4> tut3:convert_length(tut3:convert_length({inch,5})).
{inch,5.0}
4번째줄에서 tut3:convert_length({inch,5})의 결과는 {centimeter,12.7}이 된다. 그러므로 해석을 해보자면 tut3:convert_length({centimeter,12.7})이 최종적으로 수행이 됨을 알 수 있다. tut2에 비해서 훨씬 세련된 코드가 만들어졌다.

1.7 List

Erlang에서 리스트는 "[]"로 나타낼 수 있다. 다음은 List의 예이다.
[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, 
{paris, {f, 28}}, {london, {f, 36}}]

사용은 간단하다. 다음은 "|"를 이용해서 List를 사용한 예다.
1> [First|TheRest]=[1,2,3,4,5]. 
[1,2,3,4,5]
2> First.
1
3> TheRest.
[2,3,4,5]

| 를 이용해서 좀더 복잡하게 리스트를 다룬 예다.
6> [E1,E2 | R]=[1,2,3,4,5,6,7]. 
[1,2,3,4,5,6,7]
7> E1.
1
8> E2.
2
9> R.
[3,4,5,6,7]

다음은 리스트를 응용한 간단한 프로그램이다. 이 프로그램은 리스트가 포함하는 원소의 갯수를 계산한다.
-module(tut4). 
-export([list_length/1]).

list_length([])->
0;
list_length([First|Rest])->
1 + list_length(Rest).

tut4를 컴파일하고 실행시켜보았다.
1> c(tut4). 
{ok,tut4}
2> tut4:list_length([1,3,5,7,9,11,13,15]).
8
리스트가 포함한 원소의 갯수를 제대로 계산하고 있다.

라인별로 분석해보도록 하자.
list_length([])-> 
0;
원소가 없다면 0을 리턴한다.

list_length([First|Rest])-> 
1 + list_length(Rest).
First에는 첫번째 원소가 들어가고 Rest에는 나머지 원소가 들어갈 것이다. 그러므로 1+list_length(Rest)에서 Rest는 -1씩이 되고, 원소의 갯수만큼 호출된후 0이 될 것이다. 결국 원소의 갯수만큼 +1을 반복하게 된다. 2>를 해석해보자면 다음과 같을 것이다.
  1+1+1+1+1+1+1+1+list_length([]) = 8 

erlang는 string 데이터 타입을 지원하지 않는다. 대신 ASCII의 리스트로 재현할 수 있다. 예를들어 [97,98,99] 는 문자열 "abc"와 동일하다.
2> [97,98,99]. 
"abc"

1.8 Clauses - 절 -

각각의 함수는 clauses로 이루어진다. 각 세미콜론(;)으로 구분이 된다. 각 절은 독립적이며 clause head 와 guard 그리고 body를 가진다. guard는선택사항이다.

1.8.1 Clauses heads

head는 함수이름과 인자의 갯수로 이루어지며 commas로 구분된다. 각 인자는 매칭될 수 있는 pattern이다.

함수가 호출하면, 정의된 clauses head에 대한 패턴매칭을 수행해서 매칭되는 함수를 수행한다.

1.8.2 Clause guards

guards는 clause를 선택하기 전에 주어지는 조건으로, 조건을 만족하는지 간단히 검사해서 cluase를 실행할지를 결정하게 된다.

조건에 대한 검사는 수치비교, Term비교 혹은 다른 평가(테스트) 함수를 통해서 이루어진다. guards는 패턴매칭의 확장이라고 볼 수 있을 것이다. 단 유저정의 함수는 guards로 사용할 수 없다. 말그대로 간단한 검사용이다.

다음은 clauses를 이용한 factorial의 구현이다.
-module(facguard). 
-export([factorial/1]).

factorial(N) when N == 0 ->
1;
factorial(N) when N > 0 ->
N * factorial(N-1).

1.8.3 Guard tests

다음은 guard 검사에 사용할 수 있는 함수들이다.
Guard 성공 조건
atom(X) X가 atom 이라면
constant(X) X가 list나 tuple가 아니라면
float(X) X가 float라면
integer(X) X가 integer라면
list(X) X가 list 혹은 [] 라면
number(X) X가 float 혹은 integer라면
pid(X) X가 process id라면
port(X) X가 port라면
reference(X) X가 reference 라면
tuple(X) X가 tuple 라면
binary(X) X가 binary 라면

1.8.4 Term 비교

Term 비교도 guard 검사에 사용할 수 있다.
Operator 설명 Type
X > 0 X가 Y보다 크다면 coerce
X < Y X가 Y보다 작다면 coerce
X =< Y X가 Y보다 크거나 같다면 coerce
X >= Y X가 Y보다 작거나 같다면 coerce
X == Y X가 Y와 같다면 coerce
X /= Y X가 Y와 다르다면 coerce
X =:= Y X가 Y와 같다면 exact
X =/= Y X가 Y와 다르다면 exact

Type이 coerce인 것은 인자를 비교할때, 자동으로 형변환을 해준다는 의미다. 즉 한쪽이 interger이고 다른 한쪽이 float이면, integer를 float형으로 변환해서 비교를 수행한다. Type이 exact인 경우에는 형변환을 하지 않는다.

다음은 clause head에서 guard 사용의 예이다.
foo(X, Y, Z) when integer(X), integer(Y), integer(Z), X == Y + Z -> 
foo(X, Y, Z) when list(X), hd(X) == {Y, length(Z)} ->
foo(X, Y, Z) when {X, Y, size(Z)} == {a, 12, X} ->
foo(X) when list(X), hd(X) == c1, hd(tl(X)) == c2 ->

1번째예를 모듈로 만들어서 간단히 테스트해보도록 했다.
-module(foo). 
-export([foo/3]).
foo(X,Y,Z) when integer(X), integer(Y), integer(Z), X==Y+Z ->
Y+Z.
2> c(foo). 
{ok,foo}
3> foo:foo(1,2,3).
** exception error: no function clause matching foo:foo(1,2,3)
4> foo:foo(3,2,1).
3
5> foo:foo(3.0,2,1).
** exception error: no function clause matching foo:foo(3.0,2,1)

1.8.5 Clause body

body는 한나 이상의 표현식으로 이루어지는 절로 구성된다. 각각의 표현식은 컴마로 구분된다. 마지막 표현식의 계산값이 이 함수가 리턴하는 값이 된다. 다음은 factorial 함수의 예이다.
factorial(N) when N > 0 -> 
N1 = N-1, ----+
F1 = factorial(N1), |--> Body
N * F1. ----+

1.9 조건문

Erlang는 case와 if문을 제공한다. 프로그래머는 case와 if문을 이용해서 조건을 평가할 수 있다.

1.9.1 case

case는 여러 조건중 하나를 선택하기 위한 목적으로 사용된다.
    case Expr of 
Pattern1 [when Guard1] -> Seq1;
Pattern2 [when Guard2] -> Seq2;
...
PatternN [when GuardN] -> SeqN
end
Exprt은 평가대상으로 Expr의 값과 매칭되는 패턴을 찾을 때까지 Pattern1부터 PatternN까지 검사한다. 만약에 매칭되는 패턴을 찾고 Guard검사가 성공되면 코드를 실행한다.

1.9.2 if

if문은 다음과 같이 사용한다.
if 
Guard1 ->
Sequence1;
Guard2 ->
Sequence2;
...
end
Guard 패턴을 만족하면 각각에 해당하는 Sequence를 실행한다.

1.9.3 case와 if의 사용 예

factorial 함수를 case와 if 문을 이용해서 구현해 보도록 하겠다.

우선 case,if문을 사용하지 않는 일반적인 구현이다.
-module(fac). 
-export([factorial/1]).
factorial(0) ->
1;
factorial(N) ->
N * factorial(N-1).

if를 이용한 구현
-module(facif). 
-export([factorial/1]).
factorial(N) ->
if
N == 0 -> 1;
N > 0 -> N * factorial(N-1)
end.

guard를 이용한 구현
-module(facguard). 
-export([factorial]/1).
factorial(0) ->
1;
factorial(N) when N > 0 ->
N * factorial(N-1).

case를 이용한 구현
-module(facif). 
-export([factorial/1]).

factorial(N) ->
if
N == 0 -> 1;
N > 0 -> N * factorial(N-1)
end.

1.10 산술 표현식

Operator 설명 Type Operands Prio
+ X + X Unary mixed 1
- X - X Unary mixed 1
X * Y X * Y binary mixed 2
X / Y X / Y binary mixed 2
X div Y 정수형 나누기 binary integer 2
X rem Y 나머지값 binary integer 2
X band Y And bit 연산 binary integer 2
X + Y X + Y binary mixed 3
X - Y X - Y binary mixed 3
X bor Y or 연산 binary integer 3
X bxor Y xor 연산 binary interger 3
X bsl N N 만큼 왼쪽으로 shift binary integer 3
X bsr N N 만큼 오른쪽으로 shift binary integer 3

1.11 터미널 출력

Erlang역시 당연히 형식화된 출력을 할 수 있는 io:format 함수를 제공한다. 사용방법역시 C의 printf처럼 간단하다.
1> io:format("Hello world~n", []). 
Hello world
ok
2> io:format("this outputs one Erlang term: ~w~n",[hello]).
this outputs one Erlang term: hello
ok
3> io:format("this outputs two Erang terms: ~w~w~n", [hello,world]).
this outputs two Erang terms: helloworld
ok
4> io:format("this outputs two Erang terms: ~w ~w~n", [hello,world]).
this outputs two Erang terms: hello world
ok
format 함수는 2개의 인자를 받아들인다. 첫번째 인자는 출력할 문자열이고, 두번째 인자는 문자열에 포함될 값의 list다. ~w는 C의 printf에서의 %s와 비슷하다. 리스트에서 대응되는 값으로 교체된다. ~n은 new line을 의미한다. C에서의 "\n"과 동일하다.


2 맺으며

Erlang 이거 상당히 재미있다.
:::
2008/09/29 13:21

제다이의 반환

프로그래머라면 이해할 수 있는..

ReturnOfTheJediPoster1983.jpg

Return Of The Jedi
"후욱... I'm your caller."

출처 : http://gall.dcinside.com/list.php?id=programming&no=91623&page=2
:::
2008/09/22 23:44

Erlang 공부시작

1 Erlang 소개

Erlang은 범용적으로 사용가능한 concurrent 프로그래밍 언어다. 즉 동시성제어를 필요로 하는 병렬시스템, 분산처리 시스템의 개발을 위한 언어라고 할 수 있을 것 같다. 또한 strict evaluation, single assignment, dynamic typing 을 지원하는 함수형 언어이기도 하다. 동시성을 만족하기 위해서 Actor model 을 적용했다고 하는데, Actor model은 기회가 되면 한번 공부해봐야 될 것 같다.

2 함수형 언어

인간의 표면적인 의식의 흐름은 절차지향적이다. 표면적이라고 제한을 둔 이유는 인간의 내면적인 의식의 흐름의 경우 단순히 절차지향적이라고 말하기는 힘들기 때문이다. 우리가 어떤 일을 처리하는 방식이라든지 의사소통을 위한 언어의 경우를 봐도 대체로 절차지향적임을 알 수 있다. A일을 하고 B 일을 하고 다음에 C일을 해야지라는 식으로 순차적으로 일을 처리하는 식이다. 여기에서 일이 좀 복잡해지면 선택을 통한 분기를 하게 된다. 선택을 통한 분기 역시 순차적으로 일을 처리한다고 볼 수 있을 것이다.

이러한 절차지향적인 언어 혹은 사고방식은 구술적이라는 특징을 가진다. 구술적인 정보교환이나 일의 처리가 가지는 가장 큰 장점은 역시 인간적이며, 빠르게 이해할 수 있다 - 즉 직관적이다 -. 라는게 될 것이다. 구술은 하나의 문장에 다양한 의미를 담을 수 있다는 특징도 가지고 있는데, 이는 문학작품을 창작하는데 유리한 특징이다. 구술적인 특징을 가지는 대표적인 도구가 인간의 언어가 될 수 있을 것이다.

반면 몇가지 단점도 가지고 있는데, 여러가지 의미로 해석될 수 있기 때문에 의미가 명확하게 전달되지 않을 경우가 있으며, 결과에 의해서 조건 자체가 변경될 수 있다거나 하는 문제 - 아 다르고 어 다르다-가 생길 수 있다는 점이다. 똑같은 의미를 다양한 방법으로 전달할 수 있다는 것도 문제가 될 수 있다. 사람사이의 오해라는게 이러한 문제들때문에 생기는게 대부분이도 하고 말이다. 사람들 사이의 오해라면, 대게의 경우 언어를 이용해서 심각하지 않은 수준에서 마무리 지을 수 있지만, 자연과학등에서의 자연현상을 기술하고자 할때는 인간언어의 이러한 모호함이 큰 문제가 될 것이다.

이러한 문제를 해결하기 위해서 만들어진 도구가 과학의 언어라고 하는 수학이 다. 수학은 인간의 언어가 가지는 문제점들을 해결했다. 명료하고 간결하고, 수학이라는 언어에 사용되는 기호를 완전히 알고만 있다면, 의미가 잘못 전달될 가능 성도 없다. 반면 수학은 인간적이지 않다는 커다란 문제점을 가진다. 수학은 인간적인 사고방식과는 거리가 상당히 있다. 일상생활에서 수학이 사용되는 빈도를 생각해보면 이해될 것이다. 심지어는 과학논문 조차도 수학공식은 고작해야 10% 내외에서 사용될 뿐이다.

절차지향적언어는 즉 인간의 표면적인 의식의 흐름을 따라서 프로그램을 제작할 수 있도록 제작되어진 프로그래밍 언어를 의미한다. C, C++, Java, Perl, Python, Ruby등의 언어등이 절차지향적언어이거나 절차지향적인 특징을 가지고 있다. 절차지향적 언어의 장점은 인간의 언어와 그 흐름이 비슷하다는데 있을 것이다. 인간의식의 흐름과 비슷하기 때문에 어색하지 않고, 쉽게 배울 수 있다는 점 대게의 경우 범용적으로 사용하기에 문제가 없다는 점이다. 단점도 역시 인간언어의 그것과 비슷하다. 명확하지 않으며, 잘못 해석되고, 잘못 작성될 여지가 있으며, 결과에 따라서 혹은 새로운 흐름이 추가됨으로써 조건 자체가 바뀌어 버린다거나 하는 부수효과(side effect) 가 발생할 수 있다는 점이다.

함수형언어절차지향적언어가 가지는 이러한 문제점들을 해결하기 위해서 만들어진 언어다. 함수형 프로그래밍 언어는 계산을 수학적 함수의 조합으로 생각하는 방식을 말한다. 수학공식에서 하나의 기호가 하나의 function이 되는 것으로 생각하면 될 것이다. 함수형언어는 수학의 장점을 가진다. 간결하며, 명료하고 수행결과에 따라서 조건이 바뀌는 식의 side effect도 발생하지 않는다.

함수형 언어는 람다대수를 통해서 이론적 기반이 만들어졌다. 이를 기반으로 해서 최초로 만들어진 함수형 프로그래밍 언어가 IPL이고, 여기에서 발전되어서 Lisp이 만들어졌다.

3 함수형 언어의 제한

새로운 패러다임이 등장하고 거기에 패러다임이 꽤 쓸만하다고 생각되면, 기존의 패러다임은 용도폐기되어야 한다고 주장하는 경우가 있다. 이는 때때로 새로운 패러다임에 대한 과도한 환호와 기존 패러다임에 대한 혐오로까지 발전하는걸 볼 수 있다. 새로운 언어, 개발툴, 운영체제가 만들어지면 어렵지 않게 볼 수 있는 현상들이다.

하지만 그런일은 발생하지 않는다.

구술문화관점에서 문자문화는 패러다임의 변화였다. 그러나 구술문화가 사라졌는가 ? 지금에 들어와서는 커뮤니케이션으로써의 구술문화의 가치가 더욱 높아지고 있다. 기존의 패러다임이 폐기되는 경우는 거의 없다. 있다고 하더라도 오랜시간에 걸쳐서 서서히 이루어진다. 혁명은 그리흔한 사건이 아니다.

기존의 절차지향적언어는 폐기될 일은 없을 것이다. 꼭 관성 때문인것 만은 아니다. 어느게 더 낫다거나 실패한 패러다임이 아닌 다른패러다임이기 때문이다. 서로의 역할이 있다는 점이다. 논문에서 수학과 인간의 언어가 함께 쓰이는 것처럼 말이다.

4 함수형 언어로써의 Erlang

함수형 언어는 side effect - 부수효과 - 를 가지지 않는다. 이것은 함수의 실행이 외부에 영향을 끼치지 않는다는 얘기가 되된다. 때문에 함수형 언어는 thread safe하며, 병렬적인 계산에 적합할 수 있다.

5 공부방법

일단 erlang tutorial 문서로 입문을 한뒤, 관심있는 부분들을 자세히 보는 방식으로 공부를 해볼 생각이다. 입문 문서는 getting_started-5.4.pdf 로 할 것이다. 그다음 tuple, concurrent 프로그래밍, Distributed 프로그래밍, Error handling,등등을 살펴보면 되지 싶다. 개념이 잡히면, 웹서버나 채팅서버, RSS수집기 등을 제작해보는 걸로 어느정도 마무리 되리라 생각된다.

6 관련문서

:::
2008/09/22 14:00

스티븐 잡스의 스텐포드 대학졸업식 연설문

워낙 예전 글이긴 하지만, Apple 채널생성기념으로 포스팅해 봅니다.

저는 오늘 전세계에서 최고 대학 중 하나인 스텐포드 대학 졸업식에 여러분과 함께하게 되어 영광입니다. 저는 대학을 졸업하지 못했습니다. 진실을 말하면, 이번이 대학 졸업식에 가장 가까이 온 것입니다. 오늘 저는 제 삶에서 3가지 얘기를 하려고 합니다.


첫번째 얘기는 점들을 연결하는 것에 관한 것입니다.


저는 리드 컬리지를 첫 6개월동안 다닌 후 자퇴했습니다. 하지만 정말 자퇴하기 전에 그 후 18개월동안 청강생으로 주위에 머룰렀습니다. 왜 제가 자퇴를 했을까요?

제가 태어나기 전 내 어머니(생모)는 젊고, 결혼도 하지 않은 대학 졸업생이어서 저를 입양시키기로 결정했습니다. 어머니는 제가 대학 졸업자에 의해 양자삼아주기 강하게 원하셨고, 태어나면 변호사와 그의 부인에게 입양되도록 모든 것이 준비되었습니다. 내가 출생했을 때 그들이 여아를 정말 원한다는 결정을 한 것을 제외하고는 말이죠.

17년 후 저는 대학에 입학했습니다. 하지만 순진하게 스텐포드만큼이나 비싼 대학을 선택했고, 노동계층인 부모님의 모든 돈이 내 대학 등록금으로 소진되었습니다. 6개월 후 저는 대학에서 가치를 발견치 못했습니다. 저는 제가 뭘하고 싶은지, 어떻게 대학이 문제를 해결하도록 도울 수 있을지 몰랐습니다. 그리고 저는 대학에서 내 부모님이 전 생애를 통해 벌었던 모든 돈을 쓰고 있었습니다. 그래서 저는 자퇴를 결심했고, 모두 잘 될 것이라는 것을 믿었습니다. 그 순간은 무척 두려웠었지만, 뒤돌아보면 그것은 내가 한 최고의 결정 중 하나였습니다. 학교를 그만둔 그 순간 저는 관심 없었던 필수 과정들을 이수하지 않을 수 있었고, 관심 있어 보이는 과정들을 청강하기 시작했습니다.

모두 낭만적인 것은 아니었습니다. 기숙사도 없었고, 친구 집의 바닥에서 잠을 잤고, 먹을 음식을 사기위해 콜라병을 모아 5센트씩 모았고, 매주일 밤에 일주일에 한번 훌륭한(좋은) 음식을 먹기 위해 헤어 크리쉬나 사원까지 기꺼이 7마일을 걷곤했습니다. 그 일을 매우 사랑했습니다. 그리고 나의 호기심과 직관을 따름으로 나를 당황하게 만든 많은 것들이 후에는 가치없는 것임을 깨닫게 되었습니다.
한 가지 예를 들겠습니다. 그 당시에 리드 대학은 우리나라에서 (아마도) 최고의 서법강좌를 제공했던 것 같습니다. 전 캠퍼스의 모든 포스터, 모든 서랍의 라벨은 아름답게 쓰여져 있었습니다. 제가 자퇴하고 정규과정을 수강하지 못했기 때문에 서법을 어떻게 하는지 배우기 위해서 서법 강좌를 수강하기로 결정했고, 저는 serif[(M, H등의 글자에서상하의획에 붙인) 가는장식선, 세리프 ]와 san serif 서체를 배웠습니다. 즉 다른 글자 조합간의 총 공간을 변경하는 것에 관해, 무엇이 서체를 멋지게 만드는 가에 대해 배웠습니다. 이것은 과학이 따라잡을 수 없는 아름답고, 역사적이고 예술적으로 미묘한 것이었고 저는 그것에서 매력을 발견했습니다.

이러한 어떤 것도 내 삶에서 실제적인 적용에 대한 소망을 갖게 하지 못했습니다. 그러나 10년 후 우리가 처음 메켄토시 컴퓨터를 처음 디자인할 때, 그것은 나에게 큰 도움이 되었습니다. 그래서 우리는 맥에 모든 것을 디자인해 넣었습니다. 맥은 아름다운 활자(typography) 를 가진 최초의 컴퓨터가 되었습니다. 만약 내가 대학에서 그 과정을 청강하지 않았더라면, 맥은 결코 다양한 서체와 균형 잡힌 자간을 띄운 글자체를 가지지 못했을 것입니다. 윈도우스가 맥을 모방했기 때문에, 개인용 PC가 글자체를 가지지 않은 것이 없는 것처럼 보입니다. 만약 제가 학교를 그만두지 않았다면, 저는 결코 이러한 서체 강좌를 수강하지 못했을 것입니다.

그리고 개인용 컴퓨터들은 아름다운 글자체를 가지지 못했을 것입니다. 물론 내가 대학에 있을 때에는 점들을 앞쪽을 보면서 연결하는 것이 불가능했습니다. 그렇지만 10년이 지난 후 뒤쪽을 돌아보니 아주 아주 명료했습니다. 다시 말해서, 점들은 앞을 보면서는 연결할 수 없습니다. 점들은 뒤쪽을 보면서만 연결할 수 있습니다. 그래서 그 점들이 어느 정도 당신의 미래에 연결될 수 있다는 것을 신뢰해야 합니다. 여러분은 무엇인가를 신뢰해야 합니다. 즉 실질, 운명, 삶, 카르마(인연, 숙명) 그 무엇이든. 이런 접근법은 결코 저를 낙담시키지 못했고, 내 삶의 모든 차이를 만들었습니다.


두번째 얘기는 사랑과 상실에 관한 것입니다.


저는 운이 좋았습니다. 저는 제가 즐겨할 수 있는 일을 빨리 발견했습니다. Woz와 저는 20세에 아버지의 차고에서 APPLE을 시작했습니다. 우리는 열심히 일했고, 10년만에 애플은 차고의 2명에서 4000명의 직원을 가진 20억불 회사로 성장했습니다. 우리는 우리가 만든 최상의 창조물 -매킨토시-을 1년 더 빨리(29세에) 출시했습니다. 그리고 저는 서른이 되었습니다. 그리고 나서 저는 해고를 당했습니다. 당신이 만든 회사에서 어떻게 해고될 수 있냐구요? 글쎄요, 애플이 성장함에 따라 우리는 저와 회사를 잘 경영할 수 있는 매우 재능있는 누군가를 고용했고 첫해 일은 잘 진행되었습니다. 하지만 미래에 대한 우리의 비젼이 갈라지기 시작했고, 결과적으로 사이가 틀어지게 되었습니다. 그렇게 되었을 때 이사회는 그를 지지했고, 저는 나이 30세 해고를 당했습니다. 아주 공식적으로 해고를 당한 것이죠. 내 전 젊음을 집중했던 것은 사라졌고, 파괴되었습니다.

저는 수개월 동안 무엇을 어떻게 해야 할지 알지 못했습니다. 이전 세대 사업가들을 낙담시킨 것처럼 즉 내게 전달된 바톤을 떨어뜨린 것처럼 느꼈습니다. 저는 데이빗, 패커드과 밥 로이스를 만나서 일을 그르치게 한 것에 대해 사과하려고 했습니다. 저는 공적으로 실패했고 심지어 벨리(실리콘?)에서 도망칠 생각까지 했습니다. 하지만 천천히 제게 새벽이 오고 있었습니다. 저는 여전히 제가 한 것을 사랑했습니다. 애플에서의 일련의 사건은 조금도 변화되지 않았습니다. 저는 거절당했지만 여전히 열정이 있었습니다. 그래서 저는 다시 시작하기로 결정했습니다.

저는 당시에는 알지 못했지만 애플에서 쫓겨난 것은 저에게 있어 가장 최선의 것이었음을 알게 되었습니다. 성공에 대한 중압감이 다시 시작하는 사람의 가벼움으로 바뀌었고, 모든 것에 대해 덜 확신하게 되었습니다. 이러한 것들이 저를 제 삶에서 가장 창의적인 기간 중 하나로 자연스럽게 들어가게 했습니다.

다음 5년 동안, 저는 NeXT라는 회사와, Pixar라는 또 다른 회사를 시작했습니다. 그리고 제 부인이 된 굉장한 여성과 사랑에 빠지게 되었습니다. Pixar는 세게 최초 Computer animated feature 영화인 토이스토리를 창조해냈고, 현재는 세계에서 가장 성공적인 애니메니션 스튜디오가 되었습니다. 주목할만한 일련의 변화로 애플은 NeXT사를 샀고, 저는 애플로 돌아오게 되었습니다. NeXT에서 개발된 기술은 애플의 현재 르네상스에 핵심에 있습니다. 그리고 로렌스와 저는 멋진 가족을 만들었습니다.

만약 제가 애플에서 해고되지 않았더라면 이런 어떤 일도 발생하지 않았을꺼라고 확신합니다. 지독하게 쓴 약이었지만 저는 환자에게 그런 약이 필요한 것임을 압니다. 때때로 삶이 당신의 머리를 벽돌로 치게 됩니다. 믿음을 잃지 마십시오. 저는 저를 계속 유지하게 하는 유일한 것이 제가 한 것을 사랑하는 것임을 확신합니다.

당신이 사랑하는 것을 찾으십시오. 사랑하는 사람에게 하는 것처럼 일에도 진실하십시오. 여러분의 일이 삶의 많은 부분을 채울 것입니다. 진정으로 만족할 수 있는 유일한 길은 우리가 믿는 일을 하는 것이 위대한 일이라는 것입니다. 그리고 그러한 위대한 일을 하는 것이 여러분이 하는 일을 사랑하는 것입니다.

아직까지 발견하지 못하셨다면, 계속해서 찾으십시오. 안주하지 마세요. 마음의 문제들을 따라가다 보면 언젠가 발견케 될 것이라는 것을 알게 될 것입니다. 어떤 위대한 관계처럼, 세월이 흐르면 점점 좋아지게 됩니다.

찾을 때까지 계속 찾으시고 안주하지 마세요.



세번째 이야기는 죽음에 관한 것입니다.


제가 17세였을 때 “매일 매일을 당신의 마지막 날처럼 사세요, 그러면 언젠가는 당신은 가장 확실하게 내가 옳았어”와 같은 인용문을 읽게 되었습니다. 제게는 인상적이었고, 그 이후로 지난 33년동안 저는 매일 아침 거울을 보면서 제 자신에게 “오늘이 내 생애 마지막 날이라면, 내가 오늘 하고자 하는 것을 하길 원하는가?”라고 자문합니다. 그리고 연속으로 많은 날 동안 “아니오”라고 대답하게 될 때, 저는 무엇인가를 바꾸어야 할 필요가 있음을 압니다.

곧 죽게 될꺼라는 것을 기억하는 가장 중요한 즉 제가 삶에서 큰(중요한) 선택을 하도록 돕는 우연하게 마주친 도구입니다. 왜냐하면 거의 모든 것 - 외부적인 기대들, 자신감, 창피함 또는 실패의 두려움- 이런 것들은 죽음의 면전에서 진실로 중요한 것만 남긴 채 사라져 버리고 맙니다. 곧 죽게 될꺼라는 것을 기억하는 것은 여러분이 뭔가를 잃게 될꺼라는 생각의 덫을 피하게 하는 제가 아는 최선의 방법입니다. 여러분은 이미 벌거벗었고, 마음을 따르지 않을 이유가 없습니다.

1년전쯤, 저는 암 진단을 받았습니다. 저는 오전 7:30에 정밀조사를 받았고, 분명하게 췌장에 종양이 있음을 확인했습니다. 저는 심지어 췌장이 무엇인지도 알지 못했습니다. 의사들은 제게 이것은 치료할 수 없는 형태의 암이라는 것을 말해줬고, 저는 3개월에서 6개월 정도 살 수 있음을 기대해야 했습니다. 제 의사는 집에 돌아가서 일들을 정리하라고 조언했고, 그것이 의사의 죽음에 대한 준비절차였습니다. “그렇게하는 것은 단지 수개월내에 제가 앞으로 10년동안 자녀들에게 하려고 했던 모든 것을 해야 하는 것을 의미합니다. 모든 것을 완벽하게(아래에서 위까지)해서 가족에게 가능한 쉬운 것이 되게 하는 것을 의미합니다.

저는 그런 진단을 받고 하루종일 보냈습니다. 그날 저녁 저는 검사를 했습니다. 즉 목으로 들어가서 위를 통해서 창자속으로 들어가는 내시경을 했습니다. 제 췌장에 바늘을 넣어서 종양으로부터 세포 몇개를 취했습니다. 저는 차분했지만 함께 있던 아내는 의사들이 현미경으로 세포를 검사하면서 소리치기 시작했다고 제게 말했습니다. 왜냐하면 이것은 수술로 치료가 가능한 아주 특이한 형태의 췌장암으로 판명되었기 때문입니다. 저는 수술을 받았고, 현재 건강합니다.

이것이 제가 죽음에 직면했던 가장 가까운 것이었고, 이것이 앞으로 수십 년 동안 가장 가까웠던 것이기를 바랍니다. 이 일을 통해서, 저는 현재 여러분께 죽음은 유용한 것이지만, 순수하게 지적 개념이었을 때보다 좀더 확실하게 말할 수 있습니다. 누구도 죽기를 원치 않습니다. 심지어 천국을 가길 원하는 사람조차도 죽어서 그곳에 도달하길 원치 않습니다. 하지만 죽음은 우리 모두가 공유할 최종 목적지입니다. 누구도 비켜갈 수 없습니다. 또 그렇게 되어야 합니다. 왜냐하면 죽음은 삶의 유일한 최고 발명품이기 때문입니다. 그것은 삶을 변화시키는 대리인입니다. 그것은 새로운 것들을 위해 길을 만들기 위해 오래된 것들을 치우는 것입니다. 바로 지금 새로운 것은 여러분입니다. 그렇지만 현재로부터 멀지 않은 어느날 여러분은 점차 오래된 것이 되어 치워지게 될 것입니다. 너무 극적인 것 같아 미안하지만 완전한 사실입니다.

여러분의 시간은 제한되어있습니다. 그래서 다른 어떤 사람의 삶을 사는 것처럼 시간을 낭비하지 마세요. 다른 사람들의 생각의 결과로 살아가는 독단에 빠지지 마세요. 내면의 소리를 소멸시키는 다른 사람들의 의견을 허락하지 마세요. 그리고 무엇보다 중요한 것, 여러분의 마음과 직관을 따르는 용기를 가지세요. 여러분은 이미 어느 정도 여러분이 진정 되고 싶어 하는 것이 무엇인지 알고 있습니다. 그 외의 것은 부차적인 것입니다.

제가 어렸을 대 “The Whole Earth Catalog"라고 불리던 놀라운 출판물이 있었습니다. 그것은 우리세대에 바이블과 같았습니다. 그 출판물은 여기서 멀지 않은 Menlo park의 Stewart Brand라는 분에 의해 창조되었습니다. 그리고 그는 거기에 그의 시적인 솜씨를 더해 생명을 불어넣었습니다. 이때는 개인용 컴퓨터와 데스크탑으로 출판되기 이전인 1960년대 후반이었습니다. 출판물은 타자기, 가위, 폴라로이드 카메라로 모두 만들어졌습니다. 이것은 종이 형태로 만들어진, 구글이 사용되기 35년 전의 종이형태의 구글이었습니다. 이상적이었고 간결한 도구와 위대한 개념들이 흘러넘쳤습니다.

스튜터트와 그의 팀은 “The Whole Earth Catalog"를 수차례 발행했고, 그 과정을 개설하면서 최종본을 발행했습니다. 그 때가 1970년대 중반이었고 저는 여러분의 나이였습니다. 그 최종본의 뒤쪽 커버에는 이른아침 시골 길 사진이 있었고, 만약 당신이 모험심이 강했더라면, 히치하이킹하는 당신 자신을 발견했을지도 모릅니다. 그 그림 아래에 ”배고픈 채로, 어리석은 채로 머물라“라는 구절이 있었습니다. 이것이 그들이 발행을 마치면서한 고별 메시지였습니다. 그리고 저는 항상 내 스스로를 그렇게 되길 바랬습니다. 그리고 현재 졸업으로 새롭게 시작하는 여러분이 그렇게 되길 바랍니다.

Stay hungry, Stay foolish.

이 연설문에 대한 네티즌의 반응
:::
2008/09/22 13:48

Apple, Object C, C# 채널 추가

Apple, Object C, C# 관련 채널을 추가했습니다.
트랙백 주소는 다음과 같습니다.

  * http://teamblog.joinc.co.kr/CApple/trackback/1
  * http://teamblog.joinc.co.kr/CObjectC/trackback/1
  * http://teamblog.joinc.co.kr/Cshap/trackback/1

alone님이 이들 주제에 관심이 많은 것 같아요. 좋은글 많이 부탁드릴께요.
:::
2008/09/18 10:46

기술혁신에 대한 미신

미신은 근대이전 주술시절에만 있었던게 아니다. 21C 정보화시대에도 엄연히 미신은 존재한다. 기술혁신,시장,자본에 대한 맹신이 그것이다.

기술혁신이라는게 항상 좋은말이 아니다. 일반적으로는 좋은말이 될 수도 있겠지만 특히 지금과 같은 정글자본주의에서는 일상적으로 좋지 않은 말이 될 수도 있다.

현재의 자본주의는 무조건 성장을 해야만 유지되는 체제다. 무조건 성장을 할려고 하니, - 쓸데없는 - 소비를 계속 늘려야 하고, 계속 경쟁시켜야 하고 그러기 위해서 기술혁신을 해야만 한다.

그런데, 말이 기술혁신이지 물리적인 한계가 명확하다. 그렇다고 기술혁신을 멈출수는 없다. 성장을 못하면 죽음이다. 호랑이등에 올라탄 셈이다.

물리적 기술혁신, 그러니까 실질적인 기술혁신에 한계가 보이자 만들어내는 것이 트랜드 즉 유행이다. 원래 유행이라고 하는 것은 기술혁신에 따라서 제품의 내구도가 높아짐에 따라 만들어진 거다. 제품의 내구도가 높아지면, 그만큼 소비를 하지 않게 될 건데 이는 성장을 하지 않으면 몰락하는 자본의 입장에서는 커다란 문제가 된다. 그래서 유행을 만들었다. 이 유행은 실질적인 내구도가 아닌 심리적 내구도를 떨어트리는 효과를 일으킨다. 충분히 제품을 사용할 수 있음에도 불구하고 색깔이 약간 바뀌어서, 1g쯤 가벼워져서, 수 cm쯤 화면이 넓어져서 기존 제품을 폐기처분하고 새로운 제품을 소비하도록 하는 전략이다.

새로운 제품이 나올적마다 그 난리를 치는 ipod를 보자. 항상 기술의 혁명이라고 하면서, 이 제품을 접하지 못하면 시대에 뒤떨어질 것처럼 선전한다. 그러나 기술혁신의 내용이라는게 대게가 모서리를 약간 둥글게 하기, 0.1g 쯤 가볍게 하기, 1mm 쯤 얇게 하기, (이미 만들어져 있던)운영체제의 아이콘 재배치등 사실은 별 쓸모도 없는 것에 사람을 열광하게 만들어서 소비를 시킨다.

이러한 전략이 얼마나 성공적으로 사람들에게 침투했는지는 지름신이라는 용어의 해석에서 찾아볼 수 있다. 지름신이 원래적으로 의미하는 바는 유행을 쫓는다는 이유로 사실은 별 쓸모없는 제품을 구입하는 소비행태를 가리키는 말이다. 그런데, 이게 오히려 트랜드를 앞서가는, 디지털 선각자인 것처럼 해석 되어지고 있다. 내돈이니 내가 뭘하든지 상관없지 라고 생각할 수도 있겠지만 자본의 이익을 위해서 노리개 처럼 놀아나는게 아닌지 생각해볼 필요가 있다.

특히 소프트웨어쪽은 더 빠른 기술혁신이 요구되어 진다. 개발자는 기술혁신 이라는 미명하에 끊임없이 경쟁에 몰리게 된다. 다른 말로 쥐어 짜인다고 한다. 사이클이 압축이 된다는 얘기다. 그러니까 정상적인 상태라면 50중반쯤까지 생명유지가 될걸, 서른중반에 몽땅 빨려서 닭을 튀겨야 할런지 아니면 백수가 되어야 할건지를 고민하게 만들어준다는 거다. 즉 폐기처분된다는 거다.

많은 개발자들이 신기술이라는 것에 짓눌리면서 스트레스를 받아가며 살아가고 있다. 그러나 기술에 뒤쳐질까봐 바들바들 떨면서, 그걸 따라잡을려고 발악을 한들 오히려 그게 자신의 목을 스스로 죄는 행위가 되지 않을까. 조금만 여유를 가지고 살펴보면 사실 기술이라는게 그렇게 빨리 변하는게 아니라는걸 알 수 있다. ipod의 기술혁신이 그런 것처럼 대부분의 것은 성장사이클을 유지하기 위해서 쓸데없이 부풀려진 쓸데없는 것들이란 거다.

이 기술 따라잡지 못하면 도태될거라면서 나왔던 그 수많은 기술들에 대해서 곰곰히 생각해보자. 90%는 지금은 아예 거론조차되지 않는 기술이거나 이름만 살짝 바꾼 버려진 짝퉁기술들이지 않는가.

스티븐 잡스를 프리젠테이션의 천재라고 한다. 서점에 가면 스티븐잡스의 환상적인 프리젠테이션 기법을 전수한다는 책도 찾아볼 수 있다. 뒤집어서 생각해보면, 이것은 즉 말빨로 제품을 팔아먹는 다는 것을 스스로 인정함을 의미할 것이다. 어차피 트랜드라는게 그런것 아닌가.

눈에 보이는 변화에 목메다가 결국 몇년후에 그 변화를 따라잡지 못하게 되고, 뒤돌아봤더니 내실도 쌓지 못한채 폐기처분 대상이되는 상황. 누구도 바라지 않겠지만 우리 스스로 그렇게 만들고 있지 않은가.

물론 우리는 자본주의 그것도 미국따라식 정글자본주의 사회에 내던져져 있고, 현실은 냉혹한 것이니 저런생각을 한들 세상이 당장 바뀔리는 없을 것이다. 그러나 현실이 그러해서 현실을 바꿀 수 없다고 치더라도 이를테면 내가 노예의 상태에 놓여있는건 아닌지하는 정도의 고민을 할 수 있는 의식은 챙겨두어야 되지 싶다. 그래야 선거라도 제대로 해낼 수 있을 것아닌가. 혹은 공동의 힘을 키우기 위한 노동운동등에 조금이라고 관심을 기울일 수도 있을 것이고.

성장, 신기술, 기술혁신, 발전, 시장, 자본 이런것들에 대해서 다시한번 진지하게 생각해봐야 되지 않을까.
:::
2008/09/10 19:43

팀블로그용 RSS수집기 제작


예전에 RSS 리더기를 직접 만들어볼까 생각을 했었는데, 귀차니즘으로 포기하고 걍 있는거 가져다 쓰기로 했다.

사용 목적은 [http]팀블로그에 등록된 blog RSS를 가져오기 위함이다. 기존에 사용하던 planetplanet를 대체하기 위한 이유도 있다. 이거 너무 느린데다가 CPU를 무진장 잡아먹는다.

이왕이면 php로 작성된 걸 찾기를 원했는데, 이유는 다음과 같다.
  • 익숙한데다가
  • 스크립팅 언어라서 수정하기 쉽고
  • mysql 데이터베이스에 접근하기 좋다.
  • 덤으로 작성된 코드는 HTTP 프로토콜을 이용해서 실행시킬 수 있기 때문
  • php가 더러워서 안쓴다는 사람들도 봤는데, 해야될 일을 잘 해낼 수 있으면 끝.

구글님에게 php rss reader로 된 녀석을 찾아내놔라고 했더니, 첫 줄에 http://magpierss.source.net을 던져주더라. 구글을 믿고, 이걸 사용하기로 했다.

사용도 무지 간단하다. 그냥 압축풀고 HTTP호출했더니 끝이다. 다음은 핵심코드다. 필요없는 부분은 다 제거했다.
require_once('magpierss/rss_fetch.inc'); 

// $TeamUser 에는 팀블로그에 등록된 블로그 사이트의 정보들이 들어가 있다.
while(list($name, $url)=each($TeamUser))
{
// fetch_rss 한번 호출로 끝
$rss = fetch_rss($url);
$ctime = time();

// rss중에서 items의 정보를 가져오기로 했다.
// title, id, desc, 작성일 등등을 가져왔다.
foreach ($rss->items as $item)
{
$title = mysql_escape_string($item[title]);
$id = $item[link];
$desc = mysql_escape_string($item[description]);
$pubdate = $item[pubdate];
// 위에서 얻어온 정보를 이용해서 Query를 만들어서
// DB에 저장하면 끝이다.
}
}

이제 wget을 이용해서 위 스크립트를 포함한 페이지를 호출하는 방식으로 테스트를 해보았다.
# wget http://teamblog.joinc.co.kr/reader.php -O /dev/null 
오오. 잘되다.

마지막으로 crontab에 등록시키는 걸로 작업을 완료했다.
10 * * * * wget http://teamblog.joinc.co.kr/reader.php -O /dev/null 
매시 10분마다 rss 데이터를 읽어오도록 했다.

RSS 정보를 DB까지 쌓는 과정은 대략 다음과 같다. 기록차원에서 정리했다.
                 |   JOINC               MYSQL 
+-------+ HTTP | +------------+ +--------------------+
| wget |-------|->| reader.php |<-----| TeamBlog User Info |
+-------+ | | |---+ +--------------------+
| +------------+ | +-----------+
| +->| RSS Data |
| +-----------+
:::
2008/08/30 16:50

속도는 프로그래머의 미덕인가.

빨리 빨리

스피드가 미덕인 세계에 살고 있다. 좀더 빨리, 더 많이.. 경쟁에서 살아남기 위해서는 당연히 그래야 하는 것처럼, 그려러니 하고 받아들이고 있다. 프로그래머 역시 마찬가지다. 그렇지만 과연 프로그래머에게 있어서 스피드는 미덕인가.

처음 위키와 블로그를 봤을 때 좀 생뚱 맞았다. 이거 게시판이잖아!!. 게시판이랑 다른게 뭐지 ? 위키는 같이 편집가능한 게시판이고, 블로그는 뭐 댓글달 수 있는 게시판이네..!?

마찬가지로 린소프트웨어 개발 방법론이니, 애자일 방법론이니 봤을적에도 그랬다. 이거 뭐 뭔가 대단한게 있을 줄 알았더니, 이미 다 알고 있는 것들이잖아. 페어 프로그래밍? 이거 우리도 가끔하는 거고, 빠른 의사소통과 결정을 위한 회사문화 만드는거, 그것도 대충알고 있는 것들이고 말이지. 그런가 하면 web2.0도 그렇다. 거품이 끼였다는 얘기도 들리고, 가만히 보면 이미 다 알고 있는 것들이다.

나뿐 아니라 많은 사람들이 이렇게 생각하고 있을 거다. 그거 기존에 있는거, 이리저리 짜맞춰서 영업하기 좋게 포장한것일 뿐..이라고. 별거 아니라고. 때때로 포장의 달인이라고 평가절하하기도 한다.

근데, 정말 개념인이야 말로 기존의 다른 객체의 특징을 끄집어내어서 새로운 개념을 만들어 내는 얘들이라는 생각이 든다. 의미를 부여할줄 아는 능력을 지녔다고나 할까. 내가 그의 이름을 불러줬을 때, 그는 나에게로 와 꽃이되었다.. 라는 시도 있잖은가.

우리들의 문제점은 뭐냐면, 외연의 확장에 너무 집착한다는 것에 있지 않을까. 게시판을 예로 든다면, 게시판 나오니까 하는 것이 게시판의 외연을 확대시키는 일, 그러니까 다중 파일첨부가능하게 하고, 예쁜 템플릿 적용 기능이라든지, 겉모습을 화려하게 한다든지, 필터링기능을 집어 넣는다든지 하는 것들이다.

그동안 쟤네들은 게시판의 내연을 확장 시키는 것에 관심을 둔다. 커뮤니케이션 툴로써 게시판이 가지는 장점과 단점 여기에 커뮤니케이과 기저에 깔린 문화 자체에 대한 고찰을 하고, 그 결과로 위키와 블로그를 만들어낸다. 위키를 내가 처음 본게 한 7년전인 2001년 쯤이였던듯 싶다. 그때는 위키에 대한 아이디어와 이걸 구현한 프로토타입의 php로된 간단한 시스템이 하나 있었을 뿐이다. 이거 보고 정말 할일 없는 얘들이네라 고 생각했는데.. 왠걸.. 지금은 하나의 "문화"가 되어 버렸다. 그때 봤던 위키시스템이 모인위키였던 것으로 기억한다. 매우 초기버전이였다. 정말 촌스러운 시스템이였다. 블로그도 마찬가지이지, 우리가 게시판 기능확장하는데 주력하고 있을때, 얘들은 블로그를 만들었고 블로그와 위키는 하나의 문화가 되어버렸다.

개발방법론들 역시 마찬가지이지. 문화를 만드는건 걔들이고, 우리는 도입해서 사용하거나, 외연을 확대하는데 집중한다.

이렇게 된 이유는 성과지상주의, 인문학에 대한 잘못된 인식, 학문의 수단화이 기 때문으로 생각된다. 이들을 수단으로 해서 얻으려고 하는 것은 경쟁에서의 승리. 배움은 경쟁에서 싸워이기기 위한 수단이 된다. 경쟁의 도구가 되면 외연에 집중하기 마련이다. 암컷을 차지하기 위한 싸움에서 자신의 겉모습을 크게 보이는 전술은 동물의 세계에서 흔히 볼 수 있다.

인문학이 중요한 이유는 외부의 정보를 받아들여서 이걸 자기내면화 할 수 있는 "틀"을 만들어주는데 있을 것이다. 예컨데 사유하는 능력, 그래서 자기것으로 만들어주게 한다고나 할까 그런거지. 이게 없이 정보(텍스트)를 받아들이면, 이건 텍스트를 소비하는 것일 뿐. 그냥 메신저가 되는거지. OECD 국가들가운데, 국어로된 전문해독능력이 제일 떨어진다는 평가를 받는게 우리나라다. 때때로 우리에게 필요한건 전문지식이 아닌 인문/사회/역사/철학 지식이 아닐까라는 생각이 든다.

국민의 90%가 대학을 나오고, 80%가 토익 900이상- 좀 과장해서 -, OECD 국가중 가장 많은 시간을 일하는 민족, 중학생들 조차도 자정이 훌쩍 넘어서 퇴근 - 사실 이정도면 교육이 아니고 노동이지 - 할정도로 근면 성실한 앨리트로 뭉쳐진 국가인데, 문서해독능력이 떨어지다니.. 텍스트를 시간을 그냥 소비하기 때문아닐까. 대학이 수단이 되어버려서, 논술같은 생각하는 힘을 길러주는 요런거까지 소비대상이 되어버리고, 영어도 마찬가지고, 수학, 과학 뭐 다 마찬가지고.

그러다보니, 더 빠른 소비가 중요하게 되었다는 말씀인데, 문제는 이게 우리의 생활을 오히려 힘들게 만들고 있다. 요즘은 새로운 기술이 너무 빠르게 나와서 말이지.. 30만 넘어도 젊은 얘들을 따라갈 수가 없어라는 말을 어렵잖게 들을 수 있다.

스피드라는 관점에서 보면 당연히 그렇다. 스피드는 물리적 한계가 비교적 명확하다. 또한 스피드 경쟁은 군비경쟁으로 흐르는 경향이 있는데, 이러한 군비경쟁에 뛰어든 사람들은 당연히 고달픈 생활을 할 수 밖에 없다. 40대가 20대와 스피드 경쟁을 할려고 하면 좌절할 수 밖에.

경쟁에서 이길려고, 열라 노력해서 아놀드 슈왈츠 제너거 근력만들어봤자. 또다른 아놀드 슈왈츠 제너거랑 경쟁해야 되는 거거든.

자고로 프로그래머는 게을러야 한다라는 얘기가 헛 얘기가 아닌거 같더라는 생각이 든다. 프로그래머도 책도좀 읽고, 정신도 맑게 그렇게 느긋하게 세상을 살아가야 되지 않을까 싶다. 돌아가는게 빨리가는 거란 얘기도 있잖은가. 행복하기 위해선 게을러져야 한다는 얘기는 프로그래머에게만이 아닌 모두에게 해당되는 얘기가 될 것이다.

무엇을 위한 바쁨인가. 무엇을 위한 경쟁인가. 무엇을 위한 소비인가...

:::
2008/08/27 16:11

운영체제별 학습 분위기

study_OS.jpg
윈도우즈 : 교통사고로 쓰러질 수 있음
리눅스 : 쓸만하지만 지겨움
OSX : 예쁘지만 그다지 쓸모가..
FreeBSD : 넘 조용해서 눈에 띄지 않음.
:::
2008/08/25 18:10

미국 엔지니어의 가치변화

출처 : http://www.spectrum.ieee.org/aug08/6491

dataf1.gif

지속적인성장 가능한 산업이라는 것에 대한 비판적인 시각이 있는건 분명한 사실이고, 새로운 산업화의 방향이 올바른 것인가에 대한 의문이 제기되고 있는 것도 사실이다. 개인적으로도 지속적인성장모델이라는 것에 대해서 회의적인 시각을 가지고 있다. 한정된 자원을 가진 지구라는 생태계를 지켜내기 위해서는, 지속적으로 자원을 소비해서 성장을 하겠다는 소비적인 마인드를 반영한 산업형태가 아닌 다른 무언가가 필요하지 않을까 하는게 내 생각이다. 많이 소비하는게 진보이자 발전이라는 마인드에서, 필요한 만큼만 덜어쓴다라는 마인드로의 변화.

미국은 새로운 성장동력 새로운 산업의 방향을 찾기 위해서 노력하는 것으로 보인다. 비단 미국의 경우에 국한된건 아닐 것이다. 소위 선진국진 입 혹은 유지를 목표로 하는 국가들이 모두 이러한 노력들을 보이고 있다. 이들의 방향이 그리 올바른 것으로 보이지는 않지만, 여하튼지간에 지금의 산업구조를 바꾸기 위해서 노력하고 있는 것은 분명해 보인다. 기존에는 거의 무시하던, 환경, 생태, 건강에 더 많은 고려를 할려고 한다는게 그 증거일 것이다.

위의 도표는 이러한 노력을 반영하고 있는 것으로 보인다. 대략 검색엔진, 생명공학, 모바일기기, 연료전지, 태양에너지, 영화산업등의 발달로 인하여 엔지니어의 급여상황이 좋아졌음을 보여주고 있다.

반대로 우리나라는 정보통신부가 사라지고, 그와 함께 예산도 20% 가량 대량 삭감되었다. 그대신에 70-80년대나 써먹을 수 있음직한 대규모 토목공사를 국가 성장동력으로 삼은 것으로 보인다. 공구리 마인드.. 그나마도 건전한 삽질이 아닌, 투기를 위한 삽질. 21C 정보화시대에 19C형 뉴딜정책의 추진. 2MB와 그의 정보는 우리의 성장동력이 결국 건설업이라고 생각한 것인가. 환경,생태,건강 따위는 집어던져버리신것 같다.
:::