Thursday, November 25, 2021

V2EX - 技术

V2EX - 技术


初学 golang,小白求解惑!

Posted: 25 Nov 2021 12:02 PM PST

package main  import "fmt"  type Test struct { 	Id   int64 	Name string }  func main() { 	var list = []Test{ 		Test{Id: 1, Name: "1XX"}, 		Test{Id: 2, Name: "2XX"}, 		Test{Id: 3, Name: "3XX"}, 	} 	for _, v := range list { 		v.Name = "888" 	}         fmt.Println(list) } 

为啥修改 Name 貌似没生效

是 windows server 2022 和 windows ltsc 2021 哪个香?

Posted: 25 Nov 2021 10:41 AM PST

论 Java 工程师学习 go

Posted: 25 Nov 2021 09:49 AM PST

A.Java 方向还没摸熟,又去搞 go ,风险太大; B.Go 是大势所趋,学习又很好的前景; C.先把 JAVA 方向整明白,机会合适再看 GO

上面是我提出的几种想法,大家还有什么好的意见可以补充!!! 欢迎大家留言说出自己的看法

桌面端技术选型求指导

Posted: 25 Nov 2021 08:10 AM PST

先说背景,公司要做的,小工具辅助客户的级别,商业软件,非大型项目。

  1. 核心逻辑部分已经有十分完备的 java 实现(可以从公司主项目抄过来)
  2. 希望尽量轻量化。
  3. 目前在考虑桌面端的框架。 JavaFx: 不考虑,社区不好,支持少 Swing: 最容易和逻辑部分结合,比较担心 UI 方面能否实现较好的效果,或者 effort 是不是比较大 Electron: UI 不担心,但是逻辑处理的部分需要用 js 重构一次,后续的迭代大概率还要继续参考主项目的代码 进行重构。除非独立部署一个 java web 服务器让逻辑部分单独出来。 Native 类的 C++/C#:主项目就是用这些写的,开发负担比较重,估计不考虑。除非有很好的解决方案。

广泛吸纳意见,希望看看我上面的想法有哪些是过虑的,或者各位有什么建议都可以说说。 如有表达不到位的地方还请指出

React 滚动条组件: mac-scrollbar

Posted: 25 Nov 2021 08:06 AM PST

什么是 mac-scrollbar

mac-scrollbar 是一款具有 macOS 样式的 React 滚动条组件

为什么需要 mac-scrollbar

不同浏览器之间的滚动条存在的问题:

  • 样式不一致,影响 UI 的一致性
  • 宽度不一致,并压缩内容区域的展示
  • 禁用与启用之间存在宽度闪烁

现在,我们需要一个漂亮而又简约来自 macOS 样式的滚动条。特性:

  • 使用原生浏览器滚动
  • 悬浮的滚动条不占用宽度,不影响设计布局
  • 不占用额外的 DOM 层级,仅一层 div
  • 自动适应宽高的变化
  • 2KB 压缩尺寸
  • 99% 与 macOS 的滚动条保持一致,并加以改进
  • 支持 Chrome 、Firefox >= 64 、Microsoft Edge >= 79

注意:此组件不兼容 IE11,需要兼容低版本浏览器勿用。

常规滚动条的现状

目前浏览器种类繁多,除了主流浏览器 Chrome 、Safari 、Edge 、Firefox 之外,其他浏览器基本上是通过 Chrome 内核衍生出来的产品。因此目前社区实现自定义滚动条的方式一共有 3 种类型:

  1. 仅使用 CSS ::-webkit-scrollbar 伪类修改滚动条样式。缺点:但能修改的样式有限,FireFox 没办法自定义样式
  2. 配合 CSS 伪类再通过自定义 div 节点来展示 scrollbar 。缺点:不兼容 IE
  3. 完全的自定义滚动行为,可控程度高。缺点:代码量大、性能差

mac-scrollbar 则属于第二种。通过 CSS 伪类隐藏浏览器默认滚动条,再加以 div 实现滚动条的样式。除了唯一的缺点是不兼容低版本浏览器,如 IE 。但优势也非常明显,体积轻量、接近浏览器原生滚动条的性能,也没有第三种那么复杂的 API 和 BUG 。

特性预览

滚动时自动出现。拖动时,滚动条自动变大,使拖动变得容易,就算鼠标离开容器,也能触发滚动

scrollbar_1.gif

打开一个网页后,滚动条显示一段时间,然后自动隐藏,表明这里的内容可以滚动

scrollbar_2.gif

能够响应容器的大小变化,如屏幕大小发生了变化,或者容器内展示的数据发生变化(如请求后获取数据等),滚动条能够自动响应这种变化,进而调整自身的显示长度和可移动距离。

scrollbar_3.gif

可通过 CSS 变量动态修改滚动条样式,也可以通过覆盖 CSS 类来自定义

scrollbar_5.png

并且内置了与 macOS 一致的黑色主题,可通过设置参数 theme 开启

scrollbar_4.gif

可以在 macOS 上使用原生滚动条,以呈现最优效果,可以将 suppressMacOS 设置为 true

使用

yarn add mac-scrollbar 

引入样式

import 'mac-scrollbar/dist/style.css'; 

局部滚动条

import { MacScrollbar } from 'mac-scrollbar';  function Foo() {   return (     <MacScrollbar>       <div>Content</div>     </MacScrollbar>   ); } 

全局滚动条( window 上滚动)

import { GlobalScrollbar } from 'mac-scrollbar';  function App() {   return <GlobalScrollbar />; } 

API

MacScrollbar

Name Type Description
theme 'white' I 'dark' 适应容器的滚动条主题,默认 'white'
suppressMacOS false 设置为 true 时,macOS 的浏览器将使用原生滚动条
suppressScrollX false 设置为 true 时,无论内容宽度如何,X 轴上的滚动条都将不可用
suppressScrollY false 设置为 true 时,无论内容高度如何,Y 轴的滚动条都将不可用

GlobalScrollbar

Name Type Description
theme 'white' I 'dark' 适应容器的滚动条主题,默认 'white'
suppressMacOS false 设置为 true 时,macOS 的浏览器将使用原生滚动条

喜欢的话就点个 Star ^_^ Github: https://github.com/MinJieLiu/mac-scrollbar

从程序员到经营温泉度假酒店(三)- 我和我的前女友们

Posted: 25 Nov 2021 08:00 AM PST

时光荏苒,转眼已到 2021 年,再过一个多月,又要开启新的春秋。

在时光的雕刻下,人被凿去狂妄,磨出温润。谁都终将被扔回时间的海底,与其他鱼虾贝壳一同聆听无边的寂静,而在这之前,能指望的,大约只有心灵的成长,祈祷生的优雅可以抚慰它的渺小。——刘瑜《观念的水位》 ​​​

这事,还得从高中谈起。

2008 年我参加中考,取得了全县第 8 的成绩,顺利进入县一中。第一次分班考试,全年级第 155 名,父亲听到这数字的瞬间,直接挂了我电话。站在走廊上,我有点恍惚。曾经在学校叱咤风云,初中 3 年未尝一败的我,难道成绩排名就此定格在百名开外了吗?我曾经 3 年都是全年级第一啊,整整 3 年...

分班后,我进入了全校唯一文科的实验班,舍友们都很优秀。下铺中考全县第二,隔壁床位第 5 ,最差的是第 15 。我至今都记得考了第二的小家伙跟我们分享的故事:他爸在中考成绩出来之后,逢人就聊中考,说自己儿子考了全县第二。有一次坐出租车,又是手到擒来的套路,张口就道:"大哥,今年中考成绩出来了啊,我家那娃好像考的还不赖呢",师傅问:"恭喜恭喜啊,考了多少名啊?",表演开始,他爸清了清嗓子:"哎,也就考了全县第二。" 此时出租车司机哈哈大笑道:"还行,还行,我闺女也就考了全县第一。"互相报了家门后,从此他爸便对这事闭口不谈,再也没有对别人提过。

文科班,学习氛围真好啊,全班一共 4 个男生,其他全是软妹子。但是这不适合我。偶然在查看一次成绩排名表的时候,发现了一个神人,9 门课考了 6 门满分,而这个人居然是在一个普通班。费了好大功夫,我成功转到了该普通班,并和此人成为了同桌。这个人,来我们县一中读书,不仅所有费用全免,而且每学期学校还会奖励 5 千块钱生活费。拿到学校奖学金后他和我一同跑到了电脑城,买了一台神舟笔记本,自此开启了我们的"美剧生涯"。

我们年级一共 3 千人,我的成绩在调到普通班之后一路急转直下,最高冲到了一千 1 百多名。和父亲的沟通越来越少,每次的电话不再超过一分钟,家长会,也见不到我爸的身影了,每次都是让我妈来。

渐渐地,我开始讨厌这种生活,我开始逃课,开始失眠,开始一个人泡图书馆,开始大半夜跑去厕所痛哭流涕。甚至,开始去医院开安神补脑液。

我睡不着,我是真的睡不着。失眠,将入推入了深渊。

直到高考前 100 天,有个人闯进了我的生活。该人以补课为名,每天放学后都来找我,聊天,散步,傻笑。当我跟她提起,我一直被失眠困扰时,她说了这样一段话:"我从未有过你的这种烦恼,我每次都是被分在最后一排,带上我的 10 块钱买的耳机,上课就听歌、睡觉。你要知道,人生是为了追求幸福的过程,你为了让自己幸福,强迫自己学习,强迫考出好的成绩,但是你有没有想过,你这是本末倒置了,人生本可以不需要这么痛苦便获得幸福。"

就是这么一番话,点醒了我,让我解放了。虽然高考失利,勉强上了个一本,原本准备复读,但是老爸已经很满意了,便从了老人家的心意,上大学咯。

我在南京,她在徐州,即使异地,我也风雨无阻。二十出头的我,激情似火。一夜七次,在各种清晨抱着她醒来,我们在地铁上谈笑,激吻;我们在学校的操场上牵手,相拥;那个时候,我认为她是我的全部,会是陪我走向幸福之门的人。

毕业后,她去了北京实习,我在南京开公司创业。由于我当时一心忙于事业,主动联系她的次数越来越少。我们聊天说的话的越来越少,时间也越来越短。直到有一次,她在逛超市,跟我 qq 语音,她跟我说:"我们分手吧,我想要的你给不了我。"第二天奔赴北京,我想知道她想要的究竟是什么。

站在国贸那边售价 2200 一套的房子里,我根本不知道我在做什么,在想什么,我只知道那时,我的兜里揣着 2200 块钱现金。

那晚,我们去了五道口附件的一家酒店。我疯狂的吻她,抱他,抚摸她...

激情过后,我们俩呆呆的看着天花板,随后她起身表示要离开,要回去。无法挽留。

站在路边等出租车,我问她:"你就不能给我一点时间吗?我们一起努力!"

"那你跟我说,你让我等你多久。5 年,10 年,还是 20 年",她毅然决然的挣开我的手,离我而去。

也许就是在那一刻,我意识到,她想要的,我真的给不了。

分手后两年时间,我都是家里蹲。我不想做任何事情,除了在半夜里流着眼泪惊醒,就是多睡一会,在梦里,我还是那个牵着她的手的男孩,在梦里,我带她去我们曾经想去的地方。

感谢我生命里,第一个真正意义上的女朋友,她是一个阳光,笑容特别治愈的女孩。是她教会了我如何爱一个人,也教会了我如何放下一个人。

微信图片_20211125094417.jpg

求助前端生成的网页, 打印的时候当前页空间不足图片会被挤到下一页

Posted: 25 Nov 2021 07:51 AM PST

我想做到打印的时候空间不足就分割图片
https://codesandbox.io/s/wandering-forest-9sszg 这是最小化代码
https://imgtu.com/i/oAhI10 这是图片被挤下来的错误

求轻量级服务包装方案

Posted: 25 Nov 2021 07:36 AM PST

请问 linux 上有没有一种轻量级的,单独远程提供一个 systemd 服务控制或者 dbus 接口的方案呢? 一般这种事情可以用万能的 ssh 来做,但 ssh 太核武器了,一旦密钥丢了就很麻烦了

问这个问题初衷是想在路由器上控制主机的一些行为,比如一旦外部 ip 地址变化,及时重启主机上的一个 systemd 服务,但有不想用 ssh 访问主机 root 账户

请大家各抒己见哈

Java 新人准备出去找工作了,自学完 springboot, springcloud

Posted: 25 Nov 2021 05:57 AM PST

求大佬们,给我点简历模板,和项目题目,万分感谢

觉得 django ORM 和 sqlalchemy 都不太好用

Posted: 25 Nov 2021 05:44 AM PST

django

  • 不支持 join group by 关键字 要用 filter 和 values 隐式做到
  • 要用 annotate 才能 取别名,否则还要 extra 写字符串
  • 某些函数不支持,比如 date_format
  • extra 比较灵活,但又不支持 join 😯

sqlalchemy

  • 在 flask 中 使用,会有上下文问题
  • to_dict 还要自己写 ,create 方法没有,必须写 add,commit
  • 写完 sqlalchemy 语句,跟写 sql 感觉没啥区别,

弹性计算,免费方案?

Posted: 25 Nov 2021 05:39 AM PST

有点小的个人计算需求,之前一直用云弹性计算,因为个人用而且很少,人家不屑跟我收费。但有个问题,返回的结果都是以文件的形式(因为阿里云在响应头里添加了参数,无法覆盖)我想直接返回数据结果,有什么办法吗?或者华为云腾讯云啥的好像也搞了这个,有人用过吗?

如何给每个单独的 repo 配置不同的 GitHub 账号?

Posted: 25 Nov 2021 05:35 AM PST

以前在本机上配置了一个 GitHub 账号,当时是跟着一些教程配的,应该是全局的(--global),现在因为一些原因,给某一个项目单独开了一个 GitHub 账号,但是在 pull 的时候一直显示** remote: Permission to user/repo denied to "之前的用户" **.根据一些教程在当前这个项目下配置了git config user.emailgit config user.name,但是还是有这样的错误。 想问一下应该怎么配置才能达到"全局 github 默认使用之前的账户,在特定项目可以单独配置一个 GitHub 账户"的效果呢?

怎么得到 NVIDIA GPU UUID 和 NVIDIA GPU Minor Number 的对应关系呢?

Posted: 25 Nov 2021 04:08 AM PST

我发现 GPU 节点上 /dev/nvidiaX 后面的 X 表示的是 NVIDIA GPU 的 Minor Number ,但是我现在想在程序里得到 NVIDIA GPU 的 UUID 和 X 对应关系(在非 GPU 节点上远程去获取信息),该怎么做呢?除了远程执行 nvidia-smi --query | grep "GPU UUID\|Minor Number" 这种获取全部信息后再过滤还有别的好办法吗?我看nvidia-smi --query-gpu=xx,yy,zz 这种好像不支持查询 Minor Number...

观帖“登录最佳实践”有感, jwt token 如何优雅的刷新?

Posted: 25 Nov 2021 03:52 AM PST

原帖点我,一般的业务系统里 jwt token 都是如何刷新的?有没有最佳实践。

亮出一些观点

  • jwt token 没有撤销机制,一旦泄露或者被窃取有安全隐患,所以 token 有效期也不建议设置的太长
  • 每次请求均生成新的 token 返回给前端有比较大的开销,太粗暴了
  • 利用 redis 验证,但是这样的话 jwt token 的 verify 功能就没有充分利用到,为什么还要用 jwt token?
  • 借鉴 oauth2 的设计使用 refresh_token ,对于小的业务系统应该是更加复杂了

在 SpringBoot + redis + jwt token 的技术实践中,我的一点想法:

  1. 充分利用 jwt token 和 redis ,在拦截器中校验用户请求是否有效使用 jwt token 的 verify 和 redis hasKey 联合校验
  2. 设置一个 jwt token 已过期的缓冲区,比如设计 token 有效期 1 小时,但是在超时的 20 分钟内用户可以拿现有 token 换一个新的 token ,实现 token 的刷新。如果用户在此期间一直有操作系统,那么就不用重新登录。如果用户有 80 分钟没有使用系统就需要重新登录

为的是服务器开销和业务需求之间寻求平衡。


网上搜到一些讨论(如下),欢迎大家畅所欲言

VS Code Java 更新特别版 – 全新 Gradle for Java 插件,更方便的代码操作, 1.0 语言支持发布

Posted: 25 Nov 2021 03:46 AM PST

大家好,欢迎来到 Visual Studio Code Java 更新贴别版。值得一提的是:VS Code 有超过 100 万用户使用 Java 啦!在这篇文章中,我们将分享我们最新的 Gradle 插件,更加方便的代码操作(Getter/Setter 等等),以及最近的 1.0 Language Server 发布。

Language Server for Java™ 1.0 正式发布

最近,Language Server for Java™ 的 1.0 版本在 Visual Studio Code 上正式发布了!这是一个 Visual Studio Code 上 Java 支持上重要的里程碑,也是微软和红帽多年合作的结果。请访问这篇博客专题查看发布亮点以及未来计划。

Gradle for Java 插件发布

更好的 Gradle 支持一直是社区中最热门的话题之一。为了更好地满足开发人员对 Gradle 的需求,我们很高兴地宣布,我们发布了最新的"Gradle for Java"插件(之前称为"Gradle Tasks"插件)。此插件最初由@badsyntax 启动,现在由 Microsoft 维护。请注意,此插件目前还不是 Java插件包的一部分,您可能需要单独下载它。

让我们来看看这个插件具体的亮点:

本地 Gradle 安装支持

在之前的版本中,项目文件夹中的 Gradle Wrapper 是插件的一个要求,有用户提过需求(Issue #1004)来支持没有 Gradle Wrapper 的 Gradle 项目,这个功能被添加到最近的版本中。开发人员现在可以使用以下设置来控制激活行为。

  • java.import.gradle.wrapper.enabled
  • java.import.gradle.version
  • java.import.gradle.home

关于这些的设置的更多细节,您可以访问 https://github.com/microsoft/vscode-gradle#vs-code-settings-1

依赖管理和项目视图

另一个令人兴奋的新功能是项目依赖视图,开发人员现在可以从插件中轻松查看项目中的依赖项。

要查看项目的依赖项,只需单击"Dependencies"项,即可展开查看项目中所有的依赖项。这些依赖项按 Gradle 配置分组,您可以展开每个配置以详细查看具体的依赖。对于被省略的依赖项(用(*) 标记),您可以单击右侧的 Inline 按钮以显示先前列出的依赖项。

Gradle 编写体验( Groovy )

Gradle 中基于 Groovy 的文件编写体验也得到了极大的改善!以下是一些新功能:

自动补全

Gradle 语言服务器支持 Gradle 文件的自动补全,当您尝试在 Gradle 脚本中键入 Gradle 属性或者 Closure 时,插件会自动为您建议可用的 Gradle 语句。

当您在"Dependencies"中输入依赖时,插件将自动在 Maven Central Repo 搜索依赖并为您建议结果。

语法高亮

打开 Groovy Gradle 文件时,Gradle 语言服务器将启动并为您提供语法高亮功能。我们会以 Visual Studio Code 的默认样式为您提供 Groovy 的语法高亮。在语言服务器启动之后后,它会分析已经打开的 Gradle 文件并提供语义等信息,提供更精准的高亮结果。

文件概览

Gradle 语言服务器将为当前 Gradle 文件提供文档的概览视图。这种类型的视图将帮助您轻松导航到 Gradle 文件的任何部分

错误提示

Gradle 语言服务器将使用 Groovy 编译引擎来分析 Gradle 构建文件并报告语法错误(如果存在的话)。它还将从 Gradle Build 获取脚本类路径,以便它可以报告编译错误。我们支持 Gradle默认导入。

这次发布的插件中还有很多新功能。请访问 GitHub文档以查看完整的功能介绍!您可以点击此链接获取此 Gradle 插件。

更方便的代码操作

我们经常从用户这边收到反馈,指出我们当前的代码操作有时很难找到。例如在之前的版本中,开发人员需要右键单击,选择"Source Action",然后才能在菜单中找到所有 Java 代码操作。

现在,开发人员可以简单地使用灯泡图标(快速修复)提示来方便地生成常见的 Java 函数。这是我们支持的函数列表

  • 生成 Getter 和 Setter
  • 生成 hashCode()和 equals()
  • 生成 toString()

这是一个快速演示:

反馈与建议

请积极使用我们的产品!您的反馈和建议对我们非常重要,并将帮助我们做得更好。 有几种方法可以给我们留下反馈

资源

以下链接和资源能帮助您更好地了解 Java on Visual Studio Code 的相关信息

请问在座彦祖,开发可乐 8 打雪仗这种游戏 需要哪些技术栈。。。我想试试

Posted: 25 Nov 2021 03:33 AM PST

咨询大佬个密码验证的问题

Posted: 25 Nov 2021 03:17 AM PST

Ansible 的 user 模块中,对如何生成用户密码给了集中方法,其中一种是这样实现的

/etc/ansible ⌚ 13:36:09 $ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))" Password: $6$ugLvJs2HQIVNoXW0$F8sbBsLT/dcU/HVFVlHqNNSpxZwwpt2R4tP7cE/JvYKjQnPX137YzNaPGo6t/EwX3Ick17Gm7E7N2qD.N.A3h/  /etc/ansible ⌚ 13:36:13 $ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))" Password: $6$EZ5ZGsr7dlFrHzS0$5vNcNAtkUw41P8NCuHpp.Um5DHoNoH8mSbmTjc0fTgH95Gq4zDFpcsnLvd4T26Zx0gSLRdBxlzkNdMHC.kLub.  /etc/ansible ⌚ 13:36:17 $ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))" Password: $6$zem4hGz27MgX4k8X$Mn6n08MCPtvCzbJTmjYVnBX/JpU7dEUKK.o0F60UA5rsbBLLLXZZb2bWRrBazpCHY.ugEPw0bgiwwvsvgfyTK/  /etc/ansible ⌚ 13:38:25 $ 

我每次输入的密码都是 1234 ,但是生成的值是不同的,那如何验证这些不同的值是同一个密码呢

关于 LineageOS 里各种设备的 device configuration 的疑问

Posted: 25 Nov 2021 03:08 AM PST

疑问:开发者适配某个 ROM 的时候,device configuration 都是自己从头写起吗?假设没有其他开发者公开类似的配置的情况下,一般怎么生成这些配置文件呢?还是说有什么模版之类的。


背景:前几天抱着试试看的态度,研究了下构建 AOSP ,因为我正好有一个索尼的 Android 手机,型号是 Xperia XZ2 Compact ,然后我按照官方的教程 https://developer.sony.com/develop/open-devices/guides/aosp-build-instructions/build-aosp-android-android-11-0-0 成功构建了一个 AOSP 11 的 ROM 。

然后又看到 LineageOS 也官方对这个设备有支持,但想想自己编译一个和直接用官方编译好的没啥太大区别,就想着是不是能够移植到另一个 ROM ,经过一番修改还真成功了,基于 LineageOS 的 device configuration https://github.com/LineageOS/android_device_sony_xz2c 稍加修改,编译出了一个 PixelExperience 的 ROM ,使用上也没啥问题,于是就有了开头的疑问,LineageOS 的开发者最初是怎么弄出那个配置的。(我简单对比了下似乎和 Sony 官方那个 https://github.com/sonyxperiadev/device-sony-apollo 还很不一样。)

关于 Windows10 账户同步与用户文件夹名字的问题求解

Posted: 25 Nov 2021 02:40 AM PST

之前某一次装 win10 搞出的问题,当时好像是先创建的脱机账户,但是用户名字打错了,我也没注意,进入系统就登录了微软账号,结果好像就给同步上去了,结果后来每次重装 win10 只要装的过程中登录了微软账号进入系统后用户文件夹的名字就是那个错的,只能先创建脱机账户进系统再登微软账号,想请教一下有没有办法能把微软账号里同步的这个错误用户名字给改一下?

不同的协议运营商优先级差别有多少?

Posted: 25 Nov 2021 02:29 AM PST

国内有些运营商会降低 UDP 的优先级,这个众所周知。但对于 TCP 协议,不同的端口,不同的状态(例如 SYN 、FIN ),或不同的应用层数据(例如 HTTP 、HTTPS 或其他协议)是否也有不同的优先级?

有没有什么工具,可将常用的协议都遍历一次,然后找出当前网络到目标服务器之间延迟最低(或稳定性最好)的协议?

macos 有没有办法连接富士施乐 S2110 打印机

Posted: 25 Nov 2021 01:36 AM PST

公司的打印机是富士施乐 s2110,经过测试 mac 无法连接(windows 可以),有没有什么办法可以让 mac 也能用这个打印机呢,我经常需要打印一些文件

关于 lua 中对 nginx 变量处理后 proxy_pass 出现问题的疑问

Posted: 24 Nov 2021 11:44 PM PST

xdm 好,我是个前端,运维方面的菜鸡,请教大家一下

我用 openresty 搭建了个简陋版本的灰度切换方案,但是 lua 脚本运行之后好像出了点问题

-------------------------test.conf start-----------------------------
upstream production_server {
server 123.123.123.123:80;
}
upstream grayscale_server {
server 456.456.456.456:80;
}

server {
listen 80;
server_name localhost;
lua_code_cache off;
set $default_stream "production_server";
set $grayscale_stream "grayscale_server";
# 运行脚本读取策略
access_by_lua_file /usr/local/openresty/lua/main.lua;

location / {
default_type text/html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_redirect off;
proxy_pass $scheme://$default_stream;
proxy_next_upstream http_500 http_503 error;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/openresty/nginx/html;
}
}
-------------------------test.conf end-----------------------------

-------------------------main.lua start-----------------------------
local redisutils = require("redisutils")
local controller = require("controller")
local red = redisutils.redisClient()
local params = ngx.req.get_uri_args()
local userId = params.userId

if red then
local is_grayscale = controller.checkUserId(red, userId)
if is_grayscale then
ngx.var.default_stream = ngx.var.grayscale_stream
end
redisutils.closeRedis(red)
end
-------------------------main.lua end-----------------------------

我把$default_stream 直接替换为"production_server" 或 "grayscale_server" 都没有问题
但是 lua 运行后,大概是这一句 ngx.var.default_stream = ngx.var.grayscale_stream
index.html 中的 js 和 css 等使用相对路径("/js/xxx.js")的资源都似乎回源到了代理机器本身,从而最终找不到资源

如果哪位大佬有办法解决,希望不吝赐教一下,或者说有更好的方法也可以。

感谢!!!

Java on Visual Studio Code 的更新 – 2021 年 10 月

Posted: 24 Nov 2021 10:53 PM PST

大家好,欢迎来到 10 月版的 Visual Studio Code Java 更新!在这篇文章中,我们将深入解析最近代码补全的性能优化。

性能提升 - 更快的代码补全

随着 Java Language Server 最近 1.0版本的发布,我们对代码补全的性能进行了重大的改进。下图比较了最近几个版本之间的代码补全响应时间。对于补全类型、构造函数名等常见的场景,代码补全性能较之前版本( v0.80v0.81v.0.82 )有显著的提升

性能改进总览

代码补全引擎由三个阶段组成:

  • 阶段一 (P1) – 搜索索引器以查找建议
  • 阶段二 (P2) – 转换建议为补全信息
  • 阶段三 (P3) – 计算代码片段建议

根据我们的分析,我们发现所有三个阶段都有改进的空间。下表显示了我们在过去版本中所做的改进。我们将在下一节中更多地讨论这些变化的细节。

0.80.0 0.81.0 0.82.0 1.0.0
减少 Windows I/O 操作 (P2) N/A
对常量 /默认值进行优化 (P2) N/A
延迟解析通用代码片段 (P3) N/A N/A
优化匿名构造函数 (P2) N/A N/A N/A
JDT 搜索引擎 – 优化 unit.complete() (P1) N/A N/A N/A
JDT 搜索引擎 – 改进索引文件的 I/O 操作 (P1) N/A N/A N/A
延迟 TextEdit 计算 (P2) N/A N/A 计划中

关键改动细节

版本 0.81.0 – 减少 Windows I/O 操作. #1831

在过去的性能测试中,我们发现很大一部分时间成本花在了计算文件 URI 上面。这个发现佐证了我们之前的观察:由于 JVM 中特定于平台的文件系统相关实现,Windows 平台上的代码补全性能相对较差。通过删除不必要的 URI 计算,我们提高了性能,尤其是在 Windows 平台上。

版本 0.81.0 – 对常量 / 默认值进行优化. #1835

当我们完成一个常量字段(例如 Constants.*)时,完成弹出窗口将在选择列表中显示建议的字段名称及其常量值(例如 Bit1 : int = 1 )。我们的分析发现,当类包含大量常量字段成员时,这会让补全非常慢。这是因为我们从 AST Tree 计算字段值,这在操作大文件时开销很大。

为了优化它,我们决定推迟解析常量值。代码补全会简化建议标签并仅显示字段名称(例如 Bit1 :int )。当您将鼠标悬停在 Javadoc 的完成项上时,才会在 Javadoc 部分显示它的常量值。

以下是一个拥有 1400 多行和 150 多个常量字段的类的字段完成的性能比较。

版本 平均响应时间(毫秒)
0.80.0 1429ms
0.81.0 72ms

版本 0.82.0 – 延迟解析通用代码片段 Delay resolving generic snippets. #1838

有两种类型的代码段:

  • 通用片段(例如 foreach 、fori 、ifelse 等)
  • 类型定义片段(例如类、接口等)

对于通用代码段,它会在构建完成项的"TextEdit"之前评估具有给定上下文的模板,此类评估可能会很昂贵。现在我们将这类评估推迟到解决阶段。当代码补全完成项被建立完成之后,模板模式将作为占位符填充。实际值在解决阶段进行评估,这不会阻止完成项目的显示。这也是一项关于"延迟解析 TextEdit"可以在多大程度上提高性能的实验,并且在大多数情况下,它应该运行良好

版本 0.82.0 – 优化匿名构造函数 Optimize for anonymous constructors. #1836

当我们想完成一个新的 Runnable 时, 期望的结果是这样的:

Runnable() {}

它由两部分组成

  • Runnable 名称
  • 空白的 body 片段 body () {\n\t\n}

通过性能分析,我们发现 CodeFormatUtil.format 花费了大量时间。

为了有一个正确的缩进和行分隔符,它们被格式化为当前的首选项。格式化是昂贵的,并且为所有项目(有时多达数千)重复格式化相同的内容(空体)。为了改进它,我们将空体格式化进行了一次性的操作并在所有项目中重用它。

版本 1.0.0 –提升代码补全搜索速度

为了优化索引搜索性能,我们做了两个关键改动。

我们的性能分析显示,索引查询任务 97% 的 CPU 时间用于从磁盘加载索引内容的 I/O 操作。这是因为我们使用的索引机制倾向于节省内存并且在搜索引擎中使用很少的缓存。几乎每个查询都必须从磁盘重新加载索引内容。一种直接的优化是降低 I/O 的频率。

Java 索引器由多个哈希表组成,每个哈希表用于记录某种类型的代码部分,例如类型声明、方法声明、引用、方法引用等。典型的查询作业从索引中读取一个或多个哈希表,然后连接这些将条目索引到目标结果中。

当我们完成类型 /构造函数名称(例如 Str 或者 new Str )时,索引查询作业读取两个哈希表,一个是用于查找匹配类型名称的 typeDecl 表,另一个是用于查找类文件路径的 documentName 表声明相应的类型。由于我们的目的只是完成类型名称并自动导入对应的 package ,因此 typeDecl 表足以满足我们的要求,并且不需要类文件路径。我们的优化是只读取 typeDecl 索引表,结果证明少读取一张索引表可以节省大量 I/O 成本。

  • 优化索引阅读操作. #574464

这个改动来自于社区开发者对上游 JDT 项目的贡献。Java 索引使用 UTF-8 对索引字符进行编码。加载索引时,我们会将它们解码回来。由于大多数索引字符只是 ASCII 字符,我们优化了解码方法,使其读取 ASCII 更快。

未来计划

我们上面列出的改进使自动完成速度更快,但我们还没有完成。未来,性能仍然是我们的首要任务,我们将继续优化自动完成性能。以下是我们在未来几个月内计划的一些项目

  • 延迟文本解析(Lazy Resolve TextEdit)

由于大多数语言客户端不支持完成项的延迟解析文本编辑,Java 语言服务器必须计算完成响应中所有完成项的文本编辑。这是最昂贵的计算的原因。我们正在与作者合作探索对延迟解析文本编辑的支持。

  • 更高效的索引架构 More Efficient Indexer

当前索引数据对于构造函数等一些代码完成场景来说是不够的。例如,构造函数完成需要知道该类是否具有泛型类型参数,并决定是否在构造函数引用中添加菱形&lt;&gt;。构造函数索引表没有包含这样的类型参数信息,我们必须从 Java 模型中解析它们,此类的解析操作成本很大。我们正在考虑优化索引架构以包含更多信息。

反馈与建议

请积极使用我们的产品!您的反馈和建议对我们非常重要,并将帮助我们做得更好。 有几种方法可以给我们留下反馈

资源

以下链接和资源能帮助您更好地了解 Java on Visual Studio Code 的相关信息

为啥子窗口水平滚动条在窗口下方,相比如果在上方有什么优势吗?

Posted: 24 Nov 2021 10:40 PM PST

为啥子窗口水平滚动条在窗口下方,相比如果在上方有什么优势吗?

不觉得在上方,看那些超级宽的大型报表更顺手嘛?

如果一个报表很长,水平滚动条就要往下划才能看到。如果限定报表高度,能看到的报表内容就不多了。

分享一个在 Ubuntu 下的 录屏截屏软件 deepin-screen-recorder

Posted: 24 Nov 2021 09:38 PM PST

上次有个兄弟问 ubuntu 上有没有好用的截图工具,我推荐了深度截图,不过发现深度家这个软件似乎也不错,应该是那个截图工具的升级版。

更多使用介绍

遗憾的是录屏功能仅在 xorg 下可用,wayland 下不行

求一个 PostgreSQL 方法,取数组中出现频率最高的那个元素?

Posted: 24 Nov 2021 08:58 PM PST

比如数组:["A", "A", "B", "C"]

结果是: "A",如果并列则取第一个就行。

Java 后台请求多个不相关的接口,如果才能提高效率?

Posted: 24 Nov 2021 08:47 PM PST

试过了 parallelStream 和多个 CompletableFuture 的 join ,发现性能差别不是很大。大神们还有啥好的实践方法麽?

求助帖: www.google.com 将您重定向的次数过多

Posted: 24 Nov 2021 06:24 PM PST

请各位大佬帮帮忙指条路解决该问题。

描述:不知道是插件导致的还是其他问题导致的。

目前在用 clashX 搭配 SwitchyOmega 翻墙。

No comments:

Post a Comment