posted by By훈트 2011.05.11 15:14

[ 출처 ] 고수닷넷


고수닷넷에서 퍼 온 내용임을 밝힙니다.
 

개인 공부용으로 퍼왔습니다.

문제가 되면 쪽지 주십시요. 삭제하겠습니다.

 

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

들어가며..

VC++이나 JAVA와는 달리, 닷넷Framework에는 기본적으로 제공하는 FTP클래스가 없다.

 

이 FTP클래스를 직접 만들기 위해서는 어떻게 해야할까?

 

RFC959문서에 FTP 프로토콜 규약에 대한 설명이 잘 나와있다. 우리는 이 문서를 잘 분석해서 FTP클래스를 만들면 된다.

 

하지만, 도통 영어로만 이뤄져 있는 이 문서를 분석하기란 여간 귀찮은 일이 아닐 것이다.

 

필자는 FTP에 대해 기본적인 개념을 알고 있지만, RFC959문서를 보기는 부담스러운 개발자들에게 도움이 될 수 있도록, RFC959문서의 중요한 부분만 간추려 설명하고자 한다.

 

사실, 중요한 부분이라 함은 '명령어'라고 할 수 있다.

여기서 명령어란, FTP규약에 의거하여 서버와 클라이언트간에 주고받을 약속된 메세지를 의미한다.

 

예를 들어,

클라이언트가 서버에 접속하기 위해선 가장 먼저 사용자의 ID를 통보하기 위한,

"USER"라는 명령어를 보내고,

서버는 연결이 성공적으로 이뤄졌다는 뜻으로,

"230"이라는 메세지를 반환한다.

클라이언트는 이 230이라는 응답메세지를 받아, USER메세지가 성공적으로 이뤄진것으로 판단하여 그 다음 작업(이를테면, 비밀번호 입력)을 진행하게 된다.

 

이와 같은 형태로 이뤄지는 서버와 클라이언트간의 통신을 구현함으로써, FTP클래스를 만들어 가는 과정을 하나하나 설명해 나갈 것이다.

 

다시 말하지만, 이번에는 RFC959문서의 '명령어'부분에 대해서만 언급할 것이며, 그 외적인 부분은 실제 C#을 이용해 코딩을 해보면서, 하나하나 익혀도 문제가 없을 것으로 생각한다.

 

[목차]

1장. 클라이언트가 서버에 보내는 명령어

   (1) 서버와의 연결을 제어하는 명령어

   (2) 파일전송을 제어하는 명령어

   (3) 기타 FTP서비스를 위한 명령어

2장. 서버의 명령 수행 결과 메세지(응답메세지)

 

[클라이언트가 서버에 보내는 명령어]

 

앞으로 차근차근 구현해 나가겠지만, 닷넷으로 FTP클래스를 만들기 위해선 가장 먼저 서버와 클라이언트를 소켓을 통해 연결해야 할것이다.

연결이 되면, 먼저 클라이언트가 서버에 명령어를 보내게 되는데, 이러한 명령어에 대해 먼저 알아보도록 하겠다.

명령어 설명 중 '응답메세지'에 대한 언급이 있는데, 해당 메시지의 자세한 의미에 대해서는 다음 시간(2장)에 자세히 알아볼 것이다.

 

기본적으로, FTP를 구현하기 위해서는 명령어와 응답메세지를 송수신할 제어연결(Control Connection) (일반적으로 21번 Port를 사용)과 파일 송수신을 위한 데이터연결(Data Connection) (Port를 얻는 방식이 Active Mode와 Passive Mode 이렇게 2가지가 있음)이 필요하다.

 

이와 같은 FTP에 대한 기반지식은 이미 갖추었다고 가정하고 글을 쓰도록 할 것이다.

보다 자세한 FTP 개념에 관한 문의는 필자의 홈페이지 (http://www.ourteamz.org)를 통해 해주길 바란다.

 

(1) 서버와의 연결을 제어하는 명령어

 

[1] 사용자이름 (USER)

- 사용형식 : USER <SP> <username> <CRLF>

- 설명 : 사용자의 아이디 정보를 서버에 보낸다.

해당 FTP서버에 등록되어 있지 않는 사용자이면, 서버는 에러 응답메세지를 보내올것이다.

보통 이 명령어는 서버와 클라이언트가 연결되면, 가장 먼저 보내야 하는 명령어가 될것이다.

정상적인 수행 후, 비밀번호나 계정정보 등의 추가 정보를 요구할 수가 있으므로, 그에 따른 능동적인 대처가 필요하다.

 

[2] 비밀번호 (PASS)

- 사용형식 : PASS <SP> <password> <CRLF>

- 설명 : 보통 USER명령어 수행 직후, 비밀번호가 요구되면 이 명령어를 보내게 된다.

이 비밀번호를 단순히 string형태로 서버에 보내게 됨으로써, 다소 보안에 취약하게 된다.

서버는 이 보안에 대해 전혀 책임지지 않으므로, 클라이언트측에서 스파이웨어,키보드캡쳐 등의 해킹에 노출되어 있는 문제들을 신경써야할 것이다.

 

[3] 계정정보 (ACCT)

- 사용형식 : ACCT <SP> <account-information> <CRLF>

- 설명 : 이 명령어는 보다 자세한 사용자의 계정정보를 서버에 보내는 역할을 수행한다.

보통의 일반적인 FTP서버는 이 명령어를 요구하지 않지만, 몇몇의 경우에는 파일 전송 등에 대한 권한에 제한을 주기 위한 추가정보로써 요구되기도 한다.

일반적으로는 쓰이지 않는다고 보면 된다.

 

[4] 디렉토리 변경 (CWD)

- 사용형식 : CWD  <SP> <pathname> <CRLF>

- 설명 : DOS나 LINUX의 CD명령어와 마찬가지로 특정 디렉토리로 이동할 때 사용되는 명령어이다.

 

[5] 부모디렉토리로 변경 (CDUP)

- 사용형식 : CDUP <CRLF>

- 설명 : 상위(부모) 디렉토리로 이동할 때 사용되는 명령어이다.

이 역시 DOS나 Linux의 "CD .."와 같은 명령어를 생각하면 되겠다.

 

[6] 구조 마운트 (SMNT)

- 사용형식 : SMNT <SP> <pathname> <CRLF>

- 설명 : 다른 파일시스템 구조에 대한 마운트를 허용하도록 할 때 쓰이는 명령어이다.

 

[7] 다시 초기화 (REIN)

- 사용형식 : REIN <CRLF>

- 설명 : 사용자를 종료시키고, 입출력(I/O)와 계정정보(Account)를 Flush(일종의 초기화)한다. 또한 모든 파라미터를 리셋하지만, 서버와 클라이언트간의 Control Connection은 닫지 않는다.

이 명령어를 수행 한 후, 다시 USER명령어를 통해 로그인을 시도하면 된다.

즉, "서버에 재접속"하기 위한 명령어라고 보면 되겠다.

 

[8] 로그아웃 (QUIT)

- 사용형식 : QUIT <CRLF>

- 설명 : 사용자를 종료시키고, 파일전송이 진행중이지 않다면, Control Connection도 닫는다.

만약, 파일전송이 진행중일 경우, Control Connection을 유지한 상태에서 기다리고 해당 전송을 정상적으로 됨을 확인한 후에 연결을 끊게된다.

 

여태까지 Control Connection과 관련된 명령어를 알아보았다.

이제 파일 전송을 위한, Data Connection에 대한 명령어를 알아보자.

 

(2) 파일전송을 제어하는 명령어

 

[1] 데이터 포트 열기 (PORT)

- 사용형식 : PORT <SP> <host-port> <CRLF>

- 설명 : 실제 파일을 송수신하기 위해서는 Control Connection과는 별도로 Data Connection이 필요하며, 이 데이터연결에서 쓰일

포트를 얻기 위해 사용되는 명령어이다.

위에서 언급했던 2가지 포트를 얻는 방법 중 Active Mode에서 쓰이는 명령어이며, 간단히 말하자면, 클라이언트가 우선적으로 자신의 비어있는 Port로 연결하기를 원할 때 사용되는 방식이다.

자세한건, 앞으로 실제 이 명령어를 사용하여 FTP클래스를 구현을 해보면서 다시 설명하도록 하겠다.

 

[2] 수동으로 포트번호 얻기 (PASV)

- 사용형식 : PASV <CRLF>

- 설명 : 일반적으로는 Active Mode로 포트를 결정하지만, 방화벽등의 이유로 수동모드(Passive Mode)를 사용 해야하는 경우가 있다.

이런 경우에 서버에게 비어있는 포트를 요청하고, 서버가 알려주는 포트로 데이터연결을 하게 되는데,

즉, 서버의 빈 포트번호를 알아내기 위한 명령어라고 할 수 있겠다.

이 역시 나중에 실제 구현을 해보면서 다시 설명을 하도록 할것이다.

 

[3] 데이터 방식 (TYPE)

- 사용형식 : TYPE <SP> <type-code> <CRLF>

- 설명 : 데이터 연결(Data Connecion)를 통해 파일 목록이나 실제 파일 바이너리를 송수신하기 전에, 그 송수신하고자 하는 데이터의 타입을 결정하는 명령어이다.

ASCII, EBCDIC, BINARY(IMAGE) 등의 6가지 타입이 있으며, 일반적인 경우는 ASCII와 BINARY모드만 사용해도 충분하다.

참고로 기본값은 A와 N. 즉 ASCII + Non-print 이며, 만약, 이 TYPE명령어를 통해 포맷을 변경 할 경우, 그 설정이 직 후의 단 한번의 작업에만 유효하며, 해당 작업이 종료되면 바로 기본값으로 되돌아간다.

 

[4] 단일 파일 구조 변경 (STRU)

- 사용형식 : STRU <SP> <structure-code> <CRLF>

- 설명 : 파일 구조를 구분하기 위한 단일문자의 단위를 결정하는 명령어이며, 기본값은 File이다.

일반적으로는 사용할 필요 없다.

 

[5] 전송 방식 (MODE)

- 사용형식 : MODE <SP> <mode-code> <CRLF>

- 설명 : 데이터 전송 모드를 구분하기 위한 단일문자의 단위를 결정하는 명령어로, 일반적으로 사용할 필요 없다.

 

지금까지 파일 전송에 관한 명령어를 알아보았다.

마지막으로, 디렉토리 생성/삭제, 파일이름변경 등과 같은 기타 FTP서비스에 대한 명령어를 알아보겠다.

 

(3) 기타 FTP 서비스를 위한 명령어

 

[1] 파일수신 (RETR)

- 사용형식 : RETR <SP> <pathname> <CRLF>

- 설명 : 서버에 위치한 파일에 대해 클라이언트로 보내줄 것을 요쳥한다.

즉, 파일을 다운로드하기 위한 명령어이다.

 

[2] 파일송신 (STOR)

- 사용형식 : STOR <SP> <pathname> <CRLF>

- 설명 : 클라이언트에 위치한 파일을 서버에 보낼 것임을 알린다.

즉, 파일을 업로드 하기 위한 명령어이다.

 

[3] Unique한 파일송신 (STOU)

- 사용형식 : STOU <CRLF>

- 설명 : STOR명령어와 기본적으로 같으나, 서버 저장할 파일명을 직접 지정해주지 않고, 서버가 자동으로 유일한 파일이름을 생성하도록 할때 사용되는 명령어이다.

물론, 일반적으로는 사용할 필요없다.

 

[4] 파일송신(with create) (APPE)

- 사용형식 : APPE <SP> <pathname> <CRLF>

- 설명 : STOR명령어와 같이 서버에 파일을 업로드 하기 위해 사용되며, 이미 같은 파일이름이 존재하는 경우 파일의 끝에다가 추가하며, 그렇지 않은 경우 새로운 파일을 생성한다.

필자가 이 명령어를 직접 사용해보진 않았지만, "이어서 전송하기" 기능과는 상관없는 것으로 예상된다.

왜냐하면, 이어서 전송하기는 무조건 파일이름이 같으면 파일 끝에 갖다 추가하는 게 아니라,  전송이 중단된 특정 위치부터 전송을 해야하고, 또 그 특정위치에 부터 파일을 써야하기 때문이다.(이를 위해서는 REST명령어가 쓰인다)

즉, 이 명령어는 Log파일기록 등과 같이, 무조건 파일을 이어서(Append) 쓰고자 할 때 사용되는 명령어로 보인다.

 

[5] 할당 (ALLO)

- 사용형식 : ALLO <SP> <decimal-integer> [<SP> R <SP> <decimal-integer>] <CRLF>

- 설명 : 일부 서버에서 새로운 파일을 저장할때 어떤 공간을 제한두고자 할때 사용되는 명령어로 보인다.

 

[6] 재시작-이어받기 (REST)

- 사용형식 : REST <SP> <marker> <CRLF>

- 설명 : 위의 APPE명령어에서도 언급했듯이, 이어받기/이어올리기 기능을 구현하기 위해 사용되는 명령어이며, 이 명령어로 이어받기의 경우 파일다운로드 직전, 서버에게 파일의 특정 위치부터 보내줄 것을 요청하게 되며, 이어올리기의 경우 파일업로드 직전, 서버에게 파일의 특정 위치부터 보내겠다는 것을 알리는 역할을 하게 된다.

즉, RETR과 STOR명령어가 수행되기 바로 전에 요청되게 될 것이며, 자세한건 나중에 직접 구현을 해보면서 설명하도록 하겠다.

 

[7] 이름 변경-FROM (RNFR)

- 사용형식 : RNFR <SP> <pathname> <CRLF>

- 설명 : 파일이나 디렉토리의 이름을 변경할 때 쓰이며, 아래의 RNTO명령어와 함께 사용되어야 한다.

예를 들어, 파일이름을 A에서 B로 바꾸고자 할 경우, 'RNFR A' 를 먼저 수행 한 후에 아래의 'RNTO B' 를 수행함으로써

파일이름 변경작업이 완료된다.

 

[8] 이름 변경-TO (RNTO)

- 사용형식 : RNTO <SP> <pathname> <CRLF>

- 설명 : 위의 RNFR참고 바람

 

[9] 중단 (ABOR)

- 사용형식 : ABOR <CRLF>

- 설명 : 현재의 데이터전송을 중단할 것을 서버에 알리기 위해 사용되는 명령어로, 현재 Data Connection을 통해 이뤄지고 있는

데이터의 송수신을 중단하지만, Control Connection은 정상적으로 유지된다.

만약, 현재 데이터전송이 이뤄지고 있지 않다면, 바로 226 응답메세지를 리턴하지만, 실제 데이터전송이 이뤄지고 있던 경우, 426응답메세지를 보내 비정상적으로 전송이 종료되었음을 알린뒤, 다시 226응답메세지를 리턴한다.

 

[10] 파일삭제 (DELE)

- 사용형식 : DELE <SP> <pathname> <CRLF>

- 설명 : 해당 경로에 위치한 파일을 삭제하도록 요청한다. 서버는 정말 파일을 삭제할 것인지 묻지 않고, 바로 수행한다.

 

[11] 디렉토리 제거 (RMD)

- 사용형식 : RMD  <SP> <pathname> <CRLF>

- 설명 : 디렉토리를 삭제하도록 요쳥하는 명령어로, 만약 <pathname>이 절대경로인 경우, 해당 경로에 위치한 디렉토리가 삭제되며, <pathname>이 상대경로인 경우엔 현재디렉토리(Working Directory)에 위치한 하위디렉토리가 삭제된다.

디렉토리 내부에 파일이 존재하는 경우, 디렉토리가 삭제되지 않는게 정상이다.

 

[12] 디렉토리 생성 (MKD)

- 사용형식 : MKD  <SP> <pathname> <CRLF>

- 설명 : 새로운 디렉토리를 생성도록 요쳥하는 명령어이다.

이 역시 위의 RMD명령어와 같이 <pathname>이 절대경로냐 상대경로냐에 따라 처리되는 방식이 다르다.

 

[13] 현재디렉토리 조회 (PWD)

- 사용형식 : PWD  <CRLF>

- 설명 : 현재 서버의 활성화중인 디렉토리(즉, WORKING DIRECTORY)가 무엇인지를 알아내기 위해 사용되는 명령어이다.

 

[14] LIST (LIST)

- 사용형식 : LIST [<SP> <pathname>] <CRLF>

- 설명 : 특정 경로에 존재하는 파일과 하위디렉토리들의 리스트를 요청한다.

시스템에 종속적인 정보를 보내므로, 그에 따른 유동적인 대처가 필요하다.

(예를 들어, DOS에서 DIR명령어를 사용할 떄와 LINUX에서 LS명령어를 사용할때 다른 형식의 파일리스트가 보여지는 것과 같은 원리다.)

이 명령어를 수행하기 전, TYPE명령어를 이용해서 데이터 전송 타입을 ASCII나 EBCDIC모드로 변경한 뒤, 시행해야 한다.

<pathname>을 생략하면, 현재 열려 있는 디렉토리(Working Directory)내의 정보만 가져오게 되며, 여기서 유의할점은, 필자의 경험에 의하면 <pathname>을 생략하냐 안하냐에 따라 얻어오는 파일리스트의 형식이 다소 다를 수 있으므로, 되도록 둘 중 하나만 사용할 것을 권한다. (필자는 생략해서 사용한다)

 

[15] NAME LIST (NLST)

- 사용형식 : NLST [<SP> <pathname>] <CRLF>

- 설명 : LIST명령어와 흡사하나, 파일날짜, 용량 등의 정보는 제외하고 오직 파일이름만 반환해준다.

기타 조건은 LIST명령어와 같다.

 

[16] 사이트 (SITE)

- 사용형식 : SITE <SP> <string> <CRLF>

- 설명 : 시스템에 종속적인 어떤 시스템 명령어를 수행하고자 하는 경우 사용되며, "HELP SITE" 명령어를 통해 해당 서버에서 제공하는 명령어의 방식과 구문을 알 수 있다.

즉, 현재 필자가 소개하고 있는 표준 FTP 명령어 외에 각각의 시스템에서 사용할 수 있는 명령어를 수행하고자하는 경우에 사용된다고 볼 수 있다.

 

[17] 시스템 (SYST)

- 사용형식 : SYST <CRLF>

- 설명 : 현재 접속된 서버가 어떤 OS로 이루어져 있는지에 대한 정보를 요쳥하는 명령어이다.

이를 테면, 유닉스인지 NT인지를 알려준다.

 

[18] 상태 (STAT)

- 사용형식 : STAT [<SP> <pathname>] <CRLF>

- 설명 : 현재 Control Connection 설정 상태를 알아내거나, 파일전송 중과 같이 Data Connection에서 작업이 수행되고 있는 경우, Control Connection으로 파일리스트(LIST명령어)를 얻기 위해 사용되는 명령어이다.

 

[19] 도움말 (HELP)

- 사용형식 : HELP [<SP> <string>] <CRLF>

- 설명 : FTP명령어에 대해 도움말을 보여준다.

다음시간에 자세히 알아보겠지만, 211 또는 214 응답이 오는 경우는 USER명령어를 통해 로그인을 해야만 HELP정보가 제공된다는 것을 의미한다.

 

[20] NOOP (NOOP)

- 사용형식 : NOOP <CRLF>

- 설명 : FTP서버에 접속한채로 아무일도 수행하지 않은 채 (서버에 설정된) 일정한 시간이 경과하면, 서버는 클라이언트의 연결을 종료한다.

하지만, 특정 다른 작업을 수행하지 않고도, 현재 접속을 계속 유지하기를 요청할 필요가 있는데, 이 경우에 사용되는 명령어이다.

 

 

[참고] '사용형식' 항목에서 사용된 BNF 표기법에 대한 상세설명

<username> ::= <string>

<password> ::= <string>

<account-information> ::= <string>

<string> ::= <char> | <char><string>

<char> ::= any of the 128 ASCII characters except <CR> and <LF>

<marker> ::= <pr-string>

<pr-string> ::= <pr-char> | <pr-char><pr-string>

<pr-char> ::= printable characters, any ASCII code 33 through 126

<byte-size> ::= <number>

<host-port> ::= <host-number>,<port-number>

<host-number> ::= <number>,<number>,<number>,<number>

<port-number> ::= <number>,<number>

<number> ::= any decimal integer 1 through 255

<form-code> ::= N | T | C

<type-code> ::= A [<sp> <form-code>]

                       | E [<sp> <form-code>]

                       | I

                       | L <sp> <byte-size>

<structure-code> ::= F | R | P

<mode-code> ::= S | B | C

<pathname> ::= <string>

<decimal-integer> ::= any decimal integer

 

 

정리

지금까지 FTP규약에 대해 RFC959문서(본 아티클에 첨부)에 기술되어 있는 정보 중, 가장 핵심이라 할 수 있는 "클라이언트가 서버에 보내는 명령어"에 대해 알아보았다.

 

다음시간에는 그 명령어를 받은 서버가 어떤 응답을 받아오고, 또 클라이언트는 그 응답메세지를 어떻게 처리해야하는지에 대해서 알아볼 것이다.

 

 

※ 구현환경

운영체제 : Microsoft Windows XP SP2

개발환경 : Visual Studio.NET 2003

               .NET Framework 1.1 sp1

           

※ 필자소개

박 현 웅

webdy@korea.com

http://www.ourteamz.org

posted by By훈트 2011.04.21 10:00
조건을 만족하는 데이타 중에서
중간의 데이타를 얻기위한 방법 *** 중요한 것은 조건이 두번 들어 간다는 것이다.



SELECT TOP
[얻으려는 행의수] *
FROM
[TABLE]
WHERE [PRIMARY KEY] NOT IN
(
          
SELECT TOP
[중간의 시작위치 - 1] [PRIMARY KEY]
          FROM [TABLE]
          WHERE [조건]
          ORDER BY [PRIMARY KEY]
)
AND [조건]
ORDER BY [PRIMARY KEY] 
posted by By훈트 2011.03.31 14:40

1. Avelconifier2 프로그램

PNG -> ICO 및 ICO -> PNG 변환 가능

재미있게도 해당 프로그램을 설치하면 해당 프로그램의 아이콘이 바탕화면에 만들어 주지 않는다.

실행파일은 C:\Program Files\AveIconifier2\AveIcon.exe에 있다.

또한 변환된 파일은 C:\Program Files\AveIconifier2\temp에 존재한다.

 

사용법은 AveIcon.exe 파일을 실행해서 변환하고자 하는 원본을 해당 위치에 드래그하면 된다.

조심할 점이 있다면 해당 프로그램을 닫아 버리면 temp 폴더에 생긴 변환 되어진 파일 또한 살아진다는 사실이다. @.@

변환된 파일은 해당 폴더에서 파일을 복사해서 다른 곳으로 옮겨 놓아야 한다.

(정확한 사용법은 글 아래의 링크 주소로 가자.)

 

2. Imagicon 프로그램

사용법은 설치 후 매뉴에서

BMP, JPG, PNG -> ICO 파일로 변환 File -> Open 하거나 혹은 ICO 파일로 변환하고 싶은 파일을 드래고 가져다 놓으면 된다.

매뉴 Options -> Save Directory 부분에서 일단 변환 된 파일을 저장 할 위치를 수정하자.(자신이 원하는 곳으로)

저장은 매뉴 Options -> Image Transform을 클릭하면 ICO 파일로 저장이 된다.

다른 매뉴 사용법은 Help -> How To Use Imagicon 부분을 참조.

 

일반적으로 그림 파일을 변환하는 프로그램들은 상당히 많다.

그리고 단순하게 해당 프로그램 처럼 파일을 변환 시켜주는 프로그램 외에 여러가지 기능을 가지고 있는 무료 프로그램도 상당히 많다.

단지 국내에서 이렇게 지원해주는 프로그램을 배포하는 곳이 있는지 그건 알 수가 없다.

다른 프로그램들을 더 알고 싶다면 국내 사이트 자료실이나 외국 사이트를 이용하자.

(개인적으로 외국 사이트를 이용하는 것을 권한다.)

 

프로그램을 다운로드 및 설치하지 않고 웹에서 변환 할 수 있는 곳

http://converticon.com/

http://iconverticons.com/ <- Windows 및 OS X 가능

http://www.coolutils.com/Online/Image-Converter/

 

다운로드

AveIconifier2 - http://www.vistaico.com/how_to_convert_png_to_ico.htm

Imagicon ----  http://www.deviouscodeworks.co.uk/imagicon.html


[출처] Yury 님의 블로그

posted by By훈트 2011.03.14 15:53

FrameLayout은 자식 뷰들을 겹쳐서 그리고자 할때 사용하는 레이아웃이다. 
여러이미지들을 같은영역에 겹쳐서 표시하고자 할때 유용하다.

 

  

 특성이름 적용대상 설명  
android:foreground 부모 뷰 내용위에 겹쳐 그릴 표시물 자원 표시물 자원 참조
android:foregroundGravity 부모 뷰 전경 표시물의 중력(정렬 방식) 다음 상수등 중 하나 또는 여러개를 '|'로 결합한것 :  
top, bottom, left, right, center_vertical, fill_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill
android:measureAllChildren 부모 뷰 레이아웃의 크기를 모든 자식을 고려해서 결정할 것인지 아니면 VISIBLE로 설정된 자식들만(INVISIBLE로 설정된 것들은 빼고) 고려할 것인지의 여부 true/ false
android:layout_gravity 자식 뷰 부모 안에서 자식 뷰의 중력(정렬방식) 다음 상수등 중 하나 또는 여러개를 '|'로 결합한것 :  
top, bottom, left, right, center_vertical, fill_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill


<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
android:id="@+id/FrameLayout01" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
xmlns:android="http://schemas.android.com/apk/res/android
 android:layout_gravity="center"> 
<ImageView 
  android:id="@+id/ImageView01" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:src="@drawable/green_rect" 
  android:minHeight="200px" 
  android:minWidth="200px"></ImageView> 
<ImageView 
  android:id="@+id/ImageView02" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:src="@drawable/red_oval" 
  android:minHeight="100px" 
  android:minWidth="100px" 
  android:layout_gravity="center" ></ImageView> 
</FrameLayout>
 


posted by By훈트 2011.03.11 19:53
나이키 신발 사이즈 

패션잡화 인기브랜드 나이키의 신발을 구매하실때에 원산지에 따른 사이즈 차이로 인해 혼동하 시지 않도록 남성용, 여성용 신발 사이즈와 영문사이즈를 비교해 보았습니다. 
구매하시기 전 꼭 확인하시어, 착오가 없으시길 바랍니다. 


1. 남성 사이즈 

남성용 신발 사이즈 비교표
미국(U.S.A) 영국(U.K) 유럽(EURO) 한국(MM)
6 5.5 38.5 240
6.5 6 39 245
7 6 40 250
7.5 6.5 40.5 255
8 7 41 260
8.5 7.5 42 265
9 8 42.5 270
9.5 8.5 43 275
10 9 44.5 280
10.5 9.5 45 285
11 10 45.5 290
11.5 10.5 46 295
12 11 46.5 300
12.5 11.5 47 305
13 12 47.5 310


2. 여성 사이즈 

여성용 신발 사이즈 비교표
미국(U.S.A) 영국(U.K) 유럽(EURO) 한국(MM)
5 2.5 35.5 220
5.5 3 36 225
6 3.5 36.5 230
6.5 4 37 235
7 4.5 37.5 240
7.5 5 38 245
8 5.5 38.5 250
8.5 6 39 255
9 6.5 40 260
9.5 7 40.5 265
10 7.5 41 270
10.5 8 42 275
11 8.5 42.5 280
11.5 9 43 285
12 9.5 44.5 290


3. 영문 사이즈 
표시 XXXS XXS XS S M L XL XXL
MEN'S 240~250 250~260 260~270 270~280 280~290 290~300 300~310 310~320
WOMEN'S 230~240 240~250 250~260 260~270 270~280 280~290 290~300 300~310

'Daily > 훈트의일상' 카테고리의 다른 글

린소프트웨어 개발 방법론  (3) 2012.02.27
나이키 신발 사이즈  (0) 2011.03.11
Dr.Dre 헤드폰  (0) 2010.12.28
와우 방문자 1만찍었...ㄷㄷㄷ  (1) 2010.11.19
토탈 5000 뿌 ㅎㅎㅎ  (0) 2010.10.02
Total 1004 기념~~  (0) 2010.08.18
posted by By훈트 2011.03.10 10:28
HTTP 오류 404.3 - Not Found IIS 7.0 설치 후 ASP.NET / 웹 프로그래밍

2009/01/07 16:12

복사 http://blog.naver.com/jinlee0007/40059963345

인터페이스 부터 솩 바뀐 IIS 7

 

설치후 제법 당황했다.

 

첫 페이지가 열리지 않기 시작했는데 그 오류 메세지란것이

 

HTTP오류 404.3 - Not Found...

 

난감하지만

 

잡아 내야 하니...

 

해결 방법은

 

제어판 - 프로그램 및 기능 - Windows 기능 사용/사용 안함 - 인터넷 정보 서비스 - World Wide Web 서비스 - 응용 프로그램 개발 기능

 

- ASP.NET 클릭...

 

이거 한큐로 해결...

 

한 두시간 해맨듯...

posted by By훈트 2011.03.10 10:27


 

HTTP 오류 500.19 - Internal Server Error
요청된 페이지와 관련된 구성 데이터가 잘못되어 해당 페이지에 액세스할 수 없습니다.

 

 

윈도우7에서 웹어플리케이션 개발시 위와 같은 오류가 발생할 경우,

해당 웹어플리케이션 폴더의 보안설정에서 IIS_USERSIUSR을 추가해 주면 된다.

 

 


posted by By훈트 2011.03.09 16:51

모바일웹용 mp4 동영상 스트리밍 재생 방법

1. 필요항목


1.1 스트리밍 동영상 서버

- 옴니아용 - Window Media Server ( mms 프로토콜로 동영상 스트리밍)
- 안드로이드용 - 다윈스트리밍서버(무료제품 http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=278&MAEULNo=20&no=29095&ref=29095  )
- IPhone용 - 웹서버

1.2 테스트를 위한 도구

-옴니아폰, 안드로이드폰, iPhone

1.3 hint를 처리하는 프로그램

- 안드로이드 계열은 rtsp 프로토콜로 mp4파일의 스트리밍을 지원한다. rtsp로 스트리밍을 위해서는 hint로 처리해야한다.

mp4box 라는 프로그램이 있다. (예 : mp4box -hint video.mp4  주의 : 같은파일 여러번 처리하면 파일이 깨진다. )

 

2. 인코딩


옴니아 : wmv 파일

iPhone : mp4

안드로이드 : iPhone용으로 mp4로 인코딩한 파일을 hint 처리하면 된다.



3. html 소스상


옴니아  : <a href='mms://동영상파일명'>동영상</a>
안드로이드 : <a href='rtsp://동영상파일명'>동영상</a>
iphone  : iphone의 경우는 http로 직접링크를 걸면, 해킹폰에서 다운로드받을 수 있다. 아래와 같이 object를 사용하면 다운로드는 되지 않은다.

<div id="centerbutton">
<!-- 여러가지 이벤트로 동영상을 제어할 수 있다. -->
<a href="javascript:document.movieQuick.Play();"> 강의보기</a>
</div>

<object id="qt_event_source" classid="clsid:CB927D12-4FF7-4a9e-A169-56E4B8A75598" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=7,2,1,0" ></object>
<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=7,2,1,0" width="0" height="0" type="video/quicktime" id="movieQuick" style="behavior:url(#qt_event_source);">
<param name="src" value="video.mp4" />
<param name="qtsrc" value="video.mp4" />
<param name="postdomevents" value="true" />
<param name="AUTOPLAY" value="False" />
<embed src="video.mp4" qtsrc="video.mp4" width="0" height="0" id="movieQuick" name="movieQuick" postdomevents="true" AUTOPLAY="False" /></object>



4.hint 처리하는 mp4box 프로그램


다운로드 : http://kurtnoise.free.fr/mp4tools/

hint 처리 후 모토로이/ 갤럭시등 안드로이드 폰에서 오디오가 나오지 않을때 처리 옵션(코덱의 문제로 보인다)

MP4Box0.4.5.exe -hint -latm  ./2.MP4    <--오디오를  Advanced Audio Coding(latm )으로 강제로 사용하도록 처리


도움말 : http://gpac.sourceforge.net/doc_mp4box.php




### 추가 ###

실시간 동영상 스트리밍 서버를 만들어서 테스트를 하는데 어찌된 일인지 셈플 동영상은 잘 플레이가 되는데 새로 인코딩해서 테스트를 해보면 동작을 하지 않아서 오랜 삽질 끝에 인코딩 된 동영상에 hint를 추가해 주어야 한다는 것을 알았다.
hint를 추가하는 것은 보통 mp4box를 많이 사용하는데 사용 방법은 간단하다.


프롬프트창을 열어서 mp4box.exe가 있는 곳으로 이동하여 아래와 같이 입력하면 된다.
mp4box -hint video.mp4
* 여기서 video.mp4는 해당 동영상을 의미함.


[출처] 안개속 님의 블로그
posted by By훈트 2011.03.08 14:34
메모리 부족 관련 질문들이 있어서 정리 합니다. (기억을 더듬어 작성하는거라 잘못된 부분이 있으면 댓글로 말씀주세요)

안드로이드에서 OutOfMemoryError라 발생하는 가장 많은 경우는 바로 비트맵 로딩때문에 발생합니다. 
그 경우 Logcat에서 다음과 같은 메시지를 보실 수 있습니다.

"java.lang.OutOfMemoryError: bitmap size exceeds VM budget"

안드로이드는 애플리케이션 프로세스별로 메모리가 제한되어있다는 것은 다 아실텐데 (16M, 24M, 32M등)  
문제는 위의 메모리 에러가 DDMS에서 가장 쉽게 확인할 수 있는 메모리 값인 VM Heap 사이즈와는 크게 상관없이 발생합니다.
Bitmap을 로딩할 경우 VM 내의 힙메모리를 사용하는게 아니라 VM밖의 Native 힙메모리 영역을 사용하기때문입니다.

0. 가용 메모리의 확인 

아래의 API들을 활용해서 Native Heap 값을 확인할수 있습니다.
Debug.getNativeHeapSize(), Debug.getNativeHeapFreeSize(), Debug.getNativeHeapAllocatedSize()
위 사이즈들은 단말별, 버전별로 조금씩 달라질수 있으니 레퍼런스 폰을 기준으로 약간 여유를 두는 것이 좋을겁니다.

해결 방법은 이미 많은 분들이 작성한 글들이 있는데 정리해보면

1. 아주 큰 이미지 파일을 불러오는 경우 BitmapFactory.Options.inSampleSize 설정을 통해 축소해서 메모리에 로드해야합니다.


2. 이미지의 경우 시스템이 알아서 판단해서 적합한 형식으로 로딩하는데 디폴트인 RGB8888(픽셀당 4바이트)로 로딩하는 경우가 
   많습니다. 이미지를 많이 사용하는 게임등의 경우 투명 이미지는 RGB4444, 불투명 이미지는 RGB565로 충분한 경우가 많으니 
   BitmapFactory.Options.inPreferredConfig 설정값을 어떻게 주고 있는지 확인해보시기 바랍니다. 

3. 더이상 쓰지않는 Bitmap의 경우 Recycle 을 호출해서 바로 가용 메모리를 늘려줍니다.

   bitmap.recycle(); bitmap = null;

  ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();


4. 메모리 릭이 발생하지는 않는지 확인하는것은 기본이겠죠.




메모리 관련해서는 저도 확실하게 모르는 부분이 있으니 댓글로 추가 정보 주시면 감사하겠습니다.


posted by By훈트 2011.03.07 18:48
비트맵 관련 앱에서 많이 발생하는 힙메모리 관련 오류 해결하기
개발 환경 - 안드로이드 2.1

1. 액티비티
    - onCreate에서 dalvik 버추얼 머신에게 힙메모리 임계값 지정하기 (70%)
       dalvik.system.VMRuntime.getRuntime().setTargetHeapUtilization(0.7f); --> 메인 액티비티에서 한번만 지정

    - onDestroy 이벤트에서 모든 지역변수 null 처리히기, 모든 비트맵 인스턴스 변수 recycle 시키기,
      메인앱에서 System.gc() 한번 호출하기
      
    - dalvik 버추얼 머신에게 dalvik.system.VMRuntime.getRuntime().runFinalizationSync()를
      호출하여 강제로 클래스들의 finalization 호출하기

2. 뷰를 상속한 차일드뷰
    - destroyDrawingCache 메소드를 상속 받아서 이부분에서 비트맵 인스턴스들 recycle 및 null 처리하기

제가 그래픽 관련 앱을짜면서 가장 애먹은 부분이 힙메모리 부분이었습니다.

힙모메리가 한계값까지 계속 늘어나기만 하고 줄어들지 않아서 결국에는 앱이 강제 종료 되는 현상이
계속 발생하더군요.. 구글링으로 여기저기 뒤지다가 안드로이드 플랫폼에서는 앱을 사용자가 종료를
시켜도 실제로는 메모리에 상주해 있어서 메모리가 계속 늘어나는 현상이 있다고 합니다.