akiyoko blog

akiyoko の IT技術系ブログです

新刊『現場で使える Django 管理サイトのつくり方』頒布のお知らせ

2020/9/12(土)から開催される「技術書典9@技術書典オンラインマーケット」まであと1ヶ月となりましたが、そこで「あきよこブログ」として5回目のサークル参加をします。



4冊目の新刊は『現場で使える Django 管理サイトのつくり方』です。


f:id:akiyoko:20200807103518p:plain:w350


安心してください。今回も Django 本ですよ~ 😉


タイトルからお察しの通り、Django の管理サイト(Django Admin)だけにフォーカスした、ニッチでオンリーワンな一冊 です。注目すべきはイカレたその分厚さ。「Django」という Python 製の Webフレームワークの中の「管理サイト」という一機能だけに特化したオンリー本でありながら、本文 152ページの大ボリュームに仕上がっています。


f:id:akiyoko:20200824093755p:plain:w500

技術書典9の開催まであと1ヶ月あるのですが、実は すでに執筆は終わっていて、あとは入稿するだけという状況 です。というのも、この本は2月・3月に開催予定だった「技術書典8」で頒布するはずだったのですが、新型コロナウィルスの感染拡大防止に伴ってイベント自体がなくなってしまった(その後オンラインで開催)のと子供の出産が4月に控えていたため、8割ほど完成させていたにもかかわらず途中で放置してしまっていたのでした。そしてこの度、育休を取れたのをきっかけに無事執筆を終えることができたという次第なのです。

そしてこの度、ヒマだったので 事前にアンケート調査をしてみました(アンケートはすでに締め切っています)。

docs.google.com

皆さま、ご協力ありがとうございました。アンケートの結果発表を兼ねて、新刊『現場で使える Django 管理サイトのつくり方』がどんな本なのか? どんな課題を解決してくれるのか? について解説します。


どんな本なの?

皆さんは、管理サイト(Django Admin)を使っていますか?

おそらく Django を利用している開発者の ほとんどが「イエス」と答えるでしょう。 実際、事前アンケートでは Django 利用者の9割近くが「いつも使っている」あるいは「たまに使っている」と回答しています。


f:id:akiyoko:20200812091900p:plain:w450

しかしながら、その仕組みをきちんと理解せずに使っている人が意外と多いのではないでしょうか。 管理サイトは Django の仕組みや設計思想をうまく活かしたアプリになっており、管理サイトを理解することはそれらを知る手助けにもなります。これからも Django を長く使っていくのであれば、管理サイトを深く知っておくことは必ず強力な武器になるでしょう。


また、管理サイトはあらゆるモデルに対応できるように汎用的に作られており、ある程度のカスタマイズも考慮されていて幅広いユースケースで利用することができます。実際の現場では「開発中のテストデータ投入」や「システム利用ユーザーの情報管理」で利用しているケースが多いようです。


f:id:akiyoko:20200812091920p:plain:w500


管理サイトには利用するメリットがたくさんありますが、これについても事前にアンケートを採ってみました。


f:id:akiyoko:20200812091936p:plain:w600


結果を見ると、デフォルトで使える点やほんの数行書くだけでモデルの CRUD 機能が追加できる点が特に高く評価されていて、お手軽で簡単に使えるというのが管理サイトの大きなメリットになっています。

しかし、当然ながら管理サイトは「万能」ではありません。たとえば「少しカスタマイズすれば一般ユーザー向けの画面として使えそう」と目論んでいたら、後になって管理サイトの特性や限界を無視した要望がいっぱい出てきて余計に工数が膨らんでしまったというのはありがちな失敗パターンです。

メリットばかりがクローズアップされがちな管理サイトですが、ここで敢えて負の面に目を向けてみます。次のアンケート結果を見てください。


f:id:akiyoko:20200812092003p:plain:w600


「ある程度以上のカスタマイズになると難易度が上がる」や「簡単にカスタマイズできるかどうかのジャッジにノウハウや調査が必要」など、カスタマイズ系のデメリットが圧倒的に多いことが分かります。「日本語の情報が少ない」や「仕様を把握するのにひと苦労」が多いのは、困ったときのヒントが得られにくいという状況を表しているものと考えられます。これらを踏まえると、管理サイトをカスタマイズする場合は 事前にその限界(基本仕様でどこまでできるのか)とカスタマイズの特性(どんなカスタマイズが簡単でどんなカスタマイズが難しいのか)を十分に把握しておく必要があるでしょう。


そこで本書では、いつも使う管理サイトだからこそ知っておきたい現場レベルの知識やノウハウについて、次の3つのポイントを中心に解説していきます。

  1. 管理サイトの基本仕様
  2. 管理サイトの仕組みを活かしたカスタマイズ戦略
  3. カスタマイズ後のテスト


本書を読めば、管理サイトの基本から応用に至るまでの幅広い知識が得られ、Django への理解がさらに深まるでしょう。


 

対象読者

本書の読者としては、

  • 管理サイト(Django Admin)のことをもっと知りたい方
  • これから管理サイトのカスタマイズをしようとしている方

を想定しています。

特に、これから管理サイトのカスタマイズをしようとしている方には是非とも読んでほしい 内容になっています。

もし管理サイトに興味がなくても、

  • ユーザーモデルやパーミッションの仕組み
  • テンプレートや静的ファイルのルックアップの仕組み
  • Selenium を使ったブラウザテストの書き方

などに興味があれば刺さるかもしれません。

最低限必要な知識としては「Django の仕組みが何となく理解できていること」です。Django 公式チュートリアルDjango Girls チュートリアル をひと通り終えたくらいであれば問題はないでしょう。また、拙著『現場で使える Django の教科書《基礎編》』を読み終えたくらいの知識があれば万全です。



以降で、章ごとの読みどころを紹介していきます。



第1章: 管理サイトの基本仕様

管理サイトは意外と機能が豊富で、その仕様を把握するのにもひと苦労です。そこで本書では手始めに、管理サイトの基本仕様を詳しく紹介しています。

まず、管理サイトの全体像が捉えやすいように画面遷移図(紙面サンプル ① を参照)を示しています。こういった画面遷移図ってググっても何故かなかなか見つからないんですよね。。

その後、Django 初心者向けに利用手順を紹介したあとで、管理サイトが利用している Django の仕組みである「ユーザーモデル」「パーミッションによるアクセス制御」「変更履歴」について解説しています。パーミッションあたりはあまり理解していない人も多いのではないでしょうか。

最後に、画面ごとに詳細な説明をしています。管理サイトは普段は気付かないような隠れ機能があったりするので、手の込んだ仕掛けに驚かされるでしょう。


  • 第1章: 管理サイトの基本仕様
    • 1.1: 管理サイトとは
    • 1.2: 基本機能
    • 1.3: 利用手順
    • 1.4: ユーザーモデルについて
    • 1.5: パーミッションによるアクセス制御
    • 1.6: 変更履歴について
    • 1.7: 各画面の詳細説明
    • 1.8: まとめ


《 紙面サンプル ① 》

f:id:akiyoko:20200824093846p:plain

《 紙面サンプル ② 》

f:id:akiyoko:20200824093917p:plain

第2章: 管理サイトのカスタマイズ

この章で気を付けたのは、なるべく図を多くするということです。公式ドキュメントや特に Stack Overflow などで検索した場合は図が無かったりするので、「一体どんなカスタマイズができるのかイメージが掴めない」ということが多いのです。そういう不満を払しょくするために、このカスタマイズをするとどんなことが実現できるのかがビジュアルで掴めるようにしてみました。

そしてこの章の目玉は、カスタマイズに利用できる AdminSite と ModelAdmin のクラス変数とメソッドの一覧表(紙面サンプル ④ を参照)と、管理サイトで使われるテンプレートファイルの一覧表です。こういうのがあると便利だなという気持ちと書くのがめちゃくちゃ大変だなという気持ちで随分葛藤しましたが、今となっては書いて正解だったと感じています。


  • 第2章: 管理サイトのカスタマイズ
    • 2.1: 内部構造とカスタマイズ方針
    • 2.2: AdminSite を利用したカスタマイズ
    • 2.3: ModelAdmin を利用したカスタマイズ
    • 2.4: テンプレートのカスタマイズ
    • 2.5: CSS のカスタマイズ
    • 2.6: Django パッケージを使ったカスタマイズ
    • 2.7: まとめ


《 紙面サンプル ③ 》

f:id:akiyoko:20200824094004p:plain

《 紙面サンプル ④ 》

f:id:akiyoko:20200824094036p:plain


第3章: 管理サイトのテスト

管理サイトのカスタマイズをする場合は AdminSite や ModelAdmin のクラス変数、メソッドをオーバーライドすることになりますが、それらの断片化したコードだけをユニットテストして例えカバレッジを100%にしたところで、機能が想定通りに動作することを保証したことにはなりません。そんなわけで、管理サイトのテストでは画面ごとにビューのテストをした上で、「lxml」などのパッケージを利用してレンダリングされた HTML から要素をパースして検証するなどの工夫が必要になります。第3章の前半では、そういったテストケースのコード例を挙げて解説しています。

章の後半では、Selenium を使ったブラウザテストについて解説しています。Selenium を使ったテストでは通常、テンプレートの HTML 要素自体や class 属性に変更が加わるとテスト側にも修正を加えねばならず保守が大変になりますが、管理サイトはテンプレートが固まっているためブラウザテストとの相性がよいです。特に、管理サイトでは、Selenium によるブラウザテストをするための AdminSeleniumTestCase が提供されています。章の最後に、このクラスを継承したテストコード例を紹介しています。


  • 第3章: 管理サイトのテスト
    • 3.1: テスト方針
    • 3.2: 通常のユニットテスト
    • 3.3: Selenium によるブラウザテスト
    • 3.4: まとめ


《 紙面サンプル ⑤ 》

f:id:akiyoko:20200824094147p:plain

《 紙面サンプル ⑥ 》

f:id:akiyoko:20200824094231p:plain



頒布本情報


技術書典9 期間中だけの特別価格 として次の価格で販売します。

- 紙版(送料込み)+ 電子版 ・・・ 1,500 円
- 電子版のみ ・・・ 1,000 円

f:id:akiyoko:20200905180046p:plain:w450


なお、BOOTH では紙版を販売中で、技術書典9 の終了後は Amazon で電子版が購入可能になる予定です。


■ BOOTH
現場で使える Django 管理サイトのつくり方(技術書典9バージョン) | BOOTH

■ Amazon
現場で使える Django 管理サイトのつくり方 | Kindleストア | Amazon



書評

Django のイベント関係でいつもお世話になっている方々に献本させていただきました。その書評をいくつか紹介させていただきます。



まさに「管理サイトでどこまでできるのか?」を把握するためにも有用な本だと自負しています。今回の本は図表が多いので、152ページだけど読み流しやすいはず。セキュリティ対策のところは最後の最後に追記したところなので追記しておいてよかったです 😄



「管理サイト」は本当に便利なんですよね。スクレイピングしたデータを保存して画面で操作するとか、そのためだけに Django を使うのもアリだと思ってます。



管理サイトはちょっとしたカスタマイズまでは簡単なのですが、それ以上のことをやろうとすると少し大変なんですよね。そんなときにこの本があれば安心ですよね 😉



electricsheep.hatenadiary.jp

id:electricSheep さんによる新刊の感想ブログです。

>「え、管理サイトのソースどこ??この2行????」

分かります…😅 これだけで動いちゃうので、いろいろカスタマイズできるとか気付かないですよね。管理サイトの網羅的な情報ってまだまだ少ないですよねぇ。



nikkie-ftnext.hatenablog.com

id:nikkie-ftnext さんの感想ブログです。

本にたくさん付箋紙が貼ってあったのが嬉しかったです!!

確かに DjangoGirls チュートリアル では管理サイトについてあまり触れられていないのですが、公式チュートリアルの「はじめての Django アプリ作成、その2」や「はじめての Django アプリ作成、その 7」では少し触れられています(が、ちょっと分かりにくいかもですね)。



最後に

今回、いわゆる「管理サイト本」を書いた理由としては、自分の知識の整理のためということもありますが、どちらかというと Django をもっと現場に普及させたいという気持ちの方が強いです。つまり、現場で頻繁に使う管理サイトのまとまった日本語情報があれば、Django がもっと現場で使われやすくなるんじゃないか と思ったのです。


きっかけは、現場で管理サイトのカスタマイズ案件が二つ続いたことでした。そこには主にレビューで参加したのですが、「担当者が違うとこんなにも書き方が違うのか。保守が大変そうだなぁ」「わざわざこんなことしなくてもフックポイントがあるのに」「あらら、全部 Selenium テストで書いちゃったのね」などとガク然としたのです。そのときに「これを見といてね」と言えるものがなかった苦い経験から、管理サイトを少し真面目に使おうとするときに現場に一冊あれば安心な本 を書こうと思い至ったのでした。


ということで、Django 開発のお供に『現場で使える Django 管理サイトのつくり方』を是非どうぞ!!😊


f:id:akiyoko:20200824094307p:plain:w200



 

宣伝

これまで Django の本を3冊出しました。Django 開発のお供にどうぞ。

現場で使える Django の教科書《基礎編》

「現場で使える Django の教科書」シリーズ第1弾となる Django の技術同人誌。Django を現場で使うための基礎知識やベストプラクティスについて、初心者・初級者向けに解説した本です。B5・本文180ページ。


★ Amazon(電子版/ペーパー版)


★ BOOTH(ペーパー版)


現場で使える Django の教科書《実践編》

《基礎編》の続編にあたる「現場で使える Django の教科書」シリーズの第2弾。認証まわり、ファイルアップロード、ユニットテスト、デプロイ、セキュリティ、高速化など、さらに実践的な内容に踏み込んでいます。現場で Django を本格的に活用したい、あるいはすでに活用している方にピッタリの一冊。B5・本文180ページ。


★ Amazon(電子版)


★ BOOTH(ペーパー版)


現場で使える Django REST Framework の教科書

Django で REST API を構築する際の鉄板ライブラリである「Django REST Framework」(通称「DRF」)にフォーカスした、「現場で使える Django の教科書」シリーズの第3弾。B5・本文204ページ。


★ Amazon(電子版)


★ BOOTH(ペーパー版)

Django モデルのフィールドの「auto_now_add」「auto_now」オプションの挙動を詳しく調べてみた

Django モデルに登録日時や更新日時のフィールドを付加する場合、「auto_now_add」オプションや「auto_now」オプションを利用すると便利です。それらのオプションの挙動について詳しく調べてみたので、まとめておきます。

f:id:akiyoko:20200521233958p:plain

TL;DR


挙動

たとえば、

shop/models.py

from django.db import models


class Book(models.Model):
    """本モデル"""

    class Meta:
        db_table = 'book'
        verbose_name = verbose_name_plural = '本'

    title = models.CharField('タイトル', max_length=255)
    price = models.PositiveIntegerField('価格', null=True, blank=True)
    created_at = models.DateTimeField('登録日時', auto_now_add=True)
    updated_at = models.DateTimeField('更新日時', auto_now=True)

    def __str__(self):
        return self.title

というフィールドがあるとすると、

登録時

  • 「auto_now_add=True」のフィールド(created_at)に現在日時が自動的にセットされる
  • 「auto_now=True」のフィールド(updated_at)に現在日時が自動的にセットされる

更新時

  • 「auto_now=True」のフィールド(updated_at)に現在日時が自動的にセットされる

という挙動になります。


つまり、テストを書くとこういうことになります(参考までに freezegununittest.mock を使ったものを併記)。


shop/tests/test_models.py

from datetime import datetime
from unittest.mock import patch

from django.test import TestCase
from django.utils import timezone
from freezegun import freeze_time

from ..models import Book


class TestBook(TestCase):

    @freeze_time('2020-01-01 01:01:01')
    def test_save_with_freezegun(self):
        book = Book(title='Django本', price=1500)
        # 登録
        book.save()

        # 登録日時・更新日時のどちらも値がセットされる
        self.assertEqual(book.created_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))
        self.assertEqual(book.updated_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))

        with(freeze_time('2020-02-02 02:02:02')):
            # 更新
            book.save()

        # 更新日時のみが更新される
        self.assertEqual(book.created_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))
        self.assertEqual(book.updated_at, datetime(2020, 2, 2, 2, 2, 2, tzinfo=timezone.utc))

    @patch('django.utils.timezone.now',
           return_value=datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))
    def test_save_with_mock(self, _mock_now):
        book = Book(title='Django本', price=1500)
        # 登録
        book.save()

        # 登録日時・更新日時のどちらも値がセットされる
        self.assertEqual(book.created_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))
        self.assertEqual(book.updated_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))

        _mock_now.return_value = datetime(2020, 2, 2, 2, 2, 2, tzinfo=timezone.utc)
        # 更新
        book.save()

        # 更新日時のみが更新される
        self.assertEqual(book.created_at, datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc))
        self.assertEqual(book.updated_at, datetime(2020, 2, 2, 2, 2, 2, tzinfo=timezone.utc))



 
フィールドに現在日時が自動的にセットされる仕組みを見てみると、次のように、pre_save() で django.utils.timezone.now() が呼ばれています。

django.db.models.fields.DateTimeField.pre_save *1

    def pre_save(self, model_instance, add):
        if self.auto_now or (self.auto_now_add and add):
            value = timezone.now()
            setattr(model_instance, self.attname, value)
            return value
        else:
            return super().pre_save(model_instance, add)


そして django.utils.timezone.now() では、Django の設定ファイルの「USE_TZ」が True の場合は datetime.datetime.utcnow() が呼ばれています。

django.utils.timezone.now *2

def now():
    """
    Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
    """
    if settings.USE_TZ:
        # timeit shows that datetime.now(tz=utc) is 24% slower
        return datetime.utcnow().replace(tzinfo=utc)
    else:
        return datetime.now()


freezegun の freezegun.api.FakeDatetime が次のように datetime.datetime.now() や utcnow() などをモックしてくれているので、「auto_now_add」や「auto_now」にも適用できるのですね。よかった。

freezegun.api.FakeDatetime *3

class FakeDatetime(with_metaclass(FakeDatetimeMeta, real_datetime, FakeDate)):

    ...(略)...

    @classmethod
    def now(cls, tz=None):
        now = cls._time_to_freeze() or real_datetime.now()
        if tz:
            result = tz.fromutc(now.replace(tzinfo=tz)) + cls._tz_offset()
        else:
            result = now + cls._tz_offset()
        return datetime_to_fakedatetime(result)

    ...(略)...

    @classmethod
    def utcnow(cls):
        result = cls._time_to_freeze() or real_datetime.utcnow()
        return datetime_to_fakedatetime(result)

    ...(略)...


 

「auto_now_add」や「auto_now」を使うことによる弊害

便利でよいのですが、二点ほど弊害があります。

1.任意の値で更新できない

実例を挙げると、

>>> from shop.models import Book
>>> from datetime import datetime
>>> from django.utils import timezone
>>> book = Book()
>>> book.updated_at = datetime(2020, 1, 1, 1, 1, 1, tzinfo=timezone.utc)
>>> book.save()
>>> book.updated_at
datetime.datetime(2020, 5, 21, 6, 41, 7, 219328, tzinfo=<UTC>)

という感じで、保存時に現在日時で上書きされてしまいます。

(参考)www.ianlewis.org


しかしながら、登録日時や更新日時フィールドに「auto_now_add」および「auto_now」オプションを利用する場合、任意の値で更新したいユースケースとしてはユニットテストのときくらいでしょうから、実害はあまり無いと言えるかもしれません。
 

2.管理サイトの詳細画面で表示されない

「auto_now_add」もしくは「auto_now」オプションを利用すると、自動的に editable オプションが False になるので、管理サイトの詳細画面で表示されなくなります。

f:id:akiyoko:20200521232712p:plain

django.db.models.fields.DateField.__init__ *4

class DateField(DateTimeCheckMixin, Field):
    ...(略)...

    def __init__(self, verbose_name=None, name=None, auto_now=False,
                 auto_now_add=False, **kwargs):
        self.auto_now, self.auto_now_add = auto_now, auto_now_add
        if auto_now or auto_now_add:
            kwargs['editable'] = False
            kwargs['blank'] = True
        super().__init__(verbose_name, name, **kwargs)

    ...(略)...

class DateTimeField(DateField):
    ...(略)...

    # __init__ is inherited from DateField


詳細画面にフィールドを表示するだけであれば(任意の値で登録・更新できないが)、ModelAdmin の「fields」と「readonly_fields」に同時に列挙することで対応は可能です。

shop/admin.py

from django.contrib import admin

from .models import Book


class BookAdmin(admin.ModelAdmin):
    fields = ('title', 'price', 'created_at', 'updated_at')
    readonly_fields = ('created_at', 'updated_at')


admin.site.register(Book, BookAdmin)

f:id:akiyoko:20200521233140p:plain



これらの弊害については一応解決策がありますが、ちょっと面倒です。あまりオススメしません。

stackoverflow.com



 

宣伝

Django の本を3冊書きました。Django 開発のお供にどうぞ。

現場で使える Django の教科書《基礎編》

★ Amazon(電子版/ペーパー版)


★ BOOTH(ペーパー版)


現場で使える Django の教科書《実践編》

★ Amazon(電子版)


★ BOOTH(ペーパー版)


現場で使える Django REST Framework の教科書

★ Amazon(電子版)


★ BOOTH(ペーパー版)

PyCharm のオレオレ最強設定(2020.1 バージョン)

PyCharm 大好き akiyoko です。

以前、「PyCharm のオレオレ最強設定」という記事を書いたのですが、あれから3年経ち、PyCharm もどんどん新しいバージョンがリリースされる中で記事の内容が少し古くなっていたので、今回、最新バージョンの「PyCharm 2020.1」に合わせて記事を書き直してみました。


f:id:akiyoko:20200508040938p:plain


PyCharm を含めた JetBrains 社の IDE は「out of the box(箱から取り出してすぐに使える、難しい設定などは一切なしで使える)」というのが大きな魅力のひとつですが、今回紹介する環境設定をすることでさらなる実力を発揮させることができます。


なお、PyCharm には大きく分けて、無償版の「PyCharm CE(Community Edition)」と有償版の「PyCharm Professional」がありますが *1、「PyCharm CE」の設定は「PyCharm Professional」でもそのまま利用可能です。



目次


今回の設定については

  • バージョン:PyCharm CE 2020.1
  • OS:Windows 10 Home / macOS 10.15 Catalina

で動作確認しています(画面キャプチャは Windows 版のもの)。


なお、今回紹介するのはあくまで筆者の(オレオレ)最強設定ですので、異論・反論は緩やかな範囲でお願いします。


 

PyCharm CE のインストール手順

まずは PyCharm CE 2020.1 のインストール手順について軽く説明します。


PyCharm 公式ダウンロードページ から、「コミュニティ」(PyCharm CE)の方の「ダウンロード」ボタンをクリックして、インストーラをダウンロードします。

f:id:akiyoko:20200508034016p:plain


あとはインストーラをダブルクリックして、表示される内容に従ってインストールを実行してください。


f:id:akiyoko:20200501114537p:plain:w400


デフォルトでは、Windows の場合は

  • C:\Program Files\JetBrains\PyCharm Community Edition 2020.1

macOS の場合は

  • ~/Library/Application Support/JetBrains/PyCharmCE2020.1

にインストールされます。


 

環境設定

上部メニューの[File] > [Settings](macOS 版では[PyCharm] > [Preferences])から、PyCharm の環境設定が変更できます。

1.テーマ設定

[Appearance & Behavior] > [Appearance]

[Theme] をデフォルトの「IntelliJ Light」から、「Darcura」(少し暗めのテーマ)に変更します。あくまで任意で。 *2

f:id:akiyoko:20200501125359p:plain

理由:かっこいいから。


ちなみに、「Darcula」テーマはこんな感じの画面になります。

f:id:akiyoko:20200507035200p:plain


 

2.エディタ外観

[Editor] > [General] > [Appearance]

[Show whitespaces]にチェックを入れます。

f:id:akiyoko:20200501115211p:plain

「Leading(行頭)」「Inner(行内)」「Trailing(行末)」にもチェックが入っていることを確認してください。


理由:半角スペース、全角スペースを可視化したいから。


 

3.コード補完

[Editor] > [General] > [Code Completion]

[Match case]のチェックを外します。

f:id:akiyoko:20200501115517p:plain

理由:コード補完(Ctrl + スペース)の際に、大文字小文字を区別しないで補完してほしいから。

(参考)コード補完 - ヘルプ | PyCharm


 

4.コードの折りたたみ

[Editor] > [General] > [Code Folding]

[Fold by default]から、「Imports」のチェックを外します。

f:id:akiyoko:20200501173118p:plain

理由:import 文がデフォルトで折りたたまれていると、レビューしにくいから。


 

5.タブの表示数

[Editor] > [General] > [Editor Tabs]

[Closing Policy]の[Tab limit]を「10」から「50」に変更します。

f:id:akiyoko:20200501172330p:plain

理由:タブを 10 個以上開くと勝手に閉じちゃう設定だと使いにくいから。


 

6.フォントサイズ設定

[Editor] > [Font]

[Size]を「12」(デフォルトは「13」)くらいにしておきます。

f:id:akiyoko:20200501120518p:plain

理由:できるだけ広い範囲でコードを見たいから。


 

7.改行コード設定

[Editor] > [Code Style]

[General]タブの[Line separator]を「Unix and macOS (\n)」に変更します。macOS 版の場合は「System-Dependent」のままでOKです。

f:id:akiyoko:20200501120725p:plain

理由:macOS で編集したコードとの差異を無くしたいから。


 

8.Python コードスタイル設定

[Editor] > [Code Style]> [Python]

8.1.一行あたりの文字数設定

[Wrapping and Braces]タブの[Hard wrap at]を「100」に変更します(デフォルトは「120」)。なお、一行あたりの文字数はプロジェクトのルールに適宜合わせてください。

f:id:akiyoko:20200501123713p:plain

理由:PyCharm の自動フォーマットを使ったときに規定文字数で自動的に折り返ししてほしいから。

8.2.import文のソート

[Imports]タブの[Sort import statements]で、「Sort imported names in "from" imports」(from 節でインポートした名前をソート)にチェックを入れます。

同じく、[Imports]タブの[Structure of "from" imports]は、デフォルトの「Leave as is」から「Join imports with the same source」(同じソースでインポートを結合)に変更します。

f:id:akiyoko:20200501124326p:plain

理由:

  • import文の自動フォーマットを使用したときに、from 節内の複数 import を自動ソートしてほしいから。
  • import文の自動フォーマットを使用したときに、from 節が同一の import 文を自動で一行にまとめてほしいから。


(参考)コード・スタイル: Python - ヘルプ | PyCharm


 

9.PEP8 違反の警告

[Editor] > [Inspections]

  • [PEP8 coding style violation]
  • [PEP8 naming conversion violation]

の「Severity」を「Week warning」から「Warning」に変更。

f:id:akiyoko:20200501184523p:plain

理由:PEP8 違反の警告をワーニングに上げたいから。


(参考)最強のPython統合開発環境PyCharm - Qiita


 

10.プラグイン

[Plugins]

から、完全に好みで プラグインをインストールします。

  • CodeGlance(Sublime Text のミニマップ風プラグイン)
  • black-pycharm(black フォーマッタプラグイン)
  • IdeaVim(Vim エミュレータプラグイン)

インストールしていないプラグインは、検索して「Install」ボタンをクリックするとオンラインのリポジトリからダウンロードしてインストールすることができます。


f:id:akiyoko:20200503160741p:plain


 

VMオプション設定

[Help] > [Edit Custom VM Options...]

を選択すると、VMオプションの設定をカスタマイズするためのファイルを編集することができます。 *3

11.メモリ設定

デフォルトのヒープメモリサイズを 2GB くらいに増やしておきます。たとえば、

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
...(略)...

となっているのを、

-Xms128m
-Xmx2048m
-XX:ReservedCodeCacheSize=240m
...(略)...

と書き換えて、PyCharm を再起動します。


(参考)高度な構成 - ヘルプ | PyCharm


 

プロジェクトツールウィンドウ設定

プロジェクト・ビューの歯車アイコンをクリックして、ツールウィンドウの設定をおこないます。
 

12.プロジェクト・ビューの表示設定

  • [Open Files with Single Click](プロジェクト・ビューからシングルクリックでソースビューを開く)
  • [Always Select Opened File](ソースビューを開くとプロジェクト・ビューに該当モジュールがフォーカスする)

にチェックを入れておきます。

f:id:akiyoko:20200501174811p:plain

理由:プロジェクト・ビューとエディタを連動させたいから。


 

日本語化

「Pleiades 日本語化プラグイン」を利用すれば、PyCharm の UI を日本語化することも可能です。ただし JetBrains 公式のものではないため、動作は保証されていないのでご注意ください。


pleiades.io

 

13.Pleiades 日本語化プラグインの導入手順

まず、「Pleiades 日本語化プラグイン」のダウンロードサイト から zip ファイルをダウンロードします(OS に合わせてダウンロードしてください)。

f:id:akiyoko:20200508043630p:plain

なお、PyCharm バージョン 2020.1 に対応した最新の Pleiades 日本語化プラグインを使用しないと動作しないのでご注意ください。 *4



zipファイルを解凍し、setup.exe(macOS の場合は setup.app)をダブルクリックしてインストーラを起動します。


f:id:akiyoko:20200508043953p:plain:w400


「日本語化するアプリケーション」の「選択」ボタンをクリックして、Windows の場合は

  • C:\Program Files\JetBrains\PyCharm Community Edition 2020.1\bin\pycharm64.exe

macOS の場合は

  • /Applications/PyCharm CE.app

を選択して、「日本語化する」ボタンをクリックします。


f:id:akiyoko:20200508043705p:plain:w400


あとは、PyCharm を再起動すれば OK です。


f:id:akiyoko:20200508043718p:plain


 

便利なショートカット集

最後に非常に便利なショートカットをいくつか紹介します。

JetBrains 公式の PyCharm チートシート

もありますが、さすがに全部覚えきれませんよね。そこで、私が特に重要と考えるショートカットを抜粋してみました。黄色で強調したショートカットだけでも覚えておくと、効率が劇的に上がりますのでぜひ活用してください。

 

コードフォーマット
Windows
macOS
説明
Ctrl + Alt + L option + ⌘ + L コードの自動フォーマット
Ctrl + Alt + O control + option + O import文の自動フォーマット

 

検索
Windows
macOS
説明
Ctrl + F ⌘ + F ファイル内検索
(Shift +) F3 ⌘ + (shift +) G ファイル内検索結果の前後を表示
Ctrl + Shift + F ⌘ + shift + F パス内検索
Alt + F7 option + F7 関数・メソッドを使用している箇所を検索して Find ウィンドウに表示
Ctrl + Alt + ↓ (↑) ⌘ + option + ↓ (↑) Findウィンドウの検索結果の前後を表示
Ctrl + Alt + ← (→) ⌘ + option + ← (→) 履歴の前後を表示
Ctrl + B ⌘ + B 関数・メソッドの宣言箇所にジャンプ

 

ファイルを開く
Windows
macOS
説明
Shift x 2 (素早く2回) shift x 2 (素早く2回) クイック検索
Ctrl + E ⌘ + E 最近開いたファイルを開く
Ctrl + Shift + N ⌘ + shift + O ファイル名でファイルを開く

 

タブ移動
Windows
macOS
説明
Alt + ← (→) control + ← (→) タブ移動

 

差分表示
Windows
macOS
説明
(プロジェクト・ビューで) Ctrl + D (プロジェクト・ビューで) ⌘ + D 別ファイルとの Diff

 

その他
Windows
macOS
説明
Ctrl + Shift + S ⌘ + ,(カンマ) 環境設定を開く
Ctrl + Shift + A ⌘ + shift + A 利用できるアクションを検索

 

まとめ

個人的に、PyCharm は Python の統合開発環境(IDE)として最強だと考えています。デフォルトの環境設定を何もイジらなくても快適に動いてくれるというのも大きな魅力のひとつが、今回のような環境設定をすると PyCharm はさらに使いやすくなります。


それでは、素敵な PyCharm ライフを!



 

宣伝

Django の本を3冊書きました。Django 開発のお供にどうぞ。

現場で使える Django の教科書《基礎編》

★ Amazon(電子版/ペーパー版)


★ BOOTH(ペーパー版)


現場で使える Django の教科書《実践編》

★ Amazon(電子版)


★ BOOTH(ペーパー版)


現場で使える Django REST Framework の教科書

★ Amazon(電子版)


★ BOOTH(ペーパー版)

*1:その他にも Educational 版があります

*2:macOS 版ではデフォルトが「Darcura」になっているようです。少なくとも私の環境では。

*3:Windows の場合は「~\AppData\Roaming\JetBrains\PyCharmCE2020.1\pycharm64.exe.vmoptions」、macOS の場合は「~/Library/Application Support/JetBrains/PyCharmCE2020.1/pycharm.vmoptions」がデフォルトです。

*4:IntelliJ IDEA / PyCharm 等 JetBrains IDE 2020.1 アップデート関連の問題と対処 | JetBrains ブログ

Windows + Python 3.8 で pip install mysqlclient が失敗する原因と対策

Windows + Python 3.8 の環境下で pip install mysqlclient が失敗する原因と対策について、備忘録をまとめておきます。

結論

Windows 10 + Python 3.8 + pip 19.2.2 以前という環境で、mysqlclient 1.4.6 の pip インストールが失敗する。その際、「Microsoft Visual C++ 14.0 is required」あるいは「include ファイルを開けません。'mysql.h':No such file or directory」といったエラーが出る。

対策としては、pip のバージョンを 19.2.3 以降にアップグレードするだけ。

なお、Microsoft Visual C++ をインストールする必要はありません。



詳細

エラー(その1)

PC に Visual C++ がインストールされていない状況では、「error: Microsoft Visual C++ 14.0 is required」というエラーが出ます。しかし、Visual C++ をインストールしても後述するエラー(その2)が出てしまい、根本解決には至りません。

《 発生条件 》
  • Windows 10
  • Python 3.8.2
  • pip 19.2.2
  • Microsoft Visual C++ 14.0 以降が未インストール
《 エラー内容 》
(venv) C:\Users\akiyoko\work\mysqlclient-test>pip install --no-cache-dir mysqlclient
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz (85kB)
     |████████████████████████████████| 92kB 990kB/s
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\akiyoko\work\mysqlclient-test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-yluhih0a\\mysqlclient\\setup.py'"'"'; __file__='"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-yluhih0a\\mysqlclient\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\akiyoko\AppData\Local\Temp\pip-record-4l7b4jv9\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\akiyoko\work\mysqlclient-test\venv\include\site\python3.8\mysqlclient'
         cwd: C:\Users\akiyoko\AppData\Local\Temp\pip-install-yluhih0a\mysqlclient\
    Complete output (24 lines):
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.8
    creating build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\__init__.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\_exceptions.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\compat.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\connections.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\converters.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\cursors.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\release.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\times.py -> build\lib.win-amd64-3.8\MySQLdb
    creating build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\__init__.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CLIENT.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CR.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\ER.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FIELD_TYPE.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FLAG.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    running build_ext
    building 'MySQLdb._mysql' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
    ----------------------------------------
ERROR: Command errored out with exit status 1: 
    ...(略)...


ちなみに、Visual Studio Community 2019 のインストール時に、Visual C++ を合わせてインストールすることができます(根本解決にはならないので悪しからず)。手順を以下に示します(が、やるだけ無駄ですのでご注意を)。

Visual Studio 2019 のダウンロードページ から、コミュニティ版のインストーラをダウンロードします。

f:id:akiyoko:20200420222420p:plain:w400

ダウンロードしたインストーラをダブルクリックすると、Visual Studio Installer が起動します。「個別のコンポーネント」から「Visual C++」を検索して、「C++ x64/x86 ビルドツール」を選択してインストールします。

f:id:akiyoko:20200420223318p:plain:w500

「Visual C++」がインストールできました。Windows の「アプリと機能」から確認可能です。

f:id:akiyoko:20200420223337p:plain:w400


なお、「Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019」は、https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads からも exe ファイルを直接ダウンロードしてインストールが可能です。PC の環境に合わせてご利用ください(私の環境は「x64」でした)。




エラー(その2)

PC にすでに Visual C++ がインストールされていても、pip のバージョンが 19.2.2 以前だと、「fatal error C1083: include ファイルを開けません。'mysql.h':No such file or directory」というエラーが出てしまいます。

《 発生条件 》
  • Windows 10
  • Python 3.8.2
  • pip 19.2.2
  • Microsoft Visual C++ 14.0 以降がインストール済み
《 エラー内容 》
(venv) C:\Users\akiyoko\work\mysqlclient-test>pip install --no-cache-dir mysqlclient
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz (85kB)
     |████████████████████████████████| 92kB 845kB/s
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\akiyoko\work\mysqlclient-test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-kp34ucod\\mysqlclient\\setup.py'"'"'; __file__='"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-kp34ucod\\mysqlclient\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\akiyoko\AppData\Local\Temp\pip-record-3csqetin\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\akiyoko\work\mysqlclient-test\venv\include\site\python3.8\mysqlclient'
         cwd: C:\Users\akiyoko\AppData\Local\Temp\pip-install-kp34ucod\mysqlclient\
    Complete output (30 lines):
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.8
    creating build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\__init__.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\_exceptions.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\compat.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\connections.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\converters.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\cursors.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\release.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\times.py -> build\lib.win-amd64-3.8\MySQLdb
    creating build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\__init__.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CLIENT.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CR.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\ER.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FIELD_TYPE.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FLAG.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    running build_ext
    building 'MySQLdb._mysql' extension
    creating build\temp.win-amd64-3.8
    creating build\temp.win-amd64-3.8\Release
    creating build\temp.win-amd64-3.8\Release\MySQLdb
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Dversion_info=(1,4,6,'final',0) -D__version__=1.4.6 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include\mariadb" -Ic:\users\akiyoko\work\mysqlclient-test\venv\include -IC:\Users\akiyoko\AppData\Local\Programs\Python\Python38\include -IC:\Users\akiyoko\AppData\Local\Programs\Python\Python38\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include" /TcMySQLdb/_mysql.c /Fobuild\temp.win-amd64-3.8\Release\MySQLdb/_mysql.obj /Zl /D_CRT_SECURE_NO_WARNINGS
    _mysql.c
    MySQLdb/_mysql.c(29): fatal error C1083: include ファイルを開けません。'mysql.h':No such file or directory
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
    ----------------------------------------
ERROR: Command errored out with exit status 1:
    ...(略)...

 

原因

根本原因

同じ環境でも pip のバージョンによって、対応している Python のバージョンと ABIタグの組み合わせが微妙に異なっているということが分かりました。具体的には、バージョン 19.2.3 の前後で

  • pip(バージョン 19.2.2 以前)では、Python バージョン「3.8」に対応する ABIタグは「cp38m」のみ
  • pip(バージョン 19.2.3 以降)では、Python バージョン「3.8」に対応する ABIタグは「cp38」のみ

となっていたのですが、この差は、

github.com

から出てきたものと思われます。
なお、対応している Python バージョンと ABIタグの組み合わせは、

>>> from pip._internal.pep425tags import get_supported
>>> get_supported()

の実行結果から確認可能です。


一方の mysqlclient は、PyPI でソースコード形式と(コンパイル済みの C拡張を含んだ)wheel形式が配布されているのですが、最新バージョンの「1.4.6」では、Pythonバージョン「3.8」と ABIタグ「cp38」の組み合わせに対応する 「mysqlclient‑1.4.6‑cp38‑cp38‑win_amd64.whl」は用意されているものの、Pythonバージョン「3.8」と ABIタグ「cp38m」の組み合わせに対応する「mysqlclient‑1.4.6‑cp38‑cp38m‑win_amd64.whl」は用意されておらず、ソースコードをローカルでビルドしようとしてエラーになっているものと推測されます。 *1

そもそも、wheel形式の配布物が利用できないのが根本原因で、これが利用できれば C++ によるビルドは必要ないはずです。


どうしてこのような状況になるのか?

Python をインストールしたときに合わせてインストールされた pip が古いままになっている(現在は最新の Python 3.8.2 をインストールするとバージョン「19.2.3」の pip が同梱されます)、あるいは、PyCharm 内部で利用されている pip のバージョンが古い(PyCharm 2019.3 では「19.0.3」だったが、最新版の PyCharm 2020.1 では「20.0.2」となっていてこの事象は解消済み)などの状況が考えられます。




*1:非公式ですが、Python Extension Packages for Windows - Christoph Gohlke から確認可能

2019年の akiyoko blog 振り返り

明けましておめでとうございます。
毎年恒例となっている昨年のブログの振り返りから、今年もスタートです。


ちなみに 2018年の振り返りはこんな感じでした。

<過去記事>
akiyoko.hatenablog.jp


2019年の akiyoko blog 振り返り

昨年一年間にアップした記事の本数は 6本で、昨年の 12本から半減しました。2018年に引き続いてずっと Django 本の執筆をしていたからですが、アウトプットの全体量が減ったというわけではありません。カンファレンスやオープンセミナーでの登壇や新人教育、同人誌の頒布など、むしろアウトプットは激増していると思います。

ちなみに、記事の更新頻度が減ったからか、ブログ全体のアクセス数も一昨年の 3/4 ほどに減ってしまっていました。


ブログ記事ごとのアクセス数ランキング(akiyoko blog 2019年)

記事ごとのアクセス数ランキングです。2019年内のアクセス数(*1)ランキング上位 30本をリストアップしています。

なお昨年中に書いた記事 6本中、30位以内に入ったのは 1本のみでした。 *2


# 昨年比 タイトル 作成日 ポイント
1 「プロジェクトマネージャ試験」に一発合格するための三か条 - akiyoko blog 2014/10/26 74.5
2 PyCharm のオレオレ最強設定 - akiyoko blog 2017/03/10 63.4
3 「一対一」「一対多」「多対多」のリレーションを分かりやすく説明する - akiyoko blog 2016/07/31 55.5
4 初学者・初級者向け Django の学習ロードマップ - akiyoko blog 2018/12/01 39.6
5 pandas.DataFrame の列の抽出(射影)および行の抽出(選択)方法まとめ - akiyoko blog 2017/04/03 34.7
6 無料版 PyCharm で Django 開発環境を構築するまでの手順(「現場で使える 基礎 Django」本の補講その2) - akiyoko blog 2018/06/17 30.6
7 IPA「情報セキュリティマネジメント試験」に一夜漬けで合格するためのたった二つの勉強法 - akiyoko blog 2016/11/17 19.8
8 AppStore 登録前の iOSアプリを Ad-Hoc で配布してインストールする方法 - akiyoko blog 2014/08/23 18.6
9 PyCharm で Django の開発をするなら絶対やっておくべき便利な設定 - akiyoko blog 2019/12/06 16.3
10 まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog 2017/12/09 15.0
11 Mac の MySQL クライアントに「Sequel Pro」を使っているなら PostgreSQL クライアントは「PSequel」がオススメ - akiyoko blog 2016/07/29 14.7
12 Apple Developer Program の有効期限が切れてしまったときの対処方法 - akiyoko blog 2015/11/13 13.4
13 Django ORM の select_related, prefetch_related の挙動を詳しく調べてみた - akiyoko blog 2016/08/03 11.7
14 matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog 2017/04/11 11.3
15 Git で コミットを無かったことにする方法 (git revert の使い方) - akiyoko blog 2014/08/21 11.2
16 Video.js を使って HLS形式の動画をストリーミング再生する - akiyoko blog 2015/08/11 11.0
17 ゼロからはじめる Amazon QuickSight(AWS でお手軽データ分析 その3/3) - akiyoko blog 2017/03/15 10.4
18 GitHub の Wiki に画像を貼り付ける一番簡単な方法(Wiki リポジトリを clone しないバージョン) - akiyoko blog 2016/08/30 9.5
19 Python で MagicMock を使う - akiyoko blog 2015/01/04 8.7
20 Ansible 初心者なら、まずは Ansible Galaxy から始めてみよう - akiyoko blog 2015/12/06 8.4
21 Python でリストのソートまとめ - akiyoko blog 2014/09/26 8.3
22 Pythonで単回帰直線 - akiyoko blog 2013/06/16 7.8
23 Pandas の DataFrame の基本的な使い方 - akiyoko blog 2017/03/27 7.0
24 まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ! - akiyoko blog 2017/12/19 7.0
25 ゼロからはじめる Django で ECサイト構築(その1:ECパッケージの選定) - akiyoko blog 2016/05/24 6.7
26 JavaScript で配列の添え字に文字列やマイナス値を使ったときの挙動 - akiyoko blog 2015/03/21 6.6
27 Django ORM の SQL を出力する方法まとめ - akiyoko blog 2016/08/04 6.1
28 PyCharm のデータベースツールが最強。ER図も簡単に書き出せるよ - akiyoko blog 2016/03/13 5.7
29 見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ! - akiyoko blog 2015/12/23 5.5
30 「あなたの趣味は?」のアンケート結果を R で因子分析してみた - akiyoko blog 2017/12/04 5.5

かなり前に書いた Python・Django 系の記事がいくつかランキングに返り咲いていたのが興味深いです。


今年の目標

今年は、引き続き Django を盛り上げていくのはもちろんのこと、今執筆している商業誌をしっかりと書き上げることを大目標にしていきたいです。今年もすでにいろいろとイベントが予定されていて忙しそうなのですが、なんとか乗り切っていきたいと思います。

今年もよろしくお願い致します。


f:id:akiyoko:20200103114643p:plain:w350

*1:純粋な PV数ではなく、作成日からの日数で割ったポイントで算出しています。

*2:作成日のところを黄色く塗っています。

PyCharm で Django の開発をするなら絶対やっておくべき便利な設定

この投稿は 「Django Advent Calendar 2019 - Qiita」 6日目の記事です。

Python 開発の IDE には「PyCharm」を激推ししている akiyoko です。
推しの理由は、以下の点が非常に有用だと感じているからです(JetBrains のステマじゃないですよん 😅)。

  • インストールしたそのままの状態で快適に使える
  • venv」(仮想環境を作成するためのモジュール)や「pip」(パッケージ管理ツール)のコマンドの使い方が分からなくても、画面からポチポチと操作できる
  • コードジャンプ機能と自動整形機能を使うことで開発効率が著しく向上する
  • デバッグ実行を使うことでコード解析が捗る


中でもデバッグ実行が便利ですよね。ライブラリの中もどんどん潜ってデバッグ実行できるので、障害解析やコードの理解が格段に捗ります。


Django の開発をする際にももちろん PyCharm を愛用しています。プライベートでは有償版の PyCharm Professional Edition を利用していますが、仕事では無償版の PyCharm CE(Community Edition)を利用しています。



PyCharm の開発元 JetBrains の 昨年の調査 によると、Webアプリ開発をするときは 30〜40%くらいの方が PyCharm(有償版・無償版を合わせて)を利用しているとのこと。私の周りのつよつよ Pythonista の方でも PyCharm を愛用している人は多いです。

この記事を書くにあたって事前に統合開発環境(IDE)の利用状況をアンケートしてみたのですが、

PyCharm の利用率が 30〜40%なのは JetBrains の調査と概ね合致します。
それにしても、VS Code の勢いがすごいですね!
Webアプリ開発ではフロントエンドまわりの面倒も見なくてはいけないことが多々あるので、JS まわりのサポートが弱い PyCharm CE(無償版)よりも、VS Code が選ばれるという状況があるのかなと感じました。皆さま、アンケートにご協力ありがとうございました 🙇‍♂️



前置きが長くなりましたが、ここから本題です。

有償版・無償版を問わず、PyCharm を利用して Django プロジェクトの開発をするなら「これだけはぜひ設定しておいてほしい」という便利な設定があります。


それは、「runserver」の実行(Run / Debug)設定 です。



この設定をすることで、

  • ワンクリックで runserver のデバッグ実行が可能
  • runserver の実行で PyCharm のターミナルツールウィンドウを専有しない

というメリットが得られます。



runserver の実行(Run / Debug)設定

では、その設定方法です。*1


Django プロジェクトのひな型を作成する際に「startproject」コマンドを実行すると、管理コマンドを実行するための「manage.py」が自動生成されますよね。

その「manage.py」を右クリックし、「Create 'manage' ...」を選択 します。なお、すでにこのプロジェクトで Run / Debug 設定をしたことがある場合は「manage.py」の右クリック時にこの選択肢が表示されないのでご注意ください(その場合は「Run」>「Edit Configurations...」メニューから Run / Debug の設定をおこなってください)。

f:id:akiyoko:20191203080923p:plain

Run / Debug 設定画面が表示されるので、「Parameters」に「runserver」と入力して、「OK」をクリック します。この際、「Name」には、分かりやすいようにたとえば「runserver」と入力しておけばよいでしょう。

f:id:akiyoko:20191203080931p:plain:w500

Run / Debug 設定を済ませると、ナビゲーションバーの右側に「runserver」との表示がされます。

f:id:akiyoko:20191203080957p:plain

「runserver」の右側の虫アイコンをクリックすればデバッグ実行が開始されます。

f:id:akiyoko:20191203081003p:plain:w400


デバッグ実行を開始すると、デバッグツールウィンドウ(Debug タブ)が起動してコンソールにログが出力されます。コードの途中にブレークポイントを置いておけば、コードが実行されたときにそこで中断されて変数などがデバッグができるようになります。

f:id:akiyoko:20191204003907p:plain


デバッグツールウィンドウの使い方については、公式ヘルプの「デバッグツールウィンドウ - ヘルプ | PyCharm」を参照してください。



いつもなら runserver を実行するのに

> python manage.py runserver

というコマンドをターミナルツールウィンドウ(Terminal タブ)を使って実行するところを、デバッグ実行はそれとは別のデバッグツールウィンドウ(Debug タブ)上で動作するため、ターミナルのウィンドウを専有することがありません。このため、makemigration、migrate、createsuperuser などの管理コマンドを実行するために、わざわざターミナル上で実行している runserver を停止して、その後 runserver を再実行する・・なんてことをする手間が不要になるのです。


これは便利ですよね〜 😚




おまけ ①

ここで、便利な裏技(?)をひとつ紹介します。

デバッグ実行中にブレークポイントでコードの実行を止めた状態ではデバッグツールウィンドウに「Debugger(デバッガ)」と「Console(コンソール)」という2つのタブが表示されます。ここで、「Console」タブをクリックして、Python ロゴのアイコン(Show Python Prompt)をクリックしてみてください。


f:id:akiyoko:20191205033219p:plain:w550


すると、任意の Python コードが、止めたコード内で実行できるようになります。
ハイ、便利〜 😆


おまけ ②

runserver 実行時にオプションを指定したい場合がありますよね。

そんな場合は、ナビゲーションバー右側の「runserver」をクリックし、「Edit Configurations...」を選択して Run / Debug の設定画面を開きます(「Run」>「Edit Configurations...」メニューからでも開くことができます)。

f:id:akiyoko:20191205041253p:plain:w500


「Parameters」に設定している「runserver」のところを「runserver --settings xxx」などと書き換えることで、実行時のオプションが指定可能です。

f:id:akiyoko:20191205041641p:plain

また、「Environment variables」から「DJANGO_SETTINGS_MODULE」などの環境変数を設定することも可能です。


おまけ ③

runserver の他によく利用する Django の管理コマンドとして、「test」(ユニットテストの実行)があります。

今回紹介した runserver の実行設定と同じようにワンクリックで Django プロジェクトのユニットテストを実行したい場合は、次のように「runserver」の設定をコピーするのが簡単です。

コピーしたら、「Parameters」を「test」に書き換えます(「Name」も適宜「test」などと書き換えます)。

f:id:akiyoko:20191205041944p:plain


あとは、「Run」アイコンか「Debug」アイコンをクリックするだけで Django プロジェクトのユニットテストが実行できるようになります。

f:id:akiyoko:20191205043241p:plain:w500



おまけ ④

ここまでくると、Coverage.py を利用したカバレッジもワンクリックで実行したいですよね。

こんな感じで Run / Debug 設定をすれば OK です。

f:id:akiyoko:20191205042003p:plain

f:id:akiyoko:20191205042020p:plain

ポイントは、「Script path」のところを「Module name」に変更してから、「coverage」と手入力するところですかね(仮想環境下にインストールされた coverage の絶対パスを「Script path」に指定してもよいですが)。もちろん、pip で coverage をインストールしておいてくださいね。

ちなみに、有償版の PyCharm Professional では、PyCharm に内蔵された独自のカバレッジ機能を使ってワンクリックでカバレッジを取得することができます。*2



まとめ

PyCharm で Django の開発をするなら、runserver の実行(Run / Debug)設定をやっておきましょう。

  1. 「manage.py」を右クリックして「Create 'manage' ...」を選択
  2. Run / Debug 設定画面で「Parameters」に「runserver」と入力して「OK」

これだけです。ほんの5分足らず(もしかしたら1分くらいで??)で設定は終わります。

runserver のデバッグ実行をポチッとワンクリック(ショートカットもあります)でスタートできる便利さを味わうと、もう PyCharm から離れられませんよ〜 😙


Enjoy Django & PyCharm !! 😉


f:id:akiyoko:20191206074253p:plain




明日は、nogissh さんの「Django Advent Calendar 2019 - Qiita」7日目の記事です。よろしくお願いします。



 

宣伝

Django の本を3冊書きました。Django 開発のお供にどうぞ。

現場で使える Django の教科書《基礎編》

★ Amazon(電子版/ペーパー版)


★ BOOTH(ペーパー版)


現場で使える Django の教科書《実践編》

★ Amazon(電子版)


★ BOOTH(ペーパー版)


現場で使える Django REST Framework の教科書

★ Amazon(電子版)


★ BOOTH(ペーパー版)

*1:PyCharm のバージョンは Community Edition(無償版)の「2019.3」(現時点での最新バージョン)です。

*2:ビルトイン開発者用ツール - 機能 | PyCharm

DRF を使うなら必読!『現場で使える Django REST Framework の教科書』を技術書典7 で頒布します

9月22日に開催される 技術書典7 に、「あきよこブログ」として 4回目のサークル参加をします。

みなさん安心してください、今回も Django 本ですよ 😁


新刊は『現場で使える Django REST Framework の教科書』です。


f:id:akiyoko:20190908041824p:plain:w400



「Django REST Framework(通称 DRF)」にピンと来ない方がいるかもしれませんが、「Django」の上に乗っかった、API を作ることに特化したライブラリです。つまり DRF は、Python で REST API を作るためのフレームワークです。SPA(シングルページアプリケーション)やスマホアプリのバックエンドとして利用されることが多いです。Django も DRF も日本ではあまり知られていませんが、実は海外では結構有名です。

どんな内容?

技術書典6 で頒布した前作『現場で使える Django REST Framework の薄い本』にかなり大幅な加筆・改訂を加えて、「Django の教科書」シリーズとしてリニューアルしました。前作の124ページに対して、今作は204ページと大ボリュームの仕上がりになっています。

今のところ、同人誌を含めて 日本でオンリーワンの「Django REST Framework」の日本語書籍 になっています。

内容は、Django REST Framework を現場で使う際に必要となる基礎知識と発展的な Tips をまとめたものになっています。なお、Django REST Framework は Django をベースにしている部分があるので、Django についての解説に紙面を割いているところもあります。

前半は DRF の概要や全体像、コンポーネントごとの仕組みや使い方、セキュリティや認証などの基礎知識を座学で進めていきます。後半はチュートリアルおよび発展的な Tips という構成になっています。

後半のチュートリアルでは、Django も Django REST Framework も何にも分からないという方でもちょっとした SPA が作れるように、Django REST Framework と Vue.js を使った SPA のサンプルプロジェクトを2つ、簡単なものと少し難しめなものを用意しました。 これを手本に写経すれば、REST API を使った Webアプリケーションの仕組みが何となく掴めるでしょう。

目次

f:id:akiyoko:20190907201801p:plain:w500
f:id:akiyoko:20190908101706p:plain:w500

対象読者

対象読者としては、

  • Django は何となく分かるが、Django REST Framework は初めてという方
  • Django REST Framework のまとまった日本語情報を手に入れたい方
  • Django REST Framework + Vue.js で SPA を構築したい方
  • 現場で本格的に Django REST Framework を使いたい方

を想定しています。

最低限必要の知識としては「Django の仕組みが何となく理解できていること」です。Django 公式チュートリアルDjango Girls チュートリアル をひと通り終えたくらいであれば、何とか理解できるレベルになっているかと思います。拙著『現場で使える Django の教科書《基礎編》』を読み終えたくらいの知識があれば万全ですが、『現場で使える Django の教科書《実践編》』レベルの知識は不要でしょう。


前作の薄い本と何が違うの?

ざっと挙げるとこんな違いがあります。

  • 本文が204ページに大幅増(前作の124ページから1.6倍!)
  • DRF のコンポーネントの解説が充実
  • ユニットテストの章を新設
  • Tips(発展編)のトピック数が 5 ⇒ 13 に(ページ数は 11p ⇒ 31p)
  • 各種ライブラリは最新バージョンに対応

一番の特徴は、コンポーネントの解説を充実させたことです。「モデル・シリアライザ・ビュー・URLconf」で1つの章になっていたのを、それぞれ独立した章として新設しました。ページ数では、モデル 1p ⇒ 18p、シリアライザ 8p ⇒ 18p、ビュー 14p ⇒ 25p、URLconf 5p ⇒ 8p とそれぞれ大幅に増えています。特に、シリアライザは DRF の中でも大きな部分を占めるので、図を増やしてイチから分かりやすい解説を目指しました。

DRFではシリアライザとビューが特に重要と考えています。シリアライザはフォームと同様に使えるように作られたコンポーネントで、使うのにコツが必要です。一方、DRFのビューはキモの部分で、通常のビューとどう違うのか?どのクラスを継承すればよいのか?を理解する必要があります。新刊を読めばそのあたりもスッキリ理解できるようにいろいろと追記しました。

あと、Django 初心者に少し優しくなりました。特に、前作ではモデルについての説明を「Django と同じ。以上!」としていたのを、きちんと章立てをして解説しています。内容は『現場で使える Django の教科書《基礎編》』からのほぼ抜粋になりますが、スッキリとまとめ直した上で DRF 向けに修正を加えています。

新設した「ユニットテスト」の章もぜひ読んでほしいです。〆切ギリギリで入れるかどうか悩みましたが、教科書としてユニットテストは必須と判断しました。11pと短いながらも、Djangoのユニットテストの特徴やフロー、DRFでの具体的な書き方など、うまくまとめられたと自画自賛しています。

最終章のTips集では、

  • Browsable API
  • APIドキュメント
  • フィルタリング
  • ページネーション

などの機能解説や、

  • 関連モデルの扱い
  • フィールドの追加
  • ネストしたURL
  • カスタムアクション
  • トランザクション
  • 排他制御

など「こんなときはDRFではどうすればいいの?」という疑問にお答えしています。

「Djangoの教科書」シリーズの名に恥じないようDRFの基礎知識やノウハウをできる限り網羅しつつ、DRF初心者にも分かりやすく読めるように書きました。現場でDRFを使っている人、これから使う人の手元に置いてもらえるように頑張って書いたので、とにかく一度、手に取って読んでみていただければと思います。



そして、「そこまで言われても、前作の薄い本買っちゃったしなぁ。どうしよう・・」と悩んでいるあなたに朗報です。

前作『~の薄い本』を技術書典7に持ってきていただいた方、先着50名に、なんとワンコイン(500円)で新刊を買えるサービスを実施します!


f:id:akiyoko:20190908122859p:plain:w400

ただし、お一人様1冊限りでお願いします(薄い本にはスタンプを押させていただきますのでご了承ください)。


頒布本情報

既刊の『現場で使える Django の教科書《基礎編》』『現場で使える Django の教科書《実践編》』を含めて、「Django の教科書」シリーズが3冊揃っています。

なおいつものように「会場特別価格」です。


f:id:akiyoko:20190917121916p:plain:w300


f:id:akiyoko:20190917121947p:plain:w300


実は今回の技術書典に合わせて《実践編》を1年振りにリニューアルして、Django 2.2 対応等をおこないました。


これらの既刊については、Amazon や BOOTH で電子版とペーパー版が販売中です。


◆ 現場で使える Django の教科書《基礎編》 - Amazon(電子版・ペーパー版)

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

◆ 現場で使える Django の教科書《基礎編》 - BOOTH(ペーパー版)
現場で使える Django の教科書《基礎編》【紙の本】 - あきよこブログ(akiyoko blog) - BOOTH


◆ 現場で使える Django の教科書《実践編》 - Amazon(電子版)

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》

◆ 現場で使える Django の教科書《実践編》 - BOOTH(ペーパー版)
現場で使える Django の教科書《実践編》【紙の本】 - あきよこブログ(akiyoko blog) - BOOTH



頒布場所

日時は 9/22(日)11時から17時まで、頒布場所は池袋サンシャインシティ3F 展示ホール「お74C」の「あきよこブログ」です。

見本誌を置いてますので、立ち読みだけでもお気軽にどうぞ。

f:id:akiyoko:20190917122645p:plain



最後に

余裕をもって始めたはずの執筆ですが、急遽、《実践編》の改訂と増版をしたのもあり、今回もギリギリの入稿になってしまいました。出すものは全部出した感があるので、自分なりにスッキリしています。技術書典当日は晴れやかに迎えられそうです!