2.3K Views
October 07, 23
スライド概要
DjangoCongress2023で発表した資料になります。
https://djangocongress.jp/
Djangoを活⽤した酪農⽜の 遺伝⼦検査結果システムの 開発と知⾒について 岡崎潤 1
このセッションについて • Djangoの技術的な話はほとんどおこないません • Djangoを使ってゴリゴリカスタマイズとか技術的に特化したプ ロダクトでもないです • Djangoの標準的な機能を使ったプロダクトの参考例にしてもら えるとうれしいです。 • ドメイン(酪農)関連の説明が最初は多め 2
セッションの主旨 • PoCとか新規のプロダクトを開発するときDjangoで開発するの はよいのではないだろうか 3
⽬次 • ⾃⼰紹介 • 会社紹介 • Djangoで開発したプロダクトについて • Djangoをプロダクトに使⽤した理由 4
⾃⼰紹介 • 岡崎潤(@dario_okazaki) • 所属:(株)スカラコミュニケーションズ • 職業:プロジェクトマネージャー(元エンジニア) • 過去にPython関連のイベントでGUI系(Kivy,PySimpleGUI)の 発表をしてました。 5
会社紹介 • 株式会社スカラコミュニケーションズ( https://scalacom.jp/ ) • 事業内容:SaaS/ASP関連事業、ソフトウェア・プロダクトの 開発・販売・保守 • 会社としてメインの開発⾔語はPHP、あとは⼀部のプロダクト でPython、Goを使⽤ • 開発エンジニア募集中( https://recruit.scalacom.jp/development_engineer/ ) 6
Djangoで開発したプロダクトについて • eGプラス • https://scalagrp.jp/news/2023/01-genomics-scom/) • 酪農経営の効率化に貢献する乳⽜ゲノム検査結果データ活⽤シ ステム • 株式会社エリートジェノミクスとの共同開発 7
⽜の遺伝⼦検査の取得⽅法 • ⼦⽜からサンプル(⽿⽅)を採取 • サンプルをアメリカの会社に送って遺伝⼦検査を実施 • 遺伝⼦検査結果はAPI経由で取得 取得した遺伝⼦結果をeGプラス内で、 集計、表⽰ 画像引⽤元: https://sasaeah.co.jp/products/reme dy/husbandry/tsu8 liquid_tsu_dry/index.html
疑問 ⽜の遺伝⼦検査はどうして実施するのか? 9
遺伝⼦検査の⽬的 • ⽜が⼩さいときに乳⽜としての素質を確認したい • 牧場全体の⽜の平均を上げたい • (⽜群改良) ⼭を右に持っていきたい 15
eGプラスの説明 • 農家ごとに遺伝⼦検査結果をみることが可能 • • • • 検査結果の⼀覧 個体の結果 ⽜群の能⼒の割合 ⽜群の推移 • インデックス(個々の値)について • NM$ ・・・⽣涯で⽣み出す利益を推測した混合形質(⾼いほどよい) • 乳量・・・ 305⽇搾乳での乳量。数字が⼤きいほど乳量が多い • 脂肪量・・・ 305⽇搾乳での脂肪量。数字が⼤きいほど脂肪量が多い 16
構成 • クラウド:AWS • EC2,RDS,S3,CloudFront,Waf,CloudWatch • webサーバー:Nginx • アプリケーションサーバ:Gunicorn • サーバ側の開発⾔語とライブラリー: • Python,Django,Pandas • フロント側:html,css,jQuery • エラー監視:Sentry • CI:Github Actions 17
Djangoのディレクトリ構成 • Djangoの「startapp」でプロジェクト作成後にServicesディレ クトリを追加 • ビジネスロジックを記載 18
開発期間と体制 • PM1⼈ • 開発リーダ1⼈ • エンジニア2⼈ • デザイン1⼈ • リリースまでの開発期間:6ヶ⽉(2022年6⽉開始) • 4ヶ⽉⽬で展⽰会でデモを出典 • 年末にリリース 19
展⽰会の様⼦ • ⿅児島の和⽜共振会に参加 • 屋外にテントをはって実施 • 向かいのブースでは⽜⾁の試⾷をしていた 20
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • セキュリティ対策がしっかりしている • ⽇本語でもDjangoの情報がここ数年増えてきていた • 英語(stack overflow等)があれば⼤体の問題が解決する • ⽇本語でのコミュニティができてきている 21
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 22
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 23
ドメイン(畜産)知識ってあったの? •開発を始めた2022年当初は会社にも個⼈に もなかった(今も勉強中) •共同開発のエリートジェノミクス社はドメ イン知識はあったがシステム開発は初めて 24
酪農特有のドメイン例 • ⽜の個体はどう特定するか? • 個体識別番号 • 管理番号 25
個体識別番号について • 国内で飼育される⽜には、⽜トレーサビリティ法に基づき、個 体識別番号として10桁の番号が割り振られ、それぞれの⽜は、 その番号が書かれた札(⽿標)を装着します。 この個体識別番号を、⽣産から流通・⼩売に⾄るまで伝達し管 理する制度 (引⽤元:農林⽔産省 https://www.maff.go.jp/j/heya/sodan/1901/02.html) 26
個体識別番号 • 10桁の数字で構成(頭に0がある場合があり) • スーパーで国産⽜⾁を買うとき表⽰ • 家畜改良事業団(https://www.id.nlbc.go.jp/top.html?pc)から検索可能 • 公共的なID 27
管理番号について • 個体識別番号は10桁なので⽇常的には使いづらい • 覚えられない • 牧場内で使うわかりやすいIDがほしい • 拡⼤4桁 • 個体識別番号の6桁〜9桁 • ⽜の⽿についているあれ(⽿標) 先程の⽜だと「5228」が該当 28
管理番号でソート • 個体⼀覧画⾯で個体識別番号、管理番号でソート(昇順、降 順)する要件あり • DjangoのORMのソートでよさそう 29
管理番号でソート • DjangoのORMでソートではだめたった • 管理番号の頭に0がついている場合がある • 全ての牧場の管理番号が拡⼤4桁ではない • 牧場内で使っている番号なので何をつけてもいい • 4桁ではなく8桁の数字の場合もあり • 頭にアルファベットをついている場合もあり • 例)D1243 • リリース直前で本番データを確認して発覚 30
管理番号でソート • 対応⽅法 • ORMで検査結果を取得したあと、ソートの条件に合わせてPythonコー ド側でコードを書くことで対応 • 問題の原因 • ⽜の個体の識別⽅法について、曖昧な知識のまま開発を進めていた 31
開発する領域のドメイン(畜産)の知識 がなかった • ドメインがわからない • 出たばかりの新しい技術(⾔語、FW)を使う • 開発が炎上する可能性があった • わからないことが2つある • スケジュールでリリース前に展⽰会があった • スケジュールがタイト⽬ 32
Djangoについて • 新しいフレームワークよりも歴史と実績(ちゃんとメンテされ ている)があるフレームワーク • Python、Djangoは⾔語、FWともに実績がある 33
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 34
ユーザ認証と管理画⾯が必要だったから • フロント側のユーザの構造について • 牧場→牧場主(管理者)→牧場関係者 (ユーザ) • 牧場関係者は従業員、獣医師、農協の職 員etc • 獣医師、農協の職員は他の牧場のユーザでも ある(複数の牧場の関係者) 牧場B 牧場A 管理者B 管理者A ユーザA ユーザB ユーザC • ユーザ管理が必須 • Djangoだと標準でユーザ管理機能が ついているので、ユーザ権限を拡張 して対応可能 35
ユーザ認証と管理画⾯が必要だったから • 要件定義の段階で管理画⾯で以下を⾏う必要があった • • • • ゲノム検査結果の閲覧、集計 牧場の登録 ユーザの登録 ⽜の名前の登録 etc 36
ユーザ認証と管理画⾯が必要だったから • Djangoは標準で認証機能と管理画⾯の機能を持っている • 追加でライブラリをインストールする必要がない 37
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 38
わからないことがあっても調べれば答えが出てくる • • • • 公式ドキュメントがしっかりしている ⽇本語でもDjangoの情報がここ数年増えてきていた 英語(stack overflow等)で調べれば⼤体の問題が解決する ⽇本語でのコミュニティができてきている 39
公式ドキュメントがしっかりしている • チュートリアル • ドキュメント解説 • 新規でDjangoが初めてのメンバーにはチュートリアルをしてもらった 40
⽇本語でもDjangoの情報がここ数年増え てきていた • 書籍がそれなりに出てきた • 基本的な内容は@akiyokoさんの本を読むとよい 41
英語(stack overflow等)で調べれば⼤体 の問題が解決する • エラーが出てわからないことはstack overflow(https://stackoverflow.co/)でエラーメッセージの内 容で調べれば解決できる 42
⽇本でのコミュニティがある • discordのコミュニティ • https://discord.gg/RZvawz6KgC • 活発に議論している 43
⽇本でのコミュニティがある • NginxとDjangoの間のアプリケーションサーバはuWSGIと Gunicornのどちらを使⽤するかで悩んだ • webで記事をいくつか読んだけど、どちらがいいが判断がつかない 44
uWSGIとGunicornの⽐較 • uWSGI • メリット:多機能、Gunicornに⽐べて⾼速 • デメリット:設定パラメータが多くて設定が⾯倒そう • Gunicorn • メリット:シンプルな構成、機能としては必要⼗分 • デメリット:設定パラメータが少ないのでチューニングが必要な場合 に困りそう どっちにするべきか? 45
Gunicornを採⽤ • Pythonのコミュニティで知り合った⽇本システム技研の中澤さ んに相談 • Gunicornで良いのではとアドバイスをいただく • configファイルのサンプルもいただく 46
プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 47
セキュリティがしっかりしている • Djangoのお作法にのとった書き⽅をすればXSS、SQLインク ジェクションといった⼀般的なのWebアプリのセキュリティの 問題は解決できる 48
まとめ • Djangoはwebアプリを開発するうえで⼀通りの機能が揃ってる • 情報も豊富なので安⼼感がある(開発していて実際に安⼼感が あった) • 新規開発する上では頼りになる 49
50
おまけ 開発でこまったこと 51
Djangoを使った開発で困ったことについ て • ページのレスポンスの改善 • 管理画⾯のカスタマイズについて 52
開発の中で困ったことについて • ページのレスポンスの改善 • 管理画⾯のカスタマイズについて • デプロイについて 53
ページのレスポンスの⾼速化 • 機能の⼀つで⽜群の中から特定の形質から⾼い順の⽜を表⽰し てユーザが選択して並べ替える機能があった • ページの表⽰が遅かった 54
ページのレスポンスの⾼速化 • 原因:処理の中で重複しているクエリが複数あった • 対応:DebugToolBarを活⽤してDuplicateクエリーの撲滅 • 原因:N+1が発⽣していた(Template側でModelを通じて項⽬データを取得する 際、onlyなどで取得項⽬を絞っていて、対象項⽬データを取得していないと、そこで再度クエ リーが発⾏されてしまう) • 対応:対象項⽬を含めてデータ所得するようにした 55
管理画⾯のカスタマイズについて • 管理画⾯がついているのでカスタマイズできればある程度楽 • だけど管理画⾯周りで、細かい事をやろうとすると情報を探すのが⼤変 • 公式のドキュメントに記載が少ない •例 • メニューの並び順を制御したい • 検索の⾃作のドロップダウンを追加したい • stackoverflow(https://stackoverflow.com/)で調べて対応 56