goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Struts2のゼロ・コンフィグレーションの例

2015-09-21 22:46:09 | JavaとWeb
 Struts2であることを行いたいんだけど(次のエントリで公開)、
それを行うのに、ゼロ・コンフィグレーションにしておきたいので
ここにゼロ・コンフィグレーションの例を載せておきます。

■ゼロ・コンフィグレーションとは
 設定ファイルstruts.xmlファイルを書かないので
 ゼロ・コンフィグレーション
(どこにもコンフィグレーションを書かないのではなく、
 あのテーションで書く)

■お題

Struts2でのエラーメッセージあれこれ
http://blog.goo.ne.jp/xmldtp/e/a4e84399abb40428e4abbab2fb80c419

をゼロ・コンフィグレーションにする

■概要
・struts.xmlをかかない
・パッケージがXXXXの形だったり、パッケージでなかったりしたら、
 パッケージ名がXXXX.YYYYになるようにする
・Result,Actionを書く
  →org.apache.struts2.convention.annotation.の上記クラスなどをimport
  →Struts 2 Convention Plugin2.3.16をダウンロードしてきました
http://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin/2.3.16

■ソース
「Struts2でのエラーメッセージあれこれ」のgui.HelloAction.javaを、パッケージを変えて、
struts2.gui.HelloAction.javaにして、以下のようにソースを書きなおしました。
また、struts2-convention-pluginを上記サイトよりダウンロードして、jarを
パスに通しました

package struts2.gui;

//	セッションで使う
import java.util.Map;

//(1)リクエストで使うものインポート
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.convention.annotation.Action;	 //ゼロコンフィグレーション
import org.apache.struts2.convention.annotation.Result;  //ゼロコンフィグレーション
import org.apache.struts2.convention.annotation.Results; //ゼロコンフィグレーション
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

//	一般的に・・・
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;

//==============================================//
//												//
//	Struts2										//
//	セッション、リクエストのサンプル			//
//												//
//==============================================//
@Results({
	@Result(name="success", location="/hello.jsp"),
	@Result(name="input", location="/index.jsp"),
})
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
	private String name;						//	sタグの変数
	private Map<String,Object> session;						//	セッションの宣言
	private HttpServletRequest request;			//	(2)リクエストの宣言

	//	sタグで必要なアクセサ
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

	//	セッションで必要なアクセサ
	public void setSession(Map<String,Object> session) {
		this.session = session;
	}

	//	(3)リクエストで必要なアクセサ記述
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public HttpServletRequest getServletRequest() {
		return this.request;
	}

	@Validations(requiredStrings = @RequiredStringValidator(fieldName = "name", message = "名前を入力してください"))

	@Override
	 public void validate()
	 {
    	try
    	{
  	    		int kai =  Integer.parseInt(getServletRequest().getParameter("start"));
  	    		if (kai < 0)
  	    		{
  				 	addFieldError("start","開始数が負の数");
  	    		}
    	}
    	catch(Exception e)
    	{
  	    		//	数字でなかったら、なにもしない
			 	addActionError("開始数が数字でない");
    	}
	 }

	@Action("hello")
    public String execute()
    {
  	    //======================================//
  	    //		値の取得						//
  	    //======================================//
    	// sタグのnameは、何もしなくても取得されている

    	//	セッションでの取得
  	    int	kai;
  	    String kaistr = (String)session.get("kaisu");
  	    if ( kaistr	==	null)
  	    {
  	    	kai	=	0;
  	    }
  	    else
  	    {
  	    	kai = Integer.parseInt(kaistr);
  	    }

  	    //	(4)リクエストパラメタでの取得
  	    String start = getServletRequest().getParameter("start");
  	    if (start	!=	null)
  	    {
  	    	try
  	    	{
  	    		kai =  Integer.parseInt(start);
  	    	}
  	    	catch(Exception e)
  	    	{
  	    		//	数字でなかったら、なにもしない
  	    	}
  	    }


  	    //======================================//
  	    //		処理							//
  	    //======================================//
  	    kai++;		//	今回の分を足す
  	    String msg = "Hello World" + name + ":"+ kai+"回目";


  	    //======================================//
  	    //		出力								//
  	    //======================================//
  		//	セッション書き出し
  		session.put("kaisu", String.valueOf(kai));
  		session.put("msg", msg);

        this.addActionMessage("成功1");
        return SUCCESS;
    }


}



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Struts2でのエラーメッセージあれこれ

2015-09-18 15:15:01 | JavaとWeb
今日もStruts2ネタを1つ。

Struts2でエラーメッセージを「表示」しようとすると、
 アクションエラー(全体で1つ)
 フィールドエラー(各フィールドごと)
の2種類が考えられる

そして、エラーのチェック方法としては、
  1.アクションクラス名-validation.xmlを作成して、チェック
  2.@Validationsでアノテーションを使ってチェック
  3.validate()メソッドを使ってチェック
と3通り考えられます(もっとあるかもしれないけど・・・)

ここでは、2と3の方法を取り上げます。




■サンプル
【御題】
名前になにもいれないと、フィールドエラーとして、名前のところにエラーが出て
開始数に何もいれないと、アクションエラーとして、一番上にエラーが出る

開始数がマイナスだと

フィールドエラーとして、開始数のところにエラーがでる。

【ソースコード:変更のあるもののみ】

基本的にソースは

Struts2でINPUTタグの値を読む方法(ServletRequestAwareの利用法)
http://blog.goo.ne.jp/xmldtp/e/469a8c3f14f5b8fc8584018b58ff8268
と同じなので、相違点のみ、掲載します。

●index.jsp
アクションエラー、フィールドエラーの指定をします。
フィールドエラーは、s:fielderrorタグだけだと、すべてのフィールドエラーが表示される為、
その中で、s:paramを使って限定しています。
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<HEAD>
<TITLE>HelloTest</TITLE>
</HEAD>
<BODY>
	<s:actionerror />
    <s:form action="hello.action"  theme="simple">
         名前 :<s:textfield name="name"/><s:fielderror><s:param value="%{'name'}" /></s:fielderror><br/>

         開始数:<input type="text" name="start"/><s:fielderror><s:param value="%{'start'}" /></s:fielderror><br/>
         <br/>
         <s:submit type="button"  value="実行" />
    </s:form>
</BODY>
</html>


●struts.xml
エラーのとき、入力画面に戻るために、inputの設定をします

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="helloStruts2" namespace="/" extends="struts-default">
<action name="hello" class="gui.HelloAction">
<result name="input">/index.jsp</result>
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>



●gui.HelloAction.java
  2.@Validationsでアノテーションを使ってチェック
  3.validate()メソッドを使ってチェック
の両方を追加しています。


package gui;

// セッションで使う
import java.util.Map;

//(1)リクエストで使うものインポート
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

// 一般的に・・・
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;


//==============================================//
// //
// Struts2 //
// セッション、リクエストのサンプル //
// //
//==============================================//
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
private String name; // sタグの変数
private Map session; // セッションの宣言
private HttpServletRequest request; // (2)リクエストの宣言

// sタグで必要なアクセサ
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

// セッションで必要なアクセサ
public void setSession(Map session) {
this.session = session;
}

// (3)リクエストで必要なアクセサ記述
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public HttpServletRequest getServletRequest() {
return this.request;
}

@Validations(requiredStrings = @RequiredStringValidator(fieldName = "name", message = "名前を入力してください"))

@Override
public void validate()
{
try
{
int kai = Integer.parseInt(getServletRequest().getParameter("start"));
if (kai < 0)
{
addFieldError("start","開始数が負の数");
}
}
catch(Exception e)
{
// 数字でなかったら、なにもしない
addActionError("開始数が数字でない");
}
}

public String execute()
{
//======================================//
// 値の取得 //
//======================================//
// sタグのnameは、何もしなくても取得されている

// セッションでの取得
int kai;
String kaistr = (String)session.get("kaisu");
if ( kaistr == null)
{
kai = 0;
}
else
{
kai = Integer.parseInt(kaistr);
}

// (4)リクエストパラメタでの取得
String start = getServletRequest().getParameter("start");
if (start != null)
{
try
{
kai = Integer.parseInt(start);
}
catch(Exception e)
{
// 数字でなかったら、なにもしない
}
}


//======================================//
// 処理 //
//======================================//
kai++; // 今回の分を足す
String msg = "Hello World" + name + ":"+ kai+"回目";


//======================================//
// 出力 //
//======================================//
// セッション書き出し
session.put("kaisu", String.valueOf(kai));
session.put("msg", msg);

this.addActionMessage("成功1");
return SUCCESS;
}
}



【注意】
・エラーメッセージを表示する為に画面を書き換える。そのときsタグで指定したものは、値が入ってくるが
INPUTタグで書いたもの(開始数)は、値が入ってこない(3枚目の写真参照)。自分で設定すること



■参考サイト
1.http://d.hatena.ne.jp/cazzie/20080131/1201795354
2.http://kinjouj.github.io/2013/09/struts2-6-form-validation-1.html
3.http://cmslabs.blogspot.jp/2011/02/struts-2_21.html

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

struts2のstruts.xmlを書かない方式で「はまった」こと・・・あれこれPart2

2015-09-17 16:20:22 | JavaとWeb
Struts2ネタを続けます・・・

2年前

struts2のstruts.xmlを書かない方式で「はまった」こと・・・あれこれ
http://blog.goo.ne.jp/xmldtp/e/b6905d8e6bd9aedfc47ec8c34b87455a

を書いたけど、最近やったら、さらにはまったんで、つけたし・・
(つけたしということで、前回4までだったから、今回は5から)




■はまった点5:そもそもstruts2-convention-plugin-2.3.15.1.jarがない

・現象
はまった点1で、struts2-convention-plugin-2.3.15.1.jarを使っているが、
そもそも、そのjarがない

・対応
ここにある
http://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin/2.3.15.1




■はまった点6:Resultのアノテーションでlocationがでてこないでエラー

・現象
Resultのアノテーションでlocationがでてこないでエラーになり
valueとかをいれようとする

・理由
importしているものがちがっている

・対策

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

をインポートすること。




■はまった点7:Tomcatが立ち上がらない

・現象
たちあげようとすると、以下のエラー

9 17, 2015 3:42:34 午後 org.apache.catalina.core.StandardContext filterStart
重大: フィルタ struts2 の起動中の例外です
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException - Class: com.opensymphony.xwork2.inject.ContainerBuilder$4
File: ContainerBuilder.java
Method: create
Line: 132 - com/opensymphony/xwork2/inject/ContainerBuilder.java:132:-1
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:501)

(以下省略)

・理由
Jarのバージョンが違う(ふるい)

・対策
struts2-convention-plugin-2.3.15.1.jarをダウンロードして来いとあれほど・・・




■はまった点8:Tomcatが立ち上がらない part2
・現象
たちあげようとすると、以下のエラー

9 17, 2015 4:04:10 午後 org.apache.catalina.core.StandardContext filterStart
重大: フィルタ struts2 の起動中の例外です
Unable to load configuration. - bean - jar:file:/C:/Users/epson-w7/Desktop/pleiades-e4.3-ultimate-jre_20130926/pleiades/tomcat/7/webapps/test2/WEB-INF/lib/struts2-convention-plugin-2.3.16.jar!/struts-plugin.xml:30:137

(以下省略)

・理由
WEB-INFの下に(バージョン違いで)struts2-convention-pluginが2個以上いる

・対策
struts2-convention-pluginは1個にする
(実は、「struts2-convention-plugin-2.3.15.1.jarをダウンロードして来いとあれほど・・・」
言っていたが、2.3.15.1の必要はなく、2.3.16でもOK)




とりあえず、こんなところ

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Struts2でINPUTタグの値を読む方法(ServletRequestAwareの利用法)

2015-09-17 12:12:44 | JavaとWeb
JavaEEの話をしたあとで、Struts2っていうのも、なんなんですが、
Struts2のお話。

【課題】
Struts2で、sタグでなく、HTMLのINPUTタグで書いた値を読みたい
というときは、どうするか・・・

【何が問題?】
このとき、Struts2のActionを書くBeanに(s:で書くタグのように)
INPUTタグのnameと同じ名前の変数を書いても、そこには入ってこない
HTTPrequestの中に入っているので、そこからとってこないといけない
で、HTTPrequestをどうやってとってくるの?これが問題

【答え(の概要)】

・ServletRequestAwareをimplementsする
  →implementsするということは、必要なメソッドを定義しないといけない。
   この必要なメソッドがsetServletRequest()とgetServletRequest()
  →さらに、requestをクラスの属性として変数宣言しないといけない
  →必要なインポートもある

・getServletRequest().getParameter("INPUTのname名");で取り出せる


サンプルを以下に示します。




【サンプルのお題】

・はじめ、名前をいれて、開始数に何も入力しないと

 Hello World 名前 1回目 と表示される


・まったくおなじようにクリックすると

 前回訪問回数(今回は1回)に1足された回数が表示される


・開始数を設定すると

 開始数に1足された回数が表示される


【ソースコード】

・入力画面(初期表示画面)index.jsp
 s:textfieldタグで名前、inputタグで開始数を設定している
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<HEAD>
<TITLE>HelloTest</TITLE>
</HEAD>
<BODY>
    <s:form action="hello.action"  theme="simple">
         名前 :<s:textfield name="name"/><br/>
         開始数:<input type="text" name="start"/><br/>
         <br/>
         <s:submit type="button"  value="実行" />
    </s:form>
</BODY>
<html>


・結果表示画面 hello.jsp
セッションの中に入っているmsgを表示している

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<HTML>
<HEAD>
<TITLE>足し算</TITLE>
</HEAD>
<BODY>
<s:property value="#session.msg"/>
<A HREF="index.jsp">戻る</A>
</BODY>
</HTML>


・設定ファイル web.xml
 は、ふつうのstruts2と変わらないので省略

・設定ファイル struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="helloStruts2" namespace="/" extends="struts-default">
<action name="hello" class="gui.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>


・ソースコード gui.HelloAction.java
 セッションとリクエストの処理をしている。今回の御題リクエスト関係は、以下のとおり
(1)リクエストで使うものインポート
(2)リクエストの宣言
(3)リクエストで必要なアクセサ記述(setServletRequest()とgetServletRequest())
(4)リクエストパラメタでの取得
 具体的な内容は以下のソースとコメントを参照してください

package gui;

// セッションで使う
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

//(1)リクエストで使うものインポート
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;

// 一般的に・・・
import com.opensymphony.xwork2.ActionSupport;

//==============================================//
// //
// Struts2 //
// セッション、リクエストのサンプル //
// //
//==============================================//
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
private String name; // sタグの変数
private Map session; // セッションの宣言
private HttpServletRequest request; // (2)リクエストの宣言

// sタグで必要なアクセサ
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

// セッションで必要なアクセサ
public void setSession(Map session) {
this.session = session;
}

// (3)リクエストで必要なアクセサ記述
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public HttpServletRequest getServletRequest() {
return this.request;
}

public String execute()
{
//======================================//
// 値の取得 //
//======================================//
// sタグのnameは、何もしなくても取得されている

// セッションでの取得
int kai;
String kaistr = (String)session.get("kaisu");
if ( kaistr == null)
{
kai = 0;
}
else
{
kai = Integer.parseInt(kaistr);
}

// (4)リクエストパラメタでの取得
String start = getServletRequest().getParameter("start");
if (start != null)
{
try
{
kai = Integer.parseInt(start);
}
catch(Exception e)
{
// 数字でなかったら、なにもしない
}
}


//======================================//
// 処理 //
//======================================//
kai++; // 今回の分を足す
String msg = "Hello World" + name + ":"+ kai+"回目";


//======================================//
// 出力 //
//======================================//
// セッション書き出し
session.put("kaisu", String.valueOf(kai));
session.put("msg", msg);

this.addActionMessage("成功1");
return SUCCESS;
}
}






  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「帰ってきたGlassFish Users Group Japan勉強会」に行ってきた!

2015-09-17 08:27:34 | JavaとWeb
昨日(9/16)、「帰ってきたGlassFish Users Group Japan勉強会」
に行ってきた。その内容をメモメモ




■JavaEEパフォーマンスTips 上妻(あげつま)さん
・自己紹介
・JavaEEのレイヤー毎の性能Tips
 プレゼンテーション:JSF
  古いmojarra(もはら)を使わない
   JSFタグが増えると遅くなる。4.1で修正
   5000タグで4秒ぐらい
     →Payaraは4.1ベースなのでで150ミリ秒

 ビジネスそう
  DIはEJBでなくCDIを使う
   EE6からCDI
   EE7からbeans.xmlなしでデフォルト有効化
   EE5マデハEJB間でのみDIが利用可
  EJBのループ呼出しによるオーバーヘッド
   万単位以上のループでオーバーヘッド
  CDIはほとんどオーバーヘッドない
  @Transactionalは正しくつけること
  @Asynchronous利用時はEJBスレッドプールに注意
    GlassFish:デフォルトだとスレッドループは16でとまる
    EJBコンテナのプロパティ
  JPAのexecuteBatch設定を忘れない
     JDBC利用時は意識する
     eclipselink、Hibernateもデフォルトバッチしていない
     eclipselink→persistence.xml

・まとめ
1.古いもはらはつかわない
2.DIはCDIを使う
3.EJBスレッドプール
4.executeBatch設定を忘れない

http://www.slideshare.net/agetsuma/java-ee-tips-glassfishjp




■JavaEE8先取り MVC1.0入門
・スライド60枚の発表用をglassfish_jpでつぶやいた

http://www.slideshare.net/masatoshitada7/java-ee-8mvc-10



・自己紹介
・MVC1.0とOzark(おざーく)
・注意点:これから仕様が変わる可能性
1)MVC1.0登場の背景とコンセプト
・Struts1のEOL
・JavaEEへの回帰
・JSF:コンポーネントベース→作り方おとなる
  →JAVAEE標準のアクション
・調査結果
  JSON-B
  セキュリティ
  キャッシュ
  インターセプター
  MVC
・MVC1.0 2015年3月にアーリードラフト
・JSFを否定するものではない(共存可能)
・MVCのコンセプト
  MVCアプリのコア
  JAX-RS上で動かす
  JSF,Faceletsをサポート
→JAX-RSを中心に既存のJavaEEテクノロジーを最大限に
ビュー
  JSP
コントローラー JAX-RSリソースクラス
モデルCDIビーン JPA

2)機能とサンプル
・参照実装Ozark
・下準備:Jax-RSの有効化
・CDI Beanによる値の受け渡し
・リダイレクト
・コントローラーメソッドの戻り値の型
  1)String
  2)Viewable:MVCで用意された
  3)Response:ステータスコードも返したい
  4)void+@View:あのテーションで指定
・バリデーション
  BindingResultに詰められる
・例外処理
  ExceptionMapper実装クラス
・サポートされるビュー技術
  JSP
  Facelets
・セキュリティ
   CSRF対策

3)実装されない機能
 ボタン2度押し→クライアントサイド
 今後期待
  バリデーショングループ
  認証認可 EE8

まとめ
・MVC1.0は
  EE8標準




■JavaEE on Heroku with Payara Micro
・自己紹介
・GlassFish使ってますか?
  WildFly,SpringBoot
・SoftwareDesignでGlassFishの文字が
・JavaEEでPaaS→気軽に試すならPaaS
・JavaEE on PaaS
  Gppgle App Engine CloudBees,Azure,Oracle Cloud,OpenShift・・・
・I loved RUN@cloud on CloudBees!
  →PaaS事業終了
・OpenShiftあたりがクレジットカード不要
・7月にSalesforceのイベントに参加 Herokuの話も
・HerokuのJavaサンプルはSpark(フレームワークのほうの)
・Payara:そもそもPayaraとは→ほぼそのままGlassFish
・Payara Micro
 java -jar payara-micro-4.1.153.jar --deploy target.war
 でデプロイまで
・蓮沼さんのエントリをよめばOK!
・Herokuアカウント作成(クレジットカードいらない)
・Java Get Start
・ポートをちゃんととる
さんぷる
http://arcane-retreat-2618.herokuapp.com/CongratulationsMakiMaki-1.0/
・日本におけるPayara周辺




■Life With Payara
蓮沼さん

Payara4.1.153あべいらぶる
http://payara.co/downloads
GlassFish:Oracle GlassFishの商用サポートやめる
→4.1はオープンソース版だけ
 いったん死んだ?
GlassFish復活2015
→一番初めに手を挙げたのがC2B2
  →GlassFishクローンを開発=Payara

GlassFishとPayara
・単純なフォークではない
・定期的リリース
・Github上
・本家にパッチ提供、本家からは1か月に1回
・4.1系=EE7 ふる対応
・JavaDB,OpenMQ
・L10Nサポート

アドバンテージ
・商用サポート:GlassFishもPayaraも
・Hazelcast(インメモリ)
・Payara Micro
・日本語訳のアップデート




■日本GlassFishUser会
事務連絡 「副会長の」蓮沼さん
岡崎会長や寺田さんが作った
規模縮小→忘年会サークル→ファンクラブ
勉強会の活発化
・寺田さんオラクル退職→支援してくれる人がいる
・活動メインは勉強会
・JCP公認JUGへの申請→今後の会長は蓮沼さん
・今後の運営について
DoorKeeperへの登録
   https://glassfish.doorkeeper.jp/
 Webサイトも時々チェック
   http://www.glassfish.jp

「新会長の」蓮沼さんからでした!

連絡事項
・ビジターカードを返すこと
・懇親会
・次回:目標年明け
・ご意見ご感想のアドレスは、http://www.glassfish.jpに載せる

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Canvasの透過を利用して、Webサイトに各自落書きし、そのデータを共有する方法を考えてみる

2015-08-04 11:20:32 | JavaとWeb
Windows10の

Microsoft Edge が登場します 今までとは違う。まったく新しいブラウザー
https://www.microsoft.com/ja-jp/windows/microsoft-edge?ocid=OCWin10CLE_Blade_Edge&ocid=OCWin10CLE_Blade_Edge

にあるように、Webサイトに各自落書きし、そのデータを共有する方法って、
新しいIEを使わなかったら(現状のブラウザで)どうやってやるんだ?
と思って・・・




■Canvasの背景は、透過する。たぶん、これを利用するんだよね?

こんなふうに、Gooの画面の上にキャンバスで四角形を書くことを考える


ソースは、こんなかんじで
<html>
<head>
<script type="text/javascript">
function f1()
{
	var context = document.getElementById("world").getContext("2d");

	context.beginPath();
	context.rect(50, 50, 100, 100);
	context.stroke();
}
</script>
</head>
<body onload="f1()">
<div id=main width="300" height="200">
<canvas id='world'   width="300" height="200"  style="position:fixed;top:0;left:0;z-index:2;"></canvas>
<IFRAME SRC="http://www.goo.ne.jp"  style="position:fixed;top:0;left:0;z-index:1;"/>
</div>
</body>
</html>

キャンバスは、gooの画面ともろかぶりだけど、
実際には、ドローイングした四角形が書かれるだけで
背景の部分は抜けている

たぶん、これを利用するんだろう

※注意:
(1)Gooサイトが表示された後、すこし時間がかかってから、四角形が書かれるので注意
(2)divタグ内で、IFRAMEとcanvasをいれて、どちらも座標を指定して、
   positionを指定しないと、重ならないかも?
  (もちろん、重なるようにfixedとかにしてね!)




■いたずらがきを、canvasでする

こんなかんじかなあ・・・

・(お絵かきソフトを作っておいて)
     サイトをIFRAMEで表示(z-index=1)
     落書きをCanvasを使い、お絵かきソフトで行って(z-index=2)
 →上記のHTMLの例のように

・その落書きの内容をlocalstorageを使って保存

・共有するときは、localstorageの内容を転送して

・転送されたlocalstorageの内容をCanvasに書き出す
  →べつのCanvasに書き出せば、人ごとに共有できますね!

作ってないので、想像ですが・・・

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

StrutsからPHP(REST)+HTML5(AJAX)に「業務を止めないで、段階的に」モダナイズする

2015-07-22 11:20:15 | JavaとWeb
StrutsからPHP(REST)+HTML5(AJAX)へ
「業務を止めないで、段階的に」
モダナイズしたいという要望がある。

いっぺんに切り替えると、なんかあったとき大変だから・・・
(それと、お金の関係も有る)

この場合、StrutsもPHPもRESTにすればできると思う

つまり、
1.まず、画面をHTML5で作成し、Javascriptで、ボタンが押されたら、
  Struts(*.do)を呼び出すようにする

2.出力する画面のJSP(strutsタグ入り)を、
  JSONでデータだけを返すように書き換える
  そして、1で作成したHTMLを、*.doを単純によびだすのではなく、
  AJAXで*.doを呼び出すようにして、処理結果(JSPで作成するJSON)
  をJSONで受け取って、その変数をlocalstorageとかにいれて、
  次画面に遷移するようにする

3.StrutsでJSONでデータを返しているプログラムを、PHPで書き換える

こうすると、段階的に、置き換えられると思う。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

えっ(@_@!)・・・マイクロソフト・・・

2015-07-13 15:28:28 | JavaとWeb
https://twitter.com/yoshioterada/status/620386867389698048
によると・・・


えっ(@_@!)・・・
えっ(@_@!)・・・
えっ(@_@!)・・・

Oracle、Java、大丈夫?

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JVMの動きと、GCについて

2015-04-27 09:00:15 | JavaとWeb
4月24日(金)にJJUG ナイトセミナ 「Javaのプログラムはどうやって動いているの?」に行って来た。
その内容をメモメモ




■Javaのプログラムはどうやって動いているの?JVM編

アジェンダ
・JVM
・Classファイル
・mainを実行するまで
・バイトコードの実行

桜庭さん@skrbの自己紹介
・Javaチャンピオン
・Java in the BOX
・ITPro Java技術最前線
・ごちそうフォト

JVM

Virtual Machine
 プログラミング言語を解釈し
 コンピューターで実行するソフトウェア
  ・JavaVM
  ・.net CLR
  ・Small t5alk
  ・Write Once,Run Anywhere

Java Virtual Machine
 バイトコードを解釈して実行
 基本はインタープリタ
 実行時コンパイル
   Just-in-Time Compile

Today's Sample

Classファイル
 .java→Javac→.classファイル

 クラス定義
 フィールド定義
 メソッド定義
   ↓
 クラス定義
 フィールド定義
 バイトコード

 定数プール:文字列、リテラル
 属性:型パラメータとか

Javap:どういうバイトコードか?
 バイトコードの逆アセンブル
 javap -p -c クラス名
  -p プライベート
  -c バイトコード
 javap -p -v クラス名
  -v バイトコード+定数プール

Java仮想マシン仕様

mainを実行するまで
 1.JVM起動
 2.クラスロード
 3.リンク
 4.初期化
 5.main実行

JVM起動
 JNI_CreateJavaVM()

クラスロード
 classファイルの読み込み
 使用するクラスを芋づる式にロード
  java -verbose:class Test
 rt.jar Java9から必要ないのは読み込まないように

リンク
 classファイルが正しいかチェック
 staticフィールドの初期化
  ただし、Javaコードの実行はしない
  finalでもnullが入る
 クラス間の関係を解決

初期化
 staticフィールドの初期化
  javaコードも実行 finalの値入る
 staticイニシャライザの実行

mainメソッドの実行

Java puzzle:Anniversary

バイトコードの実行
 1.キュー
 2.でっく(Deque:できゅーではない)
 3.スタック
 4.リングバッファ
 5.マップ(連想配列)
 6.リンクドリスト(リスト構造)

java.utilのstackは使ってはいけない
 古い
 ArrayDequeを使う

スタックがメイン

Stack
 LIFO
 途中の要素のアクセスはダメ

実行形態
 スタックマシン:中間状態をスタックに
   JavaVM,.net Framework CLR,PS
 レジスターマシン:Intel Core,ARM Cortex
   ダルビック

逆ポーランド記法

中間の状態をスタックで取る
  ヒープ
  メタスペース(パーマネント領域)
  スレッドごとにスタックがある

Java Stack
  プログラムカウンタ(PC)
  フレーム

 0番目 This
 そのあと引数が積まれる

JVM編conclusion
・マカロンスタック
  マカロンは積むもの

Java Javac Classファイル:バイトコード
 JVM起動
 クラスロード
 リンク
 初期化
 main実行
JVM:Stackマシン

サーバー系はむちゃくちゃ読み込む
互換性:検証でチェック
 OracleのJavacとeclipseのJavacでバイトコードは違う
 Java SE7までは、互換性は取れている(実行結果は同じ)
 ただし、VMの解釈は、実装依存




■Javaのプログラムはどうやって動いているの?GC編

アジェンダ
 Why to Use GC
 Mark & Sweep GC
 Copy GC
 世代別GC

Why to Use GC

GC
 Garbage Collection
  メモリの自動管理
  不要になったメモリを自動的に回収

Before GC
 自前でメモリ管理
  C
   malloc(),calloc(),realloc()
   free()

問題点
  メモリの解放し忘れ
  二重開放
  無効な参照
 メモリ周りのバグは修正が難しい

1959:いちばんはじめのGC
  John McCarthy Mark&SweepGC Lisp向け
一般的に使用されだしたのは90年代
  CPU、メモリ性能向上

GC
 アルゴリズム
  ベーシック
    Mark&Sweep
    参照カウント
    Copy
  複合
    世代別
    G1
 運用
    シリアル
    インクリメンタル
    コンカレント
    パラレル

JavaVM:参照カウントだけない。他はある
 デフォルトCMS:コンカレントでMark&Sweep

GC本 中村さん

Mark&Sweep
 Mark:使用中のオブジェクトをマーク
 Sweep:マークのないオブジェクトを掃除

 Rootから芋づる式にマーク→深さ優先探索
 先頭から未使用ObjをFreeListへ

Compactionも一緒にやる
 →コンパクトにする

いい点
 実装がシンプル
 参照の書き換えがないので安全(コンパクションしない限り)
  →保守的GC
欠点
 おそい
 Stop-the-worldの時間が長い
 ヒープの断片化がおきやすい(コンパクションしない限り)

CopyGC
 ヒープを2分割
 使用する領域は一方のみ
 片方からもう一方へObjをコピー
 使用する領域を反転
→コピーすることでコンパクションと同じことができる
利点
 stop-the-worldの時間が短い
 ヒープの断片化が起きない
 高速なアロケーション
欠点
 ヒープの仕様効率が悪い
 参照の書き換えがある

世代別GC
 仮説:若いObjほど早く死ぬ
 世代別にヒープ管理を行う
  Young世代 高速なGC→Copy
  old世代 安定したGC→M&S
 Objの年齢:GCを生き延びた回数
世代別GC
 Young
   servivor1,servivor2,Eden
 old
   tenured
新しいObjはYoungへ配置→Eden
  GC:edenからservivorへ
 tenuredがフラグメンテーション→コンパクション→FullGC
 領域サイズはチューニングが必要
 old世代のGCをなるべく減らす
 CMS,G1GCなどの派生GCあり

Conclusion
 M&S、Copy、世代別
 原理を知って、チューニングに活かす

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Java SE 7のパブリック・アップデート、4月で終了

2015-04-22 13:56:34 | JavaとWeb

Java SE 7のパブリック・アップデートの終了通知
https://java.com/ja/download/faq/java_7.xml

今年の4月30日(つまり来週)に無償版のアップデートは終わるらしい。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JavaのJSRで定めようとしているMVC(1.0)について

2015-04-21 10:11:37 | JavaとWeb
Javaのおきては、JSRというので決まっている。
そのJSRの371

JSRs: Java Specification Requests
JSR 371: Model-View-Controller (MVC 1.0) Specification
https://jcp.org/en/jsr/detail?id=371

は、MVCについて、決めようとしているんだけど、
それについて、

[jjug-members] MVC 1.0のEarly Draft Reviewについて

というかたちで、JJUG(Japan Java User Group)の人たちに流れてきた
メールが興味深いので、ここに公開しちゃう!

(いいのかな?ま、いいか)

以下の太字は、そのメールからの引用






こんにちは。
(メール作者の名前)です。

先日MVC 1.0 (JSR-371)のEarly Draft Reviewが出ました。まだまだ完成度は低いですが、一応試すことができます。
自分で0から環境を作るのも大変なので、簡単に試せるようにMaven Archetypeを
(メールの作者が)作ってみました。(Gradle好きな人すいません)

Bashの場合、

mvn archetype:generate\ -DarchetypeGroupId=am.ik.archetype\ -DarchetypeArtifactId=mvc-1.0-blank-archetype\ -DarchetypeVersion=1.0.0-m01
コマンドプロンプトの場合、

mvn archetype:generate^ -DarchetypeGroupId=am.ik.archetype^ -DarchetypeArtifactId=mvc-1.0-blank-archetype^ -DarchetypeVersion=1.0.0-m01
で雛形プロジェクトが作成されます。

作成例:

$ mvn archetype:generate -B\ -DarchetypeGroupId=am.ik.archetype\ -DarchetypeArtifactId=mvc-1.0-blank-archetype\ -DarchetypeVersion=1.0.0-m01\ -DgroupId=com.example\ -DartifactId=mvc-demo\ -Dversion=1.0.0-SNAPSHOT

生成されたプロジェクトをNetBeans8で開き、プロジェクト名を右クリック→「実行」

埋め込み画像 1

サーバーで「GlassFish Server 4.1」を選択し、「OK」をクリック

埋め込み画像 2

http://localhost:8080/mvc-demo/app/helloにアクセスすれば、サンプル画面が表示されます。
(mvc-demoの部分はartifactIdになります)
埋め込み画像 3
(このサンプルではViewにFaceletsを使用しており、その影響でweb.xmlが必要になっています。こちらが詳しいです。JSPなど他のViewを使う場合はweb.xmlを削除しても構いません)

是非、試してフィードバックをブログやこのMLに書いてみてください!
現状の課題については https://github.com/chkal/todo-mvc が参考になると思います。


仕様のドキュメントはまだ実質15ページほどで、簡単に読めるので
今後のMVCの動向に興味のある方は今のうちに読んでおくことをお勧めします。

http://download.oracle.com/otndocs/jcp/mvc-1-edr-spec/index.html

JSR-371に関しては
https://java.net/projects/jjug/pages/JSR-371
に情報を集めていますので参考にしてください。






  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Javaによるメールの受信について

2015-01-20 14:43:48 | JavaとWeb

このまえ

JavaMailによるメールの送信について

を書いたので、対称性として

Javaによるメールの受信について

を書いてみる。

といっても、いがぴょんさんの


http://www.igapyon.jp/igapyon/diary/2007/ig070905.html


を写しているような感じなんだけど。。。こんなかんじ

import java.util.Properties;

import javax.mail.Address;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;

/**
 * シンプルなメール受信サンプル。
 */
public class SimpleRecvMail {
    public static void main(final String[] args) {
        System.out.println("メール受信: 開始");

        new SimpleRecvMail().process();

        System.out.println("メール受信: 終了");
    }

    public void process() {
        final Properties props = new Properties();

        // 基本情報。ここでは Gooメールへの接続例を示します。
        props.setProperty("mail.pop3.host", "pop.mail.goo.jp");
        props.setProperty("mail.pop3.port", "110");

        // タイムアウト設定
        props.setProperty("mail.pop3.connectiontimeout", "60000");
        props.setProperty("mail.pop3.timeout", "60000");

        // SSL関連設定
        props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.pop3.socketFactory.fallback", "false");
        props.setProperty("mail.pop3.socketFactory.port", "995");

        final Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {

		//	メールアドレスとパスワードを入れる
                return new PasswordAuthentication("XXXXXXXXXXXXXXX@Xmail.goo.ne.jp", "mypassword");
            }
        });

        // デバッグを行います。標準出力にトレースが出ます。
        session.setDebug(true);

        Store store = null;
        try {
            try {
                store = session.getStore("pop3");
            } catch (NoSuchProviderException e) {
                System.out.println("メール受信: 指定プロバイダ[pop3]の取得に失敗しました。"
                        + e.toString());
                return;
            }

            try {
                store.connect();
            } catch (AuthenticationFailedException e) {
                System.out.println("メール受信: サーバ接続時に認証に失敗しました。" + e.toString());
                return;
            } catch (MessagingException e) {
                System.out.println("メール受信: サーバ接続に失敗しました。" + e.toString());
                return;
            }

            Folder folder = null;
            try {
                try {
                    // INBOXは予約語です。
                    folder = store.getFolder("INBOX");
                } catch (MessagingException e) {
                    System.out.println("メール受信: INBOXフォルダ取得に失敗しました。"
                            + e.toString());
                    return;
                }
                try {
                    folder.open(Folder.READ_ONLY);
                } catch (MessagingException e) {
                    System.out
                            .println("メール受信: フォルダオープンに失敗しました。" + e.toString());
                    return;
                }

                // メッセージ一覧を取得
                try {
                    final Message messages[] = folder.getMessages();
                    for (int index = 0; index < messages.length; index++) {
                        final Message message = messages[index];

                       // このAPI利用範囲であれば TOPコマンド止まりで、RETRコマンドは送出されない。

                        System.out.println("Subject: " + message.getSubject());
                        System.out.println("  Date: " + message.getSentDate().toString());

                        // TODO 0番目の配列アクセスをおこなっている点に注意。
                        final InternetAddress addrFrom = (InternetAddress) message.getFrom()[0];
                        System.out.println("  From: " + addrFrom.getAddress());
                        // MimeUtility.decodeText(addrFrom.getPersonal())

                        // To: を表示。
                        final Address[] addrsTo = message
                                .getRecipients(RecipientType.TO);
                        for (int loop = 0; loop < addrsTo.length; loop++) {
                            final InternetAddress addrTo = (InternetAddress) addrsTo[loop];
                            System.out.println("  To: " + addrTo.getAddress());
                        }

                        // Cc:は割愛

                        // なお、例えば message.getContentを呼び出すと RETRコマンドが送出される。
                        try {
                            // RETRコマンドを送出
                            System.out.println(message.getContent());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                } catch (MessagingException e) {
                    System.out.println("メール受信: メッセージ取得に失敗しました。" + e.toString());
                    return;
                }
            } finally {
                if (folder != null) {
                    try {
                        folder.close(false);
                    } catch (MessagingException e) {
                        System.out.println("メール受信: フォルダクローズに失敗しました。"
                                + e.toString());
                    }
                }
            }
        } finally {
            if (store != null) {
                try {
                    store.close();
                } catch (MessagingException e) {
                    System.out.println("メール受信: サーバ切断に失敗しました。" + e.toString());
                }
            }
        }
    }
}



ほぼうつしただけだけど、これで、(メールアドレスとパスワード書きかえて)
Gooメールが見れた!


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JavaMailによるメールの送信について

2015-01-16 12:41:38 | JavaとWeb
JavaDriveの

JavaMailでメール送信
http://www.javadrive.jp/javamail/

にあるんだけど、ダウンロード先などがちょっと違うので、メモメモ

■すること
1.JavaMailのダウンロード
2.JAFのダウンロード
3.プロジェクト作成&設定
4.サンプルプログラム作成




■1.JavaMailのダウンロード

http://www.oracle.com/technetwork/java/javamail/index.html

にいく。

Download

Download

AcceptLicense Agreementにチェックをいれると、上のように
Thank you・・・
の画面に変わるから、そこからダウンロードできる


■2.JAFのダウンロード

http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html


このページを下のほうにスクロールすると、ダウンロードするところが出てくる

■3.プロジェクト作成&設定

ダウンロードしてきたZIPファイルを解凍する。
そうしたら、eclipseを立ち上げ、プロジェクトを作成する。
作成したプロジェクトの下に、
・JavaMailを解凍したフォルダを開いていくとlibというフォルダがあるから、
 そのフォルダをドラッグ&ドロップ(プロジェクトへ)
・JAFを解凍すると、activation.jarというのが中にあるので、
 それを上記libにドラッグ&ドロップ
ここまでの作業を行うと、こうなる(プロジェクト名JavaMail1)

プロジェクト名を右クリック、プロパティで
Java Build Pathをクリック、Libraryタブ
add Jarsで、今コピーしたJarをひらいて、全部追加する
ここまでの作業を行うと、こうなる


■4.サンプルプログラム作成
msgsendsampleというクラスを新規に作成し


サンプルプログラムのテスト
http://www.javadrive.jp/javamail/smtp/index1.html


に書かれているソースコードをコピーして

引数を設定して実行すると

実行できるはず。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【JQuery】ボタンがdisabledになったら、なにかしたい

2015-01-15 12:46:05 | JavaとWeb
■なにが難しいのか?
ボタンがクリックされたら、何かしたい・・・なら簡単。
ボタンクリックのイベントがとれるから。

しかし、ボタンがdisabledになったら・・・というイベントがない。
なので、ボタンがdisabledになったら、何かしたいというのがかけない。

■どうしたか
ボタンをdisabledに直接するのではなく、
いったんボタンをblurにして、ボタンのblurイベント内でdisableにして、
そこに、disableのときにしたい処理を書いた

■サンプル
こんなかんじ。disabledのときに、背景を赤にしている
<HTML>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>

<script>
$(function(){ 

//	フォーカスを受け取ったら、enable
  $("#myarea").focus(function(){
	$("#myarea").css("background-color", "yellow");
	$("#bt1").removeAttr('disabled');
  });

//	フォーカスを失ったら、blur(→disable)
  $("#myarea").blur(function(){
	$("#bt1").blur();
  });

//	ボタンがdisableになったら、背景を変える
  $("#bt1").blur(function(){
	$("#myarea").css("background-color", "red");
	$("#bt1").attr("disabled",true);
  });

}); 
</script>

<body>
<div id="myarea" style="width:200px;height:100px;background-color:yellow;">
<BUTTON id="bt1" >ボタン</BUTTON>
</div>

</body>
</html>



■つけたし・・
blurにするより、カスタムイベントにしたほうがいいかも?

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Cassanraの日本の状況(SI案件含め)を聞き、FLMがCassandra教えてる情報提供してきた!

2014-11-27 14:56:37 | JavaとWeb
Cassandra MeetUp Tokyo Fall 2014

米国における最新事情のCassandra
・急速に普及→IoT
・業務で使ってる人→数人
・Cassandra:2つの論文
  Amazon Dynamo
  Google BigTable:HBaseにも似ているところ
 Dynamo:ノード お互いに知り合う
 データモデル:RDBMSとNoSQLの中間
・マスタースレーブの考え方は、単一障害点がある
 Cassandraは、ノードは等価なので、問題ない
  →成り代わって処理
  緑:Cassandra
  青:アプリケーション
  赤:ユーザー
 リニアにスケールする
 ダウンタイムなしにスケールできる
・インターフェース:CQL
 SQLに似てるけど

デモ:
 Go言語で書いた

・ユースケース
 OOYALA:ビデオ配信サービス HadoopからSparkへ
 eBay:レイテンシーが低い
 Dyn:DNS
 coursera:オンライン学習・進捗とか
 Netflix:動画サービス・どこまでを見たか?
 Safeway:スーパー・レコメンデーション
 CERN:物理研究
 Comcast:動画配信、SoundCloudも
 ブルーマウンテン:証券取引
 NYタイムス:キャッシュとして
 HEILO:配車最適化
 GoDaddy,Rackspace:分析
 Datadoc:監視システム
 マイクロソフト:Azureの裏でメトリックス情報
 ウェザーチャンネル:CMS
 NASA:仮想環境・セキュリティ
 GitHub、OnLive:分析

 名前がいえない会社:7万5千台

■Yahoo JapanにおけるApache Cassandraへの取り組み
・Ingress

・KVSチームの紹介
 ほとんどCassandraチーム
 開発3人、運用は数人いるが、実際1名
 YAHOO30のサービスが利用
 →最近チェックした商品

・なぜ、Cassandra
 汎用的に使えるNoSQL→特定目的では合った。運用コスト高い

・いくつかのNoSQL比較
  高いパフォーマンス、
  優れたスケーラビリティ
  SPOFが存在しない

提供形態
 HTTP
 サービス共用
 サービス専用
・HTTPインターフェース
 WebAPIでHTTP経由で
 CQLの機能が不十分。Thriftは実装コストが高い
 課題:機能追加、パフォーマンスの低下
 Cassandra使いやすくなった:CQL3

運用中の環境
 ・1.2系と2.0系
 ・利用は爆速で拡大中
そろそろSSDも
  コンシステンシーレベルQUORUM

監視
 Nagios
 Grafana

repair&compaction→Cronで提供的に

Heap使用率を
・時間経過とともに上昇し性能劣化
・1.2系以降では安定している
・DiskBusy
新サービス
・コネクション数
・リクエスト数
99パーセンタイルレイテンシ
・GC
・DiskBusy
・使い方
nodetool cleanup 大事
・データ残るだけ?
  →削除したデータが復活する
  ReplicationFactor3
  データノードはずす
  データ移動
  データノード戻す
  本のノードのごみデータそのまま
  削除リクエスト:ごみデータ残り続ける
  またデータノードをはずす
  ごみデータ戻る→削除したデータ復活

 ノード増減時にクリーンアップ

 PHPのドライバをDataStaxで→next year(β版)

・99%タイルレイテンシ:10ミリ秒
  Writeは1桁(基本的には1ミリ秒)
 →ディスクに行っているので遅い

■日本におけるCassandraを使用したSI事例
  ウルシステムズ

RDBのトレンド:Googleトレンド
  MySQL、Oracle:右肩下がり
  NoSQL、クラウド:あがっている

→NoSQLけんとう

ウルシステムズにおけるCassandraの利用について
事例:4年くらい
 JR,三菱電機、博報堂、大手放送局

IoT、M2MにNoSQLが向いている
  従来:読み込みメイン
  今:データ増えてきた
   RDBだとマスタで受ける

某放送局さん
 見ているという信号は出せる→しちょうすうが分かる
 演出、リアルタイム分かる
 国内クラウド:
 ポイント:
 サーバー足せばできるスケールできる
  →シャーディングしないでできる
   約束事さえ守れば
   クラウドに合っている

他のNoSQLとの比較:なぜCassandra
・単一障害点がない(Mongo→もんごえすがスケールしない)
・サービスが止まらない
・スケーラビリティ抜群と言い切れる
・Apacheのトップレベルプロジェクト→全世界サポート事業継続性
・Javaベース

事例:(北海道にある)フュージョン様(あのフュージョンでない)
・監視システム:止まっては困る
 IoT,M2Mに適用できる

JR東日本:えきぽプラス

SIその他メリット
・運用楽になった→おきまりの呪文をDataStaxがそろえてくれた
・ノードの再起動(ローリングで全体再起動)
・他の会社と違ったシステム提案がかける
  止まらない、負荷分散、
・拡張性
  Solr,Spark
・DSE:サポート

■CaaMS
ソフトバンクモバイル

・データスタックスさんの日本法人もできたことだし、
 しゃべります。

・おおっぴらにつぶやかないでね
(ということで、以下省略)


■おわりに

あさって、Cassandraのディープな話
vnode,メモリ等
→第28回Cassandra勉強会

https://atnd.org/events/59186

 技術側に特化した情報共有の場


■懇親会で
(原沢さんとの会話、原沢さんがA)
Q:Cassandraで、おそくなることな~い?
A:Indexを貼った場合、RDBみたいに「全部なめる!」みたいな検索をした場合

Q(というかコメント):富士通(FLM)で、Hbaseと一緒にCassandra教えているよね
(実践事例に学ぶ!ビッグデータ利活用研修の4日目「2.ビッグデータ分析基盤の理解」の中)
A:ええ(@_@!)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする