JUnit5 を IntelliJ IDEA から実行できない #IntelliJIDEA

TL;DR

  • Maven のプロジェクトに JUnit5 の依存を追加した
  • コマンドラインからは通るが、 IntelliJ IDEA からの実行がエラーになる
  • junit-platform-launcher を依存に追加したら実行できるようになった

環境

詳細

公式の 4.2.2. Maven を見て依存を追加。

junit-jupiter-apijunit-jupiter-engine を追加。

これでコマンドラインから ./mvnw test でテストは実行できるようになった。

しかし IDEA から GUI でテスト実行しようとすると下記のようなエラーが出てしまう。

Error:java: エラー: リリース・バージョン5はサポートされていません

junit-platform-launcher を依存に追加すると解決した。

最終的な pom.xml には下記のような内容が記載してある。

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.6.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

4.1.1. IntelliJ IDEA に古いバージョンは junit-platform-launcher , junit-jupiter-engine, and junit-vintage-engine を指定しろと記載しているものの、新しいバージョンではよしなにやってくれそうなことが書いてあるのでよく分からない。

参考

905. Sort Array By Parity

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/sort-array-by-parity/

  • 正の整数からなる配列を渡される
  • 偶数 -> 奇数の順にソートする
  • 偶数 -> 奇数であれば他の順序は問わない

Solution

class Solution {
    public int[] sortArrayByParity(int[] A) {
        return IntStream.concat(
                Arrays.stream(A).filter(i -> i % 2 == 0),
                Arrays.stream(A).filter(i -> i % 2 != 0)
        ).toArray();
    }
}

Impressions

  • Stream の結合には Stream#concat がある
    • 2つ以上なら Stream#of を使えばいい
    • 今回は int 配列なので IntStream

References

転職ドラフトに参加してみました

はじめに

こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています。

job-draft.jp

転職のあらましは別記事に書いてあるのですが、転職ドラフトにも参加してみたので、この記事を書いています。

su-kun1899.hatenablog.com

転職ドラフトに登録したきっかけ

もともとかなり前、それこそサービス開始したくらいの時に登録だけはしてあったんですが、レジュメ書くのがめんどくさくて放置していました笑

今回転職を考えたタイミングで

よさそうな会社ってどこがあるだろう?

転職ドラフトに参加してる企業から探してみるといいかも

どうせなら転職ドラフト参加してみるか

といった流れです。

レジュメ書くのは大変

レジュメは項目が多く、書くのはそれなりに大変で、さらに審査があります。

普通に書いてたら審査通るって人もいるんですが、僕は一度審査落ちました。

いわゆる職務経歴書のノリで書くよりは、プロジェクトベースで出来るだけ具体的に書くのがよさそうです。

  • 🙅 XXX の Web サービス開発していました!
  • 🙆 XXX に UnitTest と CI を導入しました!

大変ではあるんですが、キャリアシートの棚卸しって疎かになりがちなので、いいきっかけにもなりました。

転職ドラフトの指名状況

希望年収を書いてなかったのと、転職意欲が高いことを明示していたこともあるんでしょうが、10社以上から指名頂けました。

転職ドラフトのいいところ

事前に金額をはじめとした条件面の提示から始まるのは、効率的に転職活動できると思います。

提示年収に賞与は含めるか、裁量労働か、開発マシンは選べるかといったあたりまでかなり細かく明記されます。

お金を軸に転職する場合でなくても、下限(これくらいはもらえないと困る)は設定している人が多いのではないでしょうか。

提示額が少なかった場合でも、「興味はありますが、正直この待遇では厳しいです」というのを伝えてから会話することができます。

最終的なオファーと希望の乖離が大きいと、労力と時間とガッカリ感のコンボがすごいので(過去にそういう経験あります)

また、指名をくれた企業の殆どが、かなり丁寧に指名理由を書いてくれます。

レジュメやレジュメに記載したアウトプットをしっかり見た上で指名してもらえるのは納得感もあるし、うれしい気持ちになります。

転職ドラフトの選考

実際に足を運んだ後は、普通の転職活動と基本的に変わらないと思います。

スケジュール調整やメッセージのやりとりが転職ドラフト上で行われることくらいでしょうか。

採用保証ではないので、普通に選考で落ちたりもします。

転職ドラフトを使ったことがない方へのメッセージ

レジュメを書いたりするのはそれなりに大変ですが、転職を少しでも考え始めた人は試しに参加してみてもよさそうです。

キャリアの棚卸しのきっかけにもなりますし。

逆に転職をまったく考えてない場合だと、面倒くささのほうが勝ってしまうかも知れません笑

この記事を見て参加してみようと思った人は是非僕の招待コード【 GTXI 】を使ってみてください。

オライリー本とかがプレゼントでもらえるみたいです。

832. Flipping an Image

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/flipping-an-image/

  • バイナリマトリックス(二次元配列)が渡される
  • 各行をひっくり返した後、反転させる

Solution

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        return Arrays.stream(A)
                .map(this::flip)
                .map(this::invert)
                .collect(Collectors.toList())
                .toArray(new int[][]{});
    }

    private int[] flip(int[] array) {
        int[] flipped = new int[array.length];
        int count = 0;
        for (int i = array.length; i > 0; i--) {
            flipped[count] = array[i - 1];
            count++;
        }
        return flipped;
    }

    private int[] invert(int[] array) {
        return Arrays.stream(array).map(i -> i == 0 ? 1 : 0).toArray();
    }
}

Impressions

  • flip は Collection にするより配列のままの方がやりやすそうだったのでそうした
  • 問題とは関係ないが、多次元配列を文字列にするのに Arrays#deepToString があるのを知った

就職します

就職活動終わりました

ブログにも書いてたんですが、年末で前職を退職して就職活動してました。

無事に次のところも決まったので、どんな感じだったのか軽くまとめておきます。

su-kun1899.hatenablog.com

謝辞

ブログや SNS で公開してたこともあり、本当にいろんな人から沢山の会社を教えてもらいました。

数年(数十年?)ぶりに連絡とってくれた人から親戚まで笑

大なり小なり自分のことを知ってる人から頂ける情報というのは職場探しにあたって大きな助けになりました。

ありがとうございました。

活動期間

  • 2019年12月8日に求職エントリをPOST
  • 話を聞き始める
  • 年明けから本格的に行脚をはじめる
  • 2020年1月中頃から徐々に選考へシフト
  • 1月末頃にオファーが出そろう
  • 2月頭に就職先を決める

以前から声をかけてくれていたところは早くから具体的な選考を受けてたりもしましたが、大体こんな感じです。

1月は学生時代の就職活動を思い出すくらい色んなところに行っていました笑

使った媒体

実際に話を聞きに行った会社だけでも、20以上あると思います。

当初は、自分から積極的に探すことやエージェントに頼むことも考えていたたんですが、すぐにキャパオーバーになりました。

落ち着いて考えてみれば、10人が紹介してくれたらそれだけで10社になるし、1日3社回っても3日以上かかるんですよね。。

アクティブに探した会社は基本的にないです。
(コンタクトはアクティブに取った場合でも、誰かから紹介してもらったとか)

話を聞きに行く

最近は採用前提の媒体でも「まずはカジュアル面談」というところが多いと思うんですが、会う前に自分の状況を伝えるようにはしていました。

「御社のお話も聞きたいんだけれども、自分は本格的に探しているので、そちらも突っ込んだこと聞いてくれて構わない」といった感じです。

カジュアル面談は転職を考えていないときも時々行ったことはあるのですが、職探しの熱量が高いことを伝えておくと、かなり具体的な話ができるような気はします。

たくさんの企業とお話してみてよかったなぁと思うのは、会話の中で自己分析がかなり進むということです。

「自分はこういうことが (やりたい|やりたくない) んだなぁ」とか「こういう価値観なんだなぁ」と気付かされることがとても多かったです。

そうすると、いざ選考に進むときのも自分の中での動機づけはかなりしっかりされるので、いろんなことが言語化された状態で臨めました。

あと就職とは関係ないところで、世の中にはいい会社がたくさんあるというのを知れたのはよかったです。

自分が当事者として働くにはフェーズやタイミング等の変数が絡みますが、企業や組織、お会いした人たちが取り組んでいることを応援したいというところは多かったです。

「自分も早く次を見つけて、負けじと頑張らねば」と、労働意欲を刺激されました。

逆に大変なのはやはり時間と労力の問題で、このやり方は退職済だったからできたと思います。

日頃から情報収集大事だよなと思いつつ、話を聞きに行ったのが半年前だったら、会社も応募者もフェーズが変わってる可能性は十分にあるだろうし。

この辺は難しいところです。*1

選考

実際に選考に進んだのは 6 社くらいです。

大体 3 回くらいの面接で終わるところが多かったです。
カジュアル面談と比べてさすがに少し緊張はしましたが、割と雑談っぽい感じが多かった気がします。 *2

選考とは少し違うかもしれませんが、体験入社だったり、今思えばあれは選考だったのかなという会食もありました笑

コーディングテストのある会社は少なかったです。
面接の中で、「これはスキルチェックの観点で聞いてるんだろうな」と思う質問は当然ありましたが。

関係ないですが、コーディングテスト対策でやってみた LeetCode*3 がちょっとした気分転換にいいので、今も時々トライしています。

面接は誰が出てくるかでかなり印象が変わってくる気がします。
採用に会社がどういうスタンスなのかが表れる部分でもあると思うので。

自分は下記のような人たちと話せるとうれしいなという感じです。

  • 開発チームの偉い人(いるなら CTO とか)
  • 開発チームの現場の人
  • 開発者じゃない偉い人(事業部長とか)
  • 偉い人(社長とか)
  • 開発者じゃない現場の人(プロダクトオーナーとか)

よく聞かれたこと

何社かに聞かれて、ちょっと思うことがあった質問。

マネージメントか技術か

マネージメント方面に行きたいのか、技術を突き詰めたいのか、みたいな質問はすごくよくされました。

その度に、「そういう風には考えてないです」と答える厄介な応募者でした笑

マネージメントも技術もどちらも開発の場に必要なもので、「マネージャーという役割をおく」のは実装のひとつでしかないと考えています。

濃淡はあれど、役割としてそこを求められるのは、少なくとも今の自分のキャリア志向とは違うという回答をしていました。

ただ採用する側からすると、ポジションで探すのも普通だと思うので、面倒くさい応募者だったと思います。

XXXX を作るとしたらどう作りますか?

この質問は多分、採用する技術スタックだとか選定理由だとかを聞いて、スキルレベルみたいなものをみたいんだと思います。

ただ自分みたいな思考の人間だと、「それは何で作るんですか?」「本当に作らなきゃいけないんですか?」みたいな返しになってしまうので、お互いに微妙な気がしました。

それよりは、これまで実際に携わったサービスとかベースで語るほうがやりやすいのではないかなぁ。
(ゼロから同じものを作り直すとしたらどうしますか?で、同等の会話はできると思うし)

職務経歴書

選考に進むときには求められることが多かったと思います。
(あればください、くらいの温度感だったかも)

僕の場合は Wantedly と LinkedIn に割としっかり書いていたので、その内容で事足りたというのはありそうです。

もう少し補足して書いたものは、個人で使っている esa にまとめていました。
なので、求められた場合は esa の共有機能 で生成した URL を渡していました。

紙の書類を求めるところはなかったですが、 PDF で渡せというところが一社だけありました。

オファー

ありがたいことに複数社から内定をいただき、かつオファーが出揃うまで返事を待ってもらえました。

待遇面は下限が満たされていれば、後は自分が何を軸に選ぶかになってくると思います。

そもそもで行きたいと思うところしか選考に進まなかったので、相当に迷いました。

金銭的なことはある種もっとも客観的な評価でもあるし、技術的に面白そうな環境はそれだけでも魅力的です。

ギリギリまで迷ったんですが、ふと自分の転職エントリや職務経歴書を見返して、原点回帰というか、「一番こういう思いで働ける場所」という軸で選びました。*4

  • 最高のチームで誰かのライフスタイルを変えるようなプロダクトを作りたい
  • 何を課題として、何を解決策としてやっている(作っている)か
  • どんな価値観・文化か
  • どんな人がいるか
  • etc

断るのが一番心苦しかったです。。

入社

2/16から新しい会社で働き始めます。

なので、もう少しだけ無職を満喫します笑

新しい会社でのことは、また追々ブログ等に書けたらいいなと思っています。*5

ウィッシュリストはこちら

*1:それを解決できるのが (少なくとも従来のような) 転職エージェントでない気はする

*2:先方の配慮もあったのだと思う

*3:https://leetcode.com/

*4:あくまで比較のうえなので、他の会社も魅力的なことは前提

*5:所属先を隠すつもりもないですが、積極的に明かすつもりもない

1299. Replace Elements with Greatest Element on Right Side

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/replace-elements-with-greatest-element-on-right-side/

  • 配列の右側で最大の値に置き換えた配列を作成する
  • 配列の最後に -1 をつける

Solution

class Solution {
    public int[] replaceElements(int[] arr) {
        List<Integer> nums = Arrays.stream(arr).boxed().collect(Collectors.toUnmodifiableList());

        int[] replaced = new int[nums.size()];
        int max = extractMax(nums.subList(1, nums.size()));
        for (int i = 0; i < (nums.size() - 1); i++) {
            if (nums.get(i) == max) {
                max = extractMax(nums.subList(i + 1, nums.size()));
            }
            replaced[i] = max;
        }
        // last element
        replaced[replaced.length - 1] = -1;

        return replaced;
    }

    private int extractMax(List<Integer> list) {
        return list.stream()
                .mapToInt(Integer::intValue)
                .max()
                .orElse(0);
    }
}

Impressions

  • 最大値を毎回計算していたら Time Limit になってしまった
  • 一度計算したら、その最大値が出てくるまでは計算不要にした

数字の配列を降順にソートする #java

概要

  • 数値の配列を降順にソートされたリストにする
  • Stream の sorted を使う
  • Collections の reverseOrder で降順になる

サンプル

int[] nums = {3, 6, 8, 1, 5, 4, 7, 9, 2};

List<Integer> sorted = Arrays.stream(nums).boxed()
        .sorted(Collections.reverseOrder())
        .collect(Collectors.toList());

System.out.println(sorted); // [9, 8, 7, 6, 5, 4, 3, 2, 1]

補足

  • sorted には Comparator を渡せる
  • Comparator には comparing という生成メソッドがある
  • プリミティブ型には comparingInt のように専用のものが用意されている

参考