bionote.net


[PHP] 웹을 통해서 백그라운드 작업을 실행시키기


http://blna999.ivyro.net/tt/index.php?pl=76&ct1=5 에서 웹을 통해서 쉘 작업을 수행하는 방법에 대해서 이야기하였다.
빨리 실행되는 명령어의 경우에는 바로 결과를 저장해서 웹으로 출력해줄 수 있다. 하지만 내부에서 실행하는 프로그램이 많은 시간을 요구한다면 사용자의 브라우저는 계속 로딩 상태에 매여있게 된다 (Hang). 따라서 백그라운드 모드로 작업을 실행시켜야할 필요가 있다.
system 함수를 사용해서 백그라운드 모드로 프로그램을 실행시키기 위해서는 실행시키는 프로그램의 결과를 임의의 파일로 리다이렉션시켜야한다. 예를 들면 다음과 같다.
$param = escapeshellcmd($param);
system("./myprogram $param > /dev/null &");

여기서 리다이렉션이 없으면 PHP는 프로그램이 완전히 종료될 때까지 hang 상태가 된다.
2006/02/08 17:10 2006/02/08 17:10
top

 

[PHP] 웹을 통해서 작업을 실행시키기


작성한 프로그램을 웹을 통해서 서비스하거나 내부 프로그램으로 작업을 수행해야하는 경우가 종종 발생한다. 이런 경우 PHP에서는 exec나 system 함수를 사용해서 처리할 수 있다. C나 다른 언어와 같은 기능을 하는 함수이다. perl처럼 backtick을 사용할 수도 있다.

하지만 주의할 점이 있는데, 웹을 통해서 실행되서는 안되는 프로그램이나 보안상 치명적인 명령어들이 실행되어 질수도 있다는 점이다.
예를들면
[CODE] $ret = system("ls $param");[/CODE]
이라는 행에서 사용자가
[CODE] $param = "; rm -rf /";[/CODE]
를 할당해버리면 모든 파일이 삭제되어 버리는 비극을 경험할 수도 있다는 말이다.

escapeshellcmd 함수를 사용하면 이런 문제로부터 조금은 안전해질 수 있다. 이 함수는 쉘메타문자들을 이스케이프해서 원치않는 명령어가 실행되는 것을 방지해 준다.
사용법은 다음과 같다.
[CODE] $param = escapeshellcmd($param); $ret = system("ls $param");[/CODE]
2006/02/08 16:51 2006/02/08 16:51
top

 

XUL (XML User-interface Language)


XUL은 이름 그대로 사용자 인터페이스를 만들기 위한 XML 기반의 언어이다. XUL은 어떤 플랫폼이든지 모질라 브라우저가 실행될 수 있다면 사용이 가능하기 때문에, 앞으로 기대되는 기술이다. 써놓구 보니 플랫폼으로써 모질라군....
XUL을 이용한 싸이트: http://www.faser.net/mab/chrome/content/mab.xul
XUL Tutorial: http://www.xulplanet.com/tutorials/xultu/
2006/01/17 21:34 2006/01/17 21:34
top

 

[C++] compile optimization - 최적화 옵션의 힘


C로 작성된 alignment 프로그램을 C++로 다시 작성해서 연구에 사용하고 있다. 기본적인 알고리즘은 동일하지만 OOP에 맞게 설계가 변경되서 코드의 재사용성을 높일 수 있고, 프로그램을 유지보수하기도 상당히 편해졌다. 하지만 문제점이 있었으니 그것은 내가 작성한 C++ 프로그램의 수행속도가 상당히 느리다는 것이다. 원래 C 프로그램과 새로 작성한 C++ 프로그램의 수행시간을 비교하면 다음과 같다.
]$ time original_c_program
real 0m0.021s
user 0m0.007s
sys 0m0.005s

]$ time redesigned_cpp_program
real 0m0.584s
user 0m0.567s
sys 0m0.007s

위의 결과에서 같이 상당한 속도차이를 확인할 수 있다.
C++ 프로그램에서 내부적으로 STL과 자체적으로 작성한 클래스들을 연동해서 사용하기 때문에 라이브러리를 링크하는데 오버헤드가 발생할 것이라고 예측하고 static link 옵션(-static)을 주고 컴파일하고 다시 수행시간을 측정하였다.
]$ time static_cpp_program
real 0m0.333s
user 0m0.162s
sys 0m0.007s

위의 결과와 같은 성능 향상을 얻을 수 있었다. 여기서 성능향상은 라이브러리를 링크하는데 걸리는 시간이 사라지면서 얻어진 것으로 생각된다. 특별히 테스트를 수행한 시스템이 NFS로 홈디렉토리와 라이브러리가 있는 디렉토리를 마운트하고 있기 때문에 network상에서 소비하는 시간도 상당히 절약되었을거라고 생각된다.
하지만 정적인 라이브러리 링크에도 불구하고, 여전히 원래 C 프로그램에 비해서 느린 수행속도를 보인다. 그래서 -static 옵션과 동시에 g++의 최적화 옵션(-O3)을 사용해서 컴파일하고 수행시간을 측정해 보았다.
$ time static_optimize_cpp_program
real 0m0.013s
user 0m0.009s
sys 0m0.003s

위의 결과에서 볼 수 있듯이 기존의 C++ 프로그램은 물론이고 원래 C 프로그램보다도 나은 수행속도를 보여준다. (참고로 원래 C 프로그램은 -static -O3 옵션으로 컴파일 된 것이다.)

하나의 기준과 제한된 환경에서 행해진 것이라는 한계가 있지만, 위의 결과를 종합해 보면 다음과 같은 결론을 내릴 수 있다.
1) C++ 프로그램은, 특히 STL을 사용했을 시에는, 컴파일시에 최적화를 반드시 수행해야한다.
2) 기존 프로그램을 리팩토링하거나 다른 플랫폼으로 포팅하였을 때는 반드시 성능평가를 통해서 검증할 필요가 있다.
2006/01/17 20:26 2006/01/17 20:26
top

 

[C++] 임시파일 생성하기


프로그램 내에서 임시파일을 생성해야할 필요가 있다.
이때 임시파일의 이름을 랜덤하게 생성해주는 작업이 상당히 귀찮고 안전성에 대해서도 불안감이 있었는데, 찾아보니 임시파일을 생성해주는 함수가 이미 있었다. (괜히 삽질했군...OTL)
tmpfile()
(w+b) 모드로 임시파일을 생성하고 file descriptor를 리턴한다.
mkstemp()
주어진 이름패턴을 따르는 임시파일을 생성하고 file descriptor를 리턴한다.
mktemp()
mkstemp()와 유사하지만 임시파일 이름만 생성해서 리턴한다.

참고:
[1] 박현미/CERTCC-KR, 안전한 유닉스 프로그래밍을 위한 지침서 V.0.7, http://www.securitymap.net/sdm/docs/secure-programming/secure-program-guide.html
[2] KLDP, http://kldp.org/HOWTO/html/Secure-Programs-HOWTO/avoid-race.html
2006/01/05 04:05 2006/01/05 04:05
top

 

[C++] string을 char*로 변환하기


string 타입은 문자열을 처리하기에 굉장히 편하도록 고안되어 있다. 하지만 예전에 개발된 시스템이나 다른 사람이 만들어놓은 라이브러리를 사용하다보면 char* 타입으로 변환해서 사용해야하는 경우가 종종 있다.
기본적으로 string 클래스는 다음과 같은 함수를 이용해서 타입변환을 할 수 있다. [니콜라이 M. 조슈티스, C++ Standard Library 튜토리얼 레퍼런스, 548-550]
data()
const char* 타입으로 변환된다. (끝에 '\0'이 덧붙여지지 않음)
c_str()
C-string 타입으로 변환된다. (끝에 '\0'이 덧붙여지는 const char*)
copy()
인수로 제공된 char*에 내용을 복사한다. (끝에 '\0'이 덧붙여지지 않음)

만약 string을 끝에 '\0'가 덧붙여진 char*로 변환하고 싶다면 다음의 방법을 사용하면 된다.
string s("abcdef");
char buf[10];
strcpy(buf, s.c_str());

또는 다음과 같이 할 수 있다.
string s("abcdef");
char buf[10];
int end = (int)s.copy(buf, 10);
buf[end] = '\0';
2006/01/05 03:08 2006/01/05 03:08
top

 

[Linux] 나의 xterm 설정


xterm의 설정은 홈디렉토리에 있는 .Xdefaults을 편집(없으면 생성)하면 된다. 현재 나의 xtermd은 다음과 같이 설정되어 있다.
xterm*foreground:black
xterm*background:gray90
xterm*cursorColor:darkblue
xterm*font:-Schumacher-Clean-Medium-R-Normal--16-160-75-75-C-80-ISO646.1991-IRV
2005/11/07 17:18 2005/11/07 17:18
top

 

[Linux] Ubuntu 5.10 bleezy 설치



우분투 리눅스의 차기 버전인 bleezy가 릴리즈되었기에 기숙사 컴퓨터에 설치해보았다.
예전에 설치해둔 hoary는 첨에 몇번만 쓰고 거의 윈도우로만 부팅했었는데, 오랜만에 우분투를 써보니 느낌이 새롭다.
위 스크린샷을 얻기까지 대략 3가지정도의 삽질을 한 것 같다.
1) LCD모니터의 해상도를 자동으로 못 찾았다. 해결방법은 /etc/X11/xorg.conf의 "Monitor" 섹션에 HorizSync와 VertRefresh를 수동으로 설정해주고 X를 재시작하였다. 대우 루컴스 DL1710의 경우 아래 설정을 추가하였다.
HorizSync 30-80
VertRefresh 56-77

2) 기본으로 잡혔있는 소스리스트가 CD-ROM밖에 없어서 아래 주소를 참고하여 소스리스트를 추가하였다.
http://www.ubuntu.or.kr/wiki.php/SourceList
3) 한글입력기 "nabi"를 설치하고, 한글폰트로 "은글꼴"을 추가하였다.
나비는 위에서 설정한 소스리스트에서 얻을 수 있다. 시냅패키지관리자나 apt-get을 이용해서 나비를 설치한 후에 ~/.gnomerc에 다음 내용을 추가하였다.
export XMODIFIERS="@im=nabi"
export GTK_IM_MODULE=xim

그리고 시스템-기본설정-세션-시작프로그램탭에 /usr/bin/nabi를 등록한다. 이제 X를 재시작하면 nabi가 실행되고 Shift-Space를 이용해서 한/영 입력전환이 가능해진다.
reference: http://www.ubuntu.or.kr/wiki.php/InstallingInputMethods
은글꼴은 ttf-unfonts 패키지를 설치하면 사용할 수 있다. 시스템-기본설정-글꼴을 선택하면 시스템에서 사용할 폰트를 설정할 수 잇다.
2005/10/30 02:52 2005/10/30 02:52
top

 

foobar2000



전부터 사용하고 싶었던 오디오 플레이어인 foobar를 설치해보았다.
winamp의 예쁘장한 비쥬얼이 아쉽긴하지만 가볍고 시스템에 부담을 거의 주지 않는다는 점이 많은 사람들이 foobar를 선택하는 이유인 것 같다.
기본적으로 foobar는 오디오플레이어로써 기본기능에 충실하지만, 다양한 컴포턴트를 추가하는 방식으로 비쥬얼적인 면이나 인터페이스를 커스터마이징하는 것이 가능하다.
2005/10/26 00:33 2005/10/26 00:33
top

 

[Python] making file list from wildcard search


glob 모듈은 와일드카드 검색을 이용해서 파일의 리스트를 만들어준다.
Example
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

Reference
http://www.python.org/doc/2.4.2/tut/node12.html#SECTION0012200000000000000000
2005/10/19 10:45 2005/10/19 10:45
top