アーカイブ

‘Grails’ タグのついている投稿

リストからFreeMindへ

2009 年 8 月 14 日 コメント 1 件

リストから FreeMind へ変換する用途を思いつかないけど(面倒だからね)、昨日の続きとして、こういう方法もあるよということで紹介したいと思います。

FreeMind の mmファイルは、XML 形式なので Groovy で XML を作成してあげれば良いだけです。
例えば、

1
2
3
4
5
6
7
8
9
10
11
12
13
def sw = new StringWriter()
def mm = new groovy.xml.MarkupBuilder(sw)
mm.map(version:'0.9.0'){
    node(TEXT:"Create FreeMind") {
        node(POSITION:"right",TEXT:"Java")
        node(POSITION:"left",TEXT:"Groovy") {
            node(TEXT:"なんじゃ")
            node(TEXT:"もんじゃ")
        }
    }
}
def f = new File("fm_sample.mm")
f.write(sw.toString())

で、こんな感じになります。

fm_sample

fm_sample

簡単だけど、面白くないですよね。リストから groovy ファイルの中に XML 形式 に手動で置きなおしているのがネックですね。上記プログラムリスト内の MarkupBuilder の代わりに StreamingMarkupBuilder と XSLT1 を使って、ネックになる部分を解消できそうですが。 GIS2 とか何か私にとっての用途が出てきたらまた考えましょう。

  1. XMLによって記述された文書を他のXML文書に変換するための簡易言語 []
  2. 地理情報システム []

Amazon Product Adv. API でもう少し

2009 年 8 月 1 日 コメントはありません

先日、Amazon Product Advertisng API の Java コマンドタイプのサンプルを Grails で動かしてみようと ItemLookup のサービスとコントローラ、ドメイン、ビューを作ったのですが、今朝からもう少し進めて ItemSearch のコントローラ、ビューを作ってみました。ドメインはデータ保存しないので今のところ必要ないかな。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  ItemSearch-Keywords で Book名を入手 とりあえず。
 *
 */
 
package com.yuruyakana
 
import com.amazon.advertising.api.sample.SignedRequestsHelper
import org.codehaus.groovy.grails.commons.*
import net.sf.ehcache.Element
 
class AmazonItemSearchService {
 
    boolean transactional = false
 
    String AWS_ACCESS_KEY_ID
    String ASSOCIATE_TAG
    String AWS_SECRET_KEY
    String ENDPOINT
 
    def getItemSearch(searchIndex, keyword) {
        /* Set up the signed requests helper */
        SignedRequestsHelper helper
 
        try {
            helper = SignedRequestsHelper.getInstance(ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_KEY)
        } catch(Exception e) {
            log.error "Problem communicating with SignedRequestsHelper: ${e.message}", e
            return
        }
 
        String requestUrl = null
        String titles = "_"
        String author = null
        String imageUrl = null
        String price = null
        String totalresults = null
 
        // map形式
        println "Map form example:"
        Map params = new HashMap()
        params.put("Service", "AWSECommerceService")
        params.put("Operation", "ItemSearch")
        params.put("AWSAccessKeyId", AWS_ACCESS_KEY_ID)
        params.put("AssociateTag", ASSOCIATE_TAG)
        params.put("SearchIndex", searchIndex)
        params.put("Keywords", keyword)
        /** こっちの方が良いわな
        def params = ['Service':'AWSECommerceService',
	              'Operation':'ItemSearch',
	              'AWSAccessKeyId':'AWS_ACCESS_KEY_ID',
	              'AssociateTag':'ASSOCIATE_TAG',
	              'ResponseGroup':'Medium']
    */
        requestUrl = helper.sign(params)
 
        // XML構文解析
        def uri = requestUrl.toURI().toString()
 
        def ItemSearchResponse = new XmlSlurper().parse(uri)
 
        println "Total Results: " + ItemSearchResponse.Items.TotalResults
        //println "Total Pages: " + ItemSearchResponse.Items.TotalPages
 
        ItemSearchResponse.Items.Item.ItemAttributes.Title.each{
            // リストをコントローラに渡す方法思いつかなかったのでアンダー
      //  スコアで芋づるにしちゃいました。
            titles = titles + "_" + it
        }
 
        //println "ITEM Author: " + ItemSearchResponse.Items.Item.ItemAttributes.Author
        //println "ITEM Medium Image: " + ItemSearchResponse.Items.Item.MediumImage.URL
        //println "ITEM Price: " + ItemSearchResponse.Items.Item.ItemAttributes.ListPrice.FormattedPrice
 
        totalresults = ItemSearchResponse.Items.TotalResults     
 
        def map = [TotalResults:totalresults, Title:titles]
 
        return map
    }
}
 
/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  keyword で Book名リストを入手 とりあえず。
 *
 */
package com.yuruyakana
 
class AmazonItemSearchController {
 
    //def scaffold = AmazonItemSearch
 
    def AmazonItemSearchService
 
    String searchIndex = "Books"
    String keyword = "IT経営"
 
    def index = {
        redirect(action:"search")
    }
 
    def searchFlow = {
 
        // 検索
        search {
            on("doSearch") {
 
                def amazonBook = amazonItemSearchService.getItemSearch(searchIndex, keyword)
                /**
                 * サービスからの戻り値を配列で渡す方法分からないので、リストをアンダー
                 * </code><code>スコアでつないで</code><code>マップで渡して、ここでまたスプリットにかけています。
                 * Groovy の each メソッドはすごい。
                */
                amazonBook.Title.splitEachLine("_") {titles-&gt;
                    titles.each{
                        //println it
                        //render(view:'search', model:[keyword:keyword, Title:titles])
                    }
                    ["keyword":keyword, "Title":titles]
                }
            }.to "search"
        }
        // 詳細
        displayDetail {
            on("search"){
 
            }.to "search"
        }
    }
}

ビューはこんな感じ。

AmazonItemLookup Sample

AmazonItemLookup Sample

AmazonItemSearch Sample

AmazonItemSearch Sample

さて、次は何をしましょうか?
カートを付けて、plugin とか、GAE 上で実験してみるとか?

Product Advertising API を使わないと

2009 年 7 月 22 日 コメントはありません

先週【重要・あと30日です】メールなんてことで、Amazon アソシエイト Web サービスが 8月15日以降使えないそうなので、先日の[gTunes] も amazon-a2s-2007-10-29-java-library を使っている関係上、署名認証の機能を含めないと動かなくなりますね。動かないと面白くないので、少し連休中に勉強しました。
ここ から Amazon の Java Sample をダウンロードしました。詳細な使い方は、付属の README に書かれていますが、コマンド・プロンプトから ant run で 署名認証して、決め打ちの ITEM_ID(ASIN) の ItemLookup から Title が表示されます。早速 NetBeans 6.7、Grails 1.1.1 でプロジェクト名:AmazonBook を作って、Grails 上でも使えるようにしてみました。( ITEM_ID は本以外にも全ての商品が対象のようだから Book でなくてもいいんだけど)

サンプルには、ソースとして SignedRequestsHelper.java と ItemLookupSample.java が提供されているので、SignedRequestsHelper はそのまま、Javaソースパッケージフォルダーにコピー。ItemLookupSample を AmazonItemLookupService.groovy としてサービスフォルダーに作成。
コードは、下記のような感じ。

/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  ASIN で Book名を入手 とりあえず。
 *
 */
package com.yuruyakana

import com.amazon.advertising.api.sample.SignedRequestsHelper
import org.codehaus.groovy.grails.commons.*
import net.sf.ehcache.Element

class AmazonItemLookupService {

    boolean transactional = false
    String AWS_ACCESS_KEY_ID
    String AWS_SECRET_KEY
    String ENDPOINT
    //def titleAuthCache

    def getItemLook(ITEM_ID) {
        /* Set up the signed requests helper */
       SignedRequestsHelper helper

        try {
            helper = SignedRequestsHelper.getInstance(ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_KEY)
        } catch(Exception e) {
            log.error "Problem communicating with SignedRequestsHelper: ${e.message}", e
            //e.printStackTrace();
            return;
        }

        String requestUrl = null
        String title = null

        // map形式
        println "Map form example:"
        Map params = new HashMap()
        params.put("Service", "AWSECommerceService")
        params.put("Version", "2009-03-31")
        params.put("Operation", "ItemLookup")
        params.put("ItemId", ITEM_ID)
        params.put("ResponseGroup", "Small")

        requestUrl = helper.sign(params)
        println "Signed Request is " + requestUrl

        // XML構文解析
        def uri = requestUrl.toURI().toString()
        //def xml = requestUrl.toURL().text
        println "Response URI: " + uri
        //println "Response XML: " + xml
  // URLだと日本語でEND-Tagで文字化けしてエラーになるので、URIを取得してParseすることでOK。
        def ItemLookupResponse = new XmlSlurper().parse(uri)
        //def ItemLookupResponse = new XmlSlurper().parseText(xml)

        println "ITEM Title: " + ItemLookupResponse.Items.Item.ItemAttributes.Title
        println "ITEM Author: " + ItemLookupResponse.Items.Item.ItemAttributes.Author
    }
}

変更したところは、概ね以下の3点:

  1. AWS_ACCESS_KEY_ID、AWS_SECRET_KEY、ENDPOINT を Config.groovy にbeans として
    移行。ENDPOINT は別に移動しなくても6か所ほど選択できるようなので、DOMAINで選択できるよう
    にしておいても良いですね。
  2. Controller 側で上記 Service のgetItemLook(ITEM_ID) を呼び出したこと。
  3. XML 構文解析を Java の DocumentBuilder から Groovy の XmlSlurper にしたこと。
    • toURL() メソッドは、URL 内で使用できないエスケープ文字は自動的に変換できないので
      非推奨になっています。

今回は、XMLの階層全て書いてタイトル表示しているので、スマートじゃないけど動作確認できたので まっ、いいか。

ITEM_ID で検索するのは実用的じゃないので、ITEMSearch 作って domain と View を今度作れればいいですね。

iTunes の Library をデータベースに

2009 年 7 月 8 日 コメントはありません

先週末、久しぶりに下記の本の AJAX の章を読んでいたのですが、[gTunes] という Grails App のサンプルを使う上で自分の iTunes の Music Library(xmlファイル)をサンプルアプリに読み込むためのGroovyスクリプトが、ソースコードとして提供されています。
The Definitive Guide to Grails (Expert's Voice in Web Development)

そのままじゃ動かなかったので、同じような経験された方がいるかどうか分かりませんが、少し変更したらきちんと、MySQLデータベースに artist 名が登録されました。
変更した箇所は、

def artists = handler.artists.values().findAll { it.albums?.artist } を

def artists = handler.artists.values() に。

else if(songProps && qName == ‘dict’) { を

else if(songProps && qName == ‘/dict’) { に。

Album クラスはmap で値をきちんと取れているのですが、データベース登録はエラーになるのはどうしてでしょうかね。
時間ができたらまたチャレンジしてみます。

NetBeans で Grails コマンドが使えるので便利ですよ。

appengine-java で遊ぼ!

2009 年 6 月 1 日 コメントはありません

このブログは、ゆるやかなウェブ (Movable Type 版)からの非継続バージョンとして WordPress 版で始めようと思って、自宅サーバでテスト中ですが、もう一つ Google Apps を使った[隠れ]ゆるやかなウェブサイトがあり、そこで連休明けから Google App Engine のサンプルを使って遊んでいました。GWT も使えば、シュワッウォーンてな感じです。

Eclipse で立派なプラグインも用意されているので 楽ちんなのですが、NetBeans の方はKENAIで少し具体的になってきたようです。4日ほど前にインストールの方法がアップされていました。Grails はEclipse より NetBeans で作るのがちょー楽ちんなので、NB のモジュールサポートに超期待。(他人の褌ばっかりでごめんなさい)
今のところ、NB6.7Beta ではなくてNB の開発版で動作確認できます。
下記の5つのモジュールをインストールします。

  1. GAE Server
  2. GAE Configuration Editor
  3. GAE Deployment
  4. GAE Editor Hints
  5. GAE Samples (今時点で GuestBook だけ、JDKのSAmple 取り込めば良いのか)

Sample でProject に取り込んで、サーバにGoogle App Engine を登録して、構築して実行。
構築は成功。localhost でこけた。ポート利用されてるていうメッセージ。Apache も Jettyも動かしていないのになんで?Deployment は、マウス右メニュークリックでOK。Eclipseみたいにアイコンまだないけど。GAE上には10個までID登録できるけど、あんまりサンプルばっかしアップするのも気が引けるし。今日はここまで。

[閑話]
GAE/Java 上でPHP(Quercus) を使って早速 WordPress 2.7.1 を 動かしていますね。デモはOKでした。星5つ付いていて結構面白がる人がいるみたい。カスタマイズが楽しい人向きかも。
Pebble をアップしてる様子はまだないようだけど、こちらの方が扱いよさそうだし、GAE上でBlog を動かしたいと思うほど、まだ面倒になっているわけでもなし。