'java'에 해당되는 글 32건

  1. 2008.09.11 웹진화론 / 내일은 무슨일이??
  2. 2008.09.10 Thinking in java/ 내코드는 jdk 몇버전?
  3. 2008.01.22 NoClassDefFoundError and ClassNotFoundException
  4. 2007.12.07 [sample] 시간차 구하기 (지금시간기준)
  5. 2007.12.06 [sample] request 유입경로 URL만들기
  6. 2007.10.18 문자열 잘라 배열로 만들기
  7. 2007.10.16 URL을 조작할때 주의사항
  8. 2007.07.18 xml 구문 객체로 바로 읽어들이기 1
  9. 2007.05.17 [JSON] json으로 개발하려면 필요한것들. 1
  10. 2007.04.03 이클립스 에서 한글이 깨질때

사용자 삽입 이미지


많은 사람들이 웹의 진화에대 곰곰히 연구를 했다.
그즈음 게시판에서 블로그로 사람들의 행동이 변화를 일으키자 갑자기 어디선가 선구자적같은
용어하나가 툭! 튀어나왔다.

WEB2.0 !!

순간 밥좀먹고 산다는 컨설턴트들이나 말좀한다는 기획자들은 땅을 치며 후회를 했을것이다.!
"아! 저게 내가 하고 싶은 말인데 저런 간략한 용어를 만들어 내지 못한거야!!"
하지만 보다 정확한 표현은 WEB2.0이 아니다.
웹은 지속적으로 진화하고 있고 그것을 용어적으로 잘 풀이한다면 웹 진화론이 정답에 가깝다.
하지만 책은 꼭 진화론을 이야기하고 있는것은 아니다.
사회 전반적으로 흘러가고 있는 WEB의 형태를 마치 X-ray로 찍어내듯 이야기 하고 있다.
좀 아쉽지만 그래도 이책이 WEB2.0보다는 잘 인터넷을 이야기 하고 있는듯 해서 책을 읽어보도록 했다.

1. 진화라는 변화
 진화라는것은 아이가 어른이 되는것처럼 성장을 하고 변화를 일으킨다.
 손바닥 뒤집듯이 한꺼번에 일어나는게 아니라 서서히 그리고 인지하는 순간 빠른속도로 변화한다.
 책은 사회 전반적에서 벌어지는 진화를 소개하고 있다.
 구글이라는 회사의 진화, 실리콘 벨리에서의 진화, 소수의 의견들에 집중되는 사회적 변화 등을
 예의주시하고 이야기 하고 있다.
 바로 진화라는 변화를 작은 균열들에서 찾아내고 있다.

2. 소수자 생각의 존중
 변화의 속도를 더 빠르게 하는 주된 힘은 소수자의 생각을 메이져 기업들이 수용을 한다는것이다.
 일명 롱테일이라는 한 분야로 싸잡아 이야기 하는게 아니라 블로그를 통해 세상과 소통하는
 소수자들을 포털이나 쇼핑몰에서 의견을 듣고 이에 맞는 모듈을 제공해줌으로써 웹의 진화를
 이끈다고 볼 수 있다.  하지만 정말 중요한것은 그 소수자의 생성 컨텐츠는 생각 이상으로 가치
 있다는것이다.
 바로 변화를 이끄는 선봉을 차지하는 깃발뺏기 게임은 시작되었다.

3. 오픈소스
 책 저자의 직업이 참 의심스럽게 보여진는 부분이다.
 아직 개발자들 사이에서도 홍보와 참여교육을 통해 늘어날것으로 예상하고 조심스럽게 다가가고
 있는 부분에 대해 저자는 콕 찝어 오픈소스 영역에 대해 높은 비중을 두고 있다.
 물론 전문가 수준은 아니겠지만 openAPI가 미치는 사람들의 소통의 방법을 저자는 충분히 알고
 구독자에게 잘 전달해 주고 있다.

웹은 진화하고 있다.
그리고 그 진화의 선봉에는 소수의 블로거들이 존재하고 있다.
그들의 소리는 메이져기업들이 들어주고 있고 기업은 진화의 속도를 높인다.
속도는 기업에게 발전과 수익을 가져다 주고 일반 유저들은 새로운것을 경험하게 된다.


마치 경제의 순환고리를 생성해내는 과정과도 일맥상통하는 이러한 웹의 진화를 책을 통해 살짝
맛볼 수 있었다는데 이책이 만족스러웠다는것을 전해본다.

사용자 삽입 이미지


나는 지금 jdk 몇버전에 머물며 개발하는 개발자인가?
우리의 물음은 거기에서 부터 시작이 되었다.
우리의 물음은 나 자신에게 다시 질문이 던져졌고
openAPI 한개더 알아가고 어디서 세미나 연다는 정보를 안다는것을 이제 더이상
중요한 정보로써의 가치를 잠시 버려보려고 했다.
그랬더니 JAVA개발자가 진화를 지연시켜온것을 알게 되었다.


그렇게 시작된 나의 자랑스런 팀원들과의 스터디가 진행이 되었다.
책을 배송을 시켰고 배송된책의 엄청난 부담감 1300페이지가 날 기다리고 있다.
이전에CODE COMPLETE 도 봤는데 이까이꺼 뭐~ 라고 말하겠지만 이것은 수준이 다른 문제였다.
책은 내가 아는 내가 지금도 주로 사용하는 언어를 이야기 하면서 마치 다른 이야기를 하듯이 풀어내고 있었다.
SCJP를 준비하려고 무작정 외웠던 소스코드들에 대한 원론적인 해석의 방법과 코드가 패턴을 가지게되는 역치의 순간들 그리고 우리가 늘 사용하고 있는 JAVA 용어적 해설까지 실로 바이블!
이라는 단어가 아깝지 않은 책이였다.


헌데 왜! 이책은 그 유명한 바이블이라는 단어를 버리고 Thinking in java라 지었을까?
그 이유는 책의 챕터를 한장 한장 넘겨가면서 알게 되었다.
앞에 코드를 생각하지 않으면 전혀 뒷장이 연상되지 않는 구조~!
챕터도 모두 떨어져 있지만 앞챕터를 이해하지 못하면 뒷 챕터역시 알토랑같은 지식을 주워먹을수
없는 구조의 책이였다.


1. 책의 세밀한 배려
 책은 구독자를 위한 세심한 배려들이 많이 숨어있다.
 a. 주석의 표준화된 표기
  주석의 표준화된 사용으로 작은 sample도 javaDoc를 만들어 낼 수 있는 구조로 되어있다.
  또한 챕처의 초반(2장)에 주석을 효과적으로 달아주는 doc 테그 달기 방법에 대해서 이야기 해준다.
 b. 컴파일 결과를 보여준다.
  코드의 제일 하단! 코드를 눈으로 해석하고 그 결과를 볼 수 있도록 결과를 주석으로 달아주었다.
  국내서적이 따로 그 결과를 뽑아내 코드로 페이지수 늘리기 할 법도 하지만 이것역시 간단한 주석처리
 c. 용어적 해설
  program language가 가지는 특징은 용어에 대한 함축적 사용이다.
  java도 예외가 아닌데 이런 용어에 대해서 책은 간간히 반복적으로 보여준다는것이다.


 이 외에도 책은 참 많은 세심한 배려를 보여준다.
 같은 코드를 가,나,다,라 형태로 진화시켜 나가는것을 보면 이책이 왜 그토록 많이 읽혔는가를 볼 수 있다.
 더불어 진행하는 사이사이 vm안에서 객체와 메모리힙 영역에서 어떤일이 벌어지는지도 보여준다.
 

2.  솔직한 저자의 생각
 java도 신이 만들어낸 언어가 아닌이상 사람의 철학이 담겨져 있고 사람의 실수가 있을 수 있다.
 저자는 이런 부분에서 자신의 솔직한 생각들을 책에 담아놓았다.
 물론 이것이 정답이 될 수 없지만 생각의 깊이를 많이하고 토다는것이기 때문에 저자의 생각마져도
 곰곰히 지켜볼 필요가 있다.
 개인적으로 내부클래스는 Thread 생성을 제외하고는 난 그다지 선호하지 않는다 하지만 저자의 경우에는 내부클래스를 interface를 통해 내부클래스의 확장된 활용을 이야기 하고 있다. (대단~)
 (챕터 가장 마지막 부분에 있는 요약도 참 보기  좋네요)


3. 뜨거운 감자 다루기
 String이 좋은가 StringBuffer가 좋은가? Exception을 이용한 객체 던지기는 바람직 한가?
 finally를 통해 객체 Close를 시도할때 신뢰할만한가?
 하하하...
 개발하면서 얼마나 논란이 많이 되는것들인가. 이것에 대해 책은 저자의 실전코딩을 통해 이것을 이약한다.
 결론는 기대하는 수준에서 결론이 대부분이지만 책은 충분한 설명을 동반한 결과를 이야기 한다.


4. 그리고 응용
 개인적으로 난 이책이 정말 대단하다고 보는것은 일반적인 java지식을 14장까지 보고 싶다.
 그리고 15장부터는 이것에 기반한 좀더 깊이있는 java다루기라 보고 싶다.
 물론 이미 충분히 알고있는것! 그래서 잘 생각없이 사용하는것! 에대해 14장까지 이해를 하고
 15장부터는 정말 깊이있게 생각할 수 있는 응용하는 바를 다루고있다.
 챕터 사이사이마다 비슷한 느낌을 받는 내용들이 있지만 역시나 이책의 주요 의도하는 바는
 개발자로 하여금 jdk의 버전이 높아짐에 따라 같이 버전업하라는게 농후한 메세지다.


이 작렬하는 포스의 책은 정말 1명의 저자가 사람이 만들었을까 하는 생각이 든다.
대단하다. 정말 이렇게 까지 할 수 있다는게 대단하다.
이 책을 모두 이해만 한다며 나도 java의 해안을 얻을것만 같은데 아직 그만한 지식이 갖춰져
 있지 않아서 오직 열심히라는 단어밖에 떠오르지 않는다.
매일 매일 새로운것을 배우고 내가 배운것을 단단히 해야하는 개발자~
좀 고되지만 이렇게 수준높은 사람들의 지경을 만나면 고개가 숙여진다.


NoClassDefFoundError는 자바 실행 시에 ClassNotFoundException과 함께 만나게 되는 에러이다.
이 두 가지 에러는 조금 혼란스럽다.

> ClassNotFoundException 발생사례
클래스 경로에 클래스가 없을 경우, Class.forName("SomeClass")으로 찾을 경우

> NoClassDefFoundError 발생 사례
new SomeClass()로 사용한 경우에는 NoClassDefFoundError가 나게 된다. 이 경우는 컴파일 시에는 존재했던 클래스 바이트 정의를 런타임 시에 찾지 못한 경우
NoClassDefFoundError가 LinkageError의 자식 클래스인 것도 이를 뒷받침해준다.

> NoClassDefFoundError 발생 사례 추가
실제 Java VM에서 어떤 경우에 NoClassDefFoundError를 발생시키는지 유형을 정리해두면 문제가 발생했을 때 해결 혹은 판단에 도움이 될 것이다.
> VirtualMachine.redefineClasses : if the bytes don't correspond to the reference type (the class names don't match).
> ClassLoader.defineClass : 바이트 코드가 정의한 클래스 이름과 정의하려는 이름이 다를 경우
> RMIClassLoader static initializer : RMIClassLoader 제공자 클래스를 찾지 못했을 때
> rmi MarshalInputStream static initializer : rmi server를 위한 시스템 클래스를 찾지 못했을 때


orgURL :
Log on Java

시간차 구하기입니다.
지금 현재 시간을 기준으로 분단위로 얼마나 차이가 나는지를 알려주는 process 랍니다.

 public static int getDiffTime(String date) {

  SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_FULL_STR);

  Calendar cal = Calendar.getInstance(defaultTimeZone);
  try {
   cal.setTime(sdf.parse(date));
  } catch (ParseException e) {
   e.printStackTrace();
  }
 
  Date today = new Date();
  Calendar calToday = Calendar.getInstance(defaultTimeZone);  
  calToday.setTime(today);

  Calendar calInday = Calendar.getInstance(defaultTimeZone);
  calInday.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
    cal.get(Calendar.DATE),cal.get(Calendar.HOUR) , cal.get(Calendar.MINUTE));
 
  int count = 0;
   while (!calInday.after(calToday)) {
    count++;
    calInday.add(Calendar.MINUTE, 1);    }
  }
  return count;  
 }


String requestURL = request.getRequestURL()+"?"request.getQueryString();


요즘이야 Eclipse로 모든 함수를 볼 수 있어
그것으로 그냥 모두 printout찍어본다면 시간이 좀 걸려도 알 수 있겠지만
그렇지 않은 경우라면 이것또한 찾는것도 일이다.


  String[] array = content.toLowerCase().split("<img");
  for (String imgURLing : array) {
      ...

문자열을 잘라 배열로 보관! 및 작업할때. T-T
어극 왜 자꾸 이런 단순한것을 잊어먹느냐 말이다!!
  String base64URL = Base64.encode (openURL.getBytes());
  String hostURL = "
http://c"+openURL.substring(openURL.indexOf("@")+1, openURL.indexOf(":"));
  String filename = openURL.substring(openURL.lastIndexOf("/")+1, openURL.length());
  StringBuffer  fullURLsb = new StringBuffer();
  fullURLsb.append(hostURL);
  fullURLsb.append("/aaa/aa.jsp");
  fullURLsb.append("?fhandle="+base64URL.trim());
  fullURLsb.append("&filename="+filename);


base64URL.trim() 이게 제일 중요하다.
해당 trim() 작업을 수행하지 않으면 url이 개행처리 되기때문에
windows 서비는 상관없겠지만 linux에서는 400Error를 토해내게 되다.

  SAXReader reader = new SAXReader();
  Document document = reader.read(in);
  return parseData2Data(document);


참 간단한 구문이 아닐 수 없다.
하지만 가만히 보면 모든 xml 파싱에 비밀이 들어가 있다.
in 은 InputStream으로 URL상에 존재하는 내용을 InputStream으로 받아온다.
그 받아온 IN 객체를 SAXReader를 이용해서 바로 Document화 시킨다.

XML을 이용한 파싱할때 유용하게 사용될것 같다.

우선 자신의 JDK에 맞는 JSON LIB가 필요하다.
http://json-lib.sourceforge.net/ 여기에서 받아보자 (jdk 1.3용과 jdk 1.5가 있다.)


json이 여기서 받아야 하는 파일이 끝이라고 생각한다면 오산이다.

오류발생 : java.lang.NoClassDefFoundError: net/sf/ezmorph/MorpherRegistry

이것은 EZmorph가 없어서 발생하는 오류이다.
바로 연관 package가 추가로 더 있는 경우에 해당한다.

http://ezmorph.sourceforge.net/ 에서 추가로 다운받자.


최종!!
 > json-lib-1.1-jdk15-javadoc.jar / ezmorph-1.0.2.jar  2개가 있어야 구동이 가능함.


● 간단 sample 소스코드

 public oid test11DataTest () {
  JSONObject jsonObject = new JSONObject() ;
  jsonObject.put ("subject", "001");
  jsonObject.put ("author", "002");
  jsonObject.put ("date", "003");

  System.out.println("neouser ^^ >>>" + jsonObject.toString());
 }





-Dfile.encoding=UTF-8

VM argument에 위에 옵션을 부여해줍니다.
1 2 3 4 

글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!