개소리 왈왈/영화2009. 3. 8. 00:24
애인의 쪼르기 스킬에 당해서 워낭소리를 보게 되었습니다 =ㅁ=

90분 정도 되는 짧은 상영시간과,
저렴한(!) 영화 답게 크레딧이 짧아서 영화관을 나오는 동안 끝나는 예의바른 모습을 보여 주었습니다.

첫 인상은, "화질이 왜 저따구야~!" 였고
마지막 인상은, "흙 냄새, 살 냄새 폴폴 나는 삶이 느껴진다" 였습니다.


굳이 이야기 하자면 주연 "소" 조연 "할머니, 할아버지" 라는 느낌입니다.
묵묵히 일하는 아버지의 자화상과,
그 묵묵함을 깨우는 감초역할인 할머니

클라이막스와 너무 빠른 끝남은 아쉬움으로 남지만, 그래도 괜찮은 영화였다라는 생각이 든다.
또 다른 아쉬운 점은, 너무나 한국인의 정서라는 점(수출에 제약이 많을 듯)
그리고 농경에서 벗어나 자라온 요즘 사람들에게는 별다른 감흥이 없을수도 흥미가 없을수도 있다는 점이다



사족 : 문득 발음하면서 생각을 해보니 원앙소리 같기도 하고 -ㅁ-

'개소리 왈왈 > 영화' 카테고리의 다른 글

노잉(knowing) 울트라 초초초 스포일링 (2009)  (2) 2009.04.19
간만에 사진 업데이트  (3) 2009.03.20
사기컷이 아닙니다!!  (0) 2009.02.06
나의 천사  (19) 2009.01.17
매우 길었던 주말  (4) 2008.12.28
Posted by 구차니
파일방2009. 3. 7. 14:49


0media.pk3와 0ufos.pk3는 $UFOAI_HOME/base/ 에 복사 하시면 되고,
ko.zip은 base/i18n/ko 에 넣어 주시면 됩니다(빵집기준 i18n에서 알아서 풀기 하시면 됩니다)

UFO:AI의 중간 결과 입니다.

'파일방' 카테고리의 다른 글

TFTP server for windows  (0) 2009.08.24
TeamViewer  (0) 2009.08.03
Dual time clock  (0) 2009.02.04
공개 시리얼 프로그램(터미널) - free terminal program(RS-232)  (6) 2009.01.21
Notepad2 개궁극의 버전 - 트래픽 분산용  (4) 2009.01.16
Posted by 구차니
어떻게 보면 참 별거 아닌일에 기운이 빠지는군요..
sourgeforge ufo:ai 팀에 정식으로 한글 번역본을 추가 요청을 하였고,
ufo:ai 팀에서는 GPL 라이센스의 TTF 폰트와 함께 주지 않으면 넣을 수 없다고 했습니다.

그래서 현재 리눅스 상에 포함되어 있는 폰트인 백묵폰트를 발견하고,
이 것이 공개인지, GPL에 따르는 것인지를 본 저작권자에게 물어 보았습니다.

어쩌면 게임이라는 부정적 이미지(게임은 당연히 금전적 이익을 추구한다)
로 인해서 무료 open source 게임임에도 불구하고 거절 의사를 듣게 되었습니다.


막상 거절 의사를 들으니 막막하다는 생각이 듭니다.
아 순탄하게 고고싱인데 눈앞에 넘지 못할 벽이 있는 느낌이랄까...
처음에는 저작권자에게 야속하고, 나 역시 어떠한 영리를 바라고 하는게 아닌데 왜 이걸 못 알아 줄까 하는
아쉬움도 있었지만, 한글 폰트 라는 것이 쉽게만들어 지는게 아닌 것을 알기에,
그리고 디자인실 하나를 책임지는 책임자로서 그분의 입장도 이해가 되었습니다.
더불어, 게임이라는 부정적 이미지에 대해서 기성세대가 지닌 느낌도 더욱 자세히 알게 되었습니다.

무료이고 공개라고 해도, 나중에 유료화 될 수 있고
무료, 공개의 목적이 진짜 무료 공개가 아닌 사이트 가입등의 금전적인 의도일 수도 있기 때문이라는 것인데

어쩌면 제가 ufo:ai 라는 프로젝트를 너무 믿고 있는 것일 수도 있고,
어쩌면 제가 너무 돈에 대해서 미련이 없는 것일 수도 있다는 생각이 듭니다.

일단은 GPL 라이센스로 확인된 은글꼴에 다시 연락을 취해 봐야겠습니다.


[은글꼴 : http://kldp.net/projects/unfonts]
[백묵글꼴 : http://kldp.net/projects/baekmuk/]

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

번역의 어려움  (5) 2009.03.12
보안등급 - Clearance  (0) 2009.03.09
UFO:AI 한글화 프로젝트 발동!  (4) 2009.03.03
UFO : AI - 스펙은?  (4) 2009.02.17
UFO : Alien Invasion - XCOM이여 영원하라!!  (4) 2009.02.16
Posted by 구차니
프로그램 사용2009. 3. 6. 16:09
UFO:AI 번역을 하다 보니 이넘의 죽일넘의 영어 때문에, 무료 영어사전을 찾게 되었다.
구글에서 검색해보니 두개 정도가 눈에 띄어서 일단 사용해 보았다.

두가지 전부 기본값으로 'ctrl-우클릭'으로 자동 단어 검색을 지원한다.


WordWeb은 offline으로 사용이 가능한 사전이다.
Wikipedia의 경우 인터넷이 될 때 사용하면되고, 무료 버전의 광고 내용은 다음과 같다.

Definitions and synonyms
Proper nouns
Related words
Pronunciations
150 000 root words
120 000 synonym sets
Fixed web reference tabs

먼지는 몰라도.. 생각보다 단어수가 많다.
About에 프린스턴 대학이 어쩌구 저쩌구 라고 되어 있다. 자체제작 사전인 듯 하다.
2009년 3월 6일 기준, 최신버전의 인스톨러 크기는 7.44MB (7,803,496 바이트)






LINGOES는 번역/사전 프로그램이다
사전은 에센셜 영어사전을 내장하고 있다. (우리가 아는 그 에센셜인가 -ㅁ-?)
번역의 경우 구글번역을 통하고, 단어 검색시에도 구글의 사전 검색을 끌어온다. portable 버전을 제공하는것이 장점이다.
WordWeb에 비하면 상당히 깔끔하고 한글화도 부분적으로 되어있다(메뉴)



ctrl-우클릭시 팝업으로 뜬다.

2009년 3월 6일 기준, 최신버전의 인스톨러 크기는 4.54MB (4,767,383 바이트)
premium dictionary를 다운받아 설치 가능하다. 잘 찾아 보면 한영/영한 사전도 있다.
[사전 다운로드 : http://www.lingoes.net/en/dictionary/]



결론 :
WordWeb은 기본 단어가 풍부하고, Lingoes는 빈약하다,
예를들어 sigma라는 단어조차도 Lingoes 기본 단어 사전에는 나오지 않는다.

하지만 UI라던가 편의성에서는 Lingoes가 앞선다.
예를들어, Ctrl-우클릭의 경우 WordWeb은 프로그램을 다시 띄워서 보여주지만(가뜩이나 UI도 안이쁜데 ^^;)
Lingoes는 다른 UI의 팝업을 띄워준다.

그리고 윈도우 시작시 자동실행은 WordWeb의 경우에는 강제적이고, 끄는 옵션이 존재하지 않는다.
Lingoes는 설정메뉴에 끄는 옵션이 존재하는데 비해서, WordWeb의 이러한 차이는 상당히 아쉬움으로 남는다.

결론만 이야기 하자면, Lingoes에 여러가지 사전을 다운 받아 사용하는것이 좋을 듯 하지만,
이넘의 다운로드 링크가 잘 안열리는 문제가 있기 때문에, 조금 번거로운 감이 없진 않다.


[WordWeb : http://wordweb.info/]
[lingoes : http://www.lingoes.net/]
Posted by 구차니
CVS만 2년 정도 사용했다.
물론 branch 까지는 사용해보지 않았고,
주로 사용하던 기능은 history와 tag 뿐이었다.

아무튼 이렇게 CVS만 쓰다가 SVN을 사용해봤는데,
처음 사용할때의 어색함인지, 상당히 다른 느낌이 든다.

일단 CVS는 module 단위였는데 SVN은 그러한 구분이 없다는 사실.
어쩌면 구형 TortoiseCVS를 사용해서 그럴지도 모르겠다는 생각이 든다.
신형 TortoiseCVS의 경우에는 물론 module단위로 만들기는 하지만,
module 목록을 combobox가 아닌 listbox로 보여 주기 때문에, 기존 버전보다는
확연히 구분되어 있다는 느낌이 적게 들었다.

하지만, SVN은 이러한 '프로젝트'의 느낌보다는, 이력이 남는 '파일 저장소'라는 느낌이 강하게 든다.
(아마 파일 이동의 편의성과, checkout시 URL로 입력하는 특성때문일 것이다)


CVS 구버전 UI

CVS 신버전 UI

Posted by 구차니
Linux2009. 3. 5. 20:21
$ tree -d /usr/share/fonts/korean/
/usr/share/fonts/korean/
|-- TrueType
`-- misc

TrueType의 아래에는 ttf 폰트가 있고, 윈도우에서도 쓸수 있다.
(다르게 말하면 윈도우용 트루타입 폰트를 이곳에 복사하면 리눅스에서도 사용할 수 있다는 의미이다)

현재 리눅스(FC6 기준)에는 백묵폰트가 기본으로 들어 있으며

백묵돋음
백묵굴림
백묵바탕
백묵헤드라인

네가지가 포함되어 있다.

-rw-r--r-- 1 root root 13939436 Jul 12  2006 batang.ttf
-rw-r--r-- 1 root root  3066060 Jul 12  2006 dotum.ttf
-rw-r--r-- 1 root root      560 Jan 21 07:13 fonts.dir
-rw-r--r-- 1 root root      560 Jan 21 07:13 fonts.scale
-rw-r--r-- 1 root root 10385096 Jul 12  2006 gulim.ttf
-rw-r--r-- 1 root root  1203464 Jul 12  2006 hline.ttf

[백묵폰트 공식 : http://font21.com/]
Posted by 구차니
개소리 왈왈2009. 3. 5. 18:38

y = sin(pi + x) 그래프인데?

'개소리 왈왈' 카테고리의 다른 글

멘토라는 것의 의미  (6) 2009.03.13
250 근접!  (2) 2009.03.10
간만에 MD를 꺼내 봤습니다.  (2) 2009.03.04
8K의 행복  (6) 2009.02.28
문득 세상이 많이 변했음을 느낀다.  (4) 2009.02.27
Posted by 구차니
UFO:AI 한글화 프로젝트 참여중인데, SVN의 사용은 처음이라 이래저래 적응이 안된다.
가장 큰 것으로는
CVS의 history라는 것이 SVN에서는 Show Log로 바뀌었다는 것이다.
그리고 SVN은 하나의 커밋이나 수정사항이 있을때, 전체의 리비전이 변경되므로,
파일 각각이 아닌 SVN repository 전체에 대한 Log가 존재하게 된다
(사용이 미숙해서 그럴지도 모르지만 TortoiseCVS에서는 파일 단위로 밖에 보지 못했다)

Context-menu 이다. 주로 사용하는 것은
프로젝트 전체의 업데이트인 SVN Update와
프로젝트 전체의 수정 업로드인 SVN Commit 그리고
프로젝트의 변경사항을 볼수 있는 Show Log 이다.

위의 이미지는 프로젝트 전체의 Show Log 결과이다.
프로젝트에서 추가 / 삭제된 파일등과 전체의 Revision이 표기된다.

자막 번역 파일 하나의 내역이다. 자세히 보면 알겠지만, Revision이 1씩 증가하지 않는다.
리비전에서 변동사항이 있을 수도 있고, 없을 수도 있기 때문에, 파일을 Show Log 하면
위와 같이 나오지 않는 사항들을 볼 수 있다.
Posted by 구차니
문득 꽤 나 오래전에 달았던 리플에 대한 리플이 달렸길래 확인하러 가봤다.
엄청난 장문이었다. [링크 : http://offree.net/entry/ROH-MooHyun-My-President-2#comment46551]

요지만 말하면, 친일파는 숙청해야만 한다라는것이다.
내가 편 논리가 마치 친일파가 자신의 존재를 희석하기 위한 논리 같다는 이야기가 곁들어져 있었다.


너무 이상적으로 생각을 하는건지 모르겠지만,
인간이 다른 인간에게 벌을 주고, 사형을 집행하고, 내가 타인보다 우월하니 내 의견이 옳다 라고 강요하는 것들
이런것들이 모두 너무나 무의미하고 우습다고까지 생각된다.

내가 보는 시점을 너무 넓혔나?


물론 대한민국에서 태어나 대한민국에서 살아가는 대한민국 국민으로
역사를 배웠다면, 일본에 대한 악감정(이라고 표현할 정도로 강한)이 없을리가 없다.
대한민국 사람과 일본인/그리고 일본에 기생한 한국놈들 이라는 구도로는
사지를 찢어 까마귀가 파먹게 해도 속이 풀리지 않아 3대를 멸하고 싶다.
이런 치욕적인 역사에 동참을 하고, 지금에 와서는 배를 불리고 살고 있으니 말이다.

하지만, 그들 역시(물론 친일파의 논리일지도 모르지만) 대한민국의 사람이고, 살아있는 인간으로
(인간의 조건이 있나라고 할지도 모르지만), 그리고 가족이 있는 한집의 가장으로(어머니던,아버지던) 생각을 하면
그들역시 살고자 그렇게 했을뿐이고, 단지 다른 사람들 보다 쉽게 협박에 굴했을 뿐이다.
일부에는 물론 기회로 삼아 일본인 행세를 하며 더 잘살아 보겠다고 생각을 해서 일본의 앞잡이가 되어 행동했겠지만
총부리를 들이밀며 밥내놔해서 준 소시민들 마저도 그렇다면
그들의 논리에는 친일행적을 했고, 죽어야 하지 않을까?

어떻게 보면 법의 딜레마와 비슷할수도 있겠지만, 먼가 석연찮은 느낌이 드는건 왜일까?
지금의 궁핍한(라고 느끼게 강요하는 미디어) 경제사정에 신경이 곤두서서 누군가를 적으로 만들어야 살아있을 수 있기에
이 사람들마저도 사지로 몰아갈려는 건 아닐까? 이런 생각이 든다.


문득, 이런 생각이 든다.
보편적으로 사람들이 분노해하는 일에 대해서 분노하지 않으면,
동질감을 느끼지 못하고 전혀 다른 사람 혹은 적으로 생각하는게 아닐까 싶다.

가슴은 뜨겁게, 머리는 차갑게.
전투에서 이긴다고 전쟁이 승리하는 것은 아니다.

그자리에서 분노한다고 달라지는 것도 아니고, 분노한 움직임은 피를 부를뿐이다.
그리고, 다수결이 항상 옳은것도 아니다.
많은 사람들이 보편적으로 분노한다고 해서 반드시 분노를 따라 해야하는 것도 아니다.

핑계? 핑계일수도 있다.
하지만, 분노하지 않아 보이는 사람들이 진정으로 분노하지 않는 것으로 보이는가?
분노를 삭히며 다음 대책을 세우려는 사람들에게 "우리와 같이 왜 분노하지 않냐? 너도 적이냐?" 라고 하는건
코앞의 토끼를 잡기위해 함정으로 뛰어드는 호랑이의 모습이 아닐까 싶다.
Posted by 구차니
typedef unsigned char		u8;
typedef unsigned short		u16;

#define ARABIC_SIN 0
#define ARABIC_END 1
#define ARABIC_1ST 2
#define ARABIC_MID 3

u16 ArabicEncode(u16 *arab, u8 pos, BOOL* stepit, BOOL* is2set)
{
    u16 ucode = 0;
    BOOL nowChar = FALSE;
    switch(*arab)
    {
        // 2개일 경우
        case 0x0622: ucode = 0xFE81; nowChar = TRUE; break;
        case 0x0623: ucode = 0xFE83; nowChar = TRUE; break;
        case 0x0624: ucode = 0xFE85; nowChar = TRUE; break;
        case 0x0625: ucode = 0xFE87; nowChar = TRUE; break;
        case 0x0627: ucode = 0xFE8D; nowChar = TRUE; break;
        case 0x0629: ucode = 0xFE93; nowChar = TRUE; break;
        case 0x062F: ucode = 0xFEA9; nowChar = TRUE; break;
        case 0x0630: ucode = 0xFEAB; nowChar = TRUE; break;
        case 0x0631: ucode = 0xFEAD; nowChar = TRUE; break;
        case 0x0632: ucode = 0xFEAF; nowChar = TRUE; break;
        case 0x0648: ucode = 0xFEED; nowChar = TRUE; break;
        case 0x0649: ucode = 0xFEEF; nowChar = TRUE; break;

        // 4개 일경우
        case 0x0626: ucode = 0xFE89; nowChar = FALSE; break;
        case 0x0628: ucode = 0xFE8F; nowChar = FALSE; break;
        case 0x062A: ucode = 0xFE95; nowChar = FALSE; break;
        case 0x062B: ucode = 0xFE99; nowChar = FALSE; break;
        case 0x062C: ucode = 0xFE9D; nowChar = FALSE; break;
        case 0x062D: ucode = 0xFEA1; nowChar = FALSE; break;
        case 0x062E: ucode = 0xFEA5; nowChar = FALSE; break;
        case 0x0633: ucode = 0xFEB1; nowChar = FALSE; break;
        case 0x0634: ucode = 0xFEB5; nowChar = FALSE; break;
        case 0x0635: ucode = 0xFEB9; nowChar = FALSE; break;
        case 0x0636: ucode = 0xFEBD; nowChar = FALSE; break;
        case 0x0637: ucode = 0xFEC1; nowChar = FALSE; break;
        case 0x0638: ucode = 0xFEC5; nowChar = FALSE; break;
        case 0x0639: ucode = 0xFEC9; nowChar = FALSE; break;
        case 0x063A: ucode = 0xFECD; nowChar = FALSE; break;
        case 0x0641: ucode = 0xFED1; nowChar = FALSE; break;
        case 0x0642: ucode = 0xFED5; nowChar = FALSE; break;
        case 0x0643: ucode = 0xFED9; nowChar = FALSE; break;
        case 0x0644: ucode = 0xFEDD; nowChar = FALSE; break;
        case 0x0645: ucode = 0xFEE1; nowChar = FALSE; break;
        case 0x0646: ucode = 0xFEE5; nowChar = FALSE; break;
        case 0x0647: ucode = 0xFEE9; nowChar = FALSE; break;
        case 0x064A: ucode = 0xFEF1; nowChar = FALSE; break;
    }

    if((*arab == 0x0644) && (pos != ARABIC_END) && (pos != ARABIC_SIN))
    {
        switch(*(arab+1))
        {
            case 0x0622: ucode = 0xFEF5; *stepit = TRUE; break;
            case 0x0623: ucode = 0xFEF7; *stepit = TRUE; break;
            case 0x0625: ucode = 0xFEF9; *stepit = TRUE; break;
            case 0x0627: ucode = 0xFEFB; *stepit = TRUE; break;
            default: break;
        }

        if(*stepit == TRUE)
        {
            switch(pos)
            {
                case ARABIC_1ST:
                    if(*(arab+2) == 0x0020) break;
                    else { ucode += 0x001; break; }
                case ARABIC_MID:
                    if(*is2set == TRUE) break;
                    else { ucode += 0x001; break; }
            }

            *is2set = nowChar;
            return ucode;
        }
    }

    switch(pos)
    {
        //case ARABIC_SIN: return ucode;
        case ARABIC_1ST:
                if(nowChar == TRUE) ucode = *arab;
                else ucode += ARABIC_1ST;
                break;
        case ARABIC_MID:
                if(nowChar == TRUE) // 2개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                else // 4개 짜리
                {
                    if(*is2set == TRUE) ucode += ARABIC_1ST;
                    else ucode += ARABIC_MID;
                }
                break;
        case ARABIC_END:
                if(nowChar == TRUE) // 2개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                else // 4개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                break;
    }

    *is2set = nowChar;
    return ucode;
}

BOOL isarabicstr(u16 *pu16String, u16 u16StrLength)
{
    u16 index = 0;
    BOOL arabic_exist = FALSE;

    for(index = 0;index < u16StrLength;index++)
    {
        if(pu16String[index] >= 0x060C && pu16String[index] <= 0x064B) return TRUE;
    }

    return arabic_exist;
}

void Arabic_automata(u16 *target_str, u16 *src_str,u16 u16Length)
{
	BOOL b8ArabSpe = FALSE;
	BOOL b8is2set = FALSE;
	u16 u16Index = 0;
	u16 u16Index2 = 0;
	u16 u16Index3 = 0;
	u16 u16offset = 0;
	u16 *temp_str = NULL;
	
	temp_str = malloc((u16Length + 1) * 2);

	for (u16Index = 0; u16Index < u16Length;)
	{
		if (src_str[u16Index] >= 0x060C && u16Index < u16Length) // arabic
		{
			u16Index2 = u16Index; // 아랍어 시작점
			while(src_str[u16Index] >= 0x060C && u16Index < u16Length ) u16Index++;
			if(u16Index - u16Index2 == 1) // 단독형
			{
				temp_str[u16Length - u16Index2 + u16offset - 1] = src_str[u16Index2];
			}
			else // 2개 이상 단어
			{
				// 첫자
				temp_str[u16Length - u16Index2 + u16offset - 1] = ArabicEncode(src_str + u16Index2, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
				if(b8ArabSpe == TRUE) {++u16offset; ++u16Index2;}
				
				//중간글자
				for(u16Index3 = u16Index2 + 1; u16Index3 < u16Index - 1; u16Index3++)
				{
					if(b8ArabSpe == TRUE)
					{
						b8ArabSpe = FALSE;
						temp_str[u16Length - u16Index3 + u16offset - 1] = ArabicEncode(src_str + u16Index3, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
					}
					else
						temp_str[u16Length - u16Index3 + u16offset - 1] = ArabicEncode(src_str + u16Index3, ARABIC_MID ,&b8ArabSpe, &b8is2set);
					if(b8ArabSpe == TRUE) {++u16offset; ++u16Index3;}
				}
				//마지막자
				if(u16Index - u16Index2 != 1)
				{
					if(b8ArabSpe == TRUE)
					{
						b8ArabSpe = FALSE;
						temp_str[u16Length - u16Index + u16offset] = ArabicEncode(src_str + u16Index - 1, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
					}
					else
						temp_str[u16Length - u16Index + u16offset] = ArabicEncode(src_str + u16Index - 1, ARABIC_END ,&b8ArabSpe, &b8is2set);
					if(b8ArabSpe == TRUE) b8ArabSpe = FALSE;
				}
			}
		}
		else if (src_str[u16Index] == 0x0020)
		{
			u16Index2 = u16Index++;
			temp_str[u16Length - u16Index + u16offset] = src_str[u16Index - 1];
		}
		else // not arabic
		{
			u16Index2 = u16Index; // 영어 시작점
			while(src_str[u16Index] > 32 && src_str[u16Index] < 255  && u16Index < u16Length && src_str[u16Index] != 0x0020) u16Index++;
			for(u16Index3 = 0; u16Index3 < u16Index - u16Index2; u16Index3++)
			{
				temp_str[u16Length - u16Index + u16Index3 + u16offset] = src_str[u16Index2 + u16Index3];
			}
		}
	}

	if(u16offset > 0)
	{
		memcpy(target_str,temp_str + u16offset,(u16Length - u16offset) * 2);
		memset(target_str + (u16Length - u16offset),0x00,u16offset * 2);
	}
	else
	{
		memcpy(target_str,temp_str,(u16Length) * 2);
		memset(target_str + u16Length,0x00,2);
	}

	free(temp_str);
}



아놔 syntax highlighter 왜 이따구야 ㅠ.ㅠ

'모종의 음모 > 아랍어 오토마타' 카테고리의 다른 글

아랍어 조합 방법 - unicode  (5) 2008.11.16
Posted by 구차니