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

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

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

JJUG CCCに行ってきた その1 アノテーション

2016-05-22 18:05:06 | JavaとWeb
5月21日JJUG CCCに行ってきたので、メモメモ

はじめ・・なのですが、まず、場所をまちがえた(>_<!)
で、遅れたので、入る会場を間違え、ルームG+Hに入ってしまった!
話は面白そうだったんだけど・・・
ごめん、とはいえ、やっぱり基調講演!と思って基調講演を聞きに行ったら・・・
・・幹事が・・お金の話・・・??
よくわかんないけど、自分には関係なさそうなので、
やっぱ、おもしろそうなルームG+Hに戻って話を聞いてきた。

ということで、結果、最後20分くらいしか聞いてないけど、メモメモ




・Findbugsみつからないことあり
・Annotation
 enumで宣言する(メタアノテーション)

・Annotationかけるところ8種類
 type
 annotation_type
 パッケージ
 method
 constructor
 parameter
 field
 ローカル変数
→全部宣言
型アノテーション

TypeAnnotation
 何のため:コードチェック
 →型を使っている所でも使いたい
 型の使用に対してのアノテーション
 JSR308
  Type_USE
  TYPE_PARAMETER
 をつけくわえる

@targetで定義
@readonly 変更不可能チェックができる
書ける場所
 instanceOf,キャストにも、配列の[]の前
 →ばかみたいにつかえる!
 例外 .class staticなメソッド、フィールド、import文、アノテーション

今とまっている

CHECKER Framework
 振る舞いをチェックしてくれる
 Eclipse,IntteliJ
 ~チェッカー

NULLness Checker
@Nullable,@Nonnull,@Pollynull

アノテーション いままでは宣言
TypeAnotation タイプに使える
 ただし、標準でない
CheckerFramework
 SE8(SE7でも使える)




ちなみに、基調講演は空いてたけど、
テスト自動化(ルームE)は満席だったらしい
G+Hは、ほとんど埋まっていた。

 

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

SpringDI,MVCを使ってのデモなどを見てきた-JSUG勉強会その3

2016-04-24 21:35:57 | JavaとWeb
JSUG勉強会 2016年その3に途中から行ってきたので、
その内容をメモメモ

なお、途中に出てくるTERASOLUNA(テラソルナ) Server Framework for Java(5.X)
の開発ガイドラインは、

http://terasolunaorg.github.io/guideline/

で日本語、英語のHTML,PDFがダウンロードできる
(その開発ガイドラインの「2.3. はじめてのSpring MVCアプリケーション」が、ほぼデモの内容




■前半(途中から)
・SpringDIの紹介
Bean定義の方法3種類
・XMLconfig
 XMLスキーマ定義に従い
 古い時代から
 タイプセーフでない、実行してみないとエラーに気づけない
・Java Config
 タイプセーフ
 Javaで全部書ける:意識高い系に
・アノテーションConfig
 ふえちゃうとき

JavaConfig|XMLコンフィグ
------------------------
アノテーションConfig

XMLコンフィグ
  singleton,prototype
  property
DIコンテナ
 getbeanでもらう

Namespaceによる簡略化

アノテーションConfig

Beanの名前つけられる。

・SpringMVCの考え方
 M:モデル ビジネスロジック
 V:ビュー 画面
 C:コントローラー制御
・こういうリクエストが来たら、どのモデルを読んで、どのビューを表示するかを
 コントローラーに書く
 サーブレットが受け付ける
 DIコンテナ上
 サーブレットを作る
・MVC使うとDIコンテナが2つで親子関係
・Viewにいろんなのを使うことができる(今回はJSP)

・SpringBootでは
 設定を自動でやってくれる
 Viewはかわる。コントローラーは同じ

デモ
・STS使って
・疎通確認
  コントローラーの作成
   プロジェクトでコントローラー作成
    →コントローラーアノテーション
   リクエストハンドラ(リクエストマッピングアノテーション)
  コンポーネントスキャンの有効化
  JSPの作成
  デプロイする

・入力ページ作成
 フォームオブジェクト
   getter,setter
 コントローラーに登録
 JSPにテキストボックス form

・出力ページ
 出力用のリクエストハンドラ追加
 JSP~呼び出す

てらそるなサーバーフレームワーク アプリケーションガイドライン
 はじめての・・・に載っている

■後半(前半続き)
・Spring Security
 認証と認可
  認証:ユーザーが誰であるかを確かめる ID、パスワードなど
  認可:この人が、どういう情報にアクセスしてよいか ロール
・アーキテクチャ
  サーブレットフィルター基本
  Diコンテナで管理
 →フィルターの定義

・Step1サーブレットフィルタの設定
 Step2bean定義
   認証方式

デモ
・Spring Securityの設定
  ディペンデンシー追加
  フィルターの追加
  configファイル追加→セキュリティは独立しておいたほうがいい
  セキュリティ独特のネームスペースをよんでいる

・認証
  オー千ティフィケーションマネージャーの設定
  ログアウトボタンの追加

・認可
  ロール設定

■ほんとに後半
・アーキテクチャ
環境依存
 mavenベースでマルチモジュール→私見と本番きりわけ
  →プロファイルで切り替えもあるが・・
   warを共通、別にjarで環境依存

アプリケーションレイヤをどう切るか
 ビジネスロジック:どういう風に分割?
 コントローラーは画面遷移に徹する
 DAOも隠ぺいか

・機能的な話
 DBアクセス
  JDBCテンプレート
  Spring JPA
 SQL文を書くならMyBatis
 JPA,Hibernateのノウハウがあるなら

 入力チェック
  サーバーサイド
  クライアントだけでは
  Bean バリデーション、Spring バリデーター
   →Bean バリデーション

 セッション管理は割愛

・最後に

■連絡
・26日
・JSUGで1日カンファレンス

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

Java EE 7を徹底的に入門してきた!

2016-02-16 09:01:22 | JavaとWeb
2/15にJJUGナイトセミナー「「Java EE 7徹底入門」の著者が解説! – Java EE 7特集」
に行ってきた!その内容をメモメモ




■JavaEE7徹底入門概要説明
講師:猪瀬さん
・自己紹介
・本日の趣旨 JavaEE7徹底入門の本をかいつまんで
・What is JavaEE
 JavaSE:きほん
 その上位概念
  企業システムのアプリ開発に必要な機能を包括したJavaのAPI概要(フレームワーク)
  39個の仕様から構成
・JavaEEの動作環境
  JAVAEEは仕様
  実行環境は、JAVAEEコンテナ、アプリケーションサーバー、、GlassFishなど
  アプリケーションは、設定ファイル等とまとめて、jar,war,earに
   アプリケーションサーバーに配置。デプロイ
   JVM
・JavaEE7
  JavaEEは96年から、
  ネガティブ先行→Struts,spring,Hibernateが台頭 2000年前半
  JavaEE5が転機:重かったものを簡単に
・JavaEE7徹底入門で目指したこと
  日本語で解説
  業務に使うところ
  完全にアプリとして動作するもの
  筆頭候補として位置付けられるもの
・構成
・出版後にあったフィードバック
  誤記が多い→正誤表
  章と章の間にばらつき
  JavaEEの日本語情報、増えましたね!
   次世代フレームワークを何にするか→情報量は重要なファクター
・事件
  てらだよしお退職
  レビューに層手以外の時間がかかった
  観光直前のGlassFishのバージョンアップ
・FAQ
  表紙が白い猫:金魚本
  1名女子:猫がいい(Tomcat)きれいなTomcat
・この後のタイムテーブル


■JavaEE7徹底入門 プレゼンテーション層の開発JSF
講師:加藤田さん
・自己紹介

・本章の概要
 JSFで開発したことある人 4割

・JavaEE徹底入門のもくじ
 →3割くらいJSF(150ページ)
 JSFの基本
 JSFに絡む各機能
  Facelet(タグライブラリ、EL)とマネージドビーン(スコープ)
  入力チェック、コンバーター、コンポーネントカスタマイズ、テンプレート、HTML5,AJAX
  国際化、認証

・サンプルアプリケーション、
  ナレッジバンク(ノウハウ入力)

・サンプルアプリでも
 画面遷移図
 アカウント登録で説明

・JSFとは何か?
  JavaEE7ではJSF2.2
・プレゼンテーション層のフレームワーク
  値マッピング・入力チェック:サードパーティ→JSFへ
・JSFの構成要素
  フェースレット
  マネージドビーン

・フェースレット
  画面のレイアウトを記述するHTMLベースのテンプレートエンジン
  JSF2.0からJSPの代わりに使用
 フェースレットとJSPの違い
  XHTML→記載厳密
  スクリプトレットが記載できない
  文字列のサニタイジング
  NULLの表示
  テンプレート機能(Struts:tile)
 記載例
 フェースレットの構成要素
  フェースレットタグライブラリ
  EL(えくすぷれっしょんらんげーじ)
 h:がついているものは、HTMLと対応
 f:などある
 EL式 値のヒモづけ

・マネージドビーンとは
  フェースレットとバインドするJavaのクラス
  入力値の保持やボタン押下時の処理
 マネージドビーンの構成要素 
  スコープ
  バインドする値の保持
  ビジネスロジックの呼出し
  画面遷移
 JSF getter,setter必要

・フェースレットとマネージドビーンの処理イメージ
  コンポーネントを主軸にコードを作成:コンポーネント指向

・本書では触れられなかった話
 JSFのより詳細な機能
 JavaEE8(JSF2.3)
 MVC1.0
 JSF関連ライブラリ

・JSFのより詳細な機能
  カスタムコンポーネント
  イベントハンドリング
   Value-Change-Event:値を変更してボタンを押したら
   ActionEvents
  ビーンバリデーション
   グループ化機能
  EL(EL3.0で追加)
   Lambda式
   文字列連結オペレータ
・JavaEE8(JSF2.3)
  追加予定の機能
   WebSocket対応f:socketでJavascriptをなるべくすくなく
   マルチフィールドバリデーション
   DataTime
   EL式暗黙オブジェクト
   マネージドビーン等への・・・
・MVC1.0
  アクション指向フレームワーク
  JavaEE8で導入
  JAX-RSを拡張
  ビューはFacelet,JSPをサポート
   タグlibのサポートない
  名前が直接的だけど
 実装例
  JAX-RSのアノテーション
  @Controller

・今後のプレゼンテーションの選択肢
  JSF
  JAX-RS+クライアントサイドフレームワーク(AngularJS,Reactなど)
  MVC1.0+Web-Components?
・JSF関連ライブラリ
  コンポーネント系
  フェースレットの画面をリッチに構築するライブラリ
    PrimeFace
  ライブラリ系
    JSFの開発を容易にするライブラリ
     OmniFace,PromeFace
・PrimeFace
  Ajaxを使用したページレンダリング   
 OmniFaces
  JSFの開発をサポートするユーティりティライブラリ
  個人レベルのライブラリ

■ビジネスロジック層の開発 CDI&EJB
講師:羽生田さん

・自己紹介

・排他的な関係ではない
 CDI or EJB→排他的? で、どっちがよいの?
 実際には、組み合わせで解決するのがよいのかなあ

・いいわけはここまで
・書いてないこと中心

・書いてあること
 CDI
  インジェクション、型解決、定義
  イベント処理、捨てれpタイプ、プロデューサー・ディスポーザー
 EJBの使い方
  この先EJBまだ使っていいんだ米という行間

書いてないこと
 CDIコンテナの取り扱い
 @ConversationScoped
 CDIにおけるトランザクションの取り扱い

おさらい
・CDIとはなにか
  DI:層をくっつける接着剤
  必要なオブジェクトを必要なタイミングで提供
  スコープ定義
   POJOにスコープ定義さえあれば@Injectionですきなところでインジェクション
   5つ:どこで消えるか
     Request
     View
     Session
     Apprication
     Conversation:生き死にを定義できる

・おさらい
 CDIは簡単べんり
  EJBと非尾書くすると実装が簡単かつリソースメリットがありそう
  EJB;プール使い、なかなかきえない
  CDI:使いたい個所でぱっと使ってさっと消えるのが理想
 層ってなに?
  CDIの適用範囲:広い

・はじめましょう
 CDIコンテナ
  良くも悪くもWeld。猫も杓子もWeld
  アプリケーションサーバで採用しているWeldのバージョン押さえておかないと死ねます
  GlassFishとWeb logicのWeld採用バージョン
   →GlassFishが先行している
 CDIコンテナのアクセス用API

 CDI
  CDI.current();
  BeanManagerの取得元として利用
  CDI.select(クラス).get();プログラマチックルックアップ  
  CDI.current().toString() Weldと帰ってくる

 CDIProvider
  CDI#current();の裏で呼び出される

 BeanManager
  ポータブルエクステンション(Chapter#11)
  特定のCDI限定詞を持つCDIビーンについての情報取得
  CDIビーンの操作
  業務アプリで使いすぎるのは注意必要
   フレームワーク化→障害時に追いかけられない

 CDIコンテナ::LifeCycleEvents
  ・CDIコンテナ拡張機能の1つ
  ・各種イベントをフックできる
  ・SPI
  ・注意:デザパタ、フレームワークに乗せたくなる人は注意:Weldの実装変わったら、どうなるの?
  ・CDIコンテナの動きは手に取るようにはわからない
  ・大規模開発:インジェクションが死ぬほどあってわからないとき、どうやって制御
    →LifeCycleEventsを使って生き様死にざまがわかるように

 @ConversationScoped
  begin()→end()タイムアウトある
  明示的に

 トランザクション
  JTA1.2(JSR907)
  目指せEJB CMTからの脱却
  みんなそんなにEJBが嫌いなのか?
  javax.tramzactionパッケージ
  @Transaction
   トランザクション境界の設定
   クラスとメソッドどちらでも
   JTAなのでCDIビーン
  @TransactiopnScoped
   現在有効なJTAトランザクションの実行に合わせたライフサイクルを持つもの

 まとめ
  CDIで何でもかんでもって設計もどうかなって思う
  CDIが本格進出してきたことでフリーダム
  CDI+EJBで
   なやまないで・・・(DBアクセスはEJBとか)
  多量のインジェクションはやめましょう

 感想など


■バッチアプリケーションの開発jbatch

・自己紹介は割愛

・本日話す内容
  Jbatchってなに
  構成要素機能(ジョブ、ステップ、補助機能)
  本書に書いていない

・What is jbatch
 JavaEEにおけるバッチ処理の標準
 Version1.0としてJavaEE7から登場
 JSR-352
 Spring Batchから多くを継承

・なぜjbatch
 Javaでバッチを組む4つの方法
  プロセスとして実行
  自作スレッドとして実行
  APサーバーでサーブレットとして実行
  jbatchを利用
  spring batchりよう

 プロセスとして実行
  シンプル
  JVM起動時間のオーバーヘッド、CPU食う
  APサーバーで他で動く部品の共有
 自作スレッドとして実行
  スレッド→プロセスに比べ早い
 サーブレットとして実行
  あまりよくない
   APサーバーの部品共用はできるが
     暴走した場合
     きっかけがHTTP経由→半日かかるものとかは?
 jbatchとして利用
  ○一定の理由ある

・jbatchの構成要素
  ジョブとステップ
  ジョブXML
  ステップ:処理の本体
 ジョブXML
  プロパティ書ける
  ステップ要素を書き足していく
   子要素:バッチレット
 ジョブとステップの分離
  古くはホスト時代にさかのぼる→JCL
 jbatchの構成要素
   ジョブ:処理の順序制御
   ステップ:実装のテンプレート
   補助機能

 ジョブの構成要素:XMLタグ軍
  フロー
  スプリット:並行(分散)実行
  ディシジョン:前の結果を拾って、どこへ行くか
   ストップ、エンド、・・
 JOBXMLのroot要素
  XSD指定するとエディタが補完
 ジョブ全体の会誌、中断、再開
   ジョブオペレーター
   ジョブオペレーターの呼出し方法
   JAX-RSを用いた起動方法

  エラーハンドリング
   リトライ
   スキップ

 ステップ
  チャンク型とバッチレットの2種類
  チャンク型
   リーダー、プロセッサーライター
  バッチレット
   単発コマンド
  チャンク型のステップ
   実装のテンプレート

 補助機能
  ジョブリポジトリ
   APサーバー配下、記録残る
  リスナ
  コンテキスト
   JobContext,StepContext
  メトリック

 本書に書いてない話
  ステップ・パーティショニング
   ステップの並行処理
  入出力ファイルをCSVにした理由
   JSONP
   リスタート機能の紹介→読み込みに失敗したとき
    CSVのほうが、親和性高い
  ここがへんだよjbatch
   チャンクでジェネリクスが使えない
   終了ステータス、バッチステータス、ジョブとステップで共用?
   flow/sprit単位でのプロパティが指定できない
   glassfishの参照実装で動かない機能

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

「よくある業務開発の自動化事情」を聞いてきた!

2015-11-30 10:35:37 | JavaとWeb
11月28日にJJUG CCC 2015 Fallに行ってきた話のつづき。




■How to speed up your application using JCache

・JSR107
・ヘーゼルキャストの関心高いけど、今日はJCacheの話
・キャッシング入門
 キャッシュ:ナノセカンドで返ってきたりする
 特色①パフォーマンス②オフロード③スケーラブルでないところにスケーラビリティ
  →需要が急に増える場合、ヘーゼルキャストを入れて早めたり

・いつキャッシュを使うか
 データを2回以上使うなら価値あり
 キャッシングが有効になるところ
  ①Webアプリ(突然需要上がる)
  ②ネットワークにまたがるシステム
  ③データが複雑、オブジェクトが入り組んでいる
  ④オブジェクトがグラフ構造


・データベースキャッシング

・キャッシュ:RAMに構築
  Java:分散キャッシュ→ヒープストア:ガベージコレクションの制約
  (メモリの三角形の)上のほうは1つのマシン上で考えている
            下のほうは分散→クラスタ組んでいるのを想定

・アムダールの法則:複数プロセス実行時、パフォーマンスを高めるには、
          ボトルネックを早くしたほうがよい

・キャッシュの効率
 あまり統計データ持っていない
 キャッシュ効率高い:オフロードできている
  効率での考慮→レファレンスデータ、データ変更頻度、頻繁に使われるデータ

・分散キャッシュ

・オブジェクトのコピー:安全性に問題
  →イミュータブルなデータなら安全
  問題→一貫性、整合性、マルチコンシステンシー、Javaメモリーモデル、
     Eventual Consistency、weak Consistency、atomic oparation

・Javaキャッシング
 JDBCみたいなものを目指している
 完了した
 Spring 4.0サポート、4.1拡張
 Spring Boot 使ってくれます
 実装したもの:長いリストになっている
 Mavanでの設定

・コンセプト JSR107
 出発点 Map VS Cache API どちらもキーバリュー
 Jcache サービスローダー キャッシングプロバイダを見つける
    キャッシュマネージャー DBに相当
    キャッシュ  キーバリュー

 ジェネリックを使っている
 かぎとなるAPIは、putとget(put;値返さない)

・Spring
 アノテーションで操作できる

・Jcacheのインプリは6種くらいある
 Jar入れ替えなどでOK
 当然ヘーゼルキャスト使ってね!




よくある業務開発の自動化事情

・広いままでもできなくはないけど AAA(A* Automation Alliance)
 キレイな事例紹介で終わる

・今回はJava,Webアプリケーション、受託開発、スキル会社バラバラを想定
 5個ぐらいの現場で会ったこと

・自動化の目的→早く帰ること
 2種類
  手作業とまったく同じものを出力する自動化
  手作業でできないことを自動化する

・対象はすべての活動

・ビッグバン自動化

【自動化事情】

・環境構築
  開発、検証、本番
 課題
   ・手順書ベース(更新されていない)
   ・複数バージョン動作させたいとき
 解決
   ・プロビジョニングツール
   ・仮想化技術、コンテナ技術
 使ってみたところ
   ・クリーンすぎて困った→テストつくるとき
 現実
   ・プロジェクトだとコスト重い
   ・現場に浸透していない。その人だけ使えても・・・
   ・重い
   ・組織の壁

・構成管理
 前提
   ・CVSはあたりまえ、SVNかGit使ってる
   ・Gitは気合いるけど、多くなってきた
   ・検証済みマージ
   ・リポジトリはNexus/Artifactory
 現実
   ・コミットしてはいけないファイルをコミットしてしまう
   ・ローカル用の設定変更
   ・Gitはトラブルに弱い→たまに事故
   ・Mavenのリリースバージョン

・ビルド
   ・antで解決していた
 課題
   ・依存関係
 解決
   ・Gradleなど
 現実
   ・ビルドツールは使いこなされていない
   ・mavenの場合、pom.xmlとかは特定の人しかわからない

・CI
   ・Jenkins
 課題
   ・ワンクリックデプロイ
   ・CIサーバーは市民権をええいる(ビルドサーバー)
 現実
   ・属人性の排除はできていない。CI職人へ
   ・ワンクリックデプロイは組織の壁

・コーディング
   ・設計書から自動生成だ
    →イマドキのフレームワークなら生成する必要ないだろう
     IDEによる自動記述→IDEを使い倒そう
 課題
   ・大量のソース書く
 解決
   ・パワフルなフレームワーク
   ・JVM言語
 現実
   ・昔自動生成した、ソースコードは?
   

・テスト
   ・自動テストはよく話題に上がる
    システム自動化カンファレンス
   ・JUnitなテスト Excelマクロで生成:無駄に量が多い
   ・JUnit5
   ・ブラウザ使うやつ: selenium
 課題
   ・自動化して工数減らす
 現実
   ・自動化しても工数減らない
   ・実行には時間がかかる

【自動化観察日記】
1章
  自動化担当召喚
2章
  即時対応したい
  →パトランプなど
  順風満帆
3章
 崩壊の足音
  担当者変更
 黙らされたCIサーバー

テスト自動化 8つの誤解:ググって調べる

自動化ハイ
げんかつぎ

【まとめ】
・自動化は
  高速道路はあるが
  突っ走ったら死ぬ
  適当に降りて迷宮に入ること

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

Javaのデバッガのしくみ(JDI)とか、Garbage First GCとか

2015-11-29 05:23:31 | JavaとWeb
11月28日にJJUG CCC 2015 Fallに行ってきた話のつづき。

「Cloud Native Application Framework with Spring」
「デバッガのしくみ(JDI)を学んでみよう」
「Garbage First GC」

をメモメモ




■Cloud Native Application Framework with Spring


・ソフトウェアによるビジネス変革
 アジャイルの専門pivotal labs

・高価な環境からのクラウドへのワークロード移行

・スケールアップが他からスケールアウト型への移行

・へろく→Twelve Factor app:クラウド時代のアプリのあり方

・新しいトレンド:マイクロサービス
 マイクロサービスのエンタープライズへの浸透
   マイクロサービス→ジョブディスクリプションに
 →それなりの要件を求められる
 独自のプラットフォームを展開する会社

・リファレンスアーキテクチャ
 リファレンスとしてNetflix→OSSとして公開
 クラウドにおいて、OSSで高かようせい

・クラウドネイティブアーキテクチャ at Netflix
 カオスモンキー

・フレームワーク、ランタイム、プラットフォーム
 Asgard(あっしゅがーど?)→spinnaker
   (運用にちかい)
 →共通のパイプライン、CI,CD

・プラットフォーム大事

・Spring
  Spring Boot 構成済みパターン
    どうやって活用し、支えていくか?
  Spring Cloud Service

 例:Spring Cloud+Netflix OSS

 デモ Spring Oneでおこなったもの

・Configサーバー
 Service Registration/Discovery Eureka(ゆうりか)サーバー

・サーキットブレーカー
 Fault Tolerance - Circuit Breakers

 エンドポイント登録→サービス側情報をライブで見れる

・App Manager Marketplace
 マイクロサービス あげるのたいへん
 →cloudfoundryで:ダッシュボード

・プラットフォーム:Cloud Foundry
 .net,docker,ビルドパック対応で動かせる
 数多くのフレームワークと管理手法、自動化ツール

 Pivotal cloud foundry
  デプロイの自動化 cf push
  マルチクラウドへの展開
  ミドルウェアサービスの利用
  サポート部門へのチケット依頼も激減

・実行環境:Buildpackとコンテナ

 Becoming Cloud Native
 Pivotal Web Service 50日の試用期間(カード不要)




■デバッガのしくみ(JDI)を学んでみよう
(資料はあとで公開予定)

・ふつうはIDE使ってデバッグ→うしろのしくみ

・アジェンダ
 でばっがのしくみ
 JDI解説
 デモ

・デバッガの仕組み(JPDA)
JPDA Java Platform Debugger Architecture
 JVM TI JavaVM Tool Interface
    ブレークポイント、ツールのためのインターフェース(JVMに対して)
 JDWP
    通信プロトコルの定義
 JDI Java
    ここの説明をこれから

・JDI
(1)コネクタの取得
(2)ターゲットVMへ接続
(3)VMに対する操作
(4)リクエストとイベントキュー

・コネクタの取得
 提供されるコネクタ&ターゲットVMへ接続
  Listening Connector
  Attaching Connector
  LauncingConnector デバッガからターゲットVM生成

・ターゲットVMのオプション
 デバッガが Attaching Connector server=y tramsport=dt_socket
 デバッガがListening Connector

VMに対する操作
・ロード済みクラスの一覧を取得
・スレッド一覧を取得
・クラスを再定義
・VMを強制exit

リクエストとイベントキュー
・リクエストとキュー監視
・各種リクエスト/イベント

ちょっと注意
・LaunchingConnectorを使う場合、
 標準出力、標準エラー出力を適宜読む
・ターゲットVMが終了する場合、正常終了ではデバッガ側は異常でおわる
・JDIの標準実装、例外をチェインしてない(箇所が多い?)
 →スタックトレースの情報だけで悩んでいると、見当違いのことも
・JDIでググると、ジャパンディスプレイがでる(JDI Javaで)

余談
・なんでJDIに興味を満ったのか?
→カバレッジ




■Garbage First GC

たこやき器の説明

・ログから把握できる動作状況

・HeapStats開発

・G1GC概要
 GC
 不要なメモリ領域(hゴミ)を判別
 かいしゅう

4種類のGI
 シリアル、パラレルGC
 コンカレントまーくSweepGC
 G1GC

パラレルとコンカレント

メモリ管理
 ヒープ
  従来:Eden,survivor,old
 →G1GCはガラッと変わる
  リージョンと呼ばれる空間に分ける
  リージョンサイズ以上のオブジェクトはHumongous Objectとして扱われる
  世代分けはする。Full GCもおこる
  Humongous Objectは専用に割り当てられるがコスト高い

 ごみの多いオブジェクトだけGCする

 ヒープレイアウト:従来と同じく世代別、ただし細分化
 ごみの多い場所をやるのでG1GC

G1処理とログ
GC pause (G1 Evacuation Pause)(young)
 →youngGCが発生した
 実際の時間STW時間
 →オブジェクトコピーの時間に注目
・young GC サバイバー入らないとoldへ

複数回のYoungGC後→Marking Cycle
・漏れを防ぐため全スレッド止めて再マーク
 コンカレントではない処理はSTWが発生する

Mixed GC
・アルゴリズムはYoungGCと同じ
  →大きな違いはGC対象のリージョンが違う
・達成するまで複数回

注意すべきパターン
・Evacuation Failure
 ログにはto-space exhausted そのあとFull GC
対策
1.ヒープを増やす
2.サイクル頻度を上げる
3.over-tuningを回避
→ヒープを増やそう

・Humongous Allocation頻発
 対策:リージョンサイズをHeapと一緒に増やす
    巨大な配列を作らない
→ヒープを増やそう

・CPU処理時間が長い
対象案
・物理CPU余裕あり=並列度をあげる
→CPUを増やそう(NUMA環境は注意)

out of memoryのときは、ヒープダンプをだすといいかも
jstatでみれる
カード:リージョンごとにカードが割り当てられる→カードテーブル
  割り当てられるとフラグが上がる=ダーティカード

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

「#てらだよしおがんばれ」を聞いてきた!

2015-11-28 21:01:12 | JavaとWeb
今日(11/28)JJUG CCC 2015 Fallに行ってきた。
そのなかから、(順番めちゃくちゃだけど)まずは、
「てらだよしおの赤裸々タイム」
からメモメモ




■てらだよしおの赤裸々タイム

Microsoft love Java

・その節はみなさまおさわがせいたしまして・・
・1人でやるとは思っていなかった。
・なぜマイクロソフトに行ったのか、なにをやりたいのかを10~15分
・そのあとしつもん。みんなにやにやしてこわい・・・
 →温かい目で・・・

自己紹介
・2015年7月11日入社
・元オラクルJavaエバンジェリスト
・ハッシュタグ #てらだよしおがんばれ

サティアナディラ(マイクロソフトCEO)
・前の社長だったら今ここにいなかった
・キャリアの中で、マイクロソフトはなかった
 →Sunにいたので
・Sunは挑戦者だった。次のITを作っていく→赤い会社に買収されたけど・・・
・サティアさんになってから、マイクロソフトはガラッと変わった
・マイクロソフトにもOSS研修ある→次のイノベーションはOSS
・OpenJDKのソースコミットもしている

Azure-オープンなプラットフォーム
・LinuxやJavaが動くことを知らない人もいる
・Jenkins、Docker→Visual studio ちーむさーびしーずからのデモをやっていた
 →今まで使っていたまんま
・JavaEE GlassFishを始めていった感覚と似ている
 →そんな盛り上がるわけないじゃんと言われたのが・・・・
・Minecraft:開発はJava 自分で拡張できる
・子供むけのプロふらミング教育さかん 12月7日

【質問タイム】
・ニコ生のとき
 まわりはVisual studioたいかの人。でどきどきしてた!

 今回のこと:チャレンジ
 チャレンジしている会社が好き(前の会社がどうかと言ってないですよ)
 マイクロソフトはアップル、アマゾンの挑戦者
  →目まぐるしく変わっている
 Sunに戻ってきた感覚(あんまりいいすぎると前職に・・・)

・今聞かれたくない質問はなに?
 前の会社のこと
 (以下、つぶやくなという指示あり)

 (たぶん、ここからOK?)

・エンジニアの転職に必要なことって?
 いきなり面接官に!
 光るモノを持っている
 入った後に、こんなことをやりたい
 →口だけの人もいる
 話をしていてわかる
 →しっかり自分を持っている
 オールマイティより、とがった人を集めて横の関係を強める

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

JAX-RSとかJSON-Pとか、聞いてきた

2015-11-15 12:40:04 | JavaとWeb
きのう(11/14)のJava One 報告会2015のつづき。
おわりまでメモメモ







■JavaOne2015 JavaEE
(あげつまさん)

・JavaEE8はまだまだ検討中
・Servlet 4.0
 サーブレットコンテナでもHTTP/2に対応
 ストリームという概念

 サーバープッシュ
 要求される前からサーバーで送る
 Java9 Flow

・JAX-RS2.1
 並列で依存関係のあるWebAPIを呼び出したい
 Jerseyにはすでに実装がある
 非同期クライアント rx()いよるCompletationState
 アノテーションで順序制御

 ノンブロッキングI/O

・JMS
 @JMSきゅーりすなー
 今のとことはMDBのシンプル化

・JPA2.2
  Java8に対応
  Date and Time API
  @NamedQueryの繰り返し
  スクロール機能の標準化

・JavaEE8スケジュール 2017年リリース

・WildFly Swarm(すわーむ?)
 spring boot風の
  SpringBoot pomの組み合わせがわからないから
  JavaEEをフルセットで使う人は少なかった
 カスタム設定はmainメソッドに実装
 ふらくしょん:モジュールの1この単位

 主なFraction

■About MVC1.0 & JSON-P

・MVC1.0
 アクションベースのMVC
 JSR371
 なぜJSFでなくMVCなのか
   JSFはコンポーネントベース
   MVCはアクションベース
 なぜActionベース
  見通しの良さ
  RESTとの親和性
 フロントエンドの流行廃りの激しさ
    WONTA(Write Onece Never Touch Again)
    定着した技術としてのサーバーサイドMVCへのニーズ

 コントローラー
    JAX-RS

 バリデーション
  Bean バリデーション
  バンドリングの仕様がprimitiveな印象
  validationResult→BindingResult

 ビュー
  しようとしてサポートJSPとFacelet
  他はすべてextention
  Bring your Own view Engine
  MVC1.0としてはViewのありかたをきめない

 スコープ
  デフォルトrequest
  CDIのスコープを使用可能
  MVCで@redirectScopedを定義

 イベント
  Observerパターン
  イベントの種類追加の可能性あり

感想
・フレームワークではなくAPI
・ポストStrutsではない

JSON-P 1.1
・JSON-P1.0
・JSR374
 すべての値がトップレベルに可能に
 例 "string"

・JavaEE7
 ビルダーパターンを用いたJSONオブジェクトへの変換

・JSONポインター
 JSONの特定値を指す

・JSON PATCH
 RFC6902
 JSON更新処理の標準化
 2つのJSON間のdiffが取れる
・JSON MERGE PATCH
  ・リバースパッチが可能
・JSON PROCESSING
 JsonParserにAPI追加
・JSONに対する低レベル操作API

・JSON-B
 Java APIからのバインディング

・おまけ
 世界はそんなに遠くない




■スピーカーパネル
 How to be a speaker @ Java One?
寺田さんへ:ここにきてどうですか
 しんぞうばぐばぐ

Q1:講演してみてどう?
谷本さん:
自腹なので高い。金銭的メリットはない。
コミュニティが活発になるところにメリット
英語が通じるかが前回
今回「受かるテーマ」ログの可視化

いとうさん(司会者でない、パネラーのいとうさん。以下同じ):
ノリで決まった

寺田さん:
JavaOneは行きたかったので
自分で行こうと
チケット15万(社員は入れる)
人のCFPに乗った
他の人と組んで
発表の10分前にしゃべることが決まった
1回目は緊張。
面白くないとみんな引いていく

谷本さん:英語が通じるかどうかわからない
  →おもしろいところはおもしろい

寺田さん:プレゼンの作りは変えた
 アメリカは詰まんないと思われたら出て行かれる

いとうさん:日本 心の中はわからない
  アメリカ:顔で反応が分かる

共感

Q2:どんな人にJava Oneで講演してほしいですか
・たにもとさん
 JJUG CCCの人とか
 →総合的なレベルは高い
 世界で活躍するとコミュニティが盛り上がる
 子供がスピーカー

・寺田さん
 まずJJUG CCC:日本で情報発信
 事例系

・いとうさん
 日本のJJUGのツイート
 日本のコミュニティ特殊

Q3
 スピーカーになるための極意

寺田さん:
・会社、事例
・単品のテクノロジー:本家でいる
 →ノウハウ系、トラブルシューティング

いとうさん:
・使ってる用語英語
 プレゼンはらく
 やると思ったら、やっちゃえ・・

谷本さん
 TOEICは800なくても問題ない
 でもQ&Aはできない
 しごとがんばれ。それを話すのが面白い
 はくをつける必要
  お客様の事例、コミニティ
  リファレンス重要

寺田さん:
・セッションを決めるのは、Oracleの人以外もきめる
・レファレンスをつける

Q4:
スピーカーのメリット

伊藤さん:タグもらえる
 チケットただ
 転職しませんか
 スピーカー専用ルーム

Q5:
とにかくCFPだす!

最後に一言
寺田さん:日本優秀
谷本さん(しめ)
 ・コミュニティ盛り上げていきましょう
 ・仕事がんばれ→こういうところでいうの微妙だけど・・・
   平均年齢さがって来てるので


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

「プログラミングができるのが大事な時代は終わっている」とか「本番環境でテスト」とか

2015-11-14 13:57:07 | JavaとWeb

今(11/14)Java One 報告会2015に行っている。
その中間報告。はじめのほうの話をメモメモ
(表題の件は後半。赤字にしておいた)




■Java One 報告会2015
10/24から29
・キーノート:おまつりきぶん?セッションが中心
・キーノート
 すこっとがトップテンひさびさに
 船の上から指示を出している
・参加者数 微増?
・Kidsプログラム450人
→小学校3~4年くらいから
 Java,Javascript、IoT
 ちゃんとJavaのプログラムができる子供の数が多い
  →言語が読めるところがちがう
・日本人のスピーカー:10名くらい。だいぶ増えた
 キーノートにいわさきさん。
 寺田さんもマイクロソフトなのに

・Javaの人気戻している
 IoT,エンタープライズ系
・JavaSE等の新しい発表なし
・OpenJDK こみったー136%ののび

・JavaME
 来年の9月9がでてくる
 それまで細かい

・JavaEE 2017年の半ば8のGA
 GlassFish5リリース

・ユーザーグループ倍増
 →ヨーロッパ
 →日本も大阪、札幌
 Javaチャンピオンも5割増し
 JCP 16%のグロース
・今、JCPの法人会員に加入すると、法人会員費用が免除
 (個人会員はいままでどおり)

■Impression of Java One & Java trends
 鈴木雄介さん

・Java One 感想
 大きなアップデートなし
 来年のSE9、再来年のEE8に向けた端境期
 20周年がなければさびしいイベント
 キーノートの最後にスコットマクネリ(SUNの創業者)登場
 Javaプログラマにとって悪夢な12のこと
  4位 オープンソースを愛しているのにオラクルの社員
  1位 ラリーからの連絡はいつも船舶電話
 コミニティキーノート→パーティ(学芸会?)
  ゴスリンも出た
  ばっくToざヒューチャーのぱくり
  →2009年に
   子供たちが未来→キーノートより手間暇
 OracleとJava
  予定通りに進める(SUNは清く正しくベンチャー)
  オラクルJavaのエバンジェリストを削減
  コミニティとの関係性:びみょう・・
  コミニティさかん、声聞こうとしてる
  Javaカラーは維持されている
  Java is bigger than Oracle
  コミニティが頑張ってるJava
  JJUG CCCは28日 スポンサーいっぱい

・技術トレンド
 DevOps & マイクロサービス
 Javaそのものが重要ではない(Javaは基盤)
  →Javaという言葉がでてこないセッションも
 プログラミングができるのが大事な時代は終わっている
 ITサービス運用が重要
 DevOps
  Dev(開発)とOps(運用)が不可分
 Microservice:ボトムアップ

 先端のWebサービス系企業が取り組んだもの
 →Amazon,Googleの社員がでれないので
 技術群
  Jenkins,spinaker
  Docker
   :

 カナリアリリース
  ブルー・グリーンデプロイ、A/Bテスト
 →サーバー台数を倍にして、ニューバージョンに振り分けていく
 →ろーるばっくすればいいじゃん

 ダークカナリアリリース
  開発者にしか見れないのを、本番環境でテストする
  →バグがあるモノをリリースしろ

 カオスモンキー
  ランダムにサーバーをダウンさせる

 全体的にサービス品質を高めるために部分的な品質劣化を許容する
  不運なユーザーは存在するが、サービスがダウンするような事態にはならない
 エンタープライズ発想とは異なる
  部分の品質を積み上げて、全体の品質を保証

 重要なポイントが変化している

  プロセス:計画
  内部:ソースコード
  外部:ふるまい
  利用時:ユーザーが使って
 →むかしは内部品質
  2000年 プロセス、外部(アジャイル、ユニットテスト)
   →どう動かしたいかを考えてコードを書く
    インスタンスをどうふるまわせるか:DI
  今:利用時の品質 SLAをどうしたらよいか
   →クラウドデザインパターン
    何を見て正解かが変わってきた
  Javaエンジニアだからってサーバーのことを知らなくていいという世界ではなくなった

・サマリー
 来年のJava Oneに注目:Java9がリリース
 Javaだけではないトレンドにも注目
 JJUGをよろしく

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

Seasar2のサポートって、2016/9/26で終わるの!!(NRIさん、データさん、ビジネスチャンス?)

2015-10-15 11:12:29 | JavaとWeb
えっ!!

ここ

DJ HIGAYASUWO (元ひがやすを)

Seasar2から卒業しよう
http://d.hatena.ne.jp/higayasuo/20150928/1443415547

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


土曜日に行われたSeasar Conference 2015で発表しましたが、Seasar2、S2JDBC、SAStrutsのサポートを2016/9/26で打ち切ります。

Seasar2からの移行パスは、あえて私からはいいません。


知らぬ間に終わってた・・・

なぜ、知ったのかは、次のエントリで・・

P.S 追加

続Seasar2から卒業しよう
http://d.hatena.ne.jp/higayasuo/20150929/1443512853

によると、OSSなので、新たなコミッターが出た場合、
その人たちで継続するのは自由みたいなことが書いてあった・・・

NRIさ~ん、データさ~ん、SSLさ~ん
ビジネスチャンスですよお~
Seasar2のコミッター、やりませんかあ?

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

【お題】Struts2でdjunitしたい(ServletRequestAwareを実装)

2015-10-09 15:29:24 | JavaとWeb
前に、

Strutsの単体テスト StrutsTestCase for JUnitの使い方(16日追加)
http://blog.goo.ne.jp/xmldtp/e/aba8bac027597bd6e39c4d54f2f62c5a

で、Struts1の単体テストの話をした。
で、Struts2でJUnitテスト、djunitテストをしたい場合は?

SessionAwareやServletRequestAwareを使っていない場合は、問題ない。
そのまま、呼び出してくれればよい。

SessionAwareなら、まだまし。
HashMapをsessionにみたてて、そのMapをsetSessionで渡せばOK

問題は、ServletRequestAware。
これは、Tomcatが使っているCoyoteRequestとか、Requestとか
使おうとすると、いろいろたいへん(依存性とかあって・・・*注1)
で、どうするか?というのが、今日のお題。




【対応策例】Struts1のときに使ったstrutstestを使おう!

 上記Struts1の単体テストの話のときに使ったstrutstestの中に、

  servletunit.HttpServletRequestSimulator

 というのがいるので、こいつを使う。
 こいつは、setParameterができる。




【やってみよう】

・前提
 eclipseでやる→JUnitは標準的に作れる
 djunitは、いれたものとする(注2)
 strutstestは、ダウンロードしてあって、解凍してでてきたjarに対して
 作成するプロジェクトから、クラスパスが貼られている
 (プロジェクトで右ボタン、プロパティのJavaのビルド・パスで
  外部jar追加を行った) (注3)

 テスト対象クラスは、こんなかんじ
package struts2.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;

//==============================================//
//												//
//	Struts2										//
//	セッション、リクエストのサンプル			//
//												//
//==============================================//
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
	private String name;						//	sタグの変数
	private String msg;

	private Map<String,Object> session;						//	セッションの宣言
	private HttpServletRequest request;			//	(2)リクエストの宣言

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

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

	//	セッションで必要なアクセサ
	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;
	}

    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++;		//	今回の分を足す
  	    setMsg("Hello World" + name + ":"+ kai+"回目");


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

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


・テストするクラスを作る
 そこから、sessionは
HashMap<String,Object> session = new HashMap<String,Object>(); // セッションの作成
test.setSession(session);

 なかんじで、HttpServletRequestは、
HttpServletRequestSimulator request
= new HttpServletRequestSimulator(new ServletContextSimulator()); // HttpServletRequestの代わり作成
test.setServletRequest((HttpServletRequest)request);

なかんじでセットする
 以下のソースのかんじ

package struts2.gui;

import static org.junit.Assert.*;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import org.junit.Test;

//==================================
// HttpServletRequestのかわりに必要
//==================================
import servletunit.HttpServletRequestSimulator;
import servletunit.ServletContextSimulator;

public class HelloActionTest {

@Test
public void test() {

//============================================
// いろいろ設定
//============================================
// 作成する
HelloAction test = new HelloAction();

// SessionAware設定
HashMap<String,Object> session = new HashMap<String,Object>(); // セッションの作成
test.setSession(session);

// ServletRequestAware設定
HttpServletRequestSimulator request
= new HttpServletRequestSimulator(new ServletContextSimulator()); // HttpServletRequestの代わり作成
test.setServletRequest((HttpServletRequest)request);
String ret;

//============================================
// テスト実行
//============================================

// 1回目
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(((String)session.get("kaisu")).equals("1"));

// 2回目
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(((String)session.get("kaisu")).equals("2"));

// 3回目
String[] args = new String[1];
args[0] = "1";
request.setParameterValue("start", args);
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(request.getParameter("start").equals("1"));

// 4回目
ret = test.execute();
assertTrue(ret.equals("success"));

}

}



・実行すると、こんなかんじ





*注1:HttpServletRequestはインターフェースなので、実際に使うには
実装しているはず。

Tomcat5では、CoyoteRequestで実装しているらしい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9845&forum=12

Tomcat7では、
http://www.coderanch.com/t/567946/Java/java/Java-Tomcat-Java-Tomcat
によると、CoyoteRequestがRequestになったらしい
このRequestは、catalina.jarのorg.apache.catalina.connector.Request
にいるが、こいつを使おうとすると、いろんなものをリンクしないとエラーになる。


*注2
入れ方については
テストを楽にっ!!「djUnit」によるJavaソーステスターへの道
http://maplesystems.co.jp/blog/all/programming/11326.html
の「導入方法」を参照。大事なことは、指定するロケーションのURLは
http://works.dgic.co.jp/djunit/update/3.5.x/site.xml
ってこと。それ以降の使い方については
http://www.mitchy-world.jp/java/test/djunit.htm
を参照のこと。


*注3
ダウンロードURLは、
http://sourceforge.net/projects/strutstestcase/files/

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

先生!JQueryでHTMLのエスケープって、どうするんですかあ?

2015-10-09 12:12:12 | JavaとWeb
【質問】PHPなら、htmlspecialcharsとかあるけど、
JQueryで同じようにエスケープさせたいとき、
どうするんですかあ?

【答え】$("#いれたいところ").text("入れたい文字");でやります。

【質問続き】でも、枠とかも書きたいんですよ!

【答え】
 枠の部分を先に

   $("#いれたいところ").html("空枠のHTML");

 で書いておいて、
 その空枠にIDを降っておいて、あとで、

   $("#空枠に振ったID").html("入れたい文字");

 とします。

サンプル

<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>フォーム</title>
<style>
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript">
var rec=[
		{"title":"<B>1</B>","honbun":"&本文1"},
		{"title":"<B>2</B>","honbun":"&本文2"},
		{"title":"<B>3</B>","honbun":"&本文3"}
	];

function zikko()
{
	//==============================
	//	外枠をHTMLで書く
	//==============================
	buf = "";
	for (i = 0; i < rec.length ; i ++ )
	{
		buf = buf + "<DIV ID='title" + (i+1) + "'></DIV>";
		buf = buf + "<DIV ID='honbun" + (i+1) + "'></DIV>";
	}
	$("#area1").html(buf);

	//==============================
	//	中身をTEXTで書く
	//==============================
	for (i = 0; i < rec.length ; i ++ )
	{
		$("#title"+(i+1)).text(rec[i].title);
		$("#honbun"+(i+1)).text(rec[i].honbun);
	}

}
</script>
</head>
<body>
<h1>テスト</h1>
<DIV ID="area1">
</DIV>
<button id="submit" onclick="zikko()">実行</button>
</body>
</html>


結果(ボタンをクリックすると)


もし、textのところをhtmlにすると


タグはエスケープされず、解釈されてしまい、太字と&になる

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

Struts2でJSONで返したい(RESTっぽくしたい)その3 テキストでJSONを書く

2015-09-30 09:04:41 | JavaとWeb
いや、ニーズはないと思いますよ、思いますけど、一応・・・

昨日、

Struts2でJSONで返したい(RESTっぽくしたい)その2 struts.xmlを使う
http://blog.goo.ne.jp/xmldtp/e/b2ce6e54c1ca160ad1727dd876705e1b

を書いたけど、JSONライブラリを使わないで、
・response.getWriter()で、PrintWriterをとってきて、
・printで、JSONの内容をテキストで書き出す
こともできる。

これではニーズないと思うけど、テキストファイルをダウンロードしたい
場合も理屈は同じなので、そういうニーズはあるかもしれないということで、
その方法も書いておく。




■お題

昨日と同じ。つまり、

を、今回は、テキストとして出す。




■変更点
 昨日との違いは、
・struts2-json-pluginは、いりません
・struts.xmlの書き方
・Actionの書き方
なので、今回は、struts.xmlとActionの内容を載せておきます。
(あとのweb.xmlの配置などは、ふつうのStruts2と同じなので省略)




■struts.xml

Struts2をやってみる (3) - のtypeに関して
http://kinjouj.github.io/2013/09/struts2-3-result-type.html

の「plainText」を参考にしました。結局、こうなる。

<?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="hello" namespace="/" extends="struts-default">
        <action name="hello" class="struts2.gui.HelloAction">
        	<result name="success" type="plainText">
			<param name="charSet">utf-8</param>
		</result>
        </action>
    </package>

</struts>

上記の例は、「struts2.gui.HelloAction」というクラスにexecute()があって
execute()で、getWriter()して、テキスト書き出しするというもの
(リターンがsuccessのときに)




■Actionの書き方

基本的には上記サイト「Struts2をやってみる (3) - のtypeに関して」の
「plainText」のstruts.xmlの下にあるソースを参考にしました。結局、こうなる。


package struts2.gui;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;

//==============================================//
// JSONのサンプル
//==============================================//
public class HelloAction extends ActionSupport implements ServletResponseAware{

private HttpServletResponse response;


public void setServletResponse(HttpServletResponse response) {
this.response = response;
}


public String execute()
{

response.setContentType("text/plain; charset=utf-8");

try {
PrintWriter out = response.getWriter();
out.print("{\"japanese\":\"ようこそ世界\",\"english\":\"Hello World\"}");
out.close();
} catch (IOException e) {
e.printStackTrace();
}

return SUCCESS;
}

}


closeしないと、出力されないこともあるので注意



こんなかんじかな・・・

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

(連想配列の配列ではなく)連想配列の大きさとキーでのソート

2015-09-29 18:33:44 | JavaとWeb
いま、HashMapを、JSON形式にして、送るとする。
プログラムは、こんかなんじ。

結果、JSONは、こんなかんじ。

これをAJAXで受けると、こんな問題が起きる。




■問題

(1)HashMapは連想配列に入るが、その連想配列の大きさが分からないので、
   ループがまわせない

  【解決策】
   for(key in data) の形でまわせば、大きさが要らない。
   だから、回りはする。でも、

(2)for(key in data) の形でまわすと、順番が狂う
  →そもそも、HashMapに順番がない。
  →Javascript側でも、JSONを連想配列に変換した場合、
   順番は本来は、どうでもいいことになっているようだ・・・
  →連想配列の配列でなく、連想配列そのものを、ソートして出したい。

【参考】 
PHPと異なり,JavaScriptの連想配列とfor in構文には順序の概念がないので注意すること
http://d.hatena.ne.jp/TipsMemo+computer-technology/20140601/p1




■コレに対する、世論

 Webを見ると、大きく2つの主張がされています。

(1)連想配列のソートは可能
  →多くのケースでは、連想配列を配列に入れて、それをソートしている
  →今回は連想配列そのものを順番に出そうという話なので、このケースではない

(2)連想配列のソートは不可能
  たとえば、以下のサイトでは、そう主張している

  連想配列のソート
  http://xn--l8j3bvb4foc.jp/contents/javascript/jsmemo4.htm

これらの方法とは違う方法で、出来ます。




■解決法

 キーだけを、配列で取ってくる方法があります

  keys = Object.keys(data);

 大きさを知りたい場合は、keys.lengthで分かります。

 キーをソートしたい場合はkeys.sort()でソートします。
 ソートした結果を取り出したい場合は、

 のようなかんじで取り出せます。結果は、こんなかんじ


【参考】
javascript 連想配列(オブジェクト)の要素数が知りたい。
http://chaika.hatenablog.com/entry/2014/08/07/103459

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

Struts2でJSONで返したい(RESTっぽくしたい)その2 struts.xmlを使う

2015-09-29 13:13:38 | JavaとWeb
前に

Struts2でJSONで返したい(RESTっぽくしたい)
http://blog.goo.ne.jp/xmldtp/e/e1bf4ddc8fdace75f0ee1c7226ef4f88

を書いたけど、そのときは、ゼロ・コンフィグレーション(struts.xml)
だった。struts.xmlを記述する方法は、


Struts2でレスポンスをjsonにする方法
http://sugiim.hatenablog.com/entry/2013/02/21/190000

にあるけど、
・具体的に、struts.xmlをどう書くか?
・Action側はどう書くか
について書いていないので、今回は、そのお話を少し・・・




■お題
hello.actionを呼び出したら、
ハッシュマップ(というか連想配列で)
  englishはHello world
  japaneseはこんにちは世界
とJSON形式で返る、つまり

っていうのを作成する




■変更点
 ふつうのStruts2と違うのは、
・struts2-json-pluginを入れる
・struts.xmlの書き方
・Actionの書き方
なので、この点についてだけ、ソースを出して記述します
(あとのweb.xmlの配置などは、ふつうのStruts2と同じなので省略)




■struts2-json-pluginを入れる

上記の「Struts2でレスポンスをjsonにする方法」で、「プラグイン追加」
のところ。そこでは、mavenを使っているからpom.xmlを修正しているけど、
ここでは、手作業でやってみる。

mavenはmavenリポジトリ(http://mvnrepository.com/)からとってくる。
今回は、mavenリポジトリのstruts2-json-plugin

http://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin

の中から、下にスクロールすると、適当に新しいのがあるので、
好き勝手に選んで、バージョン番号(例えば2.3.24.1)をクリック
変わった画面で、

downloadをクリック

ダウンロードしたjarを、WEB-INF/libの下にコピーします(他のjarと要領は一緒)




■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="hello" namespace="/" extends="json-default">
	<result-types>
		<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
	</result-types>
        <action name="hello" class="struts2.gui.HelloAction">
        	<result name="success" type="json">
			<param name="root">msg</param>
		</result>
        </action>
    </package>

</struts>

上記の例は、「struts2.gui.HelloAction」というクラスにexecute()があって、
そのクラスのアトリビュートにmsgがあり、そのmsgをJSON形式で送る場合の指定
(リターンがsuccessのときに)




■Actionの書き方
上記例で指定した、struts2.gui.HelloActionは、こんなかんじ。

import java.util.HashMap;
import com.opensymphony.xwork2.ActionSupport;

//==============================================//
// JSONのサンプル //
//==============================================//
public class HelloAction extends ActionSupport{
private HashMap<String,String> msg;

public HashMap<String,String> getMsg() {
return msg;
}

public void setMsg(HashMap<String,String> msg) {
this.msg = msg;
}

public String execute()
{

HashMap<String,String> map = new HashMap<String,String>();

map.put("english","Hello World");
map.put("japanese","ようこそ世界");

setMsg(map);

return SUCCESS;
}
}


JSONで返す値(struts.xmlのresultタグ内のparamタグで指定)を
宣言し、アクセサ(setter,getter)をつけることと、

値をセットしたら、successでリターンしていること




こんなところかな・・・

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

Struts2でJSONで返したい(RESTっぽくしたい)

2015-09-23 23:23:23 | JavaとWeb
やっと、本題に来ました。
いままでStruts2を書いてきたのは、ほかでもない、表題の件を
やりたかったからです。

つまり、Struts2でRESTもできるんだけど
http://struts.apache.org/docs/rest-plugin.html

そこまでやんなくてよくて、AJAXで呼出し、JSONで受けたいというような場合、
どうするかというお話。




具体的な方法は、

http://kamegu.hateblo.jp/entry/struts2/json-result
などに書かれています。
今回は、そこにあるような、ゼロ・コンフィグレーションによる
書き方を行います。

なお、struts.xmlを書く(ゼロ・コンフィグレーションでない書き方)は、

Struts2でレスポンスをjsonにする方法
http://sugiim.hatenablog.com/entry/2013/02/21/190000
にあります。




■概要
セロコンフィグで書く場合

・JSON用プラグインstruts2-json-plugin-2.3.4.jarをダウンロードします。
・ソースのパッケージはXXX.○○○の形へ
・ダウンロードしたjarにパスを通して、
 Javaのソースでは
  import org.apache.struts2.convention.annotation.ParentPackage;
  import org.apache.struts2.convention.annotation.Result;
  import org.apache.struts2.convention.annotation.Results;
 する
・ソースに@Resultsアノテーションを書く
 @Results({
@Result(name="success", type="json", params={"root", "session"})
 })
 この場合、返るJSONは、session、つまり、セッションの内容
・@ParentPackage("json-default")を書き、返る値の型をJSONに指定する。

こんなかんじですかね・・・




■お題
hello.actionをnameを指定して呼ぶと

回数やメッセージをJSON形式で返します。




■準備

・JSON用プラグインstruts2-json-pluginをダウンロード&パスを通す

 以下のサイトにあるので、適切なバージョンをダウンロード

http://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin
今回はstruts2-json-plugin-2.3.4.jarをダウンロードしました。

 そして、web-inf/libの下に置き、eclipseで開発する場合、プロパティのjavaのビルドパスで、
 外部jar追加によって、追加しておきます。

 これをダウンロード&設定しないと、Tomcat実行時


9 18, 2015 5:25:17 午後 org.apache.catalina.core.StandardContext filterStart
重大: フィルタ struts2 の起動中の例外です
Unable to load configuration. - [unknown location]


というエラーが出て、サービスが立ち上がらない

・struts.xmlは、いらない(削除してよい)



■ソースstruts2.gui.HelloAction.java
ソースコードは以下の通り
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.ParentPackage;
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;

//==============================================//
//												//
//	Struts2										//
//	セッション、リクエストのサンプル			//
//												//
//==============================================//
@Results({
	@Result(name="success", type="json", params={"root", "session"})
})
@ParentPackage("json-default")
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
	private String name;						//	sタグの変数
	private String msg;

	private Map<String,Object> session;			//	セッションの宣言
	private HttpServletRequest request;			//	(2)リクエストの宣言

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

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

	//	セッションで必要なアクセサ
	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;
	}


	@Action("hello")
    public String execute()
    {
  	    //======================================//
  	    //		値の取得						//
  	    //======================================//
    	// name取得
		setName(getServletRequest().getParameter("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でシェアする