- 投稿日:2020-06-30T22:54:36+09:00
MacでJMeterの環境を構築
概要
MacでJMeterの環境を用意してみます。
Javaのインストールなども必要ですが、Homebrewを使うと簡単です。
(注: Homebrewは用意されている前提です。)環境
- macOS Catalina 10.15.5
- Homebrew 2.4.1
- Java
openjdk 14.0.1 2020-04-14
- JMeter 5.3
手順
Javaのインストール
Homebrewを使ってインストールします。
# brewの更新 % brew update # javaインストール % brew cask install javaバージョン確認
% /usr/libexec/java_home -V Matching Java Virtual Machines (1): 14.0.1, x86_64: "OpenJDK 14.0.1" /Library/Java/JavaVirtualMachines/openjdk-14.0.1.jdk/Contents/Home /Library/Java/JavaVirtualMachines/openjdk-14.0.1.jdk/Contents/Homeパスを通す
# .bash_profileがない場合のみでOK % touch ~/.bash_profile % export PATH=$PATH:/Library/Java/JavaVirtualMachines/openjdk-14.0.1.jdk/Contents/Home/bin % export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-14.0.1.jdk/Contents/Home # bash_profileの更新を反映 % source ~/.bash_profile確認
% java --version openjdk 14.0.1 2020-04-14 OpenJDK Runtime Environment (build 14.0.1+7) OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)JMeter
ダウンロード
Apache JMeterからダウンロードします。
mirrorsはそのままでも問題なければ問題なさそうです。(笑)
今回はsourceのzipをダウンロードしてみました。起動
ダウンロードzipを解凍して、jmeterを実行するとJMeterが起動します。
参考
- 投稿日:2020-06-30T21:33:52+09:00
実行中のメソッド・行番号を定期的にログ出力するheartbeat-loggerの紹介
問題
時間がかかるJavaのバッチ処理などで、どの処理に時間がかかっているのか(または止まっているのか)を確認したいときがあります。
しかし、処理中にログを埋め込む際、その勘所や粒度を見極めるのはなかなか経験が要ります。
また、特定の箇所で長時間止まっているような場合は、ログに何も出力されません。解決策
実行中の行に関する情報を、定期的にログに出力することができればよいと考えました。
非常にシンプルなプロジェクトですが、これを実現するheartbeat-logger
を作りました。
https://github.com/flyaway2112/heartbeat-logger実行結果
逐次ログを埋め込まなくても、処理中のログを下記のように定期的に出力することができます。
2020-7-01 00:11:23.881 [pool-1-thread-1] DEBUG com.example.LargeBatch - Start heartbeat logger 2020-7-01 00:11:23.883 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22) 2020-7-01 00:11:23.983 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22) 2020-7-01 00:11:24.084 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26) 2020-7-01 00:11:24.185 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26) 2020-7-01 00:11:24.286 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26) 2020-7-01 00:11:24.386 [pool-1-thread-1] INFO com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26) 2020-7-01 00:11:24.480 [pool-1-thread-1] DEBUG com.example.LargeBatch - Shutdown heartbeat logger使い方
SLF4Jライクなインタフェースから利用することができます。
Loggerの生成
HeartBeatLogger logger = HeartBeatLoggerFactory.getLogger(this.getClass(), "com.example", 100);getLoggerメソッドの第一引数は、SLF4JのLoggerFactpry.getLogger(Class)メソッドの引数と同じく、SLF4JのLogger nameとして利用するクラスを渡します。SLF4JでLoggerを取得するときと同じように利用すればよいです。
第二引数は、「実行中の処理」としてログに出力するパッケージ名(前方一致)です。
上記のサンプルの場合は、スタックトレースの末端からcom.example
パッケージの処理までさかのぼってログに出力します。
「Javaの標準クラスやライブラリのメソッドの情報が出力されても、プロジェクトのどの処理から実行されているのかがわからない」という問題を防ぐための仕掛けです。
nullを渡した場合は、スタックトレースの末端を出力します。第三引数は、ログを出力する間隔(ミリ秒)です。
処理の開始と終了
try { logger.start(); // ここにログ出力対象の処理 } finally { logger.shutdown(); }startメソッドを呼んでからshutdownメソッドを呼ぶまでの間、設定した間隔で自動的にログが出力されます。
- 投稿日:2020-06-30T19:17:19+09:00
Java問題「言語仕様」初期化子(2)
次のプログラムをコンパイル・実行するとどうなるか?
public class Knock013 { private static Object n; private static final Object HOGE = n.toString(); public static void main(String[] arguments) { System.out.println("HOGE is " + HOGE); } }解答
変数の初期化がされていない。
nはnullの状態なので、toString()でNullPointerExceptionが発生するprivate static final Object HOGE = n.toString();final修飾子とは
final修飾子を指定した変数は、基本的に規定値など一度値を設定したら変更する必要がないときい使います。
変数は基本的に値を自由に変更できますが、一度値を設定したら変更されない変数のことを「定数」と呼びます。
クラス定数を指定する場合は、変数の宣言の頭にstatic finalを書きます。
- 変数へのfinal:変数へ値の再代入をできなくする(=変数へ値を代入できるのが最初の1回のみになる)
- クラスへのfinal:クラスを継承できなくする
- メソッドへのfinal:メソッドをオーバーライドできなくする
- 投稿日:2020-06-30T18:24:54+09:00
Eclipse 2020-06にアップデートしたら部分的に文字化けが発生したので、Eclipseをダウングレードした
使っていたEclipseを2020-03から2020-06にアップデートしたら部分的に文字化けが発生したので、その原因と対処法をまとめておく。
症状は下記URLに同じ。入力した日本語のコメント等の一部が□で囲った?マークになってしまう。
文字コードが原因ではない。
https://qiita.com/segur/items/60b3711c0c9207d23b2f上記URLに書いてあるようにフォントを日本語対応のものに変えれば解決はするが、日本語のよい等幅フォントを探す手間がかかるし、デフォルトフォントのConsolasが気に入っている人にとっては苦しい。
調べてみると、この不具合は2018年辺りから確認されていたが、2019-12で一度解消されていたものらしい。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=536562
しかし、2020-06のアップデートで再発してしまったと考えられる。(2020-06-30時点で上記URLに既に報告もあった)そこで、2020-03に戻せば文字化けはなくなると考え、ダウングレードすることにした。
下記URLを参考にした。
https://stackoverflow.com/questions/28030294/how-to-downgrade-my-eclipse-luna-to-eclipse-keplerPleiadesで日本語化していた場合、
ヘルプ -> Eclipse IDEについて
-> インストール詳細
-> インストールヒストリーで、アップデート前の日付(なるべく直近がよいと思われる)を選び、下部にある「前回保存した状態に戻す」を選択することでダウングレードができた。
結果、コメント等の一部が□で囲った?マークになってしまう現象は起きなくなった。
今後のアップデートでバグが解消される可能性もあるが、いつ解消されるかは分からないので、既に2020-06にアップデートしてしまい、フォントを変えたくない人は試してみてよい方法だと思う。
- 投稿日:2020-06-30T18:20:05+09:00
Java問題「言語仕様」初期化子(1)
- 投稿日:2020-06-30T16:11:10+09:00
Azure App Service でHealth Checkを試す。
はじめに
こんにちは。
App Service、利用していますか?
Webアプリをデプロイするだけで動作するという、典型的なPaaSなのですが、運用をするとなると回復性の面で問題が発生します。App Serviceをデプロイした状態では、アプリに対する正常性確認が有効となっていないため、アプリが正常に応答していなくても内部ロードバランサーが正常でないアプリにリクエストを振り分け続けてしまう、という問題です。このような状況が発生すると、サービス正常性監視で問題が起こったり、特定のユーザのリクエストが正常でないインスタンスに振り分け続けられたりと、トラブルの種になりかねません。
そこで、今回試すのは「Health Check」です。
プレビューですが現在デプロイできるAzure環境上で直ぐに試すことができますので、こちらの機能を検証していきます。ドキュメントはこちら:
https://github.com/projectkudu/kudu/wiki/Health-Check-(Preview)Health Check の準備
Health Check は、アプリのインスタンス毎にHTTP正常性の確認を行い、応答が不正であればインスタンスを切り離す、という機能です。現在、検知の閾値を設定することはできませんが、5回に渡りHTTP Pingが成功しない状態が続いた場合には、リクエストの振り分け先から除外され、異常なインスタンスは自動的に再起動される、という挙動になります。HTTP Pingの成否は、特定のURIに対してGETリクエストを送り、2分以内に200番台のステータスコードで応答があるか、という基準で判定されます。
この機能を利用するには、Azure Resource Explorer( https://resources.azure.com/ )で対象のApp Serviceリソースを直接編集する必要があります。(現状では、プレビューの機能を利用するためにプレビューのツールを使用する、という些か面白いことになってます)
Resource Explorerにアクセスし、"subscriptions"->"対象のサブスクリプション"->"resourceGroups"->"対象のリソースグループ"->"providers"->"Microsoft.Web"->"sites"->"対象のAppService"->"config"とツリーを展開します。
configリソースのEditモードに入り、下記の"healthCheckPath"を書き換えます。既定ではnullになっていて、こちらに任意のパスを定義することでHealth Check機能が有効となります。
今回は、/statusとしました。次に、アプリ側で/statusに対応するURIを実装します。こちらは、アプリが正常に動作している状態であるかをチェックし、問題が無ければ200ステータスコードを返すREST APIの実装です。内容については、アプリ毎に異なるのですが、一般的にはアプリが利用している外部サービス(Storage BlobやSQL Databaseなど)との疎通を確認して、正常であればOK、と言うようなAPIを実装します。
今回は検証ですので、PUTで戻り値となるステータスコードを指定できるようなSpring Bootアプリを実装しました。以下のようなサンプルコードです。StatucController.javapackage com.example.springboot; import java.net.InetAddress; import org.springframework.web.bind.annotation.RestController; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @RestController @RequestMapping(value = "/status") public class StatusController { private static HttpStatus status = HttpStatus.OK; @GetMapping public ResponseEntity<String> get() { return new ResponseEntity<String>(this.getLocalhost() + "/" + status.getReasonPhrase(), status); } @PutMapping public ResponseEntity<String> put(@RequestParam(name="code", defaultValue = "200") Integer code) { switch (code.intValue()) { case 200: status = HttpStatus.OK; break; case 500: status = HttpStatus.INTERNAL_SERVER_ERROR; break; case 400: status = HttpStatus.BAD_REQUEST; break; case 502: status = HttpStatus.BAD_GATEWAY; break; default: status = HttpStatus.OK; break; } return new ResponseEntity<String>(this.getLocalhost() + "/" + status.getReasonPhrase(), status); } private String getLocalhost() { try { return InetAddress.getLocalHost().getHostAddress(); } catch(Exception e) { e.printStackTrace(); return "0.0.0.0"; } } }動作確認
ごにょごにょ(詳細割愛)っとして、App Serviceにアプリをデプロイした後、Chromeでアプリにアクセスします。
素っ気ないアプリですが、IPアドレス(172.16.1.5)が表示されています。こちらのIPアドレスは、App Serviceの各インスタンス毎の内部的なIPになるので、このセッションがどのインスタンスに接続しているかを特定するための情報となります。今度はEdgeからアクセスしてみました。
アドレスだけ、Chromeで表示したものと異なっています。App Serviceの内部ロードバランサーはStikyに動作するので、バックエンドのインスタンスが複数ある場合でも原則として毎回同じインスタンスに接続しに行きます。(ちなみに、ロードバランサーの振り分けの重み付けはアクセス量が関係している様子で、異なるインスタンスに接続するためにChrome側で10回ほどリロードを行いました)今度はPostmanを使用して、/statusにアクセスします。
200ステータスコードで返ってきているのが確認出来ました。こちらは、172.16.1.5のインスタンスに接続しています。
では、/statusからの応答を500ステータスコードが戻るように変更してみます。
この検証用アプリでは、/statusから返却されるHTTPステータスコードを動的に設定することで、アプリの異常が検知され、App Service側で異常なインスタンスの排除と再起動が行われることを期待しています。10分程待って、Chrome側を更新してみます。
IPが172.16.1.2に変わっていて、どうやらインスタンスが再起動されたようです。
念のため、Postmanでも確認してみます。
同様に、172.16.1.2にアクセス先が変わりました。
このことから、Health Check機能が動作し、異常と判定されたインスタンスが切り離され、再起動されたことが確認出来ます。Azure Portal側でも確認をしてみます。
オレンジの線が今回故意にHTTP Pingへの応答が異常となるように変更したインスタンスです。
メトリック上では、14:59から15:14ごろまで、インスタンスが応答していなかったことが判断できます。その後、自動的に再起動がかかったためにサービスが復旧しています。Health Check機能はアプリ側での実装が必要となりますが、サービスの回復性を高めるために有効な機能ですね。
今回は基本的な挙動の確認だけにとどまりましたが、また時間を作って詳細な挙動を確認していきたいと思います。以上、App ServiceでHealth Checkを試す、でした。
- 投稿日:2020-06-30T15:32:34+09:00
[Processing×Java] 変数の使いかた
この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
今回は変数について書いていきます。目次
0.変数とは何か
1.変数の種類
2.変数を使ったプログラムの例0.変数とは何か
変数はデータをいれる箱のようなもの。
variable00.java//変数aに5を代入する。 int a = 5; //変数bに10を代入する。 int b = 10; //a + b の結果を表示する。 println(a + b);15注意:
Javaで変数を使うときは、その変数がどんな種類なのかを指定する必要がある。
NG :a = 5
OK :int a = 5
種類には整数を表すint,浮動小数点数を表すfloat,文字列を表すString、色を表すcolorなどがある。
参考記事:
図で理解するJavaの参照Point:
プログラムでは、イコール記号(=)は、代入を示す。
左向きの矢印だと考えるとわかりやすい(かも)。
int a ⬅︎ 5
1.変数の種類
変数には Built-in variables と User-defined variables がある。
variable01.javasize(600,400); rect(0,0,width-100,height-100);Point : Built-in variables
あらかじめ用意されている変数。
width(=画面の横幅),height(=画面の縦幅),mouseX(=マウスのX座標),mouseY(=マウスのY座標)...など。この場合、
width = 600
height = 400
を自分で定義しなくても使える。ラッキー!Point : User-defined variables
自分で定義して使う変数。
使用方法:①宣言→②初期設定→③使用使用方法(例)
①宣言(こんな変数使おうと思ってます!)
int a;
②初期設定(この変数はこんな値にしときます!)
a = 10;
③使用(それじゃあ使います...!)
println(a);
※宣言と初期設定は同時にできる
(例)
int a = 5;
2.変数を使ったプログラムの例
◯mouseX,mouseYを使ったプログラム
variable02.java//プログラムが始まった時に1回だけ実行される。 void setup(){ //画面の大きさを決める size(600,400); } //無限ループ void draw(){ //マウスの場所によって、四角形の面積が変わる。 rect(0,0,mouseX,mouseY); }Point :
setup() は{}の中の処理を1回のみ繰り返す。(初期設定みたいなもの)
draw() は{}の中の処理を無限に繰り返す。(無限ループ)rect(四角形の左上端のX座標、四角形の左上端のY座標、横の辺の長さ、縦の辺の長さ);
◯mouseX,mouseYを使ったプログラム②
variable03.java//最初に1回だけ繰り返す void setup(){ //画面の大きさを決める size(510,510); } //無限ループ void draw(){ //淵を描かない noStroke(); //図形の中を何色で塗るか決める→(R,G,B) fill(mouseX/2,mouseY/2,255); //円の中心の座標と横幅、縦幅をきめる。 ellipse(mouseX,mouseY,30,30); }◯自分で変数を定義して、円を横に移動させるプログラム
variable04.java//float型の変数xposを定義する。 //xのポジションを表す変数。 float xpos = 0; void setup(){ size(510,200); background(0); } void draw(){ //円の中は塗りつぶさない。 noFill(); stroke(100,230,random(180,255)); //円のx座標はxposによって決まる。 //円の大きさはランダムにする。 ellipse(xpos,height/2,random(100),random(100)); //xposを10ずつ増やしていく。 xpos += 10; }◯自分で変数を定義して、円を横に移動させるプログラム②
variable04.java//float型の変数xposを定義する。 //xのポジションを表す変数。 float xpos = 0; void setup(){ size(510,200); } void draw(){ //ループの度に、背景を塗り直してみる。 background(0); //円の中は塗りつぶさない。 noFill(); stroke(100,230,random(180,255)); //円のx座標はxposによって決まる。 //円の大きさはランダムにする。 ellipse(xpos,height/2,random(100),random(100)); //xposを10ずつ増やしていく。 xpos += 10; //円が画面から飛び出したらまた左から出てくるようにする。 if(xpos > width){ xpos = 0; } }最後に
読んでいただきありがとうございました。
より良い記事にしていくために御意見、ご指摘のほどよろしくお願いいたします。
- 投稿日:2020-06-30T15:29:51+09:00
[Processing×JAVA] 開発環境の構築
この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
今回は開発環境の構築について書いていきます。目次
0.IDE(統合開発環境)の構築
1.JAVAとは何か
2.他のエディターを使いたい場合0.IDE(統合開発環境)の構築
1.processingの公式サイトにアクセス
2.自分のパソコンに合わせてダウンロードボタンをおす
3.ダウンロードしたらzipファイルを開く
4.プログラムの実行
エディターの左上の再生ボタンを押す
or
command + R (commandを押しながらRキーを押す)※言語を日本語に設定したい場合
1.メニューバーの[Processing]を押す
2.[環境設定]を押す
3.[言語]を日本語に変更する
4.日本語でコメントを書くために[エディタとコンソールのフォント]をMenloに変更する
5.Processingの再起動
※IDE = Integrated Development Environment
0.JAVAとは何か
オブジェクト志向の代表的なプログラミング言語でハードウェアに依存しないことが特徴。
ProcessingにおけるJAVAは、JAVAを単純化しグラフィック機能に特化した言語と言える。※Processingではpythonなどでの開発も可能。
2.他のエディターを使いたい場合
Atomを使う
参考記事リンク:
AtomでProcessingを実行するVSCodeを使う
参考記事リンク:
ProcessingをVisual Studio Codeで動かしたい最後に
読んでいただきありがとうございました。
より良い記事にしていきたいので
◯こうした方がわかりやすい
◯ここがわかりにくい
◯ここが間違っている
◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。
- 投稿日:2020-06-30T15:29:51+09:00
[Processing×Java] 開発環境の構築
この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
今回は開発環境の構築について書いていきます。目次
0.IDE(統合開発環境)の構築
1.Javaとは何か
2.他のエディターを使いたい場合0.IDE(統合開発環境)の構築
1.Processingの公式サイトにアクセス
2.自分のパソコンに合わせてダウンロードボタンをおす
3.ダウンロードしたらzipファイルを開く
4.プログラムの実行
エディターの左上の再生ボタンを押す
or
command + R (commandを押しながらRキーを押す)※言語を日本語に設定したい場合
1.メニューバーの[Processing]を押す
2.[環境設定]を押す
3.[言語]を日本語に変更する
4.日本語でコメントを書くために[エディタとコンソールのフォント]をMenloに変更する
5.Processingの再起動
※IDE = Integrated Development Environment
1.Javaとは何か
オブジェクト志向の代表的なプログラミング言語でハードウェアに依存しないことが特徴。
ProcessingにおけるJavaは、Javaを単純化しグラフィック機能に特化した言語と言える。※ProcessingではPythonなどでの開発も可能。
2.他のエディターを使いたい場合
Atomを使う
参考記事リンク:
AtomでProcessingを実行するVSCodeを使う
参考記事リンク:
ProcessingをVisual Studio Codeで動かしたい最後に
読んでいただきありがとうございました。
より良い記事にしていきたいので
◯こうした方がわかりやすい
◯ここがわかりにくい
◯ここが間違っている
◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。
- 投稿日:2020-06-30T13:54:08+09:00
いのべこ夏休みアドベントカレンダー 2020
はじめに
「いのべこ」とは、株式会社富士通システムズウェブテクノロジーの社内技術コミュニティで、「イノベーション推進コミュニティ」が略されたものです。
「いのべこ」の2020年夏企画として「いのべこ夏休みアドベントカレンダー」を企画しました。昨冬のアドベントカレンダー同様、参加者の皆さんで盛り上げていきましょう!
参考:富士通システムズウェブテクノロジーアドベントカレンダー 2019ルール
- 参加者:当社社員・派遣社員および富士通グループ社員に限らせて頂きます
- テーマ:「技術」に関することならなんでもOK
- 記事形式:自由です。Qiita、個人ブログ、YouTube、なんでもありです
- Fujitsu Way、Fujitsu Wayのサイトにある「ソーシャルメディアを利用する場合のルールとマナー」の記述を守るようにしましょう
- Qiitaのガイドラインも目を通しましょう
参加登録方法
- 記事の下方にある編集リクエスト機能を使い、参加したい日付に以下の項目を書いて送ってください
- 執筆者名(ペンネームでもOKです)
- タイトル(仮で大丈夫です)
- なるべく早く反映するようにします
- 後からでも修正可能です。同様にご連絡ください
- 毎週水曜日は、当社社員以外の優先枠とします(が、埋まり具合で見直しもあります)
記事作成後の登録方法
- 編集リクエストで記事のタイトルとURLを送ってください
- (できるだけ)当日までに記事を書いて登録してください
さいごに
このページの記述はUnityゆるふわサマーアドベントカレンダー 2019を運営された@nkjzmさんの下記記事を参考とさせていただきました。ありがとうございました!
2年連続で夏のアドカレ運営をやってみての感想 【ゆるふわアドカレ】いのべこ夏休みアドベントカレンダー 2020 記事一覧
Date 記事名 執筆者名 8/1(土) 先鋒やります。テーマは未定。 ikeda.hideya 8/2(日) (募集中) 8/3(月) 今回もスマスピで何か書く(仮) じゅげむ(今井 隆) 8/4(火) (募集中) 8/5(水) (募集中) 8/6(木) (募集中) 8/7(金) 検討中! takapom 8/8(土) (募集中) 8/9(日) (募集中) 8/10(月) Vue.jsでアプリを作って遊んでみた eight-cotton(八幡怜奈) 8/11(火) (募集中) 8/12(水) (募集中) 8/13(木) (募集中) 8/14(金) (募集中) 8/15(土) (募集中) 8/16(日) (募集中) 8/17(月) Pivotal流の振り返り会、教えます! 小とろ(花岡 舜) 8/18(火) (募集中) 8/19(水) (募集中) 8/20(木) (募集中) 8/21(金) (募集中) 8/22(土) (募集中) 8/23(日) (募集中) 8/24(月) (募集中) 8/25(火) バッチの勉強とツール作成(仮) co33mu(藤谷美佐) 8/26(水) (募集中) 8/27(木) (募集中) 8/28(金) (募集中) 8/29(土) 何か書く(ネタ枠) George22e(筒井城治) 8/30(日) (募集中) 8/31(月) (募集中)
- 投稿日:2020-06-30T12:11:32+09:00
SpringBootでHello World!
目的
前回記事は、Spring Initializr を使って爆速でHello World!!!と急いでいる人向けの記事でした。
今回はSpring Quickstart Guideを参考にゆっくり進めてみようと思います。
事前準備
統合開発環境は、 IntelliJ IDEA, Spring Tools, Visual Studio Code, Eclipseが人気らしいですね。
私は、Visual Studio Code(以下VSCode)
を使用します。Javaの開発をするための開発キットは、AdoptOpenJDKのversionは、8か11がオススメみたいです。
OpenJDK11を導入する方法をJava開発環境構築に記載していますので、未だの人はそちらを参考にしてみてください。1.SpringBoot projectを始めよう!
まずは、spring initializrにアクセスします。
ProjectはMavenを選択します。
プログラムが実行できるように、ソースコードの解析やプログラミング言語を機械語にコンパイルをしてくれるもの。
参考URL:知識ゼロからAnt と Maven と Gradle について勉強する。-ビルドの定義からツールの特徴まで
Languageは、Javaを選択します。
SpringBootは、2.3.1を選択します。(2020/6/30現在)
公式では、
versionは定期的に変わるので一番新しいversionを選んでください。(ただし、SNAPSHOTは選択しないでください)
と書かれています。webと入力してください。
そして、
Spring Web
を選択してください。Spring Webとは、
Spring MVC を使用して、RESTful を含む Web アプリケーションを構築するための設定です。
最後に
Project Metadata
を編集していきます。Group:プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的。
Artifact:プロジェクトの成果物の名前。Artifactと同じ名称を使用することが推奨されているみたいで、こちらを変更するとNameも変更されます。
Name:プロジェクトの表示名。Mavenの場合、mainプログラムのクラス名としても使われます。Artifactと同じ名称を使用することを使用することが推奨されているみたいで、こちらを変更するとArtifactも変更されます。
Description:プロジェクトの説明を入力します。
Package Name:プロジェクトのパッケージ名。通常は、Groupで指定したパッケージとArtifactで指定した名称で構成されます。(Group名.Artifact名となる)
Packaging:パッケージする方法をJarもしくはWarのいずれかを選択します。今回はJava11を使用するので、11を選択して
GENERATE
ボタンをクリックします。そのZipファイルを展開してください。
準備完了です。
2.コードを追加しよう!
先ほどのフォルダをVSCodeで開きます。
Java Extension Packのインストールを推奨します。と言われるのでインストールしておきましょう。そして、
src/main/java/com/example/demo
の中にある、DemoApplication.java
を開きます。
DemoApplication.javapackage com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }クラスの上に記述されている@〇〇は、アノテーションと言います。
アノテーションとは注釈の意味であり、あるデータに対して関連する情報を注釈として付ける事であり、
プログラムの中では記述されたコードに注意書きを追加する機能となります。
@SpringBootApplicationというアノテーションを記述することで、Spring Bootの起動クラスとして必要な機能が自動的に組み込まれます。公式を参考にコードを追加します。
DemoApplication.javapackage com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/hello") public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { return String.format("Hello %s!", name); } }@RestControllerというアノテーションを記述することで、クラスをControllerとして認識してくれます。
Viewへ遷移しないため、メソッドの戻り値がそのままレスポンスボディに書き込まれます。(今回は、Hello 〇〇!と返されます)@GetMappingというアノテーションを記述することで、そのURLでアクセスされた時にメソッドが呼ばれるようになります。
今回は、http://localhost8080/hello とアクセスされた時にhelloメソッドが呼ばれるようになっています。@RequestParamというアノテーションを記述することで、URLのクエリパラメータを受け取る事が出来ます。
今回は、?name=〇〇とアクセスすると、〇〇に入った値が変数nameに格納されるようになっており、何も指定がない場合は、Worldが格納されます。3.実行してみよう!
ターミナルでこのプロジェクトファイルがあるフォルダーに移動します。
そして./mvnw spring-boot:run
を入力して実行します。ターミナル$ ./mvnw spring-boot:run [INFO] Scanning for projects... [INFO] [INFO] --------------------------< com.example:demo >-------------------------- [INFO] Building demo 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] >>> spring-boot-maven-plugin:2.3.1.RELEASE:run (default-cli) > test-compile @ demo >>> 〜省略〜 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.3.1.RELEASE) 2020-06-30 11:41:46.106 INFO 64839 --- [ main] com.example.demo.DemoApplication : Starting Demo 〜省略〜と表示されたら成功です!
http://localhost:8080/hello にアクセスしてみてください。
Hello World!と表示されていますね。変数nameにはWorldが入っているからです。
では次に以下のように、URLのhelloの後ろに、
/?name=任意の文字列
を追加してみてください。
http://localhost:8080/hello/?name=tanakaHello tanaka!と表示されていますね。変数nameにはtanakaが入っているからです。
終わりに
今回は公式を参考にゆっくりと進めて行き、Webアプリケーションの土台を作成する事が出来ました。
ご自身でコードを変更してはブラウザで確認するといった学習にご活用いただければと思います。
- 投稿日:2020-06-30T02:51:55+09:00
Java Silverレポ(不合格&合格体験記)
はじめに
恥ずかしながら先日2回目のJavaSilver受験でやっと合格できたので、反省を踏まえてレポートを書きたいと思います。
JavaSilverの試験
問題数:77問
時間:150分
合格基準:65%学習状況と結果
教材
・徹底攻略JavaSE8Silver問題集のpdf版(黒本)
ipadpro12.9を持っているので、Goodnoteに入れて使っていました。1周目と2周目で別の書類として使えるのが便利でした。1回目:50%不合格
・新卒1年目の12月に受験
・会社の研修で2ヶ月+2h×6回Javaを勉強し、基本的な文法は知っている状態
・黒本を第9章まで1周、総仕上げ問題は20問ほど2回目:82%合格
・新卒2年目の6月に受験
・黒本を+2週敗因の分析
黒本を解き終わっていなかった
時間がなくなってしまい仕方なく受けに行ったのですが、なんとかなりませんでした・・・。
モチベーションが上がらなかった
うっかり申し込んだものの、普段使っていない言語だし、堅くて大規模で大変そうなイメージだし、javaで何かしたいというのが無かったので思った以上にモチベーションが上がりませんでした。
会社の目標で宣言した資格を取らないといけない、みたいな人は業務で使用している言語の試験を選択した方が良いと思います。
それか、Processingを触ってみたい、みたいなモチベーションを早く見つければ良かったです。普段使っている言語とごちゃ混ぜになってしまった
普段使用しているphpの方がjavaよりも緩かったり、書き方を忘れやすかったりしました。
黒本の総仕上げ問題は絶対解いた方が良い
1、2問を除いて、全部総仕上げ問題と同じような問題が出てきました。(その割に正答率微妙ですが…)
勉強になるかどうかは置いといて、受かるだけなら総仕上げ問題だけ暗記すれば大丈夫だと思います。再受験キャンペーンを先に申し込む
2回目は再受験キャンペーンで無料で受験できました。
これに落ちたら数万円の損、という精神状態で受けるよりも念のため再受験できるようにしておいた方が良いと思います。おわりに
私は運転免許を取るときに筆記のプレ試験みたいなので引っかかってしまったことがあるのですが、そういう怠け者タイプかつJavaをあまり触ったことがない人はちゃんと頭に入るまで問題集を解き終えないとダメなタイプの試験なので、気をつけた方が良いです(?)。
また、2回とも新宿駅前テストセンターで受験したのですが、2回目に副都心線の新宿3丁目駅から行ってしまい、遠くて地下で迷子&地上で汗だくになってしまいました。迷子になりやすい人は試験の日は先に地図をみたり早く家を出た方がいいです。
javaに対するハードルが少し下がったので受けて良かったなと思います。Processingでモーショングラフィックス作ってみたいです。
- 投稿日:2020-06-30T00:42:59+09:00
【Java】Strategyパターン
検証環境
- Eclipse Oxygen.3a Release (4.7.3a)
- Java8
ソースコード
StrategySample.javapackage designpattern; public class StrategySample { public static void main(String[] args) { say(new Dog()); say(new Cat()); } private static void say(Animal animal) { animal.say(); } }Dog.javapackage designpattern; public class Dog implements Animal { @Override public void say() { System.out.println("ワン"); } }Cat.javapackage designpattern; public class Cat implements Animal { @Override public void say() { System.out.println("ニャー"); } }Animal.javapackage designpattern; interface Animal { void say(); }感想
Strategyパターンってこういうことだよね?
所謂ポリモーフィズムの紹介とかでよく出てくるコードです。
これは特に学習してなくても仕事で何度も出会っているので
すんなり理解できました。MapにHashMapを入れるのと同様ですね
ではまた(^_^)ノシ