1단계. 루트(root) 로그인

모든 작업을 위해서 가장 먼저 필요한 서버 로그인을 해보겠습니다.

서버에 접속하기 위해서는 IP 주소와 root 계정의 비밀번호를 알아야 합니다. vlutr.com과 같은 VPS 서비스를 이용하여 가상서버 인스턴스를 생성하게 되면 IP 주소와 초기 root 계정 비밀번호를 제공해줍니다. 현재는 root 계정으로만 접근할 수 있습니다. OS X나 Unix 계열의 OS를 사용할 경우 터미널에서 다음과 같은 명령어로 서버에 접속할 수 있습니다.

$ ssh root@{server-ip-address}

처음 접속할 경우에는 다음과 같은 메시지를 볼 수 있습니다. 접속한 적이 없는 원격 서버라고 경고하는 것입니다. "yes"를 누르면 다음으로 넘어갑니다.

The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ECDSA key fingerpring is 79:95:46:1a:ab:37:11:8e:86:54:36:38:bb:3c:fa:c0.
Are you sure you want to continue connecting (yes/no)?

2단계. Hostname 설정

서버에 연결될 도메인 주소를 입력합니다. 아래와 같이 입력하면 즉시 반영되지만 재부팅시에는 설정이 유지되지 않습니다. (yourdomain.com 값은 해당하는 값으로 변경하시기 바랍니다.)

$ sudo hostname yourdomain.com

서버를 재부팅해도 값을 유지하기 위해서 /etc/hostname 파일을 다음과 같이 수정합니다.

yourdomain.com  

3단계. 언어(locale) 설정

/etc/default/locale 파일을 다음과 같이 수정합니다. (각 행의 마지막에 빈칸이 포함되지 않도록 합니다.)

LANG="en_US.UTF-8"  
LANGUAGE="en_US.UTF-8"  
LC_ALL="en_US.UTF-8"  

다음과 같이 서버를 재부팅하면 설정이 적용됩니다.

$ sudo reboot

4단계. 계정 생성

로그인할 수 있는 새로운 계정을 만들어 보도록 하겠습니다. 아래 {username} 부분을 원하시는 이름으로 바꾸시면 됩니다.

$ adduser {username}

비밀번호를 포함하여 몇 가지 정보를 입력하게 됩니다. 비밀번호를 제외하고는 필수 입력사항이 아니므로 그냥 엔터를 입력해도 됩니다.


5단계. 루트 권한

윗 단계에서 만든 계정은 일반 계정입니다. 일반적인 작업은 수행할 수 있지만 관리자 작업은 수행할 수 없습니다.

일반 계정에서 관리자 작업을 수행할 수 있도록 일반 계정에 "sudo" 권한을 부여할 수 있습니다. 이를 통해 일반 계정도 명령어 앞에 sudo를 붙이면 관리자 작업을 할 수 있게 됩니다.

일반 계정에 루트 권한을 부여하기 위해서 먼저 루트 계정으로 로그인 한 후에 다음과 같이 입력합니다.

$ adduser {username} sudo

6단계. 방화벽 설정

ufw는 Ubuntu에 기본적으로 설치되어 있는 방화벽입니다. SSH 접속을 위해서 해당포트(기본값 22)를 열어줍니다. 필요한 경우 http 포트도 열어줍니다.

$ sudo ufw allow ssh
$ sudo ufw allow http

이제 설정을 마쳤으므로 다음과 같이 enable할 수 있습니다.

$ sudo ufw enable

현재 동작여부와 열려있는 포트의 목록을 보려면 다음과 같이 입력합니다.

$ sudo ufw status

7단계. SSH 보안

SSH의 경우 무차별 아이디/패스워드 대입 공격을 당할 수 있으므로 root 계정을 비활성화 하고, 반복된 로그인 실패시 딜레이를 주도록 설정해야 합니다.

root 계정 비활성화

/etc/ssh/sshd_config 파일에서 다음 부분을 찾아서 no로 변경합니다.

PermitRootLogin no

다음과 같이 서비스를 다시 시작합니다.

sudo service ssh restart

반복 접속시 딜레이 주기

$ sudo apt-get install sshguard

8단계. apt-get 업데이트

OS를 새로 설치한 후 최신 업데이트를 합니다. apt-get update를 통해 최신 업데이트 목록을 가져올 수 있으며, apt-get upgrade를 통해 실제로 업데이트를 할 수 있습니다.

$ apt-get update
$ apt-get upgrade


Posted by C마노
,
-- 백업본을 확인합니다.
[postgres@olmaster:~]$ lst
합계 72
-rw-r--r--.  1 postgres postgres   131 2012-10-30 13:30 .bashrc
drwx------.  4 postgres postgres  4096 2012-10-31 22:33 9.2/
drwxr-xr-x. 51 root     root      4096 2012-11-10 23:37 ../
drwxr-xr-x.  2 postgres postgres  4096 2012-11-18 14:57 oradba/
-rw-------.  1 postgres postgres  1238 2012-11-18 14:57 .bash_profile
-rw-r--r--.  1 postgres postgres   532 2012-11-22 09:33 .psqlrc
-rw-------.  1 postgres postgres 11345 2012-12-01 16:26 .bash_history
-rw-------.  1 postgres postgres 13641 2012-12-01 16:57 .psql_history
-rw-r--r--.  1 postgres postgres  5258 2012-12-01 23:56 scott_scottdb.backup
-rw-r--r--.  1 postgres postgres  4920 2012-12-01 23:57 scott_scottdb_backup.sql
drwx------.  4 postgres postgres  4096 2012-12-01 23:57 ./
[postgres@olmaster:~]$ 

-- 존재하는 scottdb 데이터베이스를 삭제합니다. 나중에 이 scottdb 를 복구할겁니다.
[postgres@olmaster:~]$ psql -U postgres
Password for user postgres: 
Null display is "NULL".
Timing is on.
Pager is always used.
psql (9.2.1)
Type "help" for help.

postgres@[local]:5432 postgres#SQL> drop database scottdb;
DROP DATABASE
Time: 124.638 ms
postgres@[local]:5432 postgres#SQL> \q

-- 백업본을 이용하여 scottdb 데이터베이스 복구를 시도합니다.
[postgres@olmaster:~]$ pg_restore -U scott --dbname=scottdb --verbose scott_scottdb.backup 
pg_restore: connecting to database for restore
Password: 
pg_restore: [archiver (db)] connection to database "scottdb" failed: FATAL:  database "scottdb" does not exist

-- scottdb가 존재하지 않는다고 에러를 내뱉네요.

-- createdb 스크립트를 이용하여 scottdb 데이터베이를 생성합니다. 빈껍데기 일뿐이지요.

[postgres@olmaster:~]$ createdb -O scott scottdb
암호:          # scott 유저가 아닌 postgres 유저의 패스워드를 입력해야 합니다.
[postgres@olmaster:~]$ 

-- 다시 복구를 시도합니다.
[postgres@olmaster:~]$ pg_restore -U scott --dbname=scottdb --verbose scott_scottdb.backup 
pg_restore: connecting to database for restore
Password: 
pg_restore: creating SCHEMA public
pg_restore: creating COMMENT SCHEMA public
pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2813; 0 0 COMMENT EXTENSION plpgsql 
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
pg_restore: creating TABLE bonus
pg_restore: creating TABLE dept
pg_restore: creating TABLE dummy
pg_restore: creating TABLE emp
pg_restore: creating TABLE salgrade
pg_restore: restoring data for table "bonus"
pg_restore: restoring data for table "dept"
pg_restore: restoring data for table "dummy"
pg_restore: restoring data for table "emp"
pg_restore: restoring data for table "salgrade"
pg_restore: creating CONSTRAINT dept_pkey
pg_restore: creating CONSTRAINT emp_pkey
pg_restore: creating FK CONSTRAINT emp_deptno_fkey
pg_restore: setting owner and privileges for DATABASE scottdb
pg_restore: setting owner and privileges for SCHEMA public
pg_restore: setting owner and privileges for COMMENT SCHEMA public
pg_restore: setting owner and privileges for ACL public
pg_restore: WARNING:  no privileges could be revoked for "public"
pg_restore: WARNING:  no privileges could be revoked for "public"
pg_restore: WARNING:  no privileges were granted for "public"
pg_restore: WARNING:  no privileges were granted for "public"
pg_restore: setting owner and privileges for EXTENSION plpgsql
pg_restore: setting owner and privileges for COMMENT EXTENSION plpgsql
pg_restore: setting owner and privileges for TABLE bonus
pg_restore: setting owner and privileges for TABLE dept
pg_restore: setting owner and privileges for TABLE dummy
pg_restore: setting owner and privileges for TABLE emp
pg_restore: setting owner and privileges for TABLE salgrade
pg_restore: setting owner and privileges for TABLE DATA bonus
pg_restore: setting owner and privileges for TABLE DATA dept
pg_restore: setting owner and privileges for TABLE DATA dummy
pg_restore: setting owner and privileges for TABLE DATA emp
pg_restore: setting owner and privileges for TABLE DATA salgrade
pg_restore: setting owner and privileges for CONSTRAINT dept_pkey
pg_restore: setting owner and privileges for CONSTRAINT emp_pkey
pg_restore: setting owner and privileges for FK CONSTRAINT emp_deptno_fkey
WARNING: errors ignored on restore: 1
[postgres@olmaster:~]$ 

오. 복구가 잘 됐습니다.


Posted by C마노
,

<< 알고리즘 >>


1. 알고리즘은 단계적 절차


2. 프로그램언어로 소스코드를 짜서 원하는 출력 결과를 얻기 위함.


3. 알고리즘은 기본적으로 프로그래밍 언어에 의존적


4. 그러나 언어에 의존적인 것이지 특정한 언어에 종속적인 것은 아님. ( C나 C++이나 JAVA , Perl , Python 등 어느언어로도 가능.)


<< 알고리즘의 기능 >>


검색 ( 데이터의 구조를 검색 ) , 정렬 ( 정해진 기준에 따라 정렬 ) , 삽입[갱신,삭제] ( 어떠한 자료 구조의 리스트에 데이터를 삽입 , 갱신 , 삭제 )


<< 알고리즘의 특성 >>


[ 명확성 ] - 알고리즘은 각각의 단계가 분명하고 명확해야 합니다. 입 출력이 명확해야 하고, 각각의 단계가 명확해야 함.


[ 한정성 ] - 알고리즘은 단계의 끝이 존재 ( 무한루프 X )


[ 가용성 ] - 알고리즘은 최대한 적은 자원을 사용해서 최대의 성능을 끌어내야 함.


[ 독립성 ] - 알고리즘은 각각의 단계가 독립적이어야 하고, 프로그래밍 언어에 독립적.


<<알고리즘 작성법>>


알고리즘에 잘 정의된 표준은 없음. 왜냐하면 알고리즘은 특정 프로그래밍 코드를 지원하기 위해서 작성되어지지 않기 때문.


알고리즘은 다들 잘 알고 있는 ( do , for , while ) , IF 등과 같이 구성.


보통,  단계별로 알고리즘을 작성하지만 항상 그렇지는 않음. 알고리즘 작성은 문제의 주체가 잘 정의 되고 난 다음에 진행되어야 함.


[ 예제 ]


step1. 더하기 시작

step2. a,b의 값을 읽어들인다.

step3. c < - a + b

step4. c를 보여준다.

step5. 종료.


설계 및 알고리즘 분석에서 일반적으로 위의 방법이 사용.


주어진 문제에 대해서 솔루션을 얻을 수 있는 알고리즘을 설계해야 함, 물론, 문제는 하나 이상의 방식으로 해결 될 수 있음.


이러한 이유로, 많은 솔루션 알고리즘은 주어진 문제에 대해서 여러가지 해결 방법이 나올수 있음

다음 단계로는 이러한 여러가지 솔루션 알고리즘을 분석하여 가장 적당한 해결방법을 구현하는 것.


<< 알고리즘 분석 >>


알고리즘의 효율은 구현 전과 구현 후 2개의 다른 단계로 분석 할 수 있음. 


- 구현 전 : 알고리즘의 이론적 분석, 알고리즘의 효율은 모든 다른 요인을 고려하여 측정한다.

예를 들면, CPU 의 속도를 일정하게 하고, 구현에 영향을 미칠 수 없도록 한다.


- 구현 후 : 알고리즘의 경험적 분석, 후보 알고리즘 중 선택된 알고리즘은 프로그래밍언어를 사용해 구현하는 것을 뜻함. 실제로 대상 컴퓨터 시스템에서 실행되게 된다. 이 분석에서 시간복잡도와 공간복잡도의 통계가 수집됨.



<< 알고리즘 복잡성 >>


X는 알고리즘이고, n은 입력 데이터의 크기. 알고리즘 X가 사용되는 시간과 공간 (X)의 효율을 결정하는 두개의 주요 요인이 있다.


1. 시간 요소 - 정렬 연산 등에서 사용하는 반복 루프안의 횟수를 셈.

2. 공간 요소 - 공간 알고리즘에 의해 요구되는 최대의 메모리 용량을 계산해서 측정.



<< 공간 복잡도 >>


알고리즘이 진행되는 동안 요구되는 메모리의 공간을 의미함.

요구되는 공간은 다음의 두 요소의 합과 같다.


   - C1. 문제의 크기와 무관한 특정 데이터 및 변수를 저장하기 위해 필요한 공간


   - C2. 문제의 크기에 따라 변수들에 의해 요구되는 공간 EX ) 동적할당



알고리즘 P의 공간복잡도 S(P)는 S(P) = C + SP(I) 여기서, C는 고정된 부분 ( C1 ) S(I)는 알고리즘의 가변부분 ( C2 ) 


[ 예제 ]


알고리즘명 : SUM( A , B )


step1. 시작

step2. C <- A + B + 10

step3. 종료


여기서, 위의 알고리즘은 세 개의 변수 A, B, C 와 하나의 상수를 가지고 있음.

따라서 S(P) = 1+3.

이제 공간은 주어진 변수와 상수의 유형, 데이터의 유형에 따라서 달라짐.


<< 시간 복잡도 >>


알고리즘의 시간 복잡도는 알고리즘이 실행완료 까지의 시간의 양을 나타냄.

요구시간은 T(n) 으로 정의하고 T(n)은 각각 단계의 수로 측정 가능하고 각각 단계는 일정 시간을 소모함.


예를 들어, 2개의 integer을 더할때 n 개의 단계를 거친다면, 그결과 총 계산 시간은 T(n) = c * n 이다.

여기서 c는 2개의 integer을 더하는데 걸리는 시간.

여기서 T(n) 의 입력 크기가 증가함에따라서 시간은 선형적으로 증가.





Posted by C마노
,