발생일: 2012.01.08

문제:
구글 클로저 컴파일러로 여러 개의 자바스크립트 파일을 압축하려고 한다.
컴파일러는 jar 형태로 되어 있고, --js 와 --js_output_file 옵션으로 입출력 파일을 구분할 수 있다.

  $ java -jar compier.jar --js one.js --js two.js --js three.js --js_output_file output.js

이런 식이다.

파일 개수가 많아져서 가독성 좋게 옵션을 라인 단위로 작성하고 싶다.
우째야 하나.


해결책:
기초 중의 기초란다. ㅎㅎ

라인으로 구분되어 있지만, 명령이 한 줄이라는 것을 알려주기 위해 백슬래쉬(\)를 사용하면 된다.

  $ java -jar compier.jar \
     --js one.js \
     --js two.js \
     --js three.js \
     --js_output_file output.js


# 참고
  http://www.grymoire.com/Unix/Quote.html#uh-0 
  http://stackoverflow.com/questions/3871332/how-to-tell-bash-that-the-line-continues-on-the-next-line
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.20

문제:
터미널에서 입력 상태를 종료할 때엔, Ctrl+D를 눌러 종료한다.
그러다가 문득, Ctrl+D 가 무슨 뜻인지 궁금해졌다.
뭔가 d로 시작하는 약자인가?

그러고보면, Ctrl+C 랑은 어떤 차이가 있는 거지?
 

해결책:
Ctrl+D (^D)"end of file" 을 의미한다.
터미널이 입력 상태이고, 라인의 맨 처음일 때에만 작동한다.


Ctrl+C (^C)"interrupt" 를 의미한다. 
실질적으로는 stop 명령을 내리는 INT signal 을 보낸다.


비슷하게 Ctrl+\ (^\) 로 QUIT signal을 보내서 종료할 수도 있다.
Ctrl+Z (^Z) 는 현재 진행 중인 작업을 백그라운드로 보낸다. (종료되는 것이 아니다) 
  - Wikipedia: End-of-transmission character


저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.19

문제:
유닉스 가이드를 읽던 중 아래와 같은 예제 구문이 나왔다.

$cat notexist > /dev/null 2>&1

저 /dev/null 2>&1 형태는 예전에 크론탭 동작하는 쉘에서도 언뜻 본 기억이 있는데,..
정확히 무슨 뜻일까?
 

해결책:
위 구문을 이해하기 위해 일단 유닉스의 파일 디스크립터(File Descriptor)에 대해 알아보자.

유닉스 프로그램이 파일에 뭔가 작업을 하기 위해서는 일단 파일을 열어야 한다.
이 때, 유닉스는 열려있는 파일을 구분하기 위해 파일에 간단한 숫자를 붙인다.
이 숫자를 파일 디스크립터라고 하고, 0부터 9까지 존재한다.

유닉스 프로그램은 기본적으로 아래 3개의 "파일"을 열어둔다.
- Standard Input (표준 입력, STDIN, 키보드)
- Standard Output (표준 출력, STDOUT, 스크린)
- Standard Error (표준 에러, STDERR, 스크린에 뿌려질 에러 메세지)

열려있는 표준 파일은 구분을 위해 숫자(파일 디스크립터)를 할당받으며, 각각 아래와 같다.
STDIN = 0, STDOUT = 1, STDERR = 2

0, 1, 2 외의 파일 디스크립터(3~9)는 추가로 열리는 다른 파일을 구분하기 위해 사용된다.


리다이렉션(redirection, 재지향)은 열려있는 파일의 입출력을 다른 파일로 변활할 때 사용된다.
리다이렉터는 ">"로 나타내며, 쉽게, "모든 출력은 꺽쇠의 방향으로!" 라고 이해하면 된다. 
 

라다이렉터는 파일 디스크립터와 함께 사용될 수 있으며, 몇 가지 예를 들면 아래와 같다.

  > file
      표준 출력을 파일로 보낸다.
  1> file
      위와 동일하다. > 앞의 1은 표준 출력에 대한 파일 디스크립터를 나타낸다. 
  2> file 
      에러 출력을 file 로 보낸다.
  < file
      file로부터 표준 입력을 받는다.
  0< file
      위와 동일하다. < 앞의 0은 표준 입력 파일 디스크립터를 나타낸다.
  i>&j
      
i번 파일 디스크립터를 j번 파일 디스크립터로 리다이렉트한다.
      즉, i가 가리키는 파일의 모든 출력은 j가 가리키는 파일로 보낸다. 


따라서, 위 문제점에서의 구문은 아래와 같은 형태로 정리될 수 있다.
$cat notexist > /dev/null 2>&1

cat notexist : notexist 파일의 내용을 조회해서,
: (표준 출력으로) 나오는 결과를 다음 파일로 보낸다.
/dev/null
: 유닉스의 블랙홀과 같은 파일이다. 이 파일을 모든 출력을 흡수한다. (보이지 않는다.)
2> : 에러 메세지가 발생할 경우에는, 즉 에러 출력을,
&1 : 1번 표준 출력 파일 디스크립터가 참조하고 있는 곳으로 보낸다.

즉, 조회한 내용과 발생한 에러 모두 표시하지 않겠다는 뜻이었다.
 

 
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.18


문제:
유닉스에서 파일 권한(permission 또는 mode) 변경하는 방법에 대해 알아보자.


해결책:
일단 현재 파일의 상태가 어떤 지 알아보기 위해 조회해본다.
ls -l    ("Long format" 으로 조회)


목록 중 가장 왼쪽의 컬럼이 현재 파일에 대한 권한(file mode) 정보를 나타내는 것이다.
-rwxr-xr--

위 문자열은 각각 아래를 의미한다.
-                rwx            rwx              rwx
파일타입     user 권한    group 권한    other 권한


파일 타입(file type)에는 아래와 같은 종류가 있다. (여기서는 - 와 d 만 알고 있어도 충분하다.)
- : plain file. 일반 파일. 실행 파일도 포함한다.
d : directory. 디렉토리 형식.
l : link. 다른 파일을 가리키는 링크 파일.
p : pipe. 두 개의 프로그램을 연결하는 파이프 파일. 
b : block device. 블럭 단위로 하드웨어와 반응하는 파일.
c : character device. 스트림 단위로 하드웨어와 반응하는 파일.


파일에는 3개의 권한이 표시되는데, 각각 유저(user), 그룹(group), 모든 사용자(other)를 나타낸다.
user 는 파일의 소유자를, group 은 파일이 포함된 그룹을, other는 그 외 나머지 사용자를 의미한다.
이 세 권한 그룹을 UGO 라고 표현하기도 한다.


rwx 문자열은 각각, 읽기(Read), 쓰기(Write), 실행(Execute)을 의미한다. 
해당 권한이 있을 경우, 각각 r,w,x 로 표시하고, 권한이 없을 경우엔 대시(-)를 표시한다.


고로, 위 예제에서 제시되었던 -rwxr-xr-- 는, 파일 정보가 아래와 같다는 것을 의미한다.
- : 일반 파일이다.
rwx : 파일 소유주는 읽고, 쓰고, 실행 가능하다.
r-x : 파일 그룹의 유저는, 읽기와 실행만 가능하다.
r-- : 나머지 유저는, 읽기만 가능하다.


유닉스에서 파일 권한을 변경하기 위해서 chmod 명령어를 사용한다. (chmod = "change mode")
chmod [권한] [파일]
chmod g+w test     # test 파일에, 그룹(g) 쓰기(w) 권한을 추가(+) 한다.
chmod o-x test      # test 파일에, 나머지 사용자(o)의 실행(x) 권한을 제거(-) 한다.


아래와 같이 여러 심볼을 묶어서 권한을 할당할 수도 있다.
chmod u+rwx test  # user 에 rwx 권한을 추가한다.
chmod ugo+rx test
chmod u+x,g+rw,o-r test


매번 심볼을 사용하기 불편하다면 간편하게 숫자로 설정할 수도 있다.
rwx 는 각각, 아래와 같은 숫자 값을 가진다.
r = 4
w = 2
x = 1 
- = 0 


각 그룹에 대한 권한을 숫자를 합한 값으로 한자리로 표현할 수 있다.
rw- = 4 + 2 + 0 = 6
r-x = 4  + 0 + 1 = 5
rwx = 4 + 2 + 1 = 7

 
숫자를 이용해 권한을 설정하는 예는 아래와 같다.
chmod 755 test     # test파일의 권한을 rwxr-xr-x 로 설정한다.
chmod 654 test     # 654 = rw-r-xr--
chmod 4 test = chmod 004 test


 
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.16

문제:
맥에서 루비를 돌려보려고 하는데 버전 업데이트부터 막힌다.
터미널에서 이것 저것 설정해야 하는데, 맥 터미널이 아직 익숙치가 않다.

맥은 표준 유닉스 기반이라는데, 일단 디렉토리 구조가 어떻게 생겼는지 알아봐야겠다.


해결책:
아래는 유닉스 계열의 파일 시스템의 계층 구조 중 중요한 것 몇 가지를 정리한 것이다.

/
"root". 루트 디렉토리

/bin
"binary"의 약자. 유닉스에서 실행 가능하게 컴파일 된 바이너리 실행 파일.

/dev
"device". 하드웨어 디바이스 관련 파일.

/etc
"etcetera". 설정 파일이 저장되는 장소.
'기타'라는 의미가 적당하지 않아 혹자들은 "editable text configuration"의 약자로 의미.

/home
사용자 계정의 홈 디렉토리. Mac OS X 일 경우, /Users 폴더.

/lib
"library". Mac OS X 일 경우, /usr/lib 에 존재한다.

/sbin
"system-administrator's binary". 시스템 관리자가 사용하는 실행 파일.

/var
"variable". 수시로 변하는 파일에 대한 저장소. 예) 로그, 임시 메일 등.

/usr
"user". 모든 사용자가 사용할 수 있는 보조 계층 구조로 중요도가 낮은 파일들을 포함한다.
/usr/bin, /usr/lib, /usr/sbin 등 1차 계층과 디렉토리 구조는 동일하다.

/usr/local
3차 계층. 디렉토리 구조는 동일하며, 현재 사용자에게만 해당한다.
사용자가 임의대로 변경할 수 있다.



좀 더 자세한 내용은 아래 페이지를 참고.
  - 유닉스 파일 시스템 계층 구조 위키

저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.15

문제:
뒷 자리 과장님에게 맥에서 에디터는 뭘 쓰냐고 여쭤봤더니 맥빔(MacVim)을 쓴다고 하신다.
'빔'이라는데, 이게 뭐지? vi 의 확장판인가?


해결책:
VIM은 vi를 확장한 유닉스 문서 편집기라고 한다. (위키: http://ko.wikipedia.org/wiki/Vim)

MacVim은 맥용 vim 에디터이다.  (http://code.google.com/p/macvim/)
사용하고 있는 OS에 맞는 스냅샷을 다운로드 받은 후,
- MacVim.app 은 애플리케이션 폴더로~
- mvim 쉘스크립트는 적당한 폴더로 옮긴 후, path를 설정해주면 된다.


vi 에디터와 사용 방법은 비슷하고, 그 외에도 강력한 기능이 있다고 한다. (아직 경험은... -_-)
처음엔 좀 불편해도 익숙해지면 마우스 없이 굉장히 편하게 컨트롤 할 수 있을 것 같다.^^


* 뽀오너스.
크롬에서 vim 방식의 단축키로 서핑할 수 있는 익스텐션이 있다. 요고 아주 편하다! 


저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG macvim, vim, Vimium
발생일: 2010.01.19

문제:
unix 에서 현재 날짜를 출력하려면 date 커맨드를 날리면 된다.
그렇다면 포맷은 어떻게 지정해야 할까?

해결책:
이 포스트에 굉장히 잘 정리되어 있으니 참고해보자.
간단하게, date +FORMAT 형태로 사용하면 된다.
예를 들어, 10-01-19 23:11:12 를 표시하고 싶을 경우,
date "+%y-%m-%d %T" 와 같이 표현하면 된다.




저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.11.09

문제:
이번에 서버 변경 작업을 하면서 기존 서버에 crontab 으로 등록되어 있는 내용을 똑같이 옮겨왔다.
정해진 시간에 몇 개의 쉘 프로그램을 실행시키는 구문이었는데,
이 놈들이 정상적으로 실행되지 않는다.

확인해보니, 각 쉘 프로그램에서는 자바의 루트 디렉토리를 칭하는 JAVA_HOME 환경 변수를 사용하는데,
이번 서버 변경 작업때문에 자바의 디렉토리 위치가 변경되었기 때문이었다.

어쩔 수 없이 각 파일을 열어 JAVA_HOME 변수를 설정하다가 문득,
'환경 변수를 왜 모든 쉘 프로그램에 각각 등록해둔 거지..?' 라고 생각하면서
JAVA_HOME 변수를 .profile 에 환경 변수로 추가하고 쉘 프로그램에 등록되어 있던 JAVA_HOME 은 삭제했다.

테스트로 sh 파일을 수행해보니, 잘 돌아간다~

그런데~~ 다음 날, crontab 에서 에러가 났다~~~~
sh 파일만 따로 수행하면 문제없이 잘 되는데, 왜 이런 걸까...
혹시 crontab 에서는 유저의 환경 변수를 가져오지 못하는가...?

해결책:
crontab 은 환경 변수를 가지지 않은 체로 실행된다고 한다.
그래서 환경 변수를 사용할 경우, 각 쉘 프로그램에서 따로 설정해주어야 한다.
(기존에 모든 쉘 프로그램에 같은 내용의 환경 변수가 각각 설정되어 있던 이유가 이거였다...)

자세한 내용은 아래 포스트를 참고하자.


저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.10.26

문제:
UNIX 에서 Shell 파일을 생성했다.
실행하려고 shell 파일 명령어를 수행하니 실행할 수 없다고 나온다.
왜 안되는 걸까...?

해결책:
유닉스에서 최초로 파일을 실행했을 때에 기본적으로 Read 권한 밖에 주지 않는다. (예: -rw-r--r--)

따라서 파일을 생성 후 chmod 명령어를 수행해 파일 실행권한을 주도록 한다.

chmod 755 파일명


권한을 준 후 실행하면 정상적으로 실행이 된다.

여기서 chmod 는 권한 변경(change mode)에 대한 명령어이며,
권한에 대한 숫자는 아래와 같이 계산하면 쉽다.
 Read  Write Execute
4 2 1

또한 위의 755 는 각각 소유자, 그룹, 일반 사용자를 나타낸다.

자세한 내용은 chmod 명령어에 대한 포스트를 참고하자.


그 외에 쉘 프로그래밍에 대해 잘 정리해둔 위키가 있으니 참고하도록 하자.
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.10.23

문제:
온라인 보안 강좌를 보다가 SSL 적용에 관한 이야기가 나왔다.

가만,.. 예전에 https 인증서를 cafe24에서 구입하려고 봤더니 돈을 쫌 내라고 했었는데 말이야.
검색을 좀 해보니까, 사설 인증서를 만들어도 되는 모양이다...

이참에 관련 내용들을 좀 뽑아서 정리해두어야 겠다.

해결책:

IBM 컬럼 : SSL은 무엇인가?

사설 인증서와 관련된 포스트

Configuring Tomcat to Support SSL (With OpenSSL)


저작자 표시 비영리 변경 금지
Posted by ohgyun