20210915のJavaに関する記事は12件です。

既存MavenプロジェクトをGradleプロジェクトに変換

環境 OS: Windows 10 Home Gradle 7.0.2 前提 Gradleがセットアップ済みであること https://qiita.com/yiwa81/items/ccfd6f397a949a0fbe95 Gradleプロジェクトへの変換手順 コマンドプロンプトを開き、Mavenプロジェクトのフォルダに移動 gradle init を実行 実行例 gradle init Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] > Task :init Maven to Gradle conversion is an incubating feature. Get more help with your project: https://docs.gradle.org/7.0.2/userguide/migrating_from_maven.html BUILD SUCCESSFUL in 51s 2 actionable tasks: 2 executed
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MavenプロジェクトをGradleプロジェクトに変換

環境 OS: Windows 10 Home Gradle 7.0.2 前提 Gradleがセットアップ済みであること https://qiita.com/yiwa81/items/ccfd6f397a949a0fbe95 MavenプロジェクトをGradleプロジェクトに変換 コマンドプロンプトを開き、Mavenプロジェクトのフォルダに移動 gradle init を実行 実行例 gradle init Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] > Task :init Maven to Gradle conversion is an incubating feature. Get more help with your project: https://docs.gradle.org/7.0.2/userguide/migrating_from_maven.html BUILD SUCCESSFUL in 51s 2 actionable tasks: 2 executed 変換後の後処理 .gitignore にGradle用の設定を追加 .gradle build/ Maven用の不要なファイルを削除 ** pom.xml ** target/ フォルダ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gradleのセットアップ(Windows)

環境 OS: Windows 10 Home 対象のGradleバージョン Gradle 7.0.2 インストール 以下からアーカイブをダウンロードする https://services.gradle.org/distributions/gradle-7.0.2-bin.zip アーカイブを展開し、適当なフォルダに配置する 例: C:\Gradle\gradle-7.0.2 GRADLE_HOME環境変数としてインストールしたフォルダを設定する 例: GRADLE_HOME=C:\Gradle\gradle-7.0.2 Path環境変数に %GRADLE_HOME%\bin を追加する 動作確認 コマンドプロンプトを開き、以下のコマンドが実行できることを確認 gradle -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

BRMS(ルールエンジン)を使って爆速でAPIとドキュメント一式を作る

はじめに みなさん、BRMS って聞いたことがありますか?私は7~8年ほど前にこういうモノがあることを知って興味を持っていたのですが、なんだか難しそう・・・という先入観があり今まで放置していました\(^o^)/ 重い腰を上げて調べてみたところ、あれ?これって・・・メチャメチャ良いやん!!って感じたので、記事にしてみました。 (実際にモノを作るのは爆速ですが、記事が長文になってしまったことを最初にお詫びさせて頂きます・・・🙇‍♂️) BRMS とは BRMS とは Business Rules Management System の略で、ビジネスルールを管理するシステムです。ビジネスルールとは業務で決まっている規則や判断基準のことで、これらを BRMS に定義して、業務上の判断をさせてしまおうという目論見です(なるほど、わからん)。 詳細は Google 先生に譲るとして、これを導入することで何が美味しいかというと、以下のような恩恵を受けられます。 ローコードで開発できる ロジックが分離できる 変更に強くできる 可搬性を実現できる 各種ドキュメントを自動で生成できる ユーザーにも分かりやすい(見える化) BRMS にも色々な製品があるのですが、今回はオープンソースで手軽に利用できる Kogito を使って動きを見て行こうと思います。ちなみに Kogito には BRMS 以外にも BPMS や Planner など色々な機能がありますので、機会があれば(勉強して🙄)その記事も書いてみたいと思います。 また Kogito の BRMS のエンジンには Drools というオープンソースのルールエンジンが採用されているのですが、Redhat 社が商用サポートを付けて Red Hat Decision Manager として製品化をしています。 本家のドキュメントよりこちらの方が分かりやすくまとめられていたので、ありがたく使わせていただきました🙏。 作るもの 今回は Kogito を使って人事評価の判定処理を実装していきます。大まかに実現したい処理は以下の通りです。シンプルですが分かりやすさ重視で行きます! 当期評価を複数の評価軸で入力する 評価軸の平均点を算出する 平均点に応じた当期総合評価を判定する 前期総合評価と当期総合評価の組み合わせで昇降格を判定する 環境など Kogito は Java で動くのですが、Java で開発といえばまずは Eclipse ですよね・・・という時代でもないので、今回は VSCode を使っていきます。OS は Windows 10 で開発環境は下記の通りです。 OpenJDK version 11.0.12 (Corretto) Apache Maven 3.8.2 Kogito 1.10.0.Final VSCode の Plugin は下記の通りです。 Extension Pack for Java Kogito Bundle インストールや設定で困るところは特にないと思いますが、環境変数の設定は漏らしやすい部分なので、それぞれの手順に従ってしっかり設定しておいてください。また、Kogito 自体はこの後の手順で Maven がよしなにやってくれるので、何もしなくて大丈夫です。 プロジェクト作成 Maven を使ってプロジェクトの雛形を作ります。Kogito は Spring-Boot や Quarkus 上で動作するのですが、今回は軽量で動作が速く Live Reload など開発に便利な機能も持っている Quarkus を使ってみようと思います。 任意のディレクトリで、以下のコマンドを1行にして投入してください。尚、groupIdとartifactIdは好みに応じて変更してください。 powershell(1行にして投入) mvn archetype:generate -DgroupId="com.mycompany.app" -DartifactId="my-app-id" -DarchetypeGroupId="org.kie.kogito" -DarchetypeArtifactId="kogito-quarkus-archetype" -DarchetypeVersion="1.10.0.Final" -DinteractiveMode=false 実行が完了すると以下のような構成でプロジェクトが作成されます。フォルダ構造もシンプルで、最小限のファイルしか存在しなので非常にスッキリしています。 では、ここで軽く動作確認をしておきましょう。次のコマンドでサーバーを起動できます。 powershell mvn clean quarkus:dev サーバーが立ち上がったらhttp://localhost:8080にアクセスしてみてください。Kogito のウェルカムページが表示されればセットアップは無事完了です。 ちなみに、画面右上に Swagger UI のリンクがあるので、そこからサンプルアプリケーションの API を試すことができます。 意思決定要件ダイアグラム作成 事前準備はできたので、早速処理を作っていきましょう。Kogito ではビジネスルールを意思決定要件ダイアグラム(Decision Model and Notation)に定義していきます。この辺りから本格的に BRMS の世界に入っていきます。 まずはsrc\main\resources下にEvaluation.dmnというファイルを作ります。これを開くと下のようなエディタが開くはずです。 データタイプ定義 ビジネスルールの定義から行いたくなるところですが、ここは気持ちをぐっと抑えてデータタイプから定義していきましょう。データタイプを定義することで処理の見通しが圧倒的に良くなります。 データタイプのタブ(①)を選択し、新規のデータタイプ(②)を追加していきます。項目の編集は各アイコン(③)を使って行っていきます。 初期表示は若干画面イメージが違いますが、特に迷うところはないと思います。 こんな感じで、今回の判定処理でインプットとなる「当期評価」と「前期総合評価」のデータ構造を定義していきます。データには取りうる値の範囲で制約を掛けることができるので、ここで設定しておきます。 今回、項目名を日本語で設定していますが、ここで定義した名称は REST API のパラメータ名や 自動生成されるドキュメントに使用されるので、日本語にせよ英語にせよユーザーの用語に合わせるなど、分かりやすい名前で付けておくことがポイントです。 ビジネスルール定義 さて、いよいよ本丸ですね。ここでは以下のような定義を作成していきます。 はい、そうです。冒頭部分に載せた処理フローが実はビジネスルール定義そのものだったんです。BRMSを今回初めて知った人も、おおよそどの様な処理が行われているかすぐに理解できたのではないでしょうか。このように誰が見ても分かりやすいというのが BRMS の優れているところです。 一応簡単に説明しておくと、楕円が外部からのインプットを表し、長方形がデシジョン(処理)を表しています。そして矢印は、その処理が何をインプットとして受け取るか、アウトプットをどのデシジョンに渡すかを表しています。 インプット定義 ではインプットの定義から行っていきます。 まずは、エディタの左上にあるインプットの図形を選択して適当な場所に配置します(①)。次に、そのオブジェクトを選択した状態で右上のプロパティボタンをクリックします(②)。そしてオブジェクトに名前をつける(③)とともに、データタイプに先程定義した「当期評価」を設定します(④)。 「前期総合評価」も同じ要領で配置と設定を行ってください。特に難しいところは無いと思います。 デシジョン定義 こちらもインプット定義同様にエディタ左上の長方形の図形を選択して適当な場所に配置し、名前をつけます。 次に、そのオブジェクトを選択した時に表示される「編集」アイコン(①)をクリックし処理の編集画面を開きます。 編集画面が表示されたら、式の選択(①)をクリックし、論理タイプに文字式(②)を選択します。論理タイプは簡単にいうと処理タイプを表しているのですが、色々なタイプが用意されているので詳しくは リンク先 を読んでみてください。 論理タイプを選択すると一行一列のテーブルが表示されるので、ヘッダ部分(①)をクリックし、データ型に number(②)を選択します。これはこの処理の戻り値のデータ型を表します。 次に、テーブルのデータ部分(①)に以下のような記述を行います。これが処理の本体なのですが、FEEL 式という言語で記述する必要があります。 FEEL式(評価軸の平均を算出して整数に丸める) decimal(mean(当期評価.評価軸1,当期評価.評価軸2,当期評価.評価軸3),0) 変数名に半角スペースを含められるちょっと変わった仕様を持つ言語なのですが、自然言語で記述できるように工夫されており、ユーザーでも理解しやすくなっています。 また、詳しくは リンク先 を見てほしいのですが、FEEL 式には比較的簡単な関数しか用意されていないので、設計段階で入出力のデータ構造を単純化しておいたり、複雑な処理は Java で実装(論理タイプを関数とする)するなどの工夫をしたほうが良さそうです。 入力データへは、矢印の起点のオブジェクト名とそのデータ型のプロパティ名を「.」で繋げて指定することでアクセスできます。この辺りは特に違和感はなく受け入れられると思います。 同じ要領で「当期総合評価」と「昇降格判定」を作成していくのですが、大きな違いは論理タイプを「デシジョンテーブル」としている点です。 デシジョンテーブルは、薄い水色の列(①)が入力値の状態を表し、濃い水色の列(②)がその状態のときの判定結果(出力値)を表す構造となっています。極めて直感的で分かりやすいですよね。 これを踏まえ、「当期総合評価」は下の図の通り定義します。 同様に「昇降格判定」を下の図の通り定義します。「当期総合評価」との違いはヒットポリシーを FIRST としたところです。 「当期総合評価」のように、判定条件に重複がない場合は UNIQUE を指定します。UNIQUE は定義に重複があるとエラーとしてくれるので、フールプルーフとしても役立ちます。 一方の FIRST は最初に条件を満たした時点で判定処理を抜ける動きとなるので、ワイルドカード(ハイフン)を使って ELSE 条件を表現する場合に便利です。全ての組み合わせを定義して UNIQUE として表現することも可能ですが、現実的ではないですよね。 ヒットポリシーの詳細については こちら を参照してください。 これでビジネスルールの定義は終わりです!簡単でしたよね! 👀ジーッ 設計書作成 意思決定要件ダイアグラムの作成ができたので、このタイミングで設計書を作ってしまいましょう。ここまでの手順でエディタ上部にドキュメントのタブ(①)があることにお気づきだったでしょうか? はい、これを選択するだけで設計書が自動生成されます。 自動生成されると言っても、これまでの手順で作成した定義がきれいにレイアウトされて出力されるだけなのですが、元々 BRMS はユーザーが見ても分かりやすいように工夫がされているので、これで事足りると思います。 もしこれで不足があるようであれば、ビジネスルールやデシジョンテーブルにもコメントが記載ができますし、ビジネスルールの根拠となる規定書やガイドへのリンクも追加できるので、これらを使って補うこともできます。 動作確認 では、動作確認をしていきましょう! 環境構築のときと同様にサーバーを起動して http://localhost:8080/q/swagger-ui/ にアクセスします。 powershell mvn clean quarkus:dev ここまでで作成したのは意思決定要件ダイアグラムだけなのですが、Kogito が REST API のエンドポイントと、Swagger 上に API 仕様書まで作成してくれたことにお気づきいただけましたか? ど、どえらいことやで・・・ では、せっかくなので Swagger を使ってAPIを叩いてみましょう。/Evaluation のブロックを展開して、「Try it out」をクリックして、実行してみます。 おや、エラーコード 500 が返ってきていますね。Response body を見ると何やら文字化けしたメッセージが記載されています。 この文字化けの仕方・・・( ゚д゚)ハッ! UTF-8 でエンコードされた文字列を Shift-JIS でデコードした時に見られる文字化けの特徴が出ているので、おそらく Kogito が Evaluation.dmn を読みに行く時に Shift-JIS(MS932)で読み込んでいるのが原因ですね。 私くらいの経験者になると、このくらいはピンと来るようになります。 はい、嘘です。少しハマりました・・・。 ファイルを Shift-JIS で読んでいる理由としては Windows のデフォルトエンコーディング設定くらいしか思い当たらないので、環境変数をセットしてみましょう。 $env:MAVEN_OPTS="-Dfile.encoding=UTF-8" サーバーを再起動したらもう一度トライしてみましょう。 今度はバッチリ動きましたね!判定も正しく行われていそうです。 ちなみに、dmn ファイルは XML 形式でデータを保持しているので、エンコードの指定なども行ってみましたが期待した動きにはなりませんでした。もし、もっとスマートな解決方法を知っている人がいれば教えて下さい。 テスト自動化 人間とは欲深いもので、ここまで実現できるとテストも自動化したくなりますよね。次はその部分を見ていきましょう。 事前準備 まずはテストの自動化のために依存モジュールを1つ追加します。pom.xml の dependencies 下に以下の要素を追加してください。 pom.xml <dependency> <groupId>org.kie.kogito</groupId> <artifactId>kogito-scenario-simulation</artifactId> <scope>test</scope> </dependency> 追加したら、src\test\java\testscenario 下に KogitoScenarioJunitActivatorTest.java ファイルを作成します。ファイルパスは重要なので間違えないようにしてください。 このクラスは、これから作成するテストシナリオを JUnit に認識させる役割を果たします。ソースは以下の通りで、アノテーションが指定されているだけで中身は空っぽです。 KogitoScenarioJunitActivatorTest.java package testscenario; @org.junit.runner.RunWith(org.kogito.scenariosimulation.runner.KogitoJunitActivator.class) public class KogitoScenarioJunitActivatorTest { } 事前準備は以上です。この辺りはお作法だと割り切って設定してしまいましょう。 テストシナリオ作成 テストシナリオは src\test\resources 下に Evaluation.scesim というファイルを作成して定義していきます。こちらもファイルパスと拡張子が重要なので間違えないようにしてください。 ファイルを開くと簡単なウィザードが立ち上がります。今回は DMN 形式でビジネスルールを定義しているのでソースタイプに DMN(①)を選択し、テスト対象に Evaluation.dmn(②)を選択して Create ボタン(③)をクリックします。 すると、こんな感じで画面が開きます。ここでテンションが爆上がりしたのは私だけでしょうか・・・。 ここから先は何をすればよいか直感的に分かりますよね。GIVEN にテスト条件を入力し、 EXPECT にその際の期待値を入力するだけです。 こんな感じです。ちなみに、このテストケースは抜け漏れだらけなので、良い子の皆さんはきちんとケースを洗い出しましょう。 テストケースが完成したら、テストを流しましょう。VSCode のテストタブ(①)を選択し、testscenario 横の実行ボタン(②)を押すだけです。 結果はこんな感じです(ニンマリ)。 以上です!! まとめ 環境構築からテストまで、駆け足で説明してきましたがいかがだったでしょうか?BRMS という言葉は初耳だったかもしれませんが、便利そうだなと思っていただけたら幸いです。 ビジネスルールを理解しやすい形で定義できること自体メリットなのですが、ドキュメント類を自動生成してくれたり、テストが簡単にできたり、様々な工夫がされていて非常に便利だと感じました。 また、途中で作成した意思決定要件ダイアグラムは Object Management Group という団体によって仕様が標準化されていて、ロックインされないところも地味に良いなと感じました。 ちなみに、ちょっと調べた感じだと Camunda などがこの仕様をサポートしていました。 一方で、日本語ドキュメントが不足していたり、エディタのテーブル編集機能の操作性(特にコピペ、連続データ登録)などにはまだ課題があると感じました。 BRMS という考え方が出てきてから久しいですが、そろそろ日の目を見る時代がやってくる気がしました! 参考リンク 当記事を書くに際して @Erina さんの投稿を大いに参考にさせていただきました! ありがとうございました🙏
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

日付のテストは午後にやろう

SimpleDateFormat の HH と hh は結構な確率で間違えます。 結合テストが軌道に乗ってきた頃に、午後にならないと再現しない謎の不具合が発生します。 // 現在日時: 2021-09-15 13:24:56 DateFormat df1 = new SimpleDateFormat("yyyyMMddHHmmss"); // => 20210915 *13* 2456 DateFormat df2 = new SimpleDateFormat("yyyyMMddhhmmss"); // => 20210915 *01* 2456 面倒なので単体テストでちゃんと検知しましょう。 ということで、午後の日付を入力値にするのがポイントです。 以下はdjUnitでやるときの例。 // 現在日時を固定(超てきとう) MockObjectManager.addReturnValue(Calendar.class, "getTime", Timestamp.valueOf("2021-09-15 13:24:56")); // テスト実行&結果の検証 String result = testObj.test(); assertEquals("20210915132456", result);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[paiza]スキルチェック見本問題 Java 偶奇の判定と曜日の判定 (paizaランク D 相当)

初めに 今回2つのスキルチェック問題に挑戦しました。 Dレベルにしては、少し難しく感じました。 ①偶奇の判定 長さ N の数列Aが与えられます。 この数列に含まれる偶数の要素の個数と、奇数の要素の個数を答えてください。 解答コード(自作) paizaの解答と比べるとあまりスマートとは言えませんが・・・ なんとか正解しました。 拡張for文マスターできれば色々できますね。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //与えられる数字をキャッチします。 int n = sc.nextInt(); //奇数、偶数の初期値を0でセットします。 int even = 0; int odd = 0; //n個の箱を持つ、int型の配列を作成します。 int[] a = new int[n]; //以下for文です。n行分のデータを配列に入れていきます。 for(int i=0; i<n; i++){ a[i]= sc.nextInt(); } //以下、拡張for文です。配列の中身を取り出していきます。 for(int x:a) //偶数を見つけたらevenの値が1ずつ増えます。 if(x%2==0){ even = even +1; }else{ odd = odd +1; } } System.out.print(even + " " + odd); } } ②曜日の判定 ある月の 1 日は日曜日、 2 日は月曜日...です。X日は何曜日でしょう。 ・・・? ・・・? 解答コード(自作) 1日が日曜なら、、 7/14/21/28の「7」で割れる数字が来たら、Sat。 1と、8/15/22/29の「7」で割ってあまり1が来たら、Sun。 2と、9/16/23/30の「7」で割ってあまり2が来たら、Mon。という感じで良いのかな。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); if(x%7==0){ System.out.println("Sat"); }else if((x%7==1)||(x==1)){ System.out.println("Sun"); }else if((x%7==2)||(x==2)){ System.out.println("Mon"); }else if((x%7==3)||(x==3)){ System.out.println("Tue"); }else if((x%7==4)||(x==4)){ System.out.println("Wed"); }else if((x%7==5)||(x==5)){ System.out.println("Thu"); }else if((x%7==6)||(x==6)){ System.out.println("Fri"); } } } 修正バージョン paizaの解答を確認し以下の通りに修正しました。 確かに、実際に手計算してみると、orの条件が無駄だったことに気づきました・・ if((x%7==2)||(x==2)) は、(x%7==2)で十分でした。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); if(x%7==0){ System.out.println("Sat"); }else if(x%7==1){ System.out.println("Sun"); }else if(x%7==2){ System.out.println("Mon"); }else if(x%7==3){ System.out.println("Tue"); }else if(x%7==4){ System.out.println("Wed"); }else if(x%7==5){ System.out.println("Thu"); }else if(x%7==6){ System.out.println("Fri"); } } } 終わり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[paiza]スキルチェック見本問題 Java 偶奇の判定/曜日の判定 (paizaランク D 相当)

初めに 今回2つのスキルチェック問題に挑戦しました。 Dレベルにしては、少し難しく感じました。 ①偶奇の判定 長さ N の数列Aが与えられます。 この数列に含まれる偶数の要素の個数と、奇数の要素の個数を答えてください。 解答コード(自作) paizaの解答と比べるとあまりスマートとは言えませんが・・・ なんとか正解しました。 拡張for文マスターできれば色々できますね。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //与えられる数字をキャッチします。 int n = sc.nextInt(); //奇数、偶数の初期値を0でセットします。 int even = 0; int odd = 0; //n個の箱を持つ、int型の配列を作成します。 int[] a = new int[n]; //以下for文です。n行分のデータを配列に入れていきます。 for(int i=0; i<n; i++){ a[i]= sc.nextInt(); } //以下、拡張for文です。配列の中身を取り出していきます。 for(int x:a) //偶数を見つけたらevenの値が1ずつ増えます。 if(x%2==0){ even = even +1; }else{ odd = odd +1; } } System.out.print(even + " " + odd); } } ②曜日の判定 ある月の 1 日は日曜日、 2 日は月曜日...です。X日は何曜日でしょう。 ・・・? ・・・? 解答コード(自作) 1日が日曜なら、、 7/14/21/28の「7」で割れる数字が来たら、Sat。 1と、8/15/22/29の「7」で割ってあまり1が来たら、Sun。 2と、9/16/23/30の「7」で割ってあまり2が来たら、Mon。という感じで良いのかな。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); if(x%7==0){ System.out.println("Sat"); }else if((x%7==1)||(x==1)){ System.out.println("Sun"); }else if((x%7==2)||(x==2)){ System.out.println("Mon"); }else if((x%7==3)||(x==3)){ System.out.println("Tue"); }else if((x%7==4)||(x==4)){ System.out.println("Wed"); }else if((x%7==5)||(x==5)){ System.out.println("Thu"); }else if((x%7==6)||(x==6)){ System.out.println("Fri"); } } } 修正バージョン paizaの解答を確認し以下の通りに修正しました。 確かに、実際に手計算してみると、orの条件が無駄だったことに気づきました・・ if((x%7==2)||(x==2)) は、(x%7==2)で十分でした。 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); if(x%7==0){ System.out.println("Sat"); }else if(x%7==1){ System.out.println("Sun"); }else if(x%7==2){ System.out.println("Mon"); }else if(x%7==3){ System.out.println("Tue"); }else if(x%7==4){ System.out.println("Wed"); }else if(x%7==5){ System.out.println("Thu"); }else if(x%7==6){ System.out.println("Fri"); } } } 終わり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Excelの背景に色と画像を追加

Spire.XLS for javaは、パワフルなエクセル向けのライブラリであり、いろいろな機能を搭載していますので、とても便利です。今日の紹介は、Spire.XLS for javaを利用してExcelの背景に色と画像を追加することにします。早速、行きましょう! 下準備 1.E-iceblueの公式サイトからSpire. XLS for Javaをダウンロードしてください。 2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。 背景に色 import com.spire.xls.ExcelVersion; import com.spire.xls.Workbook; import com.spire.xls.Worksheet; import java.awt.*; public class BackgroundColor{ public static void main(String[] args){ //Workbookオブジェクトを作成します。 Workbook workbook = new Workbook(); //Excelファイルをロードします。 workbook.loadFromFile("input.xlsx"); //シートを取得します。 Worksheet sheet = workbook.getWorksheets().get(0); //セルの背景に色をつけます、 sheet.getAllocatedRange().getStyle().setColor(Color.green); //指定するセルで色をつけます //sheet.getCellRange("A1:E19").getStyle().setColor(Color.yellow); //保存します。 workbook.saveToFile("SetBackColor.xlsx", ExcelVersion.Version2013); } } 実行結果 背景に画像を追加 import com.spire.xls.ExcelVersion; import com.spire.xls.Workbook; import com.spire.xls.Worksheet; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class BackgroundImage { public static void main(String[] args) throws IOException { //Workbookオブジェクトを作成します。 Workbook workbook = new Workbook(); //Excelファイルをロードします。 workbook.loadFromFile("input.xlsx"); //シートを取得します。 Worksheet sheet = workbook.getWorksheets().get(0); //画像を取得します。 BufferedImage image = ImageIO.read( new File("background.jpg")); //背景に画像をつけます。 sheet.getPageSetup().setBackgoundImage(image); //保存します workbook.saveToFile("SetBackImage.xlsx", ExcelVersion.Version2013); } } 実行結果  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Eclipseワークスペース新規作成方法

ワークスペースを新規作成する Cドライブ直下に新しいフォルダーを作成。 階層が深くなると正常に動かなくなることがある。 名前はなんでも。workspaceなど。 小文字スタート、スネークケース。 Eclipseを起動する 前回使用していたワークスペースが選択された状態で起動されるので、 参照を選択して、さきほど作成したフォルダを選択する。 ワークスペースが切り替わったことを確認したら、起動をクリック。 ワークスペースの選択画面が表示されない場合 一度そのままEclipseを起動する。 ウィンドウ→設定 一般の下矢印→開始およびシャットダウンの下矢印→ワークスペースの順にクリック 「始動時にワークスペースをプロンプト」にチェックを入れる。 適用して閉じるを忘れずにクリック。 エクリプスを一度閉じて、再度開くとワークスペースの設定画面が表示されるようになる。 実行ボタンを押したら実行されるように設定する デフォルトだと実行ボタンを押しても実行されずにこんな画面が表示される。 ワンクリックで実行できるように設定する。 ウィンドウ→設定の順にクリック 設定ウィンドウの左側の領域を下までスクロールして、実行/デバッグの下矢印→起動の順にクリック。 下記画像と同じようにチェックを入れる。 適用して閉じるを忘れずにクリック。 これで実行ボタンを押すだけでプログラムが実行されるようになる。 ちなみに ctrl + F11 でも実行できるので、覚えておくと便利です。 テストプログラムの作成手順 新規ワークスペースを作成したら、正常に動作するか確認する。 テストプロジェクトの作成 ファイル → 新規 → Javaプロジェクト もしくは以下ショートカット→Javaプロジェクト Shift + Alt + n プロジェクト名:Test プロジェクト名は大文字スタート、キャメルケース。 実行環境JREがJavaSE-1.8が選択されていることを確認。 完了! テストパッケージの作成 src内に、testパッケージを作成する。 画像のようにクリックで作成しても良いが、やはりショートカットが便利。 Shift + Alt + n Testプロジェクトのsrcフォルダが選択されていることを確認して、パッケージ名を入力。 パッケージ名は小文字スタート、スネークケース。 忘れずに完了をクリック! 新規クラスを作成 HelloWorldなど簡単なものを作成する。 Shift + Alt + n プロジェクトフォルダ、パッケージが正しく選択されているか確認。 パッケージ名は大文字スタート、キャメルケースで入力。 public static void main... に忘れずにチェックを入れる。 忘れずに完了をクリック! コードを打ち込む package test; public class Test { public static void main(String[] args) { System.out.println("Hello World!"); } } Ctrl + F11で実行! Hello Worldが表示されれば成功です。 お疲れさまでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java] 配列の書き方がスッキリわかる記事

配列の書き方がいろいろあって、混乱したので自分用にまとめました。 この記事の対象読者 以下のコードが構文エラーになる理由がわからない人 int[] ary; ary = new int[] ary[0] = 1; ary[1] = 2; ary[2] = 3; このエラーの理由がわからない場合は、この記事を読めば頭が整理されてスッキリすると思います。 結論 配列を定義して使用するためには、以下の3つのステップが必要になります。 配列の宣言 配列の生成 要素の初期化 3番目の「要素の初期化」はなくてもエラーにはならないけど、 わかりやすいコードにするためにも、明記することが推奨されてます。 配列の宣言 まず最初に必要なのは、配列の宣言です。 こんなやつ。 int[] ary; int ary[]; aryという変数名で配列を宣言してます。 上記はどちらも同じ意味です。 お好みでどうぞ。 また、intのところをStringやdouble等、他の型にすることもできます。 intで宣言したら、int型の要素しか入れることができません。 配列の生成 次に必要なのは、配列の生成です。 newを使うあれです。 new int[要素数]; この記述により、配列に使用するメモリが確保されます。 実際の書き方 int[] ary; // 配列の宣言 ary = new int[要素数]; // 配列の生成 1行で書くこともできます。 int[] ary = new int[要素数]; // 配列の宣言 + 配列の生成 エラーになるケース 要素数の省略 配列の宣言をしない 場合、構文エラーになります。 // 要素数の省略 int[] ary; ary = new int[]; // 構文エラー // 配列の宣言をしない ary = new int[要素数]; // 構文エラー 要素の初期化 配列の生成をしただけでは、中身は空っぽです。 ※正確には型に応じた規定値(intの場合は0)が入ってます。 配列として扱うために、配列に要素を入れてあげる必要があります。 まとめて初期化 int[] ary; ary = new int[3] {1, 2, 3}; ひとつずつ初期化 int[] ary; ary = new int[3]; ary[0] = 1; ary[1] = 2; ary[2] = 3; 1行で書く場合 配列の宣言から初期化まで1行で書くこともできます。 int[] ary = new int[3] {1, 2, 3}; どれも使っても同じ結果になります。 やりがちな間違い int[] ary; // 配列の宣言 ary = new int[3]; // 配列の生成 ary = {1, 2, 3}; // 配列の初期化 配列の宣言もされていて、要素数も指定されているし、問題がないように見えます。 ですが、これはエラーになります。 問題なのは3行目。 これで初期化ができているように見えますが、実は初期化できていません。 なぜなら、aryに入っているのは配列への参照情報だからです。 {}を使ってまとめて初期化したい場合は、new int[]と一緒に記述する必要があります。 ここまでが配列の書き方の基本です。 冒頭のコードはなぜエラー? では、冒頭のコードはなぜエラーになるのでしょうか? このコードです。 int[] ary; ary = new int[]; ary[0] = 1; ary[1] = 2; ary[2] = 3; ここまで読んでいただいたらわかると思います。 そうですね。要素数が指定されていません。 正しくはこう。 int[] ary; ary = new int[3]; // 要素数を指定 ary[0] = 1; ary[1] = 2; ary[2] = 3; これで正常に動作します。 おまけ:省略記法 配列を扱うには上記の3ステップが必要なのですが、 Javaには省略記法というものが用意されています。 要素数の省略 // 1行で書く場合 int[] ary1 = new int[] {1, 2, 3}; // 分けて書く場合 int[] ary2; ary2 = new int[] {1, 2, 3}; {}を使用して同時に初期化する場合に限り、要素数を省略することができます。 配列の生成の省略 int[] ary = {1, 2, 3}; 配列の生成も省略してるし、参照情報を入れるaryに要素を直接代入しており、エラーが出る気がするのですが、こちらも正常に動作します。 これらの記法に限り、省略が許可されています。 ここは理屈ではなく、こういうものだと割り切って暗記すると、混乱しなくて済むと思います。 まとめ 配列の書き方を自分なりにまとめてみました。 自分はこの考え方で、結構あたまの中がスッキリしたので、 少しでも理解の助けになればうれしいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

動画で学ぶJHipster (6) fakerの削除

参考動画 fakerの削除 (動画の6:00ごろ~) データを自動生成してくれるfakerですが、(動画の流れで)削除します。 削除する方法は、 src/main/resources/config/application-dev.ymlの、以下の部分のfakerを削除して、 liquibase: # Remove 'faker' if you do not want the sample data to be loaded automatically contexts: dev, faker 下記のようにします。 liquibase: # Remove 'faker' if you do not want the sample data to be loaded automatically contexts: dev さらに、./mvnw cleanを実行します。すると、H2 databaseに入っているデータが削除されます。 その後、mvnwで再起動すると、以下のようにデータが消えた状態になります。 コード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

むずむずしたJavaコード

むずむずしたJavaコード 普段Javaをつかった開発に従事させていただいてますが、 読む機会のあったコードの中で、おこがましいですが 「ううう、こう書いてもいいのでは」とむずむずすることがありました。 今回はそういったむずっとくるコードを改善するコードを記載できればと思います。 foreach class Member { private String name; private int age; // ...AllConfigConstructor,getter,setter } List<Member> members = List.of( new Member("Tom", 21) , new Member("Gomez", 19) , new Member("Ame", 10)); Map<String, Member> teens = new HashMap<>(); members.stream().forEach(member -> { if (member.getAge() < 20 && member.getAge() > 9) { teens.put(member.getName(), member); } }); foreachで条件合致するオブジェクトはmapに詰めるといった記述をみました。 streamのなにをしたいかが読める感じが好きなのに、 foreach内でいろいろやられると命令的に読む内容が増える。ううう。(例は簡単ですが) filterとCollectorsつかって書き直すならこんな感じかと。 Map<String, Member> teens = members.stream() .filter(member -> member.getAge() < 20 && member.getAge() > 9) .collect(Collectors.toMap(Member::getName , Function.identity())); 条件分岐は別で考えたい。filterで中身を整えたあとにmapに変換したい。 newの初期化も消える。 Optional.isPresent() ラップオブジェクトでNullPointerException回避のためにも よくつかっているのですが、isPresentとかifPresentとか使い分けがなかなか難しい。 ううう。 Optional<Member> opMember = Optional.ofNullable(member).filter(m -> m.getAge() > 50); if (opMember.isPresent()) { execute(opMember.get().getAge()); } とか Optional<Member> opMember = Optional.ofNullable(member).filter(m -> m.getAge() > 50); String target; if (opMember.isPresent()) { target = opMember.getName(); } else { target = null; } // ... Optional.isPresent()で判定して、値があるならなにかしらの 処理をする、もしくは値を取り出す記述を見ました。 Optionalはもっと便利につかえるはず。 Optional.ofNullable(member) .filter(m -> m.getAge() > 50) .ifPresent(m -> execute(m.getAge())); 戻りがないならifPresentにConsumerとして渡してあげられるし String seniorMemberName = Optional.ofNullable(member) .filter(m -> m.getAge() > 50) .map(Member::getName) .orElse(null); Optionalもmapメソッドをもってて 空っぽであれば空のOptionalを返してくれるので便利。 if文をかかなくていいし。 ちょっとした使い方覚えるとif文とか書かなくてよくなるので やっぱりJavadoc見たりした方がいいですね。 小さな現場からは以上です。 ※上記の改善側にもむずむずする方もいらっしゃるとは思います。 その時はご指摘いただけると幸いです。 題材が少なすぎてどうにもならんかもですが。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む