Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

今更ながらJPAの楽観ロックを確認してみました

色んなところで既に書かれてるので、今日のは完全に自分向けのメモ(^^;

JPAの楽観ロック、知識としては知っていたのですが試したことなくて、ちょうどやる必要が出たので、まずは簡単なサンプルで確認してみました。

プログラムは営業系のシステムをイメージして、商談データがあって、2人の人が同じデータを取得して変更して更新してしまった、という流れです。

環境

環境はWindows 7上のNetBeans 7.3でJava EE 6 & JDK7、GlassFish3.1.2でEclipseLink2.3.2です。データベースはMicrosoft SQL Server 2008 R2。

テーブルは超簡易で以下のようなものです。

商談ID 商談名 Version 作成日 更新日
0 商談1だよ 0 2013-10-10 19:51:55.793 2013-10-10 19:51:56.060

Versionカラムは楽観ロック用に設けたものです。

動作

まず結果から。

サンプルアプリをデプロイして、ブラウザを2つ起動してアクセスします。

f:id:kikutaro777:20131010204737j:plain

f:id:kikutaro777:20131010204743j:plain

1つ目のテキストにDBにある商談ID「0」を指定して「読込」ボタンを押します。
DBから読み込んで商談名が表示されます。

f:id:kikutaro777:20131010204836j:plain

f:id:kikutaro777:20131010204840j:plain

IEのブラウザは「商談2なんです」と名称を書き換えます。
もう1つのFirefoxでは「商談3なんだよ!」と名称を書き換えます。

f:id:kikutaro777:20131010205017j:plain

f:id:kikutaro777:20131010205021j:plain

で、各々で「保存」ボタンを押下!

NetBeansではブレイクポイントで複数のスレッドが止まると以下のような歯車マークになります。
f:id:kikutaro777:20131010205241j:plain

NetBeansのマルチスレッドデバッグは過去に書いてました。
NetBeansでマルチスレッドデバッグ

oppFacade.edit(myOpp)という所でEJB側でDB保存処理されます。
成功したのでDBを確認します。

f:id:kikutaro777:20131010205402j:plain

保存されてますね。そしてVersionカラムの値が「1」とカウントアップされてます(^^)
ここに関しては後程。

ではもう1つのFirefoxから来たほうのスレッドに切り替えて

f:id:kikutaro777:20131010205504j:plain

保存処理を実行してみます。

f:id:kikutaro777:20131010205511j:plain

するとエラーに!

GlassFishをみると

f:id:kikutaro777:20131010205626j:plain

OptimisticLockExceptionとなっています(^^)取得した時点でVersionが0で、書き込もうとしたらVersionが既に1となっていたため、「誰かが書き込んだやろ」と判定した流れかと。

EJB使うとBean側ではjavax.ejb.EJBExceptionに成り代わってしまうのが悲しいですが、EJB側でちゃんとcatchすればいける…のかな多分(^^;未確認

@Versionアノテーション

やったことは単純で、2つだけです。

  • テーブルのカラムにintの「Version」を設ける
  • Entityの上記カラムに該当する項目に@Versionのアノテーションを付与する
@Column(name = "Version")
@Version
private int version;

だけです。すんなり思い通りに動いたので良かった(^^)

ちなみにEclipseLinkの楽観ロックに関する記述は以下でした。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Locking#Optimistic_Locking
最後の1文に「java.sql.Timestamp型も使えるけど、numeric typeをおススメします」と書いてあるのが気になる(^^;

Challenge JavaOne 2013 レポート - Fifteen Years of the NetBeans IDE -

JavaOne 2013ではNetBeansコミュニティのセッションに結構参加しました。
そのうちの1つをまとめます。

Fifteen Years of the NetBeans IDE

なんとあのJames Goslingさんがいらっしゃっており、NetBeansと関係あるの!?と思いつつ興奮してました(^^;
日頃NetBeansを使われてるそうです!

NetBeans Community Day

今年で15年となるNetBeansの歴史について振り返りがありました。

  • 31のリリース
  • 3600万以上のダウンロード
  • 1000人以上のNetCat参加者 ※NetCatについては後ほど
  • 130万人のアクティブユーザ

その後、NetBeans X2、3.5、4、6の画面が並べられていました。
私はNetBeans7.2から触り始めたので、「昔はこんなだったのかー」という感じ(^^;

15 Years of Addressing the Community Needs

NetBeansユーザの満足度に関するまとめについて。

直近3回の調査、約2000人からの情報とのこと。

利用者のうち約86%がプロの開発者(このセッションではわからなかったのですが他のNetBeansセッションで残りは学生と判明)

約82%のNetBeansユーザがNetBeansを一番よく使う(primary)なIDEとしている

とのこと。またNetBeansのおススメ度みたいな率(Recommendation Index)は

バージョン パーセンテージ
7.0 89.3%
7.1 90.8%
7.2 93.7%
7.3 94.4%

とバージョンアップに伴い上がっているとのこと。

NetBeans 7.4

将来のロードマップは別のセッションで聞いたのですが、ここでは7.4限定でした。

7.4では

  • モバイルWebとハイブリッドな開発

Java EE7によるHTML5対応以外にスマートフォンやタブレットブラウザへ対応(Tight integrationと表現。厳しい統合作業的な??)

  • JDK8 Preview

ラムダやProfiles(と書いてあったのですがイマイチわからず…)へのフル対応

を目指すとのこと。JDK8に関してはフィードバックを待ってます、とのこと。

Special Guest : James Gosling

ここでゴスリンさんによるトークが入りました。
ゆったりとした英語なのですが、結構聞き取れなかった…です…。

紹介の中で「mentor」と表現がありました(^^;良き師、みたいな感じですかね。
http://eow.alc.co.jp/search?q=mentor

NetBeansが好きで日頃使っていること
(しかも、10 hours a dayって聞こえました)

Eclipseとの関係

Microsoftの名前も挙がってました

…があまり聞き取れず orz 悲しい

NetCAT Community Program

恥ずかしながらNetCAT知らなかったです(^^;
http://wiki.netbeans.org/NetCAT

最初に紹介があって

  • ベータ版のテストプログラム
  • 3~5カ月の期間
  • テスト、チュートリアルのレビュー、TS updates(これよくわからず)
  • 本当のユーザ、本当のプロジェクト(でテストされるということかなと)
  • 素早いフィードバック

を挙げられていました。

その次にNetCATの歴史について触れられ

  • 2004年から開始
  • 期限までに1000人ほどの参加者がいる
  • とても一般的(very popular)
  • 安定化にむけた大切な役割を持つ

とのこと

他にはNetCAT7.3におけるバグの統計結果やコントリビュータの紹介がありました。

NetBeans Dream Team

NetBeansにはDream Teamと呼ばれるチームがあるそうです(^^;
Tシャツ着てる方なども会場にいましたw

http://wiki.netbeans.org/NetBeansDreamTeam

2007年設立で、高いスキルのユーザやコントリビュータのグループとのこと。

ミッションはNetBeansをもっと広めるような活動とのこと。

Javaの世界で良く知られた著名人の方を数名挙げられていました。

NetBeans Community Awards

NetBeansへの貢献が大きい方への賞が与えられていました。
2名でした。

  • John Yearyさん
  • Benno Markiewiczさん

全社の方は主にNetBeansを広める活動で貢献、となっており、フォーラムやブログ、Twitterを通じた活動とのこと。
後者の方はバグレポートやパッチ提供を数々されているようです。

NetBeans、歴史とかあまり知らずに使っていたので、面白かったです(^^)

Challenge JavaOne 2013 レポート - 10 Tips for Java EE 7 with PrimeFaces -

感想は別途まとめるとして、自分が参加したセッションのJavaOneレポートを書きたいと思います(^^)
ブログタイトルにちなんでChallenge JavaOne 2013 レポート

1日1つずつぐらいのペースになってしまうかも…ですが。

10 Tips for Java EE 7 with PrimeFaces

個人的にかなり楽しみにしていたセッションです。
NetBeansディベロッパーであるMartin Fousekさんと以下のPrimeFaces書籍を共著されたMerk Caliskanさんのセッション。

話の内容としては主にJava EE 7とJSF2.2における新機能をPrimeFacesベースに作成されたデモで10個紹介するものでした。

PrimeFaces

冒頭にPrimeFacesの紹介。

JSF2.2のサポートはPrimeFaces4.x系からとのことです。
(ちなみに私は現在Java EE6でJSF2.1、PrimeFaces3.5で開発しています)

PrimeFacesの紹介としては

  • JSF2.x向けのオープンソースコンポーネントライブラリ
  • とても軽量で、コンフィグレーションがない
  • Showcaseに豊富なサンプル、多くのテーマ、モバイルコンポーネントもある
  • 良いドキュメント、ユーザガイド、書籍がある
  • 大きくて活動的なコミュニティ

を挙げていました。

NetBeans IDE

続いてNetBeansに関する紹介。

特徴として

を挙げ、最新の機能としては

Cordovaって知らなかったのですが、これですかね(^^;
http://cordova.apache.org

VCSはVersion Control Systemの略でSubversionやGitを指すようです。

HTML(5) Friendly Markup

まずはpassthroughに関しての簡単な説明がありました。

しんさんとかが解説してるのと同じです。
JavaEE 7 HTML5に対応したJSF 2.2

Resource Libraries Contracts

マルチテンプレート機能の説明。自分でも前に試しました。

Java EE 7のJSF2.2で「Resource Library Contracts」チュートリアルをやってみました

複数のテンプレートが使えるだけがメリットではなく、jarとして固めて利用することもできるとのこと。

Expression Language 3.0

EL3.0に関してはそれ単体でのセッションもあったので、そちらで詳しく書こうかと思います。
自分も前に試していたのでだいたい把握できた内容でした。
Expression Language 3.0で遊んでみる

Prime Time with PrimeFaces Components

改めてPrimeFacesの紹介で

そしてPrimeFaces Version 4.0の新機能として

などなど、たくさんあるとのこと

ダイアログは何かとめんどくさかったので、早く触ってみたいところです。

In the Jungle of PrimeFaces Themes

PrimeFacesのテーマはjQueryUIのThemeRollerベースにしたスキンを使ってて、自分でも作れます。
既存のテーマとしては40近くあり、1つ1つがJARになっており、使いたいものだけ依存性書けば使えます。

拡張テーマとして以下2つが増えたとのこと

Metroは聞いてましたが、Twitter Bootstrapのは知らなかった(^^;

使うテーマの設定はweb.xmlにcontext-paramで指定するだけですよ。と説明が。

PrimePush,PrimeUI,PrimeMobile

これら3つについて簡単に紹介がありました。

PrimePush

AtmosphereフレームワークによってWebSocketsやポーリング、ストリーミング、jsonpなどが使えるとのこと。
実はこれ使ったことない(^^;

PrimeUI

PrimeFaces自体はJSFのためのコンポーネントですが、ここからスピンオフしてjavascriptウィジェットとして使えるのがPrimeUI

コンポーネント数はJSFのに比べると少なく35個くらいらしいです。

PrimeMobile

モバイルデバイス向けのコンポーネント。これもjQueryのMobileベース。
前に自分も触ってみたものです。
PrimeFaces Mobileで始める初めてのモバイル画面

JSF scaffolding with PrimeFaces

scaffoldingというのは「足場」といった意味なんですね…(^^;知らなかった。
http://eow.alc.co.jp/search?q=scaffolding&ref=sa

ここではデータベースのCRUDを行うスケルトンページを自動生成すること等に関して紹介がありました。
NetBeansから普通に作る方法とPrimeFaces CRUD Generatorでデモしてました。

PrimeFaces CRUD Generatorは自分も前に使ったことがありました(^^;
NetBeans7.2.1とPrimeFacesであっという間にCRUD画面を作成する方法

Faces Flows

JSF2.2で新しく追加された@FlowScopedの話
Faces-configの設定ファイル、または(なのかな…多分)FlowBuilder(@FlowDefinition)で定義できる。

FacesFlowsは実はまだ触ってないので、今度やってみます

Annotation based component registration

@FacesComponentというアノテーションを使うことでコンポーネントの定義が可能。

ってかこれも、しんさんが既に書いてる(^^;

JavaEE 7 JSF 2.2の超簡単カスタムコンポーネント

File Upload

JSF2.1まではファイルをアップロードする機能が標準ではなかったのですが(^^;2.2で入ったよという話。

Denさんが書いてますね。
JSF 2.2 で待ちに待ったFileUploadを試す

その他

このセッションでデモされた全てがGitHubにあるとのこと!
https://github.com/marfous/j1demo-pf

あとセッション終わった後に自分がPrimeFacesで作ったシステムを簡単に見せながらMerkさんと話しました(^^)最後ツーショット撮りましたw

Expression Language 3.0で遊んでみる

昨日、Oracleで行われた「今から始めるJava EE 7解説セミナー」に参加してきました。
そこで@den2snさんからJSF2.2とCDI1.1、EL3.0に関する話がありました。

ご自身ブログで感想を書かれていました~。

今から始めるJava EE 7解説セミナーでJSFの話ししてきた
http://den2sn.hatenablog.com/entry/2013/08/23/013632

セミナーの中で、EL3.0は独立した言語のような感じになってきている、と話されていて、確かに…(^^;と

ELで処理ロジックが書けてしまうと、JSFのビューにロジックが入り込んで…ねぇ、と。
が、知識として知っておいて損はないのと、場面を見極めて使い分ければそれなりに強力なのかな?とも思ったりします。

というわけで、NetBeans7.3.1を使って昨日のセミナーでキーワードとして紹介があったものを実際にコードで遊んでみました。文言は@den2snさんの発表資料そのままなんですが…資料の公開に期待(^^;

ひな形は以下の形で、outputLabel置いて遊んでみます。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>ELで遊んでみる</title>
    </h:head>
    <h:body>
        <!-- ここで遊ぶよ -->
    </h:body>
</html>
アサインメントオペレータ

「=」で値の代入ができる

<h:outputLabel value="#{x = 10}" />

f:id:kikutaro777:20130823190807j:plain

セミコロンオペレータ

「;」で複数処理の記述ができる

<h:outputLabel value="#{x = 10; y = 10; x + y}" />

f:id:kikutaro777:20130823191309j:plain

文字列連結オペレータ

「+=」で文字連結ができる

<h:outputLabel value="#{x='xxx'; y='yyy'; x+=y}" />

f:id:kikutaro777:20130823191659j:plain

上記の例ではバッキングビーン(管理対象Bean)を定義せずに書いてますが、実際に使うシチュエーションの多くはバッキングビーンで定義してバインドされた値を使っての記述となると思います。

この辺りは絶対便利ですね!

スタティックフィールド・メソッド参照

f:id:kikutaro777:20130823200649j:plain

NetBeans7.3で確認したら(やっぱり)見えなかったですw

コレクションオペレーション
<h:outputLabel value="#{[1,2,3,4,5,6].stream()
                                .filter(i->i%2 == 0)
                                .map(i->i*10)
                                .toList()}" />

この辺から気持ち悪いくなってくる…のかな(^^;

f:id:kikutaro777:20130823201046j:plain

ちなみにNetBeans7.3.1、ちゃんとコード補完もしてくれたwさすが

f:id:kikutaro777:20130823200901j:plain

Lambda式
<h:outputLabel value="#{fact = n->n==0 ? 1 : n * fact(n-1); fact(5)}" />

f:id:kikutaro777:20130823201232j:plain

Java 8じゃないですが普通に(^^;

Enum参照

自前でEnum作ったけど思うよう動か…なかった。。。何か記述ミスしたかなぁ。

Integrating PrimeFaces Terminal sample with Twitter4J.

I'm glad Mr.Cagatay Civici who is lead of PrimeFaces picked up my blog entry yesterday.

But it's just only Japanese. So, I try to rewrite the entry in English.

What is Terminal of PrimeFaces ?

Terminal component is similar to Unix/Linux terminal.
Here is showcase link of Terminal component.
http://www.primefaces.org/showcase/ui/terminal.jsf

You can input two command in the PrimeFaces showcase sample.

  • greet
  • date

If you input 'greet' command, then terminal responses 'Hello Stranger'.
If you add your name after greet command, for example 'greet kikutaro', then terminal responses 'Hello kikutaro'.
Finally, you input 'date' command, then it returns now date.

f:id:kikutaro777:20130805230220j:plain

Make Twitter4sh

I thought what is good usage of PrimeFaces terminal.
Finally I tried to make collaboration between PF terminal and Twitter4j.

Twitter4j is great library for tweet by using Java.
Here is a English site link of Twitter4j.
http://twitter4j.org/en/index.html

I named this collaboration sample 'Twitter4sh' :)

My code is very simple, if you are interested in this, please enhance!

Twitter4sh has only two command.

  • user : command for user information
  • tweet : command for tweet

That's all.

User command has '-i' option and target.

  • user -i name : show Twitter account name
  • user -i follow : show total count of follow
  • user -i follower : show total count of follower

Environment

I made on this environment.

OS :Windows 7 Professional
Java version :JDK 7
IDE :NetBeans 7.3
Framework :Java EE 6
Application Server :GlassFish 3.1.2
Library:Twitter4j,PrimeFaces 3.5

Result

I inputed each command.
f:id:kikutaro777:20130806201417j:plain

Check my tweet.

Success!

Code

Creating view is very easy.
Only set terminal component of PrimeFaces.

I set 'prompt' attribute, it means head of prompt message in each line.
Also set 'welcomeMessage' attribute, it's first message of showing the page.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:terminal commandHandler="#{terminalBean.handleCommand}" 
                        prompt="Twitter4sh"
                        welcomeMessage="Welcome to Twitter4sh!"/>
        </h:form>
    </h:body>
</html>

JSF Managed Bean is here.

package com.mycompany.primefacesterminal;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;

@ManagedBean
@ViewScoped
public class TerminalBean implements Serializable{
    private Twitter twitter;
    
    @PostConstruct
    public void init(){
        twitter = new TwitterFactory().getInstance();
    }

    public String handleCommand(String command, String[] params) {
        try {
            if(command == null){
                return "Please input twitter4sh command";
            }else switch(command){
                case "user":
                    User user = twitter.verifyCredentials();
                    
                    if(params.length == 2){
                        if(params[0].equals("-i")){
                            switch(params[1]){
                                case "name":
                                    return user.getName();
                                case "follow":
                                    return Integer.toString(user.getFriendsCount());
                                case "follower":
                                    return Integer.toString(user.getFollowersCount());
                            }
                        }else{
                            return "You only use -i option.";
                        }
                    }else{
                        return "Usage:user -i name/follow/follower";
                    }
                    
                case "tweet":
                    if(params.length > 0){
                        String myTweet = "";
                        for(int i = 0; i < params.length; i++){
                            myTweet = (i==0) ? myTweet + params[i] : myTweet + " " + params[i];
                        }
                        twitter.updateStatus(myTweet);
                        return "Your tweet'" + myTweet + "'" + "is success.";
                    }else{
                        return "Usage:tweet 'message'.";
                    }
                default:      
                    return "There are only two command user or tweet.";
            }
        } catch (TwitterException ex) {
            return "Error" + ex.getErrorMessage();
        }
    }
}

This is useful for tweeting by command line!
I can make this code in 10 minutes, thanks to PrimeFaces and Twitter4j :)

PrimeFacesのTerminalとTwitter4jをコラボしてみる

August 6 2013 EDIT
I rewrite this entry in English.

Integrating PrimeFaces Terminal sample with Twitter4j.
http://kikutaro777.hatenablog.com/entry/2013/08/06/202431

仕事でしばらくC#(しかも2.0のまま…VS2005…VSS…ぬぅ…)に戻るのでネタがないです(-_-;

そんなわけで、昨日TwitterでPrimeFacesのTerminalを利用されている方がいらっしゃったので、自分も使ってみたくなって遊んでみました(^^;

Terminalコンポとは?

TerminalはいわゆるUnixLinuxのターミナルを模したWebコンポです。
以下ショーケースで動くものがあります。
http://www.primefaces.org/showcase/ui/terminal.jsf

上記のショーケースでは、コードをみるとわかりますが以下のコマンドを打てます。

  • greet
  • date

greetは引数もとれて名前を入れると挨拶してくれます。以下試した画像。

f:id:kikutaro777:20130805230220j:plain

Twitter4shを作ってみる

普通にコマンド作ってもなぁ…と思って、少し前に遊んでいたTwitter4jを思い出し、Terminalとコラボしてみました(^^;

名付けてTwitter4sh

なんちゃって…完全に遊びレベルです。すみません。

コマンドは

  • user :ユーザ情報に関するコマンド
  • tweet:ツイートするコマンド

の2つ

userコマンドは「-i」で詳細情報を指定できて

  • user -i name  :ユーザ名を表示
  • user -i follow :フォロー数を表示
  • user -i follower:フォロワー数を表示

みたいな(^^;テキトーです。

実行結果

起動すると

f:id:kikutaro777:20130805230607j:plain

それぞれコマンド打つと

f:id:kikutaro777:20130805230742j:plain

で、Twitterみると

それっぽく動く(^^)/

コード

すごくしょぼいです。JSFのビューは以下だけ。Terminal置いただけですね;

promptが各行の先頭にでるプロンプトのしるしです。
welcomeMessageは起動時に表示される文言ですね。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:terminal commandHandler="#{terminalBean.handleCommand}" 
                        prompt="Twitter4sh"
                        welcomeMessage="Welcome to Twitter4sh!"/>
        </h:form>
    </h:body>
</html>

JSF管理対象は以下。ここはCDI管理対象で作るほうが今やベターですが手抜きしました;

package com.mycompany.primefacesterminal;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;

@ManagedBean
@ViewScoped
public class TerminalBean implements Serializable{
    
    private Twitter twitter;
    
    @PostConstruct
    public void init(){
        twitter = new TwitterFactory().getInstance();
    }

    public String handleCommand(String command, String[] params) {
        try {
            if(command == null){
                return "コマンド入力してください";
            }else switch(command){
                case "user":
                    User user = twitter.verifyCredentials();
                    
                    if(params.length == 2){
                        if(params[0].equals("-i")){
                            switch(params[1]){
                                case "name":
                                    return user.getName();
                                case "follow":
                                    return Integer.toString(user.getFriendsCount());
                                case "follower":
                                    return Integer.toString(user.getFollowersCount());
                            }
                        }else{
                            return "詳細情報は「-i」で指定してください";
                        }
                    }else{
                        return "使い方:user -i name/follow/follower";
                    }
                    
                case "tweet":
                    if(params.length == 1){
                        twitter.updateStatus(params[0]);
                        return "「" + params[0] + "」" + "とツイートしました。";
                    }else{
                        return "使い方:tweet ツイート文言";
                    }
                default:      
                    return "userコマンドまたはtweetコマンドを入力してください";
            }
        } catch (TwitterException ex) {
            return "エラーです" + ex.getErrorMessage();
        }
    }
}

多分もっとシンプルで綺麗にかけると思いますが…(^^;

こんなサンプルが10分くらいで作れました。そう、Java EEJSFならね!

とか言ってみたり。

Java EE 7のJSF2.2で「Resource Library Contracts」チュートリアルをやってみました

JSF2.2で「Big Ticket」と呼ばれる機能には以下の4つがあります。
(JSF2.2のJSRより)

  • HTML 5 Friendly Markup
  • Resource Library Contracts
  • Faces Flows
  • Stateless Views

2つ目の「Resource Library Contracts」に関して8/2にUS Oracleからチュートリアルが
出たようなのでやってみました。元々は「Multi-Templating」とわかりやすくカッコいい
名前だったものですが、どういう経緯で変わったかはよくわかってないです(^^;

チュートリアルのリンク
Oracle Learning Library : Java EE 7: Applying JSF 2.2 Resource Library Contracts

アクセスすると以下のようなページが表示されるので「Begin Tutorial」を押します。

f:id:kikutaro777:20130803192521j:plain

以下のページが表示され、各ステップがバルーン式になっているので、上からやっていきます。

f:id:kikutaro777:20130803192600j:plain

細かく確認したい方は是非直接チュートリアルベースに進めてください(^^;
ここでは抜粋というか、自分がやったメモ書きレベルで、翻訳をするわけではありませんm(_ _)m

追記:投稿してから「今日書いた量多いな…」と思ったのですが、手順を細かく書いただけで、やってることは単純です。JSFにおいて複数のテンプレートとCSSを用意して、それを動的にスイッチできるようにしてるだけです(^^)使うの面倒くさそうと思われませんように…

続きを読む

NetBeansで始める初めてのOpenFaces 〜Maven編〜

JSFのリッチコンポーネント「OpenFaces」を触ってみました。
http://www.openfaces.org/

2013/8/4追記
後で調べたのですがOpenFacesは現時点では開発はあまり活発ではないようです。
安定してる、のかもしれませんが。後で調べたことは以下にまとめました。
Google TrendsでPrimeFacesが急上昇してる(^^;

少し古いですが、日本語記事もチラホラ

例によってスタートアップレベルで書いてみます。
過去書いた他のリッチコンポの記事は最後にリンク置いときます(^^;

環境はNetBeans7.3でJava EE6ベースです。
7にするか迷ったのですが…すみません。

1.NetBeansを起動し、ファイルメニューの新規プロジェクトを選択します

f:id:kikutaro777:20130802214037j:plain

2.カテゴリ「Maven」、プロジェクト「Webアプリケーション」を選択します

f:id:kikutaro777:20130802214048j:plain

3.プロジェクト名を入力します(この例ではOpenFacesMavenSampleとしました)

f:id:kikutaro777:20130802214143j:plain

4.GlassFishのバージョンなど確認して「終了」します

f:id:kikutaro777:20130802214202j:plain

5.プロジェクトが生成され、以下のようになります

今回の例ではJSFでサンプルを作る流れとしますので、index.jspを削除します。
f:id:kikutaro777:20130802214214j:plain

6.index.jspを削除後、Webページで右クリックして「新規」から「JSFページ」を選びます

JSFページ」が見当たらない場合は、「その他」からカテゴリ「Web」で「JSFページ」を選びます
f:id:kikutaro777:20130802214225j:plain

7.ファイル名を「index」とします

f:id:kikutaro777:20130802214246j:plain

8.index.xhtmlが追加されたのを確認し、今度は「プロジェクト・ファイル」から「pom.xml」を開きます

f:id:kikutaro777:20130802214257j:plain

9.OpenFacesのレポジトリを設定します

f:id:kikutaro777:20130802214302j:plain

10.続けてタグ内に新しく以下のタグを追加します

f:id:kikutaro777:20130802214343j:plain

PrimeFacesやRichFacesと違って依存性が多いのが残念ですね(^^;
全て揃わないと実行できませんでした。

11.ここで一旦ビルドすると、指定したバージョンのOpenFacesモジュールをダウンロードしてくれます

依存性を確認して、openfaces-3.0.jarやその他ライブラリが追加されていればOKです。
f:id:kikutaro777:20130802214515j:plain

12.「index.xhtml」のコードを表示し、bodyタグの中で以下のように打ちます

f:id:kikutaro777:20130802214519j:plain

13.Ctrl+Spaceを押すとPrimeFacesの様々なコンポーネントのタグが確認できます。

OpenFacesは「oo」が標準なのか(^^;
なぜ「o」じゃないんだろw
とはいえ、自分で宣言部を変えれば「o」でもいけますが。
f:id:kikutaro777:20130802214524j:plain

14.例えば以下のようにテキストボックスとボタンを配置してみます

f:id:kikutaro777:20130802214528j:plain

15.実行すると…全然リッチ感がわかない(>_<;

f:id:kikutaro777:20130802214605j:plain

16.Calendar追加
<oo:calendar />

だけ追加して再度実行。

f:id:kikutaro777:20130802215422j:plain

こんな感じ…(^^;

でもショーケースみるとコンポーネント種類はわりと豊富そうです。
http://www.openfaces.org/demo/overview/homepage.jsf

もう少し調べてみようかな。

おまけ

JSFリッチコンポのスタートアップ関連は過去に以下のようなものを書きました。
NetBeansをインストールしてれば、10分もかからず画面作れるので、JSFを触ってみたい!という方は是非(^^)個人的にはPrimeFacesがおススメです。

PrimeFaces
NetBeansで始める初めてのPrimeFaces 〜Maven編〜 はてなブックマーク - NetBeansで始める初めてのPrimeFaces 〜Maven編〜
NetBeansで始める初めてのPrimeFaces
PrimeFacesを使ったJSFリッチユーザインタフェース入門 〜ちょっと便利なコンポ達〜

RichFaces
NetBeansで始める初めてのRichFaces ~Maven編~

あとJSFリッチコンポの比較としては

開発現場で実際にJSFを利用していて感じること

辺りで書きましたが、やはり未だにPrimeFacesが独走なのかなぁと(^^;

Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~NetBeans編~

2015/10/19 追記
登録画面が少し変わっているようです。@suke_masaさんがまとめています。masatoshitada.hatenadiary.jp

2014/1/18追記
Twitter APIに仕様変更があり、Twitter4Jの利用に関して以下補足を加えました。
Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~SSL対応の補足編~

タイトルの10分のうち半分近くがOAuth認証の準備だったので、5分にするか10分にするか悩んだのですが、10分にしました(^^;すみません。自分がもっとテキパキできる人間なら3分くらい…。

ネット情報や勉強会で「Twitter4Jは素晴らしい!」と方々で聞くもので、前々から触ってみたいと思っていました。で、繁忙期を抜けて今がチャンス!なので触ってみました。

今日のブログの前提条件
・Twitterアカウントがあること
・インターネットにつながるPC
・上記PCにNetBeans 7.3インストール済
くらいかと

目的

Twitterのサイトや世にあるサイト・アプリを使うのではなく
自分で書いたJavaプログラムでツイートをする( ̄^ ̄)エヘン

今日書いたサンプルはほとんどがTwitter4Jの恩恵によるものなので「自分で書いたJavaプログラム」という表現は超怪しいですが…(^^;

参考にしたサイト

本家Twitter4Jサイト
http://twitter4j.org/ja/index.html

@IT JavaでTwitterをOAuth認証して使えるTwitter4Jとは
http://www.atmarkit.co.jp/ait/articles/1102/08/news122.html

の2つです(^^;半分後者の記事の焼き直しに近いです。

アプリケーションの登録をする

Twitter Developers
https://dev.twitter.com/

上記サイトにアクセスします。
@ITの記事では日本語になってましたが、英語しか見当たらなかったのでそのキャプチャベースです(^^;

1.Twitter Developersへアクセス
f:id:kikutaro777:20130719175832j:plain

2.右上の「Sign in」を押してプログラムで使うTwitterアカウントでログインします
f:id:kikutaro777:20130719175854j:plain

3.ログイン後、右上のメニューから「My applications」を選択します
f:id:kikutaro777:20130719175952j:plain

4.自分の場合は今までに何も作ってないので空です
「Create a new application」を押下します。
f:id:kikutaro777:20130719180033j:plain

5.アプリケーションに関する情報を入力します
遊びのサンプルなので適当に…。
f:id:kikutaro777:20130719180207j:plain

6.作成完了すると以下のような画面に
f:id:kikutaro777:20130719180333j:plain

7.アクセスレベルを変更します
デフォルトだとRead-onlyなので、Settingsタブからアクセスレベルを変更します。
Read and Writeにして「Update this Twitter application's settings」ボタンで保存します。
f:id:kikutaro777:20130719180436j:plain

8.アクセストークンの発行をしますDetailsタブに戻って「Your access token」の所で以下ボタンを押します。
f:id:kikutaro777:20130719180628j:plain

OAuth toolタブで以下4つが発行されて確認できれば完了です(^^)

  • Consumer key
  • Consumer secret
  • Access token
  • Access token secret

NetBeans 7.3 + Mavenでプロジェクト作成

Mavenでプロジェクト作成します。
「ファイル」メニューの「新規プロジェクト」を選びます。
以下のように「Maven」->「Javaアプリケーション」を選択します。
f:id:kikutaro777:20130719181158j:plain

プロジェクト情報は適当に入れます。
f:id:kikutaro777:20130719181259j:plain

twitter4jのプロパティファイル追加

作成されたプロジェクトを右クリックして「新規」->「その他」を選び
f:id:kikutaro777:20130719181328j:plain

「その他」->「プロパティ・ファイル」を選びます。
f:id:kikutaro777:20130719181400j:plain

「twitter4j」と入力します(拡張子はNetBeansがつけてくれます)
f:id:kikutaro777:20130719181432j:plain

NetBeansのプロジェクトタブだとみえないですが、ファイルタブにすれば
twitter4j.propertiesが確認できるので開きます
f:id:kikutaro777:20130719181533j:plain

ファイルの中身は
http://twitter4j.org/ja/configuration.html
のページにあるように記述します。

debug=true
oauth.consumerKey=*********************
oauth.consumerSecret=******************************************
oauth.accessToken=**************************************************
oauth.accessTokenSecret=******************************************

これでお膳立ては完了ですね。長いようですが、サクサクできれば5分です(^^)

依存性追加

Mavenのセントラルリポジトリ参照で問題なければ、pom.xmlに以下の依存性のみ追加します。

<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <version>3.0.3</version>
</dependency>

2014/1/18追記
2014/1/18現在では3.0.3ではなく3.0.5を利用してください。以下補足。
Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~SSL対応の補足編~

コードを書いてみる

自動生成されてるクラスのmainメソッドに以下のような感じで追加。

package jp.co.hoge.myfirstsampleoftwitter4j;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;

public class App 
{
    public static void main( String[] args ) throws TwitterException
    {
        Twitter twitter = new TwitterFactory().getInstance();
        User user = twitter.verifyCredentials();
        
        //ユーザ情報取得
        System.out.println("なまえ   :" + user.getName());
        System.out.println("ひょうじ名 :" + user.getScreenName());
        System.err.println("ふぉろー数 :" + user.getFriendsCount());
        System.out.println("ふぉろわー数:" + user.getFollowersCount());
      
        //ついーとしてみる
        Status status = twitter.updateStatus("初めてTwitter4J使ってみました(^^)/");
    }
}

実行結果

結果は標準出力には

なまえ   :キクタロー
ひょうじ名 :kikutaro_
ふぉろー数 :241
ふぉろわー数:137

と出ました。おお、簡単に色々な値が取れる。

ツイートした結果は…


ちゃんとできてる!

コードのほぼ全てがTwitter4Jの恩恵によるものなのに、なんか嬉しい!

独り言

プログラム開発経験のない新人さんのレクチャー用として良いサンプルになるかなぁ、という想いもあって作ってみたのですが…そういえば前に聞いたらTwitterとかやってないって言ってた…(^^;こういう題材使うと楽しみながらプログラム書けそうなんだけどなぁ。

Twitter4JはAPIの設計や内部のアーキテクチャなどが非常に良くできてるという話なので、ソースも拝見して勉強していきたいなーと思います。

Javaって賛否両論、とくに否が多いけど、こういう便利なライブラリが簡単に触れるのは個人的にはありがたいですね(^^)

CentOS 6.4にJDK7とNetBeans 7.3をインストールしてみた

Java EE 6で開発を行った理由の1つに「自部門が扱う海外パッケージとの相性」というのがありました。簡潔に言うと、そのパッケージがJavaベースで、Linuxも対応しているわけです。

でも今までは自分達の開発技術的にLinuxでの活用や周辺開発はなかったという…。

ぶっちゃけ、Linuxをまともに触れる人いないし…(^^;

とはいえ、仕事抜きにしても、せっかくJava開発やってみたんだし、男に生まれたからにはLinuxでもやってみたいよ!と奮起して少しずつ触ってみようかなと。

一応、大学のマシン環境はSolarisメインで、研究室はVineLinuxだったので、かれこれ9年くらいブランクあるけど頑張れば何とかなるはず!と甘い考えで…(^^;

目標は開発したJava EE 6システムをLinuxで動かす、かなぁ(^^)と。
NativeQueryは使わなかったので、DBもMySQLPostgreSQLにすればいけるはず。。。

………

……

で、Linuxの世界を久々に見に行ってみると、相変わらずディストリビューションから迷うんですね(^^;特に理由ないですが、とりあえずCent OS 6.0を選択。

まず、JDKNetBeans入れてみました。

後で気づいたのですが、yumを使えばもっと簡単に入れられたっぽい…(-_-;

とりあえず以下は、ベタに手動でJDKNetBeansのインストーラを取ってくる、という手順です。

JDK7インストール

Oracleのサイトからjdkのrpmを落としました(今回は32bit版)。
f:id:kikutaro777:20130711183111j:plain

root権限で

rpm -ihv jdk-7u25-linux-i586.rpm

でスルスルとインストール完了。あれっ、昔々LinuxJava入れた覚えあるけど、なんかだいぶ楽になってる気がする…!

NetBeans 7.3インストール

7.3.1が既に出ていますが、とりあえず今回は7.3でインストールしました。

NetBeansの日本語サイトからダウンロードページで
f:id:kikutaro777:20130711183329j:plain
この下に出る「すべて」で落としました。

root権限で

chmod +x netbeans-7.3-linux.sh
./netbeans-7.3-linux.sh

しばらくするとインストーラが起動します。
あとは流れるままに「次へ」を押したのみです。
f:id:kikutaro777:20130711183427j:plain
f:id:kikutaro777:20130711183432j:plain
f:id:kikutaro777:20130711183436j:plain
f:id:kikutaro777:20130711183440j:plain
f:id:kikutaro777:20130711183450j:plain
f:id:kikutaro777:20130711183500j:plain
f:id:kikutaro777:20130711183506j:plain
f:id:kikutaro777:20130711183510j:plain
f:id:kikutaro777:20130711183515j:plain
f:id:kikutaro777:20130711183519j:plain

なんかあっさりと終わった。

で、起動!

f:id:kikutaro777:20130711183534j:plain

やったー!!思ってたより簡単に進んだー!これから時間をみて少しずつやってみようー。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村