JAVA関連のことを調べてみた2020年03月29日

JAVA関連のことを調べてみた2020年03月29日

JVM・GCの自分まとめ

先日、業務でフルGCが発生しアプリケーションが止まってしまうことがありました。
そもそもフルGCとは何か、わからなかったのでそこから調べて、またGCってどれくらいの頻度で発生するのか気になったので、調べて実際にちょこっと触ってみたことを書いています。

## GCとは

簡単にいうと、JVM上に確保されたヒープ領域で、不要になったオブジェクトに紐づいているメモリを開放すること。

たとえば、以下のようなコードがあった場合には、Compnayのオブジェクトが100000個も作成されます。
ほっておくとメモリを圧迫してしまいます。
実際にはこんなコード書かないと思いますが、このように少しのあらゆるコードの箇所で、数多くのオブジェクトが作られメモリに乗っています。

“`scala:test.scala

case class Company(name: String)

for(i 0 <- 100000 ) { val company = Company(s"企業-${i}") } ``` ## JVMのヒープ領域の詳細 young・oldに大別されます。 youngはさら

元記事を表示

javaでAtCoder Beginner Contest 160を解く

AtCoder Beginner Contest 160お疲れ様でした!
[公式ページ](https://atcoder.jp/contests/abc160)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc160)
結果はA-EまでACできました。久しぶりの5問ACでテンション上がります^^

以下簡単に解説します。

##[問題A](https://atcoder.jp/contests/abc160/tasks/abc160_a)

引数にStringで6文字のものが渡されてくるので、
`String.charAt()`
で指定文字のcharacterを取り出して、比較すればOKです。

##[問題B](https://atcoder.jp/contests/abc160/tasks/abc160_b)

金額が与えられて、それを適切に500円硬貨と5円硬貨に両替する問題です。
答えの出力が「嬉しさ」になっていて、500円硬貨をもっていると1

元記事を表示

【XML】気象庁から地震情報を取得する①

#気象庁XMLを取得して解析までの道のり
① XMLのダウンロード(今回)
② XMLファイルの解析(次回)

#気象庁からXMLファイルを取得する
ダウンロードを実行するクラスを作成する。

“`java:XMLDownloader.java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class EarthquakeXMLDownloader implements Runnable {

// 気象庁のリンク(http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml)
String link;

// ダウンロードする場所
File

元記事を表示

java 標準関数型インターフェース

関数型インターフェースとは、抽象メソッドを1つだけもつインターフェースで、ラムダ式やメソッド参照の代入先として使われるやつです
標準関数型インターフェースについてまとめてみました

## 標準関数型インターフェース
標準関数型インターフェースとして、典型的なメソッドの型が`java.util.function`パッケージで定義されている

### 基本的な標準関数型インターフェース

|インターフェース|メソッド|説明|
| —- | —- | —- |
|Function \|R apply (T t)|T型の引数を受け取って、R型の結果を返す|
|Consumer \|void accept (T t)|T型の引数を受け取って、結果は返さない|
|Predicate \|boolean test(T t)|T型の引数を受け取って、boolean値の結果を返す|
|Supplier \|T get()|引数無し、T型の結果を返す|

#### サンプルコード

“`Sample.java
// Function

元記事を表示

アプリケーション間でRequestIdを送りあってみる

# やりたいこと
サービスが複数またがってている場合、運用時にサービス間を跨いだログを見たくなる時があるので、その方法をかく。
順番は
1. Spring BootでRequestIdを生成して、ログファイルに出しておく
2. 他アプリケーション(今回はGin)に対して、リクエストを投げる
3. Gin側でRequestIdを受け取る

ソース
[Spring Boot](https://github.com/ririkku/spring-log-demo)
[Gin](https://github.com/ririkku/go-sandbox/tree/master/gin-nginx-sample)

# 環境
– Java
– Spring Boot
– Go
– Gin

# Spring Boot側にRequestIdの設定を入れる

## ログファイルにRequestIdが表示されるようにする

MDCを使用して、リクエスト毎にUUIDを生成して、ログに仕込めるようにしておく

“`SampleFilter.java
import org.slf4j.MDC;
impor

元記事を表示

新人研修でやった三角形の面積を求める実装を今やってみる

# プログラミングを始めて2年が経った

新卒で入社した会社のJava研修で初めてプログラミングをしてからもうすぐ2年が経ちます。最近は情報系の学生さんとも話す機会が増え、すごい人がたくさんいるんだなーと実感することが多いです。
自分が新人研修でやっていたことなんて大したことなかったなーと振り返りつつ疑問が…

# あの時俺がやっていたのはオブジェクト指向?

研修の課題の一つに`三角形の面積を求めなさい`というものがありました。
趣旨としては手続き型的に書くのではなく、クラスを使って実装しようというものでした。
そこで、私が考えた答えは⬇️こんな感じだったと思います。

“`java
class Triangle {
int bottom;
int height;

public Triangle(int arg1, int arg2) {
this.bottom = arg1;
this.height = arg2;
}

public int calc() {
return this.bottom * this.height /

元記事を表示

【Java】Listの使い方【ArrayList】

#Listとは?
複数の要素を含み、順序のつけられたコレクションのこと。
インターフェースのため、実装することで使用可能となる。

コレクションとはなんぞや?ってことで調べてます。

コレクション:オブジェクトの集合を扱うための仕組み。以下の種類がある。

– List系
– ArrayList  配列を扱う。

– LinkedList  配列を扱う。挿入・削除が高速。
– Vector   配列を扱う。パフォーマンスが悪いため現在ではあまり推奨されない。
– Set系
– HashSet   値の重複を許さない順不同の要素集合。
– TreeSet  値の重複を許さないソートされたの要素集合。
– Map系
– HashMap  キーと値の組からなる要素の集合。
– TreeMap   キーと値の組からなる要素の集合。キーでソートされている。

今回はArrayListを使用してみます。

##ArrayListの使用例

“`listtest.java

package listtest;

import ja

元記事を表示

Scope(スコープ)

#Scope(スコープ)
インスタンスを保存できる領域。
スコープを経由させることにより、サーブレットクラスとJSPファイルの間でインスタンスを共有させることが可能になる。

##JavaBeans
スコープに保存する再利用しやすくするルールに基づいたクラス(インスタンス)
###直列化
###プロパティ
getter/setter

##リクエストスコープ
レスポンスが返されるまで利用可能
HttpServletRequest

###リクエストスコープにインスタンス生成

“`php:記述
request.setAttribute(“属性名”, インスタンス);
“`

###リクエストスコープからインスタンスを取得

“`php:記述
取得するインスタンスの型 変数名 = (取得するインスタンスの型) request.getAttribute(“属性名”);
“`

##セッションスコープ
保存インスタンスの有効期限は開発者が設定
リクエストをまたいでの使用可能

###セッションスコープの取得

“`php:記述
HttpSession session = reque

元記事を表示

MVCモデル

#MVCモデル
###M…Model(モデル)
Javaクラス
アプリケーションの処理(計算処理等)、データ格納
###V…View(ビュー)
JPSファイル
画面表示
###C…Controller(コントローラー)
サーブレットクラス
要求の受け取り、処理実行依頼(Model)、結果表示依頼(View)

##転送処理

###フォワード
処理を他のサーブレットクラス、JPSクラスに移す(内部)
URLがリクエスト時の状態

“`php:記述
RequestDispatcher dispatcher = request.getRequestDispatcher(“フォワード先”);
dispatcher.forward(request, response);
“`

###リダイレクト
処理を他のサーブレットクラス、JPSクラスに移す(外部)
URLがリダイレクト先のものに変更

“`php:記述
response.sendReddirect(“リダイレクト先のURL”);
“`

元記事を表示

From(フォーム)

#From(フォーム)
webページに入力したデータをサーバーサイドプログラムに送信
入力項目のまとまり

“`php:記述


“`

##リクエストメソッド
GETリクエスト
新しい情報(Webページ等)を取得

POSTリクエスト
フォームに入力した情報を登録

###テキストボックス

“`php:記述

“`

###パスワード

“`php:記述

“`

###ラジオボタン

“`php:記述

“`

###送信ボタン

“`php:記述

“`

##リクエストパラメータ取得方法
APサーバによってHttpServletRequestインスタンスに格納されて送信先のサーブレットクラスまた

元記事を表示

Gradleってなんだろう?

javaのビルド周りに興味をもったので、その時のメモ。

# Gradleとは
javaのビルドツールで jarファイル(javaのバイトコードファイルや画像をzipファイル形式で一つにまとめたもの)
へのビルドをしてくれます。
mavenと違い、設定ファイルはgrovyという言語で書きます。

また、gradleを毎回インストールすることがないように、gradle wrapper というものを作り、
これを配布することで、gradleをインストールしていない環境でもgradle を使うことが出来ます。

# Gradle 初期化
簡単なgradleプロジェクトを作ります。

“`bash
gradle init
“`

これで色々ファイルが作られます。具体的には以下の感じ

“`bash
├── build.gradle
├── gradle
│   └── wrapper
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── se

元記事を表示

JPS(JavaServer pages)

#JPS(JavaServer pages)
リクエストされるとサーブレットクラスに変換

##スクリプトレット
Javaのコードを埋め込む

“`php:記述方法
<% Javaのコード %>

“`

##スクリプト式
変数・メソッド・戻り値などを出力する

“`php:記述方法
<%= Javaのコード %>

“`

##JSPコメント
コメントの記述

“`php:記述方法
<%-- コメント --%>

“`

##pageディレクティブ
JPSファイルの設定

“`php:記述方法
<%@ page 属性名="値" %>

“`

##URL

“`php:記述方法
http://<サーバ名>/<アプリケーション名>/

“`

元記事を表示

非staticネストクラスが握っちゃう、エンクロージングオブジェクトの暗黙的参照

この記事は、Javaにおける「非staticネストクラスが、エンクロージングオブジェクトを暗黙的参照として握っちゃうから、気を付けましょう」について述べます。

なぜ、気を付けなければならないのか、と言えば、「メモリーリークを引き起こす可能性を高めてしまうから」です。

そして結論は、「ネストクラスは、`static`修飾子を付けた方がイイ(さすれば、エンクロージングオブジェクトを暗黙的参照として握ることはないから)」です。エンクロージングオブジェクトは短命で、ネストクラスのインスタンスの方が長命である場合は特にです!

# 事のきっかけはAndroidアプリ開発時

(この記事は、Androidアプリ開発に特化したものではありません。が、読み進めていけばJavaに関わることになっていきますので、当初は我慢してお読みください)

ある日のことでございます。AndroidアプリをJavaで作っていた時に、Android Studio[^1]が、こんな警告を出してきました。

[^1]: IntelliJ IDEAを改造して作られたAndroidアプリ開発専用IDE

![thisasyn

元記事を表示

Servlet(サーブレット)

#Servlet(サーブレット)
サーバーサイドプログラムを作るための技術
サーバレットクラスを作りAPサーバ上で実行する
ブラウザからのリクエストによって実行され、結果をHTMLで出力しAPサーバによってブラウザにレスポンスする

##doGet()メソッド
サーブレットクラスがリクエストされると実行されるメソッド

##HttpServletRequest
ブラウザから届いたリクエストに関する情報と機能を持つインスタンス

##HttpServletResponse
サーバから送り出すレスポンスに関する情報と機能を持つインスタンス

##Content-Typeヘッダ

##URL
“`PHP:Java
http://<サーバー名>/<アプリケーション名>/
“`
@WebServlet(“/URLパターン”)で設定

元記事を表示

【Java】compareToが不要な範囲チェック

# 範囲チェックの実装、どうしてる?
数値やら文字の範囲チェックって、`obj.compareTo(value)`の組み合わせで書いてあることが多いですよね。
ですがそのcompareToの戻り値のパターンがどうしても覚えられないんです…
覚えてるのは、一致が「0」ということだけ。`> 0`と`< 0`のどっちが小さい/大きいなのか、毎回実行して確認しています… でも、compareToメソッドや等号・不等号演算子による「最小値以上かつ最大値以下」の範囲チェックを書かなくて済む方法があったんです。 # やはりApacheCommonsはぐう優秀 `org.apache.commons.lang3.Range`クラス(結構昔からあるのに無知でした)がポンコツSEの救世主でした…これは推せる。 「java 範囲 チェック」でググると、等号・不等号演算子やcompareToによる実装が検索結果の上位にいるので、「commons」とかキーワードをちょっと工夫しないとなかなか辿り着けないんですよね、Rangeクラスには。 ## サンプルコード ```java int num0 = 0; in

元記事を表示

JavaからExcelを簡単に出力!縦横変換不要なライブラリ「JXLS」はじめに

Apache POIをそのまま使うのがしんどいので、いいものはないかと探していたところ、Jxlsがよさげでした。
何が良いかって、ツリー構造を持ったデータを簡単に出力できる点が素晴らしいですね。
ただ、探したところ日本語ドキュメントが少なそうだったので、翻訳してみました。
変なところあればご指摘いただけると幸いです。

本記事は[こちら](http://jxls.sourceforge.net/index.html)の翻訳記事です。2019/3/30版のドキュメントを翻訳しています。

# イントロダクション
JXLSはExcel帳票を簡単に生成するための小規模なJava製ライブラリです。JXLSで出力する帳票のフォーマットやデータのレイアウトは、独自の構文をExcelテンプレートに書き込むことで定義します。
いわゆる帳票機能のようなJavaアプリケーションにとって、Excel生成は必要不可欠なものとなっています。

Javaにはオープンソース、商用ともに、非常に優れたExcelファイル出力用のライブラリが存在します。そのうちオープンソースのものでは、Apache POIやJava

元記事を表示

【Java】「final変数」と「不変オブジェクト」の違い

どーも、ふぎとです。
今回はfinal変数と不変オブジェクトについて
まとめてみました。

##final変数
final変数とは、final修飾子を指定した変数のこと。
その性質は「変更不可・読み込み専用」と呼ばれる
が、厳密には「**再代入不可の変数**」。

~~~ruby:
final int i = 3;
i = 5; //再代入によるコンパイルエラー
~~~
上では、基本型(int型)変数iにfinalを指定している。
基本型変数は、変数の値に「値そのもの」が保持される
変数だ(詳細は『[基本型変数の代入と参照型変数の代入
の違い](https://qiita.com/FugitHora812/items/a0e2f49331be6f35b8a0)』を参照)。そのため、「値そのもの」を入れ替
える再代入はコンパイルエラーになる。つまり、基本型
変数に限って言えば、final変数は「変更不可」である
ように見える。
話をややこしくしているのは、final指定の参照型変数だ。

~~~ruby:
final StringBuilder sb = new

元記事を表示

Android 11で令和に標準で対応予定

Androidのバージョンはグングン上がります。
今やそろそろAndroid 11がリリースされつつあります。
そのAndroid 11にて、ついに日本の元号「令和」が標準APIで対応するようです。

# 結論

結論を真っ先に述べます。

– Android 11(R)にて、ついに日本の元号「令和」が標準APIで対応するようです。
– すでにAPIレベル24からAndroid標準APIはICUを取り込んでいます。
– でもAPIレベル24~29の間は「令和」には対応していません。「平成」どまりです。

# [閑話]コードネームとかAPIレベルとか

ところで、お菓子の名前のコードネームですが、「Q」からやんなくなりました。

KitKatとかLollipopとかMarshmallowとかNougatとかOreoとかPieとか。時折、登録商標も混ざりながらも。
Androidっ子たちは、「Q」から綴りが始まるお菓子が何になるのかワクワクしてたのに、Googleが「お菓子の名前はもうやめた」と言い出して。

Android 10は「Q」。そろそろリリースされる11は「R」です。

And

元記事を表示

Java 8のOptionalをSwiftと比較する

# 概要

本記事では[OptionalのApple公式ドキュメント](https://developer.apple.com/documentation/swift/optional)の概要に掲載されている項目を元にして、Swiftの`Optional`型とJava 8の`Optional`型を比較します。若干今更感のある内容にはなりますが個人的な備忘録も兼ねて投稿に至りました。
[記事の最後](#まとめ)にはそれぞれの記法の比較表も掲載しています。あわせてご覧ください。
なお本記事に掲載してあるスニペットは多少簡略化されているので、そのままコピペしても動かないものがあります。ご了承ください。

# Nil結合演算子(Nil-Coalescing Operator)

### Swift

中身があるならそれを、なければ指定したデフォルト値を返すように`Optinal`をアンラップします。`??`という演算子を使います。複数の`Optional`型をオペランドとしてつなぐこともできます。

“`swift:Swift
let wrappedValue: String? = nil

元記事を表示

配列初期化時のエラー?

### 配列初期化時のエラー?

今回の現象:String配列を一回宣言してから初期化しようとしたらエラー

“`java:
String[] strList={“1″,”2″,”3″,”4”};
“`
これができるならこれは…

“`java:
String[] strList;
strList={“1″,”2″,”3″,”4”};
“`

こんな感じで初期化できると思いきや…
Array constants can only be used in initializers

じゃあこれは…

“`java:
String[] strList;
strList=new String[4];
strList[0] = “1”;
strList[1] = “2”;
strList[2] = “3”;
strList[3] = “4”;
“`

成功!!

でも長ったらしいので不満…

ということで調べると
http://d.hatena.ne.jp/Kappuccino/20080721/1216623546

こういう書き方あるのか…

“`

元記事を表示

OTHERカテゴリの最新記事