20210806のJavaに関する記事は5件です。

Javaの超基礎(条件分岐)

はじめに 前にJavaの基礎をやって中途半端だったので、少しずつだけですが学習しています。条件分岐の文法について記事にまとめました。 よろしくお願いします。 if文 javaのif文は「if」の後に()の中に条件式を記述し、その後{}に処理を書きます。 int a = 10; if (a < 20) { System.out.println("aは20未満"); True以外の処理は{}を閉じた後にelseを記述し、さらに{}に処理を書きます。 int a = 30; if (a < 20) { System.out.println("aは20未満"); } else { System.out.println("aは20以上"); } ifの他に条件式を追加したい場合は{}を閉じた後「else if」を記述し、ifと同じように()に条件式、{}に処理を書きます。 int a = 20; if (a < 20) { System.out.println("aは20未満"); } else if (a > 20){ System.out.println("aは20より大きい"); } else { System.out.println("aと20は等しい"); switch文 条件分岐はifの他にswitch文があります。 switchの後の()に条件の値を記述し、{}の中に「case 値:」を書いて、その下に処理を書きます。 caseの後の値と条件の値が合致していればTrueを返し、違えばFalseを返します。 それぞれのcaseの後には必ず「break;」が必要となります。 int a = 5; switch (a % 2) { case 0: System.out.println("偶数") break; case 1: System.out.println("奇数") break; } 上記の例だと、()の値が1になるので二個目のcaseに該当します。ですので「奇数」が実行されます。 また、どのcaseにも該当しなかったときの処理を書きたいときはcaseの代わりに「default:」を書きます。if文のelseみたいなものですね。 switch(champion) { case 1: System.out.println("山田たろう"); break; case 2: System.out.println("田中じろう") break; case 3: System.out.println("吉田さぶろう") default: System.out.println("表彰されるのは3位までです") break; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java入門[条件分岐 ifとswitch]

プログラムの構造 複雑なプログラムもやっていることは 順次進行、分岐、繰り返し 順次進行 -> 上から下へプログラムが実行される(前回まとめ) 分岐 -> 条件によって違うプログラムが実行される(今回まとめ) 繰り返し -> 条件が満たされるまで繰り返し実行される(次回まとめ) if文 if 「もし〜なら、以下の文を実行」 else 「それ以外は、〜の文を実行」という流れになる。 Mouse.java public class Mouse { public static void main(String[] args){ boolean waitTime = true; // 待ち時間が 「あるかないか」 if(waitTime == true){ // 待ち時間があれば System.out.println("このアトラクションは待ち時間があります。"); } else { // それ以外は System.out.println("このアトラクションは待ち時間なしでご利用できます。"); } } } if文の中に、更にif文を追加することもできます。 Mouse.java public class Mouse { public static void main(String[] args){ boolean waitTime = true; int time = 60; // 待ち時間を設定 if(waitTime == true){ System.out.println("このアトラクションは待ち時間があります。"); if(time > 30){ // 30分以上であれば System.out.println("30分以上待ちです。"); } else { // それ以外は System.out.println("比較的スムーズにご利用できます。"); } } else { System.out.println("このアトラクションは待ち時間なしでご利用できます。"); } } } else ifで分岐を増やすこともできる。 Mouse.java public class Mouse { public static void main(String[] args){ boolean waitTime = true; int time = 31; // -------------------- // if(waitTime == true){ System.out.println("このアトラクションは待ち時間があります。"); if(time > 10){ // timeが10以上なら System.out.println("10分待ちです。"); } else if(time > 20) { // timeが20以上なら System.out.println("20分待ちです。"); } else if(time > 30) {// timeが30以上なら System.out.println("混み合っています。"); } else { System.out.println("スムーズにご利用できます。"); } // -------------------- // } else { System.out.println("このアトラクションは待ち時間なしでご利用できます。"); } } } // timeは31で、期待しているのは「混み合っています。」だが「10分待ちです。」と出力される。 順次進行を意識しないと期待通りの動作はしません。 上から下に向かって実行されるので、time > 10は20分や30分の条件も含んでしまっています。 訂正 if(time > 30){ System.out.println("混み合っています。"); } else if(time > 20) { System.out.println("20分待ちです。"); } else if(time > 10) { System.out.println("10分待ちです。"); } else { System.out.println("スムーズにご利用できます。"); } // これならうまくいきそうですね! switch switch文では以下のルールに準ずれば、if文をスマートに記述出来ます。 1.条件式が(変数 == 値) or (変数 == 変数)のように一致するかを判別する 2.比較の値が、整数、文字列、文字である つまり、if文の例にあげたMouse.javaは>を比較演算として使用しているので活用はできないということになりますね。 Pokemon.java public class Pokemon { public static void main(String[] args){ System.out.println("好きなポケモンを選びなさい。"); int pokemon = 6; switch (pokemon) { case 1: // int が1なら System.out.println("ピカチュウに決めた!"); break; case 2: // int が2なら System.out.println("ヒトカゲに決めた!"); break; case 3: // int が3なら System.out.println("ゼニガメに決めた!"); break; case 4: // int が4なら System.out.println("フシギダネに決めた!"); break; default: // int が上記以外なら System.out.println("オーキドに決めた!"); } } } // 好きなポケモンを選びなさい。 // オーキドに決めた! caseを使用して、条件に合致した時に処理したい内容を記述する。 breakがあることで、条件に一致した部分があれば途中で抜けることができる。 defaultは条件以外の場合の処理を記述する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ScheduledFutureのgetの使い道

定期実行し続けるScheduledFutureのFuture#getてどのように使うのだろうか? という疑問が生じた。なので試してみた。 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); AtomicInteger c = new AtomicInteger(0); ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(() -> { System.out.println(c); if (c.get() > 3) { throw new RuntimeException(); } c.incrementAndGet(); }, 0, 500, TimeUnit.MILLISECONDS); try { future.get(); } catch (ExecutionException ex) { System.out.println("finished."); } これを実行すると下記のような実行結果になる。 0 1 2 3 4 finished. 定期実行サービスのスレッドで例外をスローすると、future#getはExecutionExceptionスローする。なのでこれをcatchしてメッセージを出力している。 というわけで、定期実行サービスをwatchして失敗したら何らかの後処理を行いたい、という場合に使える。とはいっても、定期実行でそういうユースケースはあまり思いつかない。Future#cancel で停止したいことはあるだろうけど。 参考 : https://stackoverflow.com/questions/25049021/what-is-the-purpose-of-scheduledfuture-get-method-if-is-retrieved-from-the-sch
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Codeシリーズを使ったCI/CD

はじめに 転職活動の際にポートフォリオとして、Javaを使用したアプリケーションを作成しました。 GitHubへソースコードをプッシュすると、AWS上のEC2へデプロイされるように環境を作成した際のメモを残そうと思います。 Codeシリーズの作成方法などは他の記事を参照して頂き、本記事では ・デプロイされるときに、自動的に本番環境の設定ファイルでデプロイされるようにしたい!! となったときに、各種設定ファイル(Mavenのpom.xmlや、CodeBuildのbuildspec.yml、CodeDeployのappspec.yml)の書き方についてざっくり触れていきたいと思います。 どなたかの参考になれば幸いです。 ※環境作成から本記事の執筆に時間が空いてしまったため、思い出しながら記載しています。誤りがあってもあしからず・・・ 処理の流れ GitHubへコードをプッシュ→CodePipelineが起動→CodeBuildでソースコードのビルド(&テスト)→CodeDeployでEC2へデプロイ イメージ図 やった事 作成するアプリは、Mavenプロジェクトとして作成しました。 ディレクトリ構成は下記の通りです。 アプリケーションディレクトリ |-- pom.xml |-- buildspec.yml ←CodeBuildで使用 |-- appspec.yml ←CodeDeployで使用 |-- src |-- main | |-- java | |-- modelとかcontroller | |-- config | |-- honban ←本番用の設定ファイルを配置 | `-- context.xml とか | |-- local ←ローカル用の設定ファイルを配置 | `-- context.xml とか |-- test |-- java |-- modelテストコードとか ローカル環境と本番環境では、DB接続パラメータが異なるため、ビルド時のパラメータでローカルか本番かを分けて、ビルド出来るようにpom.xmlを作成します。 pom.xml(抜粋) <build> <finalName>calendar</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> <configuration> <webResources> <resource> <directory>${contextxml.path}</directory>  ←ここでcontext.xmlのパスを変えれるようにしている。実際のパスは下記のprofileの部分で指定 <targetPath>META-INF</targetPath> <filtering>true</filtering> <includes> <include>context.xml</include> </includes> </resource> <resorce> <directory>${loggingproperties.path}</directory> <filtering>true</filtering> <includes> <include>logging.properties</include> </includes> </resorce> </webResources> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>local</id>  ←ビルド時にlocalを引数で渡すと、このprofileセクションの値が使用される <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <contextxml.path>src/main/config/local</contextxml.path> <loggingproperties.path>src/main/config/local</loggingproperties.path> </properties> </profile> <profile> <id>honban</id>  ←ビルド時にhonbanを引数で渡すと、このprofileセクションの値が使用される <properties> <contextxml.path>src/main/config/honban</contextxml.path> <loggingproperties.path>src/main/config/honban</loggingproperties.path> </properties> </profile> </profiles> CodeBuildでビルド動作を定義するbuildspec.ymlは下記のように作成しました。 buildspec.yml version: 0.2 env: variables: S3_BUILD_OUTPUT_BUCKET: "calendardeploybucket" phases: install: runtime-versions: java: corretto8 commands: # treeコマンドを使いたいのでインストール - yum install -y tree pre_build: commands: - echo Nothing to do in the pre_build phase... - mvn clean build: commands: - echo Build started on `date` # maven実行(honban用でパッケージ。今回はテストスキップ。。) - mvn package -P honban -DskipTests=true # ソース,java,mavenのバージョンを出力 - echo "--------------------------------------------------" >> version.txt - echo "SourceVersion:"$CODEBUILD_RESOLVED_SOURCE_VERSION >> version.txt - java -version 2>> version.txt - mvn -version >>version.txt - echo "--------------------------------------------------" >> version.txt post_build: commands: - echo Build completed on `date` # treeコマンドで確認 - tree >>tree.txt - aws s3 cp tree.txt s3://$S3_BUILD_OUTPUT_BUCKET # version.txtの移動 - aws s3 cp version.txt s3://$S3_BUILD_OUTPUT_BUCKET # warファイルとappspec.xmlを一つのZIPファイルに固める - zip -r ./calendar.zip ./target/calendar.war ./appspec.yml # S3にzipファイルをアップロード # - aws s3 cp ./calendar.zip s3://$S3_BUILD_OUTPUT_BUCKET artifacts: files: - target/calendar.war - appspec.yml discard-paths: no 諸々、ほかのサイトを参考にした箇所がありますが・・・ 上記のbuildspec.ymlにおいて、大事なのは、ビルドコマンドとして、mvn package -P honban -DskipTests=true を実行しています。 -Pオプションでhonbanを指定することで、pom.xmlのprofileで指定したパスのファイルが使用されます。 テストは通常であれば、スキップせずに実行してください。。 また、CodeBuildでビルドしたwarファイルはS3に格納しますが、その際に、後続のCodeDeployが使用するappspec.ymlも一緒にzipファイルに入れています。 zipで固める際に、CodeBuildが元のファイルを見つけれるように、artifactsのセクションでmvnコマンドで作成されるwarファイルだけでなく、appspec.ymlも指定しています。 ここが一番つまづいた気がします。。 あとは、CodeDeployで使用するappspec.ymlですが、これはそのままwarファイルを配置するだけです。 appspec.yml version: 0.0 os: linux files: - source: target/calendar.war destination: /usr/share/tomcat/webapps/ これで、あとはCodeシリーズを作れば、いい感じにJavaアプリがデプロイされるはず! どなたかの参考になれば・・・
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】4乗的ガウスを解く

 僕はこれまで「Ruby on Rails」をメインに勉強してきましたが、現在は「Java」も勉強しています。  ということで僕が過去に「Ruby」で解いた問題を「Java」で解くとどうなるかを試してみました。  1⁴ + 2⁴ + 3⁴ + ........ + 40⁴  上記の計算の結果をプログラムで出していきます。 package example; public class JavaGouse { public static void main(String[] args) { int count = 1; int sum = 0; while (count <= 40) { sum += Math.pow(count, 4); count += 1; } System.out.println(sum); } }  これで求めたい値である「21781332」を出すことができました。ただしまだ「Ruby」も「Java」も理解が不十分であるため、問題もあると考えられます。ご意見いただけるとありがたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む