한동안 잘 쓰던 Java Decompiler인 DJ(맞나?)가 유료화되면서 무료버전을 찾아 쓰기가 귀찮았는데,
막강한 프로그램을 찾았다.
이미 아는 분들이 많을 것 같기도 한데, 나는 며칠 전에야 보았다. ^^;
class 파일 뿐 아니라, JAR 파일의 연결프로그램으로 등록해서 사용하면 더 좋다.
아래와 같이 JAR 파일을 열면 구조가 보이면서,
그중 class파일을 선택하면 바로 오른쪽에 디컴파일된 자바소스가 보인다.
왼쪽엔 클래스의 구조도 풀어서 보여 준다.
아직 더 상세한 기능은 못 봤지만, 이것만으로도 아주 강력하다.
아래는 다운로드 받을 수 있는 주소(프랑스에서 만든 것 같고, 무료다)
설치과정도 없고, 그냥 압축파일 풀어서 나온 실행파일만 실행하면 된다.
http://java.decompiler.free.fr/
들어가 보면, JD-Core가 decompiler 엔진인 것 같고,
위의 스크린샷은 JD-GUI 이다.
Eclipse에서 Source Attach가 안 된 class 파일도 바로 decompile해서 볼 수 있는 것이 JD-Eclipse이다.
어쩌면 이렇게 딱 입맛에 맞게 만들었는지...
저절로 기부하고 싶게 만드는 프로그램이다.
Fly High
높은 이상과 낮은 현실 사이의 간격 좁히기
2010년 4월 19일 월요일
2010년 3월 18일 목요일
msconfig로 시작프로그램 관리
시작프로그램 제어할 수 있는 프로그램이 많이 있다. 하지만, 굳이 별도로 프로그램을 다운받지 않아도 윈도우 내에 msconfig 라는 프로그램이 있다.
그냥 실행에 msconfig만 치면 아래와 같은 프로그램이 나타난다.
보기에 뜨지 않아도 될 프로그램의 앞에 있는 체크박스의 체크표시만 선택해서 없애고 아래의 '적용'버튼을 눌러 주면 다음 부팅될 때 그 프로그램들은 뜨지 않는다.
이미지에서 '사용 중지된 날짜'가 표시된 프로그램들은 부팅 때 뜨지 않는다는 뜻이다.
다른 탭들도 있는데, 서비스는 컴퓨터관리 메뉴에도 있는 것이니 특별하지 않고, 나머지 탭들도 참고삼아 보는 되겠다.
그냥 실행에 msconfig만 치면 아래와 같은 프로그램이 나타난다.
보기에 뜨지 않아도 될 프로그램의 앞에 있는 체크박스의 체크표시만 선택해서 없애고 아래의 '적용'버튼을 눌러 주면 다음 부팅될 때 그 프로그램들은 뜨지 않는다.
이미지에서 '사용 중지된 날짜'가 표시된 프로그램들은 부팅 때 뜨지 않는다는 뜻이다.
다른 탭들도 있는데, 서비스는 컴퓨터관리 메뉴에도 있는 것이니 특별하지 않고, 나머지 탭들도 참고삼아 보는 되겠다.
nbtstat 으로 컴퓨터이름이나 IP 찾기
먼저 읽기
본인의 PC는 Windows Vista Business이므로 윈도우라도 OS 종류에 따라 없는 기능일 수 있습니다
==========================================================================================
명령프롬프트에서 nbtstat 이용하기
C:\>nbtstat -a [컴퓨터이름]
이 명령을 이용하면 컴퓨터이름으로 같은 네트워크 안의 다른 컴퓨터의 IP 등을 조회할 수 있습니다.
MS 오피스 등의 공유문서를 누군가 열고 있는데, 열고 있다는 컴퓨터의 이름으로 누군지 알 수 없을 때 요긴하게 사용되겠지요.
C:\>nbtstat -A [IP주소]
이 명령을 이용하면 IP를 이용해서 컴퓨터의 이름을 조회할 수 있습니다.
각자 자리에 IP가 지정되어 있는데 누군가가 남의 IP를 사용하고 있을 때, IP를 이용해서 컴퓨터이름을 알아낼 수 있습니다. 물론, 컴퓨터이름이 아주 애매해서 알 수 없을 때는 좀 어렵겠지만...
본인의 PC는 Windows Vista Business이므로 윈도우라도 OS 종류에 따라 없는 기능일 수 있습니다
==========================================================================================
명령프롬프트에서 nbtstat 이용하기
C:\>nbtstat -a [컴퓨터이름]
이 명령을 이용하면 컴퓨터이름으로 같은 네트워크 안의 다른 컴퓨터의 IP 등을 조회할 수 있습니다.
MS 오피스 등의 공유문서를 누군가 열고 있는데, 열고 있다는 컴퓨터의 이름으로 누군지 알 수 없을 때 요긴하게 사용되겠지요.
C:\>nbtstat -A [IP주소]
이 명령을 이용하면 IP를 이용해서 컴퓨터의 이름을 조회할 수 있습니다.
각자 자리에 IP가 지정되어 있는데 누군가가 남의 IP를 사용하고 있을 때, IP를 이용해서 컴퓨터이름을 알아낼 수 있습니다. 물론, 컴퓨터이름이 아주 애매해서 알 수 없을 때는 좀 어렵겠지만...
라벨:
컴퓨터이름,
IP,
nbtstat,
Windows_tip
2009년 12월 22일 화요일
동일한 요청의 다중전송 방지
골치 아픈 문제 때문에 고민하다가 너무나 간단한 해결책을 찾아냈다.
보통 웹이 아닌 클라이언트/서버 프로그램에서 클라이언트의 화면에서 '조회' 등의 버튼을 한번만 클릭하고 결과를 기다려야 하는데 사용자가 조회시간이 좀 걸린다고 여러번 클릭하는 경우가 있다. 이걸 막아야 하는 일이 생겨서 고민했는데 의외로 간단하다.
보통 서버로 요청을 보내기 위해서는 RemoteObject를 통해서 서버의 메소드를 호출하는데, 이 RemoteObject에 concurrency라는 속성이 있다. 이 속성의 디폴트값은 multiple이라서 같은 메소드의 호출응답을 받기 전에 호출해도 계속 요청이 날아가게 되어 있다. 그런데, 속성의 값을 single로 하면, 서버 메소드 호출에 대한 응답을 받기 전에 또 화면에서 호출하면 에러를 발생시킨다.
이때 발생하는 에러이벤트는 FaultEvent이고 event.fault.faultCode == "ConcurrencyError" 조건을 만족하면 조회중이니 잠시 기다려 달라는 메시지를 뿌려 주면 된다. 물론 이러는 동안에도 처음 요청은 잘 갔다가 응답까지 잘 받는다.
보니까 RemoteObject 뿐만 아니라, method 태그에도 이 속성을 사용할 수 있는 것 같다. RemoteObject에 사용하면 그 안에 포함된 메소드 전부에 적용이 되고, method 태그에 사용하면 메소드 단위로 제어가 가능한 것 같다. 테스트해 보질 않아서 더이상의 설명은 패쓰~
보통 웹이 아닌 클라이언트/서버 프로그램에서 클라이언트의 화면에서 '조회' 등의 버튼을 한번만 클릭하고 결과를 기다려야 하는데 사용자가 조회시간이 좀 걸린다고 여러번 클릭하는 경우가 있다. 이걸 막아야 하는 일이 생겨서 고민했는데 의외로 간단하다.
보통 서버로 요청을 보내기 위해서는 RemoteObject를 통해서 서버의 메소드를 호출하는데, 이 RemoteObject에 concurrency라는 속성이 있다. 이 속성의 디폴트값은 multiple이라서 같은 메소드의 호출응답을 받기 전에 호출해도 계속 요청이 날아가게 되어 있다. 그런데, 속성의 값을 single로 하면, 서버 메소드 호출에 대한 응답을 받기 전에 또 화면에서 호출하면 에러를 발생시킨다.
이때 발생하는 에러이벤트는 FaultEvent이고 event.fault.faultCode == "ConcurrencyError" 조건을 만족하면 조회중이니 잠시 기다려 달라는 메시지를 뿌려 주면 된다. 물론 이러는 동안에도 처음 요청은 잘 갔다가 응답까지 잘 받는다.
보니까 RemoteObject 뿐만 아니라, method 태그에도 이 속성을 사용할 수 있는 것 같다. RemoteObject에 사용하면 그 안에 포함된 메소드 전부에 적용이 되고, method 태그에 사용하면 메소드 단위로 제어가 가능한 것 같다. 테스트해 보질 않아서 더이상의 설명은 패쓰~
2009년 12월 16일 수요일
Hibernate에서 CLOB 컬럼 사용하기
Hibernate에서 오라클 CLOB 컬럼을 사용하려면,
매핑파일에서 컬럼의 type을 text로 설정하고,
[code xml] <property name="clob" type="text" column="CLOBCOLUMN" /> [/code]
이 컬럼에 해당하는 Value Object의 변수는 String으로 선언해서 사용하면 된다.
[code java] private String clob; [/code]
혹시 이렇게 했는데 에러가 나면 최신 오라클 JDBC 드라이버로 바꿔 보는 정도의 센스는 기본~
매핑파일에서 컬럼의 type을 text로 설정하고,
[code xml] <property name="clob" type="text" column="CLOBCOLUMN" /> [/code]
이 컬럼에 해당하는 Value Object의 변수는 String으로 선언해서 사용하면 된다.
[code java] private String clob; [/code]
혹시 이렇게 했는데 에러가 나면 최신 오라클 JDBC 드라이버로 바꿔 보는 정도의 센스는 기본~
2009년 10월 26일 월요일
한글엔 maxChars 대신 maxBytes
기본적으로 Flex의 TextInput에는 readOnly(editable=false) 상태일 때 배경색이 바뀌질 않는다. enabled가 false일 경우에는 스타일에서 배경색을 지정할 수 있을 뿐이다.
그런데, readOnly 상태일 때 내용만 마우스로 선택해서 복사하고 싶을 때는 아무래도 readOnly 상태여야 하는데 입맛에 맞질 않아 readOnly 상태일 때 지정된 배경색이 되도록 하는 컴포넌트를 하나 만들었다. (아래에서 set editable 메소드)
그렇게 잘 쓰고 있었는데 이번에 DB컬럼의 바이트길이에 따라서 TextInput의 입력길이를 제한해야 할 일이 생겼다.(어디나 그렇겠지만..) 그런데, TextInput에는 maxChars라는 문자수 기준의 입력제한만 있어서 한글과 같이 멀티바이트 문자를 사용하는 언어는 맞아 떨어지질 않기 때문에 아래와 같이 기능을 추가한 컴포넌트를 만들었다.
전에 자바스크립트로도 이런 비슷한 기능을 만들어 봐서 ActionScript의 API만 찾으니 그렇게 오래 시간이 걸리지 않았다. 다만, ByteArray 클래스의 writeMultiByte라는 메소드의 두번째 인자가 꼭 있어야 하니 미리 입력되는 Character Set을 알고 있어야 하는 단점이 있긴 하다. 자바처럼 그냥 getBytes 하나로 처리할 수 있으면 언어에 상관없이 사용할 수 있을 텐데.. 아쉽다. 어딘가 환경설정 파일에 세팅해 놓고 그것을 읽게 하면 될 수도 있을 것 같다.
또 아쉬운 점은 KEY_DOWN으로 처리하면 규정길이를 넘는 문자를 입력해도 입력되는 문자가 안 보일 텐데 이 이벤트가 안 먹어서 KEY_UP 이벤트를 처리하니 입력되는 문자가 보였다가 지워져서 약간 모냥이 빠진다.
FOCUS_OUT 이벤트는 마지막으로 길이를 넘어가는 부분에 한글을 입력한 상태에서 탭이나 마우스로 포커스가 벗어나면 넘어간 문자가 안 지워져서 포커스가 벗어날 때도 확인해서 넘어가는 문자를 지우기 위해 이벤트리스너를 달았다.
참고로 addEventListener 메소드의 다섯번째 인자인 weakReference를 true로 한 것은, 이렇게 하면 이 컴포넌트가 지워질 때 리스너에 상관없이 Garbage Collection 대상이 되도록 하기 위해서다.
package com.customcomp
{
import flash.events.Event;
import flash.events.FocusEvent;
import flash.events.KeyboardEvent;
import flash.utils.ByteArray;
import mx.controls.TextInput;
// editable 속성이 true일 때는 배경색이 흰색, false일 때는 배경색이 옅은 회색인 TextInput 컴포넌트
public class TextBox extends mx.controls.TextInput
{
// 한글 등 multi-byte 문자들의 입력길이 제한을 위해서 사용하는 속성
public var maxBytes:int = -1;
public function TextBox()
{
super();
// Key 입력시마다 입력내용의 바이트길이를 체크해 넘는 만큼 잘라낸다
this.addEventListener(KeyboardEvent.KEY_UP, maxBytesHandler, false, 0, true);
// 포커스가 벗어날 때 입력내용의 바이트길이를 체크해 넘는 만큼 잘라낸다
this.addEventListener(FocusEvent.FOCUS_OUT, maxBytesHandler, false, 0, true);
}
override public function set editable(value:Boolean):void {
super.editable = value;
if (value == false)
this.setStyle("backgroundColor", 0xEEEEEE);
else
this.setStyle("backgroundColor", 0xFFFFFF);
}
public function maxBytesHandler(event:Event):void {
if (this.maxBytes != -1 && getByteLength(this.text) > this.maxBytes) {
this.text = getTrimmedString(this.text, this.maxBytes);
}
}
// 문자열의 바이트 길이를 리턴
private function getByteLength(str:String):int {
var byteArr:ByteArray = new ByteArray();
byteArr.writeMultiByte(str, "euc-kr");
return byteArr.length;
}
// str에서 maxLength 바이트를 넘어가는 문자들을 잘라내고 리턴
private function getTrimmedString(str:String, maxLength:int):String {
var tempString:String = str;
for (var i:int = str.length; i > 0; i--) {
if (getByteLength(tempString) <= maxLength)
return tempString;
else {
tempString = tempString.substr(0, tempString.length-1);
}
}
return "";
}
}
}
{
import flash.events.Event;
import flash.events.FocusEvent;
import flash.events.KeyboardEvent;
import flash.utils.ByteArray;
import mx.controls.TextInput;
// editable 속성이 true일 때는 배경색이 흰색, false일 때는 배경색이 옅은 회색인 TextInput 컴포넌트
public class TextBox extends mx.controls.TextInput
{
// 한글 등 multi-byte 문자들의 입력길이 제한을 위해서 사용하는 속성
public var maxBytes:int = -1;
public function TextBox()
{
super();
// Key 입력시마다 입력내용의 바이트길이를 체크해 넘는 만큼 잘라낸다
this.addEventListener(KeyboardEvent.KEY_UP, maxBytesHandler, false, 0, true);
// 포커스가 벗어날 때 입력내용의 바이트길이를 체크해 넘는 만큼 잘라낸다
this.addEventListener(FocusEvent.FOCUS_OUT, maxBytesHandler, false, 0, true);
}
override public function set editable(value:Boolean):void {
super.editable = value;
if (value == false)
this.setStyle("backgroundColor", 0xEEEEEE);
else
this.setStyle("backgroundColor", 0xFFFFFF);
}
public function maxBytesHandler(event:Event):void {
if (this.maxBytes != -1 && getByteLength(this.text) > this.maxBytes) {
this.text = getTrimmedString(this.text, this.maxBytes);
}
}
// 문자열의 바이트 길이를 리턴
private function getByteLength(str:String):int {
var byteArr:ByteArray = new ByteArray();
byteArr.writeMultiByte(str, "euc-kr");
return byteArr.length;
}
// str에서 maxLength 바이트를 넘어가는 문자들을 잘라내고 리턴
private function getTrimmedString(str:String, maxLength:int):String {
var tempString:String = str;
for (var i:int = str.length; i > 0; i--) {
if (getByteLength(tempString) <= maxLength)
return tempString;
else {
tempString = tempString.substr(0, tempString.length-1);
}
}
return "";
}
}
}
maxBytes 속성을 사용하기 위해서는 여기서 사용한 컴포넌트를 사용하고 속성에 maxBytes를 사용하면 된다.
다 아는 얘기겠지만, 루트 컴포넌트에는 미리 namespace를 선언해 둬야 한다.
<mx:Panel xmlns:custom="com.customcomp.*" ...>
...
<custom:TextBox id="someId" maxBytes="10" .../>
...
<custom:TextBox id="someId" maxBytes="10" .../>
이렇게 사용하면 someID라는 TextInput에 10바이트가 넘는 문자를 입력하면 자동으로 잘라준다.
2009년 9월 23일 수요일
Flex Application에 제목 넣기
Flex Application 파일명이 index.mxml이면 이 Application을 보려면 index.html로 들어가면 된다. 그런데, 그냥 만들어 놓기만 하면 웹브라우저에 제목이 보이질 않아 여러 창을 띄웠을 때 찾기가 힘들다.
이럴 경우에는, index.mxml의 Application 태그에 pageTitle 이란 속성을 추가하고 여기에 웹브라우저에 보여줄 제목을 값으로 넣어 주면 된다.
좀더 자세히 들어가면, html-template 폴더의 index.template.html 파일의 ${title} 부분에 Application 태그의 pageTitle 속성값이 들어가서 이렇게 보이는 것이다.
이럴 경우에는, index.mxml의 Application 태그에 pageTitle 이란 속성을 추가하고 여기에 웹브라우저에 보여줄 제목을 값으로 넣어 주면 된다.
좀더 자세히 들어가면, html-template 폴더의 index.template.html 파일의 ${title} 부분에 Application 태그의 pageTitle 속성값이 들어가서 이렇게 보이는 것이다.
피드 구독하기:
글 (Atom)