올해부터 호주 멜버른에서 IT 개발 직군에 종사하는 한국어 구사자를 위한 Weird Developer Melbourne이 운영되고 있다. 2월 16일 밋업에 발표했던 자료인데 정리해서 올린다고 하고 두 달이나 지나서야 올리게 되었다.

dnx 대신 dotnet으로 변경한다는 이야기가 한참 있었는데 그 이후로 follow up 하지 못했다. 아래 내용은 발표 당시를 기준으로 한 환경 설정이다. 발표에서 Entity Framework을 사용하기 위해 sqlite3도 포함되어 있다.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/vivid64"
  config.vm.network "forwarded_port", guest: 5000, host: 8080
  config.vm.network "public_network"
  #config.vm.network :private_network, id: "192.168.33.20"
  config.vm.synced_folder ".", "/home/vagrant/weirdnote"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
  config.vm.provision "shell", path: "tools/vagrant/provision.sh"
end

의존 패키지 설치

$ sudo apt-get update
# DNX prerequisites
$ sudo apt-get install -y unzip curl libunwind8 gettext libssl-dev \
  libcurl4-openssl-dev zlib1g libicu-dev uuid-dev
# install libuv for KestrelHttpServer
$ sudo apt-get install -y automake libtool
# sqlite3
$ sudo apt-get install libsqlite3-dev
$ curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz \
 | sudo tar zxfv - -C /usr/local/src
$ cd /usr/local/src/libuv-1.4.2
$ sudo sh autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install
$ sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
$ sudo ldconfig

DNVM 설치

# install DNVM
$ curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh \
 | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
# dnvm set as coreclr
$ dnvm upgrade -r coreclr

NodeJS 설치

# nvm install
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh \
| bash
$ source ~/.nvm/nvm.sh
# install node
$ nvm install v5.5.0
$ nvm alias default v5.5.0
# node related
$ npm install -g yo bower grunt-cli gulp
$ npm install -g generator-aspnet

터미널을 사용하다보면 영문자를 아스키 아트로 출력해서 프로그램명이나 제작 크레딧을 멋지게 꾸민 경우를 종종 볼 수 있다. FIGlet은 영문자를 입력하면 아스키 아트로 출력해주는 간단한 도구다. 앞서 살펴본 cowsay도 있지만 이 도구는 문자를 직접 아스키 아트로 출력한다는 점이 다르다.

이 도구도 상당히 오래 전에 개발되었기에 어느 플랫폼이든 손쉽게 설치할 수 있다.

$ brew install figlet
$ apt-get install figlet

사용 방법도 간단하다. figlet 명령과 출력하려는 텍스트를 입력하면 된다.

$ figlet HelloWorld
 _   _      _ _    __        __         _     _ 
| | | | ___| | | __\ \      / /__  _ __| | __| |
| |_| |/ _ \ | |/ _ \ \ /\ / / _ \| '__| |/ _` |
|  _  |  __/ | | (_) \ V  V / (_) | |  | | (_| |
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_|  |_|\__,_|

-f 플래그로 다른 폰트도 사용 가능하다. 다른 폰트는 FIGlet 사이트에서 폰트를 받아 추가할 수 있다.

$ figlet -f isometric1 jeju

       ___         ___            ___         ___     
      /\  \       /\  \          /\  \       /\__\    
      \:\  \     /::\  \         \:\  \     /:/  /    
  ___ /::\__\   /:/\:\  \    ___ /::\__\   /:/  /     
 /\  /:/\/__/  /::\~\:\  \  /\  /:/\/__/  /:/  /  ___ 
 \:\/:/  /    /:/\:\ \:\__\ \:\/:/  /    /:/__/  /\__\
  \::/  /     \:\~\:\ \/__/  \::/  /     \:\  \ /:/  /
   \/__/       \:\ \:\__\     \/__/       \:\  /:/  / 
                \:\ \/__/                  \:\/:/  /  
                 \:\__\                     \::/  /   
                  \/__/                      \/__/    

사실 이 도구는 cli 외에도 각 프로그래밍 언어마다 이미 구현이 있을 정도다.

이제 터미널로 접속할 때마다 뜨는 메시지, 밋밋한 콘솔의 서비스명을 더 힙하게 표시해보자!

REST API를 테스트하는데 curl과 wget을 사용할 수 있겠지만 좀 더 읽기 쉽고 사용하기 좋은 도구가 있다. HTTPie는 cURL-like tool for humans라는 멋진 태그라인을 갖고 있는 강력한 CLI 도구다. 따지고 보면 curl에서도 모두 가능한 기능이지만 플래그를 주렁주렁 입력할 필요가 없이 간편하게 사용할 수 있고 컬러 스킴이 있어 훨씬 읽기 편하다.

이 도구는 온갖 패키지 관리자에 다 들어있기 때문에 있는 패키지 관리자로 설치하면 된다. 파이썬으로 작성된 도구라서 pip로도 설치 가능하다.

# 하나만.. 다음 중 하나만 설치
$ brew install httpie
$ port install httpie
$ apt-get install httpie
$ yum install httpie
$ pip install httpie

사용 방법은 아주 단순하다.

$ http httpie.org

http [flags] [METHOD] URL [ITEM [ITEM]] 형태로 보낼 수 있다.

# HTTP 메소드와 해더, JSON 데이터 전송
$ http PUT example.org X-API-Token:123 name=John
# 폼 전송
$ http -f POST example.org hello=World
# request 출력
$ http -v example.org
<figure style="width: 722px" class="wp-caption alignnone">
cURL보다 간단하게 사용할 수 있다. 별 내용 아니지만 색깔 이쁘면 보기 좋지 않습니까.

이외에도 세션과 같은 다양한 기능을 제공한다. auth는 auth 플러그인으로 제공하고 있고 외부 json 파일이나 바이너리 파일을 전송하는 기능도 있다. curl만큼 방대한 기능을 제공하고 있으니 HTTPie 리포지터리를 확인해서 어떤 유용한 기능이 있는지 살펴보는 것도 좋겠다.

요즘은 REST API 테스트하는 도구가 워낙 잘 나와서 curl도 잘 안쓰게 되는 편이긴 하다. 그래도 간단한 테스트는 HTTPie로 더 쉽고 간단하게 수행할 수 있어서 요긴하게 사용하고 있어 만족스럽다.

이전에도 iterm을 설치했었지만 키맵이 영 익숙해지지 않고 기본 터미널과 맞추려니 이것저것 찾아보는게 귀찮아서 계속 터미널을 사용하고 있었다. neovim을 설치하는 차에 iterm3 베타가 나왔다는 얘기가 생각나서 iterm도 설치했다.

Opt + 방향키로 단어 사이 이동을 종종 하는 편인데 iterm 키맵엔 이 설정이 포함되어 있지만 쉘에서 추가적인 설정이 필요하다. 구글링 해보면 ~/.inputrc에 다음과 같이 추가하면 동작한다고 하는데 이 방법은 bash를 사용하는 경우에 해당한다.

"\e\e[D": backward-word
"\e\e[C": forward-word

zsh의 경우는 ~/.zshrc에 다음처럼 추가하면 된다.

bindkey "\e\e[D" backward-word
bindkey "\e\e[C" forward-word

추가. 설정할 때는 몰랐는데 iTerms의 키맵이 어떻게 되어 있는가에 따라 다르다. junho85님의 경우는 아래 키맵으로 설정했다고 한다.

bindkey -e
bindkey "^[[1;9C" forward-word
bindkey "^[[1;9D" backward-word

호주에 온지 벌써 5년차에 접어들었다. 아직도 시내를 돌아다가 멜번 온 첫 날에 잠을 청했던 백팩커 숙소 앞을 지나면 그 날이 자연스럽게 생각난다. 받은 카드로 문을 열지 못해서 이걸 어떻게 말해야하나, 우물쭈물 한참을 고민하다가 카운터에 카드를 들고가서 “카드 이스 낫 워킹”을 외치니 “The card is broken, right? no worries mate” 이라고 답하던 그 호주 억양이 아직도 생생하다.

6인실이었던 내 도미토리는 모두가 장기체류였고 그런 탓에 온갖 빨래며 물건들이 널려있었다. 그렇게 짐을 내려놓고 샤워하러 갔을 때 그 소독약 냄새도 아직도 기억 난다. 그때 바깥 네온사인에 제대로 잠을 자지 못하던 기억도, 무얼 어떻게 사먹어야할지, 환율을 매번 계산하면서(그땐 무려 1달러에 1200원 남짓) 한참 고민했던 기억이 난다.

지금까지 지내오면서 크고 작은 일들도 있었고 새로운 사람을 만나는가 하면 오래 알던 사람을 떠나 보내기도 했다. 호주에 온 이후로 온라인을 통해 만난 사람들을 찾아가 직접 만나기도 했고 가족이 나를 보러 호주에 찾아오기도 했다. 여기서 일자리를 찾게 되어 자리를 잡고, 못할 것만 같던 이런 저런 활동에도 참여하고 있고, 무엇보다 작년에 집을 렌트해서 혼자 살게 된 이후로는 또 새로운 도전을 시작한 느낌이다.

타지 생활을 하면서 때로는 가족에게 걱정 끼칠까 쉽게 말할 수 없는 것도 있었고 주변 사람들 각자 자신의 삶에서 고군분투 하는데 짐을 더해주는 것은 아닐까 하고 선뜻 내 어려움을 토로할 수 없었다. 그래도 주변에서 심적으로나 물적으로, 오프라인 뿐만 아니라 온라인에서도 도와준 많은 분들 덕분에 호주에 잘 정착해서 지금까지 지내올 수 있어서 너무나도 감사하다. 그 고마움을 보답할 수 있도록, 그리고 그런 도움을 주변에 줄 수 있도록 더 성장하고 싶다.

여전히 영어도 쉽지 않고 미래에 대한 고민을 많이 한다. 올해에는 고민보다 행동이 우선되는 삶을 살자 다짐했던 것처럼, 고민을 하기 전에 먼저 작게 시작하는 것이 내 삶에 더 필요하다. 호주에 도착했던 그 날을 다시 생각하면서, 무모하게만 보였던 그 도전과 자신감을 오늘 다시 세워본다.

터미널을 사용하다보면 사소하지만 유용한 스크립트를 작성할 때가 종종 있다. 스크립트로 작성한 코드로 결과를 그냥 출력할 수 있지만 다소 밋밋하게 느껴본 적은 없었는지 생각해보자. 빌드가 완료되거나 업스트림에 머지하는 스크립트가 Done.만 출력하면 실용적이긴 하지만 아쉬움이 있다. 그 부족함을 느꼈다면 cowsay를 사용해서 더 터미널 힙스터답게 메시지를 출력할 수 있다!

cowsay는 아스키아트와 함께 원하는 메시지를 출력할 수 있게 해주는 프로그램이다. 1999년부터 있던 프로그램이라서 터미널을 쓴다면 한번쯤은 어디선가 이미 봤을지도 모른다. perl로 작성되었다.

설치는 apt-get, homebrew 등 대부분의 패키지 관리자에서 제공한다.

$ apt-get install cowsay
$ brew install cowsay

사용 방법은 간단하다.

$ cowsay Hello World
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

cowsay는 fortune이랑 자주 나온다. fortune은 포춘 쿠키에 들어있는 쪽지와 같은 내용을 출력하는 프로그램이다. fortune도 apt-get, brew 등으로 설치할 수 있다.

$ fortune | cowsay

-f 플래그를 사용하면 소 이외에도 다른 그림으로 사용할 수 있다. 사용할 수 있는 그림 목록은 -l 플래그로 확인할 수 있다.

$ fortune | cowsay -f sheep
 _________________________________________
/ This night methinks is but the daylight \
| sick.                                   |
|                                         |
| -- William Shakespeare, "The Merchant   |
\ of Venice"                              /
 -----------------------------------------
  \
   \
       __     
      UooU\.'@@@@@@`.
      \__/(@@@@@@@@@@)
           (@@@@@@@@)
           `YY~~~~YY'
            ||    ||

cow 파일을 COWDIR에 추가하면 자신이 직접 만든 메시지로도 사용할 수 있다. cowsay를 검색해보면 이 프로그램 이후에도 정말 다양한 언어로 작성되었다. 포니를 좋아한다면 ponysay도 살펴보자.

점점 각박하게 변해가는(?) GUI의 세계에서, 이 작은 메시지 출력까지도 아름답게 아스키아트로 표현하고야 마는 선현들의 낭만을 배워야 할 필요가 있다. 😀

Linux나 windows 환경을 사용하다가 OS X 환경을 사용했을 때 가장 답답하게 느끼는 부분 중 하나가 backspace 키 속도가 상당히 느리다는 점이다. OS X는 backspace 키를 다른 기능 키와 조합해서 행 단위, 단어 단위 제거 등 더 많은 영역을 한 번에 지울 수 있는 기능을 제공하고 있어서 그런지 초기 지연 값이 상당히 크게 잡혀 있는 것 같다. 반복키 설정을 변경하는 것으로 그나마 다른 OS와 비슷하게 설정할 수 있다.

반복 키 설정은 시스템 환경설정 > 키보드(System Preferences > Keyboard) 에서 느린 키 반응(Key Repeat)과 반응 지연 시간(Delay Until Repeat) 설정을 최대한 빠르게 변경할 수 있지만 최대한 빠르게 설정해도 다른 OS 만큼 빠르게 반응하지 않는다.

터미널을 이용해서 이 반응값을 더 빠르게 조정할 수 있다. 먼저 현재 설정된 값을 확인하기 위해 다음 명령을 사용할 수 있다.

$ defaults read NSGlobalDomain InitialKeyRepeat
$ defaults read NSGlobalDomain KeyRepeat

첫 번째 명령어가 반응 지연 시간을 반환하고 두 번째 명령어는 느린 키 반응을 반환한다. 반응 지연 시간 값을 가장 빠르게 설정했을 때 15, 느린 키 반응 값은 2에 해당한다. 이 값을 변경하기 위해서 다음처럼 입력할 수 있다.

$ defaults write NSGlobalDomain InitialKeyRepeat -int 11
$ defaults write NSGlobalDomain KeyRepeat -int 2

이렇게 값을 입력한 후에 다시 시스템 환경설정에서 해당 슬라이더를 움직이면 값이 다시 초기화 된다. 너무 작은 수치 또는 0을 입력하면 지나치게 민감하게 입력되니 그런 경우에는 위 명령어로 다시 값을 변경하거나 초기화를 위해 시스템 환경설정에서 값을 변경하자.

조금은 생산적인 도구를 소개하는 것도 좋을 것 같아 GitHub 서비스를 위한 도구를 소개한다. GitHub API를 이용한 ghi가 꽤 많은데 API v3에 맞춰 현재까지 관리되고 있는 도구로 ghi가 있다. Github 리포지터리에 등록된 issue를 CLI에서 관리할 수 있도록 기능을 제공한다.

brew로 설치하거나 Ruby로 작성되어 있어서 gem으로도 설치 가능하다.

$ brew install ghi
$ gem install ghi

curl로도 설치할 수 있다.

$ curl -sL https://raw.githubusercontent.com/stephencelis/ghi/master/ghi > ghi && \
$ chmod 755 ghi && mv ghi /usr/local/bin

설치 후에 토큰을 발급 받기 위해서는 다음 명령이 필요하다.

$ ghi config --auth <GitHub 사용자ID>

맥에서는 키체인을 이용해서 토큰과 사용자 정보를 저장하는데 키체인의 문제인지 제대로 동작하지 않는다.1 그래서 내 경우는 수동으로 입력했는데 token을 위 방법으로 발급 받은 다음, GitHub access tokens 페이지에서 생성된 토큰을 Edit > Regenerate token 해서 다음과 같이 환경변수를 지정해줬다.

$ export GHI_TOKEN=<재생성한 access token>

이제 ghi를 입력하면 현재 배정된 이슈 목록이 출력되며 전체 목록은 필터 플래그를 이용해 ghi list -f 'all'로 확인할 수 있다. ghi helpghi help <명령어>로 도움말을 확인하자.

이제 웹브라우저 없이도 GitHub 이슈를 추적할 수 있다!

다른 도구도 많이 있는데 대부분 v2이 deprecated 된 이후로 업데이트 되지 않거나 전혀 관리되지 않고 있어서 아쉽다.

  • 리포지터리에 가도 관련 이슈가 넘쳐 나는데 해결책이 뚜렷하지 않다. 
  • spring의 gradle로 프로젝트 시작하기를 따라하며 정리한 글이다.

    먼저 brew로 java와 의존성 및 빌드 관리/자동화 도구인 gradle을 설치한다.

    $ brew tap caskroom/cask
    $ brew install brew-cask
    $ brew cask install java
    $ brew install gradle
    

    문제없이 설치되었다면 버전 정보를 출력한다.

    $ gradle -v
    

    gradle로 프로젝트를 초기화한다.

    $ gradle init
    

    초기화하면 기본적으로 gradle wrapper를 생성해주는데 이 스크립트는 gradle이 없는 환경에서도 gradle을 사용할 수 있도록 돕는 스크립트다.

    예제 클래스를 먼저 작성한다.

    $ mkdir -p src/main/java/hello
    
    // src/main/java/hello/HelloWorld.java
    
    package hello;
    
    public class HelloWorld {
      public static void main(String[] args) {
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
      }
    }
    
    // src/main/java/hello/Greeter.java
    
    package hello;
    
    public class Greeter {
      public String sayHello() {
        return "Hello world!";
      }
    }
    

    빌드와 관련한 모든 설정은 build.gradle에 담겨 있다. 빌드를 위해 다음 내용을 build.gradle에 추가한다.

    apply plugin: 'java'
    

    그리고 빌드를 하면 build 디렉토리를 생성하고 빌드를 진행한다.

    $ gradle build
    

    아래 내용을 추가해서 어플리케이션을 직접 구동할 수 있다.

    apply plugin: 'application'
    mainClassName = 'hello.HelloWorld'
    

    gradle을 설치한 환경에서는 gradle을 사용해도 되겠지만 다음과 같이 앞에서 생성한 wrapper를 사용해서 구동할 수 있다.

    $ ./gradlew run
    

    다음은 튜토리얼에서 최종적으로 작성하게 되는 gradle 파일이다.

    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'application'
    
    mainClassName = 'hello.HelloWorld'
    
    // tag::repositories[]
    // 서드파티 라이브러리의 소스 출처를 추가한다
    repositories {
        mavenCentral()
    }
    // end::repositories[]
    
    // tag::jar[]
    // 빌드에서 jar를 생성할 때 메타를 추가한다
    jar {
        baseName = 'gs-gradle'
        version =  '0.1.0'
    }
    // end::jar[]
    
    // tag::dependencies[]
    // 버전 의존성을 추가한다
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    // 의존 라이브러리를 추가한다
    dependencies {
        compile "joda-time:joda-time:2.2"
    }
    // end::dependencies[]
    
    // tag::wrapper[]
    // wrapper로 설치할 gradle version을 정한다
    task wrapper(type: Wrapper) {
        gradleVersion = '2.3'
    }
    // end::wrapper[]
    

    bash나 zsh에서는 작업 제어(job control)을 기본적으로 제공하고 있다. 현재 동작하고 있는 프로그램을 백그라운드로 보내거나 백그라운드에 있는 프로그램을 다시 꺼내서 사용하는 것도 가능하다.

    평소에 다음과 같이, 끝에 &을 붙여 명령어를 사용해본 적이 있다면 자신도 모르는 사이에 이미 사용하고 있다는 뜻이다.

    $ npm start &
    [1] + running    npm start
    

    먼저 간단하게 예제를 보자. 다음 예시는 간단하게 sleep을 사용하고 있다. &와 함께 실행하면 백그라운드로 구동한다는 의미다.

    $ sleep 10 &
    [1] 3901
    $ sleep 20 &
    [2] 3902
    $ sleep 30 &
    [3] 3903
    

    현재 실행하고 있는 작업 목록은 jobs로 확인할 수 있다.

    $ jobs
    [1]   running    sleep 10
    [2] - running    sleep 20
    [3] + running    sleep 30
    

    현재 실행하고 있는 프로세스를 일시 정지하고 백그라운드로 보내는 키는 Ctrl + z다. (tmux를 사용하고 있다면 이 키로는 동작하지 않을 수 있다.)

    $ vim hello
    # <Ctrl + z>을 누름
    [1] + 4049 suspended   vim hello
    

    다시 해당 프로세스를 포그라운드로 부르기 위해서는 fg 명령을 사용할 수 있다. fg 뒤 인자는 직접 입력해도 되지만 tab 키를 누르면 알아서 자동완성 해준다.

    $ fg %1
    $ fg %vim\ hello
    

    만약 백그라운드에서 일시 정지가 아니라 계속 구동하려고 한다면 어떻게 해야 할까? 그때는 백그라운드 명령인 bg를 사용할 수 있다.

    $ sleep 30
    # <Ctrl + z>을 누름
    [1] + 4050 suspended  sleep 30
    $ bg %sleep
    # 아래처럼 간단하게 가능
    $ %sleep &
    [1] - 4050 continued  sleep 30
    $ jobs
    [1] - 4050 running    sleep 30
    $
    [1] - 4050 done       sleep 30
    

    알고 나니 별 내용은 아니지만 지금까지 전혀 모르고 사용했다는 점에 반성하는 마음에서, 그리고 매번 백그라운드를 끌 줄 몰라서 kill을 당해야만 했던 수많은 프로세스를 추모하며 작성했다. 지금까지 몰랐다는데 참 억울하지만 앞으로는 프로세스 번호 찾으려고 애쓸 일이 없다는 점이 참 감사하다.

    색상을 바꿔요

    눈에 편한 색상을 골라보세요 :)

    Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.