【Kotlin】Intellij IDEAでjava.lang.OutOfMemoryError: Java heap spaceでコンパイルが失敗する状況への対処

Kotlin 1.3.71のプロジェクトで、バージョンを1.41.5に上げた所、java.lang.OutOfMemoryError: Java heap spaceコンパイルが失敗する状況になりました。
Preferences -> Build, Execution, Deployment -> Compilerで、Shared build process heap size (Mbytes)を700から2000に増やした所、1.41.5共にコンパイルが成功しました。 f:id:wrongwrongwrongwrong163377:20210903183629p:plain

ただし、これは対処療法的な対応で、実際にはIDEコンパイラ側でOOMが起きないバージョンが出れば アップデートするなどの対応が必要と思われます。

参考にさせて頂いた内容

発行されていたissueのコメントそのままの対応です。

【MySQL】SQL_CALC_FOUND_ROWS + SELECT FOUND_ROWS()でLIMIT前の行数をカウントする方法はMySQL8.0.17で非推奨化している

本文

タイトルとMySQLの公式ドキュメントに書かれている内容が全てです。 dev.mysql.com

SQL_CALC_FOUND_ROWS SELECT FOUND_ROWS()」というような形で検索しても非推奨化している旨がパッとは出てこなかったためこの記事を書きました。

補足

公式ドキュメントに書かれている内容で、SQL_CALC_FOUND_ROWS + SELECT FOUND_ROWS()を使わない理由は以下のようになるかなと思います。

  • 一部の最適化が効かないため遅い場合がある
  • UNIONと合わせた時に特別な扱いが必要になる
  • ステートメントベースのレプリケーションでは、確実にFOUND_ROWS()をレプリケートすることができない

【Spring】SQLにパラメータとしてJSON配列を設定したい場合、JSON_ARRAYを使う

NamedParameterJdbcTemplateに対して発行するクエリで、JSON配列をパラメータとして設定する所で詰まったので、備忘用のメモです。

状況

以下のような処理を行うクエリを作成していました。

select  JSON_OVERLAPS(/* テーブルから取得したJSON配列 */, /* パラメータとして設定したJSON配列 */)
from ...

実装当初は、以下のように、JSON配列を表す'[]'の中にプリペアドステートメントを用意する形で考えていました。

// Java上のパラメータ設定
MapSqlParameterSource("arrayValues", arrayValues);
-- 発行するクエリ
select  JSON_OVERLAPS(table.json_array,'[:arrayValues]')
from table;

起きた問題

先程紹介したクエリでは、:arrayValuesが置き換えられず、実行時エラーが発生します。
これが置き換えられない原因は、SQLインジェクション対策で、Spring側がシングルクォートで囲われた範囲のパラメータを置き換えないためです。

stackoverflow.com

解決方法

生の配列に入れるのではなく、JSON_ARRAYで囲めば大丈夫でした。

select  JSON_OVERLAPS(table.json_array,JSON_ARRAY(:arrayValues))
from table;

【Confulence】テンプレートに画像を添付できない問題をGoogle Drive経由で回避する

Confulenceには現在テンプレートに画像を添付できない不具合が有ります。

jira.atlassian.com

この不具合は2021年7月に「今後3ヶ月以内(最長11月内?)のリリースを目指す(意訳)」というコメントが残されていますが、すぐにでもなんとかしたい方向けの記事です。

やり方

community.atlassian.com

上記記事内でもいくつか回避策が書かれていますが、この記事ではGoogle Driveを経由して画像を貼る方法を書きます。

手順

まず、貼りたい画像をGoogle Driveに上げ、リンクを取得しておきます。

次に、/docsで、Google Docsからの挿入メニューを呼び出します。
これはツールバー右端の+ ∨マークからも呼び出せます。

選択すると、以下のようなモーダルが出てくるので、Google Docs URL*の項目に先程取得したリンクを貼り付けます。
サイズ(画素数)の大きな画像の場合、そのままInsertを選択しても大丈夫です。 小さな画像の場合、余白が大きなスペースを取ってしまうことがありますが、その場合画像サイズに合わせてサイズを入力すると余白を小さくできます。

プレビューは以下のような表示になりますが、1度保存すると正常に出てくるようになります。

Intellij IDEAで、Kotlinプラグインを1.5にアップデートしたらビルドができなくなった問題への対処

2021/5/14追記

幾らか試した雰囲気では、File->Project Structure->Project ->Project SDKのバージョンが1.8(Java 8)だとこの問題が出るように見えました。
ここをJava 12以降(試したのが12と16だっただけで、それ以前でできないかは見ていません)にすることで症状が収まるようです。

プロジェクトのimlファイル、及び.ideaフォルダを消すやり方の場合、Project Structureに関する設定もリセットされるため、解決したのはそこでバージョンが変わったことが理由だったかもしれません。


TL;DR

  • 自分の場合、プロジェクトの方が壊れたようだった
  • よって、プロジェクトのimlファイル、及び.ideaフォルダを消してプロジェクトを読み直した所、ビルドできるようになった

本文

Intellij IDEAKotlinプラグインをアップデートした所ビルドが通らなくなったため、対処でやったことをまとめます。

バージョンやプロジェクト情報は以下の通りです。

  • プロジェクト: Maven
  • Kotlin: 1.3.71

発生していた問題

自分の場合は、無限にコンパイルが進まなくなるか、java.lang.OutOfMemoryError: Java heap spaceが出るかの2種類の問題が発生していました。

対処法

成功したもの

冒頭に書いたとおり、壊れたのはプロジェクトの方だったようで、${プロジェクト名}.iml及び.ideaフォルダを消した上で再度プロジェクトをロードした所ビルドができるようになりました。

mvn clean:cleanや、プラグインの再インストール、IDEのアップデート(2020.3 -> 2021.1)も効果がありませんでした。

その他試したこと

-Xuse-old-backend

下記の投稿にて、-Xuse-old-backendを設定すれば良いという情報を見つけたので、プロジェクトのpom.xmlに設定したり、Project Structure -> Kotlin -> Additional command line parametersに設定したりしましたが。

キャッシュ削除

ビルドキャッシュが悪さしていないかを確認するため、mvn clean:cleanを行ったり、成果物が入るtargetディレクトリを削除して確認を行いました。

次に、Invalidate CachesIDEAのキャッシュを削除しました。

プラグインの再インストール(バージョンを下げる)

きっかけとなったKotlinプラグインの再インストール・バージョンダウンも試しました。

まずPluginsからKotlinプラグインをアンインストールします。 f:id:wrongwrongwrongwrong163377:20210510141242p:plain

次に下記のページからインストールしたいバージョンのプラグインを落とします。
kotlin-plugin-203-1.4.32-release-IJ7148.5.zipみたいな名前のzipファイルが落ちてきます。

plugins.jetbrains.com

最後に、落としてきたzipファイルをInstall plugin from diskで選択すれば再インストールが完了します。 f:id:wrongwrongwrongwrong163377:20210510141632p:plain

この方法でバージョンを下げた時もアップデート通知が来るため、仮にプラグインが問題だった場合は注意が必要です。

【日記】初めてOSSにコントリビュートできた話

とても小さなドキュメント修正ですが、google/kspにコントリビュートした/人生初のコントリビュートができた話を書きます。

当該PR

github.com

何をやったか

あるドキュメントでgradlerepositories設定でmavenCentralの順番が後ろになっていた問題を修正しました。
これをそのまま使ってしまうと以下のような問題が発生します。

qiita.com

また、何故かこのファイルにだけNBSPが紛れ込んでいたため、その修正も行いました。

変更ではありませんが、上記2件の問題が他にも無いか軽い確認もしました。

感想

まさか人生初のコントリビュートがgoogle向けになるなんてなあと驚いています。
しかもgoogle製の有名(になるであろう)プロジェクトに!

丁度OSS LT会でドキュメントへのコントリビュートの機運が高まっていたので、いい感じに機会が得られたのはとても幸運でした。

rakus.connpass.com

今回コントリビュートしたkspはまだα版ですが、コード生成を非常に高速化できるツールとして非常に注目しているので、これからも伸びていって欲しいなと思います。

android-developers.googleblog.com

おまけ1

神々の並びに何故か一般人が紛れ込んでる図(上段右から2番目が自分です)。 f:id:wrongwrongwrongwrong163377:20210217015916p:plain

おまけ2

自分がやっているKotlin向けマッピングライブラリのOSSです。
こっちもちゃんとやっていきたい & kspを取り入れられたらなど考えています。

【uBlock】YouTubeで「インターネットに接続してください」「現在オフラインです。接続を確認してください。」と出てしまう状況への対処【アドブロック】

YouTubeで、以下の画像のように「インターネットに接続してください」「現在オフラインです。接続を確認してください。」と出てしまう状況への対処法をまとめます。

f:id:wrongwrongwrongwrong163377:20210217011756p:plain

やり方

ここで紹介する方法は2021/3/23に id:Yuki2718 氏より当記事のコメントにて共有頂いた内容です。
コメント頂きありがとうございました。

フィルター一覧の一番下のカスタムの中で、ABP Japanese filters (ONLY for...にチェックが入っている場合、これを外すことで症状を抑制できます(画像では見やすさのため調整していますが、実際はそれなりにスクロールが必要です)。

f:id:wrongwrongwrongwrong163377:20210323120010p:plain
変更前
f:id:wrongwrongwrongwrong163377:20210323120427p:plain
変更後

編集前の記事

以下は2021/3/23に変更を加える前の内容です。
一応このフィルタ以外が原因だった場合に開発者ツールを使った確認方法等は有効な気がするので残しておきます。


YouTubeで、以下の画像のように「インターネットに接続してください」「現在オフラインです。接続を確認してください。」と出てしまう状況への対処法をまとめます。
利用しているのがuBlock Originなのでその中での設定方法を書きますが、症状の抑制方法そのものはAdGuard, Ad Blockのような他のアドブロッカでも同様に使い回せるかなと思います。

f:id:wrongwrongwrongwrong163377:20210217011756p:plain

やり方

画像の通り、Myフィルターの項目に@@||www.youtube.com/youtubei/v1/*と登録することで抑制できます。

f:id:wrongwrongwrongwrong163377:20210217012121p:plain

何をやっているのか

https://www.youtube.com/youtubei/v1/から始まるURLへの通信を許可しています(この書き方ではhttp://でも通るようになっていますが、これは念の為です)。
ホワイトリストとかそんな感じのワードがフックになるかなと思います。

このエラーが出る原因は、uBlockがこれらのURLへの通信をブロックしてしまい、それをYouTubeのプログラムが「通信できない状態だ」と勘違いすることです。
従って、当該URLへの通信を許可することで症状が抑制できます。

詳細な解説

以下はYouTubeの更新でこの対処法が動作しなくなっていてどうしても直したい場合や、他サイトでも何とかしたい場合、費用対効果を無視してでももっと厳密に通信を制御したい場合などにご覧ください。
また、説明する内容は上級者向けであるため、半端な知識で扱って不利益が発生した場合は自己責任でお願いします。

原因となっているURLの確認

開発者ツールからネットワークタブを開くと、以下のようにブラウザが裏で行っている通信を全て閲覧できます。
ここで、赤く表示される(Status(blocked:...)になる)行が失敗している通信です。

f:id:wrongwrongwrongwrong163377:20210217013755p:plain

これを用いて、当該エラーが出る場面で「どのURLへの通信が失敗しているか」を確認し、失敗している部分をホワイトリストに入れていけば、動作が確認できます。
ただし、ホワイトリストを変に設定してしまうと広告が消えなくなるためご注意下さい。

参考にさせて頂いた記事

onlinepckan.net