윈도우 환경에서 Perl사용, ActivePerl윈도우 환경에서 Perl사용, ActivePerl

Posted at 2010. 8. 27. 15:27 | Posted in 프로그래밍 언어/Java

ActivePerl 설치

ActivePerl(http://www.activestate.com/activeperl)을 받아서 설치한다.
위 사이트에 접속, 오른쪽에 Download ActivePerl을 클릭하여 자신의 플랫폼에 맞는 걸 받아 설치하면 된다.
콘솔창(cmd)에서 리눅스와 마찬가지로 "perl filename.pl" 하면 된다.

   

Perl용 라이브러리 사용

Perl 용 라이브러리를 가져다 써보자. 사실 이게 주 목적이었다.
윈도우 환경에서 Java로 구현된 프로그램에 Perl로 구현된 라이브러리를 이용하고 싶었다.
이용하려 한 것은 WordNet::Similiarty (http://wn-similarity.sourceforge.net/)
WordNet 2.1을 이용할 것이기 때문에 WordNet::Similarity 1.04를 사용한다.
다운받으면 이미 pm(perl module)파일로 떨어져 있지만, 그냥 끝내면 심심하니? 컴파일 시도.

먼저 make를 하려는데 GCC가 필요하단다. 설치하자. 콘솔에서 "ppm install MinGW"을 입력하면 된다.

다음엔 makefile을 만들자. "perl Makefile.PL"
이 때 의존성이 걸린 프로젝트가 있으면 알려준다.
WordNet::Similarity의 경우 Text::Similarity와 WordNet::QueryData이 필요하다 나온다. 컴파일 방법은 똑같으니 계속한다.
(WordNet::Similarity 사이트에서는 WordNet::QueryData 1.45를 쓰라고 함.)

그 다음 리눅스처럼 make & make install을 해야 하는데, 여기선 ActivePerl에서는 dmake가 있다.
dmake
dmake install
에러 없이 완료되면 blib란 폴더가 생기고, 그 안에 결과물이 들어가 있다. blib/lib 들어가보면 모듈 파일이 생성되어 있다.

   

Java에서 Perl 프로그램의 결과를 이용

Java에서 Perl의 모듈을 이용하는 멋들어진 방법이라면 따로 포스팅을 하겠지만,
단순히 Perl 프로그램이 콘솔에 찍는 결과만을 이용할 예정이라 단순한 방법을 택했다.
(멋들어진 방법을 쓰고 싶지만 배보다 배꼽인 상황이라)

Process p = Runtime.getRuntime().exec("perl " + url);
Scanner scanner = new Scanner(p.getInputStream());
while(scanner.hasNextLine())
{
    String line = scanner.nextLine();
}

남은건 String line가지고 파싱하는 것 뿐.

//

[Java] 익명 클래스 (Anonymous Class)[Java] 익명 클래스 (Anonymous Class)

Posted at 2009. 1. 11. 17:39 | Posted in 프로그래밍 언어/Java
Form GUI 프로그래밍을 할 때 버튼 없이는 되는게 없다는 생각을 할 정도로 GUI 프로그래밍을 할 때 버튼은 거의 꼭 넣곤 한다. 예전에 Swing을 써서 어플리케이션을 만들었는데 버튼에 이벤트를 줘야 했다. 그러나 Swing은 처음. 익명 클래스? 그게 뭥믜 할 시절, 난 다음과 같이 코드를 싸질렀다.
class ButtonActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Do something...
    }
}

// in main..

JButton button = new JButton("OK");
button.addActionListener(new ButtonActionListener());

버튼 하나 만들 때마다 클래스 수가 증가했고 보기도 힘들더라... 고작 actionPerformed 메서드 하나 있는 ActionListener 인터페이스를 구현해서 넣을 건데 클래스를 따로 만들어야 되다니!!

찾아보니 자바엔 Anonymous Class가 있더라. 뭔고 하니 다음과 같은 것이다.

JButton button = new JButton("OK");
button.addActionListener ( new ActionListener() {
    public void actionPerformed(ActionEvent ev)
    {
        // Do Something...
    }
} );

클래스를 따로 만들 필요가 없다. new 구현한 클래스 이름() 대신, 그냥 위와 같이
new 구현하고자 하는 인터페이스 이름() {    구현해야 하는 메서드 구현    }
끝이다.

다른 표현으론 요론식

interface MyInterface
{
    public void function();
}
public class AnonymousClassFromInterface {
    public static void main(String[] args)
    {
        MyInterface mi = new MyInterface(){
            public void function(){
                System.out.println("익명함수");
            }
        };
        mi.function();
    }
}

output >> 익명함수

인터페이스를 구현한 객체를 만들어야 하는데 그 객체는 어떤 부분에서 제한적으로 사용이 되고 구현해야 하는 메서드 숫자도 매우 적을 경우 익명 클래스를 사용하면 좋다.

↑ 참고사이트: http://happystory.tistory.com/64

만약 Swing에서 한 패널이 있고 그 패널에 버튼이 있는 상태인 경우, 그 패널을 클래스화 시켜서 사용중이라면 다음과 같은 방법도 가능하다.

class SomePanel extends javax.swing.JPanel implements ActionListener{
    private
JButton button1;
    private JButton button2;
    private JButton button3;
    public SomePanel(){
        button1 = new JButton("버튼1");
        button1.addActionListener(this);
        this.add(button1);

        button2 = new JButton("버튼2");
        button2.addActionListener(this);
        this.add(button2);

        button3 = new JButton("버튼3");
        button3.addActionListener(this);
        this.add(button3);
    }
    public void actionPerformed(ActionEvent arg0) {
        // Do Something...
        Object obj = arg0.getSource();
        if(obj == button1) {
            System.out.println("버튼1");
        } else if(obj == button2) {
            System.out.println("버튼2");
        } else if(obj == button3) {
            System.out.println("버튼3");
        }
    }
}


옛날에 구현해 놓은거 열어 보니 저렇게 구현이 되어 있었다. 뭘 보고 저렇게 구현했는지는 잘 모르겠다-_-;; 그런데 리스너로 this 막 넘겨주고 해도 괜찮을까 모르겠다.  메모리 해제가 안 될 것 같기도 하고;;
참고로 getSource() 는 이벤트가 일어난 객체를 리턴한다. 패널의 모든 버튼이 같은 일을 하면 필요 없겠지만 보통 안 그렇기 때문에 저런 방법을...

//