聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

今更ながらJavaでプレミアムフライデーを求めるロジックを考えた

www.waenavi.com これを読んで、Javaだとどうやって書けばいいか考えてみた。

まず、Java8以降は日付は LocalDate を使うようなのでAPIを読む。

LocalDate (Java Platform SE 8)

月末日をまず求めて、その日が金曜日じゃなかったら1日ずつ遡って曜日をチェックしていけばいいかな、と思いながら last をキーワードにしてページ内を検索してみる。

result = localDate.with(JULY).with(lastDayOfMonth());

という一文が出てくる。 これはいったい?と思い、ちょっとページを上に動かすと with というメソッドの説明だった。

https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html#with-java.time.temporal.TemporalAdjuster-

説明文を読んでみると、

一般的な調整の選択は、TemporalAdjustersで指定します。

と書かれており、TemporalAdjusters へのリンクが貼られている。

TemporalAdjusters (Java Platform SE 8)

リンクをクリックして、どんなメソッドがあるのかなと眺めると

lastInMonth(DayOfWeek dayOfWeek) 一致する最後の曜日を持つ同じ月の新しい日付を返す、月の最終アジャスタを返します。

という今回の用途にバリバリ使えそうなメソッドの説明が載っている。

https://docs.oracle.com/javase/jp/8/docs/api/java/time/temporal/TemporalAdjusters.html#lastInMonth-java.time.DayOfWeek-

どうやらこれを使えば欲しいものが求められそう。

念のため、DayOfWeek へのリンクもクリックしてどんな定義があるのか眺めてみる。

DayOfWeek (Java Platform SE 8)

FRIDAY 「曜日」金曜日のシングルトン・インスタンス

という記述が確認出来たので、金曜日を求めるには FRIDAYという列挙型定数を使えばいいことが分かった。

あとはこれらを組み合わせてプログラムを書くだけである。

というわけで書いたのがこのプログラム。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.DayOfWeek;
import java.time.LocalDate;

import static java.time.temporal.TemporalAdjusters.lastInMonth;

public class LastFriday {

    private static final Logger logger = LoggerFactory.getLogger(LastFriday.class);

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

        var lastFriday = LocalDate.of(2017,2,24);
        logger.info(lastFriday.toString() + " " + lastFriday.getDayOfWeek());
        for(int i = 0; i < 99; i++) {
            lastFriday = lastFriday.plusMonths(1).with(lastInMonth(DayOfWeek.FRIDAY));
            logger.info(lastFriday.toString() + " " + lastFriday.getDayOfWeek());
        }

    }

}

まぁQiitaだと1年半ほど前に既に既出なんですけどね。

qiita.com

答えをすぐに検索するのではなく、JavaDocの中をどのようなキーワードで検索して書いたかの備忘録としてネットの片隅にメモしておく。

オリジナルのmaven archetype を作った

これは何?

デフォルトでmavenコマンドからJavaプロジェクトを作成すると、Java5+JUnit3.8.1のプロジェクトが出来る。 流石に古いので最新バージョンのプロジェクトが出来るようにオリジナルのarchetypeを作成したときのメモ。

作成手順

Maven – Guide to Creating Archetypes を見ながら手を動かせばそれなりのものが出来る。

作ったもの

github.com

メモ

  • JUnit5の依存関係はJUnit 5 User Guideチュートリアルにあるmavenプロジェクトの記述をコピーした。
  • ただ、サンプルプロジェクトの記述をコピーしただけだとeclipseでJUnit5を動かそうとすると落ちるので記述の追加が必要。

qiita.com

感想

意外に簡単だった。

"git configをプロジェクトによって使い分ける" 導入メモ

"git configをプロジェクトによって使い分ける" 導入メモ

Gitアカウントを使い分ける必要が生じたので qiita.com

を見ながら作業しようとしたら上手くいかなかったのであれこれ試行錯誤したときの個人的なメモ。

うまくいかなかったところ

gitconfigを見ながら書かれている通りに書いたつもりなのに、使い分けが出来ていなかった

原因

"Git v2.13.0(2017/05/10リリース)でgit configにConditional includes(条件付きインクルード)という機能が実装され" とあるのに、ローカルのGitのバージョンが2.9だった。

やったこと

sbtをインストールする · Scala研修テキストchocolatey.org

というツールがあるのを知った。 コマンドで一括更新できるという部分に魅力を感じていたので、まずは chocolatey をインストールする。

chocolatey のインストール

Installation に書かれているコマンドを実行すればいいが、PowerShellを管理者モードで起動しないとエラーになる、というところで一度はまる。 管理者モードで立ち上げた後はハマリポイントは無かった。

Gitのインストール

  • chocolatey.exe list -v -e Git でGitがバージョン管理下にあることを確認する。2.19が存在することを確認出来た。
  • chocolatey.exe install Git でGitをインストールする。
  • git --version で2.19がインストールされていることを確認する。

改めて git config を編集

Windowsなので\\でエスケープしないといけないのかなと思い、パスを\でエスケープしてみたが設定が反映されない。 検索したら stackoverflow.com を発見したので読んでみる。 回答の記述がスラッシュでの記述だったので、スラッシュに書き直してみる。 確認コマンドも回答に書かれているように、

git config --show-origin --get user.email

で確認してみた。

[includeIf "gitdir:C:/Users/<users>/Documents/sampledir/"]
  path = .gitconfig_work

と定義したとき、

sampledir  ← .gitconfig の定義が使われる
   ├ aaa  ← .gitconfig_work の定義が使われる
   └ bbb  ← .gitconfig_work の定義が使われる

ということが分かった。

コツコツとプレイする

モンスターストライクというゲームが好きで毎日コツコツ遊んでいる。

このゲームは、極論を言えばクエストをクリアしてゲットできるモンスターを99体集めて運極にするゲームなんである。

99体集めるためには、コツコツとプレイしないといけないし、クエストにピッタリとはまる手持ちのモンスターがいるかどうかも重要な要素なので、作りたくても作れない状況はある。

また、手持ちは充実していても、プレイヤーのスキルやクリアするための知識が足りていないとクリアできない。

なので、欲しいモンスターがいたら、ゲットするために色々と事前準備をしてから挑むんである。

まぁそれでも自分に合わないクエストは途中で放り投げてしまうんだが…

 

最近、ふっとシステム開発や既存のシステム修正も似てるなぁと思うようになった。

コツコツとプログラムを組んだりテーブル設計を繰り返していくことで一つのシステムが出来上がる、あるいは新機能を追加できる。

でも、そのために必要な事前準備を怠ると精神的に辛いだけでゴールは達成出来ない。

それでもゴールするにはコンティニューしたり(残業だったり休日出勤だったり)ガチャ引いて人手を増やしてどうにかコツコツと実績を積み上げるんだけど…

 

それでも自分に合わないなぁというとき、それは使っているフレームワークが肌に合わない、あるいは使いにくいときなのではなかろうか。

何とかして手を動かせば、いつかゴールは見えるんだけど、手が全く動かない、今はそんな心境に陥っている。

ゲームだったらこのクエストはちょっとやめて(結果としてずっとやらない)他のクエストをやろう、ということが出来るんだけどお仕事はそうもいかないのが辛いところだなぁ。

 

Java9で意外なものが非推奨(Deprecated)になっていた

Java10を使って勉強のため、本を写経していたら

Double d = new Double(99.999);

こんな感じのプログラムの場所で取り消し線が引かれてアレ?となった。 調べてみたら、Java9でコンストラクタに値を入れる系が非推奨になっている。

Double (Java SE 9 & JDK 9 )

これからはこう書こうね、ってことのようだ。

Double d = Double.valueOf(99.999);

Doubleを例にしたが、IntegerやFloatなども非推奨になっているので注意が必要。
下記リンク先にコンストラクタの書き方で非推奨になったものがまとまっているのでチェックしておくとよさそう。 Deprecated List (Java SE 9 & JDK 9 )

Java入門者がJava8までをベースに書かれた本やチュートリアルのサンプルプログラムを写経していると謎の取り消し線が出てアレレ?ってなりそうだなと思った。
JavaDocを見れば答えがちゃんと書いてあるんだけども、入門者はJavaDoc見ないだろうしなぁ。

というか、Java11が正式リリースされたときにJava9以降で非推奨になった一覧も改めて公開されるのだろうか?
それに、非推奨になったメソッドはいつ消えてもおかしくないってことらしいけど、いつのバージョンで消えちゃうのか…
Twitterで「forRemoval=true」じゃないから消えないぞ、と指摘を戴きました。感謝感謝。

追記

なぜ非推奨になったのか?の理由はこれかな?
[JDK-8176335] Release Note: Deprecation of Boxed Primitive Constructors - Java Bug System
メモリの使用量節約みたいなことが書いてある。

Eclipse Photonをzipでダウンロードしたいとき

Eclipse Photonがリリースされています。 www.eclipse.org

ですが、Eclipseのトップページからだと実行ファイル形式しかダウンロードできないようなので、Packagesを選んでダウンロードしたいとき用にURL直リンク。

www.eclipse.org

Mavenプロジェクトをオフラインで使うときの手順メモ

お仕事で調べたのでメモしておく。

  • 雛形となるプロジェクトは既にオンラインで作成済で、そのプロジェクトをオフライン環境に持ってくるケースを想定している。
  • IDEeclipseを前提にしている。

事前作業

ダウンロード

作成済のプロジェクトがあるフォルダ上で以下のコマンドを打ち、jarファイル、ソース、JavaDocをダウンロードしておく。
参考:mvnコマンドで、ソースとJavadocのJARを取得する - CLOVER

mvn dependency:sources -Dmaven.repo.local=../localrepos
mvn dependency:resolve -Dclassifier=javadoc -Dmaven.repo.local=../localrepos
mvn dependency:go-offline -Dmaven.repo.local=../localrepos

ファイルコピー(or移動)

ダウンロードしたファイル全てをローカルリポジトリとして設定したいフォルダに移す。
以下の記述では、C:/maven/localrepos に置くのを想定している。

作業

setteing.xmlを新規作成する

setting.xml を新規で作成し、localRepositoryとofflineの値を書き換える。
新規作成したsetting.xmlはどこに置いてもよいが、mavenフォルダの真下に置くのが他の人に指示する手順を考えるとわかりやすそう。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <localRepository>C:/maven/localrepos</localRepository>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline>true</offline>
  <pluginGroups/>
  <servers/>
  <mirrors/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
</settings>

eclipseの設定変更

eclipseを開き、[ウィンドウ] → [設定] → 「maven」 → 「ユーザー設定」でユーザー設定の欄に C:\maven\setting.xml と書く。

mavenプロジェクトを取り込む

ファイル→インポート→Maven→既存Mavenプロジェクト で mavenプロジェクトを取り込む。

以上。