삽질하는플머

GOGO 인코더 테스트 프로그램

이런저런잡다구리

설명은 천천히... 일단 바이너리부터. 



enctest.zip



실행결과는 비슷하거나 미묘하게 빠름. (그 이유는 결과물을 보면 짐작이 될 것임...)





이건 소스. 터보델 or BDS2006. 

비베 소스를 보며 GOGO.dll 의 헤더를 번역하다가... 나중에 보니 배포판에 함께 제공되고 있어 갈아탐. 

그래서 지저분... 열어보고 흉보기 없음. 


enctest_src.zip



DLL 소스는 여기. 
http://www.marinecat.net/free/windows/mct_free.htm

윈 7에서는 설치가 안되지만, 실행파일 "wing313a.exe" 의 압축을 7zip 으로 풀면 됨. 

mingw 기반의 간이 빌드환경이 제공되므로 compile.bat 실행하면 gogo.dll 이 얻어짐. 


VBinDiff 로 비교한 화면도 첨부함. 


윗부분이 gogo.dll 의 결과물. 아래쪽이 닷넷버전의 우월성을 주장하는 myMP3Enc 의 결과물. 




세세한 내용은 조금씩 다르지만 결과물의 크기가 같고 구조도 거의 유사함. 

무엇보다 도입부의 GOGOGO... 어쩔... 

gogo.dll 의 라이센스는 LGPL인데... 그걸 정적으로 링크하고 닷넷버전의 우월성 어쩌구라니...
설령 gogo 프로젝트 전체를 닷넷으로 컨버트 했더라도 배포에서 이미 라이센스 위반... 

코드 배틀은 개뿔... 전형적인 셰이머...



LGPL에서 의미하는 정적링크란, 해당 라이센스가 적용된 코드를 라이브러리로 분리하지 않고 

실행파일에 포함하는 모든 행위를 일컫습니다. 

C#에는 정적 링크 기능이 없다고 지적하시는 분이 있어 첨언 해 둡니다. 


(별걸 다 트집... 졸라 꼼꼼히 읽었나보네... 안스럽...)




순수 닷넷으로 짜여진 콘솔 어플이라면서... mono 2.10 에서 시작도 못하고 뻗는 모습은 덤...






2013년 7월 10일 덧붙임. 


이 블로깅에 대한 그 분의 반응. 




LGPL 에서의 정적 링크 이야기는 이미 했으니 생략하고...

볼포 시삽이신 박지훈님이 알아내신 정보가 좋은 답변이 될 듯. 


myMP3Enc.exe 내부에 선명히 찍혀있는 "GOGO.DLL" 이라는 문자열... 저거 어쩔... 푸훗~~



아주 긴 웨이브 파일을 인코딩할 때, 숨김파일이 먼저 생성되고 나중에 나타나는 것도 GOGO.DLL의 방식과 동일... ^^;




우분투에 IRC서버 설치후 닉네임 길이와 동접자 조절.

이런저런잡다구리/LinuxHeaven

심플즈 팁란에 올렸던 글... 갑자기 쓸 일이 생겨 옮겨둠. 

http://simples.kr/28949



얼마전 게임채팅에 써먹어볼까 싶어 우분투에 IRC 서버를 까느라 삽질한 내용이 있어서 함 올려봅니다. 

일단 ircd는 ircu 를 사용하기로 했습니다. 설치는 간단히 이렇게..


$ sudo apt-get install ircd-ircu



문제는 여기서부터인데, 닉네임의 최대값이 12자로 되어있군요. 저는 30자가 필요. 

설정 문서에 나온대로 /etc/ircd/ircd.conf 내에 features 안에 다음라인 삽입해 봤습니다. 


features {

 .....

 "NICKLEN" = "30";

};



하지만 이 설정은 ircd-ircu 의 소스중 ircd_def.h 에 정의된 값을 넘을 수 없습니다. 

여기에는 15로 정의되어있기 때문에 아무리 30자를 때려줘도 넘어가지 않지요. 


패키지로 설치한 ircd-ircu 는 지워버리고 소스를 받아 수정해봅시다. 


일단 컴파일 환경을 만들어주고


$ sudo apt-get install build-essential flex autoconf  bison



소스를 내려받아 압축을 풀어줍니다. 


$ wget http://prdownloads.sourceforge.net/undernet-ircu/ircu2.10.12.12.tar.gz

$ tar xzf ircu2.10.12.12.tar.gz

$ cd ircu2.10.12.12



여기서 ./include 안의 ircd_defs.h 에서 NICK_LEN 값을 30으로 수정해줍니다. (41번째 줄)


#define NICKLEN         30



이제 다음과같이 해 주면 닉네임을 30자로 쓸 수 있는 데몬을 얻을 수 있습니다. 


$ ./configure

$ make all



../bin 에 컴파일된 ircd 실행파일이 들어갑니다. 이제 이놈의 버전을 출력해봅시다. 


$ ./ircd -v 

ircd u2.10.12.12

Event engines: epoll_*() poll()

Compiled for a maximum of 1020 connections.



최대접속자가 1020으로 되어있습니다. 아쉬움이 있지요. 

이 내용은 ./configure 실행시 생성되는 config.h 에 기록되며, 

이 때 사용되는 configure.in 을 살펴보면 다음과 같은 값을 받아오도록 되어있습니다. 


ulimit -Hn



한마디로 시스템에서 열 수 있는 파일갯수를 의미하지요. 

sudo ulimit -n 4096 해주면 이 값이 바뀝니다만 재부팅하면 도로묵이죠. 

예전에는 이 값을 늘려주려면 커널을 새로 컴파일해야 했나본데... 전 리눅스 뉴비라 그런건 모르고...

/etc/security/limits.conf 에 다음항목 추가한 뒤 재부팅해봅시다.  


*               hard    nofile            4096

*               soft    nofile            4096



이제 ircd-ircu 를 재컴파일하면 최대접속자수가 늘어난 것을 볼 수 있습니다. 


마지막으로 닉네임에서 한글사용문제... 원래 irc 규정이 닉네임에서는 한글을 못써먹게 되어있습니다. 

한글 패치된 데몬들은 규격외의 물건들인 셈이죠. 

table_gen.c 를 들여다봅시다. 

116번 줄에보면 NTL_RICNK 의 속성을 설정하는 부분이 보입니다. 


moveMacro(NTL_DIGIT | NTL_ALPHA, NTL_IRCNK);

markString(NTL_IRCNK, "-_`");



숫자, 알파벳, 그리고 " - _ ` " 를 추가해주고 있지요. 따라서 여기에 " + / " 를 추가하면 UTF-7 사용이 가능해집니다.


markString(NTL_IRCNK, "-_`+/");



사실 이것도 "+/" 때문에 규약을 어기는 건 마찬가지네요. ㅠㅠ;;

UTF-8이면 더 좋겠지만 어차피 게임내에서 자체 클라를 제공하기 때문에 일단 이정도로 만족하고 있습니다. 


Synology USBStation2 사용기 2. AMP 설치.

이런저런잡다구리/Synology-nas

아래 글을 먼저 읽고 오세요~ ^^;

"Synology USBStation2 사용기 1. 전원 꽂고 optware 깔기."



짤방은 재활용 쓰레기장에서 득템한 외장케이스. 앞부분 래치가 부러져 하드를 고정할 수 없어 버려진 듯. 

하우징 쇠 부분에 드릴로 구멍을 뚫고 클립을 펼쳐 관통시켰더니 잘 고정된다. e-sata, usb 지원. 

함께 입양된 1TB 하드를 넣어 USBStation2 에 물려줌. 



USBStation2의 포지션은 어디까지나 NAS가 아닌 NAS Adapter 라고 하지만, 성능면에 DS110j와 별반 다르지 않은데도 웹서비스가 빠졌다는 점은 아무리 생각해도 좀 깬다. 저렴한 버팔로 NAS도 아파치와 PHP, MySQL 정도는 기본으로 들어가 있는데 말이지... 그리고 들여다 보면 알겠지만 이미 아파치의 httpd 도 두 개나 돌고 있다. 기능이 충분한데도 넣지 않는 건 순전히 정책적인 결정이라고 생각한다. 


그러나 이미 우리 손에 쥐어진 ipkg 라는 전가의 보도!! AMP도 얼마든지 올려볼 수 있다. (버전이 좀 낮기는 해도...)


일단 관련 패키지들 설치. 


# ipkg install apache php mysql sqlite openldap-libs php-apache phpmyadmin 



우분투처럼 깔면 깔린 그대로 돌아가면 좋겠지만... 아쉽게도 몇가지 손을 봐줘야 한다. 

/opt/etc/apache2/httpd.conf 파일을 편집.


먼저 구동시 에러를 내는 74라인의 mod_ext_filter.so 모듈 로딩하는 부분은 앞에 '#'을 붙여 주석처리. 


# LoadModule ext_filter_module libexec/mod_ext_filter.so



USBStation2 에서 웹 기본 포트인 80번 포트는 이미 관리페이지인 5000번으로 리다이렉션 시키는 용도로 사용중이다. 

기본 내장된 아파치가 이 작업을 하는데 어디서 띄우는지는 아직 확인하지 못했다. (귀찮아서...) 어차피 가정용 ISP에서 80포트 막아둔 곳도 많고 필요하다면 공유기에서 포워딩하면 되니까 리슨포트는 8000 그대로 둔다. DS110j와의 가격차이를 생각하면 이 정도 쯤이야 패널티라고 생각하지 뭐.  


Listen 8000



서버명은 다음과 같이 수정. 


ServerName *:8000



LoadModule 어쩌구가 잔뜩 적혀있는 119라인 근처에 다음 두 줄을 추가해준다. 

AddType application/x-httpd-php .php
LoadModule php5_module libexec/libphp5.so


<IfModule dir_module> 부분을 찾아 다음과 같이 수정해준다. (235라인 근처...)

<IfModule dir_module>
    DirectoryIndex index.html index.htm index.cgi index.php index.php3
</IfModule>


아파치 구동. 


# /opt/sbin/apachectl start



http://usbstation2:8000 에 접속해보자. It works! 라는 반가운 메시지가 나오면 일단 성공! 




웹 서비스 루트 기본값은 /opt/share/www 이다. 여기에 다음 내용을 담은 test.php 파일을 만들어주자. 


# vi /opt/share/www/test.php


<?php

phpinfo();

?>



http://usbstation2:8000/test.php 에 접속해서 다음과 같은 화면이 나오면 최종 성공!! 





여기까지 잘 되었다면 조금 전에 설치한 phpmyadmin 도 제대로 동작할 것이다.

http://usbstation2:8000/phpmyadmin/ 에 접속 테스트. 





이제 DB에 적절한 권한을 설정하고 미디어위키를 깔건 그누보드를 깔건 마음대로 가지고 놀면 된다. 


Synology USBStation2 사용기 1. 전원 꽂고 optware 깔기.

이런저런잡다구리/Synology-nas

클리앙 장터에서 1TB 하드와 함께 쿨매로 나온 USBStation2 를 손에 넣게 되었다. 

흔히 NAS Adapter 라고도 불리는 이 제품은, 기계 자체에 펌웨어가 내장되어있어 단순히 외장하드를 연결해 주는 것 만으로도 바로 사용할 수 있는 멋진 물건이다. 






하드웨어 설치는 간단한 편인데 아답터가 에러 @_@!! 

전원 부분이 얇아 220v 소켓에 꽂으면 싸구려 중국제마냥 덜렁거려 아무래도 적당한 녀석으로 바꿔줘야 할 듯 싶다. 


책상속에 마침 곰팡이가 핀 2GB USB 메모리가 보이길래 함께 꽂아주었다. 




DS110j의 경우 부팅이 끝나면 삑~! 하고 비프음이 나오는데, USBStation2는 그딴 거 없다!! 

POWER 와 DISK 램프의 깜박임이 완료된 후 기본 호스트명인 usbstation2 에 핑을 날려본다. 




웹브라우저를 띄우고 http://usbstation2 에 접속. 초기 접속 아이디는 admin 이며 암호는 없다. 




깔려있는 DSM 버전은 3.2-1944, USBStation2 는 최신버전 DSM 4.0의 지원대상에서 제외되었다.
아쉬움을 뒤로하고 제어판에서 DSM 3.2-1968 버전을 내려받는다. 




업데이트를 마치고 재부팅한 뒤 네트워크 이름을 usbstation2 에서 my-storage 등으로 적당히 변경. 

표준 시간대 설정하고 NTP서버와 동기화를 선택해 시간은 자동으로 맞춰지도록 한다. 

제어판 - 사용자에서 admin 과 guest 에 적절한 암호를 설정. 

나머지 설정도 적당히 마무리 짓고... 마지막으로 제어판 - 터미널에서 SSH 서비스를 활성화 한다. 




PuTTy 로 접속 테스트. 





제어판 -> 외부 장치에서 뒷면에 꽂아둔 2GB 메모리를 EXT4 파티션으로 포멧한다. 

이 공간은 optware 용으로 사용할 것이다. 




구글에서 USBStation2와 optware 로 검색해서 건진 마르님의 멋진 따라하기. 


http://blog.naver.com/amarese/140153263988

http://cafe.naver.com/synologynas/13207


기왕에 DSM 버전도 가능한 최신버전으로 업했으니... 
두번째 링크에 isul 님이 남겨주신 댓글을 참조해 수정펌이 아닌 정펌에 optware를 올리는 방법을 찾아보자. 



이하 작업은 root 로 로그인한 뒤 진행. SSH로 root 접속시 암호는 admin에 설정한 것과 동일하다. 


USB메모리에 @optware 라는 폴더를 만들어 준다. 


# cd /volumeUSB2/usbshare

# mkdir @optware



/volume1 은 USBStation2의 플래시 영역이다. 앞에서 만들어준 @optware 디렉토리에 대한 심볼릭 링크를 여기에 만들어준다. 


# mkdir /volume1/system

# cd /volume1/system

# ln -s /volumeUSB2/usbshare/@optware



/opt 에 이 심볼릭 링크를 마운트 한다. 


# mount --bind "/volume1/system/@optware" "/opt"



이제 부트스트랩 작업. (참조: http://lycons.iptime.org/tc/49)


# wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/syno-mvkw-bootstrap_1.2-7_arm.xsh

# sh syno-mvkw-bootstrap_1.2-7_arm.xsh



/opt/etc/ipkg.conf 파일을 열고 마지막에 다음 라인을 추가. 


src cs08q1armel http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable



/etc/profile 열고 마지막에 다음과 같이 수정 또는 추가. 


PATH=/opt/bin:/opt/sbin:$PATH



ipkg 의 업데이트. 


# ipkg update

# ipkg upgrade



/etc/rc.local 에 붉게 적힌 내용 추가. 재부팅 후에도 동작하도록 해준다. 


#!/bin/sh


until [ -d /opt/bin ];

do

  sleep 5

  mount --bind "/volume1/system/@optware" "/opt"

done


# Optware setup

[ -x /etc/rc.optware ] && /etc/rc.optware start


exit 0



USB 마운트가 성공해서 /opt/bin 디렉토리가 생길 때 까지 5초마다 한번씩 마운트를 시도를 되풀이 하고 있다. 

원래 마르님의 글에서는 2초면 충분하다고 했는데, 내가 가진 일부 하드의 경우 40초 이상이 필요한 경우도 있어 꼼수를 부림. 


이제 재부팅. 


# reboot



df -h 명령으로 /opt 에 /volume1/system/@optware 가 제대로 마운트 되었는지 살핀다. 





ipkg 테스트 겸 설치해보는 nano. 


# ipkg install nano

# nano





마지막 산이 하나 더 남아있다. USBStation2 는 저가형 답게 공유폴더를 따로 지정할 수 없고 USB에 접속한 스토리지 자체가 통째로 공유되는 방식이다. 때문에 탐색기로 방금 optware 를 설치한 2GB 메모리를 들여다 보면 속살이 모두 드러나 조금 곤란하다. 




공유기능을 끄는 것도 불가능하다. 물론 탐색기 환경에 나타나지 않도록 설정할 수는 있지만 그래도 찜찜하다. 

정책 때문이라고 해도 왠치 치사하다는 느낌이 든다. 뭐 Synology의 장점은 맘에 안들면 고쳐 쓰면 된다는 거니... 


볼륨 루트 밑에 새 공유 디렉토리 public을 생성한다. 


# mkdir /volumeUSB2/usbshare/public



/usr/syno/etc/smb.conf 파일을 열고 다음과 같이 수정. 


......

[usbshare2] <<-- 이 부분도 맘에 드는 이름으로 바꿔주자

        invalid users=nobody,nobody

        valid users=nobody,guest,admin,nobody

        comment="Power Quotient International Co., Ltd"

        path=/volumeUSB2/usbshare/public

        guest ok=yes

        browseable=yes

        fileindex=no

        mediaindex=yes

......



삼바 데몬 재구동. 


# /usr/syno/etc/rc.d/S80samba.sh restart



다시 탐색기로 접근해 보면 더이상 불필요한 내용은 표시되지 않는다. 
비슷한 요령으로 USBStation2에서 제한된 여러개의 공유디렉토리 기능을 흉내낼 수 있으며, 이렇게 만들어낸 각 공유디렉토리는 DSM 내부에서 얼마든지 사용자권한이나 탐색기에서 표시여부 등을 수정해줄 수 있다. 


하지만 재부팅하면 말짱 도루묵 @_@ !!! 

chmod 444로 쓰기 권한을 빼앗아도 이 파일은 부팅과 동시에 재작성된다. 

고민하다가... 수정한 설정파일을 백업하고, optware 가 구동될 때 새로 생성된 설정과 바꿔치운 뒤 삼바를 재구동하는 방법을 쓰기로 함. 


일단 설정파일 백업. 


# cp /usr/syno/etc/smb.conf /usr/syno/etc/smb.conf.myconf



/etc/rc.local 을 다시 열고 다음 내용을 추가한다. 


#!/bin/sh


# mount usb's optware directory

until [ -d /opt/bin ];

do

  sleep 5

  mount --bind "/volume1/system/@optware" "/opt"

done


cp /usr/syno/etc/smb.conf /usr/syno/etc/smb.conf.org  

cp /usr/syno/etc/smb.conf.myconf /usr/syno/etc/smb.conf

/usr/syno/etc/rc.d/S80samba.sh restart


# Optware setup

[ -x /etc/rc.optware ] && /etc/rc.optware start


exit 0



이후 사용자 설정등을 변경하거나 할 때는 다시 smb.conf.myconf 를 복사해 두어야 한다. 약간의 귀차니즘이 느껴지네... 


오늘은 여기까지... 다음번에는 USBStation2에 이유없이 금지된 웹서비스 대신 APM을 올려보자. 



Synology NAS DS110j: SSH 접속시 한글 파일 제대로 표시하기.

이런저런잡다구리/Synology-nas

DS110j 에 SSH로 접속해보면, 한글로 된 파일명이 모두 '?' 로 출력되어 참 보기 숭하다. 




Synology+nas+locale 로 검색, DS-710+ 에 로케일 설정 방법이 설명된 게시물을 건졌다. 구글 만세!


http://www.jlancer.net/board/article_view.jsp?article_no=1591&board_no=37&table_cd=EPAR01&table_no=01

http://www.jlancer.net/board/article_view.jsp?article_no=1592&board_no=37&table_cd=EPAR01&table_no=01




위 글을 참조해 DS110j 에 로케일을 설정해보자. 먼저 Putty의 코드페이지는 UTF-8로 설정. 




Synology NAS GPL Source 페이지에 가서 자신의 DSM 버전에 맞는 툴체인을 내려받는다. 




위 경우는 3.1이므로 "Home/DSM 3.1/Marvell 88F628x Linux 2.6.32" 내의 gcc421_glibc25_88f628x.tgz 파일을 내려받아 압축을 푼다. 


# tar -xzf gcc421_glibc25_88f628x.tgz



이 툴체인은 x86 리눅스에서 NAS용 프로그램을 빌드할 수 있는 크로스 컴파일 환경이다. 

다음 기회에 해부해보도록 하고, 일단 arm_linux 용 localelocaledef 실행파일  및 i18n 디렉토리를 시스템으로 복사한다. 


# cp arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/bin/locale* /bin/

# cp -R arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/share/i18n/ /usr/share/



locale 명령을 실행시켜보자. 

# locale -a
C
POSIX


localedef 로 새 로케일을 추가하고 잘 되었는지 및 확인.

# localedef -c -f UTF-8 -i en_US en_US.UTF-8
# locale -a
C
en_US.utf8 
POSIX    


재부팅 후 다음 명령을 실행시키고 

# export LANG=en_US.utf8
# export LC_ALL=en_US.utf8


한글이름 파일을 만들어보자. 제대로 동작하면 성공. 

# touch 한글한글.txt
# ls -l



bash 셸을 설치했다면 위의 LANG, LC_ALL 설정을 /opt/etc/profile 파일에 넣어주면 재부팅해도 제대로 동작한다.