폴드 기능
코드의 특정영역을 접을(fold) 수 있는 기능입니다.
먼저 v 혹은 ctrl+v 를 눌러 원하는 영역을 선택후
z를 누른후 f (접기)
z를 누른후 o (접기해제)
z를 누른후 c (다시접기)

해더파일 읽어오기
소스파일에서 읽어오고자 하는 해더 파일의 이름에 커서를 둡니다.
ctrl+wf 를 입력하면 창이 수평으로 분할 되면서 파일이 열리게 됩니다.

자동완성 기능의 사용
타이핑을 하다가 ctrl+p 나 ctrl+n 을 누르면 자동완성기능을 이용할 수 있습니다.
ctrl+p (커서 위치에게부터 위를 향하면서 자동완성이 가능한 단어가 있는지를 찾음)
ctrl+n (아래로 내려가면서 찾음)
일반적으로 ctrl+n 보다 ctrl+p 를 많이 사용합니다.

여러개의 파일 편집
$vim file01.c file02.c file03.c
:b1 ~ :b3 가 매칭이 됩니다.
:b2 를 입력하면 file02.c 가 열립니다.
:bw 누르면 파일을 닫습니다.

여러개의 파일 편집2
$vim -p file01.c file02.c file03.c
지정한 문서들이 탭형식으로 열립니다.
:tabn (다음탭), :tabp (이전탭)
:tabnew (새로운탭으로 문서열기)

셀 명령어 사용
:!명령어 (vim으로 빠져 나갔다가 명령이 수행된후 다시 vim으로 돌아감)
Ctrl+z (셀로 빠져나갔다가 vim 으로 돌아오려면 fg 명령사용)

Posted by 빨강토끼
,
rsync 에는 ssh 를 이용하여 원격서버에 접속하여 동기화를 하는 기능이 있습니다.

대략의 내용은 아래와 같습니다.
rsync -azrtv --delete --stats -e "ssh -i /root/.ssh/개인키" 원본서버계정@원본서버주소:원본경로/ /백업경로/

그럼. 자세히...

일단 접속하기 위한 원격주소의 계정 정보가 필요합니다.
즉 ssh 로 원격서버로 로그인을 하는것입니다.
하지만 crontab을 이용하여 자동으로 스케쥴링을 하려면은 암호를 입력하는 단계가 걸림돌이죠
바로 자동로그인을 해야된다는 의미입니다.

그러기위해서는 ssh 키를 이용하는데
먼저 키를 생성합니다. 주의 할점은 개인키를 가진쪽이 공개키를 가진쪽으로 접속한다는 것입니다.
즉... 접속대상서버가 아니라 접속을 시도하는 백업서버에서 키를 만든다는 것입니다.
[~]$ ssh-keygen -d -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/inkaftp/.ssh/id_rsa):
Created directory '/home/inkaftp/.ssh'.
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again: <ENTER>
Your identification has been saved in /home/inkaftp/.ssh/id_rsa.
Your public key has been saved in /home/inkaftp/.ssh/id_rsa.pub.
The key fingerprint is:
11:ce:7a:2d:60:0d:09:b3:2a:8b:3f:de:9a:8f:96:20 root@nhn.com

아무것도 입력하지않고 엔터만 두번누르면 RSA 방식의 키가 생성됩니다.

.ssh/id_rsa
.ssh/id_rsa.pub

위와 같은 파일이 생성된것을 발견할 수 있습니다.

그다음으로는 공개키를 전송합니다.
#scp /root/.ssh/id_rsa.pub 원본서버계정@원본서버아이피:~/.ssh/authorized_keys
원본서버계정에 .ssh 디렉토리가 없으면 미리 만들어둬야합니다.
패스워드를 입력하면 끝

(하지만 전 scp 가 잘되지 않아서 그냥...ftp 로 전송했습니다.)

그럼 접속이 잘되는지 확인해봅시다.
#ssh -i /root/.ssh/id_rsa 원본서버계정@원본서버아이피
RSA key fingerprint is 03:c0:4d:25:a6:5d:0c:41:70:a7:11:0e:f7:12:ee:c8.
Are you sure you want to continue connecting (yes/no)? yes <ENTER>
접속이 잘된다면 성공

이제 본격적으로 rsync를 사용해봅시다.
rsync -azrtv --delete --stats -e "ssh -i /root/.ssh/id_rsa" 원본서버계정@원본서버주소:원본경로/ /백업경로/

-a : 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v : 자세한 정보출력
-z : 전송시 압축
-r : 하위디렉토리포함
-e ssh : ssh를 이용한 rsync 동기화
--delete : 서버동기화후 원본에서 파일이 삭제되면 백업에서도 파일을 삭제
--stats : 결과출력

백업이 잘되면 자동화를 위하여 cron에 등록합니다.
먼저 rsync 명령을 실행할 .sh 파일을 만듭니다.
# vi ./rsync_cron.sh
rsync -azrtv --delete --stats -e "ssh -i /root/.ssh/id_rsa" 원본서버계정@원본서버주소:원본경로/ /백업경로/

파일을 만들고나서는 실행권한을 줍니다.
#chmod 755 ./rsync_cron.sh

crontab 을 실행합니다.
#crontab -e
30 4 * * * /root/rsync_cron.sh

참조
http://blog.naver.com/forioso?Redirect=Log&logNo=10025992292
Posted by 빨강토끼
,
솔찍히 조금만 구글링을 하면 보다더 자세히 설명해주고 있는곳이 많지만 제가 필요할때 마다 참조하려고 개인적정리입니다. (즉 대충... 자세한 설명은 생략)

1. redmine DB 백업
mysqldump -uroot -p비밀번호 redmine디비명 | gzip > /백업경로/redmine_`date +%y_%m_%d`.gz

2. redmine 첨부파일백업
rsync -avz --delete /redmine설치경로/files /백업경로
or
rsync -avz --delete -e ssh /redmine설치경로/files 사용자계정@서버아이피:/원격의백업경로

-a : 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v : 자세한 정보출력
-z : 전송시 압축
-r : 하위디렉토리포함
-e ssh : ssh를 이용한 rsync 동기화
--delete 서버동기화후 원본에서 파일이 삭제되면 백업에서도 파일을 삭제

3. 일정날짜가 지난 백업파일을 삭제
find /백업경로 -name *.gz -mtime +90 -delete

4. 위의 과정을 진행하는 sh 파일작성
vim bkscript.sh

5. crontab 을 사용하여 주기별로 sh 파일을 실행
#분 시 일 월 요일(월=1 화=2 ... 일=7)
0 6 * * 6 /백업경로/bkscript.sh

참조
http://khtinsoft.egloos.com/379902
http://blog.nul.kr/246
Posted by 빨강토끼
,

maven 으로 jar 를 생성하여 배포할때 종속적인(dependency) 라이브라리들이 실행시 필요합니다.

war 프로젝트는 WEB-INF 라는 폴더아래로 필요한것들을 넣어주지만 jar에서는 일일히 dependency로 추가된
라이브러리들을 처리하는것이 무척 귀찮고 막막합니다.

하나씩 잡아줘보지만 한두개도 아니고....
이럴땐 2가지 방법이 있습니다.

첫번째는 dependency를 따로 폴더안으로 모두 복사해오고 META-INF/MENIFEST.MF를 수정하는 것입니다.
아래와 같이 플러그인을 추가하고 goal로 install을 실행하면 모든 dependency 들이 lib안으로 복사하여 모으고 jar파일생성시  META-INF/MENIFEST.MF를 수정합니다.




두번째방법은 jar 안에 모든 dependency를 포함시키는 것입니다. jar하나로 모든 라이브러리들이 포함되어 실행이 되는 구조입니다. 당연히 파일크기가 커지겠지요.



그리고
maven assembly:assembly 라고 콘솔에서 실행하면
abc-0.0.1-SNAPSHOT.jar
abc-0.0.1-SNAPSHOT-jar-with-dependencies.jar

위와 같이 라이브러리가 포함된 jar와 일반 jar 가 생성된것이 보입니다.

참조

http://entireboy.egloos.com/4615383
http://redrebel.tistory.com/entry/maven-으로-생성한-jar-파일이-실행이-안될때-NullPointerException


Posted by 빨강토끼
,


좋은 코드의 정의
-유지보수성이 높다
-신속하고도 효율적으로 동작한다.
-정확하게 동작한다.
-불필요한 부분이 없다.

코드를 분할 하는 이유
-가독성의 향상 : 매소드의 사이즈가 100행이 넘으면 가독성이 떨어짐, 30행이 적당함.
-유지보수성의 향상
-재이용성의 향상

내부클래스의 장점
-실제로 사용되는 장소 바로근체에 클래스가 있으므로 알기 쉽다.
-원래 클래스와의 의존관계(dependencies)를 static으로 제어할 수 있다.
-새로운 파일을 늘리지 않아서 좋다.

추상화의 예
-공통적인 처리를 정리하여 부모클래스를 작성하기
-데이터베이스의 접속 정보를 설정파일로 외부 추출하기
-비슷한 행동( 메소드)을 인터페이스로 추출하기

추상화란 '비슷한 것을 동일하게 취급함으로써 프로그램을 간단하게 하는것' 이다.


Posted by 빨강토끼
,
자바를 잘몰라 배우고 있는데 C/C++ 처럼 seek 을 이용하여 임의의 파일포인터위치부터 읽기가 가능한 함수를 찾았습니다.

RandomAccessFile() 입니다.
InputStream이나 OutputStream의 서브 클래스는 아니지만 파일의 읽기, 쓰기를 위한 독립적인 메소드를 제공합니다.
아래는 간단한 예제입니다.




내용은 간단합니다. 텍스트형식의 파일을 읽고 10줄까지 화면에 뿌린후 읽은곳 까지의 포인터위치를 저장후
파일을 닫고 다시 연후 좀전에 저장한 포인터 위치부터 읽어서 화면에 뿌리는 형식입니다.


참조
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/RandomAccessFile.html
Posted by 빨강토끼
,


위와 같은 에러가 나오면서 maven 에서 mvn install 을 통해서 생성한 jar 파일이 실행이 안되는 경우가 있습니다.
이경우에는 실행가능한 jar를 생성할때 실행할 mainClass 를 지정하지 않아서 생기는 문제입니다.

실행가능한 JAR 를 만드는데 아래와 같은 단계를 추천합니다.

1. JAR 의 MAINFEST.MF 파일에서 main 클래스를 정의합니다. (MAINFEST.MF 파일을 Maven에서 애플래케이션을 패키징할때 생성되는 파일입니다.)
2. 프로젝트에 종속된 모든 라이브러리를 찾습니다.
3. 애플리케이션에서 해당 라이브러리를 참조할수 있도록 MAINFEST.MF 파일에 포함시킵니다.

위의 작업을 수동으로 직접할 수 도 있지만 maven-jar-plugin 과 maven-dependency-plugin 이라는 maven 플러그인을 사용하여 효율적으로 수행할 수 있습니다.

maven-jar-plugin
pom.xml 파일의 <build></build> 안에 아래내용을 추가합니다.



mainClass 에 실행할 메인클래스를 지정합니다.

maven-dependency-plugin

pom.xml 파일의 <build></build> 안에 아래내용을 추가합니다.


위와 같이 내용을 추가하였으면 다시 jar를 만들고 실행해 보면 실행이 될겁니다.

참조 :
https://www.ibm.com/developerworks/kr/library/j-5things13/
Posted by 빨강토끼
,

니시무라 아키라 지음 권일영 옮김

-한주의 시작을 일요일 밤 10시부터
-다이어리의 역할은 시간관리, 스케줄관리, 정보관리, 인맥관리
-정보란 모으지 ㅇ낳아도 곤란하고 도 모앗어도 정리해야 하며 게다가 필요할 때 바로 꺼내 쓸수 없으면 무용지물인것이다.
-가장 주용한 것은 업무를 잘하는 것이다. 다이어리를 사용하는 것은 그자체가 목적이 아니다. 업무를 잘하기 위한 방법인 것이다.
-포스트잇을 사용하여 항상 메모하라.
-다이어리는 시간을 만드는 도구이다.
-꿈을 이루는 방법 가운데 하나. 그것은 다이어리에 적는것이다.
Posted by 빨강토끼
,