- 1. Javaのモジュールについてまとめてみた
- 2. 「マイクロサービスパターン」を読む会 第7回
- 3. Spring Data JPAでJPQLを書かずにJOINさせる
- 4. Firebaseのオフライン機能の記述場所によりマルチウィンドウ切り替え時にアプリが落ちるてハマった件
- 5. Javaによる添付ファイル付きのメール処理
- 6. 【AndroidStudio】Intentで起動元に値を返す方法(ActivityResultLauncher)
- 7. ヒュベニの公式(Hybeny’s Distance Formula)を使って緯度経度間の距離を算出する
- 8. Geohashについて(Javaの変換サンプル付き)
- 9. Javaで重複した順位付けをする方法
- 10. SNSのアカウント名を勝手に作ってくれるアプリを作ってみた
- 11. 関数型インターフェースについて学習したのでまとめてみた。
- 12. 【Spring Data JPA】主キーが重複した複数のデータをsaveAll()で登録すると・・・
- 13. 初心者でもわかる関数型インターフェース(UnaryOperator編)
- 14. Java Web Startテスト
- 15. JavaCV(OpenCV)で画像変換を行いたい
- 16. GradleやMavenとは
- 17. 【Java】Stream APIの使い方
- 18. Java系バージョン対応表
- 19. 初心者でもわかる関数型インターフェース(Function編)
- 20. Java 初心者でもわかる関数型インタフェイス(Predicate編)
Javaのモジュールについてまとめてみた
Javaのモジュールシステムについてまとめてみました。
Java9から実装された機能なのでかなり古いですが、やってみます。
# Javaのモジュールシステムとは
“`
・パッケージの依存関係を簡潔に整理させる
・パッケージのアクセスを制御することができる
“`これらの利点を得るためにJava9で実装されたものです。
これにより、不用意に他のプログラムからのアクセスを拒否することができます。そうして
「え、このコード動かして実装してみたら他のところでバグが起きちまった!クソスパゲティーコードが!!!!」
といったことがなくなります。筆者もmoduleではないですが、コードを書いていたら別のところがバグってしまい、「そこにアクセスするんじゃねぇよ」と思った経験があります。
そういたことを防ぐためにあるわけですね。Java9よりも細かくアクセスできるスコープを設定できます。具体的には
“`
・今作業しているモジュールの中でだけpublic
・指定したモジュールに対してだけpublic
・すべてのモジュールに対してpublic
“`ということができます。
そして、
「マイクロサービスパターン」を読む会 第7回
– Java読書会の自分メモ
– せっかく勉強したのにつぎつぎと忘れておくので、印象に残ったところでも記録していくhttp://www.javareading.com/bof/
## 8.3.3 GraphQL を使った API ゲートウェイの実装
– API GatewayをGraph QLで実現する話
– クライアント側でqueryの内容を変えられるので、graph qlのエンドポイントを一つ作るだけで様々な用途に対応できる
– rest apiだと、多少はパラメータ化できるものの、普通はいくつものapiをつくることになる
– GraphQL スキーマ“`
type Query {
orders(consumerId : Int): [Order]
order(orderId : Int): Order
consumer(consumerId : Int): Consumer
}type Order {
orderId: ID,
consumerId : Int,
consumer: Consumer
restaurant: Res
Spring Data JPAでJPQLを書かずにJOINさせる
## 概要
Spring Data JPAで`findAll()`、`findById(id)`実行時にJOINさせるようにし、N+1問題が起きないようにする。
JPQLは使わないで実現する。## Service
以下のようにそれぞれを呼び出す。以下の例ではpagingを実装しているが、していない場合でも同じ。“`java:UserService
@Service
@RequiredArgsConstructor
public class UserService {private final UserRepository UserRepository;
public Page
findAll() {
// paging
Pageable limit = PageRequest.of(0, 10);
return UserRepository.findAll(limit);
}public Optional
findById(Long id) {
Firebaseのオフライン機能の記述場所によりマルチウィンドウ切り替え時にアプリが落ちるてハマった件
加速度センサーのデータを長時間記録するアプリを作っており、データ保存先はrealtime databaseです。掲題の通りなのですが、realtime databaseを利用すると、一旦スマホのwifi接続がきれても、アプリがオフラインでデータを保存してくれていて、次にwifiが繋がった時にサーバーに送信してくれるという、1行書くだけでお任せの超ありがたいオフライン機能があるそうな。
https://firebase.google.com/docs/database/android/offline-capabilities?hl=ja
そこでそいつを実装するために例えばアクティビティの「recording.java」あたりにFireBase非同期処理のお願いとして
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
などと記述するのですが、しかーし、こいつのせいでマルチウィンドウ切り替え次にアプリが落ちることが判明。
■対応:計測前にセンサーをペアリングするための設定画面の段階で非同期処理を設定したら、解
Javaによる添付ファイル付きのメール処理
# ビジネスシーンでは電子メール処理は現役
前回の記事 https://qiita.com/sev01/items/6c8ea0c1a82324341fdd ではメールの送信をしましたが、受信したメールを保存し、そこからデータを抽出することは日常業務の中でよく使われます。
# マルチパートって色々あります
マルチパートの中に、さらにマルチパートとなっていることがあります。
つまり、入れ子になっていることがあるため、ある種の再起処理が必要になります。# 添付ファイルの名前が文字化けする問題に遭遇
JavaMailのMimeUtility.decodeText を利用します。
# 例
“`java
package mailrecievetest;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import j
【AndroidStudio】Intentで起動元に値を返す方法(ActivityResultLauncher)
#はじめに
AndroidでIntentを扱っていると、MainActivityから何かしらのActivityを呼び出して、呼び出したActivityが終了したら戻り値を受け取ってMainActivityで処理したい場面が良く登場します。ActivityResultLauncherというクラスを利用すれば可能のようですが、公式ドキュメントもQiitaの記事も優しくなかったりして意外と手間取ってしまったので、めちゃくちゃ優しく書いていきます。例のごとく、Javaしか書けないのでJavaで、、、#戻り値のないIntentのプログラム
まずはベースとなるプログラムを確認していきます。MainActivityで個数を指定して、SubActivityで個数を受け取って表示し、戻るボタンを押したら何もせずにMainActivityに戻り、確定ボタンを押したら個数を返してトーストで表示し、個数をリセットするというプログラムにします。もちろん戻り値なしのものを作るため、SubActivityからMainActivityに値を渡せずに、どっちのボタンを押してもただMainActivityに戻るだけに
ヒュベニの公式(Hybeny’s Distance Formula)を使って緯度経度間の距離を算出する
緯度経度間の直線距離は、地球が楕円型の所為でそれほど平面上の座標の距離ほど簡単に算出できない。
そのため、緯度軽度間の距離を計算するにはいくつかの方法があるらしいが、
最初に見つけた以下のJavaのサンプルコードが私の用途に削ぐわない結果が出たので、
別の方法を調べた。https://qiita.com/niwasawa/items/5128101ef93a56e8a6af#java
それがヒュベニの公式(Hybeny’s Distance Formula)を使った方法である。
こちらの実装例を紹介するページは多かったが、Javaはぱっと見つからなかったので、
書いてみた。
尚、ヒュベニの公式を使った距離の精度は近い位置だとそれらしい結果だったが、
距離が離れていると誤差が大きそうだった。
とはいえ、私の用途だと大きな問題なさそうだ。“`java
double distance(final double latitude1,
final double longitude1,
final double lati
Geohashについて(Javaの変換サンプル付き)
# Geohash とは
Geohash は、Gustavo Niemeyer が geohash.org というWebサービスを作成中に発明した、
ジオコーディング方法の一つ。
Geohash を使うと地球を矩形単位で分割して、それをBase32のハッシュで表すことができる。## geohash は何が便利?
* 矩形のサイズは桁数に比例して変わり、10桁になると0.59m × 0.97mなので、実質的に位置として扱える。
* 矩形単位で位置情報を管理できる。
* 一定範囲ごとのグループ化などがし易い。例えば上位5桁なら4872.66m × 3955.08mの、上位4桁なら19490.62m × 31640.62mの範囲でグループ化できる。
* 上位の桁が同じ場所は近い位置にある。
* 前方一致検索ができる。
* 曖昧な検索ができる。# Geohashの仕組み
緯度軽度はそれぞれ-90〜+90、-180〜+180の範囲がある。
geohashでは、それを交互に分割していく。
例えば緯度経度が `35.68, 139.70` の場合1. `139.70`
Javaで重複した順位付けをする方法
# Javaで順位付けする方法
どうやって順位付けを行うのか、考えたことはありますか?
結構コードを書いていて、最初はぐちゃぐちゃしたものになってしまっていたので、自分で試してみた方法を上げてみたいと思います。# 環境
– java14# 使用させていただいたデータ
[ワインの評価データ](https://domohelp.domo.com/hc/ja/articles/360043931814-%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88)今回はワインの評価データのポイントが高い上位30番以内のデータを出力します。
同率順位も可能性としてはあるので、この場合は30個を超えることもあります。
例えば、ポイントが2,2,3,3,5,5,8,8,8,9,12であり、この上位3位まで出力する場合、
“`
SNSのアカウント名を勝手に作ってくれるアプリを作ってみた
##作ってみた経緯
SNSなどでアカウント名をつけるのがめんどくさいなあと思う時があったので、Javaの復習とHerokuへのデプロイ練習をしたかったので、取り組んでみました。##作ってみたものでできること
入力した内容から、ランダムでアカウント名を作成できます。
記入する内容は、姓、名、生年月日(姓名はローマ字であればなんでも、生年月日は未来日でなければどの日付を指定しても大丈夫です。)####<トップページ>
[](https://gyazo.com/161beabe779d024a59f47de911cb15ae)####<実行結果>
[](https://gyazo.com/2cb82dabe28e2ebcef4d76f530a622f7)##作ってみた感想
関数型インターフェースについて学習したのでまとめてみた。
Javaの関数型インターフェースについて学習したのでまとめてみます。
# 関数型インターフェースとは
関数型インターフェースとは、抽象メソッドを持ったインターフェースです。
役割としては、“`
抽象メソッドを一つだけドを一つだけ持っているもの。l
そして、その抽象メソッドはラムダ式等を使って呼び出していきます。
“`そもそものインターフェースとは、開発においてどこのクラスでも必要なメソッドをまとめて置くためのものです。そして、関数型インターフェースは、抽象メソッドを一つだけ定義しているインターフェースです。
抽象メソッドとは何かというと、処理の内容が無いメソッドです。# 関数型インターフェースの書き方
“`Sample.java
public interface SampleInterface {
public void Sm1(String sample);
}
“`このように、インターフェースの中に抽象メソッドを定義します。
さらにわかりやすく書くやり方もあります。それは、アノテーションを宣言することです
“`Sample.java
@
【Spring Data JPA】主キーが重複した複数のデータをsaveAll()で登録すると・・・
現在参画している案件でJava使い、開発を行っています。
そこでsaveAll()を用いてデータを登録する機会がありました。
しかし、実際にテストで動かしてみると3件データを登録できるはずがなぜか1件しか登録が出来ていなかったのです。#原因
テスト自体は通るのですが、エラーで落ちてはいない・・・
なぜ登録できなかったのか、それは**重複した主キーを複数のデータに登録していたから**です。
実は開発中のAPIの仕様が曖昧なところがあり、””(空文字)で指定しておいてくださいと指示を受け、主キーに全て空文字を登録するようなロジックを作成していたことが原因でした。
(そもそも主キーに空文字を登録する時点で気づくべきだった・・・)しかしここで、また1つ疑問が浮かびました。
なぜ、**重複した主キーなのにデータを登録できているんだろう???(しかもなぜか1件だけ)**
その答えはsaveAll()の仕様にありました。#saveAll()の仕様
どうやらsaveAll()は
**①登録する際に重複する主キーがなかったら登録(insert)**
**②登録する際に重複する主キーが
初心者でもわかる関数型インターフェース(UnaryOperator編)
##はじめに
皆さんはUnaryOperatorについてご存知でしょうか。UnaryOperatorを使用すれば、一律の処理をキュッとまとめることが出来ます。例えば、リストの文字列を全て大文字にするなど使い方次第で色々なことが出来ます。JavaGoldの試験の出題範囲でもあります。そんな、UnaryOperatorについて解説していきます。##UnaryOperatorとは
UnaryOperatorとは、1つの値を処理して同じ型の処理を戻す処理を表す関数型インターフェースです。例えば、String型の引数を受け取ったら、戻り値もString型の処理を戻すというイメージです。UnaryOperatorは、Funcitionインターフェースのサブクラスで、抽象メソッドであるapplyメソッドを実装しています。それでは、サンプルコードを通して、使い方を解説していきます。##どのように使うの?
以下のコードは、String型の引数を受け取ってその引数に変数strを加える処理です。
そしてapplyメソッドを使用して、UnaryOperatorで実装した処理を呼び出します。“`S
Java Web Startテスト
前書き
—
ふっと、Java8で提供されるJava Web Startのサポートが2030年に切れるという話を聞きまして、
現状、Java11以降ではJWS自体廃止されてるということなので、
二点気になったことがありました:
1.有償プランを契約していない状態でJWSの機能を使用できるか?
2.Java11など後継バージョンで機能自体は引き継がれているのか?今回は1のほうを検証してみようと思います。
参考記事
—
テスト環境
—
Win10、Java8(jdk1.8.0_321、jre1.8.0_321)コーディング
—
SampleApplication.java“`java
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;public class SampleApplication extends JFrame {
private JPanel cont
JavaCV(OpenCV)で画像変換を行いたい
## 概要
javaで画像変換を行いたいなと思い、色々と調べていたら**JavaCV**がメジャーぽかったので、こちらを使用することにしました。**OpenCVをjava用にラッパーしたもの**の様です。OpenCVと言うとpythonのイメージしかなかったのですが、プログラミング言語は[C++](https://ja.wikipedia.org/wiki/OpenCV)で、javaでも使えるみたいですね。## 画像のフォーマットについて
画像のフォーマットは、**WebP**(ウェッピー)が割と新しいと言うことが分かりました。最近は、[**AVIF**](https://ics.media/entry/201001/)と言うのも出てきているみたいで、トレンドが速いなと思いましたが、まだ、OpenCVでは対応していないみたいです(多分)。「**画像の読み込み速度は、売り上げに直結している。**」みたいは記事もどこかで見かけたし、重要みたいですね。[アマゾンのページ表示速度を劇的に改善した6つの実践テクニック【SEO情報まとめ】](https://webtan.impress
GradleやMavenとは
# Springプロジェクト作成時の選択項目
Springプロジェクト作成の時いつも
「GradleかMavenか」
を選ぶことになります。一体なんのことなんでしょうか。そもそもSpringプロジェクト作成の時に選ぶ選択項目のほとんどを理解してない私ですが、
「最初Gradleで作成したら上手くいかなくて、Mavenにしたら動いた!」
と言うこともあったので調べておこうと思いました。# サーバ起動と同時にコンパイルしてくれる便利なやつ
正体はJavaクラスからJARファイルやWARファイルを作成してくれるコンパイラーです。
https://tech-lab.sios.jp/archives/9500Mavenの特徴はXMLファイルでビルドの手順を記述することです。
ビルドにMavenを選択した際は、pom.xmlというファイルが作成されるので、そこに必要なライラブリを記述します。
ビルドを実行するとここに記述されたライラブリをMavenリポジトリからダウンロードしてくれるのです。GradleはMavenほど有名ではありませんが
最近人気になってきているようです。これ
【Java】Stream APIの使い方
## はじめに
先輩エンジニアの方から学んだ方がいいとアドバイスをもらいStream APIについてキャッチアップをしました。
なんだか難しく聞こえますが、使ってみると意外と簡単なので忘備録を兼ねまとめています。## Stream APIとは?
Java8で導入された配列やCollectionなどを扱い、値の集計やデータを使った処理などができる便利なAPIのこと。
これだけではあまりイメージが湧かないので、**for文で記述していた処理をシンプルに記述できる便利機能**と覚えておけばOK!
## for文とStream APIの比較
今回は「**1から5までの整数の中から偶数を取得する処理**」をfor文とStream APIを利用して実装する。
“`java
import java.util.Arrays;
import java.util.List;public class StreamTest {
public static void main(String[] args) {// 1から5までの整数
ListnumLis
Java系バージョン対応表
JRE仕様とクラス形式のバージョン対応表
| JRE | class |
|—-:|——:|
| 1.6 | 50.0 |
| 1.7 | 51.0 |
| 1.8 | 52.0 |
| 9 | 53.0 |
| 10 | 54.0 |
| 11 | 55.0 |
| 12 | 56.0 |
| 13 | 57.0 |
| 14 | 58.0 |
| 15 | 59.0 |
| 16 | 60.0 |
| 17 | 61.0 |Apache TomcatとServletのバージョン対応表
| Tomcat | Servlet |
|——-:|——–:|
| 6.x | 2.5 |
| 7.x | 3.0 |
| 8.x | 3.1 |
| 9.x | 4.0 |
| 10.x | 5.0 |
初心者でもわかる関数型インターフェース(Function編)
##はじめに
関数型インターフェースのFunctionインタフェースをご存知でしょうか。Functionインターフェースを使用すると処理をキュッとまとめることができます。これによって読みやすいコードにするこどができます。そんなFuncitionインターフェースとおまけにBiFunctionインターフェースについて解説していきます。##Functionインターフェースとは
引数を1つ受け取ってその引数を使った処理返す関数型インターフェースです。例えば、引数の5を受け取ったとしましょう。その5に1を足す処理を返すというイメージです。Functionは抽象メソッドであるapplyメソッドを持っています。では、サンプルコードを通して具体的に説明していきます。:::note info
Functionはジェネリックスの型を2つ受け取ります。
具体的には1つ目の型はappyメソッドの引数の型、2つ目はapplyメソッドの戻り値の型として受け取ります。
:::##どうやって使うの?
以下のサンプルコードは引数に半径を受け取り、その引数を利用して円の面積を求める処理をしています。Funct
Java 初心者でもわかる関数型インタフェイス(Predicate編)
#はじめに
関数型インターフェースの1つPredicatetインターフェースをご存知でしょうか。
predicateインターフェースとラムダ式を組み合わせれば、複雑な条件をシンプルに実装できてしまいます。そんなPredicateインターフェースとおまけにBiPredicateインターフェースを解説していきます。
##Predicatetとは?
Predicateを日本語に訳すと「断定する」という意味になります。言葉の通り、引数を通して何らかの判断をする処理を定義するためのものです。例えば、戻り値がboolean型の処理をラムダ式で変数に代入して簡単に呼び出せるようにできます。Predicateはtestメソッドを持っています。そのメソッドは引数を1つ受け取り、その引数を使って、その結果をboolean型で戻します。サンプルコードを通して使い方を説明していきます。##どうやって使うの?
サンプルコードでは理想の男性を絞るためにMainクラスでif文を使って絞り込んでいきます。“`Man.java
public class Man {
private int hight;
p