IntelliJのプロジェクトテンプレートの仕様のまとめ

いつもGradleプロジェクトのセットアップに難儀しているので、プロジェクトテンプレートの利用を検討しました。

www.jetbrains.com

テンプレート作成時

作成したテンプレートは、私の環境では /Users/{USER}/Library/Application Support/JetBrains/IdeaIC2020.1/projectTemplates にありました。例えば、 excel という名前のテンプレートは excel.zip として保存されています。

f:id:hiroga_cc:20200428080559p:plain

IntelliJの新規プロジェクトメニューは、テンプレートが一つも保存されていない状態だと表示されないようです。

f:id:hiroga_cc:20200428080704p:plain
プロジェクト作成メニュー

IntelliJはprojectTemplateのZIPファイルを再帰的に探索し、そこで見つかったものをプロジェクトテンプレートの候補として表示するようです。試しにzipファイルを消したらプロジェクトテンプレートも消えました。また、projectTemplate 内に適当なフォルダを作ってそこにZIPを移動してもテンプレートとして表示されるようです。

ただ、 projectTemplate フォルダを直接編集するとプロジェクトの作成時に失敗するようになるかもしれません。

2020-04-30 追記: ソースコードのファイルがひとつもないモジュールを含むプロジェクトをテンプレート化すると、プロジェクト作成時に失敗します。IntelliJのバグと思われます。

テンプレート使用時

User-defined から利用したいプロジェクトを選択します。

f:id:hiroga_cc:20200428082358p:plain

作成失敗時、特に画面上にエラーは表示されないので気づきづらいのですが、 idea.logを見るとしっかり表示されています。

f:id:hiroga_cc:20200428081112p:plain
直接プロジェクトテンプレートのフォルダを編集した後のログ

idea.log は私の環境だと/Users/{USER}/Library/Logs/JetBrains/IdeaIC2020.1/idea.log です。

作成されたプロジェクトは、元のテンプレートの値が置換される箇所とそうでない箇所があるようです。例えばMakefile内のアプリケーション名は置換されませんでした。

2020-05-03 追記: gradleプロジェクトをテンプレート化すると、 ./gradlew でコメント行がエスケープされる上にパーミッションが初期化されて実行できなくなります。直せばいいとはいえ、うーん。

まとめ

細かいバグはありそうですが、都度Gradleの設定をコピらなくていいのは嬉しいので活用していきたいですね。

IntelliJのSetting Repositoryで"invalid privatekey"エラーが表示される → JSchが対応している秘密鍵のフォーマットはPEM

IntelliJ / PyCharmでローカルの設定をGitHubなどと共有しようとしたときに、"invalid privatekey" と表示されて困ったことはないですか?

f:id:hiroga_cc:20200426065737p:plain

OpenSSH7.8以降で出力される秘密鍵のヘッダーは以下のフォーマットになっているようです。私の場合は ed25519 ではなく RSA でしたが、以下のフォーマットで出力されました。

-----BEGIN OPENSSH PRIVATE KEY-----

このフォーマットが JSchに対応していない、ということのようです。

StackOverFlowの助言に従い、 -m PEM オプションを付けて ssh-keygenからやり直したら解決しました。

stackoverflow.com

解説

IntelliJのログ(私の場合、~/Library/Logs/JetBrains/IdeaIC2020.1/idea.log )からスタックトレースを表示しました。

Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@282a5626
    at com.jcraft.jsch.KeyPair.load(KeyPair.java:664)
    at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
    at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
    at com.jcraft.jsch.JSch.addIdentity(JSch.java:406)
    at com.jcraft.jsch.JSch.addIdentity(JSch.java:366)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getJSch(JschConfigSessionFactory.java:396)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:332)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:205)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:138)
    ... 39 more

JSchが原因だと思っていたわけでなく、 invalid privatekey で検索したら一番上に表示されたというだけです。 よく検索されているのかもしれませんね。

余談ですが、ここにたどり着くまでにIntelliJを再起動したり再インストールしたりで無駄な時間を過ごしてしまいました。 エディタの実行ログはいつでも表示できるようにして、まずはログを見たいですね。

OneDrive / GoogleDrive さわらファイル分類法(雑多なファイルを分類して保存するマイルール)

Google Driveの中が散らかってきたので、ファイルの分類ルールを言語化しつつ見直してみました。

今回策定した分類法

f:id:hiroga_cc:20200419153707p:plain

私が主に使っているクラウドサービス(Google Drive、OneDrive、InkDrop)の全てで適用できるように考えてみたつもりです。

トップレベルでは ファイルの種類ごと(画像・音楽など)と、個人のプロジェクトに関するもの or 組織のプロジェクトに関するもの、で分けています。
(なお、会社のファイルは当然ながら自分のDriveには保存しません。個人のDriveで会社のフォルダに入れるものは雇用契約書とかですね。)

その他の自分ルール

Gitリポジトリはそもそも ghqで全て管理する。

本当はドキュメント用の ghq みたいなのもあれば最高なんですけどね。

ファイル名・フォルダ名は小文字のケバブケースとする

大文字始まりにするとShiftキーを押すのが面倒なので、デフォルトのフォルダ名とそぐわないことも多いのですがこのルールにします。
そもそも大文字・小文字があるのがアルファベットの良くないところですね。

ケバブケースかスネークケースかは悩みましたが、Googleのプログラミングの指針に倣いました。

ファイル名・フォルダ名は略してもよいが、ググって分からない省略形は使わない

ファイル名、短くしたいですよね。
例えばハッカソンの成果物を con フォルダに保存していました。 今日 con が contestの略だと分からず、フォルダの中を見てようやく思い出しました。

一方、 organization を org と略すのはOKです。ググれば分かりますからね。

おわりに

この記事を読んだ友人の皆様、よければマイルール教えて下さい〜!

java.util.logger フォーマット整形職人の朝は早い

PostgreSQLのDriverをKotlinから呼び出して使っています。
このロガーが log4jじゃなくてjava.util.loggerなんです。何が良くないって、java.util.loggerはログの出力先が標準エラー出力になっており(1)、IntelliJ標準エラー出力を赤字で出すので(2)コンソールが真っ赤。

普通は java.util.logger と log4jの間にブリッジを仕込むそうなんですが、Driverってコネクション獲得するたびに呼ばれるので削除したはずの java.util.loggerのハンドラーが復活します。
いい解決策が思いつかなかったので、ちまちまフォーマットを修正することにしました。

修正風景

f:id:hiroga_cc:20200415092623p:plain

IntelliJスニペット機能、Twitterで教えてもらいましたが最高ですね。
ちなみに java.util.logger の謎の文法は java.util.Formatter クラスのものらしい(3)
うーん各言語で統一して...

参考

  1. eclipse - Why does java.util.logging.Logger print to stderr? - Stack Overflow
  2. IntelliJ output console INFO colour - Stack Overflow
  3. logging - Where can I find Documentation on the Java SimpleFormatter format strings? - Stack Overflow

PostmanとGitHubのIntegrationに関するメモ

PostmanのIntegration機能を使うと、各種リポジトリ管理サービスにAPI定義をBackupすることができます。
これをやってみたエントリがあまりに無いので試してみました。

github.com

スクリーンショット

f:id:hiroga_cc:20200411114221p:plain 連携画面。PostmanのAPIGitHubのブランチ(リポジトリは選択済み)、共有する際のファイルの指定をします。

f:id:hiroga_cc:20200411114533p:plain 連携後、Postman側には特に何も表示されませんが、GitHubを見ると確かにコミットが追加されています。
Webhookを設定しているのでGitHub側を更新するとPostman側にも更新が反映されるようです。

f:id:hiroga_cc:20200411114811p:plain GitHubと連携中である旨が示されます。日本語化けてる...

注意点

  • PostmanではCollectionではなくAPIを作成済みであること。
  • GitHubではリポジトリは作成済みで、first commit が済であること。

県外の友達と画面中継&ボイチャしながらあつ森をしたかった(Macbook & HD60S)

f:id:hiroga_cc:20200320195719p:plain
あつまれどうぶつの森 with HD60S

TL;DR

映像の中継は比較的簡単だが、こっちのゲーム音声 + 声をミックスしてDiscordに取り込ませようとすると途端に厳しい。ゲーム音声は普通にマイクで拾いましょう。

こちらが厳しい構成です。

f:id:hiroga_cc:20200320201324p:plain
映像と音声をDiscordに取り込みたい...

音声がめちゃ汚くなる。
MacデフォルトのAggregated Deviceの音質が悪いような気がするが、果たして...

とりあえずゲーム音声は普通にマイクで取り込んでしまったほうが手っ取り早そう。実況とかするなら別だけど。

`subscription for the service`以前に作成した AWSのIAM UserのAccess Keyは一旦捨てたほうがいい?

The AWS Access Key Id needs a subscription for the service エラーを受けて、サインアップのプロセスがすべて完了していることをチェック→再度アクセスキーで作業したがエラー。 アクセスキーを再作成したら動きました。