Java

【JHipster和訳】 Creating an entity

はじめに

JHipsterの勉強を兼ねて以下のページを和訳したものです。
自分の理解用なので結構な意訳なので注意してください。
https://www.jhipster.tech/creating-an-entity/

Introduction

アプリケーションを作成したら、次にエンティティを作成しましょう
例としてBookとAuthorエンティティを作るとすると
以下の作成が必要になります。
  • データベースのテーブル
  • Liquibase(データベースのマイニングツール)の変更履歴
  • JPAエンティティ
  • Spring Data Repository
  • Spring MVC Rest Controller( CRUD用メソッド含む)
  • Angular Router および ComponentとService
  • HTML
  • Integrationテスト
  • パフォーマンステスト
もし複数のEntityである場合、リレーションも必要になるでしょう、
この場合さらに
  • データベース外部キー
  • リレーションを管理するためのJavaScriptおよびHTML
entity sub generatorは必要なすべてのファイルを作成してくれ、
かつフロントエンドのCRUDも提供してくれます。
sub generatorは以下のコマンドで実行します
オプションについては以下のコマンドで参照することができます 各オプションについて
  • --table-name <table_name> – デフォルトではJhipsterはentity名からテーブル名を生成しますが、もしentityと異なる名前を使用したい場合はこのオプションで指定
  • --angular-suffix <suffix> – Angularルートに独自のsuffixを入れたい場合はこのオプションで指定
  • --client-root-folder <folder-name> – フロントエンドのrootフォルダ モノリシックアプリとマイクロサービスアプリのデフォルトは空
  • --regenerate – 作成済みのentityを再生成します。(質問なし)
  • --skip-server – クライアントサイドコードのみ生成します
  • --skip-client – サーバーサイドコードのみ生成します
  • --db – サーバーサイドコードの生成をスキップした際にDBを指定します。 それ以外の場合では効果はありません。

JHipster UML and JDL Studio

コマンドラインでJHipsterでどうやってentityを作るのかはわかったと思いますが、GUIツールのほうがわかりやすくていいという方もいると思います。
そういった場合、2つの方法があります
  • JHipster UML – UMLエディタが使用できます
  • JDL Studio – ドメインを記述するための独自言語であるJDLを使ってentityやリレーションシップ を作成するためのJHipsterのオンラインツール
もしJDL Studioを使用する場合 jhipster import-jdl your-jdl-file.jh コマンドでJDLファイルからentityを作成できます
もし JDLインポートした際に、entityを再生成したくないのであれば--json-only オプションでentityの作成をスキップされ.jhipsterフォルダにjsonファイルが格納されます デフォルトではimport-jdl はentityの変更のみ再生成しますが、もしすべてのentityを再生成したいのであれば、--force オプションを付けてください。ただしこの場合、entityファイルのローカル変更は全て上書きされてしまうので注意してください。 もし import-jdlではなくJHipsterUMLを使いたい場合はnpm install -g jhipster-uml でインストールを行い、その後jhipster-uml yourFileName.jhを実行してください

Entity fields

各entityには好きなだけfieldを追加することができます。 あなたはフィールド名とタイプを入力する必要があり、 JHipsterはそこからAngularのHTMLからLiquibaseのチェンジログまで、必要なコードと設定を全て生成します。 これらのフィールドには使用している技術で予約済みのキーワードを含めることはできません。例えば、MySQLを使用する場合
  • Javaの予約語は使用できません(コンパイルできない)
  • MySQLの予約語は使用できません(データベーススキーマの更新でエラーになる)

Field types

JHipsterでは多くのフィールドタイプをサポートしています。 データベースの型はその種類(Oracle, Cassandra…etc)に依存するため、JHipsterではJava型を使用します、そしてそこから正しいデータベースアクセスコードを生成するのがJHipsterの強みの一つです。
  • String – デフォルトのサイズはバックエンドで採用している基盤によります(JPAを使っている場合は 255) 。また、validationのルールは変更できます
  • Integer
  • Long
  • Float
  • Double
  • BigDecimal – java.math.BigDecimal, 正確な計算をしたい場合(財務運用等)
  • LocalDate – java.time.LocalDate, Javaで正確な日時管理をしたいときに
  • Instant – java.time.Instant, timestampを使いたいときに
  • ZoneDateTime – java.time.ZonedDateTime, タイムゾーンのあるdatetimeを扱いたいときに(カレンダーの予定等) 注意点として、タイムゾーンはRESTでも永続化もサポートされていないので、Instantを使ったほうがよいでしょう
  • Boolean
  • Enumeration – JavaのEnum, もしこのタイプを設定した場合, sub-generatorからどんな値が必要なのか尋ねられます。
  • Blob – バイナリデータを保存するためのオブジェクト, このタイプを設定した場合、sub-generatorからバイナリデータ, 画像データ, CLOBかを尋ねられます。画像については特にAngular側でユーザーに表示するための処理がされます

Validation

Validationは各フィールド毎に設定できます。
フィールドタイプに応じたValidationオプションが利用できます Validationは以下のものが自動生成されます
  • AngularまたはReactを使用したクライアントサイドのValidationコード
  • [Bean Validation](http://beanvalidation.org/)を使用したJavaドメインオブジェクト
Bean Validationはドメインオブジェクトの以下のケースで自動的に検証を行います
  • Spring MVC REST Controller(@Validアノテーション使用)
  • Hibernate/JPA (entityを保存する前に自動的に検証される)
Validationの情報は、データベースのカラムの正確なデータを生成するのにも使用されます。
  • Required フィールドは not nullに設定する
  • Uniqueフィールドはunique制約を設定する
  • フィールドの最大長はカラムの長さを同値に設定する
Validationにはいくつか制約があります。
  • Angular、React、BeanValidationの全てのオプションをサポートしているわけではありません。クライアント側とサーバー側で共通するもののみです
  • 正規表現パターンはJavaとJavaScriptで同じ動作をするわけではありません。そのため、設定する場合は片方を微調整する必要があるかもしれません
  • JHipsterは一般的なentityに対しての単体テストを生成します。その際にあなたが必要なValidationルールの情報はないため、生成されたテストがエラーとなることも起こり得ます。その場合は単体テストで使用しているサンプル値を更新してテストをパスするようにする必要があります

Entity relationships

EntityのリレーションシップはSQLでのみ利用可能です これは非常に複雑なテーマなので下記のドキュメントページを参照してください Managing relationships.

Generating a separate service class for your business logic

独立したServiceクラスを持つことで、Spring Rest Controllerを直接使うだけにし、複雑なロジックを集約することができます。 サービス層を持つ(interfaceの有無にかかわらず)ことでDTOを使用することが可能になります。 詳しくは Spring service sub-generatorに記載されていますので、目を通すことをおすすめします。

Data Transfer Objects (DTOs)

デフォルトではJHipster entityはDTOを使いませんが、オプションで作成することができます。
もしサービス層を使用する場合は Using DTOsを確認してください

Filtering

オプションでentityがSQLデータベースに保存する際にフィルタリングをすることができます。以下のドキュメントを参照してください Filtering your entities.

Pagination

もしCassandraを使用してアプリケーションを作成した場合はページネーションは機能しないので注意してください。 もちろん今後のアップデートによって対応される予定です。
ページネーションは GitHubAPIのthe Link header を使用しています。 JHipsterはEntityが生成された時に次の4つのページネーションオプションからサーバー側(Spring MVC REST)とクライアント側(Angular/React)の両方でカスタマイズされたコードを生成します

Updating an existing entity

entityの設定は.jhipster フォルダ内のjsonファイルに保存されています。 そのため、もし既存のentity名を使用してsub-generatorを起動した場合は内容を更新または再生成することができます 既存のentityに対してsub-generatorを実行するときは「
Do you want to update the entity? This will replace the existing files for this entity, all your custom code will be overwritten 」と尋ねられるので、以下の中から回答を選択してください
  • Yes, re generate the entity – entityを再生成します。sub-generatorを実行する際に--regenerateオプションを指定することでスキップ可能です
  • Yes, add more fields and relationships – フィールドおよびリレーションシップの追加のための質問が展開されます
  • Yes, remove fields and relationships– entityから既存のフィールドやリレーションシップを削除するための質問が展開されます
  • No, exit – 何の変更もせずにsub-generatorを終了します
以下のような理由でentityを更新したいケースがあると思います
  • 既存のentityに対し、フィールドおよびリレーションシップを追加 or 削除したい
  • entityを元の状態にリセットしたい
  • JHipsterをUpdateし、新しいテンプレートでentityを生成したい
  • .jsonファイルを更新した場合(フォーマットはsub-generatorが尋ねた質問に非常に近いので、それほど複雑ではありません)
  • .jsonファイルをコピー&ペーストして、コピー元と似た新しいentityを作りたい
TIP: 全てのentityを一度に再生成するのに以下のコマンドが使えます(ファイルが変更された時に質問するようにしたい場合は--forceを削除してください)
  • Linux & Mac: for f in ls .jhipster; do jhipster entity ${f%.*} --force ; done
  • Windows: for %f in (.jhipster/*) do jhipster entity %~nf --force

【JHipster和訳】Creating a Spring controller

はじめに

JHipsterの勉強を兼ねて以下のページを和訳したものです。
自分の理解用なので結構な意訳なので注意してください。
https://www.jhipster.tech/creating-a-spring-controller/

Introduction

このsub-generatorはSpring MVC REST Controllerを生成します
単純なRESTメソッドも生成することができます。
Spring MVC REST Controllerの”Foo”を生成するためには以下のコマンドを打つだけです
sub-generatorはあなたが作成したメソッドについて質問してくるでしょう
質問にはメソッドの名前やHTTP動詞について答えるだけです
そうするとシンプルなメソッドが生成されます

Can we document this Spring MVC REST Controller with Swagger?

訳: このSpring MVC REST ControllerをSwaggerを使ってドキュメント化できますか?
はい、実は既にできています。dev モードの場合,
メニューのAdministration > APIからswaggerのUI 作成されたcontrollerの情報を見ることができます

Can we add security to Spring MVC REST Controllers?

訳: このSpring MVC REST Controller にセキュリティを追加できますか?
はい、Spring Securityの@Securedアノテーションをメソッドに追加するだけです。
そして提供されているAuthoritiesConstants クラスを使用して
特定のユーザー権限にアクセスを制限します

Can we monitor Spring MVC REST Controllers?

訳: このSpring MVC REST Controller を監視できますか?
はい、@Timedアノテーションを監視したいメソッドに追加するだけです

Can we proxy it from our Microservice Gateway dev server?

訳: 開発用のマイクロサービスゲートウェイサーバーからプロキシでアクセスできますか?
はい、 webpack/webpack.dev.jsのproxy欄にサービス名を追加することでできます。

Spring-socialのtwitterでResourceAccessException

spring-socialのtwitterと連携しようと
/connect/twitterにアクセスしたら
エラーが出てハマったのでメモ

ちなみにapplication.ymlのspring.social.twitterのapp-idとapp-secret指定しただけの状態。

エラー内容

org.springframework.web.client.ResourceAccessException: I/O error on POST request for “https://api.twitter.com/oauth/request_token”: cannot retry due to server authentication, in streaming mode; nested exception is java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode

原因

Stackoverflowに書いてありました。

twitterのディベロッパーサイトでアプリを登録する際にcallbackUrlを指定しないと
このエラーが出るらしい。

アプリ設定画面で”http://localhost:8080″と指定すると
エラーが解消されました。

Eclipse起動エラー

STS(spring Tool Suite)落としてさーJavaの開発するぞ―!と起動しようとしたら
思わぬ起動エラーだったのでメモ

「Java was started but returned exit code=13」

sts-error

調べてみると、自分の環境のJavaを8にした時に64bit版じゃないのが入っていたようで、
64bit版を落として再度インストール→Pathを通して起動で解決!

Paiza選手権 part3

Part1はこちら
Part2はこちら

いよいよラストの問題。
レナのほうを選びました。もう一人の方は確認しませんでしたが問題違うのかな?
ちなみに問題はこれで最後です。

■問題
レナとシリコンバレーに来たと思ったら、会社のメインシステムで障害が発生!? しかもこのシステムを作った人達はもう会社に一人も居ないとの事。この危機を乗り切って俺の実力を全社に見せてやる!!
障害を起こしているのは表を計算するアプリケーションです。表は横 x マス、縦 y マスで構成されており、各マスには数字が入っています。 あなたは範囲選択されたマスを合計するプログラムを書かなくてはいけません。
選択範囲は左上のマスと右上のマスが指定され、そのマスを含んだ矩形の内側の範囲を複数の箇所を選択することが出来ます。矩形が重なるような選択範囲が指定された場合、選択部分は結合され多角形になります。

paiza3_q

選択範囲に含まれるマスの全てを合計した数字を出力するプログラムを作成してください。

 

最後にしてようやく手応えありそうなのが出てきたな!

■提出コード

■採点結果

paiza3

毎度毎度面白い企画だな~と思いながら参加してます。
次回も開催されたらやってみよう。

Paiza選手権 part2

Part1はこちら

期間が空いてしまいましたが、
Part2いってみます

■問題
レナたんのパパが経営する会社の入社試験を受ける事になってしまった達也。
上手くいけば新しい仕事に就けるし、レナたんとの関係も進行しちゃう!?
貴方はある売上を集計するソフトウェアの開発をしています。
月曜日から始まる n 日分の売上データ s 円が改行区切りで入力されます。nは必ず7の倍数です。

月曜日から日曜日までの各曜日の合計を改行区切りで出力して下さい。

 

■提出したコードはこちら

■結果はこちら
paiza2

Paiza選手権 Part1

9770054403_1ce7b08fab_z

Paizaの恒例プログラマ腕試し
やってみました。

会を重ねる毎に萌え方面に
尖ってきていますが、
別に普通にやればいいんじゃないかと
思うのは私だけですかね。

 

マンガ版「俺の許嫁と幼なじみが修羅場すぎる」|paizaオンラインハッカソン5

https://paiza.jp/poh/enshura

 

今回は3問仕立てなので、まずは1問目

ま、要は奇数字の文字を出力すればいいってことですね。
書いたコードはこちら

 

■採点結果
paiza01

Part2に続く