삽질하는플머

Synology NAS DS110j 에 mono 올리기

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



Synology NAS 에 mono 를 올리면 아주 신나는 일이 많이 생길 것 같아. 
닷넷 바이너리가 직접 돌아간다면 윈도에서 작업한 이런 저런 물건들을 쉽게 돌려볼 수 있잖아~ 
ipkg system이 설치된 DS110j 는 "ipkg install mono" 명령으로 2.4 버전의 모노를 설치할 수 있지만
닷넷 4.0 바이너리를 구동하려면 mono 버전이 2.8 이상이 되어야 하니... 직접 빌드하는 방법을 찾아보자. 

일단 구글을 뒤적뒤적. Synology DS211 에 mono-2.11.0 을 올리는 방법이 잘 정리된 아주 멋진 블로그를 건짐. 

http://blog.hexad.dk/2012/03/mono-211-binary-build-for-synology-211.html



이 글을 적는 시점에서 최신버전은 2.11.1 이니 그걸로 해보자. 과정은 위의 링크와 동일.
먼저 빌드에 필요한 패키지들을 설치한다. 

# ipkg install wget make automake autoconf bison glib libc-dev libstdc++ m4 gcc gawk textutils gettext zlib



mono 2.11.1 의 소스를 내려받고 압축을 푼다. 그리고 빌드 준비. 

configure 에서 --prefix 파라미터를 통해 /usr 가 아닌 /opt/mono-2.11 에 설치한다. 
혹시 나중에 제거할 일이 생겨도 이렇게 해 두면 편하다. 


# wget "http://download.mono-project.com/sources/mono/mono-2.11.1.tar.bz2"

# tar -xf mono-2.11.1.tar.bz2

# cd mono-2.11.1

# ./configure --prefix=/opt/mono-2.11.1



다음 파일들을 편집기에서 열어준다. 


mono/metadata/Makefile

mono/mini/Makefile

mono/profiler/Makefile



아래 라인을 찾아서 


LDFLAGS = 



-lrt 플래그를 추가해준다. 이유는 여기를 클릭. 


LDFLAGS = -lrt 



ipkg 에서 제공되는 pthreads 라이브러리에 문제가 있기 때문에, 빌드를 위해서는 원래의 pthreads 로 바꿔주어야 한다. 

방법은 다음과 같다. 

# mkdir /opt/arm-none-linux-gnueabi/lib_disabled
# mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
# cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread.so
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread-2.5.so


DS110j 는 아주 느린 환경이므로 빌드는 지루한 작업이다. 
혹시라도 중간에 네트웍에 문제가 생겨 SSH 연결이 끊기면 말짱 황이므로 screen 의 사용을 적극 권장한다. 

# ipkg install screen


screen은 딱 네가지만 기억하면 된다. 실행은 screen, 디태치는 Ctrl+A+D, 다시 붙일 때는 screen -r, 종료는 exit. 
좀 더 자세한 사용기는 여기를 클릭

이제 빌드 시작. 

# make


정말 하루 종일 걸린다. 헥헥... 다 끝났으면 다음 명령으로 /opt/mono-2.11.1 에 설치

# make install


인생을 좀 편하게 살기 위해 몇개의 심볼릭 링크를 만들어주자. 

# ln -s /opt/mono-2.11.1/bin/mono /opt/bin/mono
# ln -s /opt/mono-2.11.1/bin/mcs /opt/bin/mcs
# ln -s /opt/mono-2.11.1/bin/gmcs /opt/bin/gmcs


실행시켜보면 

# mono --version







설치가 끝났으니 제대로 굴러가는지 테스트를 해 봐야지. 
SharpDevelop 를 실행시키고 간단한 콘솔프로그램을 만들어 보자. 



윈도에서 실행시킨 모습. 





컴파일된 console.exe 를 NAS 로 옮겨서 돌려보자. 

# mono ./console.exe



지난번 포스트에서 테스트했던 간단한 C# 에코서버도 물론 잘 동작한다. 



초기 구동은 아무래도 느리지만, 반응은 제법 빠릿빠릿 하다. 아주 만족스럽네.
간단한 채팅서버나 작은 게임서버 정도는 충분히 돌릴 수 있을 듯. 



Synology NAS의 MySQL 테이블 대소문자 구분 설정

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

윈도의 MySQL 에서 작성한 DB 스키마를 Synology NAS 의 MySQL로 옮겨 테스트 하자마자 쏟아지는 에러. 

CREATE TABLE 또는 CREATE DATABASE 에서 대소문자를 예쁘게 구분해봐야 저장될 때는 소문자로 저장되는게 어찌 희안하더라니... 

윈도의  MySQL 에서는 SQL문 내의 테이블과 데이터베이스에서 대소문자를 구분하지 않지만, NAS의 리눅스에서는 구분하고 있다. 

일단 SQL문을 뜯어고쳐 대소문자를 맞춰주기는 했는데... 덕분에 아무래도 유기농 코드가 잔뜩 만들어진 듯...  (벌레 벌레~)

윈도와 리눅스의 MySQL 설정이 달라서 애를 먹은 게 한두번이 아니었지만... 그래도 이건 좀 아니잖아. 

이 설정을 동일하게 맞추는 방법이 없을까 하고 뒤져보니  lower_case_table_names 를 살펴보란다. 


http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html



이 변수의 기본값이 윈도와 맥에서는 1로, 리눅스에서는 0으로 설정된다고 한다. 각 값의 의미는 다음과 같다. 


의미
0테이블과 데이터베이스 이름들은 CREATE TABLE 또는 DATABASE 문에 정의된 문자로 디스크에 저장되며 이름 비교시 대소문자를 구분한다.
1테이블과 데이터베이스 이름들은 소문자로 저장되고 이름 비교시 대소문자를 구분하지 않는다.
2테이블과 데이터베이스 이름들은 CREATE TABLE 또는 DATABASE 문에 정의된 문자로 디스크에 저장되며 이름 비교시 대소문자를 구분하지 않는다.


가성비가 떨어지는데도 불구하고 Synology NAS를 좋아하는 건, SSH 연결을 지원하기 때문이지.
부트스트랩을 통해 이런저런 도구들도 마음대로 설치할 수 있고...

http://lycons.iptime.org/tc/49


요새는 QNAP 것도 끌리는데... 어디 출장 나가는 사람 없나... 가격 차이가 이건 뭐 두배나 나니...


아무튼 SSH로 접속한 다음 my.cnf 를 찾아보자. 응? 그렇게 생긴 파일이 하나도 없네??

my*.cnf 로 검색해보니 다섯개의 파일이 튀어나온다. 


# find / -name my*.cnf

/usr/syno/mysql/share/mysql/my-huge.cnf

/usr/syno/mysql/share/mysql/my-small.cnf

/usr/syno/mysql/share/mysql/my-innodb-heavy-4G.cnf

/usr/syno/mysql/share/mysql/my-large.cnf

/usr/syno/mysql/share/mysql/my-medium.cnf



현재 사용중인 물건은 메모리 128M짜리 DS-110j



my-medium.cnf 을 설정파일로 사용하면 되겠군. 이 파일을 /ect/my.cnf 로 복사한다. 


# cp /usr/syno/mysql/share/mysql/my-medium.cnf /etc/my.cnf



my.cnf 파일을 열고 [mysqld] 항목 아래에 다음 설정을 추가. 


lower_case_table_names = 1



NAS의 mysql 데몬 재구동은 다음과 같이. 


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



제대로 설정되었는지 확인하려면 아래 SQL을 실행. 


SHOW VARIABLES LIKE  'lower_case_table_names'


Variable_nameValue
lower_case_table_names1


우분투의 경우도 요령은 동일하다. 



오픈캡쳐에 대한 독백

이런저런잡다구리/잡설
점심 먹고 델마당 눈팅하다 혈압 만땅 오름. 

더러운 국산 소프트웨어는 예의가 없다던 글이 멀쩡히 있는데 
주어가 없으니 인수업체에 대한 비난으로 해석하라.
아전인수도 참 가지가지.  
그 말이 성립하려면 오캡의 십년간의 노고에 대해 
위로 한마디쯤 하는 게 예의라는 거 진정 모르는 걸까. 

글의 행간을 자신의 의도에 맞추어 파악해야 한다고 강변하면서
그 멋지고 잘난 "관심법"을 왜 자기들에게는 못쓰지.  

저런 잡것들과 동업자라는 느낌에 
강좌 쓰고 세미나 하고 질문에 답하던
내 자신이 참 븅딱같다. 

뭐 어때. 내 블로그에 이런 글도 못적나.
보기 싫으면 오지 마. 
오프라인에서 항상 하는 얘기지만, 나 성격 별로 안좋아. 

착한 사람인 척 해봐야 다 벗겨먹고 
껍질만 남으면 퉤 뱉을 인간들 주제에 
댓글 달지 마. 꼴도 보기 싫으니까. 

PHP 컴파일러 HipHop for PHP from facebook

이런저런잡다구리/LinuxHeaven
PHP코드를 C++코드로 변환, g++로 빌드할 수 있게 하는 물건. 
결과물로 libevent 를 사용한 독립 웹서버 실행파일이 떨어진다. 
페이스북에서 쓰이고 있으며 성능 개선이 상당하다고 한다. 
모든 PHP 코드가 다 동작하는 것은 아니겠지만 관심이 무럭무럭!!

일단 홈페이지. 
https://github.com/facebook/hiphop-php/wiki/

한글로 된 소개글
http://enzine.tistory.com/entry/HipHop-for-PHP-%EB%8D%94-%EB%B9%A0%EB%A5%B8-PHP%EB%A5%BC-%EC%9C%84%ED%95%B4

KLDP의 새소식
http://kldp.org/node/112325

먼저 써보신 분의 의견. 
http://code.p-ark.co.kr/167 





레드마인을 위해 설치해 둔 우분투 10.04에 깔아보자. 9.10에 설치하는 참고링크는 여기.
https://github.com/facebook/hiphop-php/wiki/Building-and-Installing-on-Ubuntu-9.10
10.10용은 여기. (명색이 LTS인 10.04만 빠져있네...) 
https://github.com/facebook/hiphop-php/wiki/Building-and-Installing-on-Ubuntu-10.10


먼저 관련프로그램 설치. 

sudo apt-get install git-core cmake g++ libboost-dev libmysqlclient-dev libxml2-dev libmcrypt-dev libicu-dev openssl binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev wget memcached libreadline-dev libncurses-dev libbz2-dev libc-client2007e-dev



9.10과 마찬가지로 10.04의 libmemcached 는 버전이 0.31이므로 쓸 수 없다. 0.39 이상이 필요하므로 따로 빌드. 

HipHop 소스 얻기. 

mkdir hiphop
cd hiphop
git clone git://github.com/facebook/hiphop-php.git
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
git submodule init
git submodule update
cd ..



LIBEVENT 빌드.

wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar -xzvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
cp ../hiphop-php/src/third_party/libevent-1.4.13.fb-changes.diff .
patch -p1 < libevent-1.4.13.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..



ICU4 빌드

wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz
tar -xvzf icu4c-4_2_1-src.tgz
cd icu/source
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ../../




LIBCURL 빌드. 시스템 시간 잘 맞추지 않으면 ./configure 가 실패한다네. 
중간에 패치가 필요하므로 지정된 버전을 쓸 것. 

wget http://curl.haxx.se/download/curl-7.20.0.tar.gz
tar -xvzf curl-7.20.0.tar.gz
cd curl-7.20.0
cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
patch -p1 < libcurl.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..



LIBMEMCACHED 빌드. 현재 최신버전인 0.49로

wget http://launchpad.net/libmemcached/1.0/0.49/+download/libmemcached-0.49.tar.gz
tar -zxvf libmemcached-0.49.tar.gz
cd libmemcached-0.49
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..



HipHop 빌드. 걸어놓고 밥먹고 오자. 

cd hiphop-php
cmake . <- 점 주의!
make



hphp 바이너리가 src/hphp 에 생성된다. 

  



테스트. 사용법은 일단 여기.
https://github.com/facebook/hiphop-php/wiki/Running-HipHop


먼저 hphp를 체크아웃 한 디렉토리로 이동. (내 경우 ~/hiphop/hiphop-php)

export HPHP_HOME=`pwd`
export HPHP_LIB=`pwd`/bin



우분투에서는 추가로 이렇게 해주라는군.

export CMAKE_PREFIX_PATH=`/bin/pwd`/../



예전 GD 가지고 놀 때 코드를 한번 컴파일 해보자. 
적당한 디렉토리에 예제 php 파일 생성. 


ip-test.php
  

<?php
$img_number = imagecreate(140,25);
$backcolor = imagecolorallocate($img_number,255,255,255);
$textcolor = imagecolorallocate($img_number,50,104,28);

imagefill($img_number,0,0,$backcolor);
$number = "IP - $_SERVER[REMOTE_ADDR]";

Imagestring($img_number,3,0,5,$number,$textcolor);

header("Content-type: image/jpeg");
imagejpeg($img_number);
?>



컴파일

$HPHP_HOME/src/hphp/hphp ip-test.php -k 1 --log=3 --force=1 




임시 디렉토리 (내 경우에는 /tmp/hphp_TFludl) 에 실행파일이 생성된다. 
8080포트에서 구동시키는 예. 80포트로 띄우려면 관리자권한(sudo)이 필요하다. 

/tmp/hphp_TFludl/program -m server -p 8080


 
해당 서버에 접속해보자. http://my-ubuntu:8080/ip-test.php
결과는 짜잔~~





GD 테스트를 조금 더 해본다. 
프리타입이 동작하는지도 확인해보자. 윈도의 gulim.ttc 를 /tmp 에 복사해넣자. 

gd-test.php

<?php
// 이미지 생성
$image_test = ImageCreate(200,150);

// 색의 설정
$grey = ImageColorAllocate($image_test,200,200,200);
$blue = ImageColorAllocate($image_test,0,0,255);

imagefill($image_test,10,0,$grey);

// 내장폰트 사용 예
Imagestring($image_test,3, 25,50,"hahaha",$blue);

// 프리타입으로 TTF 폰트 사용 예
Imagefttext($image_test,10, 0, 25, 100, $blue, "/tmp/gulim.ttc", "우하히");

header("Content-type: image/png");
imagepng($image_test);
ImageDestroy($image_test);
?>



HipHop은 컴파일 이전에 이 PHP가 제대로 동작할지를 미리 확인해볼 수 있는 hphpi 를 제공한다. 

$HPHP_HOME/src/hphpi/hphpi  -m server -p 8080



현재 디렉토리를 기준으로 서버가 동작한다. 매번 빌드하는 것도 시간이 걸리는 일이므로, 이걸 쓰면 지금 작성중인 코드가 HipHop에서 잘 동작하는지 확인해 볼 수 있다. 

접속해보면 잘 처리되는데... 



이 PHP 파일에 include, 또는 include_once 를 써서 다른 PHP 유니트를 포함시키면 이미지 출력이 제대로 되지 않는다. 
이미지 출력을 위해 사용되는 header(), imagepng() 등의 함수가 아예 동작하지 않는 듯 하다. 
현 시점에서 GD 관련해서는 단일 유니트만 사용 가능할 듯. 진심으로 아쉬운 부분... 




예전 게임서버는 DB 입출력을 담당하는 에이전트 서버를 통해 각종 정보를 저장해 왔었다. 
이 경우 운영도 귀찮고 뭐 하나 바꾸려 할때 만져야 할 부분이 참 많다. 

때문에 로그 저장 서버는 상대적으로 편한 PHP + xmlrpc 를 써서 만들었었고
나중에 게임서버를 새로 만든다면 DB 입출력은 이 방식으로 하리라 마음먹었었는데...

HipHop을 이용하면 그 부분도 네이티브 바이너리로 굴릴 수 있다는 이야기. 
퍼블리셔에 텍스트로 된 PHP 파일을 그대로 전달해야 하는 찝찝함도 더불어 해결. 

다만 생성된 실행파일의 크기가 약 20메가 정도로 큰 편인데, UPX로 압축하면 7메가 정도로 줄어든다. 

# sudo apt-get install upx-ucl
# upx program


서버에서 실행파일의 크기야 별 의미가 없겠지만... 

언제 시간날 때 VCL4PHP 를 빌드해봐야겠다. 
 



 
2011.8.6. XMLRPC 를 HipHop for PHP로 구동시켜보자. 
 
디렉토리 구성은 다음과 같이.


루트
test.php : 에코함수인 EchoFunc() 가 구현된 서버.
  • lib : php-xmlrpc 의 lib

먼저 제대로 동작하는지 테스트 해보자. 
 

$HPHP_HOME/src/hphpi/hphpi -m server -p 8080


 
접속해보면 자알~~ 동작한다.
이제 빌드해보자.

먼저 웹루트에서 다음과같이 파일목록을 만든다.

find . -name "*.php" > files.list



files.list 의 내용은 다음과 같다. 

./test.php
./lib/compat/var_export.php
./lib/compat/is_scalar.php
./lib/compat/is_callable.php
./lib/compat/is_a.php
./lib/compat/array_key_exists.php
./lib/compat/version_compare.php



test.php 의 내용은 다음과 같다. 

<?php

include("lib/xmlrpc.inc");
include("lib/xmlrpcs.inc");

$xmlrpc_internalencoding="UTF-8";

/****************************************************************
 테스트. 에코함수.
****************************************************************/

$EchoFunc_sig = array(array($xmlrpcString, $xmlrpcString));
$EchoFunc_doc = "에코함수!!";

function EchoFunc($m) {
        // 전달된 XML에서 인자값을 뽑아낸다.
        $s=$m->getParam(0);
        $msg = $s->scalarval();
        return new xmlrpcresp(new xmlrpcval("니가 웹서버에 보낸 메시지: " . $msg, "string"));
}

/****************************************************************
 서버 구동
****************************************************************/
$s = new xmlrpc_server(array(

        "EchoFunc" => array(
                "function" => "EchoFunc",
                "signature" => $EchoFunc_sig,
                "docstring" => $EchoFunc_doc
                ),

        ));
?>

 

힙합으로 빌드. 

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 \
--include-path="." --force=1 --cluster-count=50 \
-v "AllDynamic=true" -v "AllVolatile=true"



/tmp/hphp_ahNFdu 폴더가 생성됨.

80포트를 쓰지 않는다면 sudo 권한은 필요없음. 다음과 같이 구동. 
 

/tmp/hphp_ahNFdu/program -m server -p 8080


아주아주아주 잘 동작하네~~

신기한건 test.php 코드내에서 포함시킨 "xmlrpc.inc", "xmlrpcs.inc" 유니트가 files.list 내에 없어도 제대로 동작한다는 것... 
include() 로 포함시킬 때 함께 들어가게 되는건지... 흠...  
 

우분투 서버에서 로컬 네트웍의 호스트명 검색하기

이런저런잡다구리/LinuxHeaven
예전에서는 로컬 네트워크상의 컴퓨터에 이름으로 핑을 때리면 분명히 되었었는데... 새로 설치한 머신에서는 안된다. 
일단 임의로 /etc/hosts 에 박아넣었는데... "ubuntu local network hostname" 로 검색하니 첫번째 글 내에 이런 글이 링크되어있다. 
http://ubuntuforums.org/showthread.php?t=391601&highlight=resolution

대충 윈도는 wins 를 쓰고 우분투는 dns가 기본이라 그렇다는데... 암튼 되게 하려면 etc/nsswitch.conf  파일에 /etc/hosts 설정 외에 wins 값도 읽도록 적어주라는 듯... 

hosts: files wins
 


그 외...
http://ubuntuforums.org/archive/index.php/t-445174.html
 



실제 적용. 

관리자 권한으로 /etc/nsswitch.conf 파일 편집. 

다음 부분을 찾아
 

hosts:          files dns



이렇게 수정

hosts:          files wins dns


이제 예전처럼 로컬네트웍의 다른 컴퓨터를 호스트명으로 검색할 수 있다. 좋구나~~
 


2015. 8. 10. 추가. 

http://www.beginninglinux.com/home/network/ubuntu-and-resolving-hostnames-on-lan