'아빠 노트/개발자 노트'에 해당되는 글 22건

  1. 2009/09/08 안드로이드 G1 국내 SIM카드로 언락(Activation) 시키기 (원문 보완)
  2. 2009/08/27 Mail Pull/Push 방식
  3. 2009/04/10 자동화 빌드 툴이다 ANT 사용업
  4. 2009/04/02 정규 표현식(Regular Expression)
  5. 2008/08/22 PHP로 디렉토리 트리 만들기.
  6. 2008/01/02 [VC] 바탕화면 바로가기 만들기
  7. 2007/06/26 오라클 관계형 데이터베이스의 소개
  8. 2007/06/21 [Shell Programming]1. 쉘 프로그래밍에 대하여 Linux 강좌(보안쉘) (1)
  9. 2007/04/11 PL/SQL 기초 강좌 (1)
  10. 2007/02/06 Internet Explorer Toolbar (Deskband) Tutorial

안드로이드 G1 국내 SIM카드로 언락(Activation) 시키기 (원문 보완)

|

중고로 초기화된 안드로이드 G1을 구했는데 우여곡절끝에 언락을 했습니다.
아래 원문은 제가 언락을 할때 참조했던 글입니다. 그런제 조금... 제가 겪었던 사실을 추가해서 보완을 했습니다.
원문을 쓰신분께 다시 한번 감사드립니다.

http://www.androidpub.com/3738

안드로이드 개발을 위해서 단말을 구입했는데 언락되어있지도 않고 G1폰이어서 폰을 접근조차 못하시는 분들이 있는것으로 알고 있습니다. 그동안 저는 미국에서 Activation시킨 후에 들여온 G1을 쓰고 있었는데, 이번에 Dev폰을 하나 추가로 입수해서 마음놓고 G1을 가져놀면서 제일 먼저 SIM카드 없이 언락시키는 법을 테스트 했습니다. 경제위기에 고환율인 이 때에 600달러는 들여서 구입하셨을텐데 어떻게든 해결해드려야겠다는 사명감으로 :) 하지만 잘못하면 폰을 사용불능으로 만들 수 있습니다. 저는 이것에 대한 어떠한 보장도 하지 않으니 일반 사용자분들은 절대로 시도하지 마시기 바랍니다!!

참고 : Dev 폰은 1번에서 바로 5번으로 건너뛰시면 됩니다.

1.
 SKT든 KTF든 SIM카드를 하나 준비해서 G1에 끼워넣고 부팅을 합니다.
(뒤에 밧데리 분리가 조심스럽더라구요 과감하게 분리를 해야 합니다.http://tmobile.modeaondemand.com/htc/g1/ 를 참조하세요)
SIM network unlock PIN:
이라는 화면이 나오면 dismiss 버튼을 누릅니다.

2.
안드로이드 그림과 Welcom to T-Mobile G1 그림이 나옵니다.
여기서 가져계신 폰의 버젼을 확인합니다.
G1의 자판을 열어서

<enter>reboot<enter>

(이제 화면은 마스코드인 드로이드가 나와 있고 아래는 긴급통화(영어로) 버튼만 있습니다. 버튼이 두개인 경우는 RC30이상인 것 같습니다. 그리고 위에 자판을 열고 타이핑을 해도 화면에 어떤 표시도 되지 않습니다. 참고하시기를)
를 눌러서 단말이 재부팅되면 RC29이하 버전이고 재부팅되지 않는다면 RC30이상 버젼입니다.
RC29이하버전은 4번으로, RC30이상 버젼은 3번으로 계속진행하면 됩니다.

3.
RC30이상 버전의 경우 RC29버전으로 되돌려야 합니다.
(Dev1사용자는 아래 이미지를 굽지 마세요! G1으로 바뀌어 버립니다.)
SD카드를 하나 준비합니다. SD카드는 FAT32로 포맷되어있어야 합니다.
G1 RC29 이미지를 다운받은 후에 SD카드에 압축을 풀고 파일이름은 DREAIMG.NBH로 바꿉니다.
SD카드를 폰에 삽인한후 카메라버튼과 파워버튼을 눌러 켭니다.
폰이 부트로드 모드로 들어가면서 업데이트할 이미지를 찾습니다.
파워버튼을 눌러 업데이트를 시작합니다.
5분정도의 시간이 걸리니 절대로 중간에 파워를 끄지 마시기 바랍니다.
(저 같은 경우는 다운그레이드를 성공한 다음... 화면이 깨지는 현상이 발생했습니다. 화면조정화면 같은 화면... 그래서 강제로 껐습니다. 다시 켜니 정상적으로 돌아오더라구요 ^^)

다른 RC29 이미지 다운로드 링크
http://www.megaupload.com/?d=EMY1HIVU

4.
RC29버전인 것을 확인하셨다면, 이번엔 G1자판에서

<enter>setprop persist.service.adb.enable 1<enter>

(위 과정을 왜 하는지 모르겠습니다. 전 열심히 타이핑하다... 포기했습니다. 타이핑하는 것이 화면에 보이지 않기 때문에 실제로 정확히 하기란 힘듭니다.)

- 이 단계에서 USB 케이블로 PC와 연결을 하면 드라이버 설치가 나옵니다. 아래 설명한 디렉토리를 이용해 설치하시면 됩니다.
라고 입력합니다. 드라이버는 SDK가 설치된 폴더 밑에 usb_driver라는 폴더에 저장되어있습니다. (1.0 SDK Release2에서 부터 포함되서 나왔습니다.)
 
그리고 윈도우즈 커맨트창에서 SDK 설치디렉토리 밑 tools디렉토리에 들어가서

>adb shell

명령어를 쳐서 $ 라는 프롬프트까지 뜨는 것을 확인합니다.

5.
adb shell에서 다음과 같은 명령어를 입력합니다

$ am start -a android.intent.action.MAIN -n com.android.settings/.Settings
(정확히 타이핑하셔야 합니다)

WIFI 세팅화면이 단말에 표시됩니다.
(실제로는 나타나지 않습니다.  화면이 꺼져 있기 때문에 자판을 열면 화면이 켜지면서 무선랜 활성화화 설정이 뜹니다. 여기서 무선을 설정하시고 무선연결을 확인하셔야 합니다. 그 다음에 빽버튼을 이용하여 초기화면으로 나가서 드로이드를 클릭하시고 구글계정 사인을 하시면 됩니다. 앗... 아래 설명이 있구나 !!!)

6.
만세!!를 한번 외치시고.
Wireless Control에 들어가서 Wi-Fi를 체크하고 Wi-Fi settigns에가서 AP를 잡아주시면
위에 무선랜이 잡혔다는 표시가 생깁니다.
(절대로 설정만 하시도 나오시면 안됩니다. 연결되었다는 문구가 표시되야 합니다. 왜냐구요? 해보시면..ㅋㅋㅋ)

7.
세팅화면을 나와서 구글 계정등록화면을 지나면 사용하실 수 있습니다.

8.
이제 SIM카드는 빼버려도 됩니다.

Trackback 0 And Comment 0

Mail Pull/Push 방식

|
 

1. Mail 이란?

      : 컴퓨터의 단말기 이용자끼리 통신 회선을 이용하여 주고받는 글

 

 

2. Mail Pull / Push 방식의 이해
 

      - Mail Pull 방식

         : 사용자가 수동으로 e메일을 검색하거나 특정 시간에 가져오는 방식

 

      - Mail Push 방식

        : 마이크로소프트의 메일 서버인 Exchange서버의 메일 동기화 기술중의 하나로 모바일

          장치와 Exchange서버간에 메일을 실시간으로 전달하는 방식

  

3. Exchange Server Mail Push 원리

      - 모바일 장치와 Exchange서버간에 메일을 실시간으로 전달하는 방식

      - Exchange 2003 SP2 Windows Moible 5.0 MSFP (Messaging & Security 

         Feature Pack)이후부터는 https통신을 기반으로 Heartbeat을 전달하여 동기화

         하는 방식으로 변경

 

4. Push의 원리

     ① 처음 모바일 장치가 네트워크에 연결

         (장치와 메일 서버의 동기화 정보는 PC와의 동기화 과정에서 정되어진다)

     ② 모바일 장치는 일정한 시간 간격으로 서버에 Heartbeat로 정보 송신

         (네트워크 망으로부터 받은 IP주소 정보를 포함)

     ③ 회사의 메일 서버는 사용자 모바일 장치의 정보를 가지고 있게 된다

     네트워크에서는 Dormant(휴면) 모드로 진입 (Data Connection상태가 아니라는 의미)

     새로운 메일이 도착하게 되면, 서버는 알고 있던 모바일 장치의 정보를 기초로 작은 신호

         전송

 

 


출처 : [직접 서술] 블로그 집필 - 惡魔天使™의 발자취


 

Trackback 0 And Comment 0

자동화 빌드 툴이다 ANT 사용업

|
아래 내용은
고수로 가는 지름길! Jakarta Project
이클립스 기반 프로젝트 필수 유틸리티: CVS, Ant, JUnit
두 책의 ant 부분을 보고 정리하였습니다.

# build.xml 파일의 기본구조
<?xml version="1.0" encoding="euc-kr"?>
<project name="projectName" default="defaultTargetName" basedir=".">
 <property name="" location=""/>
 <target name="">...</target>
 <target name="" depends="">...</target>
 <target name="" depends="">...</target>  
 <target name="" depends="" if="">...</target>
 <target name="" depends="" unless="">...</target>  
</project>

# project 태그
 1) name : 프로젝트의 이름
 2) default : Ant를 실행할때 target을 지정하지 않은 경우 기본적으로 사용할 target (필수)
 3) basedir : 경로 계산할때의 기준 디렉토리. 지정하지 않은 경우 현재 디렉토리가 basedir로 사용된다. basedir 프로퍼티의 값으로도 사용된다.

# target 태그
 1) name : 타켓의 이름 (필수)
 2) depends : 이 타겟이 의존하고 있는 타겟의 목록. 각 타켓의 이름은 ,(콤마) 로 구분한다.
 3) if : 지정한 프로퍼티가 설정되어 있는 경우 이 타겟을 수행한다.
 4) unless : 지정한 프로퍼티가 설정되어 있지 않은 경우 이 타겟을 수행한다.
 5) description : 타겟이 수행하는 기능에 대한 설명
 
# ant 경로 규칙
 1) * : 0개 또는 그이상의 글자가 매칭
 2) ? : 한글자와 매칭
 3) ** : 다계층을 나타냄  예) dir/**/A => dir/dir1/A, dir/dir2/A, dir/dir1/dirA/A 다 포함.
 4) / 또는 \ 으로 끝날 경우  : /** 또는 \** 과 동일
 
# includes 속성 : 포함시킬 파일의 목록 (include 태그, includesfile 속성으로 사용 가능)

# excludes 속성 : 제외시킬 파일의 목록 (exclude 태그, excludesfile 속성으로 사용 가능)

# excludes 속성 명시 여부에 상관없이 제외 되는 것들 : 제외 시키고 싶지 않을 경우 defaulteexcludes = "no" 설정
 - **/*~, **/#*#, **/.#*, **/%*%, **/._*
 - **/CVS, **/CVS/**, **/.cvsignore
 - **/SCCS, **/SCCS/**
 - **/vssver.scc
 - **/.svn, **/.svn/**
 - **/.DS_Store

# fileset 태그 : 파일 집합
 1) dir : 파일 집합을 표시할 때의 루트 디렉토리 (dir 또는 file 중 한개 반드시 명시)
 2) file : 한 개의 파일을 명시할 때 사용하는 속성  (dir 또는 file 중 한개 반드시 명시)
 3) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 4) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <fileset dir="${basedir}/src" defaultexcludes="no">
  <include name="**/*.java"/>
  <include name="**/*.properties"/>
  <exclude name="**/*.bak"/>
 </fileset>

# dir 태그 : 디렉토리 집합
 1) dir : 디렉토리 집합을 표시할 때의 루트 디렉토리 (필수)
 2) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 3) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <dirset dir="" includes="" excludes=""/>
 
# patternset 태그 : 재사용 가능한 파일 집합
 사용 예)
 <patternset id="commonJar">
  <include name="servlet.jar"/>
  <include name="mail.jar"/>
  <include name="activation.jar"/>    
 </patternset>
 
 <fileset dir="j2eelib">
  <patternset refid="commonJar"/>
 </fileset>
 
# path 태그 : 재사용 가능한 경로 목록의 집합
 사용 예)
 <path id="project.class.path">
  <pathelement location="fileupload/WEB-INF/classes"/>
  <pathelement path="lib/servlet.jar;lib/commons-fileupload-1.0.jar"/>
 </path>
 
 <classpath refid="project.class.path"/>
 
 - location : 하나의 파일 또는 디렉토리 지정
 - path : 여러 경로를 지정 (; 또는 : 으로 구분)


# 아래의 build.xml 파일에서 ant makeZip 을 할경우 complie 은 두번이 아닌 한번만 실행되게 된다.
 <project name="build" default="makeZip" basedir=".">
  <target name="compile"/>
   <target name="srcCopy" depends="compile"/>
   <target name="classCopy" depends="compile"/>
   <target name="makeZip" depends="srcCopy, classCopy"/>
 </project>

# property 태그 : property 지정
 1) name : 프로퍼티의 이름
 2) value : 프로퍼티의 값을 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 3) location : 지정한 경로명의 절대 경로명을 값으로 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 4) resource : 프로퍼티 파일을 읽어 올 때 사용할 자원명을 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 5) file : 지정한 파일로부터 프로퍼티 목록을 읽어 온다 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 6) environment : 환경 변수를 읽어 올때 사용할 접두어를 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 7) classpath : 자원으로부터 프로퍼티 파일을 읽어 올 때 사용할 클래스 패스
 8) classpathref : 클래스패스로 사용할 경로를 path 태그 로 부터 가져온다.
 9) prefix : resource 또는 file 속성을 사용하여 읽어 온 프로퍼티를 참조할 때 사용할 접두어를 지정한다. 만약 접두어 맨뒤에 "." 가 포함되어 있지 않을 경우, 자동으로 "."이 접두어 뒤에 붙는다.
 사용 예)
 <property file="${basedir}/buildprop/global.properties"/>
 
 <property environment="env"/>
 <echo message="JAVA_HOME ${env.JAVA_HOME}"/>

# 기본 프로퍼티 : property 태그 사용하지 않아도 사용 가능한 프로퍼티
 - 모든 자바의 시스템 프로퍼티
 - basedir : 프로젝트의 기본 디렉토리의 절대 경로. project 태그의 basedir 속성에 명시된 값
 - ant.file : 빌드 파일의 절대 경로
 - ant.version : Ant 버전
 - ant.project.name : 현재 실행주인 프로젝트의 이름. project 태그의 name 속성에 명시된 값
 - ant.java.version : Ant 가 발견한 자바 버전.
 
# javac
 1) srcdir : 소스가 위치한 디렉토리 (src 태그로 지정가능. 둘 중 하나 필수)
 2) descdir : 생성된 클래스가 위치할 디렉토리를 지정. javac -d 옵션과 동일
 3) classpath : 컴파일할 때 사용할 클래스패스 (class 태그로 지정 가능)
 4) classapathref : path 태그로 지정한 경로를 클래스패스로 참조
 5) encoding : 소스파일의 인코딩을 지정. javac -encoding 옵션과 동일
 6) nowarn : 컴파일시 -nowarn 옵션 추가 (on) 기본값은 off
 7) deprection : 컴파일시 -deprecation 옵션 추가 (on) 기본값은 off
 사용 예)
 <javac srcdir="" descdir="">
  <classpath>
   <fileset>
    <patternset refid=""/>
   </fileset>
  </classpath>
 </javac>
 
# jar
 1) destfile : 생성할 jar 파일 지정
 2) basedir : jar 파일로 압축할 기본 디렉토리 지정

 사용 예)
  <jar destfile="${disc}/lib/app.jar" basedir="${build}/classes"/>
 
  <jar destfile="${disc}/lib/app.jar">
   <fileset dir="${build}/classes" exclude="**/test*.class"/>
   <fileset dir="${src}/resources"/>
  </jar>

# zip
 - 기본적으로 jar 사용법와 같이 사용 가능.
 - zipfileset 태그를 사용하여 압축되는 파일의 경로명을 변경할 수 있음.
 - zipfileset 의 속성
  1) prefix : ZIP 파일에 압축될 때 변경되어 들어갈 경로명
  2) fullpath : 특정 파일의 변경될 경로를 지정
  3) filemode : 유닉스 기반의 시스템에서 압축되는 파일의 모드를 지정. 기본값은 644
  4) dirmode : 유닉스 기반의 시스템에서 압축되는 디렉토리의 모드를 지정. 기본값은 775
 사용 예)
 <zip destfile="${dist}/example.zip">
  <zipfileset dir="build/api" prefix="docs/api"/>
  <zipfileset dir="${basedir}"includes="chang.log.20031227" fullpath="docs/chagelog.txt"/>
  <zipfileset dir="build/classes" prefix="classes"/>
  <zipfileset dir="build/src" prefix="src"/>
 </zip>

# war
  사용 예)
  <war destfile="main.war" webxml="src/metadata/web.xml">
   <fileset dir="src/mainapp/html"/>
   <fileset dir="src/mainapp/jsp"/>
   <lib dir="lib">
    <exclude name="logging2.jar"/>
   </lib>
   <classes dir="build/main/classes"/>
   <zipfileset dir="src/imagefile/images" prefix="images"/>
  </war>

# tar
 - 기본 사용 법 : <tar destfile="" basedir=""/>
 - tarfileset 태그
 - targileset 의 속성
  1) mode : 3자리 8진수값. 775 등의 값을 갖는다.
  2) username : 파일에 대한 사용자 이름을 지정한다. UID와는 다르다.
  3) group : 파일에 대한 그룹 이름을 지정한다. GID와는 다르다.
  4) prifix : tar 파일에 압축될 때 변경되어 들어갈 경로명
  5) fullpath : 특정 파일의 변경될 경로를 지정
  6) preserveLeadingSlashes : 맨 앞의 '/'를 유지할지의 여부를 지정. 기본값 : false
 사용 예)
 <tar destfile="${dist}/example.tar">
  <tarfileset dir="build/api" prefix="docs/api"/>
  <tarfileset dir="${basedir}" includes="chage.log.20031227" fullpath="docs/chagelog.txt"/>
  <tarfileset dir="build/classes" prefix="classes"/>
  <tarfileset dir="build/src" prefix="src"/>
 </tar>
 <gzip zipfile="${dist}/example.tar.gz" src="${dist}/example.tar"/>
 
 <tar destfile="${dist}/example.tar.gz" basedir="${build}" compression="gzip"/>

# javadoc
 1) sourcepath : 소스 파일의 경로 지정. 하위 디렉토리까지 모두 처리 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 2) sourcepathref : path 에서 지정한 경로를 소스 파일의 경로로 사용 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 3) sourcefiles : 소스 파일의 목록을 지정. 각 파일은 콤마(,)로 구분 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 4) destdir : 결과 파일이 생성될 디렉토리
 5) packagenames : 콤마로 구분된 패키지 파일의 목록. 패키지명이 *로 끝날 경우 그 하위 패키지까지 모두 처리한다.
 6) excludepackagenames : 문서를 생성하지 않을 패키지의 목록을 지정. 각 패키지는 콤마(,)로 구분. 패키지명이 *으로 끝날 경우 그 하위 패키지까지 모두 제외
 7) access : 접근 모드를 지정. public, protected, package, private 중 한 가지 값. 기본값 : protected
 8) public : 생성되는 API 문서에 public 클래스와 멤버만 보여준다.
 9) protected : 생성되는 API 문서에 protected/public 클래스와 멤버만 보여준다.
 10) package : 생성되는 API 문서에 package/protected/public 클래스와 멤버만 보여준다.
 11) private : 생성되는 API 문서에 private/package/protected/public 클래스와 멤버만 보여준다.
 12) encoding : 소스 파일의 인코딩을 명시.
 13) locale : ko_KR과 같이 사용할 로케일을 지정.
 14) charset : 생성된 문서를 보여줄 때 사용할 케릭터셋을 지정.
 15) version : @version 주석을 포함.
 16) author : @author 주석을 포함.
 17) nodeprecated : deprecated 정보를 포함하지 않는다.
 18) nodeprecatedlist : deprecated 목록을 생성하지 않는다.
 19) windowtitle : 문서를 위한 제목을 텍스트로 입력.
 20) overview : HTML 문서로부터 개략 문서를 읽어 온다.
 21) helpfile : 도움말로 사용할 HTML 파일을 지정.
 22) stylesheetfile : 스타일 시트로 사용할 파일을 지정.
 23) header : 생성될 HTML 파일의 헤더로 사용될 HTML 코드를 명시
 24) footer : 생성될 HTML 파일의 풋터로 사용될 HTML 코드를 명시
 
 사용 예)
 <javadoc destdir="{build}/api"
  sourcepath="src"
  packagenames="javacan.main.*"
  excludepackagenames="javacna.main.test.*"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr" />
 
 <javadoc destdir="{build}/api"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr">
  <packageset dir="src" defaultexcludes="yes">
   <include name="javacan/main/**"/>
   <exclude name="javacan/main/test/**"/>   
  </packageset>
 </javadoc>
 
# copy
 1) file : 복사할 파일을 지정 (fileset으로 복사할 파일 목록을 지정하지 않는 경우 필수)
 2) tofile : 복사될 파일을 지정
 3) todir : 원본을 복사할 디렉토리를 지정
 4) overwrite : 기존 파일 덮어쓰기 여부 (true/false) 기본값 : false
 5) preservelastmodified : 원본의 최종 수정 날짜 유지 여부(true/false) 기본값 : false
 6) includeEmptyDirs : 텅빈 디렉토리도 복사할지의 여부(true/false) 기본값 : true
 사용 예)
 <copy file="${workspace}/readme.txt.200312" tofile="${build}/readme.txt"/>
 <copy file="${workspace}/readme.txt.200312" todir="${build}"/>
 <copy todir="${build}/src">
  <fileset dir="${workspace}/src"/>
 </copy>
 
# mkdir
 사용 예)
 <mkdir dir="${build}/webapp/WEB-INF/classes"/>
 webapp/WEB-INF 또한 존재 하지 않는 경우 생성

# delete
 사용 예)
 <delete>
  <fileset dir="${build}"/>
 </delete>
 
 위의 경우 ${build} 와 그 하위 디렉토리의 모든 파일을 삭제. 그러나 디렉토리는 남아있음.(fileset 은 파일의 집합)
 아래와 같이 해주면 디렉토리도 전부 삭제
 
 <delete includeEmptyDirs="true">
  <fileset dir="${build}"/>
 </delete>
 
# ant : 또 다른 빌드 파일의 실행. 여러개의 서브 프로젝트로 구성되어 있을 경우 유용
 1) antfile : 사용할 빌드 파일을 지정. 명시하지 않을 경우 build.xml. dir 속성에 주어진 디렉토리에 대해 상대경로
 2) idr : 새로운 Ant 프로젝트의 basedir을 지정.
 3) target : 수행할 타켓을 지정
 4) output : 새로운 Ant 프로젝트의 수행 결과를 저장할 파일을 명시
 5) inheritAll : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 프로퍼티 전달 여부(true/false). 기본값 : true
 6) inheritRefs : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 참조 전달 여부(true/false). 기본값 : true
 사용예)
 <target name="makeSubProject">
  <ant dir="subproject/logging" target="prepare">
   <property name="module1.4" value="jdk1.4"/>
  </ant>
  <ant dir="subproject/common" target="prepare"/>
 </target>

# java
 1) classname : 실행할 클래스 이름 (classname, jar 둘중 하나 필수)
 2) jar : 실행할 jar 파일의 위치 (classname, jar 둘중 하나 필수)
 3) classpath : 사용할 클래스패스를 지정
 4) classpathref : 미리 지정한 path 태그를 참조
 5) fork : 세러은 가상머신에서 클래스 수행 여부 (true/false). 기본값 : false
 6) maxmemory : 포크된 가상 머신에 할당할 메모리의 최대 크기를 지정 (fork가 false인 경우 무시)
 7) dir : 가상 머신을 호출할 디렉토리 (fork가 false인 경우 무시)
 사용 예)
 <java classname="javacan.main.prepare.TableInitilizer">
  <classpath>
   <pathelement path="${java.class.path}"/>
  </classpath>
  <sysproperty key="module" value="test"/>
  <arg value="-init -d"/>
 </java>
 
# native2ascii : 유니코드로의 변환
 1) src : 변환할 파일들이 위치한 기준 디렉토리
 2) dest : 변환한 결과를 저장할 디렉토리
 3) encoding : 변환할 파일의 인코딩 (기본으로 JVM의 기본 인코딩 사용)
 4) reverse : 이스케이프된 유니코드를 지정한 인코딩을 사용하는 문자열로 변환.
 사용 예)
 <native2ascii src="${config}"
  dest="${build}/config"
  includes="**/*.properties"
  excludes="**/test/*.properties"
  encoding="EUC-KR"/>

[출처] ANT 사용법|작성자 용쓰


Trackback 0 And Comment 0

정규 표현식(Regular Expression)

|

1. 정규 표현식이란.

   문자열의 특정한 패턴을 표시하거나 검사하기 위한 규칙을 의미하며 어떤 문자열의 집합을 표시하는 텍스트 string이나 일반적인

   텍스트 형시의 문서 등에서 문자열을 찾아내거나 검사하고 치환하는데 사용된다. 이러한 정규 표현식은 정규 표현식을 표시하는

   특수문자와 정규 표현식을 검사하기 위한 함수가 있다.

 

2. 패턴을 표현하는 특수 문자

특수 문자

내용

해당문자열

.

 임의의 한 글자를 의미한다.

 a.b (abc, acb, afb...)

*

 * 바로 앞의 문자가 없거나 한개 이상이 있을 경우

 a*b (b, ab, aab, aaab...)

+

 + 바로 앞의 문자가 최소 한 개 이상일 때 

 a+b (ab, aab, aaab...)

?

 ? 바로 앞의 문자가 없거나 한 개 존재하는 경우

 a?b (b, ab, cb, zb...)

^

 ^ 뒤에 문자열과 같은 문자열로 시작한는 경우

 [] 안에서 ^ 는 [] 안의 문자를 제외한 문자를 의미한다.

 ^ab (ab, abc, abdr...)

$

 $ 앞의 문자열과 같은 문자열로 끝나는 경우

 ab$ (ab, sab, aaab...)

[]

 [] 안의 문자열 중에 하나만의 문자만을 의미한다.

 [a-z], [0-9], [a-zA-Z]

{}

 {} 앞의 문자열의 개수를 의미한다.

 a{1-3}b (ab, aab, aaab)

()

 () 안의 문자는 그룹으로 인식한다.

 a(bc){2} (abcbc)

|

 or 연산자이다.

 a(b|c)d (abd, acd)

[[:alpha:]]

 모든 알파벳의 문자 한 자를 의미한다.

 [a-zA-Z]와 동일

[[:digit:]]

 모든 숫자 한 자를 의미한다.

 [0-9]와 동일

[[:alnum:]]

 알파벳과 숫자중 한 자를 의미한다.

 [a-zA-Z0-9]와 동일

[[:space:]]

 공백 문자를 의미한다.

 

[[:punct:]]

 구두점을 의미

 

\

 . * + ? ^ $ [] {} () | \ 문자를 표시할때

 (\*, \\, \[1\], \|...)

 

3. 정규 표현식의 특수문자 사용법

  1) ^a?bc : a로 시작해서 bc로 끝나는 문자(abc로 시작하는 문자)와 bc로 시작하는 모든 문자 (예 abcd, bcd)

  2) ^.a : a앞에 아무 한 문자가 있어야 하고 그 문자로 시작하고 a가 들어간 문자 (예 aa, bacd, match, para)

  3) a?b$ : b로 끝나는 문자열 중에 a가 없거나 한 개 이상 존재하는 문자열 (예 b, ab, aab)

  4) a?b+$ : 첫 글자는 a가 있거나 없고 b가 한 개 이상이고 b로 끝나는 문자 (예 ab, b, bb, abbb, abbbb)

  5) ^ab$ : 첫 글자가 a이고 끝나는 문자가 b인 경우 (예 ab)

  6) [ab]cd : a나 b중에 한 글자와 cd가 포함된 acd, bcd를 포함한 문자 (예 acd, bcd, acdse)

  7) ^[a-zA-Z] : 영문자로 시작하는 모든 문자 (예 a, b, c, d, ee)

  8) [^ab]cd : cd 문자열 앞에 a나 b를 제외한 문자가 있는 문자열 즉, acd와 bcd를 제외한 문자열을 의미한다. (예 scd, dcd, ffcd)

  9) a{2,}b : a의 개수가 최소 2개 이상이고 다음 문자가 b인 문자 (예 aab, aaabcd, aaaab)

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

정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현


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


PHP는 POSIX와 Perl이라는 두 가지 스타일의 정규 표현식을 지원한다. POSIX스타일의 정규 표현식이 PHP에서 기본이지만,

Perl 스타일도 PCRE(Perl-Compitable Regular Expression)라이브러리를 사용하여 표현할수 있다.

아래의 설명은 POSIX 스타일을 기준으로  한다.


. : 문자는 줄바꿈 문자(\n)을 제외한 모든 문자를 대신할수 있다 (하나의 문자)

ex) .at : 이런 정규식은 cat, sat, mat등이 해당된다.

[a-z]at : []의 문자들은 문자 클래스라고 하고, 일치시키는 문자는 이 클래스에 속해야 한다. []안의 것들은

 모두 각각 하나의 문자이다.

ex) [aeiou] : 영어의 모음에 해당되는 단어로 []안의 하나의 문자가 된다.

  또한 범위를 사용해서도 표현할수 있는데 -를 사용한다.

ex) [a-zA-Z] : 대소문자 알파벳 한 문자를 의미한다.

  집합의 구성원이 아니라는 표현으로 ^를 사용한다. 이는 []안에 ^가 있을경우 not이라는 의미를 가진다.

ex) [^a-z] : 소문자 알파벳 이외의 한 문자를 의미한다.


[[:alnum:]] 알파벳 문자, 숫자

[[:alpha:]] 알파벳

[[:lower:]] 소문자

[[:upper:]] 대문자

[[:digit:]] 십진법의 숫자

[[:xdigit:]] 16진법의 숫자

[[:punct:]] 구두점

[[:blank:]] 탭, 스페이스

[[:space:]] 공백 문자들

[[:cntrl:]] 컨트롤 문자들

[[:print:]] 모든 출력 가능한 문자들

[[:graph:]] 스페이스를 제외한 모든 출력 가능한 문자들


* : 패턴이 0번 이상 반복될 수 있음을 나타내고l

+ : 한번이상 반복될 수 있음을 나타낸다.

ex) [[:alnum:]]+ : 알파벳이나 숫자 한문자가 한번이상 반복. 즉, 적어도 하나이상의 알파벳이나 숫자를 의미한다.

한 문자열 뒤에 어떤 문자열이 반복해서 나타남을 정규 표현식으로 나타낸 것은 아래와 같다.
ex) (very )*large : 이는 large, very large, very very large등과 일치한다.

{}를 통해서 반복되는 횟수를 제한할 수 있다.
{3}는 세번 반복, {2, 4}은 두번에서 네번 사이로 반복, {2, }는 적어도 2번 이상 반복의 의미이다.
ex) (very ){1, 3} : very , very very , very very very 와 일치한다.

^ : 정규 표현식의 시작부분에 사용되며, 검색하는 문자열의 맨 앞부분에 이 표현이 있어야 함을 의미한다.
$ : 정규 표현식의 뒷부분에 사용되고 이 표현으로 문자열이 끝나야 됨을 의미한다.미
    ^[a-z]$ : a부터 z사이의 한문자를 의미한다.

| : 선택을 표현하는 경우 사용된다.
ex) com|edu|net : com이거나 edu이거나 net인경우를 의미한다.

\ : '.', '{', '$', '-', 등의 특수문자를 정규 표현식을 위한 특수문자가 아닌 문자로 사용하고 싶을때 '\'를 붙여서 사용한다.
    '\'를 표현할때는 '\\'라고 써준다.
ex) \\\$ : 이 경우 \$를 찾고자 할경우를 의미하게 된다.

POSIX 정규 표현식에서의 특수문자의 의미
1) []밖에서 사용되었을때
 - / : 특수문자 이스케이프
 - ^ : 문자열의 처음에서 일치되어야 함
 - $ : 문자열의 끝에서 일치되어야 함
 - . : 줄바꿈(\n)을 제외한 모든 문자와 한개를 의미
 - | : 또는의 의미
 - ( : 패턴의 시작
 - ) : 패턴의 끝
 - * : 0번 이상 반복됨
 - + : 1번 이상 반복됨
 - { : 반복 횟수 지정의 시작
 - } : 반복 횟수 지정의 끝
 - ? : 하위 표현식을 옵션으로 취급
2) []안에서 사용되었을때
 - / : 특수문자 이스케이프
 - ^ : 맨 처음 시작되었을 때만 not의 의미, 이외에는 문자로 인식
 - - : 문자의 범위 지정

ex) ^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$
   대소영문자, 숫자, _, -, .중 한개의 문자인데 문자열의 처음에 나타나야 되고 +가 있어서 한번이상 반복된다.
   그 이후 @ 문자 한문자가 있어야 되고 대소영문자, 숫자, -중 한개의 문자인데 +가 있어서 한번이상 반복된다.
   그 이후 . 문자 한문자가 있어야 되고 대소영문자, 숫자, -, .중 한개의 문자인데 +가 있어서 한번이상 반복되며 끝난다.

Trackback 0 And Comment 0

PHP로 디렉토리 트리 만들기.

|

^^ 요즘 현재 홈페이지를 어떻게 하면 회사에서 개인 PC로 옮길수 있나 고민중입니다.
블로그는 Tistory로 옮겼고... ASP 소스는 PHP로 변환해서 개인집 PC로 이동할까합니다.
(현재 DB는 있으나 거의 활용하지 않음, 지난 개편때 파일시스템을 직접활용하는 방식으로 홈페이지 개편을 했음)
DNS를 활용하고... 이메일은 paran의 openmail을 이용해야 겠습니다.
휴... 개인이 DNS, 웹서버, 메일서버를 운영하기란 쉽지가 않네요.

아래는 이전작업중 유용한 자료라 생각해서 스크랩 해봤습니다.

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


사용자 삽입 이미지사용자 삽입 이미지

이번에는 php와 자바스크립트로 트리구조 디렉토리를 구현해 보도록 하겠습니다.

사실 이 소스는 웹하드를 구현할때 유용하게 사용될 수 있습니다.

검색사이트에서 검색을 해보면 알겠지만, 트리형 디렉토리 구현은 쉬운문제는 아니었습니다.

뭐 자바나, C++, 베이직 같은 응용프로그램을 이용하면 금방이지만, 웹에서 서버컴의 디렉토리를 트리형으로 띄우는 문제는 다른문제입니다.

이문제로 삽질할 끝에 저 나름대로 만족할 만한 소스를 구현하였습니다.

구글의 여타 다른소스보다 간결하고, 구현또한 깔끔하고 다이나믹 합니다.(자화자찬 ㅋㅋ!)


우선 첨부파일로 참조한 파일이 필요합니다.


사용자 삽입 이미지


index.php 소스는 다음과 같습니다.

참고로 재귀함수로 구현하였습니다.

php소스를 보기 앞서 최종적으로 HTML로 뿌려지는 결과물은 다음과 같습니다.

<div id="LY_board1" style="height:0px;display:block">

<script>
   a = new dTree('a');
   a.add(0,-1,'My Web Hard');
   
   a.add(1,0,'111');
   a.add(2,0,'222');
   a.add(3,0,'333');
   a.add(4,0,'광주6월11일.csv','','','','img/page.gif');
   a.add(5,0,'광주6월12일.csv','','','','img/page.gif');
   a.add(6,0,'광주6월13일.csv','','','','img/page.gif');
   a.add(7,1,'광주6월19일.csv','','','','img/page.gif');
   a.add(8,1,'광주6월20일.csv','','','','img/page.gif');
   a.add(9,1,'광주6월23일.csv','','','','img/page.gif');
   a.add(10,2,'222-111');
   a.add(11,2,'광주6월17일.csv','','','','img/page.gif');
   a.add(12,2,'광주6월18일.csv','','','','img/page.gif');
   a.add(13,2,'광주6월19일.csv','','','','img/page.gif');
   a.add(14,10,'광주6월19일.csv','','','','img/page.gif');
   a.add(15,10,'광주6월20일.csv','','','','img/page.gif');
   a.add(16,10,'광주6월23일.csv','','','','img/page.gif');  
   document.write(a);
   
   </script>

</div>

==> 여기까지 결과물 HTML 코드


위에서 Mtree.js의 클래스를 이용해 객체를 하나 선언하고

add('증가되는 id값','부모 참조키값(id)','파일명 또는 노드명',...,'파일 또는 노드 이미지')

여기서 a.add(3,0,'333'); 와 같은것은 디렉토리를 표현할때 노드 이미지를 생략하고,

 a.add(16,10,'광주6월23일.csv','','','','img/page.gif');   처럼 파일을 표현할때는 노드 이미지를 기입합니다.
물론  a.add(0,-1,'My Web Hard'); 처럼 최상위 루드는 꼭 존재해야합니다. 최상위 루트는 부모참조가 없기때문에 -1을 넣습니다. 최상위 루트의 id값을 0으로 하였기 때문에 바로 밑 하위디렉토리는 부모참조키값이 모두 0이 겠죠? 코드를 보고 이글 맨 위의 그림을 참조해 분석해 보길 바랍니다.


여기까지는 단순히 결과물 코드에 대해서 알아보았고, 이젠 심장역할을 하는 원 소스에 대해 보겠습니다. 참고로 뿌려주는 것은 자바스크립트고, 자바의 소스를 만드는것은 php입니다. 또한 재귀함수를 이용하였습니다. 자료구조시간에도 배우셨겠지만, 트리구조는 노드를 타고 다녀야 하기때문에 재귀함수를 이용하지 않고서는 구현이 어렵습니다. 왜냐믄 하나의 노드는 부모나 자식의 노드의 깊이를 짐작할수 없기 때문입니다. 타봐야 아는거죠.

<link rel="StyleSheet" href="dtree.css" type="text/css" />  // dtree.js 의 css파일
<script language='javascript' src="dtree.js"></script> // 디렉토리를 웹에 구현해줄 js 파일


<div id="LY_board1" style="height:0px;display:block">
  <?
   if(!$_GET[dir]) $dir=getcwd()."/FileUp";

/* getcwd()함수는 현재 위치한 디렉토리명을 반환합니다. 여기서 현재 index.php가 위치한 디렉토리 값을 반환합니다. /FileUp은 제가 임의로 보여주고 싶은 디렉토리명을 디폴트로 잡은 것입니다. 사실 소스가 있는 디렉토리를 보여줄순 없지 않습니까? */


   chdir($dir);  //디렉토리 이동

   $Seq; //증가 되는 id 값 변수 (add('증가되는 id값','부모 참조키값(id)','파일명 또는 노드명') 을 참고하세요. add('$Seq','부모 참조키값(id)', 로 대체


   $arrTmp=array(); // "a.add($Seq,$pk,'$val');" =>(자바스크립트 소스) 를 뿌려줄 버퍼
   
   function GetDirList($dir,$pk) {
    global $Seq;  //재귀함수를 호출해도 증가되는 id 값은 모두가 참조하게 전역변수여만 합니다.
    global $arrTmp;  // 마찬가지로 자바스크립트 출력버퍼도 모두가 쌓을수 있도록 전역변수여만 합니다.


/*

다음 배열은 노드를 디렉토리와 파일로 구분하였습니다. Fn 은 노드명이 들어갈 배열입니다.

Seq는 현재노드의 키값이 저장됩니다. 이값이 있어야지 하위노드가 부모키값을 참조하겠죠?

*/
    $arrDFile["Dir"]["Fn"]=array();
    $arrDFile["File"]["Fn"]=array();
    $arrDFile["Dir"]["Seq"]=array();
    $arrDFile["File"]["Seq"]=array();

    if (!is_dir($dir)) die (""); //이건 아시죠 디렉토리가 없으면 죽으란 말입니다.

    chdir($dir); //부여받은 디렉토리로 이동하라는 말입니다.

    $dh=opendir($dir); //디렉토리 핸들을 얻어오고
    while (false!==($FolderOrFile = readdir($dh))) { //해당 디렉토리의 파일이나 하위 디렉토리를 읽어옵니다.
     if($FolderOrFile != "." && $FolderOrFile != ".." && file_ext("$dir/$FolderOrFile") != "php") {
      if(is_dir($FolderOrFile)) { //디렉토리일 경우는 디렉토리 배열에 디렉토리명을 저장하고
       $arrDFile["Dir"]["Fn"][]=$FolderOrFile;
      }
      else { //디렉토리가 아닌 파일일경우는 파일 배열에 파일명을 저장하라는 말입니다.
       $arrDFile["File"]["Fn"][]=$FolderOrFile;
      }
     }
    }
    closedir($dh); //이제 현재 디렉토리 열람은 끝났으니 핸들을 닫아야 겠죠

    asort($arrDFile["Dir"]["Fn"]); //디렉토리 배열을 이름순으로 소팅합니다.
    asort($arrDFile["File"]["Fn"]); //파일 배열을 이름순으로 소팅합니다.
    foreach($arrDFile["Dir"]["Fn"] as $key => $val) { //디렉토리 배열을 돌면서 배열의 번지값과 디렉토리 키값 배열의 번지값을 일치 시킵니다. 번지를 같게 해야 해당디렉토리의 키값을 참조할수 있겠죠. $arrDFile["Dir"]["Fn"][번지3]="111"(디렉토리명) 면 $arrDFile["Dir"]["Seq"][번지3]=18(증가되는 id 키값) 여기선 a.add($Seq,$pk,'$val');" 의 $Seq자리 값이 '18' , 즉 111 디렉토리의 키값은 18이라는 것입니다. 111디렉토리의 인텍스 주소는 3번지라는 것이죠. $arrDFile["Dir"]["Fn"] 나 $arrDFile["Dir"]["Seq"] 의 인덱스 주소가 모두 3번지... 설명이 길었죠? 요것이 가장 핵심입니다. 하나의 노드는 같은 인덱스 번지여만 합니다. 그래야 인덱스 번지만으로 다른 정보도 가져올수 있죠.(키값,노드명 등등)
     $Seq++; // 키값을 하나 증가시키고
     $arrDFile["Dir"]["Seq"][$key]=$Seq; //같은 인덱스 주소로 키값을 저장합니다.
     $arrTmp[]="a.add($Seq,$pk,'$val');"; //최종 버퍼에 자바스크립트 소스를 저장합니다.

    }
   
    foreach($arrDFile["File"]["Fn"] as $key => $val) { //노드가 파일이라는 부분만 다르고 상동입니다.
     $Seq++;
     $arrDFile["File"]["Seq"][$key]=$Seq;
     $arrTmp[]="a.add($Seq,$pk,'$val','','','','img/page.gif');";

     
    }
    foreach($arrDFile["Dir"]["Fn"] as $key => $val) {  //**핵심**(별5개), 하위 디렉토리를 재귀함수로 탐색합니다.

     GetDirList($dir."/".$val,$arrDFile["Dir"]["Seq"][$key]); //이부분(재귀함수 호출) 설명은 여러분의 생각으로 남겨두겠습니다. 어렵지 않으니 생각해 보세요.
     
    }
   
   
   }
   GetDirList($dir,0); // 펑션 실행 , 여기선 $dir은 위에서 설정한 getcwd()."/FileUp" 이 되겠죠, 시작노드의 디폴트 키값은 0이 되겠죠? a.add(0,-1,'My Web Hard'); 에서 키값을 0으로 했으니까. 이 펑션을 실행하면 $arrTmp 배열에 자바스크립트 소스를 쌓겠죠?
 
   ?>
  <script>
   a = new dTree('a');
   a.add(0,-1,'My Web Hard');
   
   <?
   foreach($arrTmp as $val) { //버퍼를 돌면서 저장된 자바스크립트 소스를 뿌려줍니다.
    echo $val;
   }
   ?>
   
   document.write(a); //최종 객체 출력
   
   </script>
   
   
  </div>


소스를 정리하면 이렇습니다. 디렉토리와 파일로 구분해서 먼저 디렉토리를 뿌려주고 파일을 뿌려주고 그런다음 디렉토리들은 하나씩 재귀함수로 탐색해 나가는 것입니다. 재귀함수로 호출된 디렉토리는 똑같이 하위 디렉토리와 파일을 분리해서 뿌려주고 자신의 하위디렉토리를 재귀함수로 탐색하고, 그렇게 맨 바닥노드까지 탐색하면 종료되고, 최상위 루트의 다음 디렉토리가 하위 노드 탐색을 시작하고... 이런식입니다.


주석을 제거한 소스는 다음과 같습니다.

 

<link rel="StyleSheet" href="dtree.css" type="text/css" /> 

<script language='javascript' src="dtree.js"></script>  


<div id="LY_board1" style="height:0px;display:block">
  <?

function file_ext($ff) {
 $filename=explode(".",$ff);
 $file_ext=$filename[sizeof($filename)-1];
 return $file_ext;
}


   if(!$_GET[dir]) $dir=getcwd()."/FileUp";
   chdir($dir);

   $Seq;
   $arrTmp=array();
   
   function GetDirList($dir,$pk) {
    global $Seq;
    global $arrTmp;
    $arrDFile["Dir"]["Fn"]=array();
    $arrDFile["File"]["Fn"]=array();
    $arrDFile["Dir"]["Seq"]=array();
    $arrDFile["File"]["Seq"]=array();

    if (!is_dir($dir)) die ("");

    chdir($dir);

    $dh=opendir($dir);
    while (false!==($FolderOrFile = readdir($dh))) {
     if($FolderOrFile != "." && $FolderOrFile != ".." && file_ext("$dir/$FolderOrFile") != "php") {
      if(is_dir($FolderOrFile)) {
       $arrDFile["Dir"]["Fn"][]=$FolderOrFile;
      }
      else {
       $arrDFile["File"]["Fn"][]=$FolderOrFile;
      }
     }
    }
    closedir($dh);

    asort($arrDFile["Dir"]["Fn"]);
    asort($arrDFile["File"]["Fn"]);
    foreach($arrDFile["Dir"]["Fn"] as $key => $val) {
     $Seq++;
     $arrDFile["Dir"]["Seq"][$key]=$Seq;
     $arrTmp[]="a.add($Seq,$pk,'$val');";

    }
   
    foreach($arrDFile["File"]["Fn"] as $key => $val) {
     $Seq++;
     $arrDFile["File"]["Seq"][$key]=$Seq;
     $arrTmp[]="a.add($Seq,$pk,'$val','','','','img/page.gif');";

     
    }
    foreach($arrDFile["Dir"]["Fn"] as $key => $val) {

     GetDirList($dir."/".$val,$arrDFile["Dir"]["Seq"][$key]);
     
    }
   
   
   }
   GetDirList($dir,0);
 
   ?>
  <script>
   a = new dTree('a');
   a.add(0,-1,'My Web Hard');
   
   <?
   foreach($arrTmp as $val) {
    echo $val;
   }
   ?>
   
   document.write(a);
   
   </script>
   
   
  </div>

첨부파일:


 

Trackback 0 And Comment 0

[VC] 바탕화면 바로가기 만들기

|

#include <Winsock2.h>
와 ws2_32.lib를 추가 하셔야 됩니다.
#define DEFAULT_BUFFER 1024
그리구 위에 것두요^^


FILE *fp;
char crEnVar[MAX_PATH];
char filename[256];

    WSADATA wsaData;            //winsock정보를 담을 구조체
    SOCKET Socket;              //소켓 주소..
    SOCKADDR_IN ServerAddress;    //인터넷소켓주소 구조체
    unsigned short Port = 80;   //포트 번호.
    int ReturnVal;
    int senddata;                    //send()시 실지 보낸 Data 크기
    int recvdata;                    //recv()시 실지 받은 Data 크기
    char szMessage[DEFAULT_BUFFER];  //SendData를 저장하기 위한 Buffer
    char szBuffer[DEFAULT_BUFFER];   //Server측 SendData를 받기 위한 Buffer
    int i, j;
    int start, ContentLength = 0;

    //winsock library initialize
    if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
        WSACleanup();
        return -1;
    }
   
    //socket create
    Socket = socket(AF_INET, SOCK_STREAM,0);
    if( Socket == INVALID_SOCKET ) { //에러 발생시 문구 출력.
        WSACleanup();
        return -1;
    }

    ServerAddress.sin_family = AF_INET;          
    ServerAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 여기에 해당 웹서버의 ip를 적는다.
    ServerAddress.sin_port = htons(Port);  //포트번호
    ReturnVal = connect( Socket, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress) );

    //ReturnVal이 0이 아니면, 문제가 있는 경우입니다.
    if (ReturnVal) {
        closesocket( Socket );
        WSACleanup();
        return -1;
    }

    // 아이콘 파일을 요청합니다.
    strcpy(szMessage, "GET /imgs/바로가기.ico HTTP/1.1\r\n"); //물론 해당 웹서버에 바로가기 아이콘으로 사용할 ico파일이 있어야 한다.
    senddata = send(Socket, szMessage, strlen(szMessage), 0);
    strcpy(szMessage, "Host: www.motorshop.com\r\n\r\n");
    senddata = send(Socket, szMessage, strlen(szMessage), 0);

    if(senddata == SOCKET_ERROR) {
        return -1;
    }

    recvdata = recv(Socket, szBuffer, DEFAULT_BUFFER, 0);
    if(recvdata == SOCKET_ERROR) {
        return -1;
    } else {
       
        ::GetEnvironmentVariable("USERPROFILE", crEnVar, MAX_PATH); //사용자 디렉토리를 읽어온다.

        sprintf(filename, "%s\\motorshop.ico", crEnVar);
        fp = fopen(filename, "w");

        // html문서에서 아이콘 파일을 읽어와 내 하드에 저장한다.
        // http프로토콜을 알아야 아래 소스가 이해됩니다. 너무 허접이라서 좋은 방법있으면 알려주세요.

        for (i = 0; i < recvdata; i++) {
           // 받아야할 아이콘 파일의 크기를 알아낸다. Content-Length: 766 이런 형태로 날라옴
            if (szBuffer[i] == 'C') {
                if (szBuffer[i+7] == '-' && szBuffer[i+8] == 'L') {
                    for (j = i + 16; j < recvdata; j++) {
                        if (szBuffer[j] == '\n' || szBuffer[j] == '\r') break;
                        ContentLength = ContentLength * 10 + (szBuffer[j] - '0');
                    }
                }
            }

            // 아이콘 파일의 처음 위치를 알아낸다.
            if (szBuffer[i] == '\r' && szBuffer[i+2] == '\r' && szBuffer[i+3] == '\n') {
                start = i + 4;
                break;
            }
            // '\r\n\r\n' 다음에 데이터가 오는 것으로 알고 있었는데 '\r\r\n\r\r\n' 다음에 오는 경우도 있나?
            if (szBuffer[i] == '\r' && szBuffer[i+3] == '\r' && szBuffer[i+4] == '\n') {
                start = i + 5;
                break;
            }

        }

        for (i = start; i < start + ContentLength; i++)
            fputc(szBuffer[i], fp);
        fclose(fp);

        // 바탕화면에 아이콘 만들기
        sprintf(filename, "%s\\바탕 화면\\바로가기.url", crEnVar);
        //아마도 영문 윈도우에서는 문제가 발생할 겁니다.
        fp = fopen(filename, "w");

        fputs("[InternetShortcut]\n\r", fp);
        fputs("URL=http://www.mydomain.com\n\r", fp); //여기에 해당 도메인을 기록합니다.
        fputs("IconIndex=0\n\r", fp);
        fputs("IconFile=", fp);
        fputs(crEnVar, fp);
        fputs("\\바로가기.ico\n\r", fp); //위에서 다운받은 아이콘 파일의 이름을 적습니다.
        fputs("Modified=0\n\r", fp);

        fclose(fp);

    }
   
    closesocket( Socket ); //소켓을 닫습니다.
    WSACleanup();


* 출처 : 데비피아 ^^

Trackback 0 And Comment 0

오라클 관계형 데이터베이스의 소개

|

- 오라클 관계형 데이터베이스 소개

more..


- 논리적 데이터베이스 저장구조

more..


- 데이터를 저장하는 데이터베이스 오브젝트의 물리적인 부분

more..


- 데이터 타입

more..


- 테이블

more..



- 시노님(Synonym)

more..


- 인덱스와 시퀀스

more..


- 뷰(Views)

more..


- 스냅샷(Snapshots)

more..


- 커서(Cusors)

more..



- 데이터 무결성(Data Integrity)

more..


- 트랜잭션(Transactions)

more..


- 패키지(Packages)

more..


- 트리거(Triggers)

more..


- 내장 프로시저

more..


임포트와 익스포트 (Import and Export)

more..


- SQL*Loader

more..


- SQL*DBA

more..


- 데이터베이스 사용자 관리하기

more..


- 롤(Roles)

more..


- 데이터베이스 오디팅하기

more..


- 백업과 복구 (Backup and Recovery)

more..


- SQL문 튜닝하기

more..


- 어플리케이션 튜닝하기

more..


- MTS와 LOCK그리고 링크

more..


- 분산 데이터베이스와 프로세스

more..


- 옵티마이저

more..


Trackback 0 And Comment 0

[Shell Programming]1. 쉘 프로그래밍에 대하여 Linux 강좌(보안쉘)

|
출처 : 대전국제IT교육센터 정성재 강사

1. Shell 프로그래밍의 개요

more..


2. Shell 프로그래밍 기초

more..


3. Shell 프로그래밍 문법

more..


Trackback 0 And Comment 1

PL/SQL 기초 강좌

|

PL/SQL 구문 보기


PL/SQL 자세한 설명과 예제 보기


Trackback 0 And Comment 1

Internet Explorer Toolbar (Deskband) Tutorial

|

  • Download Toolbar Binary - 20Kb
  • Download Source - 21 Kb The Motley Fool Quote IE Toolbar

    Introduction

    Having recieved a number of requests for a tutorial of sorts on developing Internet Explorer Toolbars with the RBDeskband and CWindowImpl wizards that I created, I have come up with a simple sample toolbar which can be used as a reference when developing your own toolbars or explorer bars. The tutorial will walk you through the stages of developing a toolbar for IE that is very similar to the Address bar that is already present in IE. I wanted to do a tutorial that would provide a realistic sample and would produce an end result that could be used by others after the tutorial was finish. So, the tutorial is going to show you how to develop an IE toolbar to get stock quote information from The Motley Fool website. So with that, let us get started.

    http://www.codeproject.com/atl/ietoolbartutorial.asp

  • Trackback 0 And Comment 0
    prev | 1 | 2 | 3 | next