刚上大学?过来人给你提些建议

本文是我大四保研之后学校老师让我去给当时的新生做的分享的内容,偏口语化,现在过去也有将近一年时间了,有些学弟学妹给我发消息说很感谢当时的分享,如今正好又到了新生入学的时候,我也开启了新的征程,就当是过来人给的建议了。以下是当时的分享内容。 很高兴收到王老师的邀请来到这和学弟学妹做一个有关自己这几年大学经历的分享。首先我先自我介绍下,我叫XXX,来自15级软件工程。 不知不觉你们都已经在大学度过3个多月了,不知道你们现在对大学都有一个什么样的认识,我当时来的时候特别的迷茫,因为刚从高三那个紧绷的环境过来,宛如一匹脱缰的野马,自由但是没有方向,说实话我很羡慕你们在这个阶段可以有学长和学姐引导,我刚来的时候只有一个告诉我上大学只要不挂科就ok的学长,而且当时我还奉为人生信条。 今天我来不是跟你们说要你们好好学习之类的,因为那没什么用,自助者天助,我今天来是想把我从入学到现在所遇到的一些困扰来和你们分享,相信对你们应该会有所帮助。 第一,大学的目的是什么? 我问问你们,你们觉得大学的目的是什么?我以一个同龄人且是过来人的身份告诉你们,在我眼里,大学4年,如果你能明白自己就行想要怎么活,你的人生想怎么过,你最想要得到的是什么,就足够了。 有的人大学不学习只玩游戏,有的人大学不玩游戏只学习,有的人大学什么不做只恋爱,有的人大学就要找个白金男。 很正常,你可以说玩游戏是浪费生命怎么的,也可以觉得天天逃课的都是傻逼,也可以觉得去学生会做事的就是浪费时间。如果你就是喜欢玩游戏,并且认为自己能够为止奋斗一生那么就去做吧,其他人怎么评论又如何,难道只有拿奖学金是牛逼的? 如果你认为人生就应该平平淡淡娶妻生子 ,乖乖念书然后去找工作一步一步过有什么不好?比起那些会为玩游戏而抛弃一切的我更鄙视那些什么都想做什么都要做,结果机会给他了又开始说这个不会那个不会的人。找到那个最美的自己,然后为之不断奋斗,这是我在大学的最大体会。 第二,你对学校失望吗? 扪心自问下,你们来到这也有3个月了,你们对这个学校失望吗?我刚来的时候对这个学校真的是非常非常失望,论面积不如我的高中;论地理位置,夹在南京和扬州中间,尴尬;那图书馆,随便找个别人家的大学都比我们气派,就更别说学校的食堂、宿舍了。你问我失不失望,失望呀,可是我不能对我自己失望啊。一只站在树上的鸟儿,从来不会害怕树枝断裂,因为它相信的不是树枝,而是它自己的翅膀。与其每天担心未来,不如努力现在。自己努力做到最好,那么人与环境均为一流。 第三,我需要合群吗? 我需要合群吗?这个问题我在大一的时候反复的问我自己,我需要合群吗?那个时候的我为了合群,我积极参加了社团活动,去不断的认识新的人,这种状态我一直持续到了大二下,当然我并不是说参加活动,广泛交友是坏事,只是后来我在想,这是我想要的吗?人们往往把合群看作一种能力,却忽略了独处也是一种能力,并且在一定意义上是比合群更为重要的一种能力。低质量的社交不如高质量的独处。为何会有芸芸众生这个词,说到底就是因为群体的智商往往都是低下的。现在回头看看我独来独往的大三一年,真的觉得没必要为了随大流在不重要的人身上浪费时间。君子之交淡如水,用陪伴、时间和玩乐次数磨出来的朋友大多是酒肉朋友,配得上知音二字的朋友不会拖着你浪费时间。如果不是本身性格孤僻封闭,而是对生活有明确目标、计划和安排的话,不要因为旁人或集体打乱自己的节奏,想想是理想重要还是所谓的“合群”重要。朝夕相处共同生活不等于真正的朋友,真正的朋友就算远在天边,很久没有联系,他们也永远在那里。想要学会与别人相处,就要先学会和自己相处。 第四,为了不让我的大学荒废,我应该做什么? 其实这个问题你们去知乎上搜索是会有很多回答的,你们可以自己结束之后去搜搜,我来这并不是来教育你们的,更不是来教你如何成为一个优秀的大学生,因为我自认我并不优秀,我只想以一个同龄人以及过来人的经验告诉你们,大学期间,需要做些什么。 明确自己想要的是什么? 刚进大学,你们很多人都才从紧张繁重的高中学习跳出来,带着一些稚嫩的孩子气,那种初生牛犊的韧劲儿,无论对什么都充满着无限的好奇和憧憬,你们这个时候就像一张白纸一样,可以任意的去涂鸦出属于你自己的那抹斑斓,我认为大一就应该是一个不断尝试的时候,这个时期我建议你们尽可能多的尝试,不要有任何的顾忌与犹豫,敢于犯错,因为什么都才刚刚拉开序幕。我为什么说让你们多去试试呢,因为你们在尝试的时候是对自己的一个重新探索的过程,以前的你们,只有一个目标,那就是高考。但是现在正值青春年少,为何不多去尝试一些之前没有接触的新鲜事物,只有你积极的探索了之后你才知道你自己想要的是什么,而且越早行动,就越早知道自己的目标,就可以更好的去为了那个目标去奋斗了。 为了自己的追求,全力以赴 当然每个人想要的可能都不太一样,比如说我想在大学谈个恋爱,我想认识一帮好基友,我想成为一个更好的人,等等等等。想要的东西不分大小,不分主次,更重要的是你愿不愿意为了你想要的去全力以赴,这就是我想说的第二点。假如说,你喜欢一个女孩子,但是自己不敢去追求,那你只能眼看着她被别的男生追走,又或者你想认识一帮好基友,但是自己整天在宿舍打游戏,如果是这样的话,想要的再多又有什么用呢?重要的是,你愿不愿意为了你想要的全力以赴。也许你付出了不一定会有结果,但是你不付出,就一定没结果。 永远不要在学习上懈怠 我相信在座的很多人都听别人说过到了大学就轻松了,只要考试不挂科就可以了,但是真的是这样的吗?拿我自己举例吧,我大一大二两年就是以60分万岁为信条的,这样的后果就是我大一大二的成绩一般,大三一年为了保研花在争取加分项上的精力要比其他保研的人多很多。你们可以想象下我大三一年,我要忙学生会的工作,社联和本创都是我负责,还要学技术,做项目,参加比赛,写论文,复习考试,后期还要准备简历,准备复试,联系学校和导师。大三那一年我几乎没有早于凌晨一点半睡觉的。现在看来,我的努力都有了回报,但是回头看看,如果我大一和大二的时候不那么放纵自己,多花点时间在学习上,我的大三就可以稍微轻松点不是吗?所以如果在座的各位和我当时一样有60分万岁的想法,我劝你们趁早结束这种想法,因为出来混迟早是要还的,你今天欠下的东西,未来必然会以某种你不喜欢的形式出现。 结识一些志同道合的朋友 刚才我在合群的问题上提到了享受一个人的乐趣,但并不代表优秀的社交圈就没有用处。见贤思齐焉,见不贤而内自省也。一个好的交际圈真的很重要,我很庆幸我在大学期间认识了很多优秀的人。举个例子,我有一个学长叫XXX,保研浙大的,楼下的海报上还有他的名字,我大一的时候经常跟在他后面写代码的,关系还算不错。大二快结束的时候,他拜托我帮他打印一份文件给老师签字,因为那个时候他已经在东区了,我收到文件打开之后发现是他申请浙江大学夏令营的导师推荐信和他的个人简历,真的,我当时很震惊,我们学校的学生竟然可以申请浙江大学的研究生,而且他和我说他已经和浙大那边的教授联系好了对面也愿意接收了。我相信在座的各位每个人都跟我一样,心中都有一个名校梦,这件事情对我触动最大的地方就是他让我的名校梦死灰复燃了,那一瞬间我觉得我这辈子还是有机会去我想去的大学,也是从那时候开始,我才意识到接下来的一年我该做什么了。现在看来如果不是他让我帮的那个忙,我可能后来也不会有去南大的想法了。当然还有和我一起开发果核的那两个人,我很庆幸可以和他们一起把我们的想法付诸实践。 不要害怕展示自己 如果你对自己的实力表示自信,那就不要错过展示自己的机会。举个例子,今年7、8月是保研的夏令营期间,那段时间全国各个想保研的学生都会给名校投递简历,我也不例外。但是南大、复旦这样的名校的计算机类的专业基本上是不会在夏令营期间收我们这样学校的学生的,所以在我被刷了之后心里很不平衡,因为我自认我的能力并不比那些211/985的人差,于是我就在7月底,南大的夏令营已经结束之后,自己联系了导师并且私下去和导师面谈,也正是那次的面谈,导师决定给我一个机会参加南大9月的复试,后来复试通过我也就被录取了。试想一下,如果7月底我没有主动和老师联系然后去面谈,那我仍然会因为本科学校的原因被拒绝,然后再一次让我的名校梦化为泡影。 谈一场单纯并且完整的恋爱 大学里的爱情,相比高中更加成熟,相比工作以后更加单纯。你们的爱情可以不用担心每个月的房租、不用去管未来会是什么样子。通过大学这个平台,相识、相知、相爱,从第一次见面,第一次约会吃饭、第一次一起上自习、第一次一起翘课去看电影、为了爱情而疯狂,尽管很多人批判现在大学的恋情已经变了味,但我仍然相信,大部分情况下,大学生的爱情是澄澈而纯洁的。 在恋爱中,两个人相互交换彼此的思想,学会为对方考虑,学会担当和责任感,两个人之间的交流、争吵、矛盾、谅解,也是一个重新认识自己并让自己获得成长的过程。更何况,大家以后基本都是做IT的,工作之后就很难有机会接触异性了不是吗? 世界那么大,多出去看看 上大学的时候,你有大把大把的课外时间,还有着学生证这样一件神器,在很多旅游景点,可以享受半价的优惠。这样一件利器不用简直太可惜了,况且工作以后你需要考虑生活、家庭、工作,很难像大学那样有一次纯粹的旅游。 多出去看看世界,去自己喜欢的的地方,感受每个地方不同的历史和文化,不仅把它当作是旅游,同时也是提升自己见识的好机会。俗话说得好,“读万卷书,不如行万里路”,这个道理是没毛病的。 最后 最后,希望各位学弟学妹们在不影响自身学业的情况下,可以为了自己想做的事全力以赴,让自己的大学不留下遗憾。

plainify

刚完一波蚂蚁金服的面试后,他说他累了

这是「跟我来面试」系列的第二篇,被面试人是我隔壁宿舍的好友,近期刚刚结束了蚂蚁金服的三轮技术面试,面完之后他跟我说很累,直言不想再体验了。 因为学院的安排,我们被要求暑期实习,近期也有各种内推信息发在群里,和大多数人边面试边复习不同,我的这位好友在我们疯狂投简历的时候就一直踏踏实实准备,因为我们会在自己的小群里分享自己的面试经过,他就一直潜水,直到有一天突然告诉我们蚂蚁金服的 hr 说他通过了我们才知道他已经成功上岸了。这种人,我们一般只能用五个字来形容:闷声发大财。 他的面试经历我仔细看了看,一面重点在基础知识的考查,二面重点在项目以及对框架的使用与理解上,三面压力面,是很熟悉的套路,考察的知识点也是经常问到的,具有一定的参考价值,接下来我们就来看看他的这几轮面试经历吧。 一面 笔试题很简单,多线程循环打印 1-100 奇偶数 你觉得项目中用了 MQ 给你带了什么好处,设计初衷是什么?会带来什么缺点嘛?(项目针对性比较强,不细说) 在网页键入 taobao.com,到返回一个页面,这期间都发生了什么? 你说到了 session 和 cookie,这两者有什么区别,应用场景是啥? 返回界面的文字,图片,链接,你觉得是从哪里来的,或者说储存在哪里? 描述一下 TCP 三次握手,这期间可以携带数据吗?携带了数据会造成什么后果? 描述一下四次分手,第二次和第三次中间处于何种状态? 说一下 object 类的所有方法以及他们的功能(真的是所有:clone,notify/all,finalize,wait,hashcode,equals,tostring,getclass) 抽象类和接口有什么区别?说一下你的个人理解。 详细说一下 final 关键字,修饰变量,方法,类都有什么不同?能想到什么具体应用场景吗? 说一下 equals 方法,hashmap 的底层,跟 hashtable,concurrentHashMap 都什么区别 静态分派和动态分派的区别?具体应用场景? 1.8concurrentHashMap 有什么变化,优化的意义在哪? hashmap 除了结点数大于 8,还有什么情况会树化(这个我没想出来,也可能是我没听清楚) hashcode 方法有什么特点?hashset 的底层是如何实现的?为什么用 hashmap? 说说 JVM 内存结构(这里要问清楚是 JMM 还是运行时常量池) 你刚说 1.8 后方法区移动到内存中变成元空间,为什么要移过去呢? 那为什么常量池没有移动到内存,而是转移到堆了呢? 最后一个问题,说一下线程池的饱和策略 因为项目中使用到了 MQ,所以就顺便问了下,好在并没有提问太过深入的东西,随后问题几乎每个都是高频考点,2、4、5 主要考察计算机网络中的通信过程,例如三次握手/四次挥手,7-14 考察 Java 基础,随后就是和 JVM 以及多线程有关的问题了。有需要的小伙伴可以参考这个进行针对性的复习。 二面 从项目启动到现在,介绍一下你的工作以及遇到的难点,怎么解决的? 讲一下微服务架构都有哪些模块?他们是怎么一起工作的? 让你实现一个 eureka,你会怎么实现? 用户认证,为什么要用 JWT,而没用 session-cookie,应用场景?优劣?加密用的是什么算法? 为什么使用 rabbitMQ,没用别的 mq? 说一说你项目应用了什么设计模式?适配器模式什么应用场景? 让你实现 AOP,你怎么实现? spring 事务有了解吗?是如何传播的?在你项目里的实际业务中是如何传播的? 例如有 ABC 三个事务,分别原子性,整体也原子性,A 事务出错回滚,整体事务也会回滚,你会怎么设计呢? ZooKeeper 有了解吗?redis 和 Mencache 的选型问题? 你之前的 webServer 项目介绍一下整个流程?你是如何做的多线程?socket 相关? 你怎么使用线程池?参数怎么选择? 你写线程的时候会给他们起个可爱的名字吗?为什么要起?线程错误排查工具用过哪些? spring framework 都有哪些模块?你使用到了哪些模块?怎么使用的? 使用的时候有没有对某模块功能进行扩展? 说一下集合类(线程安全角度) 到了二面,就会发现提问的重点发生了明显的变化,从之前的基础知识变成了项目架构方面的,这一轮考察的是平常学习过程中对于架构的使用与理解,现在都偏爱微服务架构,那是否思考过背后的原理?天天在用 Spring,你对他到底又有多少认知呢?都知道消息队列好,那好在哪?这些东西都是实际的项目中能接触到,但是又经常会被忽略的东西,就看你是不是一个有心人了。 ...

plainify

利用 Docker 安装 Hadoop 集群并通过 Java API 访问 HDFS

前言 最近刚好在学习 Hadoop,在安装过程中遇到了一些小麻烦,正好将此次过程记录并分享出来,希望能对准备学习本块内容的读者们有所帮助。本次操作在 Ubuntu 中完成,如何安装 Ubuntu 本文不再赘述。 本文所涉及到的代码及配置文件可在微信公众号「01 二进制」后台回复「hadoop」获取。 在 Ubuntu 中安装配置 Docker 使用官方安装脚本自动安装 安装命令如下: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令: curl -sSL https://get.daocloud.io/docker | sh Docker 镜像加速 之后我们会利用 docker 拉取一些镜像,国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。这里以 ubuntu 系统为例,我们可以通过修改 daemon 配置文件/etc/docker/daemon.json来使用加速器 { "registry-mirrors": ["https://hub-mirror.c.163.com"] } 然后执行以下命令重启 docker 服务即可 sudo systemctl daemon-reload sudo systemctl restart docker Hadoop 集群安装 1. 拉取 docker 镜像 sudo docker pull kiwenlau/hadoop:1.0 2. 下载启动脚本 git clone https://github.com/kiwenlau/hadoop-cluster-docker 3. 创建网桥 由于 Hadoop 的 master 节点需要与 slave 节点通信,需要在各个主机节点配置节点 IP,为了不用每次启动都因为 IP 改变了而重新配置,在此配置一个 Hadoop 专用的网桥,配置之后各个容器的 IP 地址就能固定下来。 ...

利用 Python 破解 ZIP 或 RAR 文件密码

我们经常会从网络上下载一些带密码的压缩包,想要获取里面的内容,往往就要给提供商支付一些费用。想要白嫖其中的内容,常见的做法是百度搜索一些压缩包密码破解软件,但后果相信体验过的人都知道。本文将会利用 Python 破解压缩包的密码,这里以 ZIP/RAR 为例。 本文源码可在微信公众号「01 二进制」后台留言「破解压缩包」获得 破解原理 其实原理很简单,一句话概括就是「大力出奇迹」,Python 有两个压缩文件库:zipfile 和 rarfile,这两个库提供的解压缩方法 extractall() 可以指定密码,这样的话首先生成一个密码字典(手动或用程序),然后依次尝试其中的密码,如果能够正常解压缩则表示密码正确。 实验环境 本文采取的虚拟环境为 Pipenv,有关 Pipenv 的详细介绍可以参考我的这篇文章 👉《Python 管理哪家强?》 库 zipfile:Python 标准库,使用时直接导入即可 rarfile:Python 第三方库,使用时需要安装,API 文档(https://rarfile.readthedocs.io/en/latest/api.html) 利用 Pipenv 安装 rarfile pipenv install rarfile 最后,再将一个带有密码的压缩包放入实验环境中即可。 编码 知道原理后,编码就会非常简单了 准备密码本 「密码本」其实就是一个包含了所有可能密码的文件,用户可以手动录入,也可以用程序录入。文末还会有一个介绍。 读取压缩文件 # 根据文件扩展名,使用不同的库 if filename.endswith('.zip'): fp = zipfile.ZipFile(filename) elif filename.endswith('.rar'): fp = rarfile.RarFile(filename) 尝试解压 先尝试不用密码解压缩,如果成功则表示压缩文件没有密码 fp.extractall(desPath) fp.close() print('No password') return 暴力破解 try: # 读取密码本文件 fpPwd = open('pwd.txt') except: print('No dict file pwd.txt in current directory.') return for pwd in fpPwd: pwd = pwd.rstrip() try: fp.extractall(path=desPath, pwd=pwd.encode()) print('Success! ====>'+pwd) fp.close() break except: pass fpPwd.close() 程序入口 if __name__ == '__main__': filename = sys.argv[1] if os.path.isfile(filename) and filename.endswith(('.zip', '.rar')): decryptRarZipFile(filename) else: print('Must be Rar or Zip file') 使用 如果想要使用上述代码,我们只需在命令行执行python main.py <filename>即可。例如python main.py test.zip ...

利用Hexo搭建一个个人博客网站

什么是Hexo Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果。 推荐阅读Markdown——入门指南 如何安装Hexo 安装 Hexo 只需几分钟时间,若您在安装过程中遇到问题或无法找到解决方式,请在微信内回复,我们会尽力解决您的问题。 安装前提(windows环境下) 安装 Hexo 相当简单。然而在安装前,您必须检查电脑中是否已安装下列应用程序: node.js git 如果您的电脑中已经安装上述必备程序,那么恭喜您!接下来只需要使用 npm 即可完成 Hexo 的安装。 npm install -g hexo-cli 如果您的电脑中尚未安装所需要的程序,请参考以下安装链接指示完成安装。 Node.js安装及环境配置之Windows篇 - 简书 Git教程 - 廖雪峰的官方网站 安装Hexo 所有必备的应用程序安装完成后,即可使用 npm 安装 Hexo。 npm 通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。 npm官网 安装命令 npm install -g hexo-cli 如何利用Hexo建站 安装 Hexo 完成后,请执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。 hexo init <folder> cd <folder> npm install 就是你建博客的根目录 ...

372 words 2 min

利用Python让你的命令行像坤坤一样会打篮球

该图片由F. Muhammad在Pixabay上发布 完整代码可在公众号:「01二进制」后台回复:「蔡xx篮球」获取 前言 承接上文,作为一个经常逛b站的肥宅,近期b站上除了流行"品如”素材的视频,更多的莫过于蔡xx打球视频的了,有模仿的,有对比的,有手绘的,更过分的是竟然有人在命令行输出了他的打球视频,地址在:https://www.bilibili.com/video/av47306085?from=search&seid=11282891256876390136,不过视频中的动画好像是用某个软件生成的txt文件,看到这我就在想既然都可以用txt输出了,为啥不能用python在命令行中输出呢?说到这我便开始搜索资料,然后制作了下面一段视频: 代码是我在网上查询资料后自己修改的,本着学习和分享的精神,今天我来分享下上面这段视频的制作过程。 原理 既然要开始做东西,首要的问题就是想好要怎么做,大家都知道视频是由一系列图片一帧一帧组成的,因此视频转字符动画最基本的便是图片转字符画。 在这里简单的说一下图片转字符画的原理:首先将图片转为灰度图,每个像素都只有亮度信息(用 0~255 表示)。然后我们构建一个有限字符集合,其中的每一个字符都与一段亮度范围对应,我们便可以根据此对应关系以及像素的亮度信息把每一个像素用对应的字符表示,这样字符画就形成了。 Tips:如果对"灰度图像"这个概念不太理解的可以查阅百度百科 计算一张图片的灰度图像的方法如下(来自百度百科): 所以我们要做的就只是让字符画在命令行里面动起来就可以了。 Tips:图片转字符画可以参考:https://www.shiyanlou.com/courses/370 准备 环境和工具: vscode Mac OS python 3.7 这次实验使用到的核心的库是opencv-python,关于opencv上篇文章已经简单介绍过了,这里不多阐述了,只要知道这是一个和计算机视觉有关的库就可以了。 Tips:这里分享一个我觉得还不错的opencv-python的中文文档:https://www.kancloud.cn/aollo/aolloopencv/269602 实验 实验开始前我们需要安装opencv-python的包: pip install opencv-python 读取视频 def genCharVideo(self, filepath): self.charVideo = [] # 用opencv读取视频 cap = cv2.VideoCapture(filepath) self.timeInterval = round(1 / cap.get(5), 3) nf = int(cap.get(7)) print('Generate char video, please wait...') for i in pyprind.prog_bar(range(nf)): # 转换颜色空间,第二个参数是转换类型,cv2.COLOR_BGR2GRAY表示从BGR↔Gray rawFrame = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY) frame = self.convert(rawFrame, os.get_terminal_size(), fill=True) self.charVideo.append(frame) cap.release() 这里的VideoCapture是用来读取视频的,cv2.cvtColor(input_imageflag)用于转换颜色空间,其中flag就是转换类型。对于BGR↔Gray的转换,我们使用的flag就是cv2.COLOR_BGR2GRAY。对于BGR↔HSV的转换我们用的flag就是cv2.COLOR_BGR2HSV。 将帧转换成字符画 ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. " # 像素映射到字符 def pixelToChar(self, luminance): return self.ascii_char[int(luminance / 256 * len(self.ascii_char))] # 将普通帧转为 ASCII 字符帧 def convert(self, img, limitSize=-1, fill=False, wrap=False): if limitSize != -1 and (img.shape[0] > limitSize[1] or img.shape[1] > limitSize[0]): img = cv2.resize(img, limitSize, interpolation=cv2.INTER_AREA) ascii_frame = '' blank = '' if fill: blank += ' ' * (limitSize[0] - img.shape[1]) if wrap: blank += '\n' for i in range(img.shape[0]): for j in range(img.shape[1]): ascii_frame += self.pixelToChar(img[i, j]) ascii_frame += blank return ascii_frame 这段代码其实就是将已经转变的灰度图的像素值映射到ascii_char上,然后输出到控制台。 ...

plainify

卷积神经网络(CNN)的相关概念

传统神经网络存在的问题 说卷积神经网络前,我们要先说一下传统神经网络存在的一些问题,上图是一个典型的传统神经网络的示例图。设想一个场景,假设我们要训练的的样本图片是 100x100(像素)的,那么整张图片总共就是有 10000 个像素,那么在定义一个 传统神经网络的时候,输入层(input layer)就需要有 1w 个神经元,那么如果我们的中间的隐藏层(hidden layer)也需要有 1w 个神经元,那么总共需要的参数(权值)就高达 1 亿个(1w*1w),试想一下,这还只是一张 100x100 的图片就需要这么多的参数,如果图片更大之后呢,可想而知整个神经网络的计算量有多恐怖。当然,一旦权重多了之后,则必须要有足够量的样本进行训练,否则就会出现过拟合的现象。因此我们可以知道,传统神经网络有以下两个问题: 权值太多,计算量太大 权值太多,如果没有大量样本支撑则会出现过拟合现象 ...

plainify

又要春招了?

去年四月的时候,我在公众号「01 二进制」发了几篇和春招面试有关的文章,眼瞅着现在已经 2 月底了,马上又到了一年一度的春招黄金时期,即将找工作的你做好准备了么? 作为一个经历过春招的老狗,我决定在今年的金三银四到来前梳理下对大家春招可能有帮助的文章,也算是回馈我为数不多的公众号粉丝了,如果你觉得对你有所帮助,还请大家点赞关注支持一下 🌹 知识储备 作为一个计算机专业的学生,想要找到一份好的工作,知识的储备是毋庸置疑的。去年,我在公众号开了一个「技术科普」专题系列,主要是做一些知识的分享,争取用通俗易懂的方式介绍一些计算机知识,其目的就是要扩展读者们的知识面。 技术科普系列的链接在这 👉技术科普系列,其中有一些我觉得对你们的面试可能会有些帮助。 如何向女朋友解释在地址栏中输入网址后发生了什么? 科普系列——如何解释什么是 AJAX? 科普系列——从网购/直播入手理解什么是 CDN 聊一聊 RPC 浅入浅出消息队列 接口调度者——API 网关 想追女神?先学 Synchronized 吧 互联网是如何工作的? 面试时的刁难问题 对于校招生而言,面试官除了会检验一些基础知识,还会额外的对面试者的思考能力做一个评判,方式就是通过提出一些“八股文”之外的问题,所谓面试中的“八股文”也即各种面试宝典、面试题库里的题目。GitHub 上有很多这样的仓库,我就不一一举例了。 在掌握“八股文”外,如果可以对场景有更深层次的思考,是可以在面试中加分的。去年我同样在公众号中开了一个新的系列「每周一问」,目的就是解决一些在编程中遇到的一些可以让人产生疑惑的小问题,如果面试中问道了,而你刚好又看过了,岂不是赚了? 比如说为什么我们需要批量操作?就是我在淘宝转正面试时遇到的一个小问题,其实答案稍加思考就可以得出,只是平常我们很少对自己问出这样的问题,如果突然被问到可能会慌。虽然这个系列目前的文章数量比较少,但是我一直在更新,还请大家多多关注。 每周一问系列 👉每周一问 推荐文章 👇 为什么不建议在 for 循环里捕捉异常? API 与 SDK:有什么区别? 为什么我们需要批量操作? 刷题 「Talk is cheap. Show me the code」作为一个计算机专业的学生,编程能力无疑是最重要的,而想要在短短一小时的面试时间里判断出你的编程能力,最好的办法就是做题了,这个题目可能是算法题、也可能是面向对象的设计题,当然也有可能是写脚本的题目。因此平时的做题训练是必不可少的,我之前也曾在公众号中发过力扣的题解系列,可后来由于阅读量惨淡也就没有坚持下去了,这里我就不推荐了,建议大家自己去力扣上多刷题,上面有很多大神的题解。 简历 想要面试,第一步一定是投简历,因此简历的编写是一个极其重要的环节,我曾见到过很多人把无关紧要的信息填充在简历的正中央,这样显然是不好的。之前我在计算机相关专业实习指北一文中曾简单聊过如何去写简历,但也没有系统整理过,不过我的好友寒食君曾有一篇关于写简历的文章,我觉得还不错,这里分享给大家 👉收到上百份简历,其中一半被秒拒,原因出在这三个地方 面试心得 每一次面试都是一次重要的经历,而在面试完有没有好好整理总结面试中出现的一些情况更是衡量是否是一个好的面试者的因素。吾日三省吾身,面试完后回顾之前面试过程中可能犯的错、总结自己回答的好与回答的不好的地方相信对下一次的面试会有正面的帮助。之前我就在我的公众号中发过一些我以及我的好友们面试的一些分享和经验总结,不只是面经,这里列出来,希望能有所帮助。 计算机相关专业实习指北 从三本到 985 再到微软,他做了这些! 一个科班小前端的大厂面经 搏一搏,单车变摩托,记录一下我的淘宝实习面试 刚完一波蚂蚁金服的面试后,他说他累了 未雨绸缪,小米前端实习面经 最后 以上就是我整理的我的公众号中可能会对大家面试有帮助的一些文章了,今天推荐的文章基本上都是我的原创文章,如果你觉得对你有所帮助,还请大家点赞关注支持一下 🌹

plainify

双十一我在写什么代码?我加入淘宝的第一次双十一

看到标题大家可能还会有些诧异,这不是才刚刚国庆吗,怎么都开始写双十一的文章了。的确,虽然国庆还没有过完,但今年淘宝的双十一活动已经开始了。 我的上一篇文章是在 9 月 12 日发布的,直至今日一直没有更新的主要原因就是这半个月全身心的投入到这次双十一项目的研发中了。这半个月一个字总结下来就是 「累」,不仅仅是身体上的累,更有心理上的累。 短短半个月的时间,几十个令人无语的需求,没完没了大大小小的会议以及根本写不完的代码在前半个月疯狂摧残着我,不知多少个夜晚回到家已是第二天,一觉醒来继续重复着昨日的行为,总是会让我怀疑在这里工作的意义。 不过好在 10 月 1 日 0 点,这次的活动平稳上线了。虽然还有很多功能之后才会陆续上线,但连续半个月的连轴转总算是有暂缓脚步的迹象了,我也终于可以趁着这个国庆假期简单分享一下我来淘宝的第一个双十一了。 双十一活动 2009 年 11 月 11 日,是淘宝的第一个双十一,自那时起,每年的 11 月 11 日变成淘宝的一个固定节日(当然现在各种平台都会凑一下双十一的热度)。不过那一年我还小,我第一次听说双十一是在大学的时候,那个时候对一些电子产品感兴趣,双十一会有很大的优惠力度,不过可能是我的购物习惯导致的,蹲点抢购我一般是不会参与的。但是第二天我总还是会关注一下公开披露的数据,比如交易峰值,QPS 这些,毕竟是专业所致。去年实习因为个人原因没参与到双十一就离职回学校了,今年 7 月正式加入淘宝后,我迎来了自己的第一个双十一。 我所在的部门今年的双十一活动名为 「双十一种草机」,目前这个活动已经上线了,手机淘宝扫描上方二维码即可体验。其需要解决的问题痛点是 「想参与双十一,但是又不知道买什么」 。看到这可能有的人就要说了,整这么多花里胡哨的干嘛,直接像 PDD 一样,百亿补贴直接减免不就行了吗? 额,对于这点,我只能说,我就是一个写代码的,领导说要做啥那就做啥。至于为什么不直接像 PDD 一样直接减免如下图所示 👇 功能开发 我负责的功能是种草机活动的干预模块,其实要做的事情并不是很复杂,在不同时间段运营人员会根据当前情况对种草推荐/结果做一些紧跟时事的干预,比如增加某些优质内容的曝光量,或者拉黑某个劣质明星及其相关内容,一些敏感词过滤等等,大致流程如下图所示。 运营在某一个干预后台上可以进行一些配置的填写,前端同学负责搭建这个后台的页面,服务端同学需要将运营填写的配置数据落库,然后在前台履约的时候拿出这些数据。乍一看,确实没什么难点,不就是一个简单的 CRUD 功能吗?难不成阿里的双十一就这么简单吗? 后台数据落库 为了使整个干预模块形成一个闭环,我们需要从 后台数据落库 和 前台数据履约 两个角度去考虑实现运营干预。 对后台数据落库而言,的确就是配置数据的 CRUD,但难点在于对配置 数据的抽象。运营的配置需求千变万化,究竟是以何种方案实现成为了一个难点。如果每一类配置都作为一张表,那未来这个数据库将会出现 “数据表爆炸” 的情况,而且配置与配置之间并不是独立的,是有可能存在某种关联关系的,因此数据表的设计必须能够做到针对此类需求的通用性、易扩展。 其实本来写到这里的时候我是准备了一张简化后的数据模型图,但考虑到数据安全的问题,这里就用文字简单说明了,下一部分的前台履约同样。 可以说明的是,对于干预配置,设计的核心理念是 「一切都是配置」。在设计中,我们将一份运营配置分为两类属性:基础属性和表单属性。基础属性很好理解,如 ID、名称、操作人员、投放人群、投放时间等这些每个配置都会考虑到的东西。表单属性即运营后台呈现出来的需要运营填写的奇奇怪怪的属性,例如拉黑配置中的黑名单词,指定搜索词的头像等。 对于运营配置的基本属性以 树形结构 存储数据,通过 ParentId 指定配置之间的父子关系,通过 Group 指定配置类别,再通过唯一主键明确一个配置。采用树形结构存储将会天然支持此类运营配置的业务需求,理解起来也会更加自然。 ...

唔,突然就年中大促了啊

唔,突然就年中大促了啊 5月26日晚8点,618第一波预售活动正式开始,虽然各家都在紧锣密鼓的准备这个年中大促,但说到底活动的玩法、套路营销手段都是市场部等业务方制定的,作为技术人,究竟在大促活动中承担一个什么样的角色?以及大促活动究竟能带来什么改变,确是值得我好好考虑下的。 大促状态下的业务与技术 对于电商业务,既然有大促活动,肯定就会有日常状态,那么大促和日常究竟有什么区别? 相较于日常零碎的需求,大促的需求会更成体系,理想状态下,日常的需求基本上是各个产品经理在自己的盘口里反复横跳。搜索类的产品日常情况下只会提搜索相关的需求,推荐类的产品只会提推荐相关的需求。一旦到了大促,就需要各个盘口相互合作,以内容业务为例,往往是供给、用增、消费、搜索、公私域等盘口的联动,这时日常可能需要2-3个人日的需求就会变成可能需要40-50人日的团队作战。 由于业务需求更成体系,对于技术来说,就需要让整个迭代流程更加合理,无论是方案设计还是人力分配,这就很考验技术PM的经验与能力了。几乎所有的大促需求的时间是倒排的(大促开启时间是确定的),开发时间是十分有限的,因此一开始就要做足准备,可能涉及的上下游通知清楚,模块的边界划分事先明确,临时方案与通用方案的抉择,这些都是和日常态的区别。 也正是因为这些区别的存在,对技术也有着和日常不一样的要求。 全局意识 刚才说了因为需求更成体系,所以技术设计方案的时候也要更加合理。而想让方案更加合理就需要技术能真正的理解整个活动的玩法是什么样的。甚至可以说,技术应该要做到比业务更加了解业务(毕竟写代码的是技术不是业务)。只有做到这一点,才能真的站在更高的维度去看整个需求,才能知道如何规划系统,如何对齐资源,如何梳理上下游依赖关系,哪里可能会有坑,风险会在哪。 更加高效 对于一个技术团队来说,一个很重要的指标是效率。如何提高整个团队的效率是每个领导者需要关注的问题。现阶段我也只是一个大头兵,如何提高团队效率暂时不是我的命题。但有一点是确定的,只有团队里每个人更加高效了,整个团队才会更加高效。因此,如何在技术开发中变得高效就是每个技术人应该探索的命题了。 工具 首先是工具的使用。这里的工具不单单是开发工具,也包含一些效率工具。对于人类社会来说,生产工具的进步标志着生产力水平的提升。生产力最终是通过生产工具在人的作用下转换为产品的。这是生产过程必不可少的一环。 落实到每个人头上,最直观的表现就是一个好的工具可以给你节约非常多的时间。你现在还会使用netbeans去开发Java吗? 在这次618大促的开发过程中,有几个工具极大的提高了我的工作效率。滴答清单的子任务、语雀的小记、mindnode的脑图等。开发工具就更多了,首当其冲的肯定是idea,排查问题的Arthas,以及一众集团内部的工具与平台。 熟练的基本技能 正所谓技多不压身,多一项技能,在关键时刻往往会救你一命。 不熟悉git命令,怎么快速解决冲突?不熟悉jstack命令,如何快速定位问题?arthas命令不会用,怎么抓包排查问题? 为什么会出现OOM?为什么机器的线程数飙升?为什么机器会被限流?频繁ygc和fgc会给整个系统带来什么后果?在准备面试背八股文的时候大家都烂熟于心,但只有真的在现实场景下遇到才会意识到这些平时记得八股文是真的有用。 在掌握了一些技能与工具之后,如何沉淀出排查问题的方法论就是一个值得深究的命题了。哪些问题可以用什么工具排查,可以用什么方案解决,这些就要靠平时的积累了。记得多请教周围的师兄。 时间的合理分配 这就要说到另一个需要好好探索的命题了。如果单位时间内能做的事情已经到上限了,如何让一段时间里做到更多的事情?也即如何实现全局的最优解? 对于这种情况,我们可以将一些计算机科学的理论落实到实际生活中。 我们通常不喜欢被打断做事的节奏,此时如果把人比作一个计算机,那就是一个单核的计算机,这时你要做的就是不要频繁的切换上下文。 同样的,如果你只能做到单线程,做什么改进才能提高效率?一个很好的参考就是NodeJS的异步I/O模型。 有了这个输入,不妨考虑一下怎么把消息队列的生产者/消费者模型运用到人际交往中。 自1945第一台计算机诞生以来,为了让计算机拥有更高的效率,每年有无数的人才前赴后继投入到计算机科学的发展中,在更快更强上,计算机是多少天才智慧的结晶,可谓是提高效率最好的参照物。 更加健壮 代码 虽然做科研的一直流传着“凡是能靠怼硬件拿到结果的,就别做程序优化”的言论,但到了工业界,还是需要考虑成本的。无论多复杂的系统,都是靠一行行代码实现的,因此如何让系统更加健壮、稳定,最原子化的代码健壮一定是必不可少的。为了让VSCode拥有最高的运行效率,其开发团队几乎没有使用什么开发框架。虽然在现实场景下,我们的业务代码可能并不需要这么高的效率,但是清晰的逻辑、边缘case的全覆盖仍是我们该考虑的问题。 将代码写得像诗一样优雅应该是每一个技术人追求的目标。 架构 代码写的优雅,执行的高效,下一步就应该就是如何让架构变得更加合理了。 虽然“没有什么是靠增加一个中间层解决不了的”,但增加了一个中间层,虽然减少了耦合,却也意外的引入了一个不稳定因素,尽可能减少无用的依赖,合理的选择中间件,减少系统潜在的风险,DDD似乎是一个比较好的选择。 但是「没有银弹」也告诉我们没有一种单纯的技术或管理上的进步,能够独立地承诺在10年内大幅度地提高软件的生产率、可靠性和简洁性。因此架构的抉择本质上是一种取舍的艺术。 监控/预警 不存在没有bug的系统,只有还没发现的bug。如何做好监控与预警,如何实现问题的溯源、现场复原、快速响应在大促中尤为重要。 如果涉及权益、资产,对账监控怎么做?面对灰产、盗刷,怎么快速报警?面对大促时的尖刺流量,技术如何快速响应?真的出现问题,是止血还是启动应急预案?这些都应该是在大促开始前就要考虑清楚的问题,只有这样才能临危不乱。 (当然最好就别出现危险情况,325警告⚠️) 前台体验 对于一个toC的业务,就算真的系统出问题了,也不应该让用户感知。 以抽奖这个场景为例,如果抽奖QPS过高,导致服务端限流了(或者其他的什么原因导致服务请求失败),是告诉用户「前方道路拥挤」合适还是「很遗憾,未中奖」合适?答案不言而喻。 这里说一些题外话,从2021年开始,仿佛刮来了一股用户体验的风,各个头部产品都开始卷体验了,虽然这对于消费者来说确实是一件好事,但也从侧面反映了一些问题。如果不是真的没有东西可以卷了,谁会没事做去卷用户体验?(不过看起来天猫还是没学到教训,这次的活动又是复杂的很……) 更加乐观 做大促,真的会让人抑郁。尤其是在如今这种大裁员的背景下,外面人心惶惶,内部歌舞升平,似乎互联网马上就要完蛋似的。可说到底,大家追求的不过是碎银几两,乐观面对总好过日日碎念。