2011年10月31日月曜日

groovyとJackrabbitでWebDAVサーバ上のリソースを移動する

groovyとJackrabbitでWebDAVサーバ上のリソースを移動するには、以下のコードを実行します。
@Grab(group='org.apache.jackrabbit', module='jackrabbit-jcr2dav', version='2.2.9')

import org.apache.commons.httpclient.auth.*
import org.apache.commons.httpclient.*
import org.apache.jackrabbit.webdav.client.methods.*
import org.apache.jackrabbit.webdav.*

// WebDAV URL
baseUrl = "http://localhost:8080/repository/default"
oldpath = "/" + java.net.URLEncoder.encode("テスト", "UTF-8")
newpath = ""
oldurl = baseUrl + oldpath
newurl = baseUrl + newpath
filename = "サンプルファイル.txt"

try
{
  client = new HttpClient()
  client.getState().setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials('username', 'password'))

  method = new MoveMethod(
    oldurl + "/" + java.net.URLEncoder.encode(filename, "UTF-8"),
    newurl + "/" + java.net.URLEncoder.encode(filename, "UTF-8"),
    false /*= overwrite */
  )
  client.executeMethod(method)
  println(method.getStatusCode() + ":" + method.getStatusText())
}
catch(HttpException ex){
  println ex
}

動作環境
groovy 1.8.2, JDK6 Update27, Jackrabbit 2.2.9

2011年10月30日日曜日

groovyとrabbitmqでメッセージの送信・受信をおこなう

groovyとrabbitmqでメッセージの送信をおこなうには、以下のコードを実行します。
@Grab(group='com.rabbitmq', module='amqp-client', version='2.6.1')

import com.rabbitmq.client.*

factory = new ConnectionFactory()
factory.host = "localhost"
connection = factory.newConnection()
channel = connection.createChannel()
// queueを作成
queueName = "myqueue"
channel.queueDeclare(queueName,
  true /*= durable */,
  false/*= exclusive*/,
  false /*= autoDelete*/,
  null /*= arguments */)
// メッセージを送信
channel.basicPublish("", queueName, 
  MessageProperties.PERSISTENT_TEXT_PLAIN,
  "サンプルメッセージ".getBytes("UTF-8"))
channel.basicPublish("", queueName, 
  MessageProperties.PERSISTENT_TEXT_PLAIN,
  "another message".getBytes("UTF-8"))
channel.close()
connection.close()
メッセージの受信を行うには以下のコードを実行する際にmyqueueをコマンドライン引数で指定します。
@Grab(group='com.rabbitmq', module='amqp-client', version='2.6.1')

import com.rabbitmq.client.*

factory = new ConnectionFactory()
factory.host = "localhost"
connection = factory.newConnection()
channel = connection.createChannel()
channel.queueDeclare(args[0],
  true /*= durable */,
  false/*= exclusive*/,
  false /*= autoDelete*/,
  null /*= arguments*/)
// 1つだけメッセージを受信
response = channel.basicGet(args[0], false)
if( response == null ){
  // メッセージなし
  println "there's no message."
} else {
  println "${args[0]} received:" + new String(response.getBody(), "UTF-8")
  channel.basicAck(response.getEnvelope().getDeliveryTag(), false)
}
channel.close()
connection.close()

動作環境
groovy 1.8.2, JDK6 Update26, rabbitmq 2.6.1

2011年10月29日土曜日

groovyとJackrabbitでWebDAVサーバ上にコレクションを作成する

groovyとJackrabbitでWebDAVサーバ上にコレクションを作成するには、以下のコードを実行します。
@Grab(group='org.apache.jackrabbit', module='jackrabbit-jcr2dav', version='2.2.9')

import org.apache.commons.httpclient.auth.*
import org.apache.commons.httpclient.*
import org.apache.jackrabbit.webdav.client.methods.*
import org.apache.jackrabbit.webdav.*

// WebDAV URL
baseUrl = "http://localhost:8080/repository/default"
path = "/" + java.net.URLEncoder.encode("テスト", "UTF-8")
url = baseUrl + path
println url
colname = "テスト用フォルダ"

try
{
  client = new HttpClient()
  client.getState().setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials('username', 'password'))

  method = new MkColMethod(url + "/" + java.net.URLEncoder.encode(colname, "UTF-8"))
  client.executeMethod(method)
  println(method.getStatusCode() + ":" + method.getStatusText())
}
catch(HttpException ex){
  println ex
}

動作環境
groovy 1.8.2, JDK6 Update27, Jackrabbit 2.2.9

2011年10月27日木曜日

groovyとJackrabbitでWebDAVサーバ上のリソースを削除する

groovyとJackrabbitでWebDAVサーバ上のリソースを削除するには、以下のコードを実行します。
@Grab(group='org.apache.jackrabbit', module='jackrabbit-jcr2dav', version='2.2.9')

import org.apache.commons.httpclient.auth.*
import org.apache.commons.httpclient.*
import org.apache.jackrabbit.webdav.client.methods.*
import org.apache.jackrabbit.webdav.*

// WebDAV URL
baseUrl = "http://localhost:8080/repository/default"
path = "/" + java.net.URLEncoder.encode("テスト", "UTF-8")
url = baseUrl + path
println url
filename = "サンプルファイル.txt"

try
{
  client = new HttpClient()
  client.getState().setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials('username', 'password'))

  method = new DeleteMethod(url + "/" + java.net.URLEncoder.encode(filename, "UTF-8"))
  client.executeMethod(method)
  println(method.getStatusCode() + ":" + method.getStatusText())
}
catch(HttpException ex){
  println ex
}

動作環境
groovy 1.8.2, JDK6 Update27, Jackrabbit 2.2.9

2011年10月26日水曜日

gmongoでMapReduceを使用して複数キーのグループ毎の件数を求める

gmongoでMapReduceを使用して複数キーのグループ毎の件数を求めるには、以下のコードを実行します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([country:"Japan", region: "east", store:"store_A", sales:100])
col.insert([country:"Japan", region: "west", store:"store_B", sales:120])
col.insert([country:"Japan", region: "west", store:"store_C", sales:170])
col.insert([country:"United States", region:"north", store:"store_D", sales:80])
col.insert([country:"United States", region:"west", store:"store_E", sales:200])
col.insert([country:"United States", region:"east", store:"store_F", sales:190])
col.insert([country:"United States", region:"east", store:"store_G", sales:100])
// MapReduceで国・地域ごとの店舗数を取得
println col.mapReduce(
  /* map */ """function(){
    emit({country:this.country, region:this.region},
    {count:1});
  }""",
  /* reduce */ """function(key, values){
    var total = 0;
    for(var vi = 0;vi<values.length;vi++){
      total += values[vi].count;
    }
    return {count: total};
  }""",
  /* outputTarget */"mr_result",
  /* query */ new BasicDBObject()
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年10月25日火曜日

groovyとJackrabbitでWebDAVサーバにファイルをアップロードする

groovyとJackrabbitでWebDAVサーバにファイルをアップロードするには、以下のコードを実行します。
@Grab(group='org.apache.jackrabbit', module='jackrabbit-jcr2dav', version='2.2.9')

import org.apache.commons.httpclient.auth.*
import org.apache.commons.httpclient.*
import org.apache.commons.httpclient.methods.*
import org.apache.jackrabbit.webdav.*

// WebDAV URL
baseUrl = "http://localhost:8080/repository/default"
path = "/" + java.net.URLEncoder.encode("テスト", "UTF-8")
url = baseUrl + path
println url
filename = "サンプルファイル.txt"

try
{
  client = new HttpClient()
  client.getState().setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials('username', 'password'))

  method = new PutMethod(url + "/" + java.net.URLEncoder.encode(filename, "UTF-8"))
  method.setRequestEntity(
    new InputStreamRequestEntity(new FileInputStream(filename))
  )
  client.executeMethod(method)
  println(method.getStatusCode() + ":" + method.getStatusText())
}
catch(HttpException ex){
  println ex
}

動作環境
groovy 1.8.2, JDK6 Update27, Jackrabbit 2.2.9

2011年10月24日月曜日

groovyとJackrabbitでWebDAVサーバ上のフォルダを列挙する

groovyとJackrabbitでWebDAVサーバ上のフォルダを列挙するには、以下のコードを実行します。
@Grab(group='org.apache.jackrabbit', module='jackrabbit-jcr2dav', version='2.2.9')

import org.apache.commons.httpclient.auth.*
import org.apache.commons.httpclient.*
import org.apache.jackrabbit.webdav.client.methods.*
import org.apache.jackrabbit.webdav.*

// WebDAV URL
baseUrl = "http://localhost:8080/repository/default"
path = "/" + java.net.URLEncoder.encode("テスト", "UTF-8")
url = baseUrl + path
println url

try
{
  client = new HttpClient()
  client.getState().setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials('username', 'password'))

  method = new PropFindMethod(url, DavConstants.PROPFIND_ALL_PROP, DavConstants.DEPTH_1)
  client.executeMethod(method)
  multistatus = method.getResponseBodyAsMultiStatus()
  responses = multistatus.getResponses()
  for( response in responses ){
    // display nameを表示
    println response.getProperties(HttpStatus.SC_OK).get(DavConstants.PROPERTY_DISPLAYNAME).value
    // hrefを表示
    println response.getHref()
  }
  println(method.getStatusCode() + ":" + method.getStatusText())
}
catch(HttpException ex){
  println ex
}

動作環境
groovy 1.8.2, JDK6 Update27, Jackrabbit 2.2.9

2011年10月22日土曜日

groovyとsardineでbox.net上のファイル・フォルダを列挙する

groovyとsardineでbox.net上のファイル・フォルダを列挙するには、以下のコードを実行します。
import com.googlecode.sardine.*

sardine = SardineFactory.begin('<your-mail-address>', '<your-password>')
path = "test"
resources = sardine.getResources("https://box.net/dav/${path}");
for(resource in resources){
  println resource.name
}
動作環境
groovy 1.8.2, JDK6 Update27, sardine-304

※groovyのlibディレクトリに以下のjarを追加
・sardine.jar
・httpcore-4.1.2.jar
・httpclient-4.1.2.jar
・commons-codec-1.4.jar
・slf4j-api-1.6.2.jar

関連情報
sardineのwebsite
http://code.google.com/p/sardine/

2011年10月21日金曜日

groovyでjarに含まれるディレクトリを一覧表示する

groovyでjarに含まれるディレクトリを一覧表示するには、以下のコードを実行します。
import java.util.jar.*

// jarに含まれるディレクトリを表示
jf = new JarFile("/usr/share/groovy/lib/groovy-1.8.2.jar")
for(entry in jf.entries()){
  if( entry.isDirectory() )System.out.println(entry.name)
}

動作環境
groovy 1.8.2, JDK6 Update22

2011年10月20日木曜日

gmongoでMapReduceを使用してフィールド項目にない項目で合計を求める

gmongoでMapReduceを使用してメンバー項目以外の項目で合計を求めるには、以下のコードを実行します。 以下のコードでは、タイムスタンプのフィールドから日付ごとの集計を行います。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([store:"store_A",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 12, 11, 30).getTime(),
  sales:110])
col.insert([store:"store_B",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 18, 31, 15).getTime(),
  sales:100])
col.insert([store:"store_C",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 19, 11, 10).getTime(),
  sales:120])
col.insert([store:"store_A",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 10, 17, 45).getTime(),
  sales:100])
col.insert([store:"store_B",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 11, 10, 5).getTime(),
  sales:130])
// MapReduceで日ごとの売上を取得
println col.mapReduce(
  /* map */ """function(){
    emit(this.sales_timestamp.getFullYear() + "/" +
        (this.sales_timestamp.getMonth() + 1) + "/" +
        this.sales_timestamp.getDate(), {sales:this.sales});
  }""",
  /* reduce */ """function(key, values){
    var total = 0;
    for(var vi = 0;vi<values.length;vi++){
      total += values[vi].sales;
    }
    return {sales: total};
  }""",
  /* outputTarget */"mr_result",
  /* query */ new BasicDBObject()
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年10月18日火曜日

Twitter APIとJsonSlurperを使用してユーザータイムラインを取得する

Twitter APIとJsonSlurperを使用してユーザータイムラインを取得するには、以下のコードを実行します。
import groovy.json.*

screenname = "theyankeecandle"
url = "http://api.twitter.com/1/statuses/user_timeline/${screenname}.json"
// Twitter APIとJsonSlurperを使用してユーザータイムラインを取得
json = new URL(url).getText("UTF-8")
slurper = new JsonSlurper()
slurper.parseText(json).each {
  println "${it.created_at}:${it.text}"
}

動作環境
groovy 1.8.2, JDK6 Update22

2011年10月16日日曜日

groovyとJson-libを使用して、JSONを出力する

groovyとJson-libを使用して、JSONを出力するには、以下のコードを実行します。
@Grab(group='xom', module='xom', version='1.1')
@Grab(group='net.sf.json-lib', module='json-lib',
  version='2.4', classifier='jdk15')
import net.sf.json.groovy.*

builder = new JsonGroovyBuilder()
println builder.json {
  stores = [
    [store_name:"Shibuya", area:"Tokyo"],
    [store_name:"Ikebukuro", area:"Tokyo"],
    [store_name:"Yokohama", area:"Kanagawa"]
  ]
}

動作環境
groovy 1.8.2, JDK6 Update22, Json-lib 2.4

2011年10月14日金曜日

groovyとJson-libを使用して、XMLをJSONに変換する

groovyとJson-libを使用して、XMLをJSONに変換するには、以下のコードを実行します(※タグ名は失われる)。
@Grab(group='xom', module='xom', version='1.1')
@Grab(group='net.sf.json-lib', module='json-lib',
  version='2.4', classifier='jdk15')
import net.sf.json.xml.*

xml = '''
<offices>
  <office name="Tokyo">
    <country>Japan</country>
  </office>
  <office name="SanFrancisco">
    <country>United States</country>
  </office>
</offices>
'''
xmls = new XMLSerializer()
println xmls.read(xml)

動作環境
groovy 1.8.2, JDK6 Update22, Json-lib 2.4

2011年10月12日水曜日

groovyとjsoupで天気情報を取得する

groovyとjsoupで天気情報を取得するには、以下のコードを実行します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
import org.jsoup.select.*

// 都市名を指定して天気情報を取得
cityname = "Tokyo"
doc = Jsoup.connect("http://www.google.com/ig/api?hl=ja&weather=${cityname}").get()

// 天気を表示
for(elem in Selector.select("current_conditions condition", doc)){
  println(elem.attr("data"))
}
// 温度を表示
for(elem in Selector.select("current_conditions temp_c", doc)){
  println(elem.attr("data"))
}
// 湿度を表示
for(elem in Selector.select("current_conditions humidity", doc)){
  println(elem.attr("data"))
}
// 風向きを表示
for(elem in Selector.select("current_conditions wind_condition", doc)){
  println(elem.attr("data"))
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月10日月曜日

groovyとjsoupでセレクタを使用して要素を取得する

groovyとjsoupでセレクタを使用して要素を取得するには、以下のコードのようにSelector.selectを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
import org.jsoup.select.*
html = """
<html>
  <head><title>test</title></head>
  <body>
    <p id="introduction">sample page.</p>
    <p class="description">説明</p>
  </body>
</html>
"""

// 文字列からdocumentに変換
document = Jsoup.parse(html)
// selectorを使用してIDによって要素を取得
for(elem in Selector.select("p#introduction", document)){
  println(elem.text())
}
// selectorを使用してクラスによって要素を取得
for(elem in Selector.select("p.description", document)){
  println(elem.text())
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月8日土曜日

groovyとjsoupで文字列からdocumentを作成する

groovyとjsoupで文字列からdocumentを作成するには、以下のコードのようにparseメソッドを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
html = """
<html>
  <head><title>test</title></head>
  <body>
    <p>sample page.</p>
  </body>
</html>
"""

// 文字列からdocumentに変換
document = Jsoup.parse(html)
// タグによって要素を取得
for(elem in document.getElementsByTag("p")){
  println("-------------------")
  println(elem.text())
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月6日木曜日

groovyとjsoupでIDによって要素を取得する

groovyとjsoupでIDによって要素を取得するには、以下のコードのようにgetElementByIdを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
// htmlを取得
document = Jsoup.connect("http://groovy.codehaus.org").get()
// IDによって要素を取得してテキスト化
println document.getElementById("welcome").text()

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月5日水曜日

gmongoでMapReduceを使用してグループ毎の平均を求める

gmongoでMapReduceを使用してグループ毎の平均を求めるには、以下のコードのようにmap/reduce関数を使用します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([country:"Japan", store:"store_A", sales:100])
col.insert([country:"Japan", store:"store_B", sales:120])
col.insert([country:"Japan", store:"store_C", sales:170])
col.insert([country:"United States", store:"store_D", sales:80])
col.insert([country:"United States", store:"store_E", sales:200])
col.insert([country:"United States", store:"store_F", sales:190])
col.insert([country:"United States", store:"store_G", sales:100])
// MapReduceで国ごとの売上平均を取得
println col.mapReduce(
  [
    mapreduce:"stores",
    map:"""function(){ emit(this.country,
    {total_sales:this.sales, count:1}); }""",
    reduce:"""function(key, values){
    var total = 0;
    var total_count = 0;
    for(var vi = 0;vi<values.length;vi++){
      total += values[vi].total_sales;
      total_count += values[vi].count;
    }
    return {total_sales: total, count:total_count};
  }""",
    out:"mr_result",
    query:new BasicDBObject(),
    finalize:"""function(key, value){
    return {total_sales:value.total_sales, count:value.count,
      avg:value.total_sales/value.count}
  }"""
  ]
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ