12월, 2017의 게시물 표시

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 unse…

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

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

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가 나온건, 문자열이 배열로 처리 되었기 때문이다.
컴파일…