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

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

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

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

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でシェアする

ユーザーは、ソフトの品質・機能等にお金を払うのではなく、ベネフィット等払うようになったから

2014-02-21 13:02:58 | Weblog

デブサミ2014、講演関連資料まとめ
http://codezine.jp/article/detail/7640


というのを見て

「ソフトウェア工学からコンピューターサイエンスへ - 今後のシステムアーキテクチャーに必要な技術的切り口とその裏側」

なんていうのをやっていたのを知った。

もっとも、クスマノが、「ソフトウエア企業の競争戦略」で指摘しているけど
(今、手元に無いので、何ページで指摘しているか忘れた。
 たしかはじめのほう)

  ヨーロッパ→コンピューターサイエンス
  日本   →ソフトウェア工学
  アメリカ →ソフトウェアビジネス

という構図がある。なので、「コンピューターサイエンス」は
もともと脈々と続いていて(計算論、形式仕様、分散技術も?)
ソフトウェア工学が没落したから、コンピューターサイエンスが
目だったってことになるんじゃないかな?

でも、togetterを見ると、「ソフトウェア工学」のdisりが足りないようなので(^^;)ここで、「ソフトウェア工学」をdisってみる。




■ソフトウェア工学の没落1<<現場とアカデミックの乖離>>

 まず、ソフトウェア工学というものが、現場で考えているものと、アカデミックでさすものが、かなり違う。

 現場では、フレームワークのよしあしとか、生産性改善のためのツール、品質向上のためのツールをさすを思っているかもしれないけど、そういうことは、アカデミックの議論にはならない。理由は、以下の2点

●フレームワークで生産性向上!ということが難しい。

 極論すると、最近のフレームワークでは生産性も品質も向上しない。
 ZendとCakePHPでどちらが生産性があがるか?とはいえないし、
 そもそも、生産性の基準が難しい。

 たしかに、ステップ数は自動化すれば上がるけど、そのために教育に何ヶ月もかかっていたら、トータルで見たとき、生産性があがっていると、いえるのか?


●最近のツールには、新規性が、実はない。

 高速開発とかいうが、それって、Railsと、どう違うの?
 いろんなフレームワークが生まれてるけど、それって既存のフレームワークの方言程度の違いじゃない?
 ってことを言われると、反論できない。新規性がない。


 そこで、アカデミックでやるとすると、もっとぶっとんだ、

 ・要求仕様から、いきなりソースコードを作る、テストも作る
 ・テストの要求分析
 ・バグの出方から推測される、担当者の性格

 など、現場とは直接関係ない方向に進みつつある。
 (上記のテーマは、たぶん今やれば、最先端)




■ソフトウェア工学の没落2<<品質・生産性に金を払わない>>

 そもそも、ソフトウェア工学というのは、ソフトウェアの品質向上、生産性向上のために行われた学問だが、ユーザーは今、品質向上、生産性向上にはカネを払わない。

 高品質で、適切な納期より、ぼろぼろの品質でも、短期間のほうが求められる。なぜなら、ユーザーは、適切な納期-短納期=利用期間の差で、莫大な利益を上げられるから。。つまり、ベネフィットを優先する。

 生産性をあげて10個の無駄なプログラムを作るより、お金になる1個のソフトを作ったほうがいいと考えるようになった。

つまり、品質・生産性に金を払わず、ベネフィットにお金をはらうようになった。こうなると、設計・実装の品質向上、生産性向上は意味が無く、ベネフィットを生み出すビジネスモデルの構築と要求分析になる。

 これは、ソフトウェア工学ではなく、ビジネス(経営学・・・でもないんだよな)である。




■没落したソフトウェア工学は、どこに向かうのか→サービスサイエンス

 ということで、ソフトウェア工学は、アカデミック的には、

(1)ユーザーとプログラマ、デザイナー、ビジネス分析者などの
 いろんな人が、いれかわり、たちかわりペアプログラミングして

(2)それらの人が、ビジネスモデルや要求を作った時点で、
 プログラミング、シミュレーションできる

という方向に向かっていると思う。

 (1)については、これを実現するには、昨日書いたフラット型組織が必要となる。開発形態はアジャイル。

 (2)の部分が出来てしまえば、(1)の人たちで、ビジネスモデル作成に専念できる。そこのイメージは、今のIDEOが行っているかんじ・・・つまり、デザイン思考になる。

 そう、今、ソフトウェア工学で大注目なのが、デザイン思考なんです。

 そして、そのビジネスモデルをモデル化し、評価する学問としてサービスサイエンスに注目されている。

 ビジネスモデルが出来れば、そのモデルから自動的に、ビジネスに必要な基本的な部分のソフトウェアを組み上げ、品質は後から必要に応じて足していく。

昔、平鍋さんが

アジャイルの「ライトウィング」と「レフトウィング」
http://blogs.itmedia.co.jp/hiranabe/2012/09/rightwing-and-leftwing-of-agile.html

というのを書いていたけど、ライトウィングであるソフトウェア工学は、もう新規性が無くなり、今は、レフトウィングが注目されているというかんじでしょうか・・・




 なお、上記の話は「アカデミック」な視点が結構入っちゃってる。
 つまり、ビジネス的には、旧態依然とした、ウォーターフォールで生産性・品質を上げたいという話はあるし、今後も続くと思う。

 ただ、いままでは、それが全てだったけど、そこに上記のようなサービスサイエンスが入ってくるという話。

 ただし、フレームワークは、宗教論争はあるけど、設計上の話では、これ以上新しいものは・・・ないかもしれないね・・・

 むしろ、基本的にはソースコード作成部分の生産性は上がっても、覚えるのに時間がかかったり、はまっていく部分が多くなって、全体的には教育から保守まで考えると、生産性が下がっていくんじゃないかなあ?

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

デザインドリブンイノベーションの理論と実践

2014-02-21 10:07:54 | Weblog
昨日、公開セミナー 知的資産経営新ビジネス塾に行ってきて、

第6回 まとめ「デザインドリブンイノベーションの理論と実践」

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

なお、<<先生>>は、パネルディスカッションに参加している先生のうちの「だれかの」発言(特定の1人の先生ではない)




デザイン
10年、20年前の言葉と違う
  プロダクトデザイン→画面、社会そのもの、人生・・・多様
  デザインということばの変遷

1回
・デザインドリブンイノベーションをどう見ていくか
  意味のイノベーション:新しくない、リスクある
  解釈者に耳を傾ける

2回
・3Dプリンタ:ロングテールに向いている?ベンチャー

3回
・神経科学?

4回
・日立デザイン本部:エクスペリエンスデザイン
  インフラ、ソーシャルイノベーションのツール
  北九州にIBMで競り負けがきっかけ
  ニーズを抽出→ニーズはないって言ったほうが・・

5回
・IDEO:戦略コンサルとはずいぶん違う
  結局元に戻ってしまう

デザインドリブンイノベーションとは何か
そしてその実践はどのように行うのか

 → 技術主導+意味のイノベーション

どうやって起こしていくか
解釈者との関係性
 →リードユーザーも入っている
 →ユーザーイノベーションも含んでいる?
ベルガンティの本

解釈:ユーザーが手にしたこともないものを
 アンケートしても?

技術の事業化・収益化と技術の応用開拓に及ぼす
技術開示・公開の影響




■デジタル時代のデザイン・ブランド戦略

意匠権
アップルVSサムソン
・新聞は特許と書いているけど
  →デザインパテント
 デザインについての主張をしている
 国によって争点が違う
  日本では特許
  →日本と中国は画面デザインを保護していない

・世界中でサムソンが意匠登録
  はっきりとした戦略

・画像デザイン

・新商標:音とか→法改正

・特許庁がやろうとしても、業界が反発

・大企業ほど甘く見ているのでは?

・デザイン:商品設計そのもの




■レビュー

<<先生>>
・ますますわかんなくなっちゃった?
・解釈者はどこにいるか
  技術をどこに見せていたか
   成功したプロジェクト:自分たちと遠い人にみせたとき
   失敗したプロジェクト:同じ会社の上司が最悪
  技術を誰に見せれば、いいヒントをくれるのか
  解釈は技術者自身、ヒントは離れた人

  不確実性、変化を楽しむ
  他人に対して:共感能力
  利他性:営利を追及してない、よりよい生活
  過去の蓄積でなく、未来から現在を見る
   自分が作るしかないという覚悟

<<先生>>
・総括
1.デザインの定義
  はっきりとした答えは得られなかった
  キーワード:体験、サービス、ビジネス
   表面のデザインをきれいにすることでない
   プロダクトデザイナーの処遇になやんでいる
  →顧客に対する体験の提案
  スタイリングの意味かいつも、考える必要

2.デザインとイノベーションの関係
  期待を超える
   ポジティブな期待の不一致を高め
   ネガティブな期待の不一致を低める
  いまのマーケティングは向かない
   新しい市場を作る
   従来の延長線上ではない→異質の市場を作り出す

3.ツール
  デザインシンキング
  3Dは?
   ラピッドプロトタイピング
    →IDEOは使ってない?

  アンケートベースではない

  想定外のことを社内で実行→こまる→リーダーシップ

4.知財
  スタイリングじゃない:意匠ではない・・・
  →ユーザーインターフェース:特許

5.その他

<<先生>>
・3つの疑問
(1)なんで、いまさらデザイン?
 競争環境がきびしくなったから
  国内:成熟化
  海外:日本のポジションが、先進国のところ
 プロダクトデザインに収まっていない
  ユーザーエクスペリエンス

(2)デザインの背後の組織構造
 ブランドに落とし込んでのデザイン
  これを支える組織構造?
 解釈者が組織構造におさまるか?

 ・・・よくわかんなかった・・・

(3)デザインイノベーションの競争戦略
 マーケット側の戦略だが、
 マーケティングではない
 技術サイドでなく、マーケットサイド
 イノベーション論の原点に戻っている
  →既存技術の結合:デザイン
 イノベーターのジレンマ
  既存のマーケットに力がある
  →新マーケットには対応できない
 →デザインイノベーションを大企業がやるのは難しい
 デザインイノベーションの使い方

<<先生>>
・20年前のデザインとちがう
 なぜ、今なのか?

 ソフトウェア
  →モジュールの展開
  →社会システム→どういうふうに付加価値

 基礎研究やらなくても・・・
  →あらたな価値経営

 IDEO:別の視点

 サムソン:いいデザインを残した
  →簡易金型:早くフィードバック
  →簡単にできるようになった

・日本:新興国が登場してきたとき、
  どういう技術を残すか
  →グローバルなビジネスモデルのデザイン

<<先生>>
・解釈という言葉が出る:感慨ぶかい
  現象学的解釈主義:探索
  昔、解釈はキワモノ
 インタープリテーション
   ミーニング アトリビューション
   メイク センス
 →コンセプト
  正解のない世界に出て行く

 身体知の束縛
 知能知の呪縛

 コンピューターは計算機で勝てるか?
  →早く正確にを追求しはじめる
 →メディア:もう古い
 →ネットワークサービスのインターフェース

 デザインとプランは違う
  構想:ビジョン→アクションプラン
  デザイン:プロジェクションやリフレクション
   →ラーニング
  学習効果:ごがくごしゅう
   →サービスサイエンスで話題

デザインの階層
1.スタイリング、可視化される
2.プロダクトデザイン商品企画
3.バリューデザイン:プロダクト+サービス
4.ビジネスデザイン:コミュニティ、コミュニケーション
5.インダストリアルデザイン:どんな産業
→新価値の付加でなく、置き換え

アップル:わくわくするような価値を創造
  →そして知財を取得




実証研究になじまない
やりにくいはなし・・?
  技術者を大量に持っている会社がやるポイント

<<先生>>
 クリステンセン的な解:組織を分ける
 →それ、疑ってる
  アップルがやったこと、どんどん独裁的、一体化!
 もしかして、ちょっと違う?
  独裁的な決定ができないこと?

<<先生>>
 意思決定の話してる
   ベンチャー
 ダイソンの扇風機
 日立:デザインドリブンをプロダクトに適用していない

<<先生>>
 大規模企業が社会を変えている
 トヨタの新興国戦略IMVプロジェクト
   TPSのトヨタでない。離れるような組織構造を作っている
   ルーチン化:効率いい→新しいところには逆効果

<<先生>>
日本企業とアップルの違い
 ファイナンス:社内投資家
  即時この手をうちたい→バジェテング
  機動的予算:投資部門


<<先生>>
 デザインイノベーション部を作ったらおわるよね
 IMV:商品開発に事業開発をつけていった
  →普段は発動しない
 大企業でもスイッチが押せれば

<<先生>>
 3M:自由な時間→むだを許容する
 アップル:ああやらざるをえなかった?
 本田・ソニー:むだなロボット

<<先生>>
 意匠法をどうこうすればいいという話でなく
 知財をどうするか

<<先生>>
 特許庁はいろいろ考えているよ
 知財:守るという意識
 デザインブランド戦略:知財だけではないが、最低のところはちゃんと
 意匠:日本だけ減ってる

<<先生>>
 日本で出さなくてもASEANには出したほうがいいことも

<<先生>>
 法律の専門家が多い。ダイナミックに変えることに賛成でない
 クアルコムは製造業か(知的な)サービス業か?
 ダイキンのエアコン:付加価値はどこ?ソフトウェアにノウハウ
  サービス化にシフト

<<フロアにいた先生>>
 知財:ちゃれんじんぐ
 さむそん:変わった2001年デザイン経営センター1500人
  デザイナーが解釈者
  2005、6年知財:あきらかに意匠権、デザインパテント、
  2007年デザインを知財ツールに
 1000億円の賠償金:デザインパテント
  →激動の知財

<<某参加者>>
 ビジョンを考えろ:スローガンを考える
 ブランドビジョン:わくわく:経験したことがない
  →できそうだ!
   誰も見たことがない絵
 3Dプリンター:クラウドに似たようなもの
  →なにを与えるか:はやくみつける
 アップル:トップダウン
  会長がばんばんやらないと
  中小企業の社長さん「明日からやるよ!」
   →引っ張っていく人

<<会場から>>
・・・よくわかりませんでした・・・

<<先生>>
解釈
 エイジェンシュタイン;モンタージュ論
 嶋口先生:手をたたき、ひざを打つ
 想定外がでたとき、どこまでが想定内か
  →日本の想定内が狭すぎる

せんでん
 サービス「モノのサービス武装」 東洋経済
 スマートデザイン
   いつもの便利、もしものソナエ

<<会場から>>
意匠登録したほうがいい、裁判したほうがいい

<<フロアせんせい>>
 戦わないことです!!!!!
 ただし、デザインパテントは使いやすい

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