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

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

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

Tomcatのマネージャーを出す方法メモメモ

2014-07-23 18:37:35 | JavaとWeb
Tomcatの再ロード、停止などをさせたいときに、マネージャーから

実行すると便利だけど、このマネージャーを出そうとすると、パスワードとかを聞かれる。
そのための、メモメモ




■下準備

パスワードとか聞かれるので、アカウントを用意する。

TOMCATのフォルダ(=ディレクトリ、以下同じ)の下にconfフォルダがあり、
その下に、tomcat-users.xmlがある。

ここを、以下のように、

roleタグでmanager-gui,manager-script,manager-jmxを追加し、
user-roleタグで、あるユーザーにそれら権限を付与している
(ここではユーザー名root,パスワードpasswordに上記の権限などを付与)
なお、上記3つを同一のユーザーに権限付与すべきでないらしい。
(ってやってるけど)




■たちあげ
例えばbinフォルダのstartup.batをダブルクリックする等して、
Tomcatを立ち上げたら、ブラウザから、

http://localhost:8080

にアクセス。以下の画面になるので、

「manager App」をクリック

と出てくる。ここに、下準備で設定した、ユーザー名とパスワード
(例だと、rootとpassword)を入れる

そうすると、さっきのマネージャー画面になる。
停止、再ロード、配備解除?セッションの時間変更が出来るほか、
状態が表示される



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

ではFlexでリアルタイムにグラフを表示するには?-チャートコンポーネント:Flex4から無償

2014-07-23 15:20:26 | JavaとWeb
今の

ブラウザで円グラフをリアルタイムで書くには?D3.js?JQuery?canvasはないな・・
http://blog.goo.ne.jp/xmldtp/e/b3c4f40676a71e82375c2d3b56bb44c5

をFlexでやるには?

Flexは最近やったこと無いんだけど・・・

●1.まず、以下のサイトに書いてある方法で、Timerをセット、
   リスナー関数に以下の2.を記述する

(1)[Flex] Timerを使うサンプル
http://d.hatena.ne.jp/unageanu/20081004/1223112684


(2)Adobe Flex コンポーネントの作り方(1) - 光るボタンを作ろう
http://www.hakkaku.net/articles/20080725-251


●2.時間がきたら、以下のサイトにかいてある方法で、サーバーアクセス、
 データを取得する。リクエスト完了時のリスナーに以下の3.を記述する

(1)サーバーとの通信 第2回 HTTPService を利用する(1)
http://www.geocities.jp/takuji_kawata/reports/report_use_httpservice1.htm


(2)[Flex] HTTPでデータを取得するサンプル
http://d.hatena.ne.jp/unageanu/20080904/1220538353


(3)データサービスへのアクセスの概要
http://help.adobe.com/ja_JP/Flex/4.0/AccessingData/WSbde04e3d3e6474c46c45e7b4120d413dc14-8000.html


●3.Flexでグラフ表示する
 チャートコンポーネントを使う。これが、今回の話題




■Flexのチャートコンポーネント

(1)Flexでグラフを作成する時の罠
http://symfoware.blog68.fc2.com/blog-entry-67.html


(2)Flex SDKではグラフが利用でいない・・
http://blog.development-network.net/ung/2007/01/flex_sdk.html


によるとFlex2,Flex3では、チャートコンポーネントは有償で

Flex Builderで書くと、

Flex2基礎講座(第7章 チャートコンポーネントの利用)1/2
http://www.nec-solutioninnovators.co.jp/sl/umiswc/column/flex/chap7.html


のように、Flex Charting Trialと、裏にうっすらと出てしまうようだ。

ところが!Flex4になって、

Flex 4 リリース
http://d.hatena.ne.jp/kenichis/20100322/1269284953


によると、チャートコンポーネントが無償公開(=ただで使える)になったらしい
使い方は

チャートコンポーネントの追加
http://help.adobe.com/ja_JP/Flex/4.0/UsingFlashBuilder/WS6f97d7caa66ef6eb1e63e3d11b6c4cecc7-7ff4.html


にでているが

Flex SDK 4.6:既に数百の要素がある状態でチャートを動的に追加すると表示に時間がかかる
http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=5279

という話もあるらしい・・・

Flex4だと、できそうですね!!

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

ブラウザで円グラフをリアルタイムで書くには?D3.js?JQuery?canvasはないな・・

2014-07-23 11:22:33 | JavaとWeb
今、こんな話がでた。

1.サーバー側で時々刻々とデータを処理している。
  サーバー側では処理結果をテキスト(CSV)で出している

2.その結果をブラウザで見たい。
  結果は円グラフで表示される
  一定時間ごとに、サーバーデータにアクセスして書き換える。

で、どうするか




ブラウザ側で、setInterval()(もしくはsetTimeout()の繰り返し)をして、
Ajaxを使ってサーバーにアクセスして、画面を書き換えるってことはいい。

ここで、サーバー側でグラフを作ってもらって、それを表示という手も
あるっちゃあるけど、データ量が多くなりそう。

ってことで、サーバーからはCSVデータ、ないしはJSON形式でデータを受け取り、
それを、javascriptでグラフ化するのが、普通だよね・・・
という話になった。




で、そこでだ。

Javascriptでグラフ化するには、どうするのがいいんだろうね?という話。

図形といえばcanvas!だけど、円グラフは、arcが扇型に塗りつぶして
くれなさそうなので
これはないということで・・

まあ、最近はなんでもJQueryだけど・・・

商用利用が可能な、グラフを描画するjQueryプラグイン6選

にいろいろまとまってますね。
・Chart.js
・Google Charts
・YUI Charts
・jQPlot
・gRaphaël
・morris.js
をあげていて、Chart.js押しみたい。

でも、グラフ化といえば、D3.jsもあるよね!

D3.jsで円グラフを描く
http://blog.qaramell.com/archives/6011


う~ん、なるほど・・・・

後は思想・信念・信条で選ぶという感じですかね・・・


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

タブ切り替え画面やダイアログはJavascript,CSS等で簡単に作れるけど、お金は?

2014-07-18 13:42:31 | JavaとWeb
って考えたとき、1画面何人月?→1画面いくら、
という概念が、根本的に崩壊してしまうという問題が生じる。




具体的に言うとこうだ。

以下のような画面が、最近流行だ。

ここで、タブ2をクリックすると

な感じで、タブ切り替えで画面が変わり、
ここで「2を開く」をクリックすると

な感じでダイアログ(サブ画面)が開き、
ここで「閉じる」ボタンをクリックすると
もとにもどる。




このプログラム、実は以下のとおりだ
JQueryを外部リンクしているけど、
それ以外は、他のソースを参照していない

なお、以下のサイト、本を参考にしている。
【参考文献】
<<タブ関連>>

タブメニューの作り方(1)
http://www.1uphp.com/con2/menu/tab11.html


<<ダイアログ関連>>
現場で役立つ JQueryデザインパーツライブラリ,MdN,2013
chapter2 シンプルなダイアログボックス pp91

<!DOCTYPE html>
<html lang="ja">
<HEAD>
<script type="text/javascript" 

src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<style type="text/css">
<!--

/* タブの設定 */
li  {float:left;display:block;}
ul  {margin:0px;}

.on  {
      background-color:#ff3333;
      width:100px;
      height:26px;
      margin-right:5px;
      text-align:center;
     }

.off {
      background-color:#ffcccc;
      width:100px;
      height:26px;
      margin-right:5px;
      text-align:center;
     }

.box
    {
     clear:both;
     border-top:solid 10px #ff3300;
     border-bottom:solid 1px #ff3300;
     border-left:solid 1px #ff3300;
     border-right:solid 1px #ff3300;
    }

/* ダイアログの設定 */
.mask {
	display:none;
	position:absolute;
	background-color:#000;
	left:0;
	top:0;
	z-index:1;
	width:100%;
	height:100%;
} 

.dialog {
	display:none;
	position:fixed;
	background-color:#fff;
	left:100;
	top:100;
	z-index:2;
	width:300px;
	height:250px;
	padding:10px;
	box-shadow:0 0 6px #000;
	border-radius:5px;
}
-->
</style>

<script type="text/javascript">
$(function(){
	
	//==============================================//
	//	修正箇所				//
	//==============================================//
	//	タブの最大数を設定
	maxtabno	=	3;
	//	はじめに表示するタブを設定
	disptabno	=	1;


	//**********************************************//
	//	タブ関連処理				//
	//**********************************************//
	for(i = 1 ; i <= maxtabno ; i ++)
	{
		settabid = "#li" + i;
		setboxid = "#box" + i;
		if ( i == disptabno)
		{
			$(settabid).addClass("on");
			$(setboxid).css("display","block");
		}
		else
		{
			$(settabid).addClass("off");					

			$(setboxid).css("display","none");
		}
	}	

	$('.tab').click(function(){
		nowtabid =  $(this).attr("id"); 
		no = nowtabid.substring(3);
		if ( disptabno	==	no )
		{
			//	現在表示されているタブをクリック
			return;
		}

		for(i = 1 ; i <= maxtabno; i ++ )
		{
			chktabid = "#li" + i;
			chkboxid = "#box" + i;
			if ( i == no)
			{
				//	タブをOFFからONに
				$(chktabid).removeClass("off").addClass("on");
				//	画面表示
				$(chkboxid).css("display","block");

			}
			else if(i == disptabno )
			{
				//	タブをONからOFFに
				$(chktabid).removeClass("on").addClass("off");
				//	画面を隠す
				$(chkboxid).css("display","none");
			}
		}
		disptabno	=	no;
	});		


	
});

	//**********************************************//
	//	ダイアログ関連処理			//
	//**********************************************//
	// ダイアログ表示関数
	function disp_dlg(dlgid)
	{
		var windowW = $(window).width();
		var windowH = $(window).height();
		var nowdlgid = "#" + dlgid;
		//ダイアログの位置
		$(nowdlgid).css({
			'left':windowW/2-$(nowdlgid).width()/2,
			'top':windowH/2-$(nowdlgid).height()/2
		});
		//ダイアログと背景を表示
		$('.mask').fadeTo("slow",0.5);	
		$(nowdlgid).fadeTo("slow",1);	
	}

	//ダイアログ非表示関数
	function close_dlg()
	{
		$('.dialog,.mask').hide();
	}		

</script>

<TITLE>テスト</TITLE>
</HEAD>
<BODY>

<ul>
<li id="li1"><div class="tab" id="tab1">タブ1</div></li>
<li id="li2"><div class="tab" id="tab2">タブ2</div></li>
<li id="li3"><div class="tab" id="tab3">タブ3</div></li>
</ul>
</div>

<div class="box" id="box1">
<H1>ボックス1</H1>
参考: http://www.1uphp.com/con2/menu/tab11.html
<p/><BUTTON onclick="disp_dlg('dialog1')">1を開く</BUTTON>
</div>

<div class="box" id="box2">
<H1>ボックス2</H1>
<p/><BUTTON onclick="disp_dlg('dialog2')">2を開く</BUTTON>
</div>

<div class="box" id="box3">
<H1>ボックス3</H1>
<p/><BUTTON onclick="disp_dlg('dialog3')">3を開く</BUTTON>
</div>


<div class="mask" id="mask1"></div>

<div class="dialog" id="dialog1">
 <H1>ダイアログ1</H1>
 <BUTTON onclick="close_dlg()">閉じる</BUTTON>
</div>
<div class="dialog" id="dialog2">
 <H1>ダイアログ2</H1>
 <BUTTON onclick="close_dlg()">閉じる</BUTTON>
</div>
<div class="dialog" id="dialog3">
 <H1>ダイアログ3</H1>
 <BUTTON  onclick="close_dlg()">閉じる</BUTTON>
</div>


</BODY>
</HTML>





そして、このプログラムに、タブを足すには、以下のことをすればよい

●Javascript内
・maxtabnoに、タブの数をセットする。上記の例(3つ)に1つ足すと、
maxtabno = 4;
・disptabnoに、何番目のタブを表示するかをセットする
 (通常は1)

●BODY内
・タブについて
liタグのところに、1個追加する。idにli+次の番号をセットし、
  divのクラスはtab,idにtab+次の番号をセットする。
  例えば上記の例(3つ)に1つを足すと
<li id="li4"><div class="tab" id="tab4">タブの言葉</div></li>
(<>は、本当は半角。以下同じ)
を追加する

・ボックスについて
div class=boxで、idにdiv+次の番号のものを追加する
 上記のタブに対応するボックスを作成すると、
<div class="box" id="box4">
追加したボックス
</div>

これで、タブが追加される。




このプログラムにダイアログを追加するには、以下のようにする
●BODY内
・ダイアログを開くボタンを追加し、disp_dlg('ダイアログid')を呼ぶ
 たとえば、dialog4というダイアログをつくるには

<BUTTON onclick="disp_dlg('dialog4')">2を開く</BUTTON>

を、どこかに書く(もちろん、開いて見えるところに)

・ダイアログを追加する
 そして、開くダイアログを追加する。
 クラス名dialog,idは、上記開くボタンで指定したもの(ここではdialog4)

・閉じるボタンを作成し、close_dlg()を呼ぶ
 そのダイアログのどこかに記述する(そうしないと、閉じられない)

上記2つをまとめて書くと、こんなかんじ
<div class="dialog" id="dialog3">
だいあろぐ4
 <BUTTON onclick="close_dlg()">閉じる</BUTTON>
</div>




このように、画面は、ほぼHTMLで簡単に作れてしまう。

この場合、ダイアログ1個を1画面とみて、1週間とか、かけるのか?
すべての(タブで表示されるのも含め)画面を1本と見るのか?

見方によって、費用が大幅に異なってしまう。
以前の開発は、前者を元にお金をとっていると思うけど・・・
そうすると、最近の画面は相当高価になってしまう。。。
(ってか、交渉上、それはないな・・・)


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

Struts1からStruts2への移行方法 -その3:struts1から2へ移行の際のポイント

2014-05-02 12:30:54 | JavaとWeb

Struts1からStruts2への移行方法 -その1:お題(struts1の場合)
http://blog.goo.ne.jp/xmldtp/e/243939338fda96dab7057d0afce7f842

で示したstruts1の事例をStruts2に移行したらどうなるかということについて

Struts1からStruts2への移行方法 -その2:struts2に移行(struts2のソース)
http://blog.goo.ne.jp/xmldtp/e/8dd08a117eacbfac6f3a70483e375cdd

で示した。

struts2の手順については、struts1と比較し、どうなるかについて
すでに書かれているサイトもあるので、

ここでは、移行の際のポイントについて、記述してみたいと思う

■1.JSPのタグの違い

struts1とstruts2では、タグがまったく違う。struts2におけるs:で始まるタグは、
たしかに、struts1のhtml:で始まるタグに対応は付くのだが、

・s:のタグがJSPに展開されたとき、ちょっと思いもよらない展開になることも・・
・EL式がs;タグ内でかけず、OGNL式で記述することになるが、これの表現力

ということで、簡単に移行できるとは、限らない(とくに難しいことをしていると)


■2.Struts1のActionForm+ActionがStruts2のAction
 という構図になっているが、じゃあ、コピペすればいいだけかというと、
 そうでもない。Struts1の場合、ActionFormの値を移し変えることがあるが
 その部分が要らなくなる。

■3.Actionの中(とくにsession)
 Actionの中にも違いがある。sessionがsessionAwareに変わっているのだが、
単純に変わったのでなく、構造も違うので、例えばsessionのIDを使っている場合
とか、いろいろ面倒なことが起こる(struts2のセッション取得方法はsessionAware
が多いが、実はほかにもやり方がある。それらを利用しないといけないかも?)

■4.いろいろ変わったことをしている場合
ファイルダウンロード、2度押し防止などのやり方は、ちがてくるかな・・
で、とくに・・・

■5.struts.xml
struts.xmlは、ゼロ・コンフィグレーションを使えば書かなくてすむ・・・
が、ファイルダウンロードのとき、デフォルトが結構小さく、このデフォルトを
かえるのに・・・

 ・・・今回の脆弱性も、はじめstruts.xmlで対応する案が出されていた。
 省略できるとは、限らなかったりする。

ってなかんじで、結局、全部見直しになる。
これだと、3分間クッキングというよりは、3ヶ月くらいかけて・・・
となり、簡単に移行できない。
いっそのこと、Strutsをやめる・・・という選択肢のほうが、早く移行できるかもしれない。


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

Struts1からStruts2への移行方法 -その2:struts2に移行(struts2のソース)

2014-05-01 18:47:10 | JavaとWeb
先ほどの

Struts1からStruts2への移行方法 -その1:お題(struts1の場合)
http://blog.goo.ne.jp/xmldtp/e/243939338fda96dab7057d0afce7f842

のつづき。
上記エントリでは、struts1.xのソースを示したが、
今回はそれを、Struts2に移行した場合の完成品のソースを示す。

まず、上記の「その1」をStruts2に移行した
完成品のソースは、以下のものとなる

・JSP
 index.jsp,ans.jsp)

・設定ファイル
(WEB-INFの下) web.xml
(WEB-INF/classesの下)  struts.xml(struts-conf.xmlとおき場所が違うので注意!)

・プログラムファイル
 TashizanBean.java

また、ライブラリ

を置き換えないといけない。
今回は、以下にソースを載せ、ライブラリ置き換えについて等は、
次エントリで説明する。

●index.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<HEAD>
<TITLE>HelloTest</TITLE>
</HEAD>
<BODY>
<s:form action="tashizan.action"  theme="simple">
	<s:textfield name="add1"/>+<s:textfield name="add2"/>
	<br/>
	<s:submit type="button"  value="実行" />
</s:form>
</BODY>
<html>



●ans.jsp

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



●web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Struts Blank</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

</web-app>


●struts.xml(struts-conf.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="tashizans2" namespace="/" extends="struts-default">
<action name="tashizan" class="struts2test.TashizanBean">
<result name="success">/ans.jsp</result>
</action>
</package>

</struts>



●TashizanBean.java

package struts2test;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class TashizanBean extends ActionSupport implements SessionAware {
// TashizanActionFormに相当
private String add1;
private String add2;
public String getAdd1() {
return add1;
}


public void setAdd1(String add1) {
this.add1 = add1;
}


public String getAdd2() {
return add2;
}


public void setAdd2(String add2) {
this.add2 = add2;
}


private Map session;
public void setSession(Map session) {
this.session = session;
}


public String execute()
{
//======================================//
// 入力 //
//======================================//
// 引数取得
// セッションの取得

//======================================//
// 処理 //
//======================================//
int su1=0,su2=0;
try
{
if ( add1 != null)
{
su1=Integer.parseInt(add1);
}
}
catch(Exception e)
{
}
try
{
if ( add2 != null)
{
su2=Integer.parseInt(add2);
}
}
catch(Exception e)
{
}

int ans = su1+su2; // 足す



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

return SUCCESS;
}


}


(TashizanAction.javaとTashizanActionForm.javaをあわせたもの)

次エントリでは、上記移行の手順について、簡単に触れる

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

Struts1からStruts2への移行方法 -その1:お題(struts1の場合)

2014-05-01 16:46:30 | JavaとWeb
Struts1の脆弱性の問題

Struts1.X系に脆弱性の続きーもとはStruts2系の脆弱性(中間報告:その1)
http://blog.goo.ne.jp/xmldtp/e/eaeeba0f8c4a6ed91d832e79068557c2

を書いてから、Struts1からStruts2への移行に、皆さん関心あるらしく、

StrutsとStruts 2の違いを、必要なファイルの立場から見る
http://blog.goo.ne.jp/xmldtp/e/b2b5f4f3904834f210e1ba0d3f45c8ac?fm=entry_awp

のアクセスが増えている。

しかし、実は、そこに書かれているよりも、移行には、かなりの手間がかかるので、
ものすごく簡単な例を挙げて、それでもこんだけ大変なんだよというのを示す。

結論から言ってしまうと、
今、脆弱性を対処する方法については、このブログでもわかりにくく
あるいは、分かりやすく書かれているサイトがあるので、それに沿って暫定対処し、
Struts以外の移行も含めて、時間をとって考えたほうがいい。
3分クッキングのように簡単にはいかない。

以下、移行方法を記す




■お題

Struts1で作成した足し算サイト

と入力すると

と書き出すサイトについて考える




■Struts1の場合のリソース

Struts1では、
・JSP
 index.jsp,ans.jsp(回答)

・設定ファイル(WEB-INFの下)
 struts-config.xml
 web.xml(一般には書き換えない/脆弱性のためには修正必要)

・プログラムファイル
 TashizanActionForm,TashizanAction

が必要になる。
ここで、web.xml以外の上記ファイルについて、以下に示す。

●index.jsp
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<HEAD>
<TITLE>HelloTest</TITLE>
</HEAD>
<BODY>
<html:form action="/tashizan">
<html:text property="add1" />+<html:text property="add2" />
<BR/>
<html:submit property="submit" value="実行"/>
</html:form>
</BODY>
</html:html>


●add.jsp

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>

<HTML>
<HEAD>
<TITLE>足し算</TITLE>
</HEAD>
<BODY>
<bean:write name="ans" /><BR>
<A HREF="index.jsp">戻る</A>
</BODY>
</HTML>


●struts-config.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>

<!-- ================================================ Form Bean Definitions -->

<form-beans>
<form-bean name="TashizanForm" type="struts1test.TashizanActionForm"/>
</form-beans>

<!-- =========================================== Action Mapping Definitions -->

<action-mappings>
<action path="/tashizan"
type="struts1test.TashizanAction"
name="TashizanForm" validate="false">
<forward name="success" path="/ans.jsp"/>
</action>
</action-mappings>

</struts-config>


●TashizanActionForm.java

package struts1test;
import org.apache.struts.action.ActionForm;
public class TashizanActionForm extends ActionForm {

private String add1;
private String add2;

public String getAdd1() {
return add1;
}
public void setAdd1(String add1) {
this.add1 = add1;
}
public String getAdd2() {
return add2;
}
public void setAdd2(String add2) {
this.add2 = add2;
}

}


●TashizanAction.java

package struts1test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class TashizanAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

//======================================//
// 入力 //
//================================//
// 引数取得
TashizanActionForm myForm = (TashizanActionForm)form;
String add1 = myForm.getAdd1();
String add2 = myForm.getAdd2();

// セッションの取得
HttpSession session = request.getSession(true);


//======================================//
// 処理 //
//======================================//
int su1=0,su2=0;
try
{
if ( add1 != null)
{
su1=Integer.parseInt(add1);
}
}
catch(Exception e)
{
}
try
{
if ( add2 != null)
{
su2=Integer.parseInt(add2);
}
}
catch(Exception e)
{
}

int ans = su1+su2; // 足す


//======================================//
// 出力 //
//==================================//
// セッション書き出し
session.setAttribute("ans", String.valueOf(ans));

return (mapping.findForward("success"));
}
}





■Struts2での変更箇所
・JSPは、タグが変わる(s:で始まるタグになる)
・struts-configの内容をstruts.xmlで記述
・TashizanActionFormの内容をTashizanActionに記述
・TashizanActionのセッション処理が変わる(sessionAware)反面、
 パラメータは意識しなくてよいように修正
・web.xmlは入れ替え
・libの内容も入れ替え

つまり、全ファイル修正(^^;)

修正結果は、次エントリ(その2)で

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

Java8ダウンロード、する?

2014-03-24 13:00:26 | JavaとWeb
いや、出てるんだよね~、Java8.
ここからダウンロードできるみたいなんだけど・・・

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

(NetBeans8もダウンロードできる。ただし、普通の日本のJavaのダウンロードサイトにいくと、JDK7しかダウンロードできない)

う~ん、どっしよっかな~



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

JavaでSHA1とか・・・ その1

2014-03-20 17:05:12 | JavaとWeb
JavaでSHA1とか、どーやって書くんだろうと思って調べてみた。

以下のサイトにやり方が書いてあった。
[1]JavaでSHA-1とか使って暗号化する
http://d.hatena.ne.jp/liquidfunc/20100930/1285775071


[2]Javaで、SHA-1ハッシュを作ってみる
http://blog.tarotaro.org/archives/813


そのサイトを参考にして、結局、ソースはこんな感じ
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;

// SHA1に変換
public class HashTest1 {
	public static void main (String args[])
	{
		//	パスワード設定:本来は、args[0]などからとってくる
		String password="password";
		MessageDigest md=null;

		//	メッセージダイジェストの生成
		try {
			md = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return;
		}

		//	ハッシュの作成
		md.update(password.getBytes());
		byte[] digest = md.digest();

		//	パスワードとハッシュ値の表示
		System.out.println("パスワード:"+password);
		System.out.println("ハッシュ値:"+ String.valueOf(Hex.encodeHex(digest)));
	}
}


なお、最後のところにHexというクラスが出てくるが、これは
Apache commonsのcodecの中にある。

以下から入手できる

Download Apache Commons Codec
http://commons.apache.org/proper/commons-codec/download_codec.cgi


そのサイトにいくと

とあるから、commons-codec-1.9-bin.zipをダウンロードして解凍、
中に、commons-codec-1.9.jarが入っているから、それに、パスを
通す。


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

JavascriptのRail化はYeoman,フレームワークはbackboneでOK?

2014-03-02 17:15:24 | JavaとWeb
3月1日、OSC 2014 Tokyo/Springにいってきて

業務アプリケーションにおけるモダンWeb開発の現状
~HTML5開発って簡単なの~
(デブサミ2014でJavaからJavascriptへ!HTML5運用から見た次世代業務アプリケーションを講演した佐川さんの講演)

を聞いてきた。その内容をメモメモ




・HTML5はただのテキストファイル
・エディターがあれば何でもできる
  CSSはてきとーに書けばてきとーに動いてくれる
  Javascriptもてキトーに書けば
 →2000年頃から、

      ほんと?

・HTML4.0
 文字表示、フォームタグ・・・しかつかわれてない
 ロジカルな部分:JSPとか

・HTMLをコーディングするということは、やっていたか?

・HTML5は簡単
  HTML  CSS←Sass←Compass

  Javascriot←Coffee Script
    ↑
   backbone←underscore JQuery rrequire
   yuidoc,jsmin,mocha,chai,easymock

 Image

CSS
  やることいっぱい、おぼえられない
  ベンダープリフィックス:書き方微妙に違う
  →SassとかCompassとか使ってツールでやる

Javascript
  どこまでかけますか?
  ソーシャル系は書けるけど、業務系の人は・・・
  ===を==で書いてしまったり、
  returnの返り値を返さなかったり
  CoffeeScriptを使うと、それなりに・・・
 alt.jsという

フレームワーク
  どこにかくか
    backbone:なにもない,JQueryで

ドキュメント
  yuidoc

サイズを小さく
  jsmin:圧縮

テスト
  mocha,chai,じゃすみん

Mockサーバーを立てる
  easymock

想像以上に技術要素ないですか?

CSSについて
・どこがCSSでしょうか?
・CSSの中身をのぞいてみる
・ベンダープレフィックス
・ちょっと大変じゃない?

開発環境のおはなし
・多くのアーキテクチャをどうやって開発するか
  YEOMAN http://yeoman.io/

Yeoman
Google社が作成した総合開発ツール群
  yo(雛形作成ツール)
  grunt(タスクランナー)
  bower(フロントエンドパッケージマネージャー)

開発の大まかなながれ
1yoによるひながた
2grund server
3grund build
javaのmavenみたいなもん

つかってみる:インストール
npm install -g yo
npm:nodeの

yo
generatorはどのくらいあるの?
http://yeoman.io/community-ganarators.html

backbone.js

Single-page Application(SPA)
・単一ページによるWebアプリケーション
・ページはDOMの操作により切り替える
・サーバーはWebsocketとか

yo backbone:view view名 --coffee

bower
 twitterw社が作ったパッケージマネージャー

依存関係およびライブラリの情報を管理するファイル
  bower install

grunt:タスクランナー
  http://gruntjs.com/plugins
  gruntにはpackage.jsonとGtuntfile.js画必要
   package.json
      必要なパッケージ管理
Gruntfile.js
   タスクを定義したファイル

もっくかいはつ
   もっくサーバーを構築すると、めんどうなAPIサーバーを立てなくてよい

なるべくかんたん
つづきは、306教室で

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

サーブレット等で、同一ブラウザでユーザーごとにセッションの中身を替えたい

2014-02-21 17:20:23 | JavaとWeb
品質は後付けできる

1つのブラウザで、複数タブを使った場合、サーバー側では、同一セッションになる。
ということは、

・はじめ、ユーザー名xmldtpでログインしておき、
 その後、新たなタブでウィリアムとログインしても、
 同じセッションが使われる

・はじめ、ユーザー名xmldtpでログインしておき、
 その後、新たなタブでxmldtp(と同名で)ログインした場合、
   (1)先にログインしているからエラー
   (2)後でログインしたものを優先し、セッションを作り直す
 のどちらもできる。ただし、(2)でセッションを作り直した後に、
 はじめ操作していたタブでアクセスすると(2)で新しいセッション
 になっているのでおかしくなる可能性がある(場合によっては落ちる)




■お題

ここで、

xmldtpでログインすると、

のように、アクセス回数とセッションIDを返すプログラムで、
何回もxmldtpでアクセスして

のようになった状態で、

のように、新たなIDでログインすると

のように初期化され

と戻すと

のように前の値を持ってくることを考える

※上記のセッションIDを見ると、みんな同じ。つまり、値は変わっているが、
 同一セッションを使いまわしている




■概要

Tomcat7で指定URLのみクッキーを無効に
http://questionbox.jp.msn.com/qa7881678.html

の「ANo.3」に書かれているとおり。つまり、

・Filterに、ハッシュマップをstaticで用意する(=全体で1個)、
  →そのハッシュマップには、
    キーはログイン名、値は保存したい値を持っておく

・FilterのdoFilterで、
   パラメータから、ログイン名をチェック
   上記ハッシュマップに値が入っていたら、その値をセッションに入れる
   →ここで、ログイン名ごとに、セッションの値が入れ替わる

・セッションのリスナーで
   セッションの値が書き換わったら、上記ハッシュマップの値も書き換え

・セッションが破棄されれたら、上記ハッシュマップのログイン名のデータも破棄

ということをする。




■お題に関係ない部分

お題に関係ない、はじめの画面は、こんな感じのJSP(index.jsp)
<html>
<head>
<title>MySession</title>
</head>
<body>
<form method="post" action="kekka.jsp">
login name<input type="text" name="loginName"/>
<input type="submit"/>
</form>
</body>


ここで、ログイン名を入れているので、上記フィルタにより、
noの値がログイン名ごとに入れ替えられ
結果表示のJSP(kekka.jsp)

<%

int ino;

String no = (String)session.getAttribute("no");
if ( no == null )
{
ino=0;
}
else
{
ino = Integer.parseInt(no);
ino++;
}
session.setAttribute("no",String.valueOf(ino));
%>

<%=ino%>
<%=session.getId()%>


にわたる。ここでnoに1足すと、リスナーが呼ばれる。

ここまでは、あまり今回のお題に関係ない




■セッションの値を入れ替える部分:フィルタ

フィルタの値を入れ替えるJavaプログラムMyFilter1.javaはこんなかんじ。

package mytomcat1;

import java.io.IOException;
import java.util.HashMap;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class MyFilter1 implements Filter {
static HashMap<String,String> svdata = new HashMap<String,String>();
@Override
public void destroy() {
// TODO 自動生成されたメソッド・スタブ

}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

// http://www.javaroad.jp/servletjsp/sj_servlet10.htm
HttpServletRequest myreq = (HttpServletRequest)req;

HttpSession session = myreq.getSession();
String loginName = myreq.getParameter("loginName");

// セーブ領域から、データ復元
if ( loginName != null)
{
String no = svdata.get(loginName);
if ( no == null)
{
no = "0";
}
session.setAttribute("loginName",loginName);
session.setAttribute("no", no);
}

chain.doFilter(req, res);

}

@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO 自動生成されたメソッド・スタブ

}

}





■値が書き換わったとき:リスナー

セッションの値が書き換わったら、セーブしてあるデータも書き換える
MyFilterListener1.javaはこんなかんじ

package mytomcat1;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyFilterListener1 implements HttpSessionListener,
HttpSessionAttributeListener {

@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
}

@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {

}

@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// http://www.javaroad.jp/servletjsp/sj_servlet9.htm
// セッションが変更されたら、保存しているデータも変更
HttpSession session =arg0.getSession();
String loginName = (String)session.getAttribute("loginName");
String no = (String)session.getAttribute("no");
if ( loginName != null)
{
if ( no == null)
{
no = "0";
}
MyFilter1.svdata.put(loginName,no);
}


}

@Override
public void sessionCreated(HttpSessionEvent arg0) {
}

@Override
public void sessionDestroyed(HttpSessionEvent arg0) {

// セッションが削除されたら、保存しているデータも削除
HttpSession session = arg0.getSession();
String loginName = (String)session.getAttribute("loginName");
if ( loginName != null)
{
MyFilter1.svdata.remove(loginName);
}
}

}






■web.xml

フィルターとリスナーをweb.xmlに登録する。こんな感じ

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Test Servlet</display-name>
<description>Test Servlet</description>
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>mytomcat1.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>mytomcat1.MyFilterListener1</listener-class>
</listener>
<servlet>
<servlet-name>MyServlet1</servlet-name>
<servlet-class>MyServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet1</servlet-name>
<url-pattern>/MyServlet1</url-pattern>
</servlet-mapping>
</web-app>






■つけたし

(A)以上でできるのだが、これを実行すると

のように、違うブラウザでも、ログイン名が同じだと、同じセッションデータ
を使ってしまう。これはこれでいいかもしれないが、いけない場合、
ログイン名のほかにセッションIDを足したものをキーとすればよい

(B)後がちにするには、保存しているデータに、ログイン時間を持ち、
  サーバーアクセスする際には、ログイン名とログイン時間を常に
  パラメータで渡す。ログイン名は一致するが、ログイン時間が一致
  しない場合は、後からログインされたものとみなして、
  すぐに終了処理をするなり、セッションにその旨の値を入れる

(C)ユーザーAがログインしたら、B,Cはキャンセルという場合、
 ユーザーAがログインしたら、ハッシュマップのB,Cデータを
 消せば、B,Cがアクセスしたとき、ログインデータをなくせる

(D)これは、排他制御はしていない。したがって、同時アクセスされるとおかしくなる。
 排他制御をするなら、ハッシュマップの(上記のソースだとsvdataの)ログイン名と
 値を直接変更し、その際排他制御をし・・・とかいうと、セッションそのものを
 自作しているのと、なんらかわらない(^^;)




■いいたいこと

で、いいたいことは、このやりかたでなく、
ユーザーごとにログインしたいとか、(A),(B),(C)のバグ修正
をするとしても、基本的に1を足すというロジック部分は変わっていない
(変わっているのはセッション部分で、主にフィルターとリスナーの中)
つまり、ロジック部分を分離すれば、あとは入出力部分で品質は変えられる。

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

リンク先に、後から情報を載せるJQuery

2014-02-19 17:30:28 | JavaとWeb
デブサミ2014の

【14-B-2】グリーを支えるデータ分析基盤の過去と現在
http://www.slideshare.net/devsumi/14b2

の21シート目

おお、これ「かわゆい」作ってみましょう!




■お題

あるサイトをみると、リンク先に、アクセス遷移結果などが
でるというもの。
つまり、

と外部にたいしては表示しているけど、
社内では

のように、遷移したパーセントが見えるというもの。




■前提

・あるページに対して、すべてのリンク先と、遷移したパーセントを
 JSON形式で返すWebAPIなり、データファイルなりがあるとする。

 たとえば、今、ページのIDが123だとすると、

 data123.txt

 というファイルの中に、

{
	"http://www.yahoo.co.jp": "23.4%",
	"http://www.google.co.jp": "76.6%"
}  


のように、ページID123のページ内で、Aタグで書かれているリンク先URLと
遷移したパーセントをJSON形式で書いてある。

なお、ブラウザはIE7




■やることの概要

(1)上述のリンク先とパーセントを返すサイトにAJAXでアクセスする

(2)その結果を受け取ったら、
    $.each($("A"),function () {
   で、すべてのリンク先に対して
      2-1 リンク先URLを取得し
      2-2 位置を取得し
      2-3 $(this).offset()で、絶対位置を取得
      2-4 DIVタグで書き出す。そのとき、
        読み込みデータ[リンク先URL] 
        で、書き出すパーセントが取得できる。

(3)表示用に、適当にCSSを作って、クラス設定しておく




■ソースファイル

こんなかんじ

<!doctype html>
<HTML>
<head>
<style type="text/css">
.mymsg {
background: yellow;
opacity:0.8;
filter: alpha(opacity=80);
z-index:100;
position:fixed;
}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
mydataurl="data123.txt";
$(function(){
$.ajax({
type: "POST",
url: mydataurl,
dataType:"json",
success: function(msg){
draw_msg(msg);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
msg="--- Error Status ---";
msg=msg+"\n"+"status:"+XMLHttpRequest.status;
msg=msg+"\n"+"statusText:"+XMLHttpRequest.statusText;
msg=msg+"\n"+"textStatus:"+textStatus;
msg=msg+"\n"+"errorThrown:"+errorThrown;
alert(msg);
}
});
});

function draw_msg(msg)
{

$.each($("A"),function () {
myurl=$(this).attr("HREF");
myoffset=$(this).offset()
toppos=myoffset.top;
leftpos=myoffset.left;
mystyle ="top:"+toppos+"px;left:"+leftpos+"px;";
buf= "<DIV class='mymsg' style='"+mystyle+"'><B>"+msg[myurl]+"</B></DIV>";
$(this).prepend(buf);
});
}

</script>
</head>
<body>

<A HREF="http://www.yahoo.co.jp"><B>やふー</B></A>
<A HREF="http://www.google.co.jp"><B>ぐーぐる</B></A>
</body>
</html>






■ちなみに・・・

これだと、常に出てしまうので、

<script>
mydataurl="data123.txt";

以下の、関数をかいてあるところを

<script>
mydataurl="data123.txt";
</script>
<script src="mymsg.js"></script>

のように、mymsg.jsという別ファイルに追い出し、

・外部に公開するときにはmymsg.jsの中身を空っぽ
 にしておく→ふつうにリンクしか出てこない

・社内で使う場合は、mymsg.jsの中に、scriptタグの中
 $(function(){
  $.ajax({
  :

 function draw_msg(msg)
  :
を書いておく

・なお、サイトによって、ajaxでアクセスする先
 mydataurl="data123.txt";
 のdata123.txtが変わる。

・では、あるサイトに、どのようなリンク先があるというのを、
 どうやって登録するのか?

 mymsg.jsに、1回だけ
$.each($("A"),function () {
    URLを取ってきたら、
    AJAXで、サーバーのリンク先登録APIを呼び出す
 }

 みたいな感じを書けばいい。
 そのプログラムがおわったら、mymsg.jsを上記の
 「社内で使う場合」のものに、置き換える。


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

Interstage Application ServerのW-SEを入れる人は、構成にさらに注意!!!

2014-01-17 09:53:38 | JavaとWeb
昨日、

富士通のWebソリューションの生死(天国と地獄)は、たった一言できまる!

を書いた。

そこに、Interstage(バージョン11.1)は
  ・Apache 2.2
  ・Tomcat 5.5
  ・JavaEE 5
  ・JavaEE 6
の4種類のWebサーバーが建てられる。
ただ、JRE7が選べるのはJavaEE 6のみというのを書いた。


ここで・・・だ。

Interstageは、実は松竹梅があって、
  ・Enterprise Edition 松
  ・Standerd-J Edition 竹
  ・Web Server Editon 梅
の3エディションある。以下、EE,S-JE,WSEと略す。

WSEが一番安いので、JavaEEはいらない、サーブレットが動けばいい!
という人はWSEを選びやすい。

で、ここで問題なのだ・・・
富士通の人によーく聞かないと、あとで、「当然、そうだよね!」と
思っていたことに、大どんでん返しを食らう!!




さて、この3エディションの機能内容、こんな風になっている。


http://interstage.fujitsu.com/jp/apserver/function/
の「機能一覧表」より。

注目したいのは、

「JavaEE実行環境はWSEは提供していない」ところと、
サーブレットのサポートは「GlassFishベースの」と書かれて

いるところだ・・・




実は、WSEのインストールは、機能別とパッケージ別の2つのインストール
方法があり、パッケージインストールの場合は、以下のようになっている。
(途中から。関連のあるところのみ)

インストール方法を選択してください。(1: 標準, 2: カスタム) [1,2,q]:  2
機能選択またはパッケージ選択を選択してください。(1: 機能選択, 2: パッケージ選択) [1,2,q]:  2
Packages:
    1 FJSVtdis      The operational commands for Interstage
    2 FJSVextp      Transaction Processing Monitor
    3 FJSVjdk6      Fujitsu Java Development Kit 6
    4 FJSVisjee     Interstage Java EE
    5 FJSVsclr      Securecrypto Library RunTime
    6 FJSVsmee      S/MIME & EE Certificate Management Package
    7 FJSVisscs     Interstage Secure Communication Service
    8 FJSVxmlpc     Fujitsu XML Processor
    9 FJSVjdk7      Fujitsu Java Development Kit 7
   10 FJSVtd        TransactionDirector
   11 FJSVod        ObjectDirector
   12 FJSVssoaz     Interstage Single Sign-on Business server
   13 FJSVssocm     Interstage Single Sign-on Common Library
   14 FJSVjs2su     Interstage JServlet (OperationManagement)
   15 FJSVihs       Interstage HTTP Server
   16 FJSVisjmx     Interstage JMX Service
   17 FJSVj2ee      Interstage J2EE Common Resource
   18 FJSVjs5       Interstage JServlet (Tomcat 5.5 based servlet service)
   19 FJSVisgui     Interstage Management Console
   20 FJSVahs       Interstage HTTP Server 2.2
   21 FJSVwsc       Web Server Connector(for Interstage HTTP Server 2.2)
   22 FJSVpcmi      Process Continuity Management Infrastructure
   23 FJSVisje6     Interstage Java EE 6



ここで、サーブレットにTomcatを選ぼうとすると・・・
Interstageのマニュアル

Interstage Application Server Enterprise Edition V11.1.0
http://software.fujitsu.com/jp/manual/manualindex/p13000438.html


インストールガイドのPDFの16ページをみると、たしかにTomcat5.5ベースの・・・と書いてある(下図)けど・・・


よーくみてほしい、インストールパッケージFJSVejb(EJBのパッケージ)って、上にあります?ないですよね・・・たしかに、FJSVjs5はあって、これがTomcatなんだけど、これをインストールしても、パッケージは足りなくて、FJSVejbとかもインストールしないといけないんです。でも、そのパッケージははいっていません。。。

・・・つまり、WSEで、Tomcatは動きません!

ええええ(@_@!!)と思っているそこのアナタ、
見ているマニュアルが違います!

WSEの場合は、そっちのマニュアルではなくて、

Interstage Web Server Express V11.1.0
http://software.fujitsu.com/jp/manual/manualindex/p13000440.html
です。

そこのインストールガイドみてください。4ページ

ってなってて、Tomcatってないでしょ!
上の機能一覧表にも、「GlassFishベースの」と書いてあって、Tomcatって書いてないですよね・・・

・・・そういうことです。




で、問題なのはここからです。

上記の通り、サーブレットでインストールする場合、JDK6を使うことになります。
JDK7を使いたい場合には、JavaEE6を入れないといけないのでした。

で、JavaEE6なのですが・・・マニュアルによると・・・(7ページ)

FJSVisje6、FJSVpcmi、FJSVjdk7を入れればよくて、
これは、上のWSEのインストール画面にあるように、入ってます。
事実、WSEで、インストールできます。

・・・で、動かしていいのか?

はじめに挙げた、機能一覧表ではWSEでJavaEEが動くとは書いていません。
・・・ということは、動いても、サポート外なのか?

でも、GlassFishベースのサーブレットはOKってことは、
JavaEE6入れて、サーブレット動かしてもOKなのか?

よくわかりません。

どこまでサポートしてくれるのか、
今後どうなるのか??

WSEを選ぶ人は、富士通の人によ~く、聞いたほうがいいですよ!!

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

富士通のWebソリューションの生死(天国と地獄)は、たった一言できまる!

2014-01-16 16:33:08 | JavaとWeb

GlassFishの商用乗り換え先について(補足)
http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/

に、(以下太字は上記サイトより引用)

※念のため更に補足しておきますが、Interstageが将来GlassFish 4.x系をそもそも採用するかどうか、また仮に採用したとしてもそれはいつなのか、というのは全く不明なので、もし気になる方は富士通の営業さんに実際に問い合わせてみましょう。


とあるが、これは、実は富士通のWebソリューションの生死を決め、
答えようによっては、天国と地獄の差があるのだが、
みんな、気づいていないかもしれないので、ちょっと、そのへん
を書いてみる。




富士通のWebソリューションの場合、アプリケーションサーバー
には、Interstage Application Serverが使われる。

現在、Interstage Application Serverには、以下のWebサーバー
が構築できる

   ・Apache 2.2
   ・Tomcat 5.5
   ・GlassFish 2.X(JavaEE5)
   ・GlassFish 3.X(JavaEE6)

ここで、JavaEE6以外は、現状JRE6しか選べない。

新規でシステム構築をする場合、わざわざ、世間でEOLになっている
ものを選ばない(セキュリティパッチが出ないので、富士通が対応
してくれないと、こまるから)。

 Tomcat5.5は、EOLになっている。最新版は8
JRE6の無償版の公式アップデート終了は、2013年2月商用版 Premier Support
の終了は2013年12月でどちらも終了している

 もっとも、Oracleも商用版は、Extended Support、Sustaining Supportは続いているし、そもそもInterstageのJREは、富士通が修正を加えていませんでしたっけ?(FUJITSU_MODIFIED)なので、富士通サポートになるけど、わざわざ、新規開発でEOLのものを選ばない。開発環境がベンダーロックインされるから
(具体的にいうと、開発するとき、Tomcat5.5,JRE6を入れないと、Interstageと同じ環境にならないとしたら、それで開発する・・・って、EOLだからだめじゃん!Interstage、開発時にも入れるの?ってこと・・・)

 とすると、EOLになっていないものを選択する場合、Interstageでは、「GlassFish 3.X(JavaEE6) JRE7」の組み合わせしかない。

 で、これで開発するのなら、問題はない。
 問題になるのは、将来だ・・・





 
 すでに、GlassFishは4、JavaEEは7になっている。

 ここで、GlassFishの4なのだが、

GlassFish Community便り
http://www.coppermine.jp/docs/programming/2013/12/from-glassfish-community.html

によると、(以下斜体は上記サイトより引用)


GlassFishにとっての地獄は、当初GlassFish 4.1から予定していたOracleによる商用サポートが打ち切りとなったことと、それによって引き起こされたといっても過言ではない混乱でしょう。GlassFish 3.1.xの商用サポートは継続するものの、商用サーバーとしてのGlassFishはその将来を絶たれたことになります。


ということだ。


Oracleでは商用サポートが必要な場合はGlassFishからWebLogicへ移行するようアナウンスしていますが、GlassFishとWebLogicのデプロイメント・デスクリプターの互換性は(Oracleのアナウンスに反して)完全ではなく、移行に関しては十分な検討とテストが必要となります。


とのこと。




ここで、Interstageに話を戻すと、Interstageは、GlassFishの商用乗り換え先について(補足)の「何を基準に決めればいいのか」の図にあるように、GlassFishのコピー(デプロイ先など一部修正)の形になっている。したがって、

もし、Interstageが、GlassFish4,JavaEE 7をサポートするのであれば、
 Oracleはサポートしないので、
 GlassFishを商用サポートする、唯一のメーカーになる。
 これ、天国!

しかし、Interstageが、Oracle同様、GlassFish4をサポートしないので
あれば、今後の製品構成は、全く見えない。

  GlassFish 3.X(JavaEE6) JRE7を続けるのか?
  JavaEE7に対応するサーバーを新たに作るのか?

その判断が聞けないまで、InterstageのJavaEEを採用するのは怖い
・・・となると、いまのところは
「GlassFish 3.X(JavaEE6) JRE7」
だけど、今後はわからない・・・さすがにそれは・・・・
となってしまう(これが地獄)




Oracleが、GlassFish4.0を商用サポートしなくなった以上、
「富士通はGlassFish4.0をサポート(します/しません)」
の一言が、今後のWebソリューションの生死を決めることとなり、
その一言がはっきりするまで・・・様子見となってしまう。

P.S あ~ここまででかなり長くなってしまったので、
ここで切る。本来は、この後に、これでさらに複雑になる
Interstage Application Server WSEの話を書きたかった
んだけど、それは次回!

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

1つの項目に、数字のときはカンマ付け右寄せ、文字のときは左寄せする

2013-12-17 14:23:36 | JavaとWeb
こんなかんじ(3桁目の数字と文字(欠測))。

これを、JavascriptとJQueryでやる方法の概要とサンプルコード




■概要

(1)テーブルのデータにidとクラスをつけます、
     IDは、一意になるように
     クラスをcomma3など、すべて共通にします


(2)JQueryで
  $(function(){
$.each($(".comma3"), function() {

     // (3)の処理
  }
  }
 というふうに、(1)で指定したクラス全体に対して、(3)以降の処理を
 行います。

(3)IDを取得して
     myid = $(this).attr("id"); // id取得
     mycssid = "#"+myid;     //  後で使う

   文字だったら   
   if ( isNaN(parseInt( $(this).text() )) )
   {
       // 左寄せ
       $(mycssid).css("text-align","left");
   }
   数字だったら
   else
   {
       // カンマをつけて
       set_comma3(this);
       // 右寄せ
       $(mycssid).css("text-align","right");
   }
  とします。

(4)カンマ付け関数set_comma3()は、

[jQuery] 金額などの数値に3桁のカンマをセット
http://blog.aidream.jp/jquery/jquery-comma-three-digit-1870.html

を参考に作成




■ソースコード

<!doctype html>
<HTML>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" 

type="text/javascript"></script>

<script>
$(function(){ 
	$.each($(".comma3"), function() {
		myid = $(this).attr("id");	//	id取得
		mycssid = "#"+myid;	
		if ( isNaN(parseInt( $(this).text() )) )
		{	//	文字→左寄せ
			$(mycssid).css("text-align","left");
		}
		else
		{
			//	数字→カンマつけて
			set_comma3(this);
			//	右寄せ
			$(mycssid).css("text-align","right");
		}
	});
});

//--------------------------------
// カンマ付け
// 参考にしたサイト
// http://blog.aidream.jp/jquery/jquery-comma-three-digit-1870.html
//--------------------------------
function set_comma3(target)
{
	var value = $(target).text();
	if (isNaN(parseInt(value)) == false)
	{
		while (value != (value = value.replace(/^(-?\d+)(\d{3})/, ",")));
	}

	$(target).text(value);
}
</script>

<body>
<table border=1>
<tr><td>1</TD><td>数字</td><td id="data1td" class="comma3">1234</td></tr>
<tr><td>2</TD><td>カンマなし</td><td id="data2td" class="comma3">234</td></tr>
<tr><td>3</TD><td>大きな数</td><td id="data3td" class="comma3">12345678</td></tr>
<tr><td>4</TD><td>マイナス</td><td id="data4td" class="comma3">-1234</td></tr>
<tr><td>4</TD><td>文字</td><td id="data5td" class="comma3">欠測</td></tr>
</table>
</body>
</html>



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