编程太无聊?来当导演吧~

对不起~十分抱歉地通知你——当看到此贴的时候,你的“码农”生涯也许就快结束了~曾经~你为之脱发不止的 PHP~JAVA~C,都将离你而去~那个充满名利的娱乐圈,已经敞开了大门从此,你将失去自由,因为每时每刻都有狗仔跟拍~所以~你只能被逼无奈的开着法拉利,带上蛤...
继续阅读 »

对不起~十分抱歉地通知你——

当看到此贴的时候,你的“码农”生涯也许就快结束了~

曾经~你为之脱发不止的 PHP~JAVA~C,都将离你而去~

那个充满名利的娱乐圈,已经敞开了大门

从此,你将失去自由,因为每时每刻都有狗仔跟拍~

所以~你只能被逼无奈的开着法拉利,带上蛤蟆镜~(也许身边还有一个当演员的女朋友)

因为~你将成为一名~大导演!

 

都说“码农是最具有艺术天赋的群体”~

虽然那一句“hello world”深深地禁锢了你们的肉体,但你们的灵魂永远属于斯坦尼!

我敬爱的“猿”类们——

看着那些自以为是的外行,永远以“格子衫、地中海、单身狗”来固化你们

难道,你的愤怒还要继续隐藏在“//”之后吗?

 

事情是这样的

上半年,融云为展现其“实时音视频”的产品优势,

寻找了多家创意公司甚至影视公司拍摄宣传片~

但他们对开发者真实工作场景的无知,让我们愁眉不展

正应了那句——再牛逼的编剧,也编不出开发者的人生轨迹~

所以,与其让别人“瞎黑”,不如让程序员来“自黑”~

~融云重金邀请不仅会编程,而且还会编剧的“开发文青”

为其全新升级的“实时音视频”编写或执导产品短剧——

 

不是谁都能参加——仅限开发者(不懂编程的,请绕道~)

 

周期还比较紧张——故事大纲选拔截止到20208月31

 

不玩一二三等奖——同时选定10部优秀剧本

 

你最想了解的那些俗事——

1. 选中者将获得5位数或以上的酬劳//别多想~不会超过7位数;

2. 你最想和哪位女演员聊剧本,我们来协调(除奥斯卡影后~);

3. 也许还能参加个电影节,蹭个红地毯,对着镜头说声“hello world”;

 

激动完毕,先看看需求文档吧——

1. 结合开发者真实工作场景,撰写有共鸣度、有笑点(有泪点也OK)的故事;

2. 在故事中,巧妙植入融云“实时音视频”产品优势(植入的越巧妙越好);

3. 单集故事时长控制在3-5分钟;

4. 如果还会画“分镜头剧本”,那就更完美了!

5. 创作者必须保证故事原创性,如出现版权纠纷,由创作者自行解决,融云无连带责任;

 

这次的开发路径是由我们设计的——

1. 开发者先将原创故事的大纲发到本帖的评论区;

2. 融云将对大纲内容进行挑选,选中后将私信与作者沟通详细剧本;

3. 作者将剧本发至指定活动邮箱,融云将安排专业的编剧顾问配合作者对剧本进行优化;

4. 剧本优化后,融云将根据作者(此时应称为“导演”)的要求协调拍摄所需的有关资源;

5. 确定拍摄时间、拍摄地点,并如期拍摄制作;

6. 影片将在B站等视频网站进行首页置顶播放,融云还将协调影片参加相关的评选活动;

 

不知道有木有把事情说清楚,

如果少侠有疑问,可在“评论区”留言,我们将及时解答~

最后,来个“定场诗”收尾——

编程生涯苦无岸,需求文档似高山;

Java&C+亦无趣,秃顶单身格子衫;

日复一日无牵绊,是否也想起波澜?

索性挥毫三千字,当个导演来玩玩!

乐哉!乐哉!

 

(融云“实时音视频”产品功能详见“融云”官网~)


收起阅读 »

【活动推荐】聚焦前沿技术,创新驱动升级 | 84位大咖邀你参加2020GIAC全球互联网架构大会

当今时代正在经历由于新技术而引发的颠覆性变革。5G、物联网、云计算与大数据、人工智能和区块链...正在改变着世界。对于架构师来说,新技术的降临是富有挑战的。从前十年的虚拟化,到今天的混合云,容器技术、微服务架构,还有如火如荼的数据中台、技术中台、业务中台等超前...
继续阅读 »

当今时代正在经历由于新技术而引发的颠覆性变革。5G、物联网、云计算与大数据、人工智能和区块链...正在改变着世界。

对于架构师来说,新技术的降临是富有挑战的。从前十年的虚拟化,到今天的混合云,容器技术、微服务架构,还有如火如荼的数据中台、技术中台、业务中台等超前的技术理念所带来的架构变化,都在为架构工作带来了空前的现实挑战和压力。

在这股浪潮中,分布式、大数据架构、架构演进和大中台技术成为了架构圈火热的几大块:

 • 当下,服务器端各种新的技术,无论是微服务、中台、还是云原生,本质上都是如何更好的构建一个分布式系统。那分布式系统的架构是否有一些可遵循的范式?

 • 无论是大公司还是创业型团队,大数据中台及Hadoop、Spark等成熟技术是每个研发团队都必须具备的技能。那,数据中台、Flink、Clickhouse等热门技术你又了解多少?

 • 软件系统架构具备多样性,根据不同业务场景、业务规模,如何选择更适合业务发展的软件架构,更高效地利用软件架构实现业务价值?如何在系统高压背景下,持续对系统进行改进?

 • 2019年被称为中台元年,技术上说的“中台”主要是指学习发源自美军的这种高效、灵活和强大的指挥作战体系。但是中台究竟应该如何做,经过一年时间的沉淀,业界是否有低成本成功落地的方法论能够指导大家践行中台?

关于上述问题的解答及前沿发展方向,我们邀请到了14位大咖将在2020 GIAC全球互联网架构大会为大家做以分享。另外,还会有云原生、智能运维、区块链等10+热门领域,对 2020 年的趋势进行探讨。除了前沿趋势外,你是否还想了解大型互联网系统背后的架构设计及实践启示?

众所周知,技术无论如何更新迭代,总有些颠扑不破的基本原则。比如,CAP原理不仅是分布式架构的设计准则,更是思维空间的限制法则。当我们掌握这些底层技术,自然可以更快速的掌握技术方向,而这些底层技术知识点均会在GIAC大会上案例中呈现。

图2.png

本届GIAC大会邀请到了来自百度、阿里、腾讯、蚂蚁金服、美团、字节跳动、京东、新浪、微软等上百位CEO、CTO、技术副总裁级别的大咖,进行全方位、跨行业的架构热门领域实践经验分享及未来趋势的探讨。

图3.jpg

大会由5大专场、24个主题、84个技术案例组成,每个专题下都有3-4位大咖讲师对案例进行1小时的分享,下面我们筛选出了一些热门案例,分享给大家:
《我在好买财富7年的技术管理之路》---王晔倞 好买财富 架构总监

《如何变现公开数据中的商业价值》--刘鹏 科大讯飞 副总裁

《大规模网络诊断系统》--杨锦涛  腾讯科技 专家工程师

《人工智能在软件测试领域的落地与实践》--茹炳晟 DELL EMC中国研发集团 资深架构师

《淘宝这样做春晚》--郑雷 淘系技术部PMO 项目管理专家

《阿里互联网架构助力企业数字化转型》--谢纯良 阿里云原生应用平台架构总监
《敏捷和DevOps时代的研发效能度量实践》--张乐 京东 DEVoPS与研发效能专家

《百度NLP技术与产业实践》--孙珂 百度 自然语言处理部 杰出架构师

《聊聊JVM内存那点事》--李嘉鹏(你假笨) PerfMa CEO

《Serverless化容器架构演化与应用》--陈耿 微软 全球黑带团队

《边缘计算实践中的网络问题和解决方案》--刘楠 字节跳动 流量基础设施部门架构师

《Libra的技术原理与架构分析》--邓启明 Westar实验室 技术专家

《快手分布式任务调度系统实战》--吴进武 快手 数据中台任务调度方向负责人

《搜狗奇点广告平台的架构演进》--王叔立 搜狗 商业平台事业部 专家开发工程师


2020GIAC全球互联网架构大会的议题必定让每一位参会者都收获满满,一定将最热门前沿的案例实践带给大家。


更多大会精彩日程及联系方式请至官网查询:http://giac.msup.com.cn/

收起阅读 »

30万+App都在用的服务商,有什么特别之处?

两个月前,一款名为 Clubhouse 的 App 开始流行于美国 VC、名人圈层,并且一直热度不减。尽管它的用户只有几千人,但其估值却已超过 1 亿美元。Clubhouse 是一款语音社交软件,被誉为是“音频 Twitter”。打开 Clubhouse,选一...
继续阅读 »

两个月前,一款名为 Clubhouse 的 App 开始流行于美国 VC、名人圈层,并且一直热度不减。尽管它的用户只有几千人,但其估值却已超过 1 亿美元。

Clubhouse 是一款语音社交软件,被誉为是“音频 Twitter”。

讯飞1.webp.jpg

打开 Clubhouse,选一个房间进入,人们可以查看房间里都有哪些参与者,并可以听到他们的谈话,再决定是否继续听或直接加入群聊。

如果要说它最大的规则是什么,那就是:只用语音,没有文字

近年来,移动互联网飞速发展,语音功能已开始成为 App 的标配,各种属性的音频类 App 尤其是声音社交类 App 也在悄然壮大。

红杉中国发布的《创造未来——红杉 00 后泛娱乐消费研究报告》显示,社交性、潮流性和个性化是“00 后”用户最看重的三大产品特征。因此,比图片和文字有温度,比视频更含蓄的声音社交方式,开始在他们之中风靡。

而根据艾瑞咨询的数据,2019 年中国网络音频行业市场规模为 175.8 亿元,同比增长 55.1%,预计 2020 年中国网络音频行业市场规模达 272.4 亿元。越来越多的资本和资源看到了声音背后蕴藏的更多可能性。

讯飞2.png

随着 5G 网络的逐渐普及,网络速度变得更快,以音频、视频为主要交互方式的互联网产品或将大行其道。

今年年初的疫情期间,我们已经看到各种音视频软件在在线教育、在线办公中发挥着巨大的作用。但有一个不得不面对的事实是,它们都曾因短时期内使用人数过多而崩溃。

对于音视频类互联网产品来说,保证用户使用过程中不会出现卡顿、声音效果差等问题十分重要,这就需要技术上的强力支持与保证,在这一方面能够提供“实时音视频”技术的服务商做的相当专业。

目前,在我国从事“实时音视频”技术底层搭建的服务商主要分为两大阵营。其一,是只专注“实时音视频”技术的单一产业服务商;其二,是 IM 领域已经耕耘多年,现将 IM 即时通讯及实时音视频两大业务版块交融聚合的服务商。例如,已多年稳居 IM 市场占有率第一的融云。

讯飞3.webp.jpg

北京云中融信网络科技有限公司(简称融云),是一家安全、可靠的全球互联网通信云服务商,向开发者和企业提供即时通讯和实时音视频通信云服务。虽成立时间不长,但发展迅速,成立不久就获得了 1 亿元人民币 B 轮融资。

截止目前,已有中原地产、汽车之家、融创地产、丽兹行、寺库、哈啰出行、核桃编程、易车网、编程猫以及 Castbox、Opera 等超过 30 万款海内外 App 通过融云实现了全球化的互联网通信能力。

融云现已在科大讯飞旗下人工智能全产业链综合服务平台——讯飞 AI 服务市场入驻,来一起看看,它的哪些技术能让如此之多的 App “钟情”于它?

融云IM即时通讯

许多 85 后甚至 90 后的大学记忆中都有一款即时通讯工具,飞信。在那个短信 1 毛钱一条,流量 5 块钱只有 30M 的年代,飞信免流量、免费发短信的功能,很有吸引力。作为当初中国移动即时通讯的扛鼎之作,飞信注册用户最高时达到了 5 亿,高峰时拥有高达 9000 万的活跃用户,其技术水平自不必多说。

融云的技术团队源自飞信技术团队,在即时通讯领域有着丰富的经验和强大的核心技术实力。

融云即时通讯支持多聊天模式、多消息类型、自定义界面等功能,同时支持聊天记录漫游、消息回执与召回、消息内容全文搜索、消息内容审核等功能。用户可以根据自己的需求调用相关接口,大大节约在通信能力上的研发时间和成本。

讯飞7.png

基于融云私有通信协议,可以保障消息不丢不重不乱,支持无上限用户数的群组和聊天室互动,公有云平台 150 亿条日均消息量2218 亿条日消息量峰值。融云建立了全球多数据中心,服务覆盖全球所有国家及地区(共 233 个),实时监控全球网络,基于融云分布在全球的数据中心与节点建设,向客户提供链路接入方案,持续的海外链路优化让消息发送稳定可靠,畅通无阻。

讯飞8.webp.jpg

无论是私密社交、兴趣社交还是商业沟通、系统消息等场景,融云都可以轻松应对,它也是业内唯一承诺消息可靠性 100% 的厂商。

融云RTC实时音视频

为了适应移动互联网发展和市场需求,融云在即时通讯之外还发展了实时音视频业务。融云实时音视频主要包括音视频通话、低延迟直播、音视频会议、云端录制等功能。用户可以根据自己的需求调用相关接口,大大节约在通信能力上的研发时间。

讯飞9.png

融云实时音视频具备低延迟、低成本、高流畅、高品质、部署简单、扩展灵活等技术优势。在整体网络架构上,全球分布式架构的部署让扩容时间大幅缩短,能轻松应对海量流量的激增。弱网优化策略方面,增强了抗丢包及抗网络抖动能力,音频能对抗 80% 丢包,视频能对抗 40% 丢包,延时最低可达 66ms,以保证低成本输出高性能的实时音视频能力(可以提供最高 1080P 的高清画质和最高 48KHz 的音频采样率) 。经过海量客户业务验证,融云实时音视频业务在稳定性、连通性、并发/负载等方面服务可用性达到 99.9%

融云在疫情期间还免费开放了在线医疗、在线教育及协同办公场景的通信能力,并开发了 VR 看房等新的业务场景。

最新活动推荐:

 融云年中大促活动海报.png


收起阅读 »

芥末堆专访:线上教学交付能力背后,在线音视频通信技术成刚需

2020 年过半,疫情加速在线教育发展已成事实。疫情防控常态化使得线下教育场景面临着长期挑战,线上教学交付能力俨然成为教培机构的标配。伴随着线下机构转型线上探索教育 OMO,线上教学背后的技术能力开始受到重视。相比线下场景天然的临场感和及时的互动性,线上化教学...
继续阅读 »

2020 年过半,疫情加速在线教育发展已成事实。疫情防控常态化使得线下教育场景面临着长期挑战,线上教学交付能力俨然成为教培机构的标配。

伴随着线下机构转型线上探索教育 OMO,线上教学背后的技术能力开始受到重视。相比线下场景天然的临场感和及时的互动性,线上化教学不是仅仅利用音视频工具就足够。线下场景中的信息传递是基于面对面的沟通,如何在线上场景“重现”甚至“超越”面对面沟通的信息传递方式是关键问题。

 芥末堆1_副本.jpg

无论教学形式或场景怎样变化,教育始终是效果为王。“全民网课”的时代,教学效果的保证离不开高质量的音视频信息传递、全方位的及时互动和多维度的数据分析。然而这些对于教培机构,尤其是以教学见长的线下机构,都并不熟悉。

全球通信云服务商融云 CPO 任杰表示:“在互联网时代,教育创业者应该聚焦自己的核心业务逻辑,而不是去关心通用型能力的实现。”

为此,融云专注于互联网云通信领域,为包括在线教育在内的互联网行业提供“IM 即时通讯+实时音视频+推送”的一体化解决方案,凭借技术积累实现安全、可靠、实时的即时通讯及音视频服务,满足各类教育场景的通用型和定制化的信息交互需求。

“IM 即时通讯+实时音视频+推送”,在线教育一体化解决方案

据任杰介绍,融云最初选择互联网云通信领域,就是看到互联网发展的趋势和通信需求的刚性。时至今日,伴随着移动互联网的发展,云通信已经成为标配能力。融云也从最初的“IM 即时通讯”业务,发展到“用一套 SDK,解决所有通信场景”,涵盖“IM 即时通讯+实时音视频+推送”的一体化解决方案。

任杰告诉芥末堆,融云整体的服务形式是以客户端 SDK 的方式体现,App 只要通过简单的几行代码就可以完成通信 SDK 集成,实现通信和社交能力。此外,融云还提供实时音视频相关功能和整体解决方案。

芥末堆2_副本.jpg 

去年 11 月 30 日,融云正式宣布已完成数亿元 C 轮融资

技术的发展背后是需求的演变。从图文时代到音视频时代,信息传播的媒介和方式都在发生着巨大变化。与之相应的是互联网企业对音视频通信技术的更高要求。任杰表示,如何打造一流的实时音视频服务,赋能开发者追赶音视频领域的技术红利,是融云始终关注的。

而作为互联网通信的主要应用场景之一,在线教育的内容以视频直播为主要形式。相比娱乐内容,教育内容的严肃性和互动性使得低延迟的高质量音视频传输成为刚需。任杰告诉芥末堆,以 PC 或平板为设备载体的在线教育对画质的要求,要远远高于移动端。

 芥末堆3_副本.jpg

如果将内容看作在线教育的产品核心,那么音视频质量可以看作在线教育的技术核心。相比其他内容行业,同样面对卡顿或延迟,在线教育用户的容忍度更低。任杰介绍,融云在今年 5 月份对融云实时音视频业务进行全面升级,针对开发者最关心的音视频通话质量,融云使用的是 WebRTC 技术,完全可以满足在线教育等场景中低延迟、强互动的需求。

据了解,在视频方面,融云目前能够提供最高 1080P 的分辨率,画面纤毫毕现,尤其适合特殊高清场景,如在线教育领域中的双师课堂场景的大屏直播。同时,融云还提供各种高中低分辨率供不同业务场景调用,实现画面和流量平衡,帧率最高支持 30FPS,可以匹配不同设备端的教学需求。

在音频方面,融云采用最高音频采样率 48KHz,可真实还原对端声音,高清音质。任杰介绍,融云目前可以提供高清音乐模式,针对乐器的高频音段和弱音音阶进行优化处理,高度还原音乐细节,带给用户更贴近线下场景的体验。在音频方面,融云完全可以满足素质教育领域的音乐培训的需求。

云通信能力之后,融云要延伸到更多在线教育场景

在沟通中,任杰始终强调融云在做的是底层技术能力的支持。但在介绍在线教育场景的应用时,芥末堆发现针对不同角色、不同班型、不同细分赛道的差异化需求,融云在技术上都有设计并满足。

提到融云通信云能力的特点,任杰总结到:性能稳定、全平台覆盖、全方位互动和全球部署。

 芥末堆4_副本.jpg

性能稳定是融云的核心优势。依托技术优势,融云可以为大型直播课程提供无用户上限和消息量限制的聊天室服务,亿级消息并发即时到达,互动稳定流畅、延迟低。任杰表示,在弱网优化策略上,融云的核心策略是能够迅速预估宽带,并采用降低码率来确保以声音与流畅优先的原则,保证用户最优体验。

在覆盖平台方面,融云实时音视频 SDK 可覆盖全平台,包括 iOS、Android、Web、Windows、macOS、Linux、Electron 等,并全面适配市场主流的各类终端设备,包括在智能手表、智能音箱、智能门禁等多种智能硬件设备中实现平台间通信,全面保障融云实时音视频在各类终端上的良好应用。

在全方位互动方面,任杰介绍,融云支持 1080P 高清视频,视频窗口放大缩小可切换不同分辨率;具备互动白板功能,支持上传常见办公文档,实时进行课堂演示;一对一、小班课、大班课、双师课等不同班型的实时直播、举手答疑和视频回看都能实现。他特意强调,为保障在线课程可 100% 回看,融云是采用两条线路双向录制的。

在全球部署方面,融云拥有覆盖全球的通信加速网络,全球多个数据中心,数千个加速点,触达全世界 233 个国家和地区,能够帮助教育企业实现全球范围内的高质量教学。

提到融云在在线教育领域的探索,任杰表示,教育的未来趋势一定是线上,但这离不开技术的发展和应用。融云后续将继续利用技术优势,持续在降低高质量音视频网络流量占用的方向上发力。

此外,将技术应用延伸到教育的各个场景也是融云的发力点之一。除了今年爆发的在线 K12 领域外,素质教育、在线考试等领域也亟待技术的重构。任杰以音乐教育为例,融云为管乐培训机构大雅乐盟做了针对性的音频通信改善,给出管乐培训的线上教育解决方案。而后续,钢琴、舞蹈等线上教学领域也是融云将会深化去探索的场景。

最新活动推荐:

融云年中大促活动海报.png

收起阅读 »

这款网络排查工具,堪称神器!

常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合 ping nslookup tracert 来判断网络的相关特性,这个命令就是 mtr。mtr 全称 my tr...
继续阅读 »
常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合 ping nslookup tracert 来判断网络的相关特性,这个命令就是 mtr。mtr 全称 my traceroute,是一个把 ping 和 traceroute 合并到一个程序的网络诊断工具。

traceroute 默认使用 UDP 数据包探测,而 mtr 默认使用 ICMP 报文探测,ICMP 在某些路由节点的优先级要比其他数据包低,所以测试得到的数据可能低于实际情况。

安装方法

1.Windows 系统可以直接在 https://cdn.ipip.net/17mon/besttrace.exe 下载 BestTrace 工具并安装。也可以在 https://github.com/oott123/WinMTR/releases GitHub 上下载 MTR 专用工具,该工具为免安装,下载后可以直接使用。
2.Linux 可以直接运行命令进行安装。

# Debian/Ubuntu 系统
apt install mtr

# RedHat/CentOS 系统
yum install mtr
3.Apple 客户端可以在 App store 搜索 Best NetTools 下载安装
4.Android 客户端:可以在 Google Play 上下载 TracePing,但是由于国内 Google Play 无法访问,笔者自行下载下来,可以直接访问 https://dwz.cn/KCdNPH4c 下载 TracePing。

使用

MTR 使用非常简单,查看本机到 qq.com 的路由以及连接情况直接运行如下命令:

mtr qq.com

微信图片_20200731104115.png

具体输出的参数含义为:
  • 第一列是 IP 地址

  • 丢包率:Loss

  • 已发送的包数:Snt

  • 最后一个包的延时:Last

  • 平均延时:Avg

  • 最低延时:Best

  • 最差延时:Wrst

  • 方差(稳定性):StDev

参数说明


  • -r or --report

使用 mtr -r qq.com 来打印报告,如果不使用 -r or --report 参数 mtr 会不断动态运行。使用 report 选项, mtr 会向 qq.com 主机发送 10 个 ICMP 包,然后直接输出结果。通常情况下 mtr 需要几秒钟时间来输出报告。mtr 报告由一系列跳数组成,每一跳意味着数据包通过节点或者路由器来达到目的主机。
一般情况下 mtr 前几跳都是本地 ISP,后几跳属于服务商比如 腾讯数据中心,中间跳数则是中间节点,如果发现前几跳异常,需要联系本地 ISP 服务提供上,相反如果后几跳出现问题,则需要联系服务提供商,中间几跳出现问题,则需要联系运营商进行处理
默认使用 -r 参数来生成报告,只会发送 10 个数据包,如果想要自定义数据包数量,可以使用 -c 参数
  • -s or --packetsize

使用 -s 来指定 ping 数据包的大小

mtr -s 100 qq.com
100 bytes 数据包会用来发送,测试,如果设置为负数,则每一次发送的数据包的大小都会是一个随机数。
  • -c

指定发送数量

mtr -c 100 qq.com
  • -n

不进行主机解释
使用 -n 选项来让 mtr 只输出 IP,而不对主机 host name 进行解释

mtr -n qq.com

MTR 结果分析

当我们分析 MTR 报告时候,最好找出每一跳的任何问题。除了可以查看两个服务器之间的路径之外,MTR 在它的七列数据中提供了很多有价值的数据统计报告。
Loss% 列展示了数据包在每一跳的丢失率。Snt 列记录的多少个数据包被送出。
使用 –report 参数默认会送出 10 个数据包。如果使用 –report-cycles=[number-of-packets] 选项,MTR 就会按照 [number-of-packets] 指定的数量发出 ICMP 数据包。
Last, Avg, Best 和 Wrst 列都标识数据包往返的时间,使用的是毫秒( ms )单位表示。Last 表示最后一个数据包所用的时间, Avg 表示评价时间, Best 和 Wrst 表示最小和最大时间。在大多数情况下,平均时间( Avg)列需要我们特别注意。
最后一列 StDev 提供了数据包在每个主机的标准偏差。如果标准偏差越高,说明数据包在这个节点的延时越不相同。标准偏差会让您了解到平均延时是否是真的延时时间的中心点,或者测量数据受到某些问题的干扰。
例如,如果标准偏差很大,说明数据包的延迟是不确定的。一些数据包延迟很小(例如:25ms),另一些数据包延迟很大(例如:350ms)。当 10 个数据包全部发出后,得到的平均延迟可能是正常的,但是平均延迟是不能很好的反应实际情况的。如果标准偏差很高,使用最好和最坏的延迟来确定平均延迟是一个较好的方案。
在大多数情况下,您可以把 MTR 的输出分成三大块。根据配置,第二或第三跳一般都是您的本地 ISP,倒数第二或第三跳一般为您目的主机的 ISP。中间的节点是数据包经过的路由器。
当分析 MTR 的输出时,您需要注意两点:loss 和 latency。

网络丢包

如果在任何一跳上看到 loss 的百分比,这就说明这一跳上可能有问题了。当然,很多服务提供商人为限制 ICMP 发送的速率,这也会导致此问题。那么如何才能指定是人为的限制 ICMP 传输 还是确定有丢包的现象?此时需要查看下一跳。如果下一跳没有丢包现象,说明上一条是人为限制的。如下示例:

微信图片_20200731104224.png

人为限制 MTR 丢包

在此例中,第 4 跳发生了丢包现象,但是接下来几条都没任何丢包现象,说明第二跳的丢包是人为限制的。如果在接下来的几条中都有丢包,那就可能是第二跳有问题了。请记住,ICMP 包的速率限制和丢失可能会同时发生。

微信图片_20200731104236.png

MTR 丢包截图

从上面的图中,您可以看从第 13 跳和第 17 跳都有 10% 的丢包率,从接下来的几跳都有丢包现象,但是最后 15,16 跳都是 100% 的丢包率,我们可以猜测到 100% 的丢包率除了网络糟糕的原因之前还有人为限制 ICMP。所以,当我们看到不同的丢包率时,通常要以最后几跳为准。
还有很多时候问题是在数据包返回途中发生的。数据包可以成功的到达目的主机,但是返回过程中遇到 “困难” 了。所以,当问题发生后,我们通常需要收集反方向的 MTR 报告。
此外,互联网设施的维护或短暂的网络拥挤可能会带来短暂的丢包率,当出现短暂的 10% 丢包率时候,不必担心,应用层的程序会弥补这点损失。

网络延迟

除了可以通过 MTR 报告查看丢包率,我们也还可以看到本地到目的之间的时延。因为是不通的位置,延迟通常会随着条数的增加而增加。所以,延迟通常取决于节点之间的物理距离和线路质量。

微信图片_20200731104250.png

MTR 查看网络延迟

从上面的 MTR 报告截图中,我们可以看到从第 11 跳到 12 跳的延迟猛增,直接导致了后面的延迟也很大,一般有可能是 11 跳到 12 跳属于不通地域,物理距离导致时延猛增,也有可能是第 12 条的路由器配置不当,或者是线路拥塞。需要具体问题进行具体的分析。
然而,高延迟并不一定意味着当前路由器有问题。延迟很大的原因也有可能是在返回过程中引发的。从这份报告的截图看不到返回的路径,返回的路径可能是完全不同的线路,所以一般需要进行双向 MTR 测试。
注:ICMP 速率限制也可能会增加延迟,但是一般可以查看最后一条的时间延迟来判断是否是上述情况。

根据 MTR 结果解决网络问题

MTR 报告显示的路由问题大都是暂时性的。很多问题在 24 小时内都被解决了。大多数情况下,如果您发现了路由问题,ISP 提供商已经监视到并且正在解决中了。当您经历网络问题后,可以选择提醒您的 ISP 提供商。当联系您的提供商时,需要发送一下 MTR 报告和相关的数据。没有有用的数据,提供商是没有办法去解决问题的。
然而大多数情况下,路由问题是比较少见的。比较常见的是因为物理距离太长,或者上网高峰,导致网络变的很慢。尤其是跨越大西洋和太平洋的时候,网络有时候会变的很慢。这种情况下,建议就近接入客户的节点。


作者:苏欣

链接:https://cloud.tencent.com/developer/article/1491610


收起阅读 »

曲线救国:提高github下载速度到2MB/s

因为网络连接的原因,在国内从github上面下载代码的速度峰值通常都是20kB/s。这种速度对于那些小项目还好,而对于大一些的并且带有很多子模块的项目来讲就很耽误时间。常见的方法是通过代理连接,但实际用起来并不稳定。这里提供一种新的思路,下载速度可以达到1~2...
继续阅读 »

因为网络连接的原因,在国内从github上面下载代码的速度峰值通常都是20kB/s。

这种速度对于那些小项目还好,而对于大一些的并且带有很多子模块的项目来讲就很耽误时间。

常见的方法是通过代理连接,但实际用起来并不稳定。

这里提供一种新的思路,下载速度可以达到1~2MB/s

1. 利用开源中国提供的代码仓库

标题已经说的很清楚了,我想对于经常使用git的人来讲,很可能已经知道了。对于新手刚接触git的人来讲,可能你只知道github。

实际上,国内也有很多代码仓库提供方,国外也不只github。只不过国内也是刚刚开始,关注的人不多。

开源中国提供的代码仓库提供了一个功能,就是它可以将github账号中的代码 clone 到开源中国的账户中去。这个代码仓库叫做 码云 ,没错就是 Ma云!

要求你有一个github账户,一个码云gitee账户。

步骤很简单

1.将github上面你想要搞下来的项目首先 frok 到你自己的github的账户中去。耗时:一瞬间

2.登录gitee,没有的自行注册。网页中有添加项目的按钮,一个加号。点击加号,下拉列表里面有 迁移github项目 的选项,点开后按照提示关联自己的github账号,之后选择你要迁移的项目,按提示操作。耗时:不到三分钟。

3.按照 clone github项目方法, clone 迁移到gitee账户中的项目。区别是 clone 链接换成了目标项目在gitee中的链接。通常下载速度是以MB/s为单位的。

按照上面的方法,基本上不再需要整夜挂机 clone 代码了。

最近重新看了下,其实上面的步骤有些繁琐,其可以更简单,新建仓库直接设置远程仓库地址。

第一步:

新建仓库

第二步:

以github仓库https://github.com/PX4/Firmware.git举例

第三步:

3.png

第四步

4.png

2. 提高下载子模块的速度

有的项目里用到了第三方代码仓库,但是在你使用 clone 指令的时候这些子模块 submodule 并不会自动下载,因为他们在另外的地址中存放。你需要 clone 完目标项目后,执行

git submodule update --init --recursive

才会将目标项目所需要的依赖子模块下载下来。github项目中所用到的子模块依然是放在了github上。这就很悲剧了,这意味着你在执行上面指令后,依然需要面对上面的20KB/s的速度。虽然此时并不会显示出来,然而等待依然很久。

我们同样使用上面加速 clone 的思路。

从下载的项目中找到其使用的 submodule 的链接是哪里。

打开上一步中的链接,将使用的目标子模块的代码同样 frok 到自己的github账户中,之后同样的方法迁移到gitee中去。有多个子模块就多重复几次操作,同样的套路。

将原项目使用的 submodule 模块的链接地址修改为子模块迁移到gitee中后的地址。

这时再去执行

git submodule update --init --recursive

以上就是提高下载子模块速度的思路。具体每步的操作,请自行搜索,网上一搜一大片。


附:关于如何修改submodule连接地址
https://blog.csdn.net/wangjia55/article/details/24400501
https://www.jianshu.com/p/c81e2bd377ad
https://blog.csdn.net/qq_22630169/article/details/74236535
https://blog.csdn.net/wangjia55/article/details/24400501


版权声明:本文为CSDN博主「kcx64」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/kcx64/article/details/83866633


收起阅读 »

实时音视频选型 开发者应该避开哪些坑?

实时音视频技术的专业度和复杂度都很高,通过 PaaS 服务商来集成实时音视频,快速开发 App,是时下开发者的优先选择。所选 RTC 是否好用易用、契合所需场景,将直接影响项目开发进度和后期运维成本。开发者需要...
继续阅读 »

实时音视频技术的专业度和复杂度都很高,通过 PaaS 服务商来集成实时音视频,快速开发 App,是时下开发者的优先选择。所选 RTC 是否好用易用、契合所需场景,将直接影响项目开发进度和后期运维成本。

开发者需要了解实时音视频技术选型中要避开的坑点,以便提高开发集成效率。具体来说,以下四个方面要综合考虑。

一、实时音视频与 IM 能力不宜分散

几乎 100% 的实时音视频在线应用都有文字/语音消息、文件传输、图片显示等 IM 需求。

目前市场上 PaaS 服务商这两方面能力强弱不一:有的大厂虽然两方面能力都提供,但不能确保两种能力同样高质量;有的专业 RTC 厂商,只能提供 RTC 能力,IM 能力还得由第三方专业服务商提供。

这样,便迫使开发者在集成过程中不得不分别选择服务商。当实时音视频与 IM 质量不稳定时,需要逐一协调各个服务商,逐一排查问题,无形中增加了后期的运营成本。其实,IM 和音视频在很多场景下有耦合,建议开发者在选型一开始就要考虑具有 RTC+IM 双重高保障能力的通信云厂商,尽量“用一套 SDK,解决所有通信场景”。

任杰总2.png

对开发者来说两项功能同时开发,开发包相对比较小;如果前期只用到了 IM,没有用到 RTC,那么只需要学习 IM 方面的开发文档就可以了,一旦有了 RTC 需求,再去学习 RTC文档,开发者只需接入相关接口,快速与 IM 能力做对接和匹配,即可完成两类功能在 App 生命周期里的全覆盖。

除了开发上的易快速上手外,选择“IM+RTC+推送”整合的解决方案,开发者还可以享受一致的网络架构,提高传输的效率和质量,获得一致的服务保障。例如,融云近期升级了实时音视频能力,RTC的通信信令是复用 IM 信令通道,可以确保消息 100% 的连通率和到达率,使底层的通信优势发挥到最大。

二、延时、卡顿、抖动的质量问题要解决好

通过调研发现,用户最不能接受实时音视频的三个质量问题是延时、卡顿、抖动。

低延时要靠两个方面解决,一个是传输协议,一个是优化整体传输环节。实时音视频的主流传输协议有 RTMP 和 UDP 两种,一种支持 CDN 技术,一种支持 WebRTC 技术,相对来说,CDN 技术延时性在 3-5 秒,WebRTC 可以在几百毫秒以内,现在很多厂商可以同时支持这两种技术,分别适用于不同的场景。

整体传输环节中,采集/渲染、编解码/网络往返都会有一定的延时,有些是硬件的物理延迟,需要靠 5G 这样底层网络技术的提升,或者布更多的数据中心、边缘结点,便于就近接入;有些要针对实际场景,在具体形态上做一些权衡,比如在处理粒度上粗细的考虑,越细的粒度传输的数据包相对较大,延迟也会更高。

当音视频出现卡顿时,有一个视频流畅优先的原则。我们通过降低一些码率和帧率,即使画面模糊一点,也要让用户视觉上是流畅不卡顿的。这样在选型时候,要考虑几个方面:一个是优化低码率下的视频清晰度;二是要有带宽估算能力,当预判到这个带宽没法承受高清晰视频传输时,自动转化成低码率并通过优化算法,使低码率视频清晰度能媲美高清视频。

音视频弱网优势_副本.png


另外,数据包通常会以错误的顺序到达,从而产生抖动相关问题,或者直接丢失,造成音视频空白。谷歌一份资料显示,视频聊天应用 Duo 99% 的通话都有数据包丢失、过度抖动或网络延迟情况。20% 的通话丢失了超过 3% 的音频,10% 的通话丢包率超过 8%,也就是说每次通话都有很多音频需要替换。

处理上述问题,很多厂商会采用抗丢包及抗网络抖动能力的 NACK(丢包重传)、FEC(前向纠错)、自适应带宽调整(动态调整码)、接收端 Jitter Buffer(媒体流平稳)等各种机制,有些是组合使用,有些是单独使用,开发者在选型前一定要做到深入了解。

  • 拥有全球通信和场景化能力

    刚才谈到低延时、抗丢包的解决策略,有些是与网络接入路径长短直接相关的。比如中美两地的音视频连接,没有全球通信网络支持、数据中心和节点布局的厂商是提供不了服务的。开发者选型开发前,就要考虑到自己业务的所属范围。   

    选择全球化服务的云厂商,除了看数据中心和节点分布外,还要仔细考察全球网络布局的品质,简单说,有的厂商提供了全球网络优化能力,中美之间的音视频连接在未优化前要经过 100 多跳,而优化后仅 6 跳就能完成连通。这是由于,这些厂商拥有自有的路径最优算法,通过智能路由就近接入,即使在异国/地网络环境较差的情况下,仍然能够及时切换到更好的线路上去。比如融云拥有全球优化加速网络,实时音视频通话可做到全球端到端延时小于 400ms,最低延时 66ms,保障端到端之间延迟无感知的实时互动。

在场景化能力上,实际上相比 IM,实时音视频更加通道化,在各个场景中复用的程度也相对较高,能力也更基础。优秀的 PaaS 厂商会按场景提供不同的 Demo,音视频技术的升级也针对解决更多的应用场景去优化,便于开发者拿来即用,这种方式对入门级的开发者都十分友好。各种 API 接口相对独立,开发者只需关注和使用所需要的 SDK,就可以实现想要的场景,大大降低集成开发的难度。

四、开发者服务足够完善

在一些社区中,我们常常会看到一些技术文档下,开发者提出问题而没有回复。开发者为提高开发效率,越来越倾向于自助完成工作,因此,开发文档是否易懂,Demo 是否易用,都显得十分重要。

另外,工单回复的速度,微信群、社区的值守和响应程度等都能反映 PaaS 厂商服务意识的强弱。通常来说,7×24 小时技术支持服务,1 小时工单快速回复、快速远程接入、快速恢复的故障应急响应机制,这些都是对开发者很完善的服务支持。

有些厂商还会提供特色的质量监控服务,比如融云“北极星”的质量问题排查平台,通过可视化图表,快速定位卡顿位置,实时统计丢包率,使开发者可以自助排查每一次音视频通话过程中的丢包率、网络带宽等通信技术参数。可以直接定位用户问题,提高排查效率,提升用户体验。

点击阅读原文

最新活动推荐:

融云年中大促活动海报.png


收起阅读 »

【融云分析】SDK 交付质量保障之自动化测试

² 自动化测试的意义很多测试人员说到自动化测试领域,反应就是的接口自动化、Web 自动化、APP 自动化、Selenium、Appium 等等。其实这些都是针对于测试工作,用来解决问题时已经比较成熟的工具或方案,相信随着自动化领域的发展,对应自动化测...
继续阅读 »

² 自动化测试的意义

很多测试人员说到自动化测试领域,反应就是接口自动化、Web 自动化、APP 自动化、Selenium、Appium 等等。其实这些都是针对于测试工作,用来解决问题时已经比较成熟的工具或方案,相信随着自动化领域的发展,对应自动化测试工具,方案也会越来越丰富。

相对于手工测试而言,自动化测试本质上是使用代码或者工具,把复杂的测试工作从手动转化成为机器自动执行。优秀的框架、工具可以借鉴使用,但不要过于局限于现有工具和框架,而应根据自身产品特性和架构特性,寻找适合当前产品的自动化测试解决方案才是合理的自动化测试。

² 融云自动化测试实践

以融云的业务为例,在融云实时音视频 SDK 的质量保证上,有大量的测试点需要关注,例如:噪声啸叫抑制、回声消除、清晰度、首帧速度、移动端性能、耗电量、流量控制、延时、丢包等。

除了上述音视频质量检测以外,对于一个 SDK 基础服务来说,还有些需要重点关注的指标就是连通率指标,连通速度指标。而且该指标想达到 99.9% 以上的标准,那么针对每个功能修改,版本发布,测试次数需要数千次数万次的成功连通测试才能验证。

一、保障实时音视频 SDK 质量应具备的条件

音视频 SDK 测试需要测试不同厂商的客户端设备,对 SDK 画面渲染、稳定性、视音频连通等各种表现情况。因此我们还需要在单元测试的基础上,引入移动端,web 端的自动化测试检查客户端的具体表现能力。

1. 测试框架及工具的整合,建立稳定的 UI 自动化测试脚本  

Appium & Selenium 作为测试框架,可以支持iOS,Android,Chrome,Firefox 等多种驱动。并且无需对测试应用做任何嵌入式的修改,开源社区也相对活跃,作为UI自动化测试是一个比较好的选择。Python + Pytest 作为快速开发的语言和单元测试框架,可以提升测试脚本整体开发效率。

下面是 Appium & Selenium 基本工作原理:

 自动化测试1_副本.png

 

接触过 UI 自动化的同学,很多都会觉得 UI 自动化测试相对于接口、单元测试来说并不稳,尤其是遇到长时间运行几十个小时、几千上万条用例时,稳定性阻碍使用的一大难题,我们针对一些经常出现的问题进行解决。

 

元素不定期出现变化

对于元素不定期变化的问题,与团队进行沟通协调当然必不可少,也是最容易解决问题的方法,当然还有很多其他方式。

 

Page Object 设计模式对于 UI 测试来说就是一个不错的选择,Python3 有个升级就是全面 Unicode化,就是可以使用用中文命名变量,对于页面静态变量这种元素修改、查错来说效率还是可以提高不少。例如:

自动化测试2_副本.png


设备断开 & 网络异常

设备断开这个应该是阻断 UI 自动化常出现的问题了,数据线闪断、客户端服务 Crash、远程连接网络异常等,这时候重连机制就尤为重要了。针对这个问题我们可以给每个用例加增加装饰器函数如果用例失败并且检测到断开则立即重连;也可以用 Pytest 内置钩子函数使用方法检测断开重连,示例:

 自动化测试3_副本.png 

 

意外弹窗问题

很多厂商设备在你运行用例的时候,经常会弹出个窗口,这是非常头痛的,但是基本上所有的弹出按钮都是 Android: //android.widget.Button,iOS: //XCUIElementTypeButton 两种类型的 xpath。因此我们只需要在报错时,获取页面上所有这两种类型的文本处理一下即可,尽量不堵塞后续用例的运行。简单示例:

 自动化测试4_副本.png

 

良好的测试用例设计

无论是从事何职的测试人员,测试用例设计都应该是关注的重点,一个好的自动化测试用例设计可以发现更多的问题,也可以让用例运行更加稳定。

 

2. 提供多样丰富的测试数据,不放过每一次问题

在我们运行自动化测试时,检测到崩溃、黑屏、绿屏、花屏等异常错误的时候,需要尽可能地提供详细测试报告数据才能更加准确地定位问题。

 

移动端关键错误截图和日志

自动化测试的报错截图,比较好获取,但是日志内容是客户端查询的关键。ADB 或者 idevicesyslog 等工具虽然可以获取到手机日志,但是在脚本运行过程中,不容易精确定位并截取到测试用例开始到结束这段时间日志内容。

 

实际上 Appium 会自带日志缓冲区,在脚本运行的时,Appium 工具将移动端日志写入日志缓冲区。但是Appium 并没有提供 API 修改缓冲区大小,也无法筛选关键日志,因此我们针对 appium-xcuitest-driver、appium-android-driver、appium-adb 等库进行了符合自己产品需求的修改,可以进行日志过滤筛选主动触发清理缓冲区,使定位问题更加精确,测试报告更加完善。

 

移动端关键错误网络抓包

遇到错误时,网络交互数据也是检查错误的重要数据,我们需要利用 Wireshark 工具进行抓包截取部分网络抓包数据,针对 iOS 设备可以用 rvictl 命令 生成虚拟网卡,Android 设备则需要使用共享 Wifi 模式。之后利用 Wireshark  dumpcap 指定网卡和筛选数据。同日志抓取一样,通过钩子函数我们在用例开始和结束时精确地定位到错误区间,并将抓包数据添加到测试报告中,提供给相关人员排查依据。

3. 测试任务调度平台

测试平台有主要分发测试任务和运行自动化测试任务两种。我们希望测试人员无需部署任何环境或者进行简单部署,就可以快速接入平台运行自动化测试,查看测试报告。不需要限定固定的移动设备来连接在固定机器上执行自动化测试。

 自动化测试5_副本.png


上图我们针对 Android 可以使用 ADB server 服务器。自动化测试测试脚本 Appium 服务器利用 ADB 传输协议,通过局域网链接子节点 Agent 服务进行测试,这样可以让设备不受限制,连接局域网任意本人或者空闲电脑,运行子节点 Agent 即可立即运行自动化测试,空闲设备利用起来,我们就有了庞大的测试机器群了,使设备即插即用使用率最大化。

 

但是 iOS 系统特性限制,虽然有 WiFi 共享模式,但使用起来稳定性并不友好。因此需要在 MAC Agent机器上环境部署本地的 Appium 等相关服务,设备直连该机器通过平台执行自动化测试

 

二、移动端 IM SDK,要做到接口全覆盖测试

客户端 SDK 是为第三方开发者提供的软件开发工具包,工具包的形式集成在 App 内,一个 App 内可能包含了多个 SDK 工具包。一个 SDK 对外发布后,我们可以建议开发者如何调用 SDK,但是无法预计开发者怎样调用 SDK 的接口。因此一个稳定的 SDK 工具包就显得尤为重要。

 

SDK 接口要做到全字段校验才能保证稳定性。

SDK 测试方法中,单元测试虽然可以更加的高效和稳定,但是单元测试无法轻松地在不同的设备范围运行,也无法针对打包集成后 SDK 包的功能进行检测,从而无法检测 SDK 在各大应用设备上的集成表现以及开发者在集成时候所遇到的问题。

 

 

IM SDK 自动化测试解决方案。

做自动化测试,主要解决的问题是:

1) 核心通信能力尽可能的脱离 UI 自动化测试,做到快速迭代的能力;

2) 可以任意对 SDK 接口字段进行自由组合校验;

3) 可以测试覆盖单设备多应用测试场景。

 自动化测试6_副本.png

 

由上图可看出基本结构并不复杂,主要是根据约定 JSON 格式和 Demo 层中的 Server 进行通信,Server Demo 通过反射或者自定义等方式调用 IM SDK 的接口,这样使我们可以对SDK 的接口参数进行自由的组合,从而验证 SDK 在复杂的测试用例中,是否能保证产品质量的稳定性和异常参数回调的友好提示等。

 

打包后的IM SDK 自动化测试,使移动端 IM SDK 基础服务不再只依赖于 UI 层的 Demo 测试,可测试范围和版本回归效率能提升数十倍。

² 自动化测试的测试成本&预期收益平衡

 

软硬件行业自动化趋势在近年来愈发明显,当然自动化测试也随之一步步更加成熟,但是要做自动化测试,肯定要考虑测试成本和预期的收益。

 

虽然自动化测试可以在任何时候都可以自动运行,看似节省了时间,但是需要考虑到自动化脚本前期开发的时间成本和后期脚本的维护成本,而且自动化效率较为依赖用例设计,自动化测试用例的开发工作量有时会比手工测试的工作量还要大。项目开发周期短、业务新、测试业务主观性很强等类型的产品要慎重考虑。

 

自动化测试能带来哪些收益也是大家最关心的,自动化测试一个重要的特性就是一致性,它不会随着时间增长出现由于人的疲劳所带来的漏测、漏记,可增加版本发布的信任。由于测试是自动执行的,所以执行过程中极少会出现疏忽错误,当然这也取决于自动化测试脚本的设计质量。

 

在立项初期如果考虑使用自动化测试,一定要考虑清楚自动化测试目标是什么,用自动化测试来解决什么问题,如果想用自动化测试来节省人力成本显然是不合适的,自动化测试的首要目标应当是如何提高产品的质量。

 

以上就是融云在自动化测试实践中的一些所感所得,我们将其记录和整理,并与大家分享,也欢迎更多的技术小伙伴与我们一起探讨。

 

点击查看原文


 最新活动推荐:

融云年中大促活动海报.png


收起阅读 »

推荐3款逆天级Chrome插件,不火天理难容!

今天又是给大家推荐插件的一天,个人觉得今天的插件真的是富有灵魂的,非常实用的三款插件,无形之中还能提高工作效率,都说自己需要的插件才是好用的插件,这话没毛病。一、广告终结者下载地址:http://www.cnplugins.com/office/guangga...
继续阅读 »

今天又是给大家推荐插件的一天,个人觉得今天的插件真的是富有灵魂的非常实用的三款插件,无形之中还能提高工作效率,都说自己需要的插件才是好用的插件,这话没毛病。


一、广告终结者



下载地址:http://www.cnplugins.com/office/guanggaozhongjiezhe/download.html

广告终结者是一款清洁过滤广告的插件,在浏览网页时广告弹窗基本都会被过滤掉,还有一些视频广告,跟踪代码等,能够为用户创造干净的上网环境,最重要的是它体积很小,只有0.2M,轻量好用,用它就对了!


微信图片_20200724114435.png


它能屏蔽视频广告,要知道现在如果不开会员的话,想看个电视啥的视频前面都会有几十秒的广告存在,用了这款插件就可以直接屏蔽掉,非常方便,像某酷、某奇艺、某讯都能实现,不过也会有点不太稳定,毕竟去广告还是有点复杂的,所以它也会不断更新,下面是没开会员打开视频的状态。

二、Print Friendly & PDF



下载地址:
http://www.cnplugins.com/office/print-friendly-
pdf/download.html

Print Friendly & PDF是一款网页打印和生成PDF的Chrome插件,如果你想在打印的时候想过滤掉一些不想打印的内容,这个插件就可以帮到你,可以自定义打印内容和打印格式, 像经常需要打印网页的话,这个插件必备。


微信图片_20200724114520.png

这个插件还是挺实用的,像你在浏览网页时看到喜欢的文章或者博客,想要保存打印出来的话,自己逐条复制到Word就很麻烦,可能会说把网页打印成PDF格式,那也会有一些无用的信息在里面是你不想要的。微信图片_20200724114538.png

用了这款插件就可以在你打印的时候删除一些你不想要的东西,同时可以更改字体图片大小,也可以修改好下载为PDF电子邮件等,非常方便。

三、Tablist


下载地址:
http://www.cnplugins.com/office/tab-list/download.html

Tablist是一款可以方便地管理chrome标签,并在标签列表中显示打开了多长时间的插件,在标签显示打开的时候,以便帮助你确定哪些标签是有用的,哪些是需要关闭掉的。

微信图片_20200724114605.png

像我们平时工作浏览网站时,可能会不知不觉的打开很多网页,但是电脑的窗口有限,显示的字数也有限,所有网页的标题就会以缩写的形式展示,那么当你想看其中一个网页的内容时,就不好分辨出来哪个是你需要的。

微信图片_20200724114615.png

这款插件就可以解决这个问题,你只需要点击Tablist按钮,它就会显示一个完整的标签标题以及打开多长了时间,这样你就容易找出哪个是你需要的吗,哪些是无用要关闭的。

微信图片_20200724114628.png

好了,今天的分享就到这里,是否是你需要的插件呢,当然你们想要什么样的插件可以留言区评论。

收起阅读 »

【融云集成】融云即时通讯集成经验分享

前言融云即时通讯接入总体比较快的,今天把开发过程中遇到的坑列出来,也把解决方案附上,希望以后大家可以避免:UserInfo问题切换登录后会话列表数据错乱问题聊天界面消息字体颜色问题UserInfo问题融云开发文档中提到,融云服务器不会帮我们缓存用户信息(一般指...
继续阅读 »

前言

融云即时通讯接入总体比较快的,今天把开发过程中遇到的坑列出来,也把解决方案附上,希望以后大家可以避免:

  1. UserInfo问题

  2. 切换登录后会话列表数据错乱问题

  3. 聊天界面消息字体颜色问题


UserInfo问题

融云开发文档中提到,融云服务器不会帮我们缓存用户信息(一般指头像链接、昵称、用户id),如果要实现用户信息的及时刷新与获取,可以用2种方式:
1、在消息中携带用户信息
优点是省事方便,缺点是消息体会稍大一丢丢。

2、使用用户信息提供者,说白了就是在需要刷新用户信息的时候,调后台接口或者从App本地缓存中提供给融云SDK来刷新。
优点是消息体不会变大,缺点是如果是对方给你发消息,那么很抱歉你只能调用后台接口去刷新用户信息(前提是你之前没缓存过发送者的用户信息)。

显而易见,使用第1种方式会好一点,问题也会少一些。我们需要做的是:

1、在和别人聊天前先持久化对方的用户信息(你都能用他的id来进行聊天了,相信头像链接和昵称应该都有吧)

2、开启消息中携带用户信息

RongIM.getInstance().setMessageAttachedUserInfo(true);

3、在收到对方消息的时候,及时刷新对方用户信息

//监听消息接收事件RongIM.setOnReceiveMessageListener((message, i) -> {
                UserInfo userInfo = message.getContent().getUserInfo();
                if (userInfo == null)
                {
                    LogUtils.getInstance().e("消息中的UserInfo为空......");
                    return false;
                }
                RongIM.getInstance().refreshUserInfoCache(userInfo);
                //返回false则依旧走融云默认的通知和铃声
                return false;
            });

4、在适当时机刷新用户信息
比如登录融云后设置自己的用户信息

RongIM.getInstance().setCurrentUserInfo(userInfo);

并且批量刷新本地持久化的融云用户信息(我写了个方法,批量刷新之前缓存过的用户信息,在进入应用首页和登录后会调用)

 

切换登录后会话列表数据错乱问题

 

当你是用融云官方会话列表组件(ConversationListFragment)来承载会话列表数据,并且没做任何处理,那么切换账户后肯定会出现数据错乱问题,比如会话列表居然残留上个用户的聊天记录,这是因为ConversationListFragment的数据没被刷新所致,我们切换用户后,必须刷新ConversationListFragment。

LogUtils.getInstance().e("尝试刷新消息Fg的会话列表");
            Uri uri = Uri.parse("rong://" + 你的包名).buildUpon()
                    .appendPath("conversationlist")//这2行配置不需要一样,只需要和你刚初始化ConversationListFragment时的配置一样即可
                    .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") 
                    .appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "true")//讨论组
                    .build();//ConversationListFragment的实例
            conversationListFragment.setUri(uri);

聊天界面消息字体颜色问题


融云默认的文本消息的颜色,不论对方还是自己的都是黑色(#262626),是不支持直接分开设置字体颜色的,要修改的话只能使用自定义的TextMessageItemProvider(小提示:文本消息是一种消息类型,控制其UI布局的是TextMessageItemProvider),然后在初始化融云SDK的位置加上:

        //注册自定义文本消息提供者(因为TextMessage这种消息类型已经被融云注册了,所以此处只需要重新注册一下Provider就好,不需要像自定义消息一样注册XxxMessage和Provider)
        RongIM.getInstance().registerMessageTemplate(new MyTextMessageProvider());

接着是自定义的TextMessageItemProvider,其实就是继承自官方的TextMessageItemProvider,并把里面的所有方法复制进去(怕出问题和方便快捷),然后修改关键方法 newView()bindView()
整个自定义的TextMessageItemProvider代码如下:

/**
 * 作者:HK
 * 日期:2019-04-19
 * 描述:自定义文本消息提供者(为了实现双方文本消息颜色不一样和更换气泡)
 */@ProviderTag( messageContent = TextMessage.class , showReadState = true)public class MyTextMessageProvider extends TextMessageItemProvider {

    public MyTextMessageProvider() {
    }

    public View newView(Context context, ViewGroup group) {
        View view = LayoutInflater.from(context).inflate(R.layout.my_rc_item_text_message, (ViewGroup)null);
        ViewHolder holder = new ViewHolder();
        holder.message = view.findViewById(R.id.tv_text1);
        view.setTag(holder);
        return view;
    }

    public Spannable getContentSummary(TextMessage data) {
        return null;
    }

    public Spannable getContentSummary(Context context, TextMessage data) {
        if (data == null) {
            return null;
        } else {
            String content = data.getContent();
            if (content != null) {
                if (content.length() > 100) {
                    content = content.substring(0, 100);
                }

                return new SpannableString(AndroidEmoji.ensure(content));
            } else {
                return null;
            }
        }
    }

    public void onItemClick(View view, int position, TextMessage content, UIMessage message) {
    }

    public void bindView(final View v, int position, TextMessage content, final UIMessage data) {
        ViewHolder holder = (ViewHolder)v.getTag();
        if (data.getMessageDirection() == Message.MessageDirection.SEND) {
            holder.message.setBackgroundResource(R.mipmap.my);
            //布局中message这个TextView设置了一个selector,selected设置成true和false会切换到相应字体颜色
            holder.message.setSelected(true);
        } else {
            holder.message.setBackgroundResource(R.mipmap.others);
            holder.message.setSelected(false);
        }

        final AutoLinkTextView textView = holder.message;
        if (data.getTextMessageContent() != null) {
            int len = data.getTextMessageContent().length();
            if (v.getHandler() != null && len > 500) {
                v.getHandler().postDelayed(new Runnable() {
                    public void run() {
                        textView.setText(data.getTextMessageContent());
                    }
                }, 50L);
            } else {
                textView.setText(data.getTextMessageContent());
            }
        }

        holder.message.setMovementMethod(new LinkTextViewMovementMethod(new ILinkClickListener() {
            public boolean onLinkClick(String link) {
                RongIM.ConversationBehaviorListener listener = RongContext.getInstance().getConversationBehaviorListener();
                RongIM.ConversationClickListener clickListener = RongContext.getInstance().getConversationClickListener();
                boolean result = false;
                if (listener != null) {
                    result = listener.onMessageLinkClick(v.getContext(), link);
                } else if (clickListener != null) {
                    result = clickListener.onMessageLinkClick(v.getContext(), link, data.getMessage());
                }

                if (listener == null && clickListener == null || !result) {
                    String str = link.toLowerCase();
                    if (str.startsWith("http") || str.startsWith("https"))
                    {
                        Context context = (v == null?null:v.getContext());
                        if (context != null)
                        {
                            context.startActivity(new Intent(context, MostWebViewActivity.class)
                                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                                    .putExtra(SPkey.url, link)
                            );//                        Intent intent = new Intent("io.rong.imkit.intent.action.webview");//                        intent.setPackage(v.getContext().getPackageName());//                        intent.putExtra("url", link);//                        v.getContext().startActivity(intent);
                        }
                        result = true;
                    }
                }
                return result;
            }
        }));
        textView.stripUnderlines();
    }

    private static class ViewHolder {
        AutoLinkTextView message;
        boolean longClick;

        private ViewHolder() {
        }
    }}

附录:融云自定义帮助


布局(IMKit下):
私聊布局:rc_fr_conversation.xml
输入框布局:rc_ext_extension_bar.xml
输入框-语音输入布局:rc_ext_voice_input.xml
输入框-文字输入布局:rc_ext_input_edit_text.xml
扩展栏布局:rc_ext_plugin_pager.xml
官方会话列表布局:rc_fr_conversationlist.xml

布局或者代码里引用的固定值:rc_ext_dimens.xml

加号(更多)控件:<io.rong.imkit.RongExtension


作者:Lucky丶夏日
链接:https://www.jianshu.com/p/640e4fa75ae9

收起阅读 »