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가 나온건, 문자열이 배열로 처리 되었기 때문이다.
컴파일 단계에서 배열로 처리되어서, 이미 문자열 크기만큼
배열이 할당되고, 그 크기가 출력된 것이다.

WinSCP 기부

나는 리눅스(Linux)를 많이 사용하는 편이다. 회사에서도 사용하고, 개인적으로도 사용하고 있다. 그러다 보니 자연스럽게, SFTP를 많이 사용하게 된다. 리눅스에서는 SFTP에 대해 기본적으로 이렇게 저렇게 잘 지원을 해주는 편인데, 윈도...