黑客松开放平台 HOP - 调试器

🔍区块差异

@@ -471,17 +471,20 @@
471
"parent_id": "JMnJdHgjtodFenxg5I9cNciXnwe",
472
"text": {
473
"elements": [
474
{
475
- "mention_user": {
476
"text_element_style": {
477
"bold": false,
478
"inline_code": false,
479
"italic": false,
480
"strikethrough": false,
481
- "underline": false
482
- },
483
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
484
}
485
},
486
{
487
"text_run": {
@@ -495,17 +498,20 @@
495
}
496
}
497
},
498
{
499
- "mention_user": {
500
"text_element_style": {
501
"bold": false,
502
"inline_code": false,
503
"italic": false,
504
"strikethrough": false,
505
- "underline": false
506
- },
507
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
508
}
509
},
510
{
511
"text_run": {
@@ -544,17 +550,20 @@
544
}
545
}
546
},
547
{
548
- "mention_user": {
549
"text_element_style": {
550
"bold": false,
551
"inline_code": false,
552
"italic": false,
553
"strikethrough": false,
554
- "underline": false
555
- },
556
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
557
}
558
},
559
{
560
"text_run": {
@@ -998,17 +1007,20 @@
998
}
999
}
1000
},
1001
{
1002
- "mention_user": {
1003
"text_element_style": {
1004
"bold": false,
1005
"inline_code": false,
1006
"italic": false,
1007
"strikethrough": false,
1008
- "underline": false
1009
- },
1010
- "user_id": "ou_1fdce791567abdfcfa9ccde744677bb3"
1011
}
1012
},
1013
{
1014
"text_run": {
@@ -1022,17 +1034,20 @@
1022
}
1023
}
1024
},
1025
{
1026
- "mention_user": {
1027
"text_element_style": {
1028
"bold": false,
1029
"inline_code": false,
1030
"italic": false,
1031
"strikethrough": false,
1032
- "underline": false
1033
- },
1034
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1035
}
1036
},
1037
{
1038
"text_run": {
@@ -1046,17 +1061,20 @@
1046
}
1047
}
1048
},
1049
{
1050
- "mention_user": {
1051
"text_element_style": {
1052
"bold": false,
1053
"inline_code": false,
1054
"italic": false,
1055
"strikethrough": false,
1056
- "underline": false
1057
- },
1058
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1059
}
1060
},
1061
{
1062
"text_run": {
@@ -1095,17 +1113,20 @@
1095
}
1096
}
1097
},
1098
{
1099
- "mention_user": {
1100
"text_element_style": {
1101
"bold": false,
1102
"inline_code": false,
1103
"italic": false,
1104
"strikethrough": false,
1105
- "underline": false
1106
- },
1107
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1108
}
1109
},
1110
{
1111
"text_run": {
@@ -1144,17 +1165,20 @@
1144
}
1145
}
1146
},
1147
{
1148
- "mention_user": {
1149
"text_element_style": {
1150
"bold": false,
1151
"inline_code": false,
1152
"italic": false,
1153
"strikethrough": false,
1154
- "underline": false
1155
- },
1156
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1157
}
1158
},
1159
{
1160
"text_run": {
@@ -1168,17 +1192,20 @@
1168
}
1169
}
1170
},
1171
{
1172
- "mention_user": {
1173
"text_element_style": {
1174
"bold": false,
1175
"inline_code": false,
1176
"italic": false,
1177
"strikethrough": false,
1178
- "underline": false
1179
- },
1180
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1181
}
1182
},
1183
{
1184
"text_run": {
@@ -1244,17 +1271,20 @@
1244
}
1245
}
1246
},
1247
{
1248
- "mention_user": {
1249
"text_element_style": {
1250
"bold": false,
1251
"inline_code": false,
1252
"italic": false,
1253
"strikethrough": false,
1254
- "underline": false
1255
- },
1256
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1257
}
1258
},
1259
{
1260
"text_run": {
@@ -1320,17 +1350,20 @@
1320
}
1321
}
1322
},
1323
{
1324
- "mention_user": {
1325
"text_element_style": {
1326
"bold": false,
1327
"inline_code": false,
1328
"italic": false,
1329
"strikethrough": false,
1330
- "underline": false
1331
- },
1332
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1333
}
1334
},
1335
{
1336
"text_run": {
@@ -1369,17 +1402,20 @@
1369
}
1370
}
1371
},
1372
{
1373
- "mention_user": {
1374
"text_element_style": {
1375
"bold": false,
1376
"inline_code": false,
1377
"italic": false,
1378
"strikethrough": false,
1379
- "underline": false
1380
- },
1381
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1382
}
1383
},
1384
{
1385
"text_run": {
@@ -1633,17 +1669,20 @@
1633
}
1634
}
1635
},
1636
{
1637
- "mention_user": {
1638
"text_element_style": {
1639
"bold": false,
1640
"inline_code": false,
1641
"italic": false,
1642
"strikethrough": false,
1643
- "underline": false
1644
- },
1645
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1646
}
1647
},
1648
{
1649
"text_run": {
@@ -1857,17 +1896,20 @@
1857
}
1858
}
1859
},
1860
{
1861
- "mention_user": {
1862
"text_element_style": {
1863
"bold": false,
1864
"inline_code": false,
1865
"italic": false,
1866
"strikethrough": false,
1867
- "underline": false
1868
- },
1869
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1870
}
1871
},
1872
{
1873
"text_run": {
@@ -1907,17 +1949,20 @@
1907
}
1908
}
1909
},
1910
{
1911
- "mention_user": {
1912
"text_element_style": {
1913
"bold": false,
1914
"inline_code": false,
1915
"italic": false,
1916
"strikethrough": false,
1917
- "underline": false
1918
- },
1919
- "user_id": "ou_185d470454f53ba6296d1b72e55be4a2"
1920
}
1921
},
1922
{
1923
"text_run": {
@@ -1931,17 +1976,20 @@
1931
}
1932
}
1933
},
1934
{
1935
- "mention_user": {
1936
"text_element_style": {
1937
"bold": false,
1938
"inline_code": false,
1939
"italic": false,
1940
"strikethrough": false,
1941
- "underline": false
1942
- },
1943
- "user_id": "ou_d62d1e792aae3a291e3b9c479c8ef639"
1944
}
1945
},
1946
{
1947
"text_run": {
471
"parent_id": "JMnJdHgjtodFenxg5I9cNciXnwe",
472
"text": {
473
"elements": [
474
{
475
+ "text_run": {
476
+ "content": "@水歌",
477
"text_element_style": {
478
"bold": false,
479
"inline_code": false,
480
"italic": false,
481
"strikethrough": false,
482
+ "underline": false,
483
+ "link": {
484
+ "url": "mailto:tech-query@fcc-cd.dev"
485
+ }
486
+ }
487
}
488
},
489
{
490
"text_run": {
498
}
499
}
500
},
501
{
502
+ "text_run": {
503
+ "content": "@水歌",
504
"text_element_style": {
505
"bold": false,
506
"inline_code": false,
507
"italic": false,
508
"strikethrough": false,
509
+ "underline": false,
510
+ "link": {
511
+ "url": "mailto:tech-query@fcc-cd.dev"
512
+ }
513
+ }
514
}
515
},
516
{
517
"text_run": {
550
}
551
}
552
},
553
{
554
+ "text_run": {
555
+ "content": "@水歌",
556
"text_element_style": {
557
"bold": false,
558
"inline_code": false,
559
"italic": false,
560
"strikethrough": false,
561
+ "underline": false,
562
+ "link": {
563
+ "url": "mailto:tech-query@fcc-cd.dev"
564
+ }
565
+ }
566
}
567
},
568
{
569
"text_run": {
1007
}
1008
}
1009
},
1010
{
1011
+ "text_run": {
1012
+ "content": "@Miya",
1013
"text_element_style": {
1014
"bold": false,
1015
"inline_code": false,
1016
"italic": false,
1017
"strikethrough": false,
1018
+ "underline": false,
1019
+ "link": {
1020
+ "url": "tel:+8619182279965"
1021
+ }
1022
+ }
1023
}
1024
},
1025
{
1026
"text_run": {
1034
}
1035
}
1036
},
1037
{
1038
+ "text_run": {
1039
+ "content": "@水歌",
1040
"text_element_style": {
1041
"bold": false,
1042
"inline_code": false,
1043
"italic": false,
1044
"strikethrough": false,
1045
+ "underline": false,
1046
+ "link": {
1047
+ "url": "mailto:tech-query@fcc-cd.dev"
1048
+ }
1049
+ }
1050
}
1051
},
1052
{
1053
"text_run": {
1061
}
1062
}
1063
},
1064
{
1065
+ "text_run": {
1066
+ "content": "@水歌",
1067
"text_element_style": {
1068
"bold": false,
1069
"inline_code": false,
1070
"italic": false,
1071
"strikethrough": false,
1072
+ "underline": false,
1073
+ "link": {
1074
+ "url": "mailto:tech-query@fcc-cd.dev"
1075
+ }
1076
+ }
1077
}
1078
},
1079
{
1080
"text_run": {
1113
}
1114
}
1115
},
1116
{
1117
+ "text_run": {
1118
+ "content": "@水歌",
1119
"text_element_style": {
1120
"bold": false,
1121
"inline_code": false,
1122
"italic": false,
1123
"strikethrough": false,
1124
+ "underline": false,
1125
+ "link": {
1126
+ "url": "mailto:tech-query@fcc-cd.dev"
1127
+ }
1128
+ }
1129
}
1130
},
1131
{
1132
"text_run": {
1165
}
1166
}
1167
},
1168
{
1169
+ "text_run": {
1170
+ "content": "@水歌",
1171
"text_element_style": {
1172
"bold": false,
1173
"inline_code": false,
1174
"italic": false,
1175
"strikethrough": false,
1176
+ "underline": false,
1177
+ "link": {
1178
+ "url": "mailto:tech-query@fcc-cd.dev"
1179
+ }
1180
+ }
1181
}
1182
},
1183
{
1184
"text_run": {
1192
}
1193
}
1194
},
1195
{
1196
+ "text_run": {
1197
+ "content": "@水歌",
1198
"text_element_style": {
1199
"bold": false,
1200
"inline_code": false,
1201
"italic": false,
1202
"strikethrough": false,
1203
+ "underline": false,
1204
+ "link": {
1205
+ "url": "mailto:tech-query@fcc-cd.dev"
1206
+ }
1207
+ }
1208
}
1209
},
1210
{
1211
"text_run": {
1271
}
1272
}
1273
},
1274
{
1275
+ "text_run": {
1276
+ "content": "@水歌",
1277
"text_element_style": {
1278
"bold": false,
1279
"inline_code": false,
1280
"italic": false,
1281
"strikethrough": false,
1282
+ "underline": false,
1283
+ "link": {
1284
+ "url": "mailto:tech-query@fcc-cd.dev"
1285
+ }
1286
+ }
1287
}
1288
},
1289
{
1290
"text_run": {
1350
}
1351
}
1352
},
1353
{
1354
+ "text_run": {
1355
+ "content": "@水歌",
1356
"text_element_style": {
1357
"bold": false,
1358
"inline_code": false,
1359
"italic": false,
1360
"strikethrough": false,
1361
+ "underline": false,
1362
+ "link": {
1363
+ "url": "mailto:tech-query@fcc-cd.dev"
1364
+ }
1365
+ }
1366
}
1367
},
1368
{
1369
"text_run": {
1402
}
1403
}
1404
},
1405
{
1406
+ "text_run": {
1407
+ "content": "@水歌",
1408
"text_element_style": {
1409
"bold": false,
1410
"inline_code": false,
1411
"italic": false,
1412
"strikethrough": false,
1413
+ "underline": false,
1414
+ "link": {
1415
+ "url": "mailto:tech-query@fcc-cd.dev"
1416
+ }
1417
+ }
1418
}
1419
},
1420
{
1421
"text_run": {
1669
}
1670
}
1671
},
1672
{
1673
+ "text_run": {
1674
+ "content": "@水歌",
1675
"text_element_style": {
1676
"bold": false,
1677
"inline_code": false,
1678
"italic": false,
1679
"strikethrough": false,
1680
+ "underline": false,
1681
+ "link": {
1682
+ "url": "mailto:tech-query@fcc-cd.dev"
1683
+ }
1684
+ }
1685
}
1686
},
1687
{
1688
"text_run": {
1896
}
1897
}
1898
},
1899
{
1900
+ "text_run": {
1901
+ "content": "@水歌",
1902
"text_element_style": {
1903
"bold": false,
1904
"inline_code": false,
1905
"italic": false,
1906
"strikethrough": false,
1907
+ "underline": false,
1908
+ "link": {
1909
+ "url": "mailto:tech-query@fcc-cd.dev"
1910
+ }
1911
+ }
1912
}
1913
},
1914
{
1915
"text_run": {
1949
}
1950
}
1951
},
1952
{
1953
+ "text_run": {
1954
+ "content": "@水歌",
1955
"text_element_style": {
1956
"bold": false,
1957
"inline_code": false,
1958
"italic": false,
1959
"strikethrough": false,
1960
+ "underline": false,
1961
+ "link": {
1962
+ "url": "mailto:tech-query@fcc-cd.dev"
1963
+ }
1964
+ }
1965
}
1966
},
1967
{
1968
"text_run": {
1976
}
1977
}
1978
},
1979
{
1980
+ "text_run": {
1981
+ "content": "@罗基印",
1982
"text_element_style": {
1983
"bold": false,
1984
"inline_code": false,
1985
"italic": false,
1986
"strikethrough": false,
1987
+ "underline": false,
1988
+ "link": {
1989
+ "url": "tel:+8618620306524"
1990
+ }
1991
+ }
1992
}
1993
},
1994
{
1995
"text_run": {

📄文档

黑客松开放平台 HOP

💡平台理念

基于类 GitHub 平台开发、运营一个开源的黑客马拉松系统,不仅服务各类黑客松比赛,也给日常编程训练营提供零门槛的云基础设施

💻开源代码

Web 前端

HTTP 后端

开源黑客松数据库(单场比赛版)

📖历史沿革

HOP v1(fCC 成都社区)

版本简介

2017 年,初创不足一年的 fCC 成都社区就在 fCC Coffee & Code 传统活动的基础上,尝试在现场组织为期一个白天的黑客马拉松 —— 上午组队、规划、搭架构,中午楼下一起吃个饭,下午集中编码,傍晚路演、交流。当年就成功组织了各 10 人左右的春赛和秋赛,并在来年春节后扩大为两天线下、一周线上的 2018 Code for City 黑客松,其中不乏几只在成都的外国人团队。

@水歌在所有黑客松过程中指导大家使用 GitHub 上传每个队伍的代码并在线上协作,比赛结束后就变成一个个天然的开源项目,GitHub 的组织、团队、看板功能也为比赛组织者、参赛者提供了免费的协作工具。Code4City 黑客松的初赛环节还搞起了 B 站直播,@水歌像体育比赛解说员一样在直播上实时点评大家新提交的代码,让枯燥的软件开发过程对观众更有趣。

于是带着以上成功经验,@水歌希望开发一个可复用的统一黑客松平台,让今后各类主办方的同类活动办得又快又好。

开源代码

技术演进

  • 前端:Bootstrap 3 + Vue 2 => Bootstrap 3 + EasyWebApp.js 4
  • 后端:EasyREST.js 0.x + SQLite 3 => Express.js 4 + LeanCloud.cn

相关活动

  1. fCC 成都社区【结对编程】活动:https://mp.weixin.qq.com/s/MVHxUD1D4JMy9XKji44Xuw
  2. 2018 Code for City 黑客松:https://mp.weixin.qq.com/s/x5X7dCA_kdx_tkw4XcniNA
  3. 2018 Unleash 货车帮黑客松:https://mp.weixin.qq.com/s/1u3L06eOdouGo_5tln_Rmg
  4. 2019 AI 成都学院工作坊:https://mp.weixin.qq.com/s/_YnY3GtyqDeiwbPRmcRQgA
  5. 2019 Copell 黑客松:https://mp.weixin.qq.com/s/7v0qM8rds7QFrbJu9GI0gw

OHP v1~3(微软开放技术公司、开源社)

版本简介

2018 年中,经@Miya介绍,@水歌得知开源社基础设施组已开发完一个开放黑客松平台,且已用它举办过一些活动。于是在微信拉群沟通后,@水歌决定中止 fCC 成都社区陷于停滞的 HOP 项目,个人加入开源社 OHP 项目的同时带入所有相关经验。

2020 年底,@水歌在完成加入开源社后的第一个重任“开发 2019 版开源社官网”后,开始推动 OHP 项目的 Web 前端重写工作,升级 6 年前的老旧技术栈,以适配新设备、开发新功能。但期间历经后端三易框架,在前后端志愿者长时间相互等待档期的过程中人员流失严重,OHP v2 最终并未完成。

2022 年初,@水歌将 OHP v3 的前端框架与 2022 版开源社官网统一为 Next.js,以求在兼顾 SEO 的同时最大限度复用基设组的技术能力。此时新版 C# 后端虽基本完成,但其志愿者的热情已是强弩之末,无法完成全部前后端联调,@水歌只能熬夜赶在年底的中国开源年会前发了一个内测版交差发布演讲 ——开放黑客松平台的技术实现与项目治理-COSCon'22.pptx

期间 GitHub codespaces、GitPod 等基于 VS Code 前端、Docker 后端的云开发环境已完全成熟,@水歌果断用它们替换掉 OHP v1 基于开源软件自建的远程桌面开发环境,大大降低了开发、部署和运维的难度,终结了过去每次活动前都要后端工程师专人线上配置、随时待命的历史,将黑客松平台真正能普及到日常“编程训练营”类型的活动。

其后,开源社联合创始人虽多次提议举办开源社内部黑客松来推动开发,但开源社执委会旗下负责活动举办的活动组、负责志愿者招募的成员发展组先后因组长的无所作为而被荒废、裁撤,只能纸上谈兵。而在这前后的所有开发工作,几乎只能由@水歌带领的 fCC 中文社区志愿者在基设组每周例会的推动下完成。

最终在 2024 年中,@水歌决定彻底统一前后端开发语言为 TypeScript,在更高的代码复用度和 AI 编程助手的加持下,用半年的业余时间快速重写完所有后端接口,并做了基本的前后端联调。

项目历史

  1. 开放黑客松平台发展史
  2. 开源社内部黑客松
  3. 开放黑客松平台 v3

相关活动

  1. 2022 ThreeX 黑客松:https://mp.weixin.qq.com/s/VW7VNSH0V6PQKm2gRla-yg

多种架构试验

为了大幅降低志愿者型组织开发、运维、使用黑客松平台的成本和门槛,@水歌将在开源社官网项目试验成功的多种低代码、自动化架构引入黑客松平台的开发,虽因各种细节局限而没用在最终版本上,但其技术探索都以开源的形式分享给社区,以期满足未来可能的不同需求。

飞书多维表格(开源社)

https://open-source-bazaar.feishu.cn/wiki/UsaQwdtOlizKuBkcfOBcjd4dnrb?renamingWikiNode=true&table=tbln3Ui5dEG6tlD9&view=vew6ay1VYV

Strapi 低代码系统(开源社)

GitHub 模板仓库(开源市集)

HOP v2(fCC 成都社区)

在 OHP 曲折的重构之路中,微软、联合国等多次黑客松活动的档期没有赶上,开源社理事们在失去信心的同时,也没有把每年中国开源年会上宣讲的“开源治理”理论用在项目孵化上,形不成有效的治理行动,最终在 2025 年中毫无交接的项目委员会,基础设施组例会 2025年6月15日上通知@水歌项目组解散……

于是,在“Talk is cheap, show me the code.”的开源箴言指引下,@水歌将自己和 fCC 中文社区志愿者@罗基印等人独立完成的 OHP v3 最新代码 fork 回来,作为 fCC 成都社区 HOP v2 继续开发,做有始有终、信守承诺的真开源人。