2015년 7월 17일 금요일

PHP를 설치 하게 되었다

참조: http://webdir.tistory.com/240

후... 파이썬은 무슨.... 그냥 nginx에 php로 사용하기로 한다. 제어 로직도 python을 사용하지 않고 왠만하면 c로 하는 것을 생각 해 보자. 생소한 python 보다 c가 더 낳을듯.. python은 자료가 다른 것에 비해서 너무 없다는....

일단은 서버에 php 사용하기 위한 환경이 구성되지 않아서 이것 부터 진행 한다. 어짜피 파이도 동일할듯 생각 된다. 아래와 같이 설치 한다.(참조 사이트의 내용과 동일. 왠만하면 참조 사이트에 방문해서 확인하는 것을 추천. 아래 내용은 백업용도...)

# apt-get install php5-fpm
# apt-get install php5-cli
# apt-get install php5-mcrypt
# apt-get install php5-gd
# apt-get install php5-mysql

nginx.conf 에 다음을 추가 한다.(설정에 따라 site-enable 하단 사이트에 추가)

location ~ \.php$ {
    # 접근 속도가 빠르게 유닉스 소켓으로 변경
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_index  index.php;

    # 파일 이름 설정
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}  


/etc/php5/fpm/pool.d/www.conf 파일에 다음 내용 확인 한다.

listen = /var/run/php5-fpm.sock

/etc/nginx/conf/fastcgi_params 파일에 다음 내용 추가/수정 한다.

fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param  PATH_INFO          $fastcgi_path_info if_not_empty;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

그리고 서비스 재시작 한다.

sudo service php5-fpm restart
sudo service nginx restart

모두 다 했으면 http document root 디렉토리에 phpinfo를 포함하는 파일을 만들어서 브라우저로 붙어 본다.

phpinfo();

나머지는 파이에서 IP 올려 주면 받아 주는 php 하나 만들도록 한다.
이렇게 간단한걸..... Django. 앞으로 장난감은 장난감 답게.....머리 아프지 않게 진행 하자.

2015년 7월 11일 토요일

Ubunto 14.04 LTS 에서 Python 개발

Django가 끌려서 개념이라도 잡으려고 서버에 설치 중에 있다. Java만 사용해서 Python 관련해서는 그동안 해 본적이 없어서 서버에 관련 패키지가 하나도 설치 되어 있지 않은 상태이다.(gcc도 설치 안되어 있다는 ㅎㅎ) Python 개발을 위해서 다음 패키지를 설치 했다. 추후 참고용으로 적어 둔다.

[서비스 환경]
- OS : Ubunto 14.04 LTS
- Httpd Server : nginx 1.4.6

[패키지 설치]
# apt-get update
# apt-get install gcc
# apt-get install make
# apt-get install python3-pip
# apt-get install python3-dev
# apt-get install python-mysqldb
# apt-get install libmysqlclient-dev
# pip3 install uwsgi
# pip3 install Django
# pip3 install --allow-external mysql-connector-python mysql-connector-python
# pip3 install mysqlclient
# pip3 install pytz

[MacOSX 인텔리j mysql]
- mysql connector 설치( pip install --allow-all-external git+git://github.com/multiplay/mysql-connector-python )
- Django 의 ENGINE을 'ENGINE': 'mysql.connector.django' 으로 사용

[정리]
- Ubuntu 든 MacOSX 요세미티든 최종 pip3 install mysqlclient 이후에 MySQLdb 를 import 할 수 있었음.

- database sync(포함되어 있는 application 의 table을 sync 생성 한다)
$ python3 manage.py syncdb

- syncdb 이후 테이블 변경 사항 적용 하기
$ python3 manage.py makemigrations
$ python3 manage.py migrate

- Django 에서 제공해 주는 admin의 super user 만들기(인텔리j Run으로 실행하지 말고 터미널을 통해서 실행 해야 한다)
$ python3 manage.py createsuperuser

- Django 제공 admin 주소 : http://127.0.0.1:8000/admin


[참고 사이트]
https://docs.djangoproject.com/en/1.8/topics/install/
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/uwsgi/
http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
http://stackoverflow.com/questions/26573984/django-how-to-install-mysql-connector-python-with-pip3
http://stackoverflow.com/questions/29689365/auth-user-error-with-django-1-8-and-syncdb-migrate

2015년 7월 10일 금요일

MOSI, MISO, SCLK 는 뭐지?

어제에 이어 오늘도 파이의 GPIO 핀에 대해서 알아 보도록 하자. TX, RX는 모뎀에서 사용하는 시리얼 통신으로 워낙 유명하니 생략 하고 MOSI, MISO, SCLK에 대해서 찾아 보도록 한다.

MOSI, MISO, SCLK는 SPI 방식으로 통신하는 데 필요한 핀이고 I2C에 비해서 이해하기가 훨씬 쉽다. 자세한 설명은 아래 링크를 참고 하도록 한다.

위키백과에서 SPI 설명
SPI 설명

몇 라인 되지 않아서 금방 읽고 이해 할 수 있을 것으로 생각 된다. 이제 남아 있는 파이의 GPIO 커넥터 핀들은 간단한 GPIO 핀과 그라운드(GND) 3.3V, 5V 전원 공급 장치 이므로 몇 가지만 더 알아 보 이제 드디어 최초 테스트 회로를 구성 해 보도록 하자.

 우이쒸....집에서 사용하니 파이의 IP가 바뀌었다. IP 바뀌면 개인 서버로 올리는거 만들고 다시 진행 하자. ㅜㅜ

SDA, SCL 이건 뭐지?

어제 저항에 대해서 찾아 보고 오늘 LED를 찾아 보려고 한 것은 단순히 파이의 GPIO 커넥터에 연결해서 LED 한번 켜 보려고 한 것인데, GPIO 커넥터를 들여다 보니, 창피하게 처음 보는 글자들이 많아서 하나씩 알아 보고 LED 켜는 것을 해 보기로 한다. 그 동안 공부를 많이 안 했다는 자괴감이 많이 든다.

GPIO 커넥트를 보면 GPIO 핀 역할 이외의 특별한 목적으로 사용 할 수 있는 것들이 존재하는데 그 중에 SDA, SCL에 대해서 알아 보도록 하자.

I2C(Inter-Intergrated Circuit)는 MCU(Micro Controller Unit)등에서 연결 되어 있는 다른 것들(LCD Driver, memory 등등)을 제어 하기 위한 통신 인터페이스이고, I2C 방식을 이용하기 위해서 SDA(Serial Data Line)와 SCL(Serial Clock Line) 핀이 필요 하다고 이해 하면 될 것으로 보인다.

잘 알지도 못하면서 더 이상 설명하면, 오히려 이해 하는데 방해만 될 듯 하다. 명확하게 설명한 문서 링크를 첨부 한다.

내용은 많지만 약간의 시간을 투자하면 얻는게 많으니 일독을 적극 추천 한다. 스펙 문서는 참고용이고 설명 문서만 봐도 충분히 이해 된다.

2015년 7월 9일 목요일

저항 보는 법

참고: http://programfrall.tistory.com/65#recentComments

파이의 GPIO를 사용하기 위해서 기본적인 회로 이론을 알면 좀 더 쉽게 이해 할 수 있기 때문에 옛날 기억을 되살려서 자료를 찾아 보고 있다. 일단은 가장 기본적인 소자인 저항 부터 알아 보자.

저항이란 말 그대로 전류를 방해 하는 요소이다. 처음 들었을때 이게 잘 이해가 되지 않았다. 아니 기껏 돈들여서 전기를 공급 했는데 저항을 일부러 넣어서 힘껏 흐르는 전류를 방해 할까??

여기에 대한 답은 저항을 제외한 다른 소자에 있다. 전자 소자는 자신이 허용 하는 전류가 제한 되어 있다.  그런데, 힘차게 흐르는 전류가 소자의 최대 제한을 넘어가 버리면...언급 할 필요도 없이 전자 소자의 배가 터진다. 허리케인 죠 처럼 "모두 다...불태웠어...새하얗게" 이렇게 되어 버리는 것이다. 저항이란게 이런 것을 방지해 주는 아주 중요한 역할을 한다.

저항은 크기가 각각 정해져 있는데 그 크기는 저항 표면에 세로로 그려져 있는 색상띠로 확인 가능 하다.


색상은 4줄 짜리와 5줄 짜리로 구분 된다고 하는데 계산 하는 방법은 다음 표를 참고 하면 된다.


지금 GPIO를 이용해서 LED에 불을 켜 보려고 하고 있는데 사용하려는 저항이 1k짜리 이다. 이 1k 짜리 저항의 색상띠를 보면 갈색, 검은색, 빨간색, 황금색 으로 되어 있다. 즉 4줄짜리 색상띠를 가진 저항이고 저항값은 다음과 같이 계산 된다.
갈색(1) 검은색(0) x 빨간색(10^2) = 10 x 10^2 = 10 x 100 = 1k 크기의 +- 5% 오차
당분간은 기본적인 저항만을 사용 할 것이니 여기 까지하고 저항에 대해서 더 깊은 곳으로 다이빙 하고 싶다면 구글신에게...

근 20년만에 이런걸 자진해서 다시 보게 되다니...상상도 못했다는...
다음은 LED에 대해서 알아 보도록 하자.

2015년 7월 7일 화요일

Python 패키지 관련과 스터디용 프로젝트

Python이 그래도 10년전에 간단하게라도 사용 해 봤다고 한, 두시간 정도 보니 대충 기억이 떠 오른다. Javascript, Bash Shell과 비슷해서 두 가지 사용 하는 사람들이라면 쉽게 Python 사용할 것으로 보인다. 언어야 뭐...중요한게 아니니...

일단 패키지를 깔아야 하니 패키지 설치 도구가 있는지 찾아 보니 역쉬 존재 한다. 라즈베리 파이 홈페이지에 떡하니 설명 해 두었다.

https://www.raspberrypi.org/documentation/linux/software/python.md

워낙 설명을 잘 해 두어서 라즈베리 파이에서 제공하는 페이지를 그대로 보면 될 것으로 보인다.
easy_install 이란 것도 사용한다는데, 일단 라즈베리 파이에서 설명하고 있는 pip만 사용해 보도록 한다.

일단 설정 끝나고 Python도 대충 봤으니 원격 접속을 좀 편하게 하기 위해서 공부 삼아서 파이의 아이피 7-segment로 보여주는 것을 진행 해 보도록 하자. 유동 IP에 모니터도 안 달려 있으니 언제 IP가 바뀌는지 알수도 없다. ssh 접속 할때, 또 구석에 처박힌 모니터 날라야 하는지 생각 하면서 불안 불안.... ㅜㅜ

2015년 7월 5일 일요일

Mysql, nginx 설치

참고: http://webdir.tistory.com/217
참고: https://gist.github.com/ntakaaki/2891895

Maria DB를 설치 하고 싶었으나, 라즈비안에서 기본으로 Mysql이 들어 있어서 그냥 Mysql을 설치 하기로 한다. 어짜피 장난감인데 따질게 뭐 있겠나. 귀차니즘....

사실 파이에 Maria DB 설치에 대해서 대충 구글링 해보니 고생 할 것이 보여서 그냥 포기 했다.
4시간 컴파일 하고 6시간 trouble shooting 했다고 하니..흐......
(하나는 프랑스 이지만 설치하는 명령어 보니 동일하게 보인다. 혹시 시도 하고 싶으면 참고 해서 시도 하시라 ~)

https://plus.google.com/+KylePlatt/posts/8pmWKvbaGd2
http://raspbian-france.fr/installer-mariadb-raspbian/

mysql은 다음 명령어로 간단하게 설치 된다.

pi@raspberrypi ~/tmp $ sudo apt-cache search mysql
pi@raspberrypi ~/tmp $ sudo apt-get install mysql-server-5.5

설치 완료 되면 제대로 되었는지 확인 한다.

pi@raspberrypi ~/tmp $ ps -ef | grep mysqld
pi@raspberrypi ~/tmp $ which mysql

확인 되었다면 붙어 보도록 하자.

pi@raspberrypi ~/tmp $ mysql -u root -p

root 패스워드는 mysql 인스톨시에 설정한 패스워드 이다. character set 을 utf-8로 사용 할 것이므로, mysql 설정도 모두 utf-8 로 바꾸도록 한다. mysql 환경 설정 파일을 열어서 다음 내용을 추가 한다. charater set 바꾸는 김에 쿼리문 max size 도 같이 바꾼다.

pi@raspberrypi /etc/mysql $ sudo vi /etc/mysql/my.cnf

[client]
default-character-set = utf8

[mysqld]
max_allowed_packet    = 256M
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8 
collation-server = utf8_general_ci

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

설정 변경 되고 나면 mysql restart 후 mysql에 접속해서 변경 사항 적용 되었는지 확인 한다.

pi@raspberrypi /etc/mysql $ sudo service mysql restart
pi@raspberrypi ~/tmp $ mysql -u root -p

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.43, for debian-linux-gnu (armv7l) using readline 6.2

Connection id:  37
Current database:
Current user:  root@localhost
SSL:   Not in use
Current pager:  stdout
Using outfile:  ''
Using delimiter: ;
Server version:  5.5.43-0+deb7u1 (Debian)
Protocol version: 10
Connection:  Localhost via UNIX socket
Server characterset: utf8
Db     characterset: utf8
Client characterset: utf8
Conn.  characterset: utf8
UNIX socket:  /var/run/mysqld/mysqld.sock
Uptime:   2 min 17 sec


mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

다음은 nginx 를 설치 하도록 하자. apache httpd는 사용하지 않고 nginx로만 사용할 예정이다.
nginx도 라즈비안에 기본으로 들어 있기 때문에 쉽게 설치 가능 하다.

pi@raspberrypi ~ $ sudo apt-cache search nginx
pi@raspberrypi ~ $ sudo apt-get install nginx

설치 완료 되면 nginx가 존재하는지 체크 해 본다.

pi@raspberrypi ~ $ which nginx

nginx는 /etc/nginx/nginx.conf 가 환경 설정 파일인데, 내용을 보면 Virtual Host Configs 항목으로 site-enabled를 include 하고 있다. site-enabled 에 기본으로 존재하는 default 를 없애고 신규로 추가 하기로 한다.

소유하고 있는 도메인이 없기 때문에 그냥 hosts 파일에 dhkim94.org 로 임의 등록해서 사용하기로 한다.

pi@raspberrypi /etc/nginx/sites-available $ cd /etc/nginx/sites-available
pi@raspberrypi /etc/nginx/sites-available $ sudo cp default dhkim94.org
pi@raspberrypi /etc/nginx/sites-available $ sudo vi dhkim94.org

dhkim94.org 파일을 다음 내용으로 수정 한다.

server {
    root /data/www/dhkim94.org;
    server_name dhkim94.org;

    access_log /data/log/dhkim94.org/nginx/access_pipe;
    error_log /data/log/dhkim94.org/nginx/error_pipe;

    #location /doc/ {
    #       alias /usr/share/doc/;
    #       autoindex on;
    #       allow 127.0.0.1;
    #       allow ::1;
    #       deny all;
    #}
    ....
}

로그 파일 분리를 위해서 nginx 기본 설정도 변경 한다. access_log 와 error_log 를 주석 처리 한다.

pi@raspberrypi / $ cd /etc/nginx
pi@raspberrypi /etc/nginx $ sudo cp nginx.conf nginx.conf.20150705
pi@raspberrypi /etc/nginx $ sudo vi nginx.conf

이젠 site-enabled 디렉토리에 기본 링크를 삭제 하고 금방 생성한 것의 링크를 추가 한다.

pi@raspberrypi /etc/nginx/sites-enabled $ cd /etc/nginx/sites-enabled
pi@raspberrypi /etc/nginx/sites-enabled $ sudo unlink default
pi@raspberrypi /etc/nginx/sites-enabled $ sudo ln -s /etc/nginx/sites-available/dhkim94.org dhkim94.org

환경 파일에 설정한 홈 디렉토리및 로그 디렉토리를 생성 한다.

pi@raspberrypi ~ $ cd /
pi@raspberrypi / $ sudo mkdir data
pi@raspberrypi / $ cd data
pi@raspberrypi /data $ sudo mkdir www
pi@raspberrypi /data $ cd www
pi@raspberrypi /data/www $ sudo mkdir dhkim94.org
pi@raspberrypi /data/www $ sudo chown -R www-data dhkim94.org
pi@raspberrypi /data/www $ sudo chgrp -R www-data dhkim94.org
pi@raspberrypi /data $ sudo mkdir log
pi@raspberrypi /data $ cd log
pi@raspberrypi /data/log $ sudo mkdir dhkim94.org
pi@raspberrypi /data/log $ cd dhkim94.org
pi@raspberrypi /data/log/dhkim94.org $ sudo mkdir nginx
pi@raspberrypi /data/log/dhkim94.org $ sudo chown -R www-data nginx
pi@raspberrypi /data/log/dhkim94.org $ sudo chgrp -R www-data nginx

이제 완료 되었으니 nginx 를 올리자.

pi@raspberrypi ~ $ sudo service nginx start
pi@raspberrypi ~ $ ps -ef | grep nginx

만일 정상으로 올라가지 않으면 올라가지 않는 내용을 자세히 보여 주므로 당황하지 말고 읽어보고 수정 하면 된다. nginx는 apache httpd에 비해서 훨씬 간단하니 어려울건 없다.

추후 테스트를 위해서 index.html 파일을 하나 만들어 둔다.

pi@raspberrypi ~ $ cd /data/www/dhkim94.org
pi@raspberrypi /data/www/dhkim94.org $ sudo vi index.html

hello nginx

아! 잊지 말고 파이에 접속하는 PC의 host에 dhkim94.org 를 등록하도록 한다.

daeheekimui-MacBook-Pro-2:~ dhkim94$ sudo vi /etc/hosts

# raspberrypi
192.168.1.180     dhkim94.org

또한 가짜 도메인이므로 파이의 /etc/hosts 에도 등록해 두자.

pi@raspberrypi ~ $ sudo vi /etc/hosts

127.0.0.1       dhkim94.org

nginx 설정이 모두 완료 되었고 daemon도 올라 갔으므로 정상으로 동작하는지 최종으로 외부에서 접속해 본다. hosts가 등록된 PC에서 다음과 같이 한다.(간단하게 웹브라우저로 붙어 봐도 된다.)

daeheekimui-MacBook-Pro-2:~ dhkim94$ telnet dhkim94.org 80
Trying 192.168.1.180...
Connected to dhkim94.org.
Escape character is '^]'.
GET /index.html HTTP/1.0

GET /index.html HTTP/1.0 을 입력하고 엔터 두번 치면 index.html 내용을 볼 수 있다.
돌아가는 것을 확인 했다면 nginx 의 log에 rotate 를 걸도록 하자.

log rotate를 위해서 cronolog를 사용하기로 한다.

pi@raspberrypi ~ $ sudo apt-cache search cronolog
pi@raspberrypi ~ $ sudo apt-get install cronolog
pi@raspberrypi ~ $ sudo vi /etc/init.d/nginx

다음 내용을 nginx 스크립트에 추가 한다.

logdir="/data/log/dhkim94.org/nginx"
cronolog="/usr/bin/cronolog"

cronolog_start() {
    if ! [ -p $logdir/access_pipe ]; then
       rm -f $logdir/access_pipe
       rm -f $logdir/error_pipe
       mkfifo $logdir/access_pipe
       mkfifo $logdir/error_pipe
    fi

    /bin/sh -c "/bin/cat $logdir/access_pipe | $cronolog $logdir/access.%Y%m%d &"
    /bin/sh -c "/bin/cat $logdir/error_pipe  | $cronolog $logdir/error.%Y%m%d &"
}

# 다음은 start case 문 변경
case "$1" in
        start)
                echo -n "Starting $DESC: "
                test_nginx_config
                # Check if the ULIMIT is set in /etc/default/nginx
                if [ -n "$ULIMIT" ]; then
                        # Set the ulimits
                        ulimit $ULIMIT
                fi
                # cronolog_start 추가
                cronolog_start || return 7

                start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                    --exec $DAEMON -- $DAEMON_OPTS || true
                echo "$NAME."
                ;;
...

nignx 스크립트를 변경하고 nginx를 내렸다 올리자.

pi@raspberrypi ~ $ sudo service nginx stop
pi@raspberrypi ~ $ sudo service nginx start

웹브라우저로 다시 접속 후 로그가 분리 되어 있는지 확인 한다.
여기까지 mysql, nginx는 설치 완료! 변경 사항이 필요하면 사용하면서 변경 하도록 한다.

나머지 잡다 설정

ssh 접속 까지 완료 되었으니 평소에 사용하는 개발에 필요한 다음 프로그램들을 설치 해 보도록 하자. 설치할 프로그램은 다음과 같다.

1. telnet client : 특정 포트로 접속 확인및 내용 확인을 위해서 사용
2. 언어및 시간 설정
3. git client : 기본으로 설치 되어 있음


참고로 라즈비안에서 프로그램 설치는 우분투와 같이 apt-get 을 통해서 설치 하면 된다.

[telnet client 설치]
다음 명령어로 설치, 확인을 진행 한다.

pi@raspberrypi ~ $ sudo apt-cache search telnet
pi@raspberrypi ~ $ sudo apt-get install telnet
pi@raspberrypi ~ $ which telnet
pi@raspberrypi ~ $ telnet google.com 80

telnet client 패키지가 존재하는지 체크 후, 설치, telnet 명령어의 위치 확인 한다.
마지막으로 google.com 에 80 포트로 붙으면 다음을 타이핑 해서 페이지 제대로 가져오는지 확인 한다.

GET /index.html HTTP1.0

GET을 타이핑 하고 엔터 두번을 쳐 주면 index.html 요청에 대한 응답을 받을 수 있다.


[언어및 시간 설정]
기본 언어를 한국어로 변경 한다. 파이의 설정 변경을 통해서 간단하게 변경 하능 하다.

pi@raspberrypi ~ $ sudo raspi-config

4번 Internationalisation Options 를 선택 한다.


I1 Change Locale 을 선택 하며 여러 가지 Locale이 나오며 필요에 따라서 여러개를 선택 하면 된다. en_US.UTF8 UTF-8, en_US ISO-8859-1, ko_KR.EUC-KR ko_KR.EUC-KR, ko_KR.UTF-8 UTF-8, zh_CN GB2312, zh_CN.UTF-8 UTF8 을 체크 했으며, 기본은 ko_KR.UTF-8 UTF-8을 선택 했다.


다음으로 Timezone 을 바꾸도록 한다. I2 Change Timezone 을 선택 한다.


Asia/Seoul 을 선택 한다.



선택이 완료 되고 나면 터미널에서 시간을 확인 해 보도록 한다.

pi@raspberrypi ~ $ date
2015. 07. 05. (일) 01:28:20 KST

드디어 기본 설정이 모두 끝난거 같다. 근데, 기본 개발 언어를 자바로 쓰고 싶지만 라즈베리 파이에 자바는 오버 인거 같고, 10년전에 본 파이썬을 다시 사용해 봐야 하나....문법 기억도 안나는데 에고...

2015년 7월 4일 토요일

네트웍 설정및 sshd 설치

집에 책상도 없고 모니터를 놓으려면 마나님의 눈치를 봐야 하는 입장이라 원격으로 접속하기 위한 환경을 OS 설치 이후 곧바로 설정 했다.

랜선을 직접 라즈베리 파이에 직접 연결 해서 사용하기는 불편해서 USB 형태의 무선 랜 카드를 사용해서 네트웍 연결을 하도록 한다.

작업 진행 하기 전에 확인 해야 할 사항은 접속할 무선 공유기의 보안 방식이다. WPA2 방식으로 보안을 설정 되어 있으면 제대로 접속이 안되는 것으로 보이며, 만일 WPA2 only 로 사용하고 있다면 WPA/WPA2 Personal 로 바꾸도록 한다.(이것 때문에 잠깐 해맷다는....)


위는 집에서 잡히는 AP 리스트이고 Farm에 붙을 예정이다. 리눅스 환경에서는 그냥 터미널로 작업 하는 것이 편해서 라즈베리 파이의 GUI 를 사용하지 않고 터미널에서 설정 한다.

참고로 많이 보던 명령어인 startx 를 라즈베리 파이의 터미널에서 실행하면 X가 뜬다. 헐... 대박..

일단 USB가 제대로 잡혀 있는지 부터 확인 해 보도록 한다.

pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0142:9124 Standard Microsystems Corp.
Bus 001 Device 001: ID 2c1d:1234 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 8751:dd54 Standard Microsystems Corp.
Bus 001 Device 004: ID 34d1:0912 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

004번에 Realtek 으로 제대로 잡혀 있다. 다음으로 보이는 AP 들을 스캔 해 보도록 한다.

pi@raspberrypi ~ $ sudo iwlist wlan0 scan

위의 명령어를 치면 AP 들을 스캔하고 보이는 AP 를 주르륵 띄어 준다. 접근하려는 AP 의 SSID가 보이는지 확인 후, wpa_supplicant.conf 파일을 수정 한다. ssid 에 AP 의 ssid 를 적고 psk 에 AP의 접근 패스워드를 적는다.

pi@raspberrypi ~ $ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="Farm"
        psk="xxxxxxxx"
}

수정 하고 나면 wlan0 를 다음과 같이 올렸다 내리도록 한다.(/etc/network/interface 파일은 수정 하지 않더라도 이상 없이 동작 하는 것으로 보인다.)

pi@raspberrypi /etc/network $ sudo ifdown wlan0
pi@raspberrypi /etc/network $ sudo ifup wlan0

완료 되고 나면 몇몇 가지 명령어로 상태를 확인 해 보도록 한다.

pi@raspberrypi /etc/network $ ifconfig
pi@raspberrypi /etc/network $ sudo ifplugstatus wlan0
pi@raspberrypi /etc/network $ iwconfig

최종으로 구글에 ping 을 때려 보도록 하자. telnet client가 없기 때문에 ping 으로 대신 한다.

pi@raspberrypi /etc/network $ ping google.com
PING google.com (59.18.35.40) 56(84) bytes of data.
64 bytes from cache.google.com (59.18.35.40): icmp_req=1 ttl=56 time=3.13 ms
64 bytes from cache.google.com (59.18.35.40): icmp_req=2 ttl=56 time=3.11 ms

ping이 제대로 된다면 네트웍 설정은 완료 된 것이다. 이젠 sshd를 활성화 시키자. sshd 활성화는 무진장 쉽다.  그냥 설정 화면에서 ssh를 on 시켜 주면 된다.

pi@raspberrypi /etc/network $ sudo raspi-config

기본으로 제공되는 라즈베리 파이 설정화면으로 들어가서


8번 Advanced Options 를 선택 후 A4 SSH 를 선택하면 Enable/Disable 시킬 수 있다.


완료되고 나면 터미널에서 sshd가 올라가 있는지 확인 해 보도록 한다.

pi@raspberrypi /etc/network $ ps -ef | grep sshd
root      2205     1  0 10:59 ?        00:00:00 /usr/sbin/sshd
root      2347  2205  0 11:00 ?        00:00:00 sshd: pi [priv]
pi        2351  2347  0 11:00 ?        00:00:00 sshd: pi@pts/0
pi        2701  2352  0 11:29 pts/0    00:00:00 grep --color=auto sshd

마지막으로 다른 컴퓨터에서 라즈베리 파이에 제대로 접속되는지 ssh로 붙어 보도록 하자.

라즈베리파이로 놀기 시작

다른 개발자 분의 소개로 들어 본 라즈베리파이. 그 동안 구입 할까 말까 망설이다가 그냥 질렀다. 배송이 오래 걸릴거라고 생각했는데, 주문한지 하루 만에 도착 했다. 헐...한국 온라인 판매 및 택배의 경쟁력은 놀라울 정도...

라즈베리파이 본체 외에 케이블이나 SD 카드 등등 다른 것들도 필요한데 그냥 귀찮아서 돈을 약간 더 주고 스타트 키트로 구매 했다. 라즈베리파이 포장을 뜯고 나니 상상 했던 것 보다 작은 크기에 놀라움을 금치 못했다. 대단한 기술의 진보! 

장난감을 받았으니 장난감을 가져 놀기 위한 설정인 OS를 인스톨 해 보도록 한다.

OS는 다음 사이트에서 무료로 제공 된다.

기존에는 라즈비안(OS명)을 받아서 약간의 추가 단계로 SD  카드에 설치 했던 것으로 보이는데, 이제는 간편하게 설치 할 수 있는 Noobs 란 것을 제공해 주고 있다.  Ubuntu도 Ubuntu mate 라는 이미지로 제공 해 준다. Ubuntu 라는 이름에 잠시 3초 고민 했는데 그냥 기본 OS로 설치 하기로 결정 했다.

NOOBS is an easy operating system installer which contains Raspbian. It also provides a selection of alternative operating systems which are then downloaded from the internet and installed.
 NOOBS Lite contains the same operating system installer without Raspbian pre-loaded. It provides the same operating system selection menu allowing Raspbian and other images to be downloaded and installed.

두 종류가 있는데, Noobs Lite 는 설명을 보니 네트웍으로 통해서 설치하는 것으로 보여 Noobs로 설치 하기로 결정 했다.


OS 설치를 위해서는 Micro SD 카드가 필요하다. 혹시 몰라서 Micro SD 카드를 체크 후 진행 하도록 한다.


Noobs 를 다운로드 받은 후 SD 카드에 압축 해제 한 파일을 그대로 복사 한다. 스타트 키트 이기 때문에, Micro SD 카드와 Micro SD 카드를 끼우는 USB 카드 리더 까지 있어서 간편하게 복사를 진행 했다. 참고로 압축 해제된 파일 중에 INSTRUCTIONS-README.txt 가 존재하는데, 여기에 설치 하는 방법이 자세하게 적혀 있다.



OS 설치를 위해 준비 완료 되었고 다음 단계로 라즈베리파이를 기동 시켜 보자.
라즈베리 파이에 모니터, 마우스, 키보드를 연결 후 전원을 연결 하면 LED가 켜지면서 부팅을 시작 한다. 화면에 잠시 무지개 색상을 보여 주다가 설치 화면이 등장 한다.


총 3개가 보이는데, Data Partition 은 설치 관련 optional buffer 를 만드는 것인데 여기를 참고 하면 된다. 또한 Boot to Scratch 는 학습용 언어인 Scratch 관련된 것으로 보이는데 Scratch가 필요 없기 때문에 첫번째만 선택 하고 설치를 진행 하자.


OS 설치가 완료되고 나면 일반적인 Linux 부팅시와 흡사하게 글자들이 주르륵 올라가면서 부팅이 시작 된다.


모두 완료 되고 나면 로그인 하라는 대기화면이 나오지 않고 환경 설정 화면을 자동으로 띄어 준다.(아래 첨부된 이미지는 설치 완료 후에 ssh 로 붙은 화면이다. 사진을 찍지 못해서 ㅎㅎ)


여러 가지 메뉴가 있는데 사용한 것은 다음과 같다.

1. Expand Filesystem : Noobs 를 사용하지 않고 OS 설치하면 File System 을 SD 카드 전체로 잡지 않고 OS 설치된 크기 만큼 잡는 것으로 보이는데, Noobs 로 설치 했기 때문에 이미 Expand 되어 있는 상태 이다.

2. Change User Password : root 및 기본 아이디의 패스워드 변경 하는 것이다. 원하는 값으로 변경 하도록 하자.

7. Overclock : Low 로 할 바에야 overclock 할 의미가 없는듯 보이고, High는 좀 불안해 보여서 Medium 으로 선택 했다.

<Finish>를 선택 하고 환경 설정을 종료 한다.(탭키를 누르면 리스트에 있는 커서가 아래로 이동 한다)

이제 드디어 많이 보던 로그인 대기가 나오며 여기에 변경한 패스워드를 사용하여 로그인 하면 OS 설치는 모두 완료 된 것이다. 아이디는 root 가 아니라 pi 로 고정되어 있다.

추가로 라즈베리 파이를 종료하는 명령어는 다음과 같다. 그냥 리눅스 기본...

pi@raspberrypi ~ $ sudo shutdown -h now


다음 글에서는 네트웍을 잡아 보고 작업 환경 기본 설정을 하도록 하자.

2013년 12월 23일 월요일

토비의 스프링...이런 책의 가격이 겨우 4만원이라니.

며칠 OSX 공부를 중단하고 "토비의 스프링"을 보고 있다. 현재 5장까지 본 상태인데, 샘플로 제공하는 예제 코드도 모두 제대로 돌아가고 진행되는 것에 대한 설명이 자세하게 되어 있어 책의 두께에 비해서 진도는 빨리 나갈 수 있는 교제이다. 샘플 타이핑 치는 시간을 제외하고는 소설책 읽듯이 술술 넘어간다.

대체 왜! 자바에서 Spring으로 통일되었는지 궁금했는데, 5장까지만 보아도 답이 보인다.
5장까지 보고 내린 결론은 Spring은 디자인 패턴 사용을 강제하고 있다는 것이다. 물론 디자인 패턴이고 나발이고 사용할 생각이 없는 상태에서 Spring을 적용할 수도 있지만, 이건 Spring을 사용하는 게 아니라, 그냥 Spring의 jar 파일만 포함해 둔 것이지 아닐까 한다.

PHP의 CI를 보면서 아주 단기간의 학습으로 나름 괜찮은 퀄리티가 나오는 코드를 만들수 있다는 것에 충격을 받았는데, CI는 Spring에 비한다면 정말 '세발의 피' 라고 보여진다. "토비의 스프링"이라는 책이 아주 좋은 교재 인 것도 있지만, 그 동안 개발해 오면서 고민하던 것들에 대해 책을 보면 볼 수록 명쾌하게 답변을 제시 하고 있다. 근 3년간 HTML5 기술에 묻혀서 놀고 있었다는 생각이 많이 든다. 아까운 3년의 시간!

아무튼 5장 까지 보고 난 다음 하고 싶은 말은
"대체 Spring Framework 개발자들은 뭘 만들어 놓은 거야? 이런걸 공짜로 푼다고?"
위의 한마디 이다.

2013년 12월 18일 수요일

10장(아카이브)

10장은 데이터 저장기능에 관련된 챕터이다. 10장의 내용을 한줄로 줄인다면,
어플리케이션에서 생성한 데이터를 파일로 저장/불러오기 하기 위해서 object 를 아카이브(serialize) 하는 방법을 설명 하고 있다.

아카이브(serialize)는 자바나 기타 언어에서도 사용하고 있는 방법이기 때문에, 이해하는데 특별한 어려움은 없다. 다만 Cocoa 프레임워크의 저장/불러오기 관련 함수가 어떤 것들이 있는지 구경 해 보는 의미가 있다. 역시 추후에 기능 사용시 다시 돌아와서 봐야 할 내용으로 생각 된다.

내일 다시 11장 진도를 나가 보도록 하자. 오늘 여기까지...

bash shell로 파일 삭제 cronjob

find mdate 를 이용하여 백업 파일 삭제하는 cronjob 을 걸어 두었는데, find mdate 의 결과가 장비마다 이상하게 나오는 원인 파악 불명인 이상한 현상이 보여서, 그냥 ls, awk 를 이용해서 만들었다. find mdate 의 결과가 왜 이상하게 나오는지 정말 궁금하다???

#!/bin/bash


# _yyyymmddhhMM.tar.gz 형식의 파일을 run time 기준으로 삭제 한다.
# 원래는 find -mdate 로 만들었으나, find -mdate 의 결과가 ls -al 로 테스트 했을때
# 장비별로 다르게 나오는 파악하기 힘든 원인으로 인해 ls, awk 를 이용하여 삭제 하는 것을 만들었음
#
# 추후 _yyyymmddhhMM.tar.gz 파일 형식이면 SRC_DIR 만 수정하여 그대로 사용하면 된다.
# (실제로는 "_yyyymmddhhMM." 까지만 형식이 같으면 사용 가능하다.)


# find mtime 으로 검색이 원하는데로 돌지 않아서, 파일명 매핑으로 변경 한다.
#DAY_AGO=7
#/usr/bin/find /data/backup/fsp/src -mtime +$DAY_AGO -exec rm -rf  {} \;


# 파일을 삭제할 디렉토리 지정
SRC_DIR=/data/backup/fsp/src1

# SRC_DIR 이 존재하는 디렉토리 인지 체크 한다.
if [ ! -d ${SRC_DIR} ]; then
 # cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다.
 echo "${SRC_DIR} not exist target directory. terminate shell."
 exit
fi

# 파일 삭제할 기준을 설정(파일 이름에서 날짜가 스크립트 run 타임 기준으로 7일 이전)
AGO_DAY=`date +%Y%m%d%H%M -d '7 day ago'`

# ls를 이용하여 파일명을 가져온다.
FILE_LIST=`ls ${SRC_DIR}`

# 파일명으로 돌면서 조건 판단한다.
for fname_full in ${FILE_LIST}; do
 # 파일명의 포맷이 aaa_yyyymmddhhMM.tar.gz 로 되어 있기 때문에 "." 으로 분리된 제일 처음을 가져온다
 fname=`echo $fname_full | /bin/awk -F"." '{print $1}'`
 # 가져온 제일 처음 값에서 "_" 으로 분리된 날짜값을 가져온다.
 cdate=`echo $fname | /bin/awk -F"_" '{print $2}'`
 
 # 가져온 날짜값이 존재하는지 체크 한다.
 if [ "X"${cdate} != "X" ]; then
  # 가져온 날짜 값이 기준 시간 이전이면
  if [ $cdate -le $AGO_DAY ]; then
   # 삭제 한다. cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다.
   echo "/bin/rm -rf ${SRC_DIR}/${fname_full}"
   /bin/rm -rf ${SRC_DIR}/${fname_full}
  fi
 fi
done

9장(NSUndoManager)

9장 제목에서 솔직히 겁을 먹었는데, 역시 이 책을 보고 처음으로 어렵다는 생각이 드는 챕터였다. undo 자체가 힘든 알고리즘 이기 때문에, 간단하게 보여주는 것도 이해하기가 상당히 힘들다.

일단은 돌아만 가게 코딩을 해 봤는데, 추후 두고 두고 펼쳐 보면서 이해를 해야 하는 챕터로 생각 된다. 더 이상 고민 해 봤자, 진도가 안 나갈듯 하니 키핑해 두고 10장으로 넘어가자!
오히려 10장이 더 쉬울듯...

2013년 12월 15일 일요일

8장(NSArrayController)

8장은 정말 말이 나오지 않을 정도로 마법 같은 것을 알려 준다. Interface Builder를 이용하여 몇 번 클릭과 약간의 코딩으로 쓸만한 테이블뷰를 만든다. 지금 당장은 기억나지만, 앞으로 8장은 앞으로 계속 몇 번이고 다시 볼 것으로 예상한다.

8장의 내용 하나만 알아도 책값은 충분하다고 생각될 정도로 환상적인 결과를 보여주는 챕터이다.

Interface Builder와 코코아 내장 클래스를 이용한 코딩 하는 테크닉에 대해서 알려주는 것이어서 내용을 보고 직접 해 보는 것 외에는 설명할 게 없다.

마지막에 등장하는 연습 문제 2개는 내일 해 보기로 하고 오늘은 여기까지! 9장이 아주 기대  된다.

Mysql 명령어 모음

sql문을 사용할때 마다 계속 찾곤 하는데, 추후 필요할지 몰라서 기록해 둔다. (현재 RasorSQL 을 사용하기 때문에 당장 필요는 없는데, 추후 어떻게 될지 모르니...)

1. 데이터 베이스 생성
mysql> CREATE DATABASE spring CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

2. user 생성
mysql> GRANT ALL PRIVILEGES ON spring.* TO '아이디'@'localhost' IDENTIFIED BY '패스워드';


나머지는 필요할때 마다 추가 하도록 하자.

2013년 12월 14일 토요일

Spring 개발툴 STS

자바 개발을 하지 않아서 맥북에 이클립스 조차 깔려 있지 않은 상태이다. Spring 공부를 위해서 이클립스를 인스톨 하려고 했는데, "토비의 스프링" 9장에 보니, STS 란 것을 소개 하고 있었다. 요즘은 이클립스에 여러 플러그인이 합쳐져서, 플러그인을 모아둔 특정 버전의 이클립스를 사용하는 가 보다. 세상 참 많이 변했다는...

STS 는 Spring.io 사이트에서 무료로 받을 수 있다. spring.io 에서 Spring Tool Suite 란으로 들어가면 된다. Java 이기 때문에 OSX 버전도 있다. 3.4.0.RELEASE 버전을 다운로드 받았다. 



다운로드 받으면 친절하게 dmg 파일로 만들어져 있다.(spring-tool-suite-3.4.0.RELEASE-e4.3.1-macosx-cocoa-x86_64-installer.dmg) dmg 파일을 삽입하면 인스톨러 파일이 보인다.


인스톨러 파일을 실행하면 전형적인 인스톨 단계로 진행된다. 설치 디렉토리만 개발에서 사용하는 디렉토리로 바꿔 주었고 나머지는 디폴트로 인스톨 진행 하였다. 인스톨 완료하면 끝내면서 STS 를 실행 할지 물어 보는데, 실행하지 않게 해서 인스톨러 종료 했다.

STS 의 실행 파일은 설치된 디렉토리 하단에 sts-3.4.0.RELEASE/STS 로 존재한다.


STS 를 더블클릭해서 실행하면, workspace 디렉토리를 물어 보는데 원하는 디렉토리로 잡아 주면 된다. 그리고, Ok 하면 STS 가 처음으로 실행 된다.


실행되고 나면 나머지 설정은 추후에 하기로 하고, 가장 중요한 문서 인코딩 설정을 한다.
메뉴바에서 "Spring Tool Suite > 환경 설정" 으로 들어가서 "General > Workspace" 항목에서 "Text file encoding" 을 원하는 값으로 바꿔 주자. (역시 EUC-KR 이 디폴트로 되어 있는..) 편하게 사용하기 위해서 UTF-8 로 바꿔 줬다.


일단 여기까지 하고 사용해 보기로 하자. 자바를 하도 오랫만에 하고 Spring 을 모르니, 필요한 것은 차근 차근 설정 하기로 한다.

J2EE? JavaEE?

변명이지만 아주 오랫동안 자바를 하지 않아서 자바 진영에서 사용하는 단어도 헷갈린다.
그중에서 J2EE 와 JavaEE. 같은 것으로 알고 있었지만, 확실히 하기 위해서 찾아보았다.

검색 결과, 역시 위키. 위키에 다 나온다. (설명된 위키 페이지 바로 가기)

간단하게 설명하자면 J2EE 1.4 버전까지는 J2EE 라고 불렀지만, 다음 버전부터는 개명을 해서 JavaEE 라고 부른다. 즉, J2EE 1.4 다음은 JavaEE 5라는 것!

자바 버전명에 대해서 자세한 내용도 역시 다른 위키 페이지에 있다. 자바쪽은 이름 외우기도 힘들다. 버전에 대한 위키의 내용을 옮겨 왔다.

자바의 버전은 보통 Java SE 또는 JDK/JRE의 버전으로 말한다.
JDK(Java Development Kit)는 표준 라이브러리를 포함하며, JDK 버전이 바뀜에 따라 이 라이브러리가 확대되고 API가 바뀐다. 초기 1.0/1.1 버전에서 JDK/JRE의 명칭을 사용하다가 Java 1.2가 발표되면서 J2SDK/J2RE라고 개명하여 사용했으나 기존의 명칭으로 사용하는 사람들이 많아 현재는 다시 JDK/JRE의 명칭으로 돌아왔다. 또한 J2SE(Java2 Standard Edition)라는 명칭 또한 Java SE(Java Standard Edition)으로 변경되었다. [2]
자바 버전 체계의 메이저 버전(소숫점 위)이 계속 1.x로 고정되어 마이너 업데이트로 여기는 경우들이 있어 1.5 버전부터 5.0(1.5), 6(1.6)의 형태로 제품 버전을 코드 버전과 별개로 발표하고 있다.[3]
언어 자체는 자바 언어 명세(Java Language Specification, JLS)에서 정의되며, 판(edition)으로 구분한다. JDK가 확장되는 동안 언어는 2판에서 거의 변화가 없었으나, JDK 5와 함께 바뀐 JLS 3판에서 제네릭(generic) 타입, 애너테이션(annotation) 같은 기능이 도입되면서 상당히 바뀌었다.
JDK 7에서는 자바 언어에 상당한 변화가 계획되어 있었으나 JDK 7로 예정되었던 변화가 JDK 7와 JDK 8으로 나눠지면서 JDK 7에는 상대적으로 사소한 언어 특성만이 추가되었다. 구체적으로 이진수 표기 추가, 가독성을 위해 수 표기에 밑줄(underscore)을 허용, 스위치 문(switch에서 문자열 사용, 제네릭 타입 객체 생성 시 타입 추론(type inference), 자동 자원 해제를 위한 try 문법, 여러 예외 타입을 동시에 잡도록 허용하는 문법 등이 추가되었다.


7장(키-벨류 코딩, 키-벨류 옵저빙)

7장을 보고 난 다음 든 생각은 "이런 것도 모르면서 iPhone 개발을 하려고 생각했었나?" 이다. stackoverflow 에서 "OSX 개발자는 대부분 이 책에서부터 시작했다"는 말이 맞을 정도로 interface builder를 사용하면서 가장 궁금한 부분을 알려 준다.

interface builder를 거의 사용하지 않았지만, 한 번씩 사용하면서 안타까웠던 게 "내가 생성한 변수를 여러 가지 UI component와 어떻게 연결 못 시키는가?" 였었다. 그런데 7장에서 이것을 알려 준다.

처음 키-벨류 코딩, 키-벨류 옵저빙이라고 해서 sqlite 인가했었는데, 말 그대로 변수에 바인드를 걸고, 특정 UI Component를 바인드된 변수에 옵저버로 등록하는 것이다. 이렇게 하려면 키-벨류 코딩이 필요하다.

그리고 setter와 getter를 쉽게 사용할 수 있게 만드는 프로퍼티에 대해서 설명하고 있다. 프로퍼티의 속성은 다른 책에서도 설명되어 있지만, 보기 좋게 정리되어 있어서 옮겨 본다.


  • assign : 단순히 대입만 한다. 포인터가 아닌 스칼라형(정수형이나 실수형)에 사용
  • strong : 말 그대로 strong 하게 연관 관계를 맺는 것이다. strong으로 엮여 있는 것은 메모리에서 해제되는 것이 방지됨
  • weak : strong의 반대. 메모리에서 해제되면 자동으로 nil 값으로 설정됨
  • copy : 프로퍼티 대상이 문자열일 때나 뮤터블 서브클래스를 이용하는 클래스를 사용할 때 주로 이용
  • nonatomic : getter, setter에 lock을 걸지 않음(스레드로 돌지 않을 때)
  • atomic : getter, setter에 lock을 걸 때(스레드로 돌 때 접근 경쟁을 막기 위해서)
  • readwrite : 기본값으로 설정되는 것. 프로퍼티가 read, write 모두 가능
  • readonly : 프로퍼티가 read만 가능하게 만들 때(setter가 무시됨)

noatomic, atomic은 스레드 프로그램에서 필수인데, 프로퍼티의 속성으로 쉽게 처리 가능할 수 있게 만든 게 눈에 띈다.

마지막으로 키 경로(Key Paths) 에 대해서 설명하고 있는데, 이건 기억해 두면 추후 코딩량을 많이 줄이게 될 것으로 예상한다.

8장으로 넘어가 보도록 하자. 짧게 챕터가 구성되어 있으니 짬짬이 시간을 내 보는 처지에서 아주 좋다.

2013년 12월 13일 금요일

6장(도우미 객체)

6장은 Delegate와 도우미객체에 대해서 설명하고 있다. (그동안 도우미 객체와 Delegate가 같은 것으로 생각하고 있었는데, 잘못 알고 있었다. 기본 component들을 사용하지 않았으니, 잘못 알고 있었어도 이상 없이 코딩할 수 있었었다.)

한 번씩 샘플로 TableView를 사용 때, Delegate 외에 DataSource 라는 이상한 놈을 사용했는데, 이것이 도우미 객체이다. 자신과 특정한 일을 하는 것을 분리하는 패턴이 정말 유용하게 보인다.

그런데 책에 문제점이 눈에 띈다. 번역의 문제인지 원본의 문제인지 모르겠지만, 예제 코드가 책에 나온 데로 하면 제대로 돌지 않는다. iOS 개발도 하지 않고 OSX 개발을 전혀 하지 않은 경우는 좀 헤맬듯싶다. 대신 헤매다 보면 기능에 대해서 보다 정확하게 알 수 있다.

대신 6장 마지막에 나오는 연습 문제는 괜찮다. 2개의 연습 문제를 해결 할 수 있다면 protocol 사용하기 전의 Delegate 에 대해서 충분히 이해했다고 생각하면 된다.

6장은 좀 실망을 안고, 7장으로 고고싱~