- 投稿日:2021-01-03T20:07:34+09:00
JavaでRedis Streamを使う
https://paluch.biz/blog/174-a-first-look-at-redis-streams-and-how-to-use-them-with-java.html
Redis Streams have made it into Redis’ unstable branch since the beginning of this year, and the first clients start with the adoption of Redis Streams APIs. That makes it an excellent time to take a look what Redis Streams provide and how you can use them from a client perspective.
Disclaimer: Redis Streams are available as a first draft and are not part of a stable release yet. APIs are subject to change.
- 投稿日:2021-01-03T16:36:08+09:00
【Java】string.formatの使い方
string.format とは?
引数に指定した書式を元に文字列を整形して返すというメソッドです。
書き方
第一引数は決められた書式に従って書く必要があります。第二引数以降は第一引数で決めた書式に割り当てるための変数を渡します。
public static String format(String format,Object... args)実装例
指定された書式の文字列と引数を使って、書式付き文字列を返します。
書式は(%〜)と書いて指定します。
整数(10進整数)を整形する場合はd
、文字列を整形する場合はs
を使います。int year = 2021; String str = String.format("今年は%d年です。", year); System.out.println(str); //今年は2021年です。 // はじめに0を追加 System.out.println(String.format("%05d", 1000)); //01000 System.out.println(String.format("%06d", 1000)); //001000 // 文字を追加 System.out.println(String.format("%dと%d", 1000,2000)); //1000と2000 // 文字列を整形 System.out.println(String.format("%s/%s/%s", "2021","01","03")); //2021/01/03
- 投稿日:2021-01-03T12:08:36+09:00
【Java】フォルダの作成方法
プログラミング勉強日記
2020年1月3日
フォルダの作成方法について簡単にまとめる。Java7から機能を改善したjava.nio(NEW I/O 2)
でのフォルダ作成についてまとめる。フォルダを作成する方法
作成するフォルダのパスの指定にはjava.niofile.Pathsクラスのgetメソッドで行う。フォルダを1つだけ作成する場合は、java.nio.FilesクラスのcreateDirectoryメソッドを使う。親フォルダを含めたすべてのフォルダ階層をまとめて作成する場合にはcreateDirectoriesメソッドを使う。
サンプルコード
ファイルがすでに存在する場合は、FileAlreadyExistsExceptionの例外が発生する。
try { // 絶対パスで作成 Path path1 = Paths.get("c:\\Test1"); Files.createDirectory(path1); // 親フォルダを含めて作成 Path pat<h2><span id="_PathsgetquotcTest2abcquot">= Paths.get("c:\\Test1\\abc");</span></h2> Files.createDirectories(path2); // 相対パスで作成 Path pat<h3><span id="_PathsgetquotTest1quot">= Paths.get("Test1");</span></h3> Files.createDirectory(path3); } catch (IOException e) { e.printStackTrace(); }フォルダの作成日時を取得する方法
java.nioではフォルダの作成日時を取得することができる。getAttributeメソッドで引数にcreatiTimeを設定して取得する。
Path path = Paths.get("c:\\Test1"); System.out.println(Files.getAttribute(path, "creationTime"));実行結果2020-01-03T02:54:45.903849Z参考文献
- 投稿日:2021-01-03T09:07:55+09:00
Java + SpringBoot + Gradle + thymeleaf で 簡易DRUDアプリ作成 ( 1 )
はじめに
エンジニアに転職してから1年半が経とうとしているのでそろそろ、JavaとSpringBootで基本的なアプリ開発ができるようにならないといけないと思い始めました。現在使用している参考書はSpring Boot 2 プログラミング入門です。まだ全て手を動かしながら実践できていませんが簡易的なアプリを作成するまではできたので纏めておきます。ところどころ自分オリジナルのコードも入れながら作成したので良い勉強になりました。何回かに分けて復習がてら書いていきたいと思います。
github: https://github.com/noydmt/myboot
まず使用したツールやFWの説明から。
Gradle
Groovy
によるビルドツール。
ビルドの情報や処理はGroovy
で記述されている。Groovy
とはプログラミング言語の一種でJava
を踏襲した文法で書くことができ、アプリも作れる。使用用途としてはGradle
の記述以外にも本格的なアプリ開発の前のプロトタイプを作るときに用いられることが多い。
maven
と違い、pom.xml
は使用せず、プロジェクトの中にbuild.gradle
ファイルを置いて環境を管理する。
STSでプロジェクト作成を行うときは予め、gradle専用のプラグインツールをインストールしておく必要があり、STSで始めることが多いと思われるのでヘルプ
=>Eclipseマーケットプレイス
=>「Buildship」で検索
=>Buildship gradle integration
をインストールすることでgradleプロジェクトを作成可能。Thymeleaf
Java用に作られたテンプレートライブラリ。SpringBootにデフォルトで組み込まれている為、特にライブラリ等をインストールする必要はなし。JSPと違ってHTMLに影響を及ぼさない
th
や${}
などを用いて画面を表示することが可能。正直個人的な感想では今更、テンプレートエンジンを学ぶ旨味もそこまでないような気がする。SpringBoot
Spring
フレームワークを基にさらに拡張されたJavaフレームワーク。railsライクに高速開発できることが強み。
Spring framework
同様にDIが兼ね備えられており、わざわざ依存クラス内で使いたいクラスのインスタンスを生成する必要がない。AOP
については調べたけどよくわからない。続いては実際にアプリ開発で使用した環境を紹介していきます。
build.gradle
build.gradleplugins { id 'org.springframework.boot' version '2.3.4.RELEASE' id 'io.spring.dependency-management' version '1.0.10.RELEASE' id 'java' } group = 'com.gradle.springboot' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.hsqldb:hsqldb') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } test { useJUnitPlatform() }中身をざっと見てみると
plugins
とrepositories
、dependencies
がこのファイルの構成要素になっており、plugins
ではJava
やspringBoot
、dependency
などの使用言語や使うフレームワーク、管理ツール、バージョンなど管理されている。
バージョンによって使える機能が限られることがあるので注意。
とは言いても個人の開発者がよりいじる可能性があるのはdependencies
である。
このdependencies
ではどんなライブラリを使いたいか予め記述するだけでビルド時に勝手にダウンロードをしてくれる。
build.gradle
を使わないと使いたいライブラリがあった場合、のちに外部からjarファイルをダウンロードしてクラスパスを通さないと使えなかったがgradle
はそんな手間を掛けずにライブラリを使用することができるのだ。今回私が使用したライブラリは下記になる。
・SpringBoot
・thymeleaf
・HSQLDB
・JPAHSQLDBはJavaアプリケーション内部にDBを内蔵することを可能にするもので本来のサーバー上でなくメモリ上にデータベースを保管することができる。開発段階のテスト用データベースとして使用されることが多い。メモリ上に保管する為、揮発性を持ち、一度保管したレコードはアプリケーションを再起動すると消えてしまう。
JPAとはエンティティクラスを利用してRDBのテーブル操作をもっと簡易的に実現できるORマッパー。
次回に続く。。。
- 投稿日:2021-01-03T04:01:19+09:00
JavaでのスレッドとCallableの基本【初心者】
JavaでのThreadの基本
マルチスレッドを使えば複数処理を並列に走らせたりできる。
こういう処理の一つ一つをスレッドと呼ぶ。
Javaにおいてスレッド処理をするには継承(extends
)を使う方法とインターフェイスを実装(implements
)して使う方法がある。
前者の場合はThread
クラスを継承してstart()
メソッドを呼び出す。
後者の場合はRunnable
インターフェイスを実装してrun()
メソッドを呼び出す。
Javaでは多重継承ができないため、Thread
を使う方法だと他のクラスを継承できないが、インターフェイスを使った方法であれば可能。
後者の場合はCallable
インターフェイスを実装してcall()
メソッドを呼び出す方法もある。RunnableとCallableの違い
Runnable
の場合は返り値の指定ができず、例外も飛ばせない。Runnable_interfacepublic interface Runnable { public abstract void run(); }こんな感じで実装する。
run()
メソッドをoverrideする。Runnable_implementsstatic class MyRunnable implements Runnable { @Override public void run() { System.out.println("Runnableだよ"); } }
Callable
の場合は返り値の指定ができ、例外を飛ばせる。Callable_interfacepublic interface Callable<V> { V call() throws Exception; }こんな感じで実装する。
call()
メソッドをoverrideする。
<>の部分がジェネリクスと呼ばれる部分で、返り値の型を指定できる。(以下ではString)Callable_implementsstatic class MyCallable implements Callable<String> { @Override public String call() throws Exception { String result = "Callableだよ"; return result; } }Callableの呼び出し
オブジェクトを作って
Callable
を使ってみたい。mainMyCallable myCallable = new MyCallable();ここで
Future
とExecutorService
を使うと便利。main// ExecutorServiceインスタンスを生成 ExecutorService executorService = Executors.newSingleThreadExecutor(); // Executorにスレッドの実行を依頼 Future<String> future = executorService.submit(myCallable); //結果を取り出すにはget()メソッドを使う String result = future.get(100, TimeUnit.MILLISECONDS);
ExecutorService
経由でmyCallable
を実行し、結果をFuture
型の変数に格納している。
返り値の型はジェネリクスで指定。上ではString
にしている。
結果はFuture
のget()
メソッドを使って取り出す。
また、上のように引数を指定することで、0.1秒以上かかった場合に例外を発生させたりできる。よくわかってない僕からすると、
「Runnableの時みたいにmyCallable.call()
を直接呼び出すのじゃだめなの?」
とか思ったりしたのだけど、
myCallable
の処理は別スレッドで行われるため、処理が終わってから返り値が返ってくるのを待ってなきゃいけないのよね。
ExucutorService
を使えばちゃんと処理が終わるまで待った上で、返り値をfuture
オブジェクト経由で取得可能ということだと思う。(多分)
Future
っていう名前も未来っぽいし。ThreadLocalを使った方法
classのstaticメンバは共有リソースとして管理されるために、別のスレッドから書き換え可能になってしまう。
スレット内で完結させるにはThreadLocal
を使うと便利。main// ThreadLocalのインスタンスを作成 private final ThreadLocal<ExecutorService> executorServicePool = new ThreadLocal<>(); // SingleThreadExecutorをセットする executorServicePool.set(Executors.newSingleThreadExecutor()); //結果を取り出すにはget()メソッドを使う ExecutorService executorService = executorServicePool.get();これでよりスレッドセーフになる。
参考にしたページ