2011.09.30 17:52
텍스트 편집기인 Sublime Text2 에서 XML formatting 기능을 적용하는 방법을 알아본다.

1. XML 포멧팅 기능을 제공하는 Tidy 를 다운로드한다.


2. 다운로드한 tidy.exe 를 Path가 걸려있는 경로에 위치시킨다.
   (예: c:\windows\system32 )

3. 단축키를 바인딩한다. (Menu : Preferences > Key Bindings - User)

Default(Windows).sublime-keymap

[

// Formatting short key

{ "keys": ["ctrl+shift+x"], "command": "tidy_xml" }

]


4. tidy_xml 플러그인 스크립트 파일을 작성하여 Packages의 User 폴더에 위치시킨다.
  Sublime Text 2 Packages 폴더로 쉽게 이동하려면 Menu에서 Preferences > Browse Packages 를 클릭하면 된다.
  (예 : C:\Documents and Settings\Standard\Application Data\Sublime Text 2\Packages\User)

tidy_xml.py

import sublime, sublime_plugin, subprocess


class TidyXmlCommand(sublime_plugin.TextCommand):

  def run(self, edit):

    command = 'tidy -xml -i -utf8 -wrap 400 -q'


    # help from http://www.sublimetext.com/forum/viewtopic.php?f=2&p=12451

    p = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)

    result, err = p.communicate(self.view.substr(self.view.sel()[0]).encode('utf-8'))


    self.view.replace(edit, self.view.sel()[0], result.decode('utf-8'))


4. Sublime Text 2 에디터를 재구동한다.
5. XML 파일을 열고 전체선택한 뒤 단축키(ctrl+shift+x)로 포멧팅을 수행한다.

6. 참고 URL
   https://gist.github.com/1138554
   http://lab.artlung.com/ancient-tidy-tutorial/

Posted by kimgisa.net
2009.05.10 16:39
GoF의 저자이자 프레임워크 분야의 대가로 알려진 Ralph Johnson.
그의 논문인 Evolving Frameworks에서는 프레임워크가 어떠한 과정을 통해 발전해 나가는가에 대해 소개한다.

다음 그림은 시간흐름에 따른 패턴언어에서의 패턴들간의 관계를 보여준다.



원문 다운로드 : http://st-www.cs.uiuc.edu/~droberts/evolving.pdf
ArLoad님의 번역자료 : http://arload.wordpress.com/2008/09/15/evolvingframeworks/
Posted by kimgisa.net
2009.04.26 18:42

>> 문제상황
  사용자 메시지를 보여주기 위해 다음과 같이 구현하였다.

그런데, 사용자 메시지(userMessage)에 쌍따옴표가 포함된 경우,
쌍따옴표로 인해 의도하지 않게 해석되어 메시지가 잘려버리게 된다.

메시지(userMessage)가 아래와 같을때

수익자가 "채무자"입니다. 확인하세요.

다음과 같은 HTML코드가 생성된다.

화면에 출력되는 내용은   

수익자가

=> 채무자 앞의 쌍따옴표가 value속성의 값을 닫는 기호로 인식되어 뒤에 따라오는 내용이 잘려버렸다.


>> 해결방법
  간단히 다음과 같은 태그라이브러리를 구현하였다. 쌍따옴표를 HTML 특수문자인 " 로 치환한다.





Posted by kimgisa.net
2009.04.26 18:29

테이블 레코드의 데이터에 공백 문자가 2bytes 전각문자로 기록되어 있는 경우,
Trailing space를 제거하기 위해 trim()함수를 사용해도 제거되지 않는다.

오라클에서는 전각문자를 그에 상응하는 single byte 문자로 치환해 주는 내장함수를
제공한다.

이 함수를 사용하는 경우 2byte로 된 영문자, 숫자, 공백 등이 모두 1byte문자로 치환된다.

to_single_byte()




(참고) 반대로, single byte를 multi byte문자로 치환하려면 to_multi_byte() 함수를 사용하면 된다.

Posted by kimgisa.net
2009.01.18 20:36


소스코드를 나타내야 하는 포스팅을 할 때면, 어떻게 보기 좋게 구문강조를 할까 고민하게 된다.
하나하나 변수, 메소드, 매개변수 등의 syntax마다 다른 색상을 입히는 수고를 하기도 하고,
귀차니즘에 직면할 때는 이클립스와 같은 편집화면을 캡쳐한 이미지를 그대로 올리기도 했다.

이런 삽질을 피하고 싶다면, 여기 쓸만한 물건이 있다.
Google Code에서 제공하고 있는 syntax highlighter가 바로 그것이다.

아래와 같은 코드가 있다.

package net.kimgisa.example;

public class HelloWorld {
     public static void main(String[] args) {
         System.out.println("Hello World!!!");
     }
}

syntax highligher를 적용하면 요렇게 된다.
 

굿~~!!

적용 및 활용방법은 gyuha님의 블로그에 상세히 설명되어 있다.
유용한 정보를 깔끔히 정리해 주신 gyuha님께 감사~!!

Posted by kimgisa.net
2009.01.14 10:11
오라클에서는 쿼리 조회결과를 파일로 저장할 수 있는 기능을 제공한다.

다음과 같이 SPOOL Command를 사용하면 된다.




Posted by kimgisa.net
2009.01.07 19:51

1. OSGi 소개

OSGi(Open Service Gateway initiative) Alliance는 1999년에 썬 마이크로시스템즈, IBM, 에릭손 등이 구성한 개방형 표준 단체이다. (OSGi Alliance는 처음에 Connected Alliance라고 불렸음) 그 뒤 여러 해 동안 OSGi Alliance는 원격 관리 될 수 있는 자바 기반의 서비스 플랫폼을 제정해왔다. 이 표준 사양의 핵심은 응용 프로그램의 생명주기(Life cycle) 모델과 서비스 레지스트리(Service Registry)를 정의하는 프레임워크(Framework)이다. OSGi 표준 사양에는 이 프레임워크에 기반하여 매우 다양한 OSGi 서비스가 정의되어 있다.

  OSGi 프레임워크는 독립적인 자바/가상 머신 환경에서 제공하고 있지 못한 세련되고, 완전하며 동적인 컴포넌트 모델을 구현한다. 응용 프로그램 또는 구성 요소(번들, Bundle)는 다시 시동 과정 없이 원격지를 통해 설치(installed), 시작(started), 정지(stopped), 업데이트(updated) 그리고 제거(uninstalled)할 수 있다.

OSGi는 Embeddable(응용 프로그램 내부로 포함될수 있는) SOA를 구현하고 있다. 이를 통해 응용 프로그램 개발에서 가장 복잡하고 관리하기가 어려운, 모듈간의 동적(Dynamic) 관계와 의존을 매우 효과적으로 관리할수 있게 한다. (Web service based SOA가 네트워크를 중심으로 하는 SOA라면 OSGi는 Java Object based SOA이다.)



2. OSGi 프레임워크의 구성

 OSGi 프레임워크는 OSGi스펙의 가장 핵심적인 구성요소이다. 이 프레임워크는 번들이라 불리우는 어플리케이션에 표준환경을 제공해준다.

OSGi 프레임워크 계층
 - L0 : 실행환경 (Execution Environment) -  Java 환경에 대한 명세
 - L1 : 모듈 (Modules) - 클래스 로딩정책을 정의
 - L2 : 생명주기 관리 (Life Cycle Management) - 동적으로 번들들의 설치, 시작, 중지, 갱신, 제거와 같은 생명주기를 관리
 - L3 : 서비스 레지스트리 (Service Registry) - 번들들의 협력모델을 제공





3. 참고사이트

  - 공식사이트의 OSGi Technology : http://www.osgi.org/About/Technology#Framework

  - 위키피디아 정의
    원문 : http://en.wikipedia.org/wiki/OSGi
    한글 : http://ko.wikipedia.org/wiki/OSGi

  - Getting Started with OSGi
    원문 : http://javamix.tistory.com/184
    번역 : http://xguru.net/blog/451.html

  - OSGi를 이용한 Java Enterprise Application개발 동영상 강의
    http://www.ibm.com/developerworks/kr/library/dwcod/20080729/


Posted by kimgisa.net
2008.12.29 15:39
<문제상황>
IE환경에서 page Context Type을 이용한 excel downloading 구현하였다. 그런데 다음과 같은 에러가 뜬다.

에러메시지는 다음과 같다.

한글 IE에서는,
"xxxx 을(를) 다운로드할 수 없습니다.
이 인터넷 사이트를 열 수 없습니다. 요청한 사이트를 사용할 수 없거나 찾을 수 없습니다. 나중에 다시 시도하십시오,"


영문 IE에서는
"Internet Explorer cannot download <filename.jsp> from <our website>
Internet Explorer was not able to open this Internet Site. The requested site is either unavailable or cannot be found. Please try again later"


<해결방법>
구글신의 자문을 구해 답을 찾을 수 있었다.
간단히 다음과 같이 Cache-Control 을 세팅해주면 해결된다. (포인트 max-age=0 으로 세팅)
 response.setHeader("Cache-Control", "max-age=0");


<구현 예제>
<%@ page contentType="application/vnd.ms-excel; charset=UTF-8" %>
<head>
<%
    response.setHeader("Content-Type", "application/vnd.ms-xls");
    response.setHeader("Content-Disposition", "attachment;filename=DownloadFile.xls");
    response.setHeader("Content-Description", "JSP Generated Data"); 
    response.setHeader("Pragma", "public");
    response.setHeader("Cache-Control", "max-age=0");
%>
</head>
<body>
..........내용............
</body>
</html>



1.구글신 검색 참고사이트
http://forums.sun.com/thread.jspa?threadID=233446&forumID=45

2.html header에 대한 더 많은 정보를 원하시면, (그러나 영어의 압박 ;;;)
rfc 문서 : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3
좀더 깔끔한 정리 : http://www.mnot.net/cache_docs/
Posted by kimgisa.net
2008.08.19 23:10


사용자 삽입 이미지
  유가 나면 가끔씩 서점에 들리곤 한다. 특별히 사고 싶은 책이나, 관심거리가 있어서 서점에 가는 것은 아니다. 그 날도 생각없이 서점에 들어가 이곳저곳을 살폈다. 다양한 베스트 셀러들이 서점 입구에 즐비해 있었고, 사람들이 붐볐다. 예전에 보았던 책들도 아직 베스트셀러의 자리에서 물러나지 않은 것도 있었고, 파워리뷰어 Bee님^^이 보셨던 이외수 님의 '하악하악'도 여전히 베스트 셀러였다. (아직 향기가 나고 있었다. 필시 특수 향료로 책을 가공했음이 틀림없다.)

  이날 나의 시선을 빠져들게 했던 책은 '마지막 강의' 라는 책이었다. 얼마전에 회사 인트라넷에는 '마지막 강의'의 주인공 랜디 포시 교수의 생애에 관한 글이 올라왔었다. 그 소개된 짧은 글 속에서 먼가 삘(Feel) 받은 것도 있거니와, '마지막(Last)' 이란 단어에서 풍기는 엄숙함, 비장함 등 그런 감정들은 어느덧 계산대에 그책을 올려놓게 하였다. (사실 인터넷서점에서 구입하는게 훨씬 싸긴하다. 하지만 좋은 책을 싸게 구입했다는 만족감에 정작 책을 읽는데는 소홀해지는것은 나뿐일까?)

  이 책의 주인공은 랜디 포시(Randy Pausch)로 카네기 멜론대학의 컴퓨터공학 교수다. 누구나 알법한 Adobe, Google, EA, 월트 디즈니 이매지니어링에 동참했고, 컴퓨터 프로그래밍 입문에 도움을 주기 위해 Alice 프로젝트를 최초로 시작한 분이기도 하다.

  그의 업적과 발자취에서 알수 있듯이, 그는 시각적으로 사고하는 것을 매우 중요시 여긴다. 그의 마지막 강의에서 사용된 수많은 자료들은 텍스트가 아닌 전달하고자 하는 내용이 담긴 삽화와 사진들이었다. 나 또한 학창시절 발표자료를 만들면서 그런 시도를 많이 해 보았지만, 시각적 이미지를 통해 함축적인 내용을 포괄할 수 있는 정리능력은 대단히 어려운 일이었다.

  그는 췌장암을 선고 받고 길게는 6개월이라는 시한부 인생을 선고 받은 사람이었다. 누구나 '나에게 살날이 얼마 남지 않다면 나는 무슨 일을 할까'라는 고민을 많이 한다. 그는 자신의 가족을 위해, 자신을 위해, 그리고 자신의 학생들을 위해 도움이 될 수 있는 그런 일을 원했다.

  그가 선택한 것은 평생을 몸담고 있던 대학에서의 '마지막 강의' 였다. 이 강의를 통해 아직은 어린 자신의 아이들에게 전할 메시지를 담았고(훗날 그들이 커서 아버지의 메시지들을 들을 수 있게 DVD로 만들었다), 평생을 함께하기를 약속한 와이프를 위해 마지막 강의에서 특별한 이벤트를 기획했다. 그리고 자신이 살아오면서 중요하다고 생각한 지혜와 실천덕목을 강의에 참석한 사람들에게 전달했다.

........
'기초부터 알기' - 미식축구는 22명이 하는 경기다. 한번에 한명만이 공에 손을 댈 수 있다. 우리는 21명을 위한 훈련을 해야 한다. 당신은 반드시 기초부터 제대로 익혀야 한다. 그렇지 않으면 그 어떤 화려한 것도 해낼 수가 없다.

'장벽이 거기 서 있는 것은 가로 막기 위해서가 아니며, 그것은 우리가 얼마나 간절히 원하는지 보여줄 기회를 주기 위해 거기에 서 있는 것이다.'

'당신에게 정직한 의견을 말하는 사람. 더불어 늘 배려해 주고 쓰디 쓴 충고일지라도 사랑을 담아 전할 줄 아는 그런 분을 만나라.(저자는 이런분을 가리켜 '네덜란드 삼촌' 이라 칭한다.)'

50년간 지켜온 아버지의 교훈 - '진정한 희생과 겸손의 힘'

'시간은 당신이 가진 전부다. 그리고 당신은 언젠가, 생각보다 시간이 얼마 남지 않았다는 사실을 알게 될 것이다.'

'행운이란 준비가 기회를 만날 때 생기는 것이다.' - 로마의 철학자 '세네카'

'경험이란, 당신이 원하는 바를 얻지 못했을 때 얻어지는 것이다. 그리고 경험은 당신이 가진 것 중 가장 가치있는 것이다.'
........

  꿈을 꾸고, 그 꿈을 실현하기 위해 노력하는 자는 반드시 그 꿈을 이룬다. 그의 마지막 남은 몇개월간의 삶은 병으로 고통받는 환자의 모습이 아니었다. 그는 어릴쩍 꾸웠던 대부분을 꿈들을 성취했고, 마지막 까지도 학생들과 자식들을 위해 '삶의 지혜' 제공하는 진정한 교수의 모습으로 많은 사람들의 기억속에 남았다.

이제 나는, 그의 마지막 강의를 보려고 한다. (이 책에는 랜디 포시 교수의 직강 DVD가 동봉되어 있다.)


랜디 포시. 제프리 제슬로 지음 | 살림출판사
Posted By Kimgisa
Posted by kimgisa.net
2008.08.11 19:57
이번글은 지난 "[1부] 직접 만들어 보는 wma to mp3 Converter" 에 이은 두번째 글이다.
mp3 변환기에는 무수히 많은 편리한 GUI 툴들이 존재하지만, 이러한 툴을 사용하지 않고
직접 간단한 코드 작성과 등록작업을 하여 mp3변환기를 자신의 윈도우 환경에 구현해 본다.

이글의 목표 :
1. 배치(bat)파일의 작성법 이해
2. 특정 확장자에 원하는 팝업메뉴 추가하기
3. wma파일을 mp3로 변환하는 기능 구현

지난 포스팅에서 소개된 두개의 툴(ffmpeg, lame)을 이용하여 wma파일을 mp3로 변환할 수 있었다.
하지만, 매번 콘솔창으로 나가서 변환을 위한 명령어를 치는 일은 무척이나 귀찮은 작업이다.

2부 에서는 wma 를 mp3로 변환하는 기능을 배치파일(bat)로 작성해보고,
탐색기에서 wma파일에 [MP3 변환하기] 팝업메뉴를 추가해 간단하게 파일변환이 되도록 구현해 본다.

1. 파일의 배포
1.1. C: 드라이브 아래에 mp3Converter 라는 폴더를 만들고 1부에서 소개된 3개의 파일을 복사해 둔다.
사용자 삽입 이미지


2. 배치파일로 컨버터 만들기
2.1. 다음과 같이 wma2mp3.bat 파일을 작성한다.

파일명 : wma2mp3.bat
@echo off
echo ######################################################
echo  Converting wma to mp3...............
echo ######################################################
"c:\mp3Converter\ffmpeg.exe" -i %1 -vn -f wav - | "c:\mp3Converter\lame.exe" -V 6 - %1_cvtMp3
ren %1_cvtMp3 *.mp3
echo
echo ######################################################
echo  Coverting is completed.
echo ######################################################
pause

2.2. 위에서 작성한 wma2mp3.bat 파일을 1에서 만들어둔 mp3Converter폴더에 복사한다.


3. wma확장자의 팝업메뉴에 'MP3 변환하기' 기능 추가하기
3.1. 탐색기에서 [도구] - [폴더 옵션] - [파일 형식]으로 이동하면 다음과 같은 창이 뜨는데, 확장자가 WMA인 형식을 찾는다.
3.2. 이 창에서 [고급]을 클릭하여 [새로 만들기]에서 "MP3 변환하기"를 추가한다.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지


이제, wma파일위에서 우클릭을 해보자. [MP3 변환하기] 메뉴가 추가되어 있음을 볼 수 있다.
사용자 삽입 이미지



4. 테스트
4.1. wma 파일을 선택하여 [MP3 변환하기]를 수행한다.
사용자 삽입 이미지
콘솔창이 열리면서 wma파일이 mp3파일로 컨버팅되는 것을 볼 수 있다.


4.2. 컨버팅이 완료되면, 동일한 이름의 mp3파일이 생성된다. 재생하여 확인해 본다.
사용자 삽입 이미지


========================
2부에서 작업한 내용과 팝업메뉴에 등록하는 내용을 레지스트리 파일로 만들어,
알집을 이용해 실행압축파일로 엮어보았다.

* 설치하기 (압축해제 및 레지스트리에 팝업메뉴 등록)
 - MP3Converter.exe 를 실행시키면 관련파일이 c:\mp3Converter폴더에 압축해제된다.
 - c:\mp3Converter에 있는 installMp3Converter.reg 를 실행하여 레지스트리에 팝업메뉴를 등록한다.

* 설치된 파일 삭제하기
 - c:\mp3Converter에 있는 uninstallMp3Converter.reg 를 수행하여 레지스트리에 팝업메뉴정보를 제거한다.
 - c:\mp3Converter 폴더를 삭제한다.

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

이런 방법들을 응용하여, 자신만의 팝업메뉴를 등록하고 편리하게 윈도우를 이용해 보도록 하자.
이것으로 2부를 마친다.
Posted by kimgisa.net