2017년 12월 18일 월요일

Ubuntu 에 tightVNC Server 설치

일반적으로 Ubuntu Server 는 CUI 를 사용해서 관리를 한다.
(반드시 그래야 하는건 아니지만)

일반적으로 Ubuntu Desktop 은 GUI 를 사용해서 관리를 한다.
(반드시 그래야 하는건 아니지만)

Ubuntu 에 원격 컴퓨터에 설치되어 있는 경우,
ssh 를 통해 CUI 로 control 하면 된다.

문제는 원격으로 어떻게 GUI 를 control 하냐는 것이다.

Windows 에는 "윈도우 원격데스크탑" 이라는 control 프로그램이 있어서,
아주 편리하게 GUI 를 control 할 수 있다.

Ubuntu 에서는 VNC 라는 원격 control 프로그램이 있어서, 이것을 사용하면 된다.

※ 물론 예전에 포스팅한 것처럼 vcxsrv 를 사용하는 방법도 있다.
http://kimchki.blogspot.kr/2017/11/x-x-window-system-vcxsrv-windows-x.html

윈도우에서 리눅스로 접속을 할 것이므로,
일단 윈도우 버전을 다운로드 하고 설치 하자.
https://www.tightvnc.com


리눅스에서도 다운로드 하고 설치 하자
% sudo apt-get install tightvncserver

패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
제안하는 패키지:
  tightvnc-java
다음 새 패키지를 설치할 것입니다:
  tightvncserver
0개 업그레이드, 1개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.
633 k바이트 아카이브를 받아야 합니다.
이 작업 후 1,795 k바이트의 디스크 공간을 더 사용하게 됩니다.
받기:1 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 tightvncserver amd64 1.3.10-0ubuntu3 [633 kB]
내려받기 633 k바이트, 소요시간 2초 (255 k바이트/초)
Selecting previously unselected package tightvncserver.
(데이터베이스 읽는중 ...현재 213733개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack .../tightvncserver_1.3.10-0ubuntu3_amd64.deb ...
Unpacking tightvncserver (1.3.10-0ubuntu3) ...
Processing triggers for doc-base (0.10.7) ...
Processing 1 added doc-base file...
Processing triggers for man-db (2.7.5-1) ...
tightvncserver (1.3.10-0ubuntu3) 설정하는 중입니다 ...
update-alternatives: using /usr/bin/tightvncserver to provide /usr/bin/vncserver (vncserver) in auto mode
update-alternatives: using /usr/bin/Xtightvnc to provide /usr/bin/Xvnc (Xvnc) in auto mode
update-alternatives: using /usr/bin/tightvncpasswd to provide /usr/bin/vncpasswd (vncpasswd) in auto mode

설치가 다 되었다면, 이제 실행을 해 보자.
% tightvncserver

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is ubuntu:1

Creating default startup script /home/ck0911/.vnc/xstartup
Starting applications specified in /home/ck0911/.vnc/xstartup
Log file is /home/ck0911/.vnc/ubuntu:1.log

맨 처음 실행하는 것이라면, 암호를 설정하라고 뜬다.
암호는 vnc 에 로그인할때 사용하는 것이므로 알맞게 입력한다.
혹시 나중에 다시 암호를 변경할 수도 있다.
% tightvncpaswd

서버가 잘 실행되었는지 확인해 보자.
% ps -ef | grep vnc

tightvnc 를 실행했을 때, ubuntu:1
ps 를 실행했을 때, tightvnc:1
모두 숫자 1을 출력하는것을 볼 수 있다.
저 숫자 1을 기억해야 한다.
그래서 저 숫자 1에 해당하는 session 에 접속해야 한다.

그러면 session 을 여러개 띄울 수 있는것인가?
그렇다. tightvnc 를 다시 실행하면 session 을 여러개 띄어서
여러개의 가상 화면을 사용할 수 있다.

% tightvncserver

New 'X' desktop is ubuntu:2

Starting applications specified in /home/ck0911/.vnc/xstartup
Log file is /home/ck0911/.vnc/ubuntu:2.log

오~ 2번째 session 이 생성되었다.

아무튼, 일단 session 1 에 접속해 보자.
"IP주소:숫자" 형식으로 접속을 한다.


만약 접속이 안된다면, 포트가 막혀있는 것이다.


공유기 혹은 virtual box 같은 가상화를 사용하고 있다면,
반드시 포트 포워딩을 해줘야 한다.
사용하는 포트가 몇번인지 확인해 보자.
% netstat -nap

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      1336/Xtightvnc
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN      1485/Xtightvnc

1번 session 은 5901 포트를, 2번 session 은 5902 포트를,
사용하고 있다는걸 확인할 수 있다.
만약 7번 session 이 열려 있다면, 5907 포트를 사용하게 된다.

※ 6001 포트와 6002 포트도 열려있는걸 볼 수 있는데, 이건 뭐하는건지 잘 모르겠다.

포트 포워딩을 설정하고 다시 접속을 시도해 보자.
접속이 된다면 이렇게 맹~한 화면이 나올것이다.


접속은 되었지만, 인터페이스가 실행되지 않았기 때문이다.

리눅스는 여러종류의 인터페이스가 존재하고,
자신이 원하는것을 설치하고 사용할 수 있다.
KDE, MATE, GNOME 등등

일단 기본적으로 GNOME 을 기반으로 실행해 보자.
인터페이스를 설치하자.
% sudo apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

vnc session 에 접속했을 때, 인터페이스가 자동으로 실행되도록 해야 한다.
먼저 이미 실행되어 있는 session 을 닫는다.
% vncserver -kill :1

환경설정 파일을 수정하자.
% vi ~/.vnc/xstartup
맨 마지막 부분에 인터페이스를 추가 하자.

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

다시 실행하자.
% tightvncserver

다시 접속하자.


그러면 잘 뜨는걸 확인할 수 있다.
물론 GNOME 말고도 다른 인터페이스를 사용하려면,
환경설정 파일을 수정하면 된다.





출처
https://www.tightvnc.com
http://www.whatwant.com/840
http://glassylife.tistory.com/8

2017년 12월 14일 목요일

PostgreSQL 소스에서 EXEC_BACKEND 의 의미

PostgreSQL 소스를 분석하다 보면,
아래와 같이 분기 되어 있는 부분들의 꽤 존재한다.

#ifdef EXEC_BACKEND
.....
#endif

이 부분은 windows os 에 port 할때 필요한 부분으로,
만약 windows os 일 경우~ 라는 의미이다.

그러므로, windows os 이외일 경우에는 신경쓰지 않아도 된다.
configure 에 정의되어 있다.

if test "$PORTNAME" = "win32"; then
  CPPFLAGS="$CPPFLAGS -I$srcdir/src/include/port/win32 -DEXEC_BACKEND"
fi

2017년 12월 13일 수요일

PostgreSQL 여러개를 하나의 컴퓨터(machine) 에서 사용하기

종종 하나의 machine 에서 여러개의 PostgreSQL 을 사용해야 할 때가 있다.

machine 을 여러 사용자가 사용할 수도 있고,
혹은~
개인적으로 여러개의 PostgreSQL 을 띄우고 이것저것 작업을 할 수도 있기 때문이다.

아래 2가지 조건만 만족하면 N개의 PostgreSQL 을 실행 시킬 수 있다.
1. data 가 달라야 한다.
2. port 가 달라야 한다.

data 가 달라야 한다는 말은,
"pg_ctl start -D" 옵션에 넣는 경로가 달라야 한다는 말이다.
당연히, 하나의 data 에 여러개의 process 가 작업을 하면 안될테니 말이다.

port 가 달라야 한다는 말은,
tcp listen port 가 달라야 한다는 말이다.
당연히, 하나의 port 를 여러개의 process 가 listen 할 수는 없을테니 말이다.

기존에 있던 data 말고, 새로운 data 를 생성한다.
% initdb -D [NEW_DIRECTORY]

새로운 data 로 이동한다.
% cd [NEW_DIRECTORY]

port 를 변경한다.
% vi postgresql.conf

앞에 주석 # 을 삭제한 후, 5432 말고 다른 port 를 입력한다.
#port = 5432

서버를 시작한다.
% pg_ctl start -D [NEW_DIRECTORY] -l logfile

새로운 서버로 접속한다.
% psql -p [NEW_PORT]

위와 같은 방식을 사용하면, N개의 PostgreSQL 을 실행 시킬 수 있다.





참고
https://www.postgresql.org/docs/9.6/static/app-postgres.html

2017년 12월 12일 화요일

PostgreSQL 환경 변수

PostgreSQL 을 사용하다 보면, 매번 입력해야 하는 매개변수가 있다.
그것은 바로 database directory path 이다.

처음 database 를 생성할때,

% initdb -D postgresql/data

database 를 실행할때,

% pg_ctl start -D postgresql/data -l logfile

매번 입력을 해줘야 한다.

결론은?
번거롭다는거다.

다행히, PostgreSQL 은 이런 번거로움을 해결할 수 있는 방법이 있다.
environment 를 설정하면 된다.

% export PGDATA=postgresql/data

이런식으로 PGDATA 환경변수를 설정해 놓으면 -D 옵션을 주지 않아도 된다.

% initdb

% pg_ctl start -l logfile

음. 한결 편해졌군.

주의할 점은 PGDATA 에는 절대경로를 넣어 줘야 한다.
상대경로를 넣어주면? 당연히 실행하는 위치마다 될수도 안될수도 있다.

또 하나 더.
psql 을 실행할때 매번 database 를 입력해 줘야한다.

% psql postgres

기본적으로 계속 postgres database 를 사용할 예정이라면,
이것도 환경변수에 넣어주면 매번 입력하지 않아도 된다.

% export PGDATABASE=postgres

% psql

개인적으로 그냥 편하게 .bashrc 에 PGDATA, PGDATABASE 를 넣어둔다.
그러면 다음에 로그인할때 신경쓰지 않고 사용할 수 있다.

PostgreSQL 메뉴얼을 살펴보면, 그 외에도 많은 환경변수들이 존재한다.
적당히 적절히 사용하면 큰 도움이 될거 같다.





출처
https://www.postgresql.org/docs/9.6/static/libpq-envars.html

PostgreSQL 외부에서 접속 하기

PostgreSQL 은 다중 사용자를 위한 Database 이다.
당연히, Server-Client 구조를 가지고 있다.
그러므로, PostgreSQL 을 설치한 machine 외에 다른 machine 에서
접속이 가능하다.

하지만 보안 때문에, 어느 Database 든지,
기본적으로 외부 접속을 disable 해 놓는다.
물론 PostgreSQL 도 외부 접속이 기본적으로 disable 되어 있다.

환경변수를 수정해서, 외부 접속이 가능하도록 해 보자.

% vi postgresql/data/pg_hba.conf

파일의 맨 끝으로 이동하면,
아래와 같은 구문이 나타난다.
접속을 허용하는 ip 주소를 입력하면 된다.

하나의 ip 를 입력할 수도 있고,
netmask 를 사용해서 ip 대역대를 입력할 수도 있다.

0.0.0.0/0 을 입력하면 모든 ip 접속을 허용하겠다는 의미이다.

# IPv4 local connections:
host    all             all             0.0.0.0/0            trust

% vi postgresql/data/postgresql.conf

listen 하는 ip 를 입력하는 곳이다.
기본적으로 localhost 로 되어 있을텐데,
모든 ip 를 listen 한다는 의미로 * 를 입력하면 된다.

listen_addresses = '*'

이제 서버를 재시작 해보자.

% psql -h [ip_address]

psql (9.6.5)
Type "help" for help.

postgres=# 

해당 ip 주소로 접속이 잘되는걸 확인할 수 있다.

만약 공유기에 물려있다면, 포트포워딩을 해줘야 한다. (port 5432)





출처
http://justckh.blogspot.kr/2013/10/postgresql-ip.html
http://moomini.tistory.com/91

C언어 문자열에 대한 sizeof 의 결과

C언어에서 sizeof 라는 연산자가 있다.
자료형의 크기를 얻을 때 사용한다.

sizeof(자료형);
이렇게 함수 사용하듯이 사용하면 된다.

생김새는 함수처럼 생겼지만,
특이하게도 sizeof 는 "연산자" 이다.

또 다른 특이한 점은,
sizeof 는 런타임시가 아닌,
컴파일시에 계산된다는 것이다.

아... 별종이구먼.
간단한 테스트를 해보기로 했다.

#include <stdio.h>

int main() {
    char *p="ABC";
    char a[]="ABC";

    printf("%lu\n", sizeof(p));
    printf("%lu\n", sizeof(*p));
    printf("%lu\n", sizeof(a));
    printf("%lu\n", sizeof("ABC"));

    return 0;
}

결과

8
1
4
4

8 이 나오는건, 포인터 변수이기 때문이다.
포인터 변수는 64bit machine 에서 8바이트이기 때문이다.
요즘 웬만한 컴퓨터는 64bit 이므로 아마 대부분 8 이라고 나올것이다.
당연한 이야기겠지만, 32bit machine 에서는 4 가 나올 것이다.

1 이 나온건, char 의 size 가 1 이기 때문이다.
*p 는 p 포인터의 내용물을 의미하기 때문이다.
그 내용물은 char 이므로 1 이 나온 것이다.
만약, p가 int *p 였다면, 4 가 나왔을 것이다.

4 가 나온건, a[] 배열의 크기가 4 이기 때문이다.
"ABC" 문자열을 저장하기 위해서는, 맨 마지막에 NULL 이 추가되어야 한다.
a[] 라고 정의하면, [] 안에 숫자는 컴파일러가 자동으로 채워준다.
그러므로 a[4] 라고 컴파일러가 자동으로 채워줬을 것이다.
그러므로 4 가 나온다.

마지막으로 4가 나온건, 문자열이 배열로 처리 되었기 때문이다.
컴파일 단계에서 배열로 처리되어서, 이미 문자열 크기만큼
배열이 할당되고, 그 크기가 출력된 것이다.

화곡 어쩌라고, 굴사냥

석화찜(굴찜)을 먹으러 여의도로 갔다 그런데 재료가 모두 소진되었다고 마감이라고 한다 응? 다들 굴에 미쳤나? 굴을 찾아 헤매다 보니, 화곡까지 가게 되었다. 화곡은 처음 가본다. 첫인상은 "술집 겁네 많네" 피똥쌀때까지 마실 수 있...