파이썬(Python)에서 XML을 DB(데이터베이스)처럼 이용


간단한 작업을 해야 할 경우에 덩치가 큰 DB를 이용하기엔 부담이 크다. 이럴때 XML을 이용하여 작업을 하곤 하는데 항상 할때마다 잊게되고 또다시 검색을 하는게 번거로워 기록해 논다.

XML파일은 이런 형태로 저장한다.

<?xml version="1.0" encoding="UTF-8"?>
<medias>
    <media>
        <filename>test1.png</filename>
        <filetype>image</filetype>
        <runtime>10</runtime>
    </media>
    <media>
        <filename>test1.mp4</filename>
        <filetype>video</filetype>
        <runtime>693</runtime>
    </media>
    <media>
        <filename>test2.mp4</filename>
        <filetype>video</filetype>
        <runtime>726</runtime>
</media>
</medias>

이런 형태로 DB처럼 저장을 해서 파이썬에서 읽어 처리를 하면 되는데 여러 곳에서 추천을 하기도 하고 직접 사용해보니 편리했던 패키지(라이브러리)는 ElementTree 였다.

다른 방식의 사용법들은 검색해가며 찾아보면 될터이고 내 경우엔 목적이 있으니 딱 그 정도까지만 처리를 한다.

예전엔 프로그램을 만들었다는 느낌이 강했는데 요즘은 짜깁기한다는 느낌이 더 강하다. 이렇게 하는게 분명 편리하고 맞는것인데도 왠지 꺼리낌한 기분이 드는걸 보면 나도 확실히 요즘 사람은 아닌듯하다.

기껏해야 백여개의 자료를 처리해야 하는곳에 DB를 연결해 사용했던 시절엔 왜 그리 DB에 집착을 했던건지...

물론 아주 오래전에는 PC의 저장장치 속도가 워낙 느려서 이런식의 처리는 엄두도 못내긴 했지만...

파이썬(Python) glob


참고 : https://docs.python.org/2/library/glob.html

import glob

glob모듈은 유닉스쉘에서 사용하는 지정한 패턴으로 pathname 디렉토리내 파일들의 목록을 찾아낸다.

glob.glob(pathname)

import glob

glob.glob('./[0-9].*')
glob.glob('*')
glob.glob('*.png')

이런식으로 응용

import glob

files = glob.glob('*.png')
for x in files:
    print x

많이 이용하게 될듯하여 정리하여 기록한다.

우분투서버에 Pydio(Ajaxplorer)설치하기


몇년째 파일서버로 Pydio를 이용하고 있다. Ajaxplorer시절부터 사용했으니 꽤 오래 써오고 있다. 이번에 서버를 재 세팅하면서 Debian에서 Ubuntu로 바꿔서 이용해보고자 하여 설치하는 과정을 기록해 놓으려 한다.



1. 우분투 서버 설치


서버설치야 이미지를 다운받아서 키보드 설정, 지역설정등을 해 가며 하면 된다. 패키지 선택부분에서 나는 SSH, LAMP, SAMBA세가지를 선택해서 설치를 했다. 설치가 끝나고 나면 IP를 고정해줘야 한다. 외부에서도 이용해야 하기때문이다. 외부에서의 이용은 공유기의 DDNS를 이용해서 하고 있다.

/etc/network/interfaces 파일을 수정한다.

$ sudo nano /etc/network/interfaces
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp

을 아래와 같이 바꾼다.

auto lo eth0
iface lo inet loopback
iface eth0 inet static
    address 192.168.0.177
    netmask 255.255.255.0
    gateway 192.168.0.1

dns-nameservers 168.126.63.1 168.126.63.2 8.8.8.8

네트워크를 재시작 하거나 재부팅.

$ sudo /etc/init.d/networking restart

서버에서는 여기까지 작업을 해 주면 SSH로 putty등을 이용해서 외부(데스크탑PC)에서 나머지 작업이 가능하다. 변경된 ip확인은

$ ifconfig

설치시 LAMP를 선택했기 때문에 브라우저를 이용 ip주소로 접속을 하면 apache2세팅에 관한 화면을 볼수있다.


업데이트를 해주고 기본 서버세팅은 마무리.

$ sudo apt-get update
$ sudo apt-get upgrade

2. Pydio 설치


apt-get으로 설치를 하기 위해 세팅을 해 준다. 

$ sudo nano /etc/apt/sources.list

마지막 부분에 아래 내용을 추가해 준다. 

deb http://dl.ajaxplorer.info/repos/apt stable main
    deb-src http://dl.ajaxplorer.info/repos/apt stable main

퍼블릭키를 설치해주고 

$ wget -O - http://dl.ajaxplorer.info/repos/charles@ajaxplorer.info.gpg.key | sudo apt-key add -

설치를 진행한다.

$ sudo apt-get update
$ sudo apt-get install pydio

config파일을 복사해주고 나머지 세팅을 한다.

$ sudo cp /usr/share/doc/pydio/apache2.sample.conf /etc/apache2/sites-available/pydio.conf
$ sudo a2ensite pydio
$ sudo a2enmod rewrite
$ php5enmod mcrypt

데이타 path를 기록가능하게 바꿔준다.

$ sudo chown -R www-data:www-data /usr/share/pydio/data

3. Pydio 설정



브라우저에서 http://ip주소/pydio 로 접속한다. Admin 계정을 설정해준후 Global options에서 인코딩을 한글로 설정해준다. 현재 서버의 인코딩값은

$ echo $LANG

으로 알수있다. 내 경우엔 ko_KR.UTF-8

다음으로 저장장치 설정을 해야 하는데 NoDB를 이용할수도 있으나 MySQL등으로 설정해주는게 추후 업그레이드등에서 용이하다고 한다. DB를 이용한다고 해서 내가 올리는 파일을 저장하는게 아니고 사용자 정보나 파라메터등의 저장에 이용을 한다.



$ service mysql status
$ sudo mysql -u root -p

mysql>create database pydio;
mysql>create user pydio@localhost identified by 'mysqlpassword';
mysql>grant all privileges on pydio.* to pydio@localhost identified by 'mysqlpassword' with grant option;
mysql>exit

mysql 세팅을 해주고 Try connecting to the database 버튼을 눌러 정상접속이 되는지를 확인한다.

사용자 세팅을 한 후 Install Pydio Now 버튼을 누른다.

세팅이 끝나고 나면 .htaccess 파일에 대한 설명이 나온다.



이후 http://IP/pydio로 접속을 하면 초기 화면이 반겨준다.



3.기존 세팅 추가


fdisk -l로 기존 하드디스크를 찾아본 후 마운트 할 디렉토리를 만든 후 fstab에 기존 하드디스크를 지정한다.

fdisk -l
$ sudo nano /etc/fstab
/dev/sda    /var/www/files/data1    ....

마운트하는 방법은 검색을 통해서 알아보면 된다.

pydio에 접속한 후 유저 및 저장소 세팅을 해 준다.

4.접속주소 초기설정


여기까지 따라오면 http://IP주소 로 접속을 할 경우 apache2 소개화면이 뜨고 http://IP주소/pydio 로 접속을 해야 pydio로 접속이 된다. 이미 사용자들이 안드로이드 프로그램등에서 처음 주소로 세팅이 되어 있으므로 이걸 조정해주어야 한다. 즉 루트디렉토리를 변경한다.

$ sudo nano /etc/apache2/apache2.conf

아래쪽으로 내려서

<Directory /var/www/>

이 부분을

<Directory /usr/share/pydio/>

로 바꿔주고

$ sudo nano /etc/apache2/sites-available/000-default.conf

에서

DocumentRoot /var/www/html

부분을

DocumentRoot /usr/share/pydio

로 바꿔준 후

$ sudo service apache2 restart

아파치 서버를 재시작 해 주면 이제 http://IP주소 로 Pydio가 바로 나온다.

어우... 분명 기억상으로 파일 업로드 크기 같은거 더 세팅해야 할게 있는거 같은데... 추후 기억나고 필요할때 다시 기록하기로...

아무리 개인이 쓰는 파일서버라고해도 무너지면 데미지가 크다.

라즈베리파이(RASBIAN, Debain) 키보드 설정 변경


라즈베리파이 세팅을 끝내놓고 콘솔상에서 작업을 하다보니 특수키를 입력시에 타이핑한 글자가 아닌 다른 글자가 나와서 잠깐 당황했다. "키를 누르는데 #이 나타나고...

분명 처음 세팅시 키보드 지정을 제대로 한것 같은데...

콘솔상에서는 다시 세팅을 해야 하는것 같다.

$ sudo nano /etc/default/keyboard

로 들어가서 gb로 되어있는것을 ko로 바꾸고 재부팅하면 된다.

혹시나 나머지 세팅도 다시 바꿔야 하나 하고 확인을 해보니 다른 부분들은 처음 세팅한 값이 그대로 있는듯 하다. 세팅을 바꿔야 할 필요가 있을때는

$ sudo dpkg-reconfigure

이것과 비슷하게 locale에 관련된 문제가 발생하는 경우가 있는데 추후에 발견하는대로 추가해서 적어놔야겠다.

RasberryPi에서 Go언어 사용하기


Go언어(#golang, google)를 라즈베리파이에서 이용해 보기 위해 검색을 해 보았지만 아직까지 ARM에서 동작하는 오피셜은 없는듯하다(2015년 11월 16일 현재 / 초기버전인 1.0대는 있는듯하기도 하고...). 되도록이면 최근버전을 설치해서 이용해 보고 싶어서 검색을 해보니 다음 사이트들이 나왔다.

PC/Googling

http://dave.cheney.net/2012/09/25/installing-go-on-the-raspberry-pi http://dave.cheney.net/2015/10/16/bootstrapping-go-1-5-on-non-intel-platforms

확실히 아직까지 Go언어의 자료를 찾는건 쉽지는 않다. 소스를 컴파일해서 사용하라고 하는데 컴파일 시간이 구버전의 파이에서는 5시간 정도 걸린다고 하고.... 그러던중 트위터 검색을 통해 찾아낸게 큰 도움이 될듯하다.

Twitter(search golang+raspberrypi) http://denis.papathanasiou.org/posts/2015.08.30.post.html

이 포스트를 참고해서 해보자.

unofficial tarball을 다운(127MB정도이다)받고 아래처럼 작업을 해 준다.

$ sudo mv go.1.5.tar.bz2 /usr/local
$ sudo tar jxf go.1.5.tar.bz2
$ cd /usr/local
$ sudo chown -R root:staff /usr/local/go
$ sudo rm go.1.5.tar.bz2

$ /usr/local/bin/go/bin/go version



제대로 실행이 된다. Go버전정보가 나오면 된다. 위 포스트 작성자분께 고마워해야 할듯하다.

이제 환경을 세팅해보자. 우선 PATH를 지정해주고(시스템 패스에 넣어두려한다)

$ sudo nano /etc/profile

export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go

테스트를 위해 GOPATH를 설정, PATH확인은 env

$ export GOPATH=$HOME/work
$ env

(물론 계속 작업을 이어나간다면 이것도 profile에 넣어두면 좋을테고...)

이제 잘 작동하는지 테스트를 위해

work 디렉토리 하부에 src/github.com/user/hello 디렉토리를 생성하고(user부분은 github를 이용한다면 github에 등록된 아이디를 넣으면 된다)

hello 디렉토리 안에 테스트용 코드를 작성하자.

$ nano src/github.com/user/hello/hello.go

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

이제 컴파일을 하고 실행을 해보면 결과가 멋지게 나온다.

$ go install github.com/usr/hello
$ $GOPATH/bin/hello
hello, world



go 코드를 작성하기 위한 디렉토리의 규칙이 있는데 이건 https://golang.org/doc/code.html 링크를 참고하자.

Linux(RASBIAN, Debian) 콘솔상에서 미디어 재생하기


한 일년전쯤부터 개인적으로 진행하던 작은 프로젝트가 있다. 작고 안정적으로 미디어를 재생하기 위해 하던것인데 그 기록을 남기려고 한다.

리눅스 콘솔을 사용하여 이것저것을 하다보면 부팅중에 반짝하고는 화면 크기에 맞춰 글자크기가 달라지는게 보일때가 있다. 이걸 보면서 아... 예전 도스에서 한글을 처리하던것처럼 일정 시점에서 모드를 변환해서 처리하는구나라고 막연히 생각만 하다가 우연히 인터넷을 검색중에 리눅스 콘솔상에서 MAME를 실행하는것을 보고 난 후에 이걸 이용해보면 좋겠다는 생각이 들어 자료를 찾아보고 간단히 응용해서 사용하던 부분이 있었다.

리눅스의 fb(frame buffer)기능을 이용해서 처리하는것인데 예전 도스(DOS)시절에 작업하던 생각도 나고 무척 재미있었다.

내가 하는작업에 맞춰하는 기록이므로 라즈베리파이의 RASBIAN을 기준으로 적는다.

1. 그림파일 출력하기


fbi를 이용하면 된다. fbi는 linux framebuffer imageviewer로 콘솔상에서 이미지를 보여주는 프로그램이다.

$ sudo apt-get install fbi
$ fbi

로 설치를 하고 사용은 간단하다.

$ fbi imagefile.jpg



위 그림파일은 무료이미지로 https://pixabay.com/ko/에서 받아왔다.

그림파일이 보여지고 하단에 파일에 대한 설명이 나온다. 그림파일이 화면보다 크다면 화살표를 이용하여 위치를 옮겨가며 보는것도 가능하다. 하단에 나타나는 정보가 때론 보여지지 않는것이 필요할 경우도 있다. 이럴때는 -noverbose 옵션을 넣어주면 된다.

$ fbi -noverbose imagefile.jpg



하단에 정보가 보이지 않고 깔끔하게 보여진다. 사실 이 이미지는 좀더 큰 이미지 인데 현재 모니터 해상도가 전체 그림을 다 보여주질 못하고 있다. 화면에 맞추려면 -a(autozoom) 옵션을 넣어주면 된다.

$ fbi -a -noverbose imagefile.jpg



이 패키지의 자세한 사용법은 옵션없이 fbi를 실행하면 된다.

2. 화면 캡쳐(Screenshot)하기


GUI환경에서야 기본지원되는 경우도 있고 다양한 프로그램들이 존재하니 그걸 이용하면 될테고 콘솔상에서는 어떤 프로그램들이 있을까 하고 찾아보니 여러가지가 있지만 어짜피 fb(framebuffer)기능을 이용하고 있으니 그 방식의 프로그램을 이용하는게 있지 않을까 해서 찾아보니 있다.

fbgrab을 이용하자. framebuffer device에서 screenshot을 해주는 프로그램이다. 다양한 옵션들은 fbgrab을 이용해서 보면 된다.

$ sudo apt-get install fbgrab
$ fbgrab

설치도중 fbcat을 이용을 권유(?)하는듯한 메시지가 나오는데 이건 추후에 알아보기로 하고...

사용법은 간단하다.

$ fbgrab test1.png

현재 콘솔화면이 캡쳐되서 저장된다.



다른 프로그램의 모습들을 캡쳐하려면 딜레이를 줘야 할테고 그 프로그램을 실행하기 위해 캡쳐프로그램은 백그라운드로 실행을 하면 된다.

$ fbgrab -s 10 test2.png &

3. 동영상 재생하기


콘솔상에서 동영상을 재생하기 위해서는 mplayer나 omxplayer를 이용하면 된다. 라즈베리파이의 RASBIAN에는 omxplayer가 미리 설치되어서 공급된다.

재생또한 간단하다.

$ omxplayer movie1.mp4

코덱이 필요한 경우도 있겠지만 왠만한 영상들은 바로 재생이 된다. 라즈베리파이1에서도 풀HD동영상(1920x1080)을 문제없이 재생하는것을 볼수있다.

영상이 화면에 꽉 차지 않는경우 상하단에 콘솔메시지들이 보여진다. 이걸 해결하기 위해서는 -b (blank)옵션을 주면 된다.

$ omxplayer -b movie1.mp4

4. 콘솔에서 한글보기


리눅스 설치시 지역을 한국으로 세팅하고나면 콘솔상에서 한글이 깨져보인다. (물론 ssh를 이용해 putty등에서 접속을 해서 보면 제대로 보인다)



여러가지 방법들이 있지만 간단한 방법으로는 fbterm을 이용하는것이다. 계속 나오는 형태라 예상하듯 framebuffer based terminal이다.

폰트를 설치하고 fbterm을 설치한 후 fbterm 명령을 준 후 작업을 하면 된다.



$ sudo apt-get install fonts-nanum
$ sudo apt-get install fbterm
$ fbterm

추후에 콘솔에서 사용하는 여러 패키지들을 찾아보고 이용해봐야겠다.

Github Gist를 이용하여 글에 소스코드(Snippet) 넣기


블로그 글들을 좀더 가독성 높게 작성하고 싶어 방법을 찾다보니 여러 블로그들에서 소스코드가 보기 좋게 보여진곳이 있어 그 방법을 적용하고 싶어졌다.

크게 두가지 정도의 방법이 있는듯 했는데 SyntaxHighlighter는 내가 사용하는 환경에서는 적절하게 응용하기가 어려운듯하여 Github의 Gist(http://gist.github.com)를 이용해보려한다. 일단은 Github에 가입을 해야 할텐데 필요에 의해 이미 사용하고 있는 서비스니 연동이 되겠지 싶어 들어가보니 작성화면이 바로 나타난다. (가입을 안해도 사용은 가능한듯 했다. 하지만 수정이나 삭제가 안된다고...)



워낙 심플해서 설명이 따로 필요할까 싶을 정도다.



간단한 소스코드를 하나 작성해 보고

Gist를 생성해야 할텐데 하단 버튼이 두개다. 마우스를 올려 설명을 읽어보면 secret gist는 검색엔진에 노출을 시키지 않고 이용하고자 할때 사용하는걸로 보인다. 이 내용을 검색엔진에 노출까지 시킬 필요는 없으니 secret으로...



이후 화면에서 오른쪽부분의 Embed URL을 복사해서 블로그의 HTML편집모드에서 적절한 부분에 붙여넣으면 된다.

쉽고, 편하다. 이런 정도의 서비스를 무료로 사용해도 되나 싶을 정도로... (물론 Github의 몇몇 서비스들은 무료가 아니다)

이제 틈나는대로 이전에 올린 글들의 소스코드부분들도 바꿔놔야겠다.

라즈베리파이 v1.2에 Jessie 설치


라즈베리파이를 이용한 작업을 몇개 진행하고 있었는데 최근에 Jessie가 올라왔다고 하여 설치 시험을 해보고자 한다. 이전엔 RASBIAN WHEEZY로 작업을 했는데 그 작업에 맞춰 테스트를 해야 하기에 라즈베리파이2를 이용하지 않고 예전 버전으로 테스트를 해야한다.

1. 다운로드 및 이미지 기록

http://www.raspberrypi.org 에서 RASBIAN JESSIE를 다운로드 후 압축을 풀어 준비하고

SD카드를 기록하기 위해 PC에 연결하고

ImageWriter(라즈베리파이 사이트에서 권장하는)를 다운로드, 설치하여



관리자권한으로 실행한 후



폴더모양의 버튼을 눌러 이미지를 지정하고 SD카드가 연결된 드라이브를 지정하고 Write버튼을 눌러 기록시작



2. SD카드 장착 후 세팅

어라... 콘솔화면을 보질 못했다. 바로 데스크탑화면을 띄워버린다. 예전에도 그랬나? 이전 버전은 콘솔터미널상에서 세팅을 해 주어야 했던거 같은데...

크게 기대하진 않았지만 혹시나해서 끼워놓은 무선랜카드(IPTIME N150UA)를 자동으로 잡아내진 못했다. (유선랜은 연결하지 않은 상태로 시동을 했다)

일단 유선랜을 연결하여 재부팅 한 후 update 및 upgrade를 한다.

$ sudo apt-get update
$ sudo apt-get upgrade

유선랜을 연결한 상태에서는 업그레이드를 하기 전에 무선랜을 잡아내는것을 확인했다. 아마도 부팅시 드라이버를 받아오는듯 하다. 업그레이드까지 마치고 무선랜환경에서 세팅을 마저 해보자.

보통 이 정도에서 다른분들은 한글세팅을 먼저하는데 내 작업에는 굳이 한글이 필요하지 않아 다른 부분들을 먼저 살펴봐야겠다.

SSH연결은 다른 세팅을 할 필요도 없이 바로 된다. (putty를 이용해 접속한 화면이다. lsusb로 확인해보면 무선랜카드가 잡힌게 보인다. ip를 보고 싶을땐 ifconfig)



기록을 남기고 싶어 작성하는 포스트이기때문에 스크린샷이 필요하다. 터미널로만 작업할때는 putty를 이용해서 접속하여 윈도우상에서 캡쳐를 하면 되지만 이왕 데스크탑이 보여진 상황이니 화면캡쳐를 받아보고 싶어졌다.

여기저기 검색을 해보니 scrot이란 프로그램이 간단하면서 편리하게 사용할 수 있을듯 하니 이걸 이용해보자.

$ sudo apt-get install scrot



허... 이미 설치가 되어있다고 한다. 보급을 하는 입장에서야 사람들에게 많이 소개가 되어야 할테니 미리 포함시켜 놓은것일까? 어쨌건 사용해보자.

$ scrot -s

명령을 터미널에서 준 후 마우스를 클릭하면 클릭한 윈도우가 터미널상의 현재 폴더에 타임스탬프형식의 이름으로 저장된다. 메뉴부를 클릭했더니 그 부분만 저장이 되었다.



메뉴의 세부 부분을 샷을 뜨고 싶어서 매뉴얼을 보니 -d옵션을 이용하면 일정 시간후에 전체화면 캡쳐가 가능했다.

$ scrot -d5 (5초 후 전체화면 캡쳐)



wheezy에서는 설치시에 세팅하던 부분인데 데스크탑에서는 위 스크린샷 부분의 메뉴를 선택하면 파이 설정을 계속할 수 있다.





저장용량을 확인해보면 딱 설치에 필요한 부분만 사용하고 나머지 부분이 나타나질 않는다.

$ df -h



위 설정 화면의 Expand Filesystem 버튼을 눌러 나머지 용량을 활성화해주자.



재부팅후에 나머지 용량이 보인다고 한다. 재부팅을 해서 확인해보자.



나머지 용량(16GB SD카드)이 확보된것이 보인다.

설정화면을 찬찬히 보니 콘솔모드로 부팅하는 옵션이 보이고 인터페이스부분은 내게는 크게 만질 필요가 없고 퍼포먼스에 오버클럭 옵션(내 작업상 안정성이 더 중요해서 이것도 큰 필요는 없다), 지역화 설정이 보인다. 지역 설정은 해줘야겠지. 시간동기화등에 필요할테니... 이 부분을 마저 세팅하면 될듯하다.

Locale을 ko(Korea), UTF-8로 설정했고
Timezone을 etc, GMT+9로 설정(일본도 있는데 서울이 없는건 좀 서운하네...)
Keyboard는 그래도 Korean이 보여서 그걸로 설정.

설정이 끝나면 리붓을 해야 적용이 된다고 다이알로그창이 뜬다. 재부팅.

리붓후 시간을 보니 틀리게 나온다! 당연히 저걸로 하면 될줄 알았는데... Locale을 바꿔서 그런가 (폰트가 없으니 당연할테지만) 깨져보이는 글자들도 나오고...



조금 자존심 상하긴 하지만 우리와 시간이 같은 Japan으로 설정하니 시간은 정상적으로 나온다. 추후에 세팅을 바꾸어가며 찾아보기로 하고...

이왕 하던거 폰트도 설치해보자. 한글입력은 당분간 쓸 일이 없으니 폰트만 설치해서 보이는거나 제대로 보이게...

$ sudo apt-get install fonts-nanum

PC에서도 많이 사용하던 폰트라 나눔폰트를 설치해봤다. 네이버는 하는 행태때문에 싫어하는데 네이버에서 인정해줄만한 몇몇가지중 폰트를 만들어 공개한것에는 고마운 마음을 가지고 있다.



화면상에 깨져보이던 글자들도 정상적으로 잘 보인다.

인터넷창을 열어 국내 사이트들을 들어가봐도 한글출력이 잘 되는것을 볼수있다.

일단 기본적인 세팅은 여기까지 하면 될듯하다. 내가 하는 작업을 위해서는 콘솔모드부팅으로 바꾸고 쓸모없는것들을 모두 지워내고 해야하는데 이런것들은 추후 차차 하기로 하고...

일단은 새 환경을 즐겨보기로 한다.


+ Recent posts