제가 아는 영업쪽 담당하시는 분이 한분 계십니다. 영업하시는 분답게 계약 체결전에는 간이라도 빼주실 듯 하다가 막상 체결이 되면 안면을 싹 바꾸시는..

투 페이스 되겠습니다. 다른 사진들은 너무


그런 분이 계시는데 그분이 명절 때가 되면 잊지않고 mail 을 보내주십니다. 잊지 않으신것은 고맙지요 (요즘 안오는거 보니 잊어버리신듯..) 그러나 편지를 받고 보면 수많은 cc 들을 보면서 기가 질립니다. 같은 mail 이라도 저한테만 보낸것 처럼 되어 있으면 참 좋을 텐데.. 라는 생각이 들지요

그래서 시작하게 됐습니다. 대량으로 메일을 발송하되 cc 는 안보이고 단일 대상한테 보내는 것처럼 하기. 찾아보면 간단하게 해결하는 방법이 많겠지만 저는 공부하는 겸 해서 직접 작업해보기로 했습니다.


여기부터는 프로그래머의 영역입니다. 프로그래머가 아니신 분은 봐도 몬소린지 모를 가능성이 아주 농후합니다.



프로그램 세게에서는 학습곡선이 뭐 같아서 배우기 힘들지만, 배우기만 하면 정말 무궁무진한 능력을 주는 것이 세가지가 있다고 합니다. (제 말 아님..)

1. Emacs
2. Regular Expressions
3. Functional Language


배우기 힘들지만 진짜 쓸모가 있다는 이야깁니다. 그런데  Emacs 라는 에디터는 기본적으로 정규 표현식과 함수형 언어인 ELisp 이 포함되어 있기 때문에 Emacs 를 잘 다루려고 공부하다 보면 자연스럽게 2번 3번을 익히게 됩니다.

"지인들에게 기분 상하지 않게 단체 메일 보내기" 프로젝트는 기본적으로 Emacs 를 가지고 개발하는 것을 원칙으로 합니다.

먼저 Emacs 에서 Gmail 을 통해서 편지 보내기!!

왜 하필 Gmail 을 통해서 보내는 것이냐? 라고 하시겠지만, 개인이 아무 리눅스에서 sendmail 데몬 깔아서 메일을 보내면 왠만한 e-mail 서비스는 전부 spam 으로 인식해서 편지 전달이 안됩니다. 그래서 Gmail 로 편지를 보낼 수 있게 설정해야 합니다.

gmail 에서 POP 와 IMAP 사용이 가능하게 설정합니다. <-- 이것에 관한 설정은 Gmail 환경설정에서 도움말이 존재합니다.

정확히 POP 와 IMAP 설정을 해야 사용할 수 있는지는 잘 모르겠는데, 제가 그렇게 설정을 해놨습니다. 여기까지만 하시면 외부 설정은 끝입니다.

그러면 Emacs 가 설치되어 있는 로컬 컴퓨터 기준으로 설명을 진행하겠습니다. OSX 10.6 Snow Leopard 에서 진행을 하고 있습니다. 아마도 테스트는 안했지만 우분투에서는 당연히 될것으로 생각합니다. 

Emacs 는 당연히 설치가 되어 있는 상태구요. 만약 없다면 http://aquamacs.org/ 에서 받아서 설치하시면 됩니다. 구체적인 세팅방법 같은건 정말 열심히 공부하셔야 합니다.

gnutls 를 설치해야 합니다. gmail 이 이방식으로 보안처리를 합니다. 설치를 해줘야 하는데, port 가 깔려 있다면

sudo port install gnutls


이 명령만 쳐주시면 알아서 설치가 됩니다. port 가 설치되어 있지 않다면 http://www.macports.org/ 에서 설치하시면 됩니다.

구체적인 세팅이 끝났으면 $HOME/.emacs 파일을 열어줍니다. 없으면 만드시면 됩니다. osx 기준으로는 $HOME 은 /Users/my-id 입니다. my-id 는 자신의 아이디 입니다.

.emacs 내용
(setq send-mail-function 'smtpmail-send-it
   message-send-mail-function 'smtpmail-send-it
   smtpmail-starttls-credentials
   '(("smtp.gmail.com" 587 nil nil))
   smtpmail-auth-credentials
   (expand-file-name "~/.authinfo")
   smtpmail-default-smtp-server "smtp.gmail.com"
   smtpmail-smtp-server "smtp.gmail.com"
   smtpmail-smtp-service 587
   smtpmail-debug-info t
   starttls-extra-arguments nil
   smtpmail-warn-about-unknown-extensions t
   user-full-name "광이랑"
   starttls-use-gnutls t)

위의 내용을 그대로 .emacs 에 복사하시고 '광이랑' 이라는 부분만 자신의 이름으로 바꾸시면 됩니다. 만약 받은 편지에서 보낸 사람의 이름의 인코딩이 깨져서 보이면 emacs 의 환경이 utf-8이 아니라는 이야깁니다. 만약을 위해서

.emacs 에서

(set-language-environment "UTF-8")


을 추가해 줍니다.

그리고 중간에 보이는 ~/.authinfo 파일은 만들어 줍니다. 만들고 그 안의 내용을

machine smtp.gmail.com login my-id@gmail.com password my-pass


라고 채워줍니다. 딱 이 한줄만 있어야 하며, newline 문자(엔터!)도 들어가면 안됩니다. my-id 와 my-pass 는 구글에 로긴할때 쓰는 아이디와 패스워드 입니다.

자 이제 C-x m 을 입력하시면 mail-mode 로 바뀝니다.

To:
Subject:
--text follows this line--


이와 같은 내용이 나오고요, 부족한 부분을 채우신 다음에 C-c C-c 를 입력하시면 편지를 보내게 됩니다. 여기까지 Emacs 에서 gmail 을 통해서 메일 발송하기 였습니다. 다음은 이 방법을 이용해서 "web-mail 형식으로 편지 보내는 방법"에 관해서 입니다. 그건 나중에...

프로그램을 오래 짜 왔지만, 주로 시스템 베이스의 프로그램만 만들어 왔습니다. Windows 나 unix 시스템 계열의 코딩만 하다보니, c/c++ 에 너무 익숙해져서 뭔가 허전하더군요. 요즘 대세인 web programming 도 못하고, 그러던 차에 몇년전 부터 후배의 꼬임에 넘어가서 emacs 라는 툴을 다루기 시작하면서 lisp 에 관한 관심이 가더군요. 무지하게 매력적인 lisp 이란 언어에 푹 빠졌습니다.

뭐 사업하면서 코딩을 하고 있을 수는 없고 해서, emacs 라는 툴만 간간히 다루고 마음속에만 담아두고 있었는데, 요즘 회사 일손이 부족하여 저도 본격적으로 코딩을 다시 시작하게 됐습니다. 3년만에 다시 잡는 코딩이라 많이 생소한 느낌에 또 새로운 분야(아이폰 앱스 개발)라 진행도가 느린데 일과는 별도의 간단한 어플리케이션을 짤 일이 생겼습니다. 그래서 다시 lisp 을 찾아보게 됐습니다.

서두가 길었는데요, 리습은 emacs lisp 과 common lisp 그리고 수많은 방계 언어들이 많습니다. emacs lisp 은 익혀두면 모든것이 emacs 안에서 이루어지는 프로그램을 짤 수 있는데요, 유연함은 아무래도 common lisp 에 비해서 떨어집니다. common lisp 은 개발하기 위한 환경만 떨렁 갖춰두고 있었는데요,(slime + sbcl) 개발 환경만 가지고는 뭔가 만들었다는 기분이 들지가 않더군요.

개발하고 있는 것과는 별도로 데이타베이스의 사용자 테이블에 누가 있는지 궁금해서 서버팀에게 종종 물어봤는데, 일 방해하는것 같아서 직접 sql 모드로 들어가서 알아보다가, 반복적인 작업을 계속 하는 것 같아서 결국 프로그램을 짜기로 했습니다.

함수는 2개 입니다. 접속하는 함수 한개, 쿼리 날리는 함수 한개입니다. 이것을 패키징 해보겠습니다.

* db_user.lisp *

(in-package :db_user)
(require 'clsql)

(defun connect-our-db ()
 ....
))

(defun search-person (name)
...
)


뭐 이런식입니다. 함수형 언어니 함수 몇개를 만들면 되겠지요. (더 복잡한 것은 아직 모름..)

package 로 만들기 위해서는 2가지 파일이 더 필요합니다. 관련 파일들의 정보인 package.lisp 파일과 이것들을 묶어서 사용하게 해줄 asdf 파일인 db_user.asd 파일입니다. 그것들을 살펴보기로 하지요.

* package.lisp *

(in-package :cl-user)
(defpackage :db_user (:use :cl :clsql)
            (:export :connect-our-db
                     :search-person))


package 선언 부분이 들어 있는데요. db_user.lisp 에서 선언한 :db_user 를 선언하고 있지요. 거기에 db_user 에서 사용하는 다른 패키지에 관한 정보도 표현되어 있습니다. (예를 들면 clsql  같은 정보) 그리고 외부에서 불러서 써야할 함수들을 export 정보를 통해서 표현하고 있습니다.

* db_user.asd *

(defpackage :db_user (:use :asdf :cl))
(in-package :db_user)

(defsystem db_user
  :name "db_user"
  :depends-on ("clsql")
  :components ((:file "package")
               (:file "db_user" :depends-on ("package")))
  )


거의 비슷하고요. 다만 package.lisp 에서 써줬던 clsql 을 여기서 종속 관계로 명시해줘야 한다는 것입니다.
:depends-on("clsql") <-- 이부분
:components 부분은 연결된 파일을 차례로 써줘가는 것입니다. 처음에 package.lisp 이고, 그것과 연관된 세부 파일들을 세세하게 적어주는 것이지요.

여기 까지 만들어 줬으면 , 이 세개의 파일을 담고 있는 디렉토리를 *central-registry* 에 넣어두고 slime prompt 에서 (sbcl 인 경우)

(require 'db_user)


하면 패키지 로드되고

(db_user:connect-our-db) (db_user:search-person "crazia")


이런식으로 함수를 쓸 수가 있습니다.

다른 훌륭한 패키지들도 이런식으로 하나 하나 추가해 나가는 방식입니다.


http://www.bukisa.com/articles/188748_iphone-creating-custom-uitableviewcells-using-ib

보통 구버젼으로 설명을 하거나 직접 커서터마이징 해야 하는데 위 아티클에서는 아주 잘 정리되어 있습니다. 직접 따라하실때 빼놓기 쉬운 부분이.

self.tableView.rowHeight = 100;


이 부분이니 빼 놓지 마시기 바랍니다.
길지도 않고, 핵심적인 부분을 너무 잘 정리했습니다. 아이폰 개발하고 싶은데 대체 Object-C 가 뭔지 감이 안잡히는 분들에게 정말 괜찮은 핵심 요약입니다.

가서 보기

우연히 돌아다니다가 찾았는 데 정말 괜찮습니다.
저도 산전 수전 다 겪은 프로그래머 출신인지라 , 메모리 관리는 왠만하면 잘 지키는 편인데, object-c 는 자동으로 관리하는 것도 있고, 수동으로 지워줘야 하는 것도 있고, 클래스 함수들도 난립하는 터라 마구 마구 헷갈립니다.

예제로 시작하는 아이폰 개발

의 '부록' 에서 메모리 관리 팁을 설명하고 있어서 조금 정리했습니다. (부록이 참 잘 되어 있습니다..)

1. 블록 내에서는 alloc, retain, copy  의 수와 release, autorelease 의 수가 동일해야 합니다.

2.  factory 함수( 보통 class method 인 경우가 많습니다 )를 사용해 생성한 객체의 경우는 대부분 autorelease 로 반환됩니다. 따로 release 를 다시 할 필요가 없습니다.

3. 클래스의 인스턴스 변수들은 dealloc 메서드에서 다 release 해야 합니다.

이 다중 뷰를 다루는 기술이 상단히 사람을 짜증나게 하는군요 -0- , 아예 인터페이스 설계를 다시 할까 생각중이긴 하지만 공부한다 치고 또 찾아 봤습니다.

요기 클릭

아주 훌륭하게 개념과 소스까지 전부 나열됐습니다. 그리고 납득이 가능하더군요. 뷰 컨트롤러 자체를 관리하는 appDelegate 에서 메시지 중재를 한다는 개념입니다.


결국 아이폰 또한 사용자 인터페이스를 신경 써야 하기 때문에, 화면 이동이 정말 중요합니다. 테이블 뷰를 쓰면 간단하지만 그걸 쓰지 않고 전환할 때, 특히나 인터페이스 빌더를 써서 편하게 만든 ViewController 간에 이동을 할 때는 여간 귀찮습니다.

그런걸 도와주기 위한 팁입니다.




Part1 이고요.




Part2 입니다.

당연히 제가 제작한 건 아닙니다..
왠만한 책들은 UITabBarController 에 대해서는 잘 다루고 있는데 , 이는 Root Controller 로 쓸만하지 세부적인 뷰에서 쓰기 적합하지 않습니다. 그래서 UITabBar 예제를 찾아보고 있었는데, 책에서는 잘 안다루더군요.

애플쪽에서 제공하는 샘플이 괜찮은 것이 있더군요.

여기클릭

전형적인 예제는 아니지만, 충분히 볼만은 하더군요. 아이폰 개발들 열심히 하세요.
darcs 를 설치하기 위해서는 cabal 을 설치해야 합니다. 이 cabal 은 ghc 가 필요한데 쉽게 설치가 안됩니다. (즉  macport 로 안된다는 이야기입니다)

http://haskell.org/haskellwiki/Mac_OS_X#Mac_OS_X_10.6_.28Snow_Leopard.29

에서 1.2 번 을 따라서 해주면 snow leopard 에서 ghc 를 쓸 수가 있습니다.

뿐만 아니라 바로 cabal 도 설치 됩니다. /usr/local/bin

cabal update

cabal install cabal-install

cabal install darcs

또는

http://dark.ly/darcs-2.3.1-i386-darwin.bz2 에서 한번에 다운 받아서 설치하세요.

이 과정 후에

/usr/local/bin 으로 이동한 후에

sudo ln -s ~/.cabal/bin/darcs darcs

로 링크를 걸어주며 설치 완성 입니다.



언제나 새로운것이 문제입니다.
또 '눈범'을 욕하면서 시작하게 되는군요.   sbcl 좀 깔아볼까 했더니 sbcl 은 신기하게 기존에 리습이 깔려 있어야 빌드 할 수가 있더군요.
이런 신기할데가.. 그래서 가장 만만한 clisp 을 깔아주기로 했습니다. 열심히 세팅한 macport 가 있으니 가비얍게 커맨드를 입력했습니다.

sudo port install clisp


무엇인가 주르륵 뜨더니 안된다고 하더군요. 슥슥 구글을 돌려보니 이런 문제가 속출해서 portfile 이 올라왔더군요. 그래서 포트파일을 받아서 저장시켰는데
그 다음 문제가 이 포트파일로 대체 어떻게 설치하는가 하는 문제였습니다. 역시 찾아보니 답이 나오더군요.

1. 아무데나 폴더 한개 만들어줍니다.
 - mkdir clisp

2. 다운 받은 포트파일을 복사해줍니다. (다른 이름이라면 자연스럽게 Portfile 로 변경해줍니다)
 - cp ~/Downloads/Portfile .

3. 만든 폴더에 가서 다음 명령을 실행합니다.
 - sudo port -D . -v install


짜잔 하고 긴시간이 지나고 나면 설치가 되는군요.

패치 파일은 여기 에서 가져왔습니다. 이름만 바꿔줬습니다.

+ Recent posts