2007년 11월 8일 목요일

PHP Snoopy Readme

NAME:

    Snoopy - the PHP net client v1.2.2
    
SYNOPSIS:

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetchtext("http://www.php.net/");
    print $snoopy->results;
    
    $snoopy->fetchlinks("http://www.phpbuilder.com/");
    print $snoopy->results;
    
    $submit_url = "http://lnk.ispi.net/texis/scripts/msearch/netsearch.html";
    
    $submit_vars["q"] = "amiga";
    $submit_vars["submit"] = "Search!";
    $submit_vars["searchhost"] = "Altavista";
        
    $snoopy->submit($submit_url,$submit_vars);
    print $snoopy->results;
    
    $snoopy->maxframes=5;
    $snoopy->fetch("http://www.ispi.net/");
    echo "<PRE>\n";
    echo htmlentities($snoopy->results[0]);
    echo htmlentities($snoopy->results[1]);
    echo htmlentities($snoopy->results[2]);
    echo "</PRE>\n";

    $snoopy->fetchform("http://www.altavista.com");
    print $snoopy->results;

DESCRIPTION:

    What is Snoopy?
    
    Snoopy is a PHP class that simulates a web browser. It automates the
    task of retrieving web page content and posting forms, for example.

    Some of Snoopy's features:
    
    * easily fetch the contents of a web page
    * easily fetch the text from a web page (strip html tags)
    * easily fetch the the links from a web page
    * supports proxy hosts
    * supports basic user/pass authentication
    * supports setting user_agent, referer, cookies and header content
    * supports browser redirects, and controlled depth of redirects
    * expands fetched links to fully qualified URLs (default)
    * easily submit form data and retrieve the results
    * supports following html frames (added v0.92)
    * supports passing cookies on redirects (added v0.92)
    
    
REQUIREMENTS:

    Snoopy requires PHP with PCRE (Perl Compatible Regular Expressions),
    which should be PHP 3.0.9 and up. For read timeout support, it requires
    PHP 4 Beta 4 or later. Snoopy was developed and tested with PHP 3.0.12.

CLASS METHODS:

    fetch($URI)
    -----------
    
    This is the method used for fetching the contents of a web page.
    $URI is the fully qualified URL of the page to fetch.
    The results of the fetch are stored in $this->results.
    If you are fetching frames, then $this->results
    contains each frame fetched in an array.
        
    fetchtext($URI)
    ---------------    
    
    This behaves exactly like fetch() except that it only returns
    the text from the page, stripping out html tags and other
    irrelevant data.        

    fetchform($URI)
    ---------------    
    
    This behaves exactly like fetch() except that it only returns
    the form elements from the page, stripping out html tags and other
    irrelevant data.        

    fetchlinks($URI)
    ----------------

    This behaves exactly like fetch() except that it only returns
    the links from the page. By default, relative links are
    converted to their fully qualified URL form.

    submit($URI,$formvars)
    ----------------------
    
    This submits a form to the specified $URI. $formvars is an
    array of the form variables to pass.
        
        
    submittext($URI,$formvars)
    --------------------------

    This behaves exactly like submit() except that it only returns
    the text from the page, stripping out html tags and other
    irrelevant data.        

    submitlinks($URI)
    ----------------

    This behaves exactly like submit() except that it only returns
    the links from the page. By default, relative links are
    converted to their fully qualified URL form.


CLASS VARIABLES:    (default value in parenthesis)

    $host            the host to connect to
    $port            the port to connect to
    $proxy_host        the proxy host to use, if any
    $proxy_port        the proxy port to use, if any
    $agent            the user agent to masqerade as (Snoopy v0.1)
    $referer        referer information to pass, if any
    $cookies        cookies to pass if any
    $rawheaders        other header info to pass, if any
    $maxredirs        maximum redirects to allow. 0=none allowed. (5)
    $offsiteok        whether or not to allow redirects off-site. (true)
    $expandlinks    whether or not to expand links to fully qualified URLs (true)
    $user            authentication username, if any
    $pass            authentication password, if any
    $accept            http accept types (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
    $error            where errors are sent, if any
    $response_code    responde code returned from server
    $headers        headers returned from server
    $maxlength        max return data length
    $read_timeout    timeout on read operations (requires PHP 4 Beta 4+)
                    set to 0 to disallow timeouts
    $timed_out        true if a read operation timed out (requires PHP 4 Beta 4+)
    $maxframes        number of frames we will follow
    $status            http status of fetch
    $temp_dir        temp directory that the webserver can write to. (/tmp)
    $curl_path        system path to cURL binary, set to false if none
    

EXAMPLES:

    Example:     fetch a web page and display the return headers and
                the contents of the page (html-escaped):
    
    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->user = "joe";
    $snoopy->pass = "bloe";
    
    if($snoopy->fetch("http://www.slashdot.org/"))
    {
        echo "response code: ".$snoopy->response_code."<br>\n";
        while(list($key,$val) = each($snoopy->headers))
            echo $key.": ".$val."<br>\n";
        echo "<p>\n";
        
        echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
    }
    else
        echo "error fetching document: ".$snoopy->error."\n";



    Example:    submit a form and print out the result headers
                and html-escaped page:

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $submit_url = "http://lnk.ispi.net/texis/scripts/msearch/netsearch.html";
    
    $submit_vars["q"] = "amiga";
    $submit_vars["submit"] = "Search!";
    $submit_vars["searchhost"] = "Altavista";

        
    if($snoopy->submit($submit_url,$submit_vars))
    {
        while(list($key,$val) = each($snoopy->headers))
            echo $key.": ".$val."<br>\n";
        echo "<p>\n";
        
        echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
    }
    else
        echo "error fetching document: ".$snoopy->error."\n";



    Example:    showing functionality of all the variables:
    

    include "Snoopy.class.php";
    $snoopy = new Snoopy;

    $snoopy->proxy_host = "my.proxy.host";
    $snoopy->proxy_port = "8080";
    
    $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
    $snoopy->referer = "http://www.microsnot.com/";
    
    $snoopy->cookies["SessionID"] = 238472834723489l;
    $snoopy->cookies["favoriteColor"] = "RED";
    
    $snoopy->rawheaders["Pragma"] = "no-cache";
    
    $snoopy->maxredirs = 2;
    $snoopy->offsiteok = false;
    $snoopy->expandlinks = false;
    
    $snoopy->user = "joe";
    $snoopy->pass = "bloe";
    
    if($snoopy->fetchtext("http://www.phpbuilder.com"))
    {
        while(list($key,$val) = each($snoopy->headers))
            echo $key.": ".$val."<br>\n";
        echo "<p>\n";
        
        echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
    }
    else
        echo "error fetching document: ".$snoopy->error."\n";


    Example:     fetched framed content and display the results
    
    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->maxframes = 5;
    
    if($snoopy->fetch("http://www.ispi.net/"))
    {
        echo "<PRE>".htmlspecialchars($snoopy->results[0])."</PRE>\n";
        echo "<PRE>".htmlspecialchars($snoopy->results[1])."</PRE>\n";
        echo "<PRE>".htmlspecialchars($snoopy->results[2])."</PRE>\n";
    }
    else
        echo "error fetching document: ".$snoopy->error."\n";


COPYRIGHT:
    Copyright(c) 1999,2000 ispi. All rights reserved.
    This software is released under the GNU General Public License.
    Please read the disclaimer at the top of the Snoopy.class.php file.


THANKS:
    Special Thanks to:
    Peter Sorger <sorgo@cool.sk> help fixing a redirect bug
    Andrei Zmievski <andrei@ispi.net> implementing time out functionality
    Patric Sandelin <patric@kajen.com> help with fetchform debugging
    Carmelo <carmelo@meltingsoft.com> misc bug fixes with frames

2007년 10월 12일 금요일

Flex3 Beta 개발자 가이드

Flex 3 Beta 1 Developer's Guide

This part describes how to develop applications using Flex.

About Flex Documentation
Developing Applications in MXML
MXML Syntax
Using ActionScript
Using Events
Using Flex Visual Components
Using Data Providers and Collections
Sizing and Positioning Components
Using Controls
Using Text Controls
Using Menu-Based Controls
Using Data-Driven Controls
Introducing Containers
Using the Application Container
Using Layout Containers
Using Navigator Containers
Using Behaviors
Using Styles and Themes
Using Fonts
Using Item Renderers and Item Editors
Working with Item Editors
Using ToolTips
Using the Cursor Manager
Localizing Flex Applications
Dynamically Repeating Controls and Containers
Using View States
Using Transitions
Using Drag and Drop
Embedding Assets
Creating Modular Applications
Using the History Manager
Printing
Communicating with the Wrapper
Using Shared Objects
Creating Accessible Applications
Representing Data
Binding Data
Storing Data
Validating Data
Formatting Data
Introduction to Charts
Chart Types
Formatting Charts
Using Events and Effects in Charts

Flex3 데모 어플리케이션

Flex3 볼링셔츠 만들기 데모

image

클릭하면 새창 링크..

2007년 10월 11일 목요일

웹서버 부하분산처리 phpschool 검색

웹서버 부하분산처리를 위해 자료를 찾아 봄.
소프트웨어 적으로 해결 하려다가 L4 스위치로 간다고 하는데 소프트웨어적으로 해결할 방법을 모색해 봐야 겠다.

아래는 phpschool.com 에서 찾은 질문 및 답변

웹서버 부하분산처리는 어떻게 하시나요?

글쓴이 샴푸 날 짜 06-02-16 17:11 조 회 393

저희는 서버를 두대 운영하고 있습니다.
하나는 WEB서버 하나는 DB 서버 이렇게요.
하지만 최근 이벤트를 하면서 특정시간대에 사람이 엄청많이 와서 웹서버에 부하가 걸려 서버가 버벅되는 사태가 발생하곤 했습니다.(DB 서버의 상태는 아주 좋았고요.)
그래서 부하분산처리로 생각한것이 라운드로빈과 NFS 를 이용한 방법 이었는데요.
서버두대를 아래와 같이 세팅했습니다.
A서버 : WEB 만 탑재 (NFS 서버역할과 web서비스역할)
B서버 : WEB 서버 추가가동, DB 탑재 (NFS 클라이언트역할과 web서비스, DB서버역할수행)
위와 같이 세팅해서 웹서버의 부하를 분산시켰지요.(B서버는 웹과 DB 의 부하를 모두 받는데 기존에도 DB쪽 부하는 생각보다 적어서 괜찮은듯 하였습니다.)
하지만 NFS 의 문제점을 지적하시는분도 많았고 효과적인 방법이 아닐꺼라는 생각에 다른 방법을 강구하고 있습니다.
서버를 여러대 병렬식으로 연결가능하면서 NFS 처럼 한군데만 수정하면 다른곳도 동시에 수정된것이 반영되는 그런 방식의 부하분산처리 방식은 없을까요?
RSYNC 방식은 실시간이 아닌 Cron으로 1~2분마다 동기화를 많이 하고 있고 또한 원하지 않는 파일까지 동기화가 될까봐 다른 방법을 생각하고 있습니다.
선배님들은 어떤 방법을 사용하세요?
어떤 분은 그냥 L4 라고 만 쓰시는데 L4스위치를 사용하면 그냥 모든것이 해결되나요?
(L4스위치에 대한 내용은 좀더 찾아봐야 겠지만...)
네이버나 야후같은곳은 어떤방법을 사용할까?
선배님들의 조언을 부탁드립니다.

칼솜
  06-02-16 17:47 

서버는 돈만 많으면 해결됩니다. ㅡㅡ;
1. 메인서버
2. Failure 서버
3. 분산서버들...
main에서 접속요청을 받아서 분산서버로 돌리면 됩니다. (요때 L4 스위치)
failure 서버는 글자 그대로 main 서버가 다운되면 등장해야할 대타입니다.
소프트웨어적으로 로드밸런싱을 처음에 많이들 시도하시던데요..
결국은 L4로 가더군요 ㅡㅡ;
저도 몇번 말아먹은면 감이 올것같네요 ^^
나중에 중고 컴퓨터 몇대 구해서 가지고 놀 예정입니다 ㅡㅡ;

서버는 돈만 많으면 해결됩니다. ㅡㅡ; 1. 메인서버 2. Failure 서버 3. 분산서버들... main에서 접속요청을 받아서 분산서버로 돌리면 됩니다. (요때 L4 스위치) failure 서버는 글자 그대로 main 서버가 다운되면 등장해야할 대타입니다. 소프트웨어적으로 로드밸런싱을 처음에 많이들 시도하시던데요.. 결국은 L4로 가더군요 ㅡㅡ; 저도 몇번 말아먹은면 감이 올것같네요 ^^ 나중에 중고 컴퓨터 몇대 구해서 가지고 놀 예정입니다 ㅡㅡ;

샴푸
  06-02-16 18:08 

넵 답변감사합니다.^^
그런데 L4 는 부하분산만 담당하고 각 분산서버들의 데이터 동기화는 별개인것 같더라구요.
모든 서버들의 데이터 동기화는 어떤 방법이 있을까요? 방법론적으로 봐서는 NFS 처럼 한서버의 자료를 다른 서버들도 자동으로 받아갈수 있으면 좋을텐데..^^
다른 선배님들도 의견좀 주셔서 도와주세요.

넵 답변감사합니다.^^ 그런데 L4 는 부하분산만 담당하고 각 분산서버들의 데이터 동기화는 별개인것 같더라구요. 모든 서버들의 데이터 동기화는 어떤 방법이 있을까요? 방법론적으로 봐서는 NFS 처럼 한서버의 자료를 다른 서버들도 자동으로 받아갈수 있으면 좋을텐데..^^ 다른 선배님들도 의견좀 주셔서 도와주세요.

샴푸
  06-02-16 23:15 

가장 궁금한것은 부하분산서버들간의 데이터 동기화방법이죠..
동기화 시키지 않는다면 어떤식으로 데이터를 저장하는지...등등..^^

가장 궁금한것은 부하분산서버들간의 데이터 동기화방법이죠.. 동기화 시키지 않는다면 어떤식으로 데이터를 저장하는지...등등..^^

칼솜
  06-02-16 23:25 

처음부터 시작하려면 힘들죠 ㅡㅡ;
기술이전을 좀 받으셔야겠네요..
성공하시기 바랍니다.

처음부터 시작하려면 힘들죠 ㅡㅡ; 기술이전을 좀 받으셔야겠네요.. 성공하시기 바랍니다.

삽질중..
  06-02-20 21:48 

일단 부하가 걸리는 제일 큰이유를 알야야죠...
돈많으면 다 해결이 되겠지만...
oops.org 에 가보시면 팁이 많이 있습니다.

NFS(Network File System) 서버

NFS는 Network File System의 약어로썬마이크로 시스템즈에서 개발한 네트웍상에서 파일시스템을 공유하도록 설계된 파일시스템의 한종류이다.


다른 호스트에 있는 파일시스템의 일부를 자신의 디렉토리인것처럼 사용할수 있도록 해주는 것이 NFS(Network File System)이다.


즉 네트웍상에 디스크를 한서버에 집중관리하고 나머지 시스템들은 그것을 공유하여 사용할 수 있게 해주는 것이다. 하지만 보안상의 문제로 인해 NFS서버의 사용을 점점 제한해 가는 추세이다.


NFS설정은 파일시스템을 share하는 서버의 설정과 서버의 파일시스템을 마운트해가는 클라이언트 설정으로 나누어 볼수 있다.


우분투 NFS(네트워크 파일 시스템) 한글 문서

도메인 하나로 여러 서버 사용하기

도메인 하나로 분산 서버를 사용하는 방법에는 아래 세가지 정도가 있다.

1. DNS 라운드로빈

2. 클러스터링

3. 로드밸런싱


1. DNS 라운드로빈 관련 글

DNS 라운드 로빈 과 서브넷 우선순위(Subnet Prioritization)는 무엇인가?

출처 : http://blog.naver.com/831jsh/60017984753

A . DNS 리소스 레코드의 가장 보편적인 형태는 A(host, Address의 약자)로 특정한 호스트 이름의 IP주소를 제공하는 레코드이다. 어떤 특정한 상황에서는 여러개의 IP 주소들이 하나의 이름을 가리킬 수도 있다. 예를 들면, 다음과 같이 3개의 서버가 www.ntfaq.co.kr 웹 사이트를 가리킨다면 DNS 서버에는 다음과 같은 3개의 A 레코드가 저장되어 있을 것이다.


www.ntfaq.co.kr IN A 200.200.20.200
www.ntfaq.co.kr IN A 200.200.30.200
www.ntfaq.co.kr IN A 200.200.40.200


클라이언트가 이 호스트의 이름풀이를 DNS 서버에 요청하게 되면 DNS 서버는 3개의 값을 모두 리턴하게 된다. 모든 클라이언트들에게 맨 첫번째 주소 레코드를 항상 보내기 때문에 3 레코드를 교대로 반환하게 하게 하기 위해 DNS 서버는 라운드 로빈 방식의 알고리즘을 이용하게 된다. 이데 대한 자세한 사항은 RFC 1794에 자세하게 기술되어 있다. 클라이언트들의 각각의 요청에 대해 DNS 서버는 모든 호스트들의 부하를 균등하게 유지하기 위해 주소 값들을 교대로 반환해 주게 된다. 예를 들어 첫번째 클라이언트가 DNS 서버에 이름풀이를 요청하게 되면 서버는 다음과 같이 응답한다.


200.200.20.2000 200.200.30.200 200.200.40.200
그 다음 번에는 서버는 다음과 같이 응답한다.
200.200.30.200 200.200.40.200 200.200.20.200
그 다음 번에는 서버는 다음과 같이 응답한다.
200.200.40.200 200.200.20.200 200.200.30.200


만약 응답하는 주소를 포함하고 있는 서브넷에 클라이언트가 직접 연결되어 있다면, 클라이언트는 응답 시간및 네트워크 트래픽을 줄이기 위해 그 주소로 응답한 호스트와 직접 통신을 하게 된다. 서브넷 우선순위(Subnet prioritization)는 클라이언트가 동일한 서브넷에 위차한 호스트를 인식하여 로컬 호스트의 주소를 리턴하는 기능을 가지고 있다.( 마이크로 소프트는 Windows NT SP4 이후 버전에서부터 이 기능을 제공한다.) 클라이언트가 서브넷 우선순위를 사용할 때 클라이언트 풀이자(resolver)는 주소 레코드 기록을 수신하고 직접 연결된 서브넷의 순선대로 정렬하게 된다.


따라서 클라이언트가 200.200.30.100(200.200.30.200 호스트가 위치한 서브넷) 주소를 가지고 있으면 DNS 서버는 다음의 주소값을 반환하게 된다.


200.200.20.2000 200.200.30.200 200.200.40.200


로컬 DNS resolver가 서브넷 우선순위를 사용할 때에는 응답값을 로컬 서브넷 우선순위를 통해 재정렬한 값을 이용하게 된다. 다음과 같이 될 것이다.


200.200.30.200 200.200.40.200 200.200.20.200


결과적으로 로컬 DNS resolver의 서비스 우선순위는 resolver된 주소가 로컬 서브넷에 있을 때에만 서브넷 우선순위를 통해 값이 변경된다. 이러한 접근 방식은 네트워크의 트래픽 감소와 빠른 응답(아무래도 로컬 서브넷이면 100M일것이다)이라는 장점을 가질 수 있지만, 로드 밸런싱이 무력화된다는 단점도 가지고 있다.

2007년 7월 9일 월요일

우분투 서버 apt-get 사용법

우분투 서버는 데비안을 모체로 하고 있으므로 apt-get 사용.
폰트가 깨지는 경우는 export LANG=en_US.UTF-8 로 설정 후 사용.

http://www.debian.org/doc/manuals/apt-howto/index.ko.html

nabi 설치 : apt-get install nabi
제거하기 : apt-get --purge remove nabi
검색하기 : apt-cache search nabi
패키지 정보보기 : apt-cache show nabi
소스리스트 업데이트 : apt-get update
설치된 패키지들 업데이트 : apt-get upgrade

deb파일 설치 : dpkg -i nabi_0.15-2_i386.deb
제거하기 : dpkg -P nabi
설치 deb파일들의 리스트 : dpkg -l
설치된 패키지에 포함된 파일들 보기 : dpkg -L nabi
deb파일 패키지에 포함된 파일들 보기 : dpkg -c nabi_0.15-2_i386.deb
deb파일의 정보보기 : dpkg -I nabi_0.15-2_i386.deb
파일의 패키지명 알아내기 : dpkg -S /usr/bin/nabi


apt는 최신 패키지를 다운로드 하여 설치하게 되는데 upgrade 하기전에 update 해서 source.list 를 갱신

1. 패키지 캐쉬 갱신 및 자동 업그레이드
# apt-get update
# apt-get upgrade

2. 개별 패키지 설치
# apt-get install <패키지명>

3. 원하는 패키지 찾기
# apt-cache  serach <패키지명>

4. 원하는 패키지 찾은 다음 정보 출력
# apt-cache show <패키지명>

5. 의존성 검사 수행하면서 업그레이드
# apt-get -s dist-upgrade

6. 설치한 패키지에 이상이 있어 다시 설치시
# apt-get --reinstall install <패키지명>

7. CD-ROM 목록 추가
# apt-cdrom add

8. 패키지 삭제
# apt-get remove <패키지명>
또는 # dpkg -P <패키지명>

9. 삭제하는 패키지의 설정화일들가지 모두 삭제시
# apt-get --purge remove <패키지명>

10. dselect에서 선택한 패키지의 설치 및 삭제
# apt-get dselect-upgrade

11. 설치된 패키지를 볼때
# dpkg -l

참고)   apt-get install 명령어로 받은 deb 파일의 저장 위치
          /var/cache/apt/archive/
        위 폴더에 .deb 패키지파일로 저장됨

참고 :

http://blog.naver.com/koreaotn/10018120191
http://cafe.naver.com/newchany/383

2007년 7월 8일 일요일

우분투 서버 디렉토리 구조

Ubuntu Server의 / 디렉토리 구조

 .
 ..
.rnd
bin
boot
cdrom -> media/cdrom
dev
etc   : 각종 실행파일 폴더, /init.d : apache2 등의 실행 파일들이 있음, /apach2 :
home : 윈도우의 My Document 같은 디렉토리
initrd
initrd.img -> boot/initrd.img-2.6.17-11-server
initrd.img.old -> boot/initrd.img-2.6.17-10-server
lib
lost+found
media
mnt    : 각종 디바이스(하드웨어)를 마운트 시키는 디렉토리
opt
proc
root    : 윈도우의 Administrator 와 같은..
sbin
srv
sys
tmp
usr
var    : www, mail, log, backups, local, cache, lib, lock, opt, run, spool, tmp
vmlinuz -> boot/vmlinuz-2.6.17-11-server
vmlinuz.old -> boot/vmlinuz-2.6.17-10-server



2007년 7월 6일 금요일

우분투 아파치 서버 default 파일분석

우분투 아파치 서버의 설정은 /etc/apache2/sites-available/default 의 파일을 수정하고
/etc/init.d/apache2 restart로 적용 가능합니다.

적용되었는지는 /etc/apache2/sites-enable/default 를 열어 보면 알수 있습니다.

<VirtualHost *>
        ServerAdmin webmaster@localhost <- 시스템관리자 이메일

        DocumentRoot /var/www/  <- 기본 디렉토리 변경
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>  <- 기본 디렉토리 변경
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                # Uncomment this directive is you want to see apache2's
                # default start page (in /apache2-default) when you go to /
                #RedirectMatch ^/$ /apache2-default/
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Apache2 웹서버 구조



/etc/apache2/sites-available/default 파일   기본디렉토리 변환

2007년 6월 23일 토요일

Flex2 php 멀티파일 업로드 예제

Flex2 php 멀티 파일 업로드 예제

사용자 삽입 이미지
http://weblog.cahlan.com/files/file_uploads/FileUpload.html
 화면에서 마우스 오른쪽 버튼 누르면 소스를 볼수 있음.


테스트 결과 서버측에 PHP 파일을 만들고 
MXML 코드에서 아래 부분만 수정 해주면 바로 사용 가능함.
private const _strUploadDomain:String = "http://codycodingcowboy.cahlan.com/";
private const _strUploadScript:String = _strUploadDomain + "files/upload.php";
여러명이 접속 할때도 업로드 되는지 테스트 해보니 잘 됨.^^

http://weblog.cahlan.com/
위의 블로그에는 Flex에 관한 좋은 자료들이 많은것 같음. 

2007년 6월 2일 토요일

CVSNT 사용자 추가

1. CVSNT의 사용자는 명령 프롬프트에서 passwd 명령어를 사용.





CVSNT 설치

CVSNT는 윈도우용 CVS오픈소스이다.

http://www.march-hare.com/cvspro/ 의 Free 다운로드에서 받을수 있다.

유의할점은 하드가 NTFS포멧이여야 한다고 함.

설치하고 나면

1. 저장소 폴더를 설정 하기 위해서 "CVSNT Control Panel" 을 우선 실행한다.

cvsnt

2. 두개의 서비스를 정지한다.
3. 서버셋팅을 한다. repository configuration 탭에서 Add 또는 edit 를 하면 아래 화면이 나옴.
사용자 삽입 이미지
Documents and Settings의 폴더 밑은 계정 권한 문제로 사용하지 않는게 좋다고 함.

4. 다시 서비스 스타트
    가끔 Lock Service 가 시작 안될 때는 방화벽 설정 때문인듯 함.
    제부팅하면 해결 되는 듯 ,
   
5. 외부에서 접속
    방화벽에서 2401, 2402 TCP 포트를 열어주면 외부에서 접속 가능.

client 접속은  TortoiseCVS 강좌로..

6. 사용자 추가
    일반적으로 윈도우 계정을 그대로 사용가능 하나 (ex. xp user1 및 패스워드 )
    사용자를 추가 하고 싶으면 명령프롬프트에서 $cvs passwd -a user1 명령으로 추가 가능
   
    http://me2box.tistory.com/entry/CVSNT-사용자-추가 에서 계속..

CVS 용어

CVS 내에서 사용되는 용어

• repository – CVS를 통해서 작업하는 소스, 문서 등 작업용 파일이 저장되는 서버상의 공간

• revision – 각 파일별로 commit 할 때마다 자동으로 더해지는 버전으로 CVS가 관리하는 번호로 뒤로 돌리거나, 임의로 수정할 수 없다.

• init – 저장소를 초기화하는 명령어로 프로젝트를 시작할 때 한번만 실행

• module – 하나의 저장소에 구분되어 저장되는 단위.(작은 프로젝트의 경우 하나의 모듈, 큰 프로젝트의 경우에는 컴포넌트별로 모듈을 나누거나 버전별로 나누기도 함)

• import – 하나의 모듈을 서버에 저장하늠 명령어

• checkout – 서버에 저장한 모듈 하나를 통째로 로컬에 가져오는 명령어

• update – 파일이나 디렉토리를 지정하여 최신 것이나 특정 리비전, 특정 날짜의 것을 서버에서 로컬로 가져오는 명령어

• add – 새로운 파일을 디렉토리에 추가했음을 서버에 알리는 명령어.(파일은 commit하기 전까지는 서버에 반영되지 않는다.)

• remove – 파일 삭제했음을 서버에 알리는 명령어 (commit하기 전까지는 서버에서 지워지지 않는다.)

• commit – add, remove를 마치고 서버에 반영한다는 의미의 명령어

• tag – 특정 날짜나 릴리즈 시에 태그를 붙임으로써 나중에 해당 릴리즈의 리비전으로만 가져올 수 있게 한다.

• branch – 일부분 혹은 전체에서 소스를 별도로 관리해야 되는 부분이 생길 때 사용 (리비전의 깊이가 달라진다(예:1.1 > 1.1.2.1)

CVS 작업 사이클

CVS 작업 사이클

• 프로젝트 생성

프로젝트를 생성하고, 프로젝트 매니저나 리드 개발자가 CVS 서버에 프로젝트 저장소를 만든다.(init)

초기 버전에 대한 소스나 문서, 파일 등을 서버에 올린다.(CVS 서버에 모듈을 import)

• 프로젝트 진행

팀에 속한 모든 개발자는 import된 프로젝트 모듈을 다운로드하고(Checkout), 모듈의 소스를 추가(add), 삭제(remove), 커밋(commit), 변경(update) 중에 충돌(conflict)된 것은 합병(merge)하는 등 프로젝트를 진행한다.

일정시점이나 릴리즈 시에는 tag나 branch를 정해서 태그를 붙인다.

CVS 기능

CVS 기능

• History 기능 – 소스파일이 추가되고, 수정되고 삭제되었던 모든 History가 CVS 서버에 기록되며 작업 완료 시에 작업 내용을 기록에 남길 수 있다.

• 변경사항 저장 – 파일의 모든 버전을 파일로 저장하는 대신 CVS는 버전간의 변경사항만을 저장하므로 백업 용량을 적게 차지한다.

• 병합 기능 – 각 개발자가 작업을 끝마쳤을 때, 그 작업을 병합시켜줌으로써, 팀원이 하나의 공동 프로젝트를 수행하고자 할 때 도움을 준다.

•  branch 기능 – 개발의 주된 흐름인 메인 줄기(trunk)의 특정 진행 시점에서 갈라져 나와 개발을 추가하거나 변경된 가지(branch)에서 소스를 변경해도 메인 줄기에는 영향을 미치지 않는다.

•  tag 기능 – 개발의 특정 시점에 버전을 따는 기능으로 개발이 빌드되거나 릴리즈되는 특정 시점에서 태그를 달고, 개발을 진행해 나간다.(특정 태그가 달린 소스를 찾아서 해당 태그의 모듈을 구할 수 있다)

•  diff 기능 -  버전과 버전, 태그와 태그간에 소스의 차이점을 비교해준다.


2007년 5월 31일 목요일

CVS 버젼관리시스템

1. CVS란
CVS(Concurrent Versions System)는 오픈 소스 프로그램으로 다양한 OS 버젼이 있다.
윈도우 서버로는 CVSNT가 있고 WinCVS와 TortoiseCVS등의 클라이언트 프로그램이 존재한다.
eclipse, NetBeans, JBuilder,FlexBuilder 등의 개발 툴에 기본으로 통합되어 있다.

CVS는 혼자 개발, 팀 개발, 원격 다국적 개발 등에 유용하며
클라이언트 서버 구조의 수정병합 방식으로 같은 소스의 동시 작업이 가능하다


2007년 5월 20일 일요일

Flex events와 behaviors 사용하기

events와 behaviors 사용하기    Using events and behaviors

이벤트가 발생하였을 때 콤포넌트 설정 수정하기
아래 코드는 버튼을 클릭하면 myPanel을 보이지 않게 작용합니다.
<mx:Panel id="myPanel" layout="absolute" width="80%" height="80%" x="122" y="24">

<mx:Button label="Close" right="30" bottom="40" click="myPanel.visible=false"/>

ActionScript 함수 사용하기
버튼이나 패널등에서 발생하는 이벤트를 <mx:Script>를 에서 ActionScript 로 처리 되는걸 보여줍니다

more..


MXML에서 ActionScript 분리하기
아래 코드 처럼 as 파일로 분리 가능합니다.
<mx:Script source="myFunctions.as" />

행동과 변화에 따른 비주얼 상호작용 추가하기
<mx:Fade id="myFade"/>
<mx:Panel id="myPanel" layout="absolute" width="80%" height="80%" hideEffect="{myFade}" >
위의 코드는 Fade(흐릿해지는 효과) 를 Panel에 추가 한이군요.
visible 이벤트가 발생할 때 Panel이 흐릿해지면서 사라집니다.
 

Flex 어플리케이션 보여주기

Flex 어플리케이션 보여주기     Laying out a Flex application
Flex에서는 Style 및 테마를 지정 할수 있습니다.

스타일과 테마를 이용한 비주얼 디자인
아래와 같이 지정하면 Hello 가 36px의 강조로 나타납니다.
<mx:Application ..... >
   <mx:Style>
    TextArea {
        font-size: 36px;
      font-weight: bold;

    } 
  </mx:Style>


  <mx:TextArea text="Hello" ..../>

css 파일로도 만들수 있습니다.
<mx:Style source="styles.css" />


Flesh Player 보안 처리

Flesh Player 보안 처리 하는 방법

플래시 플레이어는 http://a.com 에서 다운한 swf 파일이라면 http://b.com 의 데이타를 원칙적으로 로드할수 없다고 하네요. 그것을 가능하게 해주는 것이 cross-domain 청책 파일이라고 합니다.

cross-domain 정책 파일들 사용하기
cross-domain 정책 파일은 간단한 XML 파일로 이루어져 있습니다.
이름은 crossdomain.xml 이며 서버의 root 에 위치 하면 됩니다.
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="www.yourdomain.com" />
</cross-domain-policy>
더 많은 정보는 http://www.adobe.com/go/tn_14213

remote date 접속 위해 proxy 셋팅하기
cross-domain이외의 다른 방법으로 proxy 셋팅 사용하여 실제 데이타 접속위치를 숨길수 있습니다.
<?php //프록시 예제 proxy.php
$dataURL = "http://www.macromedia.com/desdev/resources/macromedia_resources.xml";
//note that this will not follow redirects
readfile($dataURL);
?>

proxy를 사용하여 remote date 접속 개발을 위해 Flex 빌더 셋팅하기
project builder 및 launch configuration의 셋팅을 바꾼다.
1. 네비게이터의 project output 폴더의 path를 바꾼 뒤
2. launch configuration 의 아래 박스에 path 셋팅
    Run input box 에는 ex)http://localhost/myApp/myApp.html
    Debug input box 에는 ex)http://localhost/myApp/myApp-debug.html
                                      or http://localhost/myApp/myApp-debug.swf



2007년 5월 18일 금요일

Flex 데이타 연결

Flex 데이타 연결 방법은 아래와 같이 설명 되어 있습니다.

1. XML 데이타를 만들고
2. <mx:HTTPService 로 연결하고
3. 데이타 컨트롤로 데이타를 묶기
4. 런타임 실행시 로딩하기


데이타 만들기
Generating the data
Flex 는 HTTPService 컴포넌트를 활용하여 XML 데이타로 서버와 통신을 합니다.
기본적으로 로컬이나 서버에 XML 파일이 있으면 되는것 같습니다.
도움말의 http://www.adobe.com/go/flex2_and_php는 Flex2와 PHP를 통합하는 방법을 설명해 놓았군요.

데이타 소스와 연결
HTTPService 컴포넌트 사용방법
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:HTTPService 
id="productsRequest"
url="http://www.somesite.com/products.php" />
...

데이타 컨트롤로 데이타 보여주기

<mx:DataGrid x="20" y="80" id="productGrid" width="400"
dataProvider="{productRequest.lastResult.products.items}"
>
<mx:columns>
<mx:DataGridColumn headerText="Name" dataField="name" />
<mx:DataGridColumn headerText="Price" dataField="price" />
</mx:columns>
</mx:DataGrid>
데이타 소스의 id인 productsRequest가 dataProvider에서 사용됩니다.

런타임 실행시 로딩하기
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="productsRequest.send()"
>
버튼에서 로딩하려면 아래처럼
<mx:Button x="50" y="8" label="Get Data" click="productsRequest.send();" />

아주 기본적인 데이타 연결 방법에 대해서 설명되어 있습니다.
Flex 작업하는 방법 How Flex Works  부분을 끝내고 자세히 공부해야겠습니다.


Flex 어플리케이션 제작과 실행

오늘은 Flex 데모 버젼 설치 후 도움말에서 가장 처음 볼수 있는 어플리케이션 제작과 실행 부분을 봤습니다.
제가 필요로 하는 부분은 컴포넌트 제작이지만 기초부터 튼튼히 해 나갈 생각으로 정리를 좀 하려구요.
얼마나 발전해 나가는지 지켜 봐주시면 감사하겠습니다. ^^ (누가 봐줄지.. ㅋ)

Flex 어플리케이션 제작 프로세스

1. 미리 정해진 컴포넌트를 가지고 어플리케이션을 선언
2. 컴포넌트의 위치를 디자인
3. 스타일과 테마를 활용하여 비주얼을 꾸밈
4. dymanic behavior(동적 행동) 를 추가
5. 데이타 서비스를 필요로하면 선언하고 연결
6. Flash Player에서 실행되도록 SWF 파일로 빌드

Flex 어플리케이션의 구성요소


 Flex framework    버튼, 박스등의 콤포넌트를 포함하고 있는 저장소
 MXML                전체적인 모양을 디자인도 하고 내부에 액션스크립트도 넣음.
 ActionScript3.0    플렉스의 행동을 정해주는 코드
 CSS                   스타일 시트
 Graphic assets    그래픽 재료들
 Data                   데이타

Flex 어플리케이션 컴파일과 배치도
사용자 삽입 이미지
그림을 뚫어져라 쳐다보니 디자인 -> 클래스 연동 컴파일 -> 실행 으로 이루어져 있군요.
플래시의 디자인 위주의 개발과는 다른 코드위주의 개발 환경입니다.
Action Script와 MXML, CSS를 활용하고, 플래시에서와 같이 jpg, swf, gif를 포함 할수 있다고 되어 있습니다.

액션 스크립트는 자바와 아주 유사한 형태로 되어 있어 자바를 아시는 분은 좀더 접근하기 쉬울것 같습니다.

모든것의 시작은 MXML로
MXML로 아래와 같이 코딩을 하면 Panel위에 TextArea와 Button이 올라간 어플리케이션이 만들어 집니다.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel>
<mx:TextArea text="Say hello to Flex!" />
<mx:Button label="Close" />
</mx:Panel>
</mx:Application>
사용자 삽입 이미지

이번은 기본적인 제작 방법과 구성에 대해서 공부해 보았습니다.
다음에는 데이타 연결 개요에 대해 공부해 볼것입니다.
(나름 정리가 되는것 같긴한데 글쓰는게 쉬운게 아니군요 ^^;)