libxml2 XML파서

Web | 2010.04.13 15:56 | Posted by imesu-문경원

구글에서 libxml2

http://codezip.tistory.com/185 

<출처> http://pchero21.com/77

 1. libxml2 설치

 - libxml2 는 XML C 파서( parser ) 로서 리눅스의 Gnome 프로젝트를 위한 툴킷되는 도구이며 MIT 라이센스하에서는 자유로는 자유로운 소프트웨어임. 또한 libxml2 는 Linux 뿐 아니라 Unix, 윈도우, Cygwin, MacOS, OS/2 등 다양한 시스템에서 큰 문제없이 설치되고 작동될 수 있음.

 - 홈페이지 : http://www.xmlsoft.org

 - libxml2 다운받기
wget ftp://ftp.superuser.co.kr/etc/libxml2-2.6.16.tar.gz

 - 압축풀기
tar xvfz libxml2-2.6.16.tar.gz

 - 디렉토리 이동
cd libxml2-2.6.16

 - configure
./configure --prefix=/usr/local/libxml2

 - make
make
 
 - make install
make install

[아파치] Servername 변경하지 않아도 되는 방법

Web | 2009.08.04 18:32 | Posted by imesu-문경원

임베디드 장비에 아파치 웹서버를 포팅하고 자동으로 실행하려면 어떻게 해야 될까?

장비마다 여러가지 방법이 있겠지만.

내가 사용하는 ez-2410 보드에서는 우선 /etc/rc.local 파일에 자동으로실행하기 위해 한줄을 추가하자.

ServerName *


*를 설정하며 웹서버가 설치된 장비의 IP를 모르거나 DNS를 모를 경우 "*"를 설정하면 된다.

<참조>http://httpd.apache.org/docs/2.2/ko/vhosts/examples.html


내 장비에 맞게 설정한 httpd.conf 파일

ServerName *
ScriptAlias /cgi-bin/ "/app/cgi-bin/"



우선은 이정도만

SeverName을 입력하지 않으면 아파치가 가동이 되지 않는데 내가 사용하는 타켓보드가 많아지면
그때만다 손으로 수정하기 참 곤란했다.

그런데 "*"로 간단히 해결되다니 ^^ 급 행복해지네 ㅋㅋ

[아파치] httpd-2.2.8포팅하기

Web | 2009.06.16 16:14 | Posted by imesu-문경원


서론



아파치를 포팅하려고 자료를 많이 검색해 봤는데. 가장 헷갈리는게 이름이였다.

어떤 파일은 apache-x.x.x 로 된게 있고, 어떤건 httpd-x.x.x 라고 된것도 있다.

둘다 다른건가?????  무지하게 궁금했다.

그런데!!! 두둥~~ 같은 거란다.

솔직히 아직도 같다는 말에 의심이 가긴하지만, 같다고 하니 같다고 생각할란다.

왜냐하면 내가 사용하려고 하는 웹서버의 기능이 그리 복잡하지도 않고, apache 나 httpd 어쩌구 저쩌구나 둘다 가지고 있기 때문이다.

아피치 다운로드 사이트로 보면 둘간의 apache 버전 번호가  httpd 버젼 번호보다 낮은걸 보니 나중에 이름만 바뀐건 아닐까 유추할 수 있지만. 정확히는 잘 모르겠다.

아무튼 현재 나에게 둘간의 구분이 별로 필요하지 않다는 결론을 내렸고,

내가 가지고 있는 타겟보드 ez2410 에 포팅을했다.

자 진행한다.


본론



(apachi)http://blog.theple.com/ehlee/folder/4.html?uid=76
(ssl)http://kurapa.com/content-a894
(다운로드)http://archive.apache.org/dist/httpd/
(참고자료): http://webnautes.tistory.com/165


필자의 개발환경
OS : linux -fedora
Kernel : 2.6.11-1.1369_FC4
Machine : ARM

Target 환경
OS : linux
Kernel : 2.6.13.5-ez-s2410
Machine : iMDC - arm (S3C2410)

 


1) /usr/local/apache2 디렉토리 생성
   - 은근히 중요하다. 보드에서도 아파치 웹서버가 위치할 곳이다.
  
2) 작업할 공간을 만들자. 우리는
 [root@backup 03_apche]# cd / 
  
 [root@backup /]# mkdir opt
 
 [root@backup ~]# cd opt/


3) 아파치 설치전 아래의 것을 설치하자 (역할은 잘 모르겠다)
 [root@backup opt]# tar zxvf expat-2.0.0.tar.gz
 
 [root@backup opt]# cd expat-2.0.0
 
 [root@backup expat-2.0.0]# ls
 COPYING  MANIFEST     README  bcb5       configure.in  doc       expat.dsw          lib    vms    xmlwf
 Changes  Makefile.in  amiga   configure  conftools     examples  expat_config.h.in  tests  win32

4) 아파치 압축을 풀자

 [root@backup opt]# tar -zxvf httpd-2.2.8.tar.gz
 [root@backup opt]# cd httpd-2.2.4
 [root@backup opt]# ./configure --with-included-apr --enable-so && make


5)컴파일이 완료되면 실행파일 2개를 복사해둔다.

 [root@backup httpd-2.2.8]# cp srclib/pcre/dftables /opt/
 [root@backup httpd-2.2.8]# cp server/gen_test_char /opt/

 
6) 우선 기존의 컴파일 결과들을 지우자.

 [root@backup httpd-2.2.8]#  make distclean


7) configure을 실행한다.
 
 [root@backup httpd-2.2.8]#ac_cv_file_dbd_apr_dbd_mysql_c=no ac_cv_sizeof_size_t=4 ac_cv_sizeof_ssize_t=4 ac_cv_sizeof_int=4 apr_cv_tcp_nodelay_with_cork=no apr_cv_process_shared_works=no ac_cv_func_setpgrp_void=no ac_cv_file__dev_zero=no ap_void_ptr_lt_long=no LD=arm-linux-ld CC=arm-linux-gcc CPP=arm-linux-cpp STRIP=arm-linux-strip OBJCOPY=arm-linux-objcopy RANLIB=arm-linux-ranlib  ./configure --prefix=/usr/local/apache2 --target=arm-linux --build=i686 --host=arm-linux --with-included-apr --enable-so --with-expat=/nfsroot/xstation
  <주의>
   httpd-2.2.10 이상의 버전은 아래의 에러메시지가 나온다. 이유는 모르겠다. 확인 결과 (httpd-2.2.8) 이하 버젼만 괜찮다.
     ] 에러 메시지
    configure: error: Size of "void *" is less than size of "long"

 
  
  
8) make 를 실행한다. 에러가 나오면 수정한다.

 [root@backup httpd-2.2.8]# make
 Making all in srclib
 make[1]: Entering directory `/opt/httpd-2.2.8/srclib'
 Making all in apr
 make[2]: Entering directory `/opt/httpd-2.2.8/srclib/apr'
 make[3]: Entering directory `/opt/httpd-2.2.8/srclib/apr'
 /bin/sh /opt/httpd-2.2.8/srclib/apr/libtool --silent --mode=compile arm-linux-gcc -g -O2   -DHAVE_CONFIG_H -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE   -I./include -I/opt/httpd-2.2.8/srclib/apr/include/arch/unix -I./include/arch/unix -I/opt/httpd-2.2.8/srclib/apr/include  -o passwd/apr_getpass.lo -c passwd/apr_getpass.c && touch passwd/apr_getpass.lo
 In file included from ./include/apr_pools.h:37,
                  from /opt/httpd-2.2.8/srclib/apr/include/arch/unix/../apr_private_common.h:24,
                  from /opt/httpd-2.2.8/srclib/apr/include/arch/unix/apr_private.h:812,
                  from passwd/apr_getpass.c:22:
 ./include/apr.h:400:2: #error no decision has been made on APR_PATH_MAX for your platform
 make[3]: *** [passwd/apr_getpass.lo] 오류 1
 make[3]: Leaving directory `/opt/httpd-2.2.8/srclib/apr'
 make[2]: *** [all-recursive] 오류 1
 make[2]: Leaving directory `/opt/httpd-2.2.8/srclib/apr'
 make[1]: *** [all-recursive] 오류 1
 make[1]: Leaving directory `/opt/httpd-2.2.8/srclib'
 make: *** [all-recursive] 오류 1
 
 
 아래의 아래가 왜 발생하는지 잘 모르겠다. 그래서 그냥 주주석 처리 하였다.
 ./include/apr.h:400:2: #error no decision has been made on APR_PATH_MAX for your platform
 
 [root@backup httpd-2.2.8]# vi /opt/httpd-2.2.8/srclib/apr/include/apr.h
   <변경전 >
     399 #else
     400 #error no decision has been made on APR_PATH_MAX for your platform
     402 #endif
    
     <변경후>
     399 #else
     400 #define APR_PATH_MAX 255
     401 /*#error no decision has been made on APR_PATH_MAX for your platform*/
     402 #endif       
 
 <주의>
 APR_PATH_MAX 에 대한 정의 문제가 나오면 해당 파일 (httpd-2.2.8/srclib/apr/file_io/unix.dir.c)
 에서 APR_PATH_MAX을 18정도로 정의해 줬다. 아직 문제가 발생하지는 않았다.

 (원본)
 #if defined(PATH_MAX)
 #define APR_PATH_MAX       PATH_MAX
 #elif defined(_POSIX_PATH_MAX)
 #define APR_PATH_MAX       _POSIX_PATH_MAX
 #else
 
 
 #define APR_PATH_MAX 18
 #if defined(PATH_MAX)
 #define APR_PATH_MAX       PATH_MAX
 #elif defined(_POSIX_PATH_MAX)
 #define APR_PATH_MAX       _POSIX_PATH_MAX
 #else
 (추가)
 
 [root@backup httpd-2.2.8]# make
  arm용 apache server를 크로스 컴파일 환경에서 진행 하기 때문에 컴파일 도중에 실행파일을 실행시킬 수 없어 에러가 두 번 난다. pc용으로 컴파일시 백업해 놓았던 실행파일들을 복사 해 준 후, 계속 진행하면 된다.
 
 [root@backup httpd-2.2.8]# cp /opt/dftables srclib/pcre/
  ./dftables /opt/httpd-2.2.8/srclib/pcre/chartables.c
  ./dftables: ./dftables: cannot execute binary file
  make[3]: *** [/opt/httpd-2.2.8/srclib/pcre/chartables.c] 오류 126
  make[3]: Leaving directory `/opt/httpd-2.2.8/srclib/pcre'
  make[2]: *** [all-recursive] 오류 1
  make[2]: Leaving directory `/opt/httpd-2.2.8/srclib/pcre'
  make[1]: *** [all-recursive] 오류 1
  make[1]: Leaving directory `/opt/httpd-2.2.8/srclib'
  make: *** [all-recursive] 오류 1
 
 [root@backup httpd-2.2.8]# ../dftables /opt/httpd-2.2.8/srclib/pcre/chartables.c
 [root@backup httpd-2.2.8]# make
  ./gen_test_char > test_char.h
  /bin/sh: ./gen_test_char: cannot execute binary file
  make[2]: *** [test_char.h] 오류 126
  make[2]: Leaving directory `/opt/httpd-2.2.8/server'
  make[1]: *** [all-recursive] 오류 1
  make[1]: Leaving directory `/opt/httpd-2.2.8/server'
  make: *** [all-recursive] 오류 1
  
 
 [root@backup httpd-2.2.8]# cp /opt/gen_test_char server/
 [root@backup httpd-2.2.8]# make
 [root@backup httpd-2.2.8]# make install
 


9) 컴파일 된 디렉토리로 이동한다.
 [root@backup httpd-2.2.8]# cd /usr/local/apache2/ 
 [root@backup apache2]# du --si
  13k     ./lib/pkgconfig
  1.8M    ./lib
  488k    ./manual/vhosts
  140k    ./manual/rewrite
  484k    ./manual/programs
  201k    ./manual/ssl
  205k    ./manual/images
  17k     ./manual/faq
  279k    ./manual/platform
  4.1k    ./manual/style/lang
  91k     ./manual/style/latex
  58k     ./manual/style/css
  8.2k    ./manual/style/xsl/util
  250k    ./manual/style/xsl
  476k    ./manual/style
  226k    ./manual/developer
  5.5M    ./manual/mod
  422k    ./manual/howto
  369k    ./manual/misc
  12M     ./manual
  4.1k    ./logs
  62k     ./conf/extra
  62k     ./conf/original/extra
  82k     ./conf/original
  213k    ./conf
  17k     ./error/include
  213k    ./error
  1.9M    ./bin
  295k    ./build
  33k     ./man/man1
  62k     ./man/man8
  99k     ./man
  17k     ./modules
  29k     ./htdocs
  267k    ./icons/small
  967k    ./icons
  1.4M    ./include
  13k     ./cgi-bin
  18M     .
 
해당 디렉토리로 이동하여 컴파일된 apache server의 용량을 확인해보면
필요없는 manual디렉토리가 11M로 존재한다. 이 디렉토리를 지운 후, 계속 진행하자.

 [root@backup apache2]# rm -rf manual/
 [root@backup apache2]# du --si
  13k     ./lib/pkgconfig
  1.8M    ./lib
  4.1k    ./logs
  62k     ./conf/extra
  62k     ./conf/original/extra
  82k     ./conf/original
  213k    ./conf
  17k     ./error/include
  213k    ./error
  1.9M    ./bin
  295k    ./build
  33k     ./man/man1
  62k     ./man/man8
  99k     ./man
  17k     ./modules
  29k     ./htdocs
  267k    ./icons/small
  967k    ./icons
  1.4M    ./include
  13k     ./cgi-bin
  6.7M    .
  
10) 이제 설정 파일을 타켓 보드에 맟추어 설정하자.

 [root@backup apache2]# vi conf/httpd.conf
 
 <수정 전>
   97 #ServerName
www.example.com:80
 <수정 후>
     97 #ServerName
www.example.com:80
     98 ServerName 192.168.10.99:80
 
11) 타켓 보드에 옮기기 위해 /nfs 폴더에 복사하자.

 [root@backup local]# cp -a apache2 /nfs/
 
 
 
12) 타켓 보드에서  실행한다.
 [root@iDTECK nfs]$ cd /usr/local/apache2/
 [root@iDTECK apache2]$ ls
 bin      build    cgi-bin  conf     error    htdocs   icons    include  lib      logs     man      modules
 [root@iDTECK apache2]$ cd bin/
 [root@iDTECK bin]$ ls
 ab            apr-1-config  apxs          dbmmanage     envvars-std   htdbm         htpasswd      httxt2dbm     rotatelogs
 apachectl     apu-1-config  checkgid      envvars       htcacheclean  htdigest      httpd         logresolve
 [root@iDTECK bin]$ ./apachectl start
 /usr/local/apache2/bin/httpd: error while loading shared libraries: libexpat.so.1: cannot open shared object file: No such file or directory
 [root@iDTECK bin]$
 
 헉!! 실행하는데 에러 발생
 
13) host pc로 이동하여 libexpat.so.1 검색
 
 다행이도 host pc의 에서 발견 .. 제일 처음 expat-2.0.0.tar.gz 을 컴파일 하여 나온 라이브러리 이다. 굿~~
 [root@backup nfsroot]# find -name "libexpat.so.1"
 ./xstation/lib/libexpat.so.1 
 
 host pc에서 target보드와 공유하는 /nfs폴터에 복사하자.
 [root@backup nfsroot]# cp xstation/lib/libexpat.so.1 /nfs
  
14) target 보드에서 라이브러리를 복사하자.   
    [root@iDTECK lib]$ pwd
 /lib
 [root@iDTECK lib]$ cp /mnt/nfs/libexpat.so.1 ./
 
15)아파치를 실행한다.
[root@iDTECK lib]$ cd /usr/local/apache2/bin/
[root@iDTECK bin]$ ls
ab            apr-1-config  apxs          dbmmanage     envvars-std   htdbm         htpasswd      httxt2dbm     rotatelogs
apachectl     apu-1-config  checkgid      envvars       htcacheclean  htdigest      httpd         logresolve
[root@iDTECK bin]$ ./apachectl start
[root@iDTECK bin]$ ps
  PID  Uid     VmSize Stat Command
    1 root        500 S   init [3]  
    2 root            SWN [ksoftirqd/0]
    3 root            SW< [events/0]
    4 root            SW< [khelper]
    5 root            SW< [kthread]
   20 root            SW< [kblockd/0]
   23 root            SW< [khubd]
   70 root            SW  [pdflush]
   71 root            SW  [pdflush]
   73 root            SW< [aio/0]
   72 root            SW  [kswapd0]
  661 root            SW< [kseriod]
  718 root            SW  [mtdblockd]
  846 root        548 S   syslogd -m 0
  857 root        688 S   inetd
  860 root        480 S   /sbin/getty -L ttyFC 115200 vt100
  870 root            SW< [rpciod/0]
 1235 root        704 S   in.telnetd: 192.168.10.5                                                                                
 1236 root       1228 S   -bash
 1264 root        704 S   in.telnetd: 192.168.10.5                                                                                
 1265 root       1224 S   -bash
 1278 root        708 S   in.telnetd: 192.168.10.5                                                                                
 1279 root       1260 S   -bash
 1329 root       1728 S   /usr/local/apache2/bin/httpd -k start
 1330 daemon     1724 S   /usr/local/apache2/bin/httpd -k start
 1331 daemon     1724 S   /usr/local/apache2/bin/httpd -k start
 1332 daemon     1724 S   /usr/local/apache2/bin/httpd -k start
 1333 daemon     1724 S   /usr/local/apache2/bin/httpd -k start
 1334 daemon     1724 S   /usr/local/apache2/bin/httpd -k start
 1335 root        628 R   ps
[root@iDTECK bin]$


[임베디드 플럭스]ez2410 보드에서 동작 시키기

Web | 2009.06.16 15:44 | Posted by imesu-문경원

한 1년전에 FLEX에 대한 말을 들은적이 있다.

현재 개발 중인 장비에 웹서버를 올려서 웹페이지를 구성하고

이를 통해서 장비를 제어할 목적이였다.

가장 큰 난관은 바로 어떤 기술적인 요소가 필요하나 였다.

구글링해본 결관, 웹서버를 올리고, HTML로 웹페이지를 구성하고, CGI를 더해주면 되겠다는 결론에 도달했는데.

골치아픈 문제는 여기서 부터 발생했다.

우선 웹프로그램에 까막눈이라, 웹서버가 어떻게 동작되는지도 모를 뿐더러 , 간단한 HTML문도 못 만들었고,

더구나 CGI가 뭔지도 몰랐다.

어째어째 흘러서 , 몇가지 웹서버도 포팅해보고 웹페이지도 만들었지만, 여전히 짜증나는 작업니다.
(웹프로그래머를 인내력을 존경하게 됬다. ^^)

그러던 와중에 falinux포럼에서 임베디드flex강좌를 봤는데

굉장히 매력적이였다.

우선 화면이 화려하고, 문법만 알면 손쉽게 프로그래밍이 가능할 것처럼 보이는 것이다. ^^

그래서 내가 늘 하던 방식으로 예제샘플을 구해서, 웹서버에 포팅하고, 익스플로러로 호출했는데....

그런데..!!!! 앗! 호출이 안된다. 아주 난감한 상황이다.

별짓을 다해봐도 안된다.

그거고 1년이 지났다. (다행해  웹에 대한 요구는 회사에서 잊혀져가고 있어서 살았다. ^^;)

최근에 다시 장비에 아파치웹서버를 올리고 동작 시켜 봤는데....ㅋㅋㅋㅋ

동작된다.

1년전에 안된 이유도 알거 같다.

1년전 안됐던 이유는 간단하다. boa 웹서버를 사용했고, 웹서버를 통해 호출했던 파일의 용량이 컸기 때문이다.

boa 를 이용해 개발해면서 html파일이 일정 사이즈를 넘어거지 전체 페이지가 호출안되고

일부만 호출되는 현상을 발견했을때 영감이 떠올랐다.

혹시 FLEX도 이 문제 때문에 그러지 않았을까..~~~

오늘 드디어 오늘 아파치웹서버를 올리고 버젼은 apache_1.3.41.tar.gz 걸 사용했다.

해당 샘플 소스는 /usr/local/apache/htdocs/ 에 복사했다.

[root@iDTECK htdocs]$ pwd
/usr/local/apache/htdocs
[root@iDTECK htdocs]$ ls -al
drwxrwxrwx    1 root     root          512 Jun 11  2008 .
drwxrwxrwx    1 root     root          512 Jun 11  2008 ..
-rwxr--r--    1 root     root          712 Jan  1 03:17 FileDownloadExample.html
-rwxr--r--    1 root     root         1100 Jan  1 03:17 FileDownloadExample.mxml
-rwxr--r--    1 root     root       130692 Jan  1 03:17 FileDownloadExample.swf
-rwxr--r--    1 root     root         1966 Jan  1 03:17 FileFilterExample.mxml
-rwxr--r--    1 root     root       209396 Jan  1 03:17 FileFilterExample.swf
-rwxr--r--    1 root     root         1642 Jan  1 03:17 FileSizeCheckExample.mxml
-rwxr--r--    1 root     root       140461 Jan  1 03:17 FileSizeCheckExample.swf
-rwxr--r--    1 root     root         1675 Jan  1 03:17 FileTypeFilter.as
-rwxr--r--    1 root     root          694 Jan  1 03:17 FileUploadExmaple.html
-rwxr--r--    1 root     root         1676 Jan  1 03:17 FileUploadExmaple.mxml
-rwxr--r--    1 root     root       143672 Jan  1 03:17 FileUploadExmaple.swf
-rwxr--r--    1 root     root          503 Jan  1 03:17 FileUploadLimitSize.as
-rwxr--r--    1 root     root        16787 Jan  1 03:17 MultiFileUpload.as
-rwxr--r--    1 root     root          704 Jan  1 03:17 MultiFileUploadExample.html
-rwxr--r--    1 root     root         3884 Jan  1 03:17 MultiFileUploadExample.mxml
-rwxr--r--    1 root     root       235658 Jan  1 03:17 MultiFileUploadExample.swf
-rwxr--r--    1 root     root          666 Jan  1 03:17 URLConfig.as
[root@iDTECK htdocs]$




인터넷 창을 하나 띄훈후에 내 보드의 IP를 입력하고 호출한 HTML파일을 적어넣었다.
http://192.168.10.61/FileUploadExmaple.html


앗싸! 호출된다. ㅠㅠ




●  참고자료











[Web]qDecoder 사용하기

Web | 2009.05.28 19:26 | Posted by imesu-문경원


qDecoder 컴파일 방법에 대하서 제 블러그에서 언급했습니다.

이번에 예제 샘플을 실행볼 차례군요..^^

심플 그대로 사용했는데도 처음에 안되더라구요.. Why!!! 기본에 충실하지 않았더군요.

우선 두개의 소스를 작성합니다. 우선 예제이니까 qDecoder.org에서 제공해 주는 예제를 조금만 바꿔서 사용해 보지요.

1. html 파일
2. cgi파일




1. HTML 로 화면 만들기





위의 소스에서 눈여겨 볼만한 부분은 바로 13번, 20번 라인의 내용입니다. 버튼을 누르면 itdc_outputtest.cgi  호출하게 됩니다.

그런데 보면 앞에 /cgi-bin/이라고 붙여 놓은게 있지요.~~ 왜그럴까요??

이유는 아주 간단합니다.

.

# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"             
-> /cgi-bin/ 을 /user/local/apche/cgi-bin/ 으로 대치한다.

#
# "/usr/local/apache/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

.
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

#
# "/usr/local/apache/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

.
.


위에서 보면  ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" 항목이 있습니다.

요것이 의미하는 것은 /cgi-bin/을   /user/local/apache/cgi-bin/ 으로 대체한다는 의미 입니다.

즉 누군가 /cgi-bin/을 호출하면 자동으로  /user/local/apache/cgi-bin/ 가 호출되는 거지요.

위의 html소스의 13번, 20번 라인을 보면 /cgi-bin/이 보이지요!!

그래서 "/cgi-bin/
itdc_outputtest.cgi " 을 호출하면 "/user/local/apache/cgi-bin/itdc_outputtest.cgi" 이 호출됩니다.

제가 처음에 한 실수는 /cgi-bin/을 생략하는 아주 간단한 실수 였습니다.
자세한 설명은 아래의 주소를 참조하면 됩니다.




2. cgi파일


이 파일 역시 qDecoder에서 샘플은 이용해 test 했습니다. session.cgi파일이데 이름만 itdc_outputtest.cgi로 바꿔서 했지요~




3. 마치며.


마지막으로 제가 실수했을때 나왔던 화면을 추가합니다.

[Web]qDecoder 설치법

Web | 2009.05.12 14:29 | Posted by imesu-문경원



 qDecoder






절차

1. 압축을 푼다.  버젼 : qDevoder-9.0.2
2. arm-linux-gcc로 검파일하게 configure를  실행한다.
3. make한다.
4. make install 한다.

위의 4단계로 쉬게 컴파일 하여 사용할 수 있다.
문제는 3번 단계에서 가끔 크로스 컴파일이 안되고 에러 메시지가 나오는데, 여기서 잠깐 주춤할 수 있지만.
에러 메시지를 살펴보면 답이 나옵니다. ㅋㅋ
해결 방법응 아래의 [실행순서] 에 나오니 참고 하세요.

컴파일이 완료되면 자신이 사용하고 있는 임베디드 보드에 옮겨 놓고 웹서버와 연동하여 test 하면 됩니다.

test 할때는 example디렉토리에 있는 샘플을 적절히 이용하면 아주 좋습니다.

실행순서


☞ 압축을 푼다.
[imesu@backup 07_qDecoder]$ tar -zxvf qDecoder-9.0.2.tar.gz                        

./qDecoder-9.0.2/
./qDecoder-9.0.2/configure.ac
./qDecoder-9.0.2/config.h.in
./qDecoder-9.0.2/configure
./qDecoder-9.0.2/Makefile.in
./qDecoder-9.0.2/doc/
./qDecoder-9.0.2/AUTHORS
./qDecoder-9.0.2/src/
./qDecoder-9.0.2/CHANGES
./qDecoder-9.0.2/qDecoder.jpg
./qDecoder-9.0.2/INSTALL
./qDecoder-9.0.2/config.sub
.
.
./qDecoder-9.0.2/doc/html/globals_func.html


[imesu@backup 07_qDecoder]$ ls
qDecoder-8.0  qDecoder-9.0.2

[imesu@backup qDecoder-9.0.2]$ ls
AUTHORS  COPYING  Makefile.in   config.h.in  configure     doc       install-sh    src
CHANGES  INSTALL  config.guess  config.sub   configure.ac  examples  qDecoder.jpg

[imesu@backup qDecoder-9.0.2]$ pwd
/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2
[imesu@backup qDecoder-9.0.2]$ ls
AUTHORS  COPYING  Makefile.in   config.h.in  configure     doc       install-sh    src
CHANGES  INSTALL  config.guess  config.sub   configure.ac  examples  qDecoder.jpg



☞ configure 에서 옵션(--host=arm-linux)을 주면 makefile에서 CC 부분에 자동으로 arm-linux-gcc가 된다.

[imesu@backup qDecoder-9.0.2]$ ./configure --host=arm-linux          
configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
checking for arm-linux-gcc... arm-linux-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether arm-linux-gcc accepts -g... yes
checking for arm-linux-gcc option to accept ANSI C... none needed
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln -s works... yes
checking whether make sets $(MAKE)... yes
checking for arm-linux-ranlib... arm-linux-ranlib
checking for ar... /usr/bin/ar
checking for chmod... /bin/chmod
checking for ld... /usr/bin/ld
checking for rm... /bin/rm
checking how to run the C preprocessor... arm-linux-gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for stdbool.h that conforms to C99... yes
checking for _Bool... yes
checking for dirent.h that defines DIR... yes
checking for library containing opendir... none required
checking sys/sendfile.h usability... yes
checking sys/sendfile.h presence... yes
checking for sys/sendfile.h... yes
checking for size_t... yes
checking for off_t... yes
configure: optional flags: 
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating examples/Makefile
config.status: creating config.h

 

[imesu@backup qDecoder-9.0.2]$ cd src/
[imesu@backup src]$ ls
Makefile             doxygen_tailer.html  qConfig.c    qEncode.c  qHasharr.c   qInternalCommon.c  qSed.c      qSocket.c
Makefile.in          md5                  qCount.c     qEntry.c   qHashtbl.c   qLog.c             qSem.c      qString.c
doxygen.conf         qCgiRequest.c        qDatabase.c  qFile.c    qHtml.c      qObstack.c         qSession.c  qSystem.c
doxygen_header.html  qCgiResponse.c       qDecoder.h   qHash.c    qInternal.h  qQueue.c           qShm.c      qTime.c


[imesu@backup qDecoder-9.0.2]$ ls /usr/local/
BerkeleyDB.4.7  apache2         apache_old  bin  boa_old  games    lib      man  sbin   src
apache          apache2.tar.gz  apr         boa  etc      include  libexec  php  share

[imesu@backup qDecoder-9.0.2]$ make
===> src
make[1]: Entering directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCgiRequest.o qCgiRequest.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCgiResponse.o qCgiResponse.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSession.o qSession.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHtml.o qHtml.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSocket.o qSocket.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSem.o qSem.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qShm.o qShm.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qDatabase.o qDatabase.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qEntry.o qEntry.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHashtbl.o qHashtbl.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHasharr.o qHasharr.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qQueue.o qQueue.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qObstack.o qObstack.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qConfig.o qConfig.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qLog.o qLog.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qString.o qString.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qFile.o qFile.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qEncode.o qEncode.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHash.o qHash.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSed.o qSed.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCount.o qCount.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qTime.o qTime.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSystem.o qSystem.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qInternalCommon.o qInternalCommon.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o md5/md5c.o md5/md5c.c
/usr/bin/ar -rc libqDecoder.a qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o
arm-linux-ranlib libqDecoder.a
/usr/bin/ld -G qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o -o libqDecoder.so.6
/usr/bin/ld: qCgiRequest.o: Relocations in generic ELF (EM: 40)
qCgiRequest.o: could not read symbols: File in wrong format
make[1]: *** [qdecoder] 오류 1
make[1]: Leaving directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'
<=== src

에러 발생 !!!!
내용을 살펴보니 뭔가 Cross Compile 안됐다.
우선 src에 들어가서 다시 컴파일 해보자!!!
여기서 보면 /user/bin/ld 유틸리티를 이용했기 때문에 에러가 발생한 것이다.
그럼 어떻게 하면 될까??
간단하다 우리가 사용하려고 하는 크로스 컴파일 path로 바꿔주면 된다.



☞ 아래 내용은 크로스 컴파일러 설치 위치에 따라 다를 수 있음으로 자신의 크로스 컴파일러가 설치된 디렉토리 정보를 검색한 후 arm용 으로 컴파일된 ld를 찾으면 된다.
[root@backup 07_qDecoder]# cd /usr/
[root@backup usr]# ls
X11R6  arm-linux  bin  etc  games  include  info  kerberos  lib  libexec  local  man  sbin  share  src  tmp
[root@backup usr]# cd arm-linux/
[root@backup arm-linux]# ls
bin  etc  include  info  lib  libexec  sbin  share  sys-include
[root@backup arm-linux]# cd bin/
[root@backup bin]# ls

ar  c++        g++  gencat   getent    iconv  ldd     localedef  nm             ranlib  sprof  tzselect
as  catchsegv  gcc  getconf  glibcbug  ld     locale  mtrace     pcprofiledump  rpcgen  strip  xtrace
[root@backup bin]# pwd
/usr/arm-linux/bin

여기서 보듯이 위치를 변경하자.
Makefile수정한다. 위치는 /qDecoder-9.0.2/src/Makefile이다.


     50 ## Utilities
     51 AR      = /usr/arm-linux/bin/ar
     52 ARFLAGS     = -rc
     53 CHMOD       = /bin/chmod
     54 INSTALL     = /usr/bin/install -c
     55 INSTALL_DATA    = ${INSTALL} -m 644
     56 LD      = /usr/arm-linux/bin/ld
     57 LDFLAGS     =  -G
     58 LN_S        = ln -s
     59 RANLIB      = arm-linux-ranlib
     60 RM      = /bin/rm

☞ make를 실행한다.
[root@backup qDecoder-9.0.2]# make
===> src
make[1]: Entering directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCgiRequest.o qCgiRequest.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCgiResponse.o qCgiResponse.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSession.o qSession.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHtml.o qHtml.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSocket.o qSocket.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSem.o qSem.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qShm.o qShm.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qDatabase.o qDatabase.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qEntry.o qEntry.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHashtbl.o qHashtbl.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHasharr.o qHasharr.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qQueue.o qQueue.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qObstack.o qObstack.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qConfig.o qConfig.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qLog.o qLog.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qString.o qString.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qFile.o qFile.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qEncode.o qEncode.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qHash.o qHash.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSed.o qSed.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qCount.o qCount.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qTime.o qTime.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qSystem.o qSystem.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o qInternalCommon.o qInternalCommon.c
arm-linux-gcc -g -O2 -Wall -fPIC -DHAVE_CONFIG_H  -I./  -c -o md5/md5c.o md5/md5c.c
/usr/arm-linux/bin/ar -rc libqDecoder.a qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o
arm-linux-ranlib libqDecoder.a
/usr/arm-linux/bin/ld -G qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o -o libqDecoder.so.6
/bin/chmod 0644 libqDecoder.so.6
/bin/rm -f libqDecoder.so
ln -s libqDecoder.so.6 libqDecoder.so
make[1]: Leaving directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'
<=== src

☞ make install  실행한다.
[root@backup qDecoder-9.0.2]# make install
(cd src/; make install)
make[1]: Entering directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'
/usr/arm-linux/bin/ar -rc libqDecoder.a qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o
arm-linux-ranlib libqDecoder.a
/usr/arm-linux/bin/ld -G qCgiRequest.o qCgiResponse.o qSession.o qHtml.o qSocket.o qSem.o qShm.o qDatabase.o qEntry.o qHashtbl.o qHasharr.o qQueue.o qObstack.o qConfig.o qLog.o qString.o qFile.o qEncode.o qHash.o qSed.o qCount.o qTime.o qSystem.o qInternalCommon.o md5/md5c.o -o libqDecoder.so.6
/bin/chmod 0644 libqDecoder.so.6
/bin/rm -f libqDecoder.so
ln -s libqDecoder.so.6 libqDecoder.so
/usr/bin/install -c -m 644 qDecoder.h /usr/local/include/qDecoder.h
/usr/bin/install -c -m 644 libqDecoder.a /usr/local/lib/libqDecoder.a
/usr/bin/install -c -m 644 libqDecoder.so.6 /usr/local/lib/libqDecoder.so.6
/bin/rm -f /usr/local/lib/libqDecoder.so
ln -s /usr/local/lib/libqDecoder.so.6 /usr/local/lib/libqDecoder.so
make[1]: Leaving directory `/nfs/imdc/imesu/002_web_prg/07_qDecoder/qDecoder-9.0.2/src'

[root@backup qDecoder-9.0.2]#


 

[CGI] 개념

Web | 2009.04.09 14:35 | Posted by imesu-문경원

1. 웹문서의 종류 및 동작 원리

1.1 정적 문서

정적 문서란 순수하게 HTML문서로만 만들어진 문서를 생각하면 된다.
서버에서 전달 받은 문서를 클라이언트에서 일방적으로 실행 시키기만 하는 문서이다. 
그래서 클라이언트에 의해 문서의 내용이 변하지 않고, 수정될 수도 없다.

즉 데이터의 전송방향이 서버에서 클라이언트로 일방적으로 보내진다.




1.2 활성문서 (Active Document)

활성문서는 서버에서 전달 받은 문서가 클라이언트에서 실행되면서 화면이 움직일 수 있다.
정적 문서와 마찬 가지로 데이터의 전송 방향이 서버에서 클라이언트로 일방적으로 보내기 때문에 클라이언트에 의해 문서의 내용을 바꿀 수 없다.

자바 스클립트 , 플래시 등이 이에 해당한다.



1.3. 동적 문서 (Dynamic Document)

동적 문서는 클라이언트가 문서를 요청하면, 서버의 http데몬이 프로그램을 실행 시키고 그 결과를 웹문서로 클라이언트에게 전달하게 된다. 

우리가 하려는 CGI문서가 여기에 해당한다.  

[펌]zLib압축알고리즘

Web | 2009.04.04 15:30 | Posted by imesu-문경원



Zlib Library Manual


Table of Contents

  1. Zlib library에서 사용하는 알고리즘
  2. Lempel-Ziv Algorithm
  3. Huffman Coding Algorithm
  4. Gzip 파일의 구조
  5. ZIP 파일의 구조
  6. Visual C++ 6.0에서 Zlib library 사용하기
  7. 기초 지식
  8. Zlib Utility Function Manual
  9. Zlib Basic Function Manual
  10. Zlib Advanced Function Manual

권장 사항

일반적인 경우에는 Zlib Library에서 사용하는 알고리즘의 내용을 읽을 필요가 없을 것이다. 특히 Utility Function만을 사용할 경우에 그렇다. 하지만 Basic Function을 사용할 때에는 한번쯤 읽어두는 것이 도움이 될 것이다.

Gzip 파일의 구조는 알아둘 필요가 있다. Utility Function으로는 압축된 데이터 이외의 정보를 다룰 수가 없다. Header 또는 Trailer에 저장된 여러 정보가 필요할 경우에는 GZIP 파일의 구조를 알아야 할 것이다.


참고 문헌

[펌]웹서버 자료

Web | 2009.04.04 13:50 | Posted by imesu-문경원

 

   

How to Implement a Web Application Framework in an Embedded Linux System     

As devices are increasingly more networked, an embedded web server is becoming a standard way for users to interact with and configure an embedded device using a standard web browser.  As an example, most pieces of networking equipment (such as routers and wireless access points) are configured this way.  There are many ways to implement a web server.  One way is to just write a monolithic program that handles the requests and outputs HTML using print statements.  Without a lot of planning, you usually end up with something where logic is intermixed with presentation.  The disadvantage of such an approach is that it quickly becomes very difficult to maintain your web application as it grows and changes.  The current best practice with web application frameworks (such as Ruby on Rails) splits a web application into 3 distinct components (Model, View, Controller -- MVC) so that changes to one component can be made with minimal impact to others.  This article details a solution used in a recent project to implement such an architecture  using the following open source components: SQLite, Clearsilver, and Python.  The challenge was to find a solution that performed acceptably on a resource constrained 130MHz ARM-Linux system. 

 Components Used

The requirements for the web application framework for this system are:

  • Footprint must be fairly small -- less than 10MiB.
  • Must enable us to implement a clean MVC type architecture.
  • Must support a high level language like python for rapid development.
  • Includes a database.
  • Reasonable performance -- less than 1 second to render a typical page.

After researching and testing several options, the following components were chosen to implement the framework:

  • Web Server: Cherokee (1MiB)
  • Model: SQLite  (290KiB)
  • View: Clearsilver  (170KiB)
  • Controller: Python (2-3MiB)
     

 Image 

Total size for the above components is about 4MiB. 

The following sequence occurs during a typical web transaction:

  • An HTTP request is received by Cherokee 
  • If the request matches the URI for the web application, Cherokee forwards the request to the web application framework via CGI.
  • Clearsilver parses the HTTP headers (including CGI GET and POST parameters) and provides the data to python in a easy to access HDF format.
  • Python looks at the URI and dispatches the request to the appropriate function.  Data is extracted from the SQLite database and an HDF datastructure is created.
  • Clearsilver is called to render the appropriate template.  Data from the HDF datastructure is used in the template to provide the dynamic content in the page.
  • The rendered HTML is passed back to Cherokee, and is then returned to the user's web browser.

 Each component is discussed in more detail in the following sections. 

 

Performance

One of the issues with modern web frameworks is that most require a lot of processing power.  Many frameworks are written in an interpreted language which tend to be not very efficient on embedded systems such as the 130MHz ARM-Linux system used in this project.  As most of the application development for this project is done in Python, I tried several other Python based solutions with the following results:

  • Django: takes 10 seconds to render a page
  • webpy: takes 5 seconds to render a page
  • Clearsilver/Python: takes about 1 second to render a page 

Anything over 1 second is very slow for a web interface.  With fastcgi, webpy could probably have been sped up to be acceptably fast, but I don't think there is much hope for frameworks like django on this type of system.  I have read of similar experiences trying to run Ruby-on-Rails on ARM-Linux systems.  As I'm currently just using a basic CGI interface, the Clearsilver solution could also be sped up significantly as well, if the Python portion could be kept running between requests with fastcgi or a similar mechanism.

  

Cherokee Web Server

A web application typically consists of a web server (like Apache) and a program that provides the dynamic web content.  Some of the functions of a web server are:

  • receives HTTP requests
  • handles the request by serving static files/images or routes the request to a program that outputs dynamic content
  • authentication
  • encryption (SSL, TLS)

There are many web servers that can be used in embedded devices.  Some of them are:

Cherokee was chosen for this application because it provides a good balance between the size and functionality I am looking for.  It is also included in the Openembedded (http://openembedded.org ) build system I am using.  Other systems will have different requirements -- use the one that fits your application best.

Clearsilver

Clearsilver (http://www.clearsilver.net/ ) is the real gem that was discovered during this exercise.   Clearsilver is a language-neutral HTML template system written in C.  It is used as the templating system for many high volume sites such as Google Groups 2.  Clearsilver also provides CGI handling functions and bindings to several languages including Python.  The fact that it is written in C and is fast for high volume sites also makes it fast enough on slower embedded systems.  Because Clearsilver is written in C, the templating system is already fast.  Parts or all of the application can also be moved to C as needed to get the required performance.  Having a performance upgrade path is nice.  Clearsilver also forces a strict separation of application logic and presentation templates, which keeps things in line with the MVC architecture.

 

SQLite

SQLite (http://www.sqlite.org/ ) is a small C library that implements a self-contained, embeddable, zero-configuration SQL database engine.  SQLite works as expected and also has bindings to a number of languages including Python.  A SQLite database is just a single file that requires no configuration, making it very easy to use.  The database engine runs in the same process as the application using it, which increases performance because there is no context switch when running database operations.   Because SQLite does not have its own process, it does not handle concurrency as well as other databases such as MySQL, but in an embedded system you seldom have more than one process using the database.  SQLite provides some support for concurrency with reader/writer locks for the entire database.  If your application is not real busy, this is often adequate if you need two processes to share some data.  

Python 

Python is the glue that ties things together in this web application framework.  It sits between Clearsilver and the database.  The advantages of using a language like Python are rapid development and an extensive library.  Python is considerably slower than C, but there is always the option to move parts of the application into C as needed.

Openembedded Build System

How does one put together a system with all these components?  The answer is the Openembedded Build System (OE) (http://openembedded.org).  OE includes support for all of the components discussed in this article.

Summary

The combination of Python, Clearsilver, and SQLite provides a compelling solution for a web application framework in an Embedded Linux System.  The solution is reasonably small, performs well, and provides a path to improve performance if needed.  We also get a clean architecture to create clean, maintainable web applications.


About the author -- Cliff Brake owns BEC Systems, a consulting operation that helps customers utilize modern computer technologies in their products.  BEC offers a range of services to make your embedded project a success including technology selection, development, troubleshooting, and training.  Please visit our website (http://bec-systems.com ) for more information and other free resources.


 

티스토리 툴바