- 1. はじめに
- 2. Builderパターン
- 2.0.1. CodeSignal – firstNotRepeatingCharacterにチャレンジ
- 2.0.2. 【Java】新卒が初めてのコードレビューで受けた指摘5選
- 2.0.3. Javaで経過日数を計算したい
- 2.0.4. 文字列の出現回数を数えたい
- 2.0.5. 【俺的】COBOL→Java言語移行ガイド(導入)
- 2.0.6. @JvmStaticと@JvmFieldをobject(またはcompanion object)のフィールドに付与した場合の違いについて
- 2.0.7. NLP4J – 構文解析した結果からキーワードを抽出する
- 2.0.8. Java開発の技術用語
- 2.0.9. Java独習(第6章)
- 2.0.10. Java再入門 第2回 モジュールシステムとクラスパス、Gradle
- 2.0.11. Gradleでjavaをビルドする際、ユニットテストをスキップする方法
- 2.0.12. Redisを使って排他制御を行う(タイムアウト考慮版)
- 2.0.13. CodeSignal – firstDuplicateにチャレンジ
- 2.0.14. 自分用Webコンテンツコピペ
- 2.0.15. Win10命令行快速安装JDK环境
- 2.0.16. SpringBootにおけるレイアウト
- 2.0.17. Javaの外部ライブラリーが動かない!
- 2.0.18. Java独習(第5章前半)
TomcatとJerseyでトランザクション管理してみる
# はじめに
Tomcat + Jersey という構成の Web アプリケーションの動作を理解するために、[Tomcat Embed](https://mvnrepository.com/artifact/org.apache.tomcat.embed) を使って実験をしていきます。
いまどきこんな構成で開発を始めることは少ないかと思いますが、レガシーソフトウェアと戦う人たちの助けになれば幸いです。## 関連記事の一覧(予定)
– [埋め込みTomcatでJerseyを動かしてみる](https://qiita.com/atti/items/fa3843f75c4bd669059a)
– [HK2でDIしてみる](https://qiita.com/atti/items/3f6f43c5168323344427)
– [BeanValidationで入力値検証してみる](https://qiita.com/atti/items/2267a4b52b033dfabcca)
– TomcatとJerseyでトランザクション管理してみる ← イマココ## リポジトリ
http
デザインパターン勉強会⑦Builder
はじめに
ZOOM勉強会の議事録です。
第7回はBuilderパターンです。Builderパターン
オブジェクトの生成における呼び出すメソッドの順序と具体的な生成メソッドの分離をします。
分離することにより、オブジェクト生成の順序を使い回すことができます。
特に、コンストラクタの引数が多いときに有効です。ビルダーパターンの役割は以下です。
- Builder
一つのBuilderに依存しないようにするインタフェース、建築材料を持っている
- ConcreteBuilder
インスタンス生成時に使用するメソッドの具体的な実装
- Director
設計図のようにインスタンス生成時の順序を知っている、材料を組み上げる役割
- Client
ビルダーパターンを利用してオブジェクトを生成するコード
今回はRefactoring.GuruのJ
CodeSignal – firstNotRepeatingCharacterにチャレンジ
コーディングしなさすぎてコーディングを忘れたエンジニアがコーディングを思い出すためにコーティングします。
今回は、アメリカのコーデイング練習サイトCodeSignalの問題「firstNotRepeatingCharacter」を解いていきます。
サイトによると、この問題はAmazonの面接で出されたことがあるようです。##問題
“abacabaed”のような文字列sが渡されるので、最初に出てくる重複していない文字を探します。
上の例だと、重複していないし最初に出てくるのでcが答えです。もし重複している文字がない場合は、’_’を返します。
##考え方・解説
最初は単純に、文字を一つずつループして、もう一つループを回して他の文字と比較し、重複がない文字を探す方法が浮かびました。
しかしこの方法で回答すると、実行時間超過でテストが一部通りませんでした。そこで、この解き方の無駄を探すと、それぞれのループで全ての文字をチェックしていたので、重複した文字を何度も比較してしまっていることに気づきました。
たとえば、文字列の中にaが1000回あれば、2回目のaでその文字は重複しているた
【Java】新卒が初めてのコードレビューで受けた指摘5選
## はじめに
新卒でSIerのJavaプログラマとして働き始めて2ヶ月が経ちました。
忙しい中、自分の拙いコードを見てくださる先輩方には感謝しかありません。今後同じ指摘を受けないように、コードレビューでの指摘をまとめようと思います。
## ①Nullぽを起こさないようにチェックを入れる。
“`Java
Customer customer = getCustomer(request);
System.out.println(“ようこそ、” + customer.getName() + “さん”);
“`もしgetCustomerで顧客情報が取得できなかった場合、customerはnullとなり、getNameメソッドを呼び出す時点でヌルポが発生します。
Nullチェックするときは、CollectionUtils.isEmptyとか、StringUtils.isEmptyとかを使いましょう。
https://qiita.com/mtanabe/items/fdfd304e461fd50e10ff
https://qiita.com/mtanab
Javaで経過日数を計算したい
Javaで経過日数を計算したい場合、もっともシンプルなのは`LocalDate`と`ChronoUnit`を利用するものです。
“`java
public static long diff(LocalDate localDate1, LocalDate localDate2) {
return ChronoUnit.DAYS.between(localDate1, localDate2);
}
“`しかしライブラリや開発環境の都合上、`Date`や`Calendar`を利用せねばならないということもあります。この場合、`Date`や`Calendar`を`LocalDate`に変換してしまうのがもっともわかりやすいと思います。
“`java
public static long diff(Date date1, Date date2) {
LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate
文字列の出現回数を数えたい
特定の文字列の出現回数を数えたい場合、たとえばPythonだと
“`
$ python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> “AABABAAAB”.count(“AB”)
3
“`というように、非常に簡単に書けるのですが、Javaでは一工夫が必要になります。
“`java
public static int count(String string, String target) {
int i = -1;
int c = 0;
while ((i = string.indexOf(target, i+1))!=-1) c++;
return c;
}
“`実際に使ってみると、次のようになります。
“`java
System.out.println(count(“AABABAAAB”,
【俺的】COBOL→Java言語移行ガイド(導入)
## はじめに
__検証環境__
PC: MacBook Air(mid2020)
OS: macOS Big Sur 11.5.1
COBOL: GnuCOBOL 3.1.2.0
C: 12.0.5 (`gcc -dumpversion`の結果)Javaのタグを付けましたが、今回はあまり関係ありません。
## COBOLからJavaへの移行について
COBOLが生まれてから60年以上たった今、COBOLを採用している企業の一部では、Javaなどオープン系言語へのマイグレーションが進みつつあります。
実際ググると、なぜマイグレーションが進んでいるのかはあちこちに書かれているのですが、自身で調べたことや考えを、勉強としてまとめてみようと思います。
また、別記事(後日)では、COBOLとJavaで書き方がどう変わるのかも書いてみようと思います。## なぜCOBOLからJavaへの移行が進むのか
これにはいくつか理由があります。
### 1. COBOLの運用ができる人がいない
このご時世、入社していきなり「私COBOLできます!」なんて人は超超稀ではないでしょうか。自分
@JvmStaticと@JvmFieldをobject(またはcompanion object)のフィールドに付与した場合の違いについて
基礎的な部分にはなりますが、一瞬迷ってしまうのでいろんなパターンを試してみました。
## JvmStaticアノテーション
・メソッドに付与すると、INSTANCE・Companionオブジェクトを経由せずアクセスできるようになる。
・フィールドに付与すると、getter/setterを作成してくれる。## JvmFieldアノテーション
・メソッドに付与はできない。(構文エラーが出ます。)
・フィールドに付与すると、INSTANCE・Companionオブジェクトを経由せずアクセスできるようになる。## 上記を踏まえて
とりあえず使ってみました。
適当なフィールドを持つクラスを作成。
JvmTestKotlinObject.ktの方はobjectキーワードで定義しているので、それ自体がシングルトン。
JvmTestKotlinClass.ktの方はclassキーワードで定義しcompanion objectを宣言しているので、シングルトンを内包しているクラスです。“` JvmTestKotlinObject.kt
object JvmTestKotlinObj
NLP4J – 構文解析した結果からキーワードを抽出する
[Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)
# 構文解析した結果からキーワードを抽出する例
「車が高速道路で急に停止した。エンジンから煙がもくもくと出た。」
という文から
「なにがどうした(名詞 … 動詞)」
の関係を抽出することにしてみます。日本語話者であれば
「車が … 停止する」
「煙が … 出る」
という関係を見つけ出すことができると思います。これを自然言語処理で行ってみたいと思います。ここでいう「キーワード」は「切り出したい意味のある文字列」です。
# 構文解析をする
構文解析のエンジンとして、構文解析器として著名な「Cabocha」を利用します。
NLP4JでCabochaを利用する方法については以下の記事で紹介しております。
[NLP4J – Java で構文解析(Cabochaを利用)](https://qiita.com/drafts/b6e68e1f4e3925dc6d6a)Cabochaで処理を行った結果、以下のような係り受け解析の結果(=構文解析
Java開発の技術用語
# Javaサーブレット
・webサーバー上(バックエンド)で動くJavaプログラム“`サーブレットのコード(HelloWorld.java)
import java.io.*;import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException {
response.setContentType(“text/html;charset=Shift_JIS”);
PrintWriter out=response.getWriter();
out.println(“
”);out.println(“
Hell
Java独習(第6章)
この記事ではJava独習の第6章(コレクションフレームワーク)についてのまとめを行います。
コンテンツは以下の通り
・コレクションフレームワークの基本
・リスト
・セット
・マップ
・スタック/キュー6-1 コレクションフレームワークの仕組み
コレクション=オブジェクトの集合を表す仕組み
配列との違いは以下のようなものがあげられる
・既知のデータ構造やアルゴリズムを取り込むことができパフォーマンスが高い
・共通的な操作をインターフェイスとして定義しているのでデータ構造やアルゴリズムにとらわれず同じように操作可能
Collectionのサブインターインターフェイスとして以下のようなものがある
・リスト(順序を持ち重複OK)-ArrayListとLinked List
・セット(重複NG)-hashSetとLinkedHashsetとTreeSet
・マップ(キーと値の組み合わせで管理)-HahsMapとTreeMap
・スタック/キュー(戦闘と末尾の追加や削除が可能)-ArrayDequeとLinkedListコレクションのインターフェイス化は
インターフェ
Java再入門 第2回 モジュールシステムとクラスパス、Gradle
Java 9に導入されたモジュールシステムについて、モジュールシステムの登場以前のクラスパスの世界を振り返りながら、Gradleを使っている場合の話も含めて整理してみようと思います。
# モジュールとは何か
複数のパッケージを関連するもので固めてグループ化したものです。
モジュールシステムによって以下が実現されました。– 依存関係の明確化: モジュール同士の依存関係を宣言するので、依存性をモジュール単位で検証できます。
– 公開範囲の設定: モジュール内のパッケージは明示的にエクスポートされたもののみが他のモジュールからアクセスできます。# モジュールシステムの登場以前のクラスパスの世界
まずはモジュールシステムの登場以前のクラスパスの世界を確認しておこうと思います。
古い時代からある話なので、古いドキュメントを参照してみましょう。– [Java5の公式資料:クラスの検索方法](https://docs.oracle.com/javase/jp/1.5.0/tooldocs/findingclasses.html)
– [Java5の公式資料:クラスパスの設定](ht
Gradleでjavaをビルドする際、ユニットテストをスキップする方法
# 経緯
実装途中でも、検証環境で一部機能を確認したいことがあったので、
ビルド時に実行されるユニットテストをスキップしてビルドを実行しました。# 対応内容
普段実行しているgradle buildに「-x test」を付加してビルドを実行します。“`
gradle build -x test
“`# 参考文献
http://gradle.monochromeroad.com/docs/userguide/userguide_single.html
Redisを使って排他制御を行う(タイムアウト考慮版)
:::note info
この記事は以下の記事の続きです。先に前の記事を読むことをお勧めします。
:::https://qiita.com/penguinsan/items/198cddec3552cb522a4c
今回は前に投稿した上記記事の最後で指摘したロックがタイムアウトした場合に起こる問題を解消します。
# 1.仕組み
簡易版での問題はロックのタイムアウト時間より処理が長くなってしまった場合、その長くなってしまった処理が最後に自分のロックしたものでないキーを削除してしまうことで意図せずロックが解除されてしまうということでした。
なのでロックを解除する際に自分のかどうかを調べて、自分の獲得したロック出なかった場合は削除しないようにすれば解決します。
## 1.1.NG例
実は既に前回のプログラムでも自分の獲得したロックかどうかの値はUUIDとしてロックキーに対応する値として入れてあります。
なので、ロックをリリースしている箇所[net.penguinsan.redis.MutexRedisService](https://github.com/penguinsa
CodeSignal – firstDuplicateにチャレンジ
コーディングしなさすぎてコーディングを忘れたエンジニアがコーディングを思い出すためにコーティングします。
今回は、アメリカのコーデイング練習サイトCodeSignalの問題「firstDuplicate」を解いていきます。
サイトによると、この問題はGoogleの面接で出されたようです。##問題
[2, 1, 3, 5, 3, 2]のような数値配列が渡されるので、左から見ていって最初に重複した数値を探します。
最初というのは、上の例なら、左から見ていくと3の重複が最初に検知できるので、答えは3です。たしかに2も重複していて、1個目の2は配列の冒頭で登場しますが、2個目の2が出てくる前に3の重複が見つかるので、答えは2ではありません。
もし配列の中に重複した数値がなければ-1を返します。
その他、配列をaとするとこんな制約があります。
1 ≤ a.length ≤ 10^5
⇨配列の要素数は1以上10,000以下
1 ≤ a[i] ≤ a.length
⇨配列内の数値は1以上、配列の要素数以下
たとえば[2, 2]なら、配列の要素数は2なので、中の数値も2以下(1か2)になり
自分用Webコンテンツコピペ
“`jsp:index.jsp
/*
“`“`java:CreateControllers.java
package controller;
import java.util.HashMap;
public class CreateControllers {
public HashMapnewControllers(){
HashMapmap = new HashMap ();
“Name”Controller “name”Obj = new “Name”Controller();map.put(“action_param”, “name”Obj );
return map;
}
}
“`“`java:servlet.java
package servlet;import java.io.IOException;
import java.sql.SQLException;
impor
Win10命令行快速安装JDK环境
[TOC]
## #主要内容
用scoop包管理自动下载安装jdk,自动配置环境,一键安装(把里面命令跑一遍就行了)♂## #需要工具
1. Powershell(自带可)
https://docs.microsoft.com/zh-cn/powershell/
2. 包管理命令行工具 Scoop (命令行安装)
https://github.com/lukesampson/scoop## #安装包管理工具Scoop
1.配置Scoop本体安装路径
·(Win10)按下Crl+X,点击 **Windows Powershell** ,打开Powershell
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99696/b7e824d7-3058-b475-89f7-3eb9344a1cee.png)
· 然后执行下面步骤的代码配置 *Scoop命令行程序* 的安装路径“`
$env:SCOOP=’D:\Applications\Scoop’ #修改这
SpringBootにおけるレイアウト
## 本日の内容
– レイアウト機能を用いて画面を構成するため必要な知識の備忘録
– Thymeleafのレイアウト機能を用いて完成させる
– 共通レイアウトとしてヘッダー、フッター、サイドバーを用意し、個別画面の内容を出力する
– レイアウト機能を利用した画面は保守性、拡張性に優れている## 画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/88ff2bc4-d581-8ec5-841d-9b0ec254697f.png)# レイアウト画面について
– レイアウトのhtmlにレイアウトとして使用するという宣言をする
– ヘッダー、フッター、サイドバー、コンテンツのスペースを確保するイメージ“`html
Javaの外部ライブラリーが動かない!
# Java初心者による備忘録
Javaを独学している際に、躓いた点を記述しておきます。
##外部ライブラリーの利用の注意点
外部の*.jarファイルのライブラリーを利用したい\*.javaファイルと同じフォルダにコピーするだけでは利用できない。クラスパスの設定をしなくてはいけないからだ。さらに、クラスパスを指定する際に、\path\\*.jarのように\*.jarファイルを直接指定しないといけない。
###クラスパスの指定
1. javacやjavaコマンド実行時に -cpオプションとをつける。
2. 環境変数CLASSPATHに宣言する
Java独習(第5章前半)
Java独習5章 -標準ライブラリ-
・ラッパークラス
・文字列の操作
・正規表現
・日付と時刻の表示
・ストリーム
・その他
5-1 ラッパークラス
ラッパークラス=値に過ぎない基本型のデータを包み込んで(ラップして)オブジェクトとしての機能を付与するクラス
大体は小文字の頭を大文字にしただけ
違いのはchar(Character)とint(Integer)くらい
しかし、一般的にはラッパークラスを使うときはコレクションに対して数値をセットするなどだけでまず基本型
基本型→ラッパークラスはボクシング(Boxing)という。逆はアンボクシング
ボクシング“`
Integer int_obj = 108;
“`アンボクシング
“`
int i = int_obj;
“`
そもそもボクシング(2つ合わせてオートボクシング)は避けるべき数値から文字列変換
“`
Java
System.out.println(Integer.parseInt(“108”)); //結果は108
System.out.println(Double.pa