了解一下计算机领域常见的编码方式
笔者作为一个非科班出身的前端工程师,对编码这一块的概念一直比较模糊,最近在做需求查资料的过程中了解到相关知识,于是决定把它记录下来;
⚠️注:以下内容为AI生成
1.什么是编码?简单解释: 编码(Encoding)是将信息从一种形式或格式转换成另一种形式的过程。通常,编码的目的是为了更有效地传输、存储、处理或理解数据。在计算机和通信领域,编码广泛应用于数据的表示、存储、加密、压缩等方面。
2.常见的编码方式常见的编码方式有很多,按用途和应用的不同,它们可以分为不同的类别。以下是几种常见的编码方式,每种编码方式有其特定的应用场景和优缺点:
1. 字符编码字符编码是将字符映射到数字(字节)的过程,常见的字符编码有:
1.1 ASCII (American Standard Code for Information Interchange)
用途:主要用于英文字符的编码。
描述:ASCII 是一种 7 位编码方式,能表示 128 个字符(包括 26 个字母、数字 0-9、常见标点符号以及一些控制字符)。
范围:0-127,包含英文字符和一些特殊符号。
优点:简单且占用空间小。
缺点:只能 ...
使用frp实现内网穿透,让外网可以访问内网服务
1.简介——什么是 frp?frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。它是由中国开发者开发的开源项目,旨在为用户提供一个简单易用的内网穿透解决方案。
通常情况下,位于内网中的服务器或设备由于路由器或防火墙的限制(或是没有公网 ip),无法直接被外部网络访问。FRP 通过设置在外网的一个中间服务器(一般称为 FRPS,即 FRP Server),可以将来自公网的请求转发到内网中的目标机器(一般称为 FRPC,即 FRP Client)上运行的服务,从而实现从外网访问内网服务的效果。
2.原理:下面的架构图展示了 frp 的运行原理,用户通过 frps 来访问暴露到公网的不同的内网服务。
简单地说,frp 就是将一个网络中(通常是内网)的端口代理到了另一个网络(通常是公网)中,打通了两个网络,实现了两个网络间的通信。
而这一通信建立在一台能同时访问两个网络服务的主机上,这台主机上的 frps 服务就是通信的桥梁。
3.使用 FR ...
26-调用Geoserver的WFS服务点查要素属性
背景:在GIS开发过程中,经常会遇到前端加载了geoserver的wms服务后,需要查询某个要素的属性进行弹窗显示的需求,这个时候就需要调用wfs服务查询到鼠标位置的要素属性进行操作;
关键代码:123456789101112131415161718192021222324252627282930313233343536const Your_WorkSpace = 'TEST';const Your_LayerName = 'Block';const geometryFieldKey = 'the_geom';axios.get(`http://192.168.0.81:8080/geoserver/${Your_WorkSpace}/wfs`, { params: { SERVICE: 'WFS', // 服务类型 VERSION: '1.1.0', // WFS版本 REQUEST: ' ...
25-Threejs平行光源阴影渲染过程记录与要点总结(多图预警)
概述:阅读完本文,你将学会如何使用 Threejs 平行光源创建阴影以及如何避免阴影渲染过程中的一些坑;
基本原理:Threejs 阴影的渲染有三个关键的条件:
Render 对象开启阴影渲染能力;
光源或阴影原物体开启阴影投射;
显示阴影的物体开启阴影接收;
渲染过程关键代码:根据上面的原理,以下代码片段演示在实际 threejs 开发中如何进行配置
123456789101112131415161718192021222324252627282930313233//1.创建rendererconst renderer: THREE.WebGLRenderer = new THREE.WebGLRenderer({ antialias: true,})renderer.shadowMap.enabled = true //开启阴影renderer.shadowMap.type = THREE.VSMShadowMap //设置阴影类型//2.创建平行光源和光源辅助工具const light = new THREE.DirectionalLight(0xfff ...
实现博客更新推送后自动刷新EdgeOne节点缓存
前情:在上一篇建站记录系列文章中,我们为博客源服务器配置了CDN加速,但是实际使用中发现,我们推送代码,自动构建生成的新包发到服务器后,我们使用域名访问站点,内容缺没有更新,这是为什么呢?实际上是因为站点资源更新后,CDN没有及时回源进行缓存刷新。
我使用的CDN产品是在腾讯云搞活动买服务器时顺便买的EdgeOne,好像是50块钱一年,据说是新一代的CDN,多了DDos攻击防御和CC攻击功能,但是我用的是活动版就享受不到这些功能了,估计等这个到期了还是要换回更便宜的常规CDN,这个正常价续费太贵了,我等一般人实在用不起啊。😂,下面就以EdgeOne为例,记录下我的优化过程。
两种实现思路:
在服务器端监听文件变化,如果有文件推送,则调用腾讯云API刷新CDN缓存;
通过GithubAction实现:在代码推送到远程仓库后,触发Action工作流,调用腾讯云API实现CDN缓存刷新;
相关知识补充:1.什么是腾讯云API?在本文的需求中,腾讯云API是实现CDN缓存刷新的关键工具,它是腾讯云提供的实现其一系列产品操作的网络接口,通过调用这些接口,开发者可以实现自己想要的功能,比如我们 ...
记录一次前端按省份统计点位数量的算法优化
情况:在做WebGIS项目的过程中,遇到一个需求是按省份统计省份内点位的数量,最开始我用双循环暴力统计,当点位达到三千左右时,统计耗时达到了2500ms左右,于是有了效率优化的需求。
优化前代码:123456provinces.forEach(province=>{ province.count = 0 points.forEach(point=>{ if(turf.booleanPointInPolygonO(point,province)) province.count++ })})
优化思路:1.循环逻辑优化:每个点位在判断属于一个省份后,它就不会再属于第二个省份,就可以将该点移除数组,从而减少剩下省份统计时遍历的点位数量;
2.多边形简化:每个省份的多边形其实也是由很多个点组成,多边形越复杂,判断一个点是否在多边形内时消耗的时间也越多,因此可以简化多边形来提高空间计算的效率;
优化后代码:123456789101112131415161718provinces.forEach(provinc ...
Cesium矩阵变换实践——实现3dtiles模型平移、旋转、缩放
矩阵变换基础知识补充:
矩阵变换是图形学中的知识,在Cesium开发中理解它的概念和实践也同样重要。学会了矩阵变换可以轻松完成对模型的平移、旋转、缩放操作;感兴趣的同学可移步games101B站视频课补充相关知识;
1.平移、旋转、缩放都可以在线性代数中用一个变换矩阵表示;
2.对一个图形进行变换,只需要将图形的每一个坐标点左乘一个变换矩阵,即可计算出这个图形变换后的每一个新坐标点;
3.矩阵的乘法运算不符合交换律,左乘和右乘结果不一样;
实现思路:模型平移:假设在三维空间中有一个模型,可以建立一个三维空间坐标系来描述模型的位置,对模型实现平移操作只需要对模型的x,y,z坐标进行加减即可;但是在Cesium中,默认三维坐标系是以球心为原点的ENU坐标,使用此坐标直接进行模型平移运算较为困难,我们还需要建立一个以模型中心为原点的局部ENU坐标,以简化对模型的坐标计算。
模型旋转、缩放:对模型旋转和缩放原理与平移差不多,但需要注意应用一个旋转、缩放矩阵时,需要将旋转、缩放参考点先平移到坐标原点;
关键源码封装:
!未考虑执行效率,有精力可继续优化;
123456789101112131 ...
Cesium实现wms瓦片贴3dtiles
需求最近在项目开发中遇到一个需求,需要将Cesium加载的地块瓦片服务贴到3dtiles倾斜摄影模型上。
思路结合网上查询的相关资料,初步确定了四种实现思路:
修改imageryProvider使其支持贴地 (技术难度大)
通过WFS服务空间查询获取3dtiles范围的矢量要素渲染 (性能开销太大,严重卡顿)
通过3dtiles范围裁剪WMS服务,设置rectangle纹理为裁剪的图片实现贴地 ( 最终方案 )
直接给3dtiles模型叠加一层图片材质; ( 较为复杂 )
其中1和4的思路没有去实际验证,有能力且有兴趣的朋友可以尝试一下。我验证了2和3的方案,其中第2方案加载后导致操作严重卡顿,性能太差放弃了,最终选用了第3个方案。
关键代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556//通过config文件获取wms服务的url和图层名const blockServiceUrl = gis_config.wms_serv ...
Cesium实现将3dtile模型定位到任意经纬度
背景:3dtiles文件在Cesium场景中加载时,是自带中心的坐标的,在做某个功能时需要将其定位到指定的经纬度。
思路:Cesium中每个3dtile对象都有modelMatrix属性,通过向该属性赋值,改变其变换矩阵,可以实现对模型的平移、旋转、缩放。
代码:1234567891011121314151617181920212223242526272829303132//移动3dtiles模型中心点到某个经纬度async updateTilesetLocation(tileset, [lng, lat]) { // 获取tileset的中心点坐标 let startPosition = tileset.boundingSphere.center; // 获取tileset中心点高度 const height = Cesium.Cartographic.fromCartesian(startPosition).height // 平移终点坐标 const endPosition = Cesium.Cartesian3.fromDegrees(lng, lat, ...
前端代码优化之配置文件抽取思路
问题:在前端开发某个项目过程中,遇到了好几次需要换环境部署的场景,每次都需要在代码中改后端url以后重新打包,这样非常麻烦。
如果可以把这部分配置抽取出来,每次需要换环境部署时只要改一下配置文件,就可以不用重新打包,省下大量无意义的重复劳动,实现一包多用。
解决方案:将配置抽取到一个json文件中,放到public目录下,通过请求的方式获取。
来自GPT的赞美:
使用cdn加速优化腾讯云COS图床的安全性问题
问题:之前在搭建腾讯云COS图床的过程中,查阅资料时留意到了有小伙伴说有被盗刷的风险,于是上网查阅了一下相关资料,还真是!(这个图里的兄弟太惨了😂)
参考链接:https://cloud.tencent.com/developer/article/2239296?areaSource=100001.4&traceId=kQzP3W3NM0uma1MVnz5AP
于是升级图床的安全性防护就很有必要,查了N多方案后,了解到可以通过CDN加速的方式提高图床的安全性,有效防止盗刷流量。
思路:
COS桶设置私有读写,禁止空refer访问;
设置私有读写后,直接使用COS桶的默认url就无法访问桶内的资源了,怎么办呢?这时候CDN就出场了
使用子域名配置一个CDN,指向COS桶的URL,腾讯云会提示授权给cdn访问COS桶,点击确认授权
上一步授权后,CDN就可以访问私有读写的存储桶了
等CDN部署完成,就可以使用CDN加速的域名访问我们存储桶内的资源,大功告成!🥳
具体操作:
需要前置知识:CDN,域名
知道原理以后操作就很简单,我这里就暂时先不复现了,后面有时候可能会更 ...
记录一次在Cesium场景中模型贴地效果的优化
问题:今天在开发业务过程中接到一个需求,是优化Cesium场景中模型的贴地效果,之前模型贴地的实现方式是在模型加载时,设置HeightReference为CLAMP_TO_GROUND来实现的,但是在实际使用场景中,这种方式并不能满足需求,以这种方式批量加载的模型,会在视角移过去之后才慢慢一个一个贴到地形上面,如果电脑性能很慢,或者浏览器没有启用GPU渲染,就会非常卡。
优化思路:问了下万能的GPT,它是这样说的:
然后查了下官方文档,发现有例子,直接复制粘贴需要的部分:
最后改造原有的loadModel函数
12345678910111213141516171819202122232425262728293031323334353637383940async loadModel({ position: [lng, lat], modelUrl, bearing = 0 }) { console.log('模型加载') //获取精确贴地形高度 const terrainProvider = viewer.sc ...