DIST.32 「JetBrainsな夜」はとっても最高な夜だった

DIST.32 「JetBrainsな夜」 - connpassに参加しました。 (Twitterハッシュタグはこちら → #dist32)

ざっくり感想: 知らなかった機能を知る貴重な勉強会でした

普段は、PyCharmProfessionalを使ってプログラミングをしています。 それなりに使いこなしていると思っていますが、本当に使いこなしているかというと結構怪しいです。"いつもの"使い方を続けているだけかもしれません。 (PyCharmを含むJetBrainsのIDEは、能動的に便利な機能を探すのはとても難しいです。)

また、今回のテーマは「WebStorm、PhpStormなどのJetBrains社製IDE」と、単一のテーマだったのもよかったです。 2時間ずーっと、JetBrains。タイトル通り、JetBrainsな夜でしたね。

重要だと思った3点だけ書き残しておきます

1. JetBrains公式が日本語サポートに気合いをいれていくらしい

公式のサポート、という点が感動ポイントですね。

早速、配信中に日本語化してみました。わりといい感じにローカライズされている印象です。

英語での検索が効かなくなるので多少不便かもしれませんね。 しかし、その不便さよりも、今まで気づかなかった機能に出会えそうなワクワクの勝ちです。とても楽しみです。

また、PyCharmを初めて触る方にとって、多かれ少なかれ日本語化されていないのは負担になることも観測しています。 これからは以前よりも人に勧めやすくなったわけです。JetBrainsファンとしては嬉しいですね。

(2020.08.11追記)

JetBrains 日本語言語パックEAP版における既知の問題 | JetBrains Blog

いくつか問題の報告および解決策の提示がなされているようです。要チェック!

2. これぞ顧客(私)が欲しかったプラグイン Presentation Assistant - IntelliJ IDEs | JetBrains

ショートカット(おそらく、PyCharmに搭載されているアクション)を使った場合に、機能名とキーバインドを表示してくれるプラグインです。 次のスクリーンショットを見てください。

Presentation Assistant

感動ポイントは次の2つです。

  1. OSが違っていても、ショートカットキーを伝えられる
  2. 機能名を知ることができる

1 は そのままの意味です。同じPyCharmユーザでもOSが違うと、パッと伝えられない時があるんですよね。「それって、えーっと、Macだとどうやるんだ?」みたいなことになりがちです。 当然、説明を資料を作るときも便利ですね。

2 が特に重要です。機能の名前が分かれば調べることも質問することもできるからです。

「えーっと、なんとかかんとかする機能」と言わなくてよいのです。

上記のスクリーンショットの例でいうと、Intention Action が専門用語ですね。 「Option+Enter押すと出てくる機能」とか「いい感じにやってくれるやつ」ではないのです。Intention Actionなのです。

正確な名称を知ることができれば、正しく調査することができますね。 (「Option+Enter押すと出てくる機能」だとググりの限界があります。少なくとも日本語記事しか出てこないでしょう。)

3. にゃんこが走るプラグイン Nyan Progress Bar - plugin for IntelliJ IDEs | JetBrains

プログレスバーをにゃんこにしてくれるプラグインです。かわいい! 感動ですね。

一見、かわいいだけプラグインにも思えますが、実用性があります。

それは「PyCharmが何かしていることに気づきやすくなる」ということです。実際に使ってみてほしいのですが、プログレスバーがかなり派手になります。

例えば、「あれ? 補完効かないぞ... あ、indexing中だったか。」(ちょっとストレス)ということを経験しているのですが、これは indexingしていることに気づくことができれば ストレスが軽減されるわけです。

お試しあれ。

というわけで、今回のイベントは自分にとって、とても価値が高いものでした。ありがとうございました。

Flaskのテンプレート捜索をログに出力する

Application ObjectEXPLAIN_TEMPLATE_LOADINGTrue に設定すると、 render_template を使ったときに実際にどのテンプレートが対象とされるかを調べることができます。

jinja2.exceptions.TemplateNotFound となった場合にちょっと便利です。

小さいアプリで実験しましょう。

公式ドキュメント

EXPLAIN_TEMPLATE_LOADING¶ Configuration Handling — Flask Documentation (1.1.x)

命名がとてもストレートで嬉しいですね。

環境条件

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.4
BuildVersion:   19E287

$ flask --version
Python 3.8.4
Flask 1.1.2
Werkzeug 1.0.1

実験

今回は2つのパターンで検証します。 (:memo: Blueprint を使った場合はまた今度)

  1. 正しくtemplateが見つかる場合(index())
  2. templateが存在しない場合(not_exist_template)

ログに着目しましょう。

実験用ソースコード

ソースコードhttps://github.com/mohira/flask-blog/tree/master/explain_template_loading にあります。

# ディレクトリ構成
$ tree explain_template_loading

explain_template_loading
├── __init__.py
├── app.py
└── templates
    └── index.html
from flask import Flask, render_template

app = Flask(__name__)
app.config['EXPLAIN_TEMPLATE_LOADING'] = True


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/not_exist')
def not_exist_template():
    return render_template('not_exist.html')  # わざと用意していない


def main():
    app.run(debug=True)


if __name__ == '__main__':
    main()

index.html はわかりやすいようにファイルのパスを書いています。

<h1>Hello from /templates/index.html</h1>

実験1. 正しくtemplateが見つかる場合(index())

$ curl http://127.0.0.1:5000/
<h1>Hello from /templates/index.html</h1>
[2020-07-22 09:58:00,675] INFO in debughelpers: Locating template "index.html":
    1: trying loader of application "__main__"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /Users/your_home/mob-mob-blog/explain_template_loading/templates
       -> found ('/Users/your_home/mob-mob-blog/explain_template_loading/templates/index.html')

127.0.0.1 - - [22/Jul/2020 09:58:00] "GET / HTTP/1.1" 200 -

index.html という template を /Users/your_home/mob-mob-blog/explain_template_loading/templates という searchpath から検索していることがわかりますね。

実験2. templateが存在しない場合(not_exist_template())

$ curl http://127.0.0.1:5000/not_exist
# 表示されるデバッグ情報は省略
[2020-07-22 10:00:00,301] INFO in debughelpers: Locating template "not_exist.html":
    1: trying loader of application "__main__"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /Users/your_home/mob-mob-blog/explain_template_loading/templates
       -> no match
Error: the template could not be found.

127.0.0.1 - - [22/Jul/2020 10:00:00] "GET /not_exist HTTP/1.1" 500 -

Traceback (most recent call last):
# 細かいTraceBackは省略
# ...
jinja2.exceptions.TemplateNotFound: not_exist.html

not_exist.html という template を /Users/your_home/mob-mob-blog/explain_template_loading/templates という searchpath から検索していることがわかりますね。

しかし、実験1と違い、templateがないので no match となっていますね。