Sunday, April 18, 2021

V2EX - 技术

V2EX - 技术


小米 MIUI 12.5.1 系统正式版上手体验: UI 和功能变化系统梳理

Posted: 18 Apr 2021 04:23 AM PDT

本期视频我们将对 miui 12.5.1 正式版的 ui 和功能上的变化,做一个简单而系统的梳理 视频: https://www.bilibili.com/video/BV1rK4y1P7d7/ 文字稿: https://www.uso.cn/post/view/57892

求助一个前端加密后端解密的问题?

Posted: 18 Apr 2021 04:02 AM PDT

本人菜鸟一枚,今天做模拟登录遇到了一个前端加密后端解密的问题,自己根据谷歌搜索出来的代码片段倒腾了一个上午也没搞出来,所以这只能厚着脸皮来这里问大佬们了,下面这个 JavaScript 编码函数编码后的字符串,在后端如何用 php 解码出来提交的字符串。

如果问题太低端,望大佬们别怼我,真心求助,求大佬们不吝赐教!

function Ye() { 	return 256 * Math.random() | 0 } var rn = [3, 7]; function on(e, t) { 	void 0 === t && (t = Ye); 	var n = t() % 4, 		r = function(e) { 			if ("function" == typeof TextEncoder){ 				return (new TextEncoder).encode(e); 			} 			for (var t = unescape(encodeURI(e)), n = new Uint8Array(t.length), r = 0; r < t.length; ++r) 				n[r] = t.charCodeAt(r); 			return n 		}(JSON.stringify(e)); 	console.log("17",r); 	var i = 1 + rn.length + 1 + n + 7 + r.length; 		console.log("19",t.length,rn.length,n,r.length,i); 	var o = new ArrayBuffer(i); 		console.log("21",o) 	var a = new Uint8Array(o) 	  , u = 0 	  , s = t(); 	a[u++] = s; 	for (var c = 0, l = rn; c < l.length; c++) { 		var d = l[c]; 		a[u++] = s + d 	} 	a[u++] = s + n; 	for (var f = 0; f < n; ++f) 		a[u++] = t(); 	var v = new Uint8Array(7); 	for (f = 0; f < 7; ++f) 		v[f] = t(), 		a[u++] = v[f]; 	for (f = 0; f < r.length; ++f) 		a[u++] = r[f] ^ v[f % 7]; 	console.log("39",o); 	return o }  on('{"name":"abcde","password":"15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225"}') 

基于 Vite + React 构建 Chrome Extension (MV3) 开发环境

Posted: 18 Apr 2021 03:05 AM PDT

前言

此前一直想做一个 bilibili 的弹幕插件,最近借着研究 Vite 的契机实操了一下,花了两天时间算是搭好了基于 Vite + React 的 Chrome Extension (MV3) 开发环境,核心功能如下:

  • 📦️ JS 打包成单文件
  • 🎨 自动引入 CSS
  • 🔨 打包 service worker
  • 🚀 开发环境热更新

这里重点介绍一下当前热更新的实现,其他功能相对而言简单很多,详情可参考 theprimone/violet

一次偶然的机会在 B 站看了 《紫罗兰永恒花园》,给人印象深刻,刚好这次打算做个 bilibili 的弹幕插件,索性就取了女主名字中的 violet 😃

实操

热更新大致的流程如下图所示:

hot-reload-flow

启动

通过 npm run dev 同时执行三个命令:

  • tsc 编译 service worker 并监听变化
  • vite 编译 extension
  • websocket 服务监听打包后目录 /dist 的变化

其中,由于 vite build --watch 还未发布,暂时通过自定义脚本监听源码变化,待 vite 该功能发布后可移除。

热更新

浏览器页面加载 content scripts 后会创建一个 websocket 链接,服务端收到请求后会开启对 /dist 目录的监听,websocket 服务监听到 /dist 的变化后主动发起通知。

content scripts 收到需要更新 Extension 的通知,通过 chrome.runtime.sendMessage 触发 service worker 中通过 chrome.runtime.onMessage 注册的事件,依次触发 chrome.runtime.reloadchrome.tabs.reload 更新 Extension 和当前页面。实现了所写即所得,无需任何手动介入 🚀

可能会有读者有个疑问,为什么不直接在 service worker 中监听 websocket 的通知呢?

此前一直也是这么想的,在 Manifest V3 下使用 service worker 提倡 Thinking with events,通过 chrome.runtime.onInstalledchrome.runtime.onStartup 创建 websocket 客户端会被意外的关闭,即便是使用定时器轮询也会在执行多次之后被关闭再启动。因此,当前找到的最佳方案是在 service worker 中监听 chrome.runtime.onMessage 事件。

这样就实现了当页面加载目标插件时才会触发热更新的流程。

总结

由于现在的 Chrome Extension 大多是低于 MV3 版本的,两天下来,踩了不少坑,对于此前没有接触过的浏览器插件开发也有了一定程度的了解。现在只是针对 Chrome Extension 的场景,后续会在不断完善当前场景的情况下,完成对其他浏览器插件的支持。最终应该可以封装一个浏览器插件开发的工具。

如果手工对 AES-GCM 算法的明文(和密文)分段,用上一段的 Authentication tag 作为下一段的 Associated data,是否会带来额外安全风险?

Posted: 18 Apr 2021 02:17 AM PDT

需求是这样的,用.NET 和带认证(AEAD)的算法加密合理长度的文件(几 KB 到一二百 G 不等)。

问题是:

我不可能把整个文件都加载进内存,一次性传给AesGcm.Encrypt()方法。

但是.NET 库没有为 AES-GCM 提供流式操作方法。

(因为 AES-GCM 解密时,必须在所有块处理完毕后才能验证 Authentication tag 的有效性,而流式操作会在验证 Authentication tag 前返回解密后的明文。这时无法确定已经解密的部分是否曾遭到篡改,Github 讨论如下。)

https://github.com/dotnet/runtime/issues/23365

我的想法是:

1.把文件切分成 1M 的数据段处理。

2.对于每个文件,使用唯一的 key 。

3.使用每一段的序号作为加密这一段时使用的 nonce 。

4.对第 n 段加密操作产生的 Authentication tag,作为 n+1 段的 Associated data 。第 1 段的 Associated data 使用 128 位 0 。

5.记录第 1 段的 Authentication tag 以启动加密过程,记录最后一段的 Authentication tag 以验证密文是否遭到篡改。

6.保证在最后一段验证完成前,除了写入到临时文件中,不对已经解密的文件进行任何处理。

tag1, cipherText1 = AES-GCM(plainText1, key, nonce=1, associatedData=0)

tag2, cipherText2 = AES-GCM(plainText2, key, nonce=2, associatedData=tag1)

...

tagN, cipherTextN = AES-GCM(plainTextN-1, key, nonce=n, associatedData=tagN-1)

然后 tag1,tagN,cipherText 1-N 作为密文存储。

这样操作除了失去并行计算能力外,是否会带来额外的脆弱性,使最终的安全性比一次性使用 AES-GCM 算法加密所有数据差?(不考虑文件大于 64GB 时一次性使用 AES-GCM 加密的 counter 重复问题)

关于 zap 的使用方法问题

Posted: 18 Apr 2021 01:40 AM PDT

我想用 zap 来记录日志,我现在设计的是,每一种类型的日志分别用一个 logger 来记录,如下

type Logger struct { 	DebugLogger	*zap.Logger 	InfoLogger	*zap.Logger 	WarnLogger	*zap.Logger 	ErrorLogger	*zap.Logger 	PanicLogger	*zap.Logger 	DPanicLogger	*zap.Logger 	FatalLogger	*zap.Logger } 

这样我就可以用多个文件分别存放不同类型的日志了。但是我疑惑这样 performance 会不会变差。或者有没有什么方法能用一个 logger,然后根据不同的类型写入不同文件。

功能测试想往测试开发方向发展,应该学习哪些东西

Posted: 18 Apr 2021 01:26 AM PDT

如题:目前工作中主要还是功能测试,但是感觉到了瓶颈期了,想往更高的方向去走,但是很迷茫,之前都是小公司就几个测试,没有测试开发这种岗位,请教的人都没有,感觉特别迷茫,有没有这方面的大佬能给点建议参考下,小弟感激不尽

Clion 2020.2 怎么导入远程头文件。

Posted: 18 Apr 2021 12:52 AM PDT

windows clion 远程连接到 linux 服务器,有的头文件只有服务器上有,百度都是通过 tool->resync with remote hosts,但是我的 clion 没有这个选项,设置了快捷键也没反应。

还是 NAS 卡顿问题,这次来问丢包问题了,求大神分析

Posted: 18 Apr 2021 12:13 AM PDT

前帖 https://www.v2ex.com/t/764650

这里大致再说下:

主力机:AQC107 万兆网卡

服务器:R720xd, Esxi 7.0 U2, Intel X540 万兆 SR-IOV 给 WinServer 2019 作为 NAS 使用

局域网内主力机无论 iscsi 还是 smb 访问均卡顿,wireshark 抓包发现总是有规律的丢包

截图

抓包文件:

链接: https://pan.baidu.com/s/1OOVrJ6TMMY_9OGiW9EOGqQ 提取码: 7m4w

补充:

  1. 局域网内各个环节开启 9K 巨帧,貌似就没有重传问题了,看视频也不再卡顿,但前提是 NAS 必须禁用 Ipv6,因为 ipv6 每次联网都会将 MTU 重置为 1480,且此时也不能用手机访问 NAS 文件了,感觉损失过大
  2. 试了用笔记本( Ubuntu20.04 )无线访问 NAS,却不会卡顿

windows arm 镜像下载

Posted: 17 Apr 2021 11:49 PM PDT

求各位老大指导一下,有没有 windows 7 ARM 或者 windows 10 ARM 版本的镜像下载地址,求分享一下下载链接地址。谢谢!

使用 MBP m1 进行 C++开发可以吗?会有坑吗?

Posted: 17 Apr 2021 11:14 PM PDT

rt,面临实习,打算更新设备,看到网上很多测评,感觉 m1 太强了。目前用的是 iPhone 但是没有用过 mac 本,想问问大家,现阶段使用 mbp m1 进行 C++的开发能行吗?不知道 m2 啥时候出,用不用等 m2 再入手呢?

Javascript 数组及其方法详解

Posted: 17 Apr 2021 09:32 PM PDT

本文详细讲解 Javascript 数组对象及其各种方法

直接文章略长 直接贴个链接:https://www.liuxing.io/blog/javascript-array-methods-tutorial/

kotlin lazy 形式的 grouping and mapping 应该怎么写, sequence 里 grouping + aggregate 怎么比 Java stream 还复杂得多

Posted: 17 Apr 2021 04:04 PM PDT

是不是我姿势不对,有没有更好的写法?

val kotlin = "ABCDEF".asSequence()     .groupingBy {         println("grouping")         it.toInt() / 10     }     .aggregate { _, accumulator: MutableList<String>?, element, first ->         println("aggregate")         if (first) {             val tmp = MutableList(0) { "" }             tmp.add(element.toString() + "X")             tmp         } else {             accumulator!!.add(element.toString() + "X")             accumulator         }     } println(kotlin)   val java = "ABCDEF".toList().stream()     .collect(         Collectors.groupingBy(             { println("java grouping"); it.toInt() / 10 },             Collectors.mapping({ println("java mapping"); it.toString() + "X" }, Collectors.toList())         )     ) println(java)   

怎么获取 dev insider 版本 windows 呢

Posted: 17 Apr 2021 10:18 AM PDT

在官网注册了,在设置-更新-预览版计划里无限出现错误提示,那串代码也看不懂只说是更新功能 bug,想要最新的 icon,求赐教

写了一个类似 fastapi 的可以用于几种 web 框架的参数检验库

Posted: 17 Apr 2021 09:09 AM PDT

因为一开始用 fastapi 觉得很不错,但又觉得不是很完美,自己更喜欢 starlette,所以才写了这个库—pait。这个库核心逻辑很简单,但写了快一年,库名还被我写错了,去年 8.9 月的时候主体逻辑就写完了,然后就经历了一段 996 停了下来。经过最近不断的修修补补,勉强能用了。

pait依赖于Pydantic(但支持延迟注解)和inspect,主要功能是参数检验和文档生成。 参数检验用法跟 fastapi 差不多,文档输出功能还在逐渐完善中,理论上可以支持很多 web 框架,不过我现在基本只用 flaskstarlette

import uvicorn from pydantic import BaseModel, conint, constr from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route  from pait.app.starlette import pait from pait.field import Body   # 创建一个基于 Pydantic.BaseModel 的 Model class PydanticModel(BaseModel):     uid: conint(gt=10, lt=1000)  # 自动校验类型是否为 int,且是否大于 10 小于 1000     user_name: constr(min_length=2, max_length=4)  # 自动校验类型是否为 str, 且长度是否大于等于 2,小于等于 4   # 使用 pait 装饰器装饰函数 @pait() async def demo_post(     # pait 通过 Body()知道当前需要从请求中获取 body 的值,并赋值到 model 中,      # 而这个 model 的结构正是上面的 PydanticModel,他会根据我们定义的字段自动获取值并进行转换和判断     model: PydanticModel = Body.i() ):     # 获取对应的值进行返回     return JSONResponse({'result': model.dict()})   app = Starlette(     routes=[         Route('/api', demo_post, methods=['POST']),     ] )  uvicorn.run(app) 

请教, 搞一台备用机, 3000 以内的预算, Android 的.有什么推荐吗?

Posted: 17 Apr 2021 03:43 AM PDT

小米和华为买过, 使用的时候感觉触屏很灵敏, 误触几率高, 打字的感觉不是很舒服. 很强的脱离感?? 比如我使用 ios 的时候, 我会被骗到误认为我按到了这个按钮. 但是使用华为 Nove8 和小米忘了哪款的时候, 我触摸屏幕的时候就没有那种被骗的感觉... 描述的挺粗糙, 表达能力不够..

现在看一加 9R, 据说一加都挺好的, 想试试. 有没有前辈能不能在备用机的选择上给点意见?

主要用来:

  1. 替代车载导航.
  2. 做 Appium 的应用开发.
  3. 会用来刷视频和阅读把.
  4. 试着安装一些奇奇怪怪的应用.

选择使用的是 ios 系统的设备.

大家有没有搞过有状态应用上 K8S

Posted: 16 Apr 2021 11:55 AM PDT

MySQL RabbitMQ Redis 等这种有状态中间件怎上 K8S ?是通过在上层使用开源的或者自己改的 operator,还是在底层二次开发这些中间件?存储用 local pv 还是 ceph 之类的?

No comments:

Post a Comment