'허니몬의 IT 이야기/프로그래머, '코드 엔지니어''에 해당되는 글 99건

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
관련 내용 : http://java.sun.com/developer/media/deepdivejdk7.jsp



JDK 7 버전이 릴리즈 된지 얼마 되지 않았다.

Host: Ed Ort, Senior Staff Information Engineer, Sun Microsystems
Guest: Danny Coward, Chief Architect for Client Software at Sun Microsystems

두 사람이 나누는 대담을 통해 JDK 7 에 깊이 빠져들어가보자.


JDK 7 : Top 5 New Features

#1 : Modularity
#2 : Multi-Language
#3 : New Garbage Collectors
#4 : Nio.2 File System APIs
#5 : Swing API Additions

#1 : Modularity
// Declaring that a class belongs to a module:
module M;
package P;

public class Foo {...}

//Defining a module in a module-info.java file

module M @1.0 {
requires N @2.1;
requires L @0.5;
}
Java SE 7 : Project Jigsaw
  • Low Level Modularity System in JDK 7
  • Breaking Up the JDK 7 Code
  • Packaging Format
  • Uses Java Language Modularity(JSR 294) // ㅡㅅ-);; JSR 은 뭐지?
http://openjdk.java.net/projects/jigsaw
http://jcp.org/en/jsr/detail?id=294

아래에 나오는 내용은 "Coin Project"란다.


String animal ="...";
   
    if ( animal.equals("dog")) {
        takeForWalk(animal);
    } else if ( animal.equals("cat")) {
        leaveMilkFor(animal);
    } else if ( animal.equals("mouse")) {
        cleanCageFor(animal);
    } else {
        leaveOutside(animal);
    }
※  JDK 7 에서는 switch 에서 case에 char 타입 이외에 String 타입도 사용이 가능하게 됩니다. 조건문이 쉬워지는군요.
    String animal = "...";
   
    switch(animal) {
    case "dog" : takeForWalk(animal);
    case "cat" : leaveMilkFor(animal);
    case "dog" : cleanCageFor(animal);
    default : leaveOutside(animal);
    }

※ Exception 처리
try {
        doWork(file);
    } catch ( IOException ioe ) {
        logger.log(ioe);
        throws ioe;
    } catch ( SQLException sqle ) {
        logger.log(sqle);
        throws sqle;
    }
  JDK 7 에서는 이렇게 가능하다. Ed Ort 씨 처럼 Ah~~ha~~!!
try {
        doWork(file);
    } catch ( final IOException | SQLException ex ) {
        logger.log(ex);
        throws ex;
    }

※ 다음은 Genericㄴ 사용법 : 아직 본인은 generics 사용법에 대해서 익숙하지 못하다. ㅡㅅ-);;;
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
JDK 7 에서는 이렇게 된다고 한다. ㅡㅅ-)b
Map<String, List<String>> anagrams = new HashMap<>();

※ 다음은 Operator
Object anObject;
    ...
    if (anObject == null ) {
        s = "nothing";
    } else {
        s = anObject.toString();
    }
   
    int i;
    ...
    if ( anInteger == null ) {
        i = -1;
    } else {
        i = anIntegerr;
    }
JDK 7 에서는 이렇게 바뀐다고 한다. " ?:  " 요놈인 건데... ㅡㅅ-)> 요건 뭐가 좋은거지? ?: == null 인건가?
   String s = anObject?.toString() ?: "nothing";
    int i = anInteger ?:-1;


#2 : Multi-Language  : supporting non-Java languages at the VM level
JVM에서의 실행속도를 높인다는 건가? Bytecode를 역동적으로!? 메소드 핸들러를 가볍게!? 최적화를 변동적으로?
Broadening the JVM to Accelerate Runtimes
  • Bytecode for Dynamic Invocation
  • Lightweight Method Handles
  • A Variety Of Other Possible Optimizations
JRuby is the Pioneer
The DaVinci Project
http://openjdk.java.net/projects/mlvm

#3 : New Garbage Collectors - Garbage First,
Predictably Low Pauses + Few Full Garbage Collectors + Good Throughput
Greate for a Wide Variety of Application

#4 : Nio.2 File System APIs
DirectorySearchOperations 라는 클래스가 추가된 듯 하다. 자바로 새로운 파일 시스템을 사용해볼 기회가 있었어야 말이지..ㅡㅅ-);; 흠...
  • New Filesystem API File Notifications Directory Operations
  • Asynchronous I/O

#5 : Swing API Additions
  Java의 Swing API에 대한 불만은 여전히 있었고, ㅡㅅ-);; 추가되었다는 내용을 봐도 불만은 여전히 유지가 될 것 같다. 사용자가 필요에 따라서 자신이 디자인한 부분에 대해서 적용할 수 있도록 해주면 좋지 않을까? ㅡㅅ-)~ 현재 나는 조용히 쓰라는 대로 써야지. ㅎㅎ.
JSR 296 : Swing Application Framework
http://jcp.org/en/jsr/detail?id=296

JDK 7 과 관련된 홈페이지(MileStone)
JDK 7 Milestones Homepage
http://openjdk.java.net/projects/jdk7/milestones/
openJDK Project Homepage
http://openjdk.java.net/project/jdk7/
JDK 7 Project Homepage
https://jdk7.dev.java.net/
The Planetarium Blog
http://blogs.sun.com/theplanetarium/

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
링크 : http://java.sun.com/docs/books/tutorial/index.html

사용자 삽입 이미지

영문으로 되어있기는 하지만, 자바에 대한 기본적인 개념을 깨우치기에 매우 좋은 사이트인 것 같다. 자바를 배우기 시작한지 5개월이 지난 뒤에서야, 이 사이트의 가치에 조금 눈을 뜨게 된 것 같다.

현재 Java SE 는 SDK 6 버전의  16 번째 업데이트 버전 까지 나와있는 상황이며, 새로운 기술인 JavaFX와 관련된 부분에 대한 개발이 한창인 것으로 보인다. 자바 어플리케이션 스토어인 warehouse 도 곧 오픈한다고 한다.

● 이와 관련한 글들도 올라와 있다.
= 관련페이지 링크 : http://java.sun.com/warehouse/
= warehose 에 대한 동영상 설명 : http://channelsun.sun.com/video/java+warehouse+-+part+1+of+3/30631799001
오늘 12:00~ 12:20 사이에 오픈한다고 한다. Java Store beta 라고 하네.

내가 만든 프로그램을 JAR로 만들어서 배포하는 것에 대한 글도 조만간 올려야겠다.
ㅡㅅ-);; 난 그저 맛만보는 프로그래머...이기 때문에... ㅎㅎ 깊게는 못들어간다.

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
사용자 삽입 이미지

FreemindMap 프로그램을 이용해서 이번 발표에서 시나리오를 간단하게 구성해보았습니다. FreeWare 니까 필요하신 분은 받아가세요. ^^ 용량은 그리 크지 않으며, 자바를 기반으로 실행됩니다. 몇번 사용하다보시면 익숙해지실 겁니다. 사실... 저도 아직 이 프로그램을 능숙하게 다룬다고 할 수는 없을 듯 합니다. 하지만, 무언가를 기획하고 떠올릴 때에는 충분히 그 효과를 보여줍니다. ^^
발표순서는 오른쪽 상단부터 기승전결의 순서로 진행을 하려고 합니다. ^^
발표와 관련된 파워포인트는 다른 팀원이 준비를 하고 있습니다. ^^; 제가 준비를 하면 워낙에 대충대충 준비를 하는 탓에 걱정이 되는지 자신이 하겠다고 먼저 나서주더군요. 발표는 제가 하게 되었고, 아마도 처음으로 발표를 하게 되지 않을까 하고 생각을 해봅니다.

  내일은 위의 마인드맵을 기본으로 해서 대본을 짜야겠군요. ^^; 대본짜고, 시연자와 호흡을 맞추는 작업도 해야할 것 같습니다. 내일은 ㅡㅅ-)> 파워포인트와 시나리오를 가지고 발표를 하게 되겠군요.

  이제 교육과정이 끝나가는 것이 실감이 납니다. ^^; 취업준비도 해야하는데...
저에게 맞는 좋은 곳으로 갈 수 있을지 약간 걱정도 되는군요.
^^;; 반년 넘게 취업준비생 생활을 하다보니, 사회생활 감도 많이 퇴색된듯 해요.

발표가 끝난 후에는 프로젝트 과정에서 생성된 문서들을 정리를 해서 스프링노트에 올려두어서 팀원들 취업 포트폴리오로 사용할 수 있도록 해둬야겠습니다. ^^
허니몬의 IT 이야기/프로그래머, '코드 엔지니어'

기본적인 암호화 처리를 해주는 메소드를 살짝 변경하였습니다.  암호화키를 저장해주지 못하기 때문에 별도의 페이지에서는 사용이 어려웠음.

 

필요하시면, 가져다 쓰셔도 됩니다. ^^ 암호화된 코드에다가 자기만의 암호화 처리 방법을 넣어서 해주시면 좋습니다. +_+)b

returnEncryptCode(String str)  메소드는 입력받은 문자열을 암호화 한 다음, 암호화에 사용한 암호키와 암호화된 문자열을 합쳐서 반환합니다.
public String returnDecryptCode(String str)  메소드는 returnEncryptCode(String str) 메소드에서 처리한 암호화된 코드를 받으면, 특정 부분에서 잘라서 암호키를 키로 생성하고, 암호화된 코드를 넣어서 해독하여 해독된 문자열을 반환합니다.

 

JSP에서 처리할 경우에는 returnEncryptCode(String str)에서 반환된 문자열을 저장하는 문자열 혹은 객체를 저장하는 방법만 고려하면 되겠다.

 

  1. package encrypt;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.security.InvalidKeyException;
    import java.security.Key;

    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;

    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
     
    public class LocalEncrypter{
        //DESede 는 암호화시 사용되는 최대 키 사이즈를 지정하는 키워드임 : 관련페이지 내용 링크
  2.     private static String algorithm = "DESede";
        private static Key    key       = null;
        private static Cipher cipher    = null;
     
       
        // 암호화 키를 발생시키는 메소드입니다.
        // com.sun.crypto.provider.DESedeKey@ + 16진수 8자리
        public LocalEncrypter() throws Exception {
            key = KeyGenerator.getInstance( algorithm ).generateKey();
           
    //        private static String keystr = String.valueOf(key);
    //        System.out.println(key);
    //        System.out.println("암호화 키의 형태 :"+ keystr);
    //        System.out.println(keystr.length());
           
            cipher = Cipher.getInstance( algorithm );   
        }
       
       
        //1. str 을 입력 받아서 이를 암호한다.    //2. 암호화 하는데 사용한 암호키를 encKey 로 문자열화 한다.
        //3. encKey + str 값을 반환한다. 크기는 408 byte
        public  static String returnEncryptCode(String str) throws Exception {
            byte [] encryptionBytes = null;
     

            // 입력받은 문자열을 암호화 하는 부분
            encryptionBytes = encrypt( str );
            BASE64Encoder encoder = new BASE64Encoder();

            //encoder.encode(encryptionBytes) 으로 encrypt 된 값 출력
            String encodeString = encoder.encode(encryptionBytes);
           
            // 키를 문자열로 바꿔주는 곳.
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(key);
            oos.close();
            BASE64Encoder b64enc = new BASE64Encoder();
            byte[] keyArr = bos.toByteArray();
            String encKey = b64enc.encode(keyArr);   
           
    //        System.out.println("문자열이 되어 저장된 키 : " + encKey);
    //        System.out.println("저장된 키의 길이 : " + encKey.length());
    //        System.out.println("암호화된 비밀번호 : " + encodeString);


    /*                // 암호화에 사용된 키값을 뽑아낸 수
             String keycode = keystr.substring(34,42);
             System.out.println("암호화에 사용된 키 : " + keycode);
             String randomcode = returnRandomCode();
             System.out.println("암호화된 코드 : " + encodeString);*/
            
            return encKey + encodeString;
        }

       
        //1. DB에 저장되어 있는 408 byte 길이의 str을 받는다.
        //2. 그중 0~384 까지의 암호화키(encKey)부분을 keycode로 뽑아낸다.
        //3. keycode를 Key에 대입한다.
        //4. 384~408 까지의 암호화된 문자열을 code로 뽑아낸다.
        //5. code를 해독한다.
        //6. 해독된 값을 반환한다.
        public String returnDecryptCode(String str) throws Exception {
            //복호화 하기 위해서는 암호화 키가 필요하다. ㅡㅅ-);;
            // 그래서 생각해낸 것이, DB에 저장될 때, 암호화키를 한번에 집어넣고....
            //substring 으로 잘라서 쓰는 것.
            int strLength = str.length();
           
            //암호화된 비밀번호에 저장되어 있는 암호화키를 추출.
               String keycode = str.substring(0,384);
              
              
               // 추출한 암호키를 KEY 형태로 다시 복구
               BASE64Decoder b64dec = new BASE64Decoder();
               byte[] b = b64dec.decodeBuffer(keycode);
               ByteArrayInputStream bis = new ByteArrayInputStream(b);
               ObjectInputStream ois = new ObjectInputStream(bis);
               key = (Key) ois.readObject();
               ois.close();
              
            String code = str.substring(384, strLength);
           
              
    //        System.out.println("저장된 코드 길이 : " + strLength);
    //           System.out.println("암호화 사용키 : " + keycode);
    //        System.out.println("암호화된 코드: " + code);
           
            BASE64Decoder decoder = new BASE64Decoder();
            String decode = decrypt( decoder.decodeBuffer(code));
           
    //        System.out.println("Ecrypt 에서 해독한 것 : " + decode);
            return decode;
        }
       
     
       
        // encryptionBytes = encrypt( input ), input을 변조하여 encryptionBytes에 대입함.
        private static byte [] encrypt(String input) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException  {
            cipher.init( Cipher.ENCRYPT_MODE, key );
            byte [] inputBytes = input.getBytes();
            return cipher.doFinal( inputBytes );
        }
     
       
       
        //decrypt( decoder.decodeBuffer(encodeString) ) 처리부분.
        private static String decrypt(byte [] encryptionBytes) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException{
            cipher.init( Cipher.DECRYPT_MODE, key);
            byte [] recoveredBytes = cipher.doFinal( encryptionBytes );
            String recovered = new String( recoveredBytes );
            return recovered;
        }
     
    }

이 글은 스프링노트에서 작성되었습니다.

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'

인터넷 검색을 통하여 찾아본 구현 방법들은 서블릿에서 저장된 것들을 처리하는 방법들 뿐이었음.

나름 독자적인(?!) 해석을 통하여 JSP로만 구현하는 방법을 터득했다. 이를 이용할 예정임.

현재 진행중인 프로젝트가 완료되면 특별한 기능이 있을 경우, 기재를 하여 설명드리도록 하겠음.


JFeeChart 구현과 관련된 JAR 파일들

1) jfreechart-1.0.0-pre2.jar

2) jcommon-1.0.0-pre2.jar

메뉴얼 API : http://www.jfree.org/jfreechart/api/javadoc/index.html


  1. <%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
    <%@ page import="java.io.*" %>
    <%@ page import="org.jfree.data.general.DefaultPieDataset"%>
    <%@ page import="org.jfree.chart.JFreeChart"%>
    <%@ page import="org.jfree.chart.plot.PiePlot"%>
    <%@ page import="org.jfree.chart.ChartRenderingInfo"%>
    <%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
    <%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
    <%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
    <%@ page import="org.jfree.chart.ChartFactory"%>
    <%@ page import="org.jfree.chart.ChartUtilities"%>
    <%@ page import="org.jfree.data.general.PieDataset"%>
    <%@ page import="org.jfree.data.category.DefaultCategoryDataset"%>
    <%@ page import="org.jfree.chart.plot.PlotOrientation"%>
    <%@ page import="org.jfree.chart.servlet.*"%>
    <%@ page import="com.oreilly.servlet.*" %>
    <%@ page import="com.oreilly.servlet.multipart.*" %>


    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>JChart 연습하기</title>
    </head>
    <body>
       <%
           DefaultPieDataset ds = new DefaultPieDataset();
           ds.setValue("홍길동", new Double(40.0));
           ds.setValue("홍길숙", new Double(25.0));
           ds.setValue("기타", new Double(15.0));
          
           JFreeChart chart = ChartFactory.createPieChart("득점분포", ds, true, true, false);
           chart.setBackgroundPaint(java.awt.Color.white);
            chart.setTitle("JChart 연습하기");
            
            ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
          
            
           //PNG 파일명을 만들어내기
            String fileName = ServletUtilities.saveChartAsPNG(chart, 600, 300, info, session);           
          
            System.out.println("파일명 : " +fileName);
            
           //특정 임시 폴더에 이미지 파일을 만들어냄.
            String dir = application.getRealPath("/upload/"); // 파일경로 지정
            dir = "D:\\" + dir.substring(3) + "/";
            String filepath = dir + fileName;
            //System.out.println("File path = "+ filepath);
     
            FileOutputStream fos = new FileOutputStream(new File(filepath));
            File f = new File(filepath);
            ChartUtilities.writeChartAsPNG(fos, chart, 600, 300);
            
            String graphURL = request.getContextPath() + "/upload/" + fileName;
            //System.out.println(graphURL);
           %>
           <img src="<%=graphURL%>"/> <!--//파일 경로와 파일명을 받아서 차트를 보여줌-->

    </body>
    </html>

● 파일명 : jfreechart-2348981821190451270.png (파일명은 ServletUtilities.saveChartAsPNG(chart, 600, 300, info, session); 에 의해서 임의 지정됨)
● File path = D:\workspace\project\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WomanHappy\upload/jfreechart-2348981821190451270.png  // 웹 서버에 저장된 실제 주소
● /WomanHappy/upload/jfreechart-2348981821190451270.png // 서버에 저장된 주소

JFreeChart.JPG <결과물>

이 글은 스프링노트에서 작성되었습니다.

1 ··· 12 13 14 15 16 17 18 ··· 20
블로그 이미지

Email : ihoneymon@gmail.com 안녕하세요, 꿀괴물 입니다. ^^ 멋진 비행을 준비 하는 블로그 입니다. 만능형 인간이 되어 많은 이들에게 인정받고, 즐겁고 행복하게 살기를 간절히 원합니다!! 달콤살벌한 꿀괴물의 좌충우돌 파란만장한 여정을 지켜봐주세요!! ^^

허니몬