Wednesday, November 17, 2021

V2EX - 技术

V2EX - 技术


被客户告知 HTTP 的 PUT 请求不安全,甩锅给我们要求整改

Posted: 17 Nov 2021 10:31 AM PST

真的是要吐,这段时间好几个客户单位反馈业务系统无法使用,一直报错

上去一看,PUT 请求全部被拦截,也不知道家防火墙商干的好事,默认把 PUT 请求全部给禁了,还给客户培训说 PUT 请求就是不安全

给客户解释了半天,根本不听,就说防火墙这样设置肯定有他的道理,说是我们使用了不安全的请求方法,要我们负责安全整改

全站遵循 RESTful 设计的呀~简直要疯了~也不知道哪个 wbd 做的默认规则

关于联想笔记本电脑 thinkbook 自行更换系统后激活的问题

Posted: 17 Nov 2021 09:48 AM PST

双 11 在 jd 自营 24 期免息购买了联想 thinkbook 14p (R5-5600H 16G 512G),
预装 win11 的系统,还没有联网激活,想自行更换 win10 。

刚咨询过联想在线客服,使用预装系统 win11 联网后会自动激活,
可以自行更换 win10 ,但需要自行想办法激活。
再进一步问,如果 win11 换 win10 ,再换回 win11 ,还是需要自己想办法激活。

请问懂行的朋友们,客服说的是否唯一正确答案?
有没有其他方案可以 保留 /备份 预装的正版系统,然后任意折腾电脑的系统,先行感谢。

TCP 检验和原理不太懂?求大佬指点

Posted: 17 Nov 2021 09:08 AM PST

  1. 就是有点不明白,为啥这么弄了以后,接收方最后算出来就会全是 1 ?(当无比特差错时)(居然最后还有个叠加操作)
    unsigned short checksum(unsigned short *buf,int nword)     {         unsigned long sum;                for(sum=0;nword>0;nword--)             sum += *buf++;         sum = (sum>>16) + (sum&0xffff);         sum += (sum>>16);                return ~sum;     } 
  1. 上面这个校验和算法,是先求和,最后取反码,好像也可以(因为算出来是一样的)?这是什么原理(因为上图是 先取反码,再求和,最后叠加。难道这三步 任意换顺序都可以吗)
  2. sum += (sum>>16);这一步看起来是多余的吧?因为上一句就把 前 16 比特 和 后 16 比特 累加了啊?

参考文章:

https://www.cnblogs.com/zxiner/p/7203192.html

http://t.zoukankan.com/pengkunfan-p-3967461.html

生产环境代码与开发分支的代码差别很大如何处理?

Posted: 17 Nov 2021 08:48 AM PST

由于历史原因,没有做好分支管理,现在的情况是这样的:

  • 多个公司(我司的服务对象是不同的公司)生产中有不同的代码, 而开发分支是同一份(最近才用同一份代码切不同公司分支, 新的需求在不同的分支上开发)
  • 生产环境的更新都是增量发布的
  • 所以分支的代码跟生产的代码可能差的很多。即可能 a 公司修改了 M1 方法,上线了。但是 b 公司没有更新该方法,b 公司下次上线其他需求的时候也要修改 M1 方法,但是由于已经被修改过了,所以与线上的代码差了一个或多个版本,导致了可能期间的版本使用了其他类或配置,由于本次 b 公司的需求只是修改 M1 方法,所以只上线了 M1 方法而没有上其他类或配置,所以就直接报错了。

最近在上线的时候由于代码不一致的问题,导致了上线很困难。

目前我的操作是上线前先把线上的代码 class 拿下来反编译跟要上线的代码比对下, 差距较大的用线上的 class 反编译直接覆盖,但还是免不了有各种问题,少类,少方法等

请教各位 v 友有没有什么好的解决方法?

iOS 怎么弄到可以开发 VPN 的权限?

Posted: 17 Nov 2021 08:04 AM PST

想研究一下 clash 跑在 iOS 上,奈何 iOS 需要特定的开发权限才可以搞,所以想编译 wireguard for iOS 都不行吧。
有人弄过吗?可以花钱,最好便宜点。

问个 npm 和 ant-design-vue 的问题

Posted: 17 Nov 2021 07:46 AM PST

7:46:30 PM [vite] Internal server error: Preprocessor dependency "less" not found. Did you install it?   Plugin: vite:css   File: /home/vagrant/jscode/pear-admin-ant/node_modules/ant-design-vue/dist/antd.less       at loadPreprocessor (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:34385:15)       at less (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:34483:22)       at compileCSS (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:34127:40)       at async TransformContext.transform (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:33776:50)       at async Object.transform (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:50353:30)       at async transformRequest (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:65394:29)       at async viteTransformMiddleware (/home/vagrant/jscode/pear-admin-ant/node_modules/vite/dist/node/chunks/dep-874085d4.js:65522:32) 

node: v16.9.0

配置信息

 "dependencies": {     "@ant-design-vue/use": "^0.0.1-alpha.10",     "@ant-design/icons-vue": "^6.0.1",     "@antv/g2": "^4.1.20",     "@vitejs/plugin-vue": "^1.6.2",     "ant-design-vue": "^2.2.8",     "axios": "^0.21.1",     "core-js": "^3.6.5",     "lodash.get": "^4.4.2",     "moment": "^2.27.0",     "nprogress": "^0.2.0",     "path": "^0.12.7",     "rollup-plugin-visualizer": "^5.5.2",     "vue": "^3.2.21",     "vue-i18n": "^9.1.7",     "vue-router": "^4.0.10",     "vuex": "^4.0.2"   },   "devDependencies": {     "@babel/eslint-parser": "^7.15.8",     "@types/node": "^14.17.9",     "@vue/compiler-sfc": "^3.2.21",     "@zougt/vite-plugin-theme-preprocessor": "^1.3.12",     "babel-plugin-import": "^1.13.3",     "eslint": "^6.8.0",     "eslint-plugin-vue": "^7.18.0",     "less": "^4.1.2",     "less-loader": "^10.2.0",     "mockjs2": "^1.0.8",     "node-sass": "^6.0.0",     "rollup-plugin-analyzer": "^4.0.0",     "sass-loader": "^10.0.2",     "vite": "^2.5.8"   }, 

尝试的方案

  1. npm install less less-loadernpm install less less-loader -D 都没有效果, 删除 node_modules, 在运行这些命令也一样

  2. 替换 registry, 在运行 1 的命令也没有效果

vagrant@ubuntu:~/jscode/pear-admin-ant$ npm get registry http://registry.npmmirror.com/ 

所以到底怎么搞呢兄弟们?

咨询一个 vue,组件的问题

Posted: 17 Nov 2021 07:14 AM PST

自己是个后端,最近学了下 vue 。遇到个问题不知道怎么解决。 现在有一个列表用来展示 notes 。

组件结构如下:

HomePage => NoteList => NoteItem 

之前写的时候不是很熟悉没有太注意,在 NoteItem 中直接使用了公共状态( pinia 的 Store ),并且 NoteItem 的一些操作,比如编辑 删除都是直接操作 store 。直接导致从 NoteList 到 NoteItem 与 store ,getAllNoteApi(全量 note 的接口)耦合在一起。现在想加一个标签功能,就要求展示某个标签下的所有 note,但是整个 List 已经与 getAllNoteApi 耦合在一起。

应该是自己的方法用错了。不知道正确的实现方式是什么呢?

想学习下编译原理,请问 有没有 golang 写一门脚本语言的课程?

Posted: 17 Nov 2021 06:44 AM PST

学习下编译原理,请问 有没有 golang 写一门脚本语言的课程?

类似框架也行,公司一个项目要开发一门很简单的语言给非技术人员使用

有人尝试过使用 pypi 分发二进制程序吗?

Posted: 17 Nov 2021 06:41 AM PST

RT 。有些 go/rust 写的小工具,想让用户能够快速安装(在不安装 go/rust 本身的前提下)。

稍微研究了一下,pypi 支持上传 WHEEL 和 源代码 形式的软件包; WHEEL 形式适合分发带有二进制的东西,可以根据平台系统等拉取对应版本。

但是似乎想直接放 bin 里的时候有点困难,只能在 entry_points.txt 里指定 python 模块名,这样调用二进制就得绕一次 python 。。

有什么更优雅的办法做这件事吗?或者说有什么更方便通用的平台可以分发二进制?

关于为什么想用 pypi 这种专门分发 python 代码的平台: 因为实在是太方便了,各平台(除了 windows)都能直接用内置的软件包管理器安装,并且国内镜像源也比较完善。

[iOS] 求教 iOS 开发问题,关于 UICollectionView 的固定 header 问题

Posted: 17 Nov 2021 06:32 AM PST

我在做一个 collectionview ,主体是一个表格,上下左右都可以滑动,类似 excel ,我给他添加一个固定表头 header ,用了 pinToVisibleBounds = true 这个属性。刚显示的时候是没问题的,上下滑动也没问题,header 也固定在顶部,问题出在左右滑动的时候,当左右滑动超过一个屏幕宽度以后,header 就不见了。

我自己检查发现其实就因为 pinToVisibleBounds 这个属性是固定在 collection section 的 bounds 里,滑动超过一个屏幕以后,自然就超过这个属性的设置了。现在没有什么办法,陷入了僵局。。不知道能不能给点指导。

请教下有什么好的命令、代码存储工具?

Posted: 17 Nov 2021 05:43 AM PST

工作上经常会用到一些命令、或者发现一些好的工具代码等,收藏下来。

比如一些 shell 命令,有一些固定的用法等,只需要每次修改参数就执行。

不想每次去 google 。

先谢谢了

各位所在公司有 DDD 的落地实现吗?

Posted: 17 Nov 2021 05:41 AM PST

看了殷浩的 DDD 文章,觉得还挺好的,想问一下各位怎么看待 DDD ?

大佬们有在线培训班推荐吗,带答疑那种

Posted: 17 Nov 2021 05:23 AM PST

以前有学过 Python 和 java 基本语法,但是不成体系,尝试做小项目又总被一些很蠢的问题卡到怀疑人生,所以想找个轻量级线上培训,主要是带导师答疑,带着让初期更平滑一点。几千块能打住那种。谢谢大家

请问微软 c# Microsoft.Office.Interop 这个玩意是不是已经废弃了

Posted: 17 Nov 2021 05:05 AM PST

看到已经好几年没更新了,也不支持 office 2016 请问微软官方有替代品吗? 主要用来 word 转 pdf

教学视频里面用的屏幕画笔工具叫什么

Posted: 17 Nov 2021 04:51 AM PST

最近看教程,里面用的屏幕画笔工具叫什么,有谁知道吗

如何绘制平滑的鼠标轨迹?

Posted: 17 Nov 2021 04:10 AM PST

前段时间机缘巧合研究了一下怎么在网页上绘制鼠标轨迹,惊奇地发现似乎市面上并没有什么比较完美的方法或成熟的工具库。于是花了些时间自己写了一个,特点是绘制出来的鼠标轨迹比较平滑。简单分享一下。

demo:online demo

repo: laser-pen

win11 删除文件不消失问题

Posted: 17 Nov 2021 03:39 AM PST

如题,有什么好的方法么?

consul 集群搭建问题

Posted: 17 Nov 2021 02:51 AM PST

集群搭建好之后需要通过 HTTP API 来进行服务的注册 /发现等请求, 那集群是怎么对外提供 IP 地址的。比如我有三个局域网地址:

  1. 192.168.10.10
  2. 192.168.10.11
  3. 192.168.10.12 分别在上面开启一个 consul agent server. 我可以分别向三个地址发送 HTTP 请求。比如我选择向(2)发送 curl http://192.168.10.11:8500/v1/agent/services

但如果 192.168.10.11 的机器挂掉了。我就需要替换请求的 IP 地址。consul 集群有向外提供固定 IP 的方法吗?这样不管其中哪一个挂掉了。我的请求地址都是不变的

重新造个 go-wechat 轮子

Posted: 17 Nov 2021 02:01 AM PST

目前 wechat Go 相关 SDK 普遍存在以下问题:

1 、缺失单元测试

2 、代码规范(命名等)不够 Go

3 、不够灵活

举个 Github 上 Star 最高的一个库的例子,不能自定义 http.Client 、http.ServeMux

//使用 memcache 保存 access_token ,也可选择 redis 或自定义 cache wc := wechat.NewWechat() memory := cache.NewMemory() cfg := &offConfig.Config{     AppID:     "xxx",     AppSecret: "xxx",     Token:     "xxx",     //EncodingAESKey: "xxxx",     Cache: memory, } officialAccount := wc.GetOfficialAccount(cfg)  // 传入 request 和 responseWriter server := officialAccount.GetServer(req, rw) //设置接收消息的处理方法 server.SetMessageHandler(func(msg *message.MixMessage) *message.Reply {      //回复消息:演示回复用户发送的消息     text := message.NewText(msg.Content)     return &message.Reply{MsgType: message.MsgTypeText, MsgData: text} })  //处理消息接收以及回复 err := server.Serve() if err != nil {     fmt.Println(err)     return } //发送回复的消息 server.Send() 

作为一个库,不够灵活,是属于破坏性代码的一类库。

4 、不能自定义 access_token 的管理逻辑

比如公众号,多个项目都要使用 access_token 的情况下如果不能自定义 token 管理逻辑,则 token 会再重新获取后失效之前的。

所以在新项目中需要 wechat sdk 的时候,单元测试、灵活、易于使用成了优先考虑的。

举个例子:

NewClient 时可以传递自己的 http.Client ,自定义超时等逻辑。

type handler struct{}  func (s *handler) HandleTextMessage(message *officialaccount.TextMessage) (officialaccount.ReplyMessage, error) { 	// 处理业务逻辑 	// 响应消息给微信 }  func main() { 	config := &officialaccount.Config{AppID: "appid", Secret: "secret", Token: "token"} 	client := officialaccount.NewClient(config, nil)  	http.Handle("/wx", client.Serve(&handler{})) 	http.ListenAndServe(":8080", nil) } 

易于使用

	ctx := context.Background() 	client.User.UpdateRemark(ctx, "openid", "remark")  

api & testing

 // xx.go  type IPListResponse struct { 	IPList []*string `json:"ip_list"` }  // IPList 获取微信服务器 IP 地址 // // 参考文档: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html func (s *BasicService) IPList(ctx context.Context) (*IPListResponse, *Response, error) { 	req, err := s.client.NewRequest("GET", "get_api_domain_ip", nil) 	if err != nil { 		return nil, nil, err 	} 	ipResp := new(IPListResponse) 	resp, err := s.client.Do(ctx, req, ipResp) 	if err != nil { 		return nil, resp, err 	} 	return ipResp, resp, nil }     // xx_test.go  	func TestBasicService_IPList(t *testing.T) { 		client, mux, _, teardown := setup() 		defer teardown()  		mux.HandleFunc("/get_api_domain_ip", func(w http.ResponseWriter, r *http.Request) { 			testMethod(t, r, "GET")  			fmt.Fprint(w, `{"ip_list":["127.0.0.1"]}`) 		})  		ctx := context.Background() 		ipList, _, err := client.Basic.IPList(ctx) 		assert.Nil(t, err)  		want := &IPListResponse{IPList: []*string{String("127.0.0.1")}} 		assert.Equal(t, want, ipList) 	}  

目前进展:完成了公众号平台接口、单元测试,下一步:小程序

问题分析:为什么 keystone 的本地用户认证接口压测性能很差?

Posted: 17 Nov 2021 12:56 AM PST

有用户反馈 keystone 认证本地用户的接口性能很差,因此做了调研。

首先使用 ab ( apache benchmark )模拟用户认证,调用命令行如下:

ab -n 2000 -c 100 -p ~/auth_body.json -T 'application/json' http://192.168.1.248:5000/v3/auth/tokens 

执行以上脚本过程中,采集 keystone 的 pprof 的 profile 数据:

wget http://192.168.1.248:5000/debug/pprof/profile 

然后把 profile 数据文件拷贝到本地,用本地 go tool 打开一个 http 服务,查看 profile 的内容。

go tool pprof -http=0.0.0.0:8081 ~/profile 

用浏览打开看,得到如下的调用图:

发现整个 profile 时间约 130 秒,调用 blowfish encryptBlock 的时间花了约 101 秒。查看代码发现这个是密码校验调用的方法 bcrypt.CompareHashAndPassword 。也就是说,70%的时间都花在验证本地用户的密码上了。

为什么这个 bcrypt.CompareHashAndPassword 方法这么慢呢?搜索 google 发现这个问答:

https://stackoverflow.com/questions/49437359/why-bcrypt-library-comparehashandpassword-method-is-slow

其中有一段文字:

Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power. 

因此,采用 bcrypt 加密用户密码后,为了防止密码被暴力破解,用户认证接口的校验速度是故意地越压越慢的,性能必然不会好。

作者: 云联壹云邱剑

GitHub: https://github.com/yunionio/cloudpods

开源地址: https://www.cloudpods.org/

Cloudpods 是一个开源的 Golang 实现的云原生的多云和混合云融合平台。Cloudpods 不仅可以管理本地的虚拟机和物理机资源,还可以管理其他公有云和私有云平台的资源。

django 取得发布信息用户的 Ip 总是取得 127.0.0.1 这个, 并不是真实用户的 ip?

Posted: 17 Nov 2021 12:54 AM PST

class tkinfo(models.Model): 	author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name = _('author'), on_delete=models.CASCADE) 	title = models.CharField(max_length=255, verbose_name = u'信息标题') 	body = models.TextField() 	excerpt = models.CharField(_(u'话题简介'), default='', max_length=2000, blank=True, null = True) 	ip_user = models.GenericIPAddressField(unpack_ipv4=True, blank=True, null=True)  

ip_user = models.GenericIPAddressField(unpack_ipv4=True, blank=True, null=True) 用这个以前是可以取得用发布信息用户的真实 ip 地址的

最近换了服务器。centos 宝塔 搭建的环境 django2.2 + python3.x + nginx +uwsgi

取得的 ip 地址都是 127.0.0.1 了。 查了半天也没发现哪里有问题? 有知道或遇到过这问题的吗? 多谢

请问 Android App 的爬虫有什么好的工具吗?

Posted: 17 Nov 2021 12:32 AM PST

想听广播但是又不想开 app ,目前用的 Gery 的 Packet Capture 看 api 请求,但是有些抓不到。
可以搜到的唯一相关的信息是 https://www.zybuluo.com/jzp113/note/1415261
难道要去反编译逆向?

大家会需要一个网页截图的工具么,提供 api 截图的那种

Posted: 17 Nov 2021 12:03 AM PST

看看有人需要么,准备写一个开源出来

顺便问一下,现在已经写了一个小工具,可以截图最新疫情的中高风险地区,并发送到企业微信群,有人需要么

有没有那样的数据库 MySQL 代理服务?

Posted: 16 Nov 2021 11:50 PM PST

比如这样的:

外网 PC --> DB proxy --> DB

DB 只授权了内网的 IP 访问,外面 PC 不能直接去连 DB ,但是可以去连 proxy ,

而且最好这个 proxy 能隐藏了 DB 的账号。 外部 PC 可以使用 proxy 的账号,然后映射连接 DB 。

DB Proxy 也可以做审计,比如记录哪个 IP 执行了什么 query

github 的项目推荐有没有黑名单?

Posted: 16 Nov 2021 11:27 PM PST

就是右边 Explore repositories 这部分,别的视频网站之类的再烦至少能点下不感兴趣,github 有的项目真的跟牛皮糖一样粘在那儿三天两头出现,只能 ublock 自定义先简单过滤下

开虚拟机时候电脑变卡,但是资源占用情况还好,是需要更新设备了吗

Posted: 16 Nov 2021 10:27 PM PST

lz 19 年组装的台式机,win10, 16G ,i5, 1TB 固态,有段时间经常开虚拟机。后来转到服务器上了,虚拟机没怎么开了。但是最近打开虚拟机(ubuntu16)发现电脑会出现显著的卡顿,虚拟机开机时间也很长,需要几分钟,以前我记得很快的。看了下,内存总占用率 70%,磁盘 100%。emm,这个磁盘很奇怪。。。难道我应该重新装个虚拟机?

canal 全量同步大量数据到 ES 有丢失的情况

Posted: 16 Nov 2021 09:11 PM PST

主表有 430 万数据,关联表有 220 万数据,是多对一的关系,理论上同步后会有 430 万数据。 用的 canal adapter 同步到 ES 。

实际上: 数据全量导入完成, 一共导入 4134977 条数据, 耗时: 7995600

过程中有报错如下:

2021-11-17 02:11:21.710 [pool-3-thread-4] ERROR com.alibaba.otter.canal.client.adapter.support.Util - sqlRs has error, sql: 这里是我的 SQL LIMIT 4240000,10000 2021-11-17 02:11:21.711 [pool-3-thread-4] ERROR c.a.otter.canal.client.adapter.es7x.etl.ESEtlService - com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 3, maxActive 3, creating 0 java.lang.RuntimeException: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 3, maxActive 3, creating 0 at com.alibaba.otter.canal.client.adapter.support.Util.sqlRS(Util.java:65) ~[client-adapter.common-1.1.5.jar:na] at com.alibaba.otter.canal.client.adapter.es7x.etl.ESEtlService.executeSqlImport(ESEtlService.java:64) ~[na:na] at com.alibaba.otter.canal.client.adapter.support.AbstractEtlService.lambda$importData$1(AbstractEtlService.java:91) [client-adapter.common-1.1.5.jar:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_221] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_221] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_221] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_221] Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 3, maxActive 3, creating 0 at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1749) ~[druid-1.2.6.jar:1.2.6] at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1419) ~[druid-1.2.6.jar:1.2.6] at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1399) ~[druid-1.2.6.jar:1.2.6] at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1389) ~[druid-1.2.6.jar:1.2.6] at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:100) ~[druid-1.2.6.jar:1.2.6] at com.alibaba.otter.canal.client.adapter.support.Util.sqlRS(Util.java:50) ~[client-adapter.common-1.1.5.jar:na] ... 6 common frames omitted

全量同步的过程中有数据的更新及插入操作。有没有办法解决这个问题呢?

最近犯闲,想再写点啥项目,有推荐的吗?

Posted: 16 Nov 2021 12:19 PM PST

去年写了两个库,今年有人用到,心血来潮肝了几个月做了更多优化和功能支持,同领域性能和支持的功能、场景以及易用性基本都高于其他库:
https://www.v2ex.com/t/794435

然后最近又有点无聊,想写点其他的,因为只有自己闲的时候写写:
1. 只想做小而美的东西,不想搞太复杂、需要很大代码量的,除非有其他小伙伴组团一起玩
2. 限于 golang ,其他语言也会几门,但体力有限,撸不动那么多

各位有推荐的吗?

No comments:

Post a Comment