블로그를 Github으로 옮겨봅니다.


http://kyungw00k.github.com

Markdown에 적응하고자, 블로그를 github으로 옮겨봅니다.

방문자도 많지 않은 블로그이지만…

옮겼다고 해서 (예전처럼) 기존 글을 삭제하지는 않습니다.

(언제 돌아올지 모르기 때문에? =_=)

일단 최대한 (많이) 포스팅 해보고, 만약 wordpress.com으로 돌아오면…

그때 다시 경험담을 공유하도록 하겠습니다.

Good bye 2012!


(자칭)LibraryPi 프로젝트 Log


사내 제주 도서관에 Raspberry Pi를 입양보냈다.

도서관에 있는 기존 PC는 나무상자 속에 갖혀서 열이 심하면 종종 뻗는 현상이 잦았다고 한다.

이게 골칫거리긴 하나, 나름 잘 돌아가고 있었다.

물론, 라즈베리파이로 교체한다고 해서 달라지는 것은 없다.

단, 기존에 사용한 바코드 리더와 RFID 리더기만 잘 작동하고, 브라우저만 Kiosk 모드로 띄우면 되는 것이다.

(다행히도 HID로 인식했다.)

개인적으로는 얼마나 잘 버텨줄지 궁금하기도 해서 256M 라즈베리를 입양 보내기로 결심했다.

최소한의 패키지로 OS 설치를 진행하고, Locale은 ko_KR.utf8로 맞춘다.

그 다음에 추가로 아래 패키지를 설치한다.

# sudo 설치
$ sudo apt-get install sudo

# X 서버 설치
$ sudo apt-get install xinit

# 한글폰트 설치
$ sudo apt-get install fonts-nanum

# Chronium 설치
$ sudo apt-get install chromium

로그인 할 계정(여기서는 편의상 user라고 하자)을 하나 만들고, 자동 로그인 시킨다.

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:5:initdefault:

...

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/bin/login -f user tty1 < /dev/tty1 > dev/tty1 2>&1
#1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
...

계정에 sudo 권한을 주는데, reboot은 그냥 할 수 있도록 한다.

# /etc/sudoers
...
user ALL=(ALL:ALL) ALL

# 페스워드 없이 reboot 실행시킬 수 있도록 권한을 준다.
user ALL=NOPASSWD: /sbin/reboot

rc.local에서는 user의 권한으로 X를 실행시킨다.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

su user -c startx

라즈베리파이를 키자마자 init 5로 X가 뜨도록 했고,

root@hostname /etc/rc5.d# ln -s ../init.d/x11-common S17x11-common
root@hostname /etc/rc5.d# ln -s ../init.d/rc.local S18rc.local

user의 .xinitrc에서는 단순히 chromium 하나만 띄우는걸로 진행했다.

#!/bin.sh

# Run Chrome
/usr/bin/chromium --incognito --disable-ipv6 --disable-translate --kiosk http://주소

# Reboot
sudo reboot

헛뜨… 권한 없다고 X 안뜬다.

X: user not authorized to run the X server, aborting.

알아보니, X server를 띄울때도 권한이 필요하다.

1. Root Only
2. Console Users Only
3. Anybody

아래 명령을 실행시켜 Anybody로 바꾸자.

$ sudo dpkg-reconfigure x11-common

이때, chromium을 띄울 때, kiosk 모드로 띄웠음에도 불구하고 화면이 꽉 차지 않을 수 있다. 이럴 때는 다음의 옵션을 활용한다.

Added two new command line options (should work with or without --app):
--window-size=w,h
--window-position=x,y

위 옵션을 적용해 user의 .xinitrc를 다음과 같이 수정한다.

#!/bin.sh

# Run Chrome
/usr/bin/chromium --window-size=1680,1050 --window-position=0,0 --incognito --disable-ipv6 --disable-translate --kiosk http://주소

# Reboot
sudo reboot

chromium을 닫을 경우 X는 종료하고, 바로 reboot 된다.

아무런 옵션을 주지 않으면 framebuffer가 16bit 컬러로 동작한다는것을 알고는 32bit로 바꿔봤다.

아래는 최종으로 정리된 /boot/config.txt다.

# /boot/config.txt
# Disable Overscan
disable_overscan=1

# GPU 16M
gpu_mem=16

# DVI MODE
hdmi_drive=1

# DMT
hdmi_group=2

# 1680x1050
hdmi_mode=58

# 32bit Mode
framebuffer_depth=32
framebuffer_ignore_alpha=1

그리고… 기록 상 사진 몇 장 남겨본다.


Raspberry Pi GPU에 RAM 할당량 변경하기


Updated : 파일 교체가 아니라 /boot/config.txt 에서 설정할 수 있도록 바뀌었습니다.

Raspberry Pi용 기본 OS에서는 아무런 변경을 하지 않는 경우에는 GPU에 기본으로 64M을 할당하게 됩니다.

256MB 모델의 경우, 192MB/64MB 형태로 부팅이 된다는 것이죠.

만약 GPU를 3D를 돌리는게 아닌 최소한의 용도로 사용한다고 할 경우에는

불필요하게 GPU에 RAM을 줄 필요가 없는 것이죠.

이를 변경하기 위해서는 이 곳에 방문해서 적절한 elf를 내려받아서 적용하시면 될 것 같습니다.

예를 들면, 다음과 같습니다.

arm128_start.elf – 128MB을 제외한 나머지는 GPU에 할당함

256MB 모델의 경우, GPU에 64MB만 할당하고 싶다면 아래 파일을 사용하시면 되겠습니다.

$ sudo cp /boot/arm192_start.elf /boot/start.elf

커널 업그레이드 하니 아래와 같은 문구를 발견했습니다.

ARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!

Github에 가봐도 예전처럼 별도의 파일이 따로 있는게 아니더군요.

/boot/config.txt에 gpu_mem option을 설정하는 형태로 바뀌었습니다.

훨신 더 간단해진 것 같네요 :D

http://elinux.org/RPi_config.txt 에 보면 아래와 같은 항목을 찾아볼 수 있습니다.

Memory

disable_l2cache disable ARM access to GPU’s L2 cache. Needs corresponding L2 disabled kernel. Default 0

gpu_mem GPU memory in megabyte. Sets the memory split between the ARM and GPU. ARM gets the remaining memory. Min 16. Default 64

gpu_mem_256 GPU memory in megabyte for the 256MB Raspberry Pi. Ignored by the 512MB RP. Overrides gpu_mem. Max 192. Default not set

gpu_mem_512 GPU memory in megabyte for the 512MB Raspberry Pi. Ignored by the 256MB RP. Overrides gpu_mem. Max 448. Default not set

설정하지 않으면 기본은 64M을 잡는 것 같습니다.

실제로 dmesg로 확인해보니 그렇네요


...

[ 0.000000] Memory: 192MB = 192MB total
[ 0.000000] Memory: 188976k/188976k available, 7632k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xcc800000 - 0xe8000000 ( 440 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xcc000000 ( 192 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc04c0e78 (4836 kB)
[ 0.000000] .init : 0xc04c1000 - 0xc04e0b10 ( 127 kB)
[ 0.000000] .data : 0xc04e2000 - 0xc050e1c0 ( 177 kB)
[ 0.000000] .bss : 0xc050e1e4 - 0xc05b5128 ( 668 kB)
[ 0.000000] NR_IRQS:330

...

입맛에 맛게 설정하시면 될 것 같습니다.

만약 16M으로 설정하고 싶다면 아래와 같이 /boot/config.txt를 설정하시면 될 것 같습니다.


gpu_mem=16

이 글을 보면 이런 이야기도 있네요.

240MB RAM and 16 VRAM for almost zero graphical power. There is enough GPU memory to render the screen, but not much else. Use this when you need a further non GUI performance boost.

용도가 GUI 환경이 아니라면 GPU에 16MB 정도 주면 된다는 이야기가 있습니다.

실제로 콘솔만 쓴다면 당연하겠죠? :D


BeagleBone에 Ubuntu 및 NodeJS 설치 요약


——————————————————————————————————–

생각날때마다 찾기 귀찮아 블로그로 남겨본다.

아래 OS 설치 및 설정이 귀찮으면 Angstrom 배포본을 사용하는게 맘 편할듯

Angstrom 관련 boot-loader 및 소스는 https://github.com/beagleboard 참고

——————————————————————————————————–

I. OS 설치및 설정

1. Ubuntu ARM 설치

시작에 앞서, 비글본은 armhf architecture 를 사용한다.

따라서, 다운 받을때도 armhf 로 되어있는 preinstalled image를 다운받아야 한다.

설치는 Ubuntu에서 진행하는 것으로 한다.
Mac에서 작업하려고 했으나 좀 불편해서.. Vmware 하나 띄워서 작업했다.

- http://rcn-ee.net/deb/rootfs/ 를 들어가면 Preinstalled Image를 나름 최소 용량으로 받을 수 있다.
(http://rcn-ee.net/deb/rootfs/precise/ubuntu-12.04-r8-minimal-armhf-2012-10-19.tar.xz)

- SD 카드를 넣고, 찾아본다.

sudo ./setup_sdcard.sh –probe-mmc

- 필요한 패키지를 설치한다.

sudo apt-get install wget pv dosfstools parted git-core

- SD 카드에 이미지를 심는다.

sudo ./setup_sdcard.sh –mmc /dev/sdb –uboot bone

2. OS 설치 후 터미널 접속해본다.

screen `ls /dev/{tty.usb*B,beaglebone-serial}` 115200

3. Kernel Upgrade
단순 설치만으로는 BeagleBone의 Pin을 사용하기 어려우니, 관련해서 Kernel을 업데이트 해야한다.

URL : http://rcn-ee.net/deb/precise-armhf/LATEST-omap-psp

ABI:1 EXPERIMENTAL http://rcn-ee.net/deb/precise-armhf/v3.2.0-rc2-d0/install-me.sh
ABI:1 TESTING http://rcn-ee.net/deb/precise-armhf/v3.6.2-bone0/install-me.sh
ABI:1 STABLE http://rcn-ee.net/deb/precise-armhf/v3.2.32-psp25/install-me.sh

STABLE 용 URL을 내려받아 root 권한으로 install-me.sh를 실행해 커널을 업데이트 한다.

4. USB Ethernet Gadget로 Internet 잡으려면? udhcpc를 설치한다.
(Mac에서는 Internet 공유를 통해 쉽게 설정이 가능하기 떄문에, USB Ethernet Gadget에 공유를 이미 걸어놨다.)

A. g_ether 모듈이 로드 되고 있는지 확인한다.


$ dmesg | grep g_ether

[    2.126892]  gadget: g_ether ready

B. 로드되고 있다면 /etc/network/interfaces 를 수정한다.

</pre>
#/etc/network/interfaces 에 아래 내용을 추가한다.

auto usb0
iface usb0 inet dhcp
<pre>

5. analog input, PWM, I2C, SPI 확인

Updated: 12.04 r8 부터는 analog input, PWM, I2C, SPI를 바로 사용할 수 있다.

$  ls /dev/i2c*
 /dev/i2c-1 /dev/i2c-3

$  ls /dev/spi*
 /dev/spidev2.0

$ ls -Fd /sys/devices/platform/omap/e*
 /sys/devices/platform/omap/ecap.0/ /sys/devices/platform/omap/ehrpwm.0/
 /sys/devices/platform/omap/ecap.1/ /sys/devices/platform/omap/ehrpwm.1/
 /sys/devices/platform/omap/ecap.2/ /sys/devices/platform/omap/ehrpwm.2/
 /sys/devices/platform/omap/edma.0/

$ ls /sys/devices/platform/omap/tsc/a*
 /sys/devices/platform/omap/tsc/ain1 /sys/devices/platform/omap/tsc/ain5
 /sys/devices/platform/omap/tsc/ain2 /sys/devices/platform/omap/tsc/ain6
 /sys/devices/platform/omap/tsc/ain3 /sys/devices/platform/omap/tsc/ain7
 /sys/devices/platform/omap/tsc/ain4 /sys/devices/platform/omap/tsc/ain8

만약 위와 같이 나오지 않으면 모듈이 로드가 되지 않은 것이니 아래 명령을 실행하고, 다시 한번 확인해보기 바란다.

$ sudo modprobe ti_tscadc

부팅시에 항상 모듈을 불러오기 위해 /etc/modules에 ti_tscadc를 추가해두자.

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

ti_tscadc

II. NodeJS 0.8.x 설치하기

Updated : v0.8.14 설치

$ ./configure
$ CXXFLAGS="-fno-rtti -fno-exceptions -march=armv7-a" make -j2
$ CXXFLAGS="-fno-rtti -fno-exceptions -march=armv7-a" make install

——————————————————————————————————–

p.s. 막 글을 저장하려는 찰나에 Raspberry Pi 512M 모델이 도착했다. =_=;


BeagleBone과 BoneScript


아주 오래전에 BeagleBone에서 digitalRead()를 추가하는 포스트를 쓴 적이 있었는데…

최근에 Raspberry Pi 때문에 잠시 뒷방에 물러난 Beaglebone을 만지작 거리면서 살펴봤더니,

Arduino-like API가 대부분 구현이 되어 있었다.

-----------------
Arduino functions
-----------------
Digital I/O, Analog I/O, Advanced I/O and Time:**
analogRead(pin) -> value
analogWrite(pin, value, [freq])
attachInterrupt(pin, handler, mode)
detachInterrupt(pin)
delay(milliseconds)
digitalRead(pin) -> value
digitalWrite(pin, value)
getEeproms([callback]) -> eeproms
getPinMode(pin) -> pinMode
pinMode(pin, direction, [mux], [pullup], [slew])
shiftOut(dataPin, clockPin, bitOrder, val)

Bits/Bytes, Math, Trigonometry and Random Numbers:
lowByte(value)
highByte(value)
bitRead(value, bitnum)
bitWrite(value, bitnum, bitdata) 
bitSet(value, bitnum) 
bitClear(value, bitnum) 
bit(bitnum)
min(x, y)
max(x, y)
abs(x)
constrain(x, a, b)
map(value, fromLow, fromHigh, toLow, toHigh)
pow(x, y)
sqrt(x)
sin(radians)
cos(radians)
tan(radians)
randomSeed(x)
random([min], max)

역시 누군가는 귀차니즘을 이겨내고 다 구현을 해주는구나!

(결국 누가 더 오래 참고 기다리는가에 문제? =_=;;)

p.s.

Raspberry Pi 오기 전까지는 http://www.ewanleith.com/blog/1066/high-performance-wordpress-on-arm 보면서

Beaglebone 만지작 거리고 있어야겠다 싶어 며칠 전부터 셋팅중인데,

Micro SDHC Class 4 카드로는 도저히 안되겠다 싶다.

아직 지르지 않은게 SD 카드니… SDHC 16GB Class 10로 3개 질러야겠다.

도메인도 지르고… 이 정도면 왠만한 가상 호스팅보다는 나아지겠지 ;;;

빨랑 개발 플랫폼 셋팅해서 하루프레스로 이사가자. =_=;


wordpress.com + markdown = “기대하지마”


요즘 포스트 쓸 게 겁나게 많은데도 안쓰고 포기하는 이유가 있다면..

그건 바로 “wordpress.com 에서 글을 쓰는게 익숙하지 않아, 글을 쓰기가 매우 불편해서” 였습니다.

“익숙하도록 연습하면 되지 않느냐”

라고 할 수 있지만…

이보다 더 늦게 사용한 Markdown에 더 쉽게 익숙해져버렸네요.
(그렇다고 환상적으로 잘 쓰는건 아닙니다.)

wordpress.com에 혹시나 해서 markdown을 지원할 계획이 있을까?

해서 찾아봤습니다.

http://en.forums.wordpress.com/tags/markdown

뻔한 결론을 말씀드리면, 계획이 없답니다.
어떤분은 돈 주고라도 업데이트 할 수 있으면 하겠다고 하나 그 마저도 안하겠다고 하더군요.

그래서 블로그를 갈아타는것을 심각하게 고민중입니다.

사실, 갈아타는건 노동 수준의 귀찮은 작업이라서 그냥 블로그 따위는 쓰지 말자 싶었는데…

아무래도 뭔가를 정리하고 기록하고, 그걸 온라인에서 바로 볼 수 있는건 블로그 만한것이 없다 생각이 들더군요.

해서… 정말 사용하고 싶은 시스템의 몇 가지 기준을 정해봤습니다.

1. Markdown을 이용한다.
2. 백업을 굳이 할 필요 없다.(클라우드를 활용)
3. 블로그 디자인을 할 수 있어야한다.

위 1,2만 고려했을때 스쳐지나가는 서비스들이 있었습니다.

1. Calepin.co
2. Skrivr
3. Scriptogram
4. 하루프레스

1,2 번은 안써봤고, 3번 Scriptogram은 초창기에 신기하다 정도로 여겼습니다만..

실수로 다른 글 지우면 그걸로 동기와 되서 글도 다 지워지지 않을까?

하는 염려에 클라우드 기반의 플랫폼 사용하기가 두려워서 쓰다 그냥 지웠던 기억이 납니다.

디자인을 어디까지 바꿀 수 있을까에 대해 조사가 필요한데요, 이 부분은 천천히 살펴봐야 될 것 같습니다.
(오랜시간이 걸리겠군요. 커밍쑨 따위는 없을듯…=_=)

개인적으로 휴지통에 뭐가 있는걸 싫어해서 보통 지우고 바로 비우기를 누르는 고질적인 습관이 있습니다.
어짜피 넣을꺼면 지울려고 넣었기 때문에 다시 들여다볼 확률이 적다는 생각이죠.
잘못 지우는 일은 없을꺼라고 생각했지만 수 많은 파일들을 날려먹었고, 복구하면서, 반성도 잠깐 하고, 여전히 반복중입니다.

그닥 잘 알려지지 않은 개인 블로그지만, (봇을 포함한) 제 글을 보는 이들을 위해 그냥 날리지는 못하겠고,
좋은 글은 그닥 없지만, 지금까지 썼던 글은 놔둔체 Switching 하는 것으로 결론을 봤습니다.

p.s.
그나저나, 아두이노와 비글본 이후로 정말 오랜만에 포스팅 하는거네요.
비글본이나 아두이도나 자바스크립트나..
쓸말은 많은데, 맨날 말만 앞서고 정리는 못하네요.
마크다운으로 하면 좀 나아질런지..(모르겠습니다.)


BeagleBone의 BoneScript에서 digitalRead() 사용하기


Bonescript로 간단히 Input/Output 테스트를 하려는데 잘 되지 않았다.

선을 잘못 연결했나 싶어 한참을 해메다 단순히 OUTPUT 선을 INPUT에 연결해도 되지 않는것이었다.

보드의 문제는 아닐테고.. Bonescript의 문제일까 해서 봤는데, Pinmode에서 Input/Output일 경우에 분기 처리가 없었다.

node-arduino와 마찬가지로 bonescript 에서도 Input이 문제긴 하나보다.

포럼에 Hacking GPIO digital input into BoneScript 라는 글을 보면 이미 누군가 해결책을 내놓았다.

하지만 PWM을 사용하는 AnalogInput/Output에 대한 해결 방안은 아직까지는 없는것 같다.

(구매한지 얼마 안되서 많이 들여다보지 않았지만 그렇게 어려울 것 같진 않는데… 음…)

일단, 위 글을 참고로 bonescript의 index.js를 간단히 수정해 digitalRead를 추가해보자.

수정 전 index.js 소스 Line 164는 다음과 같다.

// ... 
    fs.writeSync(muxfile, "7", null); 
// ...

위 부분은 현재 OUTPUT만을 고려하고 있으니, INPUT일 경우에도 한 줄 추가가 되어야 할 것이다.

// ... 
    if ( mode == OUTPUT ) {
        fs.writeSync(muxfile, "7", null);    // setting for mode 7 and no pull up/down 
    } else {
        fs.writeSync(muxfile, "27", null);   // setting for mode 27 and AM3XX_PULL_UP
    }
// ...

그리고 digitalWrite 함수와 마찬가지로, 아래와 같이 digitalRead 함수를 추가해야 한다.

// ... 
digitalRead = exports.digitalRead = function(pin) 
{ 
    return fs.readFileSync(gpio[pin.gpio].path); 
}; 
// ...

다음은 추가된 digitalRead를 테스트하기 위해 간단히 스위치로 LED를 ON/OFF를 보여주는 데모 영상이다.
소스는 영상에 살짝 나온게 전부라.. 따로 코드를 적진 않겠다.