Tuesday, January 11, 2022

SegmentFault 最新的文章

SegmentFault 最新的文章


权威发布 | SegmentFault 思否 2021 年度技术团队

Posted: 09 Jan 2022 06:49 PM PST

日新月异的技术革命,数字经济的新一轮爆发,背后是无数开发者夜以继日的付出。他们信奉技术力量,敢于技术创新,践行技术信仰,他们是技术先锋,探索改变世界的方向。

在 SegmentFault 思否社区活跃的创作者,既有个人作者,还有非常多技术团队,他们坚持长期价值,组织团队成员将顶尖科技企业的技术研究与技术实践进行专业的梳理和输出,他们让众多开发者受益,和开发者共同成长。

SegmentFault 思否根据社区用户行为大数据(如文章 & 问答发布数量、获得声望 & 点赞量等)综合分析,评选出了 30 个最杰出的年度技术团队

话不多说,让我们来一同揭晓评选结果~

团队名称专栏名称
Android开发者Android_开发者
ApacheFlink
CloudBase云开发 小程序云开发技术专栏
HMS_Core
LeanCloud TDS/LeanCloud
PingCAP开源分布式关系型数据库 TiDB
TNTWEB腾讯新闻前端团队
凹凸实验室凹凸实验室
百度大脑百度大脑
得物技术
阿里巴巴云原生阿里巴巴云原生
阿里云视频云阿里云视频云
阿里云云栖号阿里云栖号
华为开发者论坛华为开发者论坛
华为云开发者社区开发者之家
京东科技开发者京东科技技术新知
美团技术团队美团技术团队
OPPO数智技术OPPO互联网技术
葡萄城技术团队葡萄城技术团队
融云RongCloud融云分析
腾讯安全
腾讯云加社区腾讯云技术社区
腾讯云原生
vivo互联网技术vivo 互联网技术
微软技术栈
亚马逊云开发者亚马逊云开发者
有道技术团队有道技术团队
云叔_又拍云云叔
云音乐大前端团队网易云音乐大前端团队
政采云前端团队

恭喜以上上榜的技术团队!请入选的作者们添加下方思否小姐姐的微信,我们为每个「年度技术团队」准备了专属定制证书。

扫我↓ 添加思否小姐姐
image.png

我们诚挚地邀请更多企业 / 开源项目的技术团队来 SegmentFault 思否社区开通技术专栏,发布高质量的技术干货,也通过思否的平台将你们最新的技术研究与实践传递给更多开发者,我们会对优质内容进行推荐,并给予持续的流量支持。

【获奖名单】2021思否年度有奖征文获奖名单公布,快来领奖啦~

Posted: 10 Jan 2022 06:19 PM PST

亲爱的小伙伴们,2021思否年度有奖征文活动截至1月10日晚上12点已经结束啦!我们很高兴看到大家这一年来有不少喜悦和收获,也真心为每一位努力耕耘、积极向上的朋友而点赞、喝彩!虽然进取的路上总伴有失意与挫折,但每一步都走得热烈而深刻。

总结过去,是为了更好地砥砺前行!我们祝福大家将来在各自的领域都会更有作为。感谢大家参与本次年度总结活动,下面就让我们正式公布一下获奖名单吧~

🌟获奖名单

"万人迷"奖

  1. 边城:平平淡淡又一年 | 边城在思否的 2021 年总结
  2. 杨成功:从本科退学,到再拿本科,2021我的5年技术"弯路"回轨了|1.2w字
  3. wscats:在腾讯这一年,坚守初心持续单纯 | 2021年终总结
社区文章互动数(基于点赞、评论等)最多的3人
盲盒大礼包 + 编程课程 8 折劵 各一份(文中列出的课程)

"YYDS"奖

  1. Sunshine_Lin:写了15w字,55篇文章的前端程序员,不认命的一年!
  2. 张晋涛:6 个月内做了 15 场公开技术分享,我的 2021 是这样过的
  3. 范文杰:2021总结:八年了,开始写点东西了
文笔超赞/分享硬核干货内容最多的 3 人
盲盒大礼包 + 编程课程 8 折劵 各一份(文中列出的课程)

"油麦"奖

  1. 丶瑶:我在思否社区的2021年总结
  2. NickWang:2021-在物联网上又爬行了一年
  3. 死月:死月的二零二一总结
文笔幽默,内容有趣的 3 人
盲盒大礼包 + 编程课程 8 折劵 各一份(文中列出的课程)

"文艺"奖

  1. why技术:鲜衣怒马少年时,不负韶华行且知 | 2021,我这一年。
  2. 宁在春:我们:待别日相见时,我们都已有所成。挥手向2021告别吧,追求梦想的路上,永远不孤独!「2021 年终总结 」
  3. bigsai:再见2021,2022加油!
文笔细腻,内容深刻的 3 人
盲盒大礼包 + 编程课程 8 折劵 各一份(文中列出的课程)

"拔旗"奖

  1. CrazyCodes:挺过365天高强度学习|2021我的年度总结
  2. 叫我詹躲躲:不忘初心、砥砺前行 | 躲躲在思否2021年 - 年度总结
  3. 书旅:总结2021 & 规划2022
努力进取,完成flag最多的 3 人
盲盒大礼包 + 编程课程 8 折劵 各一份(文中列出的课程)
ps:看到很多朋友分享了这一年奋斗的经历,深受感动,所以增设这一奖项,鼓励大家继续为自己的目标而努力

阳光普照奖

  1. 后三消:双非应届生转码的一年
  2. linshuai:三十岁程序员的2021年度总结
  3. church:我的2021
  4. Ijiran:女朋友 or 高薪资?2021年终总结普通且深刻
  5. pluseven:职场新人程序员2021年度总结
  6. kumfo:不忘初心,砥砺前行——记录于2021
  7. 夕水:2021我的个人总结
  8. 王悟空:2021 - 风起于青萍之末
  9. 卢卡斯:2021年卢卡的认知和感悟
  10. jsliang:朝花夕拾 - 年度整理,2021?2022!
  11. 小隐:激情、努力、进步、迷失、悔恨、失落百感交集的2021年
  12. 鱼鱼鱼:2021个人总结 - 挂帆起航
  13. 阳呀呀:女,30+,已婚,未育的前端打工人2021年终总结
  14. fairyly:技术管理之路之2021年终总结
  15. 翻雪:2021,沪漂五年考研上岸
  16. 王铁手:2021 总结
  17. zangeci:工作与生活平衡的2021年
  18. 林小志:2021 年简单回顾一下,从前端开发角色裸辞后转型开始做猎头的我
  19. Fw恶龙:又是当卷心菜的一年 | 2021 年终盘点
  20. 你要不要喝奶茶:从专升本到互联网大厂-我的2021
  21. hfhan:在思否的第一次年终总结
  22. OBKoro1:成功只有一种-OBKoro1的2021年终总结
  23. linong:2021年度总结:变换
  24. dragonir:2021年终总结:人类跌落梦境
  25. 沈唁:当 2021 年的寒冬遇到疫情和离职
  26. Java3y:今年我经历了裸辞,自由职业,再就业
  27. 张喜硕:归去难,修一缄回两字报平安
  28. 蛙人:一枚普通前端平淡无奇的一年 - 2021年终总结
  29. 宇宙之一粟:代码之外:人生最大的幸运就是努力没有白费 -- 我的2021年度总结
  30. 喵叔:年终总结--狗血的2021年
  31. 程序员海军:海军的 2021年终总结, 跳槽后,我收获了什么
  32. 大菠萝:在游戏公司的1024天
  33. kevinwan:梦想总是要有的 - 工作20年程序员的2021年度总结
  34. xuexiangjys:尽管颓废了一年,但我仍未放弃梦想「2021年终总结」
  35. codecraft:2021年终总结
  36. 前端小熊:2021非技术性总结-一个前端程序员的反面教材
  37. Java中文社群:2021年终总结:30多岁依然没有放弃自我成长!
  38. 良许:良许跌宕起伏的2021年
  39. 三掌柜:碌碌无为而又不平凡的2021
  40. 我是小胜呀:转变,是为了更好的前进|2021年度总结
  41. 新亮:岁末将至,再见 2021
  42. 木子星兮:2021 年:普通平凡而有纪念意义的一年
  43. masonli:写在2021最后一天
  44. 刘家财:EmacsTalk 2021 年终回顾
  45. xindoo:2021渐入佳境
  46. saucxs:松宝写代码2021年总结:突破重围
  47. 纯情阿丁:2021年度总结
  48. Meathill:职业生涯的新转折点,2021 技术总结
  49. 五柳:2021 年,学习编程的第 4 年,这一年我做了哪些事情?
  50. 归子莫:# 2021年终总结|2022锋芒毕露
【50人】参与活动,文章符合要求且被收录的征文作者
思否 T 恤 + 编程课程 8 折劵 各一份

🎁 奖品概览

盲盒大礼包(每个大礼包中有3-4个礼品)+ 思否编程自营课 8 折代金券,大礼包中可能会有以下礼品:

思否独角猫手办,思否定制 T 恤,CODING 大圣鹅公仔,ARM 蓝牙音箱,ARM 旅行套装,京东鼠标垫,杯子,风扇,笔记本,技术书……

感谢腾讯云 CODING、ARM中国、声网、葡萄城、京东科技等对本次活动的赞助

视频课程

图文课程

✏️ 如何领取奖品?(划重点)

获奖的小伙伴,请将收货信息填写到表中~https://jinshuju.net/f/XnAkHx

重点:表格填写截止到 2022年1月15日,逾期则视为自动放弃哦~~

PS:临近过年,我们会尽量在年前给大家邮寄礼品,大家记得及时填写收货信息啦


如有问题可以添加小姐姐微信~

image.png

思否小姐姐在这里提前祝大家新年快乐,新的一年头发浓密,没有 BUG ~

分布式抽奖秒杀系统,DDD架构设计和实现分享

Posted: 04 Jan 2022 04:18 PM PST

作者:小傅哥
博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!😄

一、用大项目,贯穿知识体系

写CRUD、堆API、改屎山⛰,熬多少个996也只是成为重复的螺丝钉。如果你希望捅破现有工作的瓶颈,拉高一下对技术的认知,那么就非常需要一个大项目来贯穿常用技术栈的知识体系。碎片化断层的背八股文,是解决不了这个事情

那怎么办?当然是要肝项目了,肝一个有互联网技术体系有分布式架构运用有DDD思想和设计模式实践的真实场景项目,才能让一个尚未接触此类项目或是长期陷入CURD的熟练工,打开视野,快速成长起来。

整整半年,小傅哥都在做这件事情,直到今天才完成整个系统的第一期设计实现和落地。在这个《分布式抽奖系统》项目中,我会带着大家以DDD架构和设计模式落地实战的方式,进行代码开发视频介绍文档说明的方式讲解和实现分布式抽奖系统,那么这里会涉及到很多DDD的设计思路和设计模式应用,以及互联网大厂开发中所应用到的技术,包括:SpringBoot、Mybatis、Dubbo、MQ、Redis、Mysql、ELK、分库分表、Otter 等。

二、四层架构,领域驱动设计

Lottery 抽奖系统 项目是一款互联网面向C端人群营销活动类的抽奖系统,可以提供抽奖活动玩法策略的创建、参与、记账、发奖等逻辑功能。在使用的过程中运营人员通过创建概率类奖品的抽奖玩法,对用户进行拉新、促活、留存,通常这样的系统会用在电商、外卖、出行、公众号运营等各类场景中。

1. DDD 四层架构

  • 此系统架构为 DDD 领域驱动设计的四层架构实现方式,以重视代码实现落地的方式向读者介绍和展示如何开发这样的代码。
  • 在 Domain 领域层逐步通过拆解系统流程设计,按照职责边界的领域模块进行设计和开发,最终在应用层进行逻辑功能编排。
  • 这个系统中会体现出很多的设计模式思想和最终的实现,只有把 DDD 和设计模式结合起来,才能开发出更加易于扩展和维护的代码结构。

2. 分布式工程设计

整体系统架构设计包含了6个工程:

  1. Lottery:分布式部署的抽奖服务系统,提供抽奖业务领域功能,以分布式部署的方式提供 RPC 服务。
  2. Lottery-API:网关API服务,提供;H5 页面抽奖、公众号开发回复消息抽奖。
  3. Lottery-Front:C端用户系统,vue H5 lucky-canvas 大转盘抽奖界面,讲解 vue 工程创建、引入模块、开发接口、跨域访问和功能实现
  4. Lottery-ERP:B端运营系统,满足运营人员对于活动的查询、配置、修改、审核等操作。
  5. DB-Router:分库分表路由组件,开发一个基于 HashMap 核心设计原理,使用哈希散列+扰动函数的方式,把数据散列到多个库表中的组件,并验证使用。
  6. Lottery-Test:测试验证系统,用于测试验证RPC服务、系统功能调用的测试系统。

3. 凝练流程领域

  • 拆解功能流程,提炼领域服务,一步步教会你把一个业务功能流程如何拆解为各个职责边界下的领域模块,在通过把开发好的领域服务在应用层进行串联,提供整个服务链路。
  • 通过这样的设计和落地思想,以及在把流程化的功能按照面向对象的思路使用设计模式进行设计,让每一步代码都变得清晰易懂,这样实现出来的代码也就更加易于维护和扩展了。
  • 所以,你在这个过程中学会的不只是代码开发,还有更多的落地思想实践在这里面体现出来。也能为你以后开发这样的一个项目或者在面试过程中,一些实际复杂场景问题的设计思路,打下不错的基础。

三、学习介绍,教你怎么上车

包括:文档视频代码作业,四方面结合的方式进行学习,所以也能让即使缺少编码经验的在校学生、应届生或者是CRUD熟练工,都能快速加入项目进行学习。

  • 课程分为:大厂规范领域开发运营后台应用场景系统运维,共5章34节来讲解DDD分布式系统的架构设计和实践落地。
  • 只要你能认真跟着敲下来,22年的 Offer 不会便宜!真的是研发能力有差异吗,其实不是,你差的只是一个有人带着你肝的大型系统而已!

1. 学习目录

  • 第 1 部分 大厂规范

    • 第01节:大厂码农开发基础
    • 第02节:需求怎么来的
    • 第03节:系统架构设计
    • 第04节:进入开发阶段
    • 第05节:系统上线维护
  • 第 2 部分 领域开发

    • 第01节:环境、配置、规范
    • 第02节:搭建(DDD + RPC)架构
    • 第03节:跑通广播模式RPC过程调用
    • 第04节:抽奖活动策略库表设计
    • 第05节:抽奖策略领域模块开发
    • 第06节:模板模式处理抽奖流程
    • 第07节:简单工厂搭建发奖领域
    • 第08节:活动领域的配置与状态
    • 第09节:ID生成策略领域开发
    • 第10节:实现和使用分库分表
    • 第11节:声明事务领取活动领域开发
    • 第12节:在应用层编排抽奖过程
    • 第13节:规则引擎量化人群参与活动
    • 第14节:门面接口封装和对象转换
    • 第15节:搭建MQ消息组件Kafka服务环境
    • 第16节:使用MQ解耦抽奖发货流程
    • 第17节:引入xxl-job处理活动状态扫描
    • 第18节:扫描库表补偿发货单MQ消息
    • 第19节:设计滑动库存分布式锁处理活动秒杀
  • 第 3 部分 运营后台

    • 第01节:UI工程搭建
    • 第02节:活动列表数据展示
  • 第 4 部分 应用场景

    • 第01节:搭建微信公众号网关服务
    • 第02节:【作业】vue H5 大转盘抽奖
  • 第 5 部分 系统运维

    • 第01节:在云服务器部署 Docker
    • 第02节:部署环境 Redis
    • 第03节:部署环境 Kafka
    • 第04节:部署环境 Mysql
    • 第05节:部署环境 xxl-job
    • 第06节:部署环境 nacos

2. 你会学到什么

  • 分布式系统架构如何开发(RPCMQ分布式任务分库分表)
  • DDD 四层架构设计与设计模式的结合落地
  • 互联网大厂的代码开发规范、需求评审、运维监控
  • Docker 运维实践,环境、部署、配置、监控、日志等

3. 适宜人群

  • 具备 Java 编程基础的研发人员,想提升自己的技术能力
  • 希望提升编码思维,剔除到代码中的坏味道
  • 有意愿成为架构师,但还处在一定瓶颈期
  • 想加入大厂做码农,但总感觉找不到门路

4. 加入学习

5. 课代表作业

讲真,我遇到了一个懂我的人!

在实战项目学习中,有一个课代表,每一次分享作业都可以用精致来形容,她的学习速度超级快,也可以非常清晰的分析出每一块的流程并配上流程图,如下:

  • 我也希望有更多的优秀的你,与我一起学习、成长、赚钱,22年,我们加油!

Three.js 实现虎年春节3D创意页面

Posted: 10 Jan 2022 04:58 PM PST

背景

虎年 🐅 春节将至,本文使用 React + Three.js 技术栈,实现趣味 3D 创意页面。本文包含的知识点主要包括:ShadowMaterialMeshPhongMaterial 两种基本材质的使用、使用 LoadingManager 展示模型加载进度、OrbitControls 的缓动动画、TWEEN 简单补间动画效果等。

实现

👀 在线预览,已适配移动端:https://dragonir.github.io/3d...

引入资源

其中 GLTFLoaderFBXLoader 用于加在模型、OrbitControls 用户镜头轨道控制、TWEEN 用于生成补间动画。

import * as THREE from "three"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; import { TWEEN } from "three/examples/jsm/libs/tween.module.min.js";

场景初始化

这部分内容主要用于初始化场景和参数,详细讲解可点击文章末尾链接阅读我之前的文章,本文不再赘述。

container = document.getElementById('container'); renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMap.enabled = true; container.appendChild(renderer.domElement); // 场景 scene = new THREE.Scene(); scene.background = new THREE.TextureLoader().load(bgTexture); // 雾化效果 scene.fog = new THREE.Fog(0xdddddd, 100, 120); // 摄像机 camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.set(100, 100, 100); camera.lookAt(new THREE.Vector3(0, 0, 0)); // 平行光 const cube = new THREE.Mesh(new THREE.BoxGeometry(0.001, 0.001, 0.001), new THREE.MeshLambertMaterial({ color: 0xdc161a })); cube.position.set(0, 0, 0); light = new THREE.DirectionalLight(0xffffff, 1); light.position.set(20, 20, 8); light.target = cube; scene.add(light); // 环境光 const ambientLight = new THREE.AmbientLight(0xffffff); scene.add(ambientLight); // 聚光灯 const spotLight = new THREE.SpotLight(0xffffff); spotLight.position.set(-20, 20, -2); scene.add(spotLight);

💡 Fog 场景雾化

本例中,打开页面时模型由远及近加载,颜色由白色变为彩色的功能就是通过 Fog 实现的。Fog 类定义的是线性雾,雾的密度是随着距离线性增大的,即场景中物体雾化效果随着随距离线性变化。

构造函数Fog(color, near, far)

  • color 属性: 表示雾的颜色,比如设置为红色,场景中远处物体为黑色,场景中最近处距离物体是自身颜色,最远和最近之间的物体颜色是物体本身颜色和雾颜色的混合效果。
  • near 属性:表示应用雾化效果的最小距离,距离活动摄像机长度小于 near 的物体将不会被雾所影响。
  • far 属性:表示应用雾化效果的最大距离,距离活动摄像机长度大于 far 的物体将不会被雾所影响。

创建地面

本例中使用了背景图,我需要一个既能呈现透明显示背景、又能产生阴影的材质生成地面,于是使用到 ShadowMaterial 材质。

var planeGeometry = new THREE.PlaneGeometry(100, 100); var planeMaterial = new THREE.ShadowMaterial({ opacity: .5 }); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = -0.5 * Math.PI; plane.position.set(0, -8, 0); plane.receiveShadow = true; scene.add(plane);

💡 ShadowMaterial 阴影材质

此材质可以接收阴影,但在其他方面完全透明。

构造函数ShadowMaterial(parameters: Object)

  • parameters:(可选)用于定义材质外观的对象,具有一个或多个属性。

特殊属性

  • .isShadowMaterial[Boolean]:用于检查此类或派生类是否为阴影材质。默认值为 true。因为其通常用在内部优化,所以不应该更改该属性值。
  • .transparent[Boolean]:定义此材质是否透明。默认值为 true

创建魔法阵

在老虎 🐅 底部地面创建一个炫酷的旋转自发光圆形魔法阵。

cycle = new THREE.Mesh(new THREE.PlaneGeometry(40, 40), new THREE.MeshPhongMaterial({   map: new THREE.TextureLoader().load(cycleTexture),   transparent: true })); cycle.rotation.x = -0.5 * Math.PI; cycle.position.set(0, -9, 0); cycle.receiveShadow = true; scene.add(cycle);

魔法阵的贴图:

💡 MeshPhongMaterial 网格材质

一种用于具有镜面高光的光泽表面的材质。该材质使用非物理的 Blinn-Phong 模型来计算反射率。

构造函数MeshPhongMaterial(parameters: Object)

  • parameters:(可选)用于定义材质外观的对象,具有一个或多个属性。

特殊属性

  • .emissive[Color]:材质的放射(光)颜色,基本上是不受其他光照影响的固有颜色。默认为黑色。
  • .emissiveMap[Texture]:设置放射(发光)贴图。默认值为 null。放射贴图颜色由放射颜色和强度所调节。 如果你有一个放射贴图,请务必将放射颜色设置为黑色以外的其他颜色。
  • .emissiveIntensity[Float]:放射光强度。调节发光颜色。默认为 1
  • .shininess[Float]specular 高亮的程度,越高的值越闪亮。默认值为 30
  • .specular[Color]:材质的高光颜色。默认值为 0x111111 的颜色 Color。这定义了材质的光泽度和光泽的颜色。
  • .specularMap[Texture]:镜面反射贴图值会影响镜面高光以及环境贴图对表面的影响程度。默认值为 null
MeshLambertMaterial 中使用的 Lambertian 模型不同,该材质可以模拟具有镜面高光的光泽表面(例如涂漆木材)。使用 Phong 着色模型计算着色时,会计算每个像素的阴影,与 MeshLambertMaterial 使用的 Gouraud 模型相比,该模型的结果更准确,但代价是牺牲一些性能。
MeshStandardMaterialMeshPhysicalMaterial 也使用这个着色模型。在 MeshStandardMaterialMeshPhysicalMaterial 上使用此材质时,性能通常会更高 ,但会牺牲一些图形精度。

文字模型

使用 FBXLoader 来加载恭喜发财,岁岁平安字样的 3D 文字模型。

const fbxLoader = new FBXLoader(); fbxLoader.load(textModel, mesh => {   mesh.traverse(child => {     if (child.isMesh) {       meshes.push(mesh);       child.castShadow = true;       child.receiveShadow = true;       // 调节材质的金属度、粗糙度、颜色等样式       child.material.metalness = .2;       child.material.roughness = .8;       child.material.color = new THREE.Color(0x111111);     }   });   mesh.position.set(4, 6, -8);   mesh.rotation.set(-80, 0, 0);   mesh.scale.set(.32, .32, .32);   group.add(mesh); });

📹 哔哩哔哩 3D 文字生成教程传送门:iBlender中文版插件 老外教你用汉字中文字体 Font 3D Chinese And Japanese Characters Blender 插件教程

老虎模型

老虎模型是 gltf 格式,在使用 GLTFLoader 加载模型的过程中,发现有 🕷 bugloader 无法读取到模型体积的 total 值,于是使用通用加载器 LoadingManager 来管理模型加载进度。

const manager = new THREE.LoadingManager(); manager.onStart = (url, loaded, total) => {}; manager.onLoad = () => {}; manager.onProgress = async(url, loaded, total) => {   if (Math.floor(loaded / total * 100) === 100) {     this.setState({ loadingProcess: Math.floor(loaded / total * 100) });   } else {     this.setState({ loadingProcess: Math.floor(loaded / total * 100) });   } }; const gltfLoader = new GLTFLoader(manager); gltfLoader.load(tigerModel, mesh => {   mesh.scene.traverse(child => {     if (child.isMesh) {       child.castShadow = true;       child.material.metalness = 0;       child.material.roughness = .8;       child.material.transparent = true;       child.material.side = THREE.DoubleSide;       child.material.color = new THREE.Color(0xffffff);     }   });   mesh.scene.rotation.y = Math.PI * 9 / 8;   mesh.scene.position.set(0, -4, 2);   mesh.scene.scale.set(.75, .75, .75);   // 💡 加载模型自身动画   let meshAnimation = mesh.animations[0];   mixer = new THREE.AnimationMixer(mesh.scene);   let animationClip = meshAnimation;   let clipAction = mixer.clipAction(animationClip).play();   animationClip = clipAction.getClip();   group.add(mesh.scene);   scene.add(group) });

💡 LoadingManager 加载器管理器

它的功能是处理并跟踪已加载和待处理的数据。如果未手动设置加强管理器,则会为加载器创建和使用默认全局实例加载器管理器。一般来说,默认的加载管理器已足够使用了,但有时候也需要设置单独的加载器,比如,你想为对象和纹理显示单独的加载条时。

构造方法LoadingManager(onLoad: Function, onProgress: Function, onError: Function)

  • onLoad:可选,所有加载器加载完成后,将调用此函数。
  • onProgress:可选,当每个项目完成后,将调用此函数。
  • onError:可选,当一个加载器遇到错误时,将调用此函数。

属性

  • .onStart[Function]:加载开始时被调用。参数: url 被加载的项的urlitemsLoaded 目前已加载项的个数;itemsTotal 总共所需要加载项的个数。此方法默认未定义。
  • .onLoad[Function]:所有的项加载完成后将调用此函数。默认情况下,此方法时未定义的,除非在构造函数中进行传递。
  • .onProgress[Function]:此方法加载每一个项,加载完成时进行调用。参数:url 被加载的项的 urlitemsLoaded 目前已加载项的个数;itemsTotal 总共所需要加载项的个数。默认情况下,此方法时未定义的,除非在构造函数中进行传递。
  • .onError[Function]:此方法将在任意项加载错误时调用。参数:url 所加载出错误的项的 url。默认情况下,此方法时未定义的,除非在构造函数中进行传递。

添加镜头移动补间动画

模型加载完成后,通过结合使用 TWEEN.js 实现相机 📷 移动实现漫游,也就是打开页面时看到的模型由远及近逐渐变大的动画效果。

const Animations = {   animateCamera: (camera, controls, newP, newT, time = 2000, callBack) => {     var tween = new TWEEN.Tween({       x1: camera.position.x,       y1: camera.position.y,       z1: camera.position.z,       x2: controls.target.x,       y2: controls.target.y,       z2: controls.target.z,     });     tween.to({       x1: newP.x,       y1: newP.y,       z1: newP.z,       x2: newT.x,       y2: newT.y,       z2: newT.z,     }, time);     tween.onUpdate(function (object) {       camera.position.x = object.x1;       camera.position.y = object.y1;       camera.position.z = object.z1;       controls.target.x = object.x2;       controls.target.y = object.y2;       controls.target.z = object.z2;       controls.update();     });     tween.onComplete(function () {       controls.enabled = true;       callBack();     });     tween.easing(TWEEN.Easing.Cubic.InOut);     tween.start();   }, } export default Animations;

调用示例:

Animations.animateCamera(camera, controls, { x: 0, y: 5, z: 21 }, { x: 0, y: 0, z: 0 }, 2400, () => {});

💡 TWEEN.js

是一个补间动画库,可以实现很多动画效果。它使一个对象在一定时间内从一个状态缓动变化到另外一个状态。TWEEN.js 本质就是一系列缓动函数算法,结合CanvasThree.js 很简单就能实现很多效果。

基本使用

var tween = new TWEEN.Tween({x: 1})     // position: {x: 1} .delay(100)                             // 等待100ms .to({x: 200}, 1000)                     // 1s时间,x到200 .onUpdate(render)                       // 变更期间执行render方法 .onComplete(() => {})                   // 动画完成 .onStop(() => {})                       // 动画停止 .start();                               // 开启动画

📌 要让动画真正动起来,需要在 requestAnimationFrame 中调用 update 方法。

TWEEN.update()

缓动类型

TWEEN.js 最强大的地方在于提供了很多常用的缓动动画类型,由 api easing() 指定。如示例中用到的:

tween.easing(TWEEN.Easing.Cubic.InOut);

链式调用

TWEEN.js 支持链式调用,如在 动画A 结束后要执行 动画B,可以这样 tweenA.chain(tweenB) 利用链式调用创建往复来回循环的动画:

var tweenA = new TWEEN.Tween(position).to({x: 200}, 1000); var tweenB = new TWEEN.Tween(position).to({x: 0}, 1000); tweenA.chain(tweenB); tweenB.chain(tweenA); tweenA.start();

控制器缓动移动

controls.enableDamping 设置为 true 可以开启鼠标移动场景时的缓动效果,产生运动惯性,开启后 3D 更具真实感。

controls = new OrbitControls(camera, renderer.domElement); controls.target.set(0, 0, 0); controls.enableDamping = true; controls.maxDistance = 160;

💡 THREE.OrbitControls 参数控制一览

//鼠标控制是否可用 controls.enabled = true; //聚焦坐标 controls.target = new THREE.Vector3(); //最大最小相机移动距离(PerspectiveCamera 景深相机) controls.minDistance = 0; controls.maxDistance = Infinity; //最大最小鼠标缩放大小(OrthographicCamera正交相机) controls.minZoom = 0; controls.maxZoom = Infinity; //最大仰视角和俯视角,范围是0到Math.PI controls.minPolarAngle = 0; controls.maxPolarAngle = Math.PI; //水平方向视角限制,范围[-Math.PI, Math.PI] controls.minAzimuthAngle = - Infinity; controls.maxAzimuthAngle = Infinity; //惯性滑动,滑动大小默认0.25,若开启,那么controls.update()需要加到动画循环函数中 controls.enableDamping = false; controls.dampingFactor = 0.25; //滚轮是否可控制zoom,zoom速度默认1 controls.enableZoom = true; controls.zoomSpeed = 1.0; //是否可旋转,旋转速度 controls.enableRotate = true; controls.rotateSpeed = 1.0; //是否可平移,默认移动速度为7px controls.enablePan = true; // 点击箭头键时移动的像素值 controls.keyPanSpeed = 7.0; //是否自动旋转,自动旋转速度。默认每秒30圈,如果是enabled,那么controls.update()需要加到动画循环函数中 controls.autoRotate = false; // 当fps为60时每转30s controls.autoRotateSpeed = 2.0; //是否能使用键盘 controls.enableKeys = true; //默认键盘控制上下左右的键 controls.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; //鼠标点击按钮 controls.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };

最后不要忘记添加窗口缩放适配方法和 requestAnimationFrame 更新方法。

function onWindowResize() {   camera.aspect = window.innerWidth / window.innerHeight;   camera.updateProjectionMatrix();   renderer.setSize(window.innerWidth, window.innerHeight); } function animate() {   requestAnimationFrame(animate);   renderer.render(scene, camera);   let time = clock.getDelta();   // 老虎动画   mixer && mixer.update(time);   // 补间动画   TWEEN && TWEEN.update();   // 控制器   controls && controls.update();   // 魔法阵   cycle && (cycle.rotation.z += .01); }

Loading 页3D文字样式

3D 文字样式主要通过叠加多层 text-shadow 实现的。

.loading {   font-size: 64px;   color: #FFFFFF;   text-shadow:     0 1px 0 hsl(174,5%,80%),                    0 2px 0 hsl(174,5%,75%),                    0 3px 0 hsl(174,5%,70%),                    0 4px 0 hsl(174,5%,66%),                    0 5px 0 hsl(174,5%,64%),                    0 6px 0 hsl(174,5%,62%),                    0 7px 0 hsl(174,5%,61%),                    0 8px 0 hsl(174,5%,60%),                    0 0 5px rgba(0,0,0,.05),                   0 1px 3px rgba(0,0,0,.2),                   0 3px 5px rgba(0,0,0,.2),                  0 5px 10px rgba(0,0,0,.2),                 0 10px 10px rgba(0,0,0,.2),                 0 20px 20px rgba(0,0,0,.3); }

效果

最终实现效果如下图所示,大家感兴趣可在线预览,已适配移动端。被这张加速的 小脑斧🐅 动图笑死。

总结

本文中主要涉及到的知识点包括:

  • Fog 场景雾化
  • ShadowMaterial 阴影材质
  • MeshPhongMaterial 网格材质
  • LoadingManager 加载器管理器
  • TWEEN.js 补间动画
  • THREE.OrbitControls 参数控制
  • CSS 3D 文字样式

附录

想了解场景初始化、光照、阴影及其他网格几何体的相关知识,可阅读我的其他文章。如果觉得文章对你有帮助,不要忘了 一键三连😂

本文作者:dragonir

3分钟了解如何跨应用、跨形态无缝登录

Posted: 09 Jan 2022 11:55 PM PST

一、 功能盘点

Q1:什么是钥匙环服务

A:钥匙环服务是HMS Core对国内外开发者开放的技术服务,提供用户认证凭据本地存储,和跨应用、跨形态共享能力,帮助用户在安卓应用、快应用、Web应用之间构建无缝登录体验。("用户认证凭据"以下简称"凭据")

跨应用登录示例

用户在已登录应用A的状态下,打开同一开发者旗下的应用B,无需输入帐号密码,实现直接登录应用B.

跨形态登录示例

以电商应用为例,用户在安卓应用登录之后,收到促销短信,用华为浏览器点开短信链接,Web应用直接处于登录状态,挑选心仪商品直接付款,完成下单。

Q2:钥匙环服务可以帮助我的用户在任意两款App之间共享用户认证凭据吗?

A:钥匙环服务能够帮助用户在同一公司旗下开发的App之间共享凭据

Q3:凭据在应用之间的授权关系是可以继承,还是只能点对点授权?

A:没有继承关系,只能点对点的授权,例如,A授权给B、C、D、E,B不能转授权给F、G。

Q4:如果我的用户需要退出帐号,可以在钥匙环服务中删除凭据吗?

A:可以,钥匙环服务向开发者提供删除和更新的API。

Q5:如果我的用户拥有多个帐号,这种情况钥匙环服务如何识别用哪个帐号登录?

A:钥匙环服务可以存储多个凭据,建议产品提供确认界面,让用户自主选择登录帐号。

二、 技术深入解读

Q1:钥匙环服务是如何将凭据从安卓应用共享到快应用的?

A:当用户登录到您的应用之后,凭据将被保存在钥匙环服务中,已登录的应用将这些凭据授权共享给其它受信任的快应用或web应用。

Q2:钥匙环服务是怎么实现支持这么多应用形态的?

A:对于不同的应用形态,钥匙环服务提供对应的接口:钥匙环服务为安卓应用提供Android API,为快应用提供快应用API,为Web应用提供Web API。

Q3:把我的用户凭据存储在钥匙环服务中,安全吗?

A:凭据在可信执行环境(TEE)中随机生成的密钥进行加密,每个设备的密钥均不相同,而且密钥只能在TEE内使用,无法离开设备,华为也不掌握密钥的内容,支持凭据在本地安全存储。

Q4:应用保存凭据之后,用户下次直接处于登录状态时,会有提示吗?

A: 钥匙环服务SDK提供无界面的凭据读取接口,安卓应用可以直接读取到凭据内容,您可以自行决定是否提示用户:以某应用的帐号登录。

Q5:钥匙环服务如何验证请求读取凭据的应用身份信息,怎么确定不是仿冒应用呢?

A:钥匙环服务能够通过验证安卓应用的APK包名、快应用的包名和证书HASH,或者获取当前网页的真实URL作为身份信息等方式,认证读写凭据的APK或网站的真实身份,防止凭据被仿冒的程序或网站盗用,从而加强共享凭据过程中的安全性。

三、隐私政策问答

Q1:钥匙环服务符合用户隐私政策吗?

A:符合,关于 HMS Core 与隐私的声明中已对钥匙环服务自身的隐私声明约束做出说明。

Q2:我的App是否需要告知用户帮助TA保管凭证?

A:使用钥匙环服务过程中,用户凭据始终保存在用户设备本地,不上传服务器,用户仍是实际数据控制者,华为不能主动对用户凭据做修改、删除等影响凭据安全的操作,其次HMS Core隐私声明已做过说明,故您的App不需要再告知用户。

Q3:非华为设备上使用钥匙环服务,我的App是否需要获取用户同意?

A:当用户在非华为设备上使用钥匙环服务时,会关联启动HMS Core应用,对此您需要向用户明示并获取其同意;用户在华为设备上使用钥匙环服务则无需单独获取同意。

扫码获取接入指南

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

iPhone SE 或 3 月发布:苹果最便宜 5G 手机;许多攻击者开始利用 Log4j 漏洞 | 思否周刊

Posted: 08 Jan 2022 08:05 PM PST

40s 新闻速递

  • 微软:许多攻击者开始对 Log4j 漏洞加以利用
  • SQLite 3.37.2 修复了潜在的数据库损坏问题
  • 全球 IT 供应商 2021 年收入排行出炉:微软坐上头把交椅
  • 谷歌终为 Android 手机加入"Fast Pair":向苹果那样自动切换
  • iPhone SE 最快 3 月份发布:苹果要打造旗下最便宜 5G 手机
  • Linus 是 2021 年源代码树中提交 commit 最多的人
  • FTC 警告将对未能修补 Log4j 漏洞的组织采取法律行动
  • 爆料人士称苹果在测试多款可折叠 iPhone 原型机,但对市场前景有忧虑
  • IntelliJ IDEA 2021.3.1 发布,改进远程开发
  • Rails 7.0.1 发布,支持 Ruby 3.1
  • Sentinel 1.8.3 发布
  • NumPy 1.22.0 发布
  • WebStorm 2021.3.1 可用,支持 Tailwind CSS v3.0 

行业资讯

微软:许多攻击者开始对 Log4j 漏洞加以利用

近日,微软表示,攻击者仍然正在积极利用 Log4j 漏洞,而且在 12 月的最后几周,利用的尝试仍然很多。微软提到,许多现有的攻击者在他们现有的恶意软件工具包和战术中增加了对这些漏洞的利用,扩大利用 Log4j 漏洞的可能性很大。为此,其更新了预防、检测和解决 Log4j 2 漏洞的指南,向客户给出了解决和预防方案,包括鼓励客户利用脚本和扫描工具来评估其风险和影响、建议客户对发现有漏洞的设备进行额外审查,以及微软表示,由于受影响的软件和服务很多,而且考虑到更新的速度,预计这将有一个很长的补救过程,一段时间内需要对该漏洞加以持续不断的警惕。

SQLite 3.37.2 修复了潜在的数据库损坏问题

SQLite 团队发布警告,SQLite 3.35.0 (2021-03-12) 到 3.37.1 (2021-12-30) 版本中存在可能导致数据库损坏的错误,建议用户升级到 3.37.2 (2022-01-06) 或更高版本。在排查该 Bug 存在的原因时,SQLite 团队回应称此前在数据库中对内存日志重复使用 SAVEPOINT 和 ROLLBACK TO 导致内存使用过多,而后采取了在 ROLLBACK TO 之后 "截断" 内存中的日志,以控制内存增长。10 个月后,清华大学 Wingtecher 实验室的研究人员首次发现了该漏洞,并在论坛上向 SQLite 团队反馈了该漏洞。

全球 IT 供应商 2021 年收入排行出炉:微软坐上头把交椅

在最新发布的 2021 年全球 IT 企业营收和营收增幅两项指标的排名中,微软和亚马逊分别坐上头把交椅,但只有华为业绩呈现下降趋势,并且跌幅巨大。根据市场分析公司 Synergy Research Group 公布的数据,微软 2021 年内面向公司和服务提供商的销售额达到 1200 亿美元,同比大涨 24%,但在 2021 年内的公司营收增幅排行榜上,美国另外一家 IT 巨头亚马逊则以 36% 的增幅一举摘得桂冠。IBM、富士通和爱立信三家公司"原地踏步",13 家之中的剩余企业均实现了个位数的增长。

谷歌终为 Android 手机加入"Fast Pair":向苹果那样自动切换

谷歌终于为安卓系统带来了不少用户期盼的功能,就是向苹果耳机自动切换和类似科技音频的功能了。谷歌计划在未来几个月内为 Android 手机上加入 "Fast Pair" 蓝牙技术,这可以带来的体验是,一副 AirPods 耳机,在登录同样 ID 的 iPhone,iPad 或 Mac 指尖可以自动切换无需配对。谷歌还将开始在 Android 上支持类似空间音频的概念,根据用户的头部运动调整声音。它现在已经支持一些音乐服务。

iPhone SE 最快 3 月份发布:苹果要打造旗下最便宜 5G 手机

据上游供应链最新消息称,苹果已经在准备新款 iPhone SE 的最后阶段,这款手机预计最早今年 3 月份发布,这可能是旗下最便宜 5G 手机。关于 "iPhone SE 3" 或者 5G 版 iPhone SE 的消息已经传了很久,其外形依然是 4.7 寸 + Touch ID 指纹,处理器升级到 A15,配 3GB RAM,再度成为小钢炮。此前有市调机构指出,苹果对 iPhone SE3 的定价设定在 400 美元以下,较上一代 SE2 进一步下调,且起步容量 64GB。鉴于第二代 iPhone SE 国行定价 3299 元起,iPhone SE3 的售价有望进一步下探至 3000 元附近。

Linus 是 2021 年源代码树中提交 commit 最多的人

近日,Linux 硬件评论网站 Phoronix 发布了一份 2021 年度 Git 开发统计数据报告。根据报告显示,截至 2021 年 12 月 31 日,在 Linux 内核源码树上运行 GitStats 时,该仓库已经有 1,060,172 个提交,来自大约 24.3 万个不同的作者。源代码树目前由 3,220 万行组成,涉及 74,300 个文件。随着新功能的不断开发和硬件支持的扩展,Linux 内核行数继续以相当稳定的速度增长,并进入主线。除此之外,2021 年 Linux 内核增加了 320 万行,删除了 130 万行,低于 2020 年增加 400 万行和删除 150 万行。同时,据统计,Linus Torvalds 是源代码树中最多产的提交者。

FTC 警告将对未能修补 Log4j 漏洞的组织采取法律行动

美国联邦贸易委员会(FTC)警告,未能保护客户数据免受 Log4Shell 漏洞影响的美国组织可能会面临法律后果。Log4Shell 是广泛使用的 Log4j Java 日志库零日漏洞名称。FTC 警告称,在 12 月首次被发现的严重漏洞正在被越来越多的攻击者利用,对数百万的消费者产品构成"严重风险"。公开信敦促各大组织解决该漏洞,以减少对消费者造成伤害的可能性并避免法律诉讼风险。该机构表示:"当这些漏洞被发现并被利用时,可能会导致个人信息的丢失或泄露,造成经济损失并带来其他不可逆的伤害。""包括《联邦贸易委员会法案》和《金融服务现代化法案》在内的法律要求采取合理的措施解决已知的软件漏洞问题。依赖 Log4j 的公司及其供应商现在就要采取行动,减少对消费者造成伤害的可能性并避免 FTC 采取法律行动,这一点至关重要。"

爆料人士称苹果在测试多款可折叠 iPhone 原型机,但对市场前景有忧虑

据报道,爆料人士日前透露苹果确实在研发可折叠 iPhone,正在测试的原型机不只一款,但苹果对可折叠 iPhone 还有担忧,在短期内不会推出。爆料人士表示,由于市场前景忧虑及技术方面的不足,苹果目前在改进竞争对手的产品中所存在的不足,同时也在关注市场的状况。苹果的目标,是确保可折叠 iPhone 较当前的 iPhone 不会有倒退。

最新技术动态

IntelliJ IDEA 2021.3.1 发布,改进远程开发

IntelliJ IDEA 发布了 2021.3.1 版本,为减轻和降低未知的不可信来源对打开项目的相关风险,在 IntelliJ IDEA 2020.3.3 版本中引入了可信项目概念。

在最新的 v2021.3.1 中,官方更改了 Trusted Project 对话框的行为和实现。该版本带来了一些重要修复,例如修复了对话框在 macOS Big Sur 错误窗口中的问题。

Rails 7.0.1 发布,支持 Ruby 3.1

Rails 7.0.1 已正式发布,值得关注的是,该版本支持了于去年圣诞节期间(2021 年 12 月 25 日)发布的 Ruby 3.1。

主要更新内容

  • 修复 Class#descendants and DescendantsTracker#descendants
  • 允许命名表达式索引是可逆的;
  • 更改 QueryMethods#in\_order\_of 以删除值中未列出的记录

Sentinel 1.8.3 发布

Sentinel 1.8.3 正式发布,带来了多项特性和改进。

主要更新内容

  • 集群流控 token server 支持 Envoy RLS v3 API,以支持较新版本 Envoy (#2336)、新增 JMX metric exporter 模块 (#2275)、Consul 动态数据源支持 ACL token (#2307)、完善系统规则 inbound QPS 策略判断的条件;
  • 采用 pass QPS 而不是 complete QPS (#2455)等

NumPy 1.22.0 发布

NumPy 1.22.0 是一个大型版本,其中包含 153 位贡献者的工作,分布在 609 个拉取请求中。

主要更新内容

  • 主命名空间的注解基本完成,上游是一个不断变化的目标,因此可能会有进一步的改进,但主要工作已经完成;
  • 提供了提议的 Array-API 的初步版本、NumPy 现在有一个 DLPack 后端;
  • 该版本的 Python 版本为 3.8-3.10,Python 3.7 已被删除

WebStorm 2021.3.1 可用,支持 Tailwind CSS v3.0 

WebStorm 2021.3.1 现已可用。

主要更新内容

  • 对 Tailwind CSS v3.0 的支持;
  • 对组件和不同颜色的标签设置功能的改进;
  • 能看到 HTML 中实时模板、标签和单词的图标;
  • Stylelint 的改进以及其他等

No comments:

Post a Comment