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

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

現場で「StreamAPI使うな」と言われたあなたへ

寒暖差激しいですね。
暖かい日しか出社したくないですが、人は習慣に飼いならされることで怠惰にならなくて済むので、定時出社という悪しきルーティンを受け容れようかなとか思っています。

## 「ストリームの乱用はプログラムの理解や保守を難しくする」
> Effective Java第3版より
“ストリームの乱用はプログラムの理解や保守を難しくする”

いきなりですがこれが結論です。短くて読みやすいコードは素晴らしいです。しかし、StreamAPIは、短くて難解なコード、長くて難解なコードを生み出すことも容易です。私をはじめ、StreamAPIを理解しきれていない人が実装する際は、プログラムの可読性悪化のリスクを常に認識しなければなりません。
これはすなわち現場のプログラマの問題であり、StreamAPIが悪い訳ではないということです。
StreamAPIが書きたければ、場所を変えましょう。あなたの実装したStreamAPIによる簡潔なコードが、コピペによる濫用によってそこかしこに広がり、問題の種になる前に。

## 短くて読みやすいStreamAPIによる実装
とはいえ、このまま終わって

元記事を表示

JavaFXのWebViewで絵文字が出ない問題への対処

JavaFXのWebViewに文字列を出そうとした時に大抵の日本語は出るのだが、絵文字&他にも一部の文字(?とか ?とか)が出ない問題が起きた。

Javaの内部ではUTF-16で扱っていて、UTF-8にする時にサロゲートペアで扱われている文字がおかしくなるようだ。

HTMLには数値文字参照という文字のコードポイントを直接指定して文字を出す機能がある。
(書き方は“`&#x{16進};“` または “`&#{10進};“`)

例えば HTML上に“`💯“` とかくと?になる。

この機能を使い、以下のコードでHTMLに出力される文字列が数値文字参照になるようにして解決した。

“`java
String toCharacterReference(String str) {
int len = str.length();
int[] codePointArray = new int[str.codePointCount(0, len)];

for (int i = 0, num = 0; i <

元記事を表示

ダウンロードできてたCSVファイルが、突然ページ表示されるようになった。

突貫工事で、複数人が入力したデータを、CSV形式でファイルダウンロードするWebアプリケーションをリリースしました。
利用したのは以下のOSSです。

* Spring Boot 2.2.4.RELEASE
* 組み込みのTomcat 9.0.30
* Chrome 79.0.3945.130

運用開始当日は特に問題がなく、退社して友達と飲んでたら、何やら自分のスマホが騒がしい。。。着信に出てみると「ダウンロードができない」との連絡が。詳細を確認すると「3時間前まではダウンロードを行うとCSVファイルが出力されていたのに、突然、ブラウザ上にCSVが表示されるようになった」とのこと。

友人に誤り、飲みを切り上げ、原因の調査を開始。一応、こう修正すれば動くというが判ったので、まずはサービス優先でリリースしました。しかし、原理が不明なままなので、継続調査を実施しました。

## 修正の内容

以下は、今回の問題となったダウンロード処理の簡略化したコードと、修正後のコードです。

* 修正前

“`kotlin
@PostMapping
fun export(respon

元記事を表示

SpringBootアプリケーションの運用を楽にするための機能、SpringBoot Actuatorのご紹介

# 急いでいる人へのまとめ
– SpringBoot Actuatorを使うと各種情報が簡単にとれる
– 最小限の機能を使うには、依存ライブラリの追加と設定のみ
– システム稼働情報の参照、変更ができるようになるのでセキュリティには注意

# システム運用で必要な機能とは?

システムは作って終わりではなく、安定稼働させたり、どれぐらい使われているかなどの運用も大事ですよね。
DevOpsや最近のアジャイルでも、如何にリリース後のフィードバックを受けて次の戦略を取っていくかを大事にしています。フィードバックとは利用者から、「こうしてほしい」「こんな機能がほしい、いらない」だけではなく、システム運用者から「この機能が使われてないんだけど」とか「この機能が急に使われ始めた」という提供者側からの気づきも大事になります。

後者の今のシステムで必要な情報を取るための機能がSpringBootではSpringBoot Actuatorという機能が用意されていますので、そのご紹介となります。

# SpringBoot Actuatorとは?

SpringBootの拡張機能で、各種情報が簡単に

元記事を表示

ID を格納する変数を int/long でなく ID 型にする (Java)

# 概要

ID を持ちまわる際、通常なら int, long, String などに格納するわけだが、これだと下記のような場合にちぐはぐになって分かりづらくなる可能性がある。

“`java
public someMethod(int hogeId, int fugaId) { … }
“`

これをこうできればケアレスミスを防げる。(ちぐはぐにするとIDEがエラーとなって教えてくれる。)

“`java
public someMethod(HogeId hogeId, FugaId fugaId) { … }
“`

#### 注意ポイント

これは分かりやすくなる一方で、気を付けるポイントがある。

1. Jackson で JSON に/から変換可能であること
2. MyBatis でパラメータ/結果として扱えること
3. Spring MVC の URL パラメータや `@RestController` の 戻り値 として扱えること
4. Id のクラスを沢山作ることになるので個々には面倒な記載が要らないこと(親クラスに実装もたせる)
5. パフォーマンスが損

元記事を表示

Spring boot サンプルプログラムでポートを使えなくなった話

#ポートに誰かが居座っている
“`
Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.
“`
なんだこいつは。一回目は起動していたのに。
文脈か察するに、ポートがすでに使われているみたいだ。

#本当かどうか確認してみる
cmdから

“`
netstat -an
“`
で確認してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233158/f57704f7-c5a5-c025-1df5-ed9796c499e4.png)
確かに、8080がLISTENINGになっている。
これは別のアプリケーションが独占しているという認識でいいのだろうか。いったん前提をそれとして作業を、
**1. 動いているアプリを突き止めて終了する(仮定:多分前動かしたjavaがまだ居座っている?)**
**2. 1の仮

元記事を表示

Resultsetのnext()を、次があるかの判定メソッドと勘違いしていた件

##事象
とあるコードで、SELECTクエリを投げ、
その取得結果を**ResultSet型の変数rset**に格納している箇所がありました。

コード読解のためrsetの要素数を確認したいと思ったので、
以下のコードを途中に追記して実行しました。

“`java:example.java
int testIndex = 0;
while(rset.next()){
System.out.println(“rsetの要素数を確認したい”);
System.out.println(++testIndex);
}
“`

そうしたら、(それまでは正常終了していたのですが、)
その後ろの処理で、以下の例外が発生しました。

**java.lang.IndexOutOfBoundsException: Index: 0, Size: 0**

##読解のはずが壊してしまっていた
おかしいなと思って見てみたら、next()の理解が誤っていました。
現在の位置から次の1行へ進んでカーソルを当てる機能もあるのですね。

上記のコードで、最後の要素にカーソルがあたったままループを抜

元記事を表示

Eclipseのヒープサイズを増加させる(メモリ不足エラーを解消する)

# はじめに
Eclipseのプラグインを追加するとき、メモリ不足エラーと表示され実行できなかった。
そこでヒープサイズを増加させ、問題を解決した。

# 環境
Eclipse Photon Release 4.8.0

# 試みたが失敗したこと

Eclipseのインストール先にある”eclipse.ini”を書き換える。

“`
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
–launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913-144807
-product
org.eclipse.epp.package.jee.product
–launcher.defaultAction
openFile
–launcher.XXMaxPermSize
256M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.t

元記事を表示

【Java】じゃんけんの手の出し方 (paizaランク A 相当)

#paizaって?
[paiza公式サイト](https://paiza.jp/)
なんかプログラムを書いて、それにランク付けて評価してくれるところ
求人中の企業に対して自分のプログラミング能力をアピールできる
(実務的とは思えないがちゃんと解ければ最低限の能力があると見れるだろう)

#今回解く問題
[問題:じゃんけんの手の出し方](https://paiza.jp/works/mondai/skillcheck_sample/janken?language_uid=java&t=2fe1248410effabab1f3cfb75c9aace8)
・総勝負数N
・総指数M
・相手のハンド列S
の3つが入力として与えられ、総勝負数および総指数をきっちり使った時の相手ハンドに対する最大勝利数を割り出す問題
細かくはリンク先

#解答コードと結果
“`java
import java.util.ArrayList;
import java.util.Scanner;

/**
* じゃんけんの手の出し方 (paizaランク A 相当)
*/
public class AS001{

元記事を表示

プロジェクト毎にJVMを切り替えるには

#起動時、コンパイル時にJDK,JVMを切り替えたい

Javaの勉強をしているとプロジェクトによって別のバージョンを使いたい時がある。例えば私は最新のjava10以降のvar型推論が好きだけど、業務ではjava8しか使えない。常駐先によってはjava4のところも
あった。
あえて古い環境で勉強しないといけない事もあるわけです。
というより2020年現在、業務でjava10なんてまず使えない・・
eclipseとかだとjvmの指定する画面があるけど、実際コマンドラインではどうやって指定するのだろうか、という実験です。
#java -version でどこのJVMを読み込んでいるか確認する

java12でコンパイル済みのMain classがあり、
環境変数JAVAHOME には java12のJVMへのパスが設定されているとする。
その状態で任意のディレクトリにjava8のJVMのJVMを配置し、その中のjavaコマンドがあるディレクトリに入って

“`bash:bash
java -version
“`

コマンドを叩く。
すると

“`
java version “12.

元記事を表示

シンプレックス法をGUIでシミュレーションする

#1.プログラムの概要
 このプログラムは、線形計画法における、最大化関数の最適解を求めるプログラムである。線形計画法(最大化の場合)では、最大化関数と制約条件がある。最大化関数は、1次関数であり、最大化を目的とする関数である。制約条件は、1次不等式や1次等式であり、最大化関数の解の範囲を定める式である。ただし、このプログラムでは、最大化関数も制約条件もそれぞれ2変数(X,Y)とする(このプログラムにおける、最大化関数と制約条件の詳細については、3章の操作方法を参照)。最適解を求めるアルゴリズムとして、シンプレックス法がある。シンプレックス法は、実行可能領域のある点をスタート地点として、その点を最大化関数が大きくなる方に移動させることを繰り返す。点の移動が止まったときに、最大化関数が最適解となる。このプログラムでは、ユーザが最大化関数と制約条件を入力して定める。そして、入力された最大化関数と制約条件をもとに、シンプレックス法による点の移動をシミュレーションし、最適解を求め表示させる。ただし、このプログラムは、あくまでGUIでシンプレックス法の点の移動をシミュレーションしているだけであり

元記事を表示

[Android] TextView の textScaleX を自動調整する

# 何を作ったか
限られたスペースしか使えない状況で TextView に長い文字列を表示させようとして、途中で文字列が切れてしまい見た目がよろしくない経験は多々あるでしょう。解決策はいろいろあるでしょうが、ここでは textScaleX と呼ばれる TextView の属性に注目します。表示する文字の横方向への伸縮倍率を表す値であり、1より大きい値なら文字列を伸ばし、逆に1より小さな値なら文字列を収縮させます。TextView の最大横幅に収まり切らない長さの文字列を表示するときに、この textScaleX の値を自動で調節して文字列の長さを圧縮する View を作りました。クラス名は ExpandableTextView とでも呼びましょう。

## デモ画像
分かりやすさのため、ExpandableTextView の背景を灰色にしてあります。
![expandableTextView_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440643/b7d1f051-24a0-11f2-3

元記事を表示

[java] 例外をスローする

例外処理はjavaの基本であるが、認識違いをしていたので備忘録として残す。

##発生した問題
メソッドの呼び出し元に例外を投げたかったので、catchした例外をスローしようとすると、なぜかコンパイルエラーになっていた。

##実装
例えばタイムアウトエラーを投げる場合は以下の通りである。

~~~java
public void foo(){
try {
fetch();
} catch (SocketTimeoutException e) {
}
}

public Integer fetch(){
try {
//Http通信
} catch (SocketTimeoutException e) {
throw e;//ここでコンパイルエラー
}finally {
}
return number;
}

~~~

##認識違い
throwのほかに
th

元記事を表示

線形探索

#自己紹介
この記事が初投稿になるので簡単に自己紹介をしておこうと思います。現在(2020/02/07)大学2年生のもので理工学部で情報系の勉強を学んでいます。
記事を投稿しようとした理由は、「いつまでたっても初心者を抜け出せない!」と強く思うようになってきたため、ここらで環境を変えないと何も進展がないと思い投稿しようと思いました。Googleで「中級者 なり方」など脳筋のように検索していましたがよい結果が得られなかったため、**コードたくさん書けばいんじゃね?**と思いこれからたくさんコードを書いていこうと思います!初心者なのでその辺を理解したうえで温かい目で見守ってください笑

#線形探索
というわけで第1回目の投稿は線形探索です。なぜ線形探索にしたかは正直適当です。細かいことは気にせず学んでいきましょう。

これはあるn個のデータが登録されているデータの中から特定のデータ(キー)を探す処理を行うアルゴリズムです。配列にデータが格納されていると仮定して、その配列の先頭から末尾までスキャンしながら要素とキーを比較していきます。今回は1~9までのデータをもっている配列に対して探索をして

元記事を表示

Okhttp3でpfx証明書を使う

##### 追記履歴
2020/02/08 参考リンク追加
# はじめに
クライアント証明書を使ってHTTPS通信対応をすることになった時に書いたコードを会社を辞めてソースコードが見れなくなった時用にメモ代わりとして残しておく
何故Okhttpにこだわるかというと、大昔に苦しめられたもんだから大嫌いになったんですよねHttp(s)URLConnectionが
一部書き方が雑な部分や現役バリバリな人には釈迦に説法のような部分もあるかもですがご容赦をいt・・・ボク用のメモだから別にいっか!

# 事前準備
1.main配下(main、resと同じ階層)に「assets」フォルダを作成
2.assetsフォルダ内にpfx証明書を格納(今回は便宜上「hogehage.pfx」とするヨ)
3.「AndroidManifest.xml」にインターネット通信のパーミッションを追加(↓こんな感じ)
追加場所はmanifest間なら問題ないが、activityの間には書くな

“`AndroidManifest

元記事を表示

[Android] RecyclerView を用いた横スクロールする ListView の実装

# 何を作ったか
Android でおなじみの ListView ですが、水平方向へのスクロールは出来ません。そこで、RecyclerView を継承して横方向へスクロールする ListView のようなウェジェットを作ります。

# RecyclerView とは?
複数の View を良しなに表示するウェジェットです。かなり自由度が高いので、大抵のものはこれでできます。詳細に関しては、[【Android】RecyclerViewの基本的な実装](https://qiita.com/HideMatsu/items/a9ab48608e4f681d31fe) が詳しいです。

# 完成品
“`java:HorizontalListView.java

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
im

元記事を表示

Ruby、PHP、Java、JSでの書き方の違い

##はじめに
「Rubyでプログラミングの基礎を学んだから、次はjsやってみようかな!」

「書き方ごちゃごちゃになって、何が何だかよくわかんねー!!」

こんな人もいるのでは?

僕自身も以前、詰め込みすぎでパンパンになりましたので、書き方の違いをわかりやすくまとめてみました。
一つ一つ覚える必要はありませんので、この記事を、ストックしていただければと思います。
オブジェクト指向の理解も多少深まると思いますので、最後までご覧ください!

## 文字出力
基本となる文字の出力。言語によって処理のされ方が違うので難しいところですが、基本なのでしっかり押さえましょう。Javaはやっぱり記述が長いですねw

“`ruby:
#Ruby
puts “こんにちは”
“`
“`php:
#PHP
echo “こんにちは”;
“`
“`java
//Java
System.out.println(“こんにちは”);
“`
“`javascript
//JavaScript
console.log(“こんにちは”);
“`

## 変数代入

元記事を表示

【java】クラスとはOS、インスタンスとは仮想コンピュータだ

# 0. オブジェクト指向という「新しい概念」
 プログラミングの初心者で、今までC言語を使ったコーディングの経験しかない人にJavaを教えるのは、思いのほか難しい。(情報系の大学を想定。1年次にC、2年次にJavaをやる場合が多いそう。)
「クラスとは何か」と聞かれたら「オブジェクト指向で使う」と説明するが、
「ではオブジェクト指向とは何か」と聞かれたらどうだろう。

「世の中にはいろんなモノゴトがある。そしてモノゴトには状態と振る舞いがある。
だからいろんなモノゴトに対して、状態と振る舞いを集めてクラスの中にコーディングしていく。これがオブジェクト指向だ」
と答えて、相手は納得するかもしれない。
しかし、この後に続く「カプセル化」、「継承」の説明を聞いて、相手は混乱するかもしれない。
いきなり「状態と振る舞いを集めてモノゴトを表現する」と教わったかと思えば、次に「状態を振る舞いに閉じ込める」、「具体的なモノゴトは抽象的なモノゴトをケイショウする」と教わるなど、覚えることが多い。「理論より実践」な人にとっては『苦痛』だろう。
こうして、オブ

元記事を表示

人生ゲーム(イベント)

public class Event {

private int ahead;
private int back;
private String jobChange;
private int sum;

int getAhead() {
return ahead;
}

void setAhead(int a) {
ahead = a;
System.out.println(ahead + “マス進む”);
}

int getBack() {
return back;
}

void setBack(int b) {
back = b;
System.out.println(back + “マス戻る”);
}

String getJobChange() {
return jobChange;
}

void setJobChange(String jc) {
jobChange = jc;
System.out.println(“あなたの職業は” + jc + “になりました。”);
}

i

元記事を表示

HttpServletRequest のクラス・ファイルが見つかりません

##プロジェクトビルドでのエラー##

【メッセージ】
ビルド・パスが不完全であるため、プロジェクトはビルドされませんでした。
javax.servlet.http.HttpServletRequest のクラス・ファイルが見つかりません。

【対処】
Javaのビルドパス>ライブラリーで、Apache Tomcatが追加されていなかった。
Apache Tomcatをライブラリに追加したところ、エラーがなくなった。

(Eclipse)

元記事を表示

OTHERカテゴリの最新記事