예전에 봤던 뉴스기사인데 스마트폰으로 서버를 만드는 흥미로운 기사거리여서 복사해왔습니다.
지금 여러분과 공유하려 하는 이 기술 문서는 매우 단순한 의문에서 시작한다.
“지금 우리 주머니마다 있는 스마트폰으로 PC가 할 수 있는 일을 거의 다 할 수 있는 시대가 되었는데, 약정이 풀리고 공기계가 되는 수많은 ‘스마트폰 컴퓨터’로 의미 있는 일을 할 수는 없을까?” 라는 물음이다.
스마트폰은 이미 엄청난 도구지만, 스마트폰이 전화로서의 역할을 다 한 후 컴퓨터로서의 여생이 기대된 것이다. 아마도 아이폰5나 갤럭시3와 같은 ‘신상’의 등장과 함께 여전히 쓸만하지만 어딘가 구태가 나는 폰들은 퇴출의 위기를 맞게 될 것이다. 그런데 이들은 모두 아직 나름대로 훌륭한 컴퓨터다.
이 글은 이러한 변화가 우리의 앞으로의 삶과 직업에 어떠한 영향을 주게 될지 고민해 온 '모임'에 의해 쓰였다. 모임은 앞으로 우리가 스스로의 힘으로 새로운 무언가를 시작한다고 했을 때 우리 곁에 널려 있는 사물들이 강력한 도구가 될지 모른다고 생각해 오던 중, 주위에 널린 스마트폰을 보게 됐다.
편집자주 : 글쓴이들 <사회적 잉여 IT를 생각하는 모임>은 강동인(LG전자 미디어연구소 선임연구원), 김국현(editoy.com 설립자), 안명호(MHR 대표이사), 임준학(삼성전자 책임 연구원), 4인이 모였다. 이들은 KAIST 소프트웨어 대학원에서 만난 이후 'IT가 만들어낸 잉여'가 더 나은 사회를 위해 어떻게 기여할 수 있을지를 Geek의 시각에서 연구하고 있다.
■스마트폰은 아직 훌륭한 컴퓨터
|
이 ‘약정이 끝난 스마트폰’으로 할 수 있는 일, 도대체 어디까지 가능한지 어떠한 활용법이 가능한지 시도해 보고 싶었고, 그 결과를 공유하고 싶었다. 결과는 매우 흥미로워 스마트폰은 여러분의 블로그나 커뮤니티를 돌릴 수 있는 웹서버로도 기능할 수 있었다.
그런데 왜 굳이 이런 일을 해야 하는가에 대해 의문이 들 수도 있다. 티스토리나 네이버 블로그와 같이 무료로 블로그 정도는 만들 수도 있고 카페를 사용할 수도 있고 간단한 그룹을 페이스북에 만들 수도 있는 클라우드 시대에 말이다. 드롭박스와 같은 클라우드 서비스는 꽤 많은 용량을 무료로 제공하기까지 한다.
그렇지만 이와 같은 기성 서비스들은 조건은 좋지만 모두와 함께 따라야만 하는 틀이란 것이 있다. 그리고 그 틀은 대개의 경우 나만의 비즈니스 모델을 허락해 준다는 보장 또한 없다.
우리가 이 탐색을 하며 삼은 목표는 유휴자원으로 어디까지 자급자족할 수 있고 결과적으로 자립할 수 있는지였다. 전국민이 하나의 스마트폰을 갖게 된 시대라면, 전국민이 하나의 전산실을 가진 시대는 아닐까 하는 생각에서였다.
앞으로 우리가 무슨 일을 하든 IT란 떼어낼 수 없는 필수 요소다. 그런데 이 IT란 전문인력이나 전산실이 꼭 있어야만 가능한 것이 아니다. 그리고 무엇보다 그러한 여유가 없는 일터가 훨씬 많다. 그러나 만약 약정 끝난 구형폰이 여러분의 꿈을 지탱할 전산실이 된다면 어떨까? 알고 보니 충분히 가능한 일이었다.
■‘스마트폰 전산실’에서 가능한 일들
여러분이 지금 자영업을 시작한 사장님이라고 하자. 예를 들어 작은 과자점이라고 하자. 그 과자점의 카페나 그룹을 포털이나 페이스북에 만들 수도 있을 것이다. 그리고 메뉴를 칠판에 손글씨로 만들 수도 있을 것이다. 그러나 만약 여러분만의 서버로 블로그를 만들고, 그 내용을 매일매일 다른 내용으로 주문 공간 옆의 큰 TV에 표시할 수 있다면 어떨까? 어느 쪽이 좋다는 것이 아니라, 그런 선택지가 생기는 순간 여러가지 아이디어를 함께 집어 넣을 수도 있다.
이러한 IT 역량의 자급자족을 통해 자립을 돕는 일이 한 대의 약정 끝난 스마트폰으로도 가능할지 모른다.
간판과 메뉴를 전자적으로 운영하는 디지털 사이니지 장비로도 스마트폰은 활용이 가능하다. 디지털사이니지란 간단히 이야기 하면 길거리에서 흔히 볼 수 있는 포스터, 안내문, 광고판과 같은 것들을 기존의 종이 혹은 그와 유사한 것을 이용해 보여주던 것을 디지털 디스플레이를 이용해 보여주는 것을 의미한다. 즉 IT기술을 적용한 옥외광고판이라고 이야기할 수 있다.
|
길거리를 다니다보면 다양한 종류의 가게에서 필요한 정보를 사용자에게 제공하기 위한 다양한 노력들을 쉽게 볼 수 있다. 간단하게는 자신의 영업장에서 제공하는 메뉴와 가격을 알리기 위한 것들은 매우 쉽게 눈에 띈다.
여기서 한가지 재미있는 상상을 해본다. 최근 HDMI 단자가 달린 스마트폰도 꽤 있다. 이들의 약정이 끝났을 때 여기에 모니터에 연결한다면 이는 너무나도 간단히 훌륭한 디지털사이니지로 활용할 수 있을 것이라는 생각말이다.
최근의 스마트폰들은 사실 그 성능이 충분하고 이를 활용할 수 있는 앱을 개발한다면 얼마든지 디지털사이니지로 활용이 가능할 것이다. 적당한 곳에 디스플레이 장치를 배치하고 그뒤에 HDMI 단자를 이용해 스마트폰을 연결하고 그리고는 디지털사이니지 앱을 실행시키면 누구나 쉽게 저렴한 비용의 관리가 쉽고 편리한 디지털사이니지를 가질 수 있게 된다.
■재료가 될 폰 준비
기본적으로 와이파이 기능이 있는 폰이라면 무엇이든 가능하다. 필진 중 한 명이 스마트폰을 프로젝트 때문에 갤럭시 S2로 바꾸면서 이전에 사용하던 놀고 있던 “LG 옵티머스 빅” 스마트폰이 첫번째 대상이었다. 원래는 그 옵티머스빅을 팔아서 유흥비로 탕진하려 했으나 예상외로 팔리지 않아, 책상 어딘가에 쳐 박혀 쓸쓸히 배터리를 소진해가고 있는 “옵티머스 빅”, 하지만 CPU는 1GHz인 강력한 두뇌를 가진 놈이었다.
만약 옵티머스 빅에 애용하는 웹언어 파이썬(Python)과 웹프레임워크 장고(Django)를 올려서 진정한 의미의 개인용 웹서버, 블로그등을 운영할 수 있다면 아주 멋진 일이 될것이라는 느낌을 강하게 받았고 일은 벌어지기 시작했다. 그래서 목마른자가 우물을 판다고 실제로 한번 해보기로 마음먹고 실행을 감행했다. 과연 어디까지 이 일은 가능할 것인가? 이 이외에 우리가 테스트한 폰 들은 모토롤라 쿼티, 옵티머스 빅, 넥서스 S, 안드로원 등이었다.
공교롭게도 모두 안드로이드폰이었다. 아이폰이 대상이 되지 않은 이유는 약정이 끝나도 계속 누군가의 전화의 역할을 찾아 갈 정도로 인기가 있어서라 볼 수도 있겠지만, 그보다는 일단 구조상 오픈 테크놀로지에 기반한 안드로이드에 비해서는 자유도가 낮았기 때문이다. 그리고 무엇보다도 우리 주위에 굴러 다니는 낡은 폰은 대개 안드로이드폰이었다.
■안드로이드폰으로 그럴듯한 웹서버 운영하기
먼저 해보고 싶었던 일은 과연 순정 안드로이드폰의 상태 그대로 어디까지 가능할까라는 점이었다. 소위 ‘루팅’을 하여 폰을 해방시키면 사실상 무슨 일이든 가능한 것이 컴퓨터로서의 스마트폰이겠으나, 이 루팅이라는 절차, IT를 잘 모르는 자영업자가 손쉽게 할 수 있는 것이라 보기는 힘들다. 또 행여 벽돌이라도 되는 날에는 약정도 A/S 기간도 끝났을 터이니 난감하고 우울해지기 쉽다.
다행히 안드로이드 바닥에서는 흥미로운 프로젝트들이 이미 진행중이었다.
// SL4A (Scripting Layer for Android)라는 복음
SL4A는 안드로이드 디바이스상에서, 기존에 동작하는 다양한 언어로 쓰여진 스크립트들을 실행하고 생성하는 것을 허용하는 라이브러리(Library)다. 웹기술에서는 빼놓을 수 없는 스크립트를 안드로이드 디바이스로 그대로 가져와 동일 서비스 구현을 쉽게 가능하도록 하기 위해서 SL4A가 등장한 것이다. (이전에는 Android Scripting Environment 또는 줄여서 ASE 라고 불리기도 하였다.)
|
위 그림에서 보는 바와 같이 SL4A는 Python 등의 스크립트를 실행하여 “Android Remote Procedure Call Module”에서, 스크립트의 각 코드의 실행 동작에 해당하는 “Java Android API”를 호출함으로써, “Dalvik VM”이 스크립트의 요청 동작을 동일하게 처리할 수 있게 한다. C와 Java로 구현되었고, Apache License 2.0을 따르고 있으며, SL4A가 지원하는 스크립트 언어로는 Python, Perl, Ruby, Lua, BeanShell, JavaScript, Tcl 등이 있고, PHP는 http://phpforandroid.net/ 에서 정보를 얻을 수 있다.
즉 SL4A란 안드로이드에서 Python과 같은 언어들을 사용할 수 있는 환경을 만들어주는 앱으로 본 진행절차에 있어서 제일 중요한 첫번째 걸음이다. 이를 설치해서 스크립트 언어를 사용할 수 있는 환경이 되면 그 위에 Python을 설치하면 된다.
아무래도 본 필진들의 상당수가 파이썬과 장고에 대한 애착이 큰 만큼, 파이썬부터 시도해 보자.
|
먼저 메뉴에서 설정 - 응용 프로그램으로 가셔서 '알 수 없는 소스(Unknown sources)'에 체크해서 자유롭게 사용할 수 있도록 해 둔다.
- SL4A 설치
SL4A 설치를 위해 안드로이드에서 웹브라우져를 실행하고 주소(http://code.google.com/p/android-scripting/)를 입력한다.
여기서 “Download” 섹션에서 “sl4a_r5.apk” 선택하여 실행한다. (더 높은 버전이 등장하면 물론 그 것을 선택하자)
- Python 설치
SL4A와 마찬가지로 파이썬을 안드로이드에 설치하는 것 또한 매우 쉽다. 이 또한 누군가의 거룩한 희생과 노력이 있었기 때문이니 이들 보이지 않는 손들의 노고에 감사를 표한다.
안드로이드 마켓(구글 플레이)에서 “Python Android”이라는 검색어를 치고 나온 결과 중에서 “Python For Android”를 선택하여 설치한다. 설치가 종료되면 아래그림과 같이 “Python For Android” 아이콘을 볼 수 있을 것이다.
설치한 앱을 실행하고 “install”버튼을 클릭한다.
잠시 기다리면 앱에서 필요한 파일들을 다운받아 Python을 설치할 것이다. 자 이제 Python의 안드로이드 설치가 끝났다. 이상의 설치방법은 유튜브 영상(http://youtu.be/1O39oALC83w)을 참고하여도 좋다.
|
// 안드로이드에서 돌리는 나만의 블로그
안드로이드 플랫폼에서 별도의 변경 및 시스템 개조 없이 자신만의 블로그 시스템, 즉 CMS(Content Management System)를 설치할 수 있게 되었다.
설치하고자 하는 CMS는 “Instant Press”로서, 이 단순한 CMS는 Python 스크립트로 구현된 오픈소스 CMS다. 여기에 우리가 의존하게 될 것은 web2py라는 웹프레임워크다.
- web2py 설치
PC에서 web2py를 다운로드를 받아서 SL4A와 Python for SL4A가 설치된 안드로이드 디바이스에 복사를 해야 한다. 사이트(http://www.web2py.com/examples/default/download)를 찾아가자. PC에서 위의 홈페이지에서 web2py Source Code를 선택해 임의의 경로에 다운로드 받은 파일의 압축을 풀어 준다. PC에서 압축을 풀어준 web2py폴더를 안드로이드 디바이스의 /sdcard/sl4a/scripts 폴더 안에 복사한다.
|
- SL4A 실행
안드로이드폰에서 SL4A 어플리케이션을 실행 시킨다.
- web2py.py 실행
아래 그림 왼쪽처럼 scripts폴더에서 설치한 web2py폴더로 이동을 하여 web2py.py를 실행 한다.
가운데 그림처럼 관리자 패스워드를 입력하여 준다. 여기서는 “123456”을 입력하였다.
- Web2py 동작 화면 확인
오른쪽 그림처럼 안드로이드폰에서 인터넷을 실행 시켜 “127.0.0.1:8000” 으로 접속해서 동작을 하는지 확인 한다.
|
자, 이제 기본적 웹프레임워크가 “약정이 끝난 안드로이드폰”에 완성되었다. 이 위에 본격적인 블로그를 설치해 보자. 단순하지만 무난한 제품을 하나 골라 보았다.
- InstantPress 설치
http://code.google.com/p/instant-press/
위의 홈페이지에서 “instantpress_beta6.zip” 파일을 선택해 다운로드 받은 다음 임의의 폴더에 해당 파일의 압축을 풀어 준 후, 안드로이드 디바이스로 복사한다. 설치할 안드로이드폰을 PC에 연결하여 USB저장장치로서 인식한다. 이후, 압축을 풀어준 “instantpress”폴더를 /sdcard/sl4a/scripts/web2py/applications 폴더 안에 복사한다. (아래 그림 왼쪽)
|
- web2py 실행
SL4A 어플리케이션을 실행 시키고 web2py.py를 실행 시킨다.(기존 스크립트 종료 후 다시 실행)
- 실행 확인
안드로이드폰에서 인터넷을 실행 시켜 “127.0.0.1:8000/instantpress” 로 접속해서 동작을 하는지 확인 한다.(위 그림 오른쪽)
- 현재 연결된 IP 주소 확인하기
현재 안드로이드 폰의 와이파이 설정 화면에서 현재 연결된 와이파이 네트워크 항목을 선택하면 현재 사용하고 있는 와이파이 네트워크의 IP 주소를 알 수 있다.
3G/4G 데이터 통신의 경우에는 별도의 네트워크 Tool을 이용하여 현재 연결된 IP 주소를 알 수 있다. 예를 들어“network info II”등의 안드로이드 앱을 마켓에서 다운 받아 사용하여 현재 네트워크에 연결되어 있는 IP 주소를 알 수 있다. 그러나 현실적으로 3G/4G로 웹서버를 운용하는 것은 무리수이므로, 와이파이로 한정하자.
안드로이드에 설치된 “/sdcard/sl4a/scripts/web2py/gluon/widget.py” 파일을 에디터 프로그램으로 오픈 한다. USB 저장장치로 인식한 후 PC의 에디터 프로그램을 사용하여 편집한다. 편집이 용이하지는 않겠지만, 아래와 같이 SL4A가 제공하는 편집기를 사용할 수 있다.
818 라인의 start 함수에 들어있는 “server = main.HttpServer” 항목 안의 ip 변수를 위의 방법으로 확인한 IP 주소를 아래와 같이 수정한다.
|
이제 SL4A 어플리케이션을 실행 시키고 web2py.py를 실행 시킨다. 만약 기존 web2py가 실행 중 이었다면, 기존 스크립트 프로세스를 종료 후 다시 실행해야 한다.
실행을 확인해 보자. 인터넷이 가능한 PC 혹은 다른 안드로이드폰에서 인터넷을 실행시켜 “[instant press가 설치된 안드로이드 아이피]:8000/instantpress” 으로 접속하여 동작을 하는지 확인 한다.
|
Instant Press는 예제로서 설치과정을 보이기 위하여 선택하였으며, 자세한 사용법은 http://code.google.com/p/instant-press/ 을 참고하기 바란다.
이상의 설치과정을 통하여 안드로이드 디바이스에서, SL4A 상의 Python을 이용하여, web2py 또는 다른 파이썬 프레임워크를 지원하는 Instant press 와 같은 본인의 목적이나 취향에 맞는 CMS (Contents Management System)을 선택하여 설치 사용할 수 있다.
* Python용 블로그들 http://wiki.python.org/moin/PythonBlogSoftware
* 데이터베이스 없이 쓸 수 있는 PHP 블로그들 http://www.instantfundas.com/2009/09/blogging-without-database-7-database.html
■장고(Django)는 가능할까?
안드로이드에 Python과 단순한 웹프레임워크인 web2py를 성공적으로 설치했으니 개인 웹서버, 블로그등등을 본격 운영할 수 있는 장고(Django)에 도전할 차례다. Django는 커뮤니티가 잘 발달되어 있는 웹 프레임워크이기 때문에 이를 활용할 수 있는 다양한 자료들과 관련 오픈 소스 프로젝트들이 많기 때문에 프로그래밍에 대한 약간의 지식만 있으면 손쉽게 원하는 바를 이룰 수 있다.
하지만 안타깝게도, 결론을 먼저 이야기 하면 Python을 안드로이드에 설치하는 것과는 달리 문제가 있었다. 그럼 Django를 안드로이드에 설치하는 과정에서 얻은 실패에 대한 경험을 공유하고, 대안을 모색해 보자.
- Django 다운로드
PC에서 브라우저를 열고 Django Site(https://www.djangoproject.com/download/)에서 Django source를 받는다.
|
- Django 파일 복사
다운받은 파일의 압축을 풀고 이 파일들을 USB를 이용해 안드로이트폰의 “sl4a/scripts/”폴더에 복사한다.
- Python 실행환경 작성
복사한 Django를 설치하기 위해서는 Python을 단독으로 실행할 수 있어야 하므로 이를 위해 아래와 같은 스크립트를 작성하여 사용한다.
PW=`pwd`
export EXTERNAL_STORAGE=/mnt/sdcard
export LANG=en
PYTHONPATH=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python
PYTHONPATH=$:/data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload
export PYTHONPATH
export TEMP=/mnt/storage/com.googlecode.pythonforandroid/extras/python/tmp
export PYTHON_EGG_CACHE=$TEMP
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python
export LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/files/python/lib
cd $PW
/data/data/com.googlecode.pythonforandroid/files/python/bin/python "$@"
위의 내용을 편의상 “py.sh”로 저장하고 이를 Django의 “setup.py”가 위치한 폴더에 복사한다.
* 자세한 내용은 여기서 참조한다. http://code.google.com/p/python-for-android/wiki/RunPythonFromShell
- 터미널 에뮬레이터 설치
복사한 Django를 설치하기 위해서는 다음과 같은 명령을 실행해야 한다.
“python setup.py install”
SL4A 에서는 스크립트를 실행시킬 때 파라메터를 줄 수 없기 때문에 “터미널 에뮬레이터”를 이용해야 한다.
구글 마켓에 접속해서 “Terminal Emulator”라는 검색어를 치고 해당 앱을 설치한다. 설치한 앱을 실행하면 다음과 같은 화면을 볼 수 있다.
|
* 터미널 에뮬레이터를 통해 명령어들을 자유롭게 직접 실행하기 위해서는 “루팅”이 필요하다.
- “setup.py” 실행
드디어 Django를 설치하기 위한 모든 준비가 끝났다. 떨리는 마음을 진정시키고 하나씩 차근차근 실행해보도록 하자.
a. 터미널 에뮬레이터 실행
터미널에뮬레이터를 실행한다.
b. Django를 복사한 파일로 이동한다.
“cd”명령을 이용해 설치한 경로로 이동한다. 정상적인 경우라면 폴더의 전체경로는 다음과 같을 것이다.
“/mnt/sdcard/sl4a/scripts/django복사경로”
c. “sh py.sh setup.py install”입력후 실행
Django는 설치를 위해“sh py.sh setup.py install”을 실행한다. 잠시후 바로 아래와 같은 화면을 보게 될 것이다.
|
결론적으로 이야기하면 Django설치를 하기 위해 필요한 모듈을 찾지못해 에러가 발생한다.
현재 사용하고 있는 “Python for Android”에서 Django설치를 위해 필요한 모듈을 제공하지 않기 때문에 이러한 에러가 발생하는 것이다. 이 문제를 해결하기 위해서는 필요한 모듈들을 “Python for Android”에서 필요한 형태로 패키징해서 사용해야 한다.
Django는 많은 기능을 가지고 있는 무거운 프레임워크기 때문에 필요한 모듈들이 무엇이 있을지 또 각각의 모듈들이 안드로이드에서 원하는 대로 동작할지에 대한 보장이 없기 때문에 나름 생업이 있는 사람의 하나로서 더 이상 진행하는 것이 무리라고 판단되어 일단 중지하였다. 혹 이상의 과정을 통해 필자가 실수를 하거나 다른 방법을 통해 Django를 성공적으로 설치하여 사용한 독자분이 있다면 관련자료를 공유해주시면 감사하겠다.
// Django 설치에 대한 제언
Android에서 SL4A와 Python을 이용해 강력한 웹프레임워크의 하나인 Django를 설치하는 과정을 진행하면서 느낀 것은 생각보다 많은 시간과 노력이 필요하다는 것이었다.
요즘 웬만한 자료는 구글을 통해 검색할 수 있고, 이를 통해 얻은 지식으로 문제를 해결해나갈 수 있는데 Android에 Django를 설치하는 내용에 관해서는 자료가 거의 없었기 때문에 모든 내용을 하나씩 확인하면서 앞으로 나아가야 했기 때문에 진척속도가 더뎠다.
특별한 목적이나 사명의식을 가진 사람이 아니라면 Django말고 “Web2PY”, “cherrypy”과 같은 웹프레임워크를 사용하는 것이 훨씬 더 정신 건강에 좋을 것이라 생각된다.
“Web2Py”는 Android에서 잘 동작하는 것을 확인했고 또한 프레임워크자체도 훌륭하기 때문에 일반적인 웹서비스를 만드는데 손색이 없을 것이다.
■DB에 대한 고찰, Mysql은 설치 가능할까?
Django를 비롯한 많은 웹 프레임워크들은 DB와 연동을 한다. 가장 많이 사용되는 DB가 바로 MySQL인데 이 MySQL을 안드로이드에서 설치하여 사용할 수 있는 가에 대한 내용을 간단히 조사해 보았다.
MySQL 설치에 관한 내용을 찾아 보았지만 자료를 찾을 수 없었고 대부분의 찾은 자료중에는 안된다는 의견이 많이 발견되었다. 안드로이드에서 사용할 수 있으려면 안드로이드앱 파일로 사용할 수 있어야 하는데 현재까지 MySQL을 안드로이드앱으로 개발해놓은 자료는 열심히 찾아보이지만 실패했다.
아니 어쩌면 안드로이드에서 MySQL을 설치하여 운영한다는 것 자체가 정상적인 발상이 아닐 수도 있다. 그래서 잠시 생각을 정리하여 MySQL과 같은 일반적으로 많이 사용하는 트랜잭션을 지원하고 다중 사용자 환경에서 동작하는 DB들의 특성을 생각해보면 이는 기존의 코드를 그대로 활용할 수는 없을 것이라 생각하였다.
“샌드박스(Sandbox)”와 SDCard가 주요한 원인이 될 것이다. 샌드박스는 일반적으로 실행중인 프로그램을 분리하기 위한 보안 매커니즘을 의미하는 것으로 검증되지 않은 코드를 실행하거나, 신뢰할 수 없는 어플리케이션등을 실행할 때 많이 쓰이는 기법중의 하나이다.
“Sandbox”는 실행하려는 어플리케이션에서 디스크, 메모리, 네트워크등의 리소스에 액세스하는 것을 세심하게 제어할 수 있도록 구성하며 이는 일종의 특별한 목적의 가상화(Virtualization)라고도 볼 수 있다.
안드로이드에서는 어플리케이션을 바로 그 샌드박스에서 실행을 시킨다. 따라서 어플리케이션의 영역이 OS와는 격리되고 허가받지 않은 리소스에는 액세스가 불가능하다.
샌드박스로 인하여 데이터베이스에서 필요한 파일들을 SDCard에 설치하게 될텐데 이는 SDCard의 Writing 문제로 인하여 디스크 액세스가 굉장히 빈번한 DB에서 많은 문제들을 가져올 것이라 예상된다.
// SQLite 추천
안드로이드에서 DB를 사용해야 한다면 sqlite(http://www.sqlite.org/)가 최선의 선택이 될 것이다. 위에서 설치한 python for android에서 이미 sqlite3를 지원하며 안드로이드 플랫폼에 sqlite가 기본 탑재된 데이터베이스이기 때문이다. 일반적인 RDBMS에 비해 대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다. 또 API는 단순히 라이브러리를 호출하는 것만 있으며, 데이터를 저장하는 데 하나의 파일만을 사용하는 것이 특징이다. 버전 3.3.8에서는 풀텍스트 검색 기능을 가진 FTS1 모듈이 지원된다. 컬럼을 삭제하거나 변경하는 것 등이 제한된다.
다만 본격 트랜잭션이 필요하거나 데이터의 안정성등이 중요한 이슈라면 sqlite를 사용하는데 신중을 기해야 할 것이다.
■본격적인 1인 1서버 - 안드로이드를 아예 우분투로 바꿔 보자
안드로이드는 폰을 위한 이상과 같이 다양한 제약이 있을 수 밖에 없다. 리눅스 등 범용 OS가 가지고 있는 보편성은 늘 부럽기 마련이다. 그렇다면 아예 폰에 우분투를 깔아 버리는 것도 방법이다. 그렇다면 기존에 PC와 서버에서 가능했던 모든 것, MySQL이니 Django니 쓸 수 있을 터이니 말이다.
안드로이드 폰에서 우분투를 사용하는 방법은 크게 두 가지가 있다. 한 가지는 안드로이드 폰에서 하드웨어만 사용 하고 안드로이드 없이 우분투 OS를 그대로 올리는 방법이 있고 다른 한가지는 안드로이드 OS는 그대로 둔 상태에서 우분투를 루프 디바이스(loop device) 형태로 하여 사용하는 방법이다. 우분투를 이미지 파일을 마운트하여 그 이미지 파일을 통으로 OS로 쓰는 것.
전자의 경우 커널 빌드 및 드라이버를 모두 수동으로 잡아야 하기 때문에 작업의 난이도도 높고 시간이 많이 걸리는 반면 후자의 경우 쉽고 간단하게 안드로이드 폰에서 우분투를 구동시킬 수 있어 많이 이용되는 방법이라고 볼 수 있다.
아래에서는 후자의 방법에 대해서 설명을 진행할텐데, 각자 작업을 진행하기 위한 참고할 수 있는 다양한 사이트 및 방법을 제공해 주는 것을 목표로 하고 있다. 우분투 설치의 기본 진행 과정은 AndroLinux.com 사이트에서 상세 사항을 배울 수 있다.
// 사전 작업
(1) 안드로이드 폰 준비
본 글에서는 Nexus S (GT-I9020 – Android ver 2.3.3)으로 진행하였다.
(2) PC(Window OS)에 작업 환경 설정
A. 각 모바일 폰 별 제조사에서 제공하는 Driver를 PC에 설치 한다.
(Driver 참고: http://developer.android.com/sdk/oem-usb.html#InstallingDriver)
폰의 Main Menu -> ‘Setting’ -> ‘Application’ -> ‘Development’에 진입하여 ‘USB debugging’을 체크한 후 USB로 PC와 연결하여 드라이버를 설정한다.
완료 후 PC의 ‘내 컴퓨터’에서 마우스 오른쪽 선택 -> ‘관리’ -> ‘장치 관리자’ 진입 시 상기와 같은 항목이 정상적으로 나타나면 된다. (폰에 따라 조금 다르게 나타날 수 있다.)
B. 안드로이드 폰에 쉘명령을 진행하기 위해 adb.exe 다운로드
http://developer.android.com/sdk/index.html 에서 Android SDK를 다운 -> 압축 해제 혹은 실행 파일을 통해 SDK Manager를 실행하여 Android SDK tools와 Android SDK Platform-tools를 다운받는다.(adb는 platform-tools안에 있다.)
* adb(Android Debug Bridge)는 안드로이드 폰을 다루기 위한 툴로 파일관리, 데이터베이스 관리 등을 할 수 있는 유틸리티다. 자세한 내용은 하기 링크를 참고 하면 된다.
(ADB 참고: http://developer.android.com/guide/developing/tools/adb.html)
C. A, B 동작 확인
시작 -> 보조프로그램 -> 명령프롬프트를 실행한 후 B에서 말한 adb가 있는 폴더로 경로를 변경한다. 이 상태에서 폰을 USB로 연결 하고 하기와 'adb shell'입력 시 # 이 나타나고 입력 받을 준비가 되면 정상적으로 인식이 된 것이다. (아래 그림 밑줄)
|
그러나 위 그림 윗줄처럼 에러가 발생할 경우 정상적으로 인식되지 않은 것이다. A에서 정상적으로 드라이버가 설치 되었는지 확인을 해야 한다. 위 그림 아랫줄처럼 정상적으로 adb가 동작하게 된다면 안드로이드 폰에서 우분투를 사용하기 위한 준비가 된 것이다. 그럼 차례로 진행을 해보도록 하겠다.
// 루팅(Rooting)
안드로이드 폰에서 우분투를 사용하기 위해서는 폰이 루팅 상태여야 한다. 루팅이란 리눅스를 기반으로 하는 안드로이드에서 최고 권한인 루트권한(super user)을 얻는 것을 말한다. 루팅은 잘못 할 경우 폰에 이상이 생겨 문제가 부팅이 되지 않는 등의 문제를 일으킬 수 있으며 이럴 경우 서비스센터를 통한 수리 시 불이익을 받을 수 있다.
루팅 진행 방법에 대해서는 본 글에서 커버 하는 부분이 아니므로 루팅 방법에 대해서는 명시하지 않도록 하겠다.
// 우분투의 구동
안드로이드 시스템에서 우분투의 구동은 RootStock을 이용하여 만든 우분투 이미지를 안드로이드의 파일시스템에 복사를 하고 chroot를 이용하여 해당 이미지를 오리지널 우분투 형태로 사용하게 된다. 작업에 필요한 파일은 http://downloadandroidrom.com에서 제공해 주고 있는 http://downloadandroidrom.com/file/AndroidUbuntu/ubuntu.zip를 사용할 수 있다.
(1) 이미지 복사
A. 상기 사이트에서 다운받은 Ubuntu.zip 파일의 압축을 푼다.
B. 압축을 풀린 'ubuntu'폴더를 안드로이드 폰의 SD card에 복사 한다. 복사는 폰의 SD card의 루트에 복사가 되어야 한다. 즉 루트에 'ubuntu'폴더가 보이고 그 안에 바로 6개의 파일들이 존재하는 형태 이다. (복사는 USB Mass Storage를 사용하면 된다.)
C. 상기 사이트에서 다운받은 ubuntu.img의 경우 작업을 해 본 결과 우분투로 부팅한 후에 그 상태에서 에서 사용할 수 있는 파일 시스템 공간이 제약적이어서 사용에 불편함이 있다. 더 큰 용량을 위해 rootstock을 이용하여 ubuntu.img를 만드는 방법은 우분투 구동에서 (4)를 참고 하시면 된다.
(2) Busybox 설치
A. Busybox는 adb 상에서 제한된 다양한 쉘 명령어를 사용할 수 있도록 하는 유틸리티이다. Busybox를 이용하면 유닉스에서 지원하는 많은 쉘명령어를 adb 쉘에서도 그대로 사용할 수 있다. Busybox는 안드로이드 apk를 통해 설치하는 방법, 바이너리를 받아 설치하는 방법, 코드를 컴파일 해서 사용하는 방법이 있으나 바이너리를 설치하는 방법으로 진행하였다. Busybox 파일은 하기 사이트에서 받고 설명대로 진행하면 된다. http://blog.naver.com/PostView.nhn?blogId=hsmnim&logNo=30112583717
B. Busybox를 설치 후 PATH를 설정하고 나면 이후 동작하는 쉘 명령어는 하기와 같이 몇몇 의미 없는 캐릭터가 나오는 것을 확인할 수 있다.
|
이는 ANSI color code로 색상을 나타내기 위한 코드이나 윈도우 터미널에서는 ANSI color code를 지원하지 않기 때문에 발생하는 현상이다. 기본 동작은 문제가 없으나 차후 MySQL등을 설치 시에 비밀번호 설정 등의 화면이 정상적으로 동작하지 않는다.
또한 보기에도 불편한 관계로 터미널에서 adb 쉘 명령어를 입력하는 대신에 adb를 지원하는 putty를 사용하면 정상적으로 화면이 나타나도록 사용할 수 있다.
adb 활성화 된 putty 다운로드 (https://github.com/sztupy/adbputty/downloads)
putty를 이용하여 adb 접근시 Host name: transport-usb , Connection type: Adb 로 지정한다.
|
(3) 우분투 띄우기
우분투 이미지부팅은 처음 다운받은 우분투 이미지에 함께 포함되어 있는 스크립트를 이용하면 쉽게 부팅을 할 수 있다. 해당 스크립트는 downloadandroidrom에서 제공해주는 스크립트로 해당 이미지를 loop device로 사용하기 위한 명령 및 각종 폴더 생성, 안드로이드 파일시스템에서 우분투를 구분해 사용하기 위한 chroot 설정 등이 포함되어 있다.
Putty로 접속 후 (2)에서 Busybox설치, PATH까지 잡아준 상황이라면 바로 우분투를 사용할 수 있게 된다. 쉘에서 'ubuntu' 폴더를 복사 한 /sdcard/ubuntu폴더로 이동 후 ubuntu.sh을 실행한다. ubuntu.sh은 ubuntu.img를 사용하기 위한 폴더 생성 및 'system' 폴더에 대한 권한 설정 등을 진행하게 된다.
|
그림 상단우측과 같이 PATH가 잡힌 상태에서 카피한 우분투폴더에 진입하여 Ubuntu.sh을 실행하게 되면 그림과 같이 안드로이드 OS에 손상을 가하지 않는 다는 메시지와 함께 다시 안드로이드 쉘화면으로 나타나게 된다. 여기서 bootubuntu 명령을 통해 우분투 쉘환경으로 진입할 수 있다.
위와 같이 나타나면 안드로이드 폰에서 우분투를 정상적으로 실행 시킨 것이다. 이제 쉘을 통해서 우분투를 사용하면 된다. 안드로이드 폰에서 와이파이를 통해 네트워크와 연결을 하게 되면 우분투에서도 네트워크를 사용할 수 있는 환경이 된다.
(4) ubuntu.img 생성
ubuntu.img는 안드로이드 폰에서 우분투를 사용하기 위한 이미지 파일이다. 해당 파일은 위에서 설명한 바와 같이 http://downloadandroidrom.com/file/AndroidUbuntu/ubuntu.zip 에서 다운을 받을 수 있지만 사용해 본 결과 해당 파일로 사용을 할 경우 안드로이드상의 우분투에서 사용할 수 있는 파일 시스템 공간이 제한적이어서 다양한 패키지 설치에 제한이 있다. 따라서 필진은 우분투가 설치된 PC로부터 별도의 ubuntu.img를 만들어 사용하였다. ubuntu.img 생성은 rootstock명령을 이용하여 생성할 수 있다. 이미지 생성시 --seed option을 이용하여 다양한 패키지를 포함한 이미지를 만들 수 있지만 아무런 패키지없이 생성 후 아래 방법으로 우분투 상에서 다운로드 받는 것을 추천한다.
생성 방법은 https://wiki.ubuntu.com/ARM/RootStock와 https://wiki.ubuntu.com/ARM/RootfsFromScratch를 참고 하면 된다. 간략하게 우분투가 설치된 PC에서 하기와 같이 rootstock을 실행한다.
|
만약 rootstock이 동작하지 않을 경우 apt-get install rootstock을 이용하여 설치하시면 된다. 대략 수십 분이 걸리며 완료 시 armel-rootfs-2012~~~.tgz라는 파일이 생성되는데 이를 ubuntu.img로 압축을 푸는 형태이다.
root@ubuntu:~# dd if=/dev/zero of=ubuntu.img bs=1MB count=0 seek=4096
root@ubuntu:~# mke2fs -F ubuntu.img
root@ubuntu:~# mount -o loop ubuntu.img /mnt
root@ubuntu:~# tar -C /mnt -zxf armel-rootfs-2012~~~.tgz
root@ubuntu:~# umount /mnt
dd명령 수행 시 seek값을 조절하여 이미지의 크리를 변경할 수 있다. 4096으로 할 경우 4기가 Ubuntu.img가 생성되며 1024는 1기가의 이미지가 생성된다.
// 각종 패키지 및 어플리케이션 설치
우분투가 구동이 되었으면 이제 각종 패키지 및 어플리케이션(wordpress)을 설치해 볼 것이다.
(1) 각종 패키지설치
A. 우분투로 실행 후 각종 패키지 설치 및 업그레이드시 기본 리파지토리로 사용시 동작이 잘 안되는 경우가 있다. /etc/apt/sources.list에 리파지토리를 하기 주소로 변경 후 사용하는 것이 좋다.
deb http://old-releases.ubuntu.com/ubuntu/ karmic main universe
B. 폰과 PC를 항상 연결해 두는 것이 아니기 때문에 필요시 다른 장치에서 접속할 수 있도록 openssh-server를 설치 하면 다른 장치에서 ssh를 통해 접속하여 사용할 수 있는 환경을 갖추게 된다. 아이디와 비밀번호를 사용하여 접속을 하기 원할 경우 루트계정에 대해 비밀번호를 설정하면 된다.
root@localhost:/# apt-get update
root@localhost:/# apt-get install openssh-server
설치가 완료 되면 다른 장치에서 ssh 접속 유틸리티 등을 이용하여 루트 아이디와 비밀번호를 통해 접속을 할 수 있다. 안드로이드 폰에서 'connectBot'이라는 어플리케이션등을 사용할 수 있다.
C. 다양한 패키지들도 우분투에서 사용하는 것과 동일한 방식으로 설치가 가능하다.
(2) 워드프레스 설치
기본 우분투 사용환경이 되었으니 오픈 소스기반의 설치용 블로그인 워드프레스를 설치해 보도록 하겠다.
A. 워드프레스를 위해서는 LAMP (Linux-Apache-MySQL-PHP)와 php-gd가 필요하다. 아래와 같이 먼저 설치를 해야 한다.
root@localhost:/# sudo tasksel install lamp-server
root@localhost:/# sudo aptitude install php5-gd phpmyadmin
Lamp server설치 시 설치 실패를 하는 경우가 있는데 이는 MySQL에서 bind-address에 대해 네트워크 소켓을 사용하지 못해서 발생하는 것이다. /etc/mysql/my.conf에서 bind-address를 주석처리 하고 skip-networking을 추가하면 된다.
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
skip-networking
상기와 같이 수정 후 다시 설치를 하면 정상적으로 설치가 된다. USB와 연결하여 작을 통해 작업을 할 경우 설치 중간에 비밀번호 설정하는 화면이 나오는데 이때 윈도우 터미널을 통해 작업을 할 경우 ANSI color code로 인하여 설정이 안되니 위에서 언급한 adb 활성화된 putty를 사용하여 작업해야 한다. SSH 서버에 접속해서 진행 할 경우에는 별 문제는 없다.
B. 설치된 apache2, ssh, MySQL등의 패키지는 폰이 재부팅될 경우 자동으로 시작하지 않는다. 현재까지 확인 결과 이는 loop device로 하여 설정 시 runlevel이 설정되지 않으면서 각 runlevel별 init.rc가 수행되지 않으면서 발생하는 것으로 보인다. 폰 재부팅 시 우분투를 실행시키기 위해서는 bootubuntu라는 명령을 통해 루트계정으로 로그인 되면서 시작이 되기 때문에 다른 방법으로 /root/.bashrc file에 부팅 시 필요한 패키지를 시작하도록 하면 된다.
필진은 /root/.bashrc에 하기와 같이 추가 하였다.
/etc/init.d/ssh start
/etc/init.d/mysql start
/etc/init.d/apache2 start
C. 워드프레스를 설치한다. 과정은 아래와 같다.
1. 워드프레스 down → 압축 해제 → www하위에 위치
상기와 같이 아래 명령을 순차적으로 사용하면 된다.
root@localhost:~# wget http://wordpress.org/latest.tar.gz
root@localhost:~# sudo mv latest.tar.gz /var/www
root@localhost:/var/www# cd /var/www
root@localhost:/var/www# tar -zxf latest.tar.gz
root@localhost:/var/www# rm -f latest.tar.gz
만약 두번째 wget명령을 찾을 수 없으면 apt-get install wget 을 통해 설치하면 된다.
|
2. 워드프레스사용위한 MySQL 데이터 베이스 생성
데이터베이스 생성은 쉘 명령어를 이용할 수도 있고 웹 브라우저를 통해 phpadmin을 사용할 수도 있지만 여기서는 쉘을 사용하여 생성하도록 하겠다. 데이터 베이스 이름: wordpress, user 이름: worduser, 비밀번호: 1234로 가정하고 생성하겠다. 아래 볼드체로 된 이름 및 비밀번호는 그에 맞게 각각 설정해 주시면 된다.
root@localhost:/var/www# mysql -u root -p
상기 명령을 이용하여 데이터베이스 설정으로 진입한다. 비밀번호는 MySQL설치 시 설정한 비밀번호다.
|
3. 워드프레스가 MySQL사용 위한 설정
이제 폰에서 워드프레스를 MySQL과 연동시켜야 한다. 쉘 명령어 창에서 파일을 수정하여 사용할 수도 있지만 여기서는 웹 브라우져를 통해서 진행하도록 하겠다. 폰에서 브라우져를 띄워 주소창에 http://localhost/wordpress로 접속 한다.
|
최초 접속 시 그림 왼쪽처럼 설정이 필요하다는 화면이 나타난다. 어렵지 않게 순차적으로 진행할 수 있다. 'Let’s Go'로 다음 화면으로 진입한다. 오른쪽과 같이 데이터 베이스 이름, 사용자이름, 비밀번호를 입력하는 창에 2번에서 설정한 데이터 베이스 이름, 사용자 이름, 비밀번호를 입력한 후 'Submit'을 선택한다.
'Submit'을 선택했을 때 정상적으로 MySQL에 설정한 데이터 베이스와 일치한다면 왼쪽 화면과 같이 나타나지만 MySQL에 설정된 데이터 베이스가 없다거나 잘못 입력했을 경우에는 오른쪽과 같이 찾을 수 없다는 에러가 나타난다. 에러가 나타날 경우 다시 어느 부분에 문제가 생겼는지 위 경로를 따라서 수정해야 한다.(김국현 20)
정상적으로 진행 시 'Run the install'을 선택 후 워드프레스에 사용자 이름, 비밀번호, 이메일 등을 설정 후 'Install Wordpress'를 선택하여 완료한다. 생성한 계정으로 로그인을 한다.
정상적으로 워드프레스가 설정 되었다. 글을 하나 등록 해보겠다. 왼쪽에 홈 아이콘 아래 압정 모양의 아이콘에서 'Add New Post'를 선택해 제목과 글을 입력 후 오른쪽에 'Publish'를 선택한다. 아래 그림처럼http://localhost/wordpress를 입력할 경우 등록한 글이 정상적으로 보여지는 것을 확인할 수 있다.
|
// 제한 및 추가 논의 사항
지금까지 안드로이드 폰에 우분투를 올린 후 어플리케이션 구동까지 확인을 해보았다. 기본적으로 PC와 같이 동작은 가능한 것을 확인하였으나 몇 가지 한계점 및 추가적으로 고려가 필요한 부분은 여전히 남아 있다. 와이파이가 아무리 속도가 빨라졌다고 하지만 안정성 면에서는 유선 인터넷에 비해 아직 부족한 것이 사실 이다.
추가적으로 저장공간에 대한 어려움도 있을 것이다. 현재 안드로이드에 우분투를 이미지 형태로 사용하기 때문에 처음 만든 우분투 이미지의 용량을 모두 사용했을 경우 확장에 어려움이 있다. 추가 디바이스를 쉽게 추가할 수 있는 분산 파일 시스템을 사용하는 경우라면 크게 문제가 안되겠지만 그렇지 않을 경우 확장 시 많은 작업이 수반 될 것으로 보인다.
■집에서 영업장에서 직접 돌려 보자
아마 여러분의 인터넷은 공유기를 통해 다른 식구들과 혹은 동료들과 나누어 쓰고 있을 것이다. 그리고 여러분의 ‘약정 끝난 스마트폰’은 그 공유기에 와이파이 접속이 되어 있을 것이다. 이 스마트폰 안의 웹서버에 전세계인은 어떻게 접속할 수 있을까?
먼저 외부에서 접근 가능하도록 네트워크를 설정해야 한다.
보통 하나의 세대 혹은 사무실에 하나의 공인 IP가 할당되고, 192.168.0.1로 보통 시작하는 사설 IP들이 할당이 되어 있을 텐데, 밖으로부터 들어 오는 요청을 이 홈서버로 배정시키기 위한 설정이 필요하다. 이 설정은 공유기마다 천차만별 설정이 다르기는 하지만 모든 공유기마다 존재한다. 가상 서버 혹은 포트 포워딩의 설정화면에서 조작할 수 있는데, 웹서버 용으로 80포트 등 대표적인 포트를 스마트폰 웹서버의 IP 주소로 매칭시키는 것이다.
|
그 다음으로는 도메인 주소를 할당할 필요가 있다. 매번 바뀌는 할당 IP를 입력하는 일은 사실상 불가능하기에 외우기 쉬운 도메인 주소를 연결해야 한다. 이를 DDNS, 즉 Dynamic DNS라 부른다. Dyndns.org 가 가장 유명한 서비스이지만, .com과 같은 일반 도메인명을 연결 가능한 DnsEver.com 혹은 Wowip.co.kr 등의 서비스를 활용할 수도 있다.
|
이제 외부에서 여러분의ID.dydns.org 만 입력해도 여러분의 퍼스널 클라우드로 연결이 가능해진다.
■가장 가까이에 있는 서버, 스마트폰
스마트폰의 성장세는 실로 무섭다. 이대로라면 전국민이 한 대씩 갖게 될 기세다. 그 덕에 과거 어느 때보다 인터넷은 우리 삶에 덩달아 밀접해졌다. 스마트폰은 우리 현재 삶의 여러 면을 윤택하게 했다. 그러나 약간의 노력만으로 미래를 준비하기 위한 작지만 소중한 플랫폼이자 인프라조차 될지도 모르는 일이다.
지금의 우리가 작업해 보고 있는 이 스마트폰은 여전히 미약하지만, 해가 갈수록 더 무시무시한 스펙의 폰들이 출시되고 또 우리는 더 빨리 싫증을 낼 것이다. 그러한 폰 들이 서랍에서 잠만 자지 않고, 우리의 희망을 테스트해 보기에 충분한 역할을 해 낼 수 있다면, 그러한 가상의 개러지(garage) 역할을 해 준다면 좋겠다는 사소한 희망에서 이 프로젝트는 시작되었다.
지금은 한낱 재미있는 테스트로 보일지 모르나, 스마트폰이 디지털의 소비 도구가 아닌 디지털의 생산 도구로 세상을 향해 정보를 발신할 수 있는 서버로서의 가능성이 충분히 있음은 적어도 증명했다고 할 수 있을 것이다.
편집자주 : <사회적 잉여 IT를 생각하는 모임>은 안드로이드에 장고를 설치하는 데 실패했지만, 지난달말 이에 영감을 받은 프리랜서 개발자 이수겸 씨가 장고1.4 버전을 설치했다며 그 과정을 자신의 블로그에 게재(http://kenial.tistory.com/877)했다. 이 글과 마찬가지로 독자가 스크린샷과 설명을 따라하면서 결과에 다가갈 수 있을 것으로 보인다. 이밖에도 지난 2개월반동안 '재밌는 발상이다', '유익한 영감을 얻었다', '흥미진진하다', '기회 봐서 시도해볼만하다' 등 긍정적인 피드백이 다수 모였다. (2012. 8. 2. 추가)
출처 : http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=001&oid=092&aid=0002001260&viewType=pc
갤럭시 AI지우개로 사진 빛반사 지우기 (0) | 2022.11.02 |
---|---|
USB 테더링 사용시 끊기는 현상 해결방법 (12) | 2016.08.02 |
스마트폰으로 ssh, telnet 접속하기 (ConnectBot) (2) | 2014.01.26 |