【SpringBoot】Lombokでアクセサを実装したis...という名前のBooleanを含むEntityのマッパーを用いたINSERT/SELECTが失敗する問題への対処【JDBC】

概要はSSIAです。
ここではEntityをデータベースのテーブルそのままのPOJOとします。

原因

ここではis_active_sampleという名前のカラムに対して、isActiveSampleというBoolean/booleanのフィールドを持つEntityを挿入する状況をサンプルとして書きます。

LombokでこのEntityのアクセサを生成すると、下記のサンプルのように、アクセサの名前はisが省略されたgetActiveSample/setActiveSampleとなる場合があります。

import lombok.Setter;

@Setter
public class Sample {
    private boolean isActiveSample;
}

f:id:wrongwrongwrongwrong163377:20190109110448p:plain
一方これはデータベースのカラム名と異なっているため、BeanPropertySqlParameterSourceBeanPropertyRowMapperといったマッパーはアクセサとカラム名を紐付けられず、INSERT/SELECTは失敗します。

対処

getIs.../setIs...という名前のアクセサを自分で実装することで、問題が解決します。
この時、自力でアクセサを実装したフィールドに対してLombokの自動生成は行われなくなります。

【Android】Emulator: emulator: ERROR: x86_64 emulation currently requires hardware acceleration! への対処

問題

Androidスタジオインストール直後にエミュレーターでプロジェクトを起動しようとしたところ、Emulator: emulator: ERROR: x86_64 emulation currently requires hardware acceleration!と出て起動できませんでした。

原因

AndroidStudioのインストールに失敗した影響で、HAXMがインストールされていなかったことが原因でした。

対処

↓からHAXMを落としてきてインストールすれば直りました。記事執筆時点での最新リリースは7.3.2です。
github.com

2018年を振り返って

今年書いた記事から、今年の振り返りをします。

1月~2月

wrongwrong163377.hatenablog.com

wrongwrong163377.hatenablog.com

年始から2月にかけて、VBWindowsフォームアプリケーションをリライトしていました。
やってた当初は大きな不満が有りましたが、やり切ってみるとその不満の多くが不当だったかなと思います。

ある程度の規模のソフトウェアを作るというのははじめての経験でしたが、この開発を通して大きく実力を伸ばすと同時に、理想通りにはならないというソフトウェア開発の現実を学べました。

自分一人がほぼ全ての裁量を握っていたので、辛かったのと同時にとても楽しかったです。
自分の力で新しいものを作り上げ、それによって金を得るという体験が、後の退学という決断に大きく影響しました。

この後も10月までバイトとしてこの職場で働きましたが、品質のよろしくないコードを後輩に残してしまったことが最後の心残りです。

3月、4月

wrongwrong163377.hatenablog.com

ブログ始めて1年が経った辺りです。
早く就活を終わらせたいという気分で文系寄りな就活に顔を出したりしていました。

この辺ではまだ大学院を卒業するつもりだったので、研究や学生としての活動に目標を置いていました。
もう大学院を辞めたのであまり関係ありませんが、研究発表1回、他の目標はまあ達成という感じでした。

5月、6月

wrongwrong163377.hatenablog.com

この頃は講義と外部発表準備と中間試験でメンタルが結構やられてました。

2017年を結構自由に過ごしていた自分は、そもそも講義を受けることが苦手だったということを思い出してものすごく辛かったです。
外部発表に注力したいのに、それができない状態になっていたのもかなりキました。

wrongwrong163377.hatenablog.com

そんな中でサポーターズの1on1面談会に参加して、自分がやりたいのはものづくりなんだという意識がはっきりしたことで、大学へ通うモチベーションがどんどん削れていきました。

7月、8月

7月に入り、キャリアセレクトの1 on 1面談会に参加した辺りから大学に通うモチベーションは急降下し、そこから本格的に就職活動を始めました。

wrongwrong163377.hatenablog.com

最終的にはMicroAdから内定を頂き、退学を決めました。
就活では何社かから落とされたりと結構辛さも有りましたが、結果的にとてもよい会社に拾ってもらえたと思います。

wrongwrong163377.hatenablog.com

この月はナビタイムのエンジニア体験インターンで3日間HTMLとJavaScriptしてました。
短すぎる期間でしたが、ナビタイムは福利厚生・教育面がかなりしっかりした会社だと思いました。

9月

wrongwrong163377.hatenablog.com

wrongwrong163377.hatenablog.com

この月はエウレカのサマーインターンシップに参加していました。
この2週間はとにかく刺激的で、高密度に様々な経験ができました。

複数人でガチガチに開発をやるというのは初めての体験でしたが、自分のものづくりへの思い入れを確認することができたかなと思います。
加えて、このインターンシップで後半まで残り、割と良い評価を頂けたことはとても大きな自信に繋がりました。

自分と同年代、もしくは自分よりも年下の人間がパフォーマンスを発揮しているのを見て、負けたくないなという気分も高まりました。

参加前の時点で10月1日から働き始めることが確定していたのですが、インターンとして自分を受け入れてくれたエウレカには感謝しかありません。

10月・11月

MicroAdで働き始めました。
入ってすぐは、今年入社した先輩方が研修で作成した社内システムへの機能追加をやっていました。

開発形式は、フロントからサーバーサイド、データベースまで自分一人で弄る形で、最初の方は自由に触り、その後約1ヶ月半で機能作成+テスト作成+デプロイまでをやりました。
利用したフレームワークは、フロントがVue.js、サーバーサイドがSpringBoot(Java)、データベースがMySqlでした。

とりあえず切られた期日までに開発を終えることができて良かったです。

12月

今月は本格的に会社の新規プロダクト開発に携わり始めました。
初めての複数人でのプロダクト開発なので、練度不足が辛いですが、とりあえず頑張っていきます。

この月はQiitaデビューをして、5本アドベントカレンダーを投稿してました。

今年のまとめ

大体140本弱記事を書きました。
月によって振れ幅は有りますが、大体3日に1本ペースですね。

ただ、メモ書き程度や部分最適化的な内容が非常に多かったので、もっと大規模な挑戦をすべきだったというのが反省です。

来年はとりあえず良質なアウトプットを増やします。
具体的には、一本でも何かしらのアプリを作り、それを元に体系的にまとめていくつもりです。

後社内にKotlinを布教したい……。

【プログラミング】JetBrains製IDEでプロジェクトのソースフォルダ(packageなど)が認識されない時の対処

Intellij ideaで作成したプロジェクトをGitHubで共有した際に、別PCでビルドができない現象が発生したので、その解決方法を書きます。

現象

パッケージが認識されず、設定を写してビルドしてもclass not foundと言われてビルドが通りませんでした。

対策

Project Structure -> Modules -> [プロジェクト名(画像では一番上)] -> Sources -> [ソースフォルダ(画像ではsrc)]を選び、Mark asからSourcesを選ぶとソースフォルダが設定され、パッケージ等が認識できるようになります。
f:id:wrongwrongwrongwrong163377:20181227220657p:plain
f:id:wrongwrongwrongwrong163377:20181227221259p:plain

補足

当然ですが、Mark asからテストを選べばテストとして、別なものを選べば選んだものに合わせて認識されます。

【Kotlin】通常ではfor文で回せないものをfor文っぽく扱う

Kotlinでは、浮動少数やBigIntegerなどはそのままだとfor文に入れて回すことができません。
こういったものはgenerateSequenceを使ってシーケンスにすることで、for文のように回すことができます。

やり方

以下はgenerateSequenceを使って階乗を実装したものです。
generateSequence{ }内の処理が値の更新と終了条件の判定です。takeIf { }内が終了条件です。

fun fact(n: BigInteger): BigInteger{
    var i = n
    var ans = BigInteger.ONE
    generateSequence { (i--).takeIf { i > BigInteger.ZERO } }.forEach {
        ans *= it
    }
    return ans
}

注釈

あくまで「のように」であって、sequence関連は奥深く、多くの使い道があります。
qiita.com

【JDBC】SimpleJdbcInsertで複数の要素を一気にInsertする

BeanPropertySqlParameterSourceの配列を作ってSimpleJdbcInsert#executeBatchに入れるとできます。

//配列を作る関数
private BeanPropertySqlParameterSource[] makeParamArray(List entities){
    BeanPropertySqlParameterSource[] sources = new BeanPropertySqlParameterSource[entities.size()];
    for(int i = 0; i < entities.size(); i++){
        sources[i] = new BeanPropertySqlParameterSource(entities.get(i));
    }
    return sources;
}

//インサート例
public void insertテーブル名(List<[Entity]> entities) {
    SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate).withTableName("[テーブル名]");
    jdbcInsert.executeBatch(makeParamArray(entities));
}