'토막상식'에 관한 글 10건

  1. 2012.06.12 I/O Debugging 1
  2. 2012.03.21 Oracle 성능, Bind Variable, PreparedStatement
  3. 2012.01.05 TextMate, RailsCast의 선택? :-)
  4. 2011.12.27 kpartx, create device mappings for partitions
  5. 2010.02.01 메모리카드 백업, dd, mount,...
  6. 2009.09.15 웹브라우져에서 telnet 프로토콜을 처리하려면
  7. 2009.03.19 HowtoForge에 대한 모질라 검색사이트
  8. 2008.04.29 ssh 빨리 접속하기, pseudo-tty 살리기, ssh로 웹필터 회피하기
  9. 2007.11.12 Ubuntu 7.10 에서 프레임버퍼 콘솔 사용하기 3
  10. 2007.04.17 코덱이란 무엇인가? (원래는: 우리 솔루션이 MPEG를 지원하나요?)

I/O Debugging

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

맨날 리눅스 리눅스 하면서도, 참 아는 게 없다. 어쩌면 Technician 수준. I/O가 마구 치솟는데, 누가 그러는지를 모른다. iotop을 떠올리는데도 한참 시간이 걸렸다. 체득되어있지 않은 게지. iotop을 쓰려고 보니 설치되어 있지 않았다. 준비되어 있지 않은 것이고, ㅎㅎ 시간을 꼭 내서 Admin's Tool을 만들어둬야...

암튼, 다음과 같은 방법으로 대충 바쁜 놈을 잡을 수는 있다. 그런데 정량적으로 뽑기는 거의 불가능한 듯.

[root@skcc-omspap2 ~]# sysctl -w vm.block_dump=1; sleep 3; sysctl -w vm.block_dump=0 [root@skcc-omspap2 ~]# dmesg | more

암튼, 좀 부끄러운...

Oracle 성능, Bind Variable, PreparedStatement

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

매번 볼 때 마다 까먹으니깐 일단 기록.

한참 옛날 이야기지만, 어떤 여성 포털에 당시 일하던 회사에서 서버를 납품한 적이 있었다. LVS로 엮은 웹서버가 한 다섯 대 정도 있었고, DB서버가 8way 였던가? 한 대 들어갔다. 웹 개발 회사에서 납품한 PHP기반의 웹서비스가 돌아가기 위한 환경이었는데, 웹서버는 놀고 있는데 DB 서버의 Load가 50까지 차 올라갔다. (물론, 사이트가 꽤 떴었고, 사용자의 폭발적 증가가 근원적 문제였다. 문제 아닌가? 암튼,)

결국, 여기 저기 파해쳐본 결과, 일단 PHP로 개발된 웹 Application이 수준 이하였던 것이 가장 큰 이유였고, (세션 관리의 부재, 과다한 DB Query 발생 등등) 그 다음은 사용하는 SQL문이 Bind Variable을 사용하지 않는 RAW Statement(어떤 전문 용어가 있는지는 모르겠다.)였다는 것.

일단, PHP의 세션 기능을 이용하도록 Application을 수정하고, DBMS 연동을 위한 shared code를 만들어 사용하게 했고, SQL문을 Bind Variable을 사용하도록 수정했다.

말할 것도 없지만, 결과는 엄청난 Load 감소.

이 과정에서 문제는... DBA들은 문제가 해결되기 전까지 그냥... 시종 일관, DB에는 문제가 없다는 말만 반복했다는 아픈 기억. 그렇지... SQL 문법 오류도 없고 그냥 부하가 많았던 거였지... ㅎ

세월도 흐르고, 장소도 다르지만, 이 오래된 문제는 지금도 있는 듯. 역시, 일단 서버 성능 문제가 부각되겠지만... 암튼, 용어를 기억해두려고.

  • bind variable, PreparedStatement
  • 임시 방편으로, init{SID}.ora 파일에서 CURSOR_SHARING=FORCE 설정
  • DSS나 QUERY REWRITE를 사용할 때에는 사용하지 말라고 함.
prompt
prompt * SQL문 parsing time 구하기
prompt
SELECT NAME, 
 VALUE 
FROM V$SYSSTAT
WHERE NAME = 'parse time cpu'
or NAME = 'parse time elapsed'
or NAME like 'parse count%';

뭐 일단, 여기까지.

'토막상식' 카테고리의 다른 글

I/O Debugging  (1) 2012.06.12
TextMate, RailsCast의 선택? :-)  (0) 2012.01.05
kpartx, create device mappings for partitions  (0) 2011.12.27

TextMate, RailsCast의 선택? :-)

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

이 세상이... TextMate라는 편집기가 있었다. 나만 몰랐나? 엄청 좋아보인다.

뭘 좀 만들다보니, 우연히 RailsCast라는 온라인 비디오 강좌를 보게 되었는데, 강좌 내용보다 먼저 눈에 들어온 것이 강의에서 사용하는 Text Editor 였다. 본래 배우고, 쓰려던 그것은 잠시 잊고, 이 에디터가 뭔지... 궁금증을 풀어야 했다.

찾아봤더니, 이 곳에 RailsCast에 대해 잘 설명되어 있었다. 무슨 도구를 쓰는지, 어떤 TextMate 테마를 쓰는지까지. (http://railscasts.com/about)

그런데 문제는 다른 곳에 있다. TextMate는 MacOS 전용이라는 것. 허거걱!

그래서... "TextMate for Linux"라고 엉뚱한 검색어를 던져봤더니, 역시나 몇 개가 나온다.

  • TextMate for Ubuntu Linux (link)
  • VimMate - TextMate for Linux (link)

이름으로 보면 VimMate가 더 땡기는데, 일단 검색결과 살펴보는 버릇 때문에 (순전히 그 버릇 때문에) TextMate for Ubuntu Linux라고 되어있는 것을 먼저 봤는데, gedit를 TextMate와 유사하게 꾸며주는 또는 동작하게 만들어주는 방법과 플러그인 등이 설명되어 있다.

그럴싸하다. 동작은 사실, TextMate 조차 잘 모르기 때문에... 잘은 모르겠으나, HTML 등을 편집할 때 자동으로 입력을 도와주는 기능 등은 정말... 멋지다! 빠를 뿐만 아니라, 실수도 막아준다.

그런데... 그것 참 이상하지... vim에게 너무 길들여진 나는(그렇다고 vim을 능수능란하게 잘 활용하는 것도 아니면서) 이 환경이 좀 어색하다. 마우스를 찍으면 커서가 옮겨갈테고, 아마도 연신 콜론을 찍어댈텐데... 바꿀 수 있을까?

일단... 설정만 한 상태에서... 그냥 접어뒀다.

다음에 시간이 되면, VimMate를 좀 봐야겠다. 역시 난 이게 어울릴 것 같다.

kpartx, create device mappings for partitions

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

재밌는 프로그램이네. 예전에는 통짜 Disk Image를 loopback으로 마운트하기 위해 partition 시작 위치 찾고 어쩌고... 그랬었던 기억인데, 이 물건이 그런 문제를 참 쉽게 풀어준다. 어디서 얼마나 호환되는지 시험은 안해봤지만, 간단한 시험에는 성공. 괜찮네.

Kpartx can be used to set up device mappings for the partitions of any
partitioned block device. It is part of the Linux multipath-tools.

쓸 일이 있어서 간단히 시험해봤는데,

$ sudo kpartx -v -a sdb.img
add map loop0p1 (252:1): 0 7856128 linear /dev/loop0 8192
$ sudo mount -o ro /dev/mapper/loop0p1 /mnt
$

잘 동작한다. 애용해야겠다.

메모리카드 백업, dd, mount,...

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

디지털 카메라용 메모리카드에서 지워진 파일을 복구해야 할 일이 생겼다. 그런데 어쩌나? 이게 쉽게 끝나지 않네? 그래서 요 얼마 동안 별 짓을 다 해본다.

1. dd 로 일단 백업 받아두기

디스크(또는 메모리카드)에 뭔가 손을 대기 전에 할 일 중 하나가 만약을 위하여 그 원본을 백업해두는 작업이다. 리눅스에서 가장 간단하게, 그리고 원초적으로 블록디바이스(디스크 등)를 백업할 수 있는 방법이 dd를 이용하여 말 그대로 디스크 이미지를 덤프해 두는 것이다.

$ dd if=/dev/sdc of=cf-dump

이렇게 하면 디스크를 통 이미지로 저장할 수 있다. 이렇게 백업해둔 이미지는 반대 방향으로 덤프함으로써 리스토어가 가능하다.

그런데 잠깐, 이렇게 백업한 파일은 디스크의 이미지라서... 내용을 보기 위해서 마운트하려다보니 좀 이상하게 됐다. /dev/sdc에 대응하는 것이 cfcard-backup 인데 /dev/sdc1 등에 대응하는 것은 어떤 것인가? ㅋㅋ 해답은 다음과 같다.

$ fdisk -ul cf-dump
You must set cylinders.
You can do this from the extra functions menu.

Disk cf-dump: 0 MB, 0 bytes
256 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x00000000

Device Boot      Start         End      Blocks   Id  System
cf-dump1  *         63    15857855     7928896+   b  W95 FAT32
Partition 1 has different physical/logical endings:
     phys=(983, 255, 63) logical=(983, 63, 63)
$ 

이렇게 fdisk 명령을 이용하여 첫번째 파티션이 시작되는 섹터의 위치를 찾을 수 있다. 이렇게 찾아진 섹터의 위치는 mount 명령을 내릴 때 offset 옵션을 이용하여 파티션 시작부분을 지정하기 위하여 사용된다.

$ sudo mount -o offset=32256,ro cf-dump /mnt
[sudo] password for sio4: 
$ ls /mnt
dcim
$ 

이렇게, mount 명령에 offset 옵션을 주면 파일의 특정 위치를 건너뛰고 그 위치를 시작으로 하여 파티션/파일시스템 마운트를 진행할 수 있다. 참고로, 다음과 같이 파일, 또는 위치의 정체를 확인할 수 있다.

$ dd if=cf-dump of=part1 skip=63 count=5
5+0 레코드 들어옴
5+0 레코드 나감
2560 바이트 (2.6 kB) 복사됨, 0.0229217 초, 112 kB/초
$ file cf-dump
cf-dump: x86 boot sector; partition 1: ID=0xb, active, starthead 1, startsector 63, 15857793 sectors, code offset 0x0
$ file part1 
part1: x86 boot sector, code offset 0x58, OEM-ID "MSDOS5.0", sectors/cluster 8, Media descriptor 0xf8, heads 255, hidden sectors 63, sectors 15857793 (volumes > 32 MB) , FAT (32 bit), sectors/FAT 15456, serial number 0xe81c0e2d, unlabeled
$ 

위와 같이, cf-dump 파일은 디스크 이미지이고 추출된 part1은 FAT32 파일시스템으로 포맷된 파티션이다.

2. FAT 파일시스템의 복구

FAT 파일시스템에서 파일 목록은 FAT(File Allocation Table) 라고 불리는 지정된 영역에 파일의 목록을 유지/관리하고 있는데, 파일을 지우게 되면 실제의 파일 데이터는 유지한 채, FAT의 파일 목록에서 파일 이름의 첫번째 글짜를 원래의 글자에서 '?'로 바꾸게 된다... 라고 소시쩍에... 한 십 수년 전에 배웠던 것 같다 :-)

그 당시, PCTools 등의 유틸리티를 이용하면 FAT를 직접 편집할 수 있었고, 그렇게 해서 파일을 살리는 작업이 그리 어렵지 않았었던 것 같다. 그런데 이게 웬일? 오히려 십 수년의 발전에도 불구하고! 어찌 FAT를 편집할 수 있는 프로그램을 찾기가 쉽지가 않네...

3. 파일 복구

몇몇 파일 목구 유틸리티를 찾아서 설치하고, 시도해봤지만 일부는 파일을 찾아만 주고 실제로 살리려면 돈내고 사라는 경우도 있었고, 비공식적인 경로로 구한 파일은 엉뚱한 유틸리티이고... ㅋㅋ

결국, 뒤지고 뒤지다가... 국산인 Final Data를 사용하여 파일을 건졌다. 휴~

어디 리눅스용 FAT 편집 프로그램 없을까?

웹브라우져에서 telnet 프로토콜을 처리하려면

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

예전엔 기본이었던것 같은데, 이젠 설정을 따로 해야 하는 것이 되어버렸다. telnet://localhost 이런거 말이다. 그것도 꽤 복잡해졌다.

telnet is not associated

URL에 telnet://hostname을 입력하면 나타나는 경고창 (firefox)

요즘 진행하고 있는 프로젝트 중 하나에서 이 기능을 사용한다. 그래서 간만에 들여다봤다.

* IE7, 활성화하기와 프로그램 지정하기

IE7에서는 아래의 레지스트리 설정(enable-telnet-ie7.reg)을 통하여 telnet 프로토콜 처리를 활성화할 수 있다. 활성화가 되면 기본 처리기인 windows 내장 telnet 프로그램과 연결된다. 그런데 이 기본 telnet 프로그램이라는 것이 그다지 이쁜 녀석은 아니라서 뭔가 다른 설정으로 들 바꿔 쓰게 되는데, 그 작업 역시 레지스트리 설정을 이용하여 할 수 있다. (telnet-handler-putty.reg; 이 설정은 Windows용 공개소프트웨어 터미널 에뮬레이터인 putty를 예로 하였다. 원래대로 돌리려면 telnet-handler-default.reg)

* FF3, 프로토콜 처리기 설정하기

이게... 좀 복잡해졌다. 예전엔 about:config 에서 끝났던 것 같은데... 아무튼, 깔끔한 방법이 없다.

첫번째로 사용 가능한 방법은, 먼저 about:config로 가서(브라우져의 Location 입력 부분에 이렇게 써넣으라는 얘기) "protocol" 등으로 필터링을 해본다. 그러면 몇몇 보기가 나오는데, 그와 유사하게 "network.protocol-handler.app.telnet"라는 문자열 키를 하나 만들고 저장한다. (이상한 일인데, 여기서 값으로 뭔가를 입력하는 것이 무의미하다. 어떤 의미에서 무의미한지 궁금하다면 telnet을 처리하기를 원하는 프로그램을 이 곳에 써 넣어보면 된다.)

그리고 이런 식으로 시험해본다.

(프로토콜 처리기로 지정한 것이 있다면) 지정한 프로그램이 뜨기를 기대했건만,

그런데 이게 왠 대화상자? 헨들러를 지정했음에도 다시 어떤 것을 쓰겠냐고 묻는다. 그래서 "아... 어떤건지는 알겠는데 계속 쓸건지를 묻나?" 하고 "...기억합니다."에 표시하고 "확인"을 누르면 아무런 동작도 이루어지지 않았다. 그래서,

이렇게, 대화상자에서 "실행 프로그램 선택"을 이용하여 아까 입력한 그 프로그램을 다시 지정하면 이번엔 정상적으로, 그리고 반복적으로 해당 프로그램을 외부 프로토콜 처리기로 쓸 수 있게 된다.

좀 이상하지만 더 깊이 따지지는 않겠음.

그런데 어떤 프로그램을 지정할 것인가? 다음의 python 스크립트는 이를 위한 예이다.

#!/usr/bin/python

import sys
import os

try:
    url = sys.argv[1]
    argument = url.split('/')[2].split('@').pop().replace(':', ' ')
except:
    print "url parsing error."
    quit()

command = "xterm -e telnet %s" % argument
os.system(command)


어쨌든, 이렇게 하면 IE7과 FF3에서 telnet://localhost 링크를 사용할 수 있게 된다.

HowtoForge에 대한 모질라 검색사이트

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

IE 역시 그런 기능이 있는 것으로 아는데, 파이어폭스 웹브라우져에는 검색사이트를 추가할 수 있는 기능이 있다. 그리고 "Mycroft  Project"라는 이름의 프로젝트에서 다양한 검색 플러그인을 "검색"할 수 있다.

대체로 원하는 검색사이트는 거의 있는 것 같은데, howtoforge 가 빠져있길래 하나 만들어 넣었다. 만들어 넣는 것도 간단하게 폼을 제공하는데, 가입 등의 절차 없이 간단하게 사이트 플러그인을 추가할 수 있다.

좀 다른 얘기인데, 자신의 사이트에서 제공하는 검색을 사용자가 쉽게 브라우져에 등록할 수 있도록 하기 위해서는 아래와 같은 형식의 내용을 웹페이지에 삽입해 두면 된다.

<link rel="search" type="application/opensearchdescription+xml" title="My Blog" href="opensearch.xml">
참고로, 내가 Mycroft에 올린 단 하나의 검색 플러그인


ssh 빨리 접속하기, pseudo-tty 살리기, ssh로 웹필터 회피하기

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

(요즘 참여하는 프로젝트에 얽힌) 세 가지 이야기.

1. 먼저 ssh 빨리 접속하기 (접속지연 줄이기)

나의 우분투 데스크탑에서 ssh를 사용하여 리눅스 서버에 접속하는데 접속이 좀 느리다. 네트워크 연결은 문제가 없는데 키 확인을 한 후에 로긴 프롬프트가 뜨기까지 대충 5초는 걸리는 것 같다. 게으른 성격 때문에 웬만하면 그냥 참고 쓰겠는데... 작업 성격이 다섯대의 서버에 로그인 하는 대신, 클라이언트에 위치한 배치 명령만 차례로 던져가며 작업하는 상황이라 반복되는 암호 입력 지연이 좀 거슬린다.

'-v' 옵션을 사용하여 확인해보니, "Unspecified GSS failure. ..." 뭐 이런 이야기가 나온다. (나오고 좀 멈춰 있는다.) 오호라... 관련 설정을 ~/.ssh/config에 해주는 것으로 일단 상황 종료.

뭐? 그런 상황이면 "서로 믿고 사는 사회" 만들면 되지 왜 매번 암호를 입력하냐고? 글쎄... 이상하게 그게 더 맘 편하다

아차차! 설정을 빼먹었네.

GSSAPIAuthentication no

참고로, 대체로 이런 현상은 인증 모듈에 의하여 일어나는데, 예전에는 가장 흔한 경우가 DNS 역추적에 명시적으로 빨리 실패하지 못하고 (또는 성공하지 못하고) 찾아보겠다고 헤메는 경우였다.

2. pseudo-tty 살리기

단순히 "ssh user@remote.host" 형태의 명령으로 원격지에 로그인 하는 경우라면, 명령을 수행하는 창, 화면, tty를 이어받아 원격 쉘이 실행된다. 그런데, "ssh user@remote.host top" 이라고 명령해보면,

$ ssh user@remote.host top
user@remote.host's password: 
TERM environment variable not set.

이렇게 화면 기반의 프로그램은 정상적으로 실행되지 않는다. 그런데, '-t' 옵션을 사용하면 원하는 일을 할 수 있다. 원격 로긴 후 항상 같은 화면 기반 프로그램을 띄워야 하는 상황이라면 유용하다.

3. ssh로 웹필터 피하기 (SOCKS proxy)

망할, 점점 상황은 나빠지고 있다. 윈도용으로만 존재하는 특정 네트워크 클라이언트를 설치해야만 네트워크 접속이 되는 환경. 예외처리로 네트워크에는 참여했으나 결국, 웹 접속은 허용되지 않았다. 그러나 얼마나 다행인가? 우리에겐 ssh가 있으니.

ssh -D8080 -fqCN user@proxy.host

위의 명령을 이용하면 일반적인 ssh 서버인 proxy.host를 웹 필터 우회를 위한 대리자로써 사용할 수 있다. -C 명령은 압축을 사용하기 위한 옵션이고 -f는 접속이 되면 프로세스를 백그라운드로 돌리기 위한 옵션이다.

다음과 같은 파이어폭스 설정을 해주면 우회로 설정 끝.

network.proxy.no_proxies_on : localhost, 127.0.0.1, 192.168.10.0/24, .localdomain
network.proxy.socks : localhost
network.proxy.socks_port : 8080
network.proxy.socks.remote_dns : true
network.proxy.socks_version : 5
network.proxy.type : 1

웹 필터 회피를 위한 경우, 또는 누군가 나의 웹생활을 훔쳐보고 있다는 느낌을 지울 수 없다면... :-)


Ubuntu 7.10 에서 프레임버퍼 콘솔 사용하기

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

요즘은 "우분투(Ubuntu)"라는 이름의 배포본을 사용하고 있는데 그럭저럭 맘에 든다. (라이브 CD로부터 ) 설치할 때 아무것도 묻지 않고 그냥 판박이를 만든다는 것이 일단 첫번째 불만이었고 그 외에는 그리 흠잡을 곳이 없는 것 같다. (물론 사용하기 편한 것은 이 배포본의 특성에 의한 부분도 있겠지만 한편 그만큼 리눅스 운영체계가 일반 데스크탑 사용자가 사용하기에 불편함이 없을 정도로 발전한 까닭이 클 것이다.)

프레임버퍼 기반의 시험 공간으로 버추얼박스(VirtualBox)에 게스트로 최신의 7.10 버전을 설치해 보았다. 건드리기 귀찮은 내 시스템을 유지한 채 새 버전을 맛보는 목적도 있지만 본래의 목적은 역시 프레임버퍼용 시험환경 구성이다. 그런데, 부팅 명령행에 "vga=0x315" 항목을 추가하는 것 만으로는 이 녀석이 꿈쩍도 하지 않는 것이 아닌가? 혹시 버추얼박스의 제한? 확인된 내용은 우분투의 뭐랄까... 안전설계에 의한 것인 듯 하다. 다음의 단계에 의하여 설정을 마칠 수 있었다.

1) 부팅 옵션 변경 (일반적인 이야기)

한가지 특기할 부분은, 예전에는 각 메뉴 라인을 편집했었는데 이것이 grub 새 버전의 추가된 기능인지 아니면 우분투의 변종인지는 모르겠으나 모든 메뉴 항목을 위한 기본값(defoptions)의 "한 줄" 지정이 가능하고 그것을 명령을 통하여 각각의 메뉴 항목에 적용하는 기법이 사용되고 있었다.

"defoptions"라는 이름을 찾아 "vga=0x315"라는 값을 추가해줬다. (해상도 800x600의 24bit 모드)

$ sudo vi /boot/grub/menu.list
        add 'vga=0x315' to 'defoptions'
$ sudo update-grub

2) 모듈 설정과 제한 풀어주기

시스템이 initramfs 방식을 사용하고 있으므로... (이건 언제부터 적용된 것인지는 모르겠으나 내가 처음 사용하기 시작한 지난 버전에도 적용되어 있었다. 이 것 이상의 가짜 파일시스템을 이용한 장난들이 재밌게 보이는데, 다음에 시간이 되면...) 다음과 같이 설정파일을 수정하여 필요한 모듈을 넣어줘야 한다. (그런데 이것들이 모듈로 되어있는지는 몰랐었네...)

$ sudo vi /etc/initramfs-tools/module
        add 'fbcon' and 'vesafb'

그러나 이 중 vesafb는 요주의 모듈 목록에 기본으로 들어있었다. 다음처럼, 설정파일을 편집하여 모듈 등록을 거부하지 않도록 해줘야 한다.

$ sudo vi /etc/modprobe.d/blacklist-framebuffer
        disable 'blacklist vesafb'

이제 initrd 이미지를 다시 만들어야 한다.

$ sudo update-initramfs -u

3) 다시 시작

$ sudo reboot

그런데 왠 일인지 이것으로는 모자람...

4) 부팅 스플래시 설정 바꾸기

이렇게 해놓으니 화면은 800x600으로 잡혀 올라오는데 부팅 스플래시와 진행막대가 엉뚱한 위치에 표시된다. 이전의 설정이 1024x768을 기준으로 되어있어서인데... 바로잡자.

$ sudo vi /etc/usplash.conf
        modify 'xres' and 'yres'

물론 램디스크를 다시 만들어줘야 하고, 다시 시작하면 부팅 화면도 깔끔하게 표시된다.

좀 복잡하다. 왜 복잡해졌나? 편의를 돕기 위한 이런 저런 유틸리티, 설정, 뭔가가 더해지다보니 건드려야 하는 부분도 많아지고 복잡해졌다. 일반 사용자도 편하게 사용할 수 있는 뭔가를 만들려면 그 만큼 속으로 복잡해질 수 밖에 없는... 공짜는 없다고나 할까?

리눅스 어렵다는 말이 여기서 나왔나보다.

코덱이란 무엇인가? (원래는: 우리 솔루션이 MPEG를 지원하나요?)

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

싱숭생숭 어수선하다. 에라~ 일단 공부나 하자.

누군가로부터, 이런 질문을 받은 적이 있다. "우리 솔루션이 MPEG를 지원하나요?"

잠깐 딴소리. 이 질문을 받은 것이... 한달도 되지 않았는데 벌써 기억이 가물거린다. 그래서... 그때 그때 써놔야 한다. 누군가는 "그딴 거 천천히 하고 일이나 해" 라고 말한다 해도, 내가 이 시스템 삼총사(계관이, 개관이, 사랑이)를 다른 모든 일보다 먼저 끝내고 싶었던 이유가 거기에 있다. 열심히 일하면 뭐하는가? 지나면 그만인 것을... (그 때) 열심히 설명해줬으나 무슨 소용인가? 누군가 다시 물어본다면 또 다시 열변을 토해야 하는데... 이젠, "사랑이에게 물어보세요"라고 말할 수 있다. 잡설 그만!

MPEG란 무엇인가? 일단 약자가 나왔으니 풀어서 써야지. 예전에 학동들이랑 공부할 때 즐겨 쓰던 말, "약자는 세로로 써보자."

M oving
P icture
E xpert
G roup

뭔소리여? "활동사진 한가닥 동아리"랄까? 동영상 분야에서 뭐 꽤나 뀌는 사람들의 모임. 근본적으로 MPEG라는 말은 그룹의 이름이다. 그러나, 흔히 MPEG라는 표현을 했을 때 그들을 지칭하는 것은 아니겠지. 보통 MPEG라는 표현의 일반적인 의미는 그들이 지정한 "동영상 표준"을 가리킨다. 흔히 얘기하는 MP3 등도 그런 표준의 일부.

그런데, MPEG라는 말은 "동영상 표준"이기는 한데, 두 가지 다른 의미로 사용되고 있다. 하나는, "코덱"으로써의 MPEG이고 다른 하나는 "컨테이너"로써의 MPEG이다. 오늘 하고자 하는 얘기는 바로 이 "코덱"과 "컨테이너"이다.

1. 코덱이란 무엇인가?

코덱이란, 말하자면 문자이다. 알파벳, 한글 등과 같다고 생각하면 된다. 예를 들어, "개소리"를 떠올려보자. 그 느낌이 바로 원본 영상이라면, "멍멍멍", "Bow Wow" 는 인코딩된 파일인 샘이다. 각각 한글과 영문이라는 코덱을 이용하여 인코딩 한 것이다. 물론, 엄밀히 말하자면 위의 예는 '디지타이징' 정도가 적당한 표현이겠다. 위의 예를 다시한번, "3멍", "Ba Wow" 과 같이 표현해보자. 앞의 "3멍"의 경우, 원본에 비하여 그 길이가 줄어있지만 "숫자에 대하여 뒤이은 음절을 그 숫자만큼 반목한다"라는 약속이 있다면, 해석을 거쳐 문자화(수치화; 디지타이징)된 원본을 그대로 복원해낼 수 있다. (무손실 코덱) 또한, 뒤의 "Ba Wow"의 경우, 문자수는 크게 줄지 않았지만 쉽사리 원본과 비슷한 소리를 떠올릴 수 있다. (손실 코덱, 그러나 빠른 디코딩)

잠깐 용어를 정리해보면,

  • 코덱 : 영상/음성을 디지털 신호로 표시하기 위한 약속된 기호, 또는 그 표기 방식
  • 인코딩 : 비압축의 영상/음성을 규약에 의하여 해석 가능한 형태로 재기록하는 행위
  • 디코딩 : 인코딩되어있는 영상/음성을 원 모습으로 되돌리기 위하여 해석하는 행위

MPEG라는 용어는 이런 관점에서, 영상을 위한 MPEG1 Video, MPEG2 Video, MPEG4 Video, MPEG4 Part10 AVC (H.264)등의 영상 코덱을, 또는 음성을 위한 MPEG1 Audio, MPEG2 Audio, MPEG4 AAC 등의 음성 코덱을 싸잡아 부르는 것이거나 그 중 하나를 대충 부르는 것으로 받아들일 수 있다.

2. 컨테이너란 무엇인가?

그럼 컨테이너란 무엇인가? 코덱이 글자라면 컨테이너는 종이이다. 또는 대나무 조각일 수도 있고, 심지어는 손바닥일 수도 있다. 무슨 소리냐면 종이가 글자를 가지런히 적어놓는 "글자의 그릇"이 되듯이, 인코딩된 결과물, 0과 1의 연속된 배열으로 이루어진 그것을 어딘가에 적당한 형태로 담아둬야 하는데, 그 그릇의 역할을 하는 것이 바로 미디어의 컨테이너이다.

MPEG라는 용어가 사용될 때, 위의 "코덱으로 해석하기" 보다 일반적인 것은 바로 "컨테이너로 해석하기"일것 같다. (이 경우, '시스템'이라는 표현이 좀 더 MPEG 스럽긴 하다. MPEG에는 PS라는 파일 저장용 그릇과 TS라는 전송용 그릇이 있다.)

3. RTP란?

말 나온 김에, 그럼 RTP란 소리도 들리던데 그건? 뭐, 딱 이거다라고 하면 거짓말이겠지만, 지금의 문맥상에서 보면 RTP는 "4랑해"라고 적힌 종이를 담은 '봉투'라고나 할까? 연애편지 전문 봉투는 아니지만 어쨌든 연애편지를 담은 이 표준의 봉투는 우편배달부의 손을 거쳐 짝순이의 손에 전달된다. 영상물을 위한 전문 봉투는 아니지만 어쨌든 인코딩된 동영상을 담은 이 표준의 RTP라는 봉투는 네트워크를 거쳐 재생기에게 전달된다.

그 연애편지... 그냥 종이로 주면 안될까? 안돼~ 등기로 부치고 싶으니까! RTP는 그렇다고 등기우편은 아니지만, 일련번호 등의 방법을 이용하여 중간에 빠진 편지가 없는지 검사하는 기능을 가지고 있다.

예전에, 일련번호가 붙어있는 위문/연애편지를 받던 고참이 생각나는군. 참 이상한건, 그 고참은 휴가나갈 때 휴가증을 두 개 챙긴다는 것. 날짜 긴거 하나, 짧은거 하나. 긴건 진짜 휴가증, 짧은건 애인 보고용. 결혼은 했으려나...

그니까 어쩌라고~ 우리 시스템은 MPEG를 지원한다고?

1) 우리 시스템은 '전송' 영역에서 동작하는 것으로, 코덱과는 무관하게 동작할 수 있다. 뭐, 원한다면 MPEG로 압축된 영상도 실어보낼 수 있으니 지원한다고 해야할까?

2) 우리 시스템은 고유의 전송 방식과 파일 형식을 갖는다. MPEG로 말하자면 PS와 TS에 해당하는 무언가가 따로 있는 샘. 그렇다면... 컨테이너로써의 MPEG는 지원하지 않는다고 말할 수 있을까?

3) 고객이 이미 MPEG 영상을 다수 가지고 있고, 이를 서비스하기 위하여 우리를 바라보고 있는 것이라면? 까짓거 MPEG를 우리 솔루션에 맞도록 변환해주면 되는거 아니냐고요~ 이런 과정/행위를 트랜스코딩이라고 하지.

결론적으로, 우리 시스템은 MPEG 기반 시스템은 아니다. 그러나, MPEG 원본에 대한 서비스를 처리할 수는 있다. 라고 주장하면 되나? 그렇게 주장하지 마시고... "이건 됩니까?" 라는 질문 말고 "이걸 원합니다."라는 요구를 들어보고, 요구에 합당한 답을 만들어 드리면 됩니다. 단답식의 답은... 오답일 수 있습니다.