2008년 7월 30일 수요일

구글 캘린더와 iCal 싱크하기 (Sync Google Calendar with iCal)

구글 캘린더가 드디어 CalDAV를 지원하기 시작하였다. 이 덕에 별도의 프로그램 없이도 구글 캘린더와 iCal을 싱크시킬 수 있게 되었다.

(단 iCal 3.x 버젼 이상, Leopard는 기본적으로 iCal 3.x가 들어있다.)

1. 먼저 iCal을 실행시키고 preference로 간다.

gcal0.jpg

2. Accounts를 선택한 다음 화면 아래쪽의 '+' 버튼을 눌러 account를 추가한다.

gcal1.jpg

3. Username에 자신의 gmail 주소, Password에 자신의 gmail 암호를 넣어준다. 그리고 Account URL에는 'https://www.google.com/calendar/dav/abcde@gmail.com/user'을 넣어준다. 여기서 빨간색 부분에 자신의 gmail 주소로 바꿔주면 된다.

내용을 입력하고 아래쪽의 'Add' 버튼을 눌러 어카운트를 추가해준다.


gcal2.jpg

이것으로 구글 캘린더와 iCal의 싱크 설정이 된 것이다. 기본 설정은 15분마다 싱크를 하게 되어 있지만 iCal의 Calendar -> Refresh/Refresh all을 사용하면 바로 싱크를 하게 할 수 있다.

Calendar를 한개가 아니고 여러개를 사용할 수도 있다. 이 경우 먼저 구글 캘린더의 왼쪽에 Add를 누른 다음 'Create a new calendar'를 선택해서 새 calendar를 추가해준다.


gcal4.jpg

캘린더 정보를 다 입력하면 새로 만들어 진 캘린더도 같이 보이게 된다.

gcal5.jpg

새로 만들어 진 캘린더 옆의 역삼각형을 누르면 풀다운 메뉴가 보이고 그 중 'Calendar settings'를 선택한다.
gcal6.jpg

Calendar settings화면의 아래쪽에서 Calendar ID 부분을 복사해 둔다.


사용자 삽입 이미지

그 다음은 위에서 어카운트를 만드는 방법과 동일하게 해 주면 된다.

다만 이번에는 Username은 원래 자신의 gmail address를 넣어주고 Account URL에서 자신의 gmail address대신 방금 복사한 Calendar ID를 넣어주면 된다.

예) 'https://www.google.com/calendar/dav/abcde@gmail.com/user' 위에서는 이렇게 입력했다면 이번에는 빨간 부분을 Calendar ID로 바꿔줘야 한다.

'https://www.google.com/calendar/dav/257815b123bkh3gid94g433bo4@group.calendar.google.com/user'


gcal2.jpg

2008년 7월 22일 화요일

Delicious Library 2


dl0.jpg

Delicious Library는 Mac OS X에서 매우 편리하게 사용할 수 있는 도서, CD/DVD, Gadget등의 관리 프로그램이다.

dl4.jpg

자신이 가지고 있는 책이나 CD/DVD를 위의 화면과 같이 서재에 정리해 놓은 것처럼 보여준다.

dl1.jpg

라이브러리 뿐 아니고 자신의 iTunes에 있는 앨범까지도 자동으로 보여준다. 위와 같이 Library가 선택되어 있으면 책, CD/DVD, Gadget이 모두 보이고 Books를 선택하면 책들만 보여준다.


dl2.jpg

새로운 항목을 추가하는 방법은 두가지가 있다. 윈도우의 아래쪽에 '+' 버튼을 눌러 검색하는 방법과 카메라 모양의 버튼을 눌러 iSight를 통해 책이나 CD의 바코드를 입력하는 방법이 있다.


dl3.jpg

'+' 버튼을 누르면 위와 같은 창이 열린다. 여기서 책의 제목, 저자 이름 또는 키워드를 넣어서 검색하면 된다. 위에서 볼 수 있듯이 책 뿐 아니고 다양한 종류(심지어 옷까지도) 를 추가할 수 있다. Find Book 버튼 아래에 United States를 누르면 미국 뿐 아니고 유럽이나 일본의 웹 사이트를 검색하게 해 줄 수도 있다.


dl7.jpg

키워드로 겸색한 결과이다. 이 책을 가지고 있지 않으면 Buy 버튼을 눌러 Amazon등에서 바로 구입할 수도 있다. 자신의 라이브러리에 추가하려면 원하는 책을 선택하고 'Add' 버튼을 누르면 된다.


dl8.jpg

두번째 방법으로는 '+' 버튼 옆의 카메라 버튼을 누르면 위와 같은 창이 열리고 맥의 iSight가 켜진다. 책이나 CD/DVD등의 바코드를 위와 같이 녹색 사각형에 맞춰 가져다 대면 바코드를 인식해서 그에 해당하는 책을 자동으로 검색해서 목록에 추가해 준다. 책 제목과 관련정보 뿐 아니고 표지 이미지까지도 인터넷에서 자동으로 다운 받아준다.


dl6.jpg

일본 amazon도 검색할 수 있도록 되어 있기 때문에 위와 같은 만화책까지도 바코드로 검색하면 표지 이미지까지 가져올 수 있다.


dl5.jpg

목록에 들어있는 항목을 선택하면 위와 같이 화면 아래쪽에 그에 대한 기본/상세정보, 리뷰까지 다 보여준다.


* 추가로 블루투스 바코드 리더와 연결해서 바코드를 읽어들일 수도 있다.

2008년 7월 18일 금요일

Gmail 팁

많은 사람들이 사용하는 gmail에는 여러가지 숨겨진 기능들이 많이 있다. 그 중 상당히 유용한 기능이 한 계정에 대해 여러개(사실 거의 무한대)의 이메일 주소를 가질 수 있다는 것이다.
gmail은 [username]@gmail.com 의 메일 주소에서 [username] 부분에 들어가는 '.' 을 모두 무시하고 '+' 뒷 부분도 모두 무시한다.
즉 gmail은 a.b.c.d@gmail.com, abc.d@gmail.com, a.bcd@gmail.com같은걸 모두 abcd@gmail.com으로 인식한다는 것이다.
또한 abcd+anything@gmail.com도 모두 abcd@gmail.com으로 인식한다.
이 기능과 filter를 잘 이용하면 한개의 이메일 계정을 체계적으로 관리할 수 있다.

즉 내 gmail주소는 abcd@gmail.com인데 어느 사이트에 회원가입시 이메일 주소를 넣어줘야 하지만 그 사이트에서 오는 메일을 받고 싶지 않은 경우 원래 이메일 주소인 abcd@gmail.com 대신 abcd+ad@gmail.com을 넣어주고 filter에 abcd+ad로 오는 메일은 자동으로 삭제하게 설정해 놓으면 원하지 않는 광고메일들을 볼 필요 없이 자동으로 삭제되게 할 수 있다.


또는 친구들에게는 abcd+friend@gmail.com 이라는 주소를 알려주고 filter에 abcd+friend로 오는 메일은 자동으로 'friend'라는 라벨을 붙여서 다른 메일들과 확실하게 구분해 줄 수 있다.

필터를 만드는 방법은 다음과 같다.

1. Gmail에서 settings를 선택한다.
사용자 삽입 이미지
2. Settings 화면에서 Filters 탭을 선택한다.
사용자 삽입 이미지

3. 설정되어 있는 필터 목록 아래쪽의 Create a new filter를 선택한다.
사용자 삽입 이미지

4. 'To:' 필드에 원하는 주소를 넣어준다. 여기서는 광고메일을 받아 자동으로 삭제하도록 설정하는걸 보여준다.
사용자 삽입 이미지
5. 'nautesrouge+advertise' 로 오는 메일은 자동으로 삭제하길 원하기 때문에 'Delete it'을 선택해준다. 만일 nautesrouge+friend로 오는 메일에 friend라는 라벨을 붙이고 싶으면 'nautesrouge+friend'를 4번의 필드에 넣어주고 여기서는 'delete it' 대신 'apply the label:' 을 선택하고 choose label...에서 'friend'를 선택해주면 된다. 물론 friend라는 라벨은 미리 만들어 놓아야 한다.
사용자 삽입 이미지

6. 설정을 끝내고 위의 화면에서 'Create Filter' 버튼을 누르면 다음과 같은 필터가 만들어진다.
사용자 삽입 이미지

2008년 7월 12일 토요일

리눅스와 맥OS X에서 램디스크 만들기 (How to create ramdisk in Mac OS X and Linux)

리눅스 커널 2.4 이후 버젼의 리눅스를 사용하고 있으면 이미 램디스크 지원이 내장되어 있다. 확인하고 싶으면 다음의 명령어를 사용하면 된다.

$ dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize

CentOS나 RHEL인 경우 위와 같은 출력이 나오고 다른 리눅스 배포판인 경우도 유사한 결과가 나온다. 아래 명령어로 만들어 져 있는 램 디스크를 볼 수 있다.

$ ls -l /dev/ram*
lrwxrwxrwx 1 root root 4 Apr 24 12:05 /dev/ram -> ram1
brw-rw---- 1 root disk 1, 0 Apr 24 12:05 /dev/ram0
brw-rw---- 1 root disk 1, 1 Apr 24 12:05 /dev/ram1
brw-rw---- 1 root disk 1, 10 Apr 24 12:05 /dev/ram10
brw-rw---- 1 root disk 1, 11 Apr 24 12:05 /dev/ram11
brw-rw---- 1 root disk 1, 12 Apr 24 12:05 /dev/ram12
brw-rw---- 1 root disk 1, 13 Apr 24 12:05 /dev/ram13
brw-rw---- 1 root disk 1, 14 Apr 24 12:05 /dev/ram14
brw-rw---- 1 root disk 1, 15 Apr 24 12:05 /dev/ram15
brw-rw---- 1 root disk 1, 2 Apr 24 12:05 /dev/ram2
brw-rw---- 1 root disk 1, 3 Apr 24 12:05 /dev/ram3
brw-rw---- 1 root disk 1, 4 Apr 24 12:05 /dev/ram4
brw-rw---- 1 root disk 1, 5 Apr 24 12:05 /dev/ram5
brw-rw---- 1 root disk 1, 6 Apr 24 12:05 /dev/ram6
brw-rw---- 1 root disk 1, 7 Apr 24 12:05 /dev/ram7
brw-rw---- 1 root disk 1, 8 Apr 24 12:05 /dev/ram8
brw-rw---- 1 root disk 1, 9 Apr 24 12:05 /dev/ram9
lrwxrwxrwx 1 root root 4 Apr 24 12:05 /dev/ramdisk -> ram0

결과에 나온 모든 램 디스크 크기는 동일하다. 위의 예제에서는 모두 16MB이다. 이걸 128MB까지 사용할 수 있게 변경해 보겠다. 단 여기서는 사용할 수 있게 해 주는거지 실제로 128B를 할당해주는게 아니다. 후에 드라이브중 하나를 포맷해 줌으로서 실제 영역을 할당해주게 된다. 램디스크 용량은 1024의 배수로 지정해 줘야 하기 때문에 128MB인 경우 131072K가 된다.

에디터를 사용해 /etc/grub.conf 파일을 열어보면 아래와 같은 라인을 찾을 수 있을 것이다.

kernel /vmlinuz-2.6.9-42.0.10.EL ro root=/dev/VolGroup00/LogVol00

이 라인의 뒤쪽 부분에 ramdisk_size=131072를 추가해주면 된다.

kernel /vmlinuz-2.6.9-42.0.10.EL ro root=/dev/VolGroup00/LogVol00 ramdisk_size=131072

변경된 파일을 저장하고 에디터를 종료한다. 이 시점에서 램디스크 용량을 변경했지만 변경된 내용을 적용하려면 시스템을 리부트 시켜줘야 한다. 시스템이 리부트되고 나서 나머지 설정을 해 주면 된다.

$ mke2fs -m 0 /dev/ram0

위의 명령을 사용해서 ram0 램디스크를 사용할 수 있게 포맷 해 준다. 이 과정에서 커널이 메모리에 램디스크를 위한 용량을 할당해주게 된다. 포맷이 끝나면 램디스크를 마운트 시켜주면 된다.

$ mkdir /mnt/rd
$ mount /dev/ram0 /mnt/rd

이제 램디스크를 사용할 수 있다. 이렇게 만들어 진 램디스크를 특정 사용자가 사용할 수 있게 해 주려면 chown 명령을 사용해서 오너를 변경해주면 된다.

$ chown testuser.testuser /mnt/rd

mount명령을 사용하면 램디스크가 /mnt/rd에 마운트 된 걸 볼 수 있다.

$ mount
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda2 on /home type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/ram0 on /mnt/rd type ext2 (rw)

주의할것은 램디스크이기 때문에 여기에 저장된 내용은 시스템을 리부팅하면 모두 지워지게 된다는 것이다. 단 램디스크를 언마운트 했다가 다시 마운트 하는 경우에는 램디스크 내용이 그대로 살아있다.

시스템이 부팅할 때 마다 자동으로 램디스크를 만들도록 설정하고 싶으면 아래의 내용을 /etc/rc.local 파일에 추가해주면 된다.

mke2fs -m 0 /dev/ram0
mount /dev/ram0 /mnt/rd
chown testuser.testuser /mnt/rd

---
Mac OS X에서는 아래의 명령으로 50MB 크기의 램디스크를 만들어 줄 수 있다. 여기서 램디스크의 용량은 바이트로 지정해 줘야 한다. (예: 50MB인 경우 50*1024*1024 = 52428800)

$ hdid -nomount ram://52428800
$ newfs_hfs /dev/disk1
$ mkdir /tmp/ramdisk1
$ mount -t hfs /dev/disk1 /tmp/ramdisk1

만들어 진 램디스크를 언마운트 하려면 다음의 명령을 사용하면 된다.
$ hdiutil detach /dev/disk1

또한 이런 명령어를 직접 사용하지 않고 쉽게 램디스크를 만들어 줄 수 있는 GUI 유틸리티도 있다.

사용자 삽입 이미지
MakeRAMDisk : http://boredzo.org/make-ram-disk/

소스코드까지 공개되어 있는 무료 유틸리티로 OS X 10.4 이상에서 동작한다.
이 프로그램을 실행시키면 자동으로 64MB의 램디스크가 만들어진다. 사이즈를 변경하고 싶으면 프로그램을 실행할 때 Option키를 누른 상태에서 실행하면 위의 화면이 나와서 크기를 변경해 줄 수 있다.
만들어 진 램디스크를 없애려면 CD를 추출하는것과 마찮가지로 램디스크 아이콘을 휴지통에 버려주면 된다.

2008년 7월 11일 금요일

MoteDaemon - Wii Mote를 소켓프로그래밍으로 사용하기 (Access Wii Mote by network socket API)

Picture 1.png

MoteDaemon은 WII Mote를 Mac에 연동해서 쉽게 사용할 수 있게 해 주는 프로그램이다.

지금까지 나온 유사한 종류의 프로그램들은 대부분 모트를 마우스 대용으로 사용하거나 리모컨 용도로 사용할 수 있게 해 주었지만 자신이 직접 만든 프로그램에서 자유롭게 사용하기는 쉽지 않았다.

특히 플래쉬로 프로그램을 만드는 경우 플래쉬에서 위 모트와 직접 인터페이스를 할 방법이 없었다.

위의 그림은 플래쉬로 만들어 진 샘플 프로그램으로 먼저 MoteDaemon을 실행한 다음 WII Cockpit을 실행하면 위와 같은 화면이 나오게 되고 모트의 1과 2 버튼을 동시에 누른 다음 화면의 Connect를 눌러주면 된다. 정상적으로 연결되고 나면 모트를 움직이면 그에 반응해 화면의 계기들이 움직인다.

(MoteDaemon은 맥에서만 동작하고 윈도우에서는 동일한 역할을 해 주는 프로그램으로 WiiFlash가 있다. 다만 WiiFlash는 메세지 포멧으로 XML대신 binary를 사용하고 있다.)

MoteDaemon은 모트와 인터페이스를 담당하고 그 결과를 소켓 인터페이스를 통해 XML 메세지로 바꿔 전달해 준다. 즉 MoteDaemon이 모트와의 연결관리, 블루투스를 통한 데이터 교환을 담당해 주기 때문에 어느 프로그램에서건 별도로 블루투스 프로그래밍을 배울 필요 없이 일반 네트웍 소켓 프로그래밍 하는것과 동일한 방법으로 위 모트의 입력을 전달받을 수 있다.

사용자 삽입 이미지

사용자 삽입 이미지

물론 대부분의 경우는 MoteDaemon과 Client는 같은 컴에서 실행되지만 다른 컴퓨터에서 실행되도 관계 없다.

클라이언트와 서버간 통신은 간단한 XML 프로토콜을 사용한다.


XML 메세지 포맷

MoteDaemon은 다음의 프로토콜을 사용한다. MoteDaemon에서 클라이언트로 보내는 각각의 메세지는 다음의 XML root element 타입중에 하나를 가지게 된다.

<device />

이 element는 한번에 여러개의 axis values를 가지게 된다. 메시지를 보내는 리모트의 주소를 값으로 가지는 attribute와 각 축의 값을 가지는 여러개의 axisValue 타입의 child element를 포함하게 된다. X,Y,Z 축의 가속도 센서와 조이스틱의 값은 0~255 사이의 정수이다. Pitch와 Roll 축은 +- 사인을 가지는 부동소수점으로 도(degree)로 표현된다.

<buttonChange />

리모트 컨트롤러의 버튼 이벤트를 나타낸다. state attribute는 버튼의 상태 변화를 나타낸다. (버튼이 눌리면 1, 눌린 버튼이 띠어지면 0). ID attribute는 상태가 변한 버튼이 어떤 것인지 알려준다.

<disconnect />

리모트 컨트롤러와의 association이 어떤 이유에서건 취소되었다는걸 알려준다.

<error />

서버에 에러가 발생하면 <error /> 메시지로 알려주게 된다.


XML 메세지 예제

아래 메세지 예를 보면 어떤 식으로 데이터가 전달되는지 쉽게 알 수 있을 것이다.

Listing 1: Record combined with axis data

<device address="00-19-1d-62-36-84">

<!-- Accelometer of WII remote control -->

<axisValue axis='wx' value='128' /> <!-- X-Axis -->

<axisValue axis='wy' value='124' /> <!-- Y-Axis -->

<axisValue axis='wz' value='100' /> <!-- Z-Axis -->

<axisValue axis='wp' value='0.01' /> <!-- Pitch axis -->

<axisValue axis='wr' value='-10.2' /> <!-- Roll axis -->

<!-- Nunchuk Accelometer -->

<axisValue axis='nx' value='128' /> <!-- X-Axis -->

<axisValue axis='ny' value='128' /> <!-- Y-Axis -->

<axisValue axis='nz' value='90' /> <!-- Z-Axis -->

<axisValue axis='np' value='4.4' /> <!-- Pitch axis -->

<axisValue axis='nr' value='-1.2' /> <!-- Roll axis -->

<!-- Joystick -->

<axisValue axis='jx' value='62' />

<axisValue axis='jy' value='65' />


Listing 2: Button, Disconnect and error event

<!-- Button 5 of remote control 00-19-1d-62-36-84 goes low -->

<buttonChange state='1' id='5' address='00-19-1d-62-36-84' />

<!-- Button 5 of remote control 00-19-1d-62-36-84 goes high -->

<buttonChange state='0' id='5' address='00-19-1d-62-36-84' />

<!-- Connection to remote control 00-19-1d-62-36-84 finished -->

<disconnect address='00-19-1d-62-36-84' />

<!-- error message -->

<error type='discovery' message='A Bluetooth error occured. Please remove all RVL-CNT-01 devices from Bluetooth preferences and try again.' />


2008년 7월 5일 토요일

리눅스에서 비디오램을 램디스크 또는 스왑파티션으로 사용하기 (Use video ram as a ramdisk or swap partition in Linux)

최근의 비디오카드는 엄청난 양의 비디오램(보통 256~512MB)을 가지고 있다. 하지만 그 중 대부분은 최신 3D 게임같은것을 하지 않는다면 사용되지 않는다. 리눅스에서 이 비디오램을 스왑 파티션 또는 램디스크로 사용할 수 있다. 리눅스에서 놀고 있는 비디오카드의 메모리를 램디스크 또는 스왑으로 사용하면 엄청난 성능 향상이 가능해진다.

커널 준비하기

그래팩카드의 메모리를 사용하려면 그 메모리 영역이 커널에 매핑되어야만 한다. 기본적으로 시스템 메모리만 사용할 수 있는 램으로 인식되기 때문에 PCI 주소 영역(address space)의 메모리를 사용하려면 사용하고자 하는 메모리를 커널에 등록해 줄 수 있는 드라이버가 필요하다. 2.6 커널에 이 역할을 수행해주는 MTD(Memory Technology Device) 지원 드라이버가 포함되었다. 리눅스의 menuconfig를 실행해서 MTD 기능을 활성화 시켜줘야 한다. 커널에 포함된 (built-in) 드라이버로 하건 모듈로 컴파일하건 관계 없이 동작한다.

사용자 삽입 이미지

비디오 메모리 주소 확인

커널을 다시 만들어 준 다음에는 PCI 영역에서 비디오 메모리 주소를 찾아내야 한다. 가장 쉬운 방법은 lspci를 사용하는 것이다.

$ lspci -vvv

0000:02:00.0 VGA compatible controller: ATI Technologies Inc R300 AD [Radeon 9500 Pro] (prog-if 00 [VGA])

Subsystem: PC Partner Limited: Unknown device 7c07

Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B-

Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-

Latency: 32 (2000ns min), cache line size 08

Interrupt: pin A routed to IRQ 255

Region 0: Memory at d8000000 (32-bit, prefetchable) [size=128M]

Region 1: I/O ports at b000 [size=256]

Region 2: Memory at e9000000 (32-bit, non-prefetchable) [size=64K]

Expansion ROM at e8000000 [disabled] [size=128K]

Capabilities: [58] AGP version 3.0

Status: RQ=256 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW+ AGP3+ Rate=x4,x8

Command: RQ=1 ArqSz=0 Cal=0 SBA+ AGP- GART64- 64bit- FW- Rate=<none>

Capabilities: [50] Power Management version 2

Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)

Status: D0 PME-Enable- DSel=0 DScale=0 PME-


이 중에 필요한 정보는 prefetchable memory region인 Region 0이다. 이 영역의 시작 주소는 0xd8000000 이다.

* 위의 화면은 예제이다. 실제로 컴퓨터의 메모리 영역의 시작번지는 다를 수 있기 때문에 꼭 확인해 줘야 한다.

메모리 매핑하기

실제로 PCI 영역의 메모리를 억세스하려면 MTD드라이버에게 해당 영역의 시작과 끝 주소를 알려줘야만 한다. 끝 주소를 계산하는 법은 간단하다. 단순히 어느정도의 메모리를 사용할지 결정하면 된다. 하지만 비디오카드가 원래 목적의 기본동작을 위해 얼마간의 메모리 영역은 남겨둬야 한다.

만일 SLRAM 드라이버를 모듈로 컴파일 했다고 하면 다음 명령을 실행해주면 된다.

# Region 0 starts at 0xd8000000, leave 4 MB ram for the VGA, so add 4*1024*1024 to it

# which is 0x00400000 in hex, 32 bit. This means: 0xd8400000 will be the starting position.

# Now, to use the other 124 MB, the easiest way is to tell the offset value.

# The third parameter's leading + means that we are telling the offset,

# not the actual region's ending address. 124 MB is 0x7c00000 in hex, 32 bit.

modprobe slram map=VRAM,0xd8400000,+0x7c00000


PHRAM 드라이버를 모듈로 컴파일 한 경우는 다음의 명령을 사용한다.

# Loading with PHRAM module is very similar to SLRAM module, except that it uses a "length"

# parameter by default rather than an "end offset".

# This does the same thing as the SLRAM module above

modprobe phram phram=VRAM,0xd8400000,0x7c00000

# This is also the same (and easier to read)

modprobe phram phram=VRAM,0xd8400000,124Mi


커널에 포함된 드라이버로 컴파일 한 경우 커널 커맨드 라인에 아래를 추가해주면 된다.

# Now the first parameter is the device which will be mapped.

# Other parameters share the same meaning shown above, in the module version.

# Please reboot your computer, to take it effect.

slram=mtd0,0xd8400000,+0x7c00000


제대로 설정이 되었는지 dmesg를 사용해서 확인할 수 있다.

slram: devname = mtd0

slram: devstart = 0xd8400000

slram: devlength = +0x7c00000

slram: devname=mtd0, devstart=0xd8400000, devlength=0x7c00000

slram: Registered device mtd0 from 3543040KiB to 3670016KiB

slram: Mapped from 0xe0880000 to 0xe8480000


또는 좀 더 확실히 하고 싶으면 /proc/mtd 파일을 보면 된다.

dev: size erasesize name

mtd0: 07c00000 00004000 "mtd0"


MTD 디바이스 만들기

커널이 MTD를 지원하도록 설정하고 나면 메모리를 억세스 할 방법이 있어야 한다. 즉 디바이스를 만들어 줘야 할 차례이다. 다음의 명령을 사용하면 된다.

$ modprobe mtdchar ("Direct char device access to MTD devices" 가 모듈로 컴파일 된 경우만 필요, 커널 built-in인 경우 사용하면 안된다.)

$ mknod /dev/mtd0 c 90 0

$ modprobe mtdblock ("Caching block device access to MTD devices" 가 모듈로 컴파일 된 경우만 필요, 커널 built-in인 경우 사용하면 안된다.)

$ mknod /dev/mtdblock0 b 31 0

사용하기

이제 비디오카드의 메모리를 램디스크나 스왑파티션으로 사용할 수 있다. 어느 경우로 사용하건 비디오램에 파일 시스템을 만들어 줘야 한다.

* 스왑 파티션으로 사용하기

스왑파티션으로 사용하려면 다음의 명령을 사용하면 된다.

$ mkswap /dev/mtdblock0

$ swapon /dev/mtdblock0

위의 명령을 실행하면 비디오카드의 메모리에 스왑 파일 시스템을 만들고 그 파티션을 활성화 시키게 된다. 스왑 파티션을 여러개 지정한 경우 어느 스왑 파티션을 먼저 사용할 지 우선권(priority) 지정하려면 swapon에 '-p X' 스위치를 사용하면 된다. 여기서 X는 0부터 32767 사이의 정수로 숫자가 클수록 우선권이 높다.

$ swapon /dev/mtdblock0 -p 10

우선권을 지정하지 않으면 현재 사용되는 스왑파티션의 우선권보다 낮은 값이 할당되게 된다. 또한 이 명령을 사용하면 fstab에도 반영되기 때문에 매번 부팅할 때 마다 다시 수동으로 추가해 줄 필요는 없다.

위의 명령을 실행한 후의 /etc/fstab의 내용이다.

$ <fs> <mountpoint> <type> <opts> <dump/pass>

/dev/mtdblock0 none swap sw,pri=10


* 램디스크로 사용하기

램디스크로 사용하려면 비디오램에 다음의 명령으로 파일시스템을 만들어 주면 된다.

$ mkfs.ext2 /dev/mtdblock0

이렇게 만들어 준 다음 리눅스 파일 시스템의 원하는 위치에 마운트 시켜 주면 된다.


* Michał SchulzGentoo Wiki의 문서를 정리, 번역한 글이다. 원문은 각각의 링크를 누르면 볼 수 있다.

2008년 7월 3일 목요일

coLinux Network 설정하기 (coLinux Network Configuration Guide)

coLinux에서 네트웍을 설정하는 방법은 여러가지 옵션이 있다. 그 중 여기서 목표로 하는 네트웍 설정은 다음 그림과 같다. 인터넷은 D-Link DI-624를 통해 연결되고 D-Link router는 DHCP server를 실행하고 있다. 윈도우와 coLinux를 설치한 노트북은 fast ethernet(VIA Rhine II)로 연결되어 있고 router의 DHCP server에서 192.168.0.100을 할당받았다. (아래 그림에서 빨간색 블럭이 실제 네트웍 인터페이스이고 보라색 블럭은 가상 인터페이스이다. 실선 화살표는 실제 네트웍 케이블이고 점선 화살표는 가상의 네트웍 케이블을 나타낸다. 그리고 당연히 coLinux OS와 Hosting OS인 윈도우는 같은 기계에서 실행되고 있다.)


200807011630.jpg

이 방식으로 네트웍 설정을 하려면 coLinux를 설치한 다음 WinPcap (The Windows Packet Capture Library)도 다운받아 설치해 줘야 한다.

coLinux를 설치하고 나면 디렉토리에 다음의 파일이 설치된다.


cl1.png

이 중에 example.conf 파일을 원하는 이름으로 복사해준다. 여기서는 colinux.conf 로 예를 들기로 하겠다.

c:\coLinux> copy example.conf colinux.conf

파일을 복사 한 다음 colinux.conf를 에디터에서 열어준다.

기본적으로 아래 화면에서 색이 칠해진 부분을 자신에게 맞게 변경해주면 된다.
cl2.png

위의 색이 칠해진 부분을 자신이 다운받아 압축을 풀은 루트파일 시스템, 스왑파일 이름으로 바꿔준다. 여기서는 루트파일 시스템으로 Ubuntu-7.10.ext3.2gb.fs를 사용하고 있다.


cl3.png

위의 화면의 아랫 부분이 네트웍 설정에 필요한 내용이다. 여기서는 (가상) 네트웍 카드를 2개 사용해서 첫번째는 TAP을 사용해서 coLinux-windows와의 통신 전용으로 사용하고 두번째는 WinPcap을 사용해서 coLinux가 인터넷을 억세스하는데 사용할 것이다.

위와 같이 변경해 주었으면 파일을 저장하고 에디터를 종료한다.

그리고 아래와 같은 배치파일을 만들어 준다.


cl4.png

윈도우의 네트웍 커넥션에 보면 coLinux를 설치할 때 이미 설치된 가상 TAP-Win32 adapter가 보인다.

cl5.png

이 TAP-Win32 adapter의 속성(properties)로 가서 'Internet Protocol (TCP/IP)'를 더블클릭해서 아래 그림과 같은 Internet Procotol (TCP/IP) Properties 윈도우에서 아래와 같이 IP, Subnet mask를 설정해 준다. 단 Default gateway는 빈칸으로 놔둬야 한다.

IP address: 192.168.37.10 (여기서 서브넷 37은 임의로 정한 것이다. 이미 사용하고 있다면 사용하지 않는 다른 서브넷으로 변경해도 된다. 단 윈도우의 TAP-Win32 adapter와 coLinux의 eth0는 같은 서브넷 번호를 사용해야 한다.)

IP address: 192.168.37.10

Subnet mask: 255.255.255.0

cl6.png

IP 설정이 끝났다면 Local Area Connection2 Properties 윈도우에서 'Advanced' 탭을 선택해서 Windows Firewall의 'Settings...'를 눌러준다.


cl7.png

파이어월 설정에서 Local Area Connection 2에 대해서는 파이어월을 중단시켜준다.

cl8.png


여기까지 끝났으면 도스 프롬프트에서 아까 만들어 준 배치파일(cl.bat)을 실행해서 coLinux를 실행시켜 준다.


cl9.png

Cooperative Linux Console이라는 윈도우가 열리면서 리눅스 부팅 시퀀스가 표시된다. 로그인 화면이 나오면 root로 로그인 해 준다. login id, password 둘 다 'root'를 사용하면 된다. 로그인 한 다음 에디터에서 '/etc/network/interfaces' 파일을 열어서 아래와 같이 수정해 준다.

eth1은 dhcp를 사용할 것이지만 기본 상태에서는 dhcp resolver가 없기 때문에 일단 static으로 인터넷에 연결해서 dhcp resolver를 설치한 다음에 다시 dhcp를 사용하도록 변경해 줄 것이다.


cla.png

또한 /etc/resolv.conf 파일도 다음과 같이 변경해 준다.

cld.png

변경을 마치고 파일을 저장한 다음 인터페이스를 멈췄다가 다시 활성화 시키거나 coLinux를 reboot시키고 나서 ifconfig를 해 보면 다음과 같이 나타나야 된다.


clb.png

ping 명령을 사용해서 각각의 인터페이스가 제대로 동작하는지 확인해 볼 수 있다.

clc.png

정상적으로 동작하는게 확인 되었으면 apt-get 명령어를 사용해서 dhcp resolver(여기서는 'pump'를 사용)를 다운받아 설치해 준다.


cle.png

dhcp resolver를 설치한 다음 /etc/network/interfaces 파일에서 eth1에 관한 부분을 (dhcp를 사용하도록) 변경해준다.


clf.png

파일 변경이 끝났으면 coLinux를 재부팅 하거나 ifdown eth1, ifup eth1 명령을 순서대로 사용해서 인터페이스를 비활성화 시켰다가 다시 활성화 시켜주면 된다. 아래 화면이 ifconfig의 결과인데 위에 static을 사용할 때는 ip를 강제로 192.168.0.105로 지정해 줬는데 이번에는 dhcp 서버에서 ip를 받아왔기 때문에 192.168.0.101로 할당된 걸 볼 수 있다.

clg.png

2008년 7월 2일 수요일

PS3 Eye 카메라를 맥에서 웹캠으로 사용 (Use PS3 Eye camera in Mac OS X)

사용자 삽입 이미지

소니의 플레이스테이션 3용 카메라인 PS3 Eye를 맥에서 웹캠으로 사용할 수 있게 되었다.
요새는 맥 미니와 맥 프로를 제외하면 거의 모든 맥에 iSight가 기본으로 장착되어 있어 필요성이 아주 크지는 않아도 외장형 웹캠이 필요한 사람들에게는 가격도 저렴하기 때문에 (아마존에서 현재 $32) 단종된 외장형 iSight대신 쓸만한 제품이다.

VGA해상도(640*480)에서 최대 60 fps, QVGA(320*240)에서 최대 120 fps가 가능하고 포커스가 고정된 내장형 iSight에 비해 포커스를 조정할 수 있고 고성능의 마이크 어레이(각각 16 bit/sample, 48 KHz 샘플링 레이트, 90 db SNR인 마이크가 4개)를 가지고 있다.
(참고로 외장형 iSight의 경우 640*480 해상도에 30 fps을 지원하고 noise cancellation mic를 가지고 있었다.)

USB webcam driver for Mac OS X인 MACAM을 맥에 설치해주고 PS3 Eye를 맥에 연결해주면 바로 인식해서 사용할 수 있다.
MACAM이 지원하는 웹캠 목록은 여기서 볼 수 있다. MACAM 지원 웹캠 목록

coLinux - 윈도우와 리눅스를 동시에 사용하기 (coLinux - use windows and linux simultaneously)

가상화 기술(virtual machine)이 많이 발전해서 요새는 자신이 사용하는 OS(호스트 OS)상에서 다른 OS(타켓 OS)를 실행시키는 경우가 많아졌다.

많이 사용되는 소프트웨어로는 VMWare, Parallels 같은 것들이 있다. 이 소프트웨어들은 호스트OS 위에 완전한 가상의 컴퓨터를 에뮬레이션 해 주기 때문에 이론적으로 가상 환경에 제공되는 디바이스에 대한 디바이스 드라이버만 있다면 그 프로세서를 지원하는 모든 OS를 설치할 수 있다. 단점은 컴퓨터의 아주 로우레벨까지 완벽하게 에뮬레이션을 해 줘야 하기 때문에 상당한 성능 저하를 피할 수가 없다.

사용자 삽입 이미지
이에 비해 coLinux(cooperative Linux)는 다른 접근방식을 사용한다. coLinux는 "리눅스가 모든 프로세서 아키텍쳐에 포팅될 수 있다면 그런 방식으로 다른 OS에는 포팅을 할 수 없을까?"라는 기본적인 질문에서 탄생하게 되었다.

http://www.colinux.org

coLinux는 단일 컴퓨터 상에서 다른 OS와 함께 돌아갈 수 있게 리눅스 커널을 포팅한 것이다. 물론 오픈소스이고 무료로 사용할 수 있다.

VMWare같은 가상화 솔루션은 타겟 OS를 User mode에서 실행시키는데 비해 coLinux는 호스트 OS에 특수한 드라이버를 만들어서 커널이 privileged mode(a.k.a. supervisor mode or ring 0)에서 실행될 수 있게 해 준다.

지속적으로 프로세서의 상태를 호스트 OS와 coLinux커널 상태로 스위칭 해 줌으로서 자신에게 할당된 주소영역에서 MMU에 대한 완전한 통제권을 가질 수 있어서 coLinux 커널이 호스트 OS로 실행되는것과 같이 동작할 수 있게 해 주기 때문에 컴퓨터에서 리눅스만 사용하는 경우와 비교했을 때 거의 유사한 성능과 기능을 제공해 줄 수 있게된다.

* coLinux는 호스트 OS와 함께 하드웨어를 공유하기 위해 I/O디바이스를 직접 억세스하지 않는다. 대신 호스트 OS에 있는 coLinux 드라이버에 의해 제공되는 에뮬레이트 된 가상 하드웨어를 사용한다. 예를 들면 윈도우의 일반 파일이 coLinux에서는 블럭 디바이스로 사용될 수 있다. 모든 실제 하드웨어 인터럽트는 호스트 OS에 투명하게 전달되기 때문에 호스트 OS가 실제 하드웨어를 제어하는데 아무 방해가 되지 않는다.

* 단 coLinux는 현재 비디오 카드에 대한 가상 어댑터가 없기 때문에 X server를 지원하지 않는다. X 윈도우를 사용하려면 윈도우에서 Cygwin/X, Xming, eXceed, X manager같은 X server를 사용해서 X session을 열어주면 된다. 다른 방법으로는 coLinux에 Xvnc를 실행시키고 윈도우에서 VNC client를 사용할수도 있다.

작업 특성상 리눅스와 윈도우를 같이 사용해야 하는 경우에 coLinux는 훌륭한 선택이 될 수 있을 것이다.

--

coLinux 설치하기

먼저 coLinux사이트로부터 2개의 파일을 다운받아야 한다. 최신버젼의 coLinux-0.7.*.exe파일(이 글을 쓰는 시점의 최신버젼은 coLinux-0.7.3.exe이다.) 과 리눅스 시스템이 pre-install 되어 있는 실제 파일시스템이다. 파일시스템은 여러가지중에 선택할 수 있다.

coLinux-0.7.3.exe를 다운받은 다음 실행해서 설치해 준다. 디폴트 설치 디렉토리는 c:\program files\colinux로 되어 있지만 이걸 c:\colinux로 바꿔주는 것이 좋고 설치하면서는 파일시스템 이미지를 다운받지 않게 해 줘야 한다.

설치가 끝난 다음 c:\colinux 디렉토리를 보면 다음의 파일이 설치되어 있을 것이다.

* colinux-bridged-net-daemon.exe

* colinux-console-fltk.exe

* colinux-console-nt.exe

* colinux-daemon.exe

* colinux-net-daemon.exe

* colinux-slirp-net-daemon.exe

* example.conf

* initrd.gz

* linux.sys

* cofs.txt

* colinux-daemon.txt

* news.txt

* README.txt

* Uninstall.exe

* vmlinux

* vmlinux-modules.tar.gz

* [netdriver]

colinux의 설치가 끝났으면 파일 시스템을 설치해줘야 한다. 여러가지중에 선택할 수 있지만 여기서는 debian을 기준으로 설명하겠다. Sourceforge 사이트에서 다운받을 수 있는 debian root image를 사용하겠다. "Root Filesystem Images - 2.6.x-based" 아래에 있는 "Debian-3.0r0.ext3.1gb.bz2"을 다운받으면 된다. 파일 크기는 18MB로 압축을 풀면 1GB가 된다. 다운받은 파일을 c:\colinux에서 풀어준다. 압축이 풀리면 "Debian-3.0r0.ext3.1gb"이란 파일이 생성된다. 이 이름을 configuration file에 넣어줘야 한다.

파일 시스템의 크기가 작은 경우 toporesize.zip을 이용해서 크기를 늘려줄 수 있다.

다음으로 고정된 크기의 스왑 파일을 만들어 줘야 한다. 이 파일 크기가 스왑 파티션의 용량이 된다. http://gniarf.nerim.net/colinux/swap/에서 적당한 크기(실제 시스템에 꼽혀있는 램 용량정도)의 더미 스왑파일(파일네임의 크기는 MB단위이다)을 다운받아 역시 c:\colinux에서 압축을 풀어주면 된다. 압축을 풀면 swapXXXMb 같은 이름의 파일이 생긴다. 이 이름도 configuration file에 넣어줘야 한다.

Configuration file

coLinux는 configuration file이 필요하다. c:\colinux에 보면 example.conf라는 예제 파일이 있다. 이걸 다른 이름으로 저장(ex. colinux.conf)한 다음 수정해 주면 된다.

# The default kernel

kernel=vmlinux

# File contains the root file system.

cobd0="c:\coLinux\Debian-3.0r0.ext3.1gb"

# Swap device, should be an empty file with 128..512MB.

cobd1="c:\coLinux\swap_512Mb"

# Tell kernel the name of root device

root=/dev/cobd0

# Additional kernel parameters (ro = rootfs mount read only)

ro

# Initrd installs modules into the root file system.

initrd=initrd.gz

# Maximal memory for linux guest

mem=64

# Slirp for internet connection (outgoing)

eth0=slirp

# Tuntap as private network between guest and host on second linux device

eth1=tuntap


configuration file은 기본적으로 위와 같은 내용을 담고 있다. 위에서 압축을 해제한 루트 파일 시스템과 스왑 파일 이름을 변경해주고 colinux가 사용할 메모리 크기를 변경해줘야 한다.

네트웍을 사용하려면 eth0=slirp를 활성화(이 문장 앞의 '#'를 없애준다) 시켜줘야 한다. 또한 인터넷 공유( Internet Sharing)을 위해 TAP-Win32를 사용하려면 eth1=tuntap을 활성화 시켜준다.

모든 변경이 끝났으면 파일을 저장해준다.

네트웍 설정

coLinux의 네트웍카드는 가상 디바이스이기 때문에 coLinux와 다른 네트웍 장치와의 연결 역시 가상의 연결이다. coLinux 모니터는 coLinux OS에 가상 네트웍카드를 제공해주고 다른 디바이스에 연결하기 위해 TAP, winPcap 또는 Slirp를 사용한다. 가상 네트웍 카드가 연결될 수 있는 것들로는 다음이 있다.

  • MS 루프백 어댑터 (winpcap)
  • TAP 가상 어댑터 (TAP)
  • 실제 이더넷 카드 (winpcap)
  • SLIRP 가상 어댑터 (slirp)
가능한 통신 패스로는 다음이 있다.
  • coLinux 가상 네트웍 카드 -> Slirp 가상 네트웍 어댑터 -> LAN (인터넷)
  • coLinux 가상 네트웍 카드 -> MS 루프백 어댑터 (winpcap을 사용해서) -> 호스트 OS
  • coLinux 가상 네트웍 카드 -> TAP 가상 네트웍 어댑터 -> 호스트 OS
  • coLinux 가상 네트웍 카드 -> 실제 이더넷 카드 (winpcap을 사용해서) -> LAN (인터넷)
  • coLinux 가상 네트웍 카드 -> TAP 가상 네트웍 어댑터 -> MS 소프트웨어 브릿지 -> 실제 이더넷 카드 -> LAN (인터넷)
  • coLinux 가상 네트웍 카드 -> TAP 가상 네트웍 어댑터 -> 윈도우 인터넷 연결 공유(ICS) -> 실제 이더넷 카드 -> LAN (인터넷)
  • coLinux 가상 네트웍 카드 -> MS 루프백 어댑터 -> MS 가상 브릿지 -> 무선랜 카드 -> LAN (인터넷)

연결 방법을 성능순으로 보면 WinPCAP 브릿지, TAP 커넥터, Slirp 순이다.

coLinux의 모든 네트웍 카드는 물론 가상 디바이스이다. 때로는 윈도우에서도 추가적인 가상 네트웍 카드를 만들어 주는게 좋을수도 있다. 윈도우 루프백 어댑터는 윈도우에 따라오는 가상 네트웍 어댑터로 아무때나 설치할 수 있다. coLinux 가상 네트웍 카드와 윈도우 루프백 가상 네트웍 카드를 연결하려면 WinPcap을 사용한다. coLinux에 따라오는 TAP 가상 네트웍 카드 소프트웨어는 다른 종류의 가상 네트웍 카드로 역시 윈도우에 설치할 수 있다.

coLinux를 네트웍에 연결하는 가장 쉬운 방법은 coLinux에 따라오는 SLIRP를 사용하는 것이다. 가장 일반적으로 coLinux 가상 네트웍 카드를 실제 네트웍에 연결하는데 사용되는 방법은 WinPcap을 사용하는 것으로 이 경우 coLinux가 DHCP 서버나 홈 라우터에서 IP 어드레스를 요구할 수 있게 해 준다. 또 다른 방법으로는 coLinux 가상 어댑터를 TAP 가상 네트웍 어댑터에 연결해서 네트웍 연결을 공유하기 위해 윈도우 인터넷 연결 공유(ICS)를 사용하는 것이다.

성능향상을 위한 목적으로라면 coLinux OS에 2개의 가상 네트웍 어댑터를 사용하는게 좋다. 하나는 호스트 OS와 직접 연결을 위해 사용하고 다른 하나는 LAN 또는 인터넷 연결에 사용한다. 이 경우 일반적으로 4개의 네트웍 카드가 사용된다는 의미이고 이 중 3개는 가상 네트웍 어댑터이다.

ICS는 NAT의 형태가 된다. NAT는 일부 프로토콜의 동작을 방해하기 때문에 coLinux OS에서 실행되는 서비스를 억세스하기 힘들게 만든다. 네트웍 프로바이더(다이얼-업, DSL, 케이블 모뎀)가 단 한개의 ip 어드레스만 제공하고 홈 라우터가 없는 경우 coLinux를 NAT를 사용해서 실행하면 여러개의 private IP 어드레스가 할당받은 한개의 ip 어드레스를 공유할 수 있게 해 준다.

권장하는 설정

모든 경우에 사용할 수 있는 네트워킹 설정으로는 coLinux에 2개의 가상 어댑터를 사용하는 것이다. 한개의 어댑터는 LAN 또는 인터넷에 연결하고 다른 어댑터는 호스트OS와 고속 연결에 사용한다.

  1. coLinux OS에서 하나의 어댑터는 호스트 OS와의 연결을 위해 설정한다. TAP - 호스트 OS와의 Private 연결 부분을 참조
  2. coLinux OS에서 두번째 어댑터는 인터넷 또는 LAN과 연결을 위해 설정한다. Network#Slirp(쉽고 무선랜과 문제를 덜 일으키지만 느림), Network#WinPcap (복잡한 설정이 필요하고 무선랜과 문제를 일으킬 가능성이 많지만 빠름) 을 참조

* 네트웍 설정 방법에 대해서는 다음 글에서 자세히 설명하도록 하겠다.

coLinux Network 설정하기 (http://techblog.textcube.com/40)