一、运维项目管理
创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目网站制作、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元黄州做网站,已为上家服务,为黄州各地企业和个人服务,联系电话:18980820575
工作职责:
1、负责IT资源项目的管理工作,确保项目团队协同工作;
2、负责IT资产管理和定期资产盘点工作;
3、跟踪IT资源的使用,并对数据进行分析,完成日常报表;
4、协助IT成本管理工作,预算制定、供应商沟通等。
职位要求:
1、具备数据敏感性和探知欲、分析和解决问题的能力、良好的数据呈现能力;
2、工作认真、负责、严谨,有良好的团队合作精神;
3、有良好沟通能力和技巧;
4、有外语沟通能力、海外背景优先。
二、数据开发工程师
工作职责:
1、负责直播业务的数据调研,数仓模型设计,ETL开发,任务监控和优化等;
2、负责数据仓库多场景的应用产品建设,如快报,告警推送等;
3、负责基于数据仓库之上的数据探索,如特征工程,标签挖掘等;
4、负责数据管理相关的开发和实施。
任职要求:
1、计算机、数学相关专业全日制本科及以上学历;
2、熟练使用SQL, 了解数仓ETL开发;
3、熟悉R、Python、Shell等脚本的至少一种语言,有实战经验的优先;
4、有Java/Golang 开发经验优先;
5、业务理解能力强,技术学习能力强,工作积极主动,有良好的团队合作能力。
三、前端开发工程师
工作职责:
1、参与哔哩哔哩各产品线web前端研发工作;
2、优化产品交互逻辑,提升产品易用性;
3、参与前瞻性技术的研究,为持续性的产品创新做准备。
职位要求:
1、精通HTML、CSS及JavaScript等Web前端技术;
2、具备跨浏览器、跨终端的前端开发经验;
3、了解至少一种Server端语言(Node.JS/PHP/Python/Java等;
4、熟悉一种使用较广泛的前端框架;
5、具备扎实的计算机基础,对数据结构和算法设计较为深刻的理解;
6、学习能力强,具有良好的沟通能力和良好的团队合作精神。
四、测试工程师
工作职责:
1、负责哔哩哔哩客户端和服务端测试工作;
2、参与制定测试方案,设计并执行测试案例,整理对应项目测试文档;
3、跟踪线上反馈问题,协助开发定位和推进解决问题;
4、参与对项目流程和工具进行优化,提升整个项目的交付效率。
职位要求:
1、计算机相关专业,本科以上学历;
2、熟悉软件工程、软件测试理论和方法,熟悉相关的测试流程和软件工程原理;
3、对二次元互联网产品感兴趣,善于学习接受新事物,具备良好的文档编写习惯和能力,良好的团队协作能力,有较强的逻辑思维及自我学习能力;
4、熟悉一门或者多门编程语言者(Python,Java,Golang等)优先。
五、游戏测试
工作职责:
1、能够根据游戏功能设计文档,以及根据游戏实际内容表现编写测试用例;
2、根据测试用例对游戏进行功能测试,能及时发现产品缺陷,对测试中发现的问题进行及时的记录、跟踪、反馈、分析;
3、负责撰写测试报告;
4、负责bug生命周期的跟踪反馈,能协调相关人员定位bug,协助研发人员修复bug;
5、对iOS,Android双端进行兼容性测试。
任职要求:
1、本科及以上学历;
2、热爱游戏,对自己玩过的游戏在特定的领域有自己独到的见解;
3、严密的逻辑性,能客观分析问题并通过图文工具表述;
4、有积极上进心和强大的自驱力,抗压能力强;
5、有良好的团队合作精神,优秀的沟通技巧,以及高度的职业素养;
6、平时有追番的习惯。
扩展资料:
B站主要业务:
1、直播
哔哩哔哩(bilibili)直播是B站推出的国内首家关注ACG直播的互动平台,内容有趣、活动丰富、玩法多样,并向电竞、生活、娱乐领域不断延伸。
“电竞+游戏”都是B站直播的重要品类。目前B站已经覆盖了包括《英雄联盟》LPL职业联赛、《DOTA2》TI国际邀请赛、《王者荣耀》KPL职业联赛等在内的各大赛事;在泛娱乐直播方面,B站则以音乐、舞蹈、绘画、美食、萌宠、明星访谈为主。
此外,B站也在开拓学习直播、虚拟主播等新兴直播品类。2019年一季度内,共有超6000位虚拟主播在B站开播,观看人数近600万。
2019年12月6日,B站宣布获得《英雄联盟》全球总决赛S10至S12连续三年(2020年至2022年)的国内独家直播版权。
2019年12月19日,哔哩哔哩直播宣布签约冯提莫。
2、游戏
B站是国内重要的二次元游戏分发渠道,代理了超 500 款联运手游,13 款独家代理游戏,及1 款自研手游。
从2014年开始,bilibili开启游戏联运和代理发行业务,成功推出《梦100》《FGO》《碧蓝航线》《幻想战姬》《Fate/Grand Order》《明日方舟》等多款业内知名游戏,并帮助《阴阳师》《崩坏3》等产品获得成功,是当前国内一家二次元游戏发行平台。
2019年,与腾讯全球联合发行的听觉探案游戏《Unheard-疑案追声》在Steam上线后升至国区热销榜第二位,一周之内售出15万份。
2019年7月,B站首次举办独立游戏发布会,发布包括《一起开火车!》、《妄想破绽》在内的5款独立游戏。
3、广告
B站广告业务主要分为效果广告和品牌广告。2018年,B站举办了对广告主的广告推介会AD TALK,首次开放自制内容的招商。
在2019年的AD TALK上,B站明确了自己的商业化进程,宣布2020年将向所有品牌合作伙伴开放生态。B站确定开放的生态资源包括14部国产动画、15部纪录片、6部综艺、30余位UP主、11项大事件以及电竞、虚拟偶像等。
4、电商
B站拥有自己的电商平台“会员购”,于2017年上线,以漫展演唱会票务、手办、模型、潮玩、周边的销售为主, 在不到两年的时间已经占领了二次元票务域最大的市场份额。
2019年10月底,B站今年的电商业务GMV已经突破10亿元。
参考资料来源:华南农业大学-上海哔哩哔哩科技有限公司2020招聘简章
使用go语言的好处: go语言的设计是务实的, go在针对并发上进行了优化, 并且支持大规模高并发, 又由于单一的码格式, 相比于其他语言更具有可读性, 在垃圾回收上比java和Python更有效, 因为他是和程序同时执行的.
1. 进程, 线程, 协程的区别, 协程的优势
2. 讲一下GMP模型(重点)
3. Go的GC, 混合写屏障(重点)
4. go的Slice和数组的区别, slice的扩容原理(重点)
5. 讲一下channel,实现原理(重点)
6. 讲一下Go的Map的实现原理, 是否线程安全, 如何实现安全(重点)
7. new 和 make 的区别
8. 说一下内存逃逸
9. 函数传指针和传值有什么区别
10. goroutine之间的通信方式
11. 测试是怎么做的(单元测试, 压力测试)
12. 堆和栈的区别
请实现 个算法,确定 个字符串的所有字符【是否全都不同】。这 我们要求【不允
许使 额外的存储结构】。 给定 个string,请返回 个bool值,true代表所有字符全都
不同,false代表存在相同的字符。 保证字符串中的字符为【ASCII字符】。字符串的
度 于等于【3000】。
这 有 个重点,第 个是 ASCII字符 , ASCII字符 字符 共有256个,其中128个是常
字符,可以在键盘上输 。128之后的是键盘上 法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使 额外的储存结
构,且字符串 于等于3000。
如果允许其他额外储存结构,这个题 很好做。如果不允许的话,可以使 golang内置
的 式实现。
通过 strings.Count 函数判断:
使 的是golang内置 法 strings.Count ,可以 来判断在 个字符串中包含
的另外 个字符串的数量
还有不同的方法同样可以实现,你了解吗?
推荐go相关技术 专栏
gRPC-go源码剖析与实战_带你走进gRPC-go的源码世界-CSDN博客
原文:【 】
如果有解答的不对的,麻烦各位在评论写出来~
go的调度原理是基于GMP模型,G代表一个goroutine,不限制数量;M=machine,代表一个线程,最大1万,所有G任务还是在M上执行;P=processor代表一个处理器,每一个允许的M都会绑定一个G,默认与逻辑CPU数量相等(通过runtime.GOMAXPROCS(runtime.NumCPU())设置)。
go调用过程:
可以能,也可以不能。
因为go存在不能使用==判断类型:map、slice,如果struct包含这些类型的字段,则不能比较。
这两种类型也不能作为map的key。
类似栈操作,后进先出。
因为go的return是一个非原子性操作,比如语句 return i ,实际上分两步进行,即将i值存入栈中作为返回值,然后执行跳转,而defer的执行时机正是跳转前,所以说defer执行时还是有机会操作返回值的。
select的case的表达式必须是一个channel类型,所有case都会被求值,求值顺序自上而下,从左至右。如果多个case可以完成,则会随机执行一个case,如果有default分支,则执行default分支语句。如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行。
break关键字可跳出select的执行。
goroutine管理、信息传递。context的意思是上下文,在线程、协程中都有这个概念,它指的是程序单元的一个运行状态、现场、快照,包含。context在多个goroutine中是并发安全的。
应用场景:
例子参考:
waitgroup
channel
len:切片的长度,访问时间复杂度为O(1),go的slice底层是对数组的引用。
cap:切片的容量,扩容是以这个值为标准。默认扩容是2倍,当达到1024的长度后,按1.25倍。
扩容:每次扩容slice底层都将先分配新的容量的内存空间,再将老的数组拷贝到新的内存空间,因为这个操作不是并发安全的。所以并发进行append操作,读到内存中的老数组可能为同一个,最终导致append的数据丢失。
共享:slice的底层是对数组的引用,因此如果两个切片引用了同一个数组片段,就会形成共享底层数组。当sliec发生内存的重新分配(如扩容)时,会对共享进行隔断。详细见下面例子:
make([]Type,len,cap)
map的底层是hash table(hmap类型),对key值进行了hash,并将结果的低八位用于确定key/value存在于哪个bucket(bmap类型)。再将高八位与bucket的tophash进行依次比较,确定是否存在。出现hash冲撞时,会通过bucket的overflow指向另一个bucket,形成一个单向链表。每个bucket存储8个键值对。
如果要实现map的顺序读取,需要使用一个slice来存储map的key并按照顺序进行排序。
利用map,如果要求并发安全,就用sync.map
要注意下set中的delete函数需要使用 delete(map) 来实现,但是这个并不会释放内存,除非value也是一个子map。当进行多次delete后,可以使用make来重建map。
使用sync.Map来管理topic,用channel来做队列。
参考:
多路归并法:
pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假设有K路a href=""数据流/a,流内部是有序的,且流间同为升序或降序;
/pp data-block="0"(2)首先读取每个流的第一个数,如果已经EOF,pass;
/pp data-block="0"(3)将有效的k(k可能小于K)个数比较,选出最小的那路mink,输出,读取mink的下一个;
/pp data-block="0"(4)直到所有K路都EOF。
/p/pre
假设文件又1个G,内存只有256M,无法将1个G的文件全部读到内存进行排序。
第一步:
可以分为10段读取,每段读取100M的数据并排序好写入硬盘。
假设写入后的文件为A,B,C...10
第二步:
将A,B,C...10的第一个字符拿出来,对这10个字符进行排序,并将结果写入硬盘,同时记录被写入的字符的文件指针P。
第三步:
将刚刚排序好的9个字符再加上从指针P读取到的P+1位数据进行排序,并写入硬盘。
重复二、三步骤。
go文件读写参考:
保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同的排序叫稳定排序。
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法。
基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
参考:
head只请求页面的首部。多用来判断网页是否被修改和超链接的有效性。
get请求页面信息,并返回实例的主体。
参考:
401:未授权的访问。
403: 拒绝访问。
普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。减少新建和断开TCP连接的消耗。这个可以在Nginx设置,
这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
特别注意TCP层的keep alive和http不是一个意思。TCP的是指:tcp连接建立后,如果客户端很长一段时间不发送消息,当连接很久没有收到报文,tcp会主动发送一个为空的报文(侦测包)给对方,如果对方收到了并且回复了,证明对方还在。如果对方没有报文返回,重试多次之后则确认连接丢失,断开连接。
tcp的keep alive可通过
net.ipv4.tcp_keepalive_intvl = 75 // 当探测没有确认时,重新发送探测的频度。缺省是75秒。
net.ipv4.tcp_keepalive_probes = 9 //在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应
net.ipv4.tcp_keepalive_time = 7200 //当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。一般设置为30分钟1800
修改:
可以
tcp是面向连接的,upd是无连接状态的。
udp相比tcp没有建立连接的过程,所以更快,同时也更安全,不容易被攻击。upd没有阻塞控制,因此出现网络阻塞不会使源主机的发送效率降低。upd支持一对多,多对多等,tcp是点对点传输。tcp首部开销20字节,udp8字节。
udp使用场景:视频通话、im聊天等。
time-wait表示客户端等待服务端返回关闭信息的状态,closed_wait表示服务端得知客户端想要关闭连接,进入半关闭状态并返回一段TCP报文。
time-wait作用:
解决办法:
close_wait:
被动关闭,通常是由于客户端忘记关闭tcp连接导致。
根据业务来啊~
重要指标是cardinality(不重复数量),这个数量/总行数如果过小(趋近于0)代表索引基本没意义,比如sex性别这种。
另外查询不要使用select *,根据select的条件+where条件做组合索引,尽量实现覆盖索引,避免回表。
僵尸进程:
即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程,僵尸进程实际上是一个已经死掉的进程。
孤儿进程:
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。
但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。
原文链接:
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免方法:
端口占用:lsof -i:端口号 或者 nestat
cpu、内存占用:top
发送信号:kill -l 列出所有信号,然后用 kill [信号变化] [进程号]来执行。如kill -9 453。强制杀死453进程
git log:查看提交记录
git diff :查看变更记录
git merge:目标分支改变,而源分支保持原样。优点:保留提交历史,保留分支结构。但会有大量的merge记录
git rebase:将修改拼接到最新,复杂的记录变得优雅,单个操作变得(revert)很简单;缺点:
git revert:反做指定版本,会新生成一个版本
git reset:重置到某个版本,中间版本全部丢失
etcd、Consul
pprof
节省空间(非叶子节点不存储数据,相对b tree的优势),减少I/O次数(节省的空间全部存指针地址,让树变的矮胖),范围查找方便(相对hash的优势)。
explain
其他的见:
runtime2.go 中关于 p 的定义: 其中 runnext 指针决定了下一个要运行的 g,根据英文的注释大致意思是说:
所以当设置 runtime.GOMAXPROCS(1) 时,此时只有一个 P,创建的 g 依次加入 P, 当最后一个即 i==9 时,加入的最后 一个 g 将会继承当前主 goroutinue 的剩余时间片继续执行,所以会先输出 9, 之后再依次执行 P 队列中其它的 g。
方法一:
方法二:
[图片上传失败...(image-4ef445-1594976286098)]
方法1:to_days,返回给的日期从0开始算的天数。
方法2:data_add。向日期添加指定时间间隔
[图片上传失败...(image-b67b10-1594976286098)]