5주차 PPT

프로그램 2008.09.29 04:59 Posted by soulfree >동네청년<

프로그래밍및실험 II PPT 입니다~~



오늘의 명언
사용자 삽입 이미지

공부안하면 수갑찬다

'프로그램' 카테고리의 다른 글

7주차  (0) 2008.10.12
6주차  (0) 2008.10.05
5주차 PPT  (0) 2008.09.29
자바스크립트 잘 정리된 사이트  (0) 2008.08.21
target(href) 타겟사용법  (0) 2008.08.17
색상코드표  (0) 2008.08.16

자바스크립트 잘 정리된 사이트

프로그램 2008.08.21 04:46 Posted by soulfree >동네청년<
http://freeutil.net/board/376

parent가 안먹길래 opener 사용... 병따개??

'프로그램' 카테고리의 다른 글

6주차  (0) 2008.10.05
5주차 PPT  (0) 2008.09.29
자바스크립트 잘 정리된 사이트  (0) 2008.08.21
target(href) 타겟사용법  (0) 2008.08.17
색상코드표  (0) 2008.08.16
CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14

target(href) 타겟사용법

프로그램 2008.08.17 17:38 Posted by soulfree >동네청년<
출처 : :: 뚱어 :: 나를 뛰어넘는 도전 / http://www.missjang.com/99

프레임을 쓰실때 생각할 것 세가지
1. frame_name.location = 'url.php';
또는 frame_name.location.href = 'url.php';
또는 frame_name.location.replace('url.php')
2. parent.frame_name.location = 'url.php';
3. opener.parent.frame_name.location = 'url.php';

새창을 열게해준 창의 주소를 바꾸고 새창을 끈다.
<script>
opener.location.href = 'url.php';
self.close();
</script>

새창을 열게해준 창의 주소를 새로고침하고 새창을 끈다
<script>
opener.location.reload();
self.close();
</script>

다른 프래임의 주소를 바꾸게 하려면
<script>
frame_name.location.href = 'url.php';
</script>

프래임 구조상 상위 프래임의 주소를 바꾸게 하려면
<script>
parent.location.href = 'url.php';
</script>

타겟이 지정된 프레임을 바꾼다.(타겟하나)
<script>
parent.target(타겟).location.href = 'url.php';
</script>

타겟이 지정된 프레임을 바꾼다.(타겟둘)
<script>
parent.target1(타겟1).location.href = 'url1.php';
parent.target2(타겟2).location.href = 'url2.php';
</script>

타겟이 지정된 프레임을 바꾼다.(타겟셋)
<script>
parent.target1(타겟1).location.href = 'url1.php';
parent.target2(타겟2).location.href = 'url2.php';
parent.target3(타겟3).location.href = 'url3.php';
</script>

타겟이 지정된 프레임두개를 클릭으로 바꾸려면
<script>
function target_frame(url1, url2)
{
parent.top_frame.location.href = url1;
parent.main_frame.location.href = url2;
}
</script>
<a href="target_frame('main_menu.html', '$go_url');"> 확인 </a>

로그인페이지 에선
<script>
parent.top_frame.location.href = '../main.html'; //main.html는 로그인페이지 보다 상위디렉토리에 있다.
parent.main_frame.location.href = '$go_url';
</script>

로그인페이지를 새창으로 띄웠다면
<script>
opener.parent.top_frame.location.href = '../main.html';
opener.parent.main_frame.location.href = '$go_url';
self.close();
</script>

-------------------------------------

<script>
top.frames['calendar'].location.reload();
</script>

'프로그램' 카테고리의 다른 글

5주차 PPT  (0) 2008.09.29
자바스크립트 잘 정리된 사이트  (0) 2008.08.21
target(href) 타겟사용법  (0) 2008.08.17
색상코드표  (0) 2008.08.16
CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14
Commons-Fileupload 1.2  (0) 2008.08.11

색상코드표

프로그램 2008.08.16 17:19 Posted by soulfree >동네청년<
#FFFFFF = White / 하얀색 LOVE
#FF0000 = Red / 빨간색 LOVE
#00FF00 = Green / 녹색 LOVE
#0000FF = Blue / LOVE
#FF00FF = Magenta / LOVE
#00FFFF = Cyan / LOVE
#FFFF00 = Yellow / LOVE
#000000 = Black / LOVE
#70DB93 = Aquamarine / LOVE
#5C3317 = Baker's Chocolate / 초코렛 LOVE
#9F5F9F = Blue Violet / LOVE
#B5A642 = Brass / LOVE
#D9D919 = Bright Gold / LOVE
#A62A2A = Brown / LOVE
#8C7853 = Bronze / LOVE
#A67D3D = Bronze Ⅱ / LOVE
#5F9F9F = Cadet Blue / LOVE
#D98719 = Cool Copper / LOVE
#B87333 = Copper / LOVE
#FF7F00 = Coral / LOVE
#42426F = Corn Flower Blue / LOVE
#5C4033 = Dark Brown / LOVE
#2F4F2F = Dark Green / LOVE
#4A766E = Dark Green Copper / LOVE
#4F4F2F = Dark Olive Green / LOVE
#9932CD = Dark Orchid / LOVE
#871F78 = Dark Purple / LOVE
#6B238E = Dark Slate Blue / LOVE
#2F4F4F = Dark Slate Grey / LOVE
#97694F = Dark Tan / LOVE
#7093DB = Dark Turquoise / LOVE
#855E42 = Dark Wood / LOVE
#545454 = Dim Grey / LOVE
#856363 = Dusty Rose / LOVE
#D19275 = Feldspar / LOVE
#8E2323 = Firebrick / LOVE
#F5CCB0 = Flesh / LOVE
#238E23 = Forest Green / LOVE
#CD7F32 = Gold / LOVE
#DBDB70 = Goldenrod / LOVE
#C0C0C0 = Grey / LOVE
#527F76 = Green Copper / LOVE
#93DB70 = Green Yellow / LOVE
#215E21 = Hunter Green / LOVE
#4E2F2F = Indian Red / LOVE
#9F9F5F = Khaki / LOVE
#C0D9D9 = Light Blue / LOVE
#A8A8A8 = Light Grey / LOVE
#8F8FBD = Light Steel Blue / LOVE
#E9C2A6 = Light Wood / LOVE
#32CD32 = Lime Green / LOVE
#E47833 = Mandarian Orange / LOVE
#8E236B = Maroon / LOVE
#3299CD = Medium Aquamarine / LOVE
#3232CD = Medium Blue / LOVE
#6B8E23 = Medium Forest Green / LOVE
#EAEAAE = Medium Goldenrod / LOVE
#9370DB = Medium Orchid / LOVE
#426F42 = Medium Sea Green / LOVE
#7F00FF = Medium Slate Blue / LOVE
#7FFF00 = Medium Spring Green / LOVE
#70DBDB = Medium Turquoise / LOVE
#DB7093 = Medium Violet Red / LOVE
#A68064 = Medium Wood / LOVE
#2F2F4F = Midnight Blue / LOVE
#23238E = Navy Blue / LOVE
#4D4DFF = Neon Blue / LOVE
#FF6EC7 = Neon Pink / LOVE
#00009C = New Midnight Blue / LOVE
#EBC79E = New Tan / LOVE
#CFB53B = Old Gold / LOVE
#FF7F00 = Orange / LOVE
#FF2400 = Orange Red / LOVE
#DB70DB = Orchid / LOVE
#8FBC8F = Pale Green / LOVE
#BC8F8F = Pink / LOVE
#EAADEA = Plum / LOVE
#D9D9F3 = Quartz / LOVE
#5959AB = Rich Blue / LOVE
#6F4242 = Salmon / LOVE
#8C1717 = Scarlet / LOVE
#238E68 = Sea Green / LOVE
#6B4226 = Semi-Sweet Chocolate / LOVE
#8E6B23 = Sienna / LOVE
#E6E8FA = Silver / LOVE
#3299CC = Sky Blue / LOVE
#007FFF = Slate Blue / LOVE
#FF1CAE = Spicy Pink / LOVE
#00FF7F = Spring Green / LOVE
#236B8E = Steel Blue / LOVE
#38B0DE = Summer Sky / LOVE
#DB9370 = Tan / LOVE
#D8BFD8 = Thistle / LOVE
#ADEAEA = Turquoise / LOVE
#5C4033 = Very Dark Brown / LOVE
#CDCDCD = Very Light Grey / LOVE
#4F2F4F = Violet / LOVE
#CC3299 = Violet Red / LOVE
#D8D8BF = Wheat / LOVE

'프로그램' 카테고리의 다른 글

자바스크립트 잘 정리된 사이트  (0) 2008.08.21
target(href) 타겟사용법  (0) 2008.08.17
색상코드표  (0) 2008.08.16
CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14
Commons-Fileupload 1.2  (0) 2008.08.11
톰고양이 context reload 빨리하는 법...  (0) 2008.08.08

CHAR와 VARCHAR TYPE의 차이

프로그램 2008.08.14 14:50 Posted by soulfree >동네청년<
출처 : 오라클 홈페이지 (http://kr.forums.oracle.com)
         OTN 디스커션 포럼 » 새로운 Technical Bulletin » Database 
         주소 : http://kr.forums.oracle.com/forums/thread.jspa?threadID=464142&tstart=1025

남음과 남지 않음의 차이~~
=====================================================================================

CHAR와 VARCHAR2 TYPE의 차이
===========================


Purpose
-------
Varchar2 type과 Char type의 차이를 이해한다.


Explanation
-----------

CHAR와 VARCHAR2(VARCHAR)의 차이를 간단히 설명한다면 CHAR DATATYPE은
FIXED LENGTH CAHRACTER STRING을 저장합니다.
만약 TABLE이 CHAR COLUMN을 갖고 CREATE될때 COLUMN LEGTH는 BYTES로
1에서 255까지의 DATA를 저장할 수 있읍니다. COLUMN길이가 10 으로 정의
었을때 한번 INSERT 문장을 통해 5 BYTES를 입력하였다면 나머지 5 BYTES는
SPACE 처리되어 그 DATA의 SIZE는 10 BYTE가 됩니다.

SQLPLUS의 VSIZE함수를 통해 알아보면 다음과 같습니다.

SQL> SELECT VSIZE(column_name) FROM table_name;

column_name
------------
10
10

반면에 VARCHAR2 DATATYPE은 VARIABLE-LENGTH CHARACTER STRINGS을 저장합
니다. 만약 TABLE이 VARCHAR2 COLUMN을 갖고 CREATE될때 COLUMN LENGTH 1에서
2000 BYTES까지의 DATA를 저장할수 있습니다. COLUMN길이가 10 으로 정의되었
을때 번 INSERT 문장을 통해 5 BYTES를 입력하였다면 나머지 5 BYTES는
NULL 처리되어 그 DATA의 SIZE는 5 BYTE가 됩니다.

SQLPLUS의 VSIZE함수를 통해 알아보면 다음과 같습니다.

SQL> SELECT VSIZE(column_name) FROM table_name;

column_name
------------
5
5

위와 같은 특징을 갖고 있기 때문에 정확히 구분하여 사용해야만 SPACE를
절약할수 있고 ERROR를 방지할수 있습니다.

만약 사용자가 COMPARISON상에서 ANSI 호환성을 요구한다면 를 DATA TYPE를
CHAR로 선언해야 합니다. 즉 나머지공간(TRAILING BLANK)이 STRING
COMPARISONS에서 중요한다면 CHAR로 해야합니다. 그런 특수한 경우 제외한
나머지 경우에는 VARCAHR2로 사용하는 것이 SPACE가 절약 될 것 입니다.


Reference Document
------------------
Oracle SQL Reference Guide

'프로그램' 카테고리의 다른 글

target(href) 타겟사용법  (0) 2008.08.17
색상코드표  (0) 2008.08.16
CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14
Commons-Fileupload 1.2  (0) 2008.08.11
톰고양이 context reload 빨리하는 법...  (0) 2008.08.08
[링크] XML-RPC Howto (KLDP)  (0) 2008.07.23

Commons-Fileupload 1.2

프로그램 2008.08.11 14:17 Posted by soulfree >동네청년<

Commons-Fileupload 1.2


1.2 버젼이 2007.2.13에 새롭게배포되었습니다

1.1 이하단계 버젼과 달라진 점을 알아보도록 하지요

 

I. commons-fileupload 1.1

http://www.jakartaproject.com/article/jakarta/110887666654000

 

 

II. 다운로드 및 설치

 -. fileupload는 commons의 io가 필요합니다

commons-fileupload

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

commons-io

http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi

 

 

III. 달라진점

 -. DiskFileUpload 가 Deprecated 되었습니다

 -. 리스너 추가를 통해 업로드 진행 상태를 파악할 수 있습니다(대용량 파일인 경우 유용)

 -. 비정상적인 업로드시 나타나는 중간 쓰레기 파일들을 제거할 수 있습니다

 

IV. 예제소스코드


upload.html

<form name=fileupload method=post action=./upload enctype="multipart/form-data">
 file : <input type=file name=file1><br>
 text : <input type=text name=text1><br>
 <input type=submit name=button1 value=submit>
</form>

web.xml

가비지 파일 cleaner에 사용되는 FileCleanerCleanup을 listener로 추가

샘플 코드에서 사용되는 서블릿 등록

<web-app>

   ...

 

   <listener>
       <listener-class>
           org.apache.commons.fileupload.servlet.FileCleanerCleanup
       </listener-class>
   </listener>


    ...


    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>UploadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>

    ...

</web-app>


UploadServlet.java


import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadServlet extends HttpServlet {
   
    String upload_dir = null;
    public void init(ServletConfig config) throws ServletException {
          super.init(config); 
          upload_dir = config.getServletContext().getRealPath("/upload/");
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   

        // form type이 multipart/form-data 면 true 그렇지 않으면 false를 반환
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       
        if (isMultipart) {
            try {

                int yourMaxMemorySize = 1024 * 10;                 // threshold  값 설정
                long yourMaxRequestSize = 1024 * 1024 * 100;   //업로드 최대 사이즈 설정 (100M)

                File yourTempDirectory = new File(upload_dir);
               
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(yourMaxMemorySize);
                factory.setRepository(yourTempDirectory);               
   
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setSizeMax(yourMaxRequestSize);          // 임시 업로드 디렉토리 설정
                upload.setHeaderEncoding("EUC_KR");               // 인코딩 설정
               

                /**

                 *  업로드 진행 상태 출력 (Watching progress)

                */
                ProgressListener progressListener = new ProgressListener(){
                   private long megaBytes = -1;
                   public void update(long pBytesRead, long pContentLength, int pItems) {
                       long mBytes = pBytesRead / 1000000;
                       if (megaBytes == mBytes) {
                           return;
                       }
                       megaBytes = mBytes;
                       System.out.println("We are currently reading item " + pItems);
                       if (pContentLength == -1) {
                           System.out.println("So far, " + pBytesRead + " bytes have been read.");
                       } else {
                           System.out.println("So far, " + pBytesRead + " of " + pContentLength
                                              + " bytes have been read.");
                       }
                   }
                };
                upload.setProgressListener(progressListener);   // 진행상태 리스너 추가
   

                String fieldName = null;
                String fieldValue = null;
                String fileName = null;
                String contentType = null;
                long sizeInBytes = 0;

                List items = upload.parseRequest(request);               
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
   

                    // 정상적인 폼값 출력 및 처리
                    if (item.isFormField()) {
                        fieldName = item.getFieldName();
                        fieldValue = item.getString();
                       
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                        System.out.println("Field Name : "+fieldName);
                        System.out.println("Field Value : "+fieldValue);
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                       

                    // 업로드 파일 처리
                    } else {
                        fieldName = item.getFieldName();
                        fileName = item.getName();
                        contentType = item.getContentType();
                        sizeInBytes = item.getSize();
                       
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                        System.out.println("Field Name : "+fieldName);
                        System.out.println("File Name : "+fileName);
                        System.out.println("ContentType : "+contentType);
                        System.out.println("File Size : "+sizeInBytes);
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");

                        String savefile = fileName.substring(fileName.lastIndexOf("\\")+1, fileName.length());
                        File uploadedFile = new File(upload_dir+"\\"+savefile);
                        item.write(uploadedFile);
                    }
                }


            // 설정한 업로드 사이즈 초과시 exception 처리
            } catch (SizeLimitExceededException e) {
                e.printStackTrace();   

            // 업로드시 io등 이상 exception 처리
            } catch (FileUploadException e) {
                e.printStackTrace();

            // 기타 exception 처리
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }   
}


V. 실행결과

-----+-----+-----+-----+-----+-----+-----+-----+-----
Field Name : file1
File Name : C:\Program Backup\AromNet11a\AromNet.exe
ContentType : application/octet-stream
File Size : 274432
-----+-----+-----+-----+-----+-----+-----+-----+-----
-----+-----+-----+-----+-----+-----+-----+-----+-----
Field Name : text1
Field Value : this is test
-----+-----+-----+-----+-----+-----+-----+-----+-----

큰 파일을 업로드한 경우 업로드 상태 출력

We are currently reading item 0
So far, 4096 of 338043623 bytes have been read.
We are currently reading item 1
So far, 1003477 of 338043623 bytes have been read.
We are currently reading item 1
So far, 2002901 of 338043623 bytes have been read.
We are currently reading item 1
So far, 3002325 of 338043623 bytes have been read.
We are currently reading item 1
So far, 4001749 of 338043623 bytes have been read.
We are currently reading item 1
So far, 5001173 of 338043623 bytes have been read.
We are currently reading item 1
So far, 6000597 of 338043623 bytes have been read.
We are currently reading item 1
So far, 7000021 of 338043623 bytes have been read.
We are currently reading item 1
So far, 8003498 of 338043623 bytes have been read.
We are currently reading item 1
So far, 9002922 of 338043623 bytes have been read.
We are currently reading item 1
So far, 10002346 of 338043623 bytes have been read.
We are currently reading item 1
So far, 11001770 of 338043623 bytes have been read.
We are currently reading item 1
So far, 12001194 of 338043623 bytes have been read.
We are currently reading item 1
So far, 13000618 of 338043623 bytes have been read.
We are currently reading item 1
So far, 14000042 of 338043623 bytes have been read.
We are currently reading item 1
So far, 15003605 of 338043623 bytes have been read.
We are currently reading item 1
So far, 16003029 of 338043623 bytes have been read.

...


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

'프로그램' 카테고리의 다른 글

색상코드표  (0) 2008.08.16
CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14
Commons-Fileupload 1.2  (0) 2008.08.11
톰고양이 context reload 빨리하는 법...  (0) 2008.08.08
[링크] XML-RPC Howto (KLDP)  (0) 2008.07.23
Cygwin을 이용한 NFS 사용  (0) 2008.07.09

톰고양이 context reload 빨리하는 법...

프로그램 2008.08.08 23:06 Posted by soulfree >동네청년<

이번 방학에는 마음은 임베디드 혹은 C,C++ 쪽 high lang에서도 좀 low lang으로 개발을 하고 싶었으나...
여의치않게도 또 웹 프로그램을 개발하게 되었다... ㅋ 재밌기는 하지만... 개발해놓고 나면 왠지 거저먹는다는 기분이 좀 들어서 ㅋㅋ
넷빈즈로 개발하고 웹페이지를 톰켓 webapp에 복사하면 이상하게도 변경한 페이지가 보이지 않고
webapp에 복사한 파일을 수정했다가 새로고침하면 잘나오는 현상이 있어서 알아보니
톰켓에 환경설정하는 부분이 있었다...

출처는 http://okjsp.pe.kr/seq/58014

핵심은 conf 폴더의 server.xml 나 context.xml에서 reloadable 변수 추가 interval 수정 쯔읍...

<Service name="Tomcat-Standalone">
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
               port="8009" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="10" debug="0" connectionTimeout="0"
               useURIValidationHack="false"
               protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
    <Engine ...>
      <Logger .../>
      <Realm .../>
      <DefaultContext reloadable="true" swallowOutput="true">
        <Loader checkInterval="8"/>
      </DefaultContext>


 

checkInterval은 초단위... 서버 부하가 많이 걸린다는 말씀도 있는데
뭐 내가 check하나 컴퓨터가 하지. 그런거 하라고 만든 컴퓨터이고 그런거 해도 무리없으라고 비싼돈준게 서버인데 쩝. 난 몰라.

'프로그램' 카테고리의 다른 글

CHAR와 VARCHAR TYPE의 차이  (0) 2008.08.14
Commons-Fileupload 1.2  (0) 2008.08.11
톰고양이 context reload 빨리하는 법...  (0) 2008.08.08
[링크] XML-RPC Howto (KLDP)  (0) 2008.07.23
Cygwin을 이용한 NFS 사용  (0) 2008.07.09
com.sun.tools.javac.Main 에러문제  (0) 2008.06.08

[링크] XML-RPC Howto (KLDP)

프로그램 2008.07.23 13:03 Posted by soulfree >동네청년<
http://wiki.kldp.org/wiki.php/DocbookSgml/XML-RPC-HOWTO#XMLRPC-HOWTO-JAVA

Cygwin을 이용한 NFS 사용

프로그램 2008.07.09 13:03 Posted by soulfree >동네청년<
http://www.csparks.com/CygwinNFS/index.xhtml

com.sun.tools.javac.Main 에러문제

프로그램 2008.06.08 17:04 Posted by soulfree >동네청년<
출처 : http://moonlita.tistory.com/entry/java-compile-comsuntoolsjavacMain-is-not-on-the-classpath

JDK의 lib/tools.jar 파일을 JRE가 참조할 수 있도록 복사해주기. ext 폴더나 톰켓의 경우 lib 폴더에..

'프로그램' 카테고리의 다른 글

[링크] XML-RPC Howto (KLDP)  (0) 2008.07.23
Cygwin을 이용한 NFS 사용  (0) 2008.07.09
com.sun.tools.javac.Main 에러문제  (0) 2008.06.08
php 모듈 확장 방법 그리고 mysql 실행 안될때...  (0) 2008.02.19
[펌]GDI+ 소개  (0) 2007.11.07
당분간 FTP 서버 중지...  (0) 2007.11.07

php 모듈 확장 방법 그리고 mysql 실행 안될때...

프로그램 2008.02.19 16:35 Posted by soulfree >동네청년<
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=52291
gd 라이브러리 때문에... ㅠㅠ

그리고 패키지로 리눅스 설치할 때 같이 mysql 포함했다면...
--user=root 옵션 붙이세요...
아 진짜 패키지 님아 좀...

'프로그램' 카테고리의 다른 글

Cygwin을 이용한 NFS 사용  (0) 2008.07.09
com.sun.tools.javac.Main 에러문제  (0) 2008.06.08
php 모듈 확장 방법 그리고 mysql 실행 안될때...  (0) 2008.02.19
[펌]GDI+ 소개  (0) 2007.11.07
당분간 FTP 서버 중지...  (0) 2007.11.07
DDK 관련 자료들  (0) 2007.11.06

[펌]GDI+ 소개

프로그램 2007.11.07 18:10 Posted by soulfree >동네청년<
출처 : www.winapi.co.kr

GDI(Graphic User Interface)는 윈도우즈의 핵심 모듈 중의 하나로 주로 출력과 관련된 기능을 담당한다. 화면, 프린터 등의 출력 하드웨어와 응용 프로그램의 중간에 위치하여 장치 독립성을 확보하며 복수 개의 프로그램이 서로의 영역내에서 방해하지 않고 자유롭게 출력하도록 조율한다. 오랫동안 별탈없이 잘 써오긴 했지만 현대의 복잡한 프로그램들의 요구를 충족시키기에는 다소 부족한 점이 많다.

① 기본적인 그래픽 출력은 가능하지만 섬세한 그래픽 표현에는 다소 역부족이다. 예를 들어 점선 펜을 만들 수는 있지만 굵기가 2이상이면 무조건 실선이 되어 버리므로 굵은 점선을 그을 수 없고 NT 이하에서는 비트맵 브러시도 8*8이상의 크기를 지원하지 않아 큰 비트맵 브러시를 쓸 수 없다.

② 그래픽 속성을 바꿀 때마다 GDI 오브젝트를 일일이 생성, 선택한 후 사용해야 하므로 무척 번거롭다. 빨간색 테두리에 파란색 면을 가지는 타원을 하나 그리려면 Ellipse를 호출하기 전에 펜, 브러시 생성 및 선택을 먼저 해야 하고 그린 후에 선택 해제, 파괴까지 해야 한다. 정작 중요한 출력문보다 준비하고 정리하는 코드가 더 많아 무척 불편하다.

③ 실수로 GDI 오브젝트를 해제하지 않을 경우 리소스 누출에 의해 시스템의 안정성을 위협하기도 한다. 비트맵같은 큰 개체를 해제하지 않으면 특히 많은 리소스를 소모하여 더 이상 그리기를 할 수 없는 상태가 되기도 하는데 이는 시스템 다운에 버금갈 정도로 치명적이다.

GDI+는 전통적인 GDI 모듈의 업그레이드 버전이며 복잡한 그래픽을 출력할 수 있고 기존 기능을 최적화한 새로운 출력 모듈이다. GDI의 계승자이므로 장치 독립성을 제공한다는 기본 목적은 동일하며 GDI로 할 수 있는 대부분의 작업을 GDI+로도 할 수 있다. 윈도우즈 XP와 2003에 기본적으로 탑재되어 있으며 닷넷 플랫폼에도 포함되어 있고 64비트 윈도우즈에서도 계속 지원되므로 향후 GDI를 완전히 대체하게 될 것이다. 2000을 포함하여 2000이하의 버전에서는 별도의 모듈을 배포해야만 사용할 수 있지만 GdiPlus.dll 파일 하나만 복사하면 되므로 하위 호환성의 문제도 거의 없는 셈이다.

95/98 이후의 NT/2000에서 GDI도 투명 비트맵 출력, 좌표 변환, 반투명 출력 등 많은 기능 개선이 이루어졌지만 이런 기능은 사실 있어도 마음대로 사용할 수 없었다. 왜냐하면 추가된 함수를 하나라도 사용하게 되면 95/98에서 이 프로그램은 제대로 실행되지 않기 때문이다. 이렇게 만든 프로그램을 95/98 사용자가 쓸 수 있는 유일한 방법은 운영체제를 업그레이드하는 것 뿐이므로 시장을 포기하지 않는 한 이런 함수를 함부로 쓰지 못한다.

그러나 GDI+는 DLL을 같이 복사하면 하위 버전의 운영체제에서도 문제없이 잘 실행되므로 호환성을 걱정할 필요가 없다. 95/98 환경이라도 DLL 파일을 같이 배포하기만 하면 되므로 용량이 약간 늘어난다는 것 외에는 별다른 번거로움이 없는 것이다. DLL의 버전 충돌을 피하기 위해서 DLL을 재배포할 때는 가급적이면 시스템 디렉토리보다 응용 프로그램이 설치되는 디렉토리에 같이 복사하는 것이 안전하며 마이크로소프는 이런 배포 방식을 권장하고 있다.

GDI+를 사용하려면 먼저 플랫폼 SDK를 설치해야 한다. 이 SDK를 다운로드받아 설치하면 GDI+의 헤더 파일과 임포트 라이브러리 등은 물론이고 도움말까지 같이 설치된다. 설치 후 컴파일러의 디렉토리 옵션창에서 Include 경로와 Library 경로에 플랫폼 SDK의 경로를 추가하되 최신 SDK 정보를 가장 먼저 참조하도록 목록의 제일 위쪽으로 이동시켜야 한다.

GDI+는 DirectX의 기능 일부를 사용하므로 컴파일러가 최신 정보를 참조할 수 있도록 반드시 목록의 제일 위쪽에 두어야 한다. 그렇지 않으면 제대로 컴파일되지 않는다. 플랫폼 SDK만 설치하면 이후부터 비주얼 C++ 6.0에서도 GDI+를 프로그래밍할 수 있다. 이외에 릴리즈 후에 발견된 JPEG 출력 모듈의 보안 취약점 해결을 위한 패치 등을 다운로드 받아 설치하는 것이 좋다.

GDI+와 함께 설치되는 플랫폼 SDK 도움말에는 GDI+의 거의 모든 것들이 완벽하게 기록되어 있다. 친절한 자습서는 물론이고 컴파일해 볼만한 예제와 각 클래스의 멤버에 대한 정보, 함수에 대한 도움말, 고급 기법에 대한 문서 등이 수록되어 있으므로 이 도움말만 순서대로 읽어 봐도 GDI+는 쉽게 정복할 수 있다. 물론 영어로 되어 있다.

GDI+는 최신 라이브러리인만큼 객체 지향적인 C++언어로 작성되어 있다. 그래서 C컴파일러에서는 이 라이브러리를 사용할 수 없다는 문제점이 있기는 하지만 요즘의 컴파일러들은 대부분 C++언어를 잘 지원하므로 개발툴의 제약도 거의 없는 셈이다. GDI+는 GDI의 기능을 개선한 클래스 라이브러리이므로 일단 GDI에 대해서 잘 알고 있어야 하며 C++ 언어의 기본적인 사용 방법에 대해서도 충분히 숙지하고 있어야 한다.

GDI+는 기초적인 C++문법만을 요구하므로 C++에 대한 해박한 지식을 요구하는 정도는 아니다. 상속이나 가상 함수, 템플리트 같은 고급 기법까지는 모르더라도 객체안에 속성과 함수가 캡슐화되어 있다는 것과 객체가 생성 파괴될 때 자동으로 호출되는 함수가 있다는 것 정도만 알아도 GDI+를 배우고 사용할 수 있다. GDI+를 공부해 보면 왜 C++이 좋은가를 실감할 수 있을 것이다.

'프로그램' 카테고리의 다른 글

com.sun.tools.javac.Main 에러문제  (0) 2008.06.08
php 모듈 확장 방법 그리고 mysql 실행 안될때...  (0) 2008.02.19
[펌]GDI+ 소개  (0) 2007.11.07
당분간 FTP 서버 중지...  (0) 2007.11.07
DDK 관련 자료들  (0) 2007.11.06
리눅스 그래픽 시스템  (0) 2007.11.06
TAG gdi, GDI+

당분간 FTP 서버 중지...

프로그램 2007.11.07 18:03 Posted by soulfree >동네청년<
삼바 클라이언트를 이용한 전송에서 2기가 이상의 파일을 전송하는데 문제가 있는것 같군요.
FTP 서버를 대폭 변경해야되겠습니다.

'프로그램' 카테고리의 다른 글

php 모듈 확장 방법 그리고 mysql 실행 안될때...  (0) 2008.02.19
[펌]GDI+ 소개  (0) 2007.11.07
당분간 FTP 서버 중지...  (0) 2007.11.07
DDK 관련 자료들  (0) 2007.11.06
리눅스 그래픽 시스템  (0) 2007.11.06
[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05

DDK 관련 자료들

프로그램 2007.11.06 20:09 Posted by soulfree >동네청년<
MSDN
http://msdn2.microsoft.com/en-us/library/ms791699.aspx

비주얼스튜디오에서 DDK build를...


http://blog.empas.com/p14406/22804132


디바이스 드라이버

http://tong.nate.com/haru3173/11426760

드라이버 쪼물딱 거리기 1탄

http://somma.egloos.com/2710282

DDK, Visual Studio 2005 연동하기

http://blog.naver.com/pfool/100035568659

DDK mirror 드라이버 컴파일, 설치, 실행
http://blog.naver.com/pfool?Redirect=Log&logNo=100036286622

'프로그램' 카테고리의 다른 글

[펌]GDI+ 소개  (0) 2007.11.07
당분간 FTP 서버 중지...  (0) 2007.11.07
DDK 관련 자료들  (0) 2007.11.06
리눅스 그래픽 시스템  (0) 2007.11.06
[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05
객체지향 프로그래밍 튜터 자료  (0) 2007.10.30

리눅스 그래픽 시스템

프로그램 2007.11.06 00:30 Posted by soulfree >동네청년<
1. 개요

 리눅스의 그래픽 시스템의 구조는 현재 크게 3가지로 나뉘고 있다. 전통적인 X 윈도우 구조, Framebuffer Device를 이용한 구조, DirectFB를 이용한 구조가 그것이다.

 

2. X 윈도우 구조


 X 윈도우는 서버/클라이언트 모델을 가지고 있다. 응용 프로그램의 각종 그래픽 요청(각종 그리기 연산, 이벤트 전달 등등) X 서버에 전달하면 X 서버는 요청을 받아 들여서 그래픽 카드를 다루는 디바이스 드라이버를 이용하여 그래픽 연산 요청을 처리한다. 응용 프로그램 쪽의 그래픽 요청은 Xlib를 이용하여 이루어지게 되고 커널의 네트워크 계층을 지나서 서버에 전달되게 된다.

 X 윈도우의 서버/클라이언트 모델은 응용 프로그램에 유연성을 제공하고 자원의 공유를 쉽게 할 수 있도록 하지만 각종 요청이 네트워크 계층을 지나야 하고 서버와 클라이언트에 중복된 정보를 유지해야 하는 등의 문제로 성능과 효율성 면에서는 문제점을 가지고 있다.

 응용의 개발은 Xlib를 직접 사용하여 개발 될 수 있지만 대게는 GTK/QT와 같은 보다 상위의 그래픽 위젯을 제공하는 라이브러리를 이용하여 개발된다.

 

3. Framebuffer 구조

사용자 삽입 이미지

 

 Framebuffer는 두 가지 의미로 사용되고 있다. 원래는 그래픽 카드의 비디오 메모리 중에서 실제 한 화면을 표시할 정보를 담고 있는 메모리 공간을 나타내는 말이었지만 커널에서 확보되는 비디오 메모리 내의 Framebuffer로 전달될 메모리 공간도 Framebuffer라고 말한다.

리눅스 Framebuffer Device는 커널 2.4.x 부터 Experimental로 포함된 그래픽 디바이스를 다루는 공통 API이다. 다시 말하면 여러 가지 그래픽 카드를 동일하게 다루기 위해서 정의된 인터페이스이다.

각 그래픽 카드를 Framebuffer Device를 통해서 활용하기 위해서는 Framebuffer device를 지원하는 디바이스 드라이버가 필요하다.

응용 프로그램에서는 Framebuffer 계층의 API를 통해서 직접 그래픽 관련 작업을 수행 할 수 있지만 X 윈도우의 경우와 마찬가지로 Framebuffer 위에 구현된 GTK QT등의 상위 그래픽 위젯을 포함하는 라이브러리를 활용하는 것이 보통이다.

 

3. DirectFB 구조

 

사용자 삽입 이미지
 

DirectFB Framebuffer Device 구조의 확장이라고 볼 수 있다. DirectFB를 지원하는 드바이스 드라이버를 가진 그래픽 카드의 경우에 DirectFB를 이용하여 가능한 그래픽 연산은 DirectFB를 통해서 처리하고 그렇지 않은 경우에는 기존의 Framebuffer Device를 이용하여 처리 한다.

DirectFB는 직접적으로 응용 프로그램에서 직접 그래픽 카드가 가지고 있는 가속 기능을 이용하고 Framebuffer Device 구조보다 쉽게 디바이스를 접근 할 수 있도록 윈도우 생성/관리 기능과 사운드, 키보드, 마우스 등의 입출력 장치를 다룰 수 있는 기능을 추가로 구현한 것이다. 윈도우의 DirectX의 하위 모듈인 DirectDraw를 리눅스에서 구현한 것이라고 불 수 있다.

'프로그램' 카테고리의 다른 글

당분간 FTP 서버 중지...  (0) 2007.11.07
DDK 관련 자료들  (0) 2007.11.06
리눅스 그래픽 시스템  (0) 2007.11.06
[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05
객체지향 프로그래밍 튜터 자료  (0) 2007.10.30
인터넷 보안 10장  (0) 2007.10.30

[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock

프로그램 2007.11.05 23:15 Posted by soulfree >동네청년<
출처 : http://blog.empas.com/uuzazuk/19664434

Blit, Flip, RECT
, DDBLTFX 그리고 Lock

게임 제작에서는 복사를 자주 하게됩니다. 왜냐하면, 단 1개의 표면으로 모니터에 그림을 나타내는 것이 아니라 우선 2차, 3차 표면에다가 그림이나 캐릭터를 준비해 두었다가 나중에 1차 화면으로 그림들을 보내어 우리가 눈으로 볼 수 있게 하는 방식을 쓰기 때문입니다. 따라서 이제는 표면 복사 개념을 가진 함수인 Blit와 Flip - 그리고 이와 같은 효과를 가지는 Lock 함수 - 을 공부해야 하며, 또 이 과정에서 사용되는 RECT와 DDBLTFX라는 구조체도 알아 두어야 합니다.

1. Flip에 대하여
쉬운 개념부터 먼저 정리한다. 결론적으로 Flip 함수는 오로지 2차 표면에 들어가 있는 그림 내용을 - 눈에 보이는 화면 즉, 모니터 화면으로 이해하여도 될 - 1차 표면으로 복사해 주는 함수로써 사용법은 다음과 같이 아주 간단하다.

) lpPrimary-> Flip(NULL, DDFLIP_WAIT):
앞에는 1차 표면을 나타내는 lpPrimary 객체가 나와, 그림 자료를 - 2차 표면에서 - 1차 표면으로 복사해 준다는 말이 되는데, 첫번째 매개변수의 NULL이란 뜻은 그림 자료 '전체' 크기를 전달하겠다는 의미이다. 그런데, 매개변수 안에는 2차 표면에 대한 언급 내용을 전혀 찾아 볼 수 없다. 그 이유는 2차 표면의 크기는 1차 표면과 같기에 - 이들이 이처럼 내부적으로 연관 되어있으므로 - 2차 표면에 대한 언급이 없다.

2. Blit에 대하여
한편, 3차 표면의 그림들을 2차 표면으로 복사해 주는 함수는 Blit인데, Blit해 주는 함수 종류로는 Blt 함수와 Bltfast 함수가 있다. 이들의 복사 과정은 다소 다르며, 약간은 복잡하다고 할 수 있겠다.

◈ 참고 : Blt 함수와 Bltfast 함수는 표면 복사에 제한이 없다
Blt 함수와 Bltfast 함수는 일반적으로 3차 표면의 그림을 2차 표면으로 복사시키는데 사용된다. 그러나, 때로는 2차 표면에서 1차 표면으로 복사할 때도 사용되는 등 이들 함수는 사실상 표면 복사에 제한이 없다. 따라서 3차 표면에서 다른 3차 표면으로 그림 자료를 복사할 수도 있고, 또 3차에서 바로 1
차 표면으로도, 심지어는 1차 표면에서 2차 표면으로 복사할 때도 사용된다.
1) Blt와 Bltfast의 차이점
예) lpSecondary-> Bltfast(100, 200, &lpThird, &Srect, DDBLTFAST_WAIT);
예) lpSecondary-> Blt(&Drect, lpThird, &Srect, DDBLT_WAIT, NULL);

이 Blt 함수와 Bltfast 함수는 3차 표면(lpThird)에 들어가 있는 그림 자료를 2차 표면(lpSecondary)으로 복사해 준다. 그러나 차이점은 - 매개변수들을 통해서도 알 수 있듯이 - Bltfast 함수는 그림 크기 조절이 되지 않는 반면, Blt 함수는 그림 크기 조절이 가능하며 또 다양한 효과도 함께 나타낼 수 있다는 점이다.

2) Bltfast 함수의 사용
예) lpSecondary-> Bltfast(100, 200, &lpThird, &Srect, DDBLTFAST_WAIT);

결론은 3차 표면(lpThird)에 있는 그림 자료를 2차 표면(lpSecondary)으로 복사해 준다는 점이다. 즉, 3차 표면(lpThird)에 있는 Srect 크기의 사각형을 2차 표면(lpSecondary)의 100, 200의 픽셀 위치에다가 복사해 준다.

이 함수는 Srect라는 사각형을 그대로 모셔다가 2차 표면의 좌표 100, 200에다가 복사만 해 주기 때문에 사각형 크기에는 변화가 없다. 이처럼 간단한 내용이므로, 속도면에서도 Blt 함수에 비해 10% 정도 빠르다고 한다. (DDBLTFAST_WAIT 라는 flag는 일단 중요하지 않다.)

3) Blt 함수의 사용
그러나, Blt 함수는 - 속도면에서 Bltfast 보다 다소 느리지만 - 다음과 같은 다양한 기능을 나타낼 수 있다.

예) lpSecondary-> Blt(&Drect, lpThird, &Srect, DDBLT_WAIT, NULL);

3차 표면(lpThird)에 있는 그림 자료를 2차 표면(lpSecondary)으로 복사해 준다는 점은 Blt 함수와 같다. 그렇다면 차이점은 무엇일까?

3차 표면(lpThird)에 있는 Srect라는 크기의 사각형을 복사한다는 점은 앞의 Blt 함수와 같지만, 다른 점은 2차 표면(lpSecondary)의 - 좌표가 아니라 - Drect라는 크기의 사각형으로 복사시킨다는 점이다. 이들 2개의 사각형 - 즉, 3차 표면의 Srect와 2차 표면의 Drect는 - 크기가 같을 수도 있지만, 사용자의 의도에 따라 크기를 달리 할 수도 있기 때문에, 결국 그림의 확대 또는 축소가 가능하다는 말이 된다. 정리하자면 Srect는 "복사시킬 소스(Source) 사각형"을 말하며, Drect는 "복사가 되는 목적(Destination) 사각형"을 말한다.

Blt 함수를 사용하여 변화를 줄 수 있는 또 하나의 것은 맨 끝에 있는 매개변수의 처리다. 그냥 NULL을 사용한다면 변화는 없다. 그러나, NULL 대신에 다른 flag값 - 흔히 fx으로 표현하고 있는데 - 으로 바꾸어 쓰면 "사각형에 색상채우기", "이미지의 반전" 등의 효과도 나타낼 수 있다.

4) RECT 구조체
위에서 rect라는 용어를 보았다. 이것은 RECT라는 구조체로써, 사각형을 만드는데, 많이 활용되고 있다.

RECT 구조체의 원형

typedef struct _RECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;

직관적이며, 이해하기 쉽다. rect는 "사각형(rectangle)"을 뜻하며, 사각형 영역을 만들기 위해 4개 점이 사용된다. 그런데 이때 숫자상의 차이가 있다. 즉, (10,10, 319, 249)와 같은 크기를 가진 일반적인 사각형을 RECT 구조체로 표현할 때는 (10,10, 320, 250)와 같이 1이 더해진다. 또한, 사각형의 가로 길이를 계산할 때 보통은 x2-x1 + 1과 같이 계산하지만, RECT 구조체를 사용할 때는 right - left와 같이 계산하므로 숫자상에 차이가 생길 것이다.

rect 구조체에 값을 넣는 - 즉, 초기화시킬 때는 - 다음과 같은 방법 3가지가 사용된다. 흔히 RECT rect; 처럼 구조체 변수를 선언하게 되는데,

① 선언과 함께 바로 초기화시키기 (관련 소스1), (관련 소스2)
RECT rect = {10, 10, 300, 200};
② SetRect 라는 전용 함수를 사용하기
RECT rect;
SetRect(&rect, 10, 10, 300, 200};

별도로 SetRect 함수를 사용하며 첫번째 매개변수에는 rect사각형 주소가 들어가는데, 이 형태가 결국 간단하기에 많이 사용되는 편이다.

③ RECT 구조체의 멤버변수에 값을 직접 넣기
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 300; // 실제로는 left의 값을 더하여 표현한다.
rect.bottom = 200; // 실제로는 top의 값을 더하여 표현한다.

5) DDBLTFX 구조체
우리는 앞에서 GDI를 이용한 사각형 색상 채우기를 공부한 바 있다. 이번에는 이와 같은 효과를 DirectX의 Bltfast 함수를 통해 만들어보자. RECT 구조체와 함께 그 내부의 색상을 채우기 위해 DDBLTFX라는 구조체가 필요하다.

DDBLTFX 구조체의 원형

typedef struct _DDBLTFX
{
DWORD dwSize;
DWORD dwDDFX;
DWORD dwROP;
DWORD dwDDROP;
DWORD dwRotationAngle;
DWORD dwZBufferOpCode;
DWORD dwZBufferLow;
DWORD dwZBufferHigh;
DWORD dwZBufferBaseDest;
DWORD dwZDestConstBitDepth;
// 중략
DWORD dwFillColor;
} DDBLTFX, FAR* LPDDBLTFX;

자, 가로(99), 세로(99) 크기의 사각형에 힌색을 칠해보자.

① 사각형 내부에 힌색 칠하기
DDBLTFX fx;
RECT Drect = (0,0,100,100);
DDBLTFX 구조체의 변수 fx를 선언하고, 99, 99 크기의 사각형으로 초기화시켰다. 여기에서 필요로 될 DDBLTFX 구조체의 멤버변수는 dwSize와 dwFillColor 이므로

fx.dwSize = sizeof(fx);
fx.dwFillColor = RGB(255, 255, 255);
dwSize에는 구조체의 크기를, dwFillColor에는 사각형 내부에 들어갈 색깔을 넣게 되는데, 이미 앞에서 RGB 매크로에 대해서 공부한 바 있다. RGB(255, 255, 255)는 힌색이, RGB(0,0,0)은 검은색이 칠해 질 것이다.

lpSecondary -> Blt (&Drect, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
Blt 함수의 맨 끝의 매개변수에 fx의 주소를 위처럼 적어 주면 - 3차 표면에서 2차 표면으로 - 힌색 사각형이 복사될 것이다. 색깔 채우기와 관련하여 그 앞쪽 매개변수에는 DDBLT_COLORFILL라는 flag도 또한 첨가시켜 주어야 한다. (나중에 flip 함수를 사용하면 좌표 0, 0부터 시작되는 작은 크기(99,99)를 가진 내부가 힌색으로 채워진 사각형을 모니터로 볼 수 있게 될 것이다.)

그림을 좌우반전 시키기.(관련 소스1)
이번에는 그림을 좌우 반전 시키는 효과를 나타내 보자. 즉, 한 번 그렸던 그림을 통해 바로 좌우로 반전 시킬 수도 있는데 이러한 기능들은 DDBLTFX 구조체에 들어가 있다. 이번에는 사용하게 될 2개의 사각형을 SetRect 함수로 표현해 보자.

DDBLTFX fx;
RECT Srect, Drect;
DDBLTFX 구
조체 변수로 fx라고 선언하고, 소스와 목적 사각형을 각각 Srect, Drect라는 이름으로 변수 선언을 한 다음

SetRect(&Srect, 600, 500, 700, 600);
SetRect(&Drect, 10, 50, 110, 150);
사각형의 초기화를 시킬 때 SetRect 함수를 사용했다. 이때 사용되는 2개의 사각형 크기는 모두 가로, 세로 100 픽셀의 크기이다.

fx.dwSize = sizeof(fx);
fx.dwDDFX = DDBLTFX_MIRRORLEFTRIGHT;
dwSize 멤버변수에는 - 앞의 경우과 같이 - 구조체의 크기를 넣어주는데 이번에는 dwDDFX 라는 새로운 멤버변수가 활용된다. 그리고, 또한 넣어주어야 할 것은 좌우 반전의 기능을 가진 DDBLTFX_MIRRORLEFTRIGHT 라는 것이다. 그리고,

lpSecondary -> Blt (&Drect, lpThird, &Srect, DDBLT_DDFX | DDBLT_WAIT, &fx);
앞의 내용들과 모두 같은데 다른 점이란 - 사각형 내부에 색을 넣기 위해 DDBLT_COLORFILL 라는 flag값이 사용되었던 것처럼 - 좌우 반전을 위해 DDBLT_DDFX 라는 값이 필요하다는 것이다. (DDBLT_WAIT라는 flag의 기능은 내가 넣어준 정보들을 - 무시하지 말고, 컴퓨터 속도에 동조되도록 - 계속 대기시켜 두어 사용하겠다는 뜻이다.)
관련 소스2.
관련 소스3.
관련 소스4.
관련 소스5.
관련 소스6.

3. Lock 함수
앞에서 3차 표면의 자료를 2차 표면으로 보낼 때 Blt나 Bltfast 함수가 사용되며, 2차 표면에서 1차 표면으로 보낼 때는 Flip이 사용되는 것을 공부해왔다. 그러나 때로는 - 이 Blt나 Bltfast 함수 대신에 - Lock 함수를 사용하기도 하는데 왜 Lock 함수를 사용하며, 또 그 원리는 무엇일까?
◈ 참고 : Lock에 대해서
Lock은 '잠금'의 의미이다. 다른 것이 접근하지 못하도록 화면을 잠근다는 뜻이다. DirectX는 표면에 접근하는 것을 쉽게 허용하지 않는다. 그러기 때문에 보통 3차 표면을 만들고, Blt나 Bltfast 함수를 통해 자료를 2차 표면으로 복사하는 방법을 사용하게 된다. 그러나, Lock 함수를 사용한다면 예외가 된다.

Lock 함수의 방법이란 - Blit의 "복사" 방식이 아니라 - 잠그고 싶은 (어떤 종류의 표면이라도 가능하다고 판단되는데) 일부 또는 전체 (NULL로 표현)를 다른 것이 접근하지 못하도록 표면 자체를 잠그어 놓고는 내가 직접 그 표면을 마음대로 사용하는 방식이다. 대부분의 경우가 그렇지만 포인터를 사용하여 표현한다. Lock을 했던 표면은 나중에 Unlock 함수를 통해 다시 해제시켜 주어야 한다. Lock의 이러한 잠금의 기능은 다른 영역에도 많이 쓰이는 듯하다.

Lock 함수가 사용된 소스1, 소스2, 소스3
Lock 함수의 흐름은 다음과 같다. 우선 전역변수로 WORD *BOX;처럼 선언 해둔다. 즉, 내가 잠그고자 하는 표면을 가리키는 그 첫 주소로 - 즉, 메모리 포인터 - BOX라고 선언해 두자. BOX는 화면상에서 일단 한 개의 줄을 나타내고 있다. Lock 함수의 흐름은 다음과 같다.
◈ 참고 : Lock된 주소의 데이터형
화면 해상도 결정을 8비트로 했을 경우에는 BYTE형, 16비트 모드인 경우는 WORD, 32비트 모드일 때는 DWORD형이 사용된다. 여기서는 640* 480, 그리고 16비트로 설정한 경우이므로 WORD가 사용되었다.
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
lpSecondary->Lock( NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL );
표면을 잠그어야 하기에 DDSURFACEDESC2 구조체가 필요하며, 또 - 항상 그렇듯이 - 구조체 크기도 dwSize 매개변수에 알려주어야 한다. 여기서는 lpSecondary 즉, 2차 표면을 Lock하려고 하며, 첫번째 매개변수는 흔히 NULL을 사용하는데 전체 표면을 그 대상으로 하겠다는 뜻. 3번째 매개변수의 WAIT와 SURFACEMEMORYPTR에서 볼 수 있듯이 해당 표면에 대한 접근 허용에 있어서 Lock이 될 때까지 기다리다가, 성공하면 바로 표면 객체의 포인터(PTR)를 리턴하라는 뜻. 그리고 다음 내용으로 이어지는데.

// 이하 내용의 설명에 문제가 있는 것 같군요! 2002년 11월 9일
BOX =
(WORD *)ddsd.lpSurface;
이제 DDSURFACEDESC2 구조체에서 표면을 담당하는 lpSurface 매개변수를 BOX에 넣어둔다. 따라서 BOX라는 포인터를 실제로 얻게되면서 (WORD형 포인터인) BOX가 활용될 것이다.
참고 : 메모리의 좌표 계산
포인터는 배열로 표현이 가능하기에 결국 BOX[0]의 표현이 가능하며, 또 메모리 포인터의 시작 번지는 일단 (0,0)의 위치를 가리키게 된다. 즉, BOX[0]과 같은 의미이다. 또한, BOX[1]은 좌표로 (1,0), BOX[639]란 좌표로 (639,0)의 픽셀을 가리키는데 - 객체 표면 메모리 포인터 구조상 - BOX[640]이란 - 0부터 계산되므로 - 세로로 1줄 내려가 시작하니 좌표는 (0,1)이 되지만 offset값은 (0~639)에서 계속이어져 이 경우는 640이 된다. 따라서 BOX[641]이란 좌표 (1,1)이 되며 offset 값은 641이 된다. (offset값의 계산은 메모리 구조가 - 눈에 보이는 사각형이 아니라 - 이처럼 1개의 선(즉, "선형" 방식)으로 계속 이어져 있음을 확인시켜 주고 있다.)
for(int y = 0; y < 480; y++)
{
memset(BOX, 0, 640);
BOX += ddsd.iPitch;
}
iPitch란 - 역시 DDSURFACEDESC2 구조체에 있는 매개변수로써 - 픽셀과 픽셀 사이의 거리를 뜻한다. (모니터 해상도의 단위로 흔히 도트 피치 0.28mm라는 표현을 많이 들을 수 있을 것이다.) 이 iPitch를 Lock 시키고자는 하는 표면의 시작 주소에 넣으면서 계속 증가시키기에 - 선형 구조로 되어있는 메모리 즉, 여기서는 2차 표면인 - 640* 480의 크기까지 화면이 계속 잠그어지게 될 것이다.

참고로 저는 ddsd.dwWidth와
ddsd.dwHeight 매개변수을 사용하지 않고 화면 크기인 480, 640이란 값을 직접 넣었다.

lpSecondary->Unlock( NULL));
이처럼 잠그었던 표면 전체(NULL)를 해제시켜준다.

4. 5:5:5 모드와 5:6:5 모드
16비트 모드를 사용할 때 알아두어야 할 내용이다. 잘 아시다시피 256칼라란 8비트 모드 즉, 1점을 나타낼 때 8개 색상을 동시에 사용하는 것이다. 따라서
16비트 모드란 - 예: 640*480, 16비트 모드 - 1개 픽셀의 색상을 나타날 때 동시에 16개 색상을 사용하는 것이다.

그런데, 16비트에서는 다시 2가지의 모드 즉, 5:6:5 모드와 5:5:5 모드로 나뉜다. 이것은 카드 종류에 따라 분류가 되는 것으로 일반적인 카드는
5:6:5 모드를 사용하지만, 3D 가속 기능이나 TV 수신 카드인 경우는 - 이 중에서 Green 색상에서 1비트를 버리고 사용하므로 - 5:5:5 모드를 사용한다.

따라서 - 일반적인 경우에는 문제가 없겠지만 - Lock 함수를 사용하여 메모리 포인터에 직접 그림을 출력하는 경우라면 - 이러한 모드에 대해 알고 있어야 한다. 따라서 Lock 함수를 사용했을 경우에는 - "점찍기"를 통해 - 위에서 예를 들었던 내용을 사용하여 표현한다면 BOX[0]의 주소값을 아래와 같이 점검하므로써 해당 모드를 구별할 수 있다. 즉,

if (BOX[0] == 0xFFFF) // 좌표 (0,0)를 나타내는 번지 값이 0xFFFF라면
PixelMode = TRUE; // 5:6:5 모드이며,
else
PixelMode = FALSE; // 5:5:5 모드가 된다.

'프로그램' 카테고리의 다른 글

DDK 관련 자료들  (0) 2007.11.06
리눅스 그래픽 시스템  (0) 2007.11.06
[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05
객체지향 프로그래밍 튜터 자료  (0) 2007.10.30
인터넷 보안 10장  (0) 2007.10.30
인터넷보안 7,8,10  (0) 2007.10.23

객체지향 프로그래밍 튜터 자료

프로그램 2007.10.30 21:52 Posted by soulfree >동네청년<
^^

'프로그램' 카테고리의 다른 글

리눅스 그래픽 시스템  (0) 2007.11.06
[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05
객체지향 프로그래밍 튜터 자료  (0) 2007.10.30
인터넷 보안 10장  (0) 2007.10.30
인터넷보안 7,8,10  (0) 2007.10.23
인터넷보안 6,7  (0) 2007.10.18

인터넷 보안 10장

프로그램 2007.10.30 14:55 Posted by soulfree >동네청년<

'프로그램' 카테고리의 다른 글

[펌] DirectDraw - Blit, Flip, RECT, DDBLTFX, Lock  (0) 2007.11.05
객체지향 프로그래밍 튜터 자료  (0) 2007.10.30
인터넷 보안 10장  (0) 2007.10.30
인터넷보안 7,8,10  (0) 2007.10.23
인터넷보안 6,7  (0) 2007.10.18
인터넷 보안 수업자료(6-1)  (0) 2007.10.11

인터넷보안 7,8,10

프로그램 2007.10.23 14:35 Posted by soulfree >동네청년<
9_1은 10장임..

'프로그램' 카테고리의 다른 글

객체지향 프로그래밍 튜터 자료  (0) 2007.10.30
인터넷 보안 10장  (0) 2007.10.30
인터넷보안 7,8,10  (0) 2007.10.23
인터넷보안 6,7  (0) 2007.10.18
인터넷 보안 수업자료(6-1)  (0) 2007.10.11
인터넷 보안 관련자료  (0) 2007.10.04

인터넷보안 6,7

프로그램 2007.10.18 20:52 Posted by soulfree >동네청년<
...

'프로그램' 카테고리의 다른 글

인터넷 보안 10장  (0) 2007.10.30
인터넷보안 7,8,10  (0) 2007.10.23
인터넷보안 6,7  (0) 2007.10.18
인터넷 보안 수업자료(6-1)  (0) 2007.10.11
인터넷 보안 관련자료  (0) 2007.10.04
[THINC] Get Compile Install Run  (0) 2007.10.04