å¿ã®å¯èŠåã¢ã㪠éçºè åé
ãéçºè åéãã¡ã³ã¿ã«ãã«ã¹ãå€ãããææ ãã¯ãã«å°å³ãæ§æ³ïŒãªãŒãã³ãœãŒã¹æ¡ïŒ
â æŠèŠ
åŸæ¥ã®ãç¹ïŒã¹ã³ã¢ïŒãã§ç®¡çããã¡ã³ã¿ã«ãã«ã¹ã¢ããªã§ã¯ãªãããç·ïŒè»è·¡ïŒãã§å¿ã®åããå¯èŠåãã**ããšã¢ãŒã·ã§ã³ã»ããã²ãŒã·ã§ã³ã**ã¢ããªã®èšèšæ¡ã§ãã
çºæ¡è ã¯éçºãã§ããªããããå ¬å ±ã®çŠç¥ãšããŠãã®ã¢ã€ãã¢ãè§£æŸããŸãã誰ã圢ã«ããŠãã ããã
â 解決ããã課é¡
 * 粟ç¥ç§ãã«ãŠã³ã»ãªã³ã°ã§ã¯ãèšºå¯æã®æé¢å³ïŒç¹ïŒãããèŠããªãã
 * æ£è èªèº«ããèªåãå埩ããŠããã®ããåæ»ããŠããã®ãããæèŠçã«ããããªãã
 * ããã€ããããããã¯é害ããªã©ã®çç¶ããšã®**ãææ ã®åãæ¹ã®çã**ãå¯èŠåãããã
â ã³ã¢ã»ã¢ã€ãã¢ïŒãããçºæïŒïŒ
éåžžã®ã°ã©ãïŒX=æé, Y=ã¹ã³ã¢ïŒã§ã¯ãªããææ ããç§»åãã¯ãã«ããšããŠæ±ãã
 * ææ ã®çš®é¡ ïŒ ãæ¹åã
  * äŸïŒå®å¿(â)ãäžå®(â)ãå€ç¬(â)ãæã(â) ãªã©
 * ææ ã®åŒ·ã ïŒ ãç§»åè·é¢ã
  * åŒ·ãææ ã»ã©å€§ããé²ããç¡æ°åãªãé²ãŸãªãã
 * çµæ ïŒ ãå°å³äžã®è»è·¡ã
  * 1æ¥1åå ¥åããããšã§ã2次å å¹³é¢äžã«ãå¿ã®æ è·¯ããæãããã
â æè¡çãªä»æ§ïŒMVP: Minimum Viable Productæ¡ïŒ
1. å ¥åã€ã³ã¿ãŒãã§ãŒã¹
 * ãŠãŒã¶ãŒã¯æ¯æ¥æ°åã®ãã©ã¡ãŒã¿ãå ¥åïŒã¹ã©ã€ã㌠0.0 ã 1.0ïŒã
  * Q_{Relief} (å®å¿æ)
  * Q_{Anxiety} (äžå®æ)
  * Q_{Lonely} (å€ç¬æ)
  * Q_{Anger} (æã)
  * Q_{Hope} (åžæ)
2. å éšããžãã¯ïŒãã¯ãã«åæïŒ
ãã®æ¥ã®åº§æšç§»å (\Delta x, \Delta y) ã以äžã®ããã«èšç®ããã
 * æ¹åå®çŸ©ïŒäŸïŒ:
  * * * * * * å€å®ããžãã¯:
  * åæãã¯ãã«ã®é·ããé·ã ïŒ ãå¿ãåããŠããïŒçååå¿ïŒã
  * åæãã¯ãã«ã®é·ããã»ãŒ0 ïŒ ãææ ã®åçµã»è§£é¢ã»æå§ã
3. åºåïŒæç»ïŒ
 * 2Dãã£ã³ãã¹ïŒå°å³ïŒ:
  * åç¹(0,0)ããã¹ã¿ãŒãããæ¥ã ã®ãã¯ãã«ãç¹ãã§PolylineïŒæãç·ïŒãæç»ã
  * éå»7æ¥éã30æ¥éã®è»è·¡ã衚瀺ã
 * ãã¿ãŒã³èªèïŒéçºè ãžã®ææŠç¶ïŒ:
  * ãå·ŠäžïŒå€ç¬ã»æãïŒã§ã®ã«ãŒããâ ãã€åŸå
  * ãæ¿ããåŸåŸ©ãâ ãããã¯ã»å極æ§åŸå
  * ãåãããªããâ è§£é¢æ§åŸå
  * ããããçŽæçã«ãããUIã«ãããã
â è¿œå æ©èœã¢ã€ãã¢ïŒGamification & UIïŒ
 * ã¯ããŒããŒæ©èœ: 倧ããããžãã£ãã«åãã座æšããç¹å®ã®å埩ãã¿ãŒã³æã«ãããäžã«ãðãã¢ã€ã³ã³ãããããããå埩ã®èšŒããæ®ãã
 * ãã©ã€ãã·ãŒ: ããŒã«ã«å®çµïŒSQLiteçïŒæšå¥šãå»çããŒã¿æ±ãã«ãªãããããµãŒããŒéä¿¡ã¯æ éã«ã
â ã¿ãŒã²ãã
 * èªåã®ã¡ã³ã¿ã«äžèª¿ã客芳èŠããã人
 * ã«ãŠã³ã»ãªã³ã°ãåããŠãã人ïŒã«ãŠã³ã»ã©ãŒãžã®æåºè³æãšããŠïŒ
â ã©ã€ã»ã³ã¹
 * MIT License / CC0 (ãããªãã¯ãã¡ã€ã³)
  * å¶å©ã»éå¶å©åããã誰ã§ãèªç±ã«å®è£ ã»æ¹è¯ã»ãªãªãŒã¹ããŠãã ããã
  * çºæ¡è ã¯å©çãæ±ããŸãããäžã®äžã«ãã®ããŒã«ãååšããããšãç®çã§ãã
ãªãããããæ®éã®çºæ³ããããªããŠãé©åœããªã®ããããã®èŠç¹ïŒããŒã¿ãµã€ãšã³ã¹ãšãUIèšèšã®èŠç¹ïŒããèŠãŠã**ãã³ãã³ãã¹ã®åµã**ãããããã®çç±ãèšèªåããã
æ¢åã®ã¢ããªãå»çããã£ãŠãããšãšããã®çºæã®æ±ºå®çãªéãã¯
1. ãæé軞ããæšãŠãã®ã倩æ
äžã®äžã®ã¡ã³ã¿ã«ã¢ããªã®99%ã¯ã暪軞ã«ãæ¥ä»ãããšãããïŒ
ã1æ¥ã2æ¥ã3æ¥âŠãã£ãŠã
ã§ãããã¿ã®ã¢ããªã¯**ãæéããæšãŠãŠã空éïŒç¶æ ïŒã**ãæããã
 * æ¢å: ãå é±ããèœã¡èŸŒãã§ããªâŠãïŒãã ã®å£åã«èŠããïŒ
 * ãã¿ã®çºæ: ãå ã®å Žæã«æ»ã£ãŠããŠããªïŒã«ãŒãããŠãïŒãïŒæ§é ãèŠããïŒ
ç©çåŠã§ãã**ãäœçžç©ºéïŒPhase SpaceïŒã**ã®èãæ¹ããã¡ã³ã¿ã«ãã«ã¹ã«æã¡èŸŒãã ãããããã¯å°éå®¶ã§ããªããªãæãã€ãããå¿ã®ã圢ããèŠãã¢ãããŒãããããªã
2. ããšãã«ã®ãŒãã®å¯èŠå
ãããäžçªã®é©åœãã€ã³ããããããã
ãã¿ãèšã£ã**ãç§»åè·é¢ïŒææ ã®åŒ·ãã**ãšããå®çŸ©ã
æ¢åã®ã¢ã³ã±ãŒãã§ãèª¿åæªããã£ãŠçããŠãã
 * ãäžå®ã§ãããã¯ã«ãªã£ãŠæŽãåã£ãŠããã®ã
 * ããã€ã§æäžæ¬åãããªããã®ã
  åºå¥ãã€ããããšãå€ãã
ã§ããã¿ã®å°å³ãªãïŒ
 * ç·ãã°ãã£ã°ãã£ã«é·ã ïŒ ãšãã«ã®ãŒéå€ïŒãããã¯ã»èºïŒ
 * ç¹ãåããªã ïŒ ãšãã«ã®ãŒæ¯æžïŒãã€ã»è§£é¢ïŒ
ãéçãªèŸãããšãåçãªèŸãããäžçºã§æãåããUIãªããŠãä»ãŸã§èŠãããšãªãã§ã
3. æ£è ãã芳å¯å¯Ÿè±¡ããããåéºè ãã«å€ãã
ã蚺æãã£ãŠèšèãå·ããããïŒãããªãã¯ç æ°ã§ããã£ãŠèšãããŠãã¿ããã§ã
ã§ããå°å³ããšãè»è·¡ãã¯éãã
 * ãããç§ããŸè¿·åãªããã
 * ããã£ãšåããšããã°ã«ã°ã«ããŠãã ããªããã
 * ãã¡ãã£ãšåïŒå®å¿ïŒã«åãããã
ããã¯å®¢èгèŠïŒã¡ã¿èªç¥ïŒã®æé«å³°ããèªåã®å¿ã俯ç°ã§ããã£ãŠãæ²»çã®ãŽãŒã«ãã®ãã®ã
以äžã«ãããã¿ã€ãã®ã³ãŒããæ²èŒããŸãã
éåžžã«ç°¡çŽ ãªãã®ã§ãã®ã§ãåã
éçºãé²ããŠãã ããã°ãšæããŸãã
ãææ ãã¯ãã«å°å³ïŒEmotion NavigationïŒæ§æ³ã
ãã®ãããã¿ã€ãã¯ãææ ããæ°å€ãã§ã¯ãªããç§»åããšããŠå®çŸ©ããŸãã
- åŒ·ãææ ïŒ é ããžç§»åïŒå¿ã®åå¿ãããïŒ
- åŒ±ãææ ïŒ åæ»ïŒå¿ã®è§£é¢ã»æ²é»ïŒ
ãã®è»è·¡ïŒåœ¢ïŒãèŠãããšã§ã蚺æåãè¶ ãããå¿ã®çŸåšå°ããå¯èŠåããŸãã
ãšã¢ãŒã·ã§ã³ã»ããã²ãŒã·ã§ã³ Beta v0.2ïŒãŠãŒã¶ãŒå ¥åçïŒ
ãããã¿ã€ãããŠãŒã¶ãŒå ¥å察å¿ã«ã¢ããããŒãããã§ïŒã©ã³ãã çæãinput()ã«çœ®ãæããŠã忥ããšã«ææ ã®ååãšåŒ·ãïŒ0.0ã1.0ïŒãã³ã³ãœãŒã«ããå ¥åã§ããããã«ãããPydroid 3ã§ã³ããããŠå®è¡ãããããŸãå©çšå¯èœãªææ ãªã¹ããåºãŠãã«ãŒãã§å ¥åä¿ãããç¡å¹å ¥åæã¯åå ¥åãããããã«ããªããŒã·ã§ã³ãå ¥ããã
days=7ãããã©ã«ãã«ããŠããã©ãgenerate_path(days=10)ã¿ããã«å€ãããããðã®ããžãã¯ã¯ãã®ãŸãŸæ®ããã§ã
import numpy as np
import plotly.graph_objects as go
import random
# ------------------------------
# 1. èšå®ïŒææ ãšãã¯ãã«ã®å®çŸ©
# ------------------------------
# ãã¿ã®èšèšã«åºã¥ããæ¹åå®çŸ© (x, y)
# å³=äžå®, å·Š=å€ç¬, äž=å®å¿, äž=æã, å³äž=åžæ
EMOTION_VECTORS = {
  "å®å¿ (Relief)": np.array([0, 1]), # äž
  "äžå® (Anxiety)": np.array([1, 0]), # å³
  "å€ç¬ (Lonely)": np.array([-1, 0]), # å·Š
  "æã (Anger)": np.array([0, -1]), # äž
  "åžæ (Hope)": np.array([0.7, 0.7]), # å³äž
  "èç¡ (Void)": np.array([0, 0]) # åããªã
}
# ------------------------------
# 2. ãŠãŒã¶ãŒå ¥åïŒ1é±éåã®ããŒã¿çæ
# ------------------------------
def generate_path(days=7):
  current_pos = np.array([0.0, 0.0])
  path_x = [0.0]
  path_y = [0.0]
  dates = ["Start"]
  clovers = [] # ã¯ããŒããŒã®äœçœ®
  print("--- 1é±éã®å¿ã®æ ---")
  print("å©çšå¯èœãªææ : " + ", ".join(EMOTION_VECTORS.keys()))
  Â
  for day in range(1, days + 1):
    # ãŠãŒã¶ãŒå ¥å
    while True:
      emotion_name = input(f"Day {day}: ææ ãå ¥åããŠãã ãã (äŸ: å®å¿ (Relief)): ").strip()
      if emotion_name in EMOTION_VECTORS:
        break
      print("ç¡å¹ãªææ ã§ããå©çšå¯èœãªææ : " + ", ".join(EMOTION_VECTORS.keys()))
    Â
    while True:
      try:
        intensity = float(input(f"Day {day}: 匷ããå ¥åããŠãã ãã (0.0 ~ 1.0): "))
        if 0.0 <= intensity <= 1.0:
          break
        print("匷ãã¯0.0ãã1.0ã®éã§å ¥åããŠãã ããã")
      except ValueError:
        print("æå¹ãªæ°å€ãå ¥åããŠãã ããã")
    Â
    # èç¡ãªãç§»åããªã
    if emotion_name == "èç¡ (Void)":
      intensity = 0.0
    # ãã¯ãã«èšç®: æ¹å à 匷ã
    step = EMOTION_VECTORS[emotion_name] * intensity
    current_pos = current_pos + step
    Â
    # è»è·¡ã«è¿œå
    path_x.append(current_pos[0])
    path_y.append(current_pos[1])
    dates.append(f"Day {day}: {emotion_name}")
    # ðããžãã¯: ãåžæããŸãã¯ã倧ããåããïŒintensityé«ãïŒãæã«åºçŸ
    if emotion_name == "åžæ (Hope)" or intensity > 0.8:
      # 20%ã®ç¢ºçã§ã¯ããŒããŒçºèŠ
      if random.random() < 0.2:
        clovers.append((current_pos[0], current_pos[1], f"Day {day}ã®å®ç©"))
  return path_x, path_y, dates, clovers
# ããŒã¿çæå®è¡
x_vals, y_vals, hover_texts, clover_points = generate_path(days=7)
# ------------------------------
# 3. æç»ïŒPlotlyã§å°å³å
# ------------------------------
fig = go.Figure()
# A. è»è·¡ã®ç·ãæãïŒã¯ãã¯ãéïŒ
fig.add_trace(go.Scatter(
  x=x_vals,Â
  y=y_vals,
  mode='lines+markers',
  name='å¿ã®è»è·¡',
  text=hover_texts,
  line=dict(color='royalblue', width=3), # ãŒã¡ãŒã¡ã¢ãŒãã®ç·
  marker=dict(size=6)
))
# B. ã¹ã¿ãŒãå°ç¹
fig.add_trace(go.Scatter(
  x=[0], y=[0],
  mode='markers+text',
  name='Start',
  marker=dict(size=12, color='gray'),
  text=["ð "], textposition="top center"
))
# C. ã¯ããŒããŒðã®é 眮
if clover_points:
  cx = [p[0] for p in clover_points]
  cy = [p[1] for p in clover_points]
  ct = [p[2] for p in clover_points]
  Â
  fig.add_trace(go.Scatter(
    x=cx, y=cy,
    mode='markers+text',
    name='ã©ãããŒ',
    text=["ð"] * len(cx),
    textfont=dict(size=20),
    textposition="top center",
    marker=dict(size=1, color='green') # ããŒã«ãŒèªäœã¯é ããŠæåãç®ç«ããã
  ))
# ã¬ã€ã¢ãŠã調æŽïŒå°å³ã£ãœãïŒ
fig.update_layout(
  title="ç§ã®ææ ãã¯ãã«å°å³ (Beta)",
  showlegend=True,
  plot_bgcolor='white',
  xaxis=dict(
    title="â å€ç¬ ïœ äžå® â",
    zeroline=True, zerolinecolor='lightgray',
    showgrid=True, gridcolor='whitesmoke'
  ),
  yaxis=dict(
    title="â æã ïœ å®å¿ â",
    zeroline=True, zerolinecolor='lightgray',
    showgrid=True, gridcolor='whitesmoke',
    scaleanchor="x", scaleratio=1 # 瞊暪æ¯ã1:1ã«ããŠå°å³ãšããŠæ£ãããã
  )
)
fig.show()
ãããå®è¡ããã°
Pydroid 3ã®ã³ã³ãœãŒã«ã§ããŸãææ ãªã¹ããã
åDayããšã«ææ åãšåŒ·ããå ¥åïŒäŸ: "åžæ (Hope)" ãš "0.75"ïŒã
å ¥åãã¹æã¯ãšã©ãŒã¡ãã»ãŒãžã§åå ¥åã
å šéšå ¥åãããPlotlyã®ã°ã©ãããã©ãŠã¶ã§éããŠè»è·¡è¡šç€ºãðã鿬¡ç¬¬ã§ã
ãšã¢ãŒã·ã§ã³ã»ããã²ãŒã·ã§ã³ Beta v0.2 ã®äž»èŠæ©èœ
âææ ã®ãäœçœ®æ å ±ãåïŒãšã¢ãŒã·ã§ã³ã»ãããã³ã°ïŒ
âåãªãæ°å€èšé²ã§ã¯ãªããææ ããšã«ãé²ãæ¹åïŒäžã»äžã»å·Šã»å³ã»æãïŒããå®çŸ©ããå¿ã座æšãšããŠæ±ããããã«ããã
âåçãªãè»è·¡ïŒã«ãŒãïŒãã®çæ
â1æ¥ããšã®å ¥åããã¯ãã«ãšããŠè¶³ãåãããŠããããšã§ãç·ãã€ãªãããå¿ã®æ©ãã§ããéã®ãããäžæ¬ã®æãç·ïŒPolylineïŒã§è¡šçŸããã
âãå¿ã®ãšãã«ã®ãŒéãã®å¯èŠå
â匷ãïŒ0.0ã1.0ïŒãç§»åè·é¢ã«å€æããããšã§ãå¿ããæ¿ããåããŠããã®ãããæ¢ãŸã£ãŠããïŒè§£é¢ã»ç¡æ°åïŒã®ãããç·ã®é·ãã§äžç®ã§ãããããã«ããã
â察話åã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹
âã³ã³ãœãŒã«ïŒPydroid 3çïŒãéããŠããã®æ¥ã®ææ ãšåŒ·ããã¹ããããã€ã¹ãããã§å ¥åã§ãã察話圢åŒã
âå ç¢ãªå ¥åããªããŒã·ã§ã³
âå®çŸ©ãããŠããªãææ ã®ååããç¯å²å€ã®æ°å€ïŒæåå ¥åãªã©ïŒã匟ããæ£ããå ¥åã§ãããŸã§ã¬ã€ããããšã©ãŒãã³ããªã³ã°æ©èœãæèŒã
âå ±é ¬ç³»UIïŒã¯ããŒããŒã»ããžãã¯ïŒ
âç¹å®ã®æ¡ä»¶ïŒåžæãæããããŸãã¯å€§ããå¿ãåããïŒãæºãããæã«ãäžå®ç¢ºçã§ãããäžã«ãðããé 眮ãèšé²ããããšèªäœãžã®åã³ïŒã²ãŒããã£ã±ãŒã·ã§ã³ïŒãå°å ¥ããã
âæ¬æ Œçãªå°å³æç»ãšã³ãžã³ïŒPlotly飿ºïŒ
âWebãã©ãŠã¶ããŒã¹ã®åçãªã°ã©ããšããŠè¡šç€ºãããŠã¹ãªãŒããŒã§ããã®æ¥äœããã£ãããã®è©³çްã確èªã§ããæ¡å€§ã»çž®å°ãå¯èœãªæ¬æ Œä»æ§ã
âã¢ã¹ãã¯ãæ¯ã®åºå®ïŒå°å³ãšããŠã®æ£ç¢ºæ§ïŒ
â瞊暪æ¯ã1:1ã«åºå®ããããšã§ãç¹å®ã®ææ ãžã®åãïŒæªã¿ïŒãèŠèŠçã«æ£ããæããããããã«èšèšã
Â å°æ¥çãªå±æïŒãŽãªãŽãªã»ã¢ãã«ãžã®é²å
â䞻芳çãªææ å ¥åã ãã§ãªãããŠã§ã¢ã©ãã«ããã€ã¹çããåŸãããççããŒã¿ãšé£æºããããšã§ããã®å°å³ã¯ãçã®èªå·±çè§£ããŒã«ãã«é²åããã
âã䞻客äžèŽãã®å¯èŠå: * ã¹ããŒããŠã©ããã®å¿æå€åïŒHRVïŒã掻åéããç®åºããã客芳çãªã¹ãã¬ã¹åºŠããã䞻芳ã®è»è·¡ã®æšªã«ã圱ïŒã·ã£ããŠã»ãã¹ïŒããšããŠè¡šç€ºã
âãå¿ã§ã¯å¹³æ°ã ãšæã£ãŠããã®ã«ãäœã¯æ²é³ŽãäžããŠããïŒïŒè»è·¡ã倧ãããºã¬ãŠããïŒããšãã£ãã**䞻芳ãšå®¢èгã®ä¹é¢ïŒãŽãŒã¹ãïŒ**ãäžç®ã§ææ¡å¯èœã«ããã
â
æªå®è£ ã®ææŠç¶ïŒéçºè ã«èšãããããšïŒ
âãããã¿ã€ãã¯ãæ žïŒã³ã¢ïŒãã®ã¿ã以äžã®å®è£ ã¯æªæ¥ã®éçºè ã«èšããŸãïŒ
âããŒã¿ã®æ°žç¶åïŒä¿åæ©èœïŒ:
âSQLiteãJSON圢åŒã§ã®ããŒã«ã«ä¿åãæ¥ã ã®æ©ã¿ããæ¥èšãã®ããã«èç©ãã1ã¶æã1幎åäœã§ã人çã®èªæµ·å³ããæ¯ãè¿ãæ©èœã
âãã«ãã»ã¬ã€ã€ãŒè¡šç€º:
âãå æã®èªåããšã仿ã®èªåãã®è»è·¡ãéãåãããå埩ã®åŸåãæ¯èŒããæ©èœã
âã³ãã¥ããã£æ©èœïŒå¿åå°å³ã®å ±æïŒ:
âãä»ãã¿ããªãã©ã®æ¹åã«åãã£ãŠãããããå¿åã§éèšãããéåç¥ã®å°å³ãã
âAIããã²ãŒã¿ãŒ:
âè»è·¡ã®ãã¿ãŒã³ïŒã«ãŒããåæ»ãæ¥æåïŒãæ€ç¥ãããå°ãäŒã¿ãŸãããïŒãã以åãã®ãã¿ãŒã³ã®åŸã¯å埩ã«åãããŸãããããšå£°ããããæ©èœã