일요일, 1월 12
Shadow

#003 클라우드 컴퓨팅

미분류
1960년대 미국의 컴퓨터 학자인 존 맥카시 (John mcCarthy)가 처음 개념을 제시하고 여러 기업들에 의해 초석을 다져온 클라우드 컴퓨팅은 2006년 구글의 CEO 에릭 슈미트가 처음 한 말로써 최근 IT시장의 대세로 떠오른 스마트폰, 전자북 시장에까지 확대되고 있습니다. 본래의 개념은 필요한 소프트웨어를 PC에 저장할 필요없이 웹상에서 필요한만큼 빌려쓰고 비용을 지불하는 방식으로써 대표적으로 은행의 ATM기계를 들 수 있지만 최근에는 모바일 클라우드 컴퓨팅을 핵심으로 IT업계에 빠르게 퍼져나가고 있는 추세입니다. 많은 미디어, IT 전문가들은 앞으로 클라우드 컴퓨팅 이라는 수익모델에 기반한 개인용 스토리지시장이 2010년대 IT시장을 이끌어갈 핵심개념이라고 설명합니다. 클라우드 컴퓨팅이란? -정의 : 소프트웨어를 자신의 PC에 설치하지 않고 필요할때만 인터넷에 접속하여 각종 IT기기로 손쉽게 정보를 공유하고 사용하는 사용환경(interface)이자 플랫폼을 말하는 최신 IT용어입니다. -뜻풀이 : cloud + computing = 구름,덩어리+ 계산, 처리 (출처 : 다음 백과사전) 수많은 복잡한 인프라 구조로 이루어진 네트워크 모식도 입니다. 하지만 사용자들은 이것을(네트워크 보관소, 연결고리) 알지 못해도 손쉽게 네트워크로 들어가 본인에게 필요한 정보를 사용하고 또 공유할 수 있죠. 예를들면 스마트폰 시장의 대세인 아이폰의 세컨드라이브 (2ndrive)구글의 Gmail, Google Calender 등이 대표적이라 할 수 있겠죠. 사용자가 네트워크에 참여...

#069 자바를 이용한 파일 복사

미분류
package filecopy; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;   /** * Stream을 이용한 파일복사 코드 스니핏 * @author */ public class StreamCopy {   /** * source에서 target으로의 파일 복사 * @param source * @param target */ public void copy(String source, String target) { //복사 대상이 되는 파일 생성 File sourceFile = new File( source ); //스트림 선언 FileInputStream inputStream = null; FileOutputStream outputStream = null; try { //스트림 생성 inputStream = new FileInputStream(sourceFile); outputStream = new FileOutputStream(target); int bytesRead = 0; //인풋스트림을 아웃픗스트림에 쓰기 byte[] buffer = new byte[1024]; while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) { outputStream.write(buffer, 0, bytesRead); ...

#002 HTTP 1.0 전송규약

미분류
HTTP/1.0 (HyperText Transfer Protocol, Version 1.0, RFC 1945) 1. HTTP 개요 1.1 HTTP vs. TCP/IP HTTP는 World Wide Web에서 사용하고 있는 데이타 전송 프로토콜이며 MIME으로 지정할 수 있는 모든 데이타 형식에 대해 8bit 이진모드로 전송할 수 있다. (8bit 이진모드 전송이라 함은 1bit도 빠짐없이 완전무결하게 전송한다는 것이며 7bit 아스키모드 전송이라 함은 8bit 기본 단위에서 MSB 1bit의 완전무결성을 보장하지 못 한다는 것이므로 데이타 전송에 오류가 생길 가능성이 있다. 따라서 ASCII 텍스트 문서를 전송할 때는 7bit 아스키모드로 전송을 해도 되지만 실행파일과 같은 binary data를 전송하고자 할 때는 반드시 8bit 이진모드로 전송하여야만 한다.) 이것은 FTP의 경우에서와 같이 이진모드로 데이타 송수신이 가능함을 뜻하며, 다만 WWW용의 추가적인 정보가 HTTP 프로토콜에서 활용되고 있을 뿐이다. 따라서 HTTP 프로토콜은 TCP/IP 프로토콜 체계 가운데 TELNET이나 FTP와 같은 응용 프로토콜의 한 가지이다. 즉, 아래의 그림에서 보이는 것처럼 HTTP는 TELNET처럼 TCP 수송계층 프로토콜을 이용해서 데이타 송수신을 하는 응용 계층 프로토콜의 일종이라는 것이다. +------+ +------+ +--------+ +------+ +------------+ +-----+ +------+ +-----+ | ping | | http | | ...

#001 libpcap 을 통한 Ethernet frame capture, 패킷 분석

미분류
- 연결된 장치 검색 char * pcap_lookupdev(char * errbuf); - Open Device pcap_t * pcap_open_live(char * device, int snaplen, int promisc, int to_ms, char * ebuf); - 열린 장치로 부터 패킷 Listening char * pcap_next(pcap_t * p,struct pcap_pkthdr * h) - 이더넷 구조체를 이용해서 이더넷 정보를 읽어 낸다. struct ether_header * header; - 장치 ID를 사용해서 열린 장치의 닫는다. pcap_close(pcap_t * p);  pcap_next()를 통해 패킷을 캡쳐함. header의 마지막 값인 ether_type을 통해 다음에 있을 프로토콜의 타입을 알수 있다. struct ether_header { u_int8_t  ether_dhost[ETH_ALEN]; //Destination, ETH_ALEN = 6 u_int8_t  ether_shost[ETH_ALEN]; //Source, u_int16_6 ether_type;            //Protocol ID } 프로토콜의 타입은 /usr/include/net/ethernet.h 에  이더넷 구조체와 함께 정의 되어 있으며 다음과 같다. ETHERNET_PUP     0x0200   /*Xerox PUP*/ ETHERNET_IP      0x0800   /*IP*/ ETHERNET_ARP     0x...

#068 구조체 생성자

미분류
열거형(enumeration) 열거자(enumerator)란 이름이 부여된 일련의 정수 상수로 구성되는 데이터 타입 열거자의 값은 기본적으로 0으로 시작하여 1씩 증가 값을 바꿀 수 있는데, 한 값을 바꾸면 다음 열거자부터는 바뀐값에서 1씩 증가 default type 은 int 이며 char를 제외한 정수형 타입(byte, sbyte, short, int, uint, long, ulong)의 지정이 가능 열거형 정의 및 사용 열거형 정의 view plaincopy to clipboardprint? enum Weekday{Mon, Tue, Wed, Thu, Fri, Sat, Sun}; // Mon=0, Tue=1, Wed=2, Thu=3, Fri=4, Sat=5, Sun=6 enum Weekday{Mon = 1, tue, Wed = 4, Thu, Fri = 7, Sat, Sun}; // Mon=1, Tue=2, Wed=4, Thu=5, Fri=7, Sat=8, Sun=9 열거형 사용 view plaincopy to clipboardprint? WeekDay weekday = WeekDay.Fri; // 또는 int weekday = (int)WeekDay.Fri; 구조체 대문자로 표시 value type 사용자 정의 데이터 타입을 정의하는데 사용 일반적으로 여러개의 필드를 포함하는 복합 데이터 타입(composite data type)을 정의하기 위해 사용 공개필드 멤버로만 포함하는 것이 일반적 생성자를 가질 수 ...

#036 SVN 플러그인 Subversive 설치 정리

미분류
딱히 리뷰는 아닙니다만 항상 사용하는 Subversive 설치가 좀 불편해져서 정리해보았습니다. ^^ 처음 설치하시는 분은 Subclipse를 검토해보셔도 좋을 것 같네요!   이클립스에서 SVN을 사용하려면 Team 기능 연동을 위한 Team Provider 플러그인을 설치해야 합니다. SVN플러그인으로는 SVN을 개발한 Tigris 커뮤니티에서 개발하는 Subclipse와 Polarion이라는 커뮤니티에서 개발한Subversive라는 플러그인이 있습니다. Subclipse가 먼저 나왔지만 UI 등의 개선이 한발 앞섰던Subversive가 더 인기를 끌고 있는 상황인데, Subversive가 이클립스 공식 Project Incubation에들어가면서 설치과정이 오히려 귀찮아지게 되었습니다. Subclipse나 Subversive나 UI를 제외한 SVN 연동 부분은 JavaHL이나 SVNKit 같은 별도의라이브러리를 사용하는데 공식 프로젝트로 들어가면서 Eclipse Public License를 제대로 적용하게 되자, 별도라이브러리에 대한 법적인 문제 때문에 SVN 연동 라이브러리에 해당하는 플러그인은 Connector라는 이름으로 따로 배포하고있습니다. Subversive Team Provider와 Connector가 별도 사이트에서 배포되지만 실제로는상호의존하므로 꼭 같이 설치를 해야 합니다. 두 업데이트 사이트에서 한번에 설치해야 한다는 점 이외에는 특별히 복잡할 것은 없습니다만 Team Provider와Connector가 각각 버전도 틀리고 해서 설치하면서 의아한 분...

#035 SVN 이클립스 사용

미분류
이제 우리가 사용할 오픈소스 프로젝트(http://code.google.com/p/quik/)를 레파지토리에서 가져와 보겠습니다. 이 작업을 체크아웃(Checkout)이라고 합니다. File → New → Other... 를 선택하세요. 그리고 svn 이라고 타이핑하시면 선택가능한 SVN 목록이 나타납니다. Checkout Project from SVN을 선택하세요. 이제 SVN을 등록해야합니다. Create a new repository location을 선택합니다. 그 뒤에 location url을 적는창이 나타납니다. http://code.google.com/p/quik/ 바로 이곳이 우리가 예전에 만들었던 오픈소스 프로젝트 사이트 주소입니다. 여기 홈페이지에 들어가서 source 메뉴를 클릭하시면 SVN에 사용할 주소가 나타납니다. 로그인을 해야 내 계정과 비밀번호를 알 수 있으니 로그인 한 후에 source 메뉴를 클릭하세요. source 메뉴를 보니 상단에 https로 시작하는 주소가 있습니다. 바로 여기가 프로젝트 멤버의 SVN주소 입니다. https://quik.googlecode.com/svn/trunk/ 까지만 복사하세요. 그 뒤에는 프로젝트 명과 사용자 아이디가 나와있는데 이클립스에서 이 값들은 나중에 적는란이 따로 있으니 https://quik.googlecode.com/svn/trunk/ 이와 같은 형식의 주소만 복사합니다. 그리고 비밀번호를 알기 위해서 googlecode.c...

#002 오픈 소스 기반의 고성능의 분산 데이터 저장 시스템들(NoSQL)

미분류
최근들어 MySQL, Oracle, DB2, and SQL Server 등의 상용 관계형 DB보다 성능이 우수한 오픈소스 및 인덱스 기반의 데이터 저장 구조를 가진 이른바 NoSQL이라는 새로운 형태의 데이터 스토리지 솔루션이 개발자들사이에 많이 회자되고 있네요. 재정이 빈약한 Web 2.0 기업들이 구글이나 아마존, MS 등의 대기업군을 따라 잡을려면 오픈 소스 기반의 NoSQL 밖에는 대안이 없다고 생각한다는 증거죠. 한 예로, 페이스북은 기존 데이터베이스인 MySQL이 아니라 카산드라(Cassandra) 데이터 스토어에서 개발해 새로운 검색 기능을 추가해서 전세계 개발자들에게 주목 받았죠. 그래서 관련 Paper인 Rick Cattell의 High Performance Scalable Data Stores라는 내용을 한번 정리해 보았습니다. 이들 NoSQL 이라는 데이터 저장 시스템의 공통된 특징들은... 데이터 베이스라 부르기를 거부하고 Key & Value로 저장되고 분산 환경 지원되고 Call level interface 지원(DBMS에 접근하는 표준) 막대한 양의 데이터를 처리할 수 있는 대용량 데이터의 빠른 인덱싱 클러스터나 그리드에서의 구동을 위해 다양한 테이블로 데이터베이스를 나눠야 하는 복잡한 작업과 ‘샤딩(sharding)’ 없이 손쉽고 저렴하게 여러 서버들의 수평적 확장(horizontal scaling)됨 데이터의 스키마와 속성들을 동적 정의 Data Stores의 다양한 관점에서 종류들을 요약해보자면... 1. Key-...

#038 톰켓을 사용하는데 필요한 20가지 Tips

미분류
1. jdk 1.5이상이면 아래 설정을 JAVA_OPTS안에 추가한다면 YourKit을 가지고 힙덤프를 분석할 수 있다. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/heapdump 2. Jasper 2 JSP Engine 지원을 위해 $CATALINA_BASE/conf/web.xml 설정 변경하라. - development : false, genStringAsCharArray : true, modificationTestInterval : true, trimSpaces : true - 자세한 건 여기를 참조하라. 3. 가용성 확보를 위해 Tomcat의 clustering/session replication을 사용하라. - 사용방법은 여기를 참조하라. 4. error pages를 작성하여 적용하라.(web.xml) - <error-page> <error-code>404</error-code> <location>/error/404.html</location> </error-page> 5. 어플리케이션에서 System.out과 System.err를 제거하고 Log4j를 사용하라. 6. application마다 같은 라이브러리는 WEB-INF/lib에서 CATALINA_HOME/shared/lib로 옮겨서 공유하라. - 메모리를 절약할 수 있다. 7. memory parameters를 잘 활용하라. 8. 불필요한 어플리케이션을 제거하라. 9....

#037 Tomcat 성능 향상 방법들

미분류
*. JVM Tuning 튜닝 1. 메모리 가용성을 확보한 다음 힙 사이즈를 늘려라 - -server -Xms768M -Xmx768M 2. garbage collector를 튜닝하라(GC 로깅 분석 후) - -XX: +UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading 3. 원격지에서 모니터링을 주기적으로 하라(물론 상용에선 빼라) - -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false *. Tomcat 튜닝 1.  중복 로그 접점을 제거하고 하나로 통일하라(logging.properties) - .handlers = 1catalina.org.apache.juli.FileHandler,java.util.logging.ConsoleHandler 부분을 .handler = 1catalina.org.apache.juli.FileHandler로 변경 2. 로그 Overflow 예방하기 위해 아래 설정을 logging.properties에 추가하라 - 1catalina.java.util.logging.FileHandler.pattern =${catalina.base}/logs/catalina.%g.log - 1catalina.java.util.log...