2011年10月30日日曜日

Groovy Curry化の勉強のはずがっ Scope の調査に…

スコープってどうなってるの?



どうやら、この前書いたエントリで不思議に思ったことがあったので、
ちょいと調べて見ました。

それはクロージャーを返すクロージャーで宣言されているあの数値、
スコープはどうなっているのかということです。

試してみましょう。

scope.groovy

def scopedCounter = {
    def c = 0
    return {c+=1}
}

def sCnt = scopedCounter()
def tCnt = scopedCounter()
(1..10).each {
    assert sCnt() == it
    assert tCnt() == it
}



特に問題は発生しませんでした。
したがって、scopedCounterにて定義されている
変数cのスコープは
それぞれのクロージャーに閉じているようです。


そういえばっdef外せるのかな?



こんなことを考えなければ、よかった。
しかし、考えてしまったので仕方がない、調べてみました。


unscope.groovy

def unscopedCounter = {
    cnt = 0
    return {cnt+=1}
}

def uCnt = unscopedCounter()
def vCnt = unscopedCounter()
def escape = 0
(1..10).eachWithIndex { value, indx ->
    escape = indx
    assert uCnt() == value + escape
    assert vCnt() == value + escape + 1
}
assert cnt == 20



失敗すること3回くらい。
やっとなんとかつかめてきました。
クロージャーの中に使われている変数の宣言でdefを省略すると、
そのスコープは一つ大きなグローバルに含まれるようになる。

書き方を正すなら、先のコードは次のコードと同じ意味になる。


unscope.groovy

def cnt = 0
def unscopedCounter = {
    cnt = 0
    return {cnt+=1}
}

def uCnt = unscopedCounter()
def vCnt = unscopedCounter()
def escape = 0
(1..10).eachWithIndex { value, indx ->
    escape = indx
    assert uCnt() == value + escape
    assert vCnt() == value + escape + 1
}
assert cnt == 20


まず、グローバルスコープでcntを宣言しておいて、
その後、クロージャーunscopedCounterが呼ばれるたびに、0が設定される。
では、そのあたり本当か試してみましょう。


unscope.groovy

def unscopedCounter = {
    cnt = 0
    return {cnt+=1}
}

def uCnt = unscopedCounter()
def vCnt = unscopedCounter()
def escape = 0
(1..10).eachWithIndex { value, indx ->
    escape = indx
    assert uCnt() == value + escape
    assert vCnt() == value + escape + 1
}
assert cnt == 20

def wCnt = unscopedCounter()
assert cnt == 0
(1..10).each {
    assert wCnt() == it
}
assert cnt == 10



はい、通りました。
予測は正しかったようです。


結論

クロージャーを返すクロージャーを書く際には、戻り値となるクロージャーの中に使われる変数は極力元のクロージャーにて定義した変数を使うようにすること。



2011年10月27日木曜日

Curry化のお勉強の入門1

Curry化くらいスクリプト言語やっているんだから、出来るよね


なんてことを言われたら、困るので、カリー化のお勉強をしておこうと思う。

カリー化とは?


ググッてください

部分適用とかもよくわからないんで、どうしようかな


というわけで、Javascriptではよく使われている、
変数のprivate化をやって見ることにしましょう。
カリー化はその先にある。

多分。

counter.groovy

def counter = {
    def cnt = 0
    return { cnt += 1 }
}

def cnt = counter()

10.times {
    def value = cnt()
    println value
    assert value == it + 1
}


実行結果は次の通り

1
2
3
4
5
6
7
8
9
10


さて、オレが最初にカリー化を覚えたのは実はjavascriptの方が最初でして、やはりここはjavascript大先生に登場願わなければならんとせんといかんであるで御座候。

counter.js

var counter = function() {
    var c = 0;
    return function() {
        c += 1;
        return c;
    }
}
var cnt = counter();
for (var i = 1; i <= 10; i += 1) {
    console.assert (cnt() == i);
}
はい、これをChrome14.0.835.hogehogeで実行したところ、Assertion Errorは発生しませんでした。 というわけで、今回の目的、クロージャー内に変数をprivateとして隠蔽するという目標は達成。 では、明日はおもむろにカリー化に挑戦する!

2011年10月23日日曜日

GradleファイルからIDEAプロジェクトをつくろう

GradleからIDEAプロジェクトを作る


今、はやりのm2.eclipseなどのMaven~Eclipse関連のプラグインは充実してきています。

ただ、私、個人的にEclipseが好きでないし、
(いちいちコード補完を呼び出すのに、Ctrl + Spaceを押さなければならないとか、結構面倒)
Mavenなんてほとんど知らないので、
m2.eclipseとかを使っても、なんのメリットも享受できなかったりする…orz

というわけで、GradleとIntelliJ IDEAに走るわけですが、
つい最近知ったGradleのプラグインに便利なのがあったので、メモ。

例:jetty-embeddedなアプリケーションをGroovyと共に作成する場合の依存関係を解決するbuild.gradleを書いてみました。

build.gradle

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.eclipse.jetty:jetty-server:7.5.3.v20111011'
    groovy 'org.codehaus.groovy:groovy:1.8.3'
    testCompile 'org.codehaus.groovy:groovy:1.8.3'
    testCompile 'junit:junit:4.9.'
}


とりあえず、このファイルをプロジェクトの直下に置いて、次のコマンドを実行すると、
依存関係を解決しつつ、IDEAプロジェクトが作成されます。


$ gradle idea
:ideaModule
:ideaProject
:ideaWorkspace
:idea

BUILD SUCCESSFUL

Total time: 5.482 secs
$ 


オレの環境ではすでにライブラリーのダウンロードは終わっているので、特に表示されていませんが、
ライブラリーが足りない場合にはちゃんとダウンロードしてきます。

ダウンロードしたライブラリーは
/Users/username/.gradleの下に保存されています。

また、IDEAのライブラリーに自然にリンクが貼られている状態になるので、そのままIntelliJ IDEAでの開発を始められます。

というわけで、eclipseとmavenでなんかぎこちのない皆さん、Gradle + IDEAでプログラムの作成をやってみましょう。

以下、参考サイト

Gradle
Maven Search


2011年10月17日月曜日

JsonSlurperを始めよう!

仕事でWebApiの設計をしているので、
JSONを扱うことが非常に多くなってきました。

ただ、JSONを扱うといっても、
ドキュメントとしてJSONのサンプルを書いているだけで、
最後、Javaに直さなければならないことを考えると、
非常に無駄の多い作業だなと思うようになってきました。

そこでGroovyですよ!


DSLを書けばいいじゃんと考えるのが普通ですよね。

ただ、まあ、そうは言ったものの、
DSLを自作できるほどのスキルも無いので、

JSONをそのままPOJOファイルに変換・出力してくれるツールをGroovyで作れないか?

と考えて見ました。

ただ(え、まだなんかあるの?)、POJOにするツールといっても、
JsonSlurperすら使い方を知らない…orz

というわけで、JsonSlurperを試しに使って見ることにしました。

SampleJsonSlurper.groovy

import groovy.json.JsonSlurper

def json = $/
{
    "getAt" : "2011/10/17",
    "person" : {
        "privateId" : 12345,
        "name" : "hoge",
        "age" : 24
    },
    "boss" : {
        "privateId" : 0,
        "name" : "Jorge",
        "age" : 41
    },
    "depart" : "sales",
    "income" : 60000,
    "projects" : [
        {
            "id" : 123,
            "name" : "Idea",
            "income" : 300000
        },
        {
            "id" : 123,
            "name" : "Idea",
            "income" : 300000
        }
    ]
}
/$

def sluper = new JsonSlurper()
def object = sluper.parseText(json)

println object.getClass()

object.each {
    println it.key
    println it.value.getClass()
}



というわけで、ComplexタイプのJSONを作ってみて、それをパースしてみました。
出力結果は次のような感じです。


class java.util.HashMap
projects
class java.util.ArrayList
person
class java.util.HashMap
depart
class java.lang.String
income
class java.lang.Integer
getAt
class java.lang.String
boss
class java.util.HashMap


どうやら、JsonSlurperparseTextは、
HashMapを返してくれて、
各値にはそれぞれ、Stringとか、ArrayListとかを
返してくれているようですね。

というわけで、JSONからPOJOを作り出すのはなんとなくできそうな気がしてきました。



トレイトについて

さて、プログラミング言語Scalaにトレイトという機能があります。

…オレはよく知りませんが…

で、『東大英単』を読んでいたときに、「trait」という単語があったので、
それについて記事を書いて見ることにしました。

trait
意味
a distinctive characteristic
例文

The gray fox possesses a unique trait that distinguishes it from other members of the dog family: It is anatomically adapted for climbing.

ハイイロギツネは他のイヌ科とことなる特徴を持っている。高所によじ登ることが出来る身体能力を持っているのだ。


というわけで、何か他のものとは異なるという特徴を表すときにトレイトという言葉が使われるようです。

たしかScalaのトレイトはJavaのインターフェースのようなものですが、
若干異なるような感じがしますね。






2011年10月16日日曜日

It's not technological article.

Ryo (@ryoasai74) is now tweeting in English.
So it makes me decide to tweet in English too.

There are some reason to use English.
  • I'm recently working and collaborating with Vietnamese developer, communicating in English.
  • There are growing opportunities to read technological documents written in English.

So, these are forcing me to use English

But I have not used English often these days, I decided to read the book named 'Todai Eitan' published by the university of Tokyo.


『東大英単』 written and edited by Masako Notoro, Blendan Willson, Shiro Yamamoto, Tom Garry, Shoichiro Kawai, Shuichi Watabe.

civilization


In the first chapter of this book, I found the word 'civilization'.

The word 'civilization' means "a state of advanced learning, technology, or social organization/ a society possessing the same"

And there are some examples.

  • Colonialists often see themselves as bringing civilization to less fortunate peoples.
  • The society which produced the pyramids certainly deserves to be called civilization.

To translate these sentences into Japanese, it may be like these.
  • 移住者たちは自分たちが洗練された社会を恵まれない人に与えてやっていると思い込んでいたりする。
  • ピラミッドを作った社会は文明と読んでもいいだろう

This translation is not perfect...
But these sentences have much more explanation for other idioms.

The first example

There are two cool expression.

  • one sees him as X
  • bringing something to someone

The second example

Cool expression.

  • Hakuho deserves to be called real Yokozuna.


So this book has a worth reading.
To learn one word with some other idioms.

Hey! Why don't you read this book?

GroovyClassLoader凄いす

GroovyのGroovyClassLoaderが凄いので、ちょっとメモ


大したことのないエントリです。
Groovyって、まあ動的言語なわけですが、
さて、どうしたら動的にクラスとかを作り出せるのか、
はて?とおもっていました。

で、やっと見つけたのが、
GroovyClassLoader
です。

使い方はこんな感じ。

def loader = new GroovyClassLoader(this.getClass().getClassLoader())
def textClass = loader.parseClass(
$/
class DynamicPerson {
    def age
    boolean isAdult() {this.age >= 20}
}
/$
)
def dPerson = textClass.newInstance()
dPerson.age = 20
assert dPerson.isAdult() == true


文字列をClassとして読み込んでしまう、おそろしい機能ですね。

ちなみに、読み込むクラスは文字列なので、
当然のことながらコンパイルによる型チェックとかはしてくれません。
(IntelliJ IDEAでは試していませんが…)

ですが、まあ、Webアプリのプロトタイプを作るときなどは、
こういう機能があると、非常に助かる。

ちょっとしたエンベデッドなWebサーバーを作って、
Ajaxの適当なレスポンスを返すときには非常に便利ですね。

まあ、こんなのを書いていると、ぬこには怒られそうだけど…


第4回Jenkins勉強会に行って来ました

第4回Jenkins勉強会に行って来ました。



さて、内容の詳細ですが、
ブログまとめ職人の@shinyaa31さんが素晴らしいものを書いていますので、
そっち読んでください。

あと、トゥギャッターもまとめられているので、読んでみてください。

togetter - 10月15日 第4回Jenkins勉強会(東京都)
2011/10/15_第4回Jenkins勉強会( #jenkinsstudy )

当日のUST録画もありますので、興味のある方は御覧ください。

以上、報告終わり!


(´・ω・`)