pchero on 4월 18th, 2012

 

리눅스/유닉스 환경에서 디렉토리 압축을 할 때, 특정 디렉토리를 제외하고 압축을 해야하는 경우가 있다.

흔히 로그 디렉토리같은 경우는 용량이 커서 압축시 제외를 해야하는데 이럴때는 다음과 같이 사용하면 된다.

 

eclipse 디렉토리에 다음과 같이 구조되어 있다고 보자.

jonathan@jonathan-laptop:~$ ls -l eclipse/
total 684
-rw-r–r–  1 jonathan jonathan  18909 2011-02-10 12:31 about.html
drwxr-sr-x  2 jonathan jonathan   4096 2011-09-28 14:03 about_files
-rw-rw-r–  1 jonathan jonathan 186294 2012-03-29 17:57 artifacts.xml
drwxrwsr-x 10 jonathan jonathan   4096 2012-04-16 13:24 configuration
drwxrwsr-x  2 jonathan jonathan   4096 2010-09-17 16:37 dropins
-rwxr-xr-x  1 jonathan jonathan  63001 2010-10-19 13:44 eclipse
-rw-rw-r–  1 jonathan jonathan    426 2012-03-29 17:57 eclipse.ini
-rw-r–r–  1 jonathan jonathan  16536 2005-02-25 18:53 epl-v10.html
drwxrwsr-x 80 jonathan jonathan  16384 2012-03-29 17:57 features
-rw-r–r–  1 jonathan jonathan   9022 2006-12-11 11:04 icon.xpm
-rwxr-xr-x  1 jonathan jonathan 266168 2006-12-11 11:04 libcairo-swt.so
-rw-r–r–  1 jonathan jonathan   9051 2010-04-27 15:23 notice.html
drwxrwsr-x  5 jonathan jonathan   4096 2010-09-17 16:35 p2
drwxrwsr-x 29 jonathan jonathan  69632 2012-03-29 17:57 plugins
drwxr-sr-x  2 jonathan jonathan   4096 2011-09-28 14:03 readme

이중, p2, plugins, readme 디렉토리를 제외하고 압축을 시도해 보자.
다음과 같이 입력한다.

tar cvfz test.tar.gz eclipse –exclude=eclipse/p2 –exclude=eclipse/plugins –exclude=eclipse/readme

 

pchero on 4월 13th, 2012

IBM Unix AIX  메뉴얼

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp

사내에서 사용하는 SVN 을 이전해서 새로이 kdesvn 설정을 맞추던 중 아래의 에러가 나타났다.

 SSL handshake failed: SSL error: Key usage violation in certificate has been detected.

Virtual Box 에서 사용하는 Windows 의 TortoiseSVN 은 정상으로 접속이 되는데.. 유독 KDESVN 만 접속이 안되는 것이 마음에 걸려 해결방법을 찾아 보았다.

아래의 사이트에서 해결방법을 찾을 수 있었다.

http://andrewbrobinson.com/2011/11/01/fixing-ssl-handshake-failed-ssl-error-key-usage-violation-in-certificate-has-been-detected-error-on-svn-checkout/

kdesvn 에서 사용하는 SSL/TLS 관련 라이브러리 문제로 발생되는 문제였다.

기존에 사용하던 SSL/TLS 관련 라이브러리를 옮겨주고, 새롭게 설치한 SSL/TLS 라이브러리를 심볼링 링크로 걸어주면 문제는 해결된다.

$ sudo apt-get install libneon27
$ sudo mv /usr/lib/libneon-gnutls.so.27 /usr/lib/libneon-gnutls.so.27.old
$ sudo ln -s /usr/lib/libneon.so.27 /usr/lib/libneon-gnutls.so.27

 

컴파일 도중 아래의 에러를 발견했다.

TuSelector.cxx:220:16: error: ‘INT_MAX’ was not declared in this scope
TuSelector.cxx:222:1: warning: control reaches end of non-void function

해당 파일에 다음의 헤더파일을 추가하면 된다.

#include <climits>

 

pchero on 4월 2nd, 2012

오픈소스 컴파일 중, 다음과 같은 에러 메시지를 발견했다.

error: ‘EOF’ was not declared in this scope

make[1]: Entering directory `/home/jonathan/workspace/13.CIDS/CIDSSip/SipLibrary/resiprocate-1.6/rutil’
g++         -march=i686 -D_REENTRANT  -g  -Wall  -I.. -I../build/../contrib/ares -DOS_MAJOR_VER=2 -DOS_MINOR_VER=6 -DOS_POINT_VER=38-13-generic-pae -DOS_PATCH_VER=0 -DRESIP_OSTYPE_LINUX -DRESIP_ARCH_I686 -DRESIP_LARCH_IA32 -DRESIP_TOOLCHAIN_GNU -DUSE_ARES -c -o obj.debug.Linux.i686/SysLogBuf.o SysLogBuf.cxx
SysLogBuf.cxx: In member function ‘virtual int resip::SysLogBuf::overflow(int)’:
SysLogBuf.cxx:39:13: error: ‘EOF’ was not declared in this scope
make[1]: *** [obj.debug.Linux.i686/SysLogBuf.o] Error 1
make[1]: Leaving directory `/home/jonathan/workspace/13.CIDS/CIDSSip/SipLibrary/resiprocate-1.6/rutil’
make: *** [rutil] Error 2

이에 대한 해결법은 아래의 링크에서 찾을 수 있었다.

http://code.google.com/p/o3d/issues/detail?id=87

문제 해결은 간단하다. 해당 소스 파일에 아래의 헤더파일을 추가하도록 명시해주면 된다.

#include <cstdio>

 

Linux/Unix 에서 ps 명령어를 리다이렉트로 사용하는 경우가 많다.

ps -ef > test.txt

이 명령이 평소에는 잘 먹다가도 특정 시스템에서는 잘 안되는 현상이 있다. 주로 Unix에서 발생하며 오래된 버전의 Linux 에서도 같은 현상이 나타난다. 증상은 명령어 결과 최초 80 바이트만 Redirect 되는 현상이다.

이는 다음의 옵션을 통해 해결할 수 있다.

ps 명령어 입력 때, w 옵션을 추가로 넣어주면 해결된다.

 ps -efw

출처 : http://www.unix.com/unix-advanced-expert-users/33429-who-truncates-output-redirection-tty-bug.html

 

pchero on 3월 13th, 2012

얼랭 설치하기

Ubuntu의 경우..

sudo apt-get install erlang

 

셸 시작하기

터미널 창에서 erl 이라고 입력하고 얼랭을 시작하자.

$ erl

jonathan@jonathan-laptop:~$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 20 + 30.
50
2>

 

간단한 정수 연산

jonathan@jonathan-laptop:~$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 2 + 3 * 4.
14
2> (2 + 3) * 4.
20
3> 123456789 * 987654321 * 112233445566778899 * 998877665544332211.
13669560260321809985966198898925761696613427909935341
4> 16#cafe * 32#sugar.
1577682511434
5>

 

변수

어떤 명령의 결과를 저장하여 나중에 사용하려면 어떻게 할까? 그게 바로 변수의 역할이다.

1> X = 123456789.
123456789

- 모든 변수는 대문자로 시작해야 한다.

어떤 변수의 값을 보려면, 그냥 그 변수명을 입력하면 된다.

2> X.
123456789

만약, 변수 X 에 다른 값을 할당하려 한다면 오류 메시지를 발견할 것이다.

1> X = 1234567.
1234567
2> X = 890.
** exception error: no match of right hand side value 890

이는 다음의 이유에서 발생하는 오류이다.
- 첫째, X는 변수가 아니다. 적어도 자바나 C 같은 언어에서 쓰는 의미의 변수로 생각해서는 안된다.
- 둘째, = 은 할당 연산자가 아니다.

 

뭔가 잘못되어 시스템이 응답이 없다면, 그냥 Ctrl+C 를 누르자.

BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution

와 같이 나타날 것이다.
A를 누르면 얼랭 세션을 중단할 수 있다.

 

뜻하지 않는 변수

얼랭은 ‘단일 할당 변수(single assignment variable)’를 가진다. 그 이름이 의미하는 듯, 단일 할당 변수는 값을 오직 한 번만 받을 수 있다. 일단 한번 설정된 변수의 값을 변경하려고 하면 오류가 발생한다.

값이 할당된 변수를 ‘바운드(bound)’ 변수라 부르며, 그렇지 않은 변수는 ‘언바운드(unbound)’ 변수라 부른다. 모든 변수는 언바운드에서 시작한다. 그러나 일단 값을 담으면, 영원히 그 값을 보유한다.

변수의 범위(scope)란 그 변수가 정의된 어휘 단위(lexical unit)를 말한다. 따라서 만약 X가 어떤 단일 함수 절 내에서 사용되면, 그 변수의 값은 절 밖으로 나가지 못한다. 동일한 함수에서 여러 다른 절들이 공유하는 그런 전역(global) 또는 프라이빗(private) 변수 같은 것은 없다.

 

패턴 매칭

대부분의 언어에서 =은 할당문을 나타낸다. 그러나 얼랭에서 =는 패턴 매칭 연산을 뜻한다. Lhs = Rhs 가 진짜로 의미하는 바는 오른쪽(Rhs)를 계산한 다음, 그 결과를 왼쪽(Lhs)에 있는 패턴과 매치하라는 뜻이다.

 

부동 소수점 수

부동 소수점 수는 소수점에 이어 적어도 하나의 소수가 와야 한다. 정수 두 개를 ‘/’로 나누면 그 결과는 자동으로 부동 소수점 수로 변환된다.

 

애텀

얼랭에서 애텀(Atom)은 수치가 아닌 상이한 불변 값을 나타내는 데 사용한다.

얼랭에서 애텀은 전역(global)이며, 또한 매크로 정의나 인클루드 파일을 사용하지 않고도 그 목적을 달성할 수 있다.
애텀은 소문자로 시작하고 그 뒤로 일련의 알파뉴머릭(alphanumeric)문자나 언더스코어(_) 또는 at(@) 기호가 온다.

애텀은 작은 따옴표(‘ ‘)로 묶을 수 있다. 인용 부호 형태를 사용하면 대문자로 시작하는 애텀(그러지 않으면 변수로 해석되었을 것이다)이나 또는 알파뉴머릭이 아닌 문자가 들어간 애텀을 만들 수 있다. 예를 들면, ‘Monday’, ‘Tuesday’, ‘+’, ‘*’, ‘an atom with spaces’ 와 같은 것들이다. 인용부호를 사용할 필요가 없는 애텀들도 묶을 수 있으며, 따라서 ‘a’는 a 와 정확히 똑같다.

애텀의 값은 애텀일 뿐이다. 그저 애텀인 명령을 주면 얼랭 셸은 그 애텀의 값을 출력할 것이다.

15> hi.
hi

애텀의 값 또는 정수의 값이라는 말이 다소 이상해 보일 수도 있다. 그렇지만 얼랭이 함수형 언어인 까닭에, 모든 식은 값을 가져야 한다. 아주 간단한 식인 정수와 애텀도 예외는 아니다.

 

 튜플

정해진 수의 항목을 하나의 개체로 그룹핑한다고 해보자. 이럴 때 튜플(Tuple)을 사용한다. 튜플은 여러분이 표현하고자 하는 값들을 중괄호로 둘러싸고 쉼표로 그 값들을 구분하면 된다.

튜플은 C의 구조체와 유사하다. 다른 점이라면 튜플은 익명이라는 것이다. 얼랭에는 형 선언이 없기 때문에, ‘점(point)’를 만들 때는 다음과 같이 작성하면 된다.

16> T = {10, 45}.
{10,45}
17> T .
{10,45}

이러면 튜플을 하나 생성하여 그것을 변수 P와 묶는다. 튜플의 필드는 이름이 없다. 튜플 그 자체는 그저 정수 한 쌍만 들어 있을 뿐이므로, 그게 어떤 용도로 사용되는지는 우리가 기억해야 한다. 튜플이 어디에 사용되는지 기억하기 쉽도록 하려고, 통상 튜플의 첫 번째 요소로 그 튜플이 무엇인지를 나타내는 애텀을 사용한다. 또한 튜플은 중첩될 수 있다.

 

튜플 생성하기

튜플은 선언할 때 자동으로 생성되고 더는 사용되지 않을 때 제거된다. 얼랭은 가비지 콜렉터(garbage collector)를 사용하여 사용되지 않는 모든 메모리를 수거하기 때문에 우리가 메모리 할당에 대해서 걱정할 필요는 없다.

새 튜플을 구성할 때 변수를 사용하면, 그 새 튜플은 변수가 참조하는 데이터 구조의 값을 공유할 것이다.

2> F = {firstName, jonathan}.
{firstName,jonathan}
3> L = {lastName, kim}.
{lastName,kim}
4> P = {person, F, L}.
{person,{firstName,jonathan},{lastName,kim}}

만약 정의되지 않은 변수로 데이터 구조를 생성하려 하면 오류가 날 것이다.

 

 튜플에서 값 추출하기

마치 할당문처럼 보이는 ‘=’는 얼랭에서는 할당문이 아니라 패턴 매칭 연산자이다. 사실, 패턴 매칭은 얼랭의 근본이며 많은 다양한 작업에서 사용된다. 패턴 매칭은 데이터 구조에서 값을 추출해내는 데도 사용되고, 함수 속의 제어 흐름이나, 병렬 프로그램에서 어떤 프로세스로 메시지를 보낼 때 어느 메시지가 처리되어야 하는지를 정하는 데도 사용된다.

튜플에서 어떤 값을 추출하려면, 패턴 매칭 연산자 ‘=’을 사용한다.

5> Point = {point, 10, 45}.
{point,10,45}
6> {point, X, Y} = Point.
{point,10,45}
7> X.
10
8> Y.
45

위의 예에서와 같이, 등호 표시의 양쪽에 있는 튜플은 요소의 개수가 같아야 하며, 양측의 대응되는 요소는 같은 값으로 바인드되어야 한다.

복잡한 튜플인 경우, 그 튜플과 똑같은 모양(구조)으로 된 패턴을 하나 만들고 그 패턴 속에서 사용자가 값을 추출하고자 하는 곳에 언바운드 변수를 둠으로써 값을 추출해낼 수 있다.

 

리스트

개수가 가변적인 무엇인가를 저장할 때는 리스트(List)를 사용한다. 리스트는 요소를 대괄호로 둘러싸고 쉼표로 요소들을 구분하여 만든다.

 

 리스트 – 용어

리스트의 첫째 요소를 그 리스트의 ‘헤드(head)’라고 부른다. 리스트에서 헤드를 제거했을 때, 남은 부분을 가리켜 그 리스트의 ‘꼬리(tail)’라고 부른다. 리스트의 헤드는 무엇이든 될 수 있지만, 꼬리는 통상적으로 리스트라는 점에 유의하자.

리스트의 헤드를 액세스하는 것은 매우 효율적인 연산이기 때문에 사실상 모든 리스트 처리 함수가 리스트의 헤드를 추출하는 것에서 시작한다. 리스트의 헤드에 대해 뭔가를 하고, 리스트의 꼬리를 처리하는 식이다.

 

 리스트 – 정의하기

T가 리스트이면, [H|T]도 리스트다. 헤드가 H이고 꼬리가 T인 리스트인 것이다. 세로막대 |는 리스트의 헤드와 꼬리를 구분한다. []는 빈 리스트이다.

[...|T] 생성자를 사용하여 리스트를 만들 때는 T가 리스트임을 보장해야 한다. 그러면 새 리스트는 적절한 형태가 될 것이다. 만약 T가 리스트가 아닐 경우, 그 새로운 리스트는 부적절한 리스트라 부른다. 대부분의 라이브러리 함수들은 리스트가 적절한 형태임을 가정하기 때문에 부적절한 리스트와는 작동하지 않는다.

 

 리스트 – 요소 추출하기

다른 모든 것과 마찬가지로, 리스트에서 요소를 추출하는 데도 패턴 매칭 연산을 사용할 수 있다.비어 있지 않은 리스트 L 이 있다면, 식 [X|Y] = L (이때 X와 Y는 언바운드 변수다)은 리스트의 헤드를 X에 그리고 리스트의 꼬리를 Y로 추출할 것이다.

 

 문자열

엄밀히 말하면, 얼랭에는 문자열이 없다. 문자열(string)은 실제로는 정수의 리스트일 따름이다. 문자열은 큰따옴표(“”)로 둘러싼다.
어떤 프로그래밍 언어에서는 문자열은 작은따옴표 또는 큰따옴표로 묶을 수 있지만 얼랭에서는 큰따옴표를 사용해야 한다.

셸에서 리스트의 값을 출력할 때는 리스트를 문자열로 출력하는데, 그건 오직 그 리스트 속에 있는 모든 정수가 출력 가능한 문자들을 나타내는 경우에 한해서다.

어떤 정수가 어떤 문자를 표현하는지 알 필요는 없다. 알아야 한다면, ‘달러 구문(dollar syntax)’을 사용하면 된다.

 

 문자열에서 사용하는 문자집합

문자열의 문자들은 Latin-1 (ISO-8859-1)문자 코드를 표현한다.

오라클에서 테이블에 설정된 칼럼의 내용을 확인하는 쿼리.

 

Select

table_name, column_name, data_type, nullable, data_length, column_id, owner

From

All_tab_columns

Where

table_name = ‘테이블명’

pchero on 12월 30th, 2011

내 마음 받아준 첫날… 처음으로 손잡고 포옹한날..
누나를 껴안을 때… 두근 대기보다는 오히려 편안했다.. 아니, 평화로웠다…

포옹을 할때의 누나의 손.. 누나의 얼굴.. 잊고 싶지 않다..

나보다 더 많은 고민을 했을텐데.. 내마음 받아준 그녀..
오늘을 평생 기억하고 싶다..

누나 손을 잡았을 때의 그 느낌, 그 떨림.. 그 기쁨..! 누나를 안았을때의 그 평화로웠던 가슴떨림..

언제고 힘든 날이 왔을 때 오늘을 기억하고 싶다.. 나보다 더 많은 고민을 하면서 나를 받아준 그녀를.. 슬프게 하고 싶지 않다..

순수한 마음으로 누나를 바라보고 또 바라봤던 오늘을 기억하고 싶다…

 

여행을 위한 준비

 

저녁 8시. 수열이가 올라왔다.
아직은 부족한 것이 많은 준비. 불안한 마음에 조금이라도 더 챙기기 위하여 근처 마트에 가기로 한다.

아직 회사에 계시는 모든 분들께 인사를 잘 다녀오겠다는 인사를 하고 퇴근을 한다.

수열이는 이제 막 도착한 상태.. 가져온 짐을 확인하고 마트에서 살 물품들을 정리한다.
이것을 살까, 저것을 살까… 내 눈에는 모든것이 필요해보인다.

조금이라도 더 챙겨가고 싶은 마음에 욕심이 난다. 쇼핑 카트가 점점 더 무거워진다.

전부 준비할 수는 없는데… 완벽할 수는 없는데..
지금 내게 필요한 것은 완벽한 준비가 아니라 지금의 상태에서 잘 버틸 수 있는 지혜일 것인데…
자꾸만 욕심이 난다.

그때 갑자기 울리는 휴대폰…
회사에서 오는 전화다. 급한 목소리다.

고객사에서 장애가 발생했다. 즉시 달려가서 처리해야 할 상황이다.
다급히 쇼핑을 끝내고 수열이를 집에 데려다주고 바로 회사로 가기로 한다.

하지만 곧이어 걸려온 전화. 일이 점점 심각해진다. 게다가 연달아 수신된 팀장님의 메시지 “부탁한다..”
도저히 집에까지 수열이를 데려다 줄 시간이 없다.
급히 휴대폰으로 약도와 가는 방법을 전송해주고 먼저 마트를 빠져나와 회사로 향한다.

마트에서 회사까지는 택시로 약 10여분.
그 10여분의 시간동안 여러가지 생각이 든다.

원래 내가 당연히 해야 할 일임에도 불구하고 드는 너무하다라는 생각.
살짝 야속한 생각이 든다.

하지만 생각은 잠시뿐, 회사에 도착해서 서둘러 상황을 파악하고 여러가지 테스트를 한다.
다행히 장애는 금방 처리되었다.

장애를 처리하고 회사를 나선 시간은 밤 10시 즈음.. 집으로 가서 수열이와 같이 늦은 저녁을 먹는다.

내일이면 이제 여행이 시작된다..

쉬이 잠이 오지 않는다.