Node.js로 다운로드 완료된 파일 목록을 메일로 전송하기

Summary

토렌트(Deluge)로 다운로드를 걸어놓고 진행상황을 매번 확인하기 귀찮아서 구현한 코드입니다. 다운로드 디렉토리를 관찰하다가 새로운 파일을 발견하면 files 맵에 파일이름을 키로 저장해 두고 3분을 기다립니다. 3분이 경과하면 files 맵에 저장된 파일 중 실제로 존재하는 파일만 추려서 파일 목록을 만들어내고 이를 G메일로 전송합니다. G메일 전송에는 emailjs라는 모듈이 사용되었습니다.

Module

$ npm install emailjs

Source

var fs = require('fs');
var path = require('path');

var completeDir = '/data/torrent/complete';
var files = {};
var working = false;

var email = require("emailjs/email");
var server = email.server.connect({
   user: "reshout",
   password: "xxxxxxxx",
   host: "smtp.gmail.com",
   ssl: true
});

fs.watch(completeDir, function(action, filename) {
  files[filename] = true;
  if (!working) {
    working = true;

    var text = "";
    var count = 0;

    setTimeout(function() {
      for (var prop in files) {
        if (files.hasOwnProperty(prop)) {
          var apath = path.join(completeDir, prop);
          if (fs.existsSync(apath)) {
            text += (prop + "\n");
            count++;
          }
        }
      }

      server.send({
        text: text,
        from: "reshout <reshout@gmail.com>",
        to: "reshout <reshout@gmail.com>",
        subject: "[reshout.com] " + count + " files downloaded"
      }, function(err, message) {
        console.log(err || message);
      });

      working = false;
      files = {};
    }, 1000 * 60 * 3);
  }
});

아이폰5

아이폰5

지금까지 4대의 안드로이드 스마트폰을 거쳐,

  1. 옵티머스Z
  2. 옵티머스2X
  3. 옵티머스EX
  4. 갤럭시넥서스

이제서야 아이폰5에 정착하였습니다. 결론은 굉장히 만족스럽습니다.

안드로이드가 최적화 되고, 하드웨어의 사양이 좋아져도 아이폰의 부드럽고 직관적인 UI를 따라오지 못하는 것 같습니다. VM 위에서 동작한다는 태생적인 한계를 뛰어넘으려면 얼마나 하드웨어가 더 좋아져야할까요? 그래도 처음에는 격차가 크다고 생각했는데 최근에는 80~90%까지 따라온 것 같습니다. 물론 안드로이드폰과 아이폰이 동일사양의 하드웨어를 사용한다면 이야기는 또 달라지겠지요.

MS윈도우를 쓰다가 Mac OSX로 갈아타면서 느꼈던 장점을 아이폰을 만나면서 그대로 느끼고 있습니다. 그것은 부팅 후 오랜시간 사용해도, 많은 앱을 설치한 후에도 처음처럼 깔끔하게 동작해 줄꺼라는 신뢰입니다. 안드로이드폰을 사용할때는 재부팅 기능이 필요하다고 느꼈었죠.

저는 혁신을 논하기 이전에 기본기 측면에서 아이폰이 뛰어나다고 생각합니다. 전화 잘 터지고, 문자 주고 받는 속도도 더 빠릅니다. GPS 잡는 속도는 비교불가 수준입니다. 무엇보다도 카메라로 찍은 사진의 품질이 월등히 뛰어납니다.

아이폰5로 사진 촬영해 작성한 광주 여행기

안드로이드폰에서 지도앱을 활용해 길을 찾아다니거나 카디오 트레이너를 사용해 운동량을 기록할때 GPS가 제대로 잡히지 않아서 스트레스 받았던 적이 상당히 많았습니다. 그리고 사진 찍을때도 방금 찍은 사진의 초점이 제대로 잡혔는지 확신이 들지 않아서 다시 찍는 경우가 많았습니다.

아이폰의 경우에는 사용자에게 신뢰를 줍니다. GPS가 잡혔는지 안잡혔는지 사용자가 신경쓸 필요가 없습니다. GPS를 잡을 수 있는 환경이라면 빠른 시간안에 GPS 정보를 수신해 줄꺼라는 믿음을 갖게 합니다. 사진을 찍을때도 초점이 제대로 잡힌 또렷한 사진을 얻을 수 있을꺼라는 확신을 갖게 합니다. 스마트폰이 기본적인 기능을 수행함에 있어 사용자가 신뢰를 느낄 수 있게 하는 것, 사용자의 스트레스를 줄여주는 것이 혁신보다 먼저라고 생각합니다.

ActiveX와 표준을 지키지 않는 국내 웹환경 때문에, 저는 지금 Max OSX가 아닌 MS윈도우를 사용하고 있습니다. 환경적인 측면에서 불편하지 않았다면, 빠르고 간결하고 안정적인 Mac OSX를 고집할 수 있었겠지요. 그러나 국내 스마트폰의 역사가 아이폰으로 시작되어서 그런지 아이폰 경우에는 불편함이 없는 것 같습니다. 이러한 조건이 바뀌지 않는다면 스마트폰만큼은 아이폰을 고집하게 될 것 같습니다.

Dokuwiki에 Markdown 플러그인 설치하기

요즘 마크다운에 푹 빠져서 지금 이 글도 마크다운 문법으로 작성하고 있습니다. 참고로 워드프레스에는 WP-Markdown이라는 플러그인이 존재합니다.

정보를 체계적으로 관리하기 위해서 저는 dokuwiki를 사용합니다. Dokuwiki에서도 마크다운으로 정보를 기록하고 싶어서 찾아 보니 역시 플러그인이 존재하더군요. 설치 방법은 다음과 같습니다.

$ cd wiki/lib/plugins
$ wget http://madpropellerhead.com/projects/markdownextra.tgz
$ tar xvzf markdownextra.tgz

제 경우에는 이렇게 압축을 풀어 놓으니 바로 활성화가 되더군요.

사용법도 굉장히 단순합니다. .md로 끝나는 문서이름을 사용하던지 아니면 다음과 같이 마크다운 텍스트 부분을 <markdown></markdown>으로 감싸면 됩니다.

<markdown>
# Reflection
런타임에 객체의 값 타입과 멤버의 구조를 밝히는 작업을 리플렉션이라고 한다.
## 타입 판별 ##
1. 변수 === null
1. 변수 === undefined
1. typeof 변수 반환값이 "string", "number", "boolean" 기본 타입인가?
1. typeof 변수 반환값이 "function"인가?
1. typeof 변수 반환값이 "object" 인가?
</markdown>

내부 문서 링크는 다음과 같이 만들 수 있습니다.

<markdown>
(?id=java)
</markdown>

상세한 내용은 markdownextra plugin 홈페이지를 참고하세요.

워드프레스 3.5 기본 테마에서 글쓴이가 보이지 않는 문제 해결

워드프레스 3.5의 기본테마를 사용하고 있는데 다음과 같이 글쓴이의 이름이 보이지 않는 문제가 있습니다.

이 글은 미분류 카테고리로 분류되었고 님에 의해 2013년 1월 11일에 작성됐습니다.

그러나 html 소스코드에는 글쓴이가 존재하더군요.

알림판에서 외모 > 편집기에 들어가시면 테마의 css를 수정할 수 있습니다. 다음과 같이 수정해 주시면 간단히 문제는 해결됩니다.

.single-author .entry-meta .by-author {
    display: auto;
}

더 나은 방법을 알고 계신 분은 공유 부탁 드립니다.

LG 울트라북 Z460 부팅속도 (윈도우8)

집에서는 집중력이 영 떨어져서 도서관, 커피샵에서 개인 프로젝트를 진행하려고 노트북을 하나 장만했습니다.
LG 울트라북은 Z350이 유명한데 키보드가 작고 랜포트와 켄싱턴 락이 없어 윈도우8이 탑재된 14인치 모델인 Z460을 선택하게 되었습니다. 메모리만 별도로 구입해서 4GB 추가해 주었습니다. 가장 마음에 드는 점은 노트북 어뎁터가 엄청 작네요.
동영상을 보시면 절전모드가 무색해질 정도로 부팅속도가 굉장히 빠릅니다.