잡탕1 - IT2014. 3. 27. 23:27
intro.
프로그래밍은 일종의 창작이다. 주어진 언어의 Spec 을 바탕으로 하고 사용자가 원하는 프로그램을 만들어 내는 것이다. 그런 프로그래밍에 가장 필요한건 무엇일까? 물론 언어의 이해정도가 가장 크겠지만 그런 기본기를 갖춘 프로급 위치에서는 프로그램 설계에 구현되는 논리, 방법, 구성 등이 더욱 중요한 지표가 된다
그 동안 여러 권의 자바 관련 책들을 보아 왔지만 자바 언어의 기초에 관련된 책들만 본 것 같다. 중급으로 가는길.. 그 방법은 앞서 언급한 사고력에 바탕을 둔 창작성이지 않을까?
그런 중 '생각하는 프로그래밍' 이란 책을 알게되었고 프로그래밍에 있어서 기초에서 벗어나는 통찰과 창조의 영역을 공부하고 싶었다. 사실상 필연이라고 봐도 될 듯 하다. 그런 지식에 대한 갈망이 이 책을 찾게 되는 이유일지도 모르겠다




column1은 데이터 정렬에 관한 문제이다
문제는 다음과 같다
입력 : 최대 n개의 양의 정수를 포함하는 파일로, 각 숫자는 n보다 작고, n=10^7 이다
어떤 숫자가 두 번 이상 나오는 것은 치명적 에러이다
정수 이외에 관련된 데이터는 없다

출력 : 입력된 정수를 오름차순으로 정렬한 리스트

제약조건 : 메모리를 많아야 대략 1MB 정도 사용할 수 있고, 디스크 공간은 충분하다
실행시간은 최대 몇 분 정도가 될 수 있고, 10초 정도 안에 작업을 끝낼 수 있으면 충분하다

일반적인 데이터 정렬로는 해당 숫자의 크기(bit)가 크고 처리해야할 데이터 수가 많기 때문에 주어진 메모리로는 40번 작업을 해서 정렬해야 한다. 하지만 책에 소개되어진 bitmap 구조를 이용하여 원하는 정렬을 구현한다. 비트맵 데이터 구조는 원소가 중복되지 않고 원소와 관련된 다른 데이터도 없는 촘촘한 유한 집합 이라는 특성을 이용하여 정렬한 것이다

1. 7자리의 중복되지 않는 양의 정수는 999,999 보다 크고 10,000,000 보다 작은 숫자이다
1,000,000 ~ 9,999,999 까지의 숫자 범위가 주어진 양의 정수의 범위가 된다

2. 10,000,000 자리의 2진수를 만든다고 생각한다면 그 자리에 대한 index 값을 이용하여 해당 자리에 값의 유무만 판단하게 되면(중복되지 않으므로) 일정 범위에서 값의 유무를 판단하고 정렬되어진(숫자의 index 이므로) 2진수를 구할 수 있다. 값이 있는 인덱스를 순서대로 취하면 그 인덱스가 원하는 값이 된다

3. 구현한 Java 코드
- 7자리 중복되지 않는 양의 정수 1,000,000개 만들기 ( Number.java )
// 7자리 양의 정수 랜덤 생성
import java.io.*;
import java.util.*; 

public class Number { 
    public static void main(String[] args) { 

        int k = 1000000; // 만들 숫자 갯수 
        int n = 7; // 몇자리 세팅 

        BitSet bitSet = new BitSet(k); // 정렬을 위한 비트셋 
        bitSet.clear(); // 비트셋 초기화 false 세팅 

        int kn = (int)((Math.pow(10,n)-1)-(Math.pow(10,n-1)-1)); 
        // 자리수에 맞는 범위값, Math.pow : 제곱 구하기 

        try { 
            File file = new File("randomNumber.txt"); 
            BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 

            int l = 0; 
            while ( l < k ) { 
                int m = (int)(Math.random()*kn+(Math.pow(10,n-1))); 
                if ( !bitSet.get(m) ) { 
                    bitSet.set( m, true ); 
                    writer.write(Integer.toString(m)); 
                    writer.newLine(); 
                    l++; 
                } 
            } 

            writer.close(); 
        } catch (IOException ex) { ex.printStackTrace(); } 
    } 
}
randomNumber.txt 라는 텍스트 파일로 7자리 양의 정수 1,000,000 개가 출력된다


- BitSet 클래스를 이용한 1,000,000개 데이터 정렬 ( BitmapSort.java )
import java.io.*;
import java.util.*;

public class BitmapSort {
    public static void main(String[] args) {

        int[] num = new int[1000000]; // 데이터를 넣을 배열 생성

        BitSet bitSet = new BitSet(10000000); // 정렬을 위한 비트셋
        bitSet.clear(); // 비트셋 초기화 false 세팅

        try {
        File myFile = new File("randomNumber.txt");
        BufferedReader reader = new BufferedReader(new FileReader(myFile));
        // 데이터 파일 읽기

        int j=0;
        String line = null;

        while ( (line = reader.readLine()) != null ) {
            StringTokenizer tokenizer = new StringTokenizer(line);
            num[j] = Integer.parseInt (tokenizer.nextToken() );

            bitSet.set(num[j], true);
            // num[j] 의 값이 bitSet 의 인덱스로

            j++;
        }
        reader.close();


        File file = new File("sortedNumber.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        // 파일 출력

        for ( int k=0 ; k<bitSet.length() ; k++ ) {
            if ( bitSet.get(k) ) { // bitSet 값이 true 일때만 파일에 쓰기
                writer.write(Integer.toString(k));
            writer.newLine();
            }
        }
        writer.close();
        } catch (IOException ex) { ex.printStackTrace(); }
    }
}
데이터 파일인 randomNumber.txt 파일을 읽고, 정렬한 데이터를 sortedNumber.txt 로 출력한다


Posted by pearl짓거리전문
잡탕1 - IT2012. 9. 16. 18:03

선잡설

만들고자 하는것이 갤러리 홈페이지다 보니 이미지의 썸네일 이미지도 쿼리티가 무척이나 중요하다.

php로 구현된것은 제로보드등 여러곳에서 볼 수 있지만 java 로 된건 별로 보지 못했다.





본잡설

1. JPEGImageEncoder 를 이용한 리사이즈

public static void createThumbnail(String soruce, String target, int targetW) throws Exception 

    Image imgSource = new ImageIcon(soruce).getImage(); 


    int oldW = imgSource.getWidth(null); 

    int oldH = imgSource.getHeight(null); 


    int newW = targetW; 

    int newH = (targetW * oldH) / oldW; 


    //Image imgTarget = imgSource.getScaledInstance(newW, newH, Image.SCALE_AREA_AVERAGING); 

Image imgTarget = imgSource.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); 

    

    int pixels[] = new int[newW * newH]; 


    PixelGrabber pg = new PixelGrabber(imgTarget, 0, 0, newW, newH, pixels, 0, newW); 

    pg.grabPixels(); 


    BufferedImage bi = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_RGB); 

    bi.setRGB(0, 0, newW, newH, pixels, 0, newW); 


    FileOutputStream fos = new FileOutputStream(target); 


    JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos); 


    JPEGEncodeParam jep = jpeg.getDefaultJPEGEncodeParam(bi); 

    jep.setQuality(1, true); 


    jpeg.encode(bi, jep); 


    fos.close(); 

}

(출처:http://www.ibm.com/developerworks/kr/library/j-jspdwj/index.html#N1015A 

        http://blog.naver.com/PostView.nhn?blogId=j79sw&logNo=110037089984&redirect=Dlog&widgetTypeCall=true )


음.. 나름 깔끔하다. JAI 로 한방 리사이즈보단 이미지가 괜찮다.

중간에 주석이 있는 부분 getScaledInstance() 메소드의 마지막 파라메터로 쿼리티를 조정할 수 있다.

다 해본결과 SCALE_SMOOTH 가 가장 좋다.

리사이즈 본이 원래 그렇지만 섬네일 이미지가 약간 블러를 먹은 듯 선예도가 떨어진다.




후잡설

방법들은 알게되는대로 계속 올리겠다.

Posted by pearl짓거리전문
잡탕1 - IT2012. 9. 1. 09:21

선잡설

오랜만에 쌓여 있는 JSP 책들을 보며 다시 공부해보고 싶은 마음이 들었다

절대 책산게 아까워서 그런게 아니다. 흠.

Java 감도 슬슬 없어지는 듯하고, 홈페이지도 개편할 때가 된 듯 하다





본잡설

내 PC에 설치된 버전들

JDK 1.6.0_32 (http://www.oracle.com/technetwork/java/javase/downloads/index.html)

Resin 4.0.30 (http://www.caucho.com/download/)

Eclipse Java EE IDE for Web Developers (JUNO) (http://www.eclipse.org/downloads/)


- 현 시점에서 Java 버전 이외에는 최신버전들이며, Resin 은 pro 버전이 아니다

- 각 링크는 해당 프로그램 다운로드 페이지므로 알아서 다운로드 하기 바란다

- Resin 은 zip 버전 받으면 된다



**

이 세팅은 JSP 개발자용이며 WAS 서버라든가 호스팅에는 적합하지 않다

(그럴려면 Resin 세부설정이 필요하다)

eclipse 에서 코딩하고 브라우저로 확인하는 정도 세팅이라 보면 되겠다



**

왜 Resin인가?

그냥 별다른 이유 없다. 모든 JSP 책에 tomcat 으로 되어 있는게 꼴뵈기 싫어서?

WAS 퍼포먼스에서 보면 개발자 PC의 성능이 더 좌우될거고 웹서버를 돌리지 않는 이상

크게 차이가 없을 듯 하다

마이너 지향인 필자의 성향이 Resin을 선택한 이유다



1. 환경설정

- Java 는 JAVA_HOME 시스템변수 잡고 path 에 bin 등록하고 CLASS_PATH 잡는다

(이 세팅은 너무도 많으니 알아서 하시길)

- Resin 은 RESIN_HOME 으로 설치 경로를 시스템 변수로 잡아준다


2. Eclipse 에서 서버 세팅



Window - Preferences - Server - Runtime Environments 에 Resin 등록된 모습


- 스샷처럼 물론 Resin 이 등록되어 있지 않다. 아무것도 없다 Add 를 누르자

New Server 선택창에 Resin 은 없다. 가장 많이 쓰는 Tomcat 은 버전별로 있고 다른 서버들도 보일 것이다

하지만 Resin 은 따로 등록해야 한다.

오른쪽 위에 있는 'Download additional server adapters' 를 누른다

Install new Extension 에 목록이 주르륵 나온다

Resin 은 하나 있으니 선택하여 설치하면 된다

그러면 Eclipse 재실행 해야 완료 된다고 나올것이다. 다시시작 하자.



- 재시작 후, 다시 Window - Preferences - Server - Runtime Environments 에 가서 Add 를 누른다

가장 마지막에 Resin 이 있을 것이고 선택하여 등록한다



특별한 세팅은 할게 없고 설치경로 맞춰주면 된다

JRE는 default 이길래 설치된 버전으로 골라주라고 하던데 그냥해도 무방할 듯 하다



- 이제 Project Exploler 에 Servers 가 등록되고 펼쳐보면 Resin 이 있을 것이다

eclipse 화면 하단 Servers 에도 Resin이 등록되어 있을 것이다


- JSP 든 Servlet 이든 하나 만들어서 테스트 해보자



프로잭트 만들기 할때, Target runtime 에 Resin 4.0 으로 되어있으면 된다





후잡설

본래 이런글은 스샷도 없이 대충 쓰지만 이번은 참 정성들여(?) 썼다

이 설정은 windows 에서 했지만 MAC 에서도 사용하고 있으므로 그대로 참고하면 될 듯 하다

기타 틀린점이나 궁금한건 리플로 남겨주시면 시간 날때 피드백 한다





Posted by pearl짓거리전문
잡탕1 - IT2009. 6. 12. 22:18
int a[] = {3,4,1,6,2,5,7};
n = a.length;

for ( int i=0 ; i<n-1 ; i++ ) {
    for ( int j=0 ; j<n-1 ; j++ ) {
        if ( a[j] > a[j+1] ) {
            int temp = a[j+1];
            a[j+1] = a[j];
            a[j] = temp;
        }
     }
}

Posted by pearl짓거리전문
잡탕1 - IT2009. 6. 2. 21:04
if ( (0==(year%4) && 0 != (year%100)) || 0==year%400 )

A. 4의 배수를 구한다
B. 100의 배수는 윤년에서 제외시킨다
C. 100의 배수에서 제외된 연도 중 400의 배수를 윤년으로 한다

A-B+C
=> ( A && !B ) || C
Posted by pearl짓거리전문
잡탕1 - IT2009. 3. 31. 13:38

String format(String str, int length, int alignment) {
    int diff = length - str.length();

    if(diff < 0) return str.substring(0, length);

    char[] source = str.toCharArray();
    char[] result = new char[length];

    for(int i=0; i < result.length; i++)
        result[i] = ' ';

    switch(alignment) {
        case CENTER :
            System.arraycopy(source, 0, result, diff/2, source.length);
            break;
        case RIGHT :
            System.arraycopy(source, 0, result, diff, source.length);
            break;
        case LEFT :
        default :
            System.arraycopy(source, 0, result, 0, source.length);
    }

    return new String(result);
}

length 크기의 result 라는 char 배열을 생성해서 공백으로 채운 다음 System.arraycopy() 를 이용해서 문자열 str의 내용이
담긴 char배열 source를 복사해 넣는다



출처) 'JAVA의 정석' p465, 예제11-60

Posted by pearl짓거리전문
잡탕1 - IT2009. 3. 14. 01:43
JAVA PROGRAMMING(열혈강의)(개정판)
카테고리 컴퓨터/IT
지은이 김충석 (이한디지털리, 2001년)
상세보기
Java 1.2 일때 나온 책이다. 내가 본건 99년으로 기억한다
자바를 처음 접할때라 동영상 강의를 참 열심히 봤었다
개념이 명확히 잡힐 만큼의 실력이나 사고력이 있던 때가 아니지만
OOP 도 처음 접해본 것이었고, Java 가 참 좋아진 책이다
지금도 소장하고 있다


SCJP(VER 1.4)(EASY GUIDE)
카테고리 컴퓨터/IT
지은이 한동호 (영진닷컴, 2004년)
상세보기
참~ 불행한 커리큘럼으로 교육받은 나는 컴공임에도 불구하고 학교에서 Java를
배워 본적이 없다. 위에 나온 열혈강의 Java 책도 방학때 독학했던 책이다
이 책은 항상 자바에 관심이 있던 내가 SCJP 를 따기 위해 구입했었다
100% SCJP 만을 위한 책이다. 또한 100% 레퍼런스 서술이 목표인 책이기도 하다
이 책은 Java1.4 일때 이고, 1.5 버전에 동일 저자의 책이 또 나와 있다


Head First java
카테고리 컴퓨터/IT
지은이 케이시 시에라 (한빛미디어, 2007년)
상세보기
기억이 맞다면 SCJP 를 따고 구입했던거 같다 -_-;;
개인적인 호기심으로 자바 언어를 공부하긴 했고, SCJP 를 따긴 했으나
취직을 하고 보니 Java를 쓰지 않는 곳이라 쓸 기회가 없었다
그래도 자바에 대한 연민(?)이 남아선지 이 책을 구입하고 들여다 보곤 했던거 같다
근래에 다시 읽어보니 참 잘만들어진 책인걸 실감한다
Java 복습겸 1.5 버전에 추가된 점을 확인해보고자 하는 생각도 있었다


자바 웹 프로그래밍
카테고리 컴퓨터/IT
지은이 황희정 (한빛미디어, 2007년)
상세보기
JSP 를 시작해 보기위해 구입하게 된다
당시는 이 책이 나온지 갓 한달도 안된 상황이었다
그 때는 빨리 변하는 컴퓨터관련 지식들을 빨리 익힐려면
가장 최근에 나온 책을 구입해야겠다는 생각을 했었다
또 이클립스에 대해서 잘 몰랐던 나로써는 책의 부제인 '이클립스 스트럿츠로 배우는' 에
혹 했던게 사실이다. 하지만 내가 사본 Java(JSP) 관련 책 중에
이책이 가장 최악이라고 생각한다
두서 없는 시작, 실행 에러나는 예제, 적절하지 않은 DB(오라클 10g로 진행된다)
이클립스의 내용은 따라하기이고 설명은 거의 없다
교수님이 교제용으로 출판했다는걸 미리 알고 있었으나 이정도일 줄이야 ㄷㄷㄷ
강컴에 가면 내 서평이 실려 있다
2년이 지난 지금 어제 살짝 보니까 관련 부분 판매량이 상위권인 것이다
'개정판 이라도 나왔나?' 하고 봤더니, 내 서평도 아직 그대로 있고 책도 그대로인데,
다만 시기가 학기 초 라는 점! -_- 학생 수 많은 학교 교수님인가 보다


HEAD FIRST DESIGN PATTERNS
카테고리 컴퓨터/IT
지은이 에릭 프리먼 외 (한빛미디어, 2005년)
상세보기
Head First 씨리즈의 열혈팬이 된 나는 이책도 아무 생각 없이 구입한다
아~ 참으로 잘 샀다는 생각이 드는 책이다. 뭐랄까 신세계를 보는 듯한 느낌?
디자인 패턴의 바이블 GoF 의 Design Pattern 에 언급된 패턴들 중에서
가장 많이 쓰이고 유용한 10가지에 대해서 Java 로 구현 해석 사례 등이 실려 있다


Head First Servlets & JSP(상상력을 자극하는...
카테고리 컴퓨터/IT
지은이 케이시 시에라 외 (한빛미디어, 2005년)
상세보기
'자바 웹 프로그래밍' 에서 머리를 얻어맞은 나는
JSP를 다시 공부하기 위해 구입한다
HFJ(Head First Java) 는 자바에 대해서 어느정도 알고 복습 개념으로 봐서 그런가
참 이해가 잘되고 괜찮다고 느꼈었으나 이 책은 참 생소 했다
JSP 를 살짝은 알고 있었지만 설명한다고 설명되어 있는 내용이
난해 했다. 분령도 888 페이지라 보는데도 한참 걸렸다 -_-;
바로 얼마전에 개정판(Java 1.5 적용)이 나왔다
JSP 복습 차원에서 소설책 읽듯이 읽으면 좋을 책이다


JSP 2.0 프로그래밍 기초부터 중급까지
카테고리 컴퓨터/IT
지은이 최범균 (가메, 2004년)
상세보기
HFSJ 에서 뭐가 뭔지 모르게 된 나는 이책을 구입하게 된다
국내 JSP 책중에 괜찮다는 평을 보고 구입했다
보고 있는 중에는 코딩해보고 이해하고 실행해 보느라 정신이 없었지만
다 보고 나서는 JSP 를 처음 접하기에 좋은 책인거 같다는 생각이 든다
확신하지 못하고 '생각이 든다' 고 하는 이유는 2004년에 만들어져서인지
수많은 오타(2008년 10월 인쇄버전임에도 불구하고)와 코드도 상당부분 틀려있고
지금 보기에는 떨어져 보이는 기술들 or 버전들로 되어 있다
2004년이었으면 참 신선했을 텐데...
지금 직장에서도 Java를 하지 않아서 인지, Java -> JSP 의 테크트리를
10년에 걸쳐서 한다 -_-;;


JAVA의 정석
카테고리 컴퓨터/IT
지은이 남궁 성 (도우출판, 2008년)
상세보기
이건 뭐 책장사도 아니고 =_=;;; 또 Java 책을 구입했다
2008년 말부터 요상한 취미가 생겼는데, 온라인 서점에서 책 구경하다가
충동구매를 많이 한다. 아무 생각없이 구입했다
아마도 평들이 좋아서 구입했던걸로 기억한다
충동구매로 나에게 오게된 책이지만 정말 잘 샀다는 책이다
Java 를 지금 시작하는 사람이라면 이 책을 보라고 권하고 싶다
내용 구성부터 개념 정리, 예제 뭐 하나 빠지지 않을 만큼 퍼펙트한 내용으로
꽉차 있다.


JAVA 200제
카테고리 컴퓨터/IT
지은이 조효은 (정보문화사, 2005년)
상세보기
Java의 정석과 같이 구입했다. 어딘선가 '자바 초급에서 중급으로 가는 책'
이라는 말을 들었던거 같다. 그냥 구입한다
아직 보기 전이다. 목차만 살짝 살펴 봤는데 괜찮은 듯 싶다


JSP 2.1
카테고리 컴퓨터/IT
지은이 오정원 (혜지원, 2009년)
상세보기

자바 프로젝트 필수 유틸리티
카테고리 컴퓨터/IT
지은이 박재성 (한빛미디어, 2009년)
상세보기

유쾌한 자바 퍼즐러
카테고리 컴퓨터/IT
지은이 Joshua Bloch (사이텍미디어, 2007년)
상세보기

이젠 병임이 확실하다. 오늘 또 질렀다
최범균의 JSP 에 성이 차지 않아서 인가 JSP 책을 또 샀다
'봤던 책을 또 보면서 복습하는건 어떨까?' 생각해 봤지만
충동구매 욕구를 막을 수는 없었다
JSP 2.1, 자바 프로젝트 필수 유틸리티, 유쾌한 자바 퍼즐러를 한꺼번에 질렀다
결제를 하면서 옆에 있던 친구에게
'나도 미쳤지 저걸 언제 다 볼려고 사는거냐!' 소리치며 결제창에 카드번호를
습관적으로 누르고 있는 나를 발견 했다 ㄷㄷㄷ



지금까지 Java 관련 구입한 책들을 나열해 봤다
괜찮다고 느낀 책도 있고, 별로였다고 느낀 책도 있다
지역적 특성상 서점에 가도 컴퓨터 관련 책이 별로 없을 뿐더러
서점에 'Java'  라고 분류해놓은 책장에는 javascript 책만 널려 있다
그래서 그런지 책을 미리 열어보지 못하고
온라인의 짧은 요약이나 서평등으로 구입하게 되는 현실이 안타깝다
무엇보다 이정도의 책을 봤음에도 실력이 늘지 않았다고 느끼는 내 자신이 한심하다
Java 개발자로 이직을 목표로 공부하고 있는 지금도
'왜 이러고 있는걸까?' 생각하곤 하지만, 10년전부터 느껴왔 듯 Java 가 참 땡긴다
Posted by pearl짓거리전문