盡人事待天命

미디어협동조합 국민TV

cmd > tasklist.exe /FI "IMAGENAME eq java.exe"

java 프로세스아이디를 얻어낼수있다.

cmd > jps.exe -v
java 프로세스아이디를 얻어낼수 있다.
또한 어떤 cmd로 실행되었는지 알수 있음.

cmd > jstack ${pid}

해당 java 프로세스 의 stack trace 를 얻어낸다...

cmd > jstack ${pid} > stacktrace.txt 

리다이렉션을 이용하면 . txt 파일로 저장가능..


Posted by 톰켓 Trackback 0 Comment 0

SimpleDateFormat Thread Issue

http://forum.java.sun.com/thread.jspa?threadID=497693&messageID=2906187

This is certainly not a foolproof solution, and I
think synchronizing the parse() and fomat() methods
are adjusting the timing enough to reduce the
occurences of the exception being thrown. Again, in
my code the parse() call is only ever made from a
single thread.

SimpleDateFormat & Thread
http://crosscutter.info/2

Posted by 톰켓 Trackback 0 Comment 0
하는 방법은 알아서 ^^


jxl.jar파일입니다..

찾아보시면 다 잘나와 있죠
Posted by 톰켓 Trackback 0 Comment 0

JDK1.4 API에서 지원하는 이미지 디코딩,인코딩을 보려면 다음과 같은 문장을 실행하면 됩니다.

import javax.imageio.*;
import java.util.Arrays;

public class GetFormats {
        public static void main(String args[]) {
                String readFormats[] = ImageIO.getReaderMIMETypes();
                String writeFormats[] = ImageIO.getWriterMIMETypes();
                System.out.println("Readers: " + Arrays.asList(readFormats));
                System.out.println("Writers: " + Arrays.asList(writeFormats));
        }
} 

기본적으로 png,jpeg,gif 형식의 파일을 읽을 수 있으며 png,jpeg형식으로 쓸 수 있다고 출력이 나옵니다. GIF형식은 라이센스를 걸었는지 PHP같은데서도 기본적으로 지원을 하지 않더라구요..
그럼으로 gif형식의 파일을 읽었다고 해도 다시 gif형식으로는 저장을 할 수 없습니다.

다음 예제는 1.gif 이미지 파일을 읽은 후 50x50 사이즈의 이미지로 변형 한 후 저장하는 소스입니다. BufferedImage객체만이 ImageIO에서 write를 할 수 있는데 getScaledInstance메소드를 수행하면 Image객체로 변형이 되 버립니다. 그래서 BufferedImage객체를 새로 만든 후 scaling된 이미지를 그려 준 후 저장하는 방식으로 하였습니다.
다음과 같은 방법으로 사이즈를 변경 할 경우 윈도우가 존재해야 한다는 전제가 있어야 합니다. 즉 linux콘솔 상에서 사용할 경우 에는 에러가 발생합니다.

import java.io.*;
import java.awt.image.*;
import java.awt.*;
import javax.imageio.*;

public class ImageSize{

        public static void main(String args[]){
                try{
                        BufferedImage i = ImageIO.read(new File("1.gif")); //변형하고자 하는 이미지
                        Image img = i.getScaledInstance(50,50,Image.SCALE_DEFAULT ); //사이즈 변경
   
                        BufferedImage oi = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB ); //저장할 이미지 객체 생성
                        Graphics g = oi.getGraphics();
                        g.drawImage(img,0,0,new Panel()); //스케일링된 이미지 그리기

                        ImageIO.write(oi,"jpg",new File("2.jpg")); //새로운 이미지로 저장,jpg형식
                }catch(Exception e){
                        System.out.println(e);
                }
        }
}

자바에서 이미지 스케일링은 Image객체의 getScaledInstance 메소드를 이용하면 됩니다. (윈도우가 지원하는 경우)

하지만 윈도우 환경이 아닐 경우에는 다음과 같은 에러가 발생 하죠...

Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:126)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:130)
        --- 중략 --

갤러리를 만드는 도중 썸네일 이미지를 생성해야 할 일이 생겼는데 도저히 자바 API 갖구서는 해결이 되지 않더라구요.. 그렇다구 지금 잘 돌아가는 서버에 X를 띄우고 돌리기도 그렇고 해서 메소드를 만들었습니다. 약간은 허접 하지만 썸네일 이미지 정도로만 사용 하기에는 충분 합니다. 그럼 테스트용 소스 전문입니다. 주석은 별로 안 달았습니다.

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*; 
import javax.imageio.*;

public class ImageProcessor{

        public static void saveJpeg(File file, BufferedImage image) throws Exception{
                saveJpeg(file, image, 0.7f);
        }

        public static void saveJpeg(String file, BufferedImage image) throws Exception{
                saveJpeg(file, image, 0.7f);
        }

        public static void saveJpeg(String file, BufferedImage image, float quality) throws Exception{
                saveJpeg(new File(file), image, quality);
        }

        public static void saveJpeg(File file, BufferedImage image, float quality) throws Exception{

                FileOutputStream fos = new FileOutputStream(file);

                JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
                JPEGEncodeParam param = jpeg.getDefaultJPEGEncodeParam(image);

                param.setQuality(quality, true);
                jpeg.setJPEGEncodeParam(param);
                jpeg.encode(image);
                fos.close();
        }


        public static BufferedImage scaling(Image input, int new_width, int new_height) throws Exception{

                int org_width= input.getWidth(null);
                int org_height= input.getHeight(null);

                int[] org_pixels = new int[org_width * org_height];
                PixelGrabber pg = new PixelGrabber(input, 0, 0, org_width, org_height, org_pixels, 0, org_width);
                pg.grabPixels();

                int[] new_pixels = new int[new_width * new_height];

                scalingProcess(org_pixels, org_width, org_height, new_pixels, new_width, new_height);

                BufferedImage bi = new BufferedImage(new_width, new_height,BufferedImage.TYPE_INT_RGB);

                bi.setRGB(0, 0, new_width, new_height, new_pixels, 0, new_width);
                return bi;
        }

        private static void scalingProcess(int[] pixels, int width, int height, int[] new_pixels, int new_width, int new_height){
                int i,j;
                int value = 10000;
                int pos_h = value;
                int pos_w = value;

                int inc_h = (height*value)/new_height; //세로 증가량
                int inc_w = (width*value)/new_width; //가로 증가량

                int srcRow = 0; //소스의 세로줄의 위치
                int srcp = 0; //소스의 위치
                int dstp = 0; //타겟의 위치

                for(i=0; i<new_height; i++){ //세로로 한줄씩 

                        while(pos_h >= value){
                                srcp = srcRow*width;
                                srcRow++;
                                pos_h -= value;
                        }

                        dstp = i*new_width; //복사될 이미지의 줄 단위의 시작 점

                        //한줄 복사
                        int pixel = 0; //픽셀 값
                        pos_w = value;
                        for(j=0; j<new_width; j++){

                                while(pos_w >= value){
                                        pixel = pixels[srcp];
                                        srcp++;
                                        pos_w -= value;
                                }

                                new_pixels[dstp] = pixel;
                                dstp++;
                                pos_w += inc_w;
                        }

                        pos_h += inc_h;
                }
        }
}

사용 예제

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*; 
import javax.imageio.*;

public class ImageScale{

        public static void main(String args[]){
                float quality = 0.7f;

                if(args.length < 2){
                        System.out.println("Usage>java ImageScale input.jpg output.jpg [quality]");
                        return;
                }

                if(args.length > 2){
                        try{
                                quality = Float.parseFloat(args[2]);
                                if(quality >= 1 && quality <=0) throw new Exception("Quality Range is 0 ~ 1");
                        }catch(Exception ex){
                                System.out.println("Quality Range is 0 ~ 1");
                                quality = 0.7f;
                        }
                }

                try{
                        Image image = ImageIO.read(new File(args[0]));
                        BufferedImage bi = ImageProcessor.scaling(image, 300, 300);
                        ImageProcessor.saveJpeg(args[1], bi, quality);
                }catch(Exception e){
                        System.out.println("Error" + e);
                }
        }

}
출처 : http://www.tvnuri.com/wikix/index.php?display=Java%20%2D%20%C0%CC%B9%CC%C1%F6%20%BB%E7%C0%CC%C1%EE%20%BA%AF%B0%E6%20%C8%C4%20%C0%FA%C0%E5%C7%CF%B1%E2

Posted by 톰켓 Trackback 0 Comment 0

포털 게시판 통한 악성코드 유포 확인 
  
(서울=연합뉴스) 조성흠 기자 = 포털 사이트 게시판이 악성코드 유포 경로로 악용될 수 있다는 사실이 확인돼 주의가 요구된다.

18일 관련 업계에 따르면 최근 한 누리꾼이 중국 사이트에서 구한 신종 XSS(크로스사이트스크립팅) 스크립트를 다수의 네이버 카페 게시판에 올려 이를 실행시키는 데 성공했다.

XSS는 인터넷 상에서 악성코드를 유포하거나 컴퓨터 실행기록인 쿠키파일을 빼낼 때 사용되는 흔한 해킹 기법이다.

 

이용자가 이 XSS 스크립트가 심어진 게시물을 클릭하면 자신도 모르는 새 악성코드에 감염되거나 쿠키파일이 해커에게 넘어갈 수 있다.

특히 쿠키파일에는 이용자 아이디와 비밀정보가 포함돼 있는 경우가 많아 개인정보 유출의 위험이 큰 것이 사실이다.

 

암호화가 된 경우라도 간단한 조작을 거치면 원래 정보를 알아낼 수 있고 이를 위한 별도의 프로그램 또한 인터넷 상에서 쉽게 구할 수 있다.

실제로 이 누리꾼은 이를 이용해 자신이 만든 팝업창을 이용자의 컴퓨터에 띄우는 데 성공한 것으로 알려졌다. 네이버가 꾸준히 이들 XSS 스크립트에 대한 필터링을 하고 있지만 이 누리꾼은 신종 스크립트의 경우 방어시스템이 업데이트 되는데 시간이 걸리는 점을 악용한 것이다.

 

누리꾼의 제보를 받은 네이버는 해당 스크립트를 방어시스템에 업데이트하고 추가로 게시되지 못하도록 차단했다.

보안 업계에서는 네이버뿐만 아니라 국내외 모든 인터넷 게시판이 이 같은 취약점을 갖고 있다고 지적했다. 새로 발견된 XSS 스크립트를 꾸준히 방어시스템에 업데이트 하더라도 해커가 이를 다시 조작하면 손쉽게 시스템을 피해갈 수 있기 때문이다.

 

한 보안 전문가는 "이번 사례는 해커 개인의 개별 이용자에 대한 공격으로, 시스템 자체에 대한 해킹과는 전혀 별개의 사안"이라며 "업체들이 시스템적으로 이 같은 사례를 막기 위해 꾸준히 노력한다 해도 근본적으로 인터넷 게시판 서비스가 갖고 있는 한계가 있다"고 말했다.

그는 또한 "개인 이용자들이 경각심을 갖고 백신프로그램을 사용하는 등 보안수칙을 준수하는 것이 중요하다"고 덧붙였다.

josh@yna.co.kr

 

 

 

 

* 크로스 사이트 스크립트란 ?

 

공격자가 보낸 코드를, 그 페이지를 열람한 다른 유저에게 스크립트로 실행시키는 것이 「크로스 사이트 스크립팅(XSS라고 생략해서 쓰기도 있다 )」아다. 유저의 입력 데이터를 표시하는 형식으로 되어 있는 게시판과 같은 Web어플리케이션에서 발생하기 쉬운 취약성이다.

  Web어플리케이션에서 입력 데이터의 충분한 검증이 이루어지지 않을 때, 공격자는 악의가 있는 코드를 다른 유저가 열람하는 장소에 배치할 수가 있다. 그 페이지를 열람한 다른 유저는, 그 스크립트를 신뢰할 수 있는 것인지 아닌지를 판단할 방법이 없기 때문에 그대로 실행해 버린다. 그 결과 간단하게 그 유저가 사이트내에서 사용하고 있었던 Cookie나 세션 정보를 훔칠 수 있다.

  이 공격은 성질상, 광범위하게 퍼지기 쉽다. 게시판 사이트 등 자신이 기입한HTML을 다른 사람이 열람할 수 있는 사이트를 이용해 크로스 사이트 스크립팅을 걸 수가 있다. 다음 폼은 열람자에게 다이얼로그 박스를 표시해주기 위한 스크립트이다.

그림5 열람자에게 다이알로그 박스를 표시해주는 스크립트


  이렇게 기입한 후 사이트에 스크립트의 실행을 허가하는 브라우저로 액세스하면, 다음과 같은 다이얼로그가 표시된다..

 이 예에서는 단순한 다이알로그 박스 표시의 스크립트이지만, 이 형식을 응용해서 공격자가 준비한 Web사이트에 액세스 시켜 Cookie 송신등을 실행시킬 수가 있다.

  어플리케이션쪽에서 크로스 사이트 스크립팅을 방어하려면, 송신된 리퀘스트의 sanitizing이 효과적이다. sanitizing은 어떤 환경에서 제어 문자을 제어 문자가 아닌 단순한 문자로서 취급하게 하는 것이다. 위의 경우에서는 송신된 내용을 서버에 기입하기 전, 혹은 리스펀스 데이터를 돌려줄 때에 「<」를 「&lt;, 「>」를 「&gt;」으로 변환해 버리면 스크립트는 실행되지 않는다. 그리고 기호같이 사용할 수 있는 문자의 종류를 제한해 버리는 것도 효과적인 대처법이 될 수 있다.

 

이번에는 XSS공격에 대하여 몇자 적어 봅니다.

 

Cross Site Scripting 웹사이트에 접속한 사용자가 공격의 대상이 되는 기법으로, 사용자의 입력 값에 악의적인 Javascript code 삽입하여 페이지를 로드 함으로 현재 페이지를 열람하는 사용자에게 스크립트를 실행시키도록 하는 것입니다. 그러므로 사용자의 입력을 받는 모든 사이트에서 XSS공격이 일어날 가능성이 있습니다. 특히 다음과 같은 상황에서 자주 발생합니다.

 

1.     검색할 단어를 입력하는 Input 영역에서 검색단어를 입력한 , 검색 결과와 함께 입력한 검색 키워드를 다시 보여주는 경우

2.     사용자 입력 폼에 입력한 내용들을 다시 출력하는 경우

3.    게시판에서 내용들을 열람하는 경우

 

 

공격자는 XSS 통해서 사용자의 쿠키를 변경하거나 탈취할 있으며 정상적인 사용자에 대해서 잘못된 정보를 보내줄 수도 있습니다. 이러한 XSS 최근 Phishing기법에 많이 사용되는데 악의적인 사용자가 변조된 입력 폼을 제공함으로 다른 사용자의 정보가 노출되고 있습니다. 또한 자바 스크립트 코드뿐만 아니라 object들을 사용자의 브라우저상에서 실행시킴으로 광고팝업이나 브라우저를 변조할 있습니다.

 

 

XSS 공격을 방어하는 가장 좋은 방법은 어플리케이션이 모든 header , cookie, query string, form field, hidden field (예를 들면, 모든 parameter ) 대해 유효성 검사를 실시하는 것입니다. 사용자의 입력이 화면에 출력되어 나오는 경우, 사용자의 입력 값을 HTML Entity 변환시켜야만 합니다. 또한 위의 태그들을 HTML으로 인식시키지 않기 위해 스크립트에서는 함수를 지원합니다. 그리고 공개 게시판의 경우, HTML 형식을 지원하는 경우 XSS 잠재적인 위험성이 존재하므로, 이를 중지할 필요가 있습니다.

 

 

기본 대책

 

(1)          ASP Script

사용자의 입력에 대해 Server.HTMLEncode함수를 사용하여 HTML태그를 비활성화 시킵니다.

 

Server.HTMLEncode함수를 사용하여 HTML태그를 변환합니다.

<%= Server.HTMLEncode(<script>alert(XSS Test);<script>) %>

위의 결과 tag들이 비활성화 됩니다.

 

(2)          JSP Script

HTML코드의 시작을 알리는 < 대해서 &lt; 으로 변환시키는 방법입니다.

 

/% less than (<) character &lt; 으로 변환시킵니다. %/

String userInput = request.getParameter(keyword);

user_input = user_input.replaceAll(“’”, \’”);

 

(3)          PHP Script

PHP 내장함수 가운데 입력 문자열에 대해서 HTML코드를 변환시켜주는 htmlentities() 사용하여 XSS 막습니다.

 

<?

$str = "A 'quote' is <b>bold</b>";

echo htmlentities($str);

// 출력: A 'quote' is &lt;b&gt;bold&lt;/b&gt;

?>

 

 

이것또한 간단 하게 기본적인 부분만 처리 해주어도 상당부분 방어가 가능합니다.

조금 귀찮더라도 이정도 처리는 해주어야 하지 않을까 합니다. 

Posted by 톰켓 Trackback 0 Comment 0
JAVA 1.3 버전에서는 String.replace를 지원하지 않습니다.
그것을 대용하기 위하여 
Stringtokenizer을 이용하여
만든것입니다.

       String strRepString = "";
       StringTokenizer sStrTkn;
       sStrTkn = new StringTokenizer(CC_DESC[a], "\r\n");
       while(sStrTkn.hasMoreTokens())
       {
        strRepString = strRepString + sStrTkn.nextToken();
        if(sStrTkn.hasMoreTokens())
        {
         strRepString = strRepString + "<br>";
        }
       } 
Posted by 톰켓 Trackback 0 Comment 0
Stringbuffer초기화를 할려면

  StringBuffer sb = new StringBuffer();


sb.append("aaaa");

이렇게 변수를 만들어 사용을 하다가
초기화를 해야 할 경우에는
sb.setLength(0);
을 사용하면 초기화가 된다.

Posted by 톰켓 Trackback 0 Comment 2
      int tokensize=0;
      StringTokenizer st = new StringTokenizer(DISP_NAME[a],"@");
      tokensize=st.countTokens();
Posted by 톰켓 Trackback 0 Comment 0

import java.awt.*;
import java.awt.event.*;

public class Calculator extends Frame implements ActionListener
{

 //Variables
 private Button keysArray[];
 private Panel keyPad;
 private TextField lcdScreen;
 private double result;
 private boolean first;
 private boolean foundKey;
 static boolean clearText;
 private int prevOperator;

 //Constructor
 public Calculator()
 {
  lcdScreen = new TextField(20); //display for values
  keyPad = new Panel();          //container for buttons
  keysArray = new Button[16];    //calculator buttons
  result = 0.0;                  //holds result
  prevOperator = 0;              //last operator button pushed
  first = true;                  //
  clearText = true;              //


  //Set frame layout manager
  setLayout(new BorderLayout());

  lcdScreen.setEditable(false);  //user can't enter text


  //Create Buttons
  for (int i = 0; i <= 9; i++)
  {
   //set each button label to the value of index
   keysArray[i] = new Button(String.valueOf(i));
  }


  //create operator buttons
  keysArray[10] = new Button("/");
  keysArray[11] = new Button("*");
  keysArray[12] = new Button("-");
  keysArray[13] = new Button("+");
  keysArray[14] = new Button("=");
  keysArray[15] = new Button(".");


  //Set panel layout manager for a 4 by 4 grid
  keyPad.setLayout(new GridLayout(4,4));

  //Add buttons to keypad panel starting at top left

  //First row
  for( int i = 7; i <= 10; i++)
  {
   //adds buttons 7,8,9 and /
   keyPad.add(keysArray[i]);
  }


  //Second row
  for( int i = 4; i <= 6; i++)
  {
   //adds buttons 4,5,6
   keyPad.add(keysArray[i]);
  }
  //adds *
  keyPad.add(keysArray[11]);


  //Third row
  for( int i = 1; i <= 3; i++)
  {
   //adds buttons 1,2,3
   keyPad.add(keysArray[i]);
  }

  //adds -
  keyPad.add(keysArray[12]);

  //Fourth Row
  //adds 0
  keyPad.add(keysArray[0]);

  for( int i = 15; i >= 13; i--)
  {
   //adds buttons .,=,+
   keyPad.add(keysArray[i]);
  }


  //add to frame
  //add text field to top
  add(lcdScreen, BorderLayout.NORTH);
  //add panel to center
  add(keyPad, BorderLayout.CENTER);

  //activate ActionListener
  for ( int i = 0; i < keysArray.length; i++)
  {
   keysArray[i].addActionListener(this);
  }


  //add WindowListener for closing frame and ending program
  addWindowListener(
    new WindowAdapter()
    {
     public void windowClosing(WindowEvent e)
     {
      System.exit(0);
     }
    }
  );
 }


 //code action
 public void actionPerformed(ActionEvent e)
 {
  //in case no button was pushed
  foundKey = false;

  //Search for the button pressed till end of array or key found
  for ( int i = 0; (i < keysArray.length) && !foundKey; i++)
  {

   if(e.getSource() == keysArray[i])
   {
    //keymatch found
    foundKey = true;
    switch(i)
    {
    case 0: //number 0
    case 1:
    case 2:
    case 3:
    case 4:  //thru
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:  //number 9
    case 15: //decimal point

     //if this is first button pushed
     if(clearText)
     {
      lcdScreen.setText("");
      clearText = false;
     }

     //add the button selected to what was in the display
     lcdScreen.setText(lcdScreen.getText() + keysArray[i].getLabel());
     break;

     //check for operators
    case 10: //divide button
    case 11: //multiply button
    case 12: //minus button
    case 13: //plus button
    case 14: //equal button

     //set to clear display
     clearText = true;

     if (first) //first operand
     {
      if(lcdScreen.getText().length() == 0)
       //if there is nothing in the display
       result = 0.0;
      else

       result = Double.valueOf(lcdScreen.getText()).doubleValue();


      first = false;
      prevOperator = i; //save operator index value
     }


     else //second operand entered, calculate total
     {
      switch(prevOperator)
      {
      case 10: //divide button
       result /= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 11: //multiply button
       result *= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 12: //minus button
       result -= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 13: //plus button
       result += Double.valueOf(lcdScreen.getText()).doubleValue();
       break;
      }

      //write answer to display
      lcdScreen.setText(Double.toString(result));


      if (i == 14) //equal button
       first = true;
      else
       prevOperator = i; //save previous operator
     }
     break;
    }
   }
  }
 }


 public static void main(String args[])
 {
  System.out.println("Starting Calculator...");
  Calculator calcFrame = new Calculator();

  //Set frame attributes
  calcFrame.setBounds(100,100,200,200);
  calcFrame.setTitle("Calculator");
  calcFrame.setVisible(true);
 }


}

Posted by 톰켓 Trackback 1 Comment 0

JAVA 설치

2008.04.03 22:58 : Job Story/JAVA

Java 설치준비 ①

① JDK

    - Java Development Kit

    - 자바 애플릿이나 각종 응용 프로그램(어플리케이션)을 개발자들이 쉽게 만들 수 있도록

       해주는 개발자용 도구.

    - 여러 운영체제 및 응용 프로그램(어플리케이션)과 연결시킬 수 있는 자바 응용 프로그램

      인터페이스(API)와 클래스 라이브러리, 자바 가상 머신 등을 포함.

    - 자바를 사용해서 자바 응용 프로그램을 개발할 수 있도록 해주는 도구입니다. 

    - 자바 파일을 컴파일할 수 있는 컴파일러를 포함한 부분

② JRE

    - Java Runtime Environment

    - 컴파일된 자바 프로그램을 실행할 수 있도록 해주는 환경.

    - 자바 언어로 개발된 소프트웨어를 실행하기 위해 필요한 플랫폼.

    - 자바를 이용해 개발된 소프트웨어는 어떤 플랫폼으로부터도 독립적인 형식

       (자바 바이트 코드)으로 배포되지만, 이것을 실행하려면 그 플랫폼을 해석할 수 있는 형식

       (native code)으로 변환해야 한다. 즉, 자바 실행 환경(JRE)은 이 변환과 실행을 행하는

       자바 가상 머신과 그 주변의 소프트웨어이다.

 

다운로드 - http://java.sun.com/javase/downloads/?intcmp=1281 

실행 - jdk-6u4-windows-i586-p.exe

 

Posted by 톰켓 Trackback 0 Comment 0


티스토리 툴바