2016年8月24日水曜日

【Kotlin】Java から Kotlin への移植中に起きた private メンバ参照エラー

とある既存の Java の (SplingBoot) プロジェクトを Kotlin に移植中、突如 build が通らない現象が起こりまして。

なんでかなー?
Kotlin 的には Getter を class に差し込むし、この記述で Private な訳ないんだけどなー?

という現象に引っかかったので久々の技術メモを。

結論としては、 Gradle の Java plugin と Kotlin plugin と Lombok の中がよろしくないということのようで


  • Kotlin は compileJava が dependsOn されているので先に compileJava が走る。
  • その後に compileKotlin される。
  • 結果、参照している Lombok で実装しているクラスのメンバは Delombok される前なのですべて Private なので当然エラーになる。


という流れでした。

状況を説明するためのテストコードとしてはこんな感じです。



ことの発端になったログはこんな感じでした。
$ ./gradlew build
:compileKotlin
e: /home/hoge/repos/LombokConflict/src/main/kotlin/Application.kt: (3, 15): Cannot access 'id': it is 'private' in 'DataModel'
e: /home/hoge/repos/LombokConflict/src/main/kotlin/Application.kt: (4, 15): Cannot access 'description': it is 'private' in 'DataModel'
:compileKotlin FAILED
FAILURE: Build failed with an exception.
@Data 指定してあるし、Getterいるしなんでだろう?

と思ったので、 DeLombok したコードの状態で build すると

$ ./gradlew build
:compileKotlin
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestKotlin UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build 
BUILD SUCCESSFUL 
Total time: 8.041 secs

BUILD SUCCESSFUL!!!

Google翻訳「成功したビルド」




Compile が通るんですよ。

で、こりゃ gradle の流れがおかしいか?と思って調べてみた結果。


http://stackoverflow.com/questions/35517325/kotlin-doesnt-see-java-lombok-accessors

唯一の回避策としてはコンパイル順序を制御することだ、とありますが上のとおり Gradle の pulugin 経由だともはやどうしようもなさそうです。

公式でも同じ内容があって、


なんか似たようなこと言ってますね。
module を分けるなどをすれば問題ない。
論理的根拠は Kotlin はバイトコードからそれらを参照するが Lombok は On the fly でそれらを生成する。
だそうで。

PreCompiler と PostCompiler の違い、と言ってしまえばそれまでな気はしますし、だからといってお互いに修正する方向には来ないんだろうなーという気もしています。

結局、既存プロジェクトを Kotlin へ順次移行するのは Lombok と衝突する。
似たもの同士、近くによるとロクなことがない、という人生教訓になりましたとさ。

めでたくないです。つらいです。

ということで、 Java 、とくに SpringBoot で作られた既存のプロジェクトを Kotlin に移植するのは一気にやるか、またはサブプロジェクトとスコープを調整し直すかなにかしないといけませんよ、ということのようです。

特に Annotation もりもりの SpringBoot の移植はそれなりの規模になると、ちょっと気合入れて手を入れないと厳しそうな感じでしょうか。

今回のソースコード一式はこちら。

https://github.com/grim13b/LombokConflict


2016年7月19日火曜日

【音楽】Venture Electronics VE-MONK+ 突如現れたハイコスパ インイヤー型イヤホン


Venture Electronics の VE-MONK+ というインイヤー型イヤホンです。

先代 VE-MONK から噂があった最近国内では絶滅危惧種とも言えるインイヤー型イヤホンです。

なかなか硬質な音で粒立ちがよく、明るくノリのいい音だったので紹介します。
開放型なので音漏れしますし遮音性も高くはないです。
が、密閉型と比べた場合、開放型のわりに音漏れはしませんし遮音性も悪くないです。

自分自身、インイヤー型自体がそんなに良い思い出がなかった(昔イヤホンてこういうタイプばかりでしかも耳が痛かった)ので基本的にはスルーしていました。

ある日、たまたまインイヤー型が欲しいので紹介して!という話があって、「じゃあ勧められるかどうか聴いてみるか」ということで買ってきました。

2016年5月3日火曜日

【Ubuntu】16.04にアップグレードした瞬間 USB-DAC が認識しなくなる問題について

Ubuntu の LTS である 16.04 が出ました。

特段そんな変更はないのですがサポート期限の関係もあって人柱的に載せ替えてみた矢先、事件が起こりました。

USB-DAC が接続認識しないのです。

機器の電源を投入した直後からオープニング動作の途中で固まる状態でした。
超死活問題ですよ。ホント。

でもまあ、暫定的ではありますが、結果的には解決したのでそのメモを。

2016年2月11日木曜日

【音楽】お手軽な価格でイヤホン・ヘッドホンの新境地を開拓したい人にオススメの方法

先日、TBS マツコの知らない世界 でちょっとマニアックなイヤホンも紹介されました。

以前からこの番組でマツコ・デラックスさんに「いいわねこれ!」と取り上げられるイヤホンには人気が集中するという現象もあり、気になっていました。

スマートフォンの普及率があがり、多くの年齢層に行き渡り、 AWA、 LINEMusic、 AppleMusic、 GoolePlayMusic など月々定額でたくさんの音楽が聴ける環境が整ってきています。

Youtube などの動画サイトではアーティストが自身のプロモーションビデオを一部公開する、日本発CGMの巨塔 ニコニコ動画 では歌い手や踊り手、ボーカロイドなど多くの人が映像や音楽を作り、いつでも親しんでもらう場としての環境も整ってきました。

が、自分にあったイヤホン・ヘッドホンの見つけ方がわからない、いいものは高いものしか無い、そんな感じになっているのでは無いでしょうか。


これを解決する方法はただひとつしかありません。

聴いて確かめる!

です。

2016年1月20日水曜日

【技術メモ】Fragment で Kotlin + Anko を使ってサンプルを作った話

まもなく 1.0 の 正式リリースを迎えそうな Kotlin + Anko で Android アプリを作ってみて何作目かになったのでメモします。

ボタンだけがあって、ボタンを押すと「本当はhttp requestを投げる。今は諸般の事情で5秒寝る。」だけのアプリです。

Anko の情報があまり多くないので体系立てて覚えにくいけど、 Helper だったり細かいものが充実してきたらきっと便利かなぁ、どうかなぁ。

個人で作る分には試行錯誤が楽しいので、いまのところ欲しいツールをぽいぽい作るにはいいかなー、と思っています。

特に苦労することもないのですがあまり Fragment + Anko という組み合わせの情報が無いのでソースコードまるっとあれば何か参考になるかな的な感じです。

2016年1月19日火曜日

【音楽】(一部で)話題の MQA をデータと特許の上辺だけさらっと調べてみた【技術メモ】

CES 2016 で Tidal をはじめ、複数の事業者が MQA というフォーマットの採用を発表しました。

ハードウェアでもこれに対応する動きもあり、ここ最近飛ぶように売れている ONKYO DP-X1 でも対応するようで、活気付いてきています。

<CES>MQAのダウンロード配信、日本でも近日開始。TIDALでのストリーミングもデモ

ではその MQA ってどんなものなの?といっても抽象的な「オーディオ折り紙」とか「アナログを再現する」といった内容がほとんどでした。

今回の CES で同様に採用を発表したノルウェーのレーベル 2L 社が運営する音楽配信サイトでは MQA のサンプルが公開されたので中を覗いてみたらちょっと驚きの状態だったので、MQA の特許文書を斜め読みしてみました。

http://www.2l.no