카테고리 보관물: 컴퓨터

넷북 키보드 수리

어느날 부터인가 넷북 < 키가 흔들거리더니, 툭 하고 빠져서 도망가 버렸다.

마침 출장갈 때 연구실 형 빌려준 터라 뒤집어 씌우고, 삼성 센터 가서 수리받았다.
키캡이야 키보드 불량품에서 뜯어오면 되니 자재비도 안 나가고(참고로 키보드 전체교체시 3만원)
서비스정신 투철한(=평가점수에 민감한) AS기사 아찌가 공임도 무상으로 긁어줬다. AS기간 옛날에 끝났는데.

여튼, 문제는 그게 아니고, 마침 센터에 검정색 키캡이 없던 상황이라 이리 만들어줬다는거…

하여 넷북 키보드가 바둑이가 되어버렸다. 나름 유니크하니까 그냥 써야지 ‘ㅅ’

(베리즈를 위한) Orbit Downloader 설정

TL 공개용. 쓰고 안쓰고는 너님 마음이지만, 적용 안 했다가 베리즈에서 하드폭주 사태 일어나면 혼납니다.

1. 다운로드 및 설치
구글에서 검색하세요.

2. 언어설정
아마 처음 시작하면 영어로 점철된 화면을 볼 수 있을겁니다.
View-Language-Korean 설정하면 (발번역 수준의) 한글로 뜹니다. 스샷 생략.

3. 동시 다운로드 설정 끄기
베리즈에서 2개이상 동시 다운로드를 하면 서버가 터집니다.
그러니까 동시 다운로드 설정을 꺼야 합니다.

도구-환경설정에 들어간 후 다음 그림처럼 설정합니다.

다른건 내키는대로 설정하시고, 트레이 풍선 알림은 OFF하는 것을 권장.
다운로드 성공/실패시 알림도 귀찮으면 끕시다.

원본 URL로 접속은 반드시 1로 설정합니다. 하드 버벅임의 주범인 분할 다운로드 OFF.
작업당 최대 접속 수도 1로 설정합니다. DHT 및 미러링 서버에서 분산 다운로드하는건데, 베리즈는 미러링 서버따위 없습니다.

최대 동시 접속 수는 반드시 1로 설정합니다. 동시 다운로드 개수를 1개로 설정.
여타 서버에서 2~3개를 동시에 받는다면 이 값을 늘려주면 됩니다만, 특별한 사유가 없는 한 늘릴 이유가 없습니다.

재시도 횟수[footnote]한자어 조합은 사이시옷을 안 넣지만, 곳간 툇간 숫자 셋방 찻간 횟수 6개는 예외적으로 사이시옷을 넣습니다. 한마디로 발번역[/footnote]는 알아서 설정하시되 너무 큰 값을 넣으면 블럭먹을 수 있으니 알아서 넣습니다.
속도제한은 특별한 이유가 없다면 제한 없음에 체크.

DHT를 이용한 P2P 네트워크입니다. 한 마디로 일반 다운로드를 토런트처럼 P2P로 바꿔주는 기능이긴 한데…
이거 속도향상 거의 없고 자원만 쳐묵합니다. 그냥 끕니다. 이거 활용하느니 그냥 토런트로 받으세요.

나머지 설정은 다운로드와는 크게 상관 없는 항목들이니, 내키는대로 설정하면 됩니다.

Azurea 단축키 일람

윈모용 트위터 클라이언트는 몇 되지 않지만, 그 중 하나를 꼽으라면 단연 Azurea를 꼽을 수 있겠다.
속도 빠르고, 댓글 트래킹이 정말 편리하며, 다양한 단축키를 지원해서 쿼티 키패드 장착모델은 정말 편하게 사용할 수 있다.
다만 Twitpic 등 외부 프로그램 연계가 조금 부실한 편.

그리고 Azurea는 윈도우 용도 존재(Azurea for Windows 1.3.1 다운로드 링크)한다.
같은 코드를 단지 윈도우 용으로 컴파일해 둔 거라 단축키나 설정창까지 완전히 같으며, 설정파일까지 윈도우용과 윈모용이 호환된다 -_-

여튼, Azurea에서 사용되는 단축키 일람. 스마트폰에서도 같은 단축키를 그대로 사용한다.

기본 조작 및 항목 이동
Enter/Action 트윗 입력창 열기, 알림창 닫기.
Action 키는 스마트폰에만 달려 있다
Action 길게, V 팝업메뉴 띄우기. Action 키는 스마트폰에만 달려 있다.
HJKL 순서대로 ←↓↑→. 어디서 많이 본 단축키 아닌가?
P Top. 현재 목록의 가장 위로 올라간다.
B Bottom. 현재 목록의 가장 아래로 내려간다.
트윗 작성 및 받아오기
U 트윗 입력창 열기
R, E Reply. 선택된 트윗 작성자에게 멘션을 날린다.
W Quoted Tweet. 현재 선택된 트윗을 인용한다.
T API Retweet. API 리트윗 기능을 사용하며 편집은 불가.
D Direct messge. 선택된 트윗 작성자에게 DM을 보낸다.
O, Space Refresh. 새로 등록된 트윗을 받아온다.
M More. 과거 트윗을 추가로 받아온다.
F Favorite. 선택된 트윗을 즐겨찾기에 추가/제거한다.
숫자키(PC 키패드는 사용 안 됨)
1 Timeline 보기
2 Mention 보기
3 Direct Message 보기
6 API Retweet. T와 동일하다.
7 Top. P와 동일하다.
9 Bottom. 9와 동일하다.
0 Favorite. F와 동일하다.
* Refresh. O와 동일하며 스마트폰 전용이다.
# More. M과 동일하며 스마트폰 전용이다.

NTFS Hard link, Junction, Symbolic Link

리눅스 저널링 시스템과 비슷하게, NTFS에서도 하드 링크, 심볼릭 링크 등을 지원한다. 그것도 이미 윈도우 2000때부터 지원했던 모양.
물론 거의 묻혀있던 기능이지만, Vista 들어서 UAC 가상화를 지원하면서부터 매우 중요하게 사용되고 있다.

각설 대충 간단히 설명하면 다음과 같다.

펼쳐라

* Hard link : 리눅스의 그것과 정확하게 같은 기능을 한다. 파일에 대한 접근점(Entry point)을 추가로 생성한다.
하드 링크는 같은 파일의 서로 다른 이름이므로, 하나를 삭제(=Unlink)해도 다른 하드 링크가 남아있는 한 파일은 살아 있다.
파일 접근점은 데이터와 같은 볼륨에 존재해야 한다. 다른 볼륨의 파일을 가리키는 하드 링크는 만들 수 없다는 이야기.

* Symbolic link : 리눅스의 그것과 정확하게 같은 기능을 한다. 실은 유닉스 시스템과의 호환성 때문에 Vista 들어서 지원된 기능.
리눅스와 마찬가지로 심볼릭 링크는 대상 확인을 하지 않는다. 존재하지 않는 파일/폴더에 대한 심볼릭 링크 작성도 가능하다.
다만, 리눅스와는 달리 대상을 파일 자격으로 가리키는 <SYMLINK>, 폴더 자격으로 가리키는 <SYMLINKD>를 구분하여 사용한다.
폴더를 <SYMLINK>로 링크하면? 안 열린다. 반대도 마찬가지.

* Junction or Soft link : 역할은 <SYMLINKD>와 유사. 폴더에만 사용할 수 있으며, 정식 번역도 “폴더 교차점”이다.
하드 링크와 달리 다른 볼륨의 폴더를 가리킬 수도 있다. Vista 이전에는 심볼릭 링크가 없었으니 교차점을 사용해야 했다.
교차점은 NTFS 고유의 기능이므로, NTFS 폴더만 가르킬 수 있다. 네트워크 폴더에는 사용할 수 없다는 의미이다.
(심볼릭 링크는 네트워크 폴더에도 사용 가능.)

접어라

문제는, 윈도우 2000이나 XP에 포함된 윈도우 탐색기는 이 기능들을 제대로 지원 못한다.
하드 링크야 그렇다손 쳐도, 교차점을 삭제하면 재귀적 삭제를 돌면서 원본 데이터를 날려먹는 문제가 있다. 자료 날려먹기 딱 좋은 기능.
이게 Vista 들어서부터 교차점을 제대로 인식하게 되었고, UAC 구현의 핵심으로 작용하게 된다.
UAC는 결국 프로그램을 모래상자 위에서 돌리는 기능인데, Application Data 폴더를 교차점으로 지정함으로써 이를 구현하게 된 것.

물론 일반 사용자는 이런거 신경쓸 일은 없을 것이다.
나처럼 여러 하드디스크에 데이터가 널려 있는 경우 딱히 지랄지랄 안 하고도 한 폴더에 모아서 관리하는 정도에나 쓸만한 기능이다.

만약 이러한 기능에 흥미가 있다면, 가급적 심볼릭 링크를 사용하는 것을 권한다.
하드 링크는 파일 관리가 복잡해지기 때문에 거의 사용하지 않으며, 교차점은 XP에서 파일 날려먹을 가능성이 있다.
물론 심볼릭 링크는 XP에서 아예 지원을 못하지만, 적어도 잘못 지워서 파일 날려먹는 것보다는 나을 테니까 뭐.

… 단축 아이콘(Windows Shortcut)과 차이점이 뭐냐고?
그럼 넌 이런 기능 몰라도 된다. 그냥 단축 아이콘 써라.

32bit, 4GB, 램디스크.

컴퓨터 구조라는 수업을 들어보면, 현재 x86 아키텍쳐에서 주변장치들은 메모리처럼 특정 주소에 매핑된다는 것을 알 수 있다.
물론 이 부분은 사용자는 건들 수 없고, 커널 수준에서 관리를 하게 된다. 드라이버는 커널에서 주소를 받아다가 하드웨어하고 통신하는거고.

근데 안타까운 것은, 32bit OS에서 메모리 4GB를 설치하는 경우, 이 공간이 불가피하게 메모리와 겹치면서, 일부 메모리를 사용할 수 없다는 것이다.
이게 용량이 작으면 그냥 넘어가겠는데, 그래픽카드 및 기타 주변장치에 따라서 적게는 200MB에서 크게는 1GB가 넘는 공간을 뺏긴다.
나도 4GB를 물렸지만, 실사용 공간은 3.25GB밖에 안 된다.

물론 64bit OS를 설치하면 이 문제는 말끔하게 해결된다. 헌데 PAE를 활성화하고 상용 툴을 이용하면, 32bit OS에서도 이렇게 묻힌 부분을 램디스크로 재활용할 수 있다는 글이 꽤 전부터 심심치 않게 올라오고 있다. 그리고 실제로 해보면 되는 것 같다. 사용가능한 공간은 2GB로 유지되면서, 2GB짜리 램디스크가 잡힌다.
근데, 이게 과연 안정적일까…?

우선 2GB인 경우부터 살펴보자.

2GB 메모리인 경우.

대충 개념도이다. 가로 전체는 8GB 공간을 나타내는데, XP/Vista/Win7 32bit는 메모리 주소공간 4GB 이상을 관리할 수 없다.
어쨌든, 물리적 메모리와 커널 예약공간은 서로 멀찍이 떨어져 있다. 연속적으로 존재할 수도 있겠으나, 개념적으로는 차이가 없다.
어쨌든 메모리가 2GB인 경우, 커널 예약공간이 2GB를 넘나드는 미친 경우[footnote]그래픽카드 메모리가 1.5GB 정도면 가능할 수도 있다… 오 쉣.[/footnote]가 아닌 이상 물리적 메모리와 커널 예약공간이 겹쳐서 손해볼 일은 발생하지 않는다.

자 이제, 4GB인 경우를 살펴보자. 단, PAE를 켜지는 않은 경우이다.

4GB, noPAE인 경우.

안타깝지만, 이 경우 커널 예약공간때문에 일부 물리적 메모리가 가려지는 것을 볼 수 있다. 안타깝지만, 저 공간은 못 쓴다.

그런데 PAE를 켜면 문제가 좀 복잡해진다.

4GB, PAE인 경우

일단 PAE를 켜면 BIOS나 OS에서 4GB 경계는 없어진다. 색이 옅게 표시되었음을 잘 보도록.

그런데, 이렇게 4GB 경계가 없어졌을 때 커널 예약공간은 어떻게 되는가? 라는 의문이 생긴다.
1과 같은 경우라면 물리적 메모리와 겹치는 부분이 없으니 4GB를 온전히 쓸 수 있을 것이고, 그 중 일부를 램디스크로 잡아도 문제가 없을 것이다.
2와 같다면? 단지 주소공간의 4GB 경계만 없어졌을 뿐, 실질적으로 PAE를 껐을 때와 차이는 없다. 다만 저 상태로 그냥 램디스크를 쓴다면 시스템 불안정을 초래할 수 있다. 윈도우로 말하자면 BSOD, 리눅스라면 커널 패닉.

불행하게도 XP 32bit는 2처럼 작동하는 것 같다. 하여 램디스크로 커널 예약공간을 당겨다 쓰는 것을 추천할 수 없다. 뭐 쓰겠다면 말리지는 않겠지만, 뒷감당은 스스로 하면 된다.
신뢰할 수 있는 정보는 아니지만, 서버 2008 32bit는 PAE를 켰을 때 64GB까지 지원하며, 4GB 장착상태에서 1처럼 작동한다고 한다. 64bit로 넘어가기는 꺼려지는데 메모리가 아까운 사람이라면 서버 2008을 써 보는것도 나쁘지는 않을 듯 하다. 물론 라이센스 구하기가 힘들다.

여기서 한 발짝 더 나가서, 8GB라면 어떻게 될까? 물론 PAE를 켠 상황이 되겠다. PAE를 끄면 4GB 이상은 접근조차 못한다.

8GB 메모리인 경우.

램디스크 부분을 제외하면, XP 32bit에서 메모리는 저런 식으로 할당되게 된다. 실제 사용가능한 부분은 짙은 파란색으로 표시된 부분이며, 그 중 일부가 커널 예약공간으로 할당된다. 옅은 파란색으로 표시된 부분은 비관리 공간(Unmanaged area)이라고 하며, BIOS에서는 인식되지만 OS 수준에서 관리하지 않으므로 사용할 수 없다[footnote]물론 특수한 API를 사용하면 사용가능할 수 있다고는 하지만, 일반적으로 사용하는 WIN32 API에서는 안 된다.[/footnote].
그렇다면, 그림에 긁어둔 것처럼 저 부분을 램디스크로 사용할 수 있지 않을까? 글쎄 아직 테스트를 안 해봐서 모르겠다. 내 컴퓨터는 4GB 밖에 안 물려둬서… 혹시 누가 테스트 가능하다면 결과를 보고해주기 바란다. 또, 위에서 언급했다시피 서버 2008은 8GB 전부를 관리한다. 64GB까지 지원하므로 메모리가 아까우면 그 쪽으로 넘어가면 되겠다. 아니면 64bit OS를 사용하던지.

배열, 포인터, 배열 포인터, 그 미묘한 상관관계

대체로 C/C++에서 배열과 포인터 부분이 어려운 부분이라는 점은 대부분 공감하는 사실이다.
나 또한 이 부분이 어렵고, 이해 안 되고, 쓰기 싫어서 대체로 외면하곤 한다. 속도 최적화와는 거리가 좀 있는 분야를 다루고 있기도 하고.

헌데 이런저런 사정 – 물론 쓰잘데기 없는 것이긴 하지만 – 이 좀 있어서 배열과 포인터에 관련된 내용을 찾아보았다.
일단 VC++ 2005에서 돌려본 것이니, 적어도 틀린 것은 아닐 것이다.

1. 문제의 시작

펼쳐!

꽤 근래에 디스어셈블로 비교해 본 것이기도 하지만, 근본적으로 배열이나 포인터나 다를 것은 없다.

int a[3];
(…)
a[i] = 3;
*(a+i) = 3;

위 두 코드는, 디스어셈블 뜯어보면 똑같은 코드가 나온다는 이야기.

이제 형식상의 문제인데, C 수업을 착실히 들은 사람은 알겠지만 a[i]라는 배열에서 a는 첫 번째 원소의 주소를 나타내는 포인터 상수[footnote]int * const. 틀리면 댓글주셈.[/footnote]라고 하였다.
자 그렇다면, &a 는 무엇을 나타낼까?

컴파일을 해 봐도, &a는 틀린거야! 라면서 오류를 뿜어내지는 않는다. 그 값을 출력해도 a와 다를 것은 없다.
그런데, 이상하게도

int a[3];
int *p1 = a;
int *p2 = &a;

라는 코드를 실행하면, 세 번째 줄에서 오류를 내뿜는다.
그렇다면, & 연산자는 주소 연산자니까 * 를 하나 더 붙이면 될까…??

int a[3];
int *p1 = a;
int **p2 = &a;

한 번 돌려보자. 역시나 오류를 내뿜는다. 아ㅅㅂ 뭐가 문제야.

접어!

2. 작은 결론

펼쳐!

오랜시간 뒤적이지는 않았지만, 여튼 내가 내린 결론은
“& 연산자가 반환하는 주소는 형태가 좀 지랄같다.”
이다. 정확하게는
“& 연산자는, 피연산자를 하나의 원소로 갖는 가상의 배열에서, 피연산자가 위치하는 부분의 시작주소”
를 반환한다. 아ㅅㅂ 거 조낸 복잡하네.

예를 들어서…

int data;
&data; // 형식이 뭔데?

를 생각해 보자.
data는 그냥 int형이 되겠다. 따라서 &data는

{ int, int, int, …, int, int data, int, …, int, int, int }

라는 가상의 배열에서 data의 위치이다.
자, 이런 배열을 만들려면 뭘 써야 하는가? 당연히 int * 지.

이제 좀 더 가보자.

int a[3]; // 이번엔 배열이다.
&a[0]; // 이건 뭐야…
a; // 이건 왠지 알거같아…
&a; // 이건 또 뭐고.

자 우선. &a[0]. 연산자 우선순위상 [] 가 먼저 연산되니까, &의 피연산자는 int형이다.
또 쓰기 귀찮다. 결국 위에서 본 data와 경우가 같다. 형태는 int *.

다음은 a. 이건 수업시간에 들은 것처럼 첫 번째 원소의 주소, 그러니까 &a[0] 인 것은 확실하다…
그런데 뭔가 미묘하게 다르다. 이놈의 자료형은 int [3] 이다. 응?
이 말은 무슨 말이냐면, “int *와 비슷하긴 한데[footnote]실제로는 int * const 에 해당한다. 배열 주소가 바뀔 수는 없으니까…[/footnote], 길이가 3으로 명백해!” 라는 의미이다. 아ㅅㅂ 머리아프다.

여하튼 여기에서 체크해 두어야 할 것은, 배열도 결국에는 유도 자료형이라는 말이다.
int a[3] 은 “int형 3개를 원소로 갖는 배열 a를 만들어!” 가 아니고, “int형 3개를 이어붙인 배열구조를 갖는 변수 a를 만들어!” 라는 의미다.
아아… C 배운지 3년찍고 4년만에 겨우 이해했다. 변수가 배열이 아니라, 배열 형태를 갖는 변수다. ㅅㅂ 무슨소리래.

어쨌든 마지막, &a. &의 피연산자 형태는? int [3]인 배열이다. 그렇다면 다음과 같이 되겠다.

{ {int, int, int}, {int, int, int}, …, {int, int, int}, {a[0], a[1], a[2]}, {int, int, int}, …, {int, int, int}, {int, int, int} }

라는 배열에서 a 배열의 위치란 말이지. 반환형은? “int 3개를 이어붙인 구조의 배열” 형태의 변수를 가리키는 포인터, 즉 int (*)[3] 이다.
아ㅅㅂ 복잡하다… 이건 또 뭐여… 하겠지만, 그냥 납득해라. 글쓰는 나도 뭔소린지 제대로 모르겠다.
일단은, int 3개짜리 배열을 통짜로 가리키는 포인터라고만 알아두면 되겠다. 이 말을 이해했다면 이 글을 읽을 필요도 없는거고…

참고로, 포인터를 그 맴버로 갖는 배열과, 배열 자체를 가리키는 포인터 하나를 구분하기 위하여 다음과 같은 방법을 사용한다.

포인터를 맴버로 갖는 배열 : int *p[n] : int형 포인터 n개 모인 새로운 자료형을 갖는 변수 p.
배열 자체를 가리키는 포인터 : int (*p)[n] : int형 n개가 모인 자료형을 가리키는 포인터 p.

구분 참 지랄같지만, 여튼 둘이 다르다는 것만 이해해 두자. 참고로 이런 구분방식은 함수 포인터에서도 나온다. 젭라…

그렇담 &&a 도 있을 수 있지 않을까? 미안하지만 그딴건 없다 -.- 대신 int (**)[3] 은 있다.

접어!

3. 머리아픈 문제

펼쳐!

문제는 이중 배열이다. 이제부터 고민할 내용은 이거다.

int a[2][3];

이제부터 &a, a, &a[0], a[0], &a[0][0], a[0][0] 여섯 개를 다 살펴보아야 한다.
불친절하게도 그림이 없으니, 알아서 메모지에 그림 그리면서 판단하면 되겠다.
일단 배열구조는 다음과 같겠지.

{ {n00, n01, n02} {n10 n11 n12} }

1. a[0][0]
이건 간단하다. n00 자체를 가리킨다.

2. &a[0][0]
&의 피연산자는? int 형이다. 따라서 다음과 같겠다.

{ int, int, …, int, n00, n01, n02, n10, n11, n12, int, …, int, int }

하여 형태는 int * 되시겠다.

3. a[0]
a[0]은 무엇을 가리키는가…?? a 배열의 첫 번째 원소일 것이다.
그렇다면 a 배열의 첫 번째 원소는 무엇인가? 이중 배열의 첫 번째 원소이니, 그냥 1차원 배열이다.
가리키는 대상은 {n00, n01, n02} 이고, 그 형태는 int [3]이다.

4. &a[0]
&의 피연산자는? 위에서 본 것처럼 int [3]형이다. 따라서…

{ {int, int, int}, {int, int, int}, …, {n00, n01, n02}, {n10, n11, n12}, {int, int, int}, …, {int, int, int} }

가 된다. 반환형은? 당연히 int (*)[3].

5. a
a는 위에서 살펴본 바, 이중배열 전체를 다 가리키는 것이 분명하다.
이제는 좀 보이겠지. 형태도 int [2][3] 이다.

6. &a
그리기 귀찮다. 이쯤 되면 보일게다.
형태는 int (*)[2][3].

접어!

이 정도면 뭐 대충 감잡았을지도 모르겠다.

물론 나도 제대로 이해한 것은 아니지만, 어쨌든 무언가 다르게 보이기 시작했다. 그리고 머리가 좀 더 아파지기 시작했고.
어쨌든 본문 내용을 한 줄로 줄이면, “포인터 ㅅㅂ 조낸 어려워.”

… 쓰고 나서 보니까 내용이 영 지저분하다. 나중에 시간나면 정리해야지.

HV3 파일의 구조

세 번째 연타로 쓰는 HV3 시리즈.
혹시라도 HV3 파일 파서나 여튼 비슷한 작업을 하고 싶은 사람(있을지는 모르겠지만…)은 사용하면 좋을 것이다.

단순히 HV3 파일을 풀어주는게 필요한 사람은 이쪽을 보면 된다.
http://koasing.tistory.com/116

1. Container & Attribute 구조

Kipple. 씨는 HV3 구조가 XML과 비슷하다고 하였다.
그런데 난 XML 구조를 모른다 -.- 전공도 아니고 아직까지 써 본 적도 없으니까.

각설, 여튼 HV3 구조를 설명하기 전에 컨테이너와 속성의 구조를 설명하겠다.
(개념이 아니다. 개념은 안드로메다네이버 사전에서 검색해보는게 빠를 것이다.)
(뭐 이 문서를 이해할 정도의 수준이라면 이미 저 둘의 개념 정도는 잡혀 있겠지…)

모든 데이터는 Little Endian으로 기록된다. 어짜피 PC에서 사용할 목적이라 그런 것 같다.

1. 컨테이너
컨테이너는 데이터를 구분하는 단위이며, 파일 데이터를 제외한 모든 정보는 컨테이너의 속성 부분에 기록된다.

char TYPE[4] : 컨테이너 종류를 기술하는 매직 워드이다. Null Termination은 사용하지 않는다.
int ATTRIBUTE_LENGTH : 속성 필드의 전체 길이를 기술한다. 각 속성들의 헤더 길이도 포함한다.
int CONTAINER_LENGTH : 하위 컨테이너들의 전체 길이를 기술한다. 각 컨테이너들의 헤더 길이도 포함한다.
int RAW_DATA_LENGTH : 속성이나 컨테이너가 아닌, 진짜 막바로 저장되는 데이터의 길이이다.
char ATTRIBUTES[ATTRIBUTE_LENGTH] : 이 컨테이너의 속성 필드들이 기록된다.
char CONTAINERS[CONTAINER_LENGTH] : 이 컨테이너의 하위 컨테이너들이 기록된다.
char RAW_DATA[RAW_DATA_LENGTH] : 이 컨테이너에 속하는 데이터가 기록된다.

이 때 ATTRIBUTE_LENGTH, CONTAINER_LENGTH는 기록되는 전체 길이, 즉 속성과 하위 컨테이너의 헤더 길이를 포함함에 주의해야 한다.

2. 속성
속성은 컨테이너에 속하는 데이터 중 정형화되어 있는 데이터를 말한다. 하나의 컨테이너는 여러 개의 속성을 가질 수 있으며, 속성 헤더에 각 속성의 종류와 길이를 저장함으로써 데이터를 구분한다.
데이터로 문자열을 저장할 때 반드시 Null Termination을 사용하는 것 같지는 않다. 하지만 가급적 써 주는 것이 디코더의 호환성 문제를 해결하는데 도움이 될 것이다. 또한 문자열 저장에는 UTF-16LE를 사용한다. 뭔지 모르겠다고? Just google it.

char TYPE[4] : 속성 종류를 기술하는 매직 워드이다. Null Termination은 사용하지 않는다.
int LENGTH : 속성 데이터의 길이를 기록한다. TYPE, LENGTH는 계산에 넣지 않으며 순수 데이터의 길이만 기록한다.
char DATA[LENGTH] : 이 속성의 데이터를 기록한다.


2. Container & Attribute 목록

현재까지 알려진 컨테이너와 속성의 TYPE 목록이다. 꿀뷰가 업그레이드됨에 따라서 추가되는 필드가 존재할 수 있으며, 보고되는 대로 업데이트할 지는 모른다(…) 내키면 하고 아니면 말고.
XML에 해당하는 만큼, 컨테이너와 속성 순서는 아마 바뀌어도 상관 없을 것 같지만, 테스트해 보지는 않았다. 가급적 이 문서에 있는 순서를 지키도록 한다. 또, 매직 워드는 대문자로 기록하도록 한다. 역시 소문자로 바꿔서 테스트해 보지는 않았다. 데이터가 없는 경우에는 컨테이너나 속성을 기록하지 않는다. 기록했을 때의 동작여부 또한 테스트해 보지 않았다.

HV30 c HV3 파일 최상위 컨테이너이다.
VERS a HV3 버전을 저장한다. 현재는 HV3Maker의 버전을 대신 사용한다.
FSIZ a HV3 파일의 전체 크기를 저장한다. 스트리밍때 필요한 듯.
HEAD c 헤더 데이터 컨테이너
GUID a Global Unique ID
UUID a Univiersal Unique ID
FTIM a File Timestamp
DIRE a 제본방향. int형 데이터로 1=좌->우(국내 출판방식) 2=좌<-우(일본 출판방식)
TITL a 제목
ISBN a ISBN을 저장한다. 문자열로 저장하므로 주의할 것.
WRTR a 작가
PUBL a 출판사
DATE a 출판일
GENR a 장르
COPY a 저작권 표기
LINK a 웹 링크 데이터가 있다면 URI를 기록한다.
MAKR a HV3 포맷으로 만든 사람
COMT a 기타 코멘트
LIST c 파일 리스트 컨테이너
FINF c 파일 하나의 정보를 저장하는 컨테이너
NAME a 파일 이름. 상대 경로를 포함할 수 있다.
POS4 a HV3 파일 내에서의 절대 위치. FILE 컨테이너의 시작부분을 가리킨다.
SIZE a 파일 크기. FILE 컨테이너의 크기가 아니므로 주의할 것.
CRC3 a CRC32 데이터
MTIM a File Timestamp
BODY c 파일 전체를 담는 컨테이너
FILE c 하나의 파일을 담는 컨테이너. RAW_DATA로 이미지 파일을 담는다.

HV3 해제기 윈도우판

사용자 삽입 이미지

이런게 필요할까.

불쌍한 중생들을 위한 구제책

사용자 삽입 이미지

뭐냐이건 대체.

찾아서 풀던 끌어다 두던 폴더 하나 만들어서 알아서 풀어줍니다.
HV3는 풀고 싶은데 술집 사기는 싫은 사람이 쓰면 적절합니다.

hv3decwin.zip

프로그램을 다운로드받기 전에,
1) 관련 법령
2) 아래에서 기술할 저작권 및 재배포 관련 안내
위 둘을 숙지하시고, 이를 준수하여 건전한 목적으로 프로그램을 사용함에 동의하는 경우에만 다운로드받으시기 바랍니다.

1. 저작권 및 재배포 관련 안내.

펼쳐라

프로그램 저작권과 HV3 형식으로 기록된 저작물의 저작권은 상호독립적이며, 어떠한 경우에도 프로그램의 저작권으로 인하여 HV3 형식으로 기록된 저작물의 저작권이 변경, 소멸되거나 제한될 수 없습니다.
즉, 저작권자가 풀지 말라고 한 HV3 파일은 풀면 안 됩니다. 대표적으로 암호화된 HV3 파일이 이에 해당하지만 반드시 이 방법만을 사용해야 하는 것은 아닙니다.

1. 프로그램 저작권은 나에게 있음. 따라서 어디 가서 “내가 만들었네”라고 구라치면 혼납니다.

2. 비영리 목적의 재배포는 자유이지만, 업로드된 압축파일 그대로 배포해야 합니다.
2. 또한, 재배포시 이 포스팅의 절대주소 링크를 연결해 둘 것을 권장합니다.
2. 절대주소는 http://koasing.tistory.com/116 입니다.

3. 저작권자의 명시적인 허가가 없는 한, 어떠한 이유던 영리적 목적의 활용을 금지합니다.
3. 특히 웹하드, P2P 서비스 등 다운로드에 요금을 지불해야 하는 서비스를 이용한 배포를 명시적으로 금지합니다.
3. 클럽박스, 푸르나 등 일부유료와 무료 서비스를 병행하는 서비스 또한 배포를 금지합니다.

4. 프로그램의 비상식적인 사용, 리소스 편집기를 이용한 편집행위 등을 금지합니다.
4. 외국어 사본이 필요한 경우, 저작권자에게 직접 요청하십시오.
4. If you want english or another language version, please leave a comment.

접어라

2. 사용시 주의점

펼쳐라

1. 중복파일 검사
중복파일 검사는 안 합니다. 귀찮아서 안 넣었습니다.
하위폴더를 만들도록 했지만, 이건 여러 파일 풀 때 서로 엉키는 것을 막으려는 목적이 더 큽니다.
암만 잉잉거려봐야 한 번 황천길로 떠난 자료는 안 돌아오니, 미리 백업해 두시기 바랍니다.

2. 오류검사 관련
파일이 HV3 인지 검사하는 알고리즘이 매우 취약합니다. 막 넣으면 그냥 죽어버립니다.
파일 오류검사도 안 합니다. 일단 CRC 필드는 있지만, 역시 귀찮아서 안 넣었습니다.
풀었는데 깨지더라, 그러면 그냥 다시 받는게 빠릅니다. CRC만으로는 복원 못합니다.

3. 끌어다 놓기 관련
일단 여러 파일을 끌어다 두면 각각 폴더 만들어서 알아서 풀어줍니다.
다만 MFC는 그닥 다뤄본 적이 없으므로 잘 작동한다고 장담은 못합니다.

4. 암호화된 파일
HV3 구조상 암호화된 파일을 구분할 방법이 없으며, 복호화 알고리즘도 구현 안했습니다.
암호화되어 저장된 파일도 그냥 풀어버리니, 열어봐서 안 열리면 그냥 깨진파일이라고 받아들이면 됩니다.
꼬우면 직접 푸는 방법 찾아서 만들어도 됩니다.

5. 그 외에
이 프로그램은 내키지 않으면 버전업 안합니다. 딱히 손댈 구석도 안 보이고, 귀찮기 때문입니다.
다만 소스공개는 안 합니다. 내맘대로임.
HV3 파일의 구조는 나중에 내키면 긁어볼 예정입니다만, 언제가 될지는 모릅니다.

접어라

HV3 해제기

윈도우판 나왔음. http://koasing.tistory.com/116 참고하세요.

hv4dec.zip

파일명이 HV4인 이유는, 버전을 착각해서일 뿐(…)입니다.

Kipple.씨가 만든 꿀뷰라는 프로그램은 꽤나 유명한 이미지 보기 프로그램입니다.
꿀뷰가 버전 3으로 업그레이드되면서 이런저런 변화가 생겼지만, 대표적인 것이 HV3 라는 전용 포맷을 도입했다는 점입니다.
그런데 꿀뷰가 이 바닥에서나 유명한 탓에, HV3을 풀어주는 프로그램이 없는 실정.

물론 Kipple.씨가 만든 다른 프로그램인 술집에서 풀기를 지원하지만, 이건 천원짜리 유료 프로그램인 탓에 사용 저항이 큽니다.
여튼 한 번쯤 뜯어볼까 하던 차에, 파코즈 쪽에서 마침 논란이 되어 만들어 봤습니다.

주의사항.

펼쳐라

1. 프로그램은 콘솔에서 작동합니다. 첫 번째 인자로 hv3 파일명을 넣어주면 됩니다.
2. 상용 버전은 아니고 그냥 간단히 짠 것이기 때문에, 경우에 따라서는 불안정하게 작동할 수 있습니다.
2. (대표적으로, 필드에 일본어가 들어가 있으면 출력이 깨집니다. 물론 파일은 잘 나옵니다 -_-;;;)
3. 개발환경은 VS2005이며, 실행에 닷넷 프레임워크 2.0이 필요할 수 있습니다.
4. 고착화된거 푸는 방법도 찾았지만, 개발의도를 존중해서 구현하지는 않았습니다.
4. 정 필요하시면 직접 분석하고 만들어서 혼자 쓰시면 되겠습니다.

접어라

pe.kr 도메인, 쓰는 방법 알아보자.

지난 11일부터 네이버에서 선착순 5만명에게 pe.kr 도메인을 무료로 주고 있습니다.
조만간 오픈할 개인도메인설정 기능에 앞서 도메인선점 차원에서 미리 등록하라고 하는 것입니다.
참고로 이는 티스토리에서는 이미 2차주소 기능으로 제공중에 있습니다. 도메인만 따로 구입해야 하지요.

하여 도메인을 등록해 두기는 했는데, 이를 제대로 블로그에 연결하려면 공부를 좀 해야 합니다.
어떻게 사람이 정한 영문자열(도메인)을 가지고 내 블로그가 저장된 서버로 연결하는지 말이죠.

우선, 현재 인터넷에 연결된 모든 PC는 IP 주소라고 하는 숫자를 이용해서 서로를 식별하게 됩니다.
(물리적인 수준은 아니지만, 더 깊게 들어가면 이 문서의 범위 외입니다.)
따라서, 웹 브라우저의 주소 창에 특정 도메인을 입력하면, 다음과 같은 과정을 거쳐서 최종적으로 서버에 접속합니다.

펼쳐라

예를 들어, 제 블로그에 접속하는 경우를 예로 들어 봅시다.
유저가 직접 브라우저 주소창에 입력하던, 또는 다른 사이트에서 링크를 클릭하는 경우

① 브라우저는 미리 설정되어 있는 도메인 네임 서버(DNS)에 질문을 날립니다.
“야, 나 koasing.tistory.com 에 접속하려고 하는데 주소좀 알려줘.”

② 연세대학교 네임서버(ns.yonsei.ac.kr, 전 학교 기숙사에서 생활하기에 학교 DNS를 이용하게 됩니다. 이는 인터넷 회선에 따라 달라집니다.)는, 자신이 가지고 있는 대조표에 요구받은 주소가 있는지 살펴봅니다.
있다면 간단하게 바로 ③으로 넘어가면 됩니다. 만약 없다면 아는 친구를 찾아야겠죠.

2-1. 연대 네임서버는 도메인을 관리하는 KRNIC에 물어봅니다.
2-1. “koasing.tistory.com에 접속해야 하는데 얘 주소를 아는 DNS는 누군가요?”
2-2. 그럼 KRNIC는 다음과 같이 대답합니다.
2-2. “그 주소는 다음 네임서버(ns.daumzone.com)가 알고 있단다.”
2-3. 이제 연대 네임서버는 다음 네임서버에게 물어봅니다.
2-3. “koasing.tistory.com에 접속해야 하는데 주소좀 알려줘”
2-4. 다음 네임서버는 친절하게 아는 대로 답장을 줍니다.
2-4. “koasing.tistory.com 주소는 IP 211.172.252.15야”

③ 원래 알고있던지, 아니면 친구에게 물어봐서 알아낸 것이던지, 여튼 연대 네임서버는 koasing.tistory.com의 주소를 찾았습니다.
이제 브라우저에게 답장을 하면 되겠네요.
“koasing.tistory.com 주소는 IP 211.172.252.15야”

④ 이제 브라우저는 IP 주소를 찾았습니다. 해당 IP로 접속하면 ⑤ 원하는 웹사이트에 접속할 수 있습니다.

물론 실제로는 브라우저에서도 DNS 캐시를 저장하고, DNS 서버도 캐시를 저장해 두므로 상당한 과정이 생략 가능합니다.

접어라

위 접힌 부분의 내용을 읽어보면 알겠지만, 도메인과 서버를 연결하려면 크게 2가지가 필요합니다.
1. KRNIC에 도메인과 DNS를 연결해주는 테이블 등록 (위 그림의 2-1, 2-2에 해당합니다.)
2. DNS와 서버 주소를 연결해주는 테이블 등록 (위 그림의 2-3. 2-4에 해당합니다.)

1. KRNIC에 도메인과 DNS를 연결

더보기

이는 크게 도메인 구입에 해당합니다.

네이버에서 무료로 제공하는 pe.kr 도메인을 얻었던, 돈을 주고 .kr 도메인을 구입하는 경우 모두 KRNIC에 자동 등록됩니다.
이제 어떤 네임서버에 서버 IP가 저장되는지를 지정할 차례입니다.

우선 도메인을 구입한 대행업체 웹 사이트에 접속하고, 도메인 정보변경 페이지로 이동합니다.
업체에 따라 다르지만, 대부분 도메인 관리를 위한 별도 메뉴를 제공합니다.

예를 들어, 위 그림과 같이 도메인 관리메뉴를 제공하는 경우, 정보변경에서 네임서버 변경을 선택하면 간단히 KRNIC에 등록되는 DNS 서버를 결정할 수 있습니다. 혹은 각종 정보변경을 한 페이지에서 제공하는 경우도 있습니다. 위 그림은 웹호스팅 업체인 나야나에서 제공하는 관리메뉴입니다.

여하튼 네임서버 관리페이지에 들어가면 다음과 같은 설정페이지를 볼 수 있습니다. 첫 번째 이미지는 나야나이며 두 번째 이미지는 x-y.net입니다.

어느 쪽이던, 네임서버 변경 메뉴를 제공하므로, 원하는 업체의 DNS 서버로 변경하면 됩니다. 홈페이지 호스팅이나 블로그에서 특정 DNS로 설정하도록 요구한다면 해당하는 주소를 입력하면 됩니다.
다만 티스토리처럼 별도의 DNS를 제공하지 않는 경우, 아래에서 계속 설명하는 대로 외부 DNS 서비스에 가입한 후 해당 값을 입력하면 됩니다. 어떤 값을 입력해야 하는지는 2를 참고하세요.

DNS 변경사항이 인터넷 전체에 적용되려면 짧게는 4시간에서 길게는 48시간 이상 걸립니다. 따라서 DNS 설정이후 이틀 정도는 느긋하게 보내는 자세가 필요합니다.

접기

2. DNS에 서버 주소를 연결

더보기

이제 두 번째로, DNS에 서버 주소를 등록해 주어야 합니다.
웹 호스팅의 경우, 자체 네임서버를 제공하고 있습니다.

이런 경우, 1에서 설정할 네임서버는 각 업체에서 제공하는 네임서버를 입력하면 됩니다.
또한 DNS에 알아서 서버주소를 입력해 주기 때문에, 별도로 DNS 설정을 만져줄 필요가 없습니다.

그러나 티스토리처럼 서버만 제공하고 DNS는 제공하지 않는 경우, 어쩔 수 없이 외부 DNS 서비스를 이용해야 합니다.

이 경우는… 제가 쓰고 싶지만 귀찮으므로 -_- 티스토리 공지에 링크된 Rukxer님의 포스팅에 링크하도록 하겠습니다.
여기를 클릭하세요.

접기

대충 이런 식입니다. 정리하면 다음과 같습니다.

1. 도메인 문자열을 서버 IP로 바꾸려면 2단계를 거쳐야 한다.
1. 하나는 KRNIC에서 DNS 주소를 따오는 것이고, 둘은 DNS에서 서버 주소를 따오는 것이다.
2. KRNIC에 등록하는 DNS 주소는, 도메인을 구입한 대행업체에서 변경할 수 있다.
3. DNS 주소는, 웹호스팅 업체에서 제공하는 것을 쓰거나, DNSEver 처럼 외부 DNS를 사용할 수 있다.

왠지 복잡하지만, 결국 KRNIC에 도메인 등록하고, DNS에 서버IP를 등록한다는 두 단계로 요약할 수 있습니다.
이해하기만 하면 매우 쉬우니, 한 번 쯤 설정을 만져 보는 것도 괜찮지 않을까요.