delhi09の勉強日記

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

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

DjangoでMySQLの全文検索機能を使う

はじめに 概要 この記事はDjango Advent Calendar 2021の19日目の記事です。 本記事ではDjangoでMySQLの全文検索機能を使う方法について紹介します。前提として、DjangoはMySQLの全文検索機能を標準ではサポートしていません。従って、いくつかのノウハウが…

Djangoでアプリケーション用のユーザーとMigration用のユーザーを分ける

概要 一般的にアプリケーションでRDBを使用する際は、 SELECT INSERT UPDATE DELETE ができればよい。これに対して、MigrationではCREATE TABLEやDROP TABLEの実行権限が必要になる。従って、両者に同じユーザーを割り当てるのはアプリケーションユーザーが…

「ドメインモデル貧血症」という言葉の起源を調べてみた

概要 DDDに関する本を読んだり勉強会に参加したりすると「ドメインモデル貧血症」という言葉をよく目にする。ふと「ドメインモデル貧血症」という言葉が元々どこからきたのか気になったので調べてみた。 英語のWikipediaの記事 英語のWikipediaには「Anemic …

PythonでEnumをstaticメソッド内でループする

やりたいことはタイトルの通り。以下の3つの書き方があった。 ②が一番スマートだが、Enumの仕様上こういう書き方もできるんだって知っておいて損はないと思った。※ この例では都道府県コードから都道府県を引くstaticメソッドを実装している。 書き方① Enum…

「プログラミング言語の習得」をブレークダウンして考えてみる(WEBアプリ開発の場合)②

概要 前回の記事に続いて、本記事では、WEBアプリ開発をする上での前提知識・スキルという意味での「言語の習得」をブレークダウンして考えてみたい。 前提 既に何らかの言語でWEBアプリケーション開発の実務経験がある人が、他の言語を習得しようとする場合…

「プログラミング言語の習得」をブレークダウンして考えてみる(WEBアプリ開発の場合)①

概要 エンジニアをやっていると「新しいプログラミング言語の習得」に取り組むことがある。仕事で必要に迫られて習得しようと思うこともあるし、自分で興味をもった言語があって触ってみよう・習得してみようと思うこともあると思う。『達人プログラマ』にも…

ScrapboxにGoogleのアカウント情報が出ないようにするためにやったこと

概要 先日Scrapboxのアカウントを作成してみた。 scrapbox.ioScrapboxはGoogleアカウント連携でしかアカウントを作成できないサービス仕様になっている。従って、アカウント作成したばかりの状態だとGoogleのアカウントの個人情報が表示されてしまっている箇…

PythonでEnumを使うときの変数名の記法について

PythonでEnumを使うときの変数名の記法についてルールがあるのか気になったので調べてみた。 PEP8 PEP8には「Enumを書くときはxxxケースで書きなさい」ということは特に明記されていない。 ※ PEP8の方が、EnumがPythonに入った時期よりも、もちろん古いので…

JSONを返すAPIの共通部分(=エンベロープ)について

概要 JSONを返すAPI実装するときに、以下のように共通部分でラップしたレスポンスを返すことがある。 { "header": { "code": "0", "message": "success" }, "result": { "books": [ { "id": 1, "name": "技術書1", "price": 3000 }, { "id": 2, "name": "技…

Pythonでデシジョンテーブルを作成してみた

概要 ソフトウェアテストで使われるデシジョンテーブルという技法がある。gihyo.jp前からプログラムで作成できないのかな?と思っていたのだが、やってみたらPythonで意外と少ないコードで実現できた。以下で実際にデシジョンテーブルを作成しながら説明して…

PythonでHTTPステータスコードを表現するときにhttpモジュールに定義されている定数を使う

Pythonでは標準モジュールのhttpにステータスコードが定数で定義されていることを最近知った。 docs.python.org今までは知らなかったので、ステータスコードで判定する処理を書くときは if response.status_code == 200: print("OK") みたいにちょっとしたコ…

DjangoのUserモデルのlast_loginについて

概要 DjangoのUserモデルにはlast_loginというフィールドがある。Djangoに限らず、こういう系のカラムをDBに持つことはシステム上よくあるが 最後に「ログイン」という行為をした日付が入る 最後にログイン状態でアクセスした日付が入る のどちらの仕様なの…

RabbitMQのチュートリアルをやってみる(その2)

概要 前回に引き続きRabbitMQのチュートリアルをやってみる。今回はチュートリアル1の「"Hello World!"」をやる。www.rabbitmq.com やったこと RabbitMQに接続する まずはRabbitMQに接続する。チュートリアル上のコードは以下となっているが、RabbitMQにID/P…

【Reactの勉強】アプリをNetlifyにデプロイする

概要 以下の日本大学文理学部情報科学科の教授の方がクリエイティブ・コモンズで公開してくださっているチュートリアルをやっていた。zenn.dev前回まででアプリはできたので、Netlifyにデプロイしてみた。laughing-lamarr-502333.netlify.appチュートリアル…

クリエイティブ・コモンズで公開されているコンテンツを使うときの表記方法

概要 クリエイティブ・コモンズで公開されているコンテンツを変更して公開するときに、何を明記すればいいのか分からなかったので調べた。 背景 以下のReactの教材を自分でやったものをGithubとNetlifyで公開しようと思った。 zenn.dev 教材には この作品は…

Pythonの例外の仕様についてちゃんと調べた

概要 今までPythonでコードを書くときに例外をなんとなく雰囲気で使っていたので、ちゃんと仕様を調べてみた。 検証したこと 1. Exceptionはコンストラクタ引数をargsフィールドに保持している 以下のようなコードを例にする。 def hoge(): raise Exception(…

requestsの公式ドキュメントは英語版を参照すること

Googleで「requests」を検索すると最初に以下の日本語版のドキュメントが出てくる。requests-docs-ja.readthedocs.io私はこれまで、ずっとこの日本語版を参照していたが、対象としているrequestのバージョンが1.0.4とかなり古いバージョンであることに最近気…

DjangoでModelのFileFieldを文字列やファイルから初期化する方法

概要 DjangoでModelのFileFieldを文字列やファイルで初期化する方法が分からなくて調べていた。※ 以下のようにModelFormを使用してファイルアップロード機能を実現する方法はいくつかヒットしたが、FileFieldを自分で初期化する方法はほとんど出てこなかった…

requestsが送出した例外からレスポンスボディを取得する

概要 requestsは以下のようにResponse.raise_for_status()というメソッドを使うとレスポンスのステータスコードが400系や500系だった場合に、例外を送出することができる。 bad_r = requests.get('http://httpbin.org/status/404') bad_r.raise_for_status()…

Git/GitHubのメールアドレス周りについて調べた

Git

概要 Gitを使い始めるときに、最初に`git config'コマンドで以下のようにユーザー名とメールアドレスを登録する事になると思う。 $ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.comgit-scm.comここで登録し…

『リファクタリング』読書メモ (フェーズの分離 [Splite Phase])

概要 マーティン・ファウラーの『リファクタリング』が勉強になることがたくさん書いてある素晴らしい本だったので、読んだ感想や考えたことをセクション毎などの適当な粒度でメモしていきたいと思う。www.ohmsha.co.jp今回は「第6章 リファクタリングはじめ…

『リファクタリング』読書メモ (問い合わせと更新の分離 [Separate Query from Modifier])

概要 マーティン・ファウラーの『リファクタリング』が勉強になることがたくさん書いてある素晴らしい本だったので、読んだ感想や考えたことをセクション毎などの適当な粒度でメモしていきたいと思う。www.ohmsha.co.jp今回は「第11章 APIのリファクタリング…

Pythonでテキストファイルの読み込み・書き込みを1行で行う(pathlibを使う方法)

以下のようにpathlibを使うと、Pythonでも1行でテキストファイルの読み込み・書き込みを行うことができることを知った。 読み込み from pathlib import Path text = Path("/path/to/fizz.txt").read_text(encoding="utf-8") 書き込み from pathlib import Pa…

数年ぶりにリーダブルコードを読んだ

概要 数年ぶりにリーダブルコードを読んだ。www.amazon.co.jp前から順番にガッツリ読んだ訳ではなくて、パラパラ流し読みしつつ、引っかかったトピックを重点的に読んだ。前回読んだのは、恐らくもう5年以上前で、まだ就職する前で大学生でアルバイトでエン…

Djangoでcreatesuperuserを自動化したいときに使えるオプション(--noinput)

概要 Djangoでプロジェクトを作成した後に、初期ユーザーを作成する際には $ python manage.py createsuperuserを実行する。このコマンドは、デフォルトでは対話モードで実行されるので、自動化してスクリプトの中で実行したいときに面倒である。私自身も、…

Python Developers Surveyの2020年版が公開された

少し前に、Python界にはPython Developers Surveyという年1の調査があるということを書いたが、先日、2020年版が公開されたようである。www.jetbrains.com2019年と比べると、以下がパッと目を引いた。 Fast APIが前回は名前がなかったが、今回は12%シェアが…

【Reactの勉強】チュートリアルをやってみる(「フォームの操作とイベントハンドリング」)

概要 前回に引き続き、以下の日本大学文理学部情報科学科の教授の方がクリエイティブ・コモンズで公開してくださっているチュートリアルをやっていく。zenn.devまた、適宜、以下の本を参考にさせて頂きながら進める。(以下、『りあクト!』)oukayuka.booth.p…

RabbitMQのチュートリアルをやってみる(その1)

概要 以下のRabbitMQのチュートリアルをやってみることにした。 www.rabbitmq.comチュートリアルはいくつかの言語で公開されていて、Python版も公開されている。 背景 Python界隈ではCeleryというタスクキューのライブラリが使われているのをよく見かけるの…

isortのblack互換の設定にprofileオプションを使う

概要 Pythonプロジェクトのフォーマッターにisortとblackを使う場合、両者にはフォーマットルールが異なる部分があるので、isort側でblackと競合しないように設定する必要がある。これまでは、blackの公式ドキュメントに紹介されているisortの設定をコピーし…

MySQL8系ではデフォルトで文字コードがutf8mb4に設定されている

MySQL8系では、文字コードがデフォルトでutf8mb4に設定されていることを知った。 mysql> show variables like '%char%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+----------…