のた犬のうまい猫めし

どら猫が作る、のた犬のための飯、略称、どら飯について語りつつ、各種技術、経済系セミナーに参加した報告、OSSいじってみた等のネタを入れていきます。更新情報はtwitterの@nota_inuにて。

Java女子部セミナー「JVMのいろは」日本電信電話株式会社OSSセンタ 久保田祐史氏

 

後日公開された資料:

JVM のいろはにほ #javajo

 

ここ(今回のセミナー)ではJVM=HotSpot VM。OpenJDK/OracleJDK。Oracleから落とせるJavaのこと。java Dukeのように実行するところがJavaVMの出番。Java仮想マシンJavaバイトコードの実行環境。書いたコードがどこでも動くようにするもの。主な機能として、コードを実行するための機能、メモリの管理(プログラマがやらなくていい分、こちらがやらなきゃいけない。ガベッジコレクタとか)。コードを実行するためにはクラスの存在を知り、ロードし、検証(パッケージ情報を識別するとか。ロードしただけで放置ではない)するクラスローダがある。インタプリタJITコンパイラが、メソッドの要求する命令、計算を実行する。

  • JVMJREJDKの違い? →とりあえずJDKでOK。JVM、クラスライブラリを合わせたのがJREJava Runtime Environment)、それに開発ツール(javac)を含めたのがJDK。最小限だけの場合JREだが、トラブルシューティングのためJDKも入れたほうがよい。客先に入れる場合にはマイナーバージョンも合わせたほうがよい。(Versionをどうやって確認するかも必ず事前に見ておくこと。Linuxの場合にはrpm -qa | grep javaWindowsの場合もスクリーンショットとって送ってもらう。)
  • クラスローダとは? →クラスファイル(.class)を動的にメモリ上にロードする機能。必要な時(たいていは起動した瞬間だが具体的な説明は困難。クラスパスに通すと実行した瞬間に読み込む)にロード。複数あり、親子関係を持つ。Javaで書かれている。
  • インタプリタ? →バイトコード中間言語)を逐次解釈しながら実行する。OSが直接実行するより遅い。よく使われるのは機械語にして高速化するのがJITコンパイラ。(Just in time。じっと、と読む)実行回数が規定値を超えたもののみコンパイル。(これを超えた、という明確な基準は不明。)
  • 開発者が意識するポイントは? →知りたい人だけ知ってればよい。なんとなくなイメージだけとらえていれば。このレベルで高速化することはほぼない。ただNoClassDefFoundErrorが出たらクラスローダの仕組みを理解するとき。IBM資料(http://www.ibm.com/developerworks/jp/websphere/library/java/j2ee_classloader/index.html)、@ashigeru 氏が作ったSlideShareの資料(http://www.slideshare.net/ashigeru/classloader)がよい。ソースを変えずにデバッグしたい場合(jarだけある)、バイトコートインジェクション。(例:ツールとしてbyteman。)挙動だけ見ることができる。

クラスローダーについて

 

 

  • JITコンパイル方法を知りたい:JavaDayTokyo2014資料がよい。(http://researcher.watson.ibm.com/researcher/files/jp-ISHIZAKI/PPL_SummerSchool2004_ishizaki.pdf とかかな。)だが、知りたい機会はほぼこない。
  • Javaのメモリ構造は? →HeapとNonHeap(非ヒープ)、JVMは主にCヒープを使う。HeapとNon Heap合わせてHeapと呼ぶことも。HeapはYoung世代、Tenured(Old)世代、非Heapは世代なし(Permanent。JDK8以降はMetaspace)。YonungはさらにEden、Survivor1、Survivor0がある。
  • Heapわけの理由は? →複数GCガベージコレクション)を利用するため。停止時間を短くするために複数ある。YoungがMinor GC、TenuredはMajorGC。アプリケーションがずっと動いていてオブジェクトが不要にならないとTenured。若くてどんどん死ぬものはYoung。MajorGCは大きな空間を見るのでそれに向いているアルゴリズム。範囲広くてしっかり、な感じ。
  • OutOfMemoryError(OOMEと略されるらしい!)の原因をどうやって確認する? →そのときにメモリ周りを意識することに。メモリリークか、メモリ不足か、バグか。(Slideshare oomeで検索すると説明資料が出てくる。http://www.slideshare.net/YujiKubota/javalangoutofmemoryerror-java)まずはOOMEの後にすぐ出るメッセージを確認。Java.heapと書かれているとHeap。リークか不足か。ヒープ使用量をグラフ化して確認する。増えたり減ったりしつつも増えすぎている場合、急にどんと増える場合(アクセスが増えてセッション維持して回収できない場合等)。YoungとOldは、参照があるかどうかの違い。不要になったタイミングでGCで回収される。YoungとOldの違いは、オブジェクトの年齢で、参照され続けてオブジェクトが長生きしていたらYoungからOldへ移動する。参照が無くなったら不要になり、不要になったタイミングでGCで回収される。(脚注:講師に修正ご指摘いただきました。ありがとうございます。)まずEdenに入り、次にSurvivor0に入り(例:Bufferがcloseしたら捨てる、Webアプリでセッション作ってオブジェクトがどんどん増えてブラウザが切られてセッションが終わったら参照も切れてGCがそのタイミングで。(SlideShareCMS GCで検索すると出てくるスライド参照。GCログの読み方等が書かれている。

    http://www.slideshare.net/YujiKubota/concurrent-marksweep-garbage-collection )

 

java.lang.OutOfMemoryError #渋谷java

 

 

Concurrent Mark-Sweep Garbage Collection #jjug_ccc

 

 

  • GCを見るには? →GC Viewer。GCのログを指定して読み込ませてやる。Full GC LineとUsed Heapを表示するとよい。Full GCが発生しても右肩上がりならリークしている。
  • いつ見ればよい? →結合試験あたり。OutOfMemoryErrorが出るか、性能試験のときか、あたりで見ればよい。アプリケーション停止時間が見られるので、10秒とかなっている場合にはメモリ増やすなりチューニングする。(Heapメモリ。OSのメモリではなくHeapだけに関係する。OOMEはCヒープよりむしろHeap。)
  • OutOfMemoryErrorとは? →ExceptionではなくError。一貫性がなく不安定。意図しない動作。情報を取ったらすぐ殺す。HeapDumpを取るオプションがある。CoreDumpを取るオプションもある。メッセージ種別によって原因がいくつかある。Java heap space(-Xmxで指定した以上のヒープを利用しようとした場合。ログからの調査。GCログはloggc、PrintGCDetailsで確認。ヒープダンプから分析。PrintClassHistogramでクラスがどれだけとっているか。←HeapStatusで全部見える)、GC overhead limit exceeded(GCが頻発して時間的な閾値を超えた。98%。GCががんばっても回収間に合わない。メモリ不足で落ちる。OracleJVMでよく発生)、unable to create new native thread(スレッド作成上限。procfsのVmHWM、free等で確認。Xssかメモリ増設。JMX、jconsole、jstack等でスレッド数を確認。OSでスレッド数を変えることもできるが責任はとれない)、could not allocae Unicode String(String作るときに入らない。JDK6ではPermGem、7以降はHeapを増やす、とりあえずString縮める)、PermGen space(設定値の変更する。JVMロード総クラスサイズの見積もりミス。付加試験を行い、HeapStatsかGCログで最大サイズ測定。PrintGCDetailsで表示できる)……。
  • 自分たちが作っていないクラスが増えている場合? →JVMのバグの可能性も疑える。
  • コードをどう直すべき? →ぐぐる

 

【HeapStats】

障害が起こった時に障害解析したいが、分析の前準備が煩雑で、障害の再現待ちとか手作業での解析とかで時間がかかるが、HeapStatsを使うことでログを常時収集しつつ、メモリリークの予知検知し、SNMPトラップで流せる。5%以下の低オーバヘッドで常時収集。
インストールはrpm(中身が一部アセンブラなのでWindowsは動かない)。Javaの起動オプションを一つ追加でOK。実行中のJavaプロセスに設定することも可能。オブジェクトの参照関係を表示できる。(フレームワークのことも見える。)

AnalyzerはSWINGからJavaFXへ。より直感的になる予定。OSSとして公開済み(詳細は http://icedtea.classpath.org/wiki/HeapStats/jp)。CodeZineに解説記事がある。 


知らないなんてもったいない! 障害発生の原因を洗い出すOSSのJavaVM解析支援ツール「HeapStats」を使ってみよう (1/5):CodeZine

 

【参考】

以前のHeapStatsに関するセミナーについて:


JavaOne 2014 報告会「HeapStats の発表と出展を通して見えた JavaOne2014」高雄 慎二氏 - のた犬のうまい猫めし

 

のたどらトイレに泣く Part2_4 真空すぽすぽ

f:id:notainu:20150301201254j:plain
猫が真空式パイプクリーナーについて調べてきた。三栄水栓、PR8700-L。近所の大きめのホームセンターで入手。ほかにも同様のものがあるが、なんとなくいろいろなところの評価がよさそうだったので、これで。

f:id:notainu:20150301201818j:plain

f:id:notainu:20150301201830j:plain

「Javaプログラミングをスッキリ学ぶための10のコツ」セミナー

「スッキリわかるJava入門第2版」、「スッキリわかるJava入門実践編第2版」出版記念セミナー。岡田大輔氏(日本オラクルOracleUniversityビジネス推進部。Java関連資格・研修企画推進)、中山清喬氏(フレアリンク代表取締役)(スッキリ……の著者)。中山氏が主にしゃべり、時々岡田氏にふる感じで話が進む。

 

Java学習のかべパターンと解決方法】

  • 学び始める不安。文系。簡単ではなさそう。→挫折して失うものを具体的に想像する。オブジェクト指向は文系理系関係ない。簡単に見えるものが簡単とは限らない。有用かが大事。
  • 学習開始直後で、環境構築、エラー。→SaaSオールインワンIDEの活用。EclipseNetBeans、IntelJ等。NetBeansだと入れるとすぐ日本語になるので初心者に優しいらしい。(私はEclipse日本語化せず使う派。)中山氏はvi派らしい。vi用のvラッパーがEclipseにあるとか。エラーで動かない場合には「写経」(はじめのみ。コピペから少しずつ変えてみると良い。コンパイルエラーを確認する。わからなけれがググる。)→(って、このレベルの聞きに来る人が写経って通じるのか?)
  • 学習中のかべ。急に難しくなる。→一日一章計画はNG。難所にリソース重点的に投入。難所をしっかりフォロー。
  • 難しい原因と対策:複雑なのはゆっくり繰り返し、混乱するのは混乱のもと確認、教えにくい場合は教材講師選定。言葉で伝えにくいものは体験で(?)
  • 複雑な部分:配列参照、クラスパス(複数クラスファイル)、継承時コンストラクタ。(インスタンス多重構造と構築順序、暗黙の親、デフォルトコンストラクタ。)参照型、メソッド、クラスとインスタンス、thisやsuper、参照代入可能性。
  • 教えにくいの:参照、オブジェクト、抽象クラスとインタフェース、多態性、関数オブジェクトの概念。初学者や小規模コードでメリットを実感しにくい部分。
  • 現場と学んだこととのかべ。→慣れる。現と知識以外の知識。
  • Javaの今:2年周期で新しくなっており、先まで何が入るかは明らかにされている。Googleチュートリアル(入門)検索されているのはぶっちぎり一位で約24%(次はPHPで11%)。(Androidのせい?らしい。)企業利用率も一位Java、二位VB.NET(そうなの???)。JavaDayTokyoが2015/4/8@東京フォーラムがあるので、さらに詳しいこと知りたい場合はこちらへ。(http://www.oracle.co.jp/jdt2015/
  • 一線で戦う武器(言語)をいくつ持てるか。中山氏の場合、汎用としてJava(Play、JEE)、短期決戦用にRubyRails)、Client、SPA用にJavaScriptjQuery/Ext)、TEX(出版言語として)。武器数制約を考えるとJavaは優位。(デバイス、作れるものなどの面で。)岡田氏はJavaOracleの社員だからw)。ClientとしてはJavaScriptも併用。
  • 何を目標に学べば良い?→成人学習には「必要性、得意意識、興味」のどれかが必要。短期目標(2週間、1ヶ月とか)としては次々達成していく達成感とリズム(自己肯定感)、長期目標としては将来達成する大きな価値を考える。(ビジョンに近い感じの。)自信を持つには資格などの第三者評価も有用。
  • 資格:Oracleが行っており世界共通の資格。海外でも有用(へー)。ITSSスキル標準と合わせ、Bronzeは0、Silverは1、Goldは2、その上に3。昔は試験範囲が広く受かりにくかったが、今は細分化して受けやすくなったらしい。Bronzeは新人研修やったら取れるレベル。スッキリシリーズ入門+実践で、SilverからGoldの途中くらいまでカバー。(Goldは若干マニアックな部分が含まれているため。)試験対策としては黒本(徹底攻略Java SE 7 Silver問題集 http://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-803-IT%E3%83%97%E3%83%AD-IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5/dp/484433610X/ref=pd_bxgy_b_img_z とか)で。
  • 効率よく学ぶには?→「成長が金や時間を生む」人は効果な研修も効率が良い。(急速に成長させることで利益がちゃっちゃと出る場合。ただし研修には当たり外れあり。)(スッキリ入門編は一週間程度を目安。)Web独学は茨の道。(概念、広い範囲。)一般的な人向けには市販書での勉強がバランス良い。書籍はコレを選び、周辺情報をつけていくのが良い。Webもホットやすごいのもあるが、古いものもあり初めての人はそれが選別できない。取捨選択ができないうちは何かによりそって(研修、本)、で。
  • 入門者に教えられない→知ってると使えるが違うように、使えると教えられるも別の能力。壁を超えるための定石がある。訓練が必要。(トレーニング方法もある。)教えるための意識は技術者と真逆。
  • ***トップダウンボトムアップのメリットをうまく利用する。全体がこんなにたくさんある、と思ってしまうと不安(トップダウン)になるが、終わりが見えない不安(ボトムアップ)もある。入門者向けとしてはボトムアップで小さな達成感を繰り返すのが良いが、研修テキストだとトップダウンが多い。(学習ゴールがあり全体が見えているため。)どっちかではなく組み合わせる。ボトムアップだと、次へ行く前に動機づけする。
  • ***ルールから説明と具体例から説明、も同様にメリットをうまく利用する。例えば、の例から像を結びやすい人もいるし(人による)、確実に原則を伝えられるルールベースが良いことも。学び手との相性を見つつ。
  • 入門者向け解説パターン:少しずつ(学び、動かし、少しずつしか見せない(見ると不安・混乱。ただある程度割り切って隠さないと、受け手がわかりにくくなる。解説に矛盾が出てくることもあるので説明順番が難しい。正しいことを話していない罪悪感も)、デフォルメ(簡略化。単純化。導き手の能力が問われる)、題材選び(学び手がよく知り、興味がある題材を。勉強自体に興味が無い人にたいしてどうするか。新人に対してだと業務のイメージがないので、業務に寄せるか、それ以外のものに興味をもたせるか、が難しい)。→導き手としての勇気(学びての成長のために隠す(高度な知識や用語を飲み込み、厳密に不正確でなく、高尚ではない題材を選ぶ勇気。周り(知っている人)から見て怒られないか。ただこれができず技術者メンタリティから離れられないとダメ。
  • 導き方は?→カリスマ型(背中を見せて)、スコート(手を取って一人ひとりの目を見て。その人にとってわかりやすいのはなにか個別に対応)。素敵な学びの経験を持つと導き手に近くなれる。今後導き手スキルは重要。

 

【スッキリ本の中の人】

  • 著者中山氏の他、国本氏(ServletJSP講師)、飯田氏(SQL担当)。イラスト高田氏(ドイツ在住)、DTPにSeaGrape氏(?)、編集石塚氏、片元氏、玉巻氏(編集長)。他にも営業、デスク等。
  • 著者はTeXで仮組みしつつ執筆。miyabilink.jpという会社につとめている人たちが頑張る話(サイトは実在。)このサイトや中山氏のブログにもなんか色々あるらしい。

 

質疑応答

  • 年配(経験者)どうすれば?→全体研修より個別のほうがいいかも。バックグラウンドが多種多様だと議論が発散したり。一日の研修中一時間をバックグラウンド確認に使ったりもするw
  • 教えるときに、先に高度なことを見せることによって基礎的なところに合点がいくこともあるのでは?→情報量を見せないことが手法としては多いが、納得されないことも。受け手が高度なものをすっと受け入れることもある。教える側が選択を判断する。学び手のタイプによって変えたり。前提知識がない人には最初から、知識があったり好奇心が高い人には実力100に120あたりを与えてみるとか。(焚きつける。より高みを目指させる。)

 

 

今日は猫の日

f:id:notainu:20150222192427j:plain

f:id:notainu:20150222192440j:plain

純米吟醸 官兵衛。蒸米仕込 「日本酒伝統のおいしさを守るために天然水を使用し蒸米から丹念に造りました。」少し癖があり深めの好みの味。
f:id:notainu:20150222192451j:plain

のたどらトイレに泣く Part2_2 100円すぽすぽ

f:id:notainu:20150221215920j:plain
吹き出しの文字書き間違えた。どら猫の語尾はにゃー、のた犬の語尾はぬー、にしていたのに。
すぽすぽ、正式名称はラバーカップ。すっぽんとかかぽかぽとか人によって呼び方が違う。

f:id:notainu:20150221215933j:plain

f:id:notainu:20150221215944j:plain

f:id:notainu:20150221220000j:plain

のたどらトイレに泣く Part2_1 今度は詰まった

f:id:notainu:20150211230148j:plain

f:id:notainu:20150211230159j:plain

Ariki CHARDONNAY 「アリキ・シャルドネは輝きのある淡い麦わら色が特徴。洋ナシやパイナップル、アカシアの花などのフローラルな香りが感じられます。フレッシュな果実味に爽やかな柑橘系の風味が印象的です。鶏肉料理などと非常によく合います。」
すっきりで飲みやすく、料理に合わせやすいというのかあまり個性がない感じ。
f:id:notainu:20150211230207j:plain

BridgePoint、xtUMLでExecutable UMLしたい 1 ダウンロード、インストール、ユースケース図

「モデルベースソフトウェア開発コミュニティキックオフ」(2015/02/07)で話題になっていた、「最近OSS化されたUML描画&コード生成できる」らしいBridgePoint、試してみた。

 

【BridgePointに関する情報リンク(2015/2/9時点)】

  • http://www.mentorg.co.jp/products/sm/bridgepoint/index.html (公式情報。2012年依頼の取り組みを完了し、BridgePointのすべてのソースコードOSS公開。Editor、Verifier、Model Compilerあり。「「xtUML Editorは、実行可能なUMLモデルを作成するための業界最高のツールと言えるでしょう。市場の他のUMLツールと較べて、開発作業が非常に簡単になります。」だそう。)
  • http://www.mentorg.co.jp/products/sm/news/2013/130219.html (ニュースサイトによる説明。)
  • http://monoist.atmarkit.co.jp/mn/articles/1106/08/news002.html (富士ゼロックスによるロボットの取り組みでの使用例。BridgePointでソフトウェアが生成されるまでの図あり。てっとり早く概要をつかみやすい。2ページめに、作成した分析クラス図とかあり。「2日間、アフレル(http://www.afrel.co.jp/)の久保秋真氏によるBridgePoint講習会(ロボコン活動事務局企画)」を受けてBridgePointを覚えたとか。研修には「BridgePointでロボットを走行させる骨組み」が準備されているとか。クラス図に漢字が含まれているとエラー。作成したモデルは「Verifierを使用して動作させ、状態やアクションがうまく定義されているかを確認。3ページめに、WBS(Work Breakdown Structure)も公開されている。)
  • http://www.toppers.jp/docs/education/BridgePointSozeX002.pdf(全30ページの「鹿威し」開発の資料。TOPPERS/JSP カーネルを利用し、かつ、MDA技術としてExecutable UMLのの概念を適用し、CASE ツールにはBridgePoint 6.1D(Project Technology 社)を使用し、モデルをコードに変換するツールとして、同じProject Technology 社のモデルコンパイラ(MC-3020 v3.3)を使用した開発例。MDAの概要とか、UML各種図のサンプルとかあり。2004年と多少古めだが、UMLの貴重な実用例としてもよさげな資料。「MDA によるシステム開発は、機能要求による仕様を表現する分析モデル(PIM(Platform Independent Model)=プラットフォーム独立モデル:実装技術非依存)を作成し、非機能要求を考慮した設計モデル(PSM(Platform Specific Model)=プラットフォーム固有モデル:実装技術依存)へ変換(マッピング)した後コードを生成する」。コード生成にはCygwin利用。make。原本へのリンクは「http://www.toppers.jp/edu-shishi.html」)

 

【ダウンロード&インストール】

公式サイト(http://xtuml.org/)のDownloadsより、「Additional Downloads」へ。Installersの、「BridgePoint for Windows(4.2.0、476MB)」をクリックしダウンロード。(Linux版もあり。)

f:id:notainu:20150209212759p:plain

 

f:id:notainu:20150209212823p:plain


exeをダブルクリックでインストール実行。
「BridgePoint with Eclipse」、「BridgePoint」を選べるが、まぁなんか簡単そうなのでEclipseつきの方を。

f:id:notainu:20150209212955p:plain

 

f:id:notainu:20150209213013p:plain

 

 

デフォルトのインストール先が「C:\MentorGraphics\BridgePoint」だったので、「D:\MentorGraphics\BridgePoint」として、インストールディレクトリ作っておく。そして次へ進んでいきインストール開始。途中でMicrosoft Visual C++2005がどうのと出てくるが特に問題なく進んでいく。

f:id:notainu:20150209213120p:plain

 

f:id:notainu:20150209213158p:plain


D:\MentorGraphics\BridgePoint\eclipse_extensions\BridgePoint\eclipse\plugins\com.mentor.nucleus.bp.doc_4.2.0\ReleaseNotes\HTML\ReleaseNotes.htm にReleaseNotes.htmがあるようで、勝手にブラウザで開いた。
インストール終了。デスクトップのショートカットか(インストール時に作るかどうか聞かれる)D:\MentorGraphics\BridgePoint\eclipse\Launcher.batで起動できるとのこと。
確かに何かできている。とりあえずダブルクリック。

 

f:id:notainu:20150209213228p:plain

 

f:id:notainu:20150209213245p:plain

 

f:id:notainu:20150209213301p:plain

 

濃い水色の何か立ち上がり、Eclipseっぽく、「Workspace Launcher」の指定画面になるので、「D:\MentorGraphics\workspace」にしておく。

f:id:notainu:20150209213319p:plain


おー、何か起動しました。とりあえず「Quick Start」で。「BridgePoint UML Introduction」をまずはクリックしろとか書かれているのでクリックすると、ヘルプが起動したw
見ていてもよくわからないので、ExampleのGPS Watchを選択してみる。Eclipseのプロジェクトっぽいものが起動。「Use Cases」をクリックすると、ユースケース図が起動した。おー。

f:id:notainu:20150209213338p:plain

 

f:id:notainu:20150209213356p:plain

 

ユースケースいじってみよう】

とりあえずユースケースいじってみる。サンプルを使って。

f:id:notainu:20150209213430p:plain

f:id:notainu:20150209213445p:plain

 

f:id:notainu:20150209213531p:plain

 

  • 矢印とかユースケースは、右側にある「Use Case」を開くとGenerization、Include、Extendとか出てくるので、クリックして元図形をクリックして、そのまま後図形まで引張り、後図形の上で離すとつながる。
  • ズームは、右側にある「Zoom Tool」で、通常クリックすると拡大、Shift押しつつクリックすると縮小。(あるいはツールバーの虫眼鏡。こちらが簡単かw)f:id:notainu:20150209213552p:plainf:id:notainu:20150209213617p:plain
  • ユースケースを書こうとするとデフォルトで「Unnamed Use Case」になるが、既に同じものがあると作られないので、テストの時には1とか適当につけておくとOK。f:id:notainu:20150209213703p:plain
  • 日本語も使えるようだ。f:id:notainu:20150209213632p:plain

 

 

 次回はソースコード出力とかやってみるか。

 

のたどらトイレに泣く 10 でも現金の方が安い

f:id:notainu:20150207232207j:plain

f:id:notainu:20150207232301j:plain

VIN DE BORDEAUX PILLEBART 2011 シャトー・ピルバール2011 AOCボルドー「パリ農業コンクールにて銀賞受賞。濃厚なベリーの果実味とコクがあり調和のとれた味わいで満足度の高いワインです。ステーキやパテなどの肉料理やチーズにもよく合います。」
f:id:notainu:20150207232313j:plain

第0回 モデルベースソフトウェア 開発コミュニティキックオフ「ディスカッション」

# compass申込時のアンケートをベースに、本日話された人がパネラーとなって話す会。ちょっと気になった話や単語は大体こんな感じ。

  • モデルベース開発の経験:BridgePointを使ったUMLからのコード生成、AndroMDA
    この機能があればモデルベース開発? →使いやすくメンテしやすい実装コード生成、テストケースによるもでる検証、モデルとコードの同期、ラウンドトリップ機能
  • 動かすモデル:実装レベルに近いものを書いている感じ。コード=仕様。
    MDAの考え方でもモデルは違い、違うところへの変換。ExecutableUMLでもアクション言語でギャップを埋めている。
    コードからモデルへの変換は?:MDAの逆でADM、KDMもある。Eclipseの中に実装したプロジェクトもある。Javaからの変換ができた。
    モデル・コード間の同期、およびテストをどうするかは課題@視聴者。
    グルービー(?)のDSL
    Xtextの場合だと、修正があればモデル側を修正。
    ブリッジポイント(BridgePoint?) 2000年頃、モデルだけをメンテしモデルが生成したものを製品に。組み込み。去年OSSになり、シミュレーションとかいろいろ無料になった。(おーーー!)
  • モデルベースがはやっていない理由:効率の不安。敷居が高くドキュメントがない。UML自体が浸透していない。モデリングが難しい。
    UMLを書いてそれが正解か不正解かはわからない。モデルの書き方をちゃんとするのが一つの工夫。Railsとかは書き方があるが、UMLは書き方がない。自動生成するためにはこうかけば、があれば取り組みやすいのでは。
    →客がモデラーではなく知識がない。Xtextはクラス図を書くと画面イメージがすぐに示せる。仕様を早く固める点では役立ちそう。
    モデルの上達:よいモデルを読む、モデルを読んでもらう。数多くやっていく。天才的なひらめきではなく数多くをこなす。コード生成は、このもでるならうまくいく、などの経験値が大事。フレームワーク、業務ロジック部分がごちゃ混ぜにならないように。モデルベースのほうが分けて考えられてきれいなコードが書ける。
  • プログラム言語自体に何か追加すれば便利になる?:言語自体がアノテーションなどが便利になっている。言語の上のほうも下のほうも充実している。プログラミング言語は膨大で細かいので、構造としてビジネスロジックがこうだ、はモデルが見やすい。関数型モデルで作ったものはUMLで書けないが、あとから追いかける必要があるだろう。
  • ソフトウェア開発で困っていること:手法や技術に関する交流が少ない、手作業依存な開発スタイル、技術レベルの格差、新技術への取り組み意欲の低さ、デファクトツールの少なさ、要件定義、レガシーコード……

第0回 モデルベースソフトウェア 開発コミュニティキックオフ「モデルベースソフトウェア開発 Xtextによる自動生成」ビューファイブLCC田中氏

「モデル」:何らかの対象をある観点から見て抽象化し本質的な情報の集まりにしたもの。観点(視点):どのような立ち位置からその対象をモデルとしてとらえるか。

Xtext:Eclipseのプロジェクトで、テキスト型DSL開発フレームワークhttp://www.eclipse.org/Xtext/電子書籍が無料でダウンロードできる。(http://www.beta-publish.com/
STSSpring Frameworkで動作するアプリ開発のためのEclipseベースIDE
Spring Boot:Springアプリケーションを容易に構築できる仕組み。コードを楽にGenerateできる。

http://www.beta-publish.com/
https://eclipse.org/Xtext/documentation.html


準備:STSEclipse/Xtextをインストール、またはEclipse IDE for Java and DSL DevelopersにSTSをインストール。
インストールすると、Xtextがプロジェクトに登場するので新規で作成。サンプルとして、Greetingという要素を持つ。Run asでSpring Bootで、文法に対応するエディタを作ってくれるので、さらにRun asでspringの何か立ち上がり(Eclipseもう一つ、のような。)そこでJavaのプロジェクトを作成し、test.mydslとかファイル作成し、Hello worldとか書く。元のEclipse画面の中にMyDslGeneratorがあり、コメント化されたサンプルがあるので、コメントをはずし、2つめを再度起動すると、src-genフォルダがあり、greetings.txtができている。ほかにも中にExampleがいろいろ入っている。開くと、AbstractElementがたくさん入っている。パッケージ宣言。Entityやsuper type。

サンプルとしてXbase版 Domain modelを使う。(動画あり。プラグインが組み込まれている。)Application.java。Mmodelというフォルダを追加し……。……。……(--;)>  spring bootで動くので、普通のブラウザアプリがローカルに生成される。クラス図程度を与えると即座に動くようになる、と。(……即座……?)
Spring Bootだと、Pivotal Web ServiceのようなPaasにDeploy可能。(Springが動作するなら。)
OperationをXtend言語(Xtextとセットの言語)で記述するとJava code生成。Xtextはテキスト型だが、簡単なダイアグラム生成の仕組みはあり(PlantUML。Eclipseプラグインあり。簡単なソース(Java)から書き出せる)。CRUIDアプリは「Spring 3入門」の第6章が参考になる。

 

【Mendix(商用)】

ここまではOSS。ここからは商用の例。モデルベース開発をそれなりに実現している。
欧州を中心に実績のあるEnterprise系業務システムに使えるもの。Mendix Business Modeler。Entityモデル、GUIモデル、ロジックモデル。モデル変換はインタプリタ。専用のプラットフォームがありPaaS、オンプレミスで利用。ロジックはxpass(?)使用。モデルを送り込むことで即実行。


【まとめ】

かつてのMDA時代と比べ、関連技術の広がり、深み、実用性がまし、利用できるツールも増えている。DevOPS自動化含め考える課題。

 

第0回 モデルベースソフトウェア 開発コミュニティキックオフ「UMLモデルを使った自動生成」アクティア代表取締役社長 大島則人氏

UMLモデルを使った自動生成

 

2003年頃、Executable UMLと出会った。「動かないモデルはただのスケッチ」。OMG MDAガイドラインver1.0)
動かないモデルを書いても効率が悪いだろう、がきっかけ。目的としては、動くモデルを作りたい。
モデル→Transformation→コード。モデルを変換することでコード生成する。(=動くモデル。)動くモデル≒コード生成。
ただクラス図からget、setを書くだけでは嬉しくない。UMLモデリングしたものをコード生成、ではなく、自動生成するためのモデルをUMLで作る。どういうプラットフォームでどういうモデルを書き、どう生成すると動くのか、を考えることでモデルを動かすことができる。考え方を変えないと動くモデルにならない。
まずは静的構造をモデリングする。クラスモデルに役割(stereotype)をつける。DB entity、Serviceなど。役割ごとにテンプレート(生成されるもの)を切り替える。役割は、標識がないと決められない。Domain Driven Design。設計の方法論が必要。
DDDの主なクラス分類:Entity(永続化されるドメインオブジェクト)、Value Object(ドメインの値)、Service(複数ドメイン操作)、Repository(英奥化装置とドメインの境界)。
Value Objectは、単なる文字列ではなく、「氏名という型」などとして記載していく。String 指名、date 申請日、categoly 申請状態、など。Service、Repositoryは、アプリケーションレイヤの設計。クラスの目的、テンプレートを判断し、生成していく。ステレオタイプをうまく使い、役割をどんどん与えていく。

振る舞い(操作)のモデリング:シーケンス図、コミュニケーションズで最終コードを作れない(保守したくない)。抽象的なところに作っていき、操作に直接コードを埋めていく方法でモデリングする。操作にコードっぽいものを作ってコード生成し、流用する。設計者がわかりやすいDSL(Domain Specification Language)。
たとえば、操作の中にコメントを作り、社員レポジトリ.findAll()などと具体的に書く。findAllは定義していないがあるものとして使っていく、などで設計の手間を減らす。ほかにも導出属性も。(合計旅費の計算を埋め込むなど。)ステレオタイプではタグ付き値で対応付ける。ステレオタイプでメソッド、URLで対応付けを埋め込む。実際に稼働させるとURLでGETリクエストでデータベースを呼び出し……ができる。

 

デモ:Bandicam(www.gomplayer.jp) Magic Drowを使ってUMLを書いている。XMLのテキストモデルに変換し、XMLからコードに変換する。Maven使ってビルドかけて解釈してソースコード生成。warファイルが作られ、tomcatのディレクトリに直接おいて実行させる。Eclipse、Javasソースコードを必要としない。データベースは生成時に作られ、シミュレーションに使われる。Advanced REST。。(GoogleChrome)を使う。RESTインタフェースはJSONでポスト。

 

モデルを作って自動生成するには、どんなプラットフォームでどう動かしたいかを考え、どうモデルを書くか、を考える。UMLを活用することで、ほかの人が理解しやすい形にしている。UMLは決まり事があり書くが、UMLも同じような書き方で、ではなく、方法論で文法で、解釈できるエンジンで、で持っていければ。

第0回 モデルベースソフトウェア 開発コミュニティキックオフ「モデルベースソフトウェア開発の分析・設計」株式会社テクノロジックアート 長瀬嘉秀氏

 アジャイルプログラミングはコードベース。プログラミング言語を見ると仕様がわかる。プログラミング言語仕様書。一度UMLがはやりモデルベースになり、アジャイルになりコードベースになったが、またモデルベースが注目されている。
 従来型のウォータフォールに対してアジャイル。それに伴いテスト、モデル、ドメイン駆動開発への流れ。
 
要件から、インタフェース、トランザクション、プログラムコード、データベースができてくるが、ダイレクトにコードか。その前にモデルがあるのでは、が重要。
モデル:UMLのモデルだけがモデルではない。幅広く、Enterprise,Business,Object,Process,Data,Stateモデル。
たとえばビジネスプロセスで業務を整理。アクティビティ図で業務を整理。(ロール別。)ユースケースではなく業務フローが先。
その次に概念モデル、データモデル。オブジェクトモデル。(クラス図。)Javaコードで書かれるより構造は読みやすい。
ビジネスの仕組みとして、ビジネスルール、ビジネスエンティティ、など。
アジャイル開発ではアジリティとして迅速なモデルの作成、要件の吸い上げを短期間で。パターンの活用を多くやっていく。パターンは、Design,Analisys,Datamodel,Process,Idiomなど。マーチンファウラーの「アナリシスパターン」本がおすすめ。例えば、組織はPartyパターン。そしてパターンを組み合わせる。


MDAのブレークダウンサンプル】

 

開発手順としては、システム分析、システム設計、コード生成。MDAツール(iUML)で。ユースケースを通して機能を考える。ドメインによる分割(システムの境界を識別するためにシステムをドメインに分割する)。ドメイン:UI、アプリケーション、OSなど。ドメイン間の相互作用はシーケンス図。ドメイン内のクラス図作成。相互作用を定義(シーケンス図で)。ステートチャート図を作成してアクションを記述。(アクション言語で。)クラス図に操作を追加し、オペレーションを記述。(小機能をマージし、クラス図にオペレーションを記述。シーケンス図から操作を拾ってくる。)
システム設計では、MDAマッピングに対応するため、ドメイン間の仲介を行うブリッジを定義。Executable UMLの方法。
設計情報はアーキタイプとして。そうするとJavaコードの生成ができる。モデルに設計情報をうまく入れていく。(モデル内にコードを記載。)
実際のシステムでは、オブジェクト粒度調整が必要。大きすてもコードにならない。

 

 


## ……モデルにコードをきちんと書くことでかなりの部分のコード生成が自動でできるのね……。ただ文法理解の手間はありそうだけど。

第0回 モデルベースソフトウェア 開発コミュニティキックオフ「モデルベースソフトウェア開発コミュニティの説明」Actier COO 高崎健太郎氏

compassに掲載されていたモデルベースソフトウェア開発コミュニティに行ってみた。(ハッシュタグは、#mbsdc_japan)

 

 

モデルベースソフトウェア開発コミュニティキックオフイベントオープニング

 

主催者は、Actier COO 高崎健太郎氏。モデルベースソフトウェア開発を行っているベンチャー企業。従業員4名で、そのうち一人がウクライナ美女らしいw No MASAKARI。
会場は代々木で、HatchUPという勉強会スペース無料提供している場所らしい。電源はあり。
コミュニティはGoogleグループ。mbsdc-japan。「さくさく要件定義 勉強会」が次回のイベント。(「モデルベース要件定義テクニック」著者。)

 

炎上プロジェクトの経験より、要件定義がしっかりできておらず合意形成できていないこと、分析・設計に時間が取れず情報不足、設計しないものが作られたり急きょの作成で品質が悪い、などがあげられ、対策として、上流で火の手を上げないこと、シームレスに下流につなげること、がある。きちんと作成したモデルを処理の対象とし、業務使用をきちんとモデルで表現し、モデルをベースにコードを作成する。

人口は減っていくが、情報通信産業は、GDP、雇用者数がまだ伸びる傾向にある。その結果人材不足。そうすると生産性を向上するしかない。無駄を省く。(価値のないものを作る、必要なタイミングにない、同じことの繰り返し。)無駄を省くためにはきちんとモデルで合意形成を得ること、モデルベースでコード生成することでコピペプログラムは機械まかせにできる。→モデルベースソフトウェア開発。

モデリング言語を単なるデザイン言語としてではなく、プログラミング言語に近い形で使いモデル中心で開発することで、生産性向上、品質向上が図られる。抽象度が上がっていく中で、次なる進化として期待されている。(マシン語アセンブリ→オブジェクト→……)
モデルベースは2002-2006年頃ブームになったが(UML2.0頃)、すぐに開花せず育ってきつつあるテクノロジではある。MDA(Model Driven Architecture)は昨年ガイドラインが出た。EMF(Eclipse Modeling Framework)にも影響を受けている。