面试经验-上汽数字化产品交付-OC
前言人生第一次求职面试,形式是电话面,持续时间 16 分钟。
开场白
以为面试官是 HR,说了 HR 您好。面试官说自己是负责部门业务的,那就是技术面了。
看到你的当前实习经历内容非常丰富,感觉比较适合我们岗位。
内容自我介绍
Q. 介绍一下你自己
A. 首先介绍了学校背景,然后根据开场白重点介绍了我现在的实习工作。
说着说着多说了点实习内容,听着面试官没怎么回应了,直接转向自己的一些优点:
学习和适应能力强,迅速结束介绍。
从这里我能感觉到,面试官不太在意太深入的项目细节,那就可以转换思路,从做出的工作成果方面下手。
实习经历
Q. 这个超长时间的实习,为什么要在里面实习,你在里面主要负责些什么。
A. 首先介绍实习背景,老师把我放在这个课题中,(刚才优点说的有点少了,在此补充)以及导师为什么让我负责一整个模块,突出业务能力强。
项目经历
Q. 介绍一下你的 2023 年 - 2024 年的一个简历中的项目,介绍内容。
A. 不清楚是哪个,请您提示我一下。
Q. 一个 Unity 项目,因为我们智能座舱有用到该技术,介绍一下。
A. 原来是毕业设计,轻松介绍了。
首先从技术栈 ...
LC-day-10-二叉树的遍历
前言二叉树算是比较简单的数据类型,也是常用的数据类型。
二叉树有多种遍历方式,前序、中序、后序、层序遍历。
中序和层序遍历写起来有些不同,记录一下。
前三种遍历都可以借助栈实现迭代遍历,不用递归。
层序遍历则可以借助队列。
前序遍历遵循 中-左-右 方式输出
123456789101112131415161718public List<Integer> preorderTraversal(TreeNode root) { if(root == null){ return new ArrayList<>(); } Stack<TreeNode> stack = new Stack<>(); List<Integer> res = new ArrayList<>(); stack.push(root); while(!stack.isEmpty()){ TreeNode node = stack.pop(); ...
LC-day-09-单调队列与优先级队列
前言第一次遇见这种数据结构,记录一下。
比如:滑动窗口和高频元素,这两个题我觉得都挺接地气。
滑动窗口这题主要是获取每个窗口中的最大数并记录,和时序有关。
高频元素就像是 top-k或者 tfidf,都有其实用场景。
实现单调递减队列单调队列有着巧妙的插入方式。
插入: 如果插入的比末尾数大,就向前清理,维护递减序列
弹出: 如果弹出的是头部数(也就是最大的那个),就正常弹出,其他的忽略
由于维护了有序性,所以弹出的时候不可能出现弹出数比当前数更大的情况,其他的都被最大的那个删掉了,所以其他的可以忽略。
1234567891011121314151617181920212223242526class MyQueue{ Deque<Integer> deque = new LinkedList<>(); /** * 如果删除的是头部数,弹出,其他的不用管 */ void poll(int num){ if(!deque.isEmpty() && num == deque.pee ...
LC day-07 字符串匹配
前言现在才想起大二算法课的良苦用心,秋招还得再捡起来。
KMP 一直是老大难问题,实际上就是一个 next 数组求法。
Next 数组为什么要有这个东西? 方便快速跳过相同前缀,不用匹配到一半发现不对又回去从头重新匹配。
所以 next 是指,匹配失败了,下一个找前面的谁。
比如下面两个字符串比较:
aafaabaafaab
aabaaf
求出 aabaaf 的 最大匹配前后缀数组:[0, 1, 0, 1, 2, 0]
全部 -1 得到 next 数组:[-1, 0, -1, -1, 1, -1]
涉及到一个求 next 数组的算法:
12345678910111213141516171819202122private int[] next(String s){ int[] next = new int[s.length()]; int j = -1; next[0] = j; for(int i = 1; i < next.length; i++){ // 0 已经设置好了 while(j >= 0 && s.charAt ...
ShareDB 文档共享代替 Socket.io 复杂信令交互
前言Socket.io 实际上有点过于底层了,大量的消息交互都需要人工手写,复用性也不强。
为什么 ShareDB 这种做腾讯文档的能够用来做消息传输呢,其原理和 Socket.io 一样,都是用了 WebSocket 连接来进行双工通信。
我们的需求是建立一个共享区域,多个设备使用同一账号登入,此时协作修改会引发操作冲突。
如果仅使用纯消息传输方式,如 手机-发送修改->Socket Server=广播修改=》其他设备,会产生一些问题:
如果手机和电脑操作了同一块上下文,使用谁的修改?
如果多人同时操作了同一块上下文,操作如何合并?
如果操作之间有冲突,怎么解决冲突?
ShareDB 使用 OT 解决了这一问题,OT 是 Operational transformation 的简称,是一种在高级协作软件系统中支持一系列协作功能的技术。OT 最初是为了在纯文本文档的协作编辑中保持一致性和并发控制而发明的。
这种保证最终数据一致性和并发控制的协作控制机制能够应用到更广的范围。
设计最初使用 Socket.io 的场景就是 WebRTC 直播服务的流媒体更新通信和房间管理,这些存 ...
微服务初探
前言生产力就是王道,谁能够更短时间做出更多工作,谁就能胜利。
保障生产力持续在线的最佳方案就是:将琐事交给工作流
需求搭建一个在线小说阅读编写网站
功能如下:
实现登录、注册
实现小说编写、阅读、查询、收藏
实现评论查看、发布
依赖如下:
使用 SpringBoot、Vue 框架,实现前后端分离
使用 Spring Cloud 构建微服务
技术要点业务逻辑明确、简单,不做赘述,我们讲讲微服务。
什么是微服务我们在没有接触技术之前,或仅仅道听途说,很容易产生畏难心理。
实际上,微服务就是把我们具有多种功能的单体服务,拆分成内聚性强的个体,方便解耦。
就拿我们的项目举例,用户登录注册逻辑连贯,共享用户表格,可以拆分。
又如评论模块,尽管使用了用户模块的 ID、小说模块的 ID,但其功能独立,可以拆分。
这样我们通过拆分,就得到了多个服务,每个服务放到一个服务器上,这样就能将原本的单体服务高压力,分散到多个服务器上,从而提升服务可用性。
服务注册与发现如果是单体服务,我们在前端只需注明它的 IP 地址就好了,但是微服务有多个 IP 地址,我们怎么管理?
如果我们没法预知服务器 IP, ...
webRTC 开发工作总结
前言在接手项目时,前端开发人员已经编写了基于 Peer.js 和 Socket.io 的单点连线直播间。
这对于我后续的开发来说,是引导,也是桎梏。
成果按时间顺序排序
成果名
优先级
耗时
产出物
评价
前端直播应用(单网页)
极高
无
直播主和观众两个页面
前端开发人员已完成的 demo
— 我在此时加入团队,并进行了方案变更 —
基于 srs 的媒体流服务器
低短
极长
部署文档
项目本身没有选择的技术栈,从当前的收益来看是值得的
前端直播应用(适配 srs)
极高
中等
多个直播相关页面
项目模块化的基础
— srs 项目改造初步完成 —
前端推拉流 sdk
高
短
sdk 项目
实用,且一直沿用
前端链接、媒体与信令管理工具包
极高
极长
三个工具类
非常实用,但是尝试多次打包到 sdk 中均未成功
— 项目管理级 —
录播与点播
高
中等
一个回调服务器、部署文档
实际效果不佳,技术选型限制了此部分的发挥
模块化组件
中
短
多个最小可用组件
模块化进程进展又快又好
— 项目模块化完成 —
项目集成 ...
在防火墙阻挡UDP包的情况下部署SRS
前言这个问题的解决方案在官方文档中已经给出了
实现准备工作首先你需要有一台不能从外部发送 UDP 包的服务器(大部分私有服务器都是这样吧)
可以用官方推荐的工具进行测试
启动 SRS12# 换成服务器外网地址CANDIDATE="127.0.0.1"
12345678docker run --name srs -it \--network="host" \--env CANDIDATE=$CANDIDATE \-v /app/srs/conf/:/usr/local/srs/conf/ \-v /app/srs/objs/:/usr/local/srs/objs/ \registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 \./objs/srs \-c conf/my.srs.conf
为什么 CANDIDATE 要换成服务器外网地址
可以看到,除了上面的客户端请求服务器 url 和服务器回传 SDP 是经过 https 代理之外,其余数据传输过程都是根据 SDP 包含的 CANDIDATE 和 udp 端口交 ...
利用SRS作为纯媒体流服务器实现SFU流转发(不含信令)
你想要的流水线1docker run --name srs -it --env CANDIDATE=$CANDIDATE --network="host" -v ~/workspace/srs/conf/:/usr/local/srs/conf/ -v ~/workspace/srs/objs/:/usr/local/srs/objs/ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 ./objs/srs -c conf/my.srs.conf
12cd ~/workspace/httpx-static/httpx-static./httpx-static -t 80 -s 443 -k server.key -c server.crt -r -proxy=http://127.0.0.1:1985/api/v1/ -proxy=http://127.0.0.1:1985/rtc/v1/ -proxy=http://127.0.0.1:8080/
1go run server.go 8085
前言首先要清楚 Web ...
OmniParser-v2 gradio 示例 在 python310 版本下没有输出的解决方案 及 Jeston 部署
前言使用的 Jetson Orin Nano Super Developer Kit (8G) 已经安装好了 ubuntu 22.04 系统,本文在此基础上进行的探索
Jetson AI lab 教程
OmniParser-V2
环境配置OmniParser 要求 python 3.12
但是 Jetson 使用的 torch 等工具只能使用 python 3.10
因此,我们选择 python 3.10 来继续探索
Firefox1sudo apt install firefox
Anaconda使用 firefox 去官网下载吧
1bash xxx.sh
新环境使用 Anaconda 创建一个新环境
1conda create -n omni python==3.10
CUDA 工具链 以及 torch跟随教程(从第二步开始)->教程
第四步会报错,可以试试不做
做完第五步结束
测试 torch cuda
123import torchprint(torch.__version__)print(torch.cuda.is_available())
OmniParser 依赖1 ...