- 投稿日:2021-08-29T21:16:05+09:00
【実践!Java】Stream APIをちゃんと理解する
■ Stream APIとは Stream APIは、Listや配列を簡単に操作することができるイテレーションの拡張API。 例えば、for文でListから条件に合う値を取得する処理などはStream APIを使うことでよりシンプルに書くことができる。 大きく分けて以下の3つの操作を行う。 ➀ Streamを生成 ↓ ➁ 中間処理(省いてもOK) ↓ ➂ 終端処理 ■ Stream生成 配列からストリーム生成 Arrays.stream(配列のdata) listからストリーム生成 list.stream() mapからストリーム生成 map.entrySet().stream() ■ 終端処理 生成したストリームを集計し、結果を返す処理。 簡単な処理であれば中間処理を省いて終端処理だけで実装できるため、先に紹介。 代表的なメソッド メソッド 概要 anyMatch() 少なくとも一つの要素でtrueとなるか allMatch() 全ての要素でtrueとなるか nonMatch() 全ての要素でfalseとなるか forEach() 全ての要素に関数を適用する count() 要素数を返す max() 最大値を返す min() 最小値を返す findFirst() 先頭の値を返す findAny() 任意の値を返す collect() リストとして取り出す 使い方 anyMatchを使って、Listの中に特定の文字列が含まれているかを判定。 // List作成 List<String> sampleList = Arrays.asList("hoge", "fuga", "piyo"); // anyMatchで終端処理 boolean flg = sampleList.stream().anyMatch(list -> list.equals("hoge")); // true が出力される System.out.println(flg); ■ 中間処理 中間処理を使うことで、ストリームに対してより複雑な処理を行うことができる。 代表的なメソッド メソッド 概要 limit() ループさせる要素をn個までに制限 skip() ループさせる要素を先頭からn個skip filter() filterで処理した結果trueの要素を返す distinct() 重複する要素を排除して返す sorted() 並び変えたストリームを返す map() mapの要素を取得する 使い方 未成年の男の名前をListで取得する List<String> youngMen = men.stream() .filter(y -> y.age < 20) // 20未満の男のみにする .map(y -> y.name) // 名前を取得 .collect(Collectors.toList()); // リストにして返す (おまけ)はまったポイント ラムダ式内でラムダ式外にある変数を書き換えることはできない。 Stream生成前に作成した変数をStream処理で使用しようとしたらエラーが出ました、、、 (finalな変数であれば問題ない) Stream APIを使うなら、ラムダ式も理解しておくべき。
- 投稿日:2021-08-29T18:55:01+09:00
Spring Data JDBCで1対多テーブルを結合して取得する方法
はじめに Java言語初学者ですが、SpringBootフレームワークを使用してSQLを操作する際に、 1対多のテーブルを結合した結果を取得する方法でハマったため、 1対1のテーブル結合の方法と、1対多のテーブル結合の方法を比較したメモとして残します。 環境 OS version framework 使用環境 windows10 Java11 spring boot Spring Tool Suite 4 ・Java11でSpring Data JDBCを使用できる状態 ・動作するデータベース用意済み ・1対多の関係でテーブルを2つ作成済み ・テーブルにデータを格納済み ※今回の説明では「clabs」、「members」で記載します。 ※また今回はテーブル結合方法の説明の為必要最低限の記載だけします。(importなどは省略) 1対1のテーブルを結合して取得する方法 1対1のテーブルを結合してデータを取得する際は以下の方法を使用します。 ※1対1のテーブル説明の為、1つのクラブには1人しか入れないこととします。 Domainクラス データベースに登録しているカラムをフィールド変数として記載します。 Member.javaにはテーブル結合に必要なフィールド変数を追加しています。 Clab.java public class clab { /** ID */ private Integer id; /** クラブ名 */ private String name; //以下にGetter,Setter,ToStringなどの記載 ... } Member.java public class member { /** ID */ private Integer id; /** メンバー名 */ private String name; /** クラブID */ private Integer clabId; /** クラブ名 */ private String clabName; //以下にGetter,Setter,ToStringなどの記載 ... } Repositoryクラス RowMapperを使用します。 ざっくり説明するとSQL実行時にDBから検索してきたResultSetオブジェクトをRowMapperに渡す動作をします。(1行分のデータを取得してくる) MemberRepository.java @Repository public class ClabRepository { //データベース操作を行うための変数宣言 @Autowired private NamedParameterJdbcTemplate template; //ResultSetオブジェクトに格納された1行分のデータをMember型の変数にセットしてreturnする private static final RowMapper<Member> MEMBER_ROWMAPPER = (resultSet,i) -> { Member member = new Member(); member.setId(resultSet.getInt("m_id")) member.setString(resultSet.getString("m_name")); member.getClabId(resultSet.getInt("m_clab_id")); member.getClabName(resultSet.getString("c_name")); return member; } //SQLを実行して結果をreturnする public List<Member> findAllMemberAndClab() { String sql = "SELECT m.id as m_id, m.name as m_name, m.clab_id as m_clab_id, c.name as c_name FROM members as m LEFT OUTER JOIN clabs as c ON m.clab_id = c.id;"; List<Member> memberList = template.query(sql, MEMBER_ROWMAPPER); return memberList; } } Repositoryクラスに記載したコードの流れとしては、SQLを実行したときに、フレームワークから検索してきたResultSetオブジェクトをRowMapperに渡す。 裏側で1行分のデータをResultSetオブジェクトに格納して、それらをmember変数に格納してmemberList変数に格納していく。 SQLで該当するデータをすべてmemberListに格納できたらreturnする。 1対多のテーブルを結合して取得する方法 1対多のテーブルを結合してデータを取得する際は以下の方法を使用します。 ※1対多のテーブル説明の為、1つのクラブには複数人登録できることとします。 Domainクラス データベースに登録しているカラムをフィールド変数として記載します。 Clab.javaにはmembersテーブルのデータを格納するためのList型の変数を追加しています。 Member.javaにはテーブル結合に必要なフィールド変数を追加しています。 Clab.java public class clab { /** ID */ private Integer id; /** クラブ名 */ private String name; /** メンバーリスト */ private List<Member> memberList; //以下にGetter,Setter,ToStringなどの記載 ... } Member.java public class member { /** ID */ private Integer id; /** メンバー名 */ private String name; /** クラブID */ private Integer clabId; //以下にGetter,Setter,ToStringなどの記載 ... } Repositoryクラス ResultSetExtractorを使用します。 ざっくり説明するとSQL実行時にDBから検索してきたResultSetオブジェクトを自分でセットする必要があります。(複数行分のデータを取得してくる) MemberRepository.java @Repository public class ClabRepository { //データベース操作を行うための変数宣言 @Autowired private NamedParameterJdbcTemplate template; //ResultSetオブジェクトに格納された複数行分のデータをList<Clab>変数にセットしてreturnする private static final ResultSetExtractor<List<Clab>> CLAB_MEMBER_RESULTSET = (rs) -> { //初めにデータを格納するための変数を宣言 List<Clab> clabList = new ArrayList<>(); //メンバーを格納するためのList<Member>変数を宣言(値はNullを格納しておく) List<Member memberList = null; //clabsテーブルは結合した際に複数行にわたり同じデータが出力される可能性があるため、前のClabテーブルのIDを保持するための変数を宣言 int beforeIdNum = 0; //ResultSetオブジェクトに格納された複数のデータをList<Clab>変数に格納していく while(rs.next()) { //現在検索しているClabテーブルのIDを格納するための変数を宣言 int nowIdNum = rs.getInt("c_id"); //現在検索しているClabテーブルのIDと前のClabテーブルのIDが違う場合は新たにClabオブジェクトを作成する if (nowIdNum != beforeIdNum) { Clab clab = new Clab(); clab.setId(nowIdNum); clab.setName(rs.getString("c_name")); //メンバーがいた際にClabオブジェクトのmemberListに格納するため空のArrayListをセットしておく memberList = new ArrayList<Member>(); clab.setMemberList(memberList); clabList.add(clab); } //ClabにMemberがいない場合はMemberオブジェクトを作成しないようにする if (rs.getInt("m_id") != 0) { Member member = new Member(); member.setId(rs.getInt("m_id")); member.setName(rs.getString("m_name")); //memberをclabオブジェクト内にセットされているmemberListに直接追加する memberList.add(member); } //現在検索しているClabテーブルのIDを前のClabテーブルのIDを入れるbeforeIdNumに代入する beforeIdNum = nowIdNum; } return clabList; } public List<Clab> findAll() { String sql = "SELECT c.id as c_id, c.name as c_name, m.id as m_id, m.name as m_name FROM clabs as c LEFT OUTER JOIN members as m ON c.id = m.clab_id;"; List<Clab> clabList = template.query(sql, CLAB_MEMBER_RESULTSET); return clabList; } } Repositoryクラスに記載したコードの流れとしては、SQLを実行したときに、フレームワークから検索してきたResultSetオブジェクトをResultSetExtractorに渡す。 その際にSQL実行した際に検索したすべての行をResultSetオブジェクトに格納するため、 ResultSetオブジェクトのnext()メソッドを使用して、オブジェクトにデータがある間ループ処理を行うようにする。 clabsテーブルは取得したデータ内容が重複することがあるため同じIDの場合はオブジェクトを生成しないようにする。 ResultSetオブジェクトにデータがなくなった際ループ処理が終了して、memberListをreturnする。 まとめ 1対多のテーブル結合をRowMapperを使用してClabRepositoryとMemberRepositoryに分けて実施することで再現することができるのですが、SQLを何回も実施しないといけなくなるので、実行時間が長くなってしまいます。そのためテーブルの結合をする際はResultSetExtractorを使用したほうがいいといえます。 参考文献 以下のGitHubを参考にさせていただきました。 ・GitHub
- 投稿日:2021-08-29T16:07:05+09:00
HerokuにGitでHelloWorldをデプロイする②[SpringBoot]
今回は、前回作成したHelloWorldをHerokuにデプロイします。 前回→HerokuにGitでHelloWorldをデプロイする①[SpringBoot] 環境 OS : Windows10 Git : 2.32.0 Heroku : 7.53.0 eclipse Spring Boot(thymeleaf,Maven) 前提条件 Gitをインストール済み Herokuに登録済み Heroku CLIをインストール済み コマンドプロンプトを開く 前回作成したHelloWorldをHerokuを開いてください。 そして、フォルダのパスが書いてあるところに、cmdと入力し、Enterキーを押してください。 こうしてコマンドプロンプトを開くと、cdでHelloWorldがあるディレクトリまで移動する必要がありません。 init,add,commitをする >git init >git add . >git commit -m"HelloWorld" 私は、cmdで操作しましたが、「Git Bash」でも大丈夫です。 右クリック>Git Bash Hereをクリックすると、Git Bashが開きます。 Herokuにログインする heroku login -i Herokuを登録するときに設定した、自分のメールアドレスとパスワードを入力してください。 もし、'heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。といわれたら、下記の記事を見てみてください。 'heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 Heroku上にアプリを作成する heroku create heroku create アプリ名でアプリ名を指定することもできます。 今回はアプリ名を指定しないので、自動的にアプリ名が付けられます。 ※あとで変更可能です Herokuにpushする git push heroku main もしくは、git push heroku masterと入力してください。 mainとmasterは、どちらもherokuのブランチ名です。 以前までは、masterがデフォルトのブランチ名でしたが、「master:主人」という英単語が「slave:奴隷」と対比となっており、BLM運動によってGitHubやHerokuのデフォルトのブランチ名が「master」から「main」に変更されました。 https://www.publickey1.jp/blog/20/githubmainmastermain.html https://www.itmedia.co.jp/news/articles/2007/13/news057.html 作成したアプリを開く heroku open 参考HP 【herokuコマンド】createからdestroyまで
- 投稿日:2021-08-29T16:06:51+09:00
HerokuにGitでHelloWorldをデプロイする①[SpringBoot]
環境 OS : Windows10 Git : 2.32.0 Heroku : 7.53.0 eclipse Spring Boot(thymeleaf,Maven) 今回、GitHubと連携はしていません。 前提条件 Gitをインストール済み Herokuに登録済み Heroku CLIをインストール済み Hello Worldのコードを準備する GitHubで公開もしています。 Spring スターター・プロジェクトを作る ファイル>新規>Spring スターター・プロジェクト スターター・プロジェクトの設定 名前 : HelloWorld 型 : Maven Havaバージョン : 11 依存関係の設定 Lombok Thymeleaf Spring Boot DevTools Spring Web Controllerクラスを作成 Controller.java package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; public class Controller { @RequestMapping("/") public String index() { return "hello"; } } index.html(view)を作成 index.htmlを作成するときは、src/main/resourcesのtemplatesの直下に作ってください。 index.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>HELLO</title> </head> <body> Hello World </body> </html> pom.xml pom.xmlは自動で作られます。 [依存関係の設定]で選択したものも入っていると思います。 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example.demo</groupId> <artifactId>HelloWorld</artifactId> <version>0.0.1-SNAPSHOT</version> <name>HelloWorld</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> Herokuに必要なファイルを作る Herokuに必要なファイルを作ります。二つとも、プロジェクトの直下に作成してください。 system.properties : javaのバージョンを明記する Procfile :Heroku上で実行するコマンドを定義する eclipseでのファイルの作り方 プロジェクトの上で右クリック>新規>ファイル ※拡張子は必要ないです system.properties system.properties #java.runtime.version=[javaのバージョン] java.runtime.version=11 javaのバージョンを明記します。 Procfile Procfileは「P」は大文字で、拡張子は付けないでください。 # web: java -Dserver.port=$PORT -jar target/任意の文字列-0.0.1-SNAPSHOT.jar web: java -Dserver.port=$PORT -jar target/HelloWorld-0.0.1-SNAPSHOT.jar 今回はthymeleafを使ったwebアプリなので、webと書きます。 任意の文字列は、pom.xmlのartifactIdタグ、versionタグ内に記載されています。 pom.xml -- 略 -- <groupId>com.example.demo</groupId> <artifactId>HelloWorld</artifactId> <version>0.0.1-SNAPSHOT</version> <name>HelloWorld</name> -- 略 -- Procfileを書かなくてもいいという記事もあったんですが、私はProcfileを書かないとうまく動きませんでした。 ↓system.propertiesとProcfileについて、非常に参考になった記事です。 もっとsystem.propertiesとProcfileについて知りたい人は、ぜひ読んでみてください。 SpringBootで作成したアプリケーションをHerokuへデプロイ(公開)① プロジェクトをエクスポートする プロジェクト上で右クリック>エクスポート ファイル・システムを選択 宛先ディレクトリーは好きな場所を選んでください。 次回は今回作ったHelloWorldをHerokuにデプロイします。 HerokuにGitでHelloWorldをデプロイする②[SpringBoot] 参考HP 【はじめてでも15分でできる】HerokuでJavaのWebアプリをサクッと動かす手順 SpringBootで作成したアプリケーションをHerokuへデプロイ(公開)① Heroku初心者がJavaで作成したWebアプリをGitHub連携でデプロイする時つまずいた4つのこと
- 投稿日:2021-08-29T15:58:51+09:00
Java16で追加されたDateTimeFormatterクラスの書式設定"B"について
はじめに Java16でDateTimeFormatterクラスの書式設定に "B" (period-of-day)が追加されました。 以下のドキュメントには意味として period-of-day 、例が in the morning とあるだけでよくわかりません。 そこで、この書式設定 "B" について実機確認とソースから調べました。 実機確認 各時刻で書式設定 B を指定したときにどのように変換されるかを確認。 確認用ソース TestPreiodOfDay.java import java.time.format.DateTimeFormatter; import java.time.LocalTime; public class TestPreiodOfDay { public static void main(String[] args) { String s1,s2 ; int i ; LocalTime lt ; DateTimeFormatter f = DateTimeFormatter.ofPattern("HH:mm"); DateTimeFormatter fmt_period = DateTimeFormatter.ofPattern("B"); for ( i = 0 ; i < 24 ; i++ ) { lt = LocalTime.of(i, 00); s1 = lt.format(f); s2 = lt.format(fmt_period); System.out.println(s1 + " = " + s2); } } } 実行結果 00:00 = midnight 01:00 = at night 02:00 = at night 03:00 = at night 04:00 = at night 05:00 = at night 06:00 = in the morning 07:00 = in the morning 08:00 = in the morning 09:00 = in the morning 10:00 = in the morning 11:00 = in the morning 12:00 = noon 13:00 = in the afternoon 14:00 = in the afternoon 15:00 = in the afternoon 16:00 = in the afternoon 17:00 = in the afternoon 18:00 = in the evening 19:00 = in the evening 20:00 = in the evening 21:00 = at night 22:00 = at night 23:00 = at night OpenJDKのソースを確認するとこの時間帯とメッセージはハードコーディングされており、固定になっています。 ただ、ロケールによって時間帯やメッセージは変わります。 ロケールが日本語(ja_JP.UTF-8) の場合 System Locale: LANG=ja_JP.UTF-8 実行結果(ロケール ja_JP.UTF-8) 00:00 = 真夜中 01:00 = 夜中 02:00 = 夜中 03:00 = 夜中 04:00 = 朝 05:00 = 朝 06:00 = 朝 07:00 = 朝 08:00 = 朝 09:00 = 朝 10:00 = 朝 11:00 = 朝 12:00 = 正午 13:00 = 昼 14:00 = 昼 15:00 = 昼 16:00 = 夕方 17:00 = 夕方 18:00 = 夕方 19:00 = 夜 20:00 = 夜 21:00 = 夜 22:00 = 夜 23:00 = 夜中 英語では6時から朝(in the morning)なのに対し、日本語では4時から「朝」です。 JDKソース確認 ドキュメントには記載されていませんがソースを見ると "B" 以外に "BBBB" , "BBBBB" の書式も用意されています。 jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java https://github.com/openjdk/jdk/blob/ddcd851c43aa97477c7e406490c0c7c7d71ac629/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java DateTimeFormatterBuilder.java ..... * Pattern Count Equivalent builder methods * ------- ----- -------------------------- * B 1 appendDayPeriodText(TextStyle.SHORT) * BBBB 4 appendDayPeriodText(TextStyle.FULL) * BBBBB 5 appendDayPeriodText(TextStyle.NARROW) ..... private void parsePattern(String pattern) { ....... } else if (cur == 'B') { switch (count) { case 1 -> appendDayPeriodText(TextStyle.SHORT); case 4 -> appendDayPeriodText(TextStyle.FULL); case 5 -> appendDayPeriodText(TextStyle.NARROW); default -> throw new IllegalArgumentException("Wrong number of pattern letters: " + cur); "BBBB" または "BBBBB" を指定するとメッセージの長さが変わるようですが、en_US ロケールの場合はほとんど変わらずです。 時刻範囲に対するtypeは以下で定義されています。 jdk/make/data/cldr/common/supplemental/dayPeriods.xml dayPeriods.xml <dayPeriodRules locales="en"> <dayPeriodRule type="midnight" at="00:00"/> <!-- midnight --> <dayPeriodRule type="noon" at="12:00"/> <!-- noon --> <dayPeriodRule type="morning1" from="06:00" before="12:00"/> <!-- morning --> <dayPeriodRule type="afternoon1" from="12:00" before="18:00"/> <!-- afternoon --> <dayPeriodRule type="evening1" from="18:00" before="21:00"/> <!-- evening --> <dayPeriodRule type="night1" from="21:00" before="06:00"/> <!-- night --> </dayPeriodRules> ......... <dayPeriodRules locales="ja"> <dayPeriodRule type="midnight" at="00:00"/> <!-- 真夜中 --> <dayPeriodRule type="noon" at="12:00"/> <!-- 正午 --> <dayPeriodRule type="morning1" from="04:00" before="12:00"/> <!-- 朝 --> <dayPeriodRule type="afternoon1" from="12:00" before="16:00"/> <!-- 昼 --> <dayPeriodRule type="evening1" from="16:00" before="19:00"/> <!-- 夕方 --> <dayPeriodRule type="night1" from="19:00" before="23:00"/> <!-- 夜 --> <dayPeriodRule type="night2" from="23:00" before="04:00"/> <!-- 夜中 --> </dayPeriodRules> type に対するメッセージは以下で定義されています。 jdk/make/data/cldr/common/main/en.xml en.xml <dayPeriods> <dayPeriodContext type="format"> <dayPeriodWidth type="abbreviated"> <dayPeriod type="midnight">midnight</dayPeriod> <dayPeriod type="am">AM</dayPeriod> <dayPeriod type="am" alt="variant">am</dayPeriod> <dayPeriod type="noon">noon</dayPeriod> <dayPeriod type="pm">PM</dayPeriod> <dayPeriod type="pm" alt="variant">pm</dayPeriod> <dayPeriod type="morning1">in the morning</dayPeriod> <dayPeriod type="afternoon1">in the afternoon</dayPeriod> <dayPeriod type="evening1">in the evening</dayPeriod> <dayPeriod type="night1">at night</dayPeriod> jdk/make/data/cldr/common/main/ja.xml ja.xml <dayPeriods> <dayPeriodContext type="format"> <dayPeriodWidth type="abbreviated"> <dayPeriod type="midnight">真夜中</dayPeriod> <dayPeriod type="am">午前</dayPeriod> <dayPeriod type="noon">正午</dayPeriod> <dayPeriod type="pm">午後</dayPeriod> <dayPeriod type="morning1">朝</dayPeriod> <dayPeriod type="afternoon1">昼</dayPeriod> <dayPeriod type="evening1">夕方</dayPeriod> <dayPeriod type="night1">夜</dayPeriod> <dayPeriod type="night2">夜中</dayPeriod> ........... 書式設定 Bに対応する主な処理は DayPeriodPrinterParser クラスの format() で行われています。 static final class DayPeriodPrinterParser implements DateTimePrinterParser { ..... public boolean format(DateTimePrintContext context, StringBuilder buf) { Long hod = context.getValue(HOUR_OF_DAY); if (hod == null) { return false; } Long moh = context.getValue(MINUTE_OF_HOUR); long value = Math.floorMod(hod, 24) * 60 + (moh != null ? Math.floorMod(moh, 60) : 0); Locale locale = context.getLocale(); LocaleStore store = findDayPeriodStore(locale); final long val = value; final var map = DayPeriod.getDayPeriodMap(locale); value = map.keySet().stream() .filter(k -> k.includes(val)) .min(DayPeriod.DPCOMPARATOR) .map(map::get) .orElse(val / 720); // fall back to am/pm String text = store.getText(value, textStyle); buf.append(text); return true; } 確認環境 CentOS Linux release 7.8.2003 (Core) openjdk version "16.0.2" 2021-07-20
- 投稿日:2021-08-29T12:10:48+09:00
Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化
初心者にオススメ出来るJava関連のUdemy動画をまとめました(タイトルの通りです)。 オススメ度は私の主観なのであしからず。 【 5日でできる】はじめての Java プログラミング入門 おすすめ度:★★★★★ ・【 5日でできる】はじめての Java プログラミング入門 この講座で学べる内容 ・Javaプログラミングの流れ、実行の仕組みについて理解できる ・Javaプログラミング環境を自分のPC上に作れるようになる ・統合開発環境(Eclipse)を導入し、効率よく開発ができるようになる ・オブジェクト指向プログラミングの概念を理解できる ・Android StudioをインストールしてAndroidプログラミングを体験できる 【Java サーブレット( Servlet )決定版】ゼロから環境構築~設計モデルまで、動画で楽々学ぶ おすすめ度:★★★★ ・【Java サーブレット( Servlet )決定版】ゼロから環境構築~設計モデルまで、動画で楽々学ぶ この講座で学べる内容 ・初心者にとって意味不明なJava用語(J2SE、J2EE、J2SDK等々)を図解で理解していきます。 ・ゼロからJavaの開発環境を構築します。 ・Java開発ツールのEclipseをダウンロード&インストール、必要最低限の使い方がわかります。 ・Javaの基礎文法を学べます ・Tomcat(Webシステム)をダウンロード&インストール、動かし方がわかります。 ・JSPとサーブレットのプログラムを動かします。 ・TomcatからDB接続を行います。 ・アナタのPCに、DBつきのWebシステムを作り、サンプルプログラムを動かします。 ・DB接続のコネクションプールの設定方法と動かし方を学び、サンプルプログラムを動かします。 ・JSPとサーブレットの典型的な開発モデル、MVCモデルを学び、効率よい開発方法が身につきます。 一週間で身につくJava言語 おすすめ度:★★★ ・一週間で身につくJava言語 この講座で学べる内容 ・Java言語でのプログラミング能力 ・オブジェクト指向の考え方 ・AndroidアプリやWebアプリケーション開発に必要なプログラミングの基礎力 ・豊富な練習問題を通してのプログラミングスキル Java超初心者でも大丈夫!挫折させないJavaプログラミング講座~基礎固め編~ おすすめ度:★★★★ ・Java超初心者でも大丈夫!挫折させないJavaプログラミング講座~基礎固め編~ この講座で学べる内容 ・ゼロからJavaの基礎知識を納得感をもって学ぶことができます。 ・ご自身のPCにJava環境を作り、50〜100行程度のプログラムを自在に書けるようになります。 ・コンピューターの世界で何が起きるか明確なイメージを持ってコードを書けるようになります。 ・豊富な演習問題&詳細な解説を通して実践力を最短で迷いなく鍛えることができます。 動画でわかる Java入門講座 基本~オブジェクト編 おすすめ度:★★★★★ ・動画でわかる Java入門講座 基本~オブジェクト編 この講座で学べる内容 ・Javaの開発環境の構築。 ・変数、条件分岐、ループ処理、配列など、プログラミングの基本の習得。 ・Javaのオブジェクト指向についての徹底的な理解。 シリコンバレーエンジニア監修!GAFAデータ構造コーディング試験入門in Java & Python【やさしい図解説付】 おすすめ度:★★★ ・シリコンバレーエンジニア監修!GAFAデータ構造コーディング試験入門in Java & Python【やさしい図解説付】 この講座で学べる内容 ・データ構造(リスト・連結リスト・二分木・再起)関連のコーディングテストを練習し、GAFAなどの一流企業への就職の第一歩になります ・コンピューターサイエンスの最重要データ構造(リスト・連結リスト・二分木・再起)の知識をコーディングで応用できるようになります ・抽象的な問題から図解的に翻訳するプロセスを学び擬似コードを書けるようになります ・Javaを使ってコーディングテストの問題(データ構造のリスト・連結リスト・二分木・再起)を解けるようになります ・テストとデバッグをしコーディング面接の際のアピールができるようになります ・アルゴリズムをコーディングした後、ビッグオー表記(O記法)の計算量を解析できるようになります ・データ構造のコーディングテスト試験問題を見て、アルゴリズムの解答パターン認識ができるようになります ・競技プログラミング問題を解けるようになります JDBCの基礎はこれでバッチリ!挫折させないJavaプログラミング講座~DB活用編~ おすすめ度:★★★★ ・JDBCの基礎はこれでバッチリ!挫折させないJavaプログラミング講座~DB活用編~ この講座で学べる内容 ・Javaのソースコードからデータベースにアクセスする技術「JDBC」を使いこなせるようになります。 ・プログラムからデータベースにアクセスする際の勘所を掴めるようになります。 ・DAOパターンに基づくシステム設計の基礎を身に着けることができます。 ・演習問題&詳細な解説を通して実践力を鍛えることができます。 ・Javaプログラミングの応用力や設計に関する知見が広がります。
- 投稿日:2021-08-29T03:00:59+09:00
[WIP] Java テストコード
概要 Javaのテストコードの基本について纏めます。 テストコード考え方 取れない値はモックを用意 (例:API,DBなど) Boolを返すファンクションに対して何も値をセットしない場合falseを返す モックで値がなんでも良い場合any()を利用 targetsで実際のファンクションをコール
- 投稿日:2021-08-29T02:56:04+09:00
[WIP] IntelliJ IDEA 便利機能 for Mac
概要 IntelliJ IDEA 便利機能について纏めます。 ショートカットキー import - option + enter 複数行コメントアウト - コメントアウト該当行を選択 → Command + / ファイルに移動 shift + shift → 開いたウィンドウに移動したいファイルパスを入力 → Enter ファイルのフォーマット Command + option + l
- 投稿日:2021-08-29T02:11:38+09:00
[WIP] Java 基本まとめ
概要 Javaの基本について纏めます 基本 Entityとは ・DBに保存されているレコードをマッピングするオブジェクト 修飾子 static 宣言以降値の変更不可
- 投稿日:2021-08-29T00:57:44+09:00
STS(Spring Tool Suite)が、PC再起動 or シャットダウン後、PC起動した後使えなくなる
元某プログラミングスクール生の備忘録 どうもお久しぶりです!今回は か な り しんどかったことを投稿したいと思います(ほんと原因究明までしんどかったです。。。笑) それでは早速行ってみましょう! STS(Spring ToolSuite)が起動しなくなった!? そうなんです。再起動、もしくはシャットダウン後、PC起動時に使えなくなりました。。。 そのダイアログが 「アプリケーション”SpringToolSuite4”を開くためのアクセス権がありません。」 といったダイアログでした(写真を載せたかったんですが、ちょっと無理みたいです笑) Spring Boot学習中に起きたことで、勉強どころじゃなくなりまして。10時間ほど無駄にしました。 Spring系のコンテンツは、英語のものばっかりなので、同事象が起きた場合はぜひ参考にしてください。 (Springだけじゃなくても、PC内アプリが同じことが起こったらぜひ参考に。) 環境 Mac Book Pro ーシリコンのやつではないです。 SpringToolSuite4 ー64bit MacOS やってみたこと とりあえずもういろんなこと試してみました笑 ・アプリの権限変更(Linuxコマンドで) ・謎のコマンド(エラーに対する何らかの、後ほど参考サイト載せます。) ・コード署名作成コマンド とりあえずここら辺をずっとやってみました。 それでは流れ解説していきます。 ①まずはターミナルのコマンドでエラーログを確認 普通にアプリのアイコンダブルクリックでは、最初のダイアログだけで終わってしまいます。 なので、以下のコマンドをターミナルから打ち込んでやってみました。 open -a /Applications/SpringToolSuite4.app ちなみに-a 以降の 「/Applications...」は、 アプリをターミナルにドラッグ&ドロップすると、勝手に入れてくれますので、楽ちんです? そこで何やら変なエラーログがでたんですよね。それがこちら The application cannot be opened for an unexpected reason (中略) the file "ファイル名" couldn't be opened because there is no such file なるほど。とりあえず見つかんないんですねと。んでこのエラーログ StackOverFlowでも英語でしかほとんど乗ってないんですよ泣 それでまず行き着いてやってみたコマンドがこちら (chmod オプション(今回は-R) 権限内容 ファイルのパス) ターミナルで打ったlinuxコマンド chmod -R 744 /Applications/SpringToolSuite4.app ⬆︎ ファイルやフォルダのアクセス権限変更コマンド。いわゆる、そのファイルやフォルダを使用する人への、使用許可の範囲を設定する 1番目の7:自分自身へのアクセス権限(ファイル・フォルダの読み取り、書き込み、実行を可能にする) 2番目の4:自分自身へのアクセス権限(ファイル・フォルダの読み取りのみ) 3番目の4:自分自身へのアクセス権限(ファイル・フォルダの読み取りのみ) ーRは「再帰的(そのフォルダは以下のファイル・フォルダも全て権限変更ってこと)」 参考サイト(StackOverFlow)がこちら ②エラーログが変化した! お!なんかエラーログが変化した。しかも別のサイトに書いてあったやつだ。やってみよう。 新しいエラーログ "kLSNoLaunchPermissionErr: User doesn't have permission to launch the app (managed networks)" 実行コマンドはこちら 実行コマンド xattr -rd com.apple.quarantine /Applications/SpringToolSuite4.app 参考サイトはこちら ちなみに、こちらのコマンドはあまり理解できていないです。。。 ③続いて、②のサイトにあるコマンドを実行してみる 次はこちらのコマンドを実行しました。 codesign --force --deep --sign - /Applications/SpringToolSuite4.app 参考サイトは②と同じなので今回は割愛。 このコマンドの意味は、「コード署名」を登録するもの。 んん?よくわからん。笑 とりあえずこのコマンドを入力したら 入力待ち になったので、適当にわかりやすい覚えやすい文字列を打ち込みました。 ついに起動!!! おぉ!涙出そうでした。 んで、試しに①のコマンドでユーザー(自分自身)の権限を変えてみたんです。(一番目の数字のところ) ターミナルで打ったlinuxコマンド chmod -R 644 /Applications/SpringToolSuite4.app まぁいわゆる、7⇨6に変更すると、実行権限がなくなるんですよね(読み取り、書き込み権限のみ)。 すると、アプリが起動しなくなりました。ちゃんと関わってましたね。泣 コード署名について 以下のサイトか参考になります。 https://qiita.com/Arime/items/e1df2a8c3d4c2ce75069 https://qiita.com/muijp/items/88567365dde2a3b3cc92 なぜコード署名が必要かと言うと コード署名は、iOSが信頼できるアプリしかインストールしないようにするための仕組みです。ここで信頼できるアプリとは何かというと ー開発者を特定できる ー開発者が署名してからアプリが改変されていない みたいで、 STS(SpringToolSuite)はオープンソースで無償で使えるのは良いんですが、 どうやら配布時に開発者のコード署名がなく、 インストール時は一時的に使えるものの、 私みたいに再起動やシャットダウン後の起動など、何らかがトリガーとなって使えなくなるみたいです。 オープンソースも便利ですが、こう言う沼にハマることもあるんですね。。。。 終わりに Spring系統は解説やデバッグなど、何かしらの問題解決は日本語訳が少ないので、 ぜひ参考にしてください。 あくまで参考なので、絶対に直ると言う保証はないです笑 私は直りました。。。 以上!ありがとうございました!! 補足:権限変更コマンドの、数字の変え方について 7だったり6だったりに変えましたね!あれを少しわかりやすく下記に載せておきます。 1番左 :ユーザー(自分自身)の権限 真ん中:ユーザーが所属するグループの権限 一番右:その他のユーザー(自分以外)の権限 ※こちらは基本的に「読み取りのみ」が多いです。 【数字の違い】 4:読み取り権限付与 2:書き込み権限付与 1:実行権限付与 つまり、これらをうまく足し算して、それぞれに権限付与してるんですよね〜 例えば、自分自身の権限変更の際に、「読み取り・書き込み」の権限付与をする場合は 4 + 2 = 6 になります!それを3桁分やるだけです。
- 投稿日:2021-08-29T00:57:44+09:00
【STS(SpringToolSuite)初学者必見】STS(Spring Tool Suite)が、PC再起動 or シャットダウン後、PC起動した後使えなくなる
某プログラミングスクール卒業生の備忘録 どうもお久しぶりです!今回は か な り しんどかったことを投稿したいと思います(ほんと原因究明までしんどかったです。。。笑) それでは早速行ってみましょう! STS(Spring ToolSuite)が起動しなくなった!? そうなんです。再起動、もしくはシャットダウン後、PC起動時に使えなくなりました。。。 そのダイアログが 「アプリケーション”SpringToolSuite4”を開くためのアクセス権がありません。」 といったダイアログでした(写真を載せたかったんですが、ちょっと無理みたいです笑) Spring Boot学習中に起きたことで、勉強どころじゃなくなりまして。10時間ほど無駄にしました。 Spring系のコンテンツは、英語のものばっかりなので、同事象が起きた場合はぜひ参考にしてください。 (Springだけじゃなくても、PC内アプリが同じことが起こったらぜひ参考に。) 環境 Mac Book Pro ーシリコンのやつではないです。 SpringToolSuite4 ー64bit MacOS やってみたこと とりあえずもういろんなこと試してみました笑 ・アプリの権限変更(Linuxコマンドで) ・謎のコマンド(エラーに対する何らかの、後ほど参考サイト載せます。) ・コード署名作成コマンド とりあえずここら辺をずっとやってみました。 それでは流れ解説していきます。 ①まずはターミナルのコマンドでエラーログを確認 普通にアプリのアイコンダブルクリックでは、最初のダイアログだけで終わってしまいます。 なので、以下のコマンドをターミナルから打ち込んでやってみました。 open -a /Applications/SpringToolSuite4.app ちなみに-a 以降の 「/Applications...」は、 アプリをターミナルにドラッグ&ドロップすると、勝手に入れてくれますので、楽ちんです? そこで何やら変なエラーログがでたんですよね。それがこちら The application cannot be opened for an unexpected reason (中略) the file "ファイル名" couldn't be opened because there is no such file なるほど。とりあえず見つかんないんですねと。んでこのエラーログ StackOverFlowでも英語でしかほとんど乗ってないんですよ泣 それでまず行き着いてやってみたコマンドがこちら (chmod オプション(今回は-R) 権限内容 ファイルのパス) ターミナルで打ったlinuxコマンド chmod -R 744 /Applications/SpringToolSuite4.app ⬆︎ ファイルやフォルダのアクセス権限変更コマンド。いわゆる、そのファイルやフォルダを使用する人への、使用許可の範囲を設定する 1番目の7:自分自身へのアクセス権限(ファイル・フォルダの読み取り、書き込み、実行を可能にする) 2番目の4:自分が所属するグループのアクセス権限(ファイル・フォルダの読み取りのみ) 3番目の4:他人へのアクセス権限(ファイル・フォルダの読み取りのみ) ーRは「再帰的(そのフォルダは以下のファイル・フォルダも全て権限変更ってこと)」 参考サイト(StackOverFlow)がこちら ②エラーログが変化した! お!なんかエラーログが変化した。しかも別のサイトに書いてあったやつだ。やってみよう。 新しいエラーログ "kLSNoLaunchPermissionErr: User doesn't have permission to launch the app (managed networks)" 実行コマンドはこちら 実行コマンド xattr -rd com.apple.quarantine /Applications/SpringToolSuite4.app 参考サイトはこちら ちなみに、こちらのコマンドはあまり理解できていないです。。。 ③続いて、②のサイトにあるコマンドを実行してみる 次はこちらのコマンドを実行しました。 codesign --force --deep --sign - /Applications/SpringToolSuite4.app 参考サイトは②と同じなので今回は割愛。 このコマンドの意味は、「コード署名」を登録するもの。 んん?よくわからん。笑 とりあえずこのコマンドを入力したら 入力待ち になったので、適当にわかりやすい覚えやすい文字列を打ち込みました。 ついに起動!!! おぉ!涙出そうでした。 んで、試しに①のコマンドでユーザー(自分自身)の権限を変えてみたんです。(一番目の数字のところ) ターミナルで打ったlinuxコマンド chmod -R 644 /Applications/SpringToolSuite4.app まぁいわゆる、7⇨6に変更すると、実行権限がなくなるんですよね(読み取り、書き込み権限のみ)。 すると、アプリが起動しなくなりました。ちゃんと関わってましたね。泣 コード署名について 以下のサイトか参考になります。 https://qiita.com/Arime/items/e1df2a8c3d4c2ce75069 https://qiita.com/muijp/items/88567365dde2a3b3cc92 なぜコード署名が必要かと言うと コード署名は、iOSが信頼できるアプリしかインストールしないようにするための仕組みです。ここで信頼できるアプリとは何かというと ー開発者を特定できる ー開発者が署名してからアプリが改変されていない みたいで、 STS(SpringToolSuite)はオープンソースで無償で使えるのは良いんですが、 どうやら配布時に開発者のコード署名がなく、 インストール時は一時的に使えるものの、 私みたいに再起動やシャットダウン後の起動など、何らかがトリガーとなって使えなくなるみたいです。 オープンソースも便利ですが、こう言う沼にハマることもあるんですね。。。。 終わりに Spring系統は解説やデバッグなど、何かしらの問題解決は日本語訳が少ないので、 ぜひ参考にしてください。 あくまで参考なので、絶対に直ると言う保証はないです笑 私は直りました。。。 以上!ありがとうございました!! 補足:権限変更コマンドの、数字の変え方について 7だったり6だったりに変えましたね!あれを少しわかりやすく下記に載せておきます。 1番左 :ユーザー(自分自身)の権限 真ん中:ユーザーが所属するグループの権限 一番右:その他のユーザー(自分以外)の権限 ※こちらは基本的に「読み取りのみ」が多いです。 【数字の違い】 4:読み取り権限付与 2:書き込み権限付与 1:実行権限付与 つまり、これらをうまく足し算して、それぞれに権限付与してるんですよね〜 例えば、自分自身の権限変更の際に、「読み取り・書き込み」の権限付与をする場合は 4 + 2 = 6 になります!それを3桁分やるだけです。