Java 의 SWT 관련 Component 들을 사용하다가 다음과 같이 Invalid thread access 라는 Error 가 발생하는 경우가 있다.

   org.eclipse.swt.SWTException: Invalid thread access

at org.eclipse.swt.SWT.error(SWT.java:4282)

at org.eclipse.swt.SWT.error(SWT.java:4197)

at org.eclipse.swt.SWT.error(SWT.java:4168)

at org.eclipse.swt.widgets.Display.error(Display.java:1210)


 외부 Thread 에서 SWT Component 를  사용하려고 할 때 발생하는 에러로 SWT Component 는 UI 스레드에서만 Access 가능하다. 

 그렇기 때문에 이를 해결하려면 UI Thread 내에서 SWT Component 를 사용하도록 바꿔야 한다. 

 다음 메소드를 사용하여 UI Thread 내에서 Job 들을 수행할 수 있다.


Display.getDefault().syncExec(new Runnable() {
    @Override
    public void run() {
        // swt code
    }
});

Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
        // swt code
    }
});



참고: http://stackoverflow.com/questions/5980316/invalid-thread-access-error-with-java-swt

Posted by leechwin
,

Eclipse 에서 org.eclipse.jface.dialogs.Dialog 를 상속받아 Custom Dialog  를 구현하다보면,

setTitle() 이나 setImage() 등의 메소드가 존재하지 않아 당황 스러운 경우가 있다.


이때는 당황하지말고 protected void configureShell(Shell shell) 함수를 override 하면 title 이나 title image 등을 편집할 수 있다.

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("My Custom Label");
    }


configureShell 함수 Override 전


configureShell 함수 Override 후



참고: http://wiki.eclipse.org/FAQ_How_do_I_set_the_title_of_a_custom_dialog%3F

Posted by leechwin
,

 프로그래머생활에 발담근지 꽤 되가지만 

 여태껏 윈도우즈에서 프로그램이 응답이 없거나 뻗었을 경우

 Ctrl + Alt + Delete 키로 Windows 작업 관리자를 띄우고 해당 프로세스나 프로그램을 죽이고는 했다.


 MS 에서 제공하는 Process Explorer 툴을 보고난후 지금까지 얼마나 바보같았는지 깨달았다.

역시 사람을 도구를 쓸줄알아야...


다음의 사이트에서 다운로드 받을 수 있다.


왼쪽이 기본 Windows 작업 관리자 이고, 오른쪽이 Process Explorer 이다.



Process Explorer 에서는 다양한 정보를 보여준다.

  • 실행중인 Process 들의 command line 인자
  • 실행중인 Process Path
  • 실행중인 Process 들과 fork 된 Process 들과의 관계
  • 실행중인 Process Kill, Restart, Suspend
  • 실행중인 Process Dump
  • CPU, Memory, I/O, Disk 사용량


기존 Windows 작업 관리자를 쓴다면 어서 설치하기를 권장한다.



Posted by leechwin
,

C, C++, C#, Java 등의 소스들에 대한 라인분석 툴인 NLOC 을 소개한다.


NLOC 를 이용하면 소스코드내의 코드 라인수, 공백, 주석 등의 카운팅이 가능하다.


라이센스는 GNU General Public License 이다.


NLOC 의 사이트에서 Binary 파일을 다운받는다.

- Download Site


압축파일을 풀고 command line 에서 NLOC 명령어와 함께 분석할 소스 코드파일을 지정하면 다음과 같이 리포팅 결과가 나타난다.



Posted by leechwin
,

파일 전송이나 파일 생성 삭제등의 테스트를 수행 하는 경우가 발생하는데, 이때 대용량의 더미파일을 생성할 필요가 있을때가 있다.


큰 용량의 동영상파일등을 구하는 방법이 아니라 단순히 명령어로 원하는 크기의 아무의미없는 대용량 더미 파일을 만드는 법을 알아보자.


  • Windows 환경에서 더미 파일 만드는법
    • fsutil file createnew <파일이름> <파일크기>


  • Linux 환경에서 더미 파일 만드는법
    • dd if=/dev/zero of=<파일이름> bs=<블록사이즈>count=<반복>
      • 위의 명령어는 (블록사이즈 x 반복)크기를 /dev/zero 에서 읽어서 (파일이름)에 기록하여 더미파일을 만들어낸다.
    • ex) dd if=/dev/zero of=test bs=1G count=10
      • 1G 만큼 10번 써서 10G 의 test 라는 더미 파일을 만들어낸다.


Posted by leechwin
,

Node.js 로 만든 앱이나 서비스를 로컬 머신이 아닌 Web 상에서 호스팅하여 테스트 혹은 서비스를 하고 싶은 경우가 있다.


물론 자신의 서버와 도메인을 가지고 서비스를 하거나, AWS 에 저장공간을 가지고 서비스를 할 수 도 있으나 과금이 발생하므로, 무료인 서비스가 있다면 테스트로 쓰거나 작은 프로젝트를 돌리는데 무리는 없을 것 이다.


Node.js 프로젝트를 클라우드에 올려서 서비스를 해주는 heroku cloud application platform 사용법을 알아보자.


Heroku 는 플랫폼 서비스 기반(PAAS) 서비스로 AWS 와 비슷한 플랫폼으로 일정 환경으로는 무료로 사용할 수 있고 더 좋은 성능의 환경을 구축한다면 과금이 발생하게 된다.



1. Heroku 등록

  • https://www.heroku.com/ 에서 등록을 한다.
  • 등록한 이메일로 링크가 보내지는데 링크를 클릭하여 비밀번호를 입력한다.
  • 제대로 등록하였다면 Login 후 Dashboard 화면이 나온다.


2. Heroku Toolbelt 을 설치

  • Heroku Toolbelt 설치 항목은 다음과 같다.
    • Heroku Client: CLI 툴로 command 로 Heroku app 을 관리
    • Foreman: 로컬테스트 등의 기능 제공
    • Git: Heroku 에 push, revision control 등을 제공


3. SSH Key 등록

  • Heroku 는 git 을 이용하고, ssh key 가 필요하다.
  • shell 에서 다음 명령으로 heroku 에 로그인을 하면, ssh key 를 찾고, 없다면 생성 가능하다.
    • $ heroku login

  • 제대로 등록되었다면 이후에 heroku login 명령으로 접속이 가능하다.


4. Node.js App 작성


5. Procfile 작성

  • 자신의 app 의 root 디렉토리에 Procfile 이라는 파일을 생성하여 다음과 같이 기술한다.
    • Node.js 의 Entry Point 가 되는 실행명령어가 기술되는 파일이다.

web: node app.js

6. package.json 작성

  • 자신의 app 의 root 디렉토리에 package.json 파일을 작성해야 한다.
  • package.json
    • app 의 이름, 버전, node 의 버전, npm 버전, 사용한 라이브러리의 버전등의 정보를 기술해야한다.
    • npm 모듈중 express 는 반드시 사용해야하고, package.json 에 기술해줘야 한다.
    • 예제는 다음과 같다.
 {
  "name": "slide-control",
  "version": "0.0.1",
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "express": "3.1.x",
    "jade": "0.28.x",
    "socket.io": "0.9.x"
  },
  "engines": {
    "node": "0.8.x",
    "npm": "1.1.x"
  }
}


7. NPM Install

  • shell 에서 다음 명령을 수행하면 package.json 을 참고하여 로컬에 해당 npm 모듈들이 인스톨 된다.
    • $ npm install
  • 설치가 된 후 npm ls 명령으로 현재 설치된 npm list 들을 살펴볼 수 있다.
    • $ npm ls


8. foreman Test

  • 로컬에서 Test 를 하고 싶다면, shell 에서 다음 명령을 수행하면 로컬에서 5000번 포트로 테스트가 가능


9. Git 저장소 생성

  • 개발한 소스를 로컬 Git 에 저장하기 위해 다음과 같이 수행한다.
    • $ git init
    • $ git add .
    • $ git commit -m "comment"


10. Heroku 에 리모트 Git 저장소 생성 및 push

  • 개발한 소스를 Heroku 리모트 Git 올리기 위해 다음과 같이 수행한다.
    • 로그인
      • $ heroku login
    • Heroku Remote Git 생성
      • 프로젝트 생성시 --stack cedar 이후에 자신의 앱이름을 적어준다.
      • 기술된 이름은 http://앱이름.herokuapp.com/ 과 같이 서비스되는 URL 의 이름으로 쓰인다.
        • $ heroku create --stack cedar myapp
    • 로컬 Git 의 내용을 Heroku 리모트 Git 으로 push
      • 아래와 같이 heroku git 으로 push 하는 즉시 App 이 Deploy되면서 서비스되는 URL 이 보여진다.
        • $ git push heroku master
      • 만약 첫 앱이름을 잘못 작성하여 새로 create 한경우에는 remote 설정을 지우고 다시 push 하면된다.
        • $ git remote rm heroku
        • $ heroku git:remote -a newname

11. Dashboard 에서 확인

  • https://www.heroku.com/  에서 로그인 후 Dashboard 에서 현재 서비스되는 자신의 App 리스트를 볼 수 있다
    • Resources
      • 과금을 통해 좀더 빠른 서비스를 제공받을 수 있다.
    • Activity
      • Heroku Git 에 기여한 이력등을 볼 수 있다.
    • Collaborators
      • 다른사람을 초대하나 하여 협업이 가능하다.
    • Settings
      • 현재 App 에 대한 설정등을 변경할 수 있다.

Posted by leechwin
,

Eclipse 에서 Context Menu 등을 사용할 때에 현재 Selection 한 객체가 어떤종류의 객체인지(IEditor 인지, IResource 인지) 판별을 해야 할 경우가 있다.


이때 주로 selection 의 instanceof 로 보고 확인하는데, 현재 선택한 Selection 정보를 보통 다음과 같이 가져온다.

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ISelection selection = window.getSelectionService().getSelection();

if ( selection instanceof ITreeSelection ) {
    ...code...
} else if ( selection instanceof ITextSelection ) {
    ...code...
}

ISelection 은 다음과 같이 정의되어 있다.



위의 정의를 참고하여, 현재 Selection 한 객체가 Package Explorer 에서 Selection 한것인지 확인하려면 ITreeSection 이나 IStructuredSelection 으로 확인하고,

if ( selection instanceof ITreeSelection ) {
    // selected object in a tree view
    ...code...
}


Editor 에서 Selection 한것인지 확인하려면 ITextSelection 으로 확인하면 된다.

if ( selection instanceof ITextSelection ) {
    // selected text in a editor
    ...code...
}


Posted by leechwin
,

Java 에서 쓸 수 있는 Web Resource Compressor  관련 Framework 에 대해 간단히 소개해보고자 한다.


Web Resource Compressor  란 html, javascript, css 파일에 대한 Minifier, Beautifier 등의 기능을 수행하는 것을 말한다.


일종의 Web Resource 최적화 Framework 중 하나이다.



- Introduction


- How to use?

  • HTML Minifier - HTML Compressor 

    public void compress(InputStream source, OutputStream target) throws IOException {
        HtmlCompressor compressor = new HtmlCompressor();
        compressor.setCompressJavaScript(true); // compress inline css
        compressor.setCompressCss(true);        // compress inline javascript

        String compressedHtml = compressor.compress( IOUtil.getString( source, true ) );
        target.write( compressedHtml.getBytes() );
    }

  • XML Minifier - HTML Compressor 

    public void compress(InputStream source, OutputStream target) throws IOException {
        XmlCompressor compressor = new XmlCompressor();

        String compressedXml = compressor.compress( IOUtil.getString( source, true ) );
        target.write( compressedXml.getBytes() );
    }

  • JavaScript Minifier YUI Compressor 

    public void compress( InputStream source, OutputStream target ) throws EvaluatorException, IOException {
        InputStreamReader reader = null;
        OutputStreamWriter writer = null;
        try {
            reader = new InputStreamReader(source);
            writer = new OutputStreamWriter(target);
            JavaScriptCompressor compressor = new JavaScriptCompressor( reader,new ErrorReporter() {
                @Override
                public void warning(String message, String sourceName, int line, String lineSource, int lineOffset) {
                    if (line < 0) {
                        logger.warn(message);
                    } else {
                        String logMessage = line + " : " + lineOffset + " : " + message;
                        logger.warn(logMessage);
                    }
                }
                @Override
                public void error(String message, String sourceName, int line, String lineSource, int lineOffset)  {
                    if (line < 0) {
                        logger.error(message);
                    } else {
                        String logMessage = line + " : " + lineOffset + " : " + message;
                        logger.error(logMessage);
                    }
                }
                @Override
                public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource, int lineOffset) {
                    error(message, sourceName, line, lineSource, lineOffset);
                    return new EvaluatorException(message);
                }
            });

            // (out, linebreak, munge, verbose, preserveAllSemiColons, disableOptimizations)
            compressor.compress( writer, -1, true, false, true, false);

        } catch (EvaluatorException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        } finally {
            if ( reader != null ) { reader.close() };
            if ( writer != null ) { writer.close() };
        }
    }

  • CSS Minifier - YUI Compressor 

    public void compress(InputStream source, OutputStream target) throws IOException {
        InputStreamReader reader = null;
        OutputStreamWriter writer = null;
        try {
            reader = new InputStreamReader(source);
            writer = new OutputStreamWriter(target);
            CssCompressor compressor = new CssCompressor(reader);
            compressor.compress(writer, -1);
        } catch (IOException e) {
            throw e;
        } finally {
            if ( reader != null ) { reader.close() };
            if ( writer != null ) { writer.close() };
        }
    }

Posted by leechwin
,

Java Decompiler 설치

Eclipse 2013. 5. 6. 22:01

Eclipse 에서 Java 의 class 파일을 보기쉽게 Decompile 해주는 툴 설치하는 법을 알아보자.


JD-Eclipse

Eclipse 에서 Java Decompiler 을 해주는 툴인 JD-Eclipse 설치법을 알아보자.

  • 설치법은 아래 URL에서 JD-Eclipse의 Download 탭에서 jd-eclipse-site-XXX.zip 파일을 다운받는다.
  • 다운받은후 Widnow > Help > Install New Software > Add 버튼을 누르고 Location에 다운받은 zip 파일을 선택하고 설치를 하면 쉽게 JD-Eclipse 플러그인이 설치가 된다.


JadClipse

Eclipse 에서 Java Decompiler 을 해주는 툴인 JadClipse 설치법을 알아보자.

  • Eclipse 4.x 이상 버전부터는 eclipse market place에서 바로 설치가 가능하다.
  • 수동으로 설치하려면 Update Site 에 다음 URL 을 입력하면 설치가 가능하다.
  • Update Site 에서 설치가 끝나면 Window > Preferences > Java > Decompiler 에서 추가 설정이 가능하다.



Posted by leechwin
,

Eclipse 로 자바 프로젝트를 진행하다가 JRE 혹은 JDK 를 Vesrion Update 하는 경우가 가끔 발생 한다.


개발환경이 달라지기때문에 주의해야 하지만, 때때로 자동업데이트로 Update 되는 경우 JRE, JDK 업데이트이후 프로젝트가 다음과 같은 에러가 발생하면서 Run/Debug 실행이 안되는 경우가 있다.


"Specified VM install not found: type Standard VM, name jre6"


이때에는 당황하지 말고 Eclipse workspace 의 다음 경로의 Run/Debug 를 실행했던 projectname build.xml.launch 파일을 삭제해준다.

 

/.metadata/.plugins/org.eclipse.debug.core/.launches/<projectname>build.xml.launch



이후 Eclipse 로 다시 실행하면 Specified VM install not found 에러가 발생하지 않는다.

Posted by leechwin
,