나 자신을 다스리는 자가 세상을 다스린다.


우리나라에서 자바 개발자 컨퍼런스가 벌써 8회째..
6회때부터 신청만 해놓고 가지 못했던 자바 개발자 컨퍼런스..
이번엔 다른 일 다 제쳐두고 참석해보았다.

정말 많은 참석인원..
우리나라에 개발자가 이렇게 많을 줄이야~
그런데 사람 뽑을려면 왜 이렇게 없는지~
다들 좋은 곳으로 몰려 다니나?

컨퍼런스 내용을 보면 세션 준비 하신 분들이 너무나들 쟁쟁하신 분들..
3, 4번째 세션엔 너무 좋은 세션이 몰려있어서 세션 시간 전까지도 고민을 많이 했다.

추후에 세션 내용 동영상으로 제공 안되려나? 다른 세션들도 놓치기 아까웠는데.
사실 스폰서들의 경품에 현혹되어 세션 시작 시간을 놓치기도 했지만..^^
컨퍼런스 하루 참석으로 인하여 내 실력이 갑자기 뛰어나졌다고 할 수 없지만
앞으로 계속될 나의 개발 인생에 도움이 많이 된 컨퍼런스 였다.

한가지 아쉬운 점은.. 쇼케이스 부스가 부족했었던 것 같다.
스폰서 부스들이 있기는 했지만 뭔가 보여주기에는 너무나도 부족했었다.
내년엔 더욱 더 멋진 자바 개발자 컨퍼런스가 되길...
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by trypsr Trackback 0 Comment 0
* form 의 input 의 type 으로 image 를 주고 거기에 onclick 속성을 적용하면 안됨.
   - submit 이 2번 일어남...

* jakarta commons dbcp 사용시
   - pool.jocl 파일에 주석이라도 한글이 들어가면 아래와 같은 에러발생
ERROR ({http-8080-Processor24} ConvertorProcess.java[process]:41) [2007-02-16 13:42:30,792] - 에러 발생 :
org.apache.commons.dbcp.SQLNestedException: Could not load configuration file

....
....

Caused by: java.io.UTFDataFormatException: Invalid byte 2 of 2-byte UTF-8 sequence.
    at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
  - Could not load configuration file  메세지만 보고 헛짓 하지 말기...ㅠ.ㅠ
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by trypsr Trackback 0 Comment 1
jdk1.5.0_08 와 jakarta-tomcat-5.0.28 에서 내포하고 있는 w3c dom 의 버전 차이로 인하여 문제가 발생한다.

Node 의 getTextContent() 메소드를 사용하는데

컴파일시에는 jdk1.5.0_08 의 w3c dom 을 사용 하므로 아무이상없이 실행된다.

그러나 Tomcat 으로 실행을 하게 되면 아래와 같이 메소드를 찾지 못한다.
   
java.lang.NoSuchMethodError: org.w3c.dom.Node.getTextContent()Ljava/lang/String;

Tomcat 설치 디렉토리/common/endorsed 디렉토리를 보면 xml-apis.jar 파일이 있는데

Tomcat 실행시에는 xml-apis.jar 의 w3c dom 을 먼저 읽게 되므로 메소드를 못 찾는 현상..

그래서 과감히 xml-apis.jar 를 이동시키면 임시적으로 문제 해결...

더 좋은 해결 방법은 뭐가 없을까??

관련 링크 : http://forum.java.sun.com/thread.jspa?threadID=699041&messageID=4057479
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
TAGjava, XML
Posted by trypsr Trackback 0 Comment 0
선수의 수와 그 선수가 싫어하는 선수의 정보를 입력받아
두 개의 팀으로 구성하여라.

예)
1번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
3
2번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
1
3번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
----------------
A Team : 1
B Team : 2 3

싫어하는 선수가 여러명일 경우 1,2 ... 와 같이 , 로 구분하여 입력받는다.


=================================================================================

나는 아래와 같이 작성하였다.

알고리즘을 생각하는데 많은 시간이 걸렸다..

처음에는 단순하게 for 문 돌리면서 넣었다 뺐다 하면 되겠지 생각했는데...

생각보다 쉽지가 않았다.

코드 작성 초기에는 TDD 도 익힐 겸 JUnit 제대로 적용하고 Exception 처리도 말끔히 해볼까 했는데...

회사에서 눈치보면서 한 것이라 막 코딩이 되어버렸다. ㅠ.ㅠ

그래도 재미있는 문제였다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test{

    private final int POSSIBLE = 1; // 위치한 자리

    private final int IMPOSSIBLE = -1; // 불가 자리

    private final int HOLD = 0; // 빈 자리

    int[] aTeam; // A Team

    int[] bTeam; // B Team

    int[] otherTeam; // Other

    String[][] playerInfo = null; // 싫어하는 선수 정보

    private void doProcess(InputStream is) {
        while (true) {
            System.out.println("선수의 수를 입력하십시요 : ");
            int totalNum = readTotal(is);

            if (totalNum > 0) {

                playerInfo = new String[totalNum][];
                aTeam = new int[totalNum];
                bTeam = new int[totalNum];
                otherTeam = new int[totalNum];
                // 선수 정보 입력
                for (int i = 1; i < totalNum + 1; i++) {
                    System.out.println(i + "번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)\n싫어하는 선수가 없을 시에는 Enter");
                    playerInfo[i - 1] = readPlayerInfo(is);
                }

                makeTeam();
                System.out.println("결과는 다음과 같습니다.");
                System.out.println("A Team : " + printTeam(aTeam));
                System.out.println("B Team : " + printTeam(bTeam));
                System.out.println("Not Team : " + printTeam(otherTeam));
                System.exit(0); // 종료
            } else {
                System.out.println("잘못된 입력입니다.\n 다시 입력하여 주십시요.");
            }
        }
    }

    /**
     * 전체 선수의 수 읽어오기
     * @param is
     * @return
     */
    private int readTotal(InputStream is) {
        String total = null;
        int totalNum = 0;
        try {
            total = readLine(is);
            if ("exit".equalsIgnoreCase(total)) {
                System.out.println("프로그램을 종료합니다.");
                System.exit(0);
            }
            totalNum = Integer.parseInt(total); // 전체 player
        } catch (NumberFormatException nfe) {
            // nothing doto
        }
        return totalNum;
    }

    /**
     * player 정보 입력
     * @param is
     * @return
     */
    private String[] readPlayerInfo(InputStream is) {
        String info = readLine(is);
        return ("".equals(info.trim())) ? null : info.trim().split(",");
    }

    /**
     * make Team
     *
     */
    private void makeTeam() {
        for (int i = 0; i < playerInfo.length; i++) {
            boolean conBoolean = true;

            // aTeam check
            conBoolean = checkTeam(playerInfo[i], aTeam, i);

            if (conBoolean) // aTeam 자격 안되면 bTeam 체크
                conBoolean = checkTeam(playerInfo[i], bTeam, i);

            if (conBoolean) // aTeam, bTeam 둘다 자격 안되면 otherTeam
                otherTeam[i] = POSSIBLE;
        }
    }

    /**
     * Team check
     *
     * @param pInfos
     * @param team
     * @param i
     * @return
     */
    private boolean checkTeam(String[] pInfos, int[] team, int i) {
        boolean retVal = true;
        if (team[i] == HOLD) { // 해당 자리 있을 경우에만
            if (pInfos == null) { // 싫어하는 선수 없으면 현재 team 소속
                team[i] = POSSIBLE;
                retVal = false; // 다음 team 작업 중지
            } else { // 싫어하는 선수 리스트 있으면...
                if (checkHate(team, pInfos)) { // 싫어하는 선수 중에 이미 자리잡은 경우가 있는지 체크, 없을 경우 아래 작업 진행
                    for (int j = 0; j < pInfos.length; j++) {
                        int hateNum = Integer.parseInt(pInfos[j]) - 1;
                        team[hateNum] = IMPOSSIBLE; // 싫어하는 선수의 자리 불가로 표시..
                        team[i] = POSSIBLE; // 현재 team 소속
                        retVal = false; // 다음 team 작업 중지
                    }
                }

            }
        }
        return retVal;
    }

    /**
     * team 에 싫어하는 선수가 자리 잡고 있는지 체크
     *
     * @param team
     * @param infos
     * @return 해당 팀에 들어갈 수 있는지 여부 return
     */
    private boolean checkHate(int[] team, String[] infos) {
        for (int i = 0; i < infos.length; i++) {
            if (team[i] == POSSIBLE) { // 현재 team 에 싫어하는 사람 있는 경우
                return false; // 해당 팀에 들어갈 수 없음
            }
        }
        return true;
    }

    /**
     * InputStream 으로 부터 read Line
     * @param is
     * @return
     */
    private String readLine(InputStream is) {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String retVal = null;
        try {
            retVal = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("프로그램에 오류가 발생하였습니다.");
            System.exit(1);
        }
        return retVal;
    }

    /**
     * team print
     *
     * @param team
     * @return
     */
    private String printTeam(int[] team) {
        StringBuffer retVal = new StringBuffer();
        for (int i = 0; i < team.length; i++) {
            if (team[i] == POSSIBLE)
                retVal.append(i + 1).append(" ");
        }
        return retVal.toString();
    }

    public static void main(String[] args) {
        System.out.println("프로그램을 시작합니다.");
        Test t = new Test();
        t.doProcess(System.in);
    }
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
TAGjava
Posted by trypsr Trackback 0 Comment 0
나는 IQ 지수 = 잔머리 지수 라고 생각한다.

고등학교 때 나의 생활 기록부를 볼 기회가 있어서 나의 IQ 를 확인할 수 있었는데..

어린 마음에 IQ 지수를 보고 뿌듯했던 나..

그러나 IQ 가 살아가는 데 도움을 준 건 하나도 없는 듯..

오히려 머리만 믿고 노력을 안하는 사람이 되는데 한 몫 했다..



그래도 시간날 때 심심풀이로 함 해봐야지.. ㅋㅋ

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'일상다반사 > 여흥거리' 카테고리의 다른 글

IQ 테스트  (0) 2007.02.08
Posted by trypsr Trackback 0 Comment 0
그동안 귀찬니즘으로 인하여 test 를 멀리했었다.

하지만 이제는 tdd 를 습관화 해봐야지ㅣ

그런데.. 전에 junit 이 4.x 버전 부터 완전히 바꼈다... ㅠ.ㅠ


더 편해졌다고들 하는데.. 전에 봤던 것과 너무 많이 바껴서...ㅠ.ㅠ

그래도 열심히 해봐야지..

testNG 가 junit 보다 더 낫다고 하던데... 나는 그냥 이클립스 기본 플러그인인 junit 4 로 습관화 하기로 했다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'작업공간 > 프로그래밍' 카테고리의 다른 글

모 회사 기출문제 3  (0) 2007.02.08
tdd 를 생활화 하기에 앞서..  (0) 2007.02.05
나 자신을 또 한번 생각하게 만드는...  (0) 2007.02.02
모 회사 기출문제 2  (0) 2007.02.01
Posted by trypsr Trackback 0 Comment 0

무단 복제라...

갑자기 나를 돌아보게 된다.

위 경우와는 좀 다르지만..

솔직히 나는 개발을 하면서 이전 회사에서 개발했었던 소스들을 상당히 많이 참조를 한다.

비슷한 요구 사항이라면 난 항상 내가 이전에 했던 것들에서 힌트를 찾았었는데..

이것도 안되는 걸까?

어디까지 허용되고 어디까지가 불법일까?

프로그래머라는 직업, 참 어려운 것 같다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'작업공간 > 프로그래밍' 카테고리의 다른 글

tdd 를 생활화 하기에 앞서..  (0) 2007.02.05
나 자신을 또 한번 생각하게 만드는...  (0) 2007.02.02
모 회사 기출문제 2  (0) 2007.02.01
모 회사 기출문제  (0) 2007.02.01
Posted by trypsr Trackback 2 Comment 0
2번째 기출문제..

입력받은 알파벳의 합을 구하라.
- A = 1 ~ Z= 26

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Test{

    public int calculate(String inputString) {
        int sum = 0;
        for (int i = 0; i < inputString.length(); i++) {
            int charNum = Character.getNumericValue(inputString.charAt(i)) - 9;

            if (charNum > 0 && charNum < 27) {
                sum += charNum;
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println("프로그램을 시작합니다.");
        System.out.print(">>");

        while (true) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            Test t = new Test();

            String inputString = null;
            try {
                inputString = br.readLine();

                if (!"exit".equals(inputString)) {
                    System.out.println("SUM : " + t.calculate(inputString));
                    System.out.println(">>");
                } else {
                    System.out.println("프로그램을 종료합니다.");
                    System.exit(0);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
TAGjava
Posted by trypsr Trackback 0 Comment 0
내가 가고 싶은 회사 중에 하나인 곳의 기출문제 라는데..

나도 한 번 풀어보았다.

나의 풀이가 원하는 정답이 아닐 수 있지만..
나의 코드 스타일이 어떤지 되집어 보고는 싶었다.
뭐 많이 고민하고 구현한건 아니라지만... 역시 맘에 안든다...ㅠ.ㅠ
이런 간단한 것도 맘에 안들어 하는데... 그동안 돈 받고 팔아먹었던 것들은?
후회없는 프로그래밍은 과연 가능할까?



특정 문자열 계산
- 문장을 입력받아 문자열중 bab은 1점, baby는 -2점으로 계산
- 기본점수는 50점
- babbab 과 같이 한 단어에 bab 중복일 경우 한 번만 계산
- babbaby일 경우 bab 과 baby 가 같이 있을 경우 baby만  계산

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Test {

    public int calculate(String inputString) {
        int retVal = 0;
        retVal = getWordCount(inputString, "A") * 1 + getWordCount(inputString, "B") * -2;
        return retVal;
    }

    private int getWordCount(String inputString, String gubun) {
        int count = 0;

        String[] inputWord = inputString.split(" ");

        for (int i = 0; i < inputWord.length; i++) {
            if (gubun.equals("A")) {
                if (containsIgnoreCase(inputWord[i], "bab") && !containsIgnoreCase(inputWord[i], "baby"))
                    count++;
            } else if (gubun.equals("B")) {
                if (containsIgnoreCase(inputWord[i], "baby"))
                    count++;
            }
        }
        return count;
    }

    private boolean containsIgnoreCase(String str, String searchStr) {
        if (str == null || searchStr == null) {
            return false;
        }
        str = str.toUpperCase();
        searchStr = searchStr.toUpperCase();
        return str.indexOf(searchStr) >= 0;
    }

    public static void main(String args[]) {

        System.out.println("프로그램을 시작합니다.");
        System.out.print(">>");

        while (true) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int point = 50;

            Test t = new Test();

            String inputString = null;
            try {
                inputString = br.readLine();

                if (!"exit".equals(inputString)) {

                    point += t.calculate(inputString);

                    System.out.println("point : " + point);
                    System.out.println(">>");
                } else {
                    System.out.println("프로그램을 종료합니다.");
                    System.exit(0);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
TAGjava
Posted by trypsr Trackback 0 Comment 0


티스토리 툴바