Java Tutorial User Style

Java 공부를 다시 해 보자는 생각에 Online Java Tutorial을 읽고 있다. 안식 동안 빨리 마물해야 할 숙제 중 하나. 암튼… 예전(거의 15년 전 처음 Java 배울때 이걸로 시작했었음. 당시 교수님이 숙제를 Java로 코딩하라시는 바람에 책 사긴 싫고… 그래서 ㅎ)에도 그랬지만 읽기 편한 스타일이 아니다. 그래서 이 참에 User Style Manager를 이용해 읽기 편하게 좀 스타일을 수정해봤다. 꽤 오래되고 유명한 확장 기능인데 제대로 사용하는건 처음인듯.

사용한 소스는 아래와 같으니 한번 사용해보심이~? ^^

@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document url-prefix('http://docs.oracle.com/javase/tutorial/') {

    #PageTitle h1 {
        font-family: georgia, serif !important;
        font-size: 24px !important;
    }
    #PageContent {
        font-size: 18px !important;
    }
    #PageContent h2, #PageContent h3, #PageContent h4, #PageContent h5 {
        font-family: georgia, serif !important;
    }
    #PageContent h2 {
        font-size: 22px !important;
    }
    #PageContent h3 {
        font-size: 20px !important;
    }
    #PageContent h4 {
        font-size: 18px !important;
    }
    #PageContent, #PageContent a {
        line-height: 1.6 !important;
        font-family: georgia, serif !important;
    }
    #Footer2 {
        display:none;
    }
    .FigureCaption {
        text-align: inherit !important;
        font-family: inherit !important;
    }
    
    @media (max-width: 1024px) {
    
        #MainFlow {
            margin-left: 20px !important;
        }
        #LeftBar {
            display: none;
        }
    }
}

역시 책 읽기는 큰 글씨에 Serif 체가 좋은거 같다.

Move Text

eclipse에서는 줄의 위치를 alt-up/alt-down으로 이동할 수 있어 참 편하다. emacs에는 기본 명령어로 제공되지 않는데… What the .emacs.d!?에 함수가 올라왔다. 써 봤더니 move-line-up 함수에 버그(?)가… 맨 마지막 줄을 내리면 끝없이 내려간다. 어떻게 할까 고민중에 댓글 중에 EmacsWikiMove Text라는게 있어서 잘 쓰고 있다는 글이 있어서, 바로 package-install move-text로 설치. 잠깐 써보니 잘 동작하는것 처럼 보였는데, paredit랑 충돌 나는 듯. move text의 소스코드를 보면 기본적으로 M-upM-down를 함수에 바인딩해 두었는데 이걸 C-S-up, C-S-down으로 변경. 결론은 잘 쓰고 있음.

emacs cocoa 에서 terminal 로 변경

ㅠㅠ 그냥 cocoa 빌드로 복귀. command 키 사용 설정이 문제다. 안쓰자니 불편한 점이 넘 많다. 대표적으로 clipboard가 동기화되지 못하는 문제.

빌드랑 상관없는 거지만 일단 ctrl키를 caps lock 키로 변경해서 사용하기롬 함.

그동안 cocoa로 빌드해서 Mac Application으로 사용했었는데, terminal 버전으로 사용하는것으로 시도. 몇 가지 문제가 있지만 가장 큰 문제점은 한글 폰트. 고정크기폰트를 사용할 때 문자 간격을 조정할 수 없어, 한글 폰트의 경우 크기를 키우는 수밖에 없는데 무척 보기 싫었다.

두번째는 한글 입력 문제. 문론 leim을 이용하면 전혀 문제가 없긴 한데, shift-space나 command-space를 이용할 수 없고, 시스템의 IME와 emacs의 한영 변환이 서로 꼬이면 입력시 구찮은 문제들이 발생.

cocoa 옵션을 빼고 빌드(brew install emacs)한 후 terminal에서 사용해 보니, 일단 alt(option)키가 안먹어서 ESC를 사용해야 하고, command도 안먹는데, 복사/붙여넣기가 불편. 이건 방법을 찾아봐야 겠다.

권한은 책임에서 나온다.

예전 울 회사 CTO 이셨던 이명종 님이 오셔서 리더십 교육을 해 주셨는데 교육 중 기억에 남는 이야기.

조직에 있는 사람은 누구나 권한이 없어서 어떤 일을 못한다고 한다. 하지만 권한은 누가 주는 것도 아니고 직급이 올라간다고 해서 생기는 것도 아니다. 자기가 가진 책임만큼이 자기의 권한이다.

권한이 많아지려면 책임을 많이 져야 한다는 뜻.

누구도 책임지지 않고 권한도 없어 보이는 업무 영역은 어떻게 할 것인가? 내 업무 영역을 확장하면 이러한 영역의 일에 대한 권한이 나에게 생긴다.

아래 그림을 보면 확실해 진다.

업무 확장과 권한 증가

얘기한 내용과 동일한 워딩은 아니겠지만 이렇게 난 이해했다. 그런데, 이런 얘기들은 모두 일에 대한 열정과 동기가 충만한 사람들에게만 해당될 것이다. 사실 일을 하다 보면 그렇지 않은, 그냥 월급을 받기 때문에 일을 하는 사람들이 많아 보인다.

Working with Unix Processes

Working with Unix Processes

Processes Have File Descriptors

모든 것(file, socket, pipe 등)이 다 파일이다. 프로세스에서 리소스를 열면 file descriptor number를 부여한다. 연 프로세스에서만 사용할 수 있고, 프로세스가 죽으면 닫힌다. file descriptor는 열린 파일에 대해서만 의미 있음(open file descriptor number). 닫으면 사라진다(?). 처음으로 파일을 열면 file descriptor number가 3인데, 0, 1, 2는 STDIN, STDOUT, STDERR 이다.

Processes Have Resource Limits

하나의 프로세스가 열수 있는 파일 수에는 제한이 있다. Process.getrlimit(:NOFILE) 결과는 soft limit과 hard limit. soft limit은 실제 한계가 아니다. 예외 발생하지만 조절할 수 있다. hard limit값은 Process::RLIM_INFINITY과 동일한 값이 나온다. 즉, 무한대 의미. Process.setrlimit으로 limit 조절할 수 있는데 조절할 수 있는 리소스 종료는 문서 참조. httperf에서 부하를 주기 위해 동시 접속 수를 늘리기 위해 사용. 외부 코드가 실행될 때 리소스 사용을 제한하기 위해 사용.

TYPO : Process::RLIMIT_INFINITY => Process::RLIM_INFINITY

Process Have an Environment

Environment는 환경 변수 의미한다. 모든 프로세스는 부모 프로세스로부터 환경 변수 상속 받는다. ENV는 hash 같지만 사실 hash가 아니므로 모든 Hash API를 사용할 수 있다고 생각하지 마라(ruby에서 얘기인듯).

Process Have Arguments

모든 프로세스에는 ARGV라는 speical array가 있다. 프로그래밍 언어별로 다르게 구현. 어쨌든 비슷한게 있음. 프로세스가 실행할 때 전달된 arguments를 담고 있다. ARGV는 배열이다(ruby).

Process Have Names

모든 프로세스는 이름을 가지며 변경할 수 있다. $PROGRAM_NAME(ruby). irb에서 값 변경하고 shell에서 ps 실행하면 변경된거 확인할 수 있다.

Process Have Exit Codes

전통적으로 종료 코드 0은 정상 종료를 의미. ruby 얘기. exit는 정상 종료(0), 종료 전에 at_exit 블럭을 실행한다. exit!는 비정상 종료(1). at_exit 블럭을 실행 안함. abort는 비정상 종료(1), 종료 전에 at_exit 블럭을 실행. exit!abort 뭐가 다른거? at_exit 블럭 실행 여부? 마지막으로 raise 예외를 처리 안하기.

Process Can Fort

실행중인 프로세스가 새로운 프로세스를 만드는 것. 새로운 프로세스는 원 프로세스의 복사본이다. fork된 자식 프로세스는 fork 시점에서 부모 프로세스가 사용하는 메모리와 file descriptor를 복사받아 공유할 수 있다. fork는 아주 빠르게 실행된다. fork로 만들어진 자식 프로세스가 해당 프로그램을 처음부터 다시 실행하는 것은 아님. 생성 상태에서 자식 프로세스로 실행된다. 책의 예제에서, 자식 프로세스는 if 앞에 있는 puts를 실행하지 않음. 멀티 코어 CPU에서 fork할 경우 모두 다른 core에서 프로세스가 실행된다고 보장할 수 없음.

Orphaned Processes

부모가 종료된 자식 프로세스들. 쉘에서 프로그램 실행하고 이놈이 자식 프로세스 생성했는데, Ctrl-C 해서 부모 프로세스 죽으면 자식은? 부모가 죽어도 자식은 암 영향 없이 계속 실행된다. 고아 프로세스 관리는? 일단 2가지 개념부터 – 데몬은 의도된 orphaned 프로세스다. 유닉스 시그널을 이용해 프로세스간 통신할 수 있다.

Processes Are Friendly

fork 하면 메모리를 그대로 복사하는데 성능 문제가 있을 수 있다. 최신 유닉스에서는 CoW(copy-on-write) semantic을 사용하는데, 부모로부터 상속받은 메모리 영역을 수정하는 순간에 복사하는 기법. 문제는… MRI(ruby 참조 구현체), Rubinius(ruby 플랫폼, ruby 코드로부터 byte code 생성)는 CoW 지원하지 않는다. Ruby Enterprise Edition에서는 지원한다. fork를 많이 써야 하는 상황이면 Ruby Enterprise Edition 사용을 고려해라.