Shinnara's Blog
Talking with Shinnara :: NaraTalk.com


Java is a very nice and popular programming language. Groovy is a more graceful one. Groovy makes developers feel free. Even I've been on groovy since just about 1 month ago, Groovy makes me very happy and gives many insperations.

Today, I'll show a simple example of "Java and Groovy Integration". Groovy has a "Groovy script engine", so on runtime, SW could behave more dynamically.  On my point, I'll apply this feature to support the analysis SW. I make the framework to maintain SW and File In/Out. Other developer and researcher compose the analysis routine using Groovy script.

Today's purpose is getting summation from 1 to the designated number using groovy script and adding sum value from Java Class.

Here are source codes:

[MyClass.java]
public class MyClass {

        public int value;
}



[MyScript.groovy]
sum = 0;

1.upto(number) {
    each ->
        sum += each   
}

sum += myclass.value


[ScriptTest.java]
import groovy.lang.*;
import groovy.util.*;
import java.util.*;

public class ScriptTest {

    public static void main(String[] args)throws Exception {

        MyClass myclass = new MyClass();
        myclass.value = 10;
       
        Hashtable<String, Object> variables = new Hashtable<String, Object>();
        variables.put("number", new Integer(10));
        variables.put("myclass", myclass );
       
        GroovyScriptEngine engine = new GroovyScriptEngine(".");   
        Binding binding = new Binding(variables);
        engine.run("src/MyScript.groovy", binding);
       
        System.out.println("Result "+ binding.getProperty("sum"));
       
           
    }

}



Using above, the result is:

Result 65


All works are done successfully.


0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/309 관련글 쓰기

댓글을 달아 주세요


얼마전 Groovy 에 대한 글을 올렸는데요, 제 FreeBSD 에 설치할 때 처음에는 port 를 이용해서 설치하려고 했었습니다. 그러다가 다음과 같은 에러때문에 port 로 설치를 못했었습니다.

[root /usr/ports/lang/groovy]# make install clean
groovy-1.0.j.06_1: Environment error: "JAVA_HOME" should not be defined.
*** Error code 1

Stop in /usr/ports/lang/groovy.
[root /usr/ports/lang/groovy]#


"JAVA_HOME" should not be defined --> JAVA_HOME 이 정의되어 있지 않아야 한다는 것이지요. JAVA_HOME 으로 등록된 환경변수를 임시로 지우는 방법입니다.

[shinnara ~]$ echo $JAVA_HOME
/usr/local/jdk1.6.0
[shinnara ~]$ unset JAVA_HOME
[shinnara ~]$ echo $JAVA_HOME

[shinnara ~]$


위에서 보시는 것처럼 unset 을 해주시면 됩니다~~^^

간단한 걸 몰라서 수동으로 소스 받아서 설치를 했네요.. 바보.. ^^

p.s. tomcat 을 port 로 설치하는 경우에도 같은 에러 메시지가 나올 수 있습니다~ 해결방법은 역시 동일~




0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/136 관련글 쓰기

댓글을 달아 주세요


처음 Groovy 를 알게 된 것이 Ant 의 Task 중의 Script task 를 보다가 접하게 되었는데, Ant 에서 Groovy 를 활용하는 방법에 대한 내용입니다. Script 를 사용할 수 도 있지만 오늘 보여드릴 예제처럼 taskdef 를 이용하실 수도 있습니다.

먼저 하고자 하는 것은 현재 폴더에 있는 파일들이 과거 특정 시점(여기서는 ant 를 실행했던 직전 시점) 이후에 고쳐진 파일이 무엇인지를 찾아내는 것입니다. 그간 이곳의 글들을 보신 분들은 아시겠지만 작업 환경을 꾸며나가는 과정에서 Ant 와 FTP 를 활용하고 있습니다. 그런데 FTP 를 이용한 업로드의 경우, 수정되지 않은 파일까지 모두 전송하게 되므로, 업로드 후에 빌드를 하려고 하면 처음부터 다시 빌드가 됩니다. 따라서 수정되지 않은 파일은 업로드 하지 않도록 하는 방법을 생각해보던 중에 Script 를 써서 해결하면 되지 않을까하여 접근하게 되었습니다.

일단, 오늘은 위에서 언급한 대로 새로 고쳐진 파일이 있는지를 확인합니다. 확인하는 방법은 직전의 ant 작업의 끝에 특정 파일을 생성합니다. 그리고 다시 ant 를 하게 하면 그 파일의 시간을 기준으로 삼고 새롭게 수정된 내용이 있는지를 확인하는 방법입니다.

제가 작성한 build.xml 파일입니다.

<?xml version="1.0" encoding="UTF-8" ?>
<project name="syncer" default="main" basedir=".">   
    <property name="dir.lib" value="/usr/local/groovy/lib"/>
    <property name="file.last" value="timestamp.log" />
    <taskdef name="groovy"
             classname="org.codehaus.groovy.ant.Groovy">
        <classpath>
          <fileset dir="${dir.lib}">
            <include name="**/*.jar"/>
          </fileset>
        </classpath>
    </taskdef>

    <target name="main">
        <groovy>
        lastTimestamp = (new File("${properties['file.last']}")).lastModified()
       
        files = new File(".").listFiles()
        files.each { if( it.lastModified() > lastTimestamp )
                      {
                        println it.toString() + " is newer!"
                      }
         }
       
        </groovy>
        <touch file="${file.last}" />
    </target>
</project>

실행하면 다음과 같은 결과를 보여줍니다.

[shinnara ~/groovy/work/syncer]$ touch a.out
[shinnara ~/groovy/work/syncer]$ ant
Buildfile: build.xml

main:
   [groovy] ./a.out is newer!

BUILD SUCCESSFUL
Total time: 4 seconds


groovy 를 제대로 활용하면 더욱 편리한 작업환경을 만들수 있을 것 같습니다.







TAG ant, Groovy
0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/131 관련글 쓰기

댓글을 달아 주세요

Groovy 시작하기 - 2

Computer/Programming/Java 2007/09/10 14:57 by Shinnara
Groovy 시작하기 에 이어 씁니다.

이왕 시작하기로 했으니, 제대로 해봐야 겠지요? 홈페이지에 써 있는 대로 소스를 받아서 설치를 합니다.
Eclipse 에서 사용할 수 도 있으니, Eclipse 에서 해보실 분들은 해당 플러그인을 받으시면 됩니다. 저의 경우는 일단 FreeBSD에서 돌려볼 요량으로 소스를 받아보았습니다.

다음 페이지를 보시면 설치 방법이 설명되어 있습니다.

http://groovy.codehaus.org/Setup+Groovy+Development+Environment


뭐, 그다지 어려운 내용은 없군요. 적혀진 내용대로 SVN을 이용해서 소스를 받아옵니다.

svn co http://svn.codehaus.org/groovy/trunk/groovy/groovy-core


그리고는 groovy-core 디렉토리에서 ant 를 입력하여 build 를 시작합니다.

제 시스템에서는 13분이나 걸렸네요. 시스템이 느린건가.. ^^

     [copy] Copying 1 file to /usr/home/shinnara/groovy/groovy-core/target/staging/META-INF
   [jarjar] Building jar: /usr/home/shinnara/groovy/groovy-core/target/dist/groovy-all-1.1-beta-3-SNAPSHOT.jar
     [copy] Copying 1 file to /usr/home/shinnara/groovy/groovy-core/target/dist
   [delete] Deleting directory /usr/home/shinnara/groovy/groovy-core/target/staging

-actuallyCreateJars:

createJars:

BUILD SUCCESSFUL
Total time: 13 minutes 35 seconds

build.xml 을 보니 default task 가 createJars 입니다.  install 을 위한 파일들을 만드실 경우 ant install 을 해주면 target 디렉토리 밑이 install 디렉토리가 생기게 됩니다. 여기 있는 파일들을 적당한 위치로 옮긴후 환경 변수 설정을 해주면 설치가 끝납니다.

#mv install/ /usr/local/groovy/


/etc/profile 에 다음 내용 추가

set GROOVY_HOME=/usr/local/groovy
exprt PATH=$PATH:$GROOVY_HOME/bin


Binary 를 이용하여 설치하고자 하는 경우는

http://groovy.codehaus.org/Download

에서 다운로드 받으시면 됩니다. 환경변수 설정은 위와 같이 해주시구요..

그런 다음 제대로 설치되었는지를 확인해봅니다.

[shinnara ~]$ groovysh
Groovy Shell (1.1-beta-3-SNAPSHOT, JVM: 1.6.0_01-p1-shinnara_01_sep_2007_01_46-b00)
Type 'go' to execute statements; Type 'help' for more information.
groovy> println "hello,world"
groovy> go
hello,world
===> null
groovy>

groovysh 는 groovy shell 프로그램으로 ruby 와 비슷한 모습을 보여줍니다.

http://groovy.codehaus.org/Quick+Start 의 예제를 한번 실행해보겠습니다.

[shinnara ~/groovy/work]$ cat hello.groovy
println "hello, world"
for (arg in this.args ) {
      println "Argument:" + arg;
}

[shinnara ~/groovy/work]$ groovy hello.groovy Shinnara Hyunkyu NiceMan
hello, world
Argument:Shinnara
Argument:Hyunkyu
Argument:NiceMan
[shinnara ~/groovy/work]$

명령행으로부터 인자를 받아서 해당 내용을 한줄씩 보여주는 간단한 프로그램입니다.

제대로 표시가 되나요? Groovy 를 활용할 준비가 되신 것을 축하합니다~~~


update :

위의 hello.groovy 를 쉘 스크립트처럼 수행할 수 있는 방법입니다. hello.groovy 의 맨 처음 줄에 해석기를 추가하는 것입니다.

#!/usr/bin/env groovy
println "hello, world"
for (arg in this.args ) {
      println "Argument:" + arg;
}

그리고 실행 할 수 있도록 +x 를 해줍니다.

#chmod +x hello.groovy
#./hello.groovy Shinnara Hyunkyu NiceMan
hello, world
Argument:Shinnara
Argument:Hyunkyu
Argument:NiceMan

perl 을 잘 모르는 저에게 쉘 스크립트처럼 사용할 수 있는 것은 큰 즐거움이 아닐 수 없습니다~~^^







0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/129 관련글 쓰기

댓글을 달아 주세요

Groovy 시작하기

Computer/Programming/Java 2007/09/10 14:29 by Shinnara

사용자 삽입 이미지
오늘은 Groovy 에 대해 소개해 볼까합니다. 솔직히 Groovy 에 대해 알게된건 얼마안되었습니다. 이글을 쓰기 한시간 전 쯤? 완전 초보지요.. 앞으로 Groovy 에 대해 하나씩 알아가는 과정을 담아볼까 합니다.




먼저 Groovy 의 홈페이지 입니다.

http://groovy.codehaus.org/
http://groovy.codehaus.org/Korean+Home 한글화 페이지

이 페이지의 내용을 조금 옮겨보면 다음과 같습니다.

Groovy 란?

자바 플랫폼에서 실행되는 기민한 동적 언어(agile dynamic language) 이며, Python, Ruby, Smalltalk 언어에서 영향을 받은 많은 특징을 가지고 있습니다. 자바 개발자들은 자바와 비슷한 문법을 사용하여 이러한 특징들을 구현할 수 있습니다.
웹 어플리케이션 개발, 쉬운 쉘 스크립트 사용, Groovy의 JUnit 기능을 이용한 간결하고 의미있는 테스트 케이스 작성, 복잡한 실제 어플리케이션 의 프로토타이핑과 구현은 너무나 간결하고 매혹적입니다.

Groovy는 이미 작성된 모든 자바 객체, 라이브러리와 깔끔하게 동작하며, 어플리케이션 개발스크립팅 모드에서 모두 자바 바이트코드 로 직접 컴파일 됩니다.

간단한 hello world 스크립트:

def name='World'; println "Hello $name!"


객체 직향을 사용한 좀 더 복잡한 코드:

class Greet {
def name
Greet(who) { name = who[0].toUpperCase() + who[1..-1] }
def salute() { println "Hello $name!" }
}

g = new Greet('world') // 객체 생성
g.salute() // "Hello World!" 출력


기존 자바 라이브러리의 사용:
import org.apache.commons.lang.WordUtils

class Greeter extends Greet {
Greeter(who) { name = WordUtils.capitalize(who) }
}

new Greeter('world').salute()


커맨드 라인에서의 실행:

groovy -e "println 'Hello ' + args[0]" World


최근 회자되는 최고의 화두 중의 하나는 "Agile" 일 것입니다. XP(eXtreme Programming), TDD (Test Driven Development), PP(Pair Programming) 등으로 대표되는 Agile 방법론들에 대해서는 익히 들어 알고 계실것입니다. 이러한 방법론에 못지 않게 사용하는 언어 역시 생산성이나 효율에 지대한 영향을 미치게 됩니다. 얼마전부터 큰 반향을 일으키고 있는 Ruby 와 Rails 가 대표적인 예라 할 수 있습니다. 단 몇줄의 코드로 웹서비스를 만들어내는 과정을 통해 그 놀라온 생산성을 만천하에 알리기도 했습니다.

일반적으로 스크립트 언어나 인터프리터 언어가 생산성이 좋습니다. 뭐 당연하겠지요. 보다 결과를 빨리 볼 수 있기도 하고.. 또한 언어 자체의 설계나 기본 개념이 서로 다른 면도 있습니다. 컴파일러 언어의 대표격인 C는 생산성보다는 주로 성능에 맞춰져 있으니까요. 코드를 힘들고 어렵게 짜더라도 더 빨리 실행될 수 있으면 되는 게 C 세계라고 생각합니다. 하지만 개발하는 과정에 있어 가장 중요한 것이 성능만은 아닐 것입니다. 성능 좋은 시스템을 만들기 앞서 해당 시스템의 전체적인 윤곽을 보기 위해 proto type 을 만들어야 하는 일은 개발에 있어 부지기수겠지요.

위의 예에서도 봤듯이, 하나의 작업을 수행하기 위해 할 수 있는 방법은 너무도 많습니다. 중요한 것은 목적에 맞는 방법을 택하는 것이겠지요.

아는 만큼 보인다고 하지요. 결국 해결 방법이 다양함을 알아야 더 좋은 방법을 택할 수 있을 것입니다. 한분야를 깊게 파고 드는 것도 중요하겠지만, 넓은 안목으로 다양성을 인정하며 끊임없이 새로운 것을 익히는 것 또한 그 중요한 일이 아닐 수 없습니다.


0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/128 관련글 쓰기

댓글을 달아 주세요

1 
다...... (264)
Computer/Programming (106)
Links (14)
책 읽는 즐거움 (7)
끄적임 (66)
즐거운 과학 나라 (7)
일본 (5)
Study (4)