몽산포 파인앤애플 펜션

이번 주말에는 몽산포 해수욕장 근처에 있는 파인앤애플 펜션에 다녀왔습니다.

원래는 몽산포 캠핑장이나 청솔 캠핑장에 가고 싶었지만 가지고 있는 침낭이 하계용이라 욕심을 버렸습니다.

마트에서 장을 보았는데, 이번에는 레드 와인과 호주산 부채살과 치맛살 그리고 간고등어를 준비했습니다.

가는 길에 간월도 휴게소에 들러 칼국수를 맛보았습니다. 인터넷에서 미리 알아보고 갔는데 가게는 허름했지만 역시나 맛은 일품이더군요. (이모네 진짜 손칼국수)

칼국수에 바지락이 들어있다기 보다는 바지락에 칼국수가 들어 있습니다. 국물은 진하고 손으로 만든 면발은 쫄깃합니다.

칼국수를 맛있게 먹고 다시 달려, 펜션에 도착해 짐을 풀고 산책을 나섰습니다. 펜션 앞 청솔 캠핑장을 둘러보고, 바닷가로 나왔습니다.

물이 많이 빠져있었는데, 갯벌에서 호미를 들고 조개를 캐는 사람들도 보입니다. 준비해간 것이 없어서 조심스럽게 갯벌을 걸으며 호미질 하는 아이들을 구경했습니다.

얼마전에 잠깐 캐러반을 관심있게 찾아봤을때 바다가 보이는 몽산포 캐러반이 참 좋아보였습니다. 그래서 혹시나 찾아갈 수 있을까 해서 둘러 보았더니 눈에 들어오더군요.

해안가를 따라 한참을 걸어 캐러반 지역을 둘러 보았습니다. BBQ 하는 모습도 보이고 캐러반도 좋아 보이고 부럽더군요. 다음에 몽산포를 찾는다면 캐러반을 꼭 이용해보고 싶습니다.

산책을 마치고 펜션으로 돌아오는 길입니다. 펜션 이름은 파인앤애플 펜션인데 앞에 초록색 건물이 파인 뒤에 빨간색 건물이 애플입니다. 저희가 묵었던 커플룸은 애플 건물 2층에 있는데 방은 좁지만 깔끔하고 사장님이 정말 친절하십니다. 무엇보다도 BBQ 하기 좋게 숯과 그릴 등을 잘 준비해 주셔서 감사했습니다. 화려함보다 실속을 찾으시는 분들에게는 괜찮은 선택이 될 것 같습니다. 아직 많이 알려지지 않아서 예약하기도 수월한 편입니다.

http://www.pineandapple.co.kr/

TV를 보다가 저녁이 되어 슬슬 BBQ를 준비합니다.

매번 맥주를 준비했는데 이번에는 레드 와인을 선택했습니다. 이 와인의 이름은 홉노브 피노누아인데 과일향이 많이 나고 정말 맛있더군요. 무엇보다도 소고기와 궁합이 잘 맞았습니다.

소고기에 이어 간고등어와,

고구마까지 맛있게 구워먹었습니다.

와인이 남을 줄 알았는데, 너무 맛이 좋아서 그런지 BBQ에서 다 마셔버려서 까나페 재료는 그대로 집으로 가져왔습니다.

펜션의 아침 풍경이 참으로 평화롭습니다.

아침 식사로 간단하게 알리오올리오를 만들어 먹었습니다. 재료가 간단해서 가끔씩 집에서 만들어 보면서 내공을 쌓아야 겠다고 다짐했습니다.

펜션을 떠나 안면도 자연휴양림에 다녀왔습니다. 소나무 숲이 잘 되어 있었고 부담없이 오를 수 있는 낮은 봉우리가 이어졌습니다. 봉우리 이름만이 우리가 섬에 있다는 것을 알려 주더군요.

우리가 가본 봉우리 중 가장 높았던 키조개봉의 고도는 73m 밖에 안되네요.

벤치에 누워서 쉬면서 올려다본 가을하늘에 가슴이 뻥 뚤립니다.

하얀 나무로 이어진 산책길은 몽환적인 분위기를 연출하기도 했습니다.

안면도에서 나오는 길에 기름이 부족했는데 차가 많이 막혀서 조마조마 했습니다. 아슬아슬하게 주유하고 귀가하는 길은 멀고 험했지만 고생한만큼 추억은 오래오래 남을 것입니다.

Ubuntu 12.04 LTS에서 ffmpeg으로 아이폰용 동영상 인코딩하기

  1. ffmpeg이 포함된 패키지 설치
sudo apt-get install libav-tools
2. 코덱 라이브러리 설치
sudo apt-get install libavcodec-extra-53
3. ffmpeg 실행, 출력파일 이름(무한도전.mp4)의 확장자(mp4)에 따라 container format이 결정됩니다.
ffmpeg -i 무한도전.avi -vcodec libx264 -acodec aac -strict experimental -ab 128k -ac 2 -b:v 640k -threads 2 -partitions 0 -flags +loop -cmp +chroma -subq 1 -trellis 0 -refs 1 -coder 0 -me_range 16 -g 300 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -maxrate 10M -bufsize 10M -qcomp 0.6 -qmin 2 -qmax 51 -qdiff 4 -level 30 무한도전.mp4

계족산 맨발축제

계족산 맨발축제에 다녀왔습니다. 선양이라는 충청지역 소주업체가 매년 주체하는 축제인데, 무료로 이렇게 좋은 취지의 행사를 마련해 주셔서 고마운 마음이 들었습니다. 단순히 맨발로 황토길만 걷는 것이 아니라, 주체즉이 준비한 다양한 프로그램 덕분에 참가자들은 즐거운 시간을 보낼 수 있었던 것 같습니다.

아침 일찍 부지런히 움직여 9시 30분 정도에 계족산 장동 산림욕장 입구에 도착했습니다.

입구에서 배번호를 받았습니다. 배번호에 그려진 재밌게 생긴 아저씨 일명 ‘에코맨’은 선양의 회장님이시더군요.

신발을 신은 상태로 조금 산을 올라 행사장에 도착했습니다.

흥겨운 사물놀이 공연이 펼쳐지고 있었습니다.

이어서 테너와 소프라노의 노래가 이어집니다. 넬라판타지아, 지금 이순간 등 대중적인 곡 위주로 불러 주셨는데 매우 감동적이었습니다. 이 두분은 노래 뿐만 아니라 재치있게 사회도 봐 주셨는데, 즐거운 노래와 재치있는 입담으로 분위기를 한껏 띄워 주셨습니다.

소프라노께서 옷을 갈아입으신 후, 몸풀기 체조까지 리드해 주십니다. 몸풀기 직전에 우리도 맨발이 되었습니다.

출발하자마자 황토를 제대로 느낄 수 있는 코스를 만났습니다.

호기심에 그냥 지나칠 수 없어서, 이랬던 발이

이렇게 되었습니다.

황토로 발도장을 찍어서 가져갈 수 있도록 준비되어 있었습니다.

황토마임도 사람들이 흥미를 끌었습니다. 진짜 사람인가 신기해서 쳐다보면 조금씩 움직여서 사람들을 놀라게 합니다.

개회사와 함께 본격적으로 출발! 꽃잎을 뿌려 주셔서 흥겨웠습니다.

평생 맨발로 꽃잎을 밟아볼 기회가 얼마나 있을까요?

꽃잎을 즈려밟고 7km의 대장정을 본격적으로 시작했습니다. 황토길이 잘 되어 있었지만 그래도 맨발로 걸어본적이 거의 없어서 그런지 작은 돌맹이에 때로는 아픔을 느끼면서 열심히 걸었습니다.

중간에 지루하지 않게 악기를 연주해 주는 분도 계시고,

선양에서 나온 술도 나누어 줍니다.

힘들게 반환점에 도달하여 인증 스탬프를 손목에 찍고 다시 돌아가는 길. 발바닥이 아파서 그리 녹녹하진 않았습니다.

커플 완주 성공으로 선양에서 나온 위스키를 전리품으로 획득하고, 해물파전, 컵라면, 막걸리로 조촐한 축하파티를 가졌습니다.

대회 코스는 7km 였지만, 행사장 부터 출발지까지 거리가 있어서 총 9km를 맨발로 걸어 보았습니다. 손잡고 도란도란 이야기 나누면서 산속을 맨발로 걷는 기분 참 좋았습니다. 오후에 일정이 있어서 오후 3시부터 열리는 음악회를 감상하지 못한 것이 아쉽네요. 그러나 여자친구에게도 저에게도 힐링이 되는 소중한 시간이었습니다.

node.js로 토렌트에서 받은 파일 자동 정리

토렌트에서 받은 파일을 다운로드 디렉토리에서 원하는 곳으로 일일이 옮기는 것은 정말 귀찮은 작업입니다.

다음 파일의 다운로드가 완료되었을 때,

Mnet 슈퍼스타K4.6회.120921.720p.HDTV.H264-구제역돼지.mkv

다음 디렉토리로 이동하는 작업을,

/data/media/TV/슈퍼스타K4

자동화 하기 위해 간단한 node.js 모듈을 만들어 보았습니다.

이 모듈은 현재 홈서버에서 forever로 항시 동작하고 있습니다.

var fs = require(‘fs’);

var path = require(‘path’);

var torrentDir = ‘/data/torrent/’;

var completeDir = path.join(torrentDir, ‘complete’);

var mediaDir = ‘/data/media/’;

var tvDir = path.join(mediaDir, ‘TV’);

var workingFilename = {};

var dirMap = {};

dirMap[path.join(tvDir, ‘개그콘서트’)] = /개그.*콘서트|개콘/;

dirMap[path.join(tvDir, ‘무한도전’)] = /무한.*도전/;

dirMap[path.join(tvDir, ‘힐링캠프’)] = /힐링.*캠프/;

dirMap[path.join(tvDir, ‘슈퍼스타K4’)] = /슈퍼.*스타.*[kK].*4/;

dirMap[path.join(tvDir, ‘대왕의꿈’)] = /대왕의.*꿈/;

dirMap[path.join(tvDir, ‘대풍수’)] = /대풍수/;

fs.watch(completeDir, function(action, filename) {

  for (dir in dirMap) {

    var regExp = dirMap[dir];

    var targetDir = dir;

    if (regExp.test(filename)) {

      if (!workingFilename[filename]) {

        var fromPath = path.join(completeDir, filename);

        var toPath = path.join(targetDir, filename);

        workingFilename[filename] = toPath;

        setTimeout(function() {

          fs.rename(fromPath, toPath, function(err) {

            if (!err)

              console.log(filename + ‘: success’);

            else

              console.log(filename + ‘: fail, ‘ + err);

            setTimeout(function() {

              delete workingFilename[filename];

            }, 5000);

          });

        }, 5000);

      }

      break;

    }

  }

});

이 모듈을 활용하시려면 Transmission이든 Deluge든 파일을 다운로드 중에 저장하는 디렉토리와 다운로드 완료 후 저장하는 디렉토리를 다르게 설정하셔야 합니다.

코드에 대해서 간단히 설명드리자면, 동일한 파일에 대하여 중복으로 fs.watch()가 callback을 불러주는 문제를 피하기 위하여 workingFilename이라는 map을 활용하고 있고, 파일이 생성되고 저장되고 옮겨지는 등의 시간차를 감안하여 setTimeout()을 적절히 활용하였습니다.

Ubuntu 12.04 LTS에 Deluge 설치하기 (troubleshooting)

리눅스 서버를 위한 토렌트 클라이언트의 양대 산맥은 Transmission과 Deluge라고 할 수 있습니다.

Transmission이 가볍고 단순해서 좋긴 한데, 다운받은 파일의 user와 group이 debian-transmission이라 파일을 자동으로 관리하기가 영 불편해서, 최종적으로 Deluge를 선택하게 되었습니다. (Deluge는 deluged 프로세스의 user와 group을 지정할 수 있고, 자연스럽게 deluged가 다운받은 파일의 user와 group도 그대로 따라갑니다.)

Deluge는 비교적 화려한 기능과 인터페이스를 제공하지만, Python으로 구현되어 있어 Transmission보다 비교적 메모리를 많이 사용하고 느립니다.

설치는 잘 정리되어 있는 다음 문서를 그대로 따라하시면 됩니다.

http://linuxplained.com/install-deluge-web-interface-on-ubuntu-1204/

add-apt-repository가 없으신 분은 python-software-properties 패키지를 설치해 주시면 되겠습니다.

sudo apt-get install python-software-properties

설치 및 실행이 완료되면 다음 주소로 webui에 접근할 수 있습니다.

http://localhost:8112/

토렌트 등록, 시작, 멈춤, 삭제, 설정 등 모든 작업이 webui에서 가능합니다.

기본적인 동작에는 아무런 문제가 없지만 특정 디렉토리에 토렌트 파일을 복사해 넣으면 자동으로 다운로드가 시작되는 기능이 한글 토렌트 파일명에 대하여 동작하지 않는 문제가 있습니다.

Preferences > Downloads > Folder > Autoadd .torrent files from > /data/torrent

이 문제를 해결하기 위해 /data/torrent에 한글 이름의 토렌트 파일이 추가되면 임의의 영문 이름으로 바꾸는 node.js 모듈을 작성하여 forever로 돌리고 있습니다.

var fs = require(‘fs’);

var path = require(‘path’);

var torrentDir = ‘/data/torrent/’;

var workingFilename = {};

function randomString(len, charSet) {

  charSet = charSet || ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’;

  var randomString = ”;

  for (var i = 0; i < len; i++) {

      var randomPoz = Math.floor(Math.random() * charSet.length);

      randomString += charSet.substring(randomPoz,randomPoz+1);

  }

  return randomString;

}

fs.watch(torrentDir, function(action, filename){

  var hangulRegexp = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;

  var ext = path.extname(filename);

  if (!workingFilename[filename] && ext == ‘.torrent’ && hangulRegexp.test(filename)) {

    var fromPath = torrentDir + filename;

    var toPath = torrentDir + randomString(8) + ‘.torrent’;

    workingFilename[filename] = toPath;

    setTimeout(function() {

      fs.rename(fromPath, toPath, function(err) {

        if (!err) console.log(filename + ‘: success’); else console.log(filename + ‘: fail’);

        setTimeout(function() {

          delete workingFilename[filename];

        }, 2500);

      });

    }, 2500);

  }

});

Samba를 통해 해당 디렉토리에 토렌트 파일을 복사한 경우, 같은 파일에 대하여 callback이 여러번 호출되기 때문에 map을 사용하여 중복을 피했고, 파일이 생성되고 내용이 저장되기 이전에 이름을 바꾸어 버리는 문제를 피하기 위해 시간차를 두었습니다.

Deluge가 기본으로 제공하는 플러그인 중에 토렌트 파일이 추가되거나 다운로드가 완료되었을 때, 특정 스크립트를 자동으로 실행하는 기능을 제공하는 Execute라는 플러그인이 있습니다.

자세한 내용은 다음 문서를 참조하세요.

http://dev.deluge-torrent.org/wiki/Plugins/Execute

참고로 플러그인을 사용하도록 설정한 후 webui에서 스크립트를 추가하려고 하면 javascript 에러가 발생하는데, deluged를 다시 시작하면 잘 됩니다.

이 역시 한글 이름의 토렌트 파일의 경우 제대로 동작하지 않습니다.

이 문제를 해결하기 위해 다음 문서를 참조하여,

http://forum.deluge-torrent.org/viewtopic.php?f=9&t=40517

Execute 플러그인의 소스코드를 수정하였습니다.

sudo vi /usr/share/pyshared/deluge/plugins/Execute-1.2.egg/execute/core.py

빨간색 부분의 코드를 추가하시면 됩니다.

122         # Go through and execute all the commands

123         for command in self.config[“commands”]:

124             if command[EXECUTE_EVENT] == event:

125                 command = os.path.expandvars(command[EXECUTE_COMMAND])

126                 command = os.path.expanduser(command)

127                 log.debug(“[execute] running %s”, command)

128                 if isinstance(torrent_name, unicode):

129                     torrent_name = torrent_name.encode(‘utf-8’)

130                 d = getProcessOutputAndValue(command, (torrent_id, torrent_name, save_path), env=os.environ)

131                 d.addCallback(log_error, command)

deluged를 다시 시작하면 의도한대로 added, complete 이벤트에 등록해 둔 script가 실행 됩니다.

다운로드가 완료된 후에 해당 토렌트를 삭제하고 싶다면 다음과 같은 스크립트를 사용하시면 됩니다.

#!/bin/bash

date=`date +%Y%m%d`

time=`date +%H:%M:%S`

echo \($date $time\) $1 $2 $3 >> /data/torrent/log/complete.log

deluge-console rm $1

deluge-console 패키지도 설치해 주셔야 합니다.

deluge-console를 사용하면 console에서 다운로드 상태를 보거나 토렌트를 추가하고 삭제하는 작업이 console에서 가능합니다. 자세한 내용은 다음 문서를 참조하세요.

http://whatbox.ca/wiki/Deluge_Console_Documentation