달력

102021  이전 다음

  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
  •  
2006년 구입한 구형 맥북프로 리셋할 일이 있어서 재설치하니 옛생각이 납니다.

Dock입니다.

파이어폭스 받아서 설치했습니다. Finder가 iTunes를 따라가기 전 좌측 메뉴의 모양입니다.

윈도우 업데이트 만큼이나 맥도 소프트웨어 업데이트가 잦습니다.

한참을 다운로드 받네요. ^^;

세 번을 업데이트를 더 했습니다.

Java5 까지만 지원됩니다. Java6와 Java7은 맥OS 10.4.x 에서는 지원되지 않는다고 합니다.

마찬가지로 마지막 업데이트인데 자바가 약간 아쉽습니다.

^^; 그냥 추억거리입니다.
Posted by 케누 kenu허광남

댓글을 달아 주세요

자바가 플랫폼이라

java 2009. 1. 6. 10:12
JRuby, JythonScala, Groovy 등 JVM 위에서 돌아가는 비자바 언어들입니다. 다른 언어로 프로그래밍해서 자바 class 파일을 만들어 내기 때문이죠. JVM을 또 하나의 플랫폼으로 만드는 전략입니다. 오늘은 Buildr이라는 것을 봤는데, 이 녀석은 아예 대놓고 Ruby기반으로 자바를 빌드합니다.

말이 좋아 플랫폼이지 잡탕이 아닌가 하는 생각도 듭니다. 하긴 저는 중국집에서 잡탕밥을 좋아하는 한 사람입니다.
image from: http://bookkyung.com/bbs/board.php?bo_table=special&wr_id=10
Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. 김광수  댓글주소 수정/삭제 댓글쓰기 2009.01.06 10:41

    저도 잡탕밥 좋아합니다.

  2. 영회  댓글주소 수정/삭제 댓글쓰기 2009.01.06 10:47 신고

    오구반점 군만두, 현래장 수타 짜장과 김치잡채밥 추천

  3. rkJun  댓글주소 수정/삭제 댓글쓰기 2009.01.06 21:13 신고

    표현이 멋지네요.
    저도 잡탕밥 좋아하는 1人ㅋ

정규표현식은 문자열의 패턴을 이용하는 것인 줄 알지만 쓰기 힘들다고 느끼는 것 중 하나입니다. 이클립스는 기본적으로 정규표현식을 지원하는데, html 태그의 일괄 변경에 사용해 보았습니다.

하늘색으로 되어 있는 부분을 Find로 찾을 때 원하는 문자열로 이동이 된다면 제대로 정규표현식을 잡은 것입니다. 
<option value="ajaxqna">ajaxqna | Ajax QnA</option>
여기에서 "ajaxqna | " 부분을 인식한 표현식은 ">\w*\s\|\s" 입니다.
\w는 a~z,A~Z,0~9까지 인식하는 기호입니다.
\s는 space(공백)이죠.

도움말을 잘 이용하면 어렵지 않게 원하는 패턴을 찾아낼 수 있을 것입니다.
Posted by 케누 kenu허광남

댓글을 달아 주세요


황상철님의 애자일 SCRUM 방법론 적용기와 이상민님의 GWT 그리고 GWT-ext 세션에 이어서 제가 findbugs 예찬론을 폈습니다. (각 링크마다 발표자료 있습니다.)
30명이 안되는 인원이 모였고, 반은 SDS소속 반은 인터넷을 통해서 신청받은 분들이 모였습니다.

세 세션의 공통점이 있는 듯 했습니다.
회사 조직은 새로운 것을 나에게 요구하지 않는다. 
그래서 내가 새로운 방법과 기술을 익혀도 회사는 무관심하다.
새로운 것을 적용해 프로세스를 개선하려고 해도 회사 조직은 달가워하지 않는다.
귀찮아 한다. 이렇게 말하면서 "좋아 보이는군요. 하지만 너무 이상적이라 우리 팀에는 맞지 않아요." 시도하기를 꺼린다.
때문에 새로운 것을 적용하려면 또 다른 노력이 필요하다. 

황상철님의 소규모의 성공 사례부터 만들어 나가기를 얘기했고, 제 생각은 사람들의 행동을 이끌어 내는 것은 감동이기 때문에 쇼를 하라고 얘기합니다. 이상민님은 쉬면서 멋진 GWT 애플리케이션을 만드셨더군요.

9시까지 예정이었지만 25분씩 발표로 8시 반 정도에 끝나고 뒷풀이 장소로 옮겼습니다.

거대 조직 내의 조용한 움직임.
당장은 효과가 없지만, 10년, 20년 지난 우리나라 업계의 중요한 뿌리가 될 것입니다.
꽃이야 C자 들어간 직위의 사람들 몫이죠. 
Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. tuning-java  댓글주소 수정/삭제 댓글쓰기 2008.11.29 01:38 신고

    형님 그거 쉬면서 만든게 아니고. ^^;
    지난 추석 때쯤 만든거에요~~~.
    지금은 틈틈이 버그 수정중이구요.

    그리고, 강의해주셔서 감사합니다. ^^;

  2. 에코지오  댓글주소 수정/삭제 댓글쓰기 2008.12.02 11:07 신고

    [회사 조직은 새로운 것을 나에게 요구하지 않는다.
    그래서 내가 새로운 방법과 기술을 익혀도 회사는 무관심하다.
    새로운 것을 적용해 프로세스를 개선하려고 해도 회사 조직은 달가워하지 않는다.
    귀찮아 한다. 이렇게 말하면서 "좋아 보이는군요. 하지만 너무 이상적이라 우리 팀에는 맞지 않아요." 시도하기를 꺼린다.
    때문에 새로운 것을 적용하려면 또 다른 노력이 필요하다.]

    캐동감 ^^b

파일 첨부합니다.
지난 발표자료에 적용점에 대한 고민만 살짝 추가했습니다.
okjsp 사이트의 버그는 하나 남았습니다.
이것도 곧 잡으러 출격합니다.

Posted by 케누 kenu허광남

댓글을 달아 주세요

지속적인 통합 빌드에서 crontab 처럼 주기적으로 빌드가 돌게 할 수 있습니다. 아래는 10분 주기로 실행하도록 한 결과입니다. trend 링크를 누르면 다음과 같이 그래프로도 확인이 가능합니다.

빌드의 실행 시점은 다음과 같이 정할 수 있습니다. 우측의 ? 아이콘을 클릭하면 해당항목에 대한 설명이 보이게 됩니다. 빌드에는 분 시간 일 월 요일 5가지 설정을 하게 됩니다. 매 10분마다 설정하려면 0,10,20,30,40,50 처럼 공백없이 분을 나열하고 이후 4항목을 * * * * 로 채우면 됩니다.

빌드 로그가 많이 남을까봐 Discard Old Builds처럼 옛날 빌드기록을 삭제할 수 있습니다. 7일간 최대 200개의 빌드기록을 보관한다는 의미입니다.


소스코드를 가져오는 방법은 다음과 같습니다. CVSROOT를 적어주면 됩니다. 아이디와 패스워드가 노출되는데, 인트라넷용이라는 전제가 있습니다. 또한 빌드전용 CVS아이디를 만들어 주는 것도 괜찮을 것입니다.

간략하게 hudson의 설정에 대해서 살펴보았습니다.





Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. yeoupooh  댓글주소 수정/삭제 댓글쓰기 2008.11.13 16:34 신고

    hudson 정말 잘 만들어진 툴이죠. jabber plugin 설치하시고 google talk 설정해 놓으면 빌드 끝나고 메신저로 날려주는데, 전 이게 맘에 들드라구요. ^^

from: http://www.zentus.com/sqlitejdbc/ 
구글링해서 제일 먼저 나온 사이트입니다. 검색어는 sqlite jdbc 였죠. freshmeat project로 버전업 발표가 된다고 합니다. 
sqlite3를 보고 처음 든 생각은 음, 이거 자바에서 어떻게 연결하지 였습니다. 리스너 또는 데몬이 떠 있지 않기 때문이죠. sqlitejdbc를 써보고 난 느낌은 약간 허탈했습니다. 원래 데몬이 뜨지 않더군요. 파일DB 입출력을 ANSI SQL로 만들어 놓은 느낌이었습니다. 따로 프로세스가 도는 것이라기보다는 애플리케이션에 애드온으로 삽입된 느낌이라고 할까요.

sqlitejdbc에는 현재 sqlite3가 포함되어 있습니다. 따로 sqlite를 받지 않아도 됩니다. 이클립스에서 테스트한 프로젝트 통째로 압축해서 올립니다. 라이센스는 BSD군요.


jdbc에 익숙한 분들은 아시겠지만 코드는 간결합니다.
사용법(usage) 부분에 사용시 주의사항이 나와 있습니다. 경량DB의 제한사항이 있으니 꼭 숙지하고 작업하셔야 할 것 같습니다. 항목은 다음과 같습니다.

간단한 DB가 필요할 때 유용할 것 같습니다. 대용량이나 빈번한 사용은 아직 무리겠지요.

Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. Kenny  댓글주소 수정/삭제 댓글쓰기 2008.11.07 10:46

    음... Java에서 쓸꺼면....
    hsqldb http://hsqldb.org/ 쪽이 더 편하지 않을까요? ^^;;;

  2. 냥길동  댓글주소 수정/삭제 댓글쓰기 2008.11.07 12:11 신고

    java 7 엔 디비가 내장된다고 하고..그것에 대한 jdbc연결법도 본것같은데..
    빨리 7이 활성화 되야겠네여..ㅋㅋㅋ (6부턴가?ㅡ.ㅡ?..)...

    물론 sqllite와 같은 가벼운 용도로서의 활용이겠죠?

  3. Kenny  댓글주소 수정/삭제 댓글쓰기 2008.11.07 15:27

    JDK 6 부터 들어가 있는, Apache Derby인 JavaDB도 괜찮아요. 그럭저럭 쓸만한 듯.
    SDN(Sun Developer Network)에 튜토리얼도 올라왔네요. ^^;;

    http://blog.sdnkorea.com/blog/677

    hsqldb / derby 둘 다 데몬 모드 지원 할겁니다~

  4. 수빈빠  댓글주소 수정/삭제 댓글쓰기 2008.11.10 16:05

    sqlite, derby, hsqldb 다 인기가 있습니다만..
    개인적으로 생각했을 때..

    1. 가벼운게 중요하다면 sqlite
    2. 조금 고급 기능이 필요하다면 derby

    정도인 것 같습니다... 그냥 몇 번 써본 느낌입니다..

    sqlite 써본 몇몇 개발팀(물론 C 버전이기는 하지만)에서
    들리는 얘기로는 거의 광팬 수준으로 좋아하더군요..

고전적인 자바 클래스의 테스트는 main() 메소드에 값을 찍어보는 코드를 넣어서 콘솔에서 확인합니다. 이클립스에 익숙해진 덕에 JUnit에서 System.out.println() 집어 넣는 것은 초딩같은 습관이라고 생각을 "저만"했었습니다. 하지만, 찍어본다는 것 그리고 그것을 눈으로 확인하는 것은 굉장한 심리적 안정감을 주기는 합니다. 아직 assertEquals() 는 보이지 않는 신뢰가 필요하기 때문이죠.

httpunit의 테스트코드를 보니 재밌는 부분이 있었습니다. 상당히 많은 수의 테스트케이스에 main() 메소드가 있었고, 그 메인메소드는 JUnit을 기반으로 해당 테스트코드를 수행하도록 만들어주는 것이었습니다.


suite() 메소드를 inline 리팩토링하면 junit.textui.TestRunner.run( new TestSuite( EncodingTest.class ));  를 통해서 실행을 합니다. Java Application 으로 실행한 결과는 다음과 같습니다.

..............
Time: 3.813

OK (14 tests)

물론 이 클래스는 JUnit을 통해서도 실행됩니다.

다른 사람의 코드를 읽는 것, 프로그래머 소통의 시작이 아닐까 생각해봅니다.

참고로 HttpUnitTest 클래스의 상속구조입니다. ctrl+T 로 이클립스에서 볼 수 있습니다.


 

Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. iolo  댓글주소 수정/삭제 댓글쓰기 2008.11.03 22:33

    대부분의 assertXXX 메소드들은 첫번째 파라메터로 메시지를 줄 수 있지 않나요?
    제 경우엔 unit test 안에서만 System.out과 System.err을 쓴답니다^^;

    • 케누 kenu허광남  댓글주소 수정/삭제 2008.11.04 01:55 신고

      메시지가 성격이 다르죠. 보통은 파라미터에 값을 찍어보니까요.
      하긴 실제 코드에서 System.out , System.err 쓰는 것보다는 테스트코드에서 쓰는 게 훨씬 낫죠.

제일 처음 자바를 시작했을 때, 에러(Error와 Exception 나뉘지만 에러로 표기합니다)화면을 보고 깜짝 놀랬습니다.

2008-10-06 13:27:06 ApplicationDispatcher[/] Servlet.service() for servlet download threw exception
java.lang.IllegalStateException: getWriter() has already been called for this response
        at org.apache.coyote.tomcat5.CoyoteResponse.getOutputStream(CoyoteResponse.java:568)
        at org.apache.coyote.tomcat5.CoyoteResponseFacade.getOutputStream(CoyoteResponseFacade.java:148)
        at kr.pe.okjsp.DownloadServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
        at kr.pe.okjsp.ControllerServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
... 중략 ...
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
        at java.lang.Thread.run(Thread.java:619)

저런 식으로 우수수 떨어지는 에러메시지는 초보에게는 공포감을 일으키기 충분합니다. "내가 그 정도로 잘못했는지 정말 몰랐어요"라는 감정이 생기죠. 사실 에러메시지의 상단 2~3줄만 봐도 문제의 원인을 파악할 수 있는데, 스택트레이스(Stack Trace)라 불리는 사정없는 에러메시지는 정말 "안 좋아"였습니다.

try{...} catch(Exception e) { System.out.println(e.getMessage()); }

저런 메시지 폭탄을 피하기 위해서 위 코드를 통해 핵심 메시지만 봅니다. 이 포스팅의 핵심은 저기서 나온 메시지들과 친해지라는 것입니다. 아마 자주 보일 것입니다.

가까이 하기 어려운 사실 하나는 "영어"로 된 메시지라는 것이겠죠. 영어는 못해도 자바는 좀 하신다면 공개된 소스나 디컴파일을 통해서 저 메시지 생성부분을 찾아볼 수 있습니다. 더구나 자바의 기본 라이브러리는 공개되어 있습니다. src.zip 파일이 그것이죠.

이클립스 툴이나 텍스트 에디터 등을 통해서 에러 메시지를 검색해보면 해당 부분의 소스를 볼 수 있을 것입니다.

또 다른 방법은 구글링을 통해서 소스를 검색해 볼 수도 있습니다. 위 메시지의 경우 검색어를 다음과 같이 넣습니다.


따옴표("")로 감싼 이유는 단어 구분해서 찾지 말고 문구 그대로 검색하라는 의미이고 filetype:java 는 확장자가 java인 파일만 검색하라는 뜻입니다.

이런 식으로 소스를 찾아서 에러원인을 볼 수 있다면, 아마 문제해결(Troubleshooting) 능력이 많이 좋아질 것입니다.

버그와 에러는 다르죠. 에러 메시지! 사라지지 말고 함께 해요.

ps. 공통 프레임워크 만드시는 분들 에러 씹지 말고 보내주세요. ^^;
Posted by 케누 kenu허광남

댓글을 달아 주세요

  1. npnglife  댓글주소 수정/삭제 댓글쓰기 2008.10.06 15:18 신고

    kenu님의 센스있는 구글검색이 더욱 도움이 됩니다.

  2. 정주Go  댓글주소 수정/삭제 댓글쓰기 2008.10.07 10:17

    오홋 좋은거 배우고 갑니다. 꾸벅 _ _

http://www.ibm.com/developerworks/kr/library/dwclm/20080826/ 

http://javapathfinder.sourceforge.net/ 

자바 프로그램의 데드락이나 발생가능한 예외상황을 찾아주는 프로그램이라고 합니다.

자바 패스파인더는 일반적인 디버거와 다르게 소프트웨어를 한번 실행하여 소프트웨어 상태를 확인하는 것이 아니라, 실행 가능한 모든 경로를 조사하여 발생 가능한 속성 위배(property violations) 사항(가령 deadlock이나 unhandled exception)을 확인하여 문제점을 보고한다.

from: http://www.ibm.com/developerworks/kr/library/dwclm/20080826/ 

사용자 삽입 이미지
Posted by 케누 kenu허광남

댓글을 달아 주세요