2010. 6. 9.

SSH 터널링 쉽게 외우기..

[계속 수정중..]

ssh 터널링은 ssh서버에 있는 22번 포트를 통해 해당 서버의 다른 포트와의 연결을 가능하게 해준다.

ssh 터널링을 보던중에 옵션과 원포트, 타겟포트/호스트 설정이 가끔 헷갈렸다.
일단은 쉽게 외우는 방법을 강구해봤다.

-L 로컬의 포트를 통해 ssh 서버의 ssh서비스를 통해 특정 포트로 접속한다. (외부서버에는 ssh서버있어야함)
-R 원격지의 정보를 로컬로 가져옴(또는 지정한 서버, 원격지서버에는 ssh서버있어야함)

예를 들어, 원격지 서버의 특정포트(예를 들어 Slime의 4005)를 접속하고는 싶다면?

이쪽에서의 열어줄 포트를 14005라고 하고 걸어보면..

ssh -L 14005:localhost:4005 [remote-host]

라고 하면된다. 이제 로컬의 14005포트에 TCP접속을 하면 ssh를 통해서 자연스럽게 원격지 4005 포트로 데이터가 전송된다. 물론 원격지 서버에는 ssh 서버가 있어야겠지만 말이다.

이 데이터는 달리 말하자면

ssh -R 4005:localhost:14005 [remote-host]

와 동일한 내용이다.(대상서버의 4005번 포트와 현재 서버의 14005 포트를 터널링)
-L과 -R은 서로 반대되는 내용을 기술하는 방편이라고 생각하는 것이 편하다.

다만 ssh -L의 경우는 상대편 서비스를 사용하겠다는 것이지만 ssh -R의 경우는 이쪽편의 서비스를 사용해야하는 경우가 된다. 따라서 포트를 매핑할 때, -L은 대상서버의 해당 서비스를 체크하지만 -R은 이쪽 서버의 서비스를 체크할 수 있다는 점에 유의할 것.

2010. 5. 13.

집중력을 회복하기위한 잠깐 명상(4 corner법)

여러 가지 일에 부디끼고있을 때 간편하게 할 수 있는 방법임.. 비교적 굉장히 쉬운 방법이란다..

일단 필요한 것은 4각형 모양의 물건. 창문이나 책, 모니터 같은 것은 전부 가능하다.

  1. 시작은 시선을 왼쪽 상단 꼭지점에 두는 것 부터 시작한다. 넷까지 세면서 천천히 숨을 들이쉰다.
  2. 시선을 시계방향으로 움직인다. 오른쪽 상단 꼭지점에 시선을 둔다. 이제 넷까지 세면서 천천히 숨을 내쉰다.
  3. 오른쪽 하단 꼭지점에 시선을 둔다. 이제 넷까지 세면서 천천히 숨을 들이쉰다.
  4. 왼쪽 하단 꼭지점에 시선을 둔다. 이제 넷까지 세면서 천천히 숨을 내쉰다.
이런 식으로 한바퀴 돌면 된다. 3~5바퀴 정도 돌리면 복잡했던 머리가 어느 정도 가라앉는다.
자 이제 다시 일하러 고고싱~

Lucy jo Palladino의 Find Your Focus Zone에서 발췌함.

2010. 3. 29.

Shape 출력이 그렇게 만만한게 아니었다.

새로운 언어를 개발하다보면 수도 없는 삽질을 하게 되지만, 언어 문제가 아니라 관련된 툴킷의 문제가 있을줄은 사실 상상도 못했었다.
덕택에 어지간히 삽질을 거듭했고, 겨우 문제를 해결했다.

현재 테스트 중인 프로그램은 Clojure에서 Double Buffering 을 통해 그래픽을 출력하는 부분이다. 솔직히 이게 뭐가 어려울까 내심 방심했다가 한 건했다.
자바에서 Shape을 출력할 때, 방향을 돌려서 출력하는 루틴이 있길래, 이것을 테스트하려고했다.

(defn drawShip [g d]
  (let [shape (Polygon. (int-array [-6 -3 0 3 6 0])
                        (int-array [6 7 7 7 6  -1])
                        6)
        trans_identity (AffineTransform. ) ]
    (doto g
      (.setTransform trans_identity)
      (.translate 20 20)
      (.rotate (Math/toRadians d))
      (.setColor Color/ORANGE)
      (.fill shape))))

Clojure 소스코드에서 Polygon을 만든다음, 적당히 각도를 돌려서 출력하는 부분이다.
setTransform을 해서, translate, rotate를 걸었는데 이 부분이 문제가 될줄은 전혀 상상도 못했던 것..

(defn clear [g]
  (let [trans_identity (AffineTransform. ) ]
    (doto g
      (.setTransform trans_identity)
      (.translate 0 0)
      (.rotate (Math/toRadians 0))
      (.setColor Color/BLACK)
      (.fillRect 0 0 639 479))))

더블 버퍼링을 하려고 메모리 공간을 지우는 부분.. 꽤 양이 많지? 솔직히 clearRect만 호출하면 될줄 알았더만.. 그게 아니었다.
이전에도 말했던 것처럼 Shape을 출력하면서 각도를 돌려가며 출력했더니 clear 루틴에까지 그게 그대로 영향을 주었던 것..
결국 이전에 했던 세팅을 싹 지우고 돌려서야 겨우겨우 성공했다.

해결하고 나니.. 아 이랬구나 하는 생각을 했지.. 실제로 AffineTransform에 관련된 내용을 어디 주의깊게 읽기나할까.. 디자이너가 없어서 그냥 벡터 그래픽으로 그리다보니 우째 이런것도 겪게된다. 나름대로 액땜한걸까?

2010. 3. 24.

프로그래밍 언어의 우열을 논하지 말자

개발자 사이트에서 가장 흔히 벌어지는 엄한 짓이 프로그래밍 언어 벤치마크 놀음이다.
피보나치 벤치마크가 한동안 꽤나 유행했었는데, 이걸두고 난 뻘짓이라고 말한다.

한두문장이 꽤 멋드러지게 써진다고 그 나라말이 훌륭한 것이 아니다. 뜻하는 바를 잘 풀어내고, 원하는 바를 전달하는 것이 언어의 핵심이다. 마찬가지로 프로그래밍 언어는 컴퓨터가 해줬으면 하는 바를 얼마나 잘 표현해내고, 이를 주변의 사람들과 소통하는데 얼마나 잘 쓸 수 있는지가 중요하다.

언어의 구현요소만 가지고 맨날 아웅다웅하기보다는 좀 건설적인 내용을 가지고 얘기를 했으면 하는 바램이다.

2010. 2. 17.

Clojure, Slime 연동시키기

Clojure와 Slime을 연동할 때에는 Swank 서버를 세팅해야한다.
일단 Swank 서버데이터를 가져온다.

git clone git://github.com/jochu/swank-clojure.git

그 다음에 필요한 것은 clojure를 기동시키는 것.. Clojure 기동 파일을 만든다.

#!/bin/bash

CLOJURE=/usr/local/clojure/clojure.jar
CONTRIB=/usr/local/clojure/clojure-contrib.jar
SRC=/home/siabard/project/clojure/src
CLASSES=/home/siabard/project/clojure/classes
SWANK=/home/siabard/src/swank-clojure/src
java -cp $CLOJURE:$CONTRIB:$SRC:$SWANK:$CLASSES clojure.main

이제 Clojure 를 기동시킨후 Swank를 실행시킨다.

(require 'swank.swank)
(swank.swank/start-server "/dev/null" :port 14005 :encoding "utf-8-unix")

포트는 적절히 정리한다.
이제 Emacs 에서 M-x slime-connect 해서 포트를 지정한다. Slime에서 Swank가 호환이 안될 수 있다고 하지만, 무시하고 그냥 진행시키면 된다. 이 메세지가 싫다면

(require 'swank.swank)
(swank.swank/ignore-protocol-version "2009-12-07")
(swank.swank/start-server "/dev/null" :port 14005 :encoding "utf-8-unix")

처럼 해서 프로토콜 버전 체크를 무시하면 된다.









2010. 2. 4.

Android, Maemo, Moblin 비교

한 웹기사에 따르면 Linux 커널 2.6.33 부터 Android 커널 코드가 떨어져나간다고 합니다. 넷상에서는 새로운 fork로 갈 것인가를 두고 이야기가 오고 가고 있습니다. Android 지원용 드라이버를 커널에 단순 삽입하는 것 이상으로, 새로운 lock 타입을 만들어야하는 등 시스템 보안모델에 관여하는 상황이 발생하게된다고 합니다. 이는 Android 가 다른 Linux기반 플랫폼과 다른 몇가지 특이점이 있기 때문입니다.

Android는 기본적으로 Java로 만든 코드를 Dalvik 바이트 코드로 변환해서 돌리고 있습니다. 말하자면 커널과 분리된 별도의 가상 기계가 돌아간다는 점인데, 이를 통해서 하나의 프로그램이 죽는다고 하더라도, 전체 시스템에 문제가 발생하지는 않습니다. 반대로 얘기하자면, 별도의 프로세스 관리를 필요로하는 부분이 커널에 필요할 수 있다는 점입니다.
이러한 코드가 커널 트리에 추가되어야하지만, Android용 드라이버는 Google의 자체적인 커널에 의존하기 때문에, 메인 커널에 추가가 어려웠습니다.

물론, 배포본마다 커널 소스를 일부 수정하는 방식은 기존에도 있어왔지만, Google이 자신만의 코드를 커널에 제때에 업데이트하지 않은점이 문제입니다. 결국, 이제 Android 코드 체계는 이후의 Linux 커널과는 동떨어진 자신만의 길을 걸어야할지도 모릅니다.

Maemo는 Debian 기반이며, 가장 C적인 API리스트를 보유하고 있습니다. QT를 개발한 Trolltech를 인수하면서, 기본 UI를 QT로 변경하는 등, 지속적인 Linux 기반작업을 진행하고 있습니다. Maemo 5를 기반으로하는 N900이 이미 출시된바 있고, 지금은 Maemo 6를 개발하고 있습니다.
Nokia 가 주도적으로 진행하고 있는 이 작업의 한가지 문제점은 기존의 Symbian 체계입니다. Symbian 과 Maemo의 2중 전략으로 이전하겠다고 공언한 만큼, 두 플랫폼의 통합을 이루어야하지만, 서로 체계가 상이해서 많은 어려움을 겪고 있습니다. 아마 이 점이 Maemo의 개발에 어려운 점으로 들 수 있을 것으로 봅니다.
하지만 Linux 개발에 익숙하다면 Maemo에서 상당히 편리한 개발을 할 수 있을 듯 합니다. 일단 C/Python으로 개발이 가능하고 PyGTK를 통해 쉽게 개발할 수 있다는 점이 개발자에게 매력적입니다. 다만, Linux에 완전히 붙어있는 구조라서, Linux에서 볼 수 있는 모든 오동작을 Maemo에서도 볼 수 있다는 점이 걱정됩니다. 불안정한 프로그램이 시스템 자체를 불안정하게 만들수있다는 점은 충분히 위협적입니다.

Moblin은 Intel에서 시작했지만, 지금은 Linux Foundation에서 관리를 맡고있어며, 다양한 벤더의 OS에서 사용이 가능합니다. 표준 Linux Desktop 라이브러리를 변경해서 만들어진 탓에, 기존의 Linux 어플리케이션은 새로운 Moblin에 맞추어서 변경을 해줘야하는 점이 있습니다. C/C++ 기반의 SDK를 공개하고 있으며, 넷북쪽에서는 ATOM프로세서와 더불어 상당한 영향력을 보일 것으로 생각합니다.

Linux에서 가장 가까운 플랫폼이라면 이제는 Maemo플랫폼을 들 수 있습니다. 따라서 임베딩 개발자라면 꽤 흥미로운 플랫폼이 될 것 같습니다. 반면에 Moblin은 넷북 제작 플랫폼으로써 상당히 뛰어나고, 지금은 스마트폰과 일반폰을 넘보고 있습니다. 또 다양한 배포본 사업자들이 뛰어들고 있는 점에서 강점을 가지고 있습니다.

이번 Android 파동이후, Linux 기반 플랫폼의 희비도 엇갈릴 것 같습니다. 개인적으로는 하드코어 Linux배포본인 Maemo가 좀 더 힘을 받았으면 하는 바램입니다만, Nokia 이외에는 별로 관심을 기울이지않는 것 같아서 많이 아쉽습니다. :-)