- 投稿日:2021-01-01T23:21:35+09:00
【Java】フォルダ内のファイルパスをListで取得
引数のフォルダ内にあるファイルの一覧をStringのListにしてみるメソッド。
※再帰的に呼び出してListにaddAllしてみた
※Java8~15で動作検証済み(不具合あっても責任は取らない方向でFileUtilsimport java.io.File; import java.util.LinkedList; import java.util.List; public class FileUtils { /** * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す * * @param root * @return */ public static List<String> getFileList(String root) { return getFileList(new File(root)); } /** * * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す * * @param root * @return */ public static List<String> getFileList(File root) { return getFileList(root, null); } /** * * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す * * @param root * @param fileList * @return */ private static List<String> getFileList(File root, List<String> fileList) { // 引数のフォルダが存在しない場合はnullを返す if (root == null || !root.exists()) return null; if (fileList == null) fileList = new LinkedList<>(); if (root.isDirectory()) for (File f : root.listFiles()) fileList.addAll(getFileList(f, null)); else fileList.add(root.getPath()); return fileList; } }
- 投稿日:2021-01-01T19:51:44+09:00
Spring Boot + Java でfileとStringデータを同時にform送信して処理する
File型とString型を一度にForm送信するやり方がわかったので備忘録として残しておきます。
実現したいことのイメージ
こんな感じのフォームがあり、送信ボタンをクリックすると更新した情報にページが更新されてアラートが表示される
<form th:action="@{/portfolio/user/modify}" method="post" enctype="multipart/form-data"> <table class="table table-hover table-bordered table-responsive-md text-center" th:object="${user}"> <tr> <th scope="row" class="img-column">Profile Picture</th> <td style="position: relative;"> <img th:src="${'data:image/png;base64,'+image}" th:class="${user.getUserImg().length == 0 ? 'hidden' : 'mypage-img'}"> <img src="/img/avator.png" alt="" th:class="${user.getUserImg().length == 0 ? 'mypage-img' : 'hidden'}"> <label id="file-btn" for="userImg" class="bg-primary text-white">Choose your photo</label> <input type="file" name="file" id="userImg" style="display: none;"> <p id="selected-status" class="mt-1">[Not yet selcted]</p> </td> </tr> <!-- Stringの<input>は省略 --> <button id="cancel-btn" class="btn btn-warning hidden" type="button">Cancel</button> <button id="submit-btn" class="btn btn-primary hidden" type="submit">Submit</button> </div> </form>// @Controller @PostMapping(value = "/modify", consumes = { "multipart/form-data" }) // ポイント1: 「consumes = { "multipart/form-data" }」を追記 public String modify(UserForm userForm, @RequestPart("file") MultipartFile file, Model m) { // ポイント2: 「@RequestPart」を追記 ※@RequestParamじゃない userService.update(userForm, file, loginSession.getUserId()); User user = userService.findByUserId(loginSession.getUserId()); userService.setLoginSession(user); m.addAttribute("user", user); Boolean completeMsg = true; m.addAttribute("completeMsg", completeMsg); return "mypage"; }// @Service public User findByUserNameAndPassword(String userName, String password) { return userRepos.findByUserNameAndPassword(userName, password); } // userテーブルに上書きする public int update(UserForm userForm, MultipartFile file, Integer userId) { String userName = userForm.getUserName(); String familyName = userForm.getFamilyName(); String firstName = userForm.getFirstName(); String email = userForm.getEmail(); String password = userForm.getPassword(); String imgPath = "/img/user/" + file.getOriginalFilename(); return userRepos.update(userName, familyName, firstName, email, password, imgPath, userId); }/*修正完了ダイアログの初期化*/ var dialog = bootbox.dialog({ message: '<p class="text-center mb-0">Your profile picture has changed</p>', backdrop: true, centerVertical: true, show: false }); /*ユーザ情報更新後のアラート表示*/ const completeMsg = /*[[${completeMsg}]]*/ ''; // ポイント3: ユーザ情報更新処理の際にBooleanのインスタンスを作成してみるに渡しておいたものを利用してアラートを表示させる console.log("completeMsg : " + completeMsg); if (completeMsg) { dialog.modal('show'); }
- 投稿日:2021-01-01T18:56:29+09:00
【Java】for文についてまとめ
はじめに
現在Java Silver受験に向けて勉強中です。
勉強の中で、for文について間違えて覚えていたり混乱することが多かったので、自分の言葉で基本からまとめていこうと思います。基本
for (初期化文; 条件文; 更新文) {
/// 繰り返し処理
}for(int i = 0; i < 10; i++) { System.out.println(i); }①初期化文
②条件文
③繰り返し処理
④更新文
⑤終了
※②~④を繰り返す拡張for文
for (型 変数名 : 集合) {
/// 繰り返し処理
}
※ ;(セミコロン)ではなく:(コロン)であることに注意int[] array = {1, 2, 3} for(int num : array) { System.out.println(num); }集合の中身を最初から最後まで一つずつ取り出すイメージ。
繰り返し処理の中断
break
例:
for (初期化文; 条件文; 更新文) {
if (条件文) {
break
}
/// 繰り返し処理
}for(int i = 0; i < 10; i++) { if (i = 5) { break; } System.out.println(i); }breakした時点で繰り返し処理を抜ける(終了する)。
この場合はi=5以降のSystem.out.println(i);が実行されない。continue
例:
for (初期化文; 条件文; 更新文) {
if (条件文) {
continue
}
/// 繰り返し処理
}for(int i = 0; i < 10; i++) { if (i = 5) { break; } System.out.println(i); }continueした一回分の繰り返し処理をスキップする。
この場合はi=5の時のSystem.out.println(i);のみ実行されず、それ以外はすべて実行される。まとめ
for文の中で特に業務でよく使うものをまとめました。
個人的に、学生時代C言語の初歩の初歩を勉強していたのもあり、拡張for文の感覚が掴みづらい部分がありましたのでしっかりと把握しておこうと思います。参考資料:志賀 澄人『徹底攻略Java SE 8 Silver問題集[1Z0-808]対応 徹底攻略シリーズ』,株式会社ソキウス・ジャパン,2016
- 投稿日:2021-01-01T16:40:57+09:00
【Java】Optionalの使い方
プログラミング勉強日記
2020年1月1日
JavaのOptionalの使い方について簡単にまとめる。Optionalとは
メソッドの戻り値としてnullを返す可能性があることを明示的に示したいときに使う。メソッドがnullを返す可能性があるということを示すことで、より安全に実装することができる。
Optionalの書き方
Optionalクラスを使うにはjava.util.Optionalをインポートする必要がある。一般的にはオブジェクトを定義して利用する。Optionalのオブジェクトはダイヤモンド演算子('<>')ないのType Parameterにnullの可能性があるオブジェクトの型を指定して宣言する。
ofNullableメソッドの引数にはnullの可能性があるオブジェクト名を指定する。基本的な書き方Optional<T> オブジェクト名 = Optional.ofNullable(nullの可能性があるオブジェクト名);サンプルコードString str = null; Optional<String> value = Optional.ofNullable(str);orの使い方
orメソッドは、Optional.ofNullableメソッドの引数に指定したオブジェクトがnullの場合にのみ処理を実行する。
サンプルコードimport java.util.Optional; public class Sample { public static void main(String[] args) { String str = null; Optional<String> value = Optional.ofNullable(str); System.out.println(value.or(() -> Optional.of("nullです")).get()); } }実行結果nullですorEsleの使い方
Optional.ofNullableメソッドの引数がnullの場合にorElseメソッドの引数に値を返す。nullでない場合はnullでないその値を返す。
サンプルコードimport java.util.Optional; public class Sample { public static void main(String[] args) { String str = null; Optional<String> value = Optional.ofNullable(str); str = value.orElse("nullです"); System.out.println(str); } }実行結果nullです参考文献
JavaでOptionalクラスを使う方法【初心者向け】
JavaのOptionaとは?使い方をパターン別にわかりやすく解説
- 投稿日:2021-01-01T16:40:57+09:00
【Java】Optionalの使い方①
プログラミング勉強日記
2020年1月1日
JavaのOptionalの使い方について簡単にまとめる。Optionalとは
メソッドの戻り値としてnullを返す可能性があることを明示的に示したいときに使う。メソッドがnullを返す可能性があるということを示すことで、より安全に実装することができる。
Optionalの書き方
Optionalクラスを使うにはjava.util.Optionalをインポートする必要がある。一般的にはオブジェクトを定義して利用する。Optionalのオブジェクトはダイヤモンド演算子('<>')ないのType Parameterにnullの可能性があるオブジェクトの型を指定して宣言する。
ofNullableメソッドの引数にはnullの可能性があるオブジェクト名を指定する。基本的な書き方Optional<T> オブジェクト名 = Optional.ofNullable(nullの可能性があるオブジェクト名);サンプルコードString str = null; Optional<String> value = Optional.ofNullable(str);orメソッドの使い方
orメソッドは、Optional.ofNullableメソッドの引数に指定したオブジェクトがnullの場合にのみ処理を実行する。
サンプルコードimport java.util.Optional; public class Sample { public static void main(String[] args) { String str = null; Optional<String> value = Optional.ofNullable(str); System.out.println(value.or(() -> Optional.of("nullです")).get()); } }実行結果nullですorEsleメソッドの使い方
Optional.ofNullableメソッドの引数がnullの場合にorElseメソッドの引数に値を返す。nullでない場合はnullでないその値を返す。
サンプルコードimport java.util.Optional; public class Sample { public static void main(String[] args) { String str = null; Optional<String> value = Optional.ofNullable(str); str = value.orElse("nullです"); System.out.println(str); } }実行結果nullです参考文献
JavaでOptionalクラスを使う方法【初心者向け】
JavaのOptionaとは?使い方をパターン別にわかりやすく解説
- 投稿日:2021-01-01T16:31:02+09:00
(Java、JavaScript、Python)文字列処理の比較
Java、JavaScript、Pythonの処理比較
最近JavaScriptとPythonの勉強を始めました。
学んだことの整理として、Java、JavaScript、Pythonの3言語の処理比較を記事にしていこうと思います。
今回は文字列処理です。文字列処理の比較一覧
処理内容 Java JavaScript Python 文字列長 length() length len(文字列) 一致比較 equals(比較文字)
equalsIgnoreCase(比較文字)==比較演算子
===比較演算子==比較演算子 検索 indexOf(検索文字列)
lastIndexOf(検索文字列)
contains(検索文字列)
startsWith(検索文字列)
endsWith(検索文字列)
indexOf(検索文字列)
lastIndexOf(検索文字列)
includes(検索文字列)
startsWith(検索文字列)
endsWith(検索文字列)find(検索文字列)
rfind(検索文字列)
in式
not in式
startswith(検索文字列)
endswith(検索文字列)単純結合 +演算子
concat(結合文字列)
StringBuilder.append(結合文字列)+演算子
concat(結合文字列,...)+演算子 空白除去 trim()
strip()trim()
trimLeft()
trimRight()strip(削除対象文字)
lstrip(削除対象文字)
rstrip(削除対象文字)大文字小文字変換 toUpperCase()
toLowerCase()toUpperCase()
toLowerCase()upper()
lower()
capitalize()
title()
swapcase()
切り出し substring(開始index,終了index)
charAt(index)substring(開始index,終了index)
charAt(index)
slice(開始index,終了index)
substr(開始index,文字数)
文字列[開始index:終了index] 繰り返し repeat(繰返し数) repeat(繰返し数) *演算子 置換 replace(前文字,後文字)
replaceFirst(前文字,後文字)
replaceAll(前文字,後文字)
replace(前文字,後文字)
replaceAll(前文字,後文字)replace(前文字,後文字)
re.sub(前文字,後文字,文字列)
re.subn(前文字,後文字,文字列)
translate(式)区切りで結合 String.join(区切り文字,結合文字列...) 結合文字配列.join(区切り文字) 区切り文字.join(結合文字配列) 区切りで分割 split(区切り文字)
split(区切り文字) split(区切り文字)
rsplit(区切り文字)
splitlines()
re.split(区切り文字)任意成型 String.format(成型式,文字列...) テンプレートリテラル→
`xxx${変数名}xxx`成型式.format(変数や式...)
f'xxx{変数や式}xxx'
形成式 % (変数や式,...)追記
- 一致比較
- JavaのequalsIgnoreCase()は大文字小文字を無視した一致比較を行います。
- ===演算子は型を含めた厳密な比較を行います。'123'===123 →false
- 検索
- 一致箇所の文字indexを返す:indexOf()、lastIndexOf()、find()、rfind()
- true/falseを返す:contains()、includes()、in式、not in式
- 先頭文字の一致判定、true/falseを返す:startsWith()
- 末尾文字の一致判定、true/falseを返す:endsWith()
- 空白除去
- いずれの言語も半角空白、タブ、改行が除去対象になります。
- Javaのstrip()は上記に加え、全角空白も除去対象になります。
- Pythonの関数は引数に削除対象文字指定可、省略時は空白・タブ・改行が除去対象になります。
- 大文字小文字変換
- Pythonは他の2つよりも細かい変換関数が存在します。capitalize()→最初の文字を大文字に他は小文字に変換、title()→単語最初の文字を大文字に他は小文字に変換、swapcase()→大文字小文字を入れ替え
- 切り出し
- substring()は終了indexを省略可能で、その場合は文字列の末尾を終了indexとします。
- JavaScriptの切り出しsubstring()とslice()は通常の使用範囲では差異はありませんが、引数がイレギュラーな場合に結果が異なります。
- 開始index>終了indexの場合、substring()は自動で開始終了を入替え、slice()は空文字を返します。
- 負数指定の場合、substring()は引数を0として扱い、slice()は「文字列長-引数」として扱います。
- Pythonは関数ではなく「文字列[start:end]」という書式のスライスを使用します。start,endいずれか省略可能、「:」省略時はcharAt()のように1文字を取得します。
- 置換
- Java:replace()はマッチした全文字置換、replaceFirst()マッチした最初の文字置換。
- JavaScript:replace()はマッチした最初の文字置換、replaceAll()はマッチした全文字置換、ただしreplace()も正規表現オプション「g」で全文字置換可能。
- Python:replace()は第3引数にsplit()のように最大置換数指定可。
- Python:translate()は複数ケースの置換が可能。ただし置換元文字は1文字であること。置換の組み合わせを「str.maketrans()」で指定します。「"abCdefghIk".translate(str.maketrans({'C':'c', 'I':'ij'}))」
- 正規表現が使用できるのは各言語で以下の通りです。
- Java:replaceFirst()、replaceAll()
- JavaScript:replace()、replaceAll()
- Python:re.sub()、re.subn()、subnは置換処理された文字列+変換した個数のリスト(正確にはタプル)を返します。
- 区切りで分割
- split()はどの言語でも第2引数に最大分割数が指定可能です。
- Java、JavaScriptのsplit()は正規表現使用可能です。JavaScriptにおいては空白区切りは正規表現で「/\s/」と指定します。
- Pythonはreモジュールのre.split()が正規表現使用可能です。
- Pythonのsplit()は引数省略可能で、省略時は空白・タブ・改行が分割対象となります。
- Pythonのrsplit()は第2引数に最大分割数指定したとき右からカウントするのがsplit()との差異になります。
- Pythonのsplitlines()は改行で分割します。OS依存の改行にも対応しています。
- 任意成型
- Pythonはいくつかの書式があります。format()は下記サンプル参照。
- 1つは%演算子:sei='山田' mei='太朗'のとき、print('名前:%s %s' % (sei,mei))
- 1つはf文字列:print(f'名前:{sei} {mei}')
サンプル
Java
public class StringSample { public static void main(String[] args) { StringSample obj = new StringSample(); obj.executeSample(); } public void executeSample() { String str = " 山田,太朗,Yamada,Taro,M,19950827,25才,東京都千代田区神田佐久間町2-XX-XX〇〇荘 "; // 空白除去 String strKuhaku1 = str.trim(); // 区切りで分割 String[] strBun1 = strKuhaku1.split(","); // 単純結合 String resName = new StringBuilder().append(strBun1[0]).append(strBun1[1]).toString(); // 大文字小文字変換 String strOoko1 = strBun1[2].toUpperCase(); String strOoko2 = strBun1[3].toUpperCase(); // 単純結合 String resAlpha = strOoko1.concat(" ").concat(strOoko2); // 一致比較 String resSex; if (strBun1[4].equals("M")) { resSex = "男性"; } else { resSex = "女性"; } // 切り出し String strKiri1 = strBun1[5].substring(0, 4); String strKiri2 = strBun1[5].substring(4, 6); String strKiri3 = strBun1[5].substring(6); // 区切りで結合 String resBirth = String.join("/", strKiri1, strKiri2, strKiri3); // 置換 String resAge = strBun1[6].replace("才", "歳"); // 文字列長 String resAddress = strBun1[7]; if (16 < strBun1[7].length()) { resAddress = strBun1[7].substring(0, 16); // 単純結合 resAddress = resAddress + "(略)"; } // 検索 String resMessage1 = ""; String resMessage2 = ""; if (strBun1[7].startsWith("東京都")) { resMessage1 = "首都です。"; } if (strBun1[7].contains("千代田区")) { resMessage2 = "東京駅があります。"; } // 任意成型 String res1 = String.format("%s(%s)様 %s %s生(%s)", resName, resAlpha, resSex, resBirth, resAge); String res2 = String.format("%s %s%s", resAddress, resMessage1, resMessage2); // 繰り返し String line = "-".repeat(64); System.out.println(line); System.out.println(res1); System.out.println(res2); System.out.println(line); } }JavaScript
<html> <head> <script> function executeSample() { let str = " 山田,太朗,Yamada,Taro,M,19950827,25才,東京都千代田区神田佐久間町2-XX-XX〇〇荘 "; // 空白除去 let strKuhaku1 = str.trim(); // 区切りで分割 let strBun1 = strKuhaku1.split(","); // 単純結合 let resName = strBun1[0] + strBun1[1]; // 大文字小文字変換 let strOoko1 = strBun1[2].toUpperCase(); let strOoko2 = strBun1[3].toUpperCase(); // 単純結合 let resAlpha = strOoko1.concat(" ", strOoko2); // 一致比較 let resSex; if (strBun1[4] == "M") { resSex = "男性"; } else { resSex = "女性"; } // 切り出し let strKiri1 = strBun1[5].substring(0, 4); let strKiri2 = strBun1[5].substring(4, 6); let strKiri3 = strBun1[5].substring(6); // 区切りで結合 let resBirth = [strKiri1, strKiri2, strKiri3].join("/"); // 置換 let resAge = strBun1[6].replace("才", "歳"); // 文字列長 let resAddress = strBun1[7]; if (16 < strBun1[7].length) { resAddress = strBun1[7].substring(0, 16); // 単純結合 resAddress = resAddress + "(略)"; } // 検索 let resMessage1 = ""; let resMessage2 = ""; if (strBun1[7].startsWith("東京都")) { resMessage1 = "首都です。"; } if (strBun1[7].includes("千代田区")) { resMessage2 = "東京駅があります。"; } // 任意成型 let res1 = `${resName}(${resAlpha})様 ${resSex} ${resBirth}生(${resAge})`; let res2 = `${resAddress} ${resMessage1}${resMessage2}`; // 繰り返し let line = "-".repeat(64); console.log(line); console.log(res1); console.log(res2); console.log(line); } </script> </head> <body onload="executeSample()"> <h1>Qiita記事</h1> <h2>文字列処理</h2> </body> </html>Python
str1 = " 山田,太朗,Yamada,Taro,M,19950827,25才,東京都千代田区神田佐久間町2-XX-XX〇〇荘 " # 空白除去 strKuhaku1 = str1.strip() # 区切りで分割 strBun1 = strKuhaku1.split(",") # 単純結合 resName = strBun1[0] + strBun1[1] # 大文字小文字変換 strOoko1 = strBun1[2].upper() strOoko2 = strBun1[3].upper() # 単純結合 resAlpha = strOoko1 + " " + strOoko2 # 一致比較 resSex = "" if strBun1[4] == "M": resSex = "男性" else: resSex = "女性" # 切り出し strKiri1 = strBun1[5][0:4] strKiri2 = strBun1[5][4:6] strKiri3 = strBun1[5][6:] # 区切りで結合 resBirth = "/".join([strKiri1, strKiri2, strKiri3]) # 置換 resAge = strBun1[6].replace("才", "歳") # 文字列長 resAddress = strBun1[7] if 16 < len(strBun1[7]): resAddress = strBun1[7][:16] # 単純結合 + resAddress = resAddress + "(略)" # 検索 resMessage1 = "" resMessage2 = "" if strBun1[7].startswith("東京都"): resMessage1 = "首都です。" if "千代田区" in strBun1[7]: resMessage2 = "東京駅があります。" # 任意成型 res1 = "{}({})様 {} {}生({})".format(resName, resAlpha, resSex, resBirth, resAge) res2 = "{} {}{}".format(resAddress, resMessage1, resMessage2) # 繰り返し * line = "-" * 64 print(line) print(res1) print(res2) print(line)出力結果
---------------------------------------------------------------- 山田太朗(YAMADA TARO)様 男性 1995/08/27生(25歳) 東京都千代田区神田佐久間町2-X(略) 首都です。東京駅があります。 ----------------------------------------------------------------
- 投稿日:2021-01-01T15:54:47+09:00
SpringBootで作成したWebアプリをEC2にデプロイするときに躓いた話
はじめに
自分用のメモです。
開発環境
・Windows10
・OpenJDK 1.8
・SpringBoot 2.2.4
・Gradle 6.3
・MySQL5.7
・AWS(EC2・RDS・VPC)作業の流れ
1.デプロイ用のSpringBootアプリを用意
2.EC2・RDS・VPCを準備する
3.Amazon Linux2で必要ツールをインストール
4.Buildしてデプロイ1.デプロイ用のSpringBootアプリを用意する
こちらは何でも構わないので自身で作成しているアプリで可
2.AWS(EC2・RDS・VPC)の用意
ここは後日投稿する予定です
3.Amazon Linux2で必要ツールをインストール
EC2にログインしyumを最新にします
# yum updateGitのバージョンを確認とインストール
# yum search git # yum install gitGitがインストール終わったら一応確認
# git --versionJava8をインストール
# yum install -y java-1.8.0-openjdk-develTomcatをインストールし配置しなおす
詳しくはこちらgitをクローンする
# git clone https://github.com/sample.gitクローンしたディレクトリに移動しgradlewの権限を広める
# chmod 755 gradlewこのままビルドしたいがapplication.propertiesに移動し設定変更
application.propertiesは環境に依存する関係# cd src/main/resources # vim application.propertiesMySQLのURLがlocalhostになっていると思うのでここを変更
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://「localhost」←ここ!:3306/sample?serverTimezone=JST spring.datasource.username=root spring.datasource.password=password spring.datasource.initialization-mode=alwayslocalhostの部分をRDSのエンドポイントに変更
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://~~~~~~~~~~:3306/sample?serverTimezone=JST spring.datasource.username=root spring.datasource.password=password spring.datasource.initialization-mode=alwaysこれでRDSに接続していけるように変更しました。
ここからbuildしていきます!!# ./gradlew buildビルド終了次第buildのlibs配下に移動
ビルドしたアプリケーションがあると思うので権限を緩めるのと
持ち主とグループをtomcatに変更# chmod 755 sample.war # chown tomcat:tomcat sample.warそしてwebapps配下に移動させTomcatを起動させる
# mv sample.war /opt/apache-tomcat/webapps # systemctl start tomcat.serviceEC2の設定したURLに接続してあげると・・・
以上です
- 投稿日:2021-01-01T15:50:49+09:00
JavaでLibreOffice Calcのfodsファイルを読み書きするサンプル 2021
https://github.com/sonota88/libreoffice-java-sample/tree/20210101
以前書いたこれ↓のアップデート版。細かい修正と「2021年初でも動きましたよ」という動作確認の報告です。
JavaでLibreOffice Calcのfodsファイルを読み書きするサンプル 2019
ちなみに上記は 2019年末の記事なのでだいたい1年ぶりのアップデートになります。
変更内容
- 使用範囲内での行インデックス・列インデックスの最大値を取得するサンプルコードを追加
- mvnw を使うように変更
- JUnit のバージョンアップ: 4.x => 5.7.0
環境
Ubuntu Linux 18.04 LibreOffice 6.0.7.3 OpenJDK 1.8.0_275参考
- Java LibreOffice Programming (Calc)
- インデックスの最大値を取得する部分を参考にしました