- 1. Find Low/High Index
- 2. java エラー対策編
- 3. Spring Boot のコントローラーを MockMvc でユニットテストするサンプルコード
- 4. Spring-Batchのテストでハマった
- 5. テスタブルなコード
- 6. テスト困難なコードを書く
- 7. androidアプリのdebugビルド署名をリリース署名に変更すると、色々便利だ
- 8. [Heroku] SpringBootにNginxのビルドパックを実装してみた。
- 9. 【JAVA】interfaceとabstractの違いって???
- 10. SpringBoot1.5 + Gradle4.4 + Java8 + Docker 環境を Java11 に対応させる
- 11. Javaで日付処理 (LocalDate: 初期化編)
- 12. コードを複雑化させないために意識したいパターン集
- 13. Javaで作る自動販売機のサンプル(クラス分け)
- 14. Rotate Array
- 15. AspectJが書き換えたコードを無理やり覗いてみた
- 16. Java側からManagedBeanを取得する[JSF]
- 17. Hello Java Lambda
- 18. java 実践編 その1
- 19. ReactNative AndroidのBridge解説
- 20. ラムダ式をシリアライズして異なるJVM上で実行してみる
Find Low/High Index
#Find Low or High Index
##説明
整数型のソートされた配列と、指定された要素(key)が位置する最も低いインデックス(low index)と高いインデックス(high index)を返す。もし、指定された要素がその配列にない場合は-1を返します。配列の長さは数百万単位で、多くの重複要素を許します。##例
次の例では、low index と high index は次のようになります。key:1 low = 0 および high = 0
key:2 low = 1 および high = 1
key:5 low = 2 および high = 9
key:20 low = 10 および high = 10
java エラー対策編
今回はjavaで出るエラーについて書いて見ます。
# コンパイルエラー
ます初心者にありがちなコンパイルエラーと対処方法を紹介します。* セミコロン「;」が不足
* ダブルクオーテーション「”」が不足
* 全角空白文字
* ファイル名とクラス名が異なる
* 閉じ括弧「}」などあります。
## セミコロン「;」が不足
Javaの記述ルールは、1つの命令ごとにセミコロン「;」をつける決まりです。“`java:セミコロン「;」が不足
public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World!”) // ← セミコロン(「;」)が足りない
}
}
“`## ダブルクオーテーション「”」が不足
文字列の終わりのダブルクオーテーション「”」が不足していると、こんなエラーが起きます。“`java:ダブルクオーテーション「”」が不足
public class HelloWorld {
public static void
Spring Boot のコントローラーを MockMvc でユニットテストするサンプルコード
## 今回の環境
– Java 11 (OpenJDK 11.0.2)
– Spring Boot 2.2.2
– Thymeleaf 3.0.11
– JUnit 5.5.2
– Hamcrest 2.1## テスト対象のコントローラーと Thymeleaf テンプレート
“`java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class FooBarController {@GetMapping(“/”)
public ModelAndView topPage(ModelAndView mav) {
mav.setViewName(“index”);
mav.addObject(“userName”, “Alice”);
Spring-Batchのテストでハマった
# Spring-Batchのテストでハマった
## ハマった内容
– あるバッチにパラメーターを与えて実行する
– 1回目は成功するのだが、2回目以降は実行できない## ハマりの原因
– Spring-Batchにはジョブの実行結果を保存しておく機能がある
– ジョブ成功後に前回と同じパラメーターを与えて実行することはできない
– [Spring Batch – Rerun Job with same Job Parameter
](https://stackoverflow.com/a/44432024/2565527)“`
Going by the concept of Job Instances and Job Executions in Spring Batch,
you can’t start a COMPLETED job instance again
though you can launch same instance of job again &
again till its not COMPLETE ( and few more job
テスタブルなコード
# 概要
この記事は、以下に投稿したソースをリファクタリングするという記事です。テスト困難なコードを書く
https://qiita.com/oda-kazuki/items/bac33094e82b0f51da41# テスタブルなコードの結論
以下のようにコーディングしましょう。* クラスはどんどん分割する
* 最終的にひとつのことだけに専念させるようにする
* 特にグローバルなリソースへのアクセスは一箇所にまとめる
* メンバ変数の初期化やSingletonの利用はDependency Injectionで行う
* 外部ライブラリの生成箇所は場合によってはラップするファクトリクラスを作る
* 読みやすさを重視 (処理を簡単に理解できるようにするため)
* 早期リターンを心がける
* 変数のスコープは最小限に
* メソッド名や変数名にはこだわる
* Mapはなるべくは利用しないこれらをやることで、テストは非常に容易になります。それでは、前回のコードをリファクタリングしていきます。
# 凝集度を高める
[前回](http
テスト困難なコードを書く
# 概要
今回、ユニットテストしづらいコードの書き方を紹介したいと思います。
コードの言語はJavaです(他の言語は読み替えて下さい)。この記事に書いた内容をリファクタリングする記事も書きました。
https://qiita.com/oda-kazuki/items/b66fe3d4efec822497e6# 結論
* 可読性を悪くする
* 結合度を高くする
* 循環的複雑度を10以上にする
* 凝集度を低くする凝集度・結合度・循環的複雑度については以下でもまとめてます
https://qiita.com/oda-kazuki/items/a16b43dc624429de7db3# テスト困難なコードサンプル
今回、以下のような処理を想定します。* **ログイン処理**
* 入力:アクセストークン(指定しない場合、キャッシュがあればそれを利用する)
* 出力:ログインしたユーザー情報 (問題があった場合はnullを返却する)
* 処理:以下の処理を最大3回行う (スマホでのログインを想定し、通信でタイムアウトした場合時間を置いてリトライする
androidアプリのdebugビルド署名をリリース署名に変更すると、色々便利だ
##はじめに
androidアプリのdebugビルド署名、普通はリリースビルド署名と違いますね。まあリリースビルド署名のキーストアは重要なので、利用制限したほうがいいんですが、debugビルド署名をリリースビルド署名に変更すると、開発が色々楽になります。
リリース版にdebug版を上書きインストールしたりできますからね。
##やりかた
“`
signingConfigs {
//DEBUG版をリリースビルド署名したいときに、これを有効にする
debug {
storeFile=file(project.properties.storeFile)
storePassword=project.properties.storePassword
keyAlias=project.properties.keyAlias
keyPassword=project.properties.keyPassword
}
}
“`こんなんを追
[Heroku] SpringBootにNginxのビルドパックを実装してみた。
#[Heroku] SpringBootにNginxのビルドパックを実装してみた。
HerokuはDynoのポートをHerokuルータにバインドして、WebプロセスがHTTPリクエストを受け付けています。そのため、Webサーバーの手前に、Reverse Proxyサーバーを立てることができません。
しかしながら、NGiNXのようなソフトウェアをDynoと組み込むことにより、アプリケーションサーバーへ到達する前に、リクエストをさばくことができます。
今回はHerokuのレポジトリから参照できるこちらの[ビルドパック](https://github.com/heroku/heroku-buildpack-nginx)を使用することにします。
[Github](https://github.com/heroku/heroku-buildpack-nginx) にあるドキュメントですと、
1. /tmp/nginx.socketのUNIXドメインソケットに接続する。
2. /tmp/app-initializedにtouchにてファイル作成をするとあります。しかしながら、Javaで
【JAVA】interfaceとabstractの違いって???
#ざっくり違いを解説
######interface ・・・クラスじゃない(重要)######abstract ・・・クラス等の修飾子
##interfaceについて
######①変数
変数の宣言および実装ができる。
ただし、暗黙的に「public static final」が付く。“`java
interface noTsukaikata {
int Num = 6; //finalが付くので初期化できない。→実質的に定数扱いになる。
}
“`######②メソッド
抽象化メソッドのみ宣言できる。“`java
interface noTsukaikata {
void method(); //抽象化メソッドの宣言(interface内のメソッドはabstract句が付与される)
// abstract void method();に自動変換される。
}
“`実は、default句かstatic句を使うことで実装もできる。
“`java
interface deJisou{
//default句を使うことで、interface内にメソッドを
SpringBoot1.5 + Gradle4.4 + Java8 + Docker 環境を Java11 に対応させる
この記事は、[Java Advent Calendar 2019](https://qiita.com/advent-calendar/2019/java) 15日目の記事です。
## はじめに
Java8の無償サポートが2019年1月に切れてから一年ほど放置してましたが、
今回時間ができたので8以降初のLTSであるJava11への更新を行いました
その時のメモですと書き始めようとしましたが、OpenJDK8は2023年6月までサポートされるらしいので、
OracleJDKからOpenJDKに変えるだけでよかったのでは……
でもやってしまったので記録しときます## JDKのアップデート
### AdoptOpenJDK11をインストール
以下のコマンドを入れると最新のJDKがインストールされる
“`
brew cask install adoptopenjdk
“`しかし、現状ではJDK13が入ってしまうので、LTS版であるJDK11を入れるにはバージョンを指定する必要がある
ということで公開されているバージョンを検索“`
$ brew searc
Javaで日付処理 (LocalDate: 初期化編)
# 日付の取り扱い
日付の取り扱いに関しては Java 8 から新しいAPIが導入されました。
今まで標準のAPIで Date, Calendar を使用していた日付操作が LocalDate, LocalDateTime 等に変わってきています。# 日付の初期化
今回は LocalDate の簡単な使い方と使用時の注意点、実はこんな便利な使い方があったというものを紹介していきます。
後半には取り扱い方の注意点を紹介していますので最後まで見てみてください。## 現在日で初期化
現在日を取得するために Java8 以前では、以下のようなコードを書いていました。“`java
Date currentDate1 = new Date();
Calendar currentDate2 = Calendar.getInstance();
“`しかしこのコードでは日付だけでなく時間も含まれているため日付のみ使用する場合には注意が必要でした。
例えばある日付の間にある情報を取得したい場合にこの時間が影響してしまい、意図しないデータがとれてきてしまうこともあります。
意図しない動き
コードを複雑化させないために意識したいパターン集
# はじめに
はじめはシンプルだったコードも積み重なる機能追加や変更、バグ修正等などによって、徐々にコードが複雑化し、修正コストの増加や品質低下に繋がります。
これはある程度の規模を持つプロダクトでは至って自然なことであり、そうならないようにするためには意識して設計しなければいけません。ここではコードを複雑化させないために普段意識している手法やパターンを紹介します。(DDDやClean Architecture成分多め)
また本記事で登場するコードはJavaですが、Javaを知らなくてもある程度は理解できるかなと思います。あと、割とまとまりもなく幅広い範囲でダラダラと書いてしまい長いです…
以下項目ごとのアンカーリンクとなっておりますので興味がある項目のみどうぞ。– [getter/setterがよくない理由](#gettersetterがよくない理由)
– [デメテルの法則と尋ねるな命じよ(Tell, Don’t Ask!)](#デメテルの法則と尋ねるな命じよtell-dont-ask)
– [関心の分離 : Separation of Concerns (SoC)]
Javaで作る自動販売機のサンプル(クラス分け)
前回書いた自動販売機:https://qiita.com/TakumiKondo/items/e93aa60031e2fe09d969
をクラス分けしました。“`Items.java
package vm;import java.util.HashMap;
import java.util.Map;public class Items {
private Mapitems; // 商品リスト
private MapavailablePurchases; // 購入可能商品 // コンストラクタ(商品リストの初期化)
Items() {
this.items = new HashMap();
items.put(“コーラ”, 100);
items.put(“オレンジジュース”, 120);
items.put(“水”, 80);
}// 最低購
Rotate Array
# Rotate Array
##説明
整数型の配列と整数N(回転数)の二つの引数が渡されたとき、配列の要素をN回(マイナスは左へ、プラスは右へ)
回転させた配列にしよう。##例
以下の配列が渡されたとしよう。
![Screen Shot 2019-12-18 at 10.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405022/538e236c-ffcf-ac2a-29ca-d16bd3e3fb39.png)
もし、回転数Nが−1の時は、全ての要素が左側へ一つずつずれる。
![Screen Shot 2019-12-18 at 10.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405022/512da7cf-f899-1fb8-590c-ae7ac2d118a6.png)
また、もし回転数Nが2の場合は、全ての要素が右側へ一つずつ二回ずれる。
![Screen Shot 2019-1
AspectJが書き換えたコードを無理やり覗いてみた
この記事は、[富士通システムズウェブテクノロジー Advent Calendar](https://qiita.com/advent-calendar/2019/fsweb)の19日目の記事です。
(お約束)本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。## はじめに
この記事は、JavaでAOPを実現するOSSであるAspectJが、どんなコードを生成しているのかを目視確認してみよう!というものです。AOP自体は昔から使われている技術ですが、個人的にはあまりプロジェクトで使われている印象がありませんでした。が、最近になって自分の周りでAOPを使っているプロジェクトをちらほら見かけるようになり、今後使う人が増えるかも?と思い記事を書いてみました。
AOPは使ってみると便利なのですが、正直裏で何が起こっているのかよくわからない部分があります。
こういうところの理解を深めるために、本記事ではAOPでウィービングした際のコードを覗いてみます。## 前提知識
AOPってなんぞや!
みたいな話は既にいろんな記事でまとめられているので割愛します。
以
Java側からManagedBeanを取得する[JSF]
#目的
JSFを使っているが、ManagedBeanをJava側から取得したい。? 「普通にインスタンス生成すりゃええんじゃ?」
じゃなくて ManagedBeanとして取得したいんじゃ!
というときの解決法
#解決
とりあえず以下にBeanの例を書きます。
中身はそれっぽく適当に書いています。“`java:HogeBean.java
/* ↑省略 */
@Named(“hoge”)
@ManagedBean
@ViewScope
class HogeBean implements Serializable {private static final long serialVersionUID = 1L;
private String fuga;@PostConstruct
public void init() {
fuga = “アイス”;
}public String getFuga() {
return fuga;
}
}
“`で、取得する方法の例
Hello Java Lambda
簡単な要件を満たすコードを書くにあたって、Lambda を使わないケースと使うケースを比較してみます。
以下のような数字のリストを用意し、100以上の分だけ2倍したものを合算する処理を考えてみます。
仕様:100以上の分だけ2倍したものを合算する“`java:number-list
final Listnumbers = Arrays.asList(50, 100, 10, 400, 120, 30, 220);
“`##### Lambda を使用しないケース
たとえば、リスト内の値を一つずつチェックし、もし100以上であればその数値を2倍し、total に加算するという流れが考えられます。
これ位の計算であれば、シンプルで分かりやすく大きな問題はないと思われます。
ただ、仕様(100以上の分だけ2倍したものを合算する)に対して、それを実現する一つの方法として ”数字を一つずつチェックする” というエンジニアのアイデアがそこに挟まれるため、やや誤解を与えやすいコードになる可能性があります。“`java:without-lambda.java
in
java 実践編 その1
今日はjavaの簡単な扱いかたについて
書きます。なお先日の投稿であるJDKについて終わっている前提で書いて行きます。
# 基本手順
少しjavaはrubyと比べて手間がいるコードなので
手順を書いて行きます。1,.javaファイルを作成してjacaコードを書く
2,上記のファイルをjavacコマンドでclassファイルを作成する
3,クラスファイルを実行する。これが簡単な流れです。
基本コードを書いてもコンパイルしてクラスファイルを作らないと
javaは使えないのでjavacコマンドでクラスファイルに変換作成するわけです。## 基本書式
まず基本的な書式を書いて行きます。
他の言語と比べ前準備のコードがかなり長いです。“`java:基本書式.java
class ファイル名(クラス名){
public static void main(String[] args){
(処理内容)
}
}
“`例はこちら
“`java:HelloJava.java
class HelloJava {
public static void main
ReactNative AndroidのBridge解説
## 機能
– Native Modules
出来ること
・関数の作成
・イベントの通知
・コールバック– Native UI Components
出来ること
・Viewの作成
・Viewのイベントの通知## Native Modules
ダイアログを表示するModuleを例にします。**[機能]**
1, Androidのダイアログを表示する。(関数の作成)
2, ダイアログの”OK”ボタンがクリックされたらコンソールに”true”が表示される。(イベントの通知)
3, “DATE”ボタンがクリックされたら現在時刻が表示される。(コールバック)“`java:DialogModule.java
public class DialogModule extends ReactContextBaseJavaModule {
// コンストラクター
public DialogModule(@NonNull ReactApplicationContext reactContext) {
super(reactContext);
}
ラムダ式をシリアライズして異なるJVM上で実行してみる
[Java Advent Calendar 2019](https://qiita.com/advent-calendar/2019/java) の19日目です。
—
Java8から導入されたラムダ式はシリアライズが可能で、先達の記事の通り様々な実装パターンがあります。
* [Lambda式をシリアライズする – CLOVER?](https://kazuhira-r.hatenablog.com/entry/20150425/1429969937)
* [シリアライザブルなラムダ式 — 裏紙](https://backpaper0.github.io/2015/08/25/serialized_lambda.html)
* [Javaラムダ式メモ(Hishidama’s Java8 Lambda Expression Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/lambda.html#h_serialize)シリアライズ可能ということはデータストアにロジックを永続化、異なるJVMへの移送・実行が可能という