Ubuntu에 Objective-C 개발환경 구축하기

1. 관련 패키지 설치

$ sudo apt-get install build-essential
$ sudo apt-get install gobjc
$ sudo apt-get install gnustep-devel

2. 빌드 환경 구축

$ sudo chmod +wx /usr/share/GNUstep/Makefiles/GNUstep.sh
$ /usr/share/GNUstep/Makefiles/GNUstep.sh

.bashrc에 추가

/usr/share/GNUstep/Makefiles/GNUstep.sh

3. Vim 설정

cocoa.zip 다운로드

$ unzip cocoa.zip -d ~/.vim

.vimrc에 추가

let filetype_m='objc'

4. 코드 작성 (hello.m)

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
    NSLog (@"Hello!");
    return (0);
}

5. 빌드

$ gcc `gnustep-config --objc-flags` hello.m -o hello -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -lgnustep-base

6. 실행

$ ./hello
2013-07-18 20:39:42.506 hello[6697] Hello!

2013 SW+인문 컨퍼런스 요약

열정 없는 인생은 죽음과 같다 – 싸이월드 창업자 형용준 대표

  • 오프라인 사용자 프로세스를 가상의 세상으로 옮겨보기
  • 오프라인 세상을 잘 이해해야 함
  • 오프라인의 문제를 해결하는 솔루션으로서의 SW 개발이 필요함
  • 문제를 함께 인식해야 구성원이 같은 방향으로 열정을 가질 수 있다.

생각의 관점을 바꿔라! – 관점디자이너 박용후

  • 카카오톡 포함 16개 회사의 마케팅 담당
  • 통찰: 같은 현상이나 사물을 바라보고 남과 다른것을 볼 수 있는 능력
  • Jobs: Connect & Develop not R&D
  • 당연하지 않았던 것들이 당연해 지면서 세상은 바뀐다.
  • 퓨쳐마킹의 시대가 왔다. 2015년엔 당연해질 것들!?
  • Simple, Easy
  • 메뉴얼이 필요하면 성공 가능성이 낮아진다.
  • 링크 기반의 확산 시스템을 이해하지 못하면 SW를 성공시킬 수 없다.
  • 자발적 확산구조 (애니팡)
  • 마케팅은 고객의 관점을 바꿔 우리 제품을 다르게 보이도록 하는 것
  • 남과 다른 관점의 시작: 당연함을 부정하라!
  • 당연함을 넘어서는 생각법
    • 본질
      • 항상 질문하라. 김범수 의장
      • 전화기의 본질!? 커뮤니케이션
    • 핵심
    • 관점
  • 내가 만든 앱이 사람들의 습관을 바꿀 수 있을까!? 그렇지 않다면 투자받을 수 없다.
  • 필요할 때 도와주고 사라져야 한다. 슈퍼맨이 계속 곁에 있다면 어떨까!?
  • 생각한대로 된다. 된다고 말하고 믿고 안된다는 생각이 떠오르면 버리려고 노력한다.
  • 픽사의 이야기. 가장 중요한 건 중력. 잡스는 중력을 가진사람이다. 개발자, 기획자가 함께 고민해야 한다. 중력을 가진사람이 있어야 일을 성공시킬 수 있다.
  • 모두의 격려를 받는 회사가 나왔으면 한다.
  • 세바시 251회 관점을 바꾸면 미래가 바뀐다 @박용후 Perspective Designer

개발자여! 꿈을 설계하라 – 데니스홍

  • 나는 천재가 아니다. 똑똑하고 아주 열심히 하는 엔지니어다.
  • 연구소 및 개발중인 로봇 소개
  • 장님이 운전할 수 있도록 도와주는 로봇기술을 개발한 경험으로부터 자신이 하고 있는 일이 사람들에게 도움이 될 수 있다는 것을 가슴으로 깨닫게 되었다.
  • 모든 분야의 전문가가 될 수는 없다. 협력을 잘하는 것이 중요하다. 자신은 기계공학 전공이지만 필요한 분야에 대해 어느정도 이해도를 가지고 있다.

토크쇼

  • 고우성: 같이 일하는 사람이 즐거워하는가를 생각하며 일을 한다. 즐거움이 있어야 창의적인 아이디어가 나올 수 있다.
  • 데니스홍: 내 꿈은 로봇엔지니어 뿐만 아니라 요리사, 마술사. 다양한 분야에 대한 관심과 경험이 새로운 발상에 도움이 된다.
  • 데니스홍: 뛰어난 사람보다 같이 재밌게 일할 수 있는 사람을 선택한다. 친구가 되고 싶은 사람.
  • 박용후 디자이너: 착한 사람, 기업과 일해야 지속성을 가질 수 있다. 식당에서 종업원에게 함부로 대하는 사람은 ROI로 사람을 판단한다. 필요없으면 사람을 버리는 사람. 나로 인해서 다른 사람이 행복했으면 좋겠다는 생각을 가진 사람이 착한 사람. 이러한 가치를 추구하는 기업이 착한 기업.
  • 유진평: 자발적으로 만들어갈 수 있는 환경을 마련해 주자. 임의로 만들어 내는 방향은 아니라고 생각한다. 미래창조과학부를 예로 들어.
  • 박용후: 성공하는 앱의 공통점은 단순함. 자발적 확산 구조를 활용. 상황, 환경을 잘 활용함. 인프라에 대한 이해. 사람들이 열광하는 코드를 읽기. 실패하는 앱들은 결이 없다. 하나의 흐름이 없고 흩어져있다.
  • 박진형: 창업에 사람이 제일 중요. 믿고 함께할 수 있는 사람을 선택.
  • 유명환: 합의를 만들어낼 수 있는 사람과 함께 일해야 한다.
  • 박용후: 커뮤니케이션을 못하는 회사는 똑똑한 사람들을 모아놓고 멍청한 선택을 한다. 카카오톡은 직책 호칭이 없어서 장벽없이 커뮤니케이션을 한다.
  • 양수열: 개발자가 인문학적인 부분까지 잘 할 수 있을지는 어려운 문제. 중요한 것은 커뮤니케이션 능력.
  • 데니스홍: 연구실에서 학생을 뽑을 때 나와 같이 되고 싶은 사람. 나와 같은 사람, 친구가 되고 싶은 사람을 선발한다.
  • 박용후: 동기부여가 가장 중요. 어떤 일을 해야하는지 명확히 인식이 되었다면 회사에 출근하지 않아도 일을 할 수 있다. 자유보다 자율이 중요하다.
  • 유명환: 분야를 떠나서 함께 일을 해결하려는 의지가 필요함.

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 홈페이지를 참고하세요.