여 름

[Flash]

 
일상에서의 수채화 (심태한)


사용자 삽입 이미지


3년만에 다시 찾은 통영.
뜻하지 않은 여행길에 빠듯하게 다녀온것이 못내 아쉽습니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
2008/08/16 19:30 2008/08/16 19:30
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

오늘밤도 별에 안겨


스카이 크롤러 포스터


지난 8월 2일 개봉한 오시이 마모루 감독의 신작 The Sky Crawlers 주제가 今夜も星に抱かれて

[Flash]

 

2008/08/12 21:54 2008/08/12 21:54
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Runtime 클래스를 이용한 외부 프로그램 호출

java.lang 패키지의 Runtime 클래스는 자바에서 외부 프로세스를 생성하는 방법을 제공한다.
예를 들어 자바를 이용하여 MS 윈도우에서 MS 엑셀을 실행하는것등에 이 Runtime클래스를 이용할 수 있다.

예를 들어 C:\Program Files\Microsoft Office\Office\excel.exe 위치에 있는 excel.exe를 실행
하는 코드는 아래와 같다.
[code]
try {
   Runtime run = Runtime.getRuntime ();
   run.exec ( "C:\\Program Files\\Microsoft Office\\Office\\excel.exe" );
} catch ( IOException ie )

   System.err.println ( ie );
}
[/code]
어떤가, 무척 간단하지 않는가?
그럼, 한걸음 더 나아가 보자.
윈도우는 파일확장자별로 대표 프로그램을 등록하여 파일을 더블클릭하는것만으로 해당 프로그램을 실행 할 수가
있는데 이렇게 특정 파일을 선택하여 그와 연결된 프로그램을 실행하는 코드도 자바로 가능 할까?
물론, 가능하다. 여기에는 윈도우즈 명령어를 조금 알아야 하는 부분이 있지만 그 부분만 알고 있다면 나머지는
위와 동일하게 Runtime 객체로 그 명령어를 실행 하기만 하면된다.
아래 코드를 보자.
[code]
package javacodesnipet;

import java.io.File;
import java.io.IOException;

/**
 * Runtime클래스를 이용하여 해당 파일과 연결된 프로그램을 실행한다.
 * @author 신윤섭
 */
public class RuntimeExample {
 public static void main(String[] args){
  try {
     File file = new File("d:\\sample.pdf");
   
     //MS Windows Only
     Process p= Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " +
     file.getAbsolutePath());
     // or
     //Process p= Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " +
     // file.getAbsolutePath());
   
     //Apple Mac Only
     //Process p= Runtime.getRuntime().exec("open " + file.getAbsolutePath());
   
     p.waitFor();
     System.out.println("Process Done");
   
  } catch (InterruptedException ex) {
     ex.printStackTrace();
  } catch (IOException ex) {
     ex.printStackTrace();
  }
 }
}
[/code]
위 코드는 윈도우 탐색기에서 d:\sample.pdf를 더블클릭하여 아크로뱃리더를 실행하고 해당 pdf문서를
여는것과 동일한 효과를 얻을 수 있다.  윈도우의 rundll32 명령으로 해당 파일과 연결된 프로그램을 구동
할 수 있는데 이를 Runtime객체를 이용하여 수행하는 코드이다.

rundll32 more..

2008/08/02 00:54 2008/08/02 00:54
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    한상규

    정말 정말 감사합니다.

double 값을 문자열 형식의 퍼센트값으로 변환하기

2008/08/01 23:09

서비 JAVA , , ,

double을 퍼센트(%)로 표현하기위해 여러가지 방법을 이용할 수 있지만  java.text 패키지의 NumberFormat 클래스
API를 이용하면 아래와 같이 간단히 double값을 퍼센트 문자열로 변환할 수 있다.

[code]
package javacodesnipet;

import java.util.Locale;
/**
 *
 * @author 신윤섭
 */
public class NumberFormatPercent {
 public static void main(String[] args){  
    //아래 double 값을 퍼센트 문자열로 표현해 보자
    double value = 0.343234532d;
    //NumberFormat 객체로 부터 PercentInstance를 얻어온다.
    java.text.NumberFormat pformat = java.text.NumberFormat.getPercentInstance(Locale.KOREA);
    //퍼센트로 표현할 소수점 이하의 자리수를 정한다.
    pformat.setMaximumFractionDigits ( 4 );
    //자... 이제 double을 String형식의 퍼센트로 변환하자.
    String sPercent = pformat.format ( value);
    //값을 확인 해 보자 -> 34.3235% 과 같이 표현 된다.
    System.out.println(sPercent);
    }
}
[/code]

2008/08/01 23:09 2008/08/01 23:09
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Silverlight의 장점과 단점/아쉬운 점.

RIA( Rich Internet Application )가 마켓리더인 어도비의 Flex와 AIR를 통하여 메인스트림 기술로 진입한 시점에
MS에서는 Silverlight 제품을 RIA  영역에 포진 하였습니다. 이에 실버라이트 라는 제품에 대해 개발자 커뮤니티
에서도 의견이 분분한데요.

이와 관련하여 어도비 플랫폼 에반젤리스트인  Serge Jespers씨가 자신의 블로그를 통하여 실버라이트에 대한
장단점과 아쉬운 점을 포스팅
하여 Flex-Silverlight간의 논쟁에 불을 붙였네요.
뭐.. 어도비 에반젤리스트가 한 말이니 어도비에 편향될 수도 있겠지만 실버라이트로 개발을 해 보신분이라면
고개를 끄덕일 만한 내용도 조금은 있지 않을까 생각합니다.

그는 포스팅을 통하여 실버라이트의 장점으로
* 실버라이트의 쓰레드 모델의 컨셉트가 아주 마음에 든다. 특히나 main 쓰레드의 정체없이 복잡한 테스크를 처리가능한
  - 예를들어 데이타 로딩과 동시에 별도의 쓰레드로 구현되는 부드러운 에니메이션과 같은 - 기능은
  정말 Cool하다.
* 실버라이트 어플리케이션은 파라메터 세팅과같은 간단한 방법으로 HTML문서와 통신할 수 있다.
* C#이나 VB.NET과 같은 코드를 그대로 사용할 수 있는점 역시 훌륭하다. 특히나 이 두 언어는 윈도우즈 기반
  개발자들에게 익숙하다.

라고 한 반면 단점과 아쉬운 점으로
* C#과 XAML 코드표현 방법이 너무 다양하다. -이건 저도 WPF를 잠깐 해 보면서 느꼈던 부분인데 똑같은 기능을
  C#으로도 XAML로도 구현 할 수 있기때문에 적절한 개발 가이드를 세우지 않으면 스파게티 코드를
  만들어낼 가능성이 농후합니다. -
* 컨트롤에 스타일을 적용하는건 말그대로 '악몽'이다. 이건 아무리 생각해도 실버라이트의 아킬레스건이다.
* Text Field에서의 HTML 태그 지원 부족 또한 이해할 수 없다.
* Expression 툴이 여전히 베타이다. 이는 Expression툴만의 문제에 그치지 않고 더이상 베타버전이 아닌
  비주얼 스튜디오 마저 버그를 갖는 미완성품으로 만들어 버렸다는 사실이다.
* 실버라이트를 접한 삼일간의 느낌은 실버라이트는 디자이너를 전혀 고려하지 않고 개발되지 않았나 하는 생각이다.

라는 견해를 밝히고 있습니다.
제가 봐도 딱히 편향되어 보이진 않지만 어도비 에반젤리스트의 이런 견해는 그의 위치때문이라도 좋은
논쟁꺼리를 만들어 낸 셈인데요..
그의 이런 생각에 다른 개발자들은 어떤 생각을 갖고 있는지 궁금하시면 그의 해당 포스트를 방문해 댓글을
직접 보시는게 좋겠네요. ^^

http://www.webkitchen.be/2008/07/17/silverlight-the-good-the-bad-and-the-ugly/
2008/07/28 19:38 2008/07/28 19:38
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

String 타입의 날짜를 Date 타입으로 변환하기

2008/07/22 01:59

서비 JAVA , , , ,

우리는 java.util.Date 혹은 java.sql.Date 타입의 객체에서 특정한 형식의 문자열로 날짜를 가져오기 위해서
java.text.SimpleDateFormat 클래스를 이용할 수 있다는 것을 알고 있다.
[code]
package javacodesnipet;
/**
 * @author 신윤섭
 */
public class SimpleDateFormatTest {
 
 public static void main(String[] args){
 
  // 현재 일시 정보를 갖는 Date 객체를 생성한다.
  java.util.Date currentDate = new java.util.Date();  
  //Date객체로부터 특정한 형식의 문자열로 일시를 만들어내기 위한 포매터를 생성한다.
  java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy년MM월dd일 HH시mm분ss초");
  //포매터를 이용하여 Date객체로부터 문자열을 만들어낸다.
  String dateString = format.format(currentDate);
  //변환된 문자열을 확인한다.  결과 : 2007년07월22일 02시21분42초
  System.out.println(dateString);  
 
 }
}
[/code]
위의 코드는 흔히 사용하는 코드일 것이다.

그런데 이 SimpleDateFormat 클래스의 parse() 메소드를 이용하면 역으로 문자열 형식의 날짜로부터
Date객체를 생성 해낼 수도 있다.
[code]
package javacodesnipet;
/**
 * @author 신윤섭
 */
public class SimpleDateFormatTest {
 
 public static void main(String[] args){
  try {
   // "2007-07-22" 이란 문자열로 2007년 7월 22일의 정보를 갖는 Date객체를 만들어보자
   String textDate = "2007-07-22";

   // 입력할 날짜의 문자열이 yyyy-MM-dd 형식이므로 해당 형식으로 포매터를 생성한다.
   java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");

   //SimpleDateFormat.parse()메소드를 통해 Date객체를 생성한다.
   //SimpleDateFormat.parse()메소드는 입력한 문자열 형식의 날짜가
   //포맷과 다를경우 java.text.ParseException을 발생한다.
   java.util.Date date = format.parse(textDate);

   //위에서 만든 date객체가 정말 7월22일인지 확인 해보자.
   java.text.SimpleDateFormat format1 = new java.text.SimpleDateFormat("yyyy년MM월dd일 HH시mm분ss초");
   String dateString = format1.format(date);
   //Date객체의 날자를 확인한다..  결과 : 2007년07월22일 00시00분00초
   System.out.println(dateString);
  } catch (java.text.ParseException ex) {
   ex.printStackTrace();
  }
 
 }
}
[/code]

2008/07/22 01:59 2008/07/22 01:59
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 유용한 자료 감사합니다.
    블로그에는 본문을 제외한 링크만을 옮겨둡니다.

  2. Blog Icon
    컴공

    이것때메 고민하던차에 잘보고 갑니다^^

  3. Blog Icon
    멍청돋네 ㅡㅡ

    저렇게 하면 최종 결과물은 String 입니다만?

    뭐가 Date타입입니까?

    SimpleDateFormat을 이용해서 parse하면 Date타입이지만
    다시 format하면 무조건 스트링타입이 됩니다.

    따라서 String -> Date 변환이 아니라
    String -> String(패턴지정) 이 됩니다.

    Date타입에는 따로 패턴을 줄수 없는것으로 알고 있습니다.

  4. Blog Icon
    정창용

    java.util.Date date = format.parse(textDate); <-- 여기까지가 포매터를 이용해서 String -> Date 변환이 이뤄진거고 그 아래 내용은 정말 제대로 변환되었는지 확인을 위한 테스트 코드로 보여집니다.

    다른 사람의 블로그에서 도움을 얻어갔으면 고맙다는 글을 못달지언정 본인의 난독증을 굳이 광고할 필요가 있을까 싶군요. 닉네임부터 똑바로 다는 예절부터 배우십시오.

  5. Blog Icon
    이정대

    공감합니다.

  6. 지나가던 사람이지만.. 댓글적은분 정말 멍청하네요.ㅎㅎ

  7. Blog Icon
    지현
  8. Blog Icon
    보나

    좋은 글 잘보고갑니다. 이것때문에 헤맸었는데 덕분에 해결되었어요 감사합니다♡

  9. 알짜베기로 잘 알려주셨네요~! 잘 보고 갑니다 :)

  10. Blog Icon
    ahm

    도움이 많이 되었습니다.

NetBeans로 PHP 개발하기

넷빈즈가 지원하는 개발언어는 이제 JAVA를 넘어 C/C++ , 루비, 자바스크립트, PHP, 파이썬의 영역까지
확장하고 있다.
PHP의 세계에도 유명한 통합개발환경( IDE ) 가 있으리라고 생각되는데 넷빈즈 6.5는 웬만한 PHP 개발툴의
기능을 넘어서는 PHP개발환경을 품게 될 듯하다.(게다가 무료로!)
넷빈즈 6.5는 PHP에 대해 code completion, syntax highlighting, mark occurrences, refactoring,
code templates, documentation pop-up, code navigation, editor warnings and task list와 같은 기능을
제공한다고 한다. 아래는 넷빈즈 에반젤리스트인 Roman Strobl씨의 짧은 시연화면이다.


영상이 보이지 않는다면 여기를 클릭
넷빈즈의 PHP지원 계획을 확인하려면 넷빈즈 위키페이지 방문.

PHP진영에서도 이클립스에 플러그인을 설치하여 PHP개발이 가능하다는것 정도는 알려져 있는것 같긴 하던데
자바 진영에서는 메이저 IDE들이지만 타 진영에서는 마이너 혹은 그 존재 조차 인지되지 못하고 있다는 사실이다.
넷빈즈와 이클립스의 문제는 좋은 에디터를 품고 있는 IDE를 다들 손에 익은 도구를 잘 사용하고 있을 PHP개발자
들에게 어떤 점을 어필하여 사용자로 끌어들이느냐가 관건이지 않을까?
(어쩌면 넷빈즈나, 이클립스 커뮤니티의 이런 노력은 타 언어 유저의 영합이 목적이 아닐지도 모르겠다.
자바 개발도구의 무한한 확장성을 자바 개발자들에게 확인 시켜주고 싶을 뿐인건지도..)
2008/07/15 01:41 2008/07/15 01:41
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

자바 파일복사 코드와 성능 2 :: Java File Copy Code & Perfomance Issue. part 2

2008/07/13 21:21

서비 JAVA , , , , , ,

지난 포스트를 통해 자바로 파일을 복사하는 몇가지 방법을 알아보았다.
이번시간에는 각 코드의 성능을 간단히 확인해 보고자 한다.

[code]
/*
 * author 신윤섭
 */
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);
   }
   
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   //자원 해제
   try{
    outputStream.close();
   }catch(IOException ioe){}
   try{
    inputStream.close();
   }catch(IOException ioe){}
  }

 }
}
[/code]
[code]
/*
 * author 신윤섭
 */
package filecopy;

import java.io.File;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Buffer를 이용한 파일복사 코드 스니핏
 * @author 신윤섭
 */
public class BufferCopy {

 /**
  * source에서 target으로의 파일 복사
  * @param source
  * @param target
  */
 public void copy(String source, String target) {
  //복사 대상이 되는 파일 생성
  File sourceFile = new File( source );
 
  //스트림, 버퍼 선언
  FileInputStream inputStream = null;
  FileOutputStream outputStream = null;
  BufferedInputStream bin = null;
  BufferedOutputStream bout = null;
 
  try {
   //스트림 생성
   inputStream = new FileInputStream(sourceFile);
   outputStream = new FileOutputStream(target);
   //버퍼 생성
   bin = new BufferedInputStream(inputStream);
   bout = new BufferedOutputStream(outputStream);
   
   //버퍼를 통한 스트림 쓰기
   int bytesRead = 0;
   byte[] buffer = new byte[1024];
   while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) {
    bout.write(buffer, 0, bytesRead);
   }

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //자원 해제
   try{
    outputStream.close();
   }catch(IOException ioe){}
   try{
    inputStream.close();
   }catch(IOException ioe){}
   try{
    bin.close();
   }catch(IOException ioe){}
   try{
    bout.close();
   }catch(IOException ioe){}
  }
 }
}
[/code]
[code]
/*
 * author 신윤섭
 */
package filecopy;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.io.IOException;

/**
 * NIO Channel을 이용한 파일복사 코드 스니핏
 * @author 신윤섭
 */
public class ChannelCopy {

 /**
  * source에서 target으로의 파일 복사
  * @param source 복사할 파일명을 포함한 절대 경로
  * @param target 복사될 파일명을 포함한 절대경로
  */
 public void copy(String source, String target) {
  //복사 대상이 되는 파일 생성
  File sourceFile = new File( source );

  //스트림, 채널 선언
  FileInputStream inputStream = null;
  FileOutputStream outputStream = null;
  FileChannel fcin = null;
  FileChannel fcout = null;

  try {
   //스트림 생성
   inputStream = new FileInputStream(sourceFile);
   outputStream = new FileOutputStream(target);
   //채널 생성
   fcin = inputStream.getChannel();
   fcout = outputStream.getChannel();
   
   //채널을 통한 스트림 전송
   long size = fcin.size();
   fcin.transferTo(0, size, fcout);

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //자원 해제
   try{
    fcout.close();
   }catch(IOException ioe){}
   try{
    fcin.close();
   }catch(IOException ioe){}
   try{
    outputStream.close();
   }catch(IOException ioe){}
   try{
    inputStream.close();
   }catch(IOException ioe){}
  }
 }
}
[/code]

이상의 샘플코드를 이용하여 700Mbytes 짜리 파일을 5번 복사하여 그 시간을 측정해 본 결과는 아래와 같다.
테스트는 Win XP Pro sp3, Intel Core2 Duo 2GHz, 2Gbytes, 5400rpm의 노트북용 HDD 에서 JDK 1.6.0_06
을 이용하여 이루어졌다.

결과는 아래와 같다.

스트림을 이용한 파일 카피

Stream을 이용한 파일 복사


버퍼를 이용한 파일 카피

Buffer를 이용한 파일 복사


채널을 이용한 파일 카피

Channel을 이용한 파일 복사



프로파일러를 이용하여 측정한 값이기 때문에 프로파일러의 처리량 만큼의 차이는 있겠지만 상대적 성능 비교
에는 문제가 없으리라 생각 된다.
실측에서도 예상대로 Stream , Buffer, Channel 순으로 파일 복사 시간이 줄어들고 있음을 볼 수있다.

이번에는 조금 더 들여다 보기로 하자. 700m짜리 파일을 한번 복사하는데 어떤 클래스와 메소들이 참여하고
있는지, 그리고 메소드가 몇번이나 호출되고 있는지 확인 해 보는것도 재미있을 것이다.

스트림이용

FileInputStream.read()실행에 대부분의 시간을 소비하고 있다.


스트림을 이용한 파일복사이다. FileInputStream.read()메소드가 71만여번 호출되고있으며 실행시간의 대부분을
이 메소드를 실행 하는데 소비하고 있음을 알 수 있다.

버퍼이용

Stream보다는 나아졌다고는 하나 역시 read()메소드가 대부분의 실행시간을 소비하고 있다.


Buffer를 이용한 방법. 위의 Stream을 이용한 방법에 비해 수행시간이 약간은 줄어들었지만 이는 Buffer를 활용
함으로써 FileOutputStream.write() 수행시간을 줄인데 따른 성능 향상이며, FileInputStream.read()메소드는
약 9만번 호출되고 있다.

채널이용

위 두 방식과는 확연히 다른 동작 성향을 보여주고 있다.


마지막으로 채널을 이용한 파일복사의 경우 위 두 경우와 비교하여 호출되는 메소드나 호출횟수등 전혀 다른
동작 성향을 보이고 있다. read 도 하지 않은채 FileDispatcher.write() 메소드를 단 한번 호출 하는것으로 파일
복사를 끝내고 있다. 이 FileDispatcher.write() 하부구조에서는 OS의 네이티브IO를 호출하고 있으리라 미루어
짐작할 수 있다.

이상으로 파일복사(스트림전송)의 세가지 방식과 그 성능에 대해 간략하게 알아보았다.
위 실험 결과는 크기가 비교적 큰 파일의 복사에서 나타나는 성향며, 다수의 작은 크기의 파일을 복사한다면
그 결과가 달라질 수도 있음을 밝혀둔다.

io작업이 필요한데 JDK 1.4 이상의 버전을 이용할 수 있다면 나은 성능을 보장하는 nio를 사용하지
않을 이유가 없어보인다.

2008/07/13 21:21 2008/07/13 21:21
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 안녕하세요 ^^
    글이 내용이 유용해서 좋아서 제가 퍼갔습니다. ^^
    문제가 있으시다면, 언제든지 알려 주세요 ^^

    링크는 다음과 같습니다. ^^
    http://cafe.naver.com/javacircle/31059

  2. Blog Icon
    서비

    도움이 되셨다니 기쁩니다.
    담아가셔도 크게 개의치 않습니다. ^^

  3. 감사합니다 ^^

  4. Blog Icon
    lahuman

    늘 사용하는 Stream 관련 좋은 정보 감사합니다.

  5. Blog Icon
    야기

    자바 성능검사를 어떻게 하셨는지 궁금합니다 ^^;

  6. Blog Icon
    서비

    글에 관심가져 주셔서 감사합니다.
    해당 프로파일러에 대한 정보는 http://www.yunsobi.com/blog/462
    글을 참고해 주시면 감사하겠습니다.

  7. Blog Icon

    생각보다 성능차이가 많이 나네요. 유용한 자료 잘 보고 갑니다.

    아 그리고 BufferedInputStream 생성자의 인자로 넘겨준 InputStream은 BufferedInputStream의 close()가 호출 될 때
    같이 close 됩니다. Channel 의 경우도 Lazy pattern 으로 생성되었다가 InputStream이 close 될 때 같이 close 되네요.
    이 글을 보고 혹시나 해서 궁금해서 소스를 뒤져보니 그렇게 되어있네요. 덕분에 배우고 갑니다 ^^

  8. Blog Icon
    컴장이

    좋은글 퍼갈께요.
    출처는 남기겠습니다.
    감사합니다.

  9. Blog Icon
    엘리냥

    파일 복사로 고민하던 차에 좋은 정보 얻어갑니다!!
    저런 성능 테스트 부분은 정말 유용하네요.
    성능 테스트하는 것도 더 알아봐야겠어요~

  10. Blog Icon
    노란사자

    좋은글 감사합니다.
    출처를 표기하고 퍼가겟습니다.

  11. Blog Icon
    이홍재

    좋은글 감사합니다.

    해당사항 담아갈게요.

    출처표기하겠습니다.

    담아가는 곳은 http://blog.naver.com/hongjae83

    문제가 될시 삭제하겠습니다.

    감사합니다.

  12. 좋은 정보 공유해주셔서 감사합니다

  13. Blog Icon
    jini

    좋은 정보 감사합니다.

  14. Blog Icon
    sbkim

    감사합니다^^~~~

  15. 감사합니다.
    http://blog.daum.net/andro_java/210
    채널카피 올렸습니다.

  16. 감사합니다. 많은 도움이 되었습니다.
    퍼갈께요. http://cafe.naver.com/stweb

  17. Blog Icon
    지나가던개발자

    이걸 안드로이드에 적용시켰더니 파일 복사 속도가 대략 3분의 1로 줄었습니다. 엄청난 성능입니다. 감사합니다.

자바 파일복사 코드와 성능 1. :: Java File Copy Code & Perfomance Issue. part 1

2008/07/13 00:05

서비 JAVA , , , , , ,

자바로 파일을 복사할 수 있는 방법은 크게 3가지 정도가 있다.
InputStream, OutputStream을 이용한 방법, Buffer를 이용한 방법, Channel을 이용한 방법이 그것이다.
물론 Buffer를 이용하면서도 단순히 Stream에 Buffer 필터를 적용할 수도, MappedByteBuffer를 쓸 수도 있고
Channel을 이용하면서도 inputChannel과 outputChannel을 이용하거나 transterTo()를 이용하는 등
다양한 방법을 구사할 수 있다.
여기서는 자바로 구현 할 수 있는 대표적인 파일 복사 코드를 살펴보고 각 코드간의 성능에 대한 이야기도 나눠
보도록 하겠다.

Java입문서등을 통하여 io (Input/Output)부분을 언급하며 나오는 개념이 Stream일 것이다. 스트림의 개념을
설명하고 처음 접하는 코드는 아래와 유사할 것이다. 파일을 인풋스트림으로 읽어들인 후 그 길이만큼 아웃풋
스트림에다 흘려보내는 방식으로 파일을 복사할 수 있다.

[code java] FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); [/code]

* InputStream과 OutputStream을 이용한 기본적인 파일 복사 코드.
위 코드는 기본적인 Stream의 사용법을 잘 보여주고 있지만 성능상에 심각한 문제를 안고 있다.
파일크기(정확하게는 스트림의 길이)만큼 while문을 돌면서 끊임없이 읽고쓰기를 반복하고 있는데
이는 CPU, DISK모두에게 부담을 주는 결과를 초래한다.

이어지는 코드가 아마 가장 널리쓰이고 흔하게 볼수 있는 코드 일 것이다. 위에서 살펴본 Stream간의 데이터
전송이 썩 좋은 성능을 내지 못하기 때문에, 스트림을 버퍼를 장착(wrapping, chainning)하여 입출력 횟수를 줄여
성능 향상을 꾀하고 있다.

[code java] FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); BufferedInputStream bin = new BufferedInputStream(inputStream); BufferedOutputStream bout = new BufferedOutputStream(outputStream); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) { bout.write(buffer, 0, bytesRead); } bout.close(); bin.close(); outputStream.close(); inputStream.close(); [/code]

* Stream에 Buffer Filter를 연결하여 성능을 향상.
위와같은 방법으로 충분히 만족할만 한가? 그렇다고 할수도있고 아니라고 할수도 있다. 위 두 방식은 스트림으로
데이터를 전송하는데 항상 cpu의 연산을 필요로 한다. 즉 스트림을 처리하는동안 cpu가 계속해서 명령을 처리
해줘야 한다는것이다.(비록 cpu사용율은 얼마 안될지 모르지만.. )

컴퓨터의 입장에서 본다면 IO는 상당히 느린 작업중의 하나이다. 이런 작업을 조금이라도 빨리 처리하기위해
하드웨어 혹은 운영체제 수준에서 많은 기법들을 제공하고 있다.
자바는 버전 1.4에 이르러서 기존 io와는 차별화된 nio(new io) 패키지가 추가되었는데 이 nio를 통하여
운영체제가 제공해 주는 향상된 io기능을 활용할 수 있게 되었다. 그 대표적인 것이 Channel과 Selector일 것이다.
아래와 같은 코드는 JDK 1.4이상부터 사용 가능하며 transferTo() 메소드를 호출하면 내부적으로 OS의 네이티브IO
기능을 활용하여 더욱 효율적인 스트림 전송이 가능하다.
 
[code java] FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); FileChannel fcin = inputStream.getChannel(); FileChannel fcout = outputStream.getChannel(); long size = fcin.size(); fcin.transferTo(0, size, fcout); fcout.close(); fcin.close(); outputStream.close(); inputStream.close(); [/code]

* Channel을 이용한 네이티브OS 기능 사용하기.

이상으로 3가지 대표적인 자바 파일복사 코드를 살펴보았다. 다음 포스트에서는 각 방식의 성능 차이에 대해
알아보도록 하겠다.

자바 파일복사 코드와 성능 2

2008/07/13 00:05 2008/07/13 00:05
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 안녕하세요 ^^
    글이 내용이 유용해서 좋아서 제가 퍼갔습니다. ^^
    문제가 있으시다면, 언제든지 알려 주세요 ^^

    링크는 다음과 같습니다. ^^
    http://cafe.naver.com/javacircle/31058

  2. Blog Icon

    유익한 내용.. 출처 남기고 퍼가겠습니다 ^^

  3. Blog Icon
    SSH

    잘 썼습니다! 파일채널은 첨 써보는데 잘되네요!!

  4. 좋은 내용 감사합니다.

  5. Blog Icon
    우주인

    좋은 글 감사 합니다. 출처 남기고 퍼가겠습니다^^

  6. Blog Icon
    dennis

    좋은 정보 감사합니다.

Silverlight 2 Unit Test Framework :: 실버라이트 단위 테스트 프레임워크



실버라이트 단위 테스트 프레임워크 수석 개발자인 Jeff Wilcox는 Sliverlight 2의 테스트 방법을 작성하여
포스팅 하였습니다. 실버라이트 테스트에 대해 스텝바이스텝으로 구성된 Jeff의 포스트에는 업데이트된
Test Project Templaterepackage한 실버라이트 테스팅 어셈블을 제공 하고 있습니다.

해당 실버라이트 유닛 테스트 프레임워크는 아직 비주얼 스튜디오에 통합되진 않았지만, MS Test에서 쓰이는
Type과 Attribute를 그대로 이용하고 있다고 합니다.

실버라이트의 단위 테스트에 관심이 있으신 개발자는 Jeff Wilcox의 해당 포스트를 방문해 보시기 바랍니다.

2008/07/08 01:13 2008/07/08 01:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WebLogic Suite에 대한 Oracle의 공식 입장 발표.


일전에 Sun Microsystems 의 MySQL인수 뉴스를 포스팅 하면서 Oracle의 BEA인수도 살짝 언급했었는데요..
Oracle에서 이번에 인수하게된 BEA사의 Weblogic 제품군과 앞으로 오라클의 미들웨어 제품시장 전략에 대한 공식 발표가 현지시간으로 08년 7월 1일 오전에 있었습니다.

이번 발표에는 Charles Phillips Oracle사장과 Thomas Kurian Oracle Fusion Middleware수석 부사장의 아웃라인에 기초하여 BEA사의 제품과 기존 Oracle 제품간 통합의 최선책과 양사의 기존 고객을 어떻게 보호할지에 대한 전략이 포함되어 있습니다.

Oracle Press 보러 가기

이번 발표에서 가장 주목할 만한 변화는 Oracle Application Server 제품이 Oracle Weblogic Server라는 새로운 브랜드로 바뀐다는점 입니다.

웹로직 브랜드의 부분이었던 Weblogic Operations Control, Coherence caching service와 JRockit JDK는 앞으로 Oracle Weblogic Suite라는 이름으로 제공 됩니다.

좀 더 자세한 정보를 원하시면 아래 링크와 첨부 파일을 참조 하시기 바랍니다.
Detailed DataSheet
oracle-middleware-strategy-briefing-072008.pdf

오라클 미들웨어 전략 브리핑



2008/07/08 00:26 2008/07/08 00:26
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Java Profiler JProbe 8.0 출시!! :: 자바 프로파일러

Quest Software에서 Java cde, memory, coverage 프로파일러인 JProbe 8.0을 출시하였습니다.
JProbe는 YourKit 이나 JProfiler 와 유사한 기능을 제공하면서 다른 두 프로파일러에 비해 저렴한 가격을 장점으로 꼽고 있습니다.
JProbe 8.0은 두가지 특징적인 기능이 포함되었습니다.
첫번째로 자바 어플리케이션의 프로파일링을 좀 더 원활히 진행하기위해 Eclipse 플러그인을 지원하여 IDE를 통하여 개발, 테스트 및 성능평가에 이르는 프로세스를 단축하여 좀 더 높은 생산성을 제공합니다.
또다른 특징으로는 UI개선을 통한 사용성 향상을 꼽을 수 있습니다. Data Visualization기능을 통하여 좀 더 빠르고 효율적으로 memory allocation 문제를 진단할 수 있습니다.
JProbe는 상용제품이긴 하지만 Quest Software에서는 JProbe Freeware라는 이름으로 기능에 제한을 둔 Eclips 플러그인을 배포하고 있습니다.

  Freeware Commercial
Main Features    
# installations unlimited per license
Memory Heap Dump Analysis
Memory JProbe Snapshot Analysis X
Performance Analysis X
Code Coverage X
Automation X
Quest Support JProbe Community Quest Support


넷빈즈에는 이미 JProfiler에 버금가는 프로파일러가 내장되어 있기 때문에 그닥  필요를 느끼지는 않지만 넷빈즈 유저로써 '넷빈즈용 플러그인도 배포하면 좋을텐데..' 하는 아쉬움이 남는것도 사실입니다.

JProbe에 관심있는 개발자 분들은 http://www.quest.com/common/registration.aspx?requestdefid=18937 를 방문 하시면 더 많은 정보를 얻을 수 있습니다.

2008/07/07 23:50 2008/07/07 23:50
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

넷빈즈 로드맵 업데이트


넷빈즈 6.1 이후 단기 로드맵이 공개 되었습니다.
이번에 공개한 로드맵에는 넷빈즈 6.5의 출시일이 표기되어 있습니다.

넷빈즈 로드맵

NetBeans RoadMap


넷빈즈 6.5가 10월 출시예정으로 미루어 보아 넷빈즈 7은 내년 5월에 있을 JavaOne 행사를 전후해서
발표하지 않을까 예상합니다.

넷빈즈 6.5의 새로운 그리고 향상된 기능일람이 궁금하신분은  Netbeans 6.5 Project Page를 방문해
보시기 바랍니다.

2008/06/27 19:13 2008/06/27 19:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Oracle Application Server 설치 후 host, domain, ip변경 방법


오라클AS는 처음 설치할 때 서버의 호스트 정보를 기록하기 때문에 오라클AS 설치 후 ip를 변경하면
EM(Enterprise Manager) console 서비스가 올라가지 않아 오라클 서버에 접속할 수 없게 된다.

http://download-east.oracle.com/docs/cd/B32110_01/core.1013/b32196/host.htm

위 링크에는 오라클 10g를 기준으로 hostname, domain name, ip변경 / Off-Network On-Network 전환 / 고정ip DHCP간 변환
방법을 기술하고 있다. 오라클 서버의 네트웤 설정을 변경하는 작업이 불가능하진 않지만 그리 간단한 작업도
아니므로 부득이한 경우가 아니라면 오라클 서버의 네트웤 설정은 변경하지 않는 편이 좋겠다.

작업 절차 보기..




2008/06/21 14:39 2008/06/21 14:39
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

이건 뭥미????



이건 뭥미???
언제부터 이런거임???

내가 원한게 아닌데..

헉.. 댓글차단 기능이 언제부터 활성화 되었지?


부랴부랴 차단 ip 삭제..

부랴부랴 차단 ip 삭제..


어제 Textcube에서 새로운 스팸 댓글 차단 플러그인이 올라온 것을 확인하고 바로 적용하였습니다.
오늘 테스트 삼아 댓글을 남겨보는데 '귀하는 차단되었으므로..'라는 안내문구가 뜨더군요.
부랴부랴 DB에 접속해 차단 정보를 확인해 보았는데 특별한 이상은 발견할 수 없었지만,
행여나 하는 마음에 차단 ip 리스트도 삭제했는데 여전히 댓글 등록이 안 되네요.

이게 언제부터 이랬는지 전혀 감을 잡을 수가 없는데... 끙..
그동안 몇 분이나 기분 상해 돌아가셨을지...

지금으로선 뾰족한 수가 생각나지 않는데요.. 텍스트큐브 1.7로 업데이트 하면 정상 동작하려나요..

그간 제 블로그에 댓글 달려고 하시다 '차단' 알림을 보신 분들께 심심한 사과의 말씀을 드립니다.
얼른 고쳐 놓도록 하겠습니다.

---------------------------------------
켁.. 나 요즘 왜이러니? 영문자뿐만 아니라 숫자로만 작성한 코멘트도 블럭 대상이군요..
혼자 호들갑을 떨었네요.. ㅋ


2008/06/20 15:52 2008/06/20 15:52
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다