2023焦糖工作室招新

2023焦糖工作室招新

焦糖工作室是干什么的

是一个西点屋

焦糖工作室(Jotang Studio)是电子科技大学信软学院创新工坊的一个学生技术团体,主要活动地点在电子科技大学沙河校区三教507和403

焦糖工作室全部由本科生组成,在这里可以拓宽技术的视野,和小伙伴们一起开展课程安排中没有的技术实践,焦糖的目标是让每一位成员都能得到成长(是不是觉得很熟悉,因为每年的文案都是一样的捏

焦糖的技术栈包括但不限于 web全栈、机器学习、编译器、数据库、分布式系统、高性能计算…(或者由你来开创的新领域)

不过你技术力如何、对什么方向感兴趣,你总是能在焦糖找到志同道合的人哦

love and peace

2023招新活动安排

工作室永远欢迎对技术和团队热爱的新人!无论你是大一还是大二(抑或是大三、大四,都可以加入这次技术马拉松赛,并在这个过程中掌握技能和探索自己的方向,相信你自己,很多事情没有那么难。

种一棵树最好的时间是在十年前,其次是在现在

  1. 为期一个月的技术马拉松赛 从2023.9.12日开始,到2023.10.24日截止
  2. 工作室招新面试阶段:在技术马拉松中达到通过标准(非常灵活的标准)的同学可进入工作室面试阶段

如果你不是萌新,可以将简历发送到邮箱admin@jotang.club(邮件命名格式:年级-姓名-简历,如:21-段衍凯-简历),我们将组建专业团队(误)对简历进行评析并在3个工作日内给与答复。

规则

  • 完成任意题目后请将需要提交的内容放到新文件夹(命名格式为:题目序号-姓名,如#2-段衍凯),最终将所有文件打包(命名格式为:年级-姓名-发送日期-做题题号,如:21-段衍凯-9.14-127)并发送至邮箱 admin@jotang.club
  • 题目提交次数不限,以 最后提交版本 为准。 马拉松截止时间为2023.10.24(23:59)
  • 每道题都需要提交记录了学习过程的markdown文件,如果要求代码,请上传至Github并将访问链接一同提交。如果你还不知道什么是Markdown和Github,请先做科普福利题#1 啥是Git#2 Markdown
  • 招新对题目数量不做硬性要求,你可以深入一题,体现你的技术深度,也可以“我全都要”,探索自己的兴趣方向。
  • 如果需要与我们交流(比如题目太简单了,题目出现错误等等),请同样写下你的具体想法发送邮件到上述邮箱,或者在招新群中找到对应的出题人私聊
  • 截止日期后约半个月的时间里,我们会根据 题目的完成度 和在 Markdown文档记录与细节 给出评分表,并将其汇总为一个总评分表,达到通过标准的同学可以进入面试阶段
  • 科普福利向题目是帮助同学们热身和入门学习的,请一定至少选择一道代码技能向题目完成,题目的完成度最重要
  • 当你发现有些帖子打不开或者下载不了,建议更改域名中的“d.jotang.party”为“d.jotang.club”,这是我们论坛迁移的bug,正在修复,请您谅解
  • PS:
    • 诚信是Jotanger的底线,一旦我们发现解答中存在严重的copy现象,无论技术力如何,我们都将拒绝您的加入
    • 在马拉松过程中,如若题目有表述不清或其他问题和疑问,请及时反馈给出题者。出题者在招新群中统一以 2023#题号-姓名 (如2023#1-段衍凯)命名
    • 焦糖时刻欢迎各位萌新在群里提问,也鼓励同学间互帮互助。但焦糖依然希望同学们养成在提问前先自行百度谷歌的习惯,因而对于一些能直接百度出来的答案,焦糖学长们可能不会全部解答,望理解。

题目类型

#0 Let’s Warm Up!

你好,欢迎来到这里!这个部分是 JoTang Studio 招新的一系列预热题目!焦糖工作室为202[0-3](论正则表达式的妙用)级的同学精心准备了兴趣引导和前置技能题目。但是不要担心,我们的题目难度已经过严谨考虑和调整,并且我们并不要求全部完成。焦糖工作室希望,你可以通过这些题目,初探开发和软件的世界,并能够发现自己感兴趣的方向。

萌新:这引导看不懂啊?这链接为啥打不开?这些名词啥意思啊?这报错了咋整啊? dalao:Let me Google that for you 萌新:…卒

不要慌嘛,焦糖是一个萌新友好型工作室,我们会先带你点亮前置技能点。

搜索

对于不同领域的问题,需要灵活运用不同的搜索引擎。

比如我们推荐使用 Google 作为通用搜索引擎,使用必应/百度(在你搜索广告的时候使用)作为中文搜索引擎。yep!23年与以往不同的是咱们有 chatgpt poe 可以用捏(b站上有很多教你如何注册chatgpt账号(前提是你得会科学上网)和 不通过科学上网也可以访问chatgpt的教程哦

这里推荐一个聚合的搜索引擎网站:虫部落快搜 154

如果你想掌握更高级的搜索技巧,这篇文章也很简单易懂:搜索引擎的一些高级搜索指令 99

但除此之外,我们也可以发起针对性的搜索。

比如如果你在编程过程中遇到了奇奇怪怪的难以修复的BUG,你可以考虑使用国内的CSDN论坛搜索,也可以使用StackOverflow它们都是优秀的开发者社区,在特定的领域困扰了你很久以至于你怀疑这是一个bug你还可以在github对应的项目主页上提issue

如果你对于“为什么无法访问 Google”有疑问,欢迎看看我们为你准备的科普文档:深入理解GFW 158

提问

虽然搜索引擎的效率远逾言辞,但有时,光靠它的能力也有未能解决的问题,我们需要向别人提问。如果是在社区(discard/github/stackoverflow/reddit…)提问,为了更高效地获得可靠的回答,你可以需要一些提问的技巧:

ryanhanwu/How-To-Ask-Questions-The-Smart-Way 88 本文原文由知名 Hacker Eric S. Raymond 所撰寫,教你如何正確的提出技術問題並獲得你滿意的答 案。 - ryanhanwu/How-To-Ask-Questions-The-Smart-Way

计算机体系漫游

萌新刚上大一的时候很多时候会觉得想学技术又不知如何下手(毕竟也不是所有人都是从小学都开始学习c语言、初中开始打oi、高中为开源世界做贡献、刚上大学就有十年编码经验的技术大佬),对于计算机软件的认知局限在互联网的前后端,其实计算机领域有非常非常的多哦,只是这几年互联网领域比较热。对于刚接触计算机相关知识的小伙伴,墙裂建议抽时间了解一下计算机领域的导论知识哦 为此Jotang为各位精心准备了计算机导论大合集 计算机世界漫游 学习这些课程或许不会对你的编码能力有很大的提升,但是可以让你学习到

计算机是从哪里来、要到哪里去 ! 和喝酒时的时候关于计算机可以多吹几句牛

你的任务

  • 迅速获得获得一台计算机的使用权。
  • F**k the GFW.(获取Google等网站的访问权限)
  • 闷声发大财,本题无需提交。
  • 漫游计算机导论(如果你觉得这是一件有意义的事情)

划重点

  1. 如果同学你没有办法回到家中,你可以考虑去网吧(一起来网吧编程!你小子最好是去编程)。如果你不太想去网吧,那么你可以考虑一下购买一块树莓派+外接屏幕和键鼠的方式练习使用Linux系统。如果你想尝试用平板/手机代替电脑。你的下一台电脑,何必是电脑,也欢迎与我们交流。
  2. 我们强烈建议你马上拥有一台个人笔记本,赢在起跑线!赢在人生路!(逃
  3. F**k the GFW(科学上网) 对于咱们计算机科学家来说十分重要捏,请将这件事情放在首位
1 Like

#1 啥是Git

背景

第五次收到某同学用 QQ 发来的的 debug 请求和zip压缩包时,我陷入了沉思,于是有了这道题。

还未接触太多代码的你可能很难意识到Git的作用,因为当前的一道习题对应一个代码文件,而且大多数时候也只是你一个人在编辑,在此时Git并不能带给你颠覆性的开发体验,但是对于多人参与的代码量稍大的项目而言,没有版本控制工具是难以想象的。(顺便一提,想一个人开发大型软件是不可能的哦,合作能力甚至可以说是软件工程领域最核心的能力之一)

想象一下下面这些场景:

  • 当你需要编辑一个文件时,如果不想产生冲突,其他人需要避免操作这个文件,要等你完成修改后再把最新版流转给ta。

  • 还是这样的场景,当ta修改了项目后,如果你又要进行编辑,除非ta告诉你,不然很难确定修改的位置,更难评估对你目前任务可能造成的影响。

  • 当你的更改需要进行取舍的时候(甲方:我觉得还是第一版比较好),可能需要在多个版本的完整代码中比对,如果没法复原,这无疑令人绝望。

  • 当你进行的更改导致了严重的bug,或是不得不放弃,你也很难快速地回溯到原先的状态。

显然,没有版本控制系统,这些都会在项目开发过程中频繁出现,严重影响我们的开发效率和身心健康。

所以痛心疾首地安利 Git 之后,希望每一位同学都能够掌握 Git,并且习惯使用它来管理自己的代码。

关于什么是Github

Github是世界上最大的开源协作社区和在线Git远程仓库托管服务提供商,在2018年被微软收购后,Github的私人远程仓库服务也开启免费了,你可以上传自己的项目代码到远程,世界上的其他人可以搜索到你的代码,和你参与协作。又或者你重装了电脑,可以直接重新从远程仓库下载原本的代码,无需额外用存储设备保存。

除此之外,凝聚了无数人类智慧精华的众多开源项目都在Github上进行版本管理和迭代。如果你很好奇一些技术(比如前端的facebook/react 2、vuejs/vue 后端的apache/kafka 1 、apache/zookeeper 1等项目)的当前进展和未来规划,或者发现了代码里的bug,都可以通过提交issue或发起Pull request来加入开源社区的共建!

准备

1. 本地Git操作

史上最浅显易懂的Git教程!

照着这份教程慢慢走下去吧~你不一定要将每一个知识点背下来,而是你要知道git有这样的机制,等你真正需要用到的时候知道去哪儿查资料(学习很多工具的时候都要以这样的学习方式去学习哦

2. 学习使用Github远程仓库,将本地的项目提交上去吧!

【GeekHour】一小时Git教程

Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub

Git整合Vscode

这都是我筛选过关于git的优质教程,能让萌新也对git知其然知其所以然。大家放心食用(建议从上往下依次学习)

3. Git工作流

十分钟学会正确的github工作流,和开源作者们使用同一套流程

git工作流是大家使用git作为版本控制工具进行软件开发遵循的一种规范,能够方便大家对项目的管理。

4. 开源世界(有关我们生活在阳光下

对开源感兴趣的话,可以看看这本书【开源之迷】你一定会为开源人的赤忱之心所感染
为大家安利一下我的偶像 理查德·斯托曼(世界最后一位真正意义上的黑客!!【计算机博物志·人物篇】最后的黑客:理查德·马修·斯托曼

顺便一提,如果没有世界上历届开源人的努力,西方对中国的技术封锁和技术霸权要比现在嚣张多许多倍捏。我们生活在阳光下,是因为有开源人的贡献。感谢开源人、成为开源人!!

任务

  1. 用本地化Git来管理本次招新马拉松的题目回答项目文件吧!如果你可以写一写遇到的问题或者学习的过程就更好了~
  2. 注册Github账号,并将你在本次招新马拉松中所做的题目提交上去吧!如果commit message 写得比较规范或者项目文件管理比较清晰可以加分哦~(记得建立远程仓库时选 public 不然我们看不到)
  3. 进阶题目 有自己的博客是一件多么令人兴奋的事情啊~ ,使用 GitHub pages 免费搭建一个博客吧!(啊?你问我怎么做?请看第0题自行搜索)

如果你更喜欢搭建包揽前后台以及数据库的动态页面博客,比如这样的(强行给学姐博客打广告🤣),可以自行探索~

备注

由于GFW的存在,最近两年Github的国内访问速度和稳定性都有明显下降,所以我们推荐你使用一些方法(比如第零题的任务)进行加速。另外, Github也提供了桌面端程序Github Desktop 可以在一定程度上避免上传和下载遇到的奇形怪状问题。

如果实在做不到访问Github来完成题目,也可以将远程代码托管网站换成Gitee

但是如果可以还是非常建议使用github而不是gitee,关于github加速你还可以检索一下如何让终端也走代理(前提是你已经掌握科学上网)

题外话

  • Github 的 private repo(私有存储库)已经对个人用户免费了,所以不用害羞哦!
  • 本题旨在带你了解 Git 和 Github,发现更大的世界。哪怕对 Git 和博客不感兴趣(博客倒是可有可无,但是不用git是不可能滴),也希望你能注册并探索一下 Github 这个世界上最大的开发者社区,没事多逛逛 Trending ,star 些你感兴趣的项目。
  • 提交的时候记得附上你的 Github 主页和博客链接哦!

#2 Markdown

背景

多年以后,阿卷再一次打开邮箱,还会想到那个与工作室小伙伴们兴高采烈地打开招新题收件箱的那个遥远的下午,在看到满屏幕的.doc格式的word文档陷入了沉思,欲哭无泪的表情在他脸上久久不能散去(误

而当年,还是小白的hoshi也曾痛苦地改着word格式,字体、字号、图片布局各种bug此起彼伏

你是否也曾被被word中各种纷繁复杂的格式问题困扰得想砸电脑(bushi)

好消息!!看看简洁的Markdown

Markdown 是一种轻量版文本标记语言(萌新:什么是文本标记语言?)

Markdown可以让你用写txt记事本的写法写文章,但却可以生成不亚于word文档的好看的排版,在计算机世界中,遍地是markdown格式的文档,无论是Github里各个项目的README,还是优秀的工程师的博客,都是由Markdown书写,除此之外,markdown在简书、知乎以及很多论坛中得到应用。

Markdown并不是一个软件,你可以使用任何编辑器书写markdown文档

注意:本次技术马拉松中你提交的所有文档都应该是markdown格式哦

一起来学习Markdown吧!

任务

  1. 闷声发大财,好消息是本题也不用提交
  2. 坏消息是你所有的题目都需要以markdown的格式提交(顺便一提源代码请放到github仓库上并且在markdown中附上github项目仓库的链接

备注

如果我没记错的话,昨年特么的收到了很多markdown里面的图片路径是你本地电脑的图片路径。阿sir我怎么去你本地的电脑访问图片呀。如果你不想使用图床,打包的时候请将图片一同打包(务必使用相对路径哦)

关于什么是图床和相对路径请自行查阅!

#3 Linux & WSL&Docker

题目背景

学期开始,想要加入 Jotang 工作室的小马面对各种招新题,早已跃跃欲试。为了完成招新题,小马先是安装配置了 Python 开发环境;转头捣鼓 Java 时,又配置好了 JDK;配置好了 Go 的开发环境后又去安装了 Node 包管理器。

问题来了:

不同的框架兼容不同版本的开发环境出现兼容问题时,这时小马看着已经变成各种语言各种版本号形状的环境变量参数(并且因为 **软件园的软件 一不小心弄的电脑满是病毒),早已欲哭无泪。而 Windows 又是平时的生产环境,不方便全盘清空重装,这时要怎么办呢?

这时 WSL2 闪亮登场,他能够在 Windows 环境下虚拟出一个带有完整 Linux 内核的开发环境

问题又来了:

WSL2GUI 配置困难,而且有的同学就是喜欢用带有 GUI 的发行版。命令行虽好,但是同时拥有 GUI 不香吗?

显然此时只有完整的虚拟机能满足小马的需求了,在虚拟机下,小马得到了:

  1. 便于配置各种语言的开发环境(包管理器 yyds
  2. Linux下更方便地处理不同开发环境的版本兼容
  3. 便于试错,配置炸了的话随时可以清空整个环境不用担心生产环境数据丢失
  4. 满足小马的洁癖与强迫症
  5. 方便的备份与回滚
  6. 开源的操作系统!

至此,小马可以开开心心地做各种招新题目,再也不用担心他心爱的 Windows 环境变成各种形状了!(事实上是他以后再也没使用过windows做开发捏

还有一件事,如果你想让审题人在他的电脑上以相同的环境运行你的代码(咱就是说也不能把审题人的环境搞炸是不是),你可以学习一下docker的使用,具体要求在加分项里面有哦。

题目内容

任务(三选一)

  1. 安装配置 WSL2 的 Ubuntu(或者是任何主流的linux发行版 但是请不要安装centos) 发行版(酷酷的大黑客
  2. 在虚拟机软件中安装配置 Ubuntu (或者是任何主流的linux发行版 但是请不要安装centos)发行版(gui交互逻辑非常香!
  3. 安装 Ubuntu 和windows双系统 (稍微有点硬核咱就是说 不过双系统对于显卡的支持会更好,对于想在本地训练模型的机器学习童鞋会更加友好哦

对于萌新来说还是建议大家使用Ubuntu ( ltslong time support的缩写 意思是不会出什么大问题的版本) ,并且中文互联网下资料也巨多无比

对于想要折腾的童鞋可以看看 计算机世界漫游 的linux节。

选择哪条分支根据个人兴趣以及需求来即可。

当然你也可以全都要(小孩子才做选择),毕竟自己真正喜欢哪一个是通过比较得来的。

安装完linux不知道下一步该何去何从可以参考一下第四题捏。

加分项

  1. 通过 VScodeRemote 插件连接至你的虚拟机 / WSL2 和 了解 windowsxshell的使用
  2. 配置好基于 SSH 密钥的免密的远程服务器登陆
  3. 学习docker的使用并且将后续你提交的所有题目的项目打包放到 dockerhub 上(请写好详细的readme.md并且提供一键运行的脚本)方便学长检查你的代码一键运行捏,非常方便就能还原你在本地的效果。这条是非必需的哈,请不要在这上面投入太多时间

划重点

  1. 除非你开发windows应用程序或者是java这种跑在虚拟机(咳 与本题中指的虚拟机不是同一个概念哈)上面的程序,不然我们墙裂建议你使用linux作为你的第一开发环境(做到这一点就已经遥遥领先了
  2. docker是非常有用的工具,不过对于咱们学生来说可能需要用到的时候不是很多。你可以选择性了解

提交内容

  • 每一步的截图
  • 文字说明
  • 个人感想

以上内容通过 Markdown 格式的文档提交

参考资料

#4 shell & Makefile

背景

程序猿(计算机科学家!)很多时候因为“懒惰”发明了需要利好的工具。其中一项非常重要的工具就是脚本。因为是招新题的缘故,照顾到大一的新同学,还是简单解释一下什么是脚本。脚本通常是一种用于自动化任务或操作的计算机程序。它是一系列按照特定顺序排列的指令,可以被计算机解释和执行,而无需人工干预。就比如你可以使用shell写一个定时脚本,功能是如果早上九点钟你如果没有打开过你的手机(换句话说就是你睡过了)自动发送给你的老板你今天生病了需要请病假,虽然但是,的确有一位俄罗斯的程序员这样干过。又如因为有效信息检索太过烧脑和费时(特别是当你在利用知名广告搜索引擎baidu进行信息检索),人们发明了生成式人工智能chatgpt。通过工具来提高自己的效率十分重要。emmm…读到这里,你可以开始构建属于你自己的生成式人工智能了。(笑

本题主要面向大一的同学。书归正传,下面是本题的主要内容

题目内容

手写shell

总所周知,计算机科学家!大部分时间应该都是在linux上度过的(此处已经默认你已经做过第三题了并且可以“熟练”使用 linux/unix 操作系统,呃,如果没有做第三题 请务必先做第三题,虽然 gui 非常棒,但是windows除了 gui 外其他方面不能说完全没用,只能说作用不大)

当我们初次连接linux,你可能看到是黑黢黢的终端(有一点大黑客的感觉有没有),当然如果你用的是 ubuntu/manjaro 当我没说。当你打开黑黢黢的终端(但愿你没有在键入用户密码时以为自己的键盘坏掉了或是按照网上的教程通过vim打开编辑一个文件然后千般尝试后得到一串神秘字符都没能退回到你来的地方),映入眼帘的大概是

ryuk@Ryuk:~$ echo "welcome to jotang"
welcome to jotang

当你在终端中输入echo "welcome to jotang"并且按下回车你会发现"welcome to jotang"显示到了终端上,你理所当然认为应该这样。但是如果我告诉你 echo 其实是一个程序的名字,与你用c语言写的 helloworld.exe并且双击运行 别无二致,阁下又该如何应对。

我们可以通过下面这条命令来一探究竟

ryuk@Ryuk:~$ which echo
/usr/bin/echo

ryuk@Ryuk:~$ cd /usr/bin/ && ls -al |grep echo
-rwxr-xr-x  1 root root       22736 Feb  8  2022 echo
-rwxr-xr-x  1 root root       10336 Feb  7 13:39 lessecho

这条命令可以告诉我们在终端中输入的echo其实是放在 /usr/bin ( bin是binary的缩写,是二进制文件的意思,并不是垃圾桶,不要误会了 )目录下的一个程序

那么为什么我们输入echo程序名 并且给这个程序传入一个参数,其结果就显示到屏幕上了呢。

是什么东西解析了咱们的命令和参数呢并且让计算机运行。

答案是bash或者zsh这样的shell在工作。

为了能够深入的了解shell的工作原理,顺便学习一下操作系统的为应用开发者提供的接口(也就是常说的api),为什么我们不自己动手写一个呢。(其实是操作系统课程的大作业威力加强版)编写一个简单的 shell 并不是一件非常困难的事情。

至于使用什么编程语言来完成shell,我的评价是

人生苦短,我用 python或者lua

如果你人生苦长,你也可以用c/java语言来编写,当然非常费事就是了(真的非常不推荐!!!)

你如果比较高完成度的完成了本题,你将获得

  • 了解操作系统基本的api

  • 熟悉环境变量和脚本的实现原理

  • 真正的打开linux的大门!大概率你以后打交道最多的操作系统

  • 对IO(很多学长到大三还是一知半解捏 比如说我)和字符串处理(毕竟很多应用开发的绝大部分时间都是在处理字符串哈哈哈)会有一个基本的了解

  • 知道大黑客在干嘛

  • 焦糖招新的优先录取(大一的童鞋)

shell基本要求:

  • 能够解析基本的命令行输入,并且支持单引号'string'和双引号"string"格式的字符串访问,实现对其他程序的调用(涉及到系统调用 例如c语言中的的fork创建子进程、exec函数簇,如果你用的是python这样的脚本语言应该会省事很多)
  • 实现历史命令的记录 建议保存到 ~/yourshellname_history
  • 实现基本的shell内建命令 如exitwhich alias等…
➜  recruit_new which exit
exit: shell built-in command
➜  recruit_new which which
which: shell built-in command
  • 实现 .~-(避免大家看不清 中间就用来分隔了)的解析,下面有小例子便于理解捏
➜  Desktop cd .
➜  Desktop cd ..
➜  ~ cd -
~/Desktop
➜  Desktop cd ~
➜  ~ cat ~/.zshrc
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Change the mirror of homebrew for zsh
# export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles
# 。。。。。。。。。。。。。。。。。。。
  • 实现基本的信息提示 包括但不限于用户输入无法解析的命令输出错误提示信息并且错误提示信息为红色/每条命令前显示主机名和用户名等…
ryuk@Ryuk:~$ error
Command 'error' not found, did you mean:
  command 'perror' from deb mysql-server-core-8.0 (8.0.33-0ubuntu0.22.04.2)
  command 'perror' from deb mariadb-server-10.6 (1:10.6.12-0ubuntu0.22.04.1)
Try: apt install <deb name>

shell进阶实现

  • 实现常见的信号处理 例如 复制 终止正在运行的程序,实现内建命令kill(杀死进程),通过&实现程序的后台运行
  • 实现管道符 | 和 输入输出重定向(dup函数?)
  • 实现tab补全功能 实现上下方向键查找历史命令的功能
  • 实现日志系统(可以自己在网上搜寻一个日志库来弄
  • 管理和操作系统环境变量(聚焦export的实现和$解析符)与shell配置文件的解析(有点硬核的部分)

例如用户每次打开zsh都会解析~/.zshrc

➜  ~ cat ~/.zshrc

alias proxy='export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890'
alias unproxy='unset all_proxy'

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

  • 实现部分解析 shell 编程语言 (小解释器了)!!!!!你会变成超级厉害
  • 呃 还有任何你想要实现的功能!来点想象力

当然,前面只是实现了一个shell的基本功能,但是已经可以覆盖你日常使用的绝大部分了我认为。这才是计算机专业的学生应该干的事情嘛。

Make 想象力时间到!

既然我们都写了一个mini shell工具了,那为什么不在趁热打铁写一个解析makefile的工具呢(毕竟make可是伟大到连linux都是由他来辅助构建)?呃,虽然二者好像毫无关联。但是为了让咱们(计算机科班生!)知道知道,运行一个c语言程序并不是只是点击ide右上角的绿色箭头。

至于 c语言是怎么从源代码(也就是你写的hello world)到可双击执行程序(也就是你编译出来的exe后缀文件 如果你用的是windows且打开了显示文件后缀名的话)和 make工具是什么 我原来有简单的开一个peer teaching为当时的焦糖童鞋讲解捏 (翻旧帐时间到

编译原理概述及利用Vscode构建C/C++项目视频

[编译原理概述及利用Vscode构建C/C++项目文档](如何通过VsCode高效的构建c/c++大型项目 - 飞书云文档 (feishu.cn))

当然由于准备不是很充分和自己的知识面很有限,里面有非常多的暴论。看我这个肯定是不如看互联网上一些视频作者的视频来的好,但是有一个好处就是不懂的地方觉得有误的可以直接跟我交流(线下真实我

你如果比较高完成度的完成了本题,你将获得

  • 获得很多东西 并且领先其他没加入焦糖工作室的童鞋一大截(暴论!!

Make要求

学习makefile的基本使用(别学太深了,这玩意以后你也不太会经常用到,毕竟咱们有cmake用), 并且复现一个具有基本功能的make。

是不是觉得这道题有点草率,emmm 因为是我临时加的

如果有不清楚的地方,欢迎线下薄纱我

提交内容

  • 编写好markdown文档并且附上你的github项目地址(或者dockerhub项目地址)
  • markdown文档中包含做项目的学习过程和学习/编码的心得体会
  • 详尽的项目部署运行方式

参考资料

#5 前端

写在前面

  • 如果你是新入门的大一同学,我们推荐从任务一开始不断学习和练习,尽自己的努力尽量提高题目的完成度

  • 如果你已有知识储备,或者你是大二的同学,我们期望你能完成任务二,并尽力达成进阶要求

题目内容

任务一

使用 HTML 和 CSS 构建一个简易的个人博客界面,内容包含以下:

  • 个人简介:向我们展示一下你吧,可以有你的姓名、外号、性别、特长、兴趣爱好等等
  • 本次招新马拉松做题记录:将你的学习记录,遇到的困难 and 心得体会记录在这里吧.并且给每条记录标记出上传时间
  • 照片墙:通过照片墙展示自己,可以放自己的照片或自己喜欢的照片 or 分享一些旅行照片视频和生活日常之类的
  • 文章分享:既然已经有了自己的博客,不分享点东西怎么行呢?可以与技术相关,可以是读书心得体会,亦能是你对大学四年的畅想…

既然已经学会了使用 HTML 和 CSS,接下来加入一下 JavaScript 来完善一下你的博客吧

  • 上传照片墙时,你是不是会觉得静止不能动的照片有些单调?试着使用手风琴效果,让我们可以在鼠标悬停 or 点击图片时浏览放大的图片吧
  • 给页面添加文章搜索功能,就是按照上述方法多添加几篇文章(内容不限),然后在文本输入框内输入一串想要搜索的关键字符串,点击搜索按钮后查找出站内所有文章的匹配结果并显示

学习关键字

  • HTML
  • CSS
  • Javascript

任务二

完成了任务一的要求,相信你已经对前端的基础技术 HTML、CSS、JavaScript 有了一定的了解,接下来希望你能够**仿照 bilibili **的网站样式,制作一个属于你自己的 b站

复刻 bilibili,有以下要求:

  • 完成一个首页的制作,首页的基本要素:
    • 轮播图
    • 头部导航栏
    • 每个视频的播放量、评论量、时长、标题、up主、发布时间
  • 头部导航栏不需要目前 b站 这样复杂的样式,但是有以下要求:
    • 鼠标悬停到某个标签时,需要展示更多的内容,鼠标移走自动隐藏
    • 向下滑动时,头部导航栏始终位于网页的顶部
  • 当鼠标悬停到一个视频时,会播放视频的片段
  • 如果你认为目前的工作量较少,可以完成更多的需求:实现一个具体的视频页面,基本的样式就不再赘述了,完成这些重难点可以为你加分:
    • 评论区的制作,发布评论后推荐使用浏览器的存储机制进行保存,能够在下次进入页面后看到之前的评论内容
    • 下滑后,如果视频完全移出了屏幕范围,会以小窗的形式在视频下方出现
    • 倍速和弹幕
  • 当然了,如果你可以仿照 bilibili 实现更多的功能,完成更多的页面我们也是支持的

tips

  • 此次任务可以有两种实现方式,一种直接使用原生JavaScript,另一种是使用Vue框架,选择后者可能需要一定的时间去学习Vue框架,但是Vue框架可以说是前端开发一个必备的技能,以后的项目都是会使用框架而不直接使用原生JavaScript开发,同时如果使用Vue框架会有更多支持的组件库,帮助你提高开发效率,不过能够实现任何方法我们都是支持的
  • 由于没有提供服务端,推荐使用浏览器自身的存储能力,如local storage,session storage等
  • 有部分功能可能会有难度,但是希望大家不要放弃,遇到问题或者不知道这些功能怎么实现的可以在网上搜索,一般都会有很多解决方法的(也欢迎线下单杀出题人

学习关键字

  • 浏览器的存储机制

    • Local Storage
    • Session Storage
    • Cookies
  • flex布局

  • 浏览器事件

  • Vue

进阶要求

如果你觉得以上的要求太过于简单,可以在此基础上继续完善:

  • node 环境和浏览器环境都可以运行 js 代码,大致了解这两者的区别
  • 使用 Ajax 技术与后端数据进行交互,可以使用 mock.js 模拟数据
  • 利用 bilibili 提供的 API,实现前后端交互功能
  • 引用第三方组件库让你的项目更加美观,提高开发效率,推荐使用 Element UI,当然 Element UI 是基于 Vue 的
  • 使用 Electron 打包项目,让你的 “页面” 变成桌面应用程序
  • 学习计算机网络中 HTTP 协议,了解 HTTP 为 Web 应用提供的服务

提交内容

  • 编写好markdown文档并且附上你的github项目地址(或者dockerhub项目地址)
  • markdown文档中包含做项目的学习过程和学习/编码的心得体会
  • 详尽的项目部署运行方式

参考资料

1 Like

#6 JavaWeb

Task1: 拥有你自己的服务器

背景

一天,阿卷在学习的时候想把自己记录在博客网站上面的学习记录分享给阿摆和广大的卷卷哥们学习,但是阿卷自己电脑上的本地博客网站不知道如何分享给广大的卷卷哥,于是他参照教程自己来了一台服务器,并且按照自己的习惯和喜好购入了一个域名,搭建了属于自己的博客网站,并可以共享给计算机网络世界里的所有用户

在互联网的世界里,一台服务器至关重要,你可以在上面存放属于你自己的所有信息,你可以将自己的网站或者资料分享给在计算机网络世界中的所有用户

在如今的互联网世界中,每一个你所登录使用的Web/App背后都有一台强大的服务器。获取服务器,学会基础Linux指令开发是进行软件工程开发的第一步,现在就开始去获得属于你自己的服务器吧

准备

  1. 获取一台服务器,如果你已经拥有了自己的服务器就可以跳过此过程,如果没有,你可以在飞天计划-免费领取服务器中领取一台服务器,如果你觉得服务器的配置不足够您使用(目前上述已够),您可以自己购入一台服务器,不同的厂商都有自己的学生活动,你可以选择你喜欢的阿里/华为/腾讯等,去获取你的服务器(注意隐私信息打码)

注意,在设置服务器密码时,请尽量不要设置123456等密码,否则你的服务器将可能被不法分子扫到,并进行滥用(每年都会有人在DB等地方看到BTC字眼 :frowning:

  1. 熟悉Linux基本指令,请登入你的服务器,并实操一些Linux指令

Linux常用指令

如果你已经熟悉了Linux基本指令但是不知道如何检验自己,那么你可以通过下面的过程来检验自己

Linux基本指令练习

加分项

  1. 了解Linux的目录结构和文件结构

Task2: Java

前面提到阿卷想要在服务器上搭建一个属于自己的博客网站,但是现在阿卷遇到一个问题,博客网站中的文章如何管理呢,下面就做一个简单的文章的CRUD吧

实现一个简单的关于文章的CRUD后端接口(这一部分内容较多,大一的同学如果没法全部完成请详细记录你的学习过程)

基本要求

  • 查询所有文章
  • 添加文章
  • 编辑文章
  • 删除文章

可以用PostMan进行自测,请对你写的后端代码进行详尽的文档解释,文档格式、代码格式都会作为评判标准

可能会用到的知识

  • Java基础
  • http请求,json格式
  • 数据库的简单使用,SQL语言简单增删查改的语句编写
  • 推荐使用Springboot + mybatis-plus

加分项

  • 部署在服务器上,并给出可访问的公网链接(如果没有能力做简单前端页面可以只给出接口链接)
  • 详细的代码注释和代码规范

Task3: 进阶(选做)

将各种CRUD接口暴露在网络中非常危险,除此之外,阿卷想要给自己的的博客网站增加一个用户系统,把阿摆们和卷卷哥们区分开,不给卷卷哥们一些文章的权限

任务

  • 实现一个登陆接口,登陆成功返回一个token
  • 对增加文章、删除文章、修改文章的接口实现接口鉴权(接口鉴权的token放在http请求头),未登录拒绝执行

可能会用到的知识

  • http请求,json格式
  • 推荐使用Shiro/Spring Security框架

加分项

  • 实现查询文章接口对于阿摆们和卷卷哥两类用户返回数据的区分
  • 部署在服务器上,并给出可访问的公网链接(如果没有能力做简单前端页面可以只给出接口链接)
  • 详细的代码注释和代码规范

提交内容

  1. 任务一
    1. 控制台的服务器信息截图
    2. 记录了学习Linux基本指令的markdown文件
  2. 任务二
    1. 源码上传到Github
    2. 记录学习过程的markdown文件,其中有源码链接
  3. 任务三
    1. 源码上传到Github
    2. 记录学习过程的markdown文件,其中有源码链接

#7 Rpc

背景知识

例行公事。我们先介绍一下什么是rpc。rpc(远程过程调用)是一种计算机通信协议,它允许在网络上的不同计算机之间进行通信和交互,就像调用本地函数一样调用远程计算机上的函数或方法。rpc的目标是使分布式系统的不同部分能够透明地协作,好像它们都在同一个本地系统中一样。

通俗的举例子,就像你要训练数据集,但是你本地计算机的性能不够。你就可以通过rpc的方式调用我的超级计算机上的训练函数,然后我计算机将计算结果通过网络传递回你本地计算机,你就能够看到训练的结果了。

你和我之间协定一种函数的调用约定(函数的参数,返回类型)和数据的传输格式(我该如何理解你给我的数据并且处理),只要我们遵循这种约定,我们之间就可以交互数据。注意我屏蔽了网络在这个过程发挥的做用。

any way。rpc可以理解成函数函数调用,只不过它是远程的。

有HTTP为什么要有RPC

rpc设计

协定网络传输方式和网络框架

  • 数据传输格式

我们都知道 http 就是网络传输协议,是协定数据在网络中传输的标头,让接收到拿到数据可以正确的取出数据和一些额外的信息。http协议对于我们rpc的设计来说是冗余的(也许不算冗余?就是比较麻烦),因为我们仅仅需要区分远程调用的函数名、参数和返回值,还有区分网络包的头部部分(通常是固定长度的)和真正需要的数据部分的分隔。

  • 网络编程

对于新童鞋来说网络编程是一个蛮超前的知识点了,特别是c/c++下的网络编程,甚至需要自己去写socket。不过本题不会在网络并发有很高的要求,基本的多线程/多进程(单进程也不是不行,毕竟网络不是核心考察点)应该就可以达标了,当然你能够实现 reactor 模型更好。(顺便一提可以学习下如何给自己提供的网络服务做压力测试,我直接进行一个疯狂的发包

再顺带一提的还有网络安全相关的问题,可以稍微了解一下,也许?我是说也许,你可以给自己的包按照自己想要的方式加个密什么的。

序列化

我们在本地进行函数调用的时候,如果我们需要向函数中传入一个链表作为函数的函数,我们只需要将链表的头指针传递给函数即可。被调用的函数就可以根据这个链表的地址(也就是指针)找到这个链表并且对这个链表进行操作。

但是对于rpc来说,这就存在问题了,链表是存在你本地的数据,这个链表在你本地有一个地址。但是我们进行远程函数调用的时候远程的电脑就算拿到你链表的地址,他也无法访问这个链表中的数据(这是理所当然的,因为你们根本不是一台电脑啊!!!)

所以你想拿链表作为一个参数,你不能传入链表中的地址,你要把链表中的全部数据传进入。

我们怎么把链表中的数据写到数据包中呢?更何况链表里面的元素可以是各式各样的(double、struct、class 之类的),我们如何将各式各样的数据写到数据包中,这就是序列化要做的工作(简单理解为协定数据在传输包中是如何存储的)。

这是一个比较宏大且有趣的问题

是时候该好好思考一下该如何协定这种存储各种各样类型的协议(可以称之为协议,很高大上有没有)。(要支持各式各样的数据类型哦,至少得支持结构体(需要思考如何去编写统一的接口能够将任意的结构体类型写入我们的序列化流)和存储着结构体的set/list/map之类的吧?)

行为绑定(泛型编程)

服务端要对接受的网络包进行处理,理解客户端发来的网络包到底是想要服务端这边的哪一个函数。

那这些函数哪儿来的呢?当然是服务端这边编写的并且注册进服务端的一个函数表(map)中。当客户端的网络包来了,解析网络包,根据解析出函数名(或者一些你约定俗称的标识符)去查表,找到对应的函数回调。然后将网络包中解析出的函数参数传递给回调函数,就完成了函数的调用。再将函数的返回值序列化后通过网络包的形式传回给客户端,客户端解析出传回的网络包。就完成了一次rpc请求。

当然这里有一个难点就是,我们如何高效的将函数注册进函数表中。

假如我们有一个 std::string &upper(std::string &str)

std::string &upper(std::string &str) {
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    return str;
}

函数,函数的作用是将传递过来的字符串转换为全部大写。

那么我们可以往函数表中添加一个键值对< “upper” , &upper >,当接收到调用网络包我们就解析第一个字段(存的是要被调用函数的名字),然后根据这个名字去查函数表插入upper函数,在解析网络解析出string参数传递给upper函数得到转换后的全大写 string,再封装成包传递给客户端。万事大吉。

但是这里有一个小小的问题捏,就是你如果想注册多个函数进去他们的参数类型和返回值类型如果都不一样,你就不能往同一个函数表中插入类型不同的函数指针了。

// ignore the head file 
std::string &upper(std::string &str) {
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    return str;
}

std::string &splice(std::string &str1, const std::string &str2) {
    str1 += str2;
    return str1;
}

int main() {
    std::map<std::string, decltype(&upper)> func_map;
    func_map["upper"] = upper;
    std::string strr = "hello";
    (void)func_map["upper"](strr);
    std::cout << strr << "\n";
  
		//error!! type 
    func_map["splice"] = splice;

    return 0;
}

我们需要将类型统一起来,统一类型有非常多种方式可以自行调研一下哦(最基本的方式应该是利用到oop的继承与多态)。

(好吧我承认想很好地解决这个问题可能是一个非常非常困难的事情 发挥你的想象力

写在最后

出题人(也就是我)默认你使用的是c++语言,如果是用java/python/go语言来做,很多问题也许会简单许多。当然我推荐你使用c++语言来做就是了。(因为使用c/c++你才能真正知道计算机是如何运作的捏,还有就是其他语言我用的也不是很熟悉哈哈哈

本题不要求非常进阶的网络编程框架的实现或者调用!!请不要在网络编程上花费大量的时间,基础的socket就能解决问题。当然有点 多进程/多线程实现也是极好的,当然实现线程池和任务分发也是极好的,当然利用 epoll/poll/select 来实现高并发也是极好的。(非本题重点

写这个项目完全是学习为目的哈,现在github有很多工业级实现的rpc框架(例如google的grpc)

实现rpc涉及到方方面面的知识(呃 网络编程、序列化、反射、泛型编程 都是非常重要的知识)

了解并掌握这些比较底层的知识(虽然每一个知识都有现成的框架可以用捏)不仅你后续再学学校的课程会有很多发散性的思考,也会极大地提升阅读开源项目的能力

你如果比较高完成度的完成了本题,你将获得

  • 网络编程、序列化、反射(可有可无)、oop思想

  • 一些编程专业术语

  • 设计一个小型架构的能力

  • 提升自主阅读开源项目的能力

  • 超同龄人的计算机知识储备和知识搜寻能力

学有余力的童鞋可以使用性能测试工具对自己的rpc服务器进行压力测试并且分析程序运行时的性能瓶颈。

提交内容

  • 编写好markdown文档并且附上你的github项目地址(或者dockerhub项目地址)
  • markdown文档中包含做项目的学习过程和学习/编码的心得体会
  • 详尽的项目部署运行方式

参考资料

#8 llvm & complier & cpp

敲!compiler?!

LLVM之父Chris Lattner :现在是编译器的黄金时代(hhh 其实所有技术现在都处于黄金时代)

背景介绍

例行公事,还是得先要介绍一下编译器(complier)是干嘛的。但是当我在b站上看到一个比较厉害的up主上传的非常友好的编译体系科普视频,我决定偷偷懒就不在这里给大伙做介绍了(因为他实在讲的太好了捏 图文并茂),上链接

编译体系漫游

看完上述科普向视频,大概能对编译器是干嘛、编译的流程、现在市面上有哪些编译器(编译器框架)有一个大概的了解(emmm 好像没介绍msvc 不对 是msbc 那玩意太蠢了 谁用谁知道)

学习编译原理最好的方式就是自己写一个编译器,不然学习再多的理论也是徒劳,因为困难往往隐藏在实现的细节当中。

但是从0实现一个完整的编译器是一个十分困难且工作量巨大的工程(特别是在你想要实现一个有一定优化和拓展性的编译器)。好在现在llvm提供了一套框架,我们只需要分析我们所需要实现语言上的特性,在llvm的规则下编译对应的词法、语法、语义分析等,将我们需要实现语言的源代码转换成llvm框架下的虚拟指令形式(有点像做映射?),我们不需要去关注怎么编写编译器的优化,因为llvm框架自己能对llvm虚拟指令进行非常非常多的优化,我们也不需要做我们实现语言跟各种各样平台的汇编的映射,因为llvm框本身架能对llvm虚拟指令与各种各样的平台的汇编作转换。

2023年了,不基于llvm开发编译器都是耍流氓,我说的~~(暴论~~

还有要注意的一点是,就算你对编译器好不感兴趣。这里仍然也有很多你学习llvm工具链的理由,比如它提供了非常多分析你程序的工具(比如分许你编写的程序的性能瓶颈、找出你程序中可能存在的内存泄露

我在这里只介绍了llvm对于传统编译器的意义(比如咱们的c/c++的编译器),但是在很多深度学习框架的底层也是跑的mlir/llvm(毕竟深度学习的代码也需要编译是不是。但是这些就需要更进一步的探索了。

实现计算器捏

好。说了这么多,也该说说这道招新题的事情了,一般来说大家编译器入门的第一个小项目都会是做一个支持四则运算的计算器,注意是编译器不是解释器,咱们写的计算器应该是可以双击运行的程序,而不是依托于一些其他的平台(例如jvm)。

至于招新题目是什么。emm 你猜对了 我们这次的主要内容就是使用llvm来做一个支持四则运算的计算器

但是如果直接让你去学习llvm的框架(对于没有基础的童鞋来说这是十分困难的。毕竟你甚至现在不知道该如何编译llvm-project。所以捏,我们的想法是提供一个利用llvm编写的计算器的源代码,你要做的是学习这个计算器的源代码、在这个基础上做一些拓展(例如支持括号来提升运算的优先级/当除数为0的时候崩溃。。。)

不过这一切有一个前提,就是你得先把llvm-project下载下来并且使用(你心想这还不简单,百度搜索llvm,立即下载x64平台,双击执行不就行了么)呃 可能跟你想的有一点偏差,毕竟其实有很多的东西可以在命令行(或者只能在命令行)下使用 可以想一下自己最初使用git

一般来说我们要使用命令行工具有两种方式(在类unix环境下哈,不要跟我说windows的事情!!顺带一提做这个题目之前有一个类unix系统是最基本的条件,你可以选择linux常见发行版或者macos,虚拟机、wsl、双系统都可以,我是不会去介绍windows下的方法的)

这两种方式分别是通过包管理器(apt/yum/pacman/brew…这个一般是与平台相关的)下载软件和源码编译安装(一个常见的方式是 git clone … && cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --buid build --parallel 4 && cmake --build build --target install)。

如果你是一位green hand,我会非常推荐你使用包管理器来安装任何命令行程序(或者一些有图形化界面的程序),这样会省去非常多不必要的麻烦,毕竟完整编译安装llvm少则半小时,多则两小时(期间还可能会有各种各样的报错)。当然编译安装也有编译安装的好处,就是你可以自由的选择你需要的模块来编译,并且可以编译debug模式来进入程序内部调试程序(不过千万不要以debug模式来编译安装llvm,因为他可能会吃掉你电脑的30G硬盘空间)

下面我就以通过ubuntu下的apt安装 llvm-12 来给大家做一个例子( llvm有很多个版本 我们这里采用的是比较新的llvm12 千万不要安装错版本了)

sudo apt-get install llvm-12
# 等待安装完成后执行下面这条命令 这种命令一般可以用来检验你是否安装好了一个程序 
# 安装后你可以阅读一下由 apt 产生的日志(就是你安装过程中打印在终端上的文本) 里面可能会有一些有用的信息 例如如何初始化或者启动你刚刚下载程序 如果将apt下载的程序添加到环境变量等等
# which opt
opt --version

好 到目前为止你应该已经安装好了llvm-12 了,剩下的就是开始下载我们的计算器了。

# 如果你比较了解git的使用也许会发现这个招新题有一个的小彩蛋
git clone https://github.com/GithubXxz/llvm-calc.git --depth=1
cd llvm-calc
# 构建这个项目 请注意路径是否正确
cmake -B build -DCMAKE_BUILD_TYPE=Release 
cmake --build build
build/src/calc "with a : 3 + 2 + a" | llc -filetype=obj -relocation-model=pic -o exp.o
clang++ -o exp exp.o rtcalc.cpp
./exp

你可以输入一个数字然后回车,看一下输出是否符合预期,你也可以测试一些其他的表达式。

非常建议你写一个shell脚本来完成上述的构建命令

测试了一下基本的加减法功能,剩下的就是阅读源代码,通过debug搞清楚程序执行的流程(词法分析/语法分析/语义分析/代码生成)。对了,这期间可能会用到一个叫做访问者模式的设计模式访问者模式,可以以这篇文章作为一个切入点。

剩下的时间就是在给定的框架对它进行拓展,实现一些新的功能了。

前置内容:

参阅

了解一些llvm的基础知识(SSA/LLVM IR表示)

  • 搞清楚构建命令(clang++、llc)是干嘛用的 为什么要通过这些命令来构建一个可执行程序

要求实现:

  • 实现乘法和除法和正确的计算优先级

  • 实现使用括号来提升优先级 例如 2*(3+2)

  • 跟据源代码中 除法 的注释内容了解(只限于了解哈)一下在除法运算中当除数是0的时候如何触发系统的中端导致程序崩溃

  • 自定义标识符来来定义局部的变量,添加对多次输入值的支持,并且实现赋值表达式

(可能需要重新定义输出计算结果的触发点,分隔符是完全可以自己来定义的哦)

# 例如
with a : int b : b = a + 3 : with m : a = b + a * 10 - m
  • 实现浮点数的计算和存储(可能需要将with改成withint和withfloat和运算时可能需要对整数类型的提升来进行和浮点数的运算)
  • 发挥你的想象力实现任何计算器可以实现的功能(这很重要

学有余力可以了解一下antlr的使用,来帮助自己更加便捷地构建一个功能强大计算器

My First Language Frontend with LLVM

好吧,对于大多数童鞋来说,写一个计算器~~(写计算器真没意思,我要看血流成河)~~完全不能满足大家对于一门编程语言的想象(计算器和c语言这样的编程语言也差的太远了)。

8说了 直接上正菜

Kaleidoscope: Implementing a Language with LLVM

这是llvm官方提供的使用llvm构建一门叫做Kaleidoscope的语言的教程。冲他就完事了

真正有想法要做这道题目的童鞋,可以参照计算器那一节的cmake写法和一些常见的语句的构建(加减乘除和跳转语句什么的构造都是大差不差的),基本都是互通的。有什么问题或者需要什么支持 也欢迎来找我讨论。

要求实现:

  • 构建一门属于你自己的编程语言(其中滋味只有自己写过编译器的人才知道捏

参考资料:

提交内容

  • 编写好markdown文档并且附上你的github项目地址(或者dockerhub项目地址)
  • markdown文档中包含做项目的学习过程和学习/编码的心得体会
  • 详尽的项目部署运行方式

#9 机器学习

机器学习指北

机器学习是什么?机器学习是人工智能的一个重要分支,是一类 “从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法”

机器学习的应用非常广泛,在数据挖掘,计算机视觉,自然语言处理等领域取得了重大的成果。另外,机器学习在就业方面薪资非常可观,其对应的算法岗是薪资最高的几个岗位之一。

那么,机器学习应该怎么学呢?请看下面的新手教程

新手教程

  • 对于大一的同学, 强烈建议先学习一些微积分,线性代数的基本知识,着重掌握偏导数、复合函数求导的链式法则,梯度,向量、矩阵的基本操作(如矩阵乘法)。大一的同学不要跑啊,并不是让你去把微积分和线性代数学完,只是说去大致了解上述提到的概念大概是什么东西就行,浅浅了解上述提到的概念其实就够用了。 有同学可能就要问了,我去哪儿了解这些概念呢?去翻咱们的微积分线性代数课本?大可不必哈,课本上的东西其实挺深奥的,我们对于大一同学的数学要求没那么深。我们在这里给大家推荐一本书《深度学习中的数学》,这本书的第二章介绍了机器学习需要的部分数学基础,浅显易懂,篇幅较短,只要有高中基础便可读懂。这本书的pdf版本放在焦糖招新群(646597830)里面了。
  • 网课推荐《PyTorch深度学习实践》吴恩达的深度学习网课 (这两个网课都很好,个人更推荐前者,上手速度更快,并且使用最常用的深度学习框架Pytorch,大家根据自己的喜好来)
  • 强烈建议大家利用好搜索引擎以及开通ChatGPT,ChatGPT的开通前提是学会科学上网#0 Let’s Warm Up! ,然后注册个Google邮箱(也可以不用注册,QQ邮箱有时候注册不成功),利用Google邮箱去注册ChatGPT,外国电话号码使用虚拟网站的。详细注册过程见视频ChatGPT教程。这个ChatGPT教程将带你感受ChatGPT的强大!ChatGPT将帮你写代码,帮你理解概念,不会的都可以丢进ChatGPT里面试试。
  • Python的学习,python的学习非常简单,大家可以看看廖雪峰老师的python学习文档,看到面向对象编程就可以了(函数式编程不用看)。看视频的话去b站搜一个播放量高一点的python视频就行。一开始学习Python语言时,可以跟着教程或视频中的代码实例进行学习,多跑一些程序可以让你上手更快~

完成度要求

  • 对于大一的同学,至少需要通过task0,task1,task2的考核,完成task1plus的同学(或者对task1plus有思路也可)的同学将赢得加分,另外大一同学若有余力可以对Task3 - Task5做一些了解
  • 对于大二的同学,在大一同学完成的基础上,至少任选task3,task4,task5这三个任务之一多做加分,如果完成task1plus也将获得加分
  • 关于task2, 尽你所能完成(不要求全部完成
  • 不论完成度如何,请仔细阅读每小题的提交内容。

机器学习方向-task0 入门理论基础

做题策略:

  1. 推荐大家先看《深度学习的数学》的一二章完成题2,大家如果嫌看书太麻烦的话,可以看看3blue1brown的关于神经网络的科普视频,了解数学知识点直接维基百科也可
  2. 题1,2,7可以直接利用搜索引擎或者ChatGPT解答(但要理解消化噢,面试的时候可能会考到噢)
  3. 对于题4,5,6,8的知识点均来自《PyTorch深度学习实践》 的1-9集,大家可以移步观看,这里面的数学基础只涉及到我提到的那些,大家大可放心,但是可能涉及到一些python,python的学习教程请移步新手教程,另外如果你看完1-9集,大名鼎鼎的pytorch框架你顺带就学会了,后面的任务你完成起来就更容易了。噢对了,视频中有不懂的地方可以停下来搜索一下或者问问ChatGPT,上课的ppt这个老师也提供了的噢。
  4. 题4,5,6,8其实在吴恩达的深度学习网课 的里面也有涉及,大家也可以观看相应章节(不用全看完容易浪费时间

题目要求:

通过搜索引擎,书籍,ChatGPT了解机器学习/深度学习,理解它们的简单原理,并回答以下问题:

  1. 什么是机器学习?机器学习和深度学习有什么区别?
  2. 请简述监督学习与无监督学习的概念,给出你对无监督学习和监督学习的自己理解和看法。
  3. [重要] 偏导数是什么?链式法则是什么?梯度又是什么?矩阵乘法怎么操作?请仔细思考他们在机器学习/深度学习中的作用。
  4. [重要] 什么是损失函数梯度下降的原理?反向传播的原理?
  5. [重要] 什么是样本(sample)?什么是特征(feature)?为什么要使用激活函数
  6. [重要] 请简述线性回归逻辑回归的概念与基本原理。通过学习,总结出线性回归和逻辑回归的联系与区别。
  7. [重要] 在机器学习中,为什么要将数据集划分成训练集、验证集和测试集?三者之间区别与联系,以及数据集不正确划分造成的影响?我们该如何正确的划分和使用数据集?
  8. [重要] softmax函数是什么?其在机器学习中有什么应用?

作答要求

  1. 分点作答,必要时使用插图;
  2. 使用markdown语言作答上述题目,如果涉及到公式部分,建议稍稍学习一下Latex语法,在markdown中可以内嵌使用,也可以直接插入图片(注意markdown中插入图片能否在其他设备上访问,不能访问将markdown转化为pdf提交)
  3. 本题所有作答均放到名为“机器学习task0”的文件夹里

出题者联系方式:

QQ:2432014203

机器学习方向-task1 鸢尾花集分类实战

做题策略:

  1. 对于观看完《PyTorch深度学习实践》 的1-9集的同学完成这个任务真的是不费吹灰之力
  2. 可能有些同学环境搭建可能会卡住,这里推荐大家利用搜索引擎,搜索“怎么使用anaconda安装pytorch”,anaconda是包管理工具,pytorch是一个深度学习使用很频繁的包。这里有个教程大家可以参考下,李沐老师的《动手学深度学习》网站上也有详细安装步骤。这里也有conda 30的操作步骤、利用其对python环境进行管理
  3. 熟用ChatGPT和搜索引擎
  4. 另外,Pytorch官方文档也可以参考噢,可能是英文的不好方便阅读,可以搜索中文版的。

题目要求

在神奇的泥电校园有一种神奇的名为iris的小草,它分为A、B、C这三个品种,每棵草都有四个典型属性,tsundere studio某个醉心花草的人采集了一百五十棵草,并记录下了每棵草的属性和品种,制作成了一个数据集。接下来,我们的任务便是补全代码,让你的专属神经网络学会根据属性判断小草的品种哦~~

代码框架地址:
链接: 百度网盘 请输入提取码

作答要求

  1. 补全代码并回答代码中提出的小问题,将补全后的代码存为一个名为iris的python文件
  2. 将代码执行结果记录在markdown文件中,另外请仔细研究代码,了解代码里用到的机器学习知识,了解模型的一般搭建方法(init(),farward(),test()函数的功能)(面试可能会询问代码中的重要知识点
  3. 本题所有作答均放到名为“机器学习task1”的文件夹里

出题者联系方式:

QQ:2432014203

机器学习方向-task1Plus

做前必看:

强烈建议大一同学完成task0,1,2后再试着完成task1Plus,大二同学在以上的基础上完成task3,4,5中任选一种后再来完成此题。此题不管是对于大一和大二的同学来说都是加分项,这道题非常综合,涉及到数据处理,特征工程,模型选择等流程,比较复杂

做题策略:

  1. 了解什么是F1-score
  2. 了解下实用机器学习
  3. ChatGPT is all you need!
  4. kaggle上看看他们是怎样处理类似数据集的

题目要求

在神奇的泥电校园还有另外一种神奇的名为siri的小草,但它的却有0,1,2,3,4,5这六个品种,每棵草竟然有107个典型属性,有的典型属性竟然缺失了,tsundere studio某个醉心花草的人采集了11000棵草,记录下了每棵草的属性和品种,分别制作成了两个数据集:train_data.csv, test_data.csv。接下来,我们的任务便是在利用机器学习知识,在只利用训练集的情况下训练一个模型(决策树、神经网络等都可以),在测试集上进行测试,要求使用classification_report()函数,在测试集和验证集上打印出类似如下的报告表。对了,我们的评价指标是每一类的F1-score。要求训练集f1-score整体在0.9左右,验证集f1-score总体在0.85左右(达不到也没关系,但不能太低),我们算整体F1-score时,先算法每一类的pecision和recall的加权平均:

数据集:train_data,test_data

数据集下载链接:百度网盘 请输入提取码

作答要求

  1. 提供源代码
  2. 提供训练集和测试集上的分类报告截图(类似上图)
  3. 实现思路.md
  4. 将文件归纳到名为“机器学习-task1plus”的文件夹中

出题者联系方式:

QQ:2432014203

机器学习方向-task2 手写数字数据集(MNIST)识别

视觉帮助我们捕获颜色、形状、大小、距离、运动等多种维度的信息,因此大部分的感知和认知过程都依赖于视觉。可以说,视觉是我们与世界互动的重要桥梁。

那么计算机如何处理视觉信息呢?作为人工智能发展不可或缺的驱动力之一,计算机视觉将给出答案。

题目背景:

MNIST数据集是一个手写数字的灰度图像数据集,包含 60,000 个示例的训练集和 10,000 个示例的测试集。历史上,很多机器学习领域的研究者采用了各种方法处理这个数据集,只为在识别精度和识别效率之间达到理想的平衡。我们的任务是依照代码与教程1:74行Python实现手写体数字识别或者代码与教程2:搭建BP神经网络实现手写数字识别复现这个项目,即,使用机器学习方法来识别这些手写数字的图像。

做题策略:

  1. 建议完成该任务前先观看《PyTorch深度学习实践》 的第10集
  2. 对于本题的初步要求,
  • 先完成初步要求中的第1题可以帮助你快速了解这一领域!
  • 其次,你需要学习BP神经网络的底层原理。相信在完成task0的基础上,你已经了解了一些机器学习的入门课程和信息检索渠道。利用它们来学习这些知识吧,先学习对应的理论知识再做实践可以帮助你始终提纲掣领~
  • 再次,你已经拥有了足够多前置知识。你应当在代码与教程1:74行Python实现手写体数字识别代码与教程2:搭建BP神经网络实现手写数字识别中任选其一,耐心阅读,并将其中的代码复现。记得下载数据集MNIST数据集
  • 复现代码的过程中,你首先可以搭建一个与上题不同的新环境,避免与上道题目的环境版本产生冲突(不同项目使用独立的环境是版本管理的好习惯)。其次,将资料中的代码复制到py文件中进行测试与修改。过程中可能遇到一些问题,比如代码错误版本不兼容。善用搜索引擎来解决它们吧!(如果采用python2版本的代码,可对比不同python版本的语法差异,考虑如何使用python3实现同样的程序操作)
  1. 针对本题的进阶要求,
  • 对于第1题,可以利用先前的学习资料仔细学习一下神经网络的相关概念,结合Pytorch入门这一教程可以更快上手搭建神经网络。
  • 对于第2题,可参考数据集下载链接MNIST数据集中的论文,或互联网中的有关卷积神经网络的教程。
  • 如果你做到了第3题,就请展示你的信息检索能力与代码理解力吧!

题目要求:

初步要求

  1. 首先,简要回答以下的开放性问题可能会帮助你更快地了解这一领域:
  • 有哪些常见的图像格式?计算机采用什么数据结构存储、处理图像?
  • 常用的图像处理编程语言?
  • OpenCV是何物?
  1. 成功运行两个代码中的任一个代码,记录训练结果。(思考:我们如何评估训练结果的好坏?尝试其他可能的指标)
  2. 回答问题:源代码中如何读取并处理图片数据?采用什么方式进行训练?训练何种结构的网络?

进阶要求

  1. 如果你对源代码已经了然于胸,请尝试修改网络结构(加深网络结构),看看效果如何?
  2. CNN是一个强大的网络结构,试试能不能用在这里?
  3. 除了BP神经网络以外,还有很多实现手写数字识别的方案。尝试使用其他策略,或者试试势大力沉的OpenCV能够在这个项目中起到什么作用?

作答要求

  1. 记录环境配置和调试代码中遇到的困难,以及你的解决方案
  2. 对初步要求中问题的回答
  3. 能够顺利运行的代码,其中包含你的注释
  4. 如果能够完成进阶要求(不一定要完全完成,有思路也可以),也请提交你的成果
  5. 本题所有作答均放到名为“机器学习task2”的文件夹里

出题者联系方式:

QQ:2835982753

机器学习 方向-task3 NLP实战

题目背景:

本题基于论文Hierarchical Multi-label Text Classification | Proceedings of the 28th ACM International Conference on Information and Knowledge Management

在开始对论文的学习前,你需要以下的前置知识:

  • 区分multi-label classification&multi-class classification

  • Hierarchical multi-label text classification (HMTC)任务是什么?

  • 收集资料并思考:如何让计算机感知到并有能力处理人类的语言?人类语言中的每个词都需要输入给计算机处理分析吗?

  • NLP任务的一般流程有哪些?分词&去除停用词是干什么的?

  • 词向量/word2vec是什么?语料库(corpus)是什么?

  • Attention机制

  • recurrent network

  • LSTM&Bi-LSTM

本题任务(提交要求):

本题锻炼大家的论文阅读能力和实验复现能力。具体完成结果不固定,重点在于 解决问题的过程 和 **个人的思考。(结果不重要,重点在过程!!)**你可能会遇到很多报错,环境冲突也好,代码缺陷也好,都是很常见的。尽量详细记录学习过程和解决问题过程,即使最终结果没做出来,我们也能看见你的努力~

三个任务由易到难,大家尽力而为就好。你需要写 一份 记录了学习过程和你的思考(如果有)的 md文件 ,提交题目时,将md文件和代码打包,文件夹命名为" 机器学习 task3"

如果中间卡住了,可以转战下一道关于Graph的题目~~

Task 3.1

一边阅读本题论文一边学习上述知识点,用自己的语言 ,在要提交的md文件中,写一些学习笔记,不接受长篇大论,不接受复制粘贴。(加分项:有自己的思考) 学习过程中,可以尝试使用一些工具包(gensim、nltk等)进行分词的实验词向量的实验 等实验,写入学习笔记中。学习和实验的内容是灵活的~ 与本题相关的,任何你感兴趣的知识点 /实验都可以写进去。

Task 3.2

复现论文实验(在你的电脑上,让实验代码跑起来)

  • Github上可以找到源码

  • 尽可能地写出你认为重要的代码(函数)的 作用,用注释的形式附在代码对应位置。

  • 如果能成功地运行源码,在md文件中附上运行结果的截图,并和md文件打包提交。

  • 再说一遍,最终没有成功跑起来也没关系,在md文件中详细记录你的 学习过程解决问题的过程 ,出题人会看到你的努力!

Task 3.3

针对论文的关键思路,你有没有什么改进的想法?如果有,写入md文件中。

出题者联系方式:

QQ:1847325400

机器学习方向-task4 图的节点嵌入,节点分类与整图分类

CV和NLP处理的都是结构化数据,而Graph和他们很不一样。此图非图像的图,回想离散数学中的“图”,这是一种非结构化的数据。现实世界许多数据都是非结构化的,例如社交网络、复杂的文件系统、分子结构等等,如何处理这类数据对我们实现产品精准推荐、分子结构预测等现实问题大有帮助。我们使用APP时收到的很多相关推荐,内容推送,广告投放等等很可能背后用到的都是图神经网络噢。

做题策略:

  1. 由于接下来的任务需要用到GPU,搭建环境的方式有两种(强烈推荐第二种):
  • 如果你的电脑拥有独显,那么可以在自己的电脑上搭建一个深度学习所需的python环境,并且配置好显卡版本对应的CUDA(血泪教训😭)。可以使用anaconda搭建虚拟环境,深度学习框架墙裂建议使用Pytorch!!!
  • 如果没有独显,那就需要借助各种人工开放平台啦,例如colab、矩池云(还有很多很多,随便使用哪一个啦,并没有要求) 可别被这些名字吓住噢,其实配置起来并不麻烦,不仅免费,而且速度可不是一般游戏本显卡能比的。掌握此类平台也会让你日后的研究工作更加便捷,一劳永逸,何乐而不为呢。其中colab更推荐,建议直接把我们的.ipynb文件丢到colab中去跑。
  1. 在进一步了解之前,可以先理解以下几个问题:
  • 如何将现实生活中的数据抽象为图?例如引文网络、社交网络、分子结构……
  • 我们是采用什么数据结构来完整存储一个图的信息的。
  • 图神经网络的输入和输出是什么,它的作用是什么(类似普通的神经网络)
  1. GCN看这篇blog就够了,无非就是比MLP多了点参数,多乘了几个矩阵。如果想加深理解的话,可以看看李宏毅老师关于GCN的讲解(17-19)
  2. 图节点嵌入的话可以看看这篇blog
  3. NetworkX跟着这份文档NetworkX敲敲就没问题啦!Pyg框架的话,可以看看这份PyG入门blog哈,不会的函数也可以在PyG官方文档上找一找。
  4. 做题过程中一定要善用ChatGPT和搜索引擎噢,ChatGPT的威力是很大的,另外提醒大家一定要搞清楚模型中输入和输出类型
  5. 本题会对图的嵌入,图卷积神经网络,以及节点分类任务,整图分类任务详细考察,代码不难,面试的时候会着重考察大家对代码的理解

Task 4.1 节点嵌入的学习

Task 4.1 提交要求:

  1. 补全文件task4.1_node_embedding.ipynb中的代码,使得该文件能够跑得通,将该文件中的所有block全部运行一次再提交,文件命名为“task4.1_node_embedding_answer.ipynb”
  2. 对最终的训练结果截图,命名为“4.1训练结果.png”

Task4.1代码文件下载:

Task4.1 code source

Task 4.2 节点分类任务和整图分类任务

Task 4.2 提交要求:

  1. 补全文件task4.2_PyG_practice中的代码,使得该文件能够跑得通,将该文件中的所有block全部运行一次再提交,文件命名为“task4.2_PyG_practice.ipynb”
  2. 分别分析节点分类任务和整图分类任务的实验结果,希望展现你的思考,将实验结果和结果分析均放到名为实验结果的markdown文件中
  3. 完成Task 4.2 提交要求后,请教task4的作答全部放入

Task4.2代码文件下载:

Task4.2 code source

出题者联系方式:

QQ:2432014203

机器学习方向-task5 Efficient Ai – Data Condensation

这一天,炼丹师小十一正在对着海量的数据狂刷自己方法的性能,在她第n次run起她的main文件,发现还要20h+才能跑完时,疲惫感与急躁油然而生,看着自己的4090,小十一陷入了沉思…

很多人认为,包括但不限于LLM(large language model)在内的众多深度神经网络(DNN)能够发展至今,不断产生亮眼的表现,数据的功劳得占到70%,海量的数据堆叠是AI能够得到启发的不可或缺的前提。

但是,日益增多的数据也导致了这样的问题:想训练更牛的模型,就要喂更夸张量级的数据。那数据越多,训练成本(包括但不限于对于GPU的要求)也就越来越高,数据量年年膨胀,但是总不能让所有researcher年年买V100,A100吧?

因此,数据集压缩,在近年来给出了一份让researchers眼前一亮的方案!

首先,在探索这一领域时更关注以下问题,或许会让你建立更全面的理解:

  • 目前,数据集压缩方法可以分为哪几个大类?
  • 这几个大类的方法分别立足于什么样的出发点(理论的依据是什么)?
  • 这几个大类的方法分别有什么优势,又存在什么样的局限性?

下面几篇是你入门这个领域大概率需要阅读的文献,耐下性子,仔细探索这个有用又有趣的领域吧!

(tips:如果你是第一次看文章,那你大概率会被一些唬人的,翻译引擎都解决不了的句子难住,但是不要着急,耐下性子,借助gpt跟知乎上的一些博客,你一定会逐渐了解这一套唬人的话术!加油!)

题目要求

初步要求
  1. 仔细阅读以上给出的文献,当然,可以阅读更多其它文章获得更全面的了解!
  2. 尝试对以上三个问题给出你的答案,但是,我们需要的不是简单的标准答案,而是你聪明的脑袋里闪闪发光的想法!
  3. 尝试对于你想到的局限性做出一些你能想到的改进,此处不必给出实现,但一定要有思考!不要怕觉得没用!
进阶要求

(这一篇文献是有关Graph的数据压缩的,如果你已经完成了Field4中的部分or全部任务,那么你对于Graph的了解已经足够深刻啦,如果你没有完成Field4,请去了解一些Field4中提到的Graph相关的前置知识再来完成该题,对于Graph的学习过程同样需要记录。)

  1. 复现 [2110.07580] Graph Condensation for Graph Neural Networks 中的内容,成功运行代码。
  2. 完成 [2110.07580] Graph Condensation for Graph Neural Networks 中对于Cora,Citeeseer所做的**所有实验。**同时思考,为什么那么大的Graph数据能被压缩成这么一丢丢东西还能使模型保持性能?
  3. 思考 [2110.07580] Graph Condensation for Graph Neural Networks 中的方法是否可以被改进,如果可以,可以从哪些方面(角度)?不用给出代码实现,但需要你有一个完整的思路以及这个思路的动机,或者一个新颖的角度。

提交内容

  1. 记录运行代码过程中遇到的困难,以及你的解决方案(一个优秀的科研工作者需要很清晰的research log)
  2. 对于初步要求中每个问题的回答,再次强调自己的思考很重要!
  3. 对于进阶要求中的内容,提交你运行过程的截图(log),完成多少就提交多少。
  4. 对于进阶要求中的思考,需要给你的思路或想法画一个清晰的流程图,反映你的动机与做法(别被这题的样子吓到!这一题的代码量并不大,加油完成它吧!)
  5. 本题所有作答均放到名为“机器学习task5”的文件夹里

出题者联系方式:

QQ:1878981292

#10 Database

Task 0 前置技能点

提醒:本题较难,相对其他题性价比不高。推荐大二对KV存储系统感兴趣的同学完成。

为了完成本题,你的技能树需要点出以下前置技能点:

  • C++基本语法
  • 阅读大型系统源码的能力
  • 自行查询和解决问题的能力
  • 克服困难的决心和毅力

Task 1

以RocksDB为代表的KV键值存储系统是目前被广泛应用的数据库系统之一,在本题中你需要阅读它的最初始形态——LevelDB,并完成以下任务

  1. 运行代码
  2. 对该系统进行测试,工具和负载自选
  3. 阅读关键代码
  4. 给出代码阅读报告

Task 2

尽管当前的RocksDB已经非常成熟,但仍存在诸多未被解决或者发现的问题。对于这些问题,全球的研究人员提出过不同的解决方案。请你搜索相关论文,针对某一方面形成一篇综述。可能的方向包括但不限于

  • Scan的性能问题
  • 尾延迟问题
  • 读写放大问题
  • GC问题

Task 3

你现在已经阅读过很多此方向的论文了,相信你对于此方向的问题也有自己的看法。请对于此问题提出自己的修改意见。

加分项:

对于你提出的修改意见,进行源码修改并进行Benchmark测试。

Ps

  1. 所有文档需要使用飞书云文档完成,最后上交材料为一个包含一个飞书云文档链接的txt文件(请注意开放云文档权限为“组织内获得链接的人可阅读”)
  2. 如果你进入了面试阶段,你将被要求做一个10分钟以内的报告,以简短介绍你在此方面的认识和工作。
1 Like