2009년 11월 16일 월요일

[latex] verbatim에서 tab을 인식하도록 하려면?

latex에서 코드 등을 넣기 위해는 verbatim을 쓰는 것이 하나의 방법이다. verbatim을 이용하면 자동으로 고정폭 폰트를 사용하므로 코드를 삽입하기에 알맞다. 그러나 verbatim은 tab을 표현해주지 않는데, 가끔 indentation이 space가 아닌 tab으로 된 코드를 복사한 후에 latex compile을 하면 indentation이 전혀 표현되지 않아 난감한 경우가 있다.

이 경우에는 다음과 같이 해결할 수 있다.
\usepackage{moreverb}
를 우선 선언한다. moreverb가 설치되지 않았을 때는 따로 설치해야 한다. ubuntu의 경우에는 기본 패키지에 포함되어 있지 않으므로 다음 패키지를 설치해야 한다.
sudo apt-get install texlive-latex-extra
그리고 verbatim이 필요할 때,
\begin{verbatim} ... \end{verbatim}이 아닌,
\begin{verbatimtab} ... \end{verbatimtab}을 이용하면 된다.

tab size는 기본적으로 8이며, 이를 조정하고 싶을 때는 다음 명령어를 문서 앞에 두면 가능하다. 예제는 4로 변경한다.
\def\verbatimtabsize{4\relax}
숫자를 필요에 맞게 변경하자.

2009년 11월 13일 금요일

emacs & go

go language는 emacs에서 편집하기 위해 go mode를 제공한다. 그 밖에 vim과 xcode를 위한 모드를 제공하고 있다.

go를 설치한 폴더를 보면 misc폴더가 있는데(go/misc), emacs, vim, xcode 폴더가 있는 것을 알 수 있다.

emacs/ 에는, go-mode.el과 go-mode-load.el이 위치하고 있다.
(setq load-path (cons (expand-file-name "~/go/misc/emacs/") load-path))
(load-library "go-mode")
(setq auto-mode-alist (cons '("\.go$" . go-mode) auto-mode-alist))
를 .emacs에 추가하자.
물론 load-path에 있는 경로는 자신이 go를 설치한 곳으로 변경해주어야 한다.
이제 .go 파일을 열면 go mode가 적용되는 것을 볼 수 있다.

ps.
속도를 위해서는 바이트 컴파일 해두는 것이 좋을 것이다. 바이트 컴파일 하는 법은 여러 가지가 있지만 emacs에서 폴더를 열고 파일 리스트가 나오면 파일에 대고 대문자 B를 누르면 간단히 할 수 있다. 마우스로 하려면 Operate 메뉴를 눌러보자. Byte-compile이 있을 것이다.

.emacs

백업을 위해, 현재 사용하고 있는 .emacs 파일을 남겨둔다.

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(TeX-PDF-mode t)
 '(current-language-environment "UTF-8")
 '(default-input-method "korean-hangul3f")
 '(default-korean-keyboard "3f" t)
 '(show-paren-mode t)
 '(transient-mark-mode t))
(custom-set-faces
  ;; custom-set-faces was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
(set-background-color "#242424")
(set-foreground-color "#f6f3e8")
(set-cursor-color "#656565")
(set-face-foreground 'font-lock-comment-face "#99968b")
(set-face-italic-p 'font-lock-comment-face t)
(set-face-foreground 'font-lock-doc-face "#99968b")
(set-face-italic-p 'font-lock-doc-face t)
(set-face-foreground 'font-lock-constant-face "#e5786d")
(set-face-foreground 'font-lock-string-face "#95e454")
(set-face-italic-p 'font-lock-string-face t)
(set-face-foreground 'font-lock-variable-name-face "#cae682")
(set-face-foreground 'font-lock-function-name-face "#cae682")
(set-face-foreground 'font-lock-type-face "#cae682")
(set-face-foreground 'font-lock-builtin-face "#8ac6f2")
(set-face-foreground 'font-lock-keyword-face "#8ac6f2")
(set-face-foreground 'font-lock-preprocessor-face "#e5786d")
(set-face-foreground 'font-lock-negation-char-face "#e7f6da")
(set-face-foreground 'link "#8ac6f2")
(set-face-bold-p 'link t)
(set-face-underline-p 'link t)
(set-face-foreground 'show-paren-match "#f6f3e8")
(set-face-background 'show-paren-match "#857b6f")
(set-face-bold-p 'show-paren-match t)
(set-face-foreground 'region "#f6f3e8")
(set-face-background 'region "#444444")
(set-face-foreground 'lazy-highlight "black")
(set-face-background 'lazy-highlight "yellow")
 )

;(register-input-method
; "korean-hangul3f" "Korean" 'quail-use-package
; "한3" "한글 3벌식 최종: Hangul input method"
; "quail/hangul3f")

;; 세벌식 최종
(custom-set-variables
'(default-input-method "korean-hangul3f"))

;; AucTeX
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
(setq TeX-auto-save t)
(setq TeX-parse-self t)

;; Clean Emacs
(setq make-backup-files nil)
(setq inhibit-startup-message t)

;; Hangul Input
(global-set-key [?\S- ] 'toggle-input-method)

;; no beep
(setq visible-bell t)

;; go to the line
(global-set-key [(f5)] 'goto-line);

;; fontset
;(set-default-font "-misc-droid sans mono-medium-r-normal--12-0-0-0-m-0-iso8859-1")
;(set-fontset-font "fontset-default" 'korean-ksc5601 "-microsoft-gulim-medium-r-normal--12-0-0-0-p-0-ksc5601.1987-0")
(set-default-font "Droid Sans Mono-10")
(set-fontset-font "fontset-default" 'korean-ksc5601 "Gulim-10")

;; header identification
;; c, c++, objective c 소스 파일이 있느냐에 따라 헤더의 mode를 결정
(defun my-header-file-mode-hook ()
  (if (string-equal (file-name-extension buffer-file-name) "h")
      (let ((filebase (file-name-sans-extension buffer-file-name)))
        (cond
         ((file-exists-p (concat filebase ".m"))
          (objc-mode)
          )
         ((file-exists-p (concat filebase ".c"))
          (c-mode)
          )
         ((file-exists-p (concat filebase ".cpp"))
          (c++-mode)
          )
         ((file-exists-p (concat filebase ".cc"))
          (c++-mode)
          )
         ((file-exists-p (concat filebase ".mm"))
          (objc-mode)
          )
         (t
          (objc-mode)
          )
         )
        )
    )
  )
(add-hook 'find-file-hook 'my-header-file-mode-hook)

;; compile
(global-set-key [(f7)] 'compile)
(setq compilation-window-height 12)

;; 컴파일 창 자동으로 사라지도록 하는 것
;(setq compilation-finish-function
;      (lambda (buf str)
;    (if (string-match "exited abnormally" str)
;        ;;there were errors
;           (message "compilation errors, press C-x ` to visit")
;      ;;no errors, make the compilation window go away in 0.5 seconds
;         (run-at-time 15 nil 'delete-windows-on buf)
 ;        (message "NO COMPILATION ERRORS!"))))

;; go lang
(setq load-path (cons (expand-file-name "~/go/misc/emacs/") load-path))
(load-library "go-mode")
(setq auto-mode-alist (cons '("\.go$" . go-mode) auto-mode-alist))

2009년 11월 12일 목요일

Go Language를 설치해보자.

구글이 go라는 언어를 발표했다.

우선은 리눅스와 맥만을 개발 환경으로 두고 있는 듯 하다. Python과 C++을 합쳐 놓았다는 기사가 있었는데, 잠깐 살펴본 바로는 둘과 크게 상관은 없는 것 같다. 파이썬의 생산력과 C++의 속도를 모두 잡겠다는 것이 의도라고 go의 개발자들이 이야기하고 있는데, 그것을 강조해서 말하다 보니 오해를 불러 일으킬 수 있는 기사가 나간 것 같다.

이것은 잠시 딴 이야기지만 파이썬과 C++에 대한 언급은 조금 경솔했다고 생각한다. 개발자들에게 언어라는 것은 매우 민감해서 이런 발언이 긍정적인 효과를 불러올 확률은 매우 낮다. 두 언어를 다 모르는 사람에게는 호기심을 자극할 수도 있겠지만, 파이썬 개발자나 C++ 개발자는 "흥, 얼마나 잘난 언어일까?"하고 삐딱한 마음을 가질 가능성도 높다고 생각한다.

아직은 초창기이고 이름에 대한 논의까지 멈추지 않았으니 성숙하려면 한참은 걸릴 것 같다. 홈페이지를 둘러본 바로는 라이브러리가 꽤 잘 되어 있는 것 같고 문법도 깔끔한 편인 것 같으니 어떻게 성장해 나갈 지 흥미롭게 지켜볼 수 있을 것 같다. 게다가 뒤에는 구글이 있지 않은가!

설치를 해보자.

리눅스(ubuntu 9.10)를 사용하고 있기 때문에 설치를 해보고 샘플로 제공하는 hello, world를 해봤다. 설치법은 go 홈페이지에 잘 나와있다.

$GOROOT, $GOOS, $GOARCH 환경 변수를 설정해준다.
좀 더 친절하게 예를 들자면, .bashrc 파일 뒤에다가
export GOROOT=~/go
export GOOS=linux
export GOARCH=386
를 넣어주면 되겠다. 홈 디렉토리에 /go라는 디렉토리를 만들고 그 곳에 필요한 파일을 다운로드 하겠다는 것이고, 운영체제는 리눅스, 32비트라는 의미가 된다. go 언어 개발자들은 주로 64비트에서 실험을 하는 듯 하다. 가장 안정된 arch가 amd64(64-bit) 포트, 그 다음이 386(32-bit)이라고 말하고 있다.

한 가지 홈페이지에서 제안하는 환경 변수가 더 있는데 $GOBIN이다. go 언어의 컴파일러와 링커 등이 설치될 경로를 설정하는 변수인데, 지정하지 않을 경우 ~/bin 이 사용된다. 내 경우에는 홈디렉토리에 bin 디렉토리를 두고 있고 몇몇 스크립트 파일과 rar등을 넣어두고 있기 때문에 설정하지 않았지만 go를 /usr/bin이나 /usr/local/bin에 넣어두고 싶은 사람은 설정해두어야 할 것이다.

내 생각에는 시스템 폴더에 넣는 것은 그리 좋은 방법이 아닌 듯 하다. permission 문제도 있고. 그냥 ~/bin을 쓰는 것이 가장 좋을 듯.

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
라고 입력하면 소스를 죽 받아오게 되는데, Mercurial이 필요하다. 설치되지 않은 경우에는 우분투라면,
sudo apt-get install mercurial
로 간단히 설치할 수 있겠다. 다른 배포판에서는 알아서들.

go 디렉토리가 생성되게 되는데, go/src에 가보면 all.bash라는 파일이 있다. 실행하자. 한 번에 설치를 해주는 스크립트이다.
$ ./all.bash
한참을 작업하고는
--- cd ../test
0 known bugs; 0 unexpected bugs
$
라는 메시지와 함께 설치가 종료된다.

홈페이지에는 컴파일러의 실행 파일이 6g이지만 386 포트를 사용하게 되면 8g가 실행 파일이 된다.
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
$ 8g hello.go
$ 8l hello.8
$ ./8.out
hello, world
$
에러가 없기 때문에 아무 메시지도 출력되지 않는다. 8g는 컴파일러, 8l은 링커이고 기본 실행 바이너리의 이름은 8.out이 된다. hello, world가 깔끔하게 출력!

일단은 설치가 간편하고 깔끔한 느낌은 든다.

2009년 11월 5일 목요일

Bash history를 tcsh 스타일로

매번 까먹는 녀석. 백업용으로 블로그에 기록.

화살표키(up-arrow, down-arrow)로 현재까지 입력된 내용을 바탕으로 history search를 한다.

cat ~/.inputrc
"\e[A":history-search-backward
"\e[B":history-search-forward


2009년 11월 3일 화요일

a chicken-and-egg situation

Key exchange와 authentication에 대한 이야기를 하고 싶어, 제목을 이렇게 붙였지만, 이 문제가 닭이 먼저냐 달걀이 먼저냐 하고 물어볼 문제는 사실, 아니다. 당연히 key exchange가 먼저다. 아니, 이렇게 말할 것이라면 왜 제목을 이렇게 달았나?

좀 더 이야기를 해보자.

우선, "둘이 무슨 관계인가?" 싶은 사람이 있을 수 있기 때문에, 약간 일반적인 이야기를 꺼내보자. 생판 모르는 누군가의 신원을 증명하려면 what you know나 what you have를 통해 일반적으로 점검한다. 각각, 패스워드(암호, 무엇을 알고 있는가?)와 신분증(무엇을 가지고 있는가?)이 대표적인 예다.

통신을 하려 하는데, 상대방이 믿을 만한 녀석인지 알 방도가 없다. 서로 간에 내가 착한 놈이라는 것을 증명을 해야 하는데, 그러려면 증명할 어떤 것이 필요하다. 서로를 증명하기 위해서는 둘만 알고 있는(가지고 있는) 확실한 어떤 것이 필요한데, 이것을 여기서는 secure token이라고 하자. 이 secure token을 어떻게 나누어 가질 것인가? 이것이 정말로 어려운 문제다. 그래서 제목처럼 애매한 상황이 발생하는 것이다.

상식적으로 생각해보자. 당연히 secure token은 아무도 모르는 공간에서 둘만 만나서 은밀하게 결정하면 된다. 하지만 컴퓨터들은 physical contact를 하기 보다는 네트워크로 연결되어 있다. 네트워크가 안전하다는 보장을 위해서는 다시 secure token이 필요하므로(secure token을 key로 사용하여 데이터를 암호화 할 수 있을테니까) secure token을 안전하게 공유하기 위해서는 secure token이 필요한, 머리가 복잡한, 물고 물리는 상황이 연출되고 마는 것이다.

1976년에 Diffie와 Hellman이 멋진 수학식을 제시했다. unsecure channel에서도 안전하게(즉, 둘만 아는) 정보를 나누어 가질 수 있게 된 것이다. 그 이름도 유명한 Diffie-Hellman Key Exchange(Agreement)이다.

하지만 이것은 꽤나 복잡한 수학 계산을 필요로 한다. 모바일 기기의 중요성이 대두됨과 동시에 아직 그들의 성능이 뛰어나지 못한 관계로 사람들은 Diffie-Hellman을 사용하지 않고 시스템을 설계해보려고 많은 노력들을 하고 있다. 조그만 센서가 Diffie-Hellman을 사용할 수는 없기 때문이다. 좋은 논문 주제가 되는 것이다.

네트워크가 안전하지 않다면, 아직까지는 Diffie-Hellman외에는 획기적인 방법이 없다. 더 적은 계산량으로 도청꾼이 가득한 통신 채널을 통해서 어떻게 하면 안전하게 secret을 나누어 가질 수 있을까?

Any idea?