全部文章 | 第2页

葫芦七兄弟故事(一)

首先提一下葫芦七兄弟这个标题的缘由,因为在2020年4月,本人换了一个工作,进入了某A公司(不是不爱钱的那人开的公司);这个公司在现阶段是在线实时音视频做的还不错的一家,无论知名度还是市场占有率,都确实到了一定高度。

选择这家公司的原因其实也蛮简单的,主要是想通过公司的平台,对自身的技术有个提高和成长。加入公司以后却看到的不是成长和学习,而是首当其冲的就是被拉去支援隔壁大部门的工作,接着就是被各种神仙之间掐架时候的各种有意无意的误伤(说白了就是拿我指桑骂槐)。

显然透过这样的工作体验是奇差无比的,况且这里面也感到了一丝丝各种奇奇怪怪的工作氛围。

入职到今天,已经经过了9个月了。最近听到隔壁部门在做一些人员架构上的变动,听到这个消息的时候,实际上心里是有些不太舒服的。原因是隔壁组的老大要换,而过来的老大就是当初就是“恶心”过我的人。

书归正传,为何会写这个东西?

还是相对自己目前的工作状态和心里状态做一个回顾和梳理,避免一而再再而三的出现问题,反反复复的出错。同时也便于做一些及时的心态调整和变化。其目的还是为了减少这些糟心事对自己的影响,也可以适当的让自己有机会和精力朝着自己的目标去进行。

为何这样取名?

因为组里有7个人,而这7个人各有所长,也各有自己的性格特点。所以叫葫芦七兄弟比较贴切和理想。

这七个人是什么样的特点?

在我心里,这7个人的特点:

  • 老大,有自己的想法和目标,也有一定的能力,思维活络。但也许由于一些原因,又或许自身的性格特点,自己很少做一些团队工作方面的输出。或者说,在我眼里,在一些团队带领方面没有体现出管理者应有的素养(实际上很多管理者都没有)。我的新员工导师,导师这块我觉得还缺少了一些工作方面的引导(代码)。
  • 老二,年纪不大90后。不太爱多说,性格特点比较主观,有一定自我或自负的情况,不通融,不豁达。工作技能有一些比我强的地方,但可能由于一些因素,或自身自负的原因,似乎并不以为然。
  • 老三,年纪应该很大(应该是70后),似乎是做编解码出身的。起初打交道的时候,感觉还不错,能够提出一些正向且积极的意见和建议,但细细接触后发现,做事情有点拖沓,人水平不错。如果人能放下一些身段,踏实一些,不管是技术之路,还是管理之路,我相信都会不错很多。加上确实技术上有一定水平,我会很乐意找他做我的老师。
  • 老四,我。脾气大,不喜欢得罪人,但也不是什么老好人类型;不愿意直接面对工作上的矛盾;同时是一个说话“啰嗦”的人(这里面分为有真的啰嗦成分,也有别人有意或无意找的接口!)。技术功底一般,技术技能比较杂,不想一直这样杂下去,想沉淀某种技术。对目前团队信任感缺失,不太想发言,或者说在等待能够把自身感兴趣的技术做下去做深的机会。
  • 老五,其实老五和老六是同一天入职的。但后来听说老五本来也应该是4月份日志的,所以就区分开两个人了。老五是某不爱钱老板开的公司出来的,起初感觉还挺不错的,但后续不晓得是不是什么原因还是怎么的,总感觉老五做事会有几分此地无银三百两的情况;所以当时还在对老五做了一些留意和观察,对他还是尽量抱着友善的态度,但持续保持适当的距离。据说以前是做android media framework移植裁剪和维护等(搞android os里面),人技术应该挺不错的,但给我感觉做事目的性太强了,我有点怵,所以敬而远之。
  • 老六,人其实挺不错的小伙的。就是给人感觉太爱表现了,说话做事有很多时候很喜欢信口开河,对技术了解不深不扎实的情况下,也会随便说出来。人本身也许没有太多坏心眼,但是太急躁没什么好处,有时其实我也挺烦和他打交道的,说话给人感觉很喜欢瞎指挥,太把自己当回事的情况,而且影响别人的工作效率;夹带私货(心)的时候有点多,成分也有点明显。有几次我真的忍不了,搞不懂他到底想要干什么,如果技术top1的话到还没啥好说的,关键是没到这个水准,做事的那股样子给人就一个大佬的错觉样,确实很难受。有很多时候,我并不想和这种人打交道,因为提高太少了。
  • 老七,刚来。目前看上去还是挺谈得来的样子。和老大在同一个办公地点,最近活跃度降低了不少,预计身上事情在变多了。或者其他原因,后续再看。

今天先写道这里了,下一篇,我想重点写一写七兄弟,我对他们六个人的看法和感受,以及我所了解到他们可能对我的看法或感受。

2020年总结

本文来自我在老家的一个IT社区发的总结,直接复制过来。

为什么发这个话题

步入中青年阶段,想法开始复杂起来了。(就连装X都不在那么的简单粗暴,而是采取了更为凡尔赛的做法)
心中的困惑越来越多,曾经的疑惑少不少,也懂了是是而非和利弊权衡。说话学会了装腔作势和假装诗情画意(2333,单身狗相亲被虐出的技能)。

  1. 有时候,都快怀疑自己是不是成为了当初那个最讨厌人的样子。 夜空中最亮的星 – 逃跑计划
  2. 有时候,怀疑自己是不是选择和坚持是否是错的,或者不恰当。李白 – 李荣浩
  3. 有时候,想改变现在的状态。Say Yes – MKLA
  4. 有时候,那个人怎么这样,算了不想说了,说了没用,说多了还搞的大家伤和气,我还是买包瓜子和一个西瓜吃好了。演员 – 薛之谦
  5. 有时候,一直在问自己做人到底需要不需要继续保持着友善?(这里就不放歌了,Marilyn Manson的歌比较那啥)

回首过去

  • 小时候贪玩,高中中二且不听长辈的话,后来混了个大学文凭。
  • 毕业那个时候,看个网络新闻还管叫做“冲浪”,手机还是”hello moto”的黑白机;当时纠结于回老家,还是在外务工的选择。
  • 出于对专业的兴趣与常年叛逆的习惯,所以选择留在外面继续当一名代码施工人员。一晃十多年过去,母胎solo多年。看到严大大的回家帖子,我当时第一个反应是,喜提“勇于做决定和改变”。当时也心动了,原因很复杂。
  • 抱着试试的态度,2019年,分别选取了4个周末的时间回昆明分别实地踩点了几个处,同时也很荣幸的见到了社区的几位大佬,短暂的接触后,我就回所在的务工城市。这4次的实地踩点与同行/非同行沟通下来收获很多,也从各位昆明通那里学习了解到了很多信息和风土人情;很遗憾的是,我最后得到了一个结论:“尽管我也是一个土生土长的云南人,但我需要很多时间去调整和适应,两种地方民风民俗的差异,并积极融入和端正心态;已经接受并可能由此带来的一些落差”,这个过程中严大大着实打醒了我不少。
  • 2019-2020,继续围城,继续怂,继续修福报。一睁眼一闭眼一年就过去了,老男人又老一岁了。

现在

  1. 都说程序员要掌握四门基本功课,坑蒙拐骗,哦,不,是CRUD。混社会也有些时间了,坑的话,自然手到擒来;蒙,这个还行,对付一下QA基本够用;拐的话,还不太会,主要是不太喜欢内推和拉帮派啥的;骗,这个只能说还需要继续提高,毕竟现在都是互相骗的年代,招聘常年挂着,实际上就是不招人,找工作的简历注水,各种架构嘴到勤来。每天一个big story,距离上市又进了一步。
  2. 想沉下心来做事情,不想做业务,只想做纯纯的技术;可惜公司目前还没给这个机会。
  3. 羡慕别人自由,不需要为了下一顿操碎心。也羡慕别人能为了自己的梦去追寻,哪怕生活看上去没有那么华丽。
  4. 家里的是太多了(主要是长辈们的鸡毛蒜皮的矛盾),每年过年回家都快麻木了;听听就过,基本没进脑子,不管什么事,即便是教我如何做人的方面,只要不听就对了,越不听还越不见得混不下去。能够吸收这些经验的一部分同辈人(包括行为风格),情况有点不太好。
  5. 在外组建的老乡聚会,回家建设的大军在逐渐壮大,还留守务工的亲们的心,也在渐渐离去。或许是当初我太理想,又或许这就是社会阶层的不同,又或许我不配,又或许生活压倒人心。
  6. 自从上次骨折后,我的山地车也很就没骑了,虽然不愿提起,其实还是心理有所回避;太怕自己玩嗨了,又搞惊险刺激的骑法。

未来

  1. 加油吧,打工人。为构建老板不爱钱计划,努力吧打工人。
  2. 往走好30岁这个阶段的年纪,尽量成为一个不惑而有豁之人。
  3. 琐碎哪些破事少一点。

不变的梦想

  1. 有房
  2. 有个旅行车(汽车)
  3. 有辆维斯帕(300cc 就好)
  4. 有足够养老的钱

刚步入2020年11月,秋意似乎不太浓烈。不晓得今年的秋天会维持多久便会进入冬。

年底将至,2019年和2020年经历了一些看上去还是比较大的事情,而也正是这些事情可能会带给我今后一些人生轨迹和选择偏好有很大影响,也正因为如此,也才需要。

首先老生常谈的继续回顾毕业以来,或读大学以来自己的变化。

准备去读大学的时候 – 狂,因为考上大学了,以为自己牛逼了。

在大学里的时候 – 迷茫,在大学里没了保姆一样的老师,而是拥有者一大堆“不负责任”的老师存在。长时间和同学背井离乡的在一起时,真的有很多诱惑和“危险”(主要是自己对是非的判断上)。

大学毕业时 – 被迫接受现实,其实很简单,因为教育已经成为一种大众化商品。这不仅意味着大学在扩招,同时也意味着,大学教育不再要求继续强调单一技能过强。

工作第3年 – 接受现实,互联网这个概念的逐渐进入大家的视野,房价逐渐的暴涨;同时大家为了利益而渐渐“淡漠”。

工作第6年 – 为了自己,程序员圈子也渐渐的开始进入“关系化、圈子化、帮派化”。自己不太喜欢这种类型的社交,认为这样的社交太累,所以想让自己还在“年轻”的时候,多充实一些自己的工作技能,以此来规避“社交问题”方面的短板。

工作第9年 – 小拐点、棱角钝化渐渐凸显, 小拐点主要是还是工作和生活上都双双出现变化,有喜也有忧。经过社会毒打这么多年,棱角也渐渐钝化了一些。

工作第10年,遇到了很多问题,也渐渐的学会了一些问题的处理方式,心态也慢慢的平淡了很多;也懂得了舍与得。

其实我现在比较迷茫的是和人打交道方面、技术成长上。对于技术成长我所能做的就是选择相对正确的方向去努力,对于与人打交道方面,我就比较迷茫。

因为我在意很多方面:

1,和人打交道是很耗费精力的事情,不管是锻炼和掌握技巧,还是运用技巧。

2,我怕入戏太深,失去自己比较宝贵的品质

3,真的值得这样去改变吗?

以上这些情绪,某种程度上是可以看作是:患得患失+迷茫+固执的综合体。

要解开这个情况,我想所能做的还是先从遇到的一个沟通对象类型开始分类。

我遇到过的人里面,都有些什么样的特征?

  • 自负,自负的人最可怕,也容易被利用。因为这类人往往过于忽视自己的弱势,乃至很多时候并不关注幻想与现实中自己的差距有多大,容易沉醉在自己的“成就”中,或多或少的会放大自己的重要程度。以至于出现在某个领域和所有领域中都有无所不能的情况。与这类人沟通最累,而且累的最为简单。所谓最累且最简单,是因为这类人多数沟通起来,只需要适当的言行符合他想,或能够满足他自身的自大欲望,便可。如果在重要位置或领导位置,有可能比较难处理。因为有可能会出现对方自负其来会胡乱责怪队友的,猪一样的行为。
  • 懒惰,这里说的懒惰,主要还是指一些投机取巧,把事情推出去给别人做,这类人有别于推诿。这类人是单纯只想拿钱不干活,但又愿意把事情交出来给别人,或者类似磨洋工。这类人其实我很不会打交道,一方面是因为我自己的性格现阶段很难包容这类情况,另一方面这类人有时候会影响到他人事情的进度,有时候还会让人出现两难的情况。处理这类人最简单的办法,很多都是直接把时间拿过来做掉。
  • 推诿,推诿这个就比较难说清楚了;因为这里面会有很多主观评价成分在面。这类感觉主要还是在于事情不想做又不愿意交出来,或者想找点接口刁难一下,或者鸡毛当令箭的情况等等。这类人一般不好弄,基本是靠关系解决的问题。关系建立就比较复杂了。
  • 傲慢,傲慢的人基本都有种自命不凡的心态伴随着。这些人总觉得自己高人一等,这些人一般确实在某个方面会比他看不上的那些人会有一些优势。面对比自己更有优势的人,他们有承认自己不行的一面。傲慢的人,主要是还在于地方远不远沟通,如果愿意还是有机会调和沟通。如果不愿意,甚至难以沟通,那么敬而远之也只是某种下策。
  • 偏激,这种人做事情一般容易走极端,或极端化。以前的我就是这样的。偏激是一种特征,很难去衡量好坏,多数时候需要积极制止,但制止的方式方法很重要。
  • 唯利是图,这种人基本就是只看重利益了,利益是最重要的。不同的人程度会有所不同,有些程度比较重的人,就很危险。程度轻一些的,还可以适当的包容。
  • 帮派,有人的地方就有江湖。帮派这个东西,有好有坏,取决于帮派成立的初衷以及运作的目标。有些帮派属于纯粹技术累帮派,只要技术类型恰当也未必是坏事。但是如果是利益集团的帮派,那就比较复杂了。因为利益始终伴随着大量的复杂事情和问题的,这种帮派里牛鬼神太多,很难处理问题。
  • 论资排辈,有人的地方就有江湖。论资排辈的好处就是对“老人”给予足够的尊重和认可,但弊端就是“老人”的刚愎自用问题。这种情况下,很麻烦。
  • 友善,友善的人会有一定的人脉资源,但不见得就很多。因为人善容易被人欺,这也是越来越严重的一个社会现象。但友善确实可以在社交中甄别很多类型的人,这也可以视为一种试金石。
  • 真诚,真诚的人,也容易被人欺。因为也许你的真诚别人并不领情,或者觉得理所应当,或者简直就是多余。但真诚的本质是容易简化沟通,因为可以省掉很多猜疑、猜测、顾虑,容易建立默契。
  • 青涩,青涩其实是一种不成熟的表现。但也是最关键的时候,拥有社交青涩的人,往往有机会发展很稳固的长期社交关系。但也由于一张白纸,也容易被社会这个大染缸,染的五颜六色。

以上就是按照几种维度进行的分解,大部分人都拥有以上的几类情况,或一类情况。

本来就单单一类就够受了,有些类型的情况放在一起,真的有种极品的感觉。

其实我很难去运用比较恰当的方式和方法去应对社交中遇到的一些人,从品类上讲来说,真的太复杂。从我个人心态上讲,有时候真的于心不忍。

毕竟有句话叫做:“可怜之人必有可恨之处”。现在唯一做的比较还行的,就是心态上的快速调整和长期建设,能够适当的控制自己的心态,尽量不去影响其他方面的事情和做事节奏等等。但一遇到打交道的场合,就有种力不从心的感觉,想逃避是一方面,另一方面则是厌恶甚至是恶心。

在这块上,有时还只能拿那些不太难打交道的人来练练手,试着用几种沟通方式和方法来测试效果。同时也在和各种类型的人打交道时,尽量保持一定周期的回顾自身的情况和言行。

适当的做出一些调整和可行性的方案,有时真的挺难的。

先就这样吧,纠结了几个晚上了。难得的一次练手机遇,适当试试看。

【英伟达】nvenc/nvdec/sm关系猜测

因为不是做cuda相关开发,临时被拿来做调试一些相关代码。看到官方的一些介绍并不是很清晰,并没有完全说明cuda计算单元和nvenc/nvdec关系。仅仅提到nvenc和nvdec是两个编解码引擎。

并且还对特定显卡做了nvdec和nvenc的限制,对于一些老卡上,并没有nvdec和nvenc引擎。

官方给出的定义是nvdec、nvenc是独立于cuda核心,并不是很理解。或许nvdec和nvenc是相对于cuda核心的单纯的计算功能而划分出来给视频编解码使用的一个特定模块。

上网查了一下,以前的GPU加速编解码,实际上是利用cuda计算单元做一些数学计算,加快编解码速度。而nvenc和nvdec可以直接未编码数据或已编码数据进行处理。

那么这里就很好奇了,nvenc是一个单独的物理模块,还是一个逻辑模块。

通过对比实验发现还是稍有区别:

  • 第一个实验,仅使用nvdec、nvenc,以及ffmpeg的混流滤镜。得到的数据如下:
  • 第二个实验,通过外部加载一个推理模型。将解码好的数据丢给推理模型进行推理后,再返回解码,所有的过程均在显存中进行。

通过nvidia-smi dmon,可以发现除了流处理使用率有所增长,在程序初始化初期,从数据是上来看,可以推测nvenc和nvdec实际上还是利用到了部分流处理器,至于把这些流处理器拿来做什么就不得而知,也许只是作为解码初始化的一些树的加速计算,也许仅仅是被划分到nvenc、nvdec中参与编解码工作。

后续还需要一些相应深入和系统性的了解才好做判断。

【linux开发】semop执行出现EINTR错误

用信号量来做共享内存的互斥操作,执行semop阻塞式调用。

结果发现执行p操作(加锁)会较低概率不定期的出现EINTR失败,查看linux手册,看到如下片段:

也就是当线程正在对信号量进行操作时,刚好出现该线程捕捉到了一个信号,这时候刚好接收到某个信号执行了相应信号的相应中断处理函数。

这主要是由于信号是以进程为单位,而具体某个信号会被进程内部的哪一个线程执行,这是极有可能不可预知的(主要有操作系统而定)。因此在这种情况下时,如果semop执行出现了一个EINTR错误,那么只需要再次重启调用semop就好。

解决这个问题的办法有两个:

1,通过屏蔽掉大部分该线程不关心的信号来解决,但是这样有可能会出现误屏蔽的操作情况。

2,单独开启一个线程来执行sigwait,作为信号处理线程。

【英伟达】显卡无法正常工作的线索

前提条件

显卡类型:专业显卡

特征:具备内存ECC,和一些特定的纠错能力,其他暂时不清楚。

SRAM报ECC错误,导致申请显卡资源失败。

该问题是使用ffmpeg通过cuda api进行申请显卡资源出现报错,或出现长期卡顿不动的情况。出现该问题时,一般均为向驱动产生较高的并发请求,并伴随着相对高一些的负载情况下。

透过nvidia-smi可以看到相应错误为:

可以看到SRAM的错误计数器已经很大,并且是无法纠错的部分。sram又常常被用于寄存器,所以出现这类错误时,gpu状态已经出现异常了,且nvidia官方仅仅提供了显存页的重定向(“退休”),并没有相应寄存器的不可纠错异常处理,因此再这样的情况下时,只有通过重启硬件来尝试解决,并通过nvidia-smi重置显卡。

不过在官方的文档里,如果30天出现5次以上的SBE,基本就可以考虑返修。对于SRAM错误,估计也是离返修不远了,除非是纯vbios或其他软件部分的问题。

参考信息:https://docs.nvidia.com/deploy/dynamic-page-retirement/index.html

【英伟达】显卡官方名称的一些术语

最近在做一些编解码相关的优化,以及前段时间隔壁同事在做一些机器学习相关的内容。

当时公司配了T4、V100、T100的卡。一直并不真正理解专业卡和消费级卡到底有什么区别,为何要买。

  • 以前了解到的专业卡和消费卡的主要区别:

消费卡的渲染仅仅做表面,而专业卡会连同三维模型的内部也一同进行渲染,因此在相同流处理器数量一样的情况下时进行三维渲染时,消费卡输出图形数量会比专业卡极有可能更快,因为渲染步骤会少很多。

另外就是流处理个数不同,相同GPU核心大类的情况下,专业卡的流处理数量会比消费级更多。这些也仅限于之前的了解,包括gt8600时代的认知,因为后面的gpu核心架构变化比较大。

  • 现在挑选显卡需要了解几个术语:

cuda单元:NVIDIA显卡的基本计算单元,这个实在硬件设计时已决定,但也不排除实际数量大于配置数量,故意做了屏蔽的情况,比如之前就出现过一些gtx显卡的gpu芯片中的cuda数明显大于该卡宣称数量,其中有些网上解释为工艺问题,导致较高端卡批次不合格,降级为低端卡卖。类似intel和amd cpu工艺不达标降级达标卖一样。

流处理器:single Instruction MultipleThread,SIMT,可以看做是若干个cuda单元组合成的一个逻辑处理器。nvidia-smi中的sm就是流处理使用率。这个的数量由驱动和硬件配置来决定。

显存:不解释。但专业卡普遍支持ecc,消费级要近几年高端卡才有。在做一些要求可靠性高的计算时,这个很关键。

nvenc:nvidia的编码引擎,非开源,按照官方的介绍,这是由驱动+cuda构成,但网上又说这个也有独立的硬件模块存在。没有做过深入了解。

nvdec:nvidia的解码引擎,和nvenc类似。

cuvid:nvdec旧名,但不清楚两者真实的差别。

浮点数:这个在gpu上很受关注的问题,由于编解码,机器学习都需要用到。所以gpu在渐渐把支持的越来越好。

定点数:起初gpu做浮点数模拟的时候性能太差,导致性能比较差,因此之前的都是采用定点数来计算小数问题。精度丢失相对严重,导致编码出数据和计算结果有较大的误差。现阶段由于编码器算法的改进,这块失真在逐渐减小,以及浮点数的支持,也相对好很多。不过在机器学习上,还是很突出这块问题。

如果是做机器学习相关,可能在cuda数量方面会需要比较关注,同时还需要关注显存大小,据说模型加载也很耗显存。这块没做太多深入了解

如果是做视频编解码加速,那么需要关注nvenc和nvdec配置的数量,不同的卡配置数量不同。一般nvdec只有一个,nvenc会有大于一个的情况。同时nvdec和nvenc的能力也会不同,主要体现在支持的颜色空间,支持的编码参数等。

另外就是显存大小也要重点关注,一些分辨率和编码参数下,显存会成为一个比较主要的瓶颈。

人到三旬而惑,惑而有许则立

30岁这个区间段,在我读那个年代,那可是黄金年代。但在这个年代则是伪黄金年代,35一条线,要么在一个时间窗口期成龙成凤,要么极大概率处于止步不前或倒退的阶段。

从小我其实并不喜欢读书,但喜欢上学。因为有很多小朋友可以一起玩,属于学习成绩极端且不稳定的差生,这也导致了我初中高中学习中的困难原因之一,同时也造就了不喜欢读书,心中也就只有那么一个老师还算敬佩或听他话的情况。

最终的后果就是,文科成绩一塌糊涂,甚至连母语的语文课程中作文都写不来,几种文章类型,没一种是我会写的。

好在初中时期,老师要求我们读报纸,做剪报,并写相应剪报的观后感。从那时开始,我就渐渐的学会了些观后感的同时,也发现我其实对“技术”新闻非常关注,也比较感兴趣。同时对一些社会和经济类新闻也关注;随着读物从普通新闻到专业新闻,某种程度上也让自己的知识面拓宽的同时,增加了一定深度。

写观后感的时候,其实我发现,不仅仅是将自己的想法记录下来,同时也是反观自己对客观事物的理解维度,理解角度等方面。

由此也开始写起了日记,当然,当初的我是不愿意被别人窥视心里,所以我特意写了两本日记,一本是老师安排的作业,另一本而是自己真实想记录下的日记。自己的那本日记,有时记录一下经历,有时记录一下自己的想法,有时也会做一些自我检讨,在写的同时也会通过平时补充的一些心理学知识,对自己的一些行为和心理活动试着做一些反观。就如这个blog里面的一些内容一样。

三十而惑,如果本科毕业就进入社会的话,算一算也算是混社会十年左右的熟练江湖人群了。该懂的规则,该清楚的玩法,不说滚瓜烂熟,至少已经从感性认识升级到了基本的理性认识阶段。

既然这样,为什么会惑呢?因为选择!正直壮年,脑子好用,身体还行,混社会经验基本积累达标,有时对未来可期也可预期,有时未来可期但不可预期,也有时未来不可期更不可预期;懵懵懂懂事实而非。

为何这样?因为半瓶醋!人在基本理顺当下之时,便会在阶段内更顺风顺水,但殊不知这样的情况下,人会逐渐萌生自负。更有甚至会由阶段性的舒适期或自负期,发展为本位主义,且将其固化并巩固为顽疾。人和人之间的不友好,扯皮也有一些原因由此而生。

惑是为豁、知、克等维度准备,一旦自我解惑过程不恰当,人就失去了豁达,自我认知,自我克制,如果自己社会地位高,社会资源丰富,这还好说;但万一自己的社会附加属性很平凡,那么很容易让自己停留在当下社会地位或降级为更底层情况。

最近换了工作,来到人均年龄29-30的公司,按理说这是一个比较尴尬的平均年龄。因为人在29-30之间,就是一个非常尴尬的年纪,要说能混社会,这倒不一定,毕竟还算年轻,还能继续压榨几年劳动力。要说社会混不来,只要稍微踏实一点点,用青春换钱这也是一条出路。

所以30这个年龄段,我疑惑了,因为我不想成为当代盲流,或盲从一些社会价值观。因为长久胜过短期,长久的过程中无限可能,不过前提是良好前景的长久,短期那就是一锤子买卖,未来已定。

所以在这疑惑之年,我很想找到一种适合我自己的方法,既然自己在当下能够尽量顾及眼前利益,也能够为未来做好准备,必要时可以舍短(期)换长(期)。这都是三十而立的根本目的和基本原则。

也望自己能够走好吧,现在也刚好在一个比较社会的环境里;也是一种实践和学习的最佳机会,难得可贵。

linux进程信号处理

最近在查coredump的时候,一直发现堆栈不完整。于是很好奇abort的信号默认情况下会如何处理。

网上查了一下,发现信号分为进程间信号多线程间信号

进程间信号,即进程之间可以互发信号,也可以进程内部某个线程来产生信号。由系统库提供支持。

多线程间信号,即线程之间互发信号,且指定具体线程来接收并处理。由pthread库提供支持。

由于coredump的抓取过程,应该没有做过特殊处理,因此使用的就是进程间信号。那么进程内,当某个线程执行某个代码时,产生了abort信号,信号会由谁来负责处理?实际测试的结果是由具体产生abort信号的线程来处理执行。

查了一下网上的解释,信号的处理,是由内核态准备切换回用户态时来处理,由于在态切换时,主动地插入了一个函数跳转指令,进而转为执行信号处理函数。因此由产生abort信号的线程来处理实现即简单,也符合逻辑。

由于是中断处理,这一点上可以看做和windows类似。

未来的不确定,令人是喜或忧,细细品一品,又耐人寻味和受教匪浅

偶然的机会,听到了Sergi Vicente的歌,后来就渐渐开始关注他。听歌会影响一个人的心境,也能够间接的反应出,现阶段人的心境如何。

在听Sergi Vicente的歌时,偶然听到了Suite Intima这首歌(网上Suite Intima – Sergi Vicente即可听到)。

长达13分钟的歌,能听出至少三种情绪表达。差不多2-3分钟为一个篇章。单曲循环,一遍又一遍,前60%的音乐有着很强烈的共鸣。

当我年纪小时,我看到的社会就是:叔叔、阿姨、爸爸、妈妈、老师、同学、吃喝玩乐和无休止的学业。

踏入大学,“终于可以玩了的心态”和“我是万能的,我很牛X”伴随了我大学的前两年,大三大四开始,我无休止的焦虑、焦急和迷茫。

一方面,面领着继续升学还是踏入社会。另一方面,面领着家里总是絮絮叨叨的希望我回老家工作,一个人在“外面”(省外)太辛苦了,回老家才是父辈们根深蒂固的传统思维。

至于升学,因为自己小时候贪玩导致基础只是掌握不是很好,复习考研很吃力。尽管经过了一年多的备战,发现模拟题达标率还低于60%,心里就开始发慌发毛,开始自我怀疑,怀疑自己的选择是不是错误的。尽管后面还是和努力的去试图提高自己的模拟成绩,但内心的焦躁一点都没有缓解。

至于就业,我大学的专业是电子信息工程,从外界看这可是当年的热门专业,但站在我们自身看,虽然是热门专业,但就业面其实在当时有一定的首先。因为我们偏向于信号和硬件,而硬件和信号是中国的短板,其可就业的主要方向位于珠三角地区那就是欧美部分国家。出国?想多了,出国有很多种出法,有偷渡,也有拿绿卡去世界一流企业干一份技术含量高,收入不错的高精尖工作。但每年国内双一流学校往国外输送那么多人才,我们这种不入流的公办院校学生,还是只能喝汤。

介于就业和升学的双从压力下,我发现这样无意义的纠结下去两个事情都很难推进,于是我给自己定了一个plan a和plan b。

plan a:考研复习到大四上学习结束,如果模拟达标率还低于70%,直接转向找工作路线。

plan b:如果考研模拟题达标率成功稳定在70%,那么先参加考研,但找工作同步进行。只不过把重心适当的往考研方向靠。

因为心中有了一个较为清晰可行的思路,因此手中有粮,心中不慌。但可惜的是好景不长。很快进入大四,家里看状,也加紧了通过电话的说服教育,意图毕业后就回老家,考研的话家里支持的,就算考上研也还是期望回老家。

本来身心就在承受着巨大的压力,加之家里的不理解行为,让我一度陷入崩溃边缘。我认为我作为一名大学,我应该有我独立自主思考和选择的机会,只要这个选择不是特错大错的就好。

因为作为一名大学生,在大一新生的时候,碰巧遇到了《疯狂的石头》热播,导演和主演来我们学校给大家做交流,我逃军训期间偶然“闯入”这样交流会,见识到了和家里(长辈)“作斗争”不一样的思想。

因为在大一和大二期间,看到了熊丙奇写的两本书。

因为在大二,遇到了在摩根士丹利和华为的前辈们的思想开导。

因为在大三开始,看到了浙大强哥的一些讲座视频录像。

我对大学受教育的理解发生了一些变化,大学已经不再单纯追求成绩的地方,而是将人的思维、独立性、三观再塑养的最后一道关卡。因为接下来就是社会这个大环境。

所以呢,也和家里产生了很强的对立想法和对抗行为,自己当然需要进行下去的事情还需要继续。就这样持续了2个月左右(半个学期)。后来发现不对,这样不是办法,完全是徒劳且耗费精力的持久战,我自己最终会被拖跨。

所以我又改善了plan a和plan b。

新plan a:考研复习到大四上学习结束,如果模拟达标率还低于70%,直接转向找工作路线。但是现在本地(杭州)找,实在找不到,在考虑回老家找。

新plan b:如果考研模拟题达标率成功稳定在70%,那么先参加考研,但找工作同步进行。只不过把重心适当的往考研方向靠。工作杭州和老家一起找,如果考研成功读研,如果失败就看工作找的情况,老家工作不错回老家,杭州的工作不错回老家。

在新的计划里,会发现,针对在老家找工作的态度有强烈的差别化。为何这样?因为,考研一旦采取放弃的方式执行,那么我唯一还能搏一搏的就是在杭州找个工作,镀个金在回老家也来得及。

那么为何考研采取不放弃的方式还需要老家和杭州一起开找工作呢?因为研究生对父辈来说,看不见摸不着,也没有了解过是什么,更没有办法了解,万一考研成了,他们有可能会有强烈的疑惑,所以通过回老家找工作这条路堵住他们的嘴。万一考研成功,跑回来读研,也可以让旁人帮我说话,毕竟父辈嘛,永远都是别人家说的话比自己女说的话更可信,你懂得(中国式家庭)。

后来奈何家里怎么“骚扰”和“干涉”,我心态就是相对平静和安稳。

来准备毕业了,即将毕业了。因为本人基础实在太差,心虚,加上精力分散过于厉害,考研没参加,放弃了。

但换而来之的是,工作出奇的好找。班上的很多同学都还在苦恼的时候,我已经随便面试就能成,而且面试机会差不多是至少20来个,安排的满满当当,连饭都来不及吃。当大家都在一片哀嚎时,我似乎有点另类。当时还觉得有点奇怪为何这样,可能是我真的幸运?

直到活到现在,一次次回首去总结经验和寻找原因,我才发现。心态很重要,规划也很重要。

心态首先平和,能够让自己有更广的机会,心态的重整做,能够让自己有更好的环境适应性,心态的细粒度微调,也是让自己的规划能够随着事态发展而在不较大改变大方向的前提下,适当的适应当下。

规划,有规划意识,是产生规划的前提。紧接着心态与规划行为的相辅相成作用,便可行程可行又相对灵活且大方向变化微乎其微的规划,结果也才能尽量达成。

很多事不是能够一气呵成的,我也是踏入社会这多些年,才一点一点的搞清楚。要说幸运的话,只是我刚开始的行事风格和目标有较大概率符合达成目标条件罢了,一个瞎猫碰到死耗子情况而已。

正因为未来有着很多的不确定,才会让人着迷,回过头去想一想,其实也不见得有这么多不确定,只是因为没有经历过,缺少有效的办法去发现和分析而已。人生就像一坛酒,有些酿出来的那就是醋,而有些只是口感一般的酒;再有一些就是口味不错,回味无穷的好酒。其原因还是酿酒过程中的一些关键性因素把握罢了。

关闭win10默认的音效增强

可能是驱动的原因,也可能是win10自带音效增强做了改变,最近更新系统后,总发现声音不对,低频听似被增强,但事实上有很重的混响情况。

查来查去发现DTS和驱动自带的音效并没有启动,后来就想到会不会和win10自带音效是否有关,结果发现确实有关。具体步骤为以下。

打开声音配置界面如图
找到对应的声音设备,并打开属性

勾上禁用所有声音效果,即可关闭默认的音效,让该设备声音输出恢复到较原始的情况。

编译freeswitch踩的那点坑

由于虚拟机里面装了ubunutu 18,本来想直接装freeswitch的deb报,进行方案快速验证和freeswitch学习。结果,按照官方的步骤去执行,发现源有问题。

接着就进入了苦逼的编译过程,说实话,对freeswitch的官方文档表示迷惑,不是很习惯文档中描述的内容跳来跳去的样子。后来找来找去,就零零散散的参考按照了以下几个文档进行下去,基本采取默认配置,并没有作为其他配置修改

https://freeswitch.org/confluence/display/FREESWITCH/Installation
https://freeswitch.org/confluence/display/FREESWITCH/Ubuntu#Ubuntu-InstallfromRepo
https://freeswitch.org/confluence/display/FREESWITCH/Linux+Quick+Install+Guide#LinuxQuickInstallGuide-GenerateInstallationandConfigurationFiles

首先先说一下步骤:

安装依赖

apt-get install git-core subversion build-essential autoconf automake libtool libncurses5 libncurses5-dev make libjpeg-dev liblua5.3-dev

apt-get install libcurl4-openssl-dev libexpat1-dev libopus-dev libgnutls-dev libtiff4-dev libx11-dev unixodbc-dev libssl-dev python2.6-dev zlib1g-dev libzrtpcpp-dev libasound2-dev libogg-dev libvorbis-dev libperl-dev libgdbm-dev libdb-dev python-dev uuid-dev libpq-dev libsndfile-dev

sudo apt-get install gawk

update-alternatives --set awk /usr/bin/gawk

下载freeswitch代码

FSfile=$(curl -s https://files.freeswitch.org/releases/freeswitch/ | grep -oE “freeswitch-[0-9].[0-9].[0-9]*.-release.tar.bz2″ | tail -n 1) && echo Downloading $FSfile && curl https://files.freeswitch.org/freeswitch-releases/$FSfile | tar -xj && mv ${FSfile/.tar.bz2//} freeswitch

编译x264

这是为了启动mod_av模块的时候,而进行的准备工作,以下命令行为:

./configure --enable-static --prefix=/usr --enable-pic

 make ; make install 

编译ffmpeg

如果不编译ffmpeg,或不安装libavformat-dev就进行执行./configure,又刚好开启了freeswitchmod_av,那就会出现You must install libavformat-dev to build mod_av. Stop错误。

在网上查一同,会发现需要编译libav,事实上却被大坑了一把。这主要还是由于ffmpeg与libav的关系有关。

libav是从ffmpeg拉出的一个分支,网上对libav说法很多,又说libav是从早期版本拉出来,也有说后来libav已经和ffmpeg的master保持同步等等。

但真实去编译的时候,发现了一个巨坑,也就是freeswitch报错AVFormatContext中不存在url成员。到ffmpeg和libav官网上一查。发现最新版本的libav确实没有这个变量,而ffmpeg 4.x的文档里有。果断改成编译ffmpeg。

另外还要喷一下libav的官方文档,各种详细说明藏的非常深。。。

下好ffmpeg 4.x的源代码后,开始编译

./configure --enable-shared --enable-gpl  --enable-libx264 --enable-pic

make && make install

编译libk

 git clone https://github.com/signalwire/libks.git  

 cd libk  

 cmake . 

 make ; make install 

编译signalwire-c

git clone https://github.com/signalwire/signalwire-c.git

 cd signalwire-c 

 cmake . 

 make ; make install 

mod_lua编译不过

尽管安装了lua的开发库,但还是会出现找不到lua头文件的情况,找到

/src/mod/languages/mod_lua/Makefile

并找到如下行

DEFAULT_INCLUDES = -I. -I$(top_builddir)/src/include -I$(top_builddir)/libs/esl/src/include -I$(top_builddir)/libs/xmlrpc-c

修改成

 DEFAULT_INCLUDES = -I. -I$(top_builddir)/src/include -I$(top_builddir)/libs/esl/src/include -I$(top_builddir)/libs/xmlrpc-c -I/usr/include/lua5.3 

并到/usr/lib/x86_64-linux-gnu下

对liblua.so做个软连,即

ln -sf liblua5.3.so liblua.so

出现implicit declaration of function ‘ks_json_get_object_cstr’; did you mean ‘ks_json_get_object

由于版本不一致引起的,freeswitch、signalwire-c和libks版本不要一致,需要换版本。由于我用的freeswitch是1.10版,所以直接用9月份附近的这两个库就没问题了。

切换libks与signalwire-c版本后cmake不过的问题

直接从github上下载release的1.3.0版本,出现了cmake不过的情况:

— cotire 1.7.10 loaded.
Platform is linux
Build type: Debug CXX Flags:
Install prefix: /usr
LibKS Version 1.3
CMake Error at CMakeLists.txt:291 (string):
string sub-command REPLACE requires at least four arguments.
Found UUID setup target at imported location: /usr/lib/x86_64-linux-gnu/libuuid.so

看了一下cmake的配置文件,报错的位置主要是为了生成一个changlog文本,直接注释掉这行即可

#string(REPLACE "\"" "" CHANGELOG ${CHANGELOG})

阿斯顿

注意点

由于configure在执行的时候,会检查大部分依赖是否存在,但仅对关键依赖进行报错,且输出的检查内容太多以至于没有那么多耐心去看。

因此在出现configure不报错,make期间有某个mod编译失败的话,那就必须要用排错后,再次执行configure在进行make,反正就是各种复杂和扯淡。

编译完成后的运行

由于freeswitch会加载相应的mod,还有配置文件,所以需要执行一下make isntall;假设在configure阶段没有指定具体的prefix,就会默认安装到/urs/local/下。如果不需要这样,可以明确指定perfix位置。

运行freeswitch,执行 ./freeswitch即可

srs-bench代码整理及理解

废话不多说,直接上图,以下是对srs-bench主要模块的一个梳理:

srs-bench支持对srs进行压测,其支持的范围有:

rtmp推流

rtmp拉流

hls拉流

http请求

hls拉流:

hls的拉流是,先产生一个http请求并拉去m3u8文件,解析后并顺序请求ts文件,当请求完毕后,下载任务挂起,一般挂起时长为当前模拟播放的ts文件的duration大小。

等挂起被唤醒后,再次请求m3u8文件,并更新未下载的ts文件列表后,开始请求ts文件。若本次更新的m3u8没有发生变化,那么将进行再次挂起,挂起时长不大于当前模拟播放的ts的duration。

http请求:

首先对某个url进行请求,请求之后将会产生挂起,挂起时长主要有进程启动时的入参决定。

rtmp推流:

rtmp推流进程启动时,首先会和srs在rtmp协议上进行协商,协商完成后,会读取入参时指定的flv文件。并按照当前flv tag和下一个flv tag的时间差挂起数据发送任务。

但这里需要注意的是,如果rtmp推流的压测里指定了2个以上的并发,但又由于srs-bench只支持一个flv文件输入,那么文件打开的次数会很多次,并且读取的flv数据在协程中未共享的,因此在该测试中,这一块可以改经一下,毕竟单线程的任务来说,不存在加锁问题,因此也就可以考虑是否做到一次性将数据读到内存里,所有协程共享数据发送;以此来提高测试程序的执行效率。

毕竟协程在io上不是强项。

rtmp拉流(非fast):

对于非fast的rtmp拉流,其整个协议过程是完整的rtmp client。只不过对拉下来的流不做解码等处理,仅仅是针对协议上做一些校验和处理而已。

rtmp拉流(fast):

类似非fast的流程来说,只是收到的数据不再做rtmp协议的校验了。

go环境在vs code中的几点坑

由于某些不可抗拒的原因,要搞go,事实上我是非常抵制,主要原因还在于go的开发环境等都不够成熟,另外也没有必要非要用go,除了由于python的gil性能问题意外,其实c、c++、python就已经足够满足大部分开发需求了。就连音视频部分的绝大部分都已经能够胜任。

唉,在vs code中虽然配置看上去虽然简单,但由于go语言本身坑爹的编译环境加之vs code整体性不如vs,因此还是遇到不少坑。

坑爹一:在使用go调试代码时用到了dlv,非调试运行环境也最好用dlv,不要用code runner。

具体表现为,使用start without debug,不要使用run code。由于在gopath的问题上,code runner在go开发环境上本着能坑死一个算一个的目标,让人哭笑踢飞。

持续更新中…….

大小端安全简单访问技巧


bool srs_is_little_endian()
{
// convert to network(big-endian) order, if not equals,
// the system is little-endian, so need to convert the int64
static int little_endian_check = -1;

if(little_endian_check == -1) {
union {
int32_t i;
int8_t c;
} little_check_union;

little_check_union.i = 0x01;
little_endian_check = little_check_union.c;
}

return (little_endian_check == 1);
}

通过上面代码片段可发现little_check_union的大小只有4个直接,通过访问最后一个字节来判断当前平台(软件+硬件平台)大小端情况。

同时也可以利用union来进行访问,这样的访问方式较直接安位操作来说简单性能差一些,但也只一种较为简便和安全的做法。(虽然不是绝对安全的做法)