akiyoko blog

akiyoko の IT技術系ブログです

ベスト・オブ・Django本!

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


「Django」を勉強するときに一番困るのは、やっぱり 「Django本がない」 問題ですよね?


実際、Django 初心者や初級者のエンジニアがいざ本格的に勉強しようと思っても、Django の専門書が圧倒的に少ないという問題が大きな壁として立ちはだかっているのではないでしょうか。


あっても古いとか。

開発のプロが教える標準Django完全解説―Webアプリケーションフレームワーク (デベロッパー・ツール・シリーズ)

開発のプロが教える標準Django完全解説―Webアプリケーションフレームワーク (デベロッパー・ツール・シリーズ)

2008年発売って、Django のバージョンは 1.0 ですよね。
さすがに情報が古すぎます。。


あと、Django に割かれているページ数が少ないとか。

Pythonプロフェッショナルプログラミング第2版

Pythonプロフェッショナルプログラミング第2版

Django について書かれた章がありますが、それでも 20ページ程度しかありません。。


「もっと新しくて、ちゃんと全体を網羅している Django の専門書はないの??」
私も常々、こんな疑問を抱いていました。



書籍の充実した Ruby や PHP と比べて、Python のフルスタック Webアプリケーションフレームワークに関する書籍が少ないという問題が、Django があまり流行ってない大きな原因になっているのでは??というのが、私の率直な印象です。




で、見つけましたー!!


私が自信を持ってオススメできる ベスト・オブ・ Django本が「Two Scoops of Django: Best Practices for Django 1.8」 です!

Two Scoops of Django: Best Practices for Django 1.8

Two Scoops of Django: Best Practices for Django 1.8


残念ながら全編英語の本ですが(*1)、設計のベストプラクティスから細かな Tips まで詳細に分かりやすく解説されている Django の専門書です。


対象者は、初心者というよりも、チュートリアル を読み終えたくらいの初級者から、現場で Django を何年か使っている中級者くらいを想定していると思われます。
専門書と言っても堅苦しさは全く無く、頻繁にアイスクリームショップの話が引き合いに出されたりと、ポップな世界観(!)を醸し出しています。


著者は Daniel Roy GreenfeldAudrey Roy Greenfeld の二人のエンジニアで(*2)、プロジェクトで Django を使い倒している超ベテランです。これまで、Django 1.5, 1.6 向けの Two Scoops of Djangoシリーズ を出版してきた経歴もあるので、本の内容の充実度ぶりは半端ないです。


本のタイトル「Two Scoops of Django(Django の 2つのスクープ)」の由来は、「二人がお届けする Django の最新情報(スクープ)」という意味と、Django をアイスクリームに見立てて「二すくい(スクープ)のアイスクリーム」という意味を掛けているんじゃないかと思われます。




ちなみに、現時点の Django の最新バージョンは 1.10 ですが、この本の対象バージョンは Django 1.8 です。しかしながら、1.8 は LTS(長期サポートバージョン)なので、少なくとも 2018年4月までは本家からセキュリティとバグフィックスが提供されることになるため、現場で使う場合も安心です。

f:id:akiyoko:20161122010842p:plain
Download Django | Django より引用)


著者は、次の「Two Scoops of Django」シリーズはバージョン 2.2 のリリース以降と言っているので、2019年まではこの「Two Scoops of Django: Best Practices for Django 1.8」にお世話になりそうです。なので、この本を買って 2019年まで読み倒すのがよいかと思います。


(2017/9/14 追記)

次の「Two Scoops of Django」シリーズはバージョン 2.2 のリリース以降、と言っていましたが、どういう心境の変化かバージョン 1.11 に対応した最新刊がつい先日発売になりました。バージョン 1.11 を導入する方にとっては朗報ですね!!

Two Scoops of Django 1.11: Best Practices for the Django Web Framework

Two Scoops of Django 1.11: Best Practices for the Django Web Framework


(2018/4/20 追記)

技術書典4」というイベントで、人生初の技術系同人誌「現場で使える 基礎 Django」を頒布することになりました。
動機はここにも書きましたが、「Django の日本語の書籍が少ない」と常々感じていたからです。「無いのなら 自分で書こう Django本」を実践してみたわけです。Django の日本語書籍が無くて困っている方、Django で一度挫折したことのある方に絶対オススメです。
あなたの「ベスト・オブ・Django本」になれますように。

techbookfest.org

akiyoko.hatenablog.jp



 

目次

ざっと内容を紹介しますが、詳細には触れていませんので興味がある内容が一つでもあれば実際に読んでみてもらえればと思います。

著者曰く、どの章から読み始めても問題ないそうです(実際、問題ありません)。


 

第1章:Coding Style(コーディングスタイル)
  • p.1〜
  • PEP8 に準拠すべし
  • OSSプロジェクトは1行79文字、その他のプロジェクトは1行99文字制限に
  • 明示的な相対インポートを使うべし
  • Django コーディングスタイル およびその他のガイドラインについて
第2章:The Optimal Django Environment Setup(最適なDjango環境設定)
  • p.13〜
  • 開発環境のセットアップについて
  • 開発環境と本番環境で別々のデータベースを使っている場合は要注意 *3
  • pip と virtualenv を使おう。virtualenvwrapper もオススメ
  • コードを Git や Mercurial でバージョン管理しよう
  • Vagrant + VirtualBox、Docker などを使って開発環境を仮想化する
第3章:How To Lay Out Django Projects(Djangoプロジェクトをどのようにレイアウトすべきか)
  • p.21〜
  • プロジェクトレイアウトのベストプラクティス(リポジトリルート/プロジェクトルート/コンフィグレーションルート)
  • virtualenv の格納場所はプロジェクト外に *4
  • startproject の代わりに、cookiecutter-django コマンドを使って究極の Djangoテンプレートプロジェクトを作成しよう
第4章:Fundamentals of Django App Design(Djangoアプリケーション設計の基本)
  • p.33〜
  • Django app(アプリケーション)を理解しよう。 *5
  • それぞれのアプリケーションは一つのタスクに集中すべき(一文で説明できるようにできるだけ小さく設計すべき)
  • アプリケーション名はメインとなるモデルの複数形にすべし *6
  • アプリケーションに含めるべきモジュール群(とネーミング)
第5章:Settings and Requirements Files(SettingsモジュールとRequirementsファイル)
  • p.41〜
  • 「SECRET_KEY」などのシークレットキー(*7)を除く全ての設定はバージョン管理下に置くべき
  • シークレットキーの設定には環境変数を使う(付録Eを参照)
  • アンチ local_settings.py パターンとして、各環境に合わせた Settingsモジュール(base.py/local.py/staging.py/test.py/production.py)を用意
  • Settingsモジュール内のファイルパスの書き方について
第6章:Model Best Practices(モデルのベストプラクティス)
  • p.63〜
  • django-model-utils の TimeStampedModel や django-extensions はどのプロジェクトでも便利に使える
  • モデルが5個までに収まるようにアプリケーションの大きさを設計する
  • 3種類のモデルの継承方法(abstract base classes, multi-table inheritance, proxy models)のうちどれを使うべきか *8, *9
  • データベースのマイグレーション方法について
  • テーブル設計で非正規化をする前にキャッシングを検討しよう
  • null=True, blank=True の使いどころ
  • models.field.GenericForeignKey はなるべく使わないようにしよう
  • モデルの _meta API について
  • モデルマネージャについて
  • ファットモデル志向(データ処理やビジネスロジックはモデルに集約)
  • モデルがファットになりすぎないように、Mixin やステートレスなヘルパー関数に分離しよう
第7章:Queries and the Database Layer(クエリとデータベース層)
  • p.81〜
  • ビューで単一のオブジェクトを取得する場合は get() の代わりに get_object_or_404() を使う *10
  • ObjectDoesNotExist はどのモデルでも共通で使える
  • get() で複数のオブジェクトが抽出されてしまう場合は MultipleObjectsReturned で判定
  • 遅延評価を理解しよう。長いクエリは読みやすいように分割しよう
  • Django 1.8 から UPPER, LOWER, SUBSTR などの関数が使えるように *11
  • 生の SQL は出来る限り書かないようにする *12
  • デフォルトのトランザクションはクエリごと *13
第8章:Function- and Class-Based Views(関数ベースおよびクラスベースのビュー)
  • p.95〜
  • 関数ベース、クラスベースのビューのどちらを使うべきか? *14
  • URLConf にロジックを書かない(ビューやモデルを使い回せるように分離)
  • アプリケーションレベルの namespace を使うと便利
  • URLConf のビューへの参照は文字列で書かない
第9章:Best Practices for Function-Based Views(関数ベースビューのベストプラクティス)
  • p.109〜
  • 再利用できない、クラスベースビューのように継承が使えない、のが難点
  • HttpRequest を引数にしたヘルパー関数やデコレータを使うことで、ビューをシンプルにできる
第10章:Best Practices for Class-Based Views(クラスベースビューのベストプラクティス)
  • p.117〜
  • 継承構造がややこしいのが難点
  • Mixin を利用しよう *15
  • 代表的な GCBV(generic class-based view)の紹介 *16
  • CBV + ModelForm, CBV + Form の例
  • django-braces の Mixin は GCBV の足りない部分を補完してくれるので便利
第11章:Form Fundamentals(フォームの基本)
  • p.137〜
  • ModelForm を使おう
  • 外部から入力された値はフォームでバリデーションすべし
  • データの更新を伴うリクエストには CSRF対策を施そう
  • Ajaxリクエストには、CSRF対策を施すか、HTTPヘッダに「X-CSRFToken」を設定する
  • django-braces の ModelForm Mixin は便利 *17
  • form.is_valid() の仕組み
第12章:Common Patterns for Forms(フォームのよくあるパターン)
  • p.149〜
  • フォーム関連の便利パッケージについて *18
  • clean() には複数フィールドにまたがる相関チェックを書く
  • clean(), clean_xxx() には、データベースに永続化されたデータを使ったバリデーションを書いても OK
  • Model とほぼ同じフィールドを Form に加えるときは、コピペせずに ModelForm の __init__ で self.fields を参照すればよい
第13章:Templates: Best Practices(テンプレート:ベストプラクティス)
  • p.167〜
  • テンプレートファイルは templates/ にひとまとめにしよう
  • 二層構造にする。それぞれのアプリケーションごとにベースのレイアウトを変えたい場合は(base.html を継承した)三層構造にする
  • "Flat is better than nested"
  • テンプレートレイヤでは必要以上にクエリや処理が実行されないように注意
  • テンプレートは「データを表示する」だけにする
  • ループ内で不必要なクエリが発行されないように select_related を使う *19
  • テンプレートの継承を理解しよう
  • テンプレートファイルやブロックなどの名前には「-」ではなく「_」を使う
  • 他のテンプレートファイルから include されるテンプレートファイル名は「_」で始める
  • CBV を利用した場合、「object_list」という暗黙の変数名が使える
  • テンプレート内では URL のパスはハードコードせずに url タグを使う
  • テンプレートのデバッグには TEMPLATES の「string_if_invalid」オプションの設定を使うと便利
  • 404.html と 500.html のエラーページは最低限用意しておこう
第14章:Template Tags and Filters(テンプレートタグとフィルタ)
  • p.191〜
  • フィルタは単なる関数(ただし引数は二つまでという制限あり)
  • テンプレートタグはデバッグしづらい
  • カスタムテンプレートタグのモジュール名は <app name>_tags.py とする
第15章:Django Templates and Jinja2(DjangoテンプレートとJinja2)
  • p.197〜
  • Django 1.8 から Django template language (DTL) 以外に Jinja2 をサポート
  • DTL と Jinja2 のどちらを使うべきか *20
  • ディレクトリごとに適用するテンプレートエンジンを替えることも可能
第16章:Building REST APIs(REST APIの構築)
  • p.207〜
  • 通常のアプリケーションの所々にAPI用のコードを入れるよりも、全ての serializer, renderer, view が入った REST API に特化したアプリケーションを1つ作ってしまうのがベター
    • アプリケーション名は「apiv4」などバージョンを意識した名前にすべし
    • 小さくてシンプルなプロジェクトでは、REST API のビューは単一の views.py または viewsets.py に集約できる
    • 多数の REST API が含まれる大きなプロジェクトでは、viewset パッケージを作ってその中に記述する
    • ビジネスロジックはできるだけAPIビューから分離すべし
  • 別アプローチとして、URLconf を core/api.py や core/apiv1.py に記述して、ルートURLconf から include する方法も
  • バージョンアップを考慮して、URLパターンは /api/v1/users, /api/v2/users などとするとよい
  • レートリミットは必ず入れるべし
    • Nginx や Apache でも導入することが可能(パフォーマンスもよいが、Pythonコード外で管理することになる)
第17章:Consuming REST APIs(REST APIの使用)
  • p.225〜
  • バックエンドに Django、フロントエンドに React.js、Angular.js、Backbone.js などのモダンな JSフレームワークを利用する
  • CSRF トークンの送信方法に注意
第18章:Tradeoffs of Replacing Core Components(コアコンポーネントを入れ替える場合のトレードオフ)
  • p.237〜
  • よっぽどのことがない限り Django のコアコンポーネントを入れ替えるのはやめよう
第19章:Working With the Django Admin(Django管理サイトを動かす)
  • p.243〜
  • Django 管理サイトはエンドユーザ向けのものではなく、管理者向けのもの
  • 一覧表示を見やすくするために、モデルに __str__() メソッドを用意しよう *21
  • 一覧に表示するフィールドは list_display で宣言する
  • 詳細表示をカスタマイズする場合は、ModelAdmin を継承したクラスを用意
  • どうしても管理サイトの見た目をカスタマイズしたい場合は https://github.com/sehmaschine/django-grappelli:titledjango-grappelli などのスキンを使う
第20章:Dealing with the User Model(Userモデルを扱う)
  • p.255〜
  • Django 1.5 以降でユーザクラスを設定で変更できるようになったため、ユーザクラスを取得するには get_user_model() を使う
  • ユーザモデルに対して一対多・一対一・多対多関連のフィールドを作成する場合は、settings.AUTH_USER_MODEL を使う
  • ユーザモデルをカスタマイズするには django-authtools が便利
  • ユーザモデルにカスタムフィールドを追加するための 3つのオプション *22
第21章:Django's Secret Sauce: Third-Party Packages(Djangoの秘伝のソース:サードパーティのパッケージ)
  • p.263〜
  • 本の中で言及したパッケージの一覧については付録Aを参照
  • 55,000 を超える Python パッケージが PyPI で管理されている *23
  • Django Packages は Django関連のプロダクトが集められている比較サイト
  • 依存パッケージはバージョン番号も指定しておこう
  • パッケージの完成度を見極める方法
  • Cookiecutter で Python/Django プロジェクトのテンプレートを作ろう
  • PyPI に登録する方法について
第22章:Testing Stinks and Is a Waste of Money!(疑わしいものをテストしよう!テストはお金の無駄!)
  • p.283〜
  • カバレッジを取るには coverage.py を使うとよい
  • テストモジュールにはファイル名に「test_」のプレフィックスを付けよう
  • 一つの単体テストメソッドでは一つのことをテストするようにしよう
  • request オブジェクトを生成するには RequestFactory を使おう。ただし、Middleware を通さないといけない場合は工夫が必要
  • データのメンテナンスが大変になるので、フィクスチャは使い過ぎないようにしよう *24
  • Mock ライブラリを使ってモックアウトする *25
  • unittest には便利なアサーションメソッドが多数用意されている *26
  • 統合テスト/CI について
  • unittest の代わりの単体テストツールとして、pytest-django, django-nose も便利 *27
第23章:Documentation: Be Obsessed(ドキュメンテーションせずにはいられない)
  • p.301〜
  • ドキュメントは reStructuredText(RST)形式 で書こう *28
  • .rstファイルは Sphinx で各種フォーマットに変換して出力する
  • どんなドキュメントを作るべきか?
第24章:Finding and Reducing Bottlenecks(ボトルネックの発見と解消)
第25章:Asynchronous Task Queues(非同期タスクキュー)
  • p.319〜
  • Celery, Redis Queue, django-background-tasks のどれを使うべきか?
  • タスクはビューのように小さくせよ
第26章:Security Best Practices(セキュリティのベストプラクティス)
  • p.327〜
  • XSS、CSRF、SQLインジェクション、クリックジャッキング、TLS/HTTPS サポート、HTMLタグの自動エスケープなどが標準装備
  • SECERT_KEY の取り扱いに注意すべし(バージョン管理ツールの管理下にしないように)
  • HTTPS/SSL 化するには django.middleware.security.SecurityMiddleware を使う(ただし、static, media は含まれないので注意)
  • 標準ライブラリの pickle には気をつけよう
  • cookieベースのセッションは使わない
  • クレジットカード番号やパスワードなどのセキュアなデータ入力フィールドを利用する際の注意点 *29
  • 強度の高いパスワードを生成するには django-passwords, django-autoadmin などを利用する
  • アップロードファイルは python-magic でファイルヘッダを確認する
  • Django管理サイトへのIPアドレス制限をする場合は Middleware で判別
第27章:Logging: What’s It For, Anyway?(ロギング:それって何のため?)
  • p.355〜
  • 各ログレベル(CRITICAL/ERROR/WARNING/INFO/DEBUG)の用途
  • ロガーは再利用せずにモジュールごとに用意する
  • Logger.exception() について
  • logutils パッケージが便利
第28章:Signals: Use Cases and Avoidance Techniques(シグナル:ユースケースと回避テクニック)
  • p.365〜
  • シグナルは同期・ブロッキングなので、パフォーマンスを考慮すべし
  • 複数モデルを操作する場合や save後にキャッシュを無効化したい場合などはシグナルを使ってよい
  • models.Manager のメソッドやフォームの cleanメソッドで置き換えられないか検討する
  • 単一モデルを操作している場合は saveメソッド内に書けないか検討する
第29章:What About Those Random Utilities?(ちょっとしたユーティリティはどうしたらいい?)
  • p.371〜
  • 汎用的な共通モジュールは coreアプリケーションに配置しよう
  • 各アプリケーション直下にヘルパーモジュール utils.py(helpers.py)を
  • Django に内蔵されているヘルパーを利用しよう *30, *31, *32
第30章:Deployment: Platforms as a Service(デプロイ:プラットフォーム・アズ・ア・サービス)
  • p.387〜
第31章:Deploying Django Projects(Djangoプロジェクトのデプロイ)
  • p.395〜
第32章:Continuous Integration(継続的インテグレーション)
  • p.411〜
  • テストをスピードアップするための Tips
  • 複数の異なる Python, Django バージョンで検証したい場合は tox を使う
  • Jenkins, Travis-CI, CircleCI などの CIツール/CIサービスを使おう
第33章:The Art of Debugging(デバッグの技術)
  • p.417〜
  • django-debug-toolbar を使おう
  • PDB を使おう *33
  • ファイルアップロードを扱う際のチェックポイント
第34章:Where and How to Ask Django Questions(Djangoに関する質問をする場所と方法)
  • p.427〜
  • 同じ問題を抱えている人がいないかググったり、MLStackOverflow をチェックしてみよう
  • django-users の MLや IRC で直接聞いてみよう
第35章:Closing Thoughts(最後に)
  • p.431〜
  • Django 2.2 がリリースされるまでは次のシリーズは書かない
  • Django 1.8 は LTE なので、しばらくはこの本が使えるでしょう


 

まとめ

「Two Scoops of Django」の著者は、Django を理解するには、フォーム(Form)、モデル(Model)、クラスベースビュー(CBV)について理解することが重要だと言っていますが、私は特に、モデルと Django ORM 周りについての理解がネックになると考えています。


「Two Scoops of Django」は全編英語で、英語が苦手な人には取っ付きにくいかもしれませんが、どの章から読み始めてもよいという性質と堅苦しくないポップな雰囲気から、Django 初級者にピッタリな本だと思います。ポップなタッチながらも、Django の実戦的なノウハウが一から十まできめ細やかに書かれていて、Django アプリのデベロッパーにとって非常に貴重な本に仕上がっています。


英語が苦手でない人には絶対オススメなので、是非読んでみてください!!



明日は、felyce さんの 6日目の記事「DjangoのForm(CreateView、UpdateViewなど)について - Qiita」です。よろしくお願いします。



 

英単語

最後に、「Two Scoops of Django」本に出てきた英単語をピックアップしました。
読むときのお役に立てば。


p.xxxv vet : 吟味する

p.xxxv distill : 抽出する

p.xxxv suffice : 十分である

p.xxxvi errata : 正誤表

p.1 abbreviate : 省略する

p.3 accommodate : 適応する、同意する

p.3 provision : 規定、供給

p.8 It goes without saying : 〜は言うまでもない

p.13 optimal : 最適な

p.13 pitfall : 落とし穴

p.13 identically : 完全に同じように

p.14 without a hitch : 問題なく

p.15 pre-populate : 自動入力する

p.15 familiarize : 習熟させる

p.26 intentional : 故意の

p.34 truncated : 省略された

p.34 in essence : 要するに

p.34 moderate : 適度な

p.35 envision : 心に思い描く

p.36 convention : 慣習、慣例

p.36 dull : つまらない

p.36 correspond with : 〜と一致する

p.36 discouraged : 推奨されない

p.37 when in doubt : 判別がつかないときは

p.37 a modicum of : 少量の

p.41 stay away from : 〜を避ける

p.42 purposefully : 意図的に

p.48 substantially : 実質的に

p.48 without hesitation : 気兼ねなく

p.63 think things through : じっくり物事を考える

p.63 down the road : やがて

p.63 sound : 堅固な、安定した

p.64 ramification : 予期せぬ問題

p.64 sloppy : ずさんな

p.64 derived : 生成された

p.65 concrete : 具象的な

p.65 overlap : 重複部分

p.65 inadvertent : うっかりした

p.65 substantial : 相当の

p.65 traverse : 横断する

p.67 nasty : 不快な

p.67 propagation : 伝播

p.67 aptly : 適切に

p.68 unwieldy : 手に負えない

p.68 bring someone to heel : 〜を従わせる

p.69 prematurely : 時期尚早に

p.69 panacea : 万能薬

p.73 unconstrained : 拘束されない

p.73 akin : 同種の

p.73 comforted : 安心した

p.78 infer : 推察する

p.79 judiciously : 思慮深く

p.81 consistently : 一貫して

p.81 quirk : 奇癖

p.81 cartwheel : 車輪

p.81 unconstrained : 制約されない、とらわれない

P.83 legible : 読みやすい

p.84 mitigate : 和らげる、軽減する

p.84 lean on : 〜に頼る

p.85 shudder : 身震いする

p.86 comparison : 比較

p.86 under the hood : 内部で

p.87 decent : 適切な

p.87 drastically : 抜本的に

p.88 approximate : 〜に近い

p.89 practitioner : 実行者

p.89 acronym : 頭字語

p.89 overhaul : 〜を徹底的に点検する

p.89 modernize : 近代化する

p.90 monumental : (記念碑のように)巨大な

p.90 embarrassing : 厄介な

p.90 crop up : 不意に起こる

P.92 downside : 否定的側面

p.96 err on the side of : 〜し過ぎて失敗する(傾向にある)

p.97 yell : 怒鳴る

p.98 argue : 異議を唱える、主張する

p.98 steer clear of : 〜を避ける

P.98 stick to : 〜に忠実である

p.101 hackery : ハッカー行為

p.101 elaborative : 入念な

p.101 automagically : 魔法のごとく自動的に

p.103 collide : 衝突する

p.104 prevalence : 普及、行き渡ること

p.104 tangible : 明らかな、具体的な

p.105 come into play : 動き始める

p.106 when it comes down to it : いざというときには、ここ一番というときには

p.106 algebra : 代数

p.107 one-off : 一回限りの、単発の

p.108 annoy : 困らせる、イライラさせる

p.108 exploit : 〜を利用する、十分に引き出す

p.108 adhere to : 〜を支持する、忠実に守る

p.109 come at the expense of : 〜を犠牲にして成り立つ、〜という代償で手に入る

p.110 cognitive overload : 認知的過負荷

p.110 arbitrary : 任意の

p.111 in the meantime : その間に

p.113 for once : 今回に限り

p.113 parlance : 専門用語

p.113 out of necessity : 必要に迫られて

p.113 to the point of : 〜するくらいまで

p.113 ubiquitous : 至る所にある

p.115 astute : 抜け目のない

p.117 advent : 出現、到来

p.117 out of the box : 難しい設定などは一切なしで

p.117 address : 対処する、取り組む

p.118 along the line of : 〜に従って

p.122 constrain : 制約する

p.128 catch : 落とし穴、わな

p.128 wire into : 〜に配線する

p.130 queue up : 列を作る

p.131 to recap : 要点をまとめると

p.131 intention : 意図

p.133 readily : すぐに、容易に

p.135 straight-forward : 簡単な、分かりやすい

p.135 in essence : 要するに

p.137 trivial : ささいな

p.137 anguish : 苦悩

p.137 albeit : 〜ではあるが

p.140 alteration : 変更

p.140 idempotent : 冪等の

p.141 capability : 能力、機能

p.141 exempt : 免除された

p.142 in conjunction with : 〜と連動して

p.144 iterate : 〜を反復する

p.144 coerce : 〜を強要する

p.146 streamline : 簡素化する

p.149 extensively : 広範囲に渡って

p.149 explicitly : 明確に

p.152 corruption : (データの)破壊

p.154 corruption : 〜を除いて

p.159 fancy : 手の込んだ

p.161 gross : 不作法な、気持ち悪い

P.167 constrain : 〜を制約する

p.168 tier : 層

p.169 consistent : 矛盾のない、一貫した

p.169 distinctive : 独特の

p.171 eloquently : 雄弁に

p.171 inefficiency : 効率が悪いこと

p.171 redeemable : 商品と交換できる

p.172 redeem : 商品と引き換える

p.173 breakdown : 分析結果

p.173 redemption : 回収

p.177 implied : 暗黙の

p.178 intensive : 集中的な

p.179 consumption : 消費

p.179 distract : 〜の気を散らす

p.179 bluntly : 単刀直入に

p.179 realign : 再編成する

p.185 mnemonic : (記憶を助ける)短い語句

p.186 intuitive : 直感的な

p.189 draw : 呼び物、引き付けるもの

p.189 carry away : 心を奪う

p.189 worse yet : さらに悪いことには

P.189 a blessing in disguise : 災い転じて福となす

p.190 bulky : 大きい

p.190 not to mention : 〜は言うまでもなく

p.191 trait : 特徴

p.191 prone : 〜しがちな

p.191 abuse : 〜を乱用する

p.193 unbearably : 我慢できないほど

p.195 fury : 激怒

p.196 supposedly : おそらく

p.196 chagrin : 残念さ

p.196 obscure : 目立たない

p.196 contention : 主張、論争

p.197 syntactical : 構文の

p.198 First off : 最初に

p.198 advent : 出現

p.198 harmoniously : 平和に

p.199 mitigate : 和らげる

p.200 incorporate : 〜を組み込む

p.207 by design : 計画的に、故意に

p.207 representational : 具象的な

p.207 craft : ~を作る

p.207 definitive : 決定的な

p.207 hindrance : 障害物

p.208 distribute : ~をばらまく、~を分配する

p.208 appropriate : 適切な

p.209 by definition : 定義上は

p.209 idempotent : 冪等の

p.209 in favor of : ~を支持して、~に賛成して

p.211 tailor : ~あつらえる、~を調整する

p.211 wire into : ~に配線する

p.213 suited for : ~向きの

p.213 neatly : きちんと

p.213 hunt down : 追跡して捕まえる

p.213 in contrast to : ~と対照的に、~とは異なり

p.213 it makes sense : 理に適う

p.214 when it comes down to it : いざとなれば

p.214 endorse : 推薦する、支持する

p.214 go for : 当てはまる

p.214 complete with : ~が全部そろった

p.214 myriad : 無数の

p.215 dedicated : 専用の、特化した

p.216 lean on : ~に頼る

p.217 abbreviate : ~を簡潔にする、~を短縮する

p.217 anger : ~を怒らせる

p.217 ample : 十分な

p.218 simultaneously : 同時に

p.218 loosely-coupled : 疎結合の

p.218 preferably : できれば

p.220 grumble : 不平を言う

p.220 analogy : 比喩

p.220 inventory : 在庫

p.221 unfettered : 拘束されない、自由な

p.221 graciously : 快く

p.221 desirous : 望んで

p.222 utter : 全くの

p.222 tier : 層

p.222 tie into : 勢いよくとりかかる

p.222 embrace : ~を利用する、~を採用する

p.223 vantage : 優越

p.225 twofold : 二つ折りの、二つの要素からなる

p.225 landscape : 状況

p.225 evolve : 進化する

p.225 advent : 出現

p.225 controversy : 議論

p.227 weed : 除外する

p.227 chaff : もみ殻、無用のもの

p.229 woe : 苦悩

p.229 latency : 待ち時間

p.229 circumference : 周囲

p.229 noticeable : 容易に気付く

p.229 alienate : 遠ざける

p.229 hiccup : 一時的な中断

p.229 distract : ~の気を散らす

p.230 feasible : 実現可能な

p.230 albeit : ~ではあるが

p.230 trickery : 策略

p.230 geographically : 地理的に

p.230 avenue : 手段

p.230 reliant : 依存している

p.230 mitigate : 軽減する

p.231 suffice : 十分である

p.231 certainly : 確かに

p.231 tempting : 誘惑的な

p.234 straight-forward : 分かりやすい、単純な

p.235 consumption : 消費

p.235 up to par : 基準に達して

p.235 capable : 有能な

p.235 ramp up : 成長させる

p.235 reap : ~を得る

p.235 assess : ~を評価する

p.235 a plethora of : 大量の

p.235 advocate : 推奨する

p.237 hype : 誇大広告、うそ

p.237 sacrifice : 〜を犠牲にする

p.237 prematurely : 時期尚早に

p.238 Franken : フランケンの、遺伝子組換えの

p.238 fad : 流行のもの

p.239 implication : 影響

p.239 compliant : 準拠した

p.240 non-issue : 取るに足りない問題

p.240 swallow : 鵜呑みにする

p.241 take it too far : 行き過ぎる、無理する

P.241 advocate : 支持する、推奨する

p.243 mess around with : 〜をいじり回す

p.243 revoke : 〜を無効にする、〜を取り消す

p.243 surreal : 非現実的な

p.250 oddly : 変に

p.251 venerable : 尊敬すべき、非常に古い

p.251 up-and-comer : 新人

p.252 arcane : 難解な

p.252 account for : 〜を構成する、〜の主要因である

p.252 idiosyncrasy : 特異性

p.252 invariably : いつも、常に

p.252 mind-numbing : 極めて退屈でつまらない

p.255 significantly : 著しく、かなり

p.255 radical : 抜本的な、急進的な

p.257 timid : 臆病な

p.257 intrusive : 煩わしい

p.257 in place : 適所に

p.259 bare-bones : 必要最低限の

p.259 slate : 候補者リスト

p.259 sane : 健全な

p.260 unobtrusive : 控えめな

p.261 dedicated : 専用の

p.263 incorporation : 組み込み、合体

p.265 competent : 有能な

p.265 tragic : 悲惨な

p.265 downfall : 転落、崩壊

p.267 formality : 手続き

p.268 pore over : 〜を熟読する

p.268 be willing to : 喜んで〜しようとする

p.269 submission : 提出

p.270 suffice : 十分である

p.270 bulletproof : 防弾の

p.270 in lieu of : 〜の代わりに

p.271 diverge : 分岐する

p.271 invasive : 侵略的な

p.273 forthcoming : 来たるべき

p.273 purist : 純粋主義者

p.274 be meant to : 〜であることを意図されている

p.274 harness : 利用する、役立てる

p.274 scare off : (怖がらせて)追い払う

p.274 obscenity : わいせつなもの

p.275 permissive : 寛大な

p.275 litigation : 訴訟

p.275 liable : 責任がある

p.275 disclaimer : 免責事項

p.275 liability : 法的責任、損害賠償

p.275 interoperability : 相互運用性

p.276 rewarding : やりがいのある

p.277 burnout : 燃え尽き症候群

p.278 irresponsible : 責任のない

p.278 fault : 〜を責める

p.280 in turn : 次に

p.280 exploit : 〜を悪用する

p.281 invariably : いつも、必ず

p.281 give away : 譲る

p.281 notable : 有名な

p.282 diligence : 不断の努力

p.283 stink : 疑わしいもの、悪臭

p.283 rigorous : 厳しい、厳密な

p.283 adequate : 適正な、適切な

p.285 hence : だから、したがって

p.286 therein : その中に、その点で

p.286 conundrum : 難しい問題

p.288 when possible : 可能であれば

p.290 subtly : 微妙に

p.290 wrestle with : 〜と格闘する

p.290 malignant : 悪意のある

p.290 intruder : 侵入者

p.290 at a distance : 少し離れて

p.290 grief : 厄介、面倒

p.292 undetected : 発見されていない

p.292 alas : ああ、悲しいかな

p.295 remedy : 改善する、是正する

p.296 fragile : 壊れやすい、不安定な

p.296 boredom : 退屈

p.297 error-prone : 間違いを起こしやすい

p.299 mandate : 命令する

p.299 gradual : 段階的な

p.299 bogus : 偽造の

p.299 thus far : ここまでは

p.299 comprehend : 理解する

p.301 That being said : そうは言っても

p.301 can't help but : 〜せずにはいられない

p.305 infrequently : まれに

p.305 tangential : 無関係の、脱線した

p.309 snappy : きびきびした

p.309 excessive : 必要以上の、過度の

p.310 invaluable : すこぶる有益な

p.312 noticeable : 目立つ

p.320 pitch in : 協力する

p.320 supervision : 監督、管理

p.320 Arguably : 議論の余地はあるが、ほぼ間違いなく

p.320 intensive : 集約的な

p.321 overkill : やり過ぎ

p.321 footprint : 足跡、専有面積

p.321 rules of thumb : 経験則

p.322 quirk : 奇癖

p.322 portability : 可搬性

p.323 underlying : 下部の、内在する

p.323 counter-productive : 非生産的な

p.328 malicious : 悪意のある

p.328 sniff : 盗聴する

p.328 up for grabs : 容易に手に入る

p.329 reputable : 信頼できる

p.332 expedite : 〜を早める、〜を迅速に処理する

p.332 malignant : 悪意のある

p.334 beware of : 〜に気をつける

p.335 falsify : 改ざんする

p.335 impersonate : 〜になりすます

p.336 transmit : 送信する

p.338 coerce : 〜を強要する

p.338 grave : 重大な

p.341 arbitrary : 任意の

p.341 be of concern : 心配事である

p.341 adequate : 適切な

p.342 incorporate : 〜を組み込む

p.343 paraphrased : 言い換える

p.343 trivial : ささいな

p.344 fine-grain : 微粒子の

p.344 in conjunction with : 〜と連動して

p.345 concealed : 隠れた

p.345 devastating : 壊滅的な

p.347 venerable : 尊敬すべき

p.347 punctuation : 句読点

p.347 pledge : 誓う

p.348 put up : 用意する、立ち上げる

p.348 overwhelm : 圧倒する、〜をひっくり返す

p.348 snap decision : 即断、見切り発車

p.348 ill-advised : 軽率な

p.349 bonded : 保証付きの

p.351 compromise : 譲歩

p.351 obfuscate : 分かりにくくする

p.351 cumbersome : 扱いにくい

p.352 nigh : ほとんど

p.352 corresponding : 同様の

p.353 diligence : 不断の努力

p.355 What's it for? : それは何に使うの?

p.355 once in a while : たまに

p.355 meticulously : 慎重に

p.356 go-to : 頼りになる

p.356 unpredictable : 予測できない

p.356 might as well : 〜してもいい

p.356 fine-tune : 微調整する

p.356 account for : 〜を構成する

p.356 introspection : 内省

p.357 catastrophic : 壊滅的な

p.357 sparingly : 控えめに

p.358 intruder : 侵入者

p.360 sprinkle : ちりばめる

p.360 debt : 負債

p.360 go overboard : やり過ぎる

p.360 clutter : 〜で溢れさせる

p.363 reduction : 減少

p.365 last resort : 最後の手段

p.365 knot : からまる

p.365 hairball : 毛玉

p.365 untangle : 〜のもつれを解く

p.365 dispatch : 〜を送り出す

p.365 obfuscation : 難読化

p.366 inversion : 逆転

p.370 delve into : 掘り下げる

p.371 general-purpose : 用途の広い

p.372 inevitably : 必然的に

p.372 Synonymous with : 〜と同じ意味の

p.373 brobdingnagian : 巨大な

p.374 indispensable : 不可欠の

p.385 a plethora of : 過多の

p.385 tangle : 混乱

p.411 originator : 創始者

p.411 cohesive : 団結した、まとまりのある

p.412 statically typed : 静的に型付けされた

p.413 oodles : たくさん

p.414 analogue : 類似品

p.415 outweigh : 上回る

p.417 annoying : うるさい

p.418 -naut : 〜の航行者

p.419 in regards to : 〜に関しては

p.419 disastrous : 破滅的な

p.419 essential : 必要不可欠なもの

p.419 frustrating : イライラする

p.422 immensely : 広大に

p.422 embrace : 受け入れる、採用する

p.422 to the fullest : 最大限に

p.423 replicate : 〜を複製する

p.424 nemesis : 悪の根源、因果応報

p.425 haywire : めちゃくちゃな

p.425 utter : ひどい

p.425 unfold : 姿を現す

p.425 aficionado : 熱狂的なファン

p.426 in exchange for : 〜と引き換えに

p.427 get stuck : 行き詰まる

p.427 descriptive : 記述的な

p.428 troll : 煽る

p.428 cranky : 気難しい

p.428 gratitude : 感謝、感謝の気持ち

p.428 go a long way : 大いに役立つ

p.428 make someone's day : 人を幸せな気分にさせる

p.428 fill up : 満たす

p.428 a tidbit of : ちょっとした

p.429 put in : 投資する

p.429 diversity : 多様性

p.429 underrepresent : 過小評価する

p.431 ground : 領域

p.431 starter : 初心者

p.431 as for : 〜に関しては

p.431 genuinely : 心から

p.431 omission : 省略、手抜かり

*1:英語は易しめだと思います

*2:二人は 2013年末に結婚しています。 https://www.pydanny.com/i-married-audrey-roy.html また、cookiecutter-django のコアコミッターとしても有名です。 https://github.com/audreyr/cookiecutter

*3:データベースごとにフィールドタイプの扱い方が違っていたりする

*4:例えば「~/projects/」あるいは「~/.envs/」など。virtualenvwrapper を使っているのであれば「~/.virtualenvs/」など

*5:「Django apps are small libraries designed to represent a single aspect of a project.」とのこと。

*6:推奨しないが、単語と単語の間にはアンダースコアを使ってもよい

*7:AWS・Stripe などの APIキー、OAuth トークンなども含まれる

*8:「abstract base classes」は Metaクラスに「abstract = True」を記述した抽象ベースクラスを継承する方式、「multi-table inheritance」は OneToOneField で複数のテーブルを一対一関連させる方式、「proxy models」は Metaクラスに「proxy = True」を記述した子クラスで継承する方式。 Models | Django documentation | Django

*9:multi-table inheritance 方式は使わないようにしよう!

*10:ヘルパー関数、フォーム、モデルのメソッドなど、ビュー(やビューに直接関連した部品)以外では使わないこと

*11:https://docs.djangoproject.com/en/1.8/ref/models/database-functions/

*12:書くなら raw() で。extra() は使わない

*13:リクエストごとにしたいのであれば、settings.py の「ATOMIC_REQUESTS」の設定を True にする。ビュー中の特定の範囲にのみトランザクションを適用する場合は「with transaction.non_atomic_requests()」で囲む

*14:複雑にカスタマイズしたい場合だけ関数ベースのビューを使えばよい

*15:Mixin を自作するときは Python object 型を継承し、複雑に継承させない設計にする

*16:View, RedirectView, TemplateView, ListView, DetailView, FormView, CreateView, UpdateView, DeleteView, Generic date views が紹介されている

*17:https://django-braces.readthedocs.io/en/latest/form.html#userformkwargsmixin:UserFormKwargsMixin, https://django-braces.readthedocs.io/en/latest/form.html#userkwargmodelformmixin:UserKwargModelFormMixin など

*18:django-floppyforms, django-crispy-forms, django-forms-bootstrap が紹介されている

*19:select_related の詳細については、過去記事「Django ORM の select_related, prefetch_related の挙動を詳しく調べてみた - akiyoko blog」を参照

*20:パフォーマンスの問題がある場合以外は DTL のままでよい

*21:Python 2.7 の場合は python_2_unicode_compatible デコレータを使うか、__unicode__() メソッドを用意する

*22:AbstractUser を継承する方法、AbstractBaseUser を継承する方法、ユーザモデルに対して一対多・一対一・多対多関連のフィールドを作成する方法

*23:「パイピーアイ」と発音する。pip はここからパッケージを検索する

*24:代わりに、factory boy などのツールを使おう

*25:過去記事「Python で MagicMock を使う - akiyoko blog」を参照

*26:https://docs.python.org/2/library/unittest.html#assert-methods

*27:過去記事「akiyoko.hatenablog.jp」を参照

*28:Python, Django 界隈ではあまり使われないが、Markdown 形式も人気。なお、Pandoc を使えばマークアップを自由に変換可能

*29:Djangoフォームで autocomplete を off にする、django.forms.PasswordInput を使うなど

*30:ただし、django.utils 内のモジュールは内部向けに作られたものでバージョンによって挙動が変わるので注意。詳しくは Django Utils | Django documentation | Django を参照

*31:django.core.exceptions のいくつかのビルトイン例外クラスが利用可能

*32:シリアライズ/デシリアライズには django.core.serializers が使える

*33:過去記事「PDB QUEST ~ pdb のショートカットはドラクエ風に覚えよう ~ - akiyoko blog」を参照