2021腾讯暑期实习面经
TEG 一二面一面 2021.03.123.10的上午接到第一次电话,但是在上课就挂了,打回去结果是AI
3.11下午还在摸鱼,然后又打过来了,问第二天下午3点有没有时间,然后冲了(
头一天接到电话没有问是什么部门的,面试开始的时候面试官自己介绍了一下是TEG的(我怎么还被广州捞了啊
首先是自我介绍
结束了之后开始问项目(整个面试过程都在问项目,一点算法都没问),项目是寒假赶工赶出来的俱乐部Web
Web程序有用户鉴权吗(有,但是只针对管理员)
你的这个项目使用了Django,那么你知道Django的用户鉴权是怎么实现的你清楚吗(不清楚,没来得及看过)
怎么存储的用户信息,例如密码,怎么保证安全性,如果让你来设计保存,会怎么进行保存(哈希,加盐)
加盐的话使用的字符串都是同一个吗(在我构想的加盐方案中是这样)
加盐是为了防止什么(防止暴力跑彩虹表之类的)
你的项目里还使用了RSA,主要是用来干什么?(登录认证,balabalabala)
你使用公钥对用户信息进行加密,但是中间人截取不是也可以用来进行登录(不能,用户一旦登录成功服务器会销毁记录)
项目用的什么数据库(Postgresq ...
Google二次验证
该博文用于记录一下Google二次验证的生成及验证过程,以便以后需要用的时候不用到处查资料×
密钥生成在文档中查询到二次验证密钥属于Base32编码,所以在服务端生成密钥时使用的是随机字符串通过Base32后得到的字符串截取前16个字符作为密钥,实际上只要是Base32编码字符串,不管长度都可以。为了保证安全性可以取更长的编码字符串。
实际上这一过程也可以直接放在客户端生成,但是写的时候还是直接放在的服务端,主要也是为了通过进行字符串的混淆添加一些密钥信息到随机时间戳中保证一定的安全性
12345678def generate_secret(): timestamp = int(time.time()) half = len(secretString) // 2 import_str = secretString[:half] + str(timestamp) + secretString[half:] #添加其他信息到随机时间戳中 digest = hashlib.sha256(import_str.encode('utf-8')).he ...
Bukkit服务端插件开发(三)
昨天才把Ver 1.0放出来,只实现了简单的功能还没进行细节的完善
子命令配置将目前功能命令进行修改
/bvote setid [room_id]:设置绑定房间id号
/bvote setworld:设置当前世界为受影响世界
/bvote time [random|static] <args>:设置间隔时间为随机或定时
/bvote switch:设置插件状态
对于子命令的实现,之前进行time指令的实现中使用参数的方式可以进行实现
但是在游戏中输入指令的时候没用补全提示,现在需要实现的就是补全提示
在查阅了文档和一些开源代码后,在插件主类中可以覆写一个onTabComplete方法,其声明如下
1public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args);
在主类中,可以通过判断参数然后返回一个列表作为待选的可以通过tab补全的子命令,而在onCommand中可以使用参数实现子命令
项目中的命令是通过实现Comm ...
Bukkit服务端插件开发(二)
有点摸了,现在开始复习下学期考试然后每天只修一点bug,所以这一部分的内容不是很多
线程分离在进行插件的测试过程中,存在一个问题,输入指令/debugvote之后,记分牌能够正常工作
但是由于在这之前插件的运行是单个线程,在插件的相关程序运行的过程中需要等待程序运行结束
这就导致了在客户端看来能够正常移动,但是在这个过程中服务端却是在运行命令程序的
PS:突然想起来之前用一些插件的时候也会出现类似的问题不知道是不是也是这个原因
Bukkit中提供了org.bukkit.scheduler中的相关类用来解决线程的问题,但是进行异步调用的时候,子线程中是不能调用Bukkit中提供的API的
准确来说,是只能调用Bukkit中提供的线程安全的API
关于线程安全的问题,在mcbbs上了解到关于MC本身的一些操作不是线程安全的,具体的函数还不是很清楚
但是,在插件开发的过程中最好是将一些需要调用API的方法放到主线程中进行实现
对于这个问题,可以通过在异步线程中调用Bukkit中的同步调用
在项目中的实现如下:
DanmakuListener中开启异步线程对弹幕进行监听
12345 ...
Bukkit服务端插件开发(一)
前言:
博客停了很久没更,主要也是上一个学期一直摸鱼,没啥写的
然后开发的项目也一直放着,完成度比较高的就是课设和机器人的API,没什么好写的
之前打算用在MC建筑中使用的插件也是鸽了很久没动,因为那个东西除了我需要一个填充功能之外想不出其他的功能了
然后这个假期除了开发BilibiliVote之外还会改一下机器人API的前后端代码
而这一系列的博文仅仅在开发DanmakuVote过程中的一些记录,后续或许会系统的把Bukkit相关的东西整理一下
本项目仓库地址:DanmakuVote
DanmakuVote基本构想这个插件其实也是测试了一下土豆的HyperScape,然后看到有一个插件可以获取bilibili直播间弹幕发送到游戏中
土豆的这个游戏里面有一个观众互动性比较高的功能,每局游戏可以让观众投票一个事件,然后票高的事件接下来会在游戏中发生
那么结合bilibili直播间信息获取的一个接口,是不是可以考虑将这个功能在Minecraft中进行实现
那么基本的一个思路就是这样:
插件只有服务端,仅仅考虑直播间播主为腐竹(OP)的情况,当然后续开发中还可以进行扩展
OP指定一个世 ...
Minecraft Forge服务器搭建
放一个Minecraft服务器搭建的博文,免得后面什么时候要用上又把过程忘了。。。
这个教程后半段是参考了网络上的教程,因为现在没有搭建的需要所以还没进行实际操作(逃
此处搭建服务器为linux服务器,minecraft版本为1.12.2
安装MCSManagerMCSManager用于网页端管理mc服务器,不需要可以跳过这一步
MCSManager仓库
# 安装 Node 版本控制工具(若没有 wget,请安装它)wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash# 关闭终端重新打开再执行以下命令# 项目支持 8.0 版本以上,这里使用11版本nvm install 11.0.0nvm use 11.0.0# 克隆仓库git clone https://github.com/suwings/mcsmanager.git# 进入目录cd mcsmanager/# 安装依赖库npm install# 启动面板sudo npm start #或 sudo node app.js
...
celery任务队列学习
学习celery是为了后面写一个抢票系统,先咕咕咕一下。。
本文主要实现在Django中使用celery,安装模块为django-celery celery redis
Celery的基本架构(此处是一堆废话)
Celery的架构有三个部分:消息中间件、任务执行单元、任务结果存储
消息中间件(Broker):任务调度队列,接收任务并将任务存入队列。Celery不提供队列任务,本文使用RabbitMQ(因为我配置的redis一直没法让celery连接上)
任务执行单元(Worker):任务执行处理单元,它实时监视消息队列,获取队列中调度的任务并执行。
任务结果存储:用于存储任务的执行结果,以供查询
Django中celery的配置首先配置环境,python环境安装celery django-celery,本地配置 RabbitMQ数据库,我本地建的项目名为CeleryTest
项目基本目录结构:
123456789101112131415161718CeleryTest├── app│ ├── __init__.py│ ├── admin.py│ ├── apps.py ...
记一次小程序开发
锲子本来以为参加不了已经凉了的比赛,后面被学长拉进了坑然后四个人连着开发了十天,设计方案改了又改最后重新定了方向最后三天通宵两天才弄完。
一开始接触这个比赛是在10月份的时候被拉去跟着搞腾讯的云开发讲座,然后当时也想组队参加但是没有点子也就没怎么想了。
正式开始开发的时候才发现比赛所给的API还有一系列操作过于睿智,甚至图片切割的API都是用自己服务器实现。
得到了些什么
对JS的异步处理熟悉了一些
了解了一个应用程序大概的设计模式
明白了在团队中交流的重要性
了解了微信小程序的开发流程
明白了自己所学过少
接触到了一点python网络编程
知道了在多人项目中使用git进行版本控制的重要性
大概可以开始django + vue的博客项目了
明白了互联网公司的996是怎么来的
小记在一开始学长想的方案是做一个基于腾讯云人脸识别API的寻人平台,但是在开发了5天的时候发现这个项目对于找到人的一方用户是没有驱动力上传图片的
于是后面换成开发一个寻宠平台,但是这个规划后面也凉了,因为在一次讨论分工过后突然发现我们的核心功能离AI越来越远
在思考了半天(真的是半天)之后,另外一个学长想到可以做 ...
《汇编语言》学习笔记
寄存器(reg): CPU中存储数据的器件
在8086CPU中,有14个寄存器,可以分为8个通用寄存器、1个指令指针寄存器、1个标志寄存器以及4个段寄存器
通用寄存器:用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。AH&AL = AX (accumulator):累加寄存器,主要是在进行运算的时候存放操作数,同时所有的I/O指令都使用这一寄存器与外界设备传送数据BH&BL = BX (basic):基址寄存器,用于地址的索引CH&CL = CX (count):计数寄存器,用于计数,在移位操作以及循环(loop)时作为隐含的计数器DH&DL = DX(data):数据寄存器,用于数据传递。在书中以8086CPU为例,如果是要用32位的数作为被除数时,通过使用DX与AX存放数据,DX放高16位,AX放低16位SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置(也就是当前栈顶的偏移地址)BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置SI(Source Index):源变址寄存器,可 ...
逆向工程学习--Acid burn
0x00 前言
这些CreakMe小程序是从吾爱破解上找到的160个练习然后最近在学逆向&汇编就拿来练练手
0x01 注册码的破解最近才开始学用Ollydbg不熟悉。。然后快捷键还有功能什么的还没有把握所以一开始动态调试就是一个断点一个断点的下跟踪程序的运行,要找到主要执行的地方就异常的慢。。看了一下别人做的才学会在运行过程中F12直接暂停程序运行跟踪汇编位置。。程序界面是这么一个样子:就是要输入用户名对应注册码的样子,先随便输入一个,然后等提示框,F12暂停定位到对应的位置Alt-K到堆栈界面,可以看到MessageBox函数的调用有两个对MessageBox的调用,能大致确定是下面一个才是后面弹出提示框的时候调用的函数然后进到这个函数的位置,在调用MessageBox的函数头部打个断点,再重复一次运行到断点位置能看到右下角的栈窗口看到被压栈的有个可疑的字符串。。试一试输入然后提交试试,然后就成功了调用的这个函数应该是为了输出失败信息,然后在这之前应该有一个函数是用于验证注册码的,可以在栈里看到,这里用于下面的分析注册码生成算法
0x02 注册码算法分析从上面调用Messa ...