아아악.. 페이팔 결제(Paypal Payment) 모듈 개발에서 삽질하다..

얼마 전 페이팔 결제 모듈 부분을 작성하고 싶다는 어떤 분의 의뢰로 페이팔 API를 이용한 결제/조회/환불 인터페이스를 작성할 일이 있었다.. 어차피 결제 부분의 API는 페이팔에서 다 제공하기 때문에 난도가 높은 작업도 아니고 잠깐 짬을 내면 가능한 일이기에 작업 의뢰를 받아들였다.

외부 사이트에서 페이팔을 이용한 결제 진행에는 몇 가지 방법을 제공하고 있다.
하나는 머천트 사이트에서 '결제하기' 버튼을 클릭하면 페이팔 사이트가 열리고 새로 열린 페이팔 사이트에서 결제를 진행하는 방식이 있고 또 다른 하나는 머천트 사이트 내에서 모든 결제를 진행하며, 백그라운드로 페이팔 서버와 결제 정보 및 그 결과를 주고받는 방식이 있다.  그 외에도 몇 가지 다른 결제 방법을 제공하지만 가장 흔하게 쓰이는 방식이 이 두 가지가 아닌가 한다..  

국외를 대상으로 한 사이트라고 그래서 사이트 내에 페이팔 결제를 통합하는 두 번째 방법으로 작업방향을 잡고 대강의 인터페이스 작업을 마치고 소스를 전달해 드렸는데 테스트 계정으로는 카드 결제가 잘 진행되는데 실제 정보를 세팅해서 결제를 진행하니 계속 오류가 나는 게 아닌가..

"Merchant Country Not Supported" 라나.. 뭐라나..

이 오류로 며칠 고민하다 종국에는 페이팔 디벨로퍼 커뮤니티에서 그 원인을 찾을 수 있었다.
해당 머천트는 미국이나 영국 소재의 페이팔 계정을 가지고 있어야 한다는 것.

아니, 이렇게 중요한 정보는 개발자 센터에서 눈에 띄는 위치에 명시해 줘야 하느 거 아닌가?
개발자 커뮤니티에 들어가 보면 같은 증상으로 호소하는 수많은 개발자로 넘치더구만...
개발 안내 페이지에 "Direct Payment only supports US and UK at this time" 한 줄의 문구만 있어도 이렇게 삽질을 안 하잖아.. 앙?

개발 명세대로 개발은 개발대로 다~ 하고 테스트하다 문제나오고.. 그거 원인 찾느라 커뮤니티 뒤지고. 결과는 '에? 이산이 아닌가벼~' 하는 허탈감을 맛보게 할 심산이 아니라면 말야...

내가 눈이 삐었나 보다.. 이글 작성하면서 보니 개발자 센터에 결제 방법 링크에 US니 UK이니 하는 문자가 적혀 있다..
하지만 결제방법을 선택하는 순간에 저 두 문자가 해당 머천트 계정의 소재지와 관계한다고 누가 생각이나 할 수 있단 말인가?  

페이팔 결제 방식

저 US와 UK가 무얼 의미하는지 미리 좀 알려달란 말이닷!!



결국 사이트에서 아래와 같은 문구가 있었는데 놓치고 지나간게 화근.. 투정 좀 부리려다 내 얼굴에 침 뱉는 꼴이 되어 버렸네..
사용자 삽입 이미지

미안하다.. 안내문구 있다..


어쨌거나 저쨌거나 오늘의 교훈 :: 깨알 같은 안내문도 잘 읽자. 그것이 읽기 싫은 영어 일지라도..

페이팔 결제방식
http://dialup.egloos.com/1669856

2008/04/08 16:41 2008/04/08 16:41
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    Brandon Lee

    미국에서 온라인 쇼핑몰을 운영하고 있습니다. 페이팔 Pro를 연결해 주실 분을 찾고 있습니다. brandonl1004@gmail.com으로 연락주세요. 전화 통화 원합니다.

  2. Blog Icon
    서비

    안녕하세요. 댓글 확인이 늦었습니다.
    gmail쪽으로 연락드리겠습니다.

  3. Blog Icon
    서비

    회신드리려고 하는데 남겨주신 brandonl1004@gmail.com 은
    등록되지 않은 메일이라고 합니다.
    확인 부탁드립니다.

  4. Blog Icon
    bie

    서비님 안녕하세요. 평소에RSS로 읽다가 궁금한게 있어서 실례인줄 알지만 댓글 하나 남깁니다.
    저도 이번에 Payments Pro를 이용하여 API로 백단에서 결제 모듈을 붙이려고 하는데 역시나 같은문제...로 골머리를 ...
    (꼭 API를 이용해야하므로 Standard를 안됩니다)

    쇼핑몰이 한국에 있는데 Pro를 이용하기 위해서 'U.S' 계정을 그냥 만들기만 하면 되는것인지
    아니면 US계정을 만들고, US계좌(?)를 만들고, US사업자등록(?)등 세부절차가 더 있는지....

    어떠한 방식으로 pro를 이용하셨는지 도움좀 부탁드립니다^^;

  5. Blog Icon
    서비

    bie님 안녕하세요.
    요즘 업무때문에 블로그 자주 확인하지 못해서 회신 늦어졌습니다.
    paypal payment pro로 운영중이신 사이트에서 고객의 결재를 끝내시려면
    Merchant용 페이팔 계정과 U.S.은행계좌가 있으면 됩니다. 기술적으로는
    해당 사이트는 Direct Payment 와 Express Checkout 결재방식을
    모두 구현해야 합니다.
    ( 참조url : https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_WPWebsitePaymentsPro )
    이전에 작업했을때는 의뢰하신분께서 US계좌 오픈절차를 진행하셔서
    제가 직접 계좌를 여는데 관여하진 않았습니다.

  6. Blog Icon
    송주영

    쇼핑몰을 페이팔 Pro를 연결 하고자 합니다.
    연락 부탁합니다. (전화번호 남겨주세요)
    ikkius@gmail.com

  7. Blog Icon
    서비

    송주영님 안녕하세요.
    회신드렸습니다.
    확인 부탁드립니다.

  8. Blog Icon
    bie

    감사합니다. 코딩보다 주변설정이 더 골치가 아프네요.
    댓글에 저에게 많은 도움이 된 것 같습니다. 정말 감사합니다 ^^

  9. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  10. Blog Icon
    서비

    회신 드렸습니다.

  11. Blog Icon
    Hunchiri

    안녕하세요.

    website payment pro 를 이용하여
    싱가폴에서 웹사이트를 운영하려고 합니다.

    계정생성에서 부터 맞게 하고 있는건지 의문이 들어
    이렇게 문의드립니다.

    관련자료가 없어서 너무 갑갑하네요.
    영어의 압박도 눈물겹게 힘들고요.

    바쁘시고 번거로우시겠지만,
    website payment pro 모듈을 이용하기 위한 절차의 정리를 부탁드립니다.

    kongyber@naver.com 연락부탁드립니다.

    감사합니다.

  12. 안녕하세요 제가 website payment pro 이용하여 결제를 붙히려고 합니다.

    관련하여 처음부터 순서 정리된 자료가 있을까요?? 아님 참조하신 사이트라도

    영어의 압박으로 영문만 보고하기에는 벅차네요

    회신 기다리겠습니다.

    jkno@crosscert.com

    감사합니다.

  13. 안녕하세요? 개발자님,
    페이팔 결제시스템을 이용해 쇼핑몰을 구축하려 합니다.
    이미 미국내 사용을 위한 쇼핑몰을 운영 중이며 이 웹페이지를 이용하여 미국 외의 이용자를 위한 결제 버튼을 만들려고 합니다.
    계정과 제품 등록은 마친 상태인데 문제는 shipping cost입니다. 접속자의 지역에 따라 shipping cost를 차별적으로 적용해야 하는데 이를 구현하려면 페이팔 API로 구현해야 한다고 들었습니다. 이러한 일의 솔루션을 가지고 계신지요? 가능하시다면 일을 맡기고 싶습니다. sm.cha@sena.com으로 연락주십시오.
    감사합니다.

  14. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  15. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  16. Blog Icon
    filco

    안녕하세요 개발자님.

    뉴질랜드에서 인터넷 쇼핑 사업을 하는 사람입니다.

    이번에 한국 홈페이지를 만들었는데요.

    한국 신용카드 해외 결제가 잘 안되는 문제로 페이팔 결제 시스템을 넣고 싶어요.

    인터넷에 정보가 너무 없다 보니 막막하여 문의 드려봅니다.

    의뢰상담 꼭 받고 싶습니다.

    이메일로 전화번호 남겨 주시면 전화 통화 드리고 싶습니다.

    filco518@gmail.com

  17. Blog Icon
    삼척동자

    안녕하세요 개발자님

    페이팔 페이먼트 프로 자격조건을 어떻게 알수 있는지요?

    jbg0715@hotmail.com 으로 답변부탁드립니다.

    감사합니다.

  18. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  19. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  20. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  21. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  22. Blog Icon
    IDS

    안녕하세요 개발자님
    위의 내용을 보니까
    싱가폴 법인으로는 Payments Pro를 이용하여 API로 백단에서 결제 모듈을 붙이는 것이
    불가능한 것으로 되어있는데....

    그럼 미국계정으로 위 방식대로 연결을 하고
    싱가폴 법인으로 입금 가능한지요..??

    위 방식으로 연결을 하고 싶은데
    안내 주시면 의뢰를 하고싶습니다.

    e-mail : paulkim5000@gmail.com 입니다.

  23. Blog Icon
    Nutrition

    안녕하세요 개발자님.
    미국에서 건강식품 사업을 하는 사람입니다.

    이번에 한국에 해외직구 홈페이지를 만들었는데요.
    한국의 비씨카드,삼성카드 등을 처리할 수 없어 매출이 저조합니다.
    이에 외국계 PG Payflow를 그누보드 기반 사이트에 적용하기 위한 모듈 제작 및 사이트 수정작업을 진행하고 있습니다.

    준비는 되었는데, 이에 맞게 업그레이드 할 개발자를 찾지 못하고 있습니다.
    인터넷 서칭중에 지금 사이트를 방문하게 되었는데
    페이팔 결제 시스템을 넣고 싶어요.
    안내 주시면 의뢰를 하고 싶습니다.

    real.bluepop@gmail.com

  24. Blog Icon
    김태완

    안녕하세요.

    국내 업체인데요 PayPal Payment Pro 계정을 이용해서 API를 이용하여 웹서버 백단에서 정기결제를 하려고 합니다. (달러 결제입니다)

    미국 법인, 계좌만 만들면 Pro 계정 설정이 가능한가요?
    다른 승인 절차라던가 조건은 없나요?

    twkim@gtone.co.kr로 답변 부탁드립니다.

    감사합니다.

  25. Blog Icon
    페이팔 도와주세요 제발요

    안녕하세요. 한국에서 스타트업 하는 대표입니다.
    마켓 플랫폼 런칭 준비중인데 한국에서 하는 글로벌 음악 데이터 마켓 플랫폼입니다.
    페이팔에서 마켓 플랫폼은 사전 승인을 받아야한다는데요.거절을 받았습니다.
    진짜 어떻게 해야하나요? 거절을 받은 사유도 거절을 준 부서와도 연락도 할수 없는 상황입니다.
    어떻게 해야하는지 도와주시면 정말 감사드리겠습니다..
    정말 지금 울고 싶습니다..

소켓통신 서버/클라이언트 통신시 IO Blocking 상태에 빠지는 코드와 해결 방안

2008/04/03 19:15

서비 JAVA , , ,

java study 질답 게시판에서 서버-클라이언트 소켓 통신을 하는데 통신이 단절된다는 내용의 질문을 접했습니다.

질문자의 원글 보기..


코드를 보면 지극히 정석으로 코드를 작성 해 둔 상황입니다. 하지만 동작 중 어느 순간이 되면 통신이 안되기 시작하죠..
이는 비단 자바뿐만 아니라 다른 언어로 소켓 프로그래밍을 하더라도 동일한 현상이 발생할 겁니다.
원 질문자께서 저 코드로 어디까지 다버깅을 해 보셨는지는 알지 못하겠지만, 제가 판단하건데 동작이 안되는 시점은
필시 클라언트와 서버 양쪽 모두 while((read = bin.read())!=-1) 문에서 서로의 데이터를 기다리느라
블록 상태에 빠졌기 때문일 겁니다.

왜? 무슨 이유로 read() 에서 블록 상태에 빠졌을까요?

원인은 서버 소켓 쓰레드인 ClientHandler 쪽에서 찾을수 있습니다. 
서버 소켓 코드를 보시면 클라이언트에서 받은 데이타를 읽는게 끝이나면 클라이언트로 데이타를 전송하는
절차적 구조로 작성 되어있는데요..

문제는 클라이언트로부터 데이터가 유입되는
[code]// received InputStream in = null;
BufferedInputStream bin = null;
in = m_socketClient.getInputStream();
bin = new BufferedInputStream(in);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while ((read = bin.read()) != -1) {
    baos.write(read);
}
[/code]
부분이 원인입니다... 감이 좀 잡히시나요?

한번 API를 확인 해 볼 필요가 있겠군요. API를 보시면.. BufferedInputStream의 read() 메소드의 리턴 값을
the next byte of data, or -1 if the end of the stream is reached. 라고 명시하고 있습니다.
'스트림의 끝까지 갔을 때 -1을 리턴 한다'라고.. 데이터가 끝났을 때 -1이 아닙니다.

비록 클라이언트가 보낸 데이타는 끝이 났을지언정 클라이언트와 연결된 스트림은 끝나지 않았단 말이죠.
쉽게 말하자면 bin.read()에서 block된 상황은 BufferedInputStream인 bin이 끝나지 않았으며, 언젠간
새로운 데이터가 유입될테니 대기중이다.
는 얘기지요.

이제 좀 감이 잡히시죠? ^^
결국 지금의 코드 대로라면 서버 소켓은 클라이언트에서 보낼 데이터를 영원히(혹은 time out까지) 기다리고 있는거죠..

이제 원인을 알았으니 해결책에 대한 아이디어도 떠오르셨을거라 생각합니다.
이런 경우 클라이언트 소켓도 쓰레드로 돌려야 하지만 인풋 스트림과 아웃풋 스트림도 각각 쓰레드로 처리 해
주셔야 질문과 같이 blocking으로 어플리케이션이 멈춰있는 문제를 회피할 수 있습니다.
 

2008/04/03 19:15 2008/04/03 19:15
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  2. Blog Icon
    Nereid

    관리자님 안녕하세요. 프로그래밍중 안되는 부분이 있어
    해결책을 찾아보다가 여기서 같은 케이스를 찾게되서요.

    제가 초보라 해결책이 잘 떠오르지 않는데
    저런경우 인/아웃 스트림 쓰레드 처리에 대하여 좀 알려주실수 있을까요?

    부탁드립니다. 감사합니다.

IE8의 IE7 에뮬레이션 CSS Hack

일전에 IE8 은 기본적으로 web standard 모드로 동작한다는 글을 올린적이 있습니다.
IE8을 설치하면  'Emulate IE7' 메뉴가 있는데요. 이는 개발자, 디자이너가 아니라면 'Emulate IE7'를 클릭하여
기존 IE7으로 웹서핑을 하듯이 브라우저를 이용 할 수 있습니다.
Emulate IE7

IE7 에뮬레이션 버튼


하지만 사이트를 사용자들에게 'IE7모드로 사용해 주세요.'와 같이 요구하는것은 심리적 반발감을 일으킬수도 있을겁니다.

이의 우회방법으로 버전타겟팅을 이용한 편법이 있습니다.
메타태그를 이용하여 ie7렌더링 엔진을 사용하게 함으로써 레이아웃이 망가지는것을 피하는 방법입니다.
[code]
<meta http-equiv="X-UA-Compatible" content="IE=7" />

[/code]
위와 같이 메타태그를 html 헤더에 삽입하면 됩니다만.. 문제는 ie7용 css 코멘트핵을 사용하고 있을 경우인데요.
메타태그로 렌더링은 ie7처럼 하게 되었지만 브라우저 자체는 ie8이므로 ie8의 핵을 이해하므로 아래와같이 ie7용
CSS를 적용해 주실 수 있습니다.
[code]
<!--[if gte IE 7]>
  <link type="text/css" rel="stylesheet" href="styleie7.css" />
<![endif]-->

[/code]
브라우저가 'IE7과 그이상'인 경우 styleie7.css를 적용하겠다는 뜻입니다.
2008/03/27 15:53 2008/03/27 15:53
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

HitTest를 통한 마우스 아래의 컨트롤 구하기

WPF 어플리케이션이든 아니든 마우스가 위치한 곳의 컨트롤을 알아야 할 때가 종종 있다.
다른 방식으로도 마우스 아래에 있는 컨트롤을 알아낼 수 있지만 WPF라면 아래와 같이 VisualTreeHelper클래스의
HitTest를 이용해서 컨트롤을 얻어오는 방법도 있다.

[code]
T GetItemAtLocation(Point location)
{
    T foundItem = default(T);
    HitTestResult hitTestResults = VisualTreeHelper.HitTest(treeView,location);
   
    if(hitTestResults.VisualHit is FrameworkElement)
    {
        object dataObject = (hitTestResults.VisualHit as
            FrameworkElement).DataContext;

        if(dataObject is T)
        {
            foundItem = (T)dataObject;
        }
    }

    return foundItem;
}
[/code]

위 메소드의 사용법은 이렇게 될 수 있다.
[code]
void treeView_Drop(object sender,DragEventArgs e)
{
    if(e.Data.GetDataPresent(typeof(Task)))
    {
        Task sourceTask = (Task)e.Data.GetData(typeof(Task));
        Task targetTask = GetItemAtLocation(MouseUtilities.GetMousePosition());

        // Code to move the item in the model is placed here...
    }
}
[/code]

2008/03/21 12:09 2008/03/21 12:09
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF 문서 & 블로그 정리

Maximizing WPF 3D Performance on Tier-2 Hardware

WPF Amazon Explorer Using 3D

WPF를 사용하여 컨트롤 및 3D 표면에 비디오 추가

WPF 미디어 비주얼 관련 코드 조각 많은 블로그

윈도우 미디어 플레이어의 Visualization을 WPF로 제작하기

Using COM Interop to Create a WPF Visualization for Windows Media Player

Walkthrough: Hosting an ActiveX Control in Windows Presentation Foundation

각 종 대화상자 및 커스텀 대화상자 제작( 영문 , 한글 )

WPF상에서의 각종 드래그앤드롭

Win32 위에 WPF컨트롤 랜더링 하기

WPF Data Binding 개발담당 Beareiz Costa의 블로그 : 각 컨트롤에 데이타를 바인딩하는 상세기법 설명

C#으로 스크롤바 커스터마이징 하기

Vista Shell 스타일의 Drag & Drop  : Screencast보기

Rendering text in the adorner layer

WPF 어플리케이션 성능 최적화 MSDN 문서

Thread를 이용한 파일복사하기-프로그래스바

Printing a Form in a report fashion (release 2.2)

Mole II for WPF

WPF Podcaster - skinning 기법과 백그라운트 컬러 변경에 경악!!

WPF Ribbon Control Library - MS Office 2007에 적용된 리본 인터페이스에 대한 WPF 라이브러리

WPF Weather reader control - 날씨 컨트롤

2008/03/20 18:32 2008/03/20 18:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

자바 날짜/시간 계산 예제 코드 :: Java Date Code Snippet

update java8 부터는 JodaTime에 기반한 패키지가 포함되어 훨씬 간단하고 쉬운 방법으로 일자관련 기능을 사용할 수있습니다. http://www.yunsobi.com/blog/649

시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
[code]
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );
[/code]

현재 시각을 가져오기.
[code]
Date today = new Date ();
System.out.println ( today );
[/code]
결과 : Sat Jul 12 16:03:00 GMT+01:00 2000

경과시간(초) 구하기
[code]
long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );
[/code]

Date를 Calendar로 맵핑하기
[code]
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );
[/code]

날짜(년/월/일/시/분/초) 구하기
[code] import java.util.*;
import java.text.*;
SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime ); [/code]

날짜(년/월/일/시/분/초) 구하기2
[code] GregorianCalendar today = new GregorianCalendar ( );
int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );

GregorianCalendar gc = new GregorianCalendar ( );
System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) ); [/code]

날짜(년/월/일/시/분/초) 구하기3
[code] DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime()); [/code]

- 표준시간대를 지정하고 날짜를 가져오기.
[code] TimeZone jst = TimeZone.getTimeZone ("JST");
// 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.
Calendar cal = Calendar.getInstance ( jst );  
// 또는
// Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " + cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " ); [/code]
결과 : 2000년 8월 5일 16시 16분 47초

영어로된 날짜를 숫자로 바꾸기
[code] Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) ); [/code]

"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
[code] SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );
String inString = "Sun, 5 Dec 1999 00:07:21";
ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );
System.out.println ( outString ); [/code]

숫자 12자리를, 다시 날짜로 변환하기
[code] Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
//예 938291839221
System.out.println ( ttl );  
Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted ); [/code]

특정일로부터 n일 만큼 이동한 날짜 구하기

특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다

특정일에서 일정 기간후의 날짜 구하기2
[code] //iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;
public String getDate ( int iDay ) {
Calendar temp=Calendar.getInstance ( );
temp.add ( Calendar.DAY_OF_MONTH, iDay );
int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );
StringBuffer sbDate=new StringBuffer ( );
sbDate.append ( nYear );
if ( nMonth < 10 ) sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 ) sbDate.append ( "0" );
sbDate.append ( nDay );
return sbDate.toString ( );
} [/code]

현재날짜에서 2달전의 날짜를 구하기
[code] //오늘 날짜를 기준으루..
Calendar cal = Calendar.getInstance ( );
//2개월 전....
cal.add ( cal.MONTH, -2 );
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) ); [/code]

달에 마지막 날짜 구하기
[code] for ( int month = 1; month <= 12; month++ ) {
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
} [/code]

해당하는 달의 마지막 일 구하기
[code] GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday ); [/code]

특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
[code] Calendar cal = Calendar.getInstance ( ); cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) ); SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" ); System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) ); System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) ); [/code]

해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
[code] Calendar calendar = Calendar.getInstance ( ); calendar.set ( 1999, 0, 1 ); int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH ); [/code]

어제 날짜 구하기

오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..

어제 날짜 구하기2
[code] import java.util.*;
public static Date getYesterday ( Date today ) {
if ( today == null ) throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );
return yesterday;
} [/code]

내일 날짜 구하기
[code] Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) ); [/code]

내일 날짜 구하기2
[code] Calendar today = Calendar.getInstance ( ); today.add ( Calendar.DATE, 1 ); Date tomorrow = today.getTime ( ); [/code]

오늘날짜에서 5일 이후 날짜를 구하기
[code] Calendar cCal = Calendar.getInstance(); c.add(Calendar.DATE, 5);[/code]

날짜에 해당하는 요일 구하기
[code] //DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스 일부입니다.
import java.util.*;
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 ) m_week="일요일";
else if ( day_of_week == 2 ) m_week="월요일";
else if ( day_of_week == 3 ) m_week="화요일";
else if ( day_of_week == 4 ) m_week="수요일";
else if ( day_of_week == 5 ) m_week="목요일";
else if ( day_of_week == 6 ) m_week="금요일";
else if ( day_of_week == 7 ) m_week="토요일"; [/code]

콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
[code] //gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) ); [/code]

두 날짜의 차이를 일수로 구하기

각각의 날짜를 Date형으로 만들어서 getTime()하면
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.

두 날짜의 차이를 일수로 구하기2
[code] import java.io.*;
import java.util.*;
Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
// 오늘로 설정.
cal.setTime ( today );  
Calendar cal2 = Calendar.getInstance ( );
// 기준일로 설정. month의 경우 해당월수-1을 해줍니다.
cal2.set ( 2000, 3, 12 );  
int count = 0;
while ( !cal2.after ( cal ) ) {
count++;
//다음날로 바뀜
cal2.add ( Calendar.DATE, 1 );  
System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}
System.out.println ( "기준일로부터 " + count + "일이 지났습니다." ); [/code]

두 날짜의 차이를 일수로 구하기3
[code] import java.io.*;
import java.util.*;
public class DateDiff {
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 ) {
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;

if ( nYear1 > nYear2 ) {
for ( int i = nYear2; i < nYear1; i++ ) {
cal.set ( i, 12, 0 ); nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1 += nDiffOfYear;
} else if ( nYear1 < nYear2 ) {
for ( int i = nYear1; i < nYear2; i++ ) {
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2 += nDiffOfYear;
}
cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1 += nDiffOfDay;
cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2 += nDiffOfDay;
return nTotalDate1-nTotalDate2;
}
public static void main ( String args[] ) {
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
} [/code]

파일에서 날짜정보를 가져오기
[code] File f = new File ( directory, file );
Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );
System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND)); [/code]

날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
[code] SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );
for ( int i = 0; i < 48; i++ ) {
c.clear ( ); c.set ( 2000, 1, 3 - ( i * 7 ) );
java.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
} [/code]

쓰레드에서 날짜 바꾸면 죽는 문제

Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소스:
[code] public void run ( ) {
while ( true ) {
try{
timer.sleep ( 60000 );
} catch ( InterruptedException ex ) { }
lblTimeDate.setText ( fGetDateTime ( ) );
repaint ( );
}
}

public String fGetDateTime ( ) {
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";

SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );
long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
} [/code]

해답:
[code] // 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( ) {
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );
return sdf4.format ( now );
} [/code]

날짜와 시간이 유효한지 검사하려면...?
[code] import java.util.*;
import java.text.*;
public class DateCheck {
boolean dateValidity = true;
DateCheck ( String dt ) {
try {
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false );
Date dt2 = df.parse ( dt );
} catch ( ParseException e ) {
this.dateValidity = false;
} catch ( IllegalArgumentException e ) {
this.dateValidity = false;
}
}

public boolean datevalid ( ) {
return dateValidity;
}

public static void main ( String args [] ) {
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
} [/code]

두 날짜 비교하기(아래보다 정확)

그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다

두 날짜 비교하기2
[code] import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;
public class DayComparisonTest {
public static void main(String args[]) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");
Calendar aDate = Calendar.getInstance();
// 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);
// 시스템 일시
Calendar bDate = Calendar.getInstance();
// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );
bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );
if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
} [/code]

2008/02/26 11:13 2008/02/26 11:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2010/07/02 17:36
    자바/ 시간 날짜 예제 Tracked from Make me Funny
  1. Blog Icon
    난학생

    찾고 있던 자료인데 감사해요 ^^

  2. Blog Icon
    DKdak

    아이고.. 한참 찾았는데.. 감사합니다.

  3. Blog Icon
    임진우

    유용한 정보 고맙습니다.

    퍼가겠습니다.

  4. Blog Icon
    최경렬

    시간 차이값을 조사하려고 검색 했는데 필요했던 것보다 더 정리를 잘 해 주셨네요.
    감사합니다.
    담아가겠습니다.

  5. Blog Icon
    JW

    깔끔한 정리 감사합니다.
    담아갈께요~

  6. Blog Icon
    정연규

    좋은 정보 감사합니다.
    출처남기고 담아가겠습니다~

  7. Blog Icon
    전병태

    정보 감사합니다.
    출처 남기고 담아가겠습니다.

  8. 잘 정리된 정보 감사합니다.
    D-Day 기능을 구현하고 있었는데 여기에 딱 있네요.

  9. 정말 좋은 정보 감사합니다.
    출처를 명시하고 퍼가겠습니다.
    다시한번 감사드립니다.

  10. Blog Icon
    sdafasdf

    아 ㅡㅡ 패키지 임포트 왜 빼놔요? ㅄ같네

  11. Blog Icon
    ㅋㅋㅋ

    병신은 님 아닌가요?

  12. Blog Icon
    ㄷㄷ

    코딩 한번이라도 제대로 해보신분이긴 한건지;
    그정돈 기본으로 하실 줄 알아야죠

  13. Blog Icon
    쯧쯧

    지금 공부나 제대로 하실지, 일이나 제대로 하고 계실지...... 수준이 보이네요 쯧쯧.. 나중에 마주치지 않기를 바랄 뿐입니다

  14. Blog Icon

    밥은 드시고 다니시나요???

  15. Blog Icon
    개발자

    와~~~ 정리 잘되어있네요 .. 감사합니다^^

  16. Blog Icon
    나같은사람

    정말 아주 아주 좋은정보 감사 함니다.
    이런 자료많이 올려주시면 감사하겠습니다.
    잘쓰겠습니다

  17. Blog Icon
    허어얼

    정리가 넘 잘되었네요 굿굿

  18. Blog Icon
    민경우

    정말 감사합니다 안드로이드 하나도 모르는데 이런 꿀같은 정보가...

  19. Blog Icon
    배우는자

    안녕하세요 요즘 자바 그레고리아 켈린더 함수 배우는 학생인데요

    그 5일뒤 소스를 제가 그대로 적용 시켜봤는데 뭔가 에러가 나더라구요..

    염치없지만.. 제가 이유를 좀 알고싶은데 혹시 가르쳐주실수 있으신가여

  20. Blog Icon
    배우는자

    아 에러 잡았습니다 소스 감사합니다.

  21. Blog Icon
    김정식

    너무 유용하게 잘 봤습니다.^^

  22. Blog Icon
    감사합니다

    감사합니다!!

  23. 잘 보고 베껴 갑니다.
    함께 보려고
    http://blog.daum.net/andro_java/181
    페이지에 올렸습니다.

  24. Blog Icon

    감사합니다. 잘 보고 갑니다

손쉽게 파비콘( favicon.ico )을 만들어 봅시다.

파비콘(favicon)은 웹서핑 중에 자주 보셨을 텐데요.. 아래 이미지와 같이 주소표시줄 앞에 나타나는 작은 아이콘을 지칭합니다.

파비콘 적용된 주소표시줄

파비콘이 적용된 주소표시줄



파비콘은 즐겨찾기와 URL표시줄에 작은(16X16) 사이즈의 아이콘으로 사이트의 로고를 나타내는 기능을 하며
마이크로소프트 Internet Explorer 5.0 부터 추가되어 현재 대부분의 브라우저에서 이 기능을 지원하고 있습니다.

사이트에 파비콘을 넣는 방법은 간단하지만, 아이콘(ico)파일을 만들기가 귀찮아 적용하지 않는 경우도 많을 거라 생각합니다.
오늘 우연히 러시아 사이트 중에 이 파비콘을 웹상에서 만들어 주는 곳을 찾게 되어 소개 하고자 합니다.

http://favicon.ru/en으로 접속하시면 영문으로 구성된 파비콘 제작 페이지를 보실 수 있습니다.
이메일 주소를 이미지로 만들어 주는 사이트와 비슷하다고 생각하시면 되는데요. 이 사이트만의 독특하고 신기한 기능이 있습니다.
만들어진 파비콘을 웹상에서 픽셀단위로 수정하여 다시 다운로드 받을 수 있다는 겁니다.

순서는 여타 이미지 제작 웹페이지와 크게 다르지 않습니다.

  1. 이미지를 업로드 하고,
  2. 제작된 파비콘을 다운로드 받거나,
  3. 수정하여 다운로드 받습니다.

파비콘 제작 사이트

파비콘 만들 이미지를 선택하고 Create favicon.ico! 버튼클릭



파비콘 제작 사이트

그냥 다운로드 버튼을 누르기 전에 Edit favicon을 클릭합니다.



파비콘 제작 사이트

와우~ 웹에서 에디팅까지 됩니다.



[Flash] /blog/attachment/1092160473.swf





아래 사이트에서 파비콘에 대한 더 많은 정보를 얻으실 수 있습니다.
http://www.thesitewizard.com/archive/favicon.shtml

2008/01/08 00:55 2008/01/08 00:55
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 새 파비콘 멋집니다. ^_^

  2. 지인우인님 다녀가 주셔서 고맙습니다.
    제가 찍은 사진으로 만들어서 뿌듯하기까지(^^;;) 합니다.

  3. Blog Icon
    유남쌩

    오~ 이게 파비콘이었구낭^^

    인생 뭐 있나요? ㅎㅎㅎ

    푸켓 잘 다녀오삼~

  4. Blog Icon
    서비

    난 푸켓 못 가삼!!!!
    이모디오닷컴 뒷수습 하고 있으삼!!!!

자바 어플리케이션(jar)을 실행파일(exe)로 만들기 :: launch4j

자바 어플리케이션도 실행 jar ( Executable JAR ) 파일로 작성 하면, jar파일을 더블클릭하여 실행하는 것이 가능합니다만..


정말?


자바어플리케이션을 실행할 PC에 자바구동환경( 자바런타임 JRE )이 미리 설치 되어 있지어야 한다는 약점이 있습니다.
이 때문에 자바 Swing/AWT등으로 작성된 GUI어플리케이션의 경우 어플리케이션 작성 후 Executable JAR파일을
윈도우용 실행 파일(exe)로 감싸는(Wrapping)하는 단계를 거치게 됩니다.

Executable JAR 파일을  exe파일로 감싸데는 몇 가지 방법이 있지만 이번 포스팅에서는 launch4j를 이용해 자바 어플리케이션을
exe형태의 파일로 변환하는 방법을 소개토록 하겠습니다.

잠깐 launch4j를 소개하자면 sourceforge.net 에 등록된 프로젝트로 Cross-platform Java executable wrapper를 구현하고 있습니다.
사용법의 간편함과 다양한 옵션이 존재하는 장점 외에도, 라이센스에서 이 프로그램을 이용해서 상업적인( commercial ) 어플리케이션을
작성해도 된다고 밝히고 있습니다.

  준비물 :
    launch4j ( 다운로드페이지 열기 )
    exe 파일을 만들 자바 어플리케이션.

PhotoRoverViewer.zip

테스트용 스윙어플리케이션





 

우선, 자바 어플리케이션을 작성하여 Executable JAR로 만들어 둔다.
( 이전 포스팅 참조 하며, 본 예제를 실행해 보기 원한다면 위에 링크한 자바 어플리케이션을 사용하시면 됩니다.)

그 다음, launch4j 실행하셔서 아래 화면을 참조 하셔서 wrapping환경을 세팅합니다.

launch4j 기본 설정 화면

launch4j 기본 설정 화면


1 번 항목에 jar파일을 어떤 디렉토리에 어떤 파일명의 exe로 떨굴지를 기술합니다.
2 번 항목에서 exe로 wrapping할 Executable jar파일을 선택 합니다.
3 번 항목에 기술한 URL은 변환된 자바 exe파일을 실행할 PC에 자바런타임 환경이 없을경우 안내문구와 이동할 웹사이트를 기술합니다.


launch4j ClassPath 설정 화면

launch4j ClassPath 설정 화면


4 번 항목에서 main 클래스를 기술합니다. Executable jar를 만들어 뒀다면 파일선택에서 jar파일을 선택하는것
만으로도 jar의 MANIFEST.MF 을 분석해서 main 함수와 lib 를 자동으로 세팅해 줍니다.


launch4j Header 설정 화면

launch4j Header 설정 화면


GUI 어플리케이션인지 Console 어플리케이션인지 세팅 해 줍니다.


launch4j JRE 설정 화면

launch4j JRE 설정 화면


5 번 항목은 exe파일과 jre를 함께 배포할 경우 jre패스가 어떻게 되는지 상대 경로 혹은 절대경로를 기술해 줍니다.
6 번 항목에 자바어플리케이션이 실행되기위한 최소버전의 JRE를 기술해 줍니다.


launch4j Version Info 설정 화면

launch4j Version Info 설정 화면


Add Version infomation을 체크하면 exe파일의 속성정보에 나타낼 정보를 기술합니다.


launch4j Message 설정 화면

launch4j Message 설정 화면


Add Custom Message를 체크하면 각 상황에따라 출력할 메세지를 기술할 수 있습니다.
현재 버전까지는 한글 메세지는 지원하지 않더군요. ^^

위와 같은 내용을 기술 해 준 후 launch4j 상단 아이콘 중 톱니바퀴를 클릭하면 지정한 exe파일이 생성 됩니다.



[Flash] http://www.yunsobi.com/anyone/2008-01-04_1144.swf

2008/01/04 11:51 2008/01/04 11:51
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2008/10/05 15:51
  1. 좋은 정보 잘 보고 가요 ~ ^^

  2. Blog Icon
    서비

    도움이 되셨다니 저도 기쁩니다.

  3. 저도 잘보고 갑니다.잘되는군요 ;)

  4. Blog Icon
    coding4fun

    좋은 정보 감사합니다. 그런데, lauch4j로 만든 exe를 실행할 때, 절대 경로가 영어로만 되어 있으면 문제 없는데, 절대 경로 상에 한글이 포함되어 있으면 실행이 안되는 문제가 있습니다. 혹시 해결 방법은 아시는지요..

  5. Blog Icon
    공대소년

    많이 배우고 갑니다.
    감사합니다. :)

  6. Blog Icon
    공생공사

    여러글을 보다가 여기까지 왔네요..혹시
    반대로는 가능한가요?
    exe --> jar 형태로요?

  7. Blog Icon
    서비

    공생공사님 안녕하세요.
    http://stackoverflow.com/questions/7760126/how-to-convert-exe-file-to-jar-file 에도 님과 같은 질문 관련글이 있는데 대부분의 jar -> exe 컨버팅 도구의 경우 exe내부에 단순히 jar를 싸고 있는 형태로 패키징 하지 않고 .class 정보를 이용하여 실행파일을 생성해내기 때문에 exe에서 jar를 추출해 낼 수는 없습니다.

    다만, jsmooth나 launch4j 라도 exe에 jar를 포함하는 형태가 아닌 단순히 jar를 실행하기위한 런처만 exe로 구성했다면 실행 jar가 어딘가에 위치하고 있을 확률은 존재합니다.

    어떤 이유로 추출이 필요하신지 대강 짐작은 됩니다만, 가능하시면 원 개발자와 컨택하셔서 소스를 얻어내는 방안을 고민해보시는게 현실적일것 같습니다.

  8. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  9. Blog Icon
    안녕하세요

    질문 있습니다.
    //자바어플리케이션을 실행할 PC에 자바구동환경( 자바런타임 JRE )이 미리 설치 되어 있지어야 한다는 약점이 있습니다.
    이 때문에 자바 Swing/AWT등으로 작성된 GUI어플리케이션의 경우 어플리케이션 작성 후 Executable JAR파일을
    윈도우용 실행 파일(exe)로 감싸는(Wrapping)하는 단계를 거치게 됩니다.

    ...라고 적혀있는데 조금만 밑으로 내려가면

    //변환된 자바 exe파일을 실행할 PC에 자바런타임 환경이 없을경우 안내문구와 이동할 웹사이트를 기술합니다.

    ...라고 적혀있습니다. exe파일로 만들면 jre가 없는 환경에서도 실행될 수 있다는 말 아닌가요? 근데 왜 안내문구와 이동할 웹사이트가 필요한지 모르겠습니다.

  10. Blog Icon
    ㄴㄴ

    jar 파일을 exe파일로 wrapping 하는 작업은 단순히 exe를 통해 jar파일을 실행시켜주는 역할만 하는 겁니다.
    실행은 jvm 위에서 해야하므로, 환경이 되어야 작동이 가능합니다.

  11. Blog Icon
    misterwon

    감사합니다 ㅎㅎ 큰 도움이 되었습니다

넷빈즈 6.0 코드 템플릿 사용하기 :: NetBeans 6.0 Code Template

대부분의 현대적인 IDE는 코드작성의 효율성을 높이기 위해 코드 전체를 타이핑하지 않아도 문장을 완성해 주는 기능을 가지고 있습니다.
우선 아래 영상을 봐 주시겠습니까?



위 영상을 보시면 자바 코드로 System.out.println(""); 이라든지 if-else 구문을 완성하기 위해 짧은 축약어를 입력하고 예약된 키
( 예제에서는 Tab 키를 사용 했습니다. ) 를 눌러 완전한 코드를 만들고 있는데요..
이를 넷빈즈에서는 코드템플릿(Code Template)라고 부르고 있습니다.

이 코드 템플릿을 설정하려면 넷빈즈 메뉴바에서 Tools -> Options를 선택 하시면 나타나는 대화창에서
Editor -> Code Templates 항목에서 원하는 짧은 키와 템플릿을 완성할 키를 입력하시면 됩니다.

NetBeans 6.0 Code Template Option

넷빈즈 6.0 코드 템플릿 설정




2007/12/17 14:28 2007/12/17 14:28
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

프로그래머를 위한 스크린 캡처/공유 툴 :: 징 프로젝트 Jing Project

Snag It이란 프로그램을 알고 계신가요?
유명한 스크린 캡처 프로그램인데요.. 이 Snag It을 개발한 Tech Smith라는 회사에서 Jing 이라는 이름의
새로운 프로젝트를 시작했더라고요..

간단하게 말하면 프로그래머가 뭔가를 설명하기 위해 문서가 아닌 동영상을 이용하겠다는 취지로 시작했습니다.
youtube를 위시하여 국내외에서 플래시 플레이어를 기반으로 한 동영상 공유 사이트가 우후죽순으로
생겨나고 있는 가운데 또 하나의 UCC저작툴 혹은 사이트가 나온 건가 라고 생각했는데 Jing Project의 비디오
튜토리얼을 보고나니 그 유용성이 확연해 지더군요..

비디오 투어 보기..



Tech Smith사에는 이미 Camtasia 라는 전문적인 화면 캡처 둘이 있습니다만, 이 징 프로그램은 무료이며 
컴퓨터 바탕화면의 캡처에서 공유까지 일련의 절차에 작업 전환이나 또다른 수정작업의 개입이
없어도 된다는 것과 서버를 보유하고 있다면 그 결과물을 공유사이트에 올리지 않아도 된다는 장점이
있습니다. 

Mac OS X과 .Net Framework 3.0을 구동할 수 있는 Windows XP, 2003, Vista에서 프로그램을 구동 할 수 있습니다.

징 프로젝트 공식 사이트 : http://www.jingproject.com
징 프로그램 설정 방법 : http://blog.jingproject.com/2007/07/getting_started_with_jing.html


아래는 이 징 프로그램으로 캡처하여 제가 호스팅 받고 있는 서버에 올린 결과입니다.
URL은 http://www.yunsobi.com/anyone/12-11-2007%2006_51%20%EC%98%A4%ED%9B%84.swf 이고요.
화면을 캡처하면서 마이크를 통하여 외부소리를 함께 녹음 하는것도 가능하지만 결코 들어줄만한 목소리가
아니니 패스합니다.

[Flash] http://www.yunsobi.com/anyone/12-11-2007%2006_51%20%EC%98%A4%ED%9B%84.swf

2007/12/11 19:56 2007/12/11 19:56
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2008/01/16 12:33
    최고의 화면캡쳐 프로그램, 오픈캡쳐 (OpenCapture) Tracked from 즐거운 컴퓨터고난기록기
  1. 트랙백 타고 날아왔습니다. :)
    징 프로젝트, 정말 멋집니다! 기존에 있던 기술들을 하나로 엮어 편리하게 잘 만들었네요.
    조만간 시간이 나면 징 프로젝트를 본격 활용해 글을 작성해 보아야겠습니다.
    좋은 정보 감사드리며, RSS 에 등록해놓고 자주 놀러오겠습니다. 유용한 글들이 굉장히 많네요! :)

  2. comlog님 찾아주셔서 감사합니다.
    저 역시 자주 찾아뵙겠습니다. ^^

넷빈즈( NetBeans ) 6.0 자바 소스 인코딩 설정은 어디서?

넷빈즈 4, 5 버전때까지는 자바소스의 인코딩 설정을 [옵션->Java Source] 항목에서 결정할 수 있었다.
(http://www.yunsobi.com/blog/52 참조)

사용자 삽입 이미지
[넷빈즈4 / 5 버전대의 소스 인코딩 설정 위치]


넷빈즈 6.0 버전으로 오면서 이 설정의 위치가 바뀌었다. 넷빈즈 6.0에서는 프로젝트 프로퍼티창의 소스 카테고리에서 설정이 이루어 진다.

사용자 삽입 이미지
[개별 프로젝트의 Properties 항목 선택 후]


사용자 삽입 이미지
[Source 카테고리에서 인코딩 설정]


옵션 위치의 변화는 무엇을 의미하는걸까?
4 / 5 버전대에서는 소스코드의 인코딩이 모든 프로젝트에 일괄 적용 될 수 밖에 없는 구조이지만, 6 과같이 프로젝트 프로퍼티로
옵션 위치를 변경하면 각 프로젝트마다 자바소스의 인코딩을 달리 적용 할 수 있음을 의미하며, 이는 IDE가 개별 프로젝트를
좀 더 유연하게 받아들일 수 있는 바탕이기도 하다.


#잠깐만 !!
 넷빈즈 IDE에서 위처럼 인코딩 옵션을 설정하며 자바소스 코드의 인코딩에만 영향을 미치며
 이 설정은 JSP 소스 인코딩에 영향을 주지 않는다. JSP소스 인코딩은 서블릿 규약에 따라 JSP
 페이지 디렉티브의 pageEncoding 속성에 기술하면 된다.
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>


2007/12/08 23:26 2007/12/08 23:26
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

넷빈즈(NetBeans) 메뉴의 폰트를 깔끔하게 해보자

MS 비스타에 넷빈즈를 설치 해 본 사람은 메뉴바의 지저분한 폰트에 당황하였을 것이다.
비스타의 기본 폰트가 맑은고딕으로 바뀌면서 작은 크기로 메뉴의 폰트를 적용하다 보니 이렇게 된 것 같다.

해결 방법은 간단하다. 넷빈즈의 configuration 파일에 실행옵션으로 폰트 사이즈를 약간만 키워주면 된다.
[넷빈즈 설치 디렉토리]\etc\netbeans.conf 파일을 열어보면 ( http://www.yunsobi.com/blog/140 참조)

netbeans_default_options="-J-Xms32m -J-Xmx128m -J-XX:PermSize=32m -J-XX:Max...

과 같이 넷빈즈 실행 옵션이 기술되어 있다.
이 옵션의 줄의 마지막에 --fontsize 12 와 같이 폰트를 약간 키워주는 옵션을 기술한 후 넷빈즈를 다시 기동하면
깔끔한 메뉴를 볼 수 있다.

요렇게..

netbeans_default_options="-J-Xms32m -J-Xmx128m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled --fontsize 12"


적용 전적용 후

어떤가? 조금은 보기 편해졌는가?

2007/12/07 20:48 2007/12/07 20:48
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    김정래

    완전 잘 되네요!!
    감사합니다!!

TortoiseCVS 사용 시 Disk IO 성능 향상


지금까진 소스 버전관리를위한 CVS(Concurrent Versions System) 클라이언트로 WinCVS 나 Netbeans에
내장된 CVS를 사용하고 있었습니다.

이번 프로젝트에선 몇몇 이유로 TortoiseCVS 를 사용하게 되었는데요..
윈도우즈 쉘에 통합되어 마우스 오른쪽 클릭의 컨택스트 메뉴에서 CVS클라이언트 기능을 쉽고 직관적으로
사용 할 수 있어서 편하더군요.
사용자 삽입 이미지

파일이 생성되거나 수정될 때 CVS가 관리하는 파일/폴더라면 아이콘으로 상태를 표시해 주는 기능이 있는데
이를 확인하기위해 지속적인 Disk IO를 발생(비록 PC의 성능 저하가 미미하다곤 하지만..) 한다고 하네요..

이를 줄이는 방법이 있는데요..
TortoiseCVS 의 설정 메뉴중 고급탭을 선택하면
사용자 삽입 이미지
사용자 삽입 이미지

위와같이 '차단할 폴더' '포함할 폴더' 를 기술할 수 있는 입력상자가 있습니다.
여기에 TortoiseCVS 가 확인 하지 않아도 되는 폴더와 확인할 폴더를 세미콜론( ; )을 구분자로 죽 적어 주시면 됩니다.
2007/10/30 13:20 2007/10/30 13:20
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

터미널서버(Terminal Server)의 포트를 변경하는 방법

기본적으로 터미널 서버와 Windows 2000 / Windows Server 2003 터미널 서비스는 클라이언트 연결에 TCP 포트 3389를 사용합니다.
이 값은 변경하지 않는 것이 좋지만, 이 포트를 변경해야 할 경우에는 다음 방법을 참고하시면 됩니다.


서버쪽 변경부분

1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
2. "PortNumber" 하위 키를 찾아 값이 (3389)의 16진수 값인 00000D3D인지 확인합니다.
   10진수로 포트 번호를 수정하고 새 값을 저장합니다.

만약 터미널서버에서 특정연결을 만들었다면, 특정연결명의 포트번호도 변경하시면 됩니다.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\연결"PortNumber" 하위 키를 찾아
값이 (3389)의 16진수 값인 00000D3D인지 확인합니다. 10진수로 포트 번호를 수정하고 새 값을 저장합니다.


클라이언트 변경부분

1. 원격데스크톱연결 프로그램에서 127.0.0.1:xxxx 와 같이 접속한다.
2. 커넥션파일을 이용할경우 노트패드에서 "Server Port=3389"를 "Server Port=xxxx"로 변경
3. 웹 ActiveX 클라이언트는
     1. 터미널서비스웹디렉토리\TsWeb 폴더의 Default.htm 파일을 찾습니다.
     2. 메모장이나 다른 텍스트 편집기에서 Default.htm을 엽니다.
     3. "MsRdpClient.AdvancedSettings2"로 시작하는 항목을 찾습니다.
     4. 이러한 항목 뒤에 아래의 행을 추가합니다.
         MsRdpClient.AdvancedSettings2.RDPPort = xxxx

2007/10/23 01:24 2007/10/23 01:24
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Windows 2003 서버의 터미널서버 접속 하기


작성:
 불나방


윈도우 2003 서버는 설치될 때 기본으로 터미널 서비스를 어플리케이션 모드로 설치를 하는데 이렇게 되면 접속하는 장치당 최초 접속으로 부터 90일간의 사용기간을 주고 이 기간이 지나면 접속이 안되게 된다. 물론 돈을 주고 라이센스를 사야하는 경우가 발생하는 것이다. 라이센스 비용이 만만치 않으므로 서버 관리자만 서버를 리모트로 접속할 경우라면(대부분 이러한 경우일 것이다.) 터미널 서버 설치 모드를 관리자 모드로 바꾸어야 한다.


제어판>시스템>원격


에 들어가서 이 컴퓨터의 원격지원을 허용함을 체그하면 관리자 모드로 전환되고 2개의 관리자 세션은 라이센스 없이 영구히 사용할 수 있다. 접속할 사용자를 원격 사용자 그룹에 추가하는 것도 잊지 말자.


일단 접속이 안되는 상태로 되면 설정을 바꿀수가 없게 되는데 이럴때 IDC로 달려가지는 말고 서버에 접속한 적이 없는 다른 사람컴퓨터로 접속하면 일단 접속이 되므로 이를 이용하여 설정을 바꾸면 된다.

2007/10/23 01:20 2007/10/23 01:20
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다