노르웨이 여행기-1

덴마크에서의 크리스마스.
이곳의 크리스마스는 우리나라의 추석과 같은 연휴로 인식되는 것 같다.

무려 크리스마스가 있는 주 부터 1월1일 까지를 통째로 쉰다. 고로.. 12일가량의 휴일이 생긴것이다.

12일 동안 무엇을 할까… 갑자기 생긴 휴일이라.. 무엇을 할지도 미리 결정할 수가 없었다.

계속 고민을 하다, 직장 동료 조니에게 도움을 받기로 했다.

“어디로 여행을 가는게 좋을까? 어디 추천할 곳이 있어?”

– “어떤걸 좋아하는데?”

“자연 경관. 아름다운 자연 경관이 보고 싶어.”

– “노르웨이. 노르웨이가 답이네.”

그래서 노르웨이로 가기로 했다.
첫 목적지는 노르웨이, 오슬로. 일단 이곳에서부터 시작하기로 했다.

덴마크 코펜하겐에서 노르웨이 오슬로까지는 버스, 비행기, 배 로 갈 수 있다.
http://goscandinavia.about.com/od/gettingfromcitytocity/qt/copenhagenoslo.htm
위의 링크에서 정보를 얻고 여러가지 노선을 비교해본 결과, 버스를 이용하기로 했다. 버스가 값이 제일 쌌다.

버스로 코펜하겐에서 오슬로까지는 장장 9시간. 준비를 단단히 해야했다.

IMG_20131222_093743

먼 길가는 여행이니 큰 맘먹고 여행 출발 당일, 코펜하겐에서 맥도날드 햄버거를 먹었다. 세트메뉴 하나에 한화로 16,000원 정도 했던거 같다.

나를 오슬로까지 데려다 줄 버스는 Swebus. 버스비는 한화로 약 10만원 정도.
버스티켓은 인터넷 예약으로 했으며 신청하는 옵션에 따라 금액에서 차이가 난다.
여행자 보험 포함/미포함 등등…
인상에 남는 옵션으로는 선(?)입장 옵션이 있었다. 자세히 살펴보니 이 버스… 좌석 지정이 아니었다. 즉, 먼저 타서 자리에 앉는 사람이 임자라는 소리.
버스 소개글을 읽어보니 버스안에 와이파이와 전원 콘센트를 제공한다고 적혀있었다.

전원 콘센트가 있는 자리가 따로 있는 건가? 그렇다면 전원이 있는 자리에 먼저 앉아야 할텐데…
다행이 이번 여행에 노트북을 챙겨가긴 하지만 배터리가 9시간이나 버텨주진 않는다. 기필코 콘센트 자리를 차지해야 한다…

아무튼, 여행 전날 밤에 인터넷으로 예약을 했다.

맥도날드에서 아침을 간단히 먹고 코펜하겐 중앙역 근처 Swebus 정류장으로 향했다.

Swebus 는 다음과 같이 생겼다.(출처: http://sv.wikipedia.org/wiki/Swebus)

250px-Swebus그런데.. 살짝 버스 시간에 늦었다. 거의 아슬아슬하게 버스에 올라 탔는데.. 이미 좌석들은 듬성듬성 사람들로 채워져 있었다.
아… 설마 콘센트 자리 못 얻는 건가..
주위를 두리번 거리며 비어있는 자리에서 콘센트가 있는지를 찾았다. 콘센트가 있었다. 모든 자리에…

IMG_20131222_104554

저렇게 자리마다 콘센트가 있었다.

대충 아무 자리에 앉아서 짐을 정리하고 노트북을 켰다.
9시간 버스 여행이다.. 마음의 준비를 해야 한다.

한가지 다행스러운 점은 버스 뒤쪽에 작은 화장실이 딸려 있어 언제라도 화장실을 이용할 수 있다는 점이다.
하지만 버스가 뒤뚱뒤뚱하고 출렁출렁할때 화장실에서 무슨일이 일어나는지는 비밀이다.

코펜하겐에서 노르웨이까지 버스로 이동하기 위해서는 먼저 스웨덴을 거쳐야 한다.
스웨덴을 버스로 통과한 다음, 노르웨이까지 가는 것이다.

덴마크-스웨덴 사이에는 바다가 있다. 덴마크-스웨덴 사이를 이어주는 것은 Øresund Bridge 이다.
출처: http://en.wikipedia.org/wiki/%C3%98resund_Bridge

그 다리 위를 힘차게 쭉쭉 나간다.
IMG_20131222_104033 IMG_20131222_104045 IMG_20131222_104056 IMG_20131222_104235가는 도중…. 한 두어번 정차했던 것 같다. 장장 9시간동안 두어번의 정차. 뭔가 덴마크어인가, 스웨덴 어인가로 기사아저씨가 블라블라 했는데 제대로 알아듣지 못한 나는 버스에서 잠깐도 내리지 못했다.
(혹시나 나를 두고 그냥 가면 어떻게 하나.. 해서 걱정했다.)

그리고, 이상한게… 덴마크에서 스웨덴으로 넘어갈때 여권 검사를 안했다.
그리고, 스웨덴에서 노르웨이로 넘어갈때도 여권검사를 안했다.

예전 동남아(태국, 캄보디아, 베트남)을 육로로 통과할때 겪었던 여권 심사가 없어서 내심 당황스럽고 걱정스러웠다.
혹시나 버스를 타기전 미리 비자를 발급받아야 했었나?? 등등의 걱정이 밀려왔다.
버스 안에서 인터넷으로 정보를 볼려고 했으나.. 자주 끊어지는 인터넷에 짜증이나서 그냥 내버려두었다.

결국 여권 심사는 오슬로에 도착할 때까지 한번도 없었다. 오슬로에 도착해서 버스 터미널을 나서기 전 너무 불안한 마음에..(사증을 여권에 찍지를 못했다..) 인포센터에 가서 물어보았다. 사증 어디서 찍냐고..
인포센터 아저씨 왈, 유로 국가에서 한번 사증을 받으면 더이상의 사증이 필요없다는 것. 단, 비행기로 오는 것은 예외로 한단다.
결론은 사증 찍을 필요가 없었다는 것이다.

영화와 경치, 그리고 9시간…
드디어 오슬로에 도착했다.
이제 노르웨이다.

IMG_20131222_104539

내 엉덩이는 부러지고 있어요.

IMG_20131222_121626

버스는 달리고, 달린다..

IMG_20131222_121634

버스도, 과잉속도 허가됨.. 제발.

IMG_20131222_121638

스웨덴 경치..

IMG_20131222_121643

스웨덴 경치..

IMG_20131222_121647

스웨덴 경치..

IMG_20131222_154222

아마도.. 예테보리, 스웨덴 터미널.

IMG_20131222_154228

예테보리..

IMG_20131222_154238

예테보리..

IMG_20131222_154244

예테보리..

IMG_20131222_190701

드디어 오슬로 도착!

IMG_20131222_190710

깜깜하다.. 현지 시각 19:00. 이미 한밤중.

IMG_20131222_191133

버스 터미널에 있었던 그로테스크 조각? 애기 머리가 세개 붙어있다..

IMG_20131222_204319

여차저차 찾아온 숙소. 8인 도미토리 룸에 취사가 가능하다.

IMG_20131222_204327

왼쪽 검은 옷이 있는 자리가 내자리. 여기도 먼저 찍은 사람이 임자다.

내일은 본격 오슬로 관광이다.
저녁은 대충 근처 맥도날드로 대체하고(비싸지만.. 별수없이. ㅠㅠ) 내일 간단 요리를 해 보기로 한다.

Using wsdl files on C

회사 프로젝트로 wsdl 파일을 이용한 웹 서비스 프로그램을 제작해야 할 일이 있었다.

물론 사용 언어는 C.
먼저 wsdl 파일들에서 header 파일을 추출해야 했다.

이를 위해서 사용한 프로그램은 wsdl2h

 3개의 wsdl 파일에서 header 파일을 추출해야 했다.

다음의 명령어를 사용했다.

$ wsdl2h -c -o SoapEnv.h SendSms.wsdl

$ wsdl2h -c -n SendSms -o SendSms.h SendSms.wsdl

$ wsdl2h -c -n ReceiveSms -o ReceiveSms.h ReceiveSms.wsdl

$ wsdl2h -c -n SmsNotificationManagerService -o SmsNotificationManagerService.h SmsNotificationManagerService.wsdl

위의 명령어를 잘 보면 추출해야 하는 wsdl 파일은 3개인데, 사용한 명령어는 총 4개이다.
정확히는 SendSms.wsdl 파일에서 두개의 header 파일을 추출했다.

 이유는 실제 컴파일과 라이브러리 구현에 사용할 gsoap를 위해서 기본 header 파일이 필요했기 때문이다. 
그리고, 위에 나타낸 옵션 중, −c 옵션은 c 언어를 위한 헤더 파일 생성 옵션, −n 옵션은 namespace 영역을 구분짓기 위해 사용한 옵션이다.

하나 이상의 wsdl 파일을 사용한 라이브러리 제작시, −n 옵션이 특히 중요한데, 이유는 −n 옵션 없이 wsdl2h 를 사용할 경우, 여러개의 wsdl 사용시 서로 혼합된 namespace 영역을 사용하기 때문이다.
이는 나중에 wsdl 파일을 추가 하게 될 경우, 프로그램 코드상에서 호출되는 메소드 이름이 변경이 되는 등 여러모로 곤란이 생긴다. 때문에 반드시 필요한 옵션이다.
ref: http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc8

wsdl2h 를 사용하면 각각의 헤더 파일들이 만들어 진다. 이렇게 만들어진 헤더파일들을 이용해 실제 C 에서 사용 가능한 코드로 만들어줘야 한다.이를 해주는 프로그램이 soapcpp2 이다. 이번 프로젝트에서 다음의 명령어/옵션을 사용했다.

$ soapcpp2 -C -c SoapEnv.h

$ soapcpp2 -C -c -n -pSendSms SendSms.h

$ soapcpp2 -C -c -n -pReceiveSms ReceiveSms.h

$ soapcpp2 -C -c -n -pSmsNotificationManagerService SmsNotificationManagerService.h

나는 이 명령어를 makefile 안에 넣어 두었다. 그리고 매번 컴파일을 실행할 때마다 위의 명령어가 자동으로 시작되도록 구성했다.
왜냐하면 soapcpp2 프로그램의 버전때문이었다. 

soapcpp2 프로그램으로 생성되는 파일들은 바로 C 로 컴파일이 가능한 *.c 파일과 *.h 파일들이다.이를 이용해서 라이브러리를 생성하고, 링크시켜서 사용하기 위해서는 libgsoap.a 파일과 같은 gsoap 라이브러리가 추가로 필요하다.
그런데, 만약 매번 soapcpp2 프로그램을 통해서 *.c 와 *.h 파일을 생성하지 않는다면, 이미 생성되어있는 파일들을 이용해서 라이브러리를 만들고 gsoap 라이브러리와 링크를 할텐데..
 때, *.c/*.h 파일을 생성한 soapcpp2 의 버전과 링크되는 libgsoap.a 파일의 버전이 서로 맞지 않는다면 링크가 안되는 문제가 발생한다.
이런 이유로 매번 컴파일을 진행할 때마다 위의 명령어를 통해서 새로이 stub 코드를 작성하도록 구성했다.

그리고, wsdl2h 사용할 때와 마찬가지로, namespace 영역 구분을 위해 −n 옵션과 −p 옵션을 추가했다. 그리고, gcc 컴파일을 진행시 −D 옵션을 이용해 Define 을 별도로 걸어주었다.
이는 지정된 namespace 영역을 사용하기 위해 필요한 조치이다.
makefile 안에 다음과 같은 Define 을 넣어주었다.ref: http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.36

DEFS                    = -DWITH_OPENSSL -DWITH_NONAMESPACES

마지막으로, 왜 그런지는 모르겠는데..  이상하게 gsoap 라이브러리를 추가시, 자꾸 세그먼트 폴트가 났다.
계속 방법을 찾다가 제일 마지막에 gsoap 라이브러리를 추가 해야 오류가 나지않는 이상한 현상을 확인했다.
왜그러는지는 모르겠으나.. 다른 해결할 방법을 찾지 못했다.

LIBS            =  -lzmq -lczmq -luuid -ljansson -lssl -lcrypto -lpthread -lcurl -lgsoapssl -lgsoap

pmake error on ubuntu

ubuntu 에서 pmake 를 사용하던 도중, 아래의 오류가 나타났다.

library 를 컴파일하는 과정이었는데, 필요한 library는 모두 만들어 놓고, 아래의 오류를 나타내고 죽어버렸다.

building shared object ipvutil library

ranlib libipvutil_pic.a

lint -chapbxzF  -i strlcat.c

pmake: exec(lint) failed (No such file or directory)

lint 프로그램을 찾을 수 없다는 메시지였는데.. lint 가 무슨 프로그램인지 알 수 없었다. 결국 구글링..

http://en.wikipedia.org/wiki/Lint_%28software%29

즉, lint 는 일종의 cppcheck 와 같은 코드 검사기 같은 것이다.

하지만 lint는 bsd-unix 와 같은 unix 계열의 os 에서 주로 사용되는 검사기였다. 즉, ubuntu에는 기본이 아니라는 이야기..

lint 와 같은 역할을 하는 것으로 linux 에서는 splint 가 있어서 설치 한 뒤, ln 명령어로 lint 명령을 사용할 수 있도록 구성했으나, splint 및 lint 의 정확한 사용법을 모르는 상태에서  기본적으로 사용되는 옵션등이 맞지 않아 계속 오류를 나타냈다.

결국 lint 검사를 사용하지 않도록 하고 mk 파일 내용을 수정하는 것으로 해결을 했다.

/usr/share/mk 디렉토리에 있는 bsd.own.mk 파일을 다음과 같이 수정하도록 하자. 굵은 글씨로 나타낸 부분이 lint 사용을 막기 위해 추가한 부분이다.

#       $NetBSD: bsd.own.mk,v 1.120 1999/02/24 14:42:36 drochner Exp $

.if !defined(_BSD_OWN_MK_)

_BSD_OWN_MK_=1

.if defined(MAKECONF) && exists(${MAKECONF})

.include “${MAKECONF}”

.elif exists(/etc/mk.conf)

.include “/etc/mk.conf”

.endif

NOLINT=

덴마크에서 집주소 없이 CPR 번호 받기

오늘 드디어 CPR 넘버를 받았다.

결론부터 이야기하면…. CPR 넘버를 받는데, 집주소가 없어도 된다.

나는 운이 좋게도 CPR 넘버가 없이 직장을 구했었다.

다만, CPR 넘버가 없이 직장을 구한거라 언제짤릴지 모른다는 생각에 많이 불안했었는데… 다행히도 skat(덴마크 세금청)에서 해결을 해 주었다.

정식으로 일자리를 구하게 되면 세금청에 급여 신고를 해야 한다.
정확히는 급여 신고를 하는 것과 동시에 tax card를 발급받아야 하는데, tax card 가 있어야 정확한 세율을 계산할 수 있고, 직장에서 정식으로 급여를 지급할 수 있는 것이다.

먼저 www.skat.dk 에 접속해서 인터넷으로 문서(문서번호: 04063EN)를 작성을 하도록 하자.
(문서 위치: http://www.skat.dk/SKAT.aspx?oId=1899274&vId=0)

만약, skat(코펜하겐) 지점을 방문해서 해결을 하겠다고 바로갔다간 낭패를 보게되니 주의..
(2013.11 이후부터 사전 예약없이 세금청 방문하면 그냥 아무것도 할 수 없음..)
04063EN 문서 작성 이후, 여권스캔파일, 비자 문서 파일을 준비한 다음에,(http://www.skat.dk/SKAT.aspx?oId=1728417&lang=US)에 접속해서 이메일로 발송하면 된다.

그리고 한 일주일(문서에 5 working day라고는 하지만 실제로는 더 걸리는듯.. 필자의 경우, 6 working day 가 걸렸음) 저옫 기다리면 skat 에서 CPR 넘버를 만들어 준다.
이때, 거주지는 호텔, 호스텔, 게스트하우스, 룸 쉐어, 등등.. 어느 곳이든 상관없음.
tax card 를 신청하는 신청자의 신원을 기업체가 보증을하게 되는 경우라고 생각을 하면 이해가 빠를 것이다.

그리고 04063EN 문서 작성시, 약간 혼란스러운 부분이 있었는데…

Deduction for transport between home and work, if the expenses are not
covered by your employer/
Befordringsfradrag, hvis din arbejdsgiver ikke helt eller delvist dækker udgiften

위에 입력한 부분이다. 직장과의 거리(Distance), 외국 출장을 얼마나 멀리/자주 나가는지, 식사는 어떻게 해결하는지.. 등등인데, 해당 부분은 그렇게 고민하시지 말고 그냥 빈칸으로 넣어도 된다.
만약 해당 사항이 있다면 정확히 계산을 해서 넣으면 된다.(하지만 대부분 입력할 일이 없을 듯..)

필자 같은 경우, 직장이 어디로 결정될 지 몰라서(오르후스, 오덴세, 코펜하겐.. 등등 거의 모든 IT 기업체에 이력서를 넣었었다) 집을 먼저 구하기가 까다로웠었는데 (CPR 얻기도 힘이 들었고..) 이런식으로도 일이 풀려버리니 정말 다행이었다.

결론은… 직장을 먼저 구하나, 집을 먼저 구하나 상관이 없었다.
오히려, 내 경우에는 직장을 먼저 구하고, 집을 직장 근처로 알아보았는데, 그것이 집 구하기가 더 쉬웠다.

워킹 홀리데이 초기에 높은 덴마크 물가에 고생들이 많을 텐데.. 필자는 처음 호스텔에 2주동안 머물면서 덴마크 분위기를 살피고, 다음 2주는 wwoof 를 하면서 숙식비를 아꼈다.
그 한달동안 곳곳에 이력서를 돌려서 직장을 구했었는데… 지금 생각해도 괜찮은 방법 같다.

덴마크로 워킹 홀리데이를 오시는 대부분이 아마 CPR 넘버 받기부터 고생을 하시리라 생각이 된다..
부디 이 글이 많은 도움이 되었으면 한다.

Installing bsdmake on ubuntu

프로젝트를 진행하면서 bsd-make(bmake)를 사용할 일이 생겼다.

당연히 ubuntu에서 사용가능한 bmake package 를 찾아봤으나… 아무래도 보이지 않았다.

한참을 찾고 찾아도 도저히 보이지 않아 결국, Chris 에게 도움을 요청했다.

내 설명을 들은 Chris가 구글에서 debian bmake 를 검색하니 바로 나왔다..(그동안 나는 ubuntu 와 bmake 키워드를 가지고 계속 삽질을 하고 있었다.)

결국 너무 늦은시간이라 회사에서는 해결을 못하고, 집에와서 다시금 찾아보니 답이 나왔다.

정답은…

$ sudo apt-get install pmake

pmake 였던 것이다.. -_-;;

$ man pmake

MAKE(1)                                                                                                BSD General Commands Manual                                                                                                MAKE(1)

NAME

     pmake — maintain program dependencies

SYNOPSIS

     pmake [-BeikNnqrstWX] [-D variable] [-d flags] [-f makefile] [-I directory] [-J private] [-j max_jobs] [-m directory] [-T file] [-V variable] [variable=value] [target …]

DESCRIPTION

     pmake is a program designed to simplify the maintenance of other programs.  Its input is a list of specifications as to the files upon which programs and other files depend.  If the file ‘makefile’ exists, it is read for this

     list of specifications.  If it does not exist, the file ‘Makefile’ is read.  If the file ‘.depend’ exists, it is read (see mkdep(1)).

     This manual page is intended as a reference document only.  For a more thorough description of pmake and makefiles, please refer to Make – A Tutorial.