delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

2020-01-01から1年間の記事一覧

【Reactの勉強】環境構築(nodeのインストールまで)

概要 Reactの勉強をしようと思ったが、まず、モダンなフロントエンド用の開発環境をちゃんと構築したことがなかったので、そこから始める。適宜、以下の本を参考にさせて頂きながら進める。(以下、『りあクト!』)oukayuka.booth.pm バージョン 「Reactの勉…

Pythonのエコシステムの情勢が分かる調査(Python Developers Survey)

概要 『りあクト!』を読んでいたら、JSの世界には「The State of JavaScript」という、JavaScript周りの各種エコシステムの情勢を調査したものが存在することを知った。2019.stateofjs.comPythonの世界には同じような調査はないのかな?と思って調べてみた…

VS CodeでPylanceを試してみる

概要 数ヶ月前からVS CodeでPythonのProjectを開くと「Pylanceという拡張機能をインストールしますか?」というポップアップが表示されるようになった。 まだpreview版らしい。 どんな機能が追加されるのか把握できてない。 今のVS CodeのPython開発環境に特…

【自分用メモ】テーブル設計のカタログサイト

色んな業界のシステムのテーブル設計がまとまっているカタログサイトがある。www.databaseanswers.org私が最初にこのサイトを知ったのは、以下のt_wadaさんのTweetだった。DB設計のカタログサイト。新しくテーブル設計する際には必ず一度ここを見る。見た目…

Djangoのエラーハンドリングに関して覚えておくべきこと

はじめに この記事はDjango Advent Calendar 2020 22日目の記事です。22日目の記事を担当しますdelhi09と申します。 本記事では「Djangoのエラーハンドリングに関して覚えておくべきこと」というタイトルで書かせて頂きます。 概要 Djangoはエラーハンドリン…

MySQLでCASE式を使うUPDATE文を使うと複合ユニーク制約を回避できるのか検証

概要 SQLでは、以下のようにCASE式を使うと1回のSQL実行で複数のUPDATEを実行することができる。 UPDATE article_image_url SET display_order = ( CASE id WHEN 1 THEN 2 WHEN 2 THEN 3 WHEN 3 THEN 1 END ) WHERE id in (1, 2, 3); MySQLでこれを使うと複…

DjangoのLOGGINGの設定についてちゃんと勉強した

概要 DjangoのLOGGINGの設定について、今までは割と適当に書いていたが、今回、ちゃんと調べて意味を理解しながら設定を書いたので、経緯を記事にしてみたいと思う。 結論 最終的なsettings.pyのLOGGINGの設定は以下のようになった。 #ログ出力先のディレク…

『Two Scoops of Django』のDjango3系対応版が実は既に出ていた

概要 『Two Scoops of Django』というDjangoの界隈で有名な中級者以上向けの英語の本がある。 ※ 日本語訳は存在しない世間的に知られている & Amazonで売られているのは、2017年に発売された以下のDjango1.11対応の版である。 www.amazon.co.jp私も上記が現…

DRF(Django REST Framework)でビジネスロジックをどこに書くか問題(雑記)

※ 本記事は意見や解決策は一切提示しません。 DRF(Django REST Framework)は、単純なCRUDのREST APIを実装する際にはかなりコーディングレスに実装できる点は長所だと思う反面、DRF自体の設計思想の特殊性ゆえに、ある程度のビジネスロジックを書かなければ…

【自分用メモ】VS Codeで新しいファイルを開くと以前に開いていたファイルのタブが消える事象

掲題の件。 そういえば、開発時に前からストレスに感じていたのに解決方法を調べてなかった。以下の記事で説明してくださっている方法で直せた。qiita.com qiita.com 自分もよく「cmd + p」でファイル検索してからファイル開くのだけれど、メニューバーから…

【自分用メモ】isort5系から-rcオプションがいらなくなった

概要 isort5系からディレクトリを対象にしてrecursiveにフォーマットしたい場合に、「-rc」オプションが不要になった。・5系より前 $ isort -rc target_dir・5系以降 $ isort target_dir※ 従来通り「-rc」を付けても挙動は同じだが、警告が出る。 経緯 新規…

Djangoで末尾スラッシュなしのURLがリダイレクトされる事象について(APPEND_SLASHの設定)

概要 Djangoのアプリケーションでは、末尾にスラッシュがないURLでアクセスするとスラッシュ有りのURLに301でリダイレクトされるという事象がある。これはsettings.pyのAPPEND_SLASHという設定値がデフォルトでTrueになっていることに依る。 docs.djangoproj…

Djangoのテンプレート上でVue.jsを使う際のはまりどころ

概要 Djangoのテンプレート上でVueを使う方法について書く。※ 尚、本記事はDjangoのテンプレートをテーマにしているが、サーバーサイドのテンプレートエンジンとVue.jsを両方使う場合に汎用的な話だと思う。 何も気にせずに、Djangoのテンプレート上にVue.js…

VS Code × Pythonでライブラリの定義にジャンプできない時の暫定対応方法

概要 VS Code × PythonでClassや関数の定義にコードジャンプしようとした時に、特定の外部ライブラリのソースの場合に「定義は見つかりません」というメッセージが出てしまい、コードジャンプができないという事象に遭遇した。きれいな解決方法はまだ見つけ…

【自分用メモ】VS Code × Pythonでライブラリ本体のソースコードをデバッグする。

概要 Pythonアプリケーションをdebug実行していると、DjangoやFastAPIの本体のソースコードをデバッグしたいことがあるので、その時のデバッグ方法を自分用メモとして書いておく。 結論 launch.jsonに以下の1行を追加する。 "justMyCode": false 具体例 Djan…

DjangoのModelで「お約束カラム(作成者、作成日時、更新者、更新日時)」を共通化する方法 ※デメリットあり

概要 一般的に、RDBのテーブルを定義する際には、管理目的で「どんなテーブルにも以下の4つのカラムは必ず定義すること」という決まりになっているシステムが多いと思う。 ※ 括弧内はよくあるカラム名の例 作成者 (created_by) 作成日時 (created_at) 更新者…

Gitのコミットログは「読める差分」であるべき

Git

概要 『Software Design』の2020年9月号に掲載されている『ちょうぜつエンジニアめもリーちゃん』の「第4話 分けろ!まとめろ!変更差分」というGitの回に、今までのエンジニア人生で、誰からもちゃんと説明してもらったことがなかったことが、たった2Pの漫画…

個人で作ったサービスのAWSの1ヶ月の運用費

AWS

概要 2020/7に個人でWEBサービスを作ってAWSに公開した。 github.com一応、作った目的としては以下のような動機だった。 今後、技術検証とかに使えるように自分の好きにできるサービスを持っておきたい。 当時、転職活動をしていたので、見せられるものを作…

Vue.jsではアロー関数を使用するべきではない

概要 Vue.jsではアロー関数を使用するべきではない。アロー関数を使用してしまうと、thisがVueインスタンスを指し示さなくなるので、参照したいプロパティがundefinedとなってしまい、意図した挙動にならない。『Vue.js入門』のp49のサンプルプログラムを例…

blackでフォーマットした後にflake8を実行すると「E231 missing whitespace after ','」が検出される

概要 blackでソースコードをフォーマットした後にflake8を実行すると「E231 missing whitespace after ','」というPEP8違反が検出される。「E231 missing whitespace after ','」は、例えば以下のようにlistの最後の要素の後にセミコロンが入っており、その…

pyproject.tomlで「Error reading configuration file: This float doesn't have a leading digit」というエラーが出てハマった

概要 pyproject.tomlに以下のように設定を記述した後にblackを実行したところ、「Error reading configuration file: This float doesn't have a leading digit」というエラーが発生してしばらくハマった。 [tool.black] line-length = 119 [tool.isort] mul…

Django+factory-boyでテストデータを作成する際に「Duplicate entry」を回避する方法

概要 Django+factory-boyでテストデータを作成する際に、結合先のテーブルに主キーが同一のレコードを複数INSERTしようとして「Duplicate entry」が発生してしまう事象を回避する方法について書く。(詳細は後述) 前提 Django: 3.0.7 factory-boy: 2.12.0 結…

Djangoで「makemigrations」を実行しても「No changes detected」が出るようになってしまった

概要 Djangoで、一度「migrations」ディレクトリを削除した後、もう一度 $ python manage.py makemigrations を実行した。 「migrations」とその配下のファイルが再び作成されることを期待していたが、実際には「No changes detected」と表示されるようにな…

Djangoで全てのマイグレーションをロールバックする

概要 Djangoで全てのマイグレーションを全てロールバックして、DBを初期状態にしたいと思ったが、調べたところ全てロールバックするコマンドは存在しないようなので、xargsコマンドと合わせて実現した。 方法 以下のコマンドを実行する。 $ python manage.py…

Djangoでtest実行時に「ImportError: 'tests' module incorrectly imported from...」が発生

概要 Djangoで以下のコマンドでユニットテストを実行しようとした。 $ python manage.py test すると、「ImportError: 'tests' module incorrectly imported from...」というエラーが発生した。 原因 以下のように、「tests.py」と「tests」ディレクトリが両…

Django REST frameworkでPOSTかつユーザー認証ありのAPIにcurlでリクエストする

概要 Django REST frameworkでAPIを開発している際に、POSTのAPIなのでコマンドラインからcurlでデバッグしようとしたところ、掲題の件でハマったのでメモ。以下の認証を突破する必要がある。 ユーザー認証 CSRF認証 前提 django-debug-toolbarがインストー…

Djangoでマイグレーションを個別に適用する方法

概要 Djangoでマイグレーションを一部だけ適用したいケースがあったので、方法をメモ 手順 マイグレーションの一覧を表示する。 対象のマイグレーションのアプリ名とIDを確認する必要があるので、以下のコマンドを実行して確認する。 $ python manage.py sho…

DjangoでAmazon SESを使ってメール送信する。(2020/6/9時点)

概要 DjangoでAmazon SESを使ってメール送信する方法を検証したので、手順を残しておく。 ※ あくまで検証用の手順です。I AMの設定やメール送信時のエラーハンドリングは考慮していません。 前提 「django-ses」というパッケージを使用する。 github.com 環…

MySQLのカラムの文字列長について(TEXT型、LONGTEXT型)

概要 クローラーで取得したHTMLコンテンツをMySQLに保存する際に、深く考えずにカラムタイプをTEXT型にしていたら、「Data too long for column」が発生した。 環境 MySQL 5.7.30 原因 MySQLのTEXT型の最大長は65,535(約6万)文字とのこと。また、以下のよう…

「sqlalchemy.exc.InvalidRequestError: Table 'table_name' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.」が発生

概要 SQLAlchemyでMySQLにデータをInsertしようとしたところ、以下のエラーが発生した。 エラーの原因は調査できていないが、とりあえず解消方法は見つかったので備忘録としてメモしておく。 sqlalchemy.exc.InvalidRequestError: Table 'table_name' is alr…