2017联创夏令营总结

2017年的联创夏令营结束了, 惯例的一篇总结0w0

学习内容

Sanic

  • 最初是看到 Sanic 比 Flask 还轻量, 而且还是个较新的框架, 所以才打算学学看, 实际上优先级不高. 结果后来发现它是基于 uvloop 开发的, 效率是 NodeJS 和 gevent 两倍, 已经达到接近 Go 的程度 (PS:见文章 uvloop: Blazing fast Python networking), 让我想起前几次写后台的教训 (主要是服务器性能不足和来不及进行优化和部署的原因, 不能实现上线后的 demo), 而且也赶上秋招的后台开发, 所以便提高了优先级, 先学习了这个框架。
  • 在学习之后发现这个框架就是 Flask-like 的, 所以有了 Flask 基础学得很快, 实际写起来也没遇到什么大坑。看了源码, 基本全是异步IO协程进行, 所以写出来的服务器性能的确很好(之后在秋招部分有提到). 但是由于框架本身很轻量, 同时也算是一个较新的框架, 它的扩展库还不是很完善, 不过基于 asyncio 的库已经很多, 所以自己包装一下就可以做成 Sanic 的扩展了. 我在开发秋招后台的过程中也有修改了 Sanic 本体和它一个扩展库的源码来满足自己的需求(同在之后秋招部分提到).
  • 最后有一点要提到……不知道 Sanic 的维护者是怎么想的, 文档中并没有提到 PyPI 中的版本与 GitHub 和官方文档上的版本已经相差甚远大概一个月左右(PS: 8月3号已经更新了PyPI上的版本与GitHub同步……). 运行时候还以为自己代码的问题, 最后要自己装了库之后手改库的源码emmm……虽说可能想累积一下要修改的内容再一次性更新, 但是官方文档已经提前更新了许多天而且安装方式仍为通过 pip 安装且对版本未变更没有任何注明, 也算是有点坑人吧……

Semantic-UI

  • Semantic 这个库, 是打算作为 BootStrap 的替代品而学的, 毕竟后者已经烂大街了而且不觉得怎么好看, 而Semantic在知乎和其他地方也经常看到, 所以打算配合手头的几个项目来使用一下练练手.
  • 首先是之前春招写的熬测页面, 当时为了快用的是 BootStrap. 现在打算完全用 Semantic 把它替换一遍(双主题2333). 这个页面除了一个进度条全是静态的布局, 要替换的基本就是布局和样式. 这个过程我发现 BootStrap 和 Semantic 的不同点主要在于:

    • 尽管类名均为语义化, 但是两者的命名风格完全不同……
    • Semantic 的样式必须加上 ui 这个类才会生效, 可能是为了区分.
    • Semantic 的类是组合式, 例如”ui button primary”, 而 BootStrap 只是语义化的单个类名”btn-primary”
    • Semantic 库的体积比BootStrap大, 不过可以选择编译, 只选取自己需要的效果
    • Semantic 的自适应支持比 BootStrap 差一点……(可能是我用的有问题, 不过我自己的感受是这样的
    • Semantic 的类有点乱, 复用性提高了但是反而不如 BootStrap 那样易懂了
  • 之后便是秋招后台的页面了, 这个页面有一定的动画和功能需求, 所以我用到了 Semantic 的动画库, 它的 JS 代码也是基于 jQuery 开发的, 但是不同于 BootStrap, 它加上类名后还要在 JS 代码中启用. 而且官方文档里面的示例代码有时候莫名其妙用不了, 非得用开发者工具参考它的 demo 页面代码来学会使用方法……所以虽然它的动画库很丰富, 我也觉得用的很难受……当然最后效果还是很不错的.

Socket编程

  • 学 Socket 编程主要是有个项目要用 C++ 写个 C/S 的网络打印机程序. 因为我负责的服务端是基于 Windows 的, 所以主要是学习的 Winsock. 内容就大概是 Select 模型, 处理客户端发来的请求以及接收文件并返回数据.

PHP

  • PHP 也是因为有个项目之前的代码是用 PHP 写的, 现在需要重构于是就来学世界上最好的语言了233. 不过学了一部分内容后, 看了看项目发现太复杂太乱了……与其重构不如直接重新用 Python 写一遍, 而且还有数据可视化的需求, 直接将后台改为 Python 更方便. 大概就学到能看懂代码的程度, 一些框架什么的没看.

比赛/项目

Hackinit

  • 这次比赛我和柳泓鑫, 梁志博, 洪志远一队, 我们做的作品是一个学英语口语的产品, 想法是通过口型以及发音两方面的数据来给用户的口语水平进行打分并指导他们提高口语水平. 我主要负责的是后台部分, 需要完成的内容是一个 API 服务器, 要求能够实现用户系统, 并对前端发回的数据进行分析处理打分, 然后将结果再返回给前端.
  • 最终前端使用 Vue ,后台使用 Flask 完成. 首先用户在前端按所给句子进行阅读, 前端通过 WebRTC 技术来进行录制, 得到视频. 发音分析由英语流利说的 API 来实现, 这里它会对用户所念到的单词分析, 返回时间点. 然后后台程序根据时间点处理用户发音时录制的视频, 截取一定的关键帧, 将其交给微软的人脸识别 API 进行处理, 得出嘴型的数据点数据, 最后按算法进行分析, 得出口型得分, 前端综合两个得分, 以数据可视化的形式给出结果.
  • 最后拿了个最佳 AI 应用奖……个人感觉还是有很多不足, 首先是 Vue 的 HTTPS 没能搭起来(WebRTC 要求协议必须为 HTTPS), 导致只能本地演示. 其次是最后给评委演示打分时候, 采光不好而且现场有点吵, 并没能够完美的演示功能……有点遗憾.

    秋招H5后台

  • 嘛, 这个锅接下来不觉得多难, 毕竟后台就只有一个报名接口. 需求不如前端那么多, 技术上也没前端那边那么麻烦(心疼柳泓鑫juju哈哈哈). 需要完成的内容同样是一个 API 服务器, 接受前端发回的报名数据以及简历文件, 处理后存入数据库, 然后有一个对应的前端页面能够查询就行.
  • 这次我选择的是 Sanic 框架来完成. 接口什么的一样普通普通的写. 操作数据库这块我用到一个叫 Sanic_Mysql 的库, 它是基于 aiomysql 来写的, 而 aiomysql 又是基于 pymysql 和 asyncio 这两个来写的, 源码我又基本都看过, 所以在用这个库的时候我自己也写了点内容丰富了一下功能, 然后提了 issue 和 pr 到 Github 上了, 作者也立马就 merge 然后发布了新版本, 虽然只是个不知名的小库但是我还是十分开心2333. 之后便是后台的前端页面, 用上了 Semantic, 个人感觉还是很不错的, 反正没设计, 稍微好看点就不错了.
  • 当然用了之后还是测试了一下的. 在我的 DO 乞丐机(1核512M内存)上, 直接用 python 指令跑 Sanic, 不包 gunicorn 的情况下, 4个 worker 处理同时发过来的1000个请求还是很快的(大约1s左右), 而且很有可能是数据库操作拖慢了处理速度……还有就是因为服务器处理很多请求时内存不足导致MySQL服务器关了, 搞得我自己以为代码写的有问题, 研究了好久噗……

自我小结

  • 这次夏令营的话, 感觉很不错, 首先30多天中有和聚聚们一起打比赛一起出去玩的经历(虽然这些不是夏令营的内容233), 十分丰富, 同时在团队每天也有大把的时间给自己静下心来学习新姿势和写代码做项目, 感觉比平时上学时候效率高了不少, 接下来就好好玩玩放松吧w.