2015년 9월 1일 화요일

[3. RaspberryPi ] 무선랜 끊김 현상

[3. RaspberryPi ] 무선랜 끊김 현상


라즈베리파이를 키고 ssh로 접속해서 작업을 하다가 접속 끊고 있으면 무선랜이 계속 단절되더라...
나는 그냥 무선랜 usb 문제인 줄 알았는데 절전모드가 자동으로 된다는걸 알게 되었다.

내가 사용하는 무선랜은 iptime N100 mini인거같고 리얼텍 칩셋이 8188cu 모델인거 같은데 절전모드를 해제하는 방법은 8192cu 모델과 동일한것 같다.
다행히 사람들이 8188이나 8192를 많이 사용해서 관련된 글을 쉽게 찾을 수 있었다.
내가 참고한 사이트는 아래이다. 자세히 설명을 잘 해 주셨다. 감사합니다.
https://blog.ayukawa.kr/archives/1463




먼저, 무선랜이 절전모드가 설정되어 있는지 확인한다.
    $cat /sys/module/8192cu/parameters/rtw_power_mgnt
를 입력했을 때, 1 또는 2가 나오면 절전 모드를 사용중인거라고 한다.

절전 모드가 사용중인 것을 끄기 위해서는 8192cu.conf 파일을 수정해야 한다. 만약 파일이 위치에 없다면 새로 파일을 만들면 된다.
    $sudo nano /etc/modprobe.d/8192cu.conf

파일에 아래와 같이 입력한다.(참고한 사이트의 작성자께서는 친절히 설명 주석도 넣어주셨다. )

# rtw_power_mgnt={0|1|2}
#    0 = disable Power Save Mode
#    1 = enable Power Save, MIN_PS Mode
#    2 = enable Power Save, MAX_PS Mode
# rtw_enusbss={0|1}
#    0 = disable auto suspend
#    1 = enable auto suspend
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0

파일을 작성하고 저장했으면 라즈베리파이를 재부팅해주면 된다.

검색을 하다보니 이런 방법으로 무선 단절 현상이 줄기는 하나 완전히 단절이 안되는건 아니라는거 같은데, 나도 일단은 안 끊기고 있다. 좋은 해결법인듯 하다.

2015년 8월 25일 화요일

[web2py] web2py 설치 및 실행

< Web2py 시작하기 >

1. Web2py 설치

web2py 사이트에서 소스코드 다운로드 링크를 복사해서 wget으로 다운받는다.
$sudo wget http://www.web2py.com/examples/static/web2py_src.zip

2. Web2py 실행

리눅스용 web2py는 설치가 아니고 단지 압축만 풀어주면 된다.
$sudo unzip web2py_src.zip
압축이 풀린 폴더에 들어가서 web2py를 실행시킨다.
$cd web2py  
$sudo python web2py.py

3. 원격 PC의 Web Browser에서 Web2py Admin Page 접속하기

(출처 : http://stackoverflow.com/questions/12834550/simplest-way-to-setup-remote-admin-access-to-a-web2py-process)
Web2py의 Admin Page는 로컬에서 접속하거나 Https를 통해서만 접근할 수 있다.
그래서 다른 컴퓨터의 Web Browser를 통해서 Web2py의 웹서버에 있는 웹페이지는 접근이 되지만 Admin 페이지는 접근할 수 없어서 원격 PC에서 Web2py를 설정할 수 없다.
이러한 문제를 해결하기 위해서 SSL 인증서를 Web2py 서버에 추가하는 방법을 사용한다.
간단한 방법은 아래와 같다.(여기서 설명하는 방법은 개발할때만 사용하고 실제 상용될때는 사용하면 안된다.)
(1) 이미 가지고 있는 인증서가 없다면 새로운 인증서를 만든다.(임의의 폴더에서 수행해도 무방하다.)
$openssl genrsa -out server.key 2048
$openssl req -new -key server.key -out server.csr
$openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
두번째 명령을 수행할때 인증서에 들어갈 정보를 입력하라고 한다. 아래 사진과 같은 정보를 요구한다.
(2) 위의 과정을 수행하고 나면 3개의 파일이 생기는데 그중 server.key파일과 server.crt파일을 web2py의 루트폴더에 복사한다.
(3) 그리고 web2py를 실행시킬 때 아래와 같이 실행한다.
$sudo python web2py.py -i (자신의 ip주소) -p 8000 -a '(원하는 비밀번호)' -c server.crt -k server.key
(4) 이제 아래와 같은 주소로 원격 PC의 Web Browser에서 웹페이지에 접근한다.(https 가 중요하다.)
https://(web2py 실행시 입력한 ip주소):8000
헌데 브라우저에서 인증서를 의심하여 접속을 막을 수 있다. 어차피 내가 만든 인증서이니 믿고 그냥 들어가도록한다.
위 주소에서 Admin Page로 들어가면 정상적으로 들어가진다.

4. 여러 ip로 접근 가능하게 하기.

web2py는 여러개의 ip를 이용하여 웹서버에 접속하게 할 수 있다.
위에서 처럼 하면 -i 옵션 뒤에 한 ip주소만 쓸 수 있지만 --interfaces 옵션을 이용하면 여러개의 ip를 지정할 수 있다.
$sudo python web2py.py --interfaces "ip1:port1;ip2:port2;..." -a '(원하는 비밀번호)'
위의 예시처럼 하면 ip1과 ip2 두 경로로 웹서버에 접속 할 수 있다.
그렇다면, admin 접속을 위한 ssl 인증서는 어떻게 할까? 그건 아래 예시처럼 하면 된다.
$sudo python web2py.py --interfaces "ip1:port1:key:crt;ip2:port2;..." -a '(원하는 비밀번호)'
위의 예시처럼 하면 ip1과 ip2 두 경로로 웹서버에 접속 할 수는 있지만, admin페이지는 ip1으로 접속해야만 접근할 수 있다. 이 경우에 ip2에 대해서는 ssl인증서를 입력하지 않았으므로 ip2는 https 가 아니라 http 로 입력해야한다.

2015년 8월 23일 일요일

[web2py] URL 함수 이용하기.

[web2py] URL 함수 이용하기.


web2py의 장점중 하나는 Restful 방식이 쉽게 구현된다는 것이다.
무슨말인즉슨, URL형태로 웹서버의 함수를 콜하면 함수가 동작하고 그에 대한 반환값을 반환한다는 것이다.

예를 들어서 웹서버에 ABC() 라는 함수가 있고 이 함수가 수행되면 "abc"라는 문자열을 반환한다고 치자.
이 경우에 web2py는 간단하게

    http://웹서버주소/[application name]/[controller]/[function]

을 치면 함수의 반환값인 "abc"가 넘어온다. 웹브라우저에서 수행하면 반환값이 화면에 출력될 것이다.

이렇게 주소를 쳐서 반환값을 받는 작업을 php등의 다른 언어를 사용하면 구현이 바로 되거나 쉽지는 않을것이다.


web2py 내부 python코드에서는 URL 함수를 이용하면 더 편리하게 Restfaul 방식을 사용할 수 있다.
URL 함수를 설명하는 문서의 주소는 아래와 같다.
http://web2py.com/books/default/chapter/29/04/the-core#URL

기본적으로

    URL([application name],[controller name],[function name] (, args=[x,y] , vars=dict(z='t')))

처럼 간단하게 쓸수 있다.

뿐만 아니라 그림파일 등의 고정적인 파일도 static 폴더에 넣어 놓으면 간단하게 호출해 올 수 있다.

나도 아직 URL의 다양한 형태를 사용해보진 못했지만 문서에서도 web2py의 중요한 한 기능이라고 설명할 만큼 중요하고 좋은 기능이니 앞으로 많이 써보면서 정리해야 겠다.

2015년 8월 21일 금요일

[web2py] logging 모듈 사용하기.

[web2py] logging 모듈 사용하기.


처음엔 조금씩 쓰다가 web2py의 cron을 사용하면서 부터 cron에서 무슨 일이 일어나는지 알기 위해서 logging 모듈을 많이 사용하고 있다.
그럴때마다 logging모듈을 제대로 설명하고 있는 아래 사이트를 자주 참고한다.

http://www.hanbit.co.kr/network/view.html?bi_id=1979

2015년 8월 20일 목요일

[web2py] unindent does not match any outer indentation level

[web2py] unindent does not match any outer indentation level


web2py로 python코드 짜는데 코드가 정말 문제가 없는데 아래 에러가 뜨더라..

unindent does not match any outer indentation level

꽤 오래 헤맷는데 알고보니 들여쓰기 할때 space랑 tab이랑 혼용해서 사용해서 그런거라고 한다...끙...web2py는 자동 들여쓰기되면 space 4칸으로 되는데 내 코드에 tab이 껴있어서 에러가 났던 거였다.
Tab을 제거하니깐 에러가 사라졌다.

[web2py] dropdown으로 표시되는 sqlform만들기

[web2py] dropdown으로 표시되는 sqlform만들기


web2py에서 기본 input form의 형태는 그냥 text를 입력할 수 있는 textfield이다.
헌데 나는 아래 그림처럼 화살표를 누르면 목록으로 보이는 input form을 만들고 싶었다.





예전에도 시도하다가 안되서 포기 했었는데 이번에는 포기하고 싶지 않았다.
sqlform이다 보니 DB랑 연결되는 것이고 알아보다보니 db에서 Table을 생성할때 Field의 속성에서 requires에 IS_IN_SET또는 IS_IN_DB를 사용하면 select box(dropdown)이 나온다는데 나는 어찌해도 안나오더라...하루종일 이것저것 해도 안되는....ㅠㅠ

그런데 너무 간단하게 해결했다.

기존에는 내가 계속 시도할때

db.define_table([Table 이름],
                     Field([Field이름], requires=IS_IN_SET([넣고 싶은 목록]))

의 형태로, requires를 Field를 설정하는 곳 안에 넣었었다.
그러다가 web2py.com/books 에서 requires를 Field 설정부분 말고 따로 아래에서 설정해주는 예시가 있길래 해봤는데 dropdown이 나왔다!!!!


db.define_table([Table 이름],
                     Field([Field이름]))
db.[Table 이름].[Field이름].requires=IS_IN_SET([넣고 싶은 목록])

이렇게 하니깐 맨위 이미지처럼 나오더라..감격!
web2py는 언제나 한국어 자료가 너무 없다...내가 겪는 이 문제들은 다른 한국인은 겪지 않기를...

2015년 8월 18일 화요일

[web2py] modules에서 db 객체 사용하기

Modules에 있는 python 코드에서 web2py의 db 객체 사용하기.


web2py의 modules에 구현해 놓은 코드에서 web2py의 db에 접근할 일이 생겨서 db객체가 어디서나 쓸 수 있는지 알고 그냥 바로 썼는데 동작을 못하더라...
처음엔 어디가 문제인지도 모르다가 수차례 디버그 로그를 찍어보다가 db가 문제인 것을 찾았다.

modules의 python코드에서 db등의 web2py 전역 변수들(request, response 등)을 사용하려면 current 모듈을 import 해야한다.
db의 경우에는 current.db에 web2py의 db를 담아서 modules에서 사용하더라.
즉, 아래와 같은 작업이 필요하다.

(1) model의 db.py에 자신이 사용할 db를 생성한 부분에서 아래 코드 처럼 current.db를 만들어준다. (빨간 부분이 추가해줘야할 부분이다.)

    from gluon import current
    db = DAL('sqlite://webform.sqlite')
    current.db = db

(2) db를 사용할 modules의 코드에 가서 current를 import하고 current.db를 받아온다.

    from gluon import current
    ...
    (db를 사용할 함수 내에서)
    db = current.db

이렇게 하면이제 modules의 코드에 있는 함수에서 db를 접근할 수 있다.

정확한 current에 대한 설명은 web2py books에서 확인할 수 있다.
http://web2py.com/books/default/chapter/29/04/the-core?search=current#Accessing-the-API-from-Python-modules