Djangoを活用した酪農牛の遺伝子検査結果システムの開発と知見について

2.3K Views

October 07, 23

スライド概要

DjangoCongress2023で発表した資料になります。
https://djangocongress.jp/

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

Djangoを活⽤した酪農⽜の 遺伝⼦検査結果システムの 開発と知⾒について 岡崎潤 1

2.

このセッションについて • Djangoの技術的な話はほとんどおこないません • Djangoを使ってゴリゴリカスタマイズとか技術的に特化したプ ロダクトでもないです • Djangoの標準的な機能を使ったプロダクトの参考例にしてもら えるとうれしいです。 • ドメイン(酪農)関連の説明が最初は多め 2

3.

セッションの主旨 • PoCとか新規のプロダクトを開発するときDjangoで開発するの はよいのではないだろうか 3

4.

⽬次 • ⾃⼰紹介 • 会社紹介 • Djangoで開発したプロダクトについて • Djangoをプロダクトに使⽤した理由 4

5.

⾃⼰紹介 • 岡崎潤(@dario_okazaki) • 所属:(株)スカラコミュニケーションズ • 職業:プロジェクトマネージャー(元エンジニア) • 過去にPython関連のイベントでGUI系(Kivy,PySimpleGUI)の 発表をしてました。 5

6.

会社紹介 • 株式会社スカラコミュニケーションズ( https://scalacom.jp/ ) • 事業内容:SaaS/ASP関連事業、ソフトウェア・プロダクトの 開発・販売・保守 • 会社としてメインの開発⾔語はPHP、あとは⼀部のプロダクト でPython、Goを使⽤ • 開発エンジニア募集中( https://recruit.scalacom.jp/development_engineer/ ) 6

7.

Djangoで開発したプロダクトについて • eGプラス • https://scalagrp.jp/news/2023/01-genomics-scom/) • 酪農経営の効率化に貢献する乳⽜ゲノム検査結果データ活⽤シ ステム • 株式会社エリートジェノミクスとの共同開発 7

8.

⽜の遺伝⼦検査の取得⽅法 • ⼦⽜からサンプル(⽿⽅)を採取 • サンプルをアメリカの会社に送って遺伝⼦検査を実施 • 遺伝⼦検査結果はAPI経由で取得 取得した遺伝⼦結果をeGプラス内で、 集計、表⽰ 画像引⽤元: https://sasaeah.co.jp/products/reme dy/husbandry/tsu8 liquid_tsu_dry/index.html

9.

疑問 ⽜の遺伝⼦検査はどうして実施するのか? 9

10.

遺伝⼦検査の⽬的 • ⽜が⼩さいときに乳⽜としての素質を確認したい • 牧場全体の⽜の平均を上げたい • (⽜群改良) ⼭を右に持っていきたい 15

11.

eGプラスの説明 • 農家ごとに遺伝⼦検査結果をみることが可能 • • • • 検査結果の⼀覧 個体の結果 ⽜群の能⼒の割合 ⽜群の推移 • インデックス(個々の値)について • NM$ ・・・⽣涯で⽣み出す利益を推測した混合形質(⾼いほどよい) • 乳量・・・ 305⽇搾乳での乳量。数字が⼤きいほど乳量が多い • 脂肪量・・・ 305⽇搾乳での脂肪量。数字が⼤きいほど脂肪量が多い 16

12.

構成 • クラウド:AWS • EC2,RDS,S3,CloudFront,Waf,CloudWatch • webサーバー:Nginx • アプリケーションサーバ:Gunicorn • サーバ側の開発⾔語とライブラリー: • Python,Django,Pandas • フロント側:html,css,jQuery • エラー監視:Sentry • CI:Github Actions 17

13.

Djangoのディレクトリ構成 • Djangoの「startapp」でプロジェクト作成後にServicesディレ クトリを追加 • ビジネスロジックを記載 18

14.

開発期間と体制 • PM1⼈ • 開発リーダ1⼈ • エンジニア2⼈ • デザイン1⼈ • リリースまでの開発期間:6ヶ⽉(2022年6⽉開始) • 4ヶ⽉⽬で展⽰会でデモを出典 • 年末にリリース 19

15.

展⽰会の様⼦ • ⿅児島の和⽜共振会に参加 • 屋外にテントをはって実施 • 向かいのブースでは⽜⾁の試⾷をしていた 20

16.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • セキュリティ対策がしっかりしている • ⽇本語でもDjangoの情報がここ数年増えてきていた • 英語(stack overflow等)があれば⼤体の問題が解決する • ⽇本語でのコミュニティができてきている 21

17.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 22

18.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 23

19.

ドメイン(畜産)知識ってあったの? •開発を始めた2022年当初は会社にも個⼈に もなかった(今も勉強中) •共同開発のエリートジェノミクス社はドメ イン知識はあったがシステム開発は初めて 24

20.

酪農特有のドメイン例 • ⽜の個体はどう特定するか? • 個体識別番号 • 管理番号 25

21.

個体識別番号について • 国内で飼育される⽜には、⽜トレーサビリティ法に基づき、個 体識別番号として10桁の番号が割り振られ、それぞれの⽜は、 その番号が書かれた札(⽿標)を装着します。 この個体識別番号を、⽣産から流通・⼩売に⾄るまで伝達し管 理する制度 (引⽤元:農林⽔産省 https://www.maff.go.jp/j/heya/sodan/1901/02.html) 26

22.

個体識別番号 • 10桁の数字で構成(頭に0がある場合があり) • スーパーで国産⽜⾁を買うとき表⽰ • 家畜改良事業団(https://www.id.nlbc.go.jp/top.html?pc)から検索可能 • 公共的なID 27

23.

管理番号について • 個体識別番号は10桁なので⽇常的には使いづらい • 覚えられない • 牧場内で使うわかりやすいIDがほしい • 拡⼤4桁 • 個体識別番号の6桁〜9桁 • ⽜の⽿についているあれ(⽿標) 先程の⽜だと「5228」が該当 28

24.

管理番号でソート • 個体⼀覧画⾯で個体識別番号、管理番号でソート(昇順、降 順)する要件あり • DjangoのORMのソートでよさそう 29

25.

管理番号でソート • DjangoのORMでソートではだめたった • 管理番号の頭に0がついている場合がある • 全ての牧場の管理番号が拡⼤4桁ではない • 牧場内で使っている番号なので何をつけてもいい • 4桁ではなく8桁の数字の場合もあり • 頭にアルファベットをついている場合もあり • 例)D1243 • リリース直前で本番データを確認して発覚 30

26.

管理番号でソート • 対応⽅法 • ORMで検査結果を取得したあと、ソートの条件に合わせてPythonコー ド側でコードを書くことで対応 • 問題の原因 • ⽜の個体の識別⽅法について、曖昧な知識のまま開発を進めていた 31

27.

開発する領域のドメイン(畜産)の知識 がなかった • ドメインがわからない • 出たばかりの新しい技術(⾔語、FW)を使う • 開発が炎上する可能性があった • わからないことが2つある • スケジュールでリリース前に展⽰会があった • スケジュールがタイト⽬ 32

28.

Djangoについて • 新しいフレームワークよりも歴史と実績(ちゃんとメンテされ ている)があるフレームワーク • Python、Djangoは⾔語、FWともに実績がある 33

29.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 34

30.

ユーザ認証と管理画⾯が必要だったから • フロント側のユーザの構造について • 牧場→牧場主(管理者)→牧場関係者 (ユーザ) • 牧場関係者は従業員、獣医師、農協の職 員etc • 獣医師、農協の職員は他の牧場のユーザでも ある(複数の牧場の関係者) 牧場B 牧場A 管理者B 管理者A ユーザA ユーザB ユーザC • ユーザ管理が必須 • Djangoだと標準でユーザ管理機能が ついているので、ユーザ権限を拡張 して対応可能 35

31.

ユーザ認証と管理画⾯が必要だったから • 要件定義の段階で管理画⾯で以下を⾏う必要があった • • • • ゲノム検査結果の閲覧、集計 牧場の登録 ユーザの登録 ⽜の名前の登録 etc 36

32.

ユーザ認証と管理画⾯が必要だったから • Djangoは標準で認証機能と管理画⾯の機能を持っている • 追加でライブラリをインストールする必要がない 37

33.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 38

34.

わからないことがあっても調べれば答えが出てくる • • • • 公式ドキュメントがしっかりしている ⽇本語でもDjangoの情報がここ数年増えてきていた 英語(stack overflow等)で調べれば⼤体の問題が解決する ⽇本語でのコミュニティができてきている 39

35.

公式ドキュメントがしっかりしている • チュートリアル • ドキュメント解説 • 新規でDjangoが初めてのメンバーにはチュートリアルをしてもらった 40

36.

⽇本語でもDjangoの情報がここ数年増え てきていた • 書籍がそれなりに出てきた • 基本的な内容は@akiyokoさんの本を読むとよい 41

37.

英語(stack overflow等)で調べれば⼤体 の問題が解決する • エラーが出てわからないことはstack overflow(https://stackoverflow.co/)でエラーメッセージの内 容で調べれば解決できる 42

38.

⽇本でのコミュニティがある • discordのコミュニティ • https://discord.gg/RZvawz6KgC • 活発に議論している 43

39.

⽇本でのコミュニティがある • NginxとDjangoの間のアプリケーションサーバはuWSGIと Gunicornのどちらを使⽤するかで悩んだ • webで記事をいくつか読んだけど、どちらがいいが判断がつかない 44

40.

uWSGIとGunicornの⽐較 • uWSGI • メリット:多機能、Gunicornに⽐べて⾼速 • デメリット:設定パラメータが多くて設定が⾯倒そう • Gunicorn • メリット:シンプルな構成、機能としては必要⼗分 • デメリット:設定パラメータが少ないのでチューニングが必要な場合 に困りそう どっちにするべきか? 45

41.

Gunicornを採⽤ • Pythonのコミュニティで知り合った⽇本システム技研の中澤さ んに相談 • Gunicornで良いのではとアドバイスをいただく • configファイルのサンプルもいただく 46

42.

プロダクトでDjangoを採⽤した理由 • 開発する領域のドメイン(畜産)の知識がなかった • ユーザ認証と管理画⾯が必要だったから • わからないことがあっても調べれば答えが出てくる • セキュリティがしっかりしている 47

43.

セキュリティがしっかりしている • Djangoのお作法にのとった書き⽅をすればXSS、SQLインク ジェクションといった⼀般的なのWebアプリのセキュリティの 問題は解決できる 48

44.

まとめ • Djangoはwebアプリを開発するうえで⼀通りの機能が揃ってる • 情報も豊富なので安⼼感がある(開発していて実際に安⼼感が あった) • 新規開発する上では頼りになる 49

46.

おまけ 開発でこまったこと 51

47.

Djangoを使った開発で困ったことについ て • ページのレスポンスの改善 • 管理画⾯のカスタマイズについて 52

48.

開発の中で困ったことについて • ページのレスポンスの改善 • 管理画⾯のカスタマイズについて • デプロイについて 53

49.

ページのレスポンスの⾼速化 • 機能の⼀つで⽜群の中から特定の形質から⾼い順の⽜を表⽰し てユーザが選択して並べ替える機能があった • ページの表⽰が遅かった 54

50.

ページのレスポンスの⾼速化 • 原因:処理の中で重複しているクエリが複数あった • 対応:DebugToolBarを活⽤してDuplicateクエリーの撲滅 • 原因:N+1が発⽣していた(Template側でModelを通じて項⽬データを取得する 際、onlyなどで取得項⽬を絞っていて、対象項⽬データを取得していないと、そこで再度クエ リーが発⾏されてしまう) • 対応:対象項⽬を含めてデータ所得するようにした 55

51.

管理画⾯のカスタマイズについて • 管理画⾯がついているのでカスタマイズできればある程度楽 • だけど管理画⾯周りで、細かい事をやろうとすると情報を探すのが⼤変 • 公式のドキュメントに記載が少ない •例 • メニューの並び順を制御したい • 検索の⾃作のドロップダウンを追加したい • stackoverflow(https://stackoverflow.com/)で調べて対応 56