svn delete -m "Deleting project dir" http://xxx.xxx.xxx.xxx/svn/project/asdf

sudo trac-admin <프로젝트경로>

 ex> sudo trac-admin /var/trac/sak2013


이렇게 하면 해당 프로젝트에 대해 trac-admin이 실행된다.


help 만 입력하면 각 명령어들에 대한 간략한 설명을 볼 수 있고


'help 명령어'와 같은 식으로 입력하면 해당 명령어에 대한 자세한 설명을 볼 수 있다.


예>


아래 내용 참고하여 환경을 구성했고

나는 제일 처음에 아래 두 명령을 먼저 수행했음

   $ sudo apt-get update

   $ sudo apt-get upgrade


trac 및 svn 사용자 추가는 아래와 같이 했음

   sudo htdigest /etc/apache2/.htdigest Repository <User ID>

   sudo htdigest /etc/apache2/.htdigest Trac <User ID>


-------------------------------------------------------------------------------------------------


1. TRAC Package 설치.

 

1. 아파치 웹서버 설치

  Trac을 웹서버없이 단독으로 올릴 수는 있지만 그리 권장할 만 하지는 않다.

  그리고 Ubuntu Desktop에는 아파치 웹서버가 기본설치되지 않기 때문에 다음과 같이 설치해야 한다.

   $ sudo apt-get install apache2

.         

2. Subversion 설치

  Trac은 서브버전과 통합된 형태이기 때문에 Subversion도 설치해야 한다.(svn 1.5.1 이 설치됨)

$ sudo apt-get install subversion libapache2-svn

          

3. Trac 설치

  Trac은 최신버전인 0.11 이 설치된다.

$ sudo apt-get install trac libapache2-mod-python python-setuptools

 

우선 간단하게 apt-get 명령어로 TRAC  Subveersion을 설치합니다이때 Subversion TRAC에서 필요로 하므로 의존성 검사로 인해 알아서 설치합니다

 

 

2. SVN 환경설정

 

우선 저장소 역할을 할 Directory를 만들도록 합니다일단 여기서는 나중에 추가로 설명할 Apache와의 연동을 위해/var/svn을 합니다만 굳이 /var/svn에 하실 필요는 없으시고 원하시는 위치에 만드셔도 상관은 없습니다단 연동을 위해 필요한 사용자 계정으로 www-data(필요하면 다른 계정을 설정해도 상관없지만요)를 통해 이뤄지기 때문에저장소에 대한 사용자 권한을 www-data가 갖도록 했습니다이는 뒤에 나오는 TRAC에서도 마찬가지로 설정 했습니다.

 

   1: sudo mkdir /var/svn

   2: sudo chown www-data.www-data /var/svn

   3: sudo -u www-data svnadmin create /var/svn/<Project Name>

 

이때 /var/svn은 저장소의 부모 디렉토리이며실제 저장소를 프로젝트이름(<Project Name>)으로 생성하면 개별 프로젝트에 대한 저장소가 생성됩니다.

이후 새로운 프로젝트를 등록하고 싶으면 3번 줄의 부분만 반복적으로 수행해 주면 됩니다.

 

 

 

 

3. TRAC 환경 설정

 

TRAC SVN과 같이 디렉토리를 구성하면 됩니다.

   1: sudo mkdir /var/trac

   2: sudo chown www-data.www-data /var/trac

 

위와 같이 디렉토리를 생성하면 TRAC에 대한 메인 디렉토리가 생성됩니다.

 

   1: sudo -u www-data trac-admin /var/trac/<Project Name> initenv 초기생성용

   2: sudo -u www-data trac-admin /var/trac/<Project Name> upgrade 마이그레이션용

 

이제 TRAC을 설치하도록 하겠습니다기본적으로 2가지 명령어가 있는데 위와 같이 끝에 initenv를 해서 새로운 프로젝트를 생성하고그렇지 않고 TRAC이 버젼업 되었다던가 다른 이유로 마이그레이션이 필요하면 아래와 같이 upgrade를 수행합니다수행하면 총 4개의 위와 같은 질문을 하는데 내용은 아래와 같고 각각 그에 맞는 값을 설정합니다.

 

   1: Project Name [My Project]> <Project Name>

   2: Database connection string [sqlite:db/trac.db]>

   3: Repository type [svn]>

   4: Path to repository [/path/to/repos]> /var/svn/<Project Name>

 

1 .프로젝트 명원하는 프로젝트 이름을 넣습니다이름은 SVN과 맞춰줄 필요는 없습니다.

2. DB 연결명아직 설정해 본적이 없어서 모르겠지만 기본설정을 그대로 둡니다.

3. 저장소 종류: SVN말고도 여러가지 있는데 여기서는 Subversion을 사용한 관겨로 기본값으로 그대로 둡니다.

4. 저장소 위치앞서 만든 저장소의 위치를 입력합니다.

 

 

4. TRAC 관리자 계정 추가

마지막으로 TRAC을 관리할 관리자 계정을 추가합니다이는 내일 다시 올릴 Apache와의 연동할 때 필요한 부분입니다.

 

   1: sudo -u www-data trac-admin /var/trac/<Project Name> permission add <User ID> TRAC_ADMIN

 

이렇게 하면 간단히 TRAC ‘자체에 대한 설정이 끝나게 됩니다하지만 정작 사람들이 잘 써먹고 있는 웹화면상의 TRAC으로 갈려면 Apache와 연동을 해야 하는 부분이 남아 있습니다.

 

 

5. Apache 및 관련 Package 설치.

 

우선 연동 하기에 앞서 Apache 및 관련 모듈을을 설치해야 합니다따라서 apache2-threaded-dev, libapache2-mod-python, python-dev, libapache2-svn 정도만 설치하면 왠만한 모듈은 알아서 설치하게 됩니다.

   1: sudo apt-get install apache2-threaded-dev libapache2-svn

   2: sudo apt-get install libapache2-mod-python python-dev

 

1. Apache SVN TRAC을 연동

우선 이부분을 하기에 앞서 SVN TRAC의 사용방법은 가지 각색이겠지만 2가지가 있습니다.(일단 제 기준 입니다.)

 

• 1개의 SVN TRAC의 프로젝트를 만들고 그 안에서 모든 프로젝트들을 관리한다.

o장점많은 프로젝트를 다 같이 할 때 한번에 모니터링이 가

o단점각 프로젝트에 대한 관리가 뒤섞일 수 있음.

o권장여러 간단한 작업들로만 있는 경우 권장.

 

•개별 프로젝트마다 SVN TRAC의 프로젝트를 생성독립적으로 관리한다.

o장점각각 프로젝트마다 관리 하기 때문에 뒤섞일 일이 적고 계정 권한 관리가 쉽다.

o단점여러 프로젝트에 대해 각각 관리하기 때문에 손이 많이 가고 한번에 모든 모니터링이 불편(?)

o권장개별 프로젝트 들이 덩치가 큰 경우장기 프로젝트 등….

 

일단 이번에는 2번째 항목인 개별 프로젝트마다의 SVN TRAC을 생성해 관리하도록 하는 기능으로 설명하겠습니다나머지는 주석 처리한 부분을 푸시고 원래 있던 동급의 내용에 주석처리 하시면 됩니다. ^^

 

5. SVN 올리기

 

우선 /etc/apache2/mods-available/dav_svn.conf 파일을 열고(없으면 만들면 됩니다.) 다음을 추가 합니다.

   1: <Location /svn>

   2:     DAV svn

   3:    

   4:     # /var/svn/ 으로 저장소의 부모폴더로 연결합니다

   5:     SVNParentPath /var/svn

   6:     #  1개의 프로젝트만 사용하면 아래와 같이 SVNPath를 대신 입력합니다

   7:     #SVNPath /var/svn/<Project Name>

   8:    

   9:     # Digest 인증 설정

  10:     AuthType Digest

  11:     AuthName "Repository"

  12:     AuthUserFile /etc/apache2/.htdigest

  13:    

  14:     # Basic 인증 설정

  15:     # JAVA 기반 프로그램들 에서는 Digest인증을 하면

  16:     # Export checkout을 못하는 기현상이 일어 나더군요

  17:     # 이런 경우 사용해 주세요

  18:     #AuthType Basic

  19:     #AuthName "Repository"

  20:     #AuthUserFile /etc/apache2/.htpasswd

  21:    

  22:     # Commit 의 접근 억세스 설정

  23:     <LimitExcept REPORT>

  24:         Require valid-user

  25:     </LimitExcept>

  26: </Location>

단 이경우 내용에도 써 있지만 SVNPath SVNParentPath는 용도에 따라 둘중 하나만 사용할 수 있습니다또 왜인지는 모르겠는데 JAVA 기반인 경우에서는 Digest 인증을 못하더라고요그런관계로 이경우에는 어쩔 수 없이 Basic 인증을 사용하면 됩니다. (C 기반 SVN Client는 잘 돌아갑니다.) 일단 인증 파일로 각각 Digest의 경우 /etc/apache2/.htdigest Basic의 경우 /etc/apache2/.htpasswd로 했습니다각각 만드는 법에 대해서는 Digest만 뒤에 올려두도록 하겠습니다.

이제 Module 설정 파일을 만들었으니 apache에 올리도록 합니다올리는 방법은 아래와 같이 사용하면 됩니다.

 

   1: sudo a2enmod dav_svn

   2: sudo a2enmod auth_digest

 

 

6. TRAC 올리기

TRAC도 마찬가지 방법으로 작성을 해야 합니다우선 /etc/apache2/sites-available/trac을 다음과 같이 작성합니다.

   1: # 하나의 TRAC에서 모든 프로젝트를 사용할 때 쓰는 Alias 입니다.

   2: #Alias /trac /var/trac/<Project Name>

   3: 

   4: <Location /trac>

   5:     SetHandler mod_python

   6:     PythonHandler trac.web.modpython_frontend

   7:     # TRAC의 부모 디렉토리 설정개별 프로젝트마다 TRAC을 사용할 때 씁니다

   8:     PythonOption TracEnvParentDir /var/trac

   9:     # TRAC 프로젝트 설정모든 프로젝트를 하나의 TRAC에서 사용할 때 씁니다

  10:     #PythonOption TracEnv /var/trac/<Project Name>

  11:     PythonOption TracUriRoot /trac

  12:    

  13:     # Digest 인증 설정

  14:     AuthType Digest

  15:     AuthName "Trac"

  16:     AuthUserFile "/etc/apache2/.htdigest"

  17:     Require valid-user

  18:    

  19:     # Basic 인증 설정

  20:     # 앞선 svn 설정과 계정을 맞춰주기 위해 Basic 설정을 쓰는 경우 사용

  21:     #AuthType Basic

  22:     #AuthName "Repository"

  23:     #AuthUserFile /etc/apache2/.htpasswd

  24: </Location>

내용은 SVN을 설정 했을 때와 마찬가지 입니다이번에도 마찬가지로 PythonOption으로 준 TracEnvParanetDir TracEnv는 둘중에 하나만 사용해야 합니다또한 Apache에 적용하기 위해서 다음 명령어로 TRAC을 추가합니다.

 

   1: sudo a2ensite trac

 

 

7. TRAC 사용자 계정 설정.

 

우선 이번글에서는 Digest 설정하는 부분만 넣도록 하겠습니다일단 Digest를 위한 사용자의 암호를 넣어야 하는데요각각SVN TRAC을 위해 구분시켜서 넣도록 합니다단 앞서 올린 포스트에 설정한 관리자 계정도 반드시 포함되어야 합니다!!

   1: user@user-pc:/etc/apache2$ sudo htdigest -c /etc/apache2/.htdigest Repository <User ID>

   2: Adding password for user in realm Repository.

   3: New password:

   4: Re-type new password:

   5: user@user-pc:/etc/apache2$ sudo htdigest /etc/apache2/.htdigest Trac <User ID>

   6: Adding user user in realm Trac

   7: New password:

   8: Re-type new password:

   9: user@user-pc:/etc/apache2$ sudo chmod 600 /etc/apache2/.htdigest

  10: user@user-pc:/etc/apache2$ sudo chown www-data.www-data /etc/apache2/.htdigest


8. Apache 사용자 추가

 

1.     사용자 정보 수정

비밀번호 수정 htpasswd -m /etc/apache2/dav_svn.passwd 사용자 ID

새 사용자 생성 : htpasswd -c /etc/apache2/dav_svn.passwd 새로운 사용자 ID

 

2.     재시작

많은 분들이 알고 계시리라 믿습니다만 혹시나 해서 추가합니다.

    sudo /etc/init.d/apache2 restart

 

마지막에 /var/svn  /var/trac 폴더에 퍼미션을 주어야 제대로 접속이됨

이걸로 SVN Trac Apache에 연결시켜서 설정하는 방법 까지 끝났습니다이제 남은 것은 TRAC SVN을 사용하는 것 뿐이로군요실제 접근할 때 필요한 주소들은

• TRAC: http://<사용하는 웹 주소>/trac

• SVN 저장소http://<사용하는 웹 주소>/svn/<Project Name>

해서 사용하시면 됩니다실제 화면은 직업 확인해 보세요.. ^^

 

 

9. SVN 사용법

 

1.     용어 설명

저장소

리포지토리(Repository)라고도 하며 모든 프로젝트의 프로그램 소스들은 이 저장소 안에 저장이 됩니다그리고 소스뿐만이 아니라 소스의 변경 사항도 모두 저장됩니다네트워크를 통해서 여러 사람이 접근 할 수 있습니다버전 관리 시스템 마다 각각 다른 파일 시스템을 가지고 있으며 Subversion Berkeley DB를 사용합니다한 프로젝트 마다 하나의 저장소가 필요합니다.

 

리비전(Revision)

소스 파일등을 수정하여 커밋하게 되면 일정한 규칙에 의해 숫자가 증가 합니다저장소에 저장된 각각의 파일 버전이라 할 수 있습니다. Subversion의 경우 파일별로 리비전이 매겨지지 않고 한번 커밋 한 것으로 전체 리비전이 매겨 집니다리비전을 보고 프로젝트 진행 상황을 알 수 있습니다.

 

trunk

단어 자체의 뜻은 본체 부분나무줄기몸통 등 입니다프로젝트에서 가장 중심이 되는 디렉토리입니다모든 프로그램 개발 작업은 trunk 디렉토리에서 이루어집니다그래서 위의 구조에서 trunk 디렉토리 아래에는 바로 소스들의 파일과 디렉토리가 들어가게 됩니다.

 

Branches

나무줄기(trunk)에서 뻗어져 나온 나무 가지를 뜻합니다. trunk 디렉토리에서 프로그램을 개발하다 보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 따로 개발해야 할 경우가 생깁니다프로젝트안의 작은 프로젝트라고 생각하면 됩니다. branches 디렉토리 안에 또 다른 디렉토리를 두어 그 안에서 개발하게 됩니다.

 

Tags

tag는 꼬리표라는 뜻을 가지고 있습니다이 디렉토리는 프로그램을 개발하면서 정기적으로 릴리즈를 할 때 0.1, 0.2, 1.0 하는 식으로 버전을 붙여 발표하게 되는데 그때그때 발표한 소스를 따로 저장하는 공간입니다위에서 보면 tags 디렉토리 아래에는 버전명으로 디렉토리가 만들어져 있습니다.

 

2.     명령어 의미

Import : svn import sampledir svn+ssh://svn-domain/svn/sample/trunk

맨 처음 프로젝트 시작할때 저장소에 등록하는 명령어 한 번 하고 나면 쓸일이 잘 없을 듯.

 

Checkout : svn checkout svn+ssh://svn-domain/svn/sample/trunk sample

저장소에서 소스를 받아 오는 명령어받아온 소스에는 소스 뿐만이 아니라 버젼관리를 위한 파일도 같이 받아 온다지우거나 변경시 저장소와 연결 불가능

 

Export : svn export svn+ssh://svn-domain/svn/sample2/trunk sample

체크아웃과는 달리 버젼관리 파일을 뺀 순수한 소스만 가져오는 명령어 마지막에 사용.

 

Commit : svn commit

체크아웃 한 소스를 수정파일 추가삭제 등을 한 뒤 저장소에 저장하여 갱신 하는 명령어. Revision 1 증가 한다.

 

Update : svn update

체크아웃 해서 받은 소스를 최신의 소스로 업데이트 하는 명령어소스 수정이나 Commit 하기전에 한 번씩 해줘야 할 듯잘 못하면 소스 망치는 경우가 있을 듯.

 

Log : svn log

저장소에 어떠한 것들이 변경 되었는지 확인 할 수 있는 log 명령어

svn log // 전체 로그 확인

svn log trunk/main/main.c    // trunk/main/main.c 로그확인

svn log trunk/memo   //trunk/memo 로그 확인

svn log -r 2 // 리버전로그 확인

svn log -r 1:3 //리버전 1~3 까지 로그 확인

svn log -r 3:1 // 리버전 3~1 까지 로그 확인

로그 확인시 -v  옵션을 주면 좀더 자세한 정보를 출력하고 -q 옵션은 더 간단히 출력해 준다..

 

Diff : svn diff --revision 4 sample.c

diff 명령은 예전 소스 파일과 지금의 소스 파일을 비교해 보는 명령어

 

Blame : svn blame sample.c

Blame은 한 소스파일을 대상으로 각 리비전 대해서 어떤 행을 누가 수정했는지 알아보기 위한 명령어

 

lock : svn lock hello.c

파일에 락을 걸어 락을 건 사용자만이 수정할 수 있게 해주는 명령어해제는 svn unlock.

왜 파일에 락을 걸었는지 로그를 기록 할 수 있다.

 

Add : svn add hello.c

새 파일을 만들었을 경우에 파일을 추가 해주는 명령어.

그 뒤엔 꼭 svn commit를 꼭 해줘야 한다.

새 파일을 생성해서 올릴 때에도 꼭 add를 해줘야 함안해주면 commit을 해도 안 올라감.

 

Status : svn status

자신이 수정하고 있는 파일의 상태를 알려주는 명령어

 

Help svn help

상세 사용법 출력. svn help subcommand 도 가능.

 

Add svn add 

새로 생성한 파일이나 디렉토리를 저장소에 추가 예약

 

Mkdir svn mkdir

디렉토리 새로 생성

 

Delete svn delete (del, remove, rm)

파일이나 디렉토리를 삭제 (로컬과 저장소 둘다)

 

Move svn move (mv, rename, ren)

파일이나 디렉토리를 이동하거나 이름 변경

 

Copy svn copy (cp)

파일이나 디렉토리 복사

 

3.     파일 백업및 복구

 

1.     dump

sample 저장소를 백업합니다표준 입출력을 통해서 저장소의 내용을 파일로 생성합니다. svnadmin dump 명령을 사용하며 이 명령은 저장소 디렉토리 바깥에서 사용해야 합니다.

 

repos# ls

sample

repos# svnadmin dump sample > sample.dump

 

2.     load

Load 하기 위해선 신규 Repository(sample)를 생성한다.

저장소 백업 파일을 이용해서 저장소를 복구합니다. svnadmin load 명령을 사용합니다.

빈 저장소를 생성한 뒤 백업 파일을 이용해서 복구를 합니다.

repos# svnadmin create sample
repos# ls
sample   sample.dump
repos# svnadmin load sample < sample.dump

 

3.     sync

svnsync 1.4.0에서 새로 생긴 명령입니다. svnsync 명령을 이용해서 저장소를 그대로 복사해 올 수 있습니다단 복사해오고자 하는 원본 저장소가 Subversion 1.4 이상을 사용하고 있어야 하며 1.4 이하를 사용하고 있을 경우 svnsync명령이 동작하지 않습니다.

 

먼저 빈 저장소를 만듭니다.

# cd /home/svn/
/home/svn# svnadmin create syncsample

 

pre-revprop-change 파일을 실행할 수 있도록 권한을 조정합니다

/home/svn/syncsample/hooks# chmod 777 pre-revprop-change

 

svnsync를 사용할 수 있도록 저장소를 초기화 합니다file:///home/svn/syncsample은 방금 만든 빈 저장소 경로이고http://svn.collab.net/repos/svn은 복사해 올 원본 저장소의 주소입니다http://, svn://등 접속 가능한 저장소 주소이면 되고 trunk branches같은 디렉토리가 아닌 최 상위 디렉토리의 주소로 설정해줘야 합니다.

 

/home/svn# svnsync init file:///home/svn/syncsample http://svn.collab.net/repos/svn
Copied properties for revision 0.

 

이제 저장소를 복사를 시작합니다.

/home/svn# svnsync sync file:///home/svn/syncsample
Committed revision 1.
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
Committed revision 4.
Copied properties for revision 4.
Committed revision 5.
Copied properties for revision 5.
Committed revision 6.
Copied properties for revision 6.
....

최신 리비전 까지 복사해오면 svnsync 명령이 끝난 것입니다.

이제 이 저장소에서 소스를 체크아웃 하여 살펴볼 수 있습니다.

 

 

5.  Svnserve에서 ID로 사용자 인증

 

Subversion 0.33.0버전 이후부터 svnserve ID로 사용자 인증이 가능하게 되었습니다그 이전 버전에서 svnadmin으로 저장소를 만들면 저장소 디렉토리 아래에 conf 디렉토리가 생기지 않지만 0.33.0 버전이후에 svnadmin으로 저장소를 만들었다면 저장소 디렉토리 아래에 conf 디렉토리가 자동으로 생성됩니다이전 버전에서 먼저 저장소를 만들어 두었다면 저장소 디렉토리 /home/svn/sample 아래 conf 디렉토리를 만들어 줍니다. (/home/svn/sample/conf)

 

이제 각 저장소 디렉토리 아래 conf 디렉토리가 있습니다. /home/svn/sample/conf/svnserve.conf 파일이 svnserve의 설정 파일입니다. 0.33.0 버전 이전 만든 저장소에는 conf 디렉토리 및 svnserve.conf 파일이 없습니다그럴 경우에는 conf 디렉토리와 svnserve.conf 파일을 만들어 주면 됩니다.

 

svnserve.conf 파일을 아래와 같이 설정 합니다.

 

### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)
 
### Visit http://subversion.tigris.org/ for more information.
 
[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### The format of the password database is similar to this file.
### It contains one section labelled [users]. The name and
### password for each user follow, one account per line. The
### format is
###    USERNAME = PASSWORD
### Please note that both the user name and password are case
### sensitive. There is no default for the password file.
password-db = passwd
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
realm = pyrasis's Repository

 

anon-access = none으로 아무에게나(Anonymous) 저장소에 접근하는 것을 막았습니다. read로 하면 읽기만 가능하며 write로 해주면 읽고 쓰기가 가능해집니다.

 

auth-access = write ID로 인증된 사용자에게 쓰기 권한을 주는 것입니다.

 

password-db = passwd 이 설정은 svnserve의 패스워드 파일입니다 이전의 Apache 패스워드 파일과는 별개입니다아래 내용으로 /home/svn/sample/conf 아래 passwd 라는 이름으로 만듭니다. ID = 패스워드 형식 입니다아직 암호화된 패스워드는 지원하지 않는 것 같습니다버전 업을 통해 개선 될 것 같습니다.

 

passwd

 

[users]
sampleuser = 02030104


http://jmkook77.blogspot.kr/2012/01/putty.html


아마존 서버 생성시 다운받은 pem 파일을 이용하여 ssh/sftp 접속하는 방법

1. putty 를 다운받습니다.

 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

 여기에서 putty<version>-installer.exe 를 받으세요.
 혹은, putty.exe, psftp.exe, puttygen.exe, pageant.exe 를 따로 설치하셔도 됩니다.
  puttygen.exe 는 pem 파일을 putty에서 사용가능하게 변경하며
  pageant.exe 는 pem 파일을 통해 putty, psftp 가 서버에 접속 가능하게 해줍니다.

2. pem 파일 변환

 1) puttygen.exe 를 실행하면 아래와 같은 화면이 뜹니다. 상단의 Conversions / Import Key 를 선택합니다.


 2) 해당 서버에 접속하기 위한 pem파일을 선택합니다.



 3) 아래와 같이 정상적으로 로드가 된것을 확인할 수 있습니다.
     이제 하단 우측에 있는 Save private key 를 선택하고 Yes 를 선택합니다.



 4) 원하는 위치에 파일명을 설정하여 ppk 파일을 저장합니다. ppk 파일 생성 완료!!




2. Pageant.exe 를 실행하면 아래와 같이 윈도우 우측 하단에 트레이로 추가된것을 확인할 수 있습니다. 이녀석은 항상 저곳에 있어야만 합니다.



 1) 위 트레이를 더블클릭 하여 아래의 화면에서 Add Key 를 선택합니다. 혹은, 트레이 아이콘에서 오른쪽 버튼으로 Add Key 를 선택합니다.




 2) 위에서 저장한 ppk 파일을 선택해줍니다.



 3) 아래와 같이 정상적으로 추가된것을 확인할수 있습니다. 이제 해당 창을 닫습니다.



3. Putty.exe 를 실행합니다. 

 1) Host Name 에 아마존의 Public DNS ( 혹은 Elastic IP ) 를 입력하고 Open 을 합니다. ( 물론, 트레이에는 Pageant 가 떠있어야 합니다. )



 2) 최초 접속시 해당 얼럿이 뜰겁니다. Yes 를 누릅니다.





  


 3) 계정으로 root 를 입력합니다. 정상접속이 되었습니다. !!



4. Psftp.exe 를 실행합니다. ( 당연히 이놈도 Pageant 가 실행되어있어야 겠죠? )


 역시 계정에 root 를 입력하여 정상 접속되는 것을 확인할 수 있습니다.

 기념으로 이미지하나는 드래그하여 put 해봅니다.




끝!!


시작할 때 StartEventCapture() 호출

종료할 때 EndEventCapture() 호출


StartEventCapture() 호출하면 WM_INPUT 메시지가 발생함

GetRawInputData를 사용해서 키보드, 마우스 이벤트를 가져오면 됨.

void StartEventCapture()
{
	RAWINPUTDEVICE rawInputDev[2]; 
	ZeroMemory(rawInputDev, sizeof(RAWINPUTDEVICE)*2);

	// 키보드 RAWINPUTDEVICE 구조체 설정	
	rawInputDev[0].usUsagePage = 0x01;
	rawInputDev[0].usUsage = 0x06;
	rawInputDev[0].dwFlags = RIDEV_INPUTSINK;
	rawInputDev[0].hwndTarget = GetSafeHwnd();

	//마우스 RAWINPUTDEVICE 구조체 설정
	rawInputDev[1].usUsagePage = 0x01;
	rawInputDev[1].usUsage = 0x02;
	rawInputDev[1].dwFlags = RIDEV_INPUTSINK;
	rawInputDev[1].hwndTarget = GetSafeHwnd();                 

	if( FALSE == RegisterRawInputDevices(rawInputDev, 2, sizeof(RAWINPUTDEVICE)) )
	{
		CString str;
		str.Format(_T("RegisterRawInputDevices Error %d"), GetLastError());
		MessageBox(str);        
	}
}

void EndEventCapture()
{
	RAWINPUTDEVICE rawInputDev[2]; 
	ZeroMemory(rawInputDev, sizeof(RAWINPUTDEVICE)*2);

	// 키보드 RAWINPUTDEVICE 구조체 설정	
	rawInputDev[0].usUsagePage = 0x01;
	rawInputDev[0].usUsage = 0x06;
	rawInputDev[0].dwFlags = RIDEV_REMOVE;//     <== 이부분이 틀림
	rawInputDev[0].hwndTarget = GetSafeHwnd();

	//마우스 RAWINPUTDEVICE 구조체 설정
	rawInputDev[1].usUsagePage = 0x01;
	rawInputDev[1].usUsage = 0x02;
	rawInputDev[1].dwFlags = RIDEV_REMOVE;//    <== 이부분이 틀림
	rawInputDev[1].hwndTarget = GetSafeHwnd();                 

	if( FALSE == RegisterRawInputDevices(rawInputDev, 2, sizeof(RAWINPUTDEVICE)) )
	{
		CString str;
		str.Format(_T("RegisterRawInputDevices Error %d"), GetLastError());
		MessageBox(str);        
	}
}


LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	if( message == WM_INPUT )
	{	
		UINT   dwSize = 40;
		static BYTE lpb[40];
		GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
		RAWINPUT* raw = (RAWINPUT*)lpb;
				
		if( raw->header.dwType == RIM_TYPEMOUSE ) 
		{
			int xPosRelative = raw->data.mouse.lLastX;
			int yPosRelative = raw->data.mouse.lLastY;

			if( raw->data.mouse.ulButtons == 0 ) // move
			{		
				InvalidateRect(CRect(0,50,150,100));
			}
			else if( raw->data.mouse.ulButtons == 1 /*|| m_bLbuttonDragging*/ ) // l-button down  
			{	
			}
			else if( raw->data.mouse.ulButtons == 2 ) // l-button up
			{
			}
			else if( raw->data.mouse.ulButtons == 4 ) // r-button down
			{
			}
			else if( raw->data.mouse.ulButtons == 8 ) // r-button down
			{
			}
			else
			{
			}
		} 

		if( raw->header.dwType == RIM_TYPEKEYBOARD ) 
		{
			CString str;
			str.Format( _T(" Kbd: make=%04x Flags:%04x Reserved:%04x ExtraInformation:%08x, msg=%04x VK=%04x \n"), 
			raw->data.keyboard.MakeCode, 
			raw->data.keyboard.Flags, 
			raw->data.keyboard.Reserved, 
			raw->data.keyboard.ExtraInformation, 
			raw->data.keyboard.Message, 
			raw->data.keyboard.VKey);	

			MSG msg;
			memset( &msg, 0, sizeof(MSG) );
			msg.hwnd = m_hWnd;
			msg.message = raw->data.keyboard.Message;
			msg.wParam = raw->data.keyboard.VKey;			

			//    KeyMessageProcessing( &msg );
			OutputDebugString( str );
		}
	}

	return CDialog::WindowProc(message, wParam, lParam);
}



주소값 참조

=INDIRECT("a"&TRUNC(ROW()/2)+1)


INDIRECT : 주소 지정

TRUNC : 소수점 이하 버림

ROW : 행번호 반환


개행문자

=CONCATENATE("A",CHAR(10),"B")

http://blog.naver.com/PostView.nhn?blogId=syhjjang1&logNo=150160913001


"Microsoft Office Outlook을 시작할 수 없습니다. Outlook 창을 열 수 없습니다. XML이 잘못되어 보기를 로드할 수 없습니다."


요런 메시지가 발생했을 때


CMD에서 다음과 같이 입력


outlook /resetnavpane

로봇 다빈치, 꿈을 설계하다

로봇 다빈치, 꿈을 설계하다

데니스 홍

나는 결코 천재가 아니다
나는 내 꿈을 설계했을 뿐이다!
로봇 다빈치, 꿈을 설계하다

세계 각국 천재들이 지식 경연을 벌이는 ‘TED 2011 컨퍼런스’에 한국인 최초로 홍원서 버지니아 공대 교수가 강연자로 나섰다. 그는 미국 <파퓰러 사이언스>가 과학계를 뒤흔드는 젊은 천재 10인으로 뽑은 천재 로봇 공학자이다. 또한 그는 2009년에는 앞을 보지 못해도 운전할 수 있는 시각장애인용 자동차 개발에 성공했다. 보다 나은 미래를 위해 연구하는 젊은 과학자로 우뚝 서게 된 것...



RoMeLa 연구소를 이끄는 미국 버지니아텍 데니스 홍 교수의 이야기입니다.
저는 세바시 강연을 통해 데니스 홍 교수를 알게됐고 책까지 사서 보게 되었습니다.
이 책은 시각 장애인용 자동차의 개발과정, 영화 스타워즈를 보고 로봇공학자가 되기로 결심한 이야기, 유년/청소년 시절, RoMeLa에서 만든 로봇들에 대한 이야기, 교수로서의 이야기와 로봇에 대한 윤리적 고찰 등 여러가지 이야기로 엮어져있습니다.

이 책을 통해 다수의 이야기를 통해 데니스 홍 교수의 살아가는 방식, 삶의 철학과 추구하는 바에 대해 간접적으로 알 수가 있었는데요,
먼저 데니스 홍 교수는 뚜렷한 목표 의식이 있었습니다. 스타워즈를 보고 결정한 로봇공학자라는 큰 목표와 더불어 꿈을 이뤄가는 그 과정에서의 작은 목표들을 하나 하나 이뤄갔습니다. 어렸을 적 '전국 어린이 과학실험대회'에서 금상타기, 대학가기(현실에 실망했지만..), 교수되기, 연구비 모으기, 여러 프로젝트 및 TED 등. 목표를 이뤄가다 보니 다른 목표도 생기고 또 그 과정에서 배우고 성장하는 모습이었습니다. 또한 목표가 뚜렷하다보니 목표와 관련된 학문에 저절로 관심이 생기고 동기부여가 되며 그래서 즐겁게 공부하고 일할 수 있었던거 같습니다. 데니스 홍 교수도 책에서 '동기 부여'에 대한 중요성을 강조하고 있습니다.

또한 좋은 습관의 필요성을 느꼈습니다. '왜?'와 메모! 데니스 홍 교수는 무엇이든 허투루 보고 지나가는 것이 없었습니다. 어렸을 때 가전제품을 다 뜯어봐야했고 과학실험에 매진할 수 있었던 이유는 사물에 대한 호기심 때문이었습니다. '왜'라는 질문을 항상 하면서 사는것 같습니다. 또한 메모하는 습관이 있어서 과거의 메모를 통해 insight를 얻는 경우도 있다고 했습니다. 스트라이더에 대한 아이디어도 과거의 메모에서 아이디어를 얻었죠.

마지막으로 '세상을 이롭게 하자'는 마인드입니다. 시각 장애인용 자동차, 오픈소스 다윈-OP, 재난 구조용 로봇 '토르'. 자신만의 유익을 구하지 않고 약자를 위한 기술, 생명을 위한 기술 또한 기술의 나눔을 통해 단순히 돈만을 버는 것이 아닌 그것을 넘어서는 기쁨과 과학자로서의 자부심을 느끼는 것 같습니다.

내용이 어렵지 않고 재미있어서 술술 읽었던 책이었습니다.
책과 더불어 아래 링크의 세바시 강연을 추천합니다.


세바시 260회 휴머노이드 : 축구선수에서 구조대까지@ 데니스홍 RoMeLa 소장

세바시 261회 Follow your Dreams, not the Trends @데니스홍 RoMeLa 소장

TalkShow 로봇다빈치 데니스홍을 만나다 @데니스홍 RoMeLa 소장

글로벌 소프트웨어를 꿈꾸다

글로벌 소프트웨어를 꿈꾸다

김익환

이 책은 실리콘밸리의 소프트웨어 회사와 국내 소프트웨어 회사의 차이점이 무엇인지 살펴보고, 그 차이점을 일으키는 것이 무엇인가에 대하여 이야기 하고 있다. 저자는 그것이 지식과 기술보다는 바로 '개발문화, 기업문화'에 있다고 말한다. 이 책에서는 세계 수준에 근접한 기술과 기법은 그에 걸맞은 균형 잡힌 사고와 문화 수준이 어우러질 때 극대화될 수 있다는 것을 극명하게 보여주고 있다. 따라서 이 책에서는 우리나라의 소프트웨어 회사가 어떻게 소프트웨어 회사로 성장할 수 있을 것인지 그 필요한 사항들을 세심히 짚어준다. 이 책은 특히...







이 책은 저자의 경험을 바탕으로하여 소프트웨어 회사의 경영진 및 실무진의 역할 및 나아가야할 방향에 대한 노하우가 담겨있다. 저자는 소프트웨어 회사가 성공하기 위한 다섯 가지 조건으로 기반시스템, 조직, 프로세스, 기술 및 문화를 제시하고, 또한 경영진의 통찰력의 중요성을 강조한다.

몇 가지 기억에 남는 내용들을 아래 적어보자면,


이슈관리시스템, 소스관리시스템으로 대표되는 기반시스템은 곧 업무의 효율성으로 이어진다.


CTO는 기술적인 면에서 가장 권위가 있어야 하는데 국내 회사는 그렇지 못한 곳이 많으며, 국내에선 어느 정도 경력이 쌓이면 관리자가 되는데 이는 기술에서 필연적으로 멀어지며 이러한 관리자가 기술적인 면을 판단하는 일은 없어야 된다.

프로세스의 효과를 얘기하면서도,기업문화가 잘 정착되어 있지 않으면 아무리 좋은 문서화, 프로세스, 시스템이 있어도 효과적으로 돌아가지 않는다.


소프트웨어 공학은 양날의 칼이다. 잘 적용하면 좋은 약이 되지만 잘 못 적용하면 극약과 같다. 주먹구구식으로 개발하면서 소프트웨어 공학에서 언급하는 문서글 추가로 만드는 방식이라면 이는 극약으로 쓰는 것이다. CMMI와 같은 프로세스도 잘 쓰면 명약이지만 제대로 적용할 수 있는 환경이 안 된 곳에서는 극약과 같은 상황이 벌어진다.


비싼 도구가 개발을 도와주지 않는다.


컨퍼런스에 참여해라. 이미 인터넷에 있는 정보는 세상 모든 사람이 다 아는 정보다. 프레스 컨퍼런스, BOF세션(P2P세션) 또는 저녁식사를 통해 엔지니어와 교류해라(여기서 영어회화가 필요하다는...).


기업문화라고 하면 간단히 말해 일을 할 때 내 의지와는 상관없이 의식적으로 혹은 무의식적으로 따라할 수 밖에 없는 환경이라고 할 수 있다. 국내 소프트웨어 회사에 가장 부족한 것이 기업문화이다. 예를 들어, 제품 개발이 막바지에 이르렀는데 사장님이 와서 보고는 어떤 부분이 마음에 안 드니 고치라고 한다거나...


일정강요는 소프트웨어 회사의 재앙의 근원 중 첫째가는 것이다. 일정준수율과 같은 KPI(Key Performance Index) 때문에 일정을 지키기 위해 품질은 뒷전이 된다. 프로세스 관점의 평가지수가 효과적인다.


이 외에도 갖가지 주제로 국내 소프트웨어 회사에 부족한 점들을 펼쳐놓았다. 읽어보며 많이 공감가는 부분들도 있었다. SW 엔지니어라면 읽어볼만한 책이다.

The Art of Software Testing (Second Edition) 한국어판

The Art of Software Testing (Second Edition) 한국어판

글렌포드 마이어스 저 / 톰 뱃지트, 토드 토마스, 코리 샌들러 공편 / 이공선, 권원일 공역

글렌포드 J. 마이어스가 쓴 이 책은 소프트웨어 테스팅 분야에서 한 획을 그은 진정한 명서이며 고전이다. 테스팅에 대한 일반적인 내용을 개발과 연계해 최근 출간된 그 어떤 책보다 오히려 더 체계적이고 설득력 있게 소개한다. 또한 인터넷 애플리케이션 테스팅, 익스트림 테스팅 등 테스팅의 최신 내용도 같은 맥락에서 다뤄 30여 년 전에 저자가 정립한 테스팅 이론의 탁월성과 적용성을 입증하고 있다. 이 책은 소프트웨어 테스트 엔지니어만을 위한 것은 아니다. IT 전문가라면 누구나 한 번은 읽어야 할, 글자 그대로 소프트웨어 테스팅의 ...






저자 : 글렌포드 마이어스
목차
1장 자체평가 테스트
2장 프로그램 테스팅의 심리학과 경제학
3장 프로그램 인스펙션과 워크스루, 리뷰
4장 테스트 케이스 설계
5장 모듈 테스팅
6장 고수준 테스팅
7장 디버깅
8장 익스트림 테스팅

TTA에서 진행하는 SW 테스팅 전문자 일반과정 교육을 가게 되어 교육 전후로 해서 읽어본 책입니다.
SW 테스팅이라는 이슈는 최근들어 그 중요성이 부각되고 있는거 같습니다.
이전까지는 SW 테스팅이라는 분야에 대해 잘 몰랐는데 교육과 더불어 이 책을 통해 그 중요성과 방법을 알게 되었습니다.

2장의 내용이 꽤나 재밌는데요
테스팅과 심리학/경제학은 무슨 상관이 있을까요?
내용의 시작점에서 테스팅의 정의를 내리고 진행됩니다.
"테스팅은 에러를 찾기 위해 프로그램을 실행하는 프로세스다."

심리적인 면에서 테스팅은 누가 해야되며 어떠한 마음가짐으로 임해야 되는지 알려주고 있습니다.
경제적인 면에서는 무작 테스팅을 하는 것이 아니라 전략(블랙박스/화이트박스 테스트)을 가지고 임해야 되는 이유를 알려주고 있습니다.
모든 경우의 수를 테스팅하는 것은 불가능에 가깝기 때문이죠.

이후의 내용으로 테스팅의 방법에 대해 기술합니다.

아래 내용에 해당되시는 분들 추천합니다.

SW 테스팅이 왜 필요한지 알고 싶은분
정적/동적 테스트가 무엇이고 알고 싶은분
테스트 케이스 설계방법을 알고 싶은분
자주보던 단계별 개발계획(V모델)에서의 테스트를 어떻게 해야되는지 알고 싶은분

+ Recent posts