VR公司资深开发工程师,主要关注的领域为音视频,软件安全。热衷开源,喜欢写作。
用golang实现一个小程序商城后台系统(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法。
实现一个简易的Unity网络同步引擎Netgo 目前GOLANG有大行其道的趋势,尤其是在网络编程方面。因为和c/c++比较起来,虽然GC占用了一部分机器性能,但是出错概率小了,开发效率大大提升,而且应用其原生支持的协程很容易就能开发出高并发的服务端程序。
作者最近用golang实现了一个TCP负载均衡器,灵感来自grpc。几个主要的特性就是: - 支持高网络吞吐量 - 实现了基于机器性能评分来分配worker节点的负载均衡算法 - 尽量做到薄客户端,降低客户端复杂性
[译]使用golang每分钟处理百万请求 在Malwarebytes,我们正在经历惊人的增长,自从我在1年前加入硅谷的这家公司以来,我的主要职责是为多个系统做架构和开发,为这家安全公司的快速发展以及百万日活产品所必需的基础设施提供支持。
在实战中使用nginx-rtmp遇到的TCP连接问题分析 背景 前段时间公司做了一次体育赛事的现场直播,网络由某通信公司负责搭建,主要测试5G CPE上行网络的带宽和稳定性,为了做到万无一失,他们同时搭建了一条用作备份的400M光纤线路。
现代C++之理解decltype decltype用于生成变量名或者表达式的类型,其生成的结果有的是显而易见的,可以预测的,容易理解,有些则不容易理解。大多数情况下,与使用模板和auto时进行的类型推断相比,decltype作用于变量名或者表达式只是重复了一次变量名或者表达式的确切类型: con...
理解auto类型推断 上一篇帖子中讲述了模板类型推断,我们知道auto的实现原理是基于模板类型推断的,回顾一下模板类型推断: template <typename T> void f(ParamType param); 使用下面的函数调用: f(expr); 我们看到模板类型推断过程涉及到了模板template、函数f以及参数(包括模板参数和函数参数),调用f的时候,编译器会推断T和ParamType的类型。
理解模板类型推断(template type deduction) 我们往往不能理解一个复杂的系统是如何运作的,但是却知道这个系统能够做什么。C++的模板类型推断便是如此,把参数传递到模板函数往往能让程序员得到满意的结果,但是却不能够比较清晰的描述其中的推断过程。
阿里云上搭建webRTC 服务器——Licode 系统配置 阿里云服务器 Ubuntu 14.04.5 LTS Docker 环境搭建 在一台空的机器上搭建docker环境,先要安装docker,执行下面的命令即可: apt-get update apt-get install docker.
Windows10平台编译ffmpeg 4.0.2,生成ffplay 最近想研究下ffplay的代码,学习代码是枯燥无味的,也是抽象的,学习一个系统或者软件之前,好的入门方法是先把系统搭建起来,或者把软件编译出来,直观的操作一下相关的功能,由表入里,熟悉功能之后,在慢慢深入代码,由现象看到本质,才能理解的更加深刻。
揭开webRTC媒体服务器的神秘面纱——WebRTC媒体服务器&开源项目介绍 WebRTC生态系统是非常庞大的。当我第一次尝试理解WebRTC时,网络资源之多让人难以置信。本文针对webRTC媒体服务器和相关的开源项目(如kurento,janus,jitsi.org等)做一些介绍。
打造一个上传图片到图床利器的插件 鉴于写博客截图手动上传到图床的步骤过于繁琐,很久之前写了一个windows版的截图软件插件,用于把图片快速上传到图床 重新打包用户量过亿的开源截图软件——加入图片自动上传到图床的功能 现在换系统了,由windows换成了Mac,系统确实好用,但截图上传到图床的功能没法子弄过来,网上搜了下现成的软件,都不太好用。
在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河。记录如下: 安装依赖 Docker 版本 17.05或者更高 testdeMBP:Docker test$ docker -vDocker version 18.
一次失败的Release 去年8月份加入一家创业公司,和原同事做VR相关的产品开发,到18年正月初七,总共release过两次,真正经理了一次从0到1的过程。第一次release产品初步成型,大概在10月份,在公司内部做了一次宣发,我们做的是ToC的产品,但这次release没有真正意义上的C端客户,倒是可以拿着这个雏形产品到处去找内容提供商;另外可以拿到市场上去"试点"了,找一些潜在的目标用户,去收集反馈;再有就是需要向投资人交答卷。
为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做SRS的流媒体服务器,比较活跃,而且据说这个流媒体服务器的性能和功能都强大不少,但遗憾的是没有HLS加密功能。
深入解析条件变量 什么是条件变量(condition variables) 引用APUE中的一句话: Condition variables are another synchronization mechanism available to threads.
有点标题党的感觉,但是我今天说的这个软件确实很多人都用,叫做Greenshot。咨询了它的作者,用户量竟然过亿。 先展示一下成果 为了更方便的使用七牛云的图床服务,去年实现了一个开源截图工具的插件,专门用来上传图片到七牛图床。
Unix/Linux的权限管理还是比较复杂的,别人说看高级环境编程得看2,3遍。我想这应该是在Linux有了一定基础上。我看的过程中觉得需要反复推敲,有些地方得翻来覆去看上5,6遍甚至更多,下面是自己的一些对Unix权限的理解,尽量翻译成了大白话。
Linux中main是如何执行的 这是一个看似简单的问题,但是要从Linux底层一点点研究问题比较多。找到了一遍研究这个问题的文章,但可能比较老了,还是在x86机器上进行的测试。 原文链接 开始 问题很简单:linux是怎么执行我的main()函数的? 在这片文档中,我将使用下面的一个简单c程序来阐述它是如何工作的。
效果图 先上一个效果图: 背景 公司最近在做VR直播平台,VR开发我们用到了Unity,而在Unity中播放视频就需要一款视频插件,我们调研了几个视频插件,记录两个,如下: Unity视频插件调研 网上搜了搜,最流行的有以下两款Unity插件: AVPro 这个在Unity商店售价150$,最新release版本为1.
如何在不同的语言/平台中获取Android ID 最近开发工作中需要使用到AndroidID,在Unity和native code中也需要使用,java获取很方便,Unity中也不难,最难的是在native code中获取。
在gitlab上new 一个project 跳转到本地的git 目录中,运行命令 git remote add gitlab gitlab_new_project_address -最后运行如下命令,将本地git仓库push到server: git push gitlab master ...
文件的时间 与文件相关的三个时间值: 访问时间:最后一次访问文件的时间。例如,cat命令会修改这个时间。 修改时间:文件内容最后一次被修改的时间。 状态更改时间:文件的i节点最后一次被修改的时间。例如,更改文件的访问权限、更改用户ID、更改链接数都会修改i节点。
马上就要离职了,想想工作中有些东西还是需要沉淀下来的,不仅仅要沉淀到心里,因为年纪大了^_^,很容易忘记,不是有句话么,好记性不如烂笔头。 分析这个bug之前先说点别的。 解决bug的大致思路 我觉的解bug和医生看病是一样的,中医看病讲究望闻问切。
作者水平有限,如有错误或纰漏,请指出,谢谢。 背景介绍 最近在团队在做release之前的regression,把各个feature分支merge回master之后发现DB的单元测试出现了20多个失败的test cases。
符号链接 符号链接的用途 符号链接是对一个文件的间接指针,它与前面介绍的硬连接不同,硬连接指向文件的i节点。引入符号链接是为了避开硬连接的一些限制: 硬链接通常要求链接和文件位于同一文件系统中。 只有超级用户才能创建指向目录的硬链接(在底层文件系统支持的情况下)。
名字 ftw,nftw - 文件树遍历 概要 #include int nftw(const char *dirpath, int (*fn) (const char *fpath, const struct stat *sb,int typeflag, struct FTW *f...
rename和renameat #include int rename(const char *oldname,const char*newname); int renameat(int oldfd,const char *oldname,int newfd, const char *newnam...
一个命令 mkfs 讲文件系统前先介绍一个用于创建文件系统的命令: mkfs mkfs [options] [-t type fs-options] device [size] 描述 mkfs用来在设备上创建一个Linux文件系统,这个设备通常情况下是一个硬盘分区。
下面的几个chown函数可用于更改文件的用户ID和组ID。如果两个参数owner或group中的任意一个是-1,则对应的ID不变。 #include int chown(const char *pathname,uid_t owner,gid_t group); int fchown(int fd,...
4.7 函数access和faccessat 当一个进程使用了设置用户ID和设置组ID作为另一个用户(或者组)运行时,这时候有效用户(组)ID和实际用户(组)ID不一样,但进程仍然希望测试实际用户(组)ID的访问能力。
4.1 函数stat 函数stat返回与此命名文件有关的信息结构。下面的代码实现了一个工具,显示树形目录结构,需要加两个参数,一个为目录名,一个为显示目录的深度。 #include #include #include #include #include #include #include...
更新于2018年2月 做了以下改动: 1.修复了一个bug,把服务器区域做成可配: 七牛有华北,华东,华南以及美国三个服务器区域,根据自己的情况进行相应的选择即可。 2.把插件打包进了exe安装包中,下载链接: 链接: 密码: 1749 因此不要再使用本文的替换方法进行安装了,直接安装即可,七牛插件是默认安装的。
第一次用markdown语法写博客,写出来的还比较整齐,感觉博客园对序号的支持不是很好,调了一会才有了比较满意的效果,还有有哪位知道使用markdown如何插入frame? 这边博客主要说了APUE中文件I/O的主要知识点,并且尝试写了一些代码,都列在了博客中。
上一篇博文介绍了测试的相关概念,这篇主要说一下依赖注入以及如何在单元测试中使用。原文链接: http://www.javaranch.com/journal/200709/dependency-injection-unit-testing.html 近些年来对于依赖注入(Dependency Injection)这个词大家已经应该很熟悉了。
1. UNIX体系结构(UNIX Architecture) 调用内核的接口叫做系统调用(system call,图1.1中的阴影部分),普通函数库是建立在系统调用接口的基础之上。应用(application)可以同时使用函数库或者系统调用。
众所周知,代码审查是软件开发过程中十分重要的环节,楼主结合自己的实际工作经验,和大家分享一下在实际工作中代码审查是如何开展的, 笔者水平有限,若有错误和纰漏,还请大家指正。 代码审查的阻力 我想不通公司不同部门对代码审查这项工作的重视程度还是不一样的,对于代码审查的阻力总结了以下几点: 国内的整体环境,国内的公司,尤其是互联网公司,讲究速度致上,软件开发的迭代周期周期短,速度快,因为竞争太大,开发的产品要求快速上线,对代码审查不是很重视,先上线,出了问题再解决。
历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发布到博客园上。
你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧。想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boost吧。
1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准。在2003年,一个小的“修复bug”版本被发布。然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C++标准预计在2009年被发布(虽然所有的工作很有可能在2007年底被完成)。
许多程序员常常忽略编译器发出的警告。毕竟,如果问题很严重,它才将会变成一个error,不是么?相对来说,这个想法可能在其它语言是无害的,但是在C++中,我敢打赌编译器的实现者对于对接下来会发生什么比你有更好的理解。
1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉。当你像下面这样实现一个new表达式的时候,回忆一下Item 16和Item 17: 1 Widget *pw = new Widget; 两个函数会被调用:一个是调用operator new来分配内存,第二个是Widget的默认构造函数。
Item 50中解释了在什么情况下你可能想实现自己版本的operator new和operator delete,但是没有解释当你实现的时候需要遵守的约定。遵守这些规则并不是很困难,但是它们其中有一些并不直观,所以知道这些规则是什么很重要。
1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常。很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做。你仍然会看到这种旧行为,但是我会把关于它的讨论推迟到本条款结束的时候。