yukikase Claude Opus 4.6 commited on
Commit
5733dea
·
1 Parent(s): 8ae7870

refactor: データ構造リファクタリング(不要フィールド削除・年間予定構造変更)

Browse files

- 公認/準公認区分、カテゴリ、概要テキスト、性別比率等の不要フィールドを削除
- 年間予定の構造を {month, events[]} から {period, event} に変更
- 活動頻度の旧値マッピングを削除
- SNSデータにhandleフィールドを追加
- mainImageフィールドを追加(images配列のorder=0を自動選択)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

app/main.py CHANGED
@@ -123,24 +123,21 @@ def get_summary_data():
123
  # ここで必要なフィールドのみ抽出して返す
124
  summaries_payload: list[dict[str, object]] = []
125
  for circle in circles_service.list_circles():
126
- # 画像はprimaryの1枚だ返す
127
- image = _select_primary_image(circle.images) if circle.images else None
 
 
128
 
129
  summary = CircleSummary(
130
  circleId=circle.circleId,
131
  circleName=circle.circleName,
132
  circleNameKana=circle.circleNameKana,
133
- circleType=circle.circleType,
134
  projectId=circle.projectId,
135
  projectName=circle.projectName,
136
- mainCategory=circle.mainCategory,
137
- subCategory=circle.subCategory,
138
- category=circle.category,
139
  genre=circle.genre,
140
  areaCode=circle.areaCode,
141
  pamphletNumber=circle.pamphletNumber,
142
- prSummary=circle.prSummary,
143
- description=circle.description,
144
  mainImage=image,
145
  memberCount=circle.memberCount,
146
  memberNote=circle.memberNote,
 
123
  # ここで必要なフィールドのみ抽出して返す
124
  summaries_payload: list[dict[str, object]] = []
125
  for circle in circles_service.list_circles():
126
+ # 画像はcircle.mainImageを使用、なればimagesから選択
127
+ image = circle.mainImage
128
+ if image is None and circle.images:
129
+ image = _select_primary_image(circle.images)
130
 
131
  summary = CircleSummary(
132
  circleId=circle.circleId,
133
  circleName=circle.circleName,
134
  circleNameKana=circle.circleNameKana,
 
135
  projectId=circle.projectId,
136
  projectName=circle.projectName,
 
 
 
137
  genre=circle.genre,
138
  areaCode=circle.areaCode,
139
  pamphletNumber=circle.pamphletNumber,
140
+ detailDescription=circle.detailDescription,
 
141
  mainImage=image,
142
  memberCount=circle.memberCount,
143
  memberNote=circle.memberNote,
data/generated/circles.json CHANGED
@@ -3,17 +3,11 @@
3
  "circleId": "circle-001",
4
  "circleName": "千葉大学サッカー部",
5
  "circleNameKana": "ちばだいがくさっかーぶ",
6
- "circleType": "公認",
7
  "projectId": null,
8
  "projectName": null,
9
- "mainCategory": "SPORTS",
10
- "subCategory": "BALL_SPORTS",
11
- "category": "PERFORMANCE",
12
  "genre": "ATHLETIC_CLUB",
13
  "areaCode": "T",
14
  "pamphletNumber": 1,
15
- "prSummary": "関東大学サッカーリーグ所属。週5日の練習で全国大会出場を目指しています。",
16
- "description": "# 千葉大学サッカー部\n\n私たちは関東大学サッカーリーグに所属する体育会サッカー部です。\n\n## 活動について\n\n週5日の練習を通じて、技術と体力の向上に努めています。チームワークを大切にし、全国大会出場を目標に日々精進しています。\n\n## 入部について\n\n- 経験者はもちろん、初心者も歓迎します\n- マネージャーも募集中です\n- まずは練習見学にお越しください",
17
  "detailDescription": "# 千葉大学サッカー部について\n\n## 概要\n\n関東大学サッカーリーグ**1部**所属。創部以来、多くの*プロサッカー選手*を輩出してきた伝統あるチームです。\n\n## 活動頻度と内容\n\n週5日の厳しい練習を通じて、以下のスキルを鍛えています:\n\n1. 技術力の向上\n2. 体力・持久力の強化\n3. 精神力・メンタルの鍛錬\n\n> 「サッカーは11人でするスポーツ。チームワークがすべての基盤だ」- 監督談\n\n## 年間スケジュール\n\n| 時期 | イベント |\n|------|----------|\n| 4月 | 新歓・春季リーグ開幕 |\n| 8月 | 夏合宿 |\n| 11月 | 大祭・秋季リーグ |\n| 3月 | 追いコン |\n\n## 入部条件\n\n- サッカー経験者優遇\n- 初心者も相談可\n- **マネージャー募集中**\n\n詳細は[公式サイト](https://example.com/chiba-soccer)をご覧ください。\n\n```\n練習日程:月・火・水・木・土\n場所:総合グラウンド\n```",
18
  "memberCount": 50,
19
  "memberNote": null,
@@ -24,42 +18,36 @@
24
  "otherCosts": null,
25
  "annualSchedule": [
26
  {
27
- "month": 4,
28
- "events": [
29
- "新歓",
30
- "春季リーグ開幕"
31
- ]
32
  },
33
  {
34
- "month": 5,
35
- "events": [
36
- "リーグ戦"
37
- ]
38
  },
39
  {
40
- "month": 8,
41
- "events": [
42
- "夏合宿"
43
- ]
44
  },
45
  {
46
- "month": 11,
47
- "events": [
48
- "大祭",
49
- "秋季リーグ"
50
- ]
51
  },
52
  {
53
- "month": 12,
54
- "events": [
55
- "冬合宿"
56
- ]
57
  },
58
  {
59
- "month": 3,
60
- "events": [
61
- "追いコン"
62
- ]
 
 
 
 
 
 
63
  }
64
  ],
65
  "contactInfo": "soccer@example.chiba-u.jp",
@@ -82,14 +70,21 @@
82
  "order": 2
83
  }
84
  ],
 
 
 
 
 
85
  "sns": [
86
  {
87
  "type": "TWITTER",
88
- "url": "https://twitter.com/chiba_soccer"
 
89
  },
90
  {
91
  "type": "INSTAGRAM",
92
- "url": "https://instagram.com/chiba_soccer"
 
93
  }
94
  ]
95
  },
@@ -97,17 +92,11 @@
97
  "circleId": "circle-002",
98
  "circleName": "千葉大学吹奏楽団",
99
  "circleNameKana": "ちばだいがくすいそうがくだん",
100
- "circleType": "公認",
101
  "projectId": null,
102
  "projectName": null,
103
- "mainCategory": "CULTURE",
104
- "subCategory": "MUSIC_PERFORM",
105
- "category": "MUSIC",
106
  "genre": "MUSIC",
107
  "areaCode": "L",
108
  "pamphletNumber": 2,
109
- "prSummary": "定期演奏会や学祭での演奏を行っています。初心者から経験者まで幅広く活動中。",
110
- "description": "# 千葉大学吹奏楽団\n\n創部70年以上の歴史を持つ、千葉大学を代表する音楽団体です。\n\n## 活動内容\n\n- **定期演奏会**: 年2回、大ホールでの本格的な演奏会\n- **学園祭演奏**: 大祭でのステージ演奏\n- **地域イベント**: 地域の催しへの出演\n\n## 楽器について\n\n管楽器・打楽器の経験者はもちろん、大学から始める初心者も大歓迎です。貸出楽器もあります。",
111
  "detailDescription": "# 千葉大学吹奏楽団 詳細案内\n\n## 歴史と伝統\n\n千葉大学吹奏楽団は**1950年代**に創設された伝統ある音楽団体です。\n\n> 70年以上の歴史の中で、数々の名演奏を生み出してきました\n\n## 演奏会情報\n\n年間を通じて精力的に活動し、定期演奏会では毎回*1000人以上*の観客を動員しています。\n\n### 主な演奏会\n\n1. 春の定期演奏会(6月)\n2. 学園祭ステージ(10月)\n3. クリスマスコンサート(12月)\n4. 卒業演奏会(3月)\n\n## コンクール実績\n\n| 年度 | 大会名 | 結果 |\n|------|--------|------|\n| 2024 | 関東大会 | 金賞 |\n| 2023 | 全国大会 | 銀賞 |\n| 2022 | 関東大会 | 金賞 |\n\n## 楽器パート紹介\n\n- **木管楽器**: フルート、クラリネット、オーボエ等\n- **金管楽器**: トランペット、トロンボーン、ホルン等\n- **打楽器**: ティンパニ、パーカッション等\n\n```\n入部問い合わせ先:brass@example.chiba-u.jp\n見学随時受付中!\n```\n\n詳細は[公式サイト](https://example.com/chiba-brass)へ",
112
  "memberCount": 60,
113
  "memberNote": null,
@@ -118,43 +107,40 @@
118
  "otherCosts": null,
119
  "annualSchedule": [
120
  {
121
- "month": 4,
122
- "events": [
123
- "新歓",
124
- "新入生歓迎演奏会"
125
- ]
 
 
 
 
 
126
  },
127
  {
128
- "month": 6,
129
- "events": [
130
- "定期演奏会"
131
- ]
132
  },
133
  {
134
- "month": 8,
135
- "events": [
136
- "夏合宿",
137
- "コンクール"
138
- ]
139
  },
140
  {
141
- "month": 10,
142
- "events": [
143
- "学園祭演奏"
144
- ]
145
  },
146
  {
147
- "month": 12,
148
- "events": [
149
- "クリスマスコンサート"
150
- ]
151
  },
152
  {
153
- "month": 3,
154
- "events": [
155
- "追いコン",
156
- "卒業演奏会"
157
- ]
 
158
  }
159
  ],
160
  "contactInfo": "brass@example.chiba-u.jp",
@@ -177,14 +163,21 @@
177
  "order": 2
178
  }
179
  ],
 
 
 
 
 
180
  "sns": [
181
  {
182
  "type": "TWITTER",
183
- "url": "https://twitter.com/chiba_brass"
 
184
  },
185
  {
186
  "type": "LINE",
187
- "url": "https://line.me/chiba_brass"
 
188
  }
189
  ]
190
  },
@@ -192,17 +185,11 @@
192
  "circleId": "circle-003",
193
  "circleName": "軽音楽サークル SOUNDWAVE",
194
  "circleNameKana": "けいおんがくさーくる さうんどうぇーぶ",
195
- "circleType": "準公認",
196
  "projectId": null,
197
  "projectName": null,
198
- "mainCategory": "CULTURE",
199
- "subCategory": "MUSIC_PERFORM",
200
- "category": "MUSIC",
201
  "genre": "MUSIC",
202
  "areaCode": "K",
203
  "pamphletNumber": 3,
204
- "prSummary": "バンド活動を通じて音楽を楽しむサークルです。初心者大歓迎!",
205
- "description": "# 軽音楽サークル SOUNDWAVE\n\nロック、ポップス、ジャズなど様々なジャンルの音楽を楽しむサークルです。\n\n## 活動スタイル\n\nバンドを組んで、定期的にライブハウスでの演奏や学内イベントに参加しています。\n\n### 主な活動\n\n- 月1回の部内ライブ\n- 学園祭でのステージ演奏\n- 外部ライブハウスでの演奏\n\n## 初心者へ\n\n楽器を触ったことがなくても大丈夫! 先輩が丁寧に教えます。貸出機材もあります。",
206
  "detailDescription": "# 軽音楽サークル SOUNDWAVE\n\n## コンセプト\n\n> 「音楽を愛するすべての人に、表現の場を」\n\n軽音楽サークルSOUNDWAVEは、音楽を愛するメンバーが集まり、*自由に*音楽活動を楽しむサークルです。\n\n## ジャンルの多様性\n\nジャンルの垣根なく、やりたい音楽を追求できる環境があります:\n\n- **ロック**: J-ROCKから洋楽まで\n- **ポップス**: 最新ヒット曲のコピーバンド\n- **ジャズ**: スタンダードナンバーのセッション\n- **アニソン**: アニメソングカバー\n\n## バンド結成の流れ\n\n1. 新歓期にメンバー募集\n2. ジャンル・趣味の合う人と出会う\n3. バンドを結成\n4. 練習を重ねる\n5. ライブで発表!\n\n## 初心者向けサポート\n\n| サポート内容 | 詳細 |\n|--------------|------|\n| 楽器レンタル | ギター、ベース、キーボード |\n| レッスン | 先輩による個別指導 |\n| 教材 | 初心者向け楽譜・動画 |\n\n```\n練習スタジオ:音楽棟地下1階\n利用時間:9:00〜21:00\n予約方法:LINE公式アカウントから\n```\n\n### 入部費用\n\n年会費**6,000円**(スタジオ利用料込み)\n\n[Twitter](https://twitter.com/chiba_keion)で活動情報を発信中!",
207
  "memberCount": 30,
208
  "memberNote": null,
@@ -213,46 +200,32 @@
213
  "otherCosts": null,
214
  "annualSchedule": [
215
  {
216
- "month": 4,
217
- "events": [
218
- "新歓ライブ"
219
- ]
220
  },
221
  {
222
- "month": 5,
223
- "events": [
224
- "春の定期ライブ"
225
- ]
226
  },
227
  {
228
- "month": 7,
229
- "events": [
230
- "七夕ライブ"
231
- ]
232
  },
233
  {
234
- "month": 8,
235
- "events": [
236
- "夏合宿"
237
- ]
238
  },
239
  {
240
- "month": 11,
241
- "events": [
242
- "大祭ステージ"
243
- ]
244
  },
245
  {
246
- "month": 12,
247
- "events": [
248
- "クリスマスライブ"
249
- ]
250
  },
251
  {
252
- "month": 3,
253
- "events": [
254
- "追いコン"
255
- ]
256
  }
257
  ],
258
  "contactInfo": "keion@example.chiba-u.jp",
@@ -270,14 +243,21 @@
270
  "order": 1
271
  }
272
  ],
 
 
 
 
 
273
  "sns": [
274
  {
275
  "type": "TWITTER",
276
- "url": "https://twitter.com/chiba_keion"
 
277
  },
278
  {
279
  "type": "INSTAGRAM",
280
- "url": "https://instagram.com/chiba_keion"
 
281
  }
282
  ]
283
  },
@@ -285,17 +265,11 @@
285
  "circleId": "circle-004",
286
  "circleName": "アニメーション研究会",
287
  "circleNameKana": "あにめーしょんけんきゅうかい",
288
- "circleType": "準公認",
289
  "projectId": null,
290
  "projectName": null,
291
- "mainCategory": "CULTURE",
292
- "subCategory": "VISUAL_ARTS",
293
- "category": "EXHIBITION",
294
  "genre": "CULTURE",
295
  "areaCode": "S",
296
  "pamphletNumber": 4,
297
- "prSummary": "アニメーション制作や鑑賞会を行っています。創作活動が好きな人集まれ!",
298
- "description": "# アニメーション研究会\n\nアニメーションの制作・鑑賞を中心に活動するサークルです。\n\n## 活動内容\n\n### 制作活動\n- 自主制作アニメーションの企画・制作\n- イラスト・漫画制作\n- 動画編集技術の習得\n\n### 鑑賞活動\n- 定期的なアニメ鑑賞会\n- 話題作の上映会\n- 制作者トークイベント\n\n## 展示活動\n\n学園祭やコミックマーケットでの作品発表を行っています。",
299
  "detailDescription": "# アニメーション研究会 詳細ガイド\n\n## 私たちについて\n\nアニメーション研究会は、アニメ好きが集まり、**観る**だけでなく**作る**ことにも挑戦するサークルです。\n\n> 「見る側から、作る側へ」\n\n## 活動内容詳細\n\n### 制作部門\n\nデジタルツールを使った本格的なアニメーション制作:\n\n1. 企画・シナリオ作成\n2. キャラクターデザイン\n3. 作画・動画制作\n4. 編集・仕上げ\n\n### イラスト・漫画部門\n\n- *同人誌*制作\n- イラスト集発行\n- Web漫画連載\n\n## 使用ソフトウェア\n\n| ソフト | 用途 |\n|--------|------|\n| CLIP STUDIO | イラスト・漫画 |\n| After Effects | 動画編集 |\n| Blender | 3DCG |\n\n## イベント参加実績\n\n- **コミックマーケット**: 毎年夏・冬参加\n- **大学祭**: 上映会・展示\n- **学内イベント**: 定期上映会\n\n```\nサークル室:学生会館3階302号室\n開放時間:平日16:00〜20:00\n```\n\n### 入会について\n\n技術的なスキルがなくても、*やる気があれば大歓迎*です!\n\n詳細は[公式サイト](https://example.com/chiba-anime)をご覧ください。",
300
  "memberCount": 25,
301
  "memberNote": null,
@@ -306,41 +280,32 @@
306
  "otherCosts": null,
307
  "annualSchedule": [
308
  {
309
- "month": 4,
310
- "events": [
311
- "新歓"
312
- ]
 
 
313
  },
314
  {
315
- "month": 5,
316
- "events": [
317
- "春の上映会"
318
- ]
319
  },
320
  {
321
- "month": 8,
322
- "events": [
323
- "コミケ参加",
324
- "夏合宿"
325
- ]
326
  },
327
  {
328
- "month": 11,
329
- "events": [
330
- "大祭展示・上映"
331
- ]
332
  },
333
  {
334
- "month": 2,
335
- "events": [
336
- "冬の上映会"
337
- ]
338
  },
339
  {
340
- "month": 3,
341
- "events": [
342
- "追いコン"
343
- ]
344
  }
345
  ],
346
  "contactInfo": "anime@example.chiba-u.jp",
@@ -358,10 +323,16 @@
358
  "order": 1
359
  }
360
  ],
 
 
 
 
 
361
  "sns": [
362
  {
363
  "type": "TWITTER",
364
- "url": "https://twitter.com/chiba_anime"
 
365
  }
366
  ]
367
  },
@@ -369,17 +340,11 @@
369
  "circleId": "circle-005",
370
  "circleName": "バドミントンサークル B.A.S.S.",
371
  "circleNameKana": "ばどみんとんさーくる ばす",
372
- "circleType": "準公認",
373
  "projectId": null,
374
  "projectName": null,
375
- "mainCategory": "SPORTS",
376
- "subCategory": "RACKET_SPORTS",
377
- "category": "PERFORMANCE",
378
  "genre": "SPORTS",
379
  "areaCode": "G",
380
  "pamphletNumber": 5,
381
- "prSummary": "初心者から経験者まで楽しくバドミントン! 週2回の練習で無理なく続けられます。",
382
- "description": "# バドミントンサークル B.A.S.S.\n\nB.A.S.S.(Badminton Association of Sports & Smash)は、楽しくバドミントンをすることをモットーに活動しています。\n\n## 特徴\n\n- **初心者歓迎**: 大学からバドミントンを始める人が半数以上\n- **自由な雰囲気**: 練習参加は自由、自分のペースで活動可能\n- **インカレ交流**: 他大学との合同練習・試合もあり\n\n## 活動日\n\n毎週水曜・土曜の18:00〜21:00に体育館で練習しています。",
383
  "detailDescription": "# バドミントンサークル B.A.S.S. 詳細情報\n\n## サークル理念\n\n> 「楽しく、健康的に、仲間と一緒に」\n\nバドミントンサークルB.A.S.S.は、このモットーを掲げて活動するスポーツサークルです。\n\n## 活動スタイル\n\n体育会のような厳しい練習はなく、**各自のレベルに合わせて**楽しめます。\n\n### 練習内容\n\n1. ウォーミングアップ\n2. 基礎練習(初心者向け)\n3. ゲーム形式の練習\n4. 自由対戦\n\n## メンバー構成\n\n| レベル | 割合 |\n|--------|------|\n| 初心者 | 50% |\n| 経験者 | 40% |\n| 上級者 | 10% |\n\n## イベント\n\n- **学内大会**: 年2回開催\n- **他大学交流戦**: 近隣大学との親善試合\n- **合宿**: 夏季合宿(任意参加)\n\n```\n練習日程:毎週水曜・土曜\n時間:18:00〜21:00\n場所:総合体育館\n```\n\n### 費用\n\n- 年会費:**5,000円**\n- シャトル代:実費\n\n*ラケットのレンタルあり(初心者向け)*\n\n[Instagram](https://instagram.com/chiba_bass)で練習風景を公開中!",
384
  "memberCount": 40,
385
  "memberNote": null,
@@ -390,46 +355,32 @@
390
  "otherCosts": null,
391
  "annualSchedule": [
392
  {
393
- "month": 4,
394
- "events": [
395
- "新歓"
396
- ]
397
  },
398
  {
399
- "month": 6,
400
- "events": [
401
- "学内大会"
402
- ]
403
  },
404
  {
405
- "month": 8,
406
- "events": [
407
- "夏合宿"
408
- ]
409
  },
410
  {
411
- "month": 9,
412
- "events": [
413
- "他大学交流戦"
414
- ]
415
  },
416
  {
417
- "month": 11,
418
- "events": [
419
- "大祭"
420
- ]
421
  },
422
  {
423
- "month": 12,
424
- "events": [
425
- "忘年会"
426
- ]
427
  },
428
  {
429
- "month": 3,
430
- "events": [
431
- "追いコン"
432
- ]
433
  }
434
  ],
435
  "contactInfo": "bass-badminton@example.chiba-u.jp",
@@ -447,14 +398,21 @@
447
  "order": 1
448
  }
449
  ],
 
 
 
 
 
450
  "sns": [
451
  {
452
  "type": "INSTAGRAM",
453
- "url": "https://instagram.com/chiba_bass"
 
454
  },
455
  {
456
  "type": "LINE",
457
- "url": "https://line.me/chiba_bass"
 
458
  }
459
  ]
460
  },
@@ -462,17 +420,11 @@
462
  "circleId": "circle-006",
463
  "circleName": "プログラミングサークル CODE",
464
  "circleNameKana": "ぷろぐらみんぐさーくる こーど",
465
- "circleType": "準公認",
466
  "projectId": null,
467
  "projectName": null,
468
- "mainCategory": "CULTURE",
469
- "subCategory": "IT_TECH",
470
- "category": "EXHIBITION",
471
  "genre": "ACADEMIC",
472
  "areaCode": "M",
473
  "pamphletNumber": 6,
474
- "prSummary": "Webアプリからゲーム開発まで、プログラミングを楽しむサークルです。",
475
- "description": "# プログラミングサークル CODE\n\n技術を学び、創造力を発揮するサークルです。\n\n## 活動内容\n\n- Webアプリケーション開発\n- ゲーム開発\n- AI・機械学習の研究\n- ハッカソン参加\n\n## 初心者対応\n\nプログラミング未経験でも大丈夫!基礎から丁寧に教えます。",
476
  "detailDescription": "# プログラミングサークル CODE\n\n## ミッション\n\n> 「技術で世界を変える」\n\n私たちCODEは、プログラミングを通じて*創造力*を発揮し、実際に動くプロダクトを作ることを目指しています。\n\n## 活動分野\n\n### Web開発チーム\n\n1. フロントエンド(React, Vue.js)\n2. バックエンド(Python, Node.js)\n3. インフラ(AWS, Docker)\n\n### ゲーム開発チーム\n\n- **Unity**: 3Dゲーム制作\n- **Godot**: 2Dゲーム制作\n- **Unreal Engine**: ハイエンドゲーム\n\n### AI・機械学習チーム\n\n- 画像認識\n- 自然言語処理\n- データ分析\n\n## 技術スタック\n\n| 分野 | 使用技術 |\n|------|----------|\n| 言語 | Python, JavaScript, TypeScript |\n| フレームワーク | React, Django, Flask |\n| データベース | PostgreSQL, MongoDB |\n| インフラ | AWS, GCP, Docker |\n\n## 勉強会・イベント\n\n- 週1回の**もくもく会**\n- 月1回の技術LT大会\n- 外部ハッカソンへの参加\n\n```python\n# CODEへようこそ!\ndef welcome(name):\n print(f'ようこそ、{name}さん!')\n print('一緒にプログラミングを楽しみましょう!')\n\nwelcome('新入生')\n```\n\n### 入会について\n\nプログラミング未経験でも**大歓迎**!基礎から丁寧に教えます。\n\n詳細は[公式サイト](https://example.com/chiba-code)をご覧ください。",
477
  "memberCount": 35,
478
  "memberNote": null,
@@ -483,42 +435,36 @@
483
  "otherCosts": null,
484
  "annualSchedule": [
485
  {
486
- "month": 4,
487
- "events": [
488
- "新歓",
489
- "基礎講座開始"
490
- ]
 
 
 
 
 
491
  },
492
  {
493
- "month": 5,
494
- "events": [
495
- "春季ハッカソン"
496
- ]
497
  },
498
  {
499
- "month": 8,
500
- "events": [
501
- "夏合宿",
502
- "開発合宿"
503
- ]
504
  },
505
  {
506
- "month": 10,
507
- "events": [
508
- "技術カンファレンス参加"
509
- ]
510
  },
511
  {
512
- "month": 11,
513
- "events": [
514
- "大祭展示"
515
- ]
516
  },
517
  {
518
- "month": 3,
519
- "events": [
520
- "成果発表会"
521
- ]
522
  }
523
  ],
524
  "contactInfo": "code@example.chiba-u.jp",
@@ -536,14 +482,21 @@
536
  "order": 1
537
  }
538
  ],
 
 
 
 
 
539
  "sns": [
540
  {
541
  "type": "TWITTER",
542
- "url": "https://twitter.com/chiba_code"
 
543
  },
544
  {
545
  "type": "GITHUB",
546
- "url": "https://github.com/chiba-code"
 
547
  }
548
  ]
549
  },
@@ -551,17 +504,11 @@
551
  "circleId": "circle-007",
552
  "circleName": "茶道部",
553
  "circleNameKana": "さどうぶ",
554
- "circleType": "公認",
555
  "projectId": null,
556
  "projectName": null,
557
- "mainCategory": "CULTURE",
558
- "subCategory": "TRADITIONAL",
559
- "category": "EXHIBITION",
560
  "genre": "CULTURE",
561
  "areaCode": "N",
562
  "pamphletNumber": 7,
563
- "prSummary": "日本の伝統文化「茶道」を学び、心を磨くサークルです。",
564
- "description": "# 茶道部\n\n日本の伝統文化である茶道を学ぶ部活動です。\n\n## 流派\n\n表千家の作法を学びます。\n\n## 活動内容\n\n- 週2回のお稽古\n- 学園祭でのお茶会\n- 外部茶会への参加\n\n初心者の方も歓迎します。",
565
  "detailDescription": "# 茶道部 詳細案内\n\n## 茶道とは\n\n> 「一期一会」\n\n茶道は、単なるお茶を点てる技術ではなく、**おもてなしの心**と**日本の美意識**を学ぶ総合芸術です。\n\n## 活動について\n\n### 流派\n\n*表千家*の作法を、プロの先生から直接学びます。\n\n### 稽古内容\n\n1. 基本の作法(座り方、お辞儀)\n2. お点前の練習\n3. お菓子の知識\n4. 季節の設え\n\n## お稽古スケジュール\n\n| 曜日 | 時間 | 内容 |\n|------|------|------|\n| 火曜 | 16:00-18:00 | 基礎稽古 |\n| 金曜 | 16:00-18:00 | 応用稽古 |\n\n## 年間行事\n\n- **学園祭茶会**: 大祭でのお茶席\n- **初釜**: 新年のお祝い茶会\n- **卒業茶会**: 卒業生を送る会\n\n```\n活動場所:学生会館2階 和室\n持ち物:白い靴下(初回のみ)\nお稽古代:月1,500円(お菓子・お抹茶代含む)\n```\n\n### 入部について\n\n**着物や道具は不要**です。すべてサークルで用意しています。\n\n- 経験不問\n- 男女問わず歓迎\n- 留学生も多数在籍\n\n茶道を通じて、*日本の心*を学んでみませんか?",
566
  "memberCount": 20,
567
  "memberNote": null,
@@ -572,40 +519,28 @@
572
  "otherCosts": null,
573
  "annualSchedule": [
574
  {
575
- "month": 4,
576
- "events": [
577
- "新歓"
578
- ]
579
  },
580
  {
581
- "month": 5,
582
- "events": [
583
- "新入部員お稽古開始"
584
- ]
585
  },
586
  {
587
- "month": 7,
588
- "events": [
589
- "七夕茶会"
590
- ]
591
  },
592
  {
593
- "month": 11,
594
- "events": [
595
- "大祭茶会"
596
- ]
597
  },
598
  {
599
- "month": 1,
600
- "events": [
601
- "初釜"
602
- ]
603
  },
604
  {
605
- "month": 3,
606
- "events": [
607
- "卒業茶会"
608
- ]
609
  }
610
  ],
611
  "contactInfo": "sado@example.chiba-u.jp",
@@ -623,10 +558,16 @@
623
  "order": 1
624
  }
625
  ],
 
 
 
 
 
626
  "sns": [
627
  {
628
  "type": "INSTAGRAM",
629
- "url": "https://instagram.com/chiba_sado"
 
630
  }
631
  ]
632
  },
@@ -634,17 +575,11 @@
634
  "circleId": "circle-008",
635
  "circleName": "国際交流サークル GLOBAL",
636
  "circleNameKana": "こくさいこうりゅうさーくる ぐろーばる",
637
- "circleType": "準公認",
638
  "projectId": null,
639
  "projectName": null,
640
- "mainCategory": "CULTURE",
641
- "subCategory": "SOCIAL",
642
- "category": "EXHIBITION",
643
  "genre": "CULTURE",
644
  "areaCode": "W",
645
  "pamphletNumber": 8,
646
- "prSummary": "留学生と日本人学生が交流するサークル。英語力向上にも!",
647
- "description": "# 国際交流サークル GLOBAL\n\n留学生と日本人学生が一緒に活動するサークルです。\n\n## 活動内容\n\n- 言語交換(Language Exchange)\n- 文化交流イベント\n- 留学生サポート\n- 旅行・アウトドア活動\n\n英語が苦手でも大丈夫!",
648
  "detailDescription": "# 国際交流サークル GLOBAL\n\n## 私たちの目標\n\n> 「国境を越えて、友情を育む」\n\n国際交流サークルGLOBALは、*留学生と日本人学生*が共に学び、交流するサークルです。\n\n## 主な活動\n\n### Language Exchange\n\n1. 週1回の言語交換セッション\n2. 少人数グループでの会話練習\n3. 文法・発音のサポート\n\n### 文化交流イベント\n\n- **料理会**: 各国の料理を作って食べる\n- **文化紹介**: 各国の文化・習慣を紹介\n- **映画上映会**: 外国語映画の鑑賞\n\n## メンバー構成\n\n| 国籍 | 人数 |\n|------|------|\n| 日本 | 25名 |\n| 中国 | 8名 |\n| 韓国 | 5名 |\n| 欧米 | 7名 |\n| その他 | 5名 |\n\n## 年間イベント\n\n- 4月:新歓ウェルカムパーティー\n- 7月:**国際BBQ大会**\n- 10月:大祭ブース出展\n- 12月:クリスマスパーティー\n- 2月:留学生送別会\n\n```\n活動場所:国際交流会館\n活動日:毎週木曜 18:00-20:00\n言語:日本語・英語(その他も歓迎)\n```\n\n### 入会のメリット\n\n- **語学力向上**: ネイティブスピーカーとの会話\n- **異文化理解**: 多様な価値観に触れる\n- **友人作り**: 世界中に友達ができる\n\n*英語が苦手でも大丈夫!* みんなで助け合いながら成長しましょう。\n\n詳細は[Instagram](https://instagram.com/chiba_global)をチェック!",
649
  "memberCount": 50,
650
  "memberNote": null,
@@ -655,46 +590,32 @@
655
  "otherCosts": null,
656
  "annualSchedule": [
657
  {
658
- "month": 4,
659
- "events": [
660
- "新歓パーティー"
661
- ]
662
  },
663
  {
664
- "month": 5,
665
- "events": [
666
- "料理会"
667
- ]
668
  },
669
  {
670
- "month": 7,
671
- "events": [
672
- "国際BBQ"
673
- ]
674
  },
675
  {
676
- "month": 8,
677
- "events": [
678
- "夏旅行"
679
- ]
680
  },
681
  {
682
- "month": 11,
683
- "events": [
684
- "大祭出展"
685
- ]
686
  },
687
  {
688
- "month": 12,
689
- "events": [
690
- "クリスマスパーティー"
691
- ]
692
  },
693
  {
694
- "month": 2,
695
- "events": [
696
- "送別会"
697
- ]
698
  }
699
  ],
700
  "contactInfo": "global@example.chiba-u.jp",
@@ -712,14 +633,21 @@
712
  "order": 1
713
  }
714
  ],
 
 
 
 
 
715
  "sns": [
716
  {
717
  "type": "INSTAGRAM",
718
- "url": "https://instagram.com/chiba_global"
 
719
  },
720
  {
721
  "type": "LINE",
722
- "url": "https://line.me/chiba_global"
 
723
  }
724
  ]
725
  }
 
3
  "circleId": "circle-001",
4
  "circleName": "千葉大学サッカー部",
5
  "circleNameKana": "ちばだいがくさっかーぶ",
 
6
  "projectId": null,
7
  "projectName": null,
 
 
 
8
  "genre": "ATHLETIC_CLUB",
9
  "areaCode": "T",
10
  "pamphletNumber": 1,
 
 
11
  "detailDescription": "# 千葉大学サッカー部について\n\n## 概要\n\n関東大学サッカーリーグ**1部**所属。創部以来、多くの*プロサッカー選手*を輩出してきた伝統あるチームです。\n\n## 活動頻度と内容\n\n週5日の厳しい練習を通じて、以下のスキルを鍛えています:\n\n1. 技術力の向上\n2. 体力・持久力の強化\n3. 精神力・メンタルの鍛錬\n\n> 「サッカーは11人でするスポーツ。チームワークがすべての基盤だ」- 監督談\n\n## 年間スケジュール\n\n| 時期 | イベント |\n|------|----------|\n| 4月 | 新歓・春季リーグ開幕 |\n| 8月 | 夏合宿 |\n| 11月 | 大祭・秋季リーグ |\n| 3月 | 追いコン |\n\n## 入部条件\n\n- サッカー経験者優遇\n- 初心者も相談可\n- **マネージャー募集中**\n\n詳細は[公式サイト](https://example.com/chiba-soccer)をご覧ください。\n\n```\n練習日程:月・火・水・木・土\n場所:総合グラウンド\n```",
12
  "memberCount": 50,
13
  "memberNote": null,
 
18
  "otherCosts": null,
19
  "annualSchedule": [
20
  {
21
+ "period": "4月",
22
+ "event": "新歓"
 
 
 
23
  },
24
  {
25
+ "period": "4月",
26
+ "event": "春季リーグ開幕"
 
 
27
  },
28
  {
29
+ "period": "5月",
30
+ "event": "リーグ戦"
 
 
31
  },
32
  {
33
+ "period": "8月",
34
+ "event": "夏合宿"
 
 
 
35
  },
36
  {
37
+ "period": "11月",
38
+ "event": "大祭"
 
 
39
  },
40
  {
41
+ "period": "11月",
42
+ "event": "秋季リーグ"
43
+ },
44
+ {
45
+ "period": "12月",
46
+ "event": "冬合宿"
47
+ },
48
+ {
49
+ "period": "3月",
50
+ "event": "追いコン"
51
  }
52
  ],
53
  "contactInfo": "soccer@example.chiba-u.jp",
 
70
  "order": 2
71
  }
72
  ],
73
+ "mainImage": {
74
+ "url": "https://placehold.co/800x600?text=Soccer1",
75
+ "alt": "サッカー部練習風景",
76
+ "order": 0
77
+ },
78
  "sns": [
79
  {
80
  "type": "TWITTER",
81
+ "url": "https://twitter.com/chiba_soccer",
82
+ "handle": null
83
  },
84
  {
85
  "type": "INSTAGRAM",
86
+ "url": "https://instagram.com/chiba_soccer",
87
+ "handle": null
88
  }
89
  ]
90
  },
 
92
  "circleId": "circle-002",
93
  "circleName": "千葉大学吹奏楽団",
94
  "circleNameKana": "ちばだいがくすいそうがくだん",
 
95
  "projectId": null,
96
  "projectName": null,
 
 
 
97
  "genre": "MUSIC",
98
  "areaCode": "L",
99
  "pamphletNumber": 2,
 
 
100
  "detailDescription": "# 千葉大学吹奏楽団 詳細案内\n\n## 歴史と伝統\n\n千葉大学吹奏楽団は**1950年代**に創設された伝統ある音楽団体です。\n\n> 70年以上の歴史の中で、数々の名演奏を生み出してきました\n\n## 演奏会情報\n\n年間を通じて精力的に活動し、定期演奏会では毎回*1000人以上*の観客を動員しています。\n\n### 主な演奏会\n\n1. 春の定期演奏会(6月)\n2. 学園祭ステージ(10月)\n3. クリスマスコンサート(12月)\n4. 卒業演奏会(3月)\n\n## コンクール実績\n\n| 年度 | 大会名 | 結果 |\n|------|--------|------|\n| 2024 | 関東大会 | 金賞 |\n| 2023 | 全国大会 | 銀賞 |\n| 2022 | 関東大会 | 金賞 |\n\n## 楽器パート紹介\n\n- **木管楽器**: フルート、クラリネット、オーボエ等\n- **金管楽器**: トランペット、トロンボーン、ホルン等\n- **打楽器**: ティンパニ、パーカッション等\n\n```\n入部問い合わせ先:brass@example.chiba-u.jp\n見学随時受付中!\n```\n\n詳細は[公式サイト](https://example.com/chiba-brass)へ",
101
  "memberCount": 60,
102
  "memberNote": null,
 
107
  "otherCosts": null,
108
  "annualSchedule": [
109
  {
110
+ "period": "4月",
111
+ "event": "新歓"
112
+ },
113
+ {
114
+ "period": "4月",
115
+ "event": "新入生歓迎演奏会"
116
+ },
117
+ {
118
+ "period": "6月",
119
+ "event": "定期演奏会"
120
  },
121
  {
122
+ "period": "8月",
123
+ "event": "夏合宿"
 
 
124
  },
125
  {
126
+ "period": "8月",
127
+ "event": "コンクール"
 
 
 
128
  },
129
  {
130
+ "period": "10月",
131
+ "event": "学園祭演奏"
 
 
132
  },
133
  {
134
+ "period": "12月",
135
+ "event": "クリスマスコンサート"
 
 
136
  },
137
  {
138
+ "period": "3月",
139
+ "event": "追いコン"
140
+ },
141
+ {
142
+ "period": "3月",
143
+ "event": "卒業演奏会"
144
  }
145
  ],
146
  "contactInfo": "brass@example.chiba-u.jp",
 
163
  "order": 2
164
  }
165
  ],
166
+ "mainImage": {
167
+ "url": "https://placehold.co/800x600?text=Brass1",
168
+ "alt": "演奏会の様子",
169
+ "order": 0
170
+ },
171
  "sns": [
172
  {
173
  "type": "TWITTER",
174
+ "url": "https://twitter.com/chiba_brass",
175
+ "handle": null
176
  },
177
  {
178
  "type": "LINE",
179
+ "url": "https://line.me/chiba_brass",
180
+ "handle": null
181
  }
182
  ]
183
  },
 
185
  "circleId": "circle-003",
186
  "circleName": "軽音楽サークル SOUNDWAVE",
187
  "circleNameKana": "けいおんがくさーくる さうんどうぇーぶ",
 
188
  "projectId": null,
189
  "projectName": null,
 
 
 
190
  "genre": "MUSIC",
191
  "areaCode": "K",
192
  "pamphletNumber": 3,
 
 
193
  "detailDescription": "# 軽音楽サークル SOUNDWAVE\n\n## コンセプト\n\n> 「音楽を愛するすべての人に、表現の場を」\n\n軽音楽サークルSOUNDWAVEは、音楽を愛するメンバーが集まり、*自由に*音楽活動を楽しむサークルです。\n\n## ジャンルの多様性\n\nジャンルの垣根なく、やりたい音楽を追求できる環境があります:\n\n- **ロック**: J-ROCKから洋楽まで\n- **ポップス**: 最新ヒット曲のコピーバンド\n- **ジャズ**: スタンダードナンバーのセッション\n- **アニソン**: アニメソングカバー\n\n## バンド結成の流れ\n\n1. 新歓期にメンバー募集\n2. ジャンル・趣味の合う人と出会う\n3. バンドを結成\n4. 練習を重ねる\n5. ライブで発表!\n\n## 初心者向けサポート\n\n| サポート内容 | 詳細 |\n|--------------|------|\n| 楽器レンタル | ギター、ベース、キーボード |\n| レッスン | 先輩による個別指導 |\n| 教材 | 初心者向け楽譜・動画 |\n\n```\n練習スタジオ:音楽棟地下1階\n利用時間:9:00〜21:00\n予約方法:LINE公式アカウントから\n```\n\n### 入部費用\n\n年会費**6,000円**(スタジオ利用料込み)\n\n[Twitter](https://twitter.com/chiba_keion)で活動情報を発信中!",
194
  "memberCount": 30,
195
  "memberNote": null,
 
200
  "otherCosts": null,
201
  "annualSchedule": [
202
  {
203
+ "period": "4月",
204
+ "event": "新歓ライブ"
 
 
205
  },
206
  {
207
+ "period": "5月",
208
+ "event": "春の定期ライブ"
 
 
209
  },
210
  {
211
+ "period": "7月",
212
+ "event": "七夕ライブ"
 
 
213
  },
214
  {
215
+ "period": "8月",
216
+ "event": "夏合宿"
 
 
217
  },
218
  {
219
+ "period": "11月",
220
+ "event": "大祭ステージ"
 
 
221
  },
222
  {
223
+ "period": "12月",
224
+ "event": "クリスマスライブ"
 
 
225
  },
226
  {
227
+ "period": "3月",
228
+ "event": "追いコン"
 
 
229
  }
230
  ],
231
  "contactInfo": "keion@example.chiba-u.jp",
 
243
  "order": 1
244
  }
245
  ],
246
+ "mainImage": {
247
+ "url": "https://placehold.co/800x600?text=Keion1",
248
+ "alt": "ライブ演奏",
249
+ "order": 0
250
+ },
251
  "sns": [
252
  {
253
  "type": "TWITTER",
254
+ "url": "https://twitter.com/chiba_keion",
255
+ "handle": null
256
  },
257
  {
258
  "type": "INSTAGRAM",
259
+ "url": "https://instagram.com/chiba_keion",
260
+ "handle": null
261
  }
262
  ]
263
  },
 
265
  "circleId": "circle-004",
266
  "circleName": "アニメーション研究会",
267
  "circleNameKana": "あにめーしょんけんきゅうかい",
 
268
  "projectId": null,
269
  "projectName": null,
 
 
 
270
  "genre": "CULTURE",
271
  "areaCode": "S",
272
  "pamphletNumber": 4,
 
 
273
  "detailDescription": "# アニメーション研究会 詳細ガイド\n\n## 私たちについて\n\nアニメーション研究会は、アニメ好きが集まり、**観る**だけでなく**作る**ことにも挑戦するサークルです。\n\n> 「見る側から、作る側へ」\n\n## 活動内容詳細\n\n### 制作部門\n\nデジタルツールを使った本格的なアニメーション制作:\n\n1. 企画・シナリオ作成\n2. キャラクターデザイン\n3. 作画・動画制作\n4. 編集・仕上げ\n\n### イラスト・漫画部門\n\n- *同人誌*制作\n- イラスト集発行\n- Web漫画連載\n\n## 使用ソフトウェア\n\n| ソフト | 用途 |\n|--------|------|\n| CLIP STUDIO | イラスト・漫画 |\n| After Effects | 動画編集 |\n| Blender | 3DCG |\n\n## イベント参加実績\n\n- **コミックマーケット**: 毎年夏・冬参加\n- **大学祭**: 上映会・展示\n- **学内イベント**: 定期上映会\n\n```\nサークル室:学生会館3階302号室\n開放時間:平日16:00〜20:00\n```\n\n### 入会について\n\n技術的なスキルがなくても、*やる気があれば大歓迎*です!\n\n詳細は[公式サイト](https://example.com/chiba-anime)をご覧ください。",
274
  "memberCount": 25,
275
  "memberNote": null,
 
280
  "otherCosts": null,
281
  "annualSchedule": [
282
  {
283
+ "period": "4月",
284
+ "event": "新歓"
285
+ },
286
+ {
287
+ "period": "5月",
288
+ "event": "春の上映会"
289
  },
290
  {
291
+ "period": "8月",
292
+ "event": "コミケ参加"
 
 
293
  },
294
  {
295
+ "period": "8月",
296
+ "event": "夏合宿"
 
 
 
297
  },
298
  {
299
+ "period": "11月",
300
+ "event": "大祭展示・上映"
 
 
301
  },
302
  {
303
+ "period": "2月",
304
+ "event": "冬の上映会"
 
 
305
  },
306
  {
307
+ "period": "3月",
308
+ "event": "追いコン"
 
 
309
  }
310
  ],
311
  "contactInfo": "anime@example.chiba-u.jp",
 
323
  "order": 1
324
  }
325
  ],
326
+ "mainImage": {
327
+ "url": "https://placehold.co/800x600?text=Anime1",
328
+ "alt": "制作風景",
329
+ "order": 0
330
+ },
331
  "sns": [
332
  {
333
  "type": "TWITTER",
334
+ "url": "https://twitter.com/chiba_anime",
335
+ "handle": null
336
  }
337
  ]
338
  },
 
340
  "circleId": "circle-005",
341
  "circleName": "バドミントンサークル B.A.S.S.",
342
  "circleNameKana": "ばどみんとんさーくる ばす",
 
343
  "projectId": null,
344
  "projectName": null,
 
 
 
345
  "genre": "SPORTS",
346
  "areaCode": "G",
347
  "pamphletNumber": 5,
 
 
348
  "detailDescription": "# バドミントンサークル B.A.S.S. 詳細情報\n\n## サークル理念\n\n> 「楽しく、健康的に、仲間と一緒に」\n\nバドミントンサークルB.A.S.S.は、このモットーを掲げて活動するスポーツサークルです。\n\n## 活動スタイル\n\n体育会のような厳しい練習はなく、**各自のレベルに合わせて**楽しめます。\n\n### 練習内容\n\n1. ウォーミングアップ\n2. 基礎練習(初心者向け)\n3. ゲーム形式の練習\n4. 自由対戦\n\n## メンバー構成\n\n| レベル | 割合 |\n|--------|------|\n| 初心者 | 50% |\n| 経験者 | 40% |\n| 上級者 | 10% |\n\n## イベント\n\n- **学内大会**: 年2回開催\n- **他大学交流戦**: 近隣大学との親善試合\n- **合宿**: 夏季合宿(任意参加)\n\n```\n練習日程:毎週水曜・土曜\n時間:18:00〜21:00\n場所:総合体育館\n```\n\n### 費用\n\n- 年会費:**5,000円**\n- シャトル代:実費\n\n*ラケットのレンタルあり(初心者向け)*\n\n[Instagram](https://instagram.com/chiba_bass)で練習風景を公開中!",
349
  "memberCount": 40,
350
  "memberNote": null,
 
355
  "otherCosts": null,
356
  "annualSchedule": [
357
  {
358
+ "period": "4月",
359
+ "event": "新歓"
 
 
360
  },
361
  {
362
+ "period": "6月",
363
+ "event": "学内大会"
 
 
364
  },
365
  {
366
+ "period": "8月",
367
+ "event": "夏合宿"
 
 
368
  },
369
  {
370
+ "period": "9月",
371
+ "event": "他大学交流戦"
 
 
372
  },
373
  {
374
+ "period": "11月",
375
+ "event": "大祭"
 
 
376
  },
377
  {
378
+ "period": "12月",
379
+ "event": "忘年会"
 
 
380
  },
381
  {
382
+ "period": "3月",
383
+ "event": "追いコン"
 
 
384
  }
385
  ],
386
  "contactInfo": "bass-badminton@example.chiba-u.jp",
 
398
  "order": 1
399
  }
400
  ],
401
+ "mainImage": {
402
+ "url": "https://placehold.co/800x600?text=Badminton1",
403
+ "alt": "練習風景",
404
+ "order": 0
405
+ },
406
  "sns": [
407
  {
408
  "type": "INSTAGRAM",
409
+ "url": "https://instagram.com/chiba_bass",
410
+ "handle": null
411
  },
412
  {
413
  "type": "LINE",
414
+ "url": "https://line.me/chiba_bass",
415
+ "handle": null
416
  }
417
  ]
418
  },
 
420
  "circleId": "circle-006",
421
  "circleName": "プログラミングサークル CODE",
422
  "circleNameKana": "ぷろぐらみんぐさーくる こーど",
 
423
  "projectId": null,
424
  "projectName": null,
 
 
 
425
  "genre": "ACADEMIC",
426
  "areaCode": "M",
427
  "pamphletNumber": 6,
 
 
428
  "detailDescription": "# プログラミングサークル CODE\n\n## ミッション\n\n> 「技術で世界を変える」\n\n私たちCODEは、プログラミングを通じて*創造力*を発揮し、実際に動くプロダクトを作ることを目指しています。\n\n## 活動分野\n\n### Web開発チーム\n\n1. フロントエンド(React, Vue.js)\n2. バックエンド(Python, Node.js)\n3. インフラ(AWS, Docker)\n\n### ゲーム開発チーム\n\n- **Unity**: 3Dゲーム制作\n- **Godot**: 2Dゲーム制作\n- **Unreal Engine**: ハイエンドゲーム\n\n### AI・機械学習チーム\n\n- 画像認識\n- 自然言語処理\n- データ分析\n\n## 技術スタック\n\n| 分野 | 使用技術 |\n|------|----------|\n| 言語 | Python, JavaScript, TypeScript |\n| フレームワーク | React, Django, Flask |\n| データベース | PostgreSQL, MongoDB |\n| インフラ | AWS, GCP, Docker |\n\n## 勉強会・イベント\n\n- 週1回の**もくもく会**\n- 月1回の技術LT大会\n- 外部ハッカソンへの参加\n\n```python\n# CODEへようこそ!\ndef welcome(name):\n print(f'ようこそ、{name}さん!')\n print('一緒にプログラミングを楽しみましょう!')\n\nwelcome('新入生')\n```\n\n### 入会について\n\nプログラミング未経験でも**大歓迎**!基礎から丁寧に教えます。\n\n詳細は[公式サイト](https://example.com/chiba-code)をご覧ください。",
429
  "memberCount": 35,
430
  "memberNote": null,
 
435
  "otherCosts": null,
436
  "annualSchedule": [
437
  {
438
+ "period": "4月",
439
+ "event": "新歓"
440
+ },
441
+ {
442
+ "period": "4月",
443
+ "event": "基礎講座開始"
444
+ },
445
+ {
446
+ "period": "5月",
447
+ "event": "春季ハッカソン"
448
  },
449
  {
450
+ "period": "8月",
451
+ "event": "夏合宿"
 
 
452
  },
453
  {
454
+ "period": "8月",
455
+ "event": "開発合宿"
 
 
 
456
  },
457
  {
458
+ "period": "10月",
459
+ "event": "技術カンファレンス参加"
 
 
460
  },
461
  {
462
+ "period": "11月",
463
+ "event": "大祭展示"
 
 
464
  },
465
  {
466
+ "period": "3月",
467
+ "event": "成果発表会"
 
 
468
  }
469
  ],
470
  "contactInfo": "code@example.chiba-u.jp",
 
482
  "order": 1
483
  }
484
  ],
485
+ "mainImage": {
486
+ "url": "https://placehold.co/800x600?text=Code1",
487
+ "alt": "ハッカソンの様子",
488
+ "order": 0
489
+ },
490
  "sns": [
491
  {
492
  "type": "TWITTER",
493
+ "url": "https://twitter.com/chiba_code",
494
+ "handle": null
495
  },
496
  {
497
  "type": "GITHUB",
498
+ "url": "https://github.com/chiba-code",
499
+ "handle": null
500
  }
501
  ]
502
  },
 
504
  "circleId": "circle-007",
505
  "circleName": "茶道部",
506
  "circleNameKana": "さどうぶ",
 
507
  "projectId": null,
508
  "projectName": null,
 
 
 
509
  "genre": "CULTURE",
510
  "areaCode": "N",
511
  "pamphletNumber": 7,
 
 
512
  "detailDescription": "# 茶道部 詳細案内\n\n## 茶道とは\n\n> 「一期一会」\n\n茶道は、単なるお茶を点てる技術ではなく、**おもてなしの心**と**日本の美意識**を学ぶ総合芸術です。\n\n## 活動について\n\n### 流派\n\n*表千家*の作法を、プロの先生から直接学びます。\n\n### 稽古内容\n\n1. 基本の作法(座り方、お辞儀)\n2. お点前の練習\n3. お菓子の知識\n4. 季節の設え\n\n## お稽古スケジュール\n\n| 曜日 | 時間 | 内容 |\n|------|------|------|\n| 火曜 | 16:00-18:00 | 基礎稽古 |\n| 金曜 | 16:00-18:00 | 応用稽古 |\n\n## 年間行事\n\n- **学園祭茶会**: 大祭でのお茶席\n- **初釜**: 新年のお祝い茶会\n- **卒業茶会**: 卒業生を送る会\n\n```\n活動場所:学生会館2階 和室\n持ち物:白い靴下(初回のみ)\nお稽古代:月1,500円(お菓子・お抹茶代含む)\n```\n\n### 入部について\n\n**着物や道具は不要**です。すべてサークルで用意しています。\n\n- 経験不問\n- 男女問わず歓迎\n- 留学生も多数在籍\n\n茶道を通じて、*日本の心*を学んでみませんか?",
513
  "memberCount": 20,
514
  "memberNote": null,
 
519
  "otherCosts": null,
520
  "annualSchedule": [
521
  {
522
+ "period": "4月",
523
+ "event": "新歓"
 
 
524
  },
525
  {
526
+ "period": "5月",
527
+ "event": "新入部員お稽古開始"
 
 
528
  },
529
  {
530
+ "period": "7月",
531
+ "event": "七夕茶会"
 
 
532
  },
533
  {
534
+ "period": "11月",
535
+ "event": "大祭茶会"
 
 
536
  },
537
  {
538
+ "period": "1月",
539
+ "event": "初釜"
 
 
540
  },
541
  {
542
+ "period": "3月",
543
+ "event": "卒業茶会"
 
 
544
  }
545
  ],
546
  "contactInfo": "sado@example.chiba-u.jp",
 
558
  "order": 1
559
  }
560
  ],
561
+ "mainImage": {
562
+ "url": "https://placehold.co/800x600?text=Sado1",
563
+ "alt": "お稽古風景",
564
+ "order": 0
565
+ },
566
  "sns": [
567
  {
568
  "type": "INSTAGRAM",
569
+ "url": "https://instagram.com/chiba_sado",
570
+ "handle": null
571
  }
572
  ]
573
  },
 
575
  "circleId": "circle-008",
576
  "circleName": "国際交流サークル GLOBAL",
577
  "circleNameKana": "こくさいこうりゅうさーくる ぐろーばる",
 
578
  "projectId": null,
579
  "projectName": null,
 
 
 
580
  "genre": "CULTURE",
581
  "areaCode": "W",
582
  "pamphletNumber": 8,
 
 
583
  "detailDescription": "# 国際交流サークル GLOBAL\n\n## 私たちの目標\n\n> 「国境を越えて、友情を育む」\n\n国際交流サークルGLOBALは、*留学生と日本人学生*が共に学び、交流するサークルです。\n\n## 主な活動\n\n### Language Exchange\n\n1. 週1回の言語交換セッション\n2. 少人数グループでの会話練習\n3. 文法・発音のサポート\n\n### 文化交流イベント\n\n- **料理会**: 各国の料理を作って食べる\n- **文化紹介**: 各国の文化・習慣を紹介\n- **映画上映会**: 外国語映画の鑑賞\n\n## メンバー構成\n\n| 国籍 | 人数 |\n|------|------|\n| 日本 | 25名 |\n| 中国 | 8名 |\n| 韓国 | 5名 |\n| 欧米 | 7名 |\n| その他 | 5名 |\n\n## 年間イベント\n\n- 4月:新歓ウェルカムパーティー\n- 7月:**国際BBQ大会**\n- 10月:大祭ブース出展\n- 12月:クリスマスパーティー\n- 2月:留学生送別会\n\n```\n活動場所:国際交流会館\n活動日:毎週木曜 18:00-20:00\n言語:日本語・英語(その他も歓迎)\n```\n\n### 入会のメリット\n\n- **語学力向上**: ネイティブスピーカーとの会話\n- **異文化理解**: 多様な価値観に触れる\n- **友人作り**: 世界中に友達ができる\n\n*英語が苦手でも大丈夫!* みんなで助け合いながら成長しましょう。\n\n詳細は[Instagram](https://instagram.com/chiba_global)をチェック!",
584
  "memberCount": 50,
585
  "memberNote": null,
 
590
  "otherCosts": null,
591
  "annualSchedule": [
592
  {
593
+ "period": "4月",
594
+ "event": "新歓パーティー"
 
 
595
  },
596
  {
597
+ "period": "5月",
598
+ "event": "料理会"
 
 
599
  },
600
  {
601
+ "period": "7月",
602
+ "event": "国際BBQ"
 
 
603
  },
604
  {
605
+ "period": "8月",
606
+ "event": "夏旅行"
 
 
607
  },
608
  {
609
+ "period": "11月",
610
+ "event": "大祭出展"
 
 
611
  },
612
  {
613
+ "period": "12月",
614
+ "event": "クリスマスパーティー"
 
 
615
  },
616
  {
617
+ "period": "2月",
618
+ "event": "送別会"
 
 
619
  }
620
  ],
621
  "contactInfo": "global@example.chiba-u.jp",
 
633
  "order": 1
634
  }
635
  ],
636
+ "mainImage": {
637
+ "url": "https://placehold.co/800x600?text=Global1",
638
+ "alt": "交流イベント",
639
+ "order": 0
640
+ },
641
  "sns": [
642
  {
643
  "type": "INSTAGRAM",
644
+ "url": "https://instagram.com/chiba_global",
645
+ "handle": null
646
  },
647
  {
648
  "type": "LINE",
649
+ "url": "https://line.me/chiba_global",
650
+ "handle": null
651
  }
652
  ]
653
  }
schemas/circles.py CHANGED
@@ -1,5 +1,4 @@
1
  from enum import Enum
2
- from typing import Literal
3
  from pydantic import BaseModel
4
 
5
 
@@ -23,12 +22,13 @@ class Sns(BaseModel):
23
  """SNS情報"""
24
  type: str
25
  url: str
 
26
 
27
 
28
  class AnnualScheduleItem(BaseModel):
29
  """年間予定の項目"""
30
- month: int
31
- events: list[str]
32
 
33
 
34
  class Circle(BaseModel):
@@ -36,41 +36,29 @@ class Circle(BaseModel):
36
  circleId: str
37
  circleName: str
38
  circleNameKana: str
39
- circleType: Literal["公認", "準公認"]
40
 
41
  # 企画関連(大祭企画との紐付け用、オプション)
42
  projectId: str | None = None
43
  projectName: str | None = None
44
 
45
- # カテゴリ情報
46
- mainCategory: str
47
- subCategory: str | None = None
48
- category: str | None = None # 大祭用カテゴリ
49
  genre: str | None = None # ジャンル: ATHLETIC_CLUB, SPORTS, CULTURE, MUSIC, OTHER
50
 
51
  # 場所情報
52
  areaCode: str | None = None
53
- areaNumber: str | None = None
54
  pamphletNumber: int | None = None
55
 
56
- # 概要情報
57
- prSummary: str | None = None
58
- description: str | None = None
59
  detailDescription: str | None = None
60
- message: str | None = None
61
 
62
  # 画像・SNS
63
  images: list[Image] = []
 
64
  sns: list[Sns] = []
65
 
66
  # メンバー情報
67
  memberCount: int | None = None
68
  memberNote: str | None = None # メンバー数に関する備考
69
- genderRatioMale: float | None = None
70
- genderRatioFemale: float | None = None
71
-
72
- # 設立情報
73
- establishedYear: int | None = None
74
 
75
  # 金銭情報
76
  annualFee: int | None = None
@@ -79,7 +67,6 @@ class Circle(BaseModel):
79
  # 活動情報
80
  activityFrequency: str | None = None
81
  activityFrequencyNote: str | None = None # 活動頻度に関する自由記述
82
- activityTimeSlot: str | None = None
83
  activityLocation: str | None = None # 活動場所
84
  annualSchedule: list[AnnualScheduleItem] | None = None # 年間予定
85
 
@@ -87,9 +74,6 @@ class Circle(BaseModel):
87
  contactInfo: str | None = None # 連絡先(メールアドレス等)
88
  websiteUrl: str | None = None # 公式サイトURL
89
 
90
- # 新歓情報
91
- hasTrialEvent: bool = False
92
-
93
  # アーカイブ
94
  isArchived: bool = False
95
 
@@ -99,17 +83,12 @@ class CircleSummary(BaseModel):
99
  circleId: str
100
  circleName: str
101
  circleNameKana: str
102
- circleType: Literal["公認", "準公認"]
103
  projectId: str | None = None
104
  projectName: str | None = None
105
- mainCategory: str
106
- subCategory: str | None = None
107
- category: str | None = None
108
  genre: str | None = None # ジャンル
109
  areaCode: str | None = None
110
  pamphletNumber: int | None = None
111
- prSummary: str | None = None
112
- description: str | None = None
113
  mainImage: Image | None = None
114
  memberCount: int | None = None
115
  memberNote: str | None = None # メンバー数に関する備考
@@ -126,18 +105,12 @@ class CircleDetail(BaseModel):
126
  circleId: str
127
  circleName: str
128
  circleNameKana: str
129
- circleType: Literal["公認", "準公認"]
130
  projectId: str | None = None
131
  projectName: str | None = None
132
- mainCategory: str
133
- subCategory: str | None = None
134
- category: str | None = None
135
  genre: str | None = None # ジャンル
136
- prSummary: str | None = None
137
- description: str | None = None
138
  detailDescription: str | None = None
139
- message: str | None = None
140
  images: list[Image] = []
 
141
  sns: list[Sns] = []
142
  memberCount: int | None = None
143
  memberNote: str | None = None # メンバー数に関する備考
 
1
  from enum import Enum
 
2
  from pydantic import BaseModel
3
 
4
 
 
22
  """SNS情報"""
23
  type: str
24
  url: str
25
+ handle: str | None = None
26
 
27
 
28
  class AnnualScheduleItem(BaseModel):
29
  """年間予定の項目"""
30
+ period: str # 時期(自由記述: 「4月」「春」「4月・5月」等)
31
+ event: str # 行事名
32
 
33
 
34
  class Circle(BaseModel):
 
36
  circleId: str
37
  circleName: str
38
  circleNameKana: str
 
39
 
40
  # 企画関連(大祭企画との紐付け用、オプション)
41
  projectId: str | None = None
42
  projectName: str | None = None
43
 
44
+ # ジャンル
 
 
 
45
  genre: str | None = None # ジャンル: ATHLETIC_CLUB, SPORTS, CULTURE, MUSIC, OTHER
46
 
47
  # 場所情報
48
  areaCode: str | None = None
 
49
  pamphletNumber: int | None = None
50
 
51
+ # 詳細説明
 
 
52
  detailDescription: str | None = None
 
53
 
54
  # 画像・SNS
55
  images: list[Image] = []
56
+ mainImage: Image | None = None
57
  sns: list[Sns] = []
58
 
59
  # メンバー情報
60
  memberCount: int | None = None
61
  memberNote: str | None = None # メンバー数に関する備考
 
 
 
 
 
62
 
63
  # 金銭情報
64
  annualFee: int | None = None
 
67
  # 活動情報
68
  activityFrequency: str | None = None
69
  activityFrequencyNote: str | None = None # 活動頻度に関する自由記述
 
70
  activityLocation: str | None = None # 活動場所
71
  annualSchedule: list[AnnualScheduleItem] | None = None # 年間予定
72
 
 
74
  contactInfo: str | None = None # 連絡先(メールアドレス等)
75
  websiteUrl: str | None = None # 公式サイトURL
76
 
 
 
 
77
  # アーカイブ
78
  isArchived: bool = False
79
 
 
83
  circleId: str
84
  circleName: str
85
  circleNameKana: str
 
86
  projectId: str | None = None
87
  projectName: str | None = None
 
 
 
88
  genre: str | None = None # ジャンル
89
  areaCode: str | None = None
90
  pamphletNumber: int | None = None
91
+ detailDescription: str | None = None
 
92
  mainImage: Image | None = None
93
  memberCount: int | None = None
94
  memberNote: str | None = None # メンバー数に関する備考
 
105
  circleId: str
106
  circleName: str
107
  circleNameKana: str
 
108
  projectId: str | None = None
109
  projectName: str | None = None
 
 
 
110
  genre: str | None = None # ジャンル
 
 
111
  detailDescription: str | None = None
 
112
  images: list[Image] = []
113
+ mainImage: Image | None = None
114
  sns: list[Sns] = []
115
  memberCount: int | None = None
116
  memberNote: str | None = None # メンバー数に関する備考
scripts/2_create_circles_data.py CHANGED
@@ -50,23 +50,30 @@ def parse_json(value: str) -> list | dict | None:
50
  return []
51
 
52
 
53
- # 旧activityFrequencyから新activityFrequencyへのマッピング
54
- ACTIVITY_FREQUENCY_MAP = {
55
- "DAILY": "WEEKLY_5_PLUS",
56
- "WEEKLY_3_4": "WEEKLY_3_4",
57
- "WEEKLY_1_2": "WEEKLY_1_2",
58
- "MONTHLY_1_2": "MONTHLY_1_3",
59
- "IRREGULAR": "LESS_THAN_MONTHLY",
60
- }
61
-
62
-
63
- def convert_activity_frequency(value: str | None) -> str | None:
64
- """旧activityFrequency値を新値に変換"""
65
- if not value or value.strip() == "":
66
  return None
67
- value = value.strip()
68
- # 旧値であればマッピング、そうでなければそのまま返す
69
- return ACTIVITY_FREQUENCY_MAP.get(value, value)
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
 
72
  def main():
@@ -94,37 +101,46 @@ def main():
94
  images_data = parse_json(row.get("images", ""))
95
  images = images_data if images_data else []
96
 
97
- # SNSデータパース
 
 
 
 
 
 
 
 
 
 
 
 
98
  sns_data = parse_json(row.get("sns", ""))
99
- sns = sns_data if sns_data else []
100
-
101
- # 年間予定のパース
 
 
 
 
 
 
 
102
  annual_schedule_data = parse_json(row.get("annualSchedule", ""))
103
- annual_schedule = annual_schedule_data if annual_schedule_data else None
104
-
105
- # isOfficialからcircleTypeへの変換(公認/準公認のみ)
106
- is_official = parse_bool(row.get("isOfficial", "true"))
107
- circle_type = "公認" if is_official else "準公認"
108
 
109
  circle = {
110
  "circleId": row.get("circleId", ""),
111
  "circleName": row.get("circleName", ""),
112
  "circleNameKana": row.get("circleNameKana", ""),
113
- "circleType": circle_type,
114
  "projectId": row.get("projectId") or None,
115
  "projectName": row.get("projectName") or None,
116
- "mainCategory": row.get("mainCategory", ""),
117
- "subCategory": row.get("subCategory") or None,
118
- "category": row.get("category") or None,
119
  "genre": row.get("genre") or None,
120
  "areaCode": row.get("areaCode") or None,
121
  "pamphletNumber": parse_int(row.get("pamphletNumber", "")),
122
- "prSummary": row.get("prSummary") or None,
123
- "description": row.get("description") or None,
124
  "detailDescription": row.get("detailDescription") or None,
125
  "memberCount": parse_int(row.get("memberCount", "")),
126
  "memberNote": row.get("memberNote") or None,
127
- "activityFrequency": convert_activity_frequency(row.get("activityFrequency")),
128
  "activityFrequencyNote": row.get("activityFrequencyNote") or None,
129
  "activityLocation": row.get("activityLocation") or None,
130
  "annualFee": parse_int(row.get("annualFee", "")),
@@ -134,6 +150,7 @@ def main():
134
  "websiteUrl": row.get("websiteUrl") or None,
135
  "isArchived": parse_bool(row.get("isArchived", "false")),
136
  "images": images,
 
137
  "sns": sns,
138
  }
139
  circles.append(circle)
 
50
  return []
51
 
52
 
53
+ def convert_annual_schedule(old_schedule: list | None) -> list | None:
54
+ """
55
+ 旧形式の年間予定を新形式に変換する。
56
+
57
+ 旧形式: [{"month": 4, "events": ["新歓", "春季リーグ開幕"]}, ...]
58
+ 新形式: [{"period": "4月", "event": "新歓"}, {"period": "4月", "event": "春季リーグ開幕"}, ...]
59
+ """
60
+ if not old_schedule:
 
 
 
 
 
61
  return None
62
+
63
+ new_schedule = []
64
+ for item in old_schedule:
65
+ # 旧形式(month + events)の場合
66
+ if "month" in item and "events" in item:
67
+ month = item["month"]
68
+ events = item["events"]
69
+ period = f"{month}月"
70
+ for event in events:
71
+ new_schedule.append({"period": period, "event": event})
72
+ # 新形式(period + event)の場合はそのまま
73
+ elif "period" in item and "event" in item:
74
+ new_schedule.append(item)
75
+
76
+ return new_schedule if new_schedule else None
77
 
78
 
79
  def main():
 
101
  images_data = parse_json(row.get("images", ""))
102
  images = images_data if images_data else []
103
 
104
+ # mainImage 決定: images配列の最初の画像(order=0)を使用
105
+ main_image = None
106
+ if images:
107
+ # order=0 の画像を探す
108
+ for img in images:
109
+ if img.get("order", 0) == 0:
110
+ main_image = img
111
+ break
112
+ # order=0 がなければ最初の画像を使用
113
+ if main_image is None:
114
+ main_image = images[0]
115
+
116
+ # SNSデータのパース(handleフィールドを含む)
117
  sns_data = parse_json(row.get("sns", ""))
118
+ sns = []
119
+ if sns_data:
120
+ for sns_item in sns_data:
121
+ sns.append({
122
+ "type": sns_item.get("type", ""),
123
+ "url": sns_item.get("url", ""),
124
+ "handle": sns_item.get("handle")
125
+ })
126
+
127
+ # 年間予定のパース(新形式に変換)
128
  annual_schedule_data = parse_json(row.get("annualSchedule", ""))
129
+ annual_schedule = convert_annual_schedule(annual_schedule_data)
 
 
 
 
130
 
131
  circle = {
132
  "circleId": row.get("circleId", ""),
133
  "circleName": row.get("circleName", ""),
134
  "circleNameKana": row.get("circleNameKana", ""),
 
135
  "projectId": row.get("projectId") or None,
136
  "projectName": row.get("projectName") or None,
 
 
 
137
  "genre": row.get("genre") or None,
138
  "areaCode": row.get("areaCode") or None,
139
  "pamphletNumber": parse_int(row.get("pamphletNumber", "")),
 
 
140
  "detailDescription": row.get("detailDescription") or None,
141
  "memberCount": parse_int(row.get("memberCount", "")),
142
  "memberNote": row.get("memberNote") or None,
143
+ "activityFrequency": row.get("activityFrequency") or None,
144
  "activityFrequencyNote": row.get("activityFrequencyNote") or None,
145
  "activityLocation": row.get("activityLocation") or None,
146
  "annualFee": parse_int(row.get("annualFee", "")),
 
150
  "websiteUrl": row.get("websiteUrl") or None,
151
  "isArchived": parse_bool(row.get("isArchived", "false")),
152
  "images": images,
153
+ "mainImage": main_image,
154
  "sns": sns,
155
  }
156
  circles.append(circle)