2009年6月30日火曜日

GAE/JのJPA

GAE/JでBigTableをJPAで利用してみた。

① META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>

</persistence>


② EMF
package com.babukuma.gae.test.jpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EMF {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional");

private EMF() {
}

public static EntityManagerFactory get() {
return emfInstance;
}
}

③ エンティティ

package com.babukuma.gae.test.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import com.google.appengine.api.users.User;

@Entity
public class SimpleBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;

@Column
private User author;

@Column
private String content;

@Column(nullable = false)
private Date date;

public SimpleBoard(User author, String content, Date date) {
this.author = author;
this.content = content;
this.date = date;
}

public Long getId() {
return id;
}

public User getAuthor() {
return author;
}

public String getContent() {
return content;
}

public Date getDate() {
return date;
}

public void setAuthor(User author) {
this.author = author;
}

public void setContent(String content) {
this.content = content;
}

public void setDate(Date date) {
this.date = date;
}
}

④ テストコード

package com.babukuma.gae.test;

import java.io.IOException;
import java.util.Date;

import javax.persistence.EntityManager;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.babukuma.gae.test.entity.SimpleBoard;
import com.babukuma.gae.test.jpa.EMF;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

@SuppressWarnings("serial")
public class DataStoreTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

String content = req.getParameter("content");

System.out.println("content=" + content);
Date date = new Date();
SimpleBoard board = new SimpleBoard(user, content, date);

EntityManager manager = EMF.get().createEntityManager();
try {
System.out.println("before insert");
manager.persist(board);
System.out.println("after insert");
} catch (Exception e) {
e.printStackTrace();
} finally {
manager.close();
}

resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}


これ以外に簡単にできるんだな。。(^(エ)^)

2009年6月24日水曜日

Cache削除方法

いつも忘れてしまう、Cacheの削除方法

JSPとかServletの場合。

response.setDateHeader("Expires", -1);
response.setHeader("pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");


Htmlの場合。

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Jan 2000 00:00:00 GMT">


忘れないように (^(エ)^)

2009年6月17日水曜日

2009年6月16日火曜日

GSONを使ってみる。

GSON JavaオブジェクトとJSONの変換ライブラリ



① Mavenリポジトリの設定

    <!-- リポジトリ -->

    <repositories>

        <!-- GSONのリポジトリ追加 -->

        <repository>

            <id>gson</id>

            <url>http://google-gson.googlecode.com/svn/mavenrepo</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

            <releases>

                <enabled>true</enabled>

            </releases>

        </repository>

    </repositories>

    

    <dependencies>

        <!-- Gson: Java to Json conversion -->

        <dependency>

            <groupId>com.google.code.gson</groupId>

            <artifactId>gson</artifactId>

            <version>1.3</version>

            <scope>compile</scope>

        </dependency>

    </dependencies>

    



② 使い方

== Bean.java ==

public class Bean {



    private String a;

    private Integer b;

    private BBB[] bbbs;



    public BBB[] getBbbs() {

        return bbbs;

    }



    public void setBbbs(BBB[] bbbs) {

        this.bbbs = bbbs;

    }



    public String getA() {

        return a;

    }



    public void setA(String a) {

        this.a = a;

    }



    public Integer getB() {

        return b;

    }



    public void setB(Integer b) {

        this.b = b;

    }

}





== BBB.java ==

public class BBB {



    private String c;

    private String d;



    public String getC() {

        return c;

    }



    public void setC(String c) {

        this.c = c;

    }



    public String getD() {

        return d;

    }



    public void setD(String d) {

        this.d = d;

    }

}





== GsonTest.java ==

import com.google.gson.Gson;



import junit.framework.TestCase;



public class GsonTest extends TestCase {



    protected void setUp() throws Exception {

        super.setUp();

    }



    protected void tearDown() throws Exception {

        super.tearDown();

    }



    public void testGson() throws Exception {

        Bean bean = new Bean();

        bean.setA("aa");

        bean.setB(9);



        BBB b1 = new BBB();

        b1.setC("333");

        b1.setD("3d3d");



        BBB b2 = new BBB();

        b2.setC("444");

        b2.setD("4d4d");



        BBB[] bbbs = { b1, b2 };



        bean.setBbbs(bbbs);



        Gson gson = new Gson();

        String json = gson.toJson(bean);

        assertNotNull(json);

        // System.out.println(json);



        Bean bean2 = gson.fromJson(json, Bean.class);



        assertNotNull(bean2);

        assertEquals(bean.getA(), bean2.getA());

        assertEquals(bean.getB(), bean2.getB());

        assertNotNull(bean2.getBbbs());

        assertEquals(bean.getBbbs().length, bean2.getBbbs().length);



        for (int i = 0; i < bean2.getBbbs().length; i++) {

            assertEquals(bean.getBbbs()[i].getC(), bean2.getBbbs()[i].getC());

            assertEquals(bean.getBbbs()[i].getD(), bean2.getBbbs()[i].getD());

        }

    }

}





楽だね(^(エ)^)

2009年6月15日月曜日

UbuntuでChromeをデフォルトブラウザにする。

コマンドで
> gconf-editor
して設定エディタを開く

/desktop/gnome/url-handlers/httpとhttpsの
「command」の値を
google-chrome %s
にする。

Linux版Chromeが使えるようになった


Linux版Chromeが使えるようになった。
何故か今日Ubuntuのシステムアップグレードしてから疲れる気がする。
勝手にバージョンアップされたかな?

でも。。。なぜかHtmlのテキストボックス(input, textarea)では日本語が書けない。。

(・(エ)・;)

2009年6月8日月曜日

Linux版 Chrome

(-(エ)-)これが最初のステップだ



(-(エ)-)

2009年6月7日日曜日

マテリアライズド・ビュー

(・(工)・)
Oraclenのマテリアライズド・ビューは確かに実体を持つビューの為、高速参照ができるけど。
対象のテーブルが更新するときコミットのタイミングが遅くなる気がする。

集計テーブルを使用する場合考えるのはなにがあるんだろう。。

1。バッチは?
バッチで物理的な集計テーブルを作れば、参照は一番早いと思うけど、
リアルタイム性がないのが短所がある。

2。トリガー
トリガーも物理的な集計テーブルが作れるから、参照は早いけど、
DBの負荷が高くなる。

3。マテリアライズド・ビュー
確かにマテリアライズドビューは結合した結果よりは早い。
物理的な集計テーブルよりはちょっと遅いけど、
参照するときの速度と負荷は大したものではなさそう。
まあ。。使えるね。。

4。アプリのトリガー
DBのトリガーみたいなものをアプリ側で用意するのは?
コントロールが難しいとは思うけど、
コントロールができるとしたらこっちのほうが現実的には良いのでは?(´`;) ?

もっとテストしてみよう。(・(工)・)