ðåŠç¿100æéã®ãã©ãã¯ãã©ã€ããŒããèªåã®Flaskã³ãŒãã®ç©èŒãã¹ã9ã€çºèŠããŠå šéšçŽãã話ðŠ
çè ã«ã€ããŠ
ç©æµçŸå Ž7幎ã®çŸåœ¹ãã©ãã¯ãã©ã€ããŒãITå®åçµéšãŒãã
2026幎5æ12æ¥ã13幎åã®PCã«Linuxãå
¥ããŠPythonåŠç¿ãéå§ã
ç¬åŠ100æéã§èªåãäœã£ãã·ã¹ãã ãèŠçŽãã話ãããŸãã
ææ°çãã¢æ åã¯ãã¡ãð
ãªãã³ãŒããèŠçŽããã
ãäœã£ãŠçµããããå«ã ã£ãã
äžèº«ã®ç¡ãæ°ãããã®ãéç£ãããããäžã€ã®ã·ã¹ãã ãæ¬åœã«äœ¿ããã¬ãã«ãŸã§çªãè©°ãããã£ããQiitaã®éå»èšäºã誀åãèŠã€ãããçŽããããåé§ÃPythonã®èšäºã¯3ã4åä¿®æ£ãããã³ãŒããåãã ãšæã£ãŠããã
æ¥ã
ã®æ¥åã§ã
ããã®ç©ã¿æ¹ã§æ¬åœã«åºçºããŠããã ãããïŒã
ãšçãæ·±ããªã£ãŠããã
ã³ãŒããæžããšããåãçãåºãã
è·å Žã®äºæ
ã®å€§åã¯ãã ããé転ãããçãŸããã
ãæ¢ãŸã£ãŠãããã ãããã倧äžå€«ã ããã
倧åãªã®ã¯ããããããªãé転ãã ãããã¯äžã«åŸãã確èªãããåããŠã®ç°å¢ã§ã¯éããŠç®èŠãããè»éã空ãããååãåºå®ãããå šãŠå¯ŸçãæãŠãã
ã³ãŒããåãã ã£ãã
ã»ãåããŠããã倧äžå€«ã ãããâdebug=True ãæ¬çªã«æ®ã£ãŠããã
ã»ã䜿ããªããã©æ¶ããªããŠããã ãããâäžèŠãªimportãç©ã¿äžãã£ãŠããã
ã»ãå
¥åå€ã¯æ£åžžã ãããâããªããŒã·ã§ã³ãæããŠããã
ãã ããã³ãŒãã£ã³ã°ããç©èŒãã¹ãçãã
ããããããªãã³ãŒãã£ã³ã°ãã§é²ããäºæ
ã¯ããªãããããããçŸå Žã§ç¥ã£ãŠããã

ã§ã¯ãè·å Žã®äºæ
ã¯ã©ããã£ãŠé²ããã
å°ãããã¹ãäœåºŠãéãªããšå€§ããªäºæ
ã«ç¹ããããç©ã¿åžãå¿ãã»ç©ã¿åžãééãã»ååç Žæããããåäœãªã埩æ§ã¯æ©ãã
ã§ãè»äž¡äºæ
ã«ãªããšè©±ãå€ããã
ãå®å
šç¢ºèªãè»äž¡ç§»åãèŠå¯ãžã®é£çµ¡ãæ
å ±äº€æãç©ã¿æ¿ããé
å»¶é£çµ¡ãââ埩æ§ã«ãšãã§ããªãæéããããã 責任åé¡ ã«ã ä¿¡çšåé¡ ã«ããªãã
ã³ãŒããåãã ãdebug=True ã®æ¬çªæ®çãäžèŠãªimportã®æŸçœ®ãããªããŒã·ã§ã³ã®æ¬ åŠãäžã€ã²ãšã€ã¯å°ãããã§ãæ¬çªç°å¢ã§éãªã£ããšãã埩æ§ã³ã¹ãã¯è·³ãäžãããã ããå°ãããã¹ã朰ãã
å®ç§ãªãã®ãªããŠååšããªããåžžã«ç°å¢ãã¢ããããŒãããæèãå¿ èŠã ã
è»æ€ãåããããå®å¿ããšã¯ãªããªãããã«ããç·©ãã§ãããããããªããä¿®çãé Œãã§ãçŽã£ãŠããªããããããªããã ããæ¯æ¥èªåã§è»äž¡ç¹æ€ãããããã«ãã§ãã¯ããã
ã³ãŒããåãã ãã宿ããããšæã£ãç¬é ãäžçªå±ãªãã

*Photo by Graficon Stuff on Unsplash
ç©èŒãã¹1ã6ïŒæåã®ã¬ãã¥ãŒã§çºèŠïŒ
ç©èŒãã¹1ïŒé¢æ°ã®ãç©ã¿æ®ãã
build_sales_prompt ãšãã颿°ããapp.pyãšprompts.pyã®2ç®æã«ååšããŠãããprompts.pyã¯èª°ã«ã䜿ãããŠããªãç¶æ
ã§æŸçœ®ãããŠããã
ãåå ãïŒè·è§£ãåã®ç©ã¿æ®ã
颿°ãprompts.pyãžåŒã£è¶ããããæ®µéã§æºè¶³ããŠããŸããapp.pyã®å€ã颿°ãæ¶ãå¿ããããã³ããŒããŠåãããããšã·ããšãããã ããã³ãŒãã£ã³ã°ãã ã£ãã
ã察çãïŒè·éããåŸã®ç®èŠç¢ºèª
ãå€ããã®ã¯æ¶ãããïŒããæ°ããæ¥ç¶å
ã«åãæ¿ãã£ãŠãããïŒããã»ããã§ç¢ºèªãããè·ãéããããè·å°ã空ã«ãªã£ããç®èŠç¢ºèªããã®ãšåãã ã
# ä¿®æ£åïŒapp.pyã«ãåã颿°ãååšããŠãã
def build_sales_prompt(sales_summary: str) -> str:
return f"..."
# ä¿®æ£åŸïŒprompts.pyããimportããã ã
from prompts import build_sales_prompt
ç©èŒãã¹2ïŒå®éšå Žã®çä»ãå¿ã
æ¬çªçšã®templatesãã©ã«ãã®äžã«ãJavaScriptã®éåæéä¿¡ãç·Žç¿ããããã«äœã£ãjs_test.htmlãæ®ã£ãŠããããŠãŒã¶ãŒãè§Šãæ¬çªç°å¢ã«äžèŠãªãŽããã¡ã€ã«ãæ··å ¥ããŠããç¶æ ã ã
ãåå ãïŒç®çéæãšåæã«é ãåãæ¿ãã£ã
ããŸãåãã詊ãããããšããæ°æã¡ã§æ¬çªãã©ã«ãå
ã«å®éšãã¡ã€ã«ãäœã£ããéåæéä¿¡ã®å®è£
ãæåããç¬éãé ãæ¬¡ã®ã¿ã¹ã¯ãžåãæ¿ãããå®éšå Žã®çä»ããæãèœã¡ããåããå®å¿æã®ãŸãŸæŸçœ®ãããã
ã察çãïŒæ°ã¥ããæç¹ã§å³åé€
äžèŠã«ãªã£ãå®éšãã¡ã€ã«ã¯ãã®å Žã§åé€ãä»åŸã¯æ¬çªãã©ã«ãã«å®éšçšã®ãã¡ã€ã«ãçŽæ¥äœããã確èªãçµãã£ããããæ¶ãç¿æ
£ãã€ããã
ç©èŒãã¹3ïŒãããã°ã¢ãŒãã®ãæ¶ãå¿ãã
app.run(debug=True) ã®ãŸãŸæ¬çªç°å¢ã«å
¬éãããã«ãªã£ãŠããããããã°ã¢ãŒããæå¹ãªç¶æ
ã§ãšã©ãŒãèµ·ãããšãã·ã¹ãã ã®å
éšã³ãŒããéèŠãªæ
å ±ãç»é¢ã«äžžèŠãã«ãªããã»ãã¥ãªãã£äžãæãå±éºãªç©èŒãã¹ã ã£ãã
ãåå ãïŒã決ãŸãæå¥ãã«ãªã£ãŠãã
éçºäžã¯ãšã©ãŒã®åå ãç»é¢ã«è¡šç€ºãããdebug=Trueã®æ©æµã100%åããŠããããã®ãã app.run(debug=True) ããã¢ããªãèµ·åããããã®æ±ºãŸãæå¥ãã«ãªã£ãŠããŸããæ¬çªãžæã£ãŠããæ®µéã§ãªãã«ããæèãå®å
šã«æãèœã¡ãã
ãæ°ã¥ãããšããïŒ
ããããã®ãŸãŸèª°ãã«äœ¿ãããŠãšã©ãŒãåºãããã·ã¹ãã ã®è£åŽãå
šéšäžžè£žã«ãªã£ãŠãããããŸããšããã
ã察çãïŒäººéã®æ¶ãå¿ãã«é Œããªãä»çµã¿ãž
ç°å¢å€æ°ã§å¶åŸ¡ããæ¬çªã§ã¯èªåçã«ãããã°ã¢ãŒãããªãã«ãªãèšèšã«å€æŽããã
# ä¿®æ£å
app.run(debug=True, host="0.0.0.0", port=5000)
# ä¿®æ£åŸ
debug_mode = os.environ.get("FLASK_DEBUG", "false").lower() == "true"
app.run(debug=debug_mode, host="0.0.0.0", port=5000)
ç©èŒãã¹4ïŒæ°æ§ã®ãäºéç©èŒã
PostgreSQLãžã®ç§»è¡ãå®äºããã«ãããããããExcelãžæžã蟌ãå€ãåŠçãã³ãŒãã®äžã«ãã®ãŸãŸæ®ã£ãŠãããããŒã¿ã2ç®æã«åãããäžéå端ãªç¶æ ã§ããã©ã¡ãã®ããŒã¿ãæ£ããã®ãããåãããªããªãåå ã«ãªãã
ãåå ãïŒãå®ã代ããã«æ®ããŠãã
ãä»ãŸã§åããŠããExcelã®åŠçãæ¶ããŠããŸãã®ãæãã£ãããPostgreSQLãžã®ä¿åãæåããå®å¿æã®ãŸãŸãããå¿
èŠã®ãªãExcelã®åŠçãåé€ãããšããæåŸã®ä»äžããåŸåãã«ããã
ã察çãïŒGitãä¿¡ããŠæãåã£ãŠåé€
ããŒãžã§ã³ç®¡çãããã°ããã€ã§ãæ»ãããå€ãã³ãŒãã¯ãå®ãã§ã¯ãªããéªéãªè·ç©ã ãç§»è¡ãå®äºãããè¿·ããåé€ããã
# ä¿®æ£åïŒExcelãšDBã䞊走ããŠãã
generate_excel(year, month, products_data) # åé€
get_filtered_sales_data(target_year, target_month) # åé€
# ä¿®æ£åŸïŒDBã ãã«äžæ¬å
_get_sales_from_db(target_year, target_month)
ç©èŒãã¹5ïŒå¹ŽåºŠã®ãè³å³æéåããèšèš
dashboard.htmlã®å¹ŽåºŠã»ã¬ã¯ãããã¯ã¹ã«ã2025ãã2026ãã2027ããçŽæžããããŠããã2028幎ã«ãªã£ãç¬éãæåã§ã³ãŒããæžãæããªããšã·ã¹ãã ã䜿ããªããªãèšèšã ã£ãã
ãåå ãïŒãä»åãã°ãšã·ããšããèŠç¹
éçºæç¹ã§ã¯2025ã2027幎ã®ããŒã¿ã衚瀺ãããŠããã°å®ç§ã«åããããæªæ¥ã®å¹ŽåºŠã«ãªã£ããã©ããªããããšããä¿å®æ§ã®èŠç¹ã«ãŸã§é ãåãããããšããããåãããããã§ãšã·ïŒããšçŽæžãã®ãŸãŸã«ããã
ã察çãïŒçŸåšã®å¹Žãåºæºã«èªåçæ
Pythonã§çŸåšã®å¹ŽãååŸããJinja2ã®ã«ãŒãã§åçã«éžæè¢ãçæããä»çµã¿ã«å€æŽãããæåã§ã®æžãæããäžèŠãªã寿åœã®é·ãã·ã¹ãã ãã«ãªã£ãã
<!-- ä¿®æ£åïŒçŽæžã -->
<option value="2025">2025幎</option>
<option value="2026">2026幎</option>
<option value="2027">2027幎</option>
<!-- ä¿®æ£åŸïŒåççæ -->
{% set current_year = now.year %}
{% for y in range(current_year + 1, current_year - 3, -1) %}
<option value="{{ y }}">{{ y }}幎</option>
{% endfor %}
ç©èŒãã¹6ïŒäžèŠãªè·ç©ã®ãç©ã¿ã£ã±ãªãã
requirements.txtã«Googleã®AIçšã©ã€ãã©ãªãæ°æ§2ã€æ··åšããŠãããäžèŠãªã©ã€ãã©ãªãæ®ã£ãŠãããšãã€ã³ã¹ããŒã«ã«ç¡é§ãªæéããããã ãã§ãªããããŒãžã§ã³è¡çªã§ã·ã¹ãã ãåããªããªããªã¹ã¯ãããã
ãåå ãïŒpip freeze ã§ãã®ãŸãŸæžãåºãã
AIæ©èœã®å°å
¥æã«è€æ°ã®ã©ã€ãã©ãªã詊ãããæ£è§£ã®ã©ã€ãã©ãªã倿ããŠåããåŸãpip freeze > requirements.txt ã§äžèЧããã®ãŸãŸæžãåºãããããå®é𿮵éã§å
¥ããå€ãã©ã€ãã©ãªãŸã§äžç·ã«æ··å
¥ããã
ã察çãïŒäœ¿ããªããªã£ãããã®éœåºŠã¢ã³ã€ã³ã¹ããŒã«
ã©ã€ãã©ãªã倿Žããé㯠pip uninstall ã§å³åé€ããŠãããªã¹ããæŽæ°ãããç©ãã è·ç©ã¯éãããããå¿
ããã®éœåºŠç¢ºèªããã
# ä¿®æ£åïŒæ°æ§ãæ··åš
google-genai==2.4.0
google-generativeai==0.8.6 # äžèŠ
# ä¿®æ£åŸïŒå¿
èŠãªãã®ã ã
google-genai==2.4.0
ç©èŒãã¹7ã9ïŒGeminiã«ææãããïŒ
ç©èŒãã¹7ïŒæãå ¥ãã®ããè·ç©ã®ãç©ã¿ã£ã±ãªãã
PostgreSQLç§»è¡ãå®äºããExcelããããŒã¿ãéèšããå¿ èŠããªããªã£ãã«ãããããããauto_aggregator.pyããã©ã«ãã«æ®ã£ãŠããããã¹4ã®ããã¡ã€ã«äžžããšçãã ã䜿ãããŠããªãéå»ã®éºç©ããããžã§ã¯ãå ã«æŸçœ®ãããŠããç¶æ ã
ãåå ãïŒãµã³ã¯ã³ã¹ãïŒæªç·ŽïŒ
ãã®ãã¡ã€ã«ã¯ãããŒã¿ããŒã¹å°å
¥åã«äžçæžåœäœã£ãŠå®éã«åããŠããæãå
¥ãã®ããã³ãŒãã ã£ããããã䜿ããªãããšé ã§ã¯åãã£ãŠãããã§ãããã£ããé 匵ã£ãŠæžãããã念ã®ããæ®ããŠããããããšããæ°æã¡ãåãããã©ã«ãã®é
ã«ç ãããŠããŸã£ãã
ã察çãïŒGitã«é ããŠãçŸå Žã¯äžè»ã ã
éå»ã®ã³ãŒãã¯Gitã®å±¥æŽã®äžã«çŸããä¿åãããŠãããçŸåšã®äœæ¥ãã©ã«ãã¯åžžã«ãä»å¿
èŠãªãã®ã ããã«ããã¹ã¯ã©ããïŒãã«ãã培åºããã
ç©èŒãã¹8ïŒç°ç©æ€åãŒãã®ãç¡é²åãªè·åãã
æ¥æ¬¡å£²äžå ¥åãã©ãŒã ã§ããã€ãã¹å€ãæååãå ¥åãããŠããšã©ãŒã«ãªãããã®ãŸãŸDBã«ä¿åãããç¶æ ã ã£ãã売äžåèšããããããªã£ãããã·ã¹ãã ãäºæãã¬ãšã©ãŒã§æ¢ãŸã£ããããåå ã«ãªãã
ãåå ãïŒãèªåã«ãŒã«ãã§ãããã¹ãããŠããªãã£ã
èªåã§äœã£ãç»é¢ãªã®ã§ããã¹ãæãæ£ããæ°åããå
¥åããªãã£ãããä»äººãè§Šã£ãããã€ãã¹ãå
¥ãããããããªãããå€ãªæåãéä¿¡ãããããããªãããšããæ³åãå®å
šã«æãèœã¡ãŠããããã ããã³ãŒãã£ã³ã°ãã®å
žåã ã
ã察çãïŒäºéã®æ€åäœå¶
ç°ç©ãæ··ãã£ãåææã¯ãæ€åã§çµ¶å¯Ÿã«å·¥å Žå
ã«å
¥ããªãããããšåãäœå¶ãæŽããã
- HTMLåŽïŒ
min="0"ãrequiredã§ãã€ãã¹å€ã»ç©ºæ¬ãéä¿¡äžå¯ã« - PythonåŽïŒããã§ãããæããŠããå€ãDBã®æåã§åŒŸãæçµé²è¡ç·ãå®è£
# ä¿®æ£åŸïŒäºéãã§ãã¯
try:
qty_int = int(float(quantity))
except ValueError:
continue
if qty_int < 0:
continue
ç©èŒãã¹9ïŒåºçºåã®ãç©èŒç¢ºèªãŒãã
ã¢ããªèµ·åæã«å¿ èŠãªç°å¢å€æ°ïŒAPIããŒãªã©ïŒãæã£ãŠããããã§ãã¯ããä»çµã¿ããªãã£ããèšå®ãå¿ãããŸãŸã¢ããªãèµ·åãããŠãŒã¶ãŒããã¿ã³ãæŒããç¬éã«åããŠèŽåœçãªãšã©ãŒãèµ·ããèšèšã ã£ãã
ãåå ãïŒèªåã®ç°å¢ã§ã¯ããã€ã§ãåãã®ãåœããåãã ã£ã
èªåã®PCã«ã¯äžåºŠç°å¢å€æ°ãèšå®ããŠããŸãã°ãã€ã§ãåããããå¥ã®PCãžæã£ãŠãã£ããšãããæ¬çªãµãŒããŒã«é
眮ãããšããã«èšå®ãæŒãããããããªããšããæ³å®ãå®å
šã«æãèœã¡ãŠããã
ã察çãïŒåºçºåã«ç©èŒç¢ºèªããä»çµã¿ãå®è£
ãã©ãã¯ãåºçºããåã«ç©èŒç¢ºèªãããããã«ãã¢ããªãèµ·åããç¬éã«å¿
èŠãªç°å¢å€æ°ãå
šéšæã£ãŠãããèªåãã§ãã¯ããã1ã€ã§ãè¶³ããªããã°å³åº§ã«èµ·åã忢ããããåãããŠããæ°ã¥ããã§ã¯ãªããèµ·åæã«1ç§ã§æ€ç¥ãããèšèšã«å€ããã
# èµ·åæã«äžæ¬ãã§ãã¯ïŒFail-FastïŒ
_required_env_vars = ["GEMINI_API_KEY"]
_missing = [var for var in _required_env_vars if not os.environ.get(var)]
if _missing:
raise RuntimeError(f"èµ·åã«å¿
èŠãªç°å¢å€æ°ãèšå®ãããŠããŸãã: {', '.join(_missing)}")
çŽããŠå€ãã£ãããš
ã³ãŒããããã ããããæ¶ããã
ããªããŒã·ã§ã³ãFail-FastãäžèŠãã¡ã€ã«ã®åé€ãDBäžæ¬åã9ã€çŽããããšã§ãå€ãªããŒã¿ãæ¥ãŠããèšå®ãæŒããŠããŠããã·ã¹ãã ãèªåã§èªåãå®ãããã«ãªã£ãã
ãåãã°ãšã·ãããã誰ãè§Šã£ãŠãå£ããªãããžã
çŸå Žã§7幎ãã£ãŠããããããããªãé転ãããããããã³ãŒãã§è¡šçŸã§ããããã«ãªã£ãã
次ã«ããããšïŒDockerå
9ã€ã®ç©èŒãã¹ãçŽããã·ã¹ãã ã«ã¯ããŸã äžã€èª²é¡ãããã
ãèªåã®PCã§ããåããªãããšããåé¡ã ã
Pythonã®ããŒãžã§ã³éããPostgreSQLã®æ¥ç¶èšå®ã®ãºã¬ãå¥ã®ç°å¢ã«æã£ãŠãã£ãç¬éã«ãèªåã®PCã§ã¯åããã®ã«ããšãããã©ãã«ãèµ·ãããããããŸããã ããé転ã®éãã ã
Dockerã䜿ãã°ãPythonã»Flaskã»PostgreSQLã»ã©ã€ãã©ãªå šéšã1ã€ã®ã³ã³ããã«äžžããšããã±ãŒãžåã§ãããã³ãã³ã1ã€ã§ãèª°ã®æå ã§ãå šãåãç°å¢ãç«ã¡äžããã
ãèªåã®PCå°çšã®ã·ã¹ãã ããããã©ãã«ã§ãåºè·ã§ãããã仿§ã®ãããã¯ãããžã®æçµé²åããããæ¬¡ã®ã¹ãããã ã
GitHubã¯ãã¡ã(sales_data_app)
YouTubeãã¢æ åã¯ãã¡ãð
https://youtu.be/iz4r3YP3JZk?si=w9AENw1iifjlwZ7j
â»ææ°ç(ver.2)
sales_data_app æŽåèšé²ã·ãªãŒãº
ãæ¬çªåºèµ°åã»è»æ€äžéšäœã
ðãåºèµ°åŸã¡ã³ããã³ã¹ã·ãªãŒãºã
ð



