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는 설치 완료! 변경 사항이 필요하면 사용하면서 변경 하도록 한다.