VCMINI脚手架
准备跨入大学阶段之前,产生了一个不太实际的想法:自己实现一个PHP脚手架,又是一次说干就干,大概花了三个星期的世界终于把这个“框架”完成了,现在看来这根本不能称为框架,它实在过于简陋,后面还花了一些时间整理出开发文档,算是一个黑历史吧,源码我也干脆放出来供大家嘲笑了:https://gitee.com/vblog/VCMINI
新毕设外包
在进大学前我提前潜入了这所学院的各种新生群,甚至还混上了管理员,并设置自己的群昵称叫:拿起我的40米大刀,简称大刀,所以我在这所学校的大部分时间里都被叫做大刀,有一天一个计算机应用专业的师兄找上了我,问能不能帮忙有偿用PHP实现一个论坛系统来完成他的毕业设计,我依然没有收费,摆着经验比钱重要的想法直接开干,反正上次不刚实现了一个“框架”么,直接拿来操练,花了大概三天左右的时间,这个论坛系统新鲜出炉了,包含了论坛用户端应该有的基本功能,后台倒是来不及做,不过已经达到标准了。
个人博客
一如既往,我不是一个喜欢看书和视频的人,但是对于搜索引擎倒是情有独钟,经常能在搜索结果看到各位大佬的个人博客,甚是羡慕。想着我自己也搞个博客玩玩吧,当时Hexo这类优秀的轻量级静态博客框架还未出现,又不想使用笨重的WordPress,索性继续拿之前的“框架”继续用吧,页面上用上了CSS3的媒体查询做好适配,经过两三周的努力后,终于把基于VCMINI的博客站撸好了,可以自适应PC和手机端。
图片自动压缩器
在写博客时发现收集大量图片时部分图片大小过大,但是图片在网页中经过缩放后并不需要过高的图片质量,因此将每张图片进行压缩是件比较麻烦的事情,当时还没用上OSS自动图片瘦身就用C# Winform写了个监听文件夹自动压缩图片并存储的工具,可以通过图片后缀或体积对文件进行过滤并进行有损或无损压缩,本质上是调用了jpegoptim。
科创工作室
我进入了大学,在军训开始之前有位15级师兄见我在群里经常科普一些编程知识就来问我要不要进入科创工作室,我一听那可来劲,工作室才刚成立不久,来得早不如来得巧,于是在经历惨烈的军训后我这个16级的新生就和15级的师兄们一起进入了工作室,能够在一个3B大专获得这样的机会是不容易的,这里的空间虽然比较大,但由于刚建立许多设备并不齐全,甚至网络都还是从楼下办公室通过窗台接网线拉上来的,不过后面加上了终于接入了学校网络并新增了交换机,座位方面也只有从指导老师那边搬来的6张办公桌,桌子面对面排成了两列,刚来时发现师兄们已经坐满了这些位置,而我就直接坐到了这两列的夹缝之间,在这个位置还能和师兄们高效的吹水,实乃风水宝地,有了工作室这样的环境和氛围,让我成长的更快了,这些师兄们都很棒,后续随着工作室成员的增加后续也安排上了统一的工位,我也荣幸的在工作室15级师兄换届时成为工作室的负责人,很感谢工作室的指导老师曾昭江老师,他为我们工作室成员做了很多事。在这里我仿佛看到了一个编程社团应当有的样子。
蓝桥杯
蓝桥杯是全国性的信息技术专业大赛,作为整个院校里比较具有竞争力的工作室成员们自然会被优先推荐去参加此类比赛给学校争点面子,我很早就有了解过这个比赛,参加以前更多的老印象是算法题为主,参加之后发现原来不全是算法题,也就是多练多刷题是可以获得比较好的结果的,就是考场提供的编译环境属实有点落伍。对算法的恐惧依然让我至今都不想再次参加此类非项目应用类的比赛。
打卡系统
科创工作室的人员并不是固定的,随着进入工作室的成员越来越多,为了能够了解大家的考勤情况,需要有一个打卡系统,于是我拿出自己的树莓派作为Web服务器并接入工作室内网,基于VCMINI搓出了一个打卡系统,这个系统只能在工作室的内网访问,并且账号与每个人的静态IP地址绑定,因此在不动用小聪明的情况下,是无法在人未到达工作室的时候完成打卡的,这个系统会记录每个人的在线时间,这在后面改为采用iBeacon基站签到让方案更加周密。
机械键盘
有很长的一段时间,机械键盘突然火了起来,敲打多年薄膜键盘的我正好也想换一把机械键盘试试,先仔细了解了各类关于键盘轴的评测,最后我选择了不会太吵但手感也不会太硬的的茶轴,很多人都表示茶轴用起来和薄膜键盘差不多,但我在实际体验久了之后发现区别还是很大的。购买的是Varmilo阿米洛va87m,这把键盘至今已经接近6年了,目前还在用,没有出啥问题,还是挺对得起六百多的价格的,刚到手时第一感觉就是很重,外壳是很厚实的金属材质,键帽是侧刻的PBT,后面实在用不习惯侧刻键帽还是买了一套正刻的键帽换上去了。在他之后也曾试过青轴的IKBC Poker2和NiZ的静电容的键盘,可是最后还是觉得茶轴最适合我的手。
Intel电脑棒
大概是看一些奇怪的评测视频发现了Intel的Win10电脑棒,脑子一热居然真的在某宝买了一支回来,CPU是凌动Z3735F,存储空间只有32GB,内存有2GB,体验上是非常的平庸,几乎只能用来应付Office全家桶或看看一些视频,拿来正式办公还是打消想法吧。
内存扩容
我在用的电脑一直都是高中时最开始摸的那台宏碁笔记本,它2GB的内存在奋斗多年后已经完全不够用了,内存经常都是100%占用,整机性能被配置的水桶效应拖慢,虽然内存不够可以拿硬盘空间作为虚拟内存来凑,但硬盘的读写速度相比内存简直惨不忍睹,作为最短的这块木板,自然是需要被优先处理的,幸好这笔记本还留了一个内存插槽,直接在某宝买了条同品牌的4GB内存条,拔掉电池然后插进内存槽,开机后内存就是6GB了,这是第一次升级内存的经历,内存升级后在体验上获得非常大的提升,电脑上的i3-2312M处理器仿佛还在说爷可以再战十年。
游戏本
虽然之前为老笔记本升级了内存,但为了能够更畅快的编码体验,家人打算斥巨资给我换台电脑,这次我进了“革命军”,机械革命x6ti,这是我比较后悔的选择,虽然配置方面性价比是比较高的,处理器i7-7700HQ、显卡GTX1050显存4GB、DDR4-2133运行内存8GB,磁盘是128GB固态+1TB机械,但是重量和续航方面离谱得惨不忍睹,重量是我原本笔记本的2倍还多,续航也只能坚持1个多小时,再往后查询该机器甚至已经停止销售,官方还透露此款机器电源设计存在问题,这让我对游戏本失去了信心,发誓以后绝对不买游戏本。
锐捷交换机
工作室在运行很久之后才终于有人过来把网络正式接入学校内网,然后给机柜放了两台锐捷交换机,我给每条线的机位进行了标记和接入,看到交换机上有个Console口,很好奇,但当时对交换机并不是很了解,尝试过拿普通网线接Console口和电脑并不能通信,经过一番探索后才发现需要用专门的Console调试线,在某宝上购买后拿回来一顿折腾,大概了解了一些关于锐捷交换机的配置并且尝试了以下,可惜这个交换机似乎并非网管型交换机,无法实现太多的功能,这段经历让我对交换机有了更深入的理解。
微信小程序
微信在17年1月9号正式发布了微信小程序,距此不到一周时间就有人在QQ里找到我,是一家老家本地的公司老板,直接问我能不能做微信小程序?在这之前我没看好小程序的发展前景,认为它不可能替代APP,直到后面才想明白,小程序的出现本来就不是为了代替APP。这个老板像做一款点餐平台小程序,不是专门为某个商户定制的点餐程序而是所有商户都可以加入平台,像美团那样,当时的美团在四线城市还未铺开。这个公司很小,没有任何技术人员,我答应了他,放长假时回老家时就到公司办公,平时就线上兼职办公,任职开发工程师,薪资方面全职4k兼职2k,其实当时就基本是抱着积累经验的想法去的,所以对薪资没啥要求。老板给这个小程序命名为:粿团点餐,为了开发这个小程序花费了大量的时间去跳各种奇奇怪怪的坑,如果说现在微信小程序的坑是一座大山那当时就是整座太阳系。后端方面我也花了大量时间精力去研究,并且从PHP+MySQL的组合逐渐转向尝试Node.js+Redis+MongoDB的组合,因为发现PHP的单线程阻塞在处理实时通信上有点捉急,比如WebSocket,虽然可以使用swoole框架,但我也想尝试一下更新的东西。这是我从以前到当前为止能力全面提升最快的一次,基于koa2框架实现了API服务,在实践中不断的改进代码,对缓存层的重要性也有了深刻的认识,接触了更多类型的数据库,尝试了接口压测,了解了许多语言特性,在Node.js上也用上了ES7的部分语法,当时的Promise还不是原生的需要通过Q模块实现的、还有研究过Electron、系统驱动等等。微信小程序这边的库和界面就全部由自己设计和编写了,这个界面确实丑爆了,在审核上线方面也有面临着巨大麻烦,由于涉及餐饮服务,审核是对经营范围有要求且是需要许可证的,所以给小程序做了和隐藏后门,审核时给审核人员看的就是个菜单,上线后其实就是具有点餐功能的,这种方式前期还是挺奏效的,越往后微信团队的审核就越来越严格了。不过最后项目是失败的,很明显,我和老板都犯了几个严重错误,首先不应该把一个小程序做得跟APP那样功能齐全、也不应该选择一个过于难以记忆的名称:粿团点餐、甚至没有好好规划开发计划,全程都是我或者他想到什么就做什么,也没有进行足够的市场调查、最核心的还是资金不足,老板做这个的资金只有20万。虽然抢占了小程序市场先机,但各方面的资源、战略、计划、技术、人员全部条件都不成熟,直接导致这个项目崩掉。之后老板还想换个方向做,可惜资金已经花完,我做到后面也有气无力的撑了两个月,不想再做了。虽然最终结果是失败的,但不失为一次里程碑式的经历。
微信支付
在上面提到公司就职的时候,因为涉及在线点餐支付,就第一次接触了微信支付的API,这也是第一次面对各种数据签名、加密解密的场景,这让我在数据安全方面有了不错的成长,对以后尝试的各种安全加密有很大的帮助,老板还在客服那了解到服务商主体的话可以有更低的手续费,而服务商和普通商户的API又是不一样的,这一波折腾过后算是锻炼了一把看文档的能力,最后成功在小程序接入了微信支付。
Electron
依然是在以上这家公司的经历,老板希望不仅实现用户和商家端的微信小程序,还想要有PC端的商家系统,原本是想吃老本用C# Winform开发,但在发现Node.js无限的潜力后我决定使用Electron实现这个桌面程序,Node.js的实现能力当时就可以涵盖到前端、后端、桌面应用、安卓应用、iOS应用、嵌入式应用,而Electron就是Node.js在桌面应用方面的应用典型,它的成功典型案例就是大名鼎鼎的Electron,不过在开发过程中也会面临各种坑,比如打包大小过大,因为它是运行在Chrome的V8内核的,所以会依赖浏览器导致打包时会把内核也打包进去,后面通过裁剪解决了。但是最印象深刻的还是一个硬件相关的需求,老板希望这个程序能够控制接入电脑的小票打印机打印点餐单或结账单,如果是C# Winform我肯定能够实现,毕竟存在API可以直接调用,但Electron可不一样,为了实现这个需求,在github各种查找之下,终于通过安装zadig这个通用的USB驱动实现Electron调用小票打印机打印内容了,可是内容却是乱码,但以往N次的调试经验,马上意识到是字符编码问题,在改为兼容的GBK编码后就打印出了正常字符了。
iBeacon
在看微信小程序文档时偶然发现有iBeacon信标相关API,这促使我去了解它,发现它通过蓝牙BLE实现信号发射和定位,它可以广播自己的蓝牙ID,设备可以感知iBeacon基站与自己的距离,多个基站还能实现设备位置定位,那样就可以有很多应用场景了,比如活动出席手机签到,能够提供场馆导游、室内定位等功能。
Markdown
在上家公司任职时由于需要写接口文档,在挑选了一些文档工具后,最后决定使用Markdown来写,事实证明它确实很适合编写文档,可以通过特定的符号组合解析出不同的效果,还可以内嵌HTML、图片、表格、列表等等,十分方便,而编辑Markdown的编辑器使用过马克飞象和MarkdownPad2。包括这个博客的所有文章都是使用Markdown编写的。
Nginx
在尝试过众多Web引擎之后,发现Nginx是非常能打的,特别是在静态文件请求处理、请求代理等方面性能都很出色,在之前Node.js写的API服务上就成功使用Nginx代理了SSL实现HTTPS,还可以实现负载均衡减轻单机压力、分离Vhost,甚至还能通过插件实现许多神奇的功能,比如还能够通过插件对直播流进行hls分片,实现能够在网页上访问m3u8索引播放直播内容,几乎没有什么流量是它无法作为中间层处理的,Nginx从某种程度上就像一把瑞士军刀。
电台故事
我曾经很喜欢听网易云上的一个电台节目,节目名称为:伦敦华语电台,还有真名称是叫:鱼乐七天,节目主播是一位非常乐观向上的小姐姐,她叫子涵,听众们称之为“子涵姐姐”,在英国伦敦工作,拥有着十分甜美的声线,以搞笑幽默的风格主持节目,经常谈各种人生哲理和话题吐槽也会分享一些在伦敦的生活状况,三观也是非常的正,因此得到了大批听众的喜爱,她创建的后宫群已经能够排到3号群了,可见粉丝量并不少,我向她提出帮他无偿开发一款鱼乐七天的微信小程序,这样大家就能在微信上直接听她的节目了,然后我就去创建了一个个人主体的小程序,命名为“鱼乐七天lite”,当时没有了解清楚电台类小程序只需要视听许可证才能过审的就直接开发了,整合了子涵的所有线上节目和平时在群里发的经典语音,后端API服务继续用Node.js开发,大概花了一星期左右成品就出来了,审核时自然是直接被打了回来,只能发了个体验版给子涵看看,虽然没能发布上线挺遗憾的,就当练手了吧。
在这不久后,偶然间看到一篇新闻,标题是:中国游客大巴冰岛车祸,大巴为避让前方车辆侧翻,一名中国公民死亡,新闻时间是2017年12月25日,后面得知此人就是子涵,她和妈妈坐在冰岛的大巴上,她没有系安全带,这是最致命的原因。我感觉整个心都震颤了,第一次发觉原来生死就是一瞬间的事,那天我感到心脏很痛,一晚上没能睡着。如今每一次打开她的电台鱼乐七天还是会忍不住流泪,这么一场意外事故带走了一位这么好的才女,实在是天妒英才,她还很年轻,甚至都还没有过男朋友,她的妈妈还曾经在节目里帮她打征婚广告,她的人生还没开始就结束了。网易官方在得知这件事后还在她的节目下和她的粉丝们一起主持发布了最后一期节目,这让我感受到网易也有温暖的一面,子涵在用她年轻的生命告诫大家,坐车一定要系好安全带!为了自己和家人、朋友请注意安全。
3D打印机
3D打印在刚普及的时候,是非常热门的词语,除了中高端的工业级3D打印机外,低端市场的家用级3D打印机也在逐渐增多,在众多打印机中就有一款创想三维出的入门级3D打印机:三角洲,买它是因为比较便宜,精度方面自然是不能奢求,不过还是忍痛花了八百大洋买下了,买的是线轨版,会比滑轮版高点精度。到货后马上就开始拆箱装机,光装机就花了一下午,零件太多了。
组装完成后研究了一波Crud,拿下载下来的模型在Curd切片后就开始打印了,开始时没有啥调平经验,精度可以说是十分的感人。
Server酱
谁不想拥有一个自动推送报警的功能呢?Server酱是一个实现公众号和开发者绑定,然后平台提供一个密钥,开发者就可以使用该密钥调用Server酱的发送接口,就可以把消息推送到开发者绑定的公众号了,在没有自己实现监控报警功能时,这个功能还是十分实用的,并且此功能是免费的,但如今公众号为了避免骚扰用户,对消息推送做了极大的限制,Server酱逐渐将服务转为在企业微信上的推送,感谢作者坚持用爱发电这么多年。
实现直播
当时前公司老板虽然没怎么联系了,但有一天它发来了个求助,他是在老家当地电视台工作的,电视台向他提了个需求,要求实现一个小程序用来播放电视直播,我询问了是否有推流机,他回答有的,在研究了一番过后,决定让电视台的推流机推送RTMP流到服务器的Nginx,再由服务器的FFmpeg从Nginx中拉流转码后再推流给Nginx HLS切片,HLS将流分解成ts片段并生成m3u8索引,将这一套流程帮他在服务器上实现后,终于可以在网页和小程序上播放电视台直播了,虽然存在一定的延迟。
在工作室的时,我使用端口扫描工具对网络进行了扫描,发现工作室的网络摄像头工作在554端口,查了一下发现是RTSP协议的默认端口,接着查了下此品牌摄像头连接地址的默认用户名和密码,并使用VLC这个万能的播放器打开这个流居然真的可以播放监控,这些网络摄像头的安全性属实堪忧,不过根据之前的经验,将RTSP流通过树莓派拉给FFmpeg解码然后推给Nginx,成功的在网页上播放了工作室的实时监控。
讲师
作为一个内向自卑的人,站在讲台上是一件相当困难的事情,更别说还要给大家讲明白一些概念和知识,但不知何来的勇气,我第一次真正的站在了讲台上给工作室成员们讲解git的入门与应用,在没有进入工作室前大家顶多就是单打独斗,很少有协作的时候,现在就不一样了,大家现在是一个团队,面对项目时将是多人的协作关系,而git作为代码的分布式版本控制系统,可以很好的解决多人参与的项目管理问题,可以说是每个程序员必备的技能。精心准备了PPT,为大家讲解git是什么样的工具以及各大git源码托管平台,并手把手的教学一波基本操作。意想不到的是,从来不教git工具的老师们,纷纷在这之后将git列入了教学与考试的范围。
DELL屏幕
笔记本的屏幕实在比较小,写代码时分割两框时就有点不够显示了,这回下重本买回来人生的第一个显示器:Dell SP2318H,虽然亮度、色域等表现并不好,分辨率是1080P,但是用来写代码还是足够的,比较钟意的一点是支持升降和旋转,重点是狗东上这个显示器活动价只要998,这个显示器至今还在用,只不过已经变成副屏了,显示器对于效率的提升是不言而喻的。
投票系统
学校举办了一次金点子大赛,每个参赛团队需要写出一项可行的idea去参加比赛,举办比赛的老师找到我表示需要一个扫码投票系统,于是临时花了40分钟用Node.js撸出了这个功能,由于是校内并没有做太多的防刷票机制,只通过限制IP地址和投票数量,学生可以通过扫描idea展示海报的二维码为它投票,最后尝试用Python统计了一下票数提供给了举办比赛的老师。
图片密码记事本
某天突发奇想,能不能做一个加密记事本的微信小程序,使用指纹来加密,可惜当时小程序对指纹API的兼容并不好,就先放弃了,改由使用图片的md5作为密码来加密记事本,没啥技术含量,也就是可以用一张照片将自己想存储的信息加密和解密,如果照片弄丢了,“钥匙”也就没了。
Chromebook
很早以前就听说过Chromebook的大名,令我好奇的是这么已达基于云的系统会有多6,仿佛这就是未来操作系统的发展方向,所有数据基于云进行同步,电脑上只提供运算资源。开始时在亚马逊看Chromebook价位在1-3K左右,想买但看到巨额的运费直接打消想法。之后在闲鱼上淘了个二手的惠普代工Chromebook14,卖家挺良心的,提醒我这个系统需要翻墙才能正常使用,想着当初虽然没有自建的科学上网,但借助其它工具实现还是可以用的,所以又脑子一热下单了,到手后登录上了自己的Google账号,看着它把我在Chrome上的各种插件和配置、记录全给同步了过来,玩着发现真的没科学上网几乎没法好好用,于是研究怎么给它装上Ubuntu,发现提供了crouton可以用来安装其它Linux系统,装上Ubuntu后用了一段时间,性能还不错,内存有4GB,续航倒是比较令我惊奇,一次充电可以用上六个小时。
后面玩腻了,想着干脆重装成Windows系统吧,但没想到这货有个硬件锁定,没法像其它电脑上直接进入PE安装系统,于是一顿搜索折腾,发现这个硬件锁定可以通过打开笔记本D面底盖把一颗螺丝去掉即可解锁,这是第一次敢拆这种轻薄笔记本的外壳,好在小心翼翼的一波折腾后成功的把螺丝去除,并且成功解锁进入U盘的PE安装了Windows10,性能在ChromeOS还绰绰有余的配置,在Windows上就十分的吃力了,只能完成一些基础的任务,并且只有32GB的SSD更是被系统吃了大半,续航也大大折扣。
SSH隧道
SSH是每个接触Linux的同学必学的命令之一,在研究这个命令时发现它竟然能够搭建正向或反向的TCP隧道,那就意味着能够直接与服务器建立一条安全隧道直接通信,就像VPN那样,于是神奇的应用就出现了,假设我希望在我的电脑上连接服务器的MySQL,按理说为了安全是不允许将数据库端口暴露在公网的,也就意味着常规方法是无法连接了,那如何相对安全的建立连接呢?这时SSH的正向隧道就发挥作用了,我们可以通过 ssh -fNL 3306:localhost:3306 user@ip
这样一条命令将服务器的MySQL端口安全的代理到本地的3306端口,这样就可以在自己电脑上直接连接本地3306端口实现连接到服务器的MySQL数据库了,本地的端口也可以是其它端口号。
既然有正向自然也有反向隧道,它比较神奇的地方是:能够实现内网穿透。就像之前介绍的Ngrok那样,我能够把自己电脑的某个端口代理到服务器或其它机器的某个端口上,这样在服务器或其它机器上就可以通过它们本地的端口直接访问到我电脑上的端口了,这就让事情变得有趣起来,假设我想在公司访问自己家里电脑的文件,只需要保持一条从自家电脑到公司电脑的反向隧道即可。
不过不管是正向还是反向我认为都是有一定安全风险的,毕竟都是在防火墙打个洞出去,但这个风险可以通过不使用常用端口号等降低,在实用和风险之间考量下,我觉得SSH隧道还是很有用的。
在工作室里放了一台我的电脑,当时还没有了解到TeamViewer,国内的向日葵也是后面才出的,所以如何在外网访问到工作室的电脑就成问题了,想到SSH隧道可以解决这个问题,使用反向隧道命令: ssh -fNR 3389:localhost:3389 user@ip
,将笔记本的3389端口代理到服务器的3389端口,这个端口的Windows远程桌面的默认端口,服务器再将3389端口暴露在外网,然后就可以随时随地通过外网连接我的内网电脑了,不过传输速度就受服务器带宽影响了,并且实现这个得有一台公网服务器。
跨年代码
眨眼间就到了元旦,彼时作为工作室的室长还是得搞点内部小活动的,就给大伙宣布了跨年代码活动,主要目标就是自己编写代码实现任意和跨年有关的功能,很快大家就纷纷完成了作品提交了上来:
虽然代码都很简易,但起码证明各位都精通输出Hello World。
洗脑
在之前的练胆后莫名有了站上台面的勇气,这一次,我站上的是一个可以容纳两百人的大教室,作为已经上大二的师兄,趁着大一学弟学妹刚刚接触这个专业的契机,赶紧洗脑,通过一连串只有四个字和一段话的PPT,引导他们如何走入编程这个深坑,如何少走一些弯路,希望对他们能有一些帮助。
在正式上台的前天晚上,熬夜花了三、四个小时实现了一个纯静态的资源站,文件就挂在对象存储和CDN上,同时还写了一篇一万字的问题解答文档,当做送给他们的小礼物。
ITX主机
游戏本的电池续航能力实在有限,就干脆把它放在工作室里当不移动的主机使用,平常上课有电脑就直接从内网远程桌面连接过去没电脑就带上Chromebook通过服务器隧道连接过去。
某天突然想着组台台式机试试,正好手上存了一点钱,但已临近毕业如果还组一台常规尺寸的主机到时不好搬运,所以打算组一台ITX主机这样用一个泡沫箱就可以直接放行李箱上带走,这是我第一次真正组一台主机,由于是小型机箱,因此对散热、电源模组化、布线等等都有了更高的要求,稍微研究后才开始在狗东选配硬件,资金有限决定不配显卡,选择了带有核显的R5 2400GCPU+主板套装,这颗处理器的核显比较强劲,双通道内存的核显性能已经可以追上入门级的GT1030,内存条受资金所限买了两条4GB组双通道杂牌(实际体验是千万不要买杂牌,偶尔遭遇显示输出绿屏,开始怀疑是核显品控问题之后才确定是内存问题),硬盘就出血点买了256G的M.2 NVMe协议SSD再加上一块希捷酷鱼1TB硬盘(这块硬盘说实话震动有点大,容易和机箱发生共振),电源考虑到小机箱难理线的问题就选了长城全模组的550W电源,散热想着盒装CPU有自带也省笔钱,机箱就选了酷冷至尊的ITX小魔方,总体装下来价格大概在3800左右,没有碰上降价节日配件价格还是略贵的,组好后就放在工作室使用,这台主机最后陪伴我走了1年多。
“黑”
2018年6月20日下午,经过5个小时的苦苦挣扎,在围观者的尖叫声(还有欢呼声)中,消防人员劝导无效后,年仅19岁的女孩李奕奕从公寓楼跳下,自杀身亡。在此前,李奕奕在庆阳六中内多次受到班主任吴永厚的性骚扰且学校毫无无所作为后,她被诊断为创伤后应激障碍,对于吴永厚的疑似性侵猥亵,庆阳市西峰区人民检察院给出了《不起诉决定书》的判决,面对质问时,罗永厚说:“我是在帮她量体温。”。
这个事件令我和广大网友非常震惊和气愤,在继续深入了解这个事件时,我偶然进入了庆阳六中的官网,发现右上角有一个管理登录入口,尝试了以下后发现存在弱口令漏洞,接着进入了此cms的后台系统,把主页“稍微”更改了一下,希望能够帮助舆论出一份力让这件事尽快得到解决。
工作室网站
已经记不起是第几次建站了,这次为科创工作室买了一个域名:cx-tidc.com,在之前普及Git知识之后,大家都统一使用Git仓库来保管工作室的代码了,官网也是工作室项目中的其中一个,基于Vue.js由几位成员合力完善并部署上线,很快也获得搜索引擎的收录。不过这个域名后续也因续费问题没能继续续下去。
混合加密与防伪造重放
加密与防重放作为请求安全性的重要环节是必须要了解的,在此之前已经有接触过AES加密,这是一种对称加密算法,加密与解密将使用同一个密钥,如果密钥泄露那数据就裸奔了,后面才了解到非对称加密的RSA算法,加密使用公钥,解密使用私钥,而私钥还可以用于签名,公钥用于验证签名,看上去RSA比AES拥有了更高的安全性,它可以确保A传递给B的消息不会被它人解开,哪怕是获得了A的公钥也不行,而B可以在回复A的消息上签名,如果中途有人篡改消息,那到达A手上时公钥将验签失败拒绝处理该消息,既有了保密性又能防篡改,但RSA算法的缺点也很明显,它加解密数据的速度比较慢,在面临大数据量处理时就很吃力了,但刚刚提到的AES算法的加解密速度相对来说就很快,那我们完全可以将RSA和AES的优缺点进行互补,传输数据前先生成一对RSA密钥对,公钥放置于你这,私钥放置于对方那,接着生成一个AES密钥,使用该密钥对数据进行AES加密,然后在用公钥加密AES密钥,再将AES加密过的数据和公钥加密过的AES密钥一起传输给对方,对方使用私钥解密出AES密钥,再使用AES密钥解密AES加密过的数据得到原数据,这样就完成了一次既安全又快速的数据混合加解密。
而在实际使用中我们还会面临一个新状况,如果在所描述的传输过程中有人截获数据包,虽然数据是加密过的,但它不篡改也不想获知内容而是将这个数据包给对方多发了几份,对方接收后也照常解密处理,假设这次传输是向某门锁发起一次开门请求,那对方是否可以在截获数据包的情况下趁夜深人静的时候,将这个数据包重新发送,门就这样开了,显然我们还缺失了防重放这一环,回到混合加密之前,我们应该给这个数据留下点“标记”,就像拍照片时给照片右下角加上时间一样,我们需要对方明白本次发送的数据是什么时候发的?是否已发过一次?Unix时间戳所代表的是1970年1月1日至今所经过的秒数,通过时间戳我们可以让对方明白这条数据是什么时候发出去的,如果当前时间戳减去数据时间戳大于了某个阈值(如60秒)就判定为过期数据应当抛弃,另外还应该生成一串简短的随机字符串用于标记该数据的唯一ID,接收方在数据过期前的阈值内应当保留数据的唯一ID,比如60秒内发来了多条同样ID的数据则除第一条外其余的均抛弃,60秒后由于过期抛弃机制也就没必要存储唯一ID了。
其实这里的防重放仅适用于加密的情况,如果在无加密的情况下防重放应当还需要另外实现防篡改,这种手段就是签名,这一般仅限于服务器与服务器间的通信,由于服务器存储密钥的安全性较高,A服务器与B服务器中存储有相同的密钥,那么就可以用这样的流程实现防篡改:A服务器首先将数据附加上时间戳与随机值的标记,然后将密钥拼接入其中,再使用MD5或SHA1等哈希算法获得签名值,再将数据+标记+签名一起传输,B服务器接收后需要用同样的方法用同一把密钥拼入数据计算一遍签名值,并将签名值与传输过来的签名值比对是否一致,不一致则代表被篡改拒绝处理。
Pages服务
github上的仓库有一项服务是Pages,它可以用于将仓库的内容作为Web站点进行部署并绑定在域名上,码云之后也开放了此项服务,不过如今在码云上使用Pages服务是需要实名认证的,毕竟是在国内,该服务除了提供一个属于你的三级域名还支持绑定自己的域名并且帮助你申请SSL证书用于HTTPS访问,有大量的博客是通过Pages服务对外开放的,比如以github.io为后缀的域名均在此列。之前你所阅读的这个博客也是放在此项服务上面,初期是放置于github,后面墙得厉害就搬到了码云,但码云有时候限制繁多也有限速干脆搬到了自有的七牛云空间并开启解析首页服务,毕竟和其它文件一样静态网站也是文件嘛,都一样可以通过网络访问,在七牛云CDN的加速下使得我的博客可以快速的被加载出来,当时还给博客加上了Live2D的看板猫,十分有趣,不过后面觉得这玩意太吸引注意力就撤走了。
树莓派3B
以前买的都是树莓派2B,碰上新出了3B版本,价格依然还是遵守原来的35美元承诺,这一版本相较之前有诸多亮点,以前WIFI和蓝牙都是需要外接USB网卡或蓝牙才能实现的,现在直接集成到了主板上,处理器和内存都进行了升级,使用起来很满意。购买的另一个原因是我在一个国内比较大的树莓派QQ群里是担任管理员,经常需要解答一些树莓派的问题,手上有个真机可以方便实测。
服务器集群
工作室每隔一段时间可以向学校申请一些资金用于补贴耗材支出或新增设备,我想着是否让工作室成员也尝试一下树莓派,不仅能够提前认识Linux系统还能为嵌入式开发奠定基础,所以这次的申请我还添加了几台树莓派,其中临时闲置的两台加上我自己的一台就放在工作室交换机箱顶上,组成了一个三机集群,在这上面还顺便实践了一把Docker。
斐讯k2
在斐讯翻车之前,这趟车是很香的,吸引了一大波的羊毛党,斐讯k2路由器是其中一款香饽饽,许多拿到返还的购买款后就将路由器挂到闲鱼上卖,刚好宿舍的破小米3C路由实在不行,趁着宿舍网络提速到50M,我就在上面收了一个k2,50包邮,这款路由器的特色是可以刷其它固件使用,按照教程对着路由器开刷,先是下了Breed、华硕老毛子固件,然后刷了个Breed防止刷成砖头,接着使用Breed刷老毛子固件,完成后这台廉价的路由器发挥了它的作用,老毛子固件也可以实现许多神奇的功能,比如挂上小飞机就可以全宿舍科学上网了。
Arduino
这是一款很流行的开源硬件,它相比树莓派更多的是直接参与硬件控制与传感,购买了UNO款的Arduino成功实现了将树莓派作为上位机,Arduino作为下位机,实现控制舵机旋转开门。
React-Native
前任老板又跑过来找我说打算开发一款像美篇那样的APP,就这样连React都没碰过的我,强行上了React-Native,然而他仿佛在说:“你被强化了,快送!”。整个过程不算很吃力,但是这玩意坑就是多,由于技术比较新,网上分享的文章也是少得可怜,许多问题还得自己查文档一点点解决,只能说如果要接触必须要对原生有一定了解,否则当遇上一些奇怪的问题时光有前端知识是没有用的。
在实现完初步的界面后老板又开始改主意,工资也没发了,我决定还是放弃吧,毕竟自己还有很多事情需要做。
无聊网站
无聊的时候,用了一天做了个情人节表白小网站,实现自动化的播放流程和动画、音频,可以用来备用。
开放平台
也许是受到了一些开放平台理念的影响,突然冒出了奇怪的想法:如果在学校内部署一些传感器,通过传感器获得一些实时数据,存入时序数据库,然后提供对外的API接口服务,校内的开发者能通过APPID和密钥认证获得AccessToken访问这些接口获得一些实时数据,比如食堂在某个时段的人流量进行一些自动化的操作,还能建立大数据图表,数据甚至能够用于AI模型训练。想法很美好,使用Vue.js实现了界面,在开始做后端部分时,突然想到在这样一个3B大专里会有几个人去当这样的开发者呢?最后还是放弃了。
新脚手架
这已经是这个脚手架第五次改动了,依然是选择基于koa2做的,因为koa2足够的轻量纯净,这个脚手架其实就是包了一层封装让它更适合实现RESTful API,独立出了路由件和处理件,不断积累公共类库common,并对MySQL、Redis、RabbitMQ的API进行了二次封装和改进。
路由件采用HTTP动词作为key,嵌套了接口URI与方法的映射,当请求与某个URI匹配时就调被映射的方法,这里主要进行鉴权和数据预处理以及结果返回。
处理件作为一个类暴露给路由件,路由方法被调用时可根据需要调用对应的处理件方法,完成处理后再返回路由件,这里主要就是核心的处理逻辑。
白嫖奖品
恰逢华南医疗信息网络大会,学校出资让工作室的几位成员一起去学习参观,这个大会有多个展区,吸引了来自各地优秀人才的参观,同时也开放了一些有趣的活动,其中一项就是积分抽奖,积分需要通过扫描每个展位的二维码获得,积分达到一定额度后即可参与线上抽奖,在扫描展位二维码时我将链接复制了下来一看,似乎是有规律递增的数值而不是随机值,瞬间就想到了白嫖的绝佳方案,先是尝试更改链接尾部参数验证是否存在这个漏洞,确认这个数值基本是递增的,于是写了个爬虫,现场把某个范围内的页面全部走了一遍,积分顺利到手,连抽了几次白嫖了三个奖品后就停下了,奖品是由部分参展商提供的。
创新盒子 ★
简介
这是除魔塔外对我人生意义重大的另一个项目,也是第二个真正完整并上线的项目,最重要的是这次有了一定量的用户,有用户就意味着你的程序功能需要经受大家的测试考验,并且有最真实的建议和需求。也是他们使我在运营时不敢轻易弃坑。
创新盒子,这是一个提供优质校园服务的微信小程序,截至停止运营的最后一次统计,拥有用户量8200+,整个学校学生有12000+人,意味着当时全校至少有68%以上的学生曾使用过它。
起初它的名字叫做创新校园汇,开发它的原因是当时校内出现一款名为“校城汇”的小程序,在学校内部关系的推动下要求所有学生使用该小程序,学生用它签到老师用它点名,整体体验也是十分糟糕,在这种情况下激发了我想做一个真正能为大家带来方便的小程序,在完成第一版本上线后获得了一些好评并且与校内关注人数最高的公众号“掌上创新”关联并改名为创新盒子还更改了LOGO。我所在的大学里,查课表、查成绩、查饭卡余额、查图书馆藏书和借阅记录、抢课、评教等等在此之前都是需要登录极为笨重且古老的正方教务系统或者藏在学校内网的饭卡系统以及图书馆系统,人多的时候更是基本503 Service Unavailable,这一切都是创新盒子需要解决的痛点。
整体的架构如下所示,很糟糕的图,可以忽略集群这个词,因为最终只在单机实现
开发过程
首先,先对正方教务系统的核心功能进行一个全方位的了解,这个系统是使用ASP.NET开发的,整个系统的源码混乱不堪,命名更是惨不忍睹,大量的默认控件名比如Form1、TextBox1,谁维护谁吐血,在对登录、成绩、课程表、抢课等功能进行了初步了解后,就进入了下一步。
很明显,需要接触到学生的个人数据必然是需要登录的,那么如何实现模拟登录就是需要重点解决的一个大问题,先是研究了登录请求并用Node.js实现爬虫进行模拟登录,爬虫需要在整个过程中记住Cookie,模拟登录一个最大障碍是验证码,这个系统的登录认证本身就十分缓慢,而系统提供的token有效时间又是有限的,如果每次拉取同步最新的数据都要用户输一遍验证码那体验很不好,于是我优先开始处理破解验证码。
在确认这个系统没有可以直接绕过验证码登录的漏洞后,决定通过OCR识别数字与字母来获得验证码结果,但是经过费了九牛二虎之力都没能让OCR的识别正确率达到可用的标准,因为这个验证码虽然很低级,但是有些干扰确实对OCR来说有不少难度,比如字符旋转后叠在了一起或者干扰点影响到了效果,最终我决定拼一次命,直接接触我从来不敢碰的AI训练,在电脑上安装了TensorFlow和Keras,Keras可以使用TensorFlow作为后端实现了更人性化的API,先是直接爬一万张教务系统上生成的二维码,分出八千张作为训练集,两千张作为测试集,然后配合Node.js写的本地服务,实现在网页上对训练集的每张二维码进行标记,被标记后的二维码文件就会被Node.js重命名,在花了一天半时间标记后,还花了半天时间校验了一遍,毕竟是很可能打错字符的,终于结束了这个艰苦的流程,眼睛看验证码都快看花了,感觉脑子里就只剩0-9 A-Z这些字符了,得到这批经过标记的二维码文件,但距离它成为训练集还需要进行预处理,因为它现在还是彩色的而且干扰点还很明显,这对于训练来说无疑是巨大的干扰,先用Python对训练集所有二维码进行二值化,将所有图片处理为字符形状较为清晰同时噪点也尽量少的状态,下一步就是找出训练集中尽量贴近字符四个框位,将每个图片的四个字符按照框位裁剪出四张图片,并分别放入他们所属的字符文件夹,比如字符a就放入字符a的文件夹,以此类推对训练集所有的图片都进行拆分归类,最终得到包含所有字母和数字的文件夹。之后继续使用Python编写训练代码,配置512个神经元,进行一波训练收敛后,测试集跑出来的准确率达到99%,至此训练结束得到了模型文件,后面的事就好办了,在python写了一个验证码识别服务,Node.js通过IPC与它通信,将图片以二进制流形式传输给识别服务,识别服务会返回四个字符组成的字符串。
通过以上的流程终于是解决验证码这个难题了,用户进入小程序只需要进行一次的学号与密码授权,后续的登录都由后端自动完成,并且也会记录每个用户在教务系统的token,只要没失效都可以继续使用。
查课表时,如果用户第一次同步课表就直接从教务系统同步此用户的最新课表,如果不是则优先返回缓存,先返回本地缓存课表,本地没有就返回服务器的Redis缓存课表,再没有就获取服务器数据库的缓存课表,缓存层在这里面发挥了重要的作用。如果需要同步最新课表也就是强制同步时爬虫再登录一次教务系统爬取。
查成绩也是与上面同理,主要麻烦是,我自己只能看到自己的成绩和课表,而这个教务系统的数据展现方式又是千七百怪,特别是课程表,为了正则能够尽量匹配到所有的课程内容,可谓是煞费苦心,写正则写到头秃,还跟不同专业、年级的学生们借用账号来查课表调试正则,并且还会遇到课程冲突情况还得额外提醒处理,幸好最终没有白费精力,还是成功完成了各种课程和成绩数据的爬取。
而抢课这个就比较特殊,当时想过一个解决方案,但因为成本和时间问题并来不及实现它,抢课就相当于大量的并发请求打在服务器上,变相的DDoS,但这个量级的流量,服务器的QPS应该不至于那么差,主要还是这套教务系统的问题,我的思路是先爬取教务系统的待抢课程,放入Redis中等待扣除存量,抢课请求打过来,首先将请求队列化,然后扣减Redis里对应课程的存量,并将该用户的抢课申请记录入数据库,并且需要实现一个应用级的事务,如果申请记录入库失败应当补回存量,由于已经队列化请求就可以不用锁了,这里就是预抢课阶段,在这个阶段进行的过程中就需要有一条线程去负责把抢课申请真正在教务系统完成报名,这样既公平又高效。但如果要这么实现意味着得向校方申请阻断从教务系统抢课的入口,不太实际。
上面提到饭卡平台是在学校内网的,而创新盒子的服务器是在阿里云的,公网没法直接访问内网,这回以前用的SSH隧道就又一次发挥了它的作用,这次使用树莓派作为学校内网里的“内鬼”跳板机,它接入的刚好是连接学校内网的工作室网络,树莓派采用反向隧道将饭卡平台的80端口代理到了服务器的6000端口,这样服务器就成功通过6000端口访问到内网饭卡平台的80端口了,这次为了避免隧道因为临时断网而直接断开还采用了autossh,如果断开autossh就会尝试重连,饭卡平台由于密码形同虚设,因此只需要有学号就能够查询到对应饭卡余额,所有用户的密码都是同一个,验证码也可以轻松绕过,天时地利人和,用户通过小程序查询饭卡时,爬虫模拟登录、爬取充值和消费记录以及余额并返回和缓存,也可以发起请求挂失饭卡。
然后就是查询图书,学校有一个图书馆系统,比较简陋,但至少还能够查询到书籍以及摆放的位置,也能够获知借阅是否逾期,因此还是老一套,这套系统的权限验证也是和饭卡平台一样可以轻松的绕过,爬虫可以请求书籍详情和逾期情况在小程序上展示出来。
之后还实现了一样比较有趣的功能:关联课表,可以关联你所在意人的课表,对方同意后就可以完成关联了,关联后可以在课表列表中点击查看对方的课表,情侣必备工具+1,这里还接入了WebSocket做实时消息推送。
评教一直是学生特别讨厌的一件事,不仅要登录缓慢的教务系统,还得一个个课程一项项点评点进行手动勾选,所以我顺势也推出了速评教功能,借助之前打下的系统基础,可以轻松通过爬虫自动的对每个课程的每个表单请求进行逐一提交,实现整个流程的自动化,不过所有选项都是默认评为优的,也可以单独点击不同课程手动评价。
后续也加入了失物招领等实用功能,随着小程序流量的逐渐增多还开启过小程序流量主,分别在主页底部和课程表底部不影响使用的位置放置广告栏位,在广告栏位上线后,在后台查看流量主数据,发现原来流量真的赚钱,一天只有很低的广告点击量也能够收入50-70,多的时候一个月下来差不多也有一两千元,对于还在大学的我来说不算低了。
这个项目的代码在学校内部是开源的,在形成一定影响力后,开始不断有人前来询问或学习,这让我感到很有成就感。
项目后续
后面拿着这款作品参加了不少校内外比赛也拿了一些不错的奖项,第一次接触这么多用户的使用也让我想要好好的做这个产品,为他们负责,为新生们提供最好的校园服务,可惜好景不长,创新盒子最终停止运营了,原因是学校有很长一段时间里干脆关闭了教务系统,已经无法线上访问了,在这种情况下,创新盒子大部分需要同步的功能就无法照常使用了,我曾经认为只要我继续耗着,学校肯定会恢复教务系统的,结果一等再等,服务器我已经白续了几个月,这个服务器开始时由于大学生认证一年也就一百多,耗到我出来工作学生认证失效,服务器的成本就陡然上升了,最终考虑到我个人的经济情况决定关停服务器。
在创新盒子关停一段时间后,科创工作室开始涌入新鲜的血液,开始有新的人接替我去实现这样一个工具,在原本理念的基础上实现了一款名为“We智慧创新”的小程序,这大概是学习了“We重邮”的命名方式,总体功能与创新盒子比较接近,还包含了一些创新,很棒。
云账宝
闲来无事就想给自己做一个精简的云记账工具,平常接触的一些记账工具都太花里胡哨一大堆广告也不太方便,用上微信小程序云开发完成了基本的记账功能,方便平时记录一些自己的花销情况。
查题助手
学校定期有组织专升本的考试,而考试的题目大多也都是线上测验的原题,所以为了方便大家能够在平时背题时能够马上查到题目和答案就制作了个查题工具,题库是爬虫从线上测验系统自动爬取的,通过查询题目关键字即可得到搜索结果。
微科创
微科创是一个专门为科创工作室服务的微信小程序,是属于工作室项目计划的一部分,至于工作室项目计划是与几位核心成员在某天深夜在宵夜街一起吃关东煮时讨论出来的一系列支持工作室与学校技术发展的项目计划,而微科创能够实现工作室内部的成员考勤签到、日常招新、问题管理与解答、管理其它项目配置、其它项目登录授权等功能,其中的考勤签到是采用之前提到的扫描iBeacon基站判断是否处于工作室内完成打卡。
外聘工程师
学校每年会承接一些考试监考工作,比如全国会计专业技术初级资格无纸化考试,考试是使用无纸化系统的,考试前夕系统供应商会安排一位工程师到学校驻场,主要负责在校内计算机相关专业招募可以辅助给考场机房安装维护无纸化系统和应急处理的人员以及对被招募人员进行基础培训和分组,工作室成员自然也是被优先考虑,当然也不是白干是有报酬的,我就拉上几位朋友一起赚钱去了,培训时内容十分简单,每个考场的机房都会占用两台电脑用于监考机和备用监考机,其余的机器均作为考生机接入,考试前需要进行考生签到,签到需要刷身份证并且拍照与报考照片比对,到达时间时需要下载授权码用于开启试卷数据,考试时所有考场机房都会切断外网访问同时屏蔽器也会开启,考生机的所有作答都是实时同步到监考机的,监考机都专门配备了UPS电源,确保在断电时仍能够将考试数据备份出来,它和备用监考机并不是双机热备,仅是在监考机崩掉的时候代替监考机重新收集各考生机答案,考试结束时需要将监考机的考试数据备份文件放入U盘上交。培训时的模拟操作很难复现现场可能会发生的各种状况,所以也提前做了许多预案,学校机房的电脑平时维护情况并不好,设备也比较老旧。考试前一天我们每人获得了一张初级工程师考试技术服务资格上岗证,考试的时间里我们就在自己负责的楼层四处巡查,如果出现问题监考老师就会招呼我们过去处理,尽管我们开考前已经仿佛确认了可用的电脑也冗余了一些机器,但还是避免不了各种奇怪的问题:比如网卡时好时坏、显示器VGA接口接触不良、机箱电源接口接触不良、键盘或鼠标失灵、硬盘坏道导致丢失库文件、内存条存在问题时常蓝屏等等,唯一一次大点的问题就是监考机系统假死,不过在备用监考机上恢复了考试,由于处理及时没有发生申请考试延时的情况。
修复上古编辑器
朋友给我发来了一张截图,里面是04年用asp写的网站,他问我能不能有偿帮忙修复一下,我接了下来,然后在有空的时候开始研究,发现这里面的大部分代码对现代浏览器的兼容性很差,进行了一篓子的兼容改造,让编辑器终于恢复了正常的显示样式,本以为一切正常了却发现在上传文件时报错,调查后发现服务器方面虽然是只有控制面板的主机内部却还带有360的主机防护,由于这个版本的cms太老,上传接口的脚本存在漏洞,主机防护识别到漏洞特征就直接把脚本文件给自动删除了,后续花了点时间更改了脚本终于修复了。
SMP音频解密
学校放假待在老家时,爷爷拿过来一个类似MP3的音频播放器,说是想把里面的歌曲放到自己的手机里,我一想这多简单,接过播放器和手机,在电脑访问播放器存储时发现文件是被加密过的SMP文件,这是我完全没接触过的领域,幸好在吾爱破解论坛发现有人尝试解密SMP文件,了解了以下后知道这个加密只是简单的异或加密。并不涉及硬件层面的解密,那就好办了,下载了WinHex工具打开文件内容,从文件中找到密钥十六进制值,尝试单字节异或,发现本质就是mp3格式,接着写了个工具批量将SMP文件内的十六进制值异或密钥运算得到可播放的文件并重命名后缀为mp3格式,这样处理过后将所有文件拷贝到手机内部存储就结束了。
人肉Debugger
在多年的不断跳坑下,练就了一身Debug本领,基本遇到的大部分问题都能解决,所以也开始经常解答和帮助别人,当顺利帮助别人解决问题时除了获得感谢后的成就感之外,还能帮助自己加强经验记忆,而且有些BUG有自己的特色,能在解决后让自己有不一样的收获。
遇见的问题八成是低级错误,比如语法错误、逻辑没搞对、API调错、报错信息不会看等等,剩下的错误一般就是涉及平台兼容、代码设计问题、库源码bug、锁问题、线程调度、数据一致性等等更深一些的问题,但事出必有妖,所有BUG必定都有其根源,练就Debug思路很重要,而且需要具备最基础的计算机英语知识(本人英语水平只能过英语B级,所以学计算机英语不难的),所谓久病成良医,Debug经验越充足越能顺藤摸瓜找到问题根源并提供解决方案,还有出问题的第一反应应该优先怀疑自己的问题,并且先自己思考,软件硬件都一样。
帮助别人的时候也讲究望闻问切,所以希望对方都能提供代码和报错截图,并且能快速的配合解决,当遇到一些很难以配合的情况时就很难提供帮助了,比如上来就问 某某情况该怎么解决?谁会啥啥?也不提供任何截图和相关信息,大家的时间都是有限的,有心想帮助你但害怕你无法配合处理耽误了自己的时间。或者也经常会遇上问问题却还带着架子的,相当于直接先一桶冷水泼大家脸上,这样谁还愿意提供帮助呢?
交叉编译
第一次听到交叉编译这个词汇应该还是在Android上使用别人编译好的ARM平台adb工具,理论上只要有源码,都可以编译出目标平台可运行的程序,当编译平台和目标平台不是同样时这就是交叉编译了,交叉编译可以使用编译机完成对性能资源要求较高的编译过程获得可在低端平台执行的程序,当时是一位朋友找到我说它下载了在Android上使用的tcpdump工具,但它在Android模拟器的Shell中无法运行该命令,我询问后得知它模拟器中运行的Android是x86平台的,x86平台的Android相比ARM可以更高效的在电脑中运行,其内核其实就是32位的Linux,之前接触过的一款名为Genymotion的Android模拟器就是采用的x86内核,很明显我朋友所下载的tcpdump工具只适用于ARM平台,根据能够找到的资料,我在服务器的CentOS7环境中先安装了开发工具包以及glibc静态库接着去下载了tcpdump与libpcap的源码包并解压,配置两个包的编译参数,目标平台均为i686的Linux,配置完后就开始make编译了,编译结束得到了Android x86可用的tcpdump工具,然后只需要把该工具push到模拟器中运行即可。
代理服务器
一位朋友给我发来的个投票,想要帮忙召集多些人来投,我测试了一下投票的接口,除了限制IP地址外似乎没有其它限制了,然后就找了一个提供大量免费代理服务器的网站,先用爬虫从该网站爬取出代理服务器的列表,然后再通过代理服务器向投票接口发起投票请求,效果刚开始比较显著,但免费的代理终究不实用,有大量代理其实已经失效。
面试
大学的时光过得太快了,就读的大专是三年学制,但两年半时就该出去找实习,当然,校内招聘会是少不了的,但是3B大专是无法吸引来大厂招聘的,大多都是外包公司或小型公司,尽管如此,我还是精心准备了以下简历,风格以最简约的白纸黑字为主,采用基本的排版,一心想着把会的全往上面堆,最终整个简历密密麻麻,一页纸差点装不下,按理应该根据岗位要求缩减的,但想着就是朝全栈去的,干脆不改了,校内招聘会时把简历给到面试官,面试官的表情大概是从愣住-震惊-不信,只有两三位面试官问了问题也都答上了,其它的基本都是收个简历,这些也就是走个流程看看,没有选择去就职。
我将简历传到了BOSS直聘去就放着了,当时还不着急找工作,所以基本都在等别的公司找上门,四天之后再打开APP发现已经有十几家公司在询问情况了,在排除了外包后看了剩下的几家都不太满意,这样的状况持续到准备正式出去找工作的时候,我工作目标地点基本锁定在了深圳,知道深圳生活节奏很快,但定有更多可以学习的东西,在准备前往深圳的前两天我确定了四家待面试的公司,两天后我踏上了我的深漂旅途。
到达深圳后已经是下午,去的第一家是经营金融业务的公司,在约定的时间到那时面试官不在场,只和前台的姐姐坐下来聊了几句就离开了。第二家就是我后面正式入职的公司,坐标福田上梅林,是做钢琴培训教育的,主营一款名为“琴小站智能琴房”的产品,具体面试情况等会再讲吧,第三家公司主营小游戏业务,由于时间关系只能拖到第二天再过去面试,但由于路途遥远,中午到达时负责人表示出去了下午人不在,好呗又打消了一个,接着转移目标到第四家公司,这是家在福田保税区主营工艺礼品定制的集团公司,和面试官进行了一些交谈后,给我展示了他们的系统,我也展示了一些自己的代码和作品,聊得还算愉快,但觉得项目没有什么挑战性后面决定拒掉。
如转载本文章必需注明来源地址.