最近GmailのInboxにメールが届かなくなった! → Mailing Listに対するフィルター作成時にGmailが誤ったフィルターを作っているかも?

TL;DR

Mailing Listの名前にハイフンが入っていると、Gmailが自動で作成するフィルターはネガティブ検索として解釈されてしまう。

f:id:hiroga_cc:20200527070856p:plain
メーリングリストの名前にハイフンが入っている。

経緯

2020年の1月頃からなぜか GmailのInboxにメールが届かなくなりました。

面倒でしばらく放置していたのですが、一念発起して調査することに。
まずはGmailでフィルターを全てexportし、メールが受信できるかを確認しました。すると正常にInboxに振り分けられます。

次に、フィルターを全てImportしなおし、下から順番に削除→メール送信を繰り返してみました。するとメールが受信できるように!

悪さをしていたフィルターはコレでした。

f:id:hiroga_cc:20200527071306p:plain
マッチしないもの全てをフィルタリングする

それにしても、こんなフィルターいつ作られたんだ?
調べてみると、Adobe XDのMailing Listから送信されているメールの送信元アドレスに問題があるっぽい。

f:id:hiroga_cc:20200527070856p:plain
メーリングリストの名前にハイフンが入っている。

この neolaneというのは、2013年にAdobeに買収されて Adobe Campaginになった企業ですね。
このメールに対して Filter messages from this mailing list を実行すると、以下のようにネガティブ検索を含むフィルターが作成されてしまう、というわけ。

f:id:hiroga_cc:20200527071219p:plain
ネガティブ検索として解釈されるフィルター

まとめ

Gmailのフィルター作成機能は便利だけど、どんなフィルターが作られるかは目検でチェックしよう。
もしおかしいと思ったら、exportでバックアップして新しいのから順番に消してみる。

iPhoneのGoogle Meetで画面共有する手順

iPhoneの画面をハングアウトしている相手とリアルタイムで共有できるようになりました。

f:id:hiroga_cc:20200518120346p:plain

手順

  1. Google Meetで会議に参加する
  2. 画面集力を長押し or 強押しして、画面のブロードキャストをするアプリを選択する
  3. 画面がGoogle Meetで共有される

詳細

1. Google Meetで会議に参加する

f:id:hiroga_cc:20200518115939p:plain

特に説明することはないですね。

2. 画面集力を長押し or 強押しして、画面のブロードキャストをするアプリを選択する

f:id:hiroga_cc:20200518120217p:plain

画面収録ボタンを長押しすると、アプリの選択画面に移ります。
ここで画面収録ボタンがない場合は、 設定 > コントロールパネル からコントロールパネルの表示内容をカスタマイズしてください。

f:id:hiroga_cc:20200518120252p:plain

以上です。

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