首页 文章 精选 留言 我的

精选列表

搜索[AI原生],共10000篇文章
优秀的个人博客,低调大师

申通快递:核心业务系统云原生化上云技术详解

随着云计算的快速发展和成熟,越来越多的企业正在把自己的核心系统向云上迁移,从而享受云计算带来的技术红利。IDC发布的《全球云计算IT基础设施市场预测报告》显示:2019年全球云上的IT基础设施占比超过传统数据中心,成为市场主导者。在技术层面,云计算在成本、稳定、安全和效率层面已经远超传统IT。对于企业而言,上云后综合成本下降一半,稳定性有10倍以上提升,安全性更是提升50倍。这些信号都在标志着以云计算为基础的数字化时代全面到来。 申通快递创建于1993年,是国内较早经营快递业务的民营快递品牌。与很多同行一样,早期的信息系统建设也采用外包承接的方式运作。2016年年底,申通快递正式登陆深交所。作为快递行业巨头之一,申通上市的目的,除了要把业务规模做大外,很重要的一点是要在技术上下功夫,打造公司核心的竞争力,构建行业的高生态壁垒,抵抗“

优秀的个人博客,低调大师

使用Chrome开发者工具研究JavaScript里函数的原生实现

As the size of my blog Chrome Development Tool tips used in my daily work turns to be larger I create a separate post to record down this small tip.Are you curious about the “native code” here? At least I am. Today I find that the Profiles tab in Chrome development tool can help us to unveil the mysteries to some degree.In Chrome development, just select this checkbox: And then execute the simple JavaScript code below: var arr = []; for (var i=0; i<1000; i++){ arr.push(i) } console.profile("Array toString"); for( var i = 0; i < 1000; i++){ var a = arr.toString(); } console.profileEnd("Array toString"); Once done, you can see a profile record with the name specified in JavaScript code above, “Array toString”. Hover the mouse to the first row, “anonymous function”, we find the hint “array.js”. Switch display style from Chart to Tree: From here the callstack of native implementation of toString is displayed: The next step is to look into in array.js.Launch url: https://cs.chromium.org/Click this hyperlink: now you can find the array.js file via path: src/v8/src/js/array.js The callstack analyzed through the source code exactly matches the one we get in Chrome development tool Profile tab:ArrayToString will delegate to Join if current caller is an Array: Join will call DoJoin: DoJoin will first call UseSparseVariant to evaluate the possibility to perform Join via SparseVariant. If not possible, call ConvertToString as fall back. ( The line number of source code may vary with the one you see in Chrome Development Tool profile tab due to the different version of Chrome being used. ) If you could not tolerate the poor performance of this online source code repository, you could download the whole source code of V8 to your local laptop by cloning this github repository:https://chromium.googlesource.com/v8/v8.git/ 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

优秀的个人博客,低调大师

KubeCon 改为线上举办 | 云原生生态周报 Vol. 48

作者 | 徐迪、张晓宇、何淋波、宋净超 业界要闻 KubeCon+CloudNativeCon North America 2020 CFP 开始 点击上方链接即可提交演讲,截止日期 6 月 12 日。 KubeCon Euro 2020 改为线上举办 KubeCon Euro 2020已确定改为线上进行,日期为 8 月 17 号到 20 号。 KubeCon 2020 Shanghai 或开展线上活动 由于疫情影响,原来被取消的 KubeCon 2020 Shanghai 可能以线上方式举行。CNCF 连同其活跃的社区,正在计划在七月底举办为期三天的线上大会。附:大会举办时间的调查问卷。 CNCF 公布 Fluentd Journey Report 始于 2011 年 6 月份,2019 年从 CNCF 毕业,目前已经吸引超过 7.4k 个开发

优秀的个人博客,低调大师

GitHub 宣布正式收购 npm | 云原生生态周报 Vol. 42

作者 | 丁海洋、张晓宇、汪萌海 业界要闻 1.GitHub 宣布正式收购 npm npm 自十年前发布以来,经过发展目前已经是最流行的 javascript 包管理工具。 收购以后,Github 承诺会对 npm 的安全性、注册表基础架构提供增强;在商业上,Github 承诺 npm 将永远保持免费,已经购买了 npm Pro、Teams、Enterprise 的客户仍然会得到继续支持,npm 付费客户的私有 npm 软件包会在今年晚些时候免费转移到 GitHub Packages 上。 2. IT 活动取消和推迟 受疫情影响,一系列 IT 活动已经取消和推迟,下面是一些信息: Google 取消了线下的 Google I/O 大会; RedHat 宣布 4 月 28~29 日举办线上虚拟活动,代替2020 年峰会; KubeCon + Cl

优秀的个人博客,低调大师

每日一博 | 原生 js+WebGL 实现 3D 图片效果

海外党玩F***book的时候可能有接触过这个酷炫的3d图片效果: 只要通过客户端的这个入口—— 或者网页版的这个入口—— 就能生成。不知道咋玩的请参考官方的帮助手册。今天就教大家手撸出一个这样的功能,不要担心,所有代码加起来不超过200行并且不使用任何第三方库。虽然canvas2D也能做出这个效果,但是基于这种像素级操作的性能考虑,WebGL显然是更好的方案,我前面的有些教程也用到了WebGL,核心的API我就不做过多介绍,直接详细地注释在最终的代码里面了,代码仍然使用WebGL 1.0版本。 老规矩,还是先介绍原理,推荐有想法的读者略过教程,自己直接根据原理去撸出来,因为我还是秉持着话痨的特色,想到什么说什么,教程中掺杂一些自己的干货,对一些人来说可能过于啰嗦。夹,哈吉咩马修!(工地日语 非死不可客户端在上传图片的时候你有两种可选操作: 一种是上传带深度通道的图片,即图片的每个像素是RGB-D格式,如果你是苹果手机可能在相机里会有人像模式或景深模式,拍出来的照片在本地是heic格式的文件,一般这种就是带深度信息的(有兴趣的可以去维基了解下这种heif编码的图片,可以做到很多神奇的事)。通常有TOF镜头的手机都能拍出这种图片,但是不知道为啥F***book似乎只支持三星系列和自己发布的安卓机? 另一种办法就是上传两张图,一张普通的RGB像素的原图,一张灰度图,只要灰度图的文件名和原图一样,加上_depth的后缀即可。比如666.jpg和666_depth.jpg。这也是F***book网页版唯一支持的方式。这个灰度图的门道可就多了,也是我们后面代码实现的核心。开发过游戏的一定知道深度贴图,或者阴影贴图/光照贴图,其实都是类似的玩意,这种贴图存储了原图每个像素的深度信息,贴图的每个像素的R值就是原图的z轴偏移,因为一般深度贴图的R、G、B通道的值相同,所以表现出来的就是一张灰度图。 如何获取深度贴图呢?如果你有heic格式的带深度信息的照片,可以用PS抽取出z通道的信息(windows上的PS不支持),如果你啥都没有,我会在下个教程尝试“教”你一下如何在PS中绘制出深度贴图,或者使用谷歌提供的一个人工智能程序来生成,我也会写入下个教程,亲测匹配程度还是挺高的~ 具体是怎么产生3D效果的呢?深度贴图中,颜色越浅(值越小)表示深度约低,通过深度贴图的深度值来对原图的采样位置进行偏移,比如当你把贴图往左偏移,然后使用偏移的距离乘上原图的某个坐标在贴图上的深度值得到的结果来对原图进行采样,就会得到不同的点在不同的深度偏移的大小不同的情况,距离越近的偏移越小,距离越远的偏移越大,是不是很符合我们生活中的常识?事实上,抛弃主观感知,从底层角度考虑,最终展现出来的效果其实就是一部分的像素点被压缩了,一部分的像素点被拉伸了。不知道大家有没有用过live2D或者Spine、龙骨等工具做出来的动画,就是这种: 刚刚所说的底层变化是不是和这种网格动画很像,其实都是对图片的变形来达到3D效果,就单张图的变化而言,他们的唯一区别就是蒙皮动画是手动key帧(或者是骨骼绑定——这个以后有机会谈谈),而3D图片是通过深度贴图自动生成。 废话终于说完,下面开始编码,先设置一下基础样式: * { margin: 0; padding: 0; } body { width: 100vw; height: 100vh; position: relative; background-color: #000; } canvas { position: absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0); } 然后引入glMatrix函数库用于操作矩阵(虽然,之前说好的不依赖第三方库,不过坐标换算确实挺烦~免得程序太长还有写一堆注释~其实换算也不难,看过上一篇教程的应该自己实现问题也不大~~原谅我标题党 ಠᴗಠ) <script src="./gl-matrix-min.js"></script> 我已经下载好了,想要消息了解这个函数库的可以去glMatrix官网,这个库非常小,未压缩前也就100多K。 顶点着色器(shader_vertex.vert)的代码: attribute vec2 a_pos; attribute vec2 a_uv; uniform mat4 u_proj; varying vec2 v_uv; void main() { v_uv = a_uv; // 将纹理坐标传递到片元着色器 gl_Position = u_proj * vec4(a_pos, 0.0, 1.0); } 片元着色器的代码: precision highp float; uniform sampler2D u_sampler; varying vec2 v_uv; void main() { gl_FragColor = texture2D(u_sampler, v_uv); } 直接贴上绘制静态图的代码: init() async function init () { const { mat4 } = glMatrix const PAGE_WIDTH = document.body.clientWidth const PAGE_HEIGHT = document.body.clientHeight // 设置画布宽高 const CANVAS_WIDTH = 900 const CANVAS_HEIGHT = 900 const canvas = document.createElement('canvas') canvas.width = CANVAS_WIDTH canvas.height = CANVAS_HEIGHT document.body.appendChild(canvas) const gl = canvas.getContext('webgl') gl.viewport(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT) // 加载图片(原图和深度图尺寸一致) const image = new Image() image.src = './sennpai.jpg' await new Promise(resolve => image.complete ? resolve() : (image.onload = e => resolve())) // 若图片宽高超出限制,以类似 background-size:contain 的方式将图片缩放居中 let ratio = 1 if (image.height > CANVAS_HEIGHT) { ratio = CANVAS_HEIGHT / image.height } if (image.width * ratio > CANVAS_WIDTH) { ratio = CANVAS_WIDTH / image.width } const imgWidth = image.width * ratio const imgHeight = image.height * ratio // 获取顶点着色器源码 let res = await fetch('./shader_vertex.vert', { method: 'get', }) let shaderSrc = await res.text() // 创建顶点着色器 const vs = gl.createShader(gl.VERTEX_SHADER) gl.shaderSource(vs, shaderSrc) gl.compileShader(vs) // 获取着色器信息 if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS)) { // 打印编译失败日志 console.error(`Error compile shader:\n${shaderSrc}\n=====error log======\n${gl.getShaderInfoLog(vs)}`) gl.deleteShader(vs) return null } // 获取片元着色器源码 res = await fetch('./shader_fragment.frag', { method: 'get', }) shaderSrc = await res.text() // 创建片元着色器 const fs = gl.createShader(gl.FRAGMENT_SHADER) gl.shaderSource(fs, shaderSrc) gl.compileShader(fs) if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS)) { console.error(`Error compile shader:\n${shaderSrc}\n=====error log======\n${gl.getShaderInfoLog(fs)}`) gl.deleteShader(fs) return null } // 创建program const prg = gl.createProgram() gl.attachShader(prg, vs) gl.attachShader(prg, fs) gl.linkProgram(prg) gl.useProgram(prg) // 设置投影矩阵 const projMat4 = mat4.create() /** * ortho(out, left, right, bottom, top, near, far) */ mat4.ortho(projMat4, -CANVAS_WIDTH / 2, CANVAS_WIDTH / 2, -CANVAS_HEIGHT / 2, CANVAS_HEIGHT / 2, 0, 500) // 获取投影矩阵的地址 const uProj = gl.getUniformLocation(prg, 'u_proj') // 将投影矩阵传入 gl.uniformMatrix4fv(uProj, false, projMat4) // 使用顶点数组创建vbo const vertexList = new Float32Array([ // x y u v -imgWidth / 2, imgHeight / 2, 0, 0, -imgWidth / 2, -imgHeight / 2, 0, 1, imgWidth / 2, imgHeight / 2, 1, 0, imgWidth / 2, -imgHeight / 2, 1, 1, ]) // 获取数组每个元素的大小(用于计算步长) const PER_ELEMENT_SIZE = vertexList.BYTES_PER_ELEMENT const buffer = gl.createBuffer() /** * 绑定缓冲区 * @param target 数据类型 * @param buffer 缓冲区对象 */ gl.bindBuffer(gl.ARRAY_BUFFER, buffer) /** * 向缓冲区写入数据 * @param target 数据类型 * @param data 数据(这里是类型化数组) * @param usage 绘制方式(用于帮助webgl优化) */ gl.bufferData(gl.ARRAY_BUFFER, vertexList, gl.STATIC_DRAW) // 获取顶点坐标变量在着色器中的地址 const aPos = gl.getAttribLocation(prg, 'a_pos') /** * 将缓冲区对象分配给attribute变量 * @param location:变量的存储地址 * @param size:每个顶点分量个数,若个数比变量的数量少,则按照gl.vertexAttrib[1234]f的规则来补全 * @param type:指定数据类型 * @param normalized:是否需要归一化 * @param stride:相邻两个顶点之间的字节数(只有一种数据则为0) * @param offset:数据的偏移量(单位字节,只有一种数据则为0) */ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, PER_ELEMENT_SIZE * 4, 0) // 允许aPos访问VBO gl.enableVertexAttribArray(aPos) // 获取纹理坐标变量在着色器中的地址 const aUV = gl.getAttribLocation(prg, 'a_uv') gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, PER_ELEMENT_SIZE * 4, PER_ELEMENT_SIZE * 2) // 允许aUV访问VBO gl.enableVertexAttribArray(aUV) // 使用完后解绑VBO gl.bindBuffer(gl.ARRAY_BUFFER, null) // 创建纹理对象 const texture = gl.createTexture() // 激活0号纹理单元 gl.activeTexture(gl.TEXTURE0) // 绑定并开启0号纹理单元 gl.bindTexture(gl.TEXTURE_2D, texture) // 指定缩小算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) // 指定放大算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // 指定水平方向填充算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) // 指定垂直方向填充算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) /** * 通过0号纹理单元将图片分配给纹理对象 * target 指定为2D纹理 * level 金字塔纹理 * internalFormat 图片内部格式 * format 纹理格式(必须与internalFormat相同) * type 纹理数据类型 * image 图片 */ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image) // 获取纹理对象在着色器中的地址(使用uniform,因为每个顶点操作的都是同一个纹理) const uSampler = gl.getUniformLocation(prg, 'u_sampler') // 指定从0号纹理单元获取纹理 gl.uniform1i(uSampler, 0) // 渲染循环 function loop () { gl.clearColor(0.0, 0.0, 0.0, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) // 清空颜色缓冲区 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) requestAnimationFrame(loop) } loop() } 都是一些常规的操作,具体api的作用写入注释里就不做多解释了。 接下来把我们的深度贴图传入着色器,主要是这几个步骤: ①获取加载完成的图片对象: const depthImage = new Image() depthImage.src = './sennpai_depth.jpg' await new Promise(resolve => depthImage.complete ? resolve() : (depthImage.onload = e => resolve())) 因为如果浏览器如果已经缓存了图片不一定会触发onload事件。所以我们先通过complete属性来判断图片的加载状态是否为已完成。 ②修改片元着色器代码,通过深度贴图对原图来进行采样: precision highp float; uniform sampler2D u_sampler; uniform sampler2D u_sampler_depth;// 深度贴图采样器 uniform vec2 u_offset;// 深度贴图的偏移 varying vec2 v_uv; void main() { float depth = texture2D(u_sampler_depth, v_uv).r;// 获取深度信息 gl_FragColor = texture2D(u_sampler, v_uv + depth * u_offset); } 获取贴图的R通道的值作为深度值 ③通过另一个纹理单元(如1号纹理单元)将贴图传入片元着色器: // 同理,创建深度贴图的纹理 const depthTexture = gl.createTexture() // 绑定并开启1号纹理单元 gl.activeTexture(gl.TEXTURE1) gl.bindTexture(gl.TEXTURE_2D, depthTexture) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, depthImage) const uSamplerDepth = gl.getUniformLocation(prg, 'u_sampler_depth') // 指定从1号纹理单元获取纹理 gl.uniform1i(uSamplerDepth, 1) 这时候看到最后效果没有任何变化,因为我们还没有对贴图进行偏移,u_offset默认值是vec(0.0,0.0)。 接下来可以给页面绑定mousemove事件,我这里限定了u,v最大的偏移量为0.05,把渲染循环函数放到事件回调中: const uOffset = gl.getUniformLocation(prg, 'u_offset') const scale = 0.1 document.body.onmousemove = e => { gl.uniform2f(uOffset, scale * (e.pageX / PAGE_WIDTH - 0.5), scale * (e.pageY / PAGE_HEIGHT - 0.5)) loop() } // 绘制循环 function loop () { gl.clearColor(0.0, 0.0, 0.0, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) // 清空颜色缓冲区 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) // requestAnimationFrame(loop) } ok,大功告成,预览一下效果图—— 完整代码戳这里 在线演示

优秀的个人博客,低调大师

Falco 进入 CNCF Incubator 项目 | 云原生生态周报 Vol. 35

作者 |王思宇、陈洁、敖小剑 业界要闻 Falco 进入 CNCFIncubator 项目 原于2018 年 8 月进入 sandbox,旨在 Kubernetes 运行时环境下支持配置规则来加强应用安全性、降低风险。 Kubernetes v1.17.1 发布 解决部分 cloud provider 和 kubelet 相关问题,比如: kubelet 更新 Pod ready status 失败 kubelet 清理 Pod volumes 发生 panic CFP 2020 K8s Contributor Summit Amsterdam 开始征集 talk 将与 KubeCon 2020 EU 同期进行,欢迎 K8s contributor 参会。 Istio 1.14.3 发布 Istio 发布 1.4.3 版本,此版本修复看一些 bu

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册