Saturday, August 14, 2021

V2EX - 技术

V2EX - 技术


团队如何做成员间的隔离测试?

Posted: 14 Aug 2021 03:44 AM PDT

我们团队的现状是:

A 同学要对系统做测试了,主要是非压力 benchmark 测试,涉及到很多组件,各个组件有各自的版本; 他得在群里喊一声,我要测试了。为什么呢?因为测试区环境是共享的,机器共享,组件部署的节点共享,导致一个人做测试,其他人最好就不要做了,免得因为版本原因、配置原因发生莫名奇妙的错误

从我入职就一直这样,我就一直觉得很低效,可他们觉得可接受。

我认为高效的团队测试应该是各个同学互不干扰,只要底层资源够,大家同时跑各自的微型系统,用各自的版本,这样环境能够稳定复现。相信 docker , k8s 是很适合做这个的。

我非常好奇,在给定物理资源(也许测试区就有几台物理机的前提下,大家共用测试区的这些机器),你们的团队有没有做到成员间的隔离测试?怎么做的,有 web 界面吗?自动化程度高吗?能分享下吗?

谢谢

2021 年了, 有没有什么好办法可以拿到一个单文件(或者绿色版) Python 解释器?

Posted: 14 Aug 2021 03:18 AM PDT

pypy 貌似绿色版之前用过还可以

官网有 Windows 的 embed 版本, 算是个绿色版, 不过没找到 linux 上那种类似 Chromium 一样的已经编译好的绿色版用, 而且 embed 版本阉割了不少东西... linux 上没跨发行版的情况下直接把整个安装好的文件夹拷走有时候是可以直接用的, Windows 上把在安装好的文件夹拷走也可以当绿色版. 不过这种绿色版就没什么地方直接下载使用么...

早年间 2.7 用 ss 的时候发现里面就打包了解释器, 解释器就没人考虑过做一份免安装的发出来么

我觉得技术公众号写技术文章就是个伪命题,一切都是为了割韭菜

Posted: 14 Aug 2021 03:05 AM PDT

看技术文章,肯定要看代码,微信这个垃圾排版,手机小屏幕,话来划去看那点小字真的困难。

个人类的公众号,做大了没有不割韭菜的,弄点资源,关注回复,接着就和极客时间狼狈为奸割韭菜了。

不发广告的只有两种情况,一个是团队技术号,比如阿里美团技术号,另外一个就是接不着广告的。

现在很多人基本已经不看技术号了,随着程序员小白红利被吃干净,公众号推广告更是丧心病狂,要么抄袭,要么贩卖焦虑。

看技术文章还是看博客(除了 csdn )

chacha20ploy1305 和 aes128gcm 那种加密算法更安全

Posted: 14 Aug 2021 02:46 AM PDT

越来越能理解在计算机中数据的重要性

Posted: 14 Aug 2021 01:31 AM PDT

最早学编程就听说过一个说法,编程=算法+数据结构

其实想想算法其实经常用的就是那些,除去特定领域(比如 AI ),最要的还是数据,以及数据的存储结构。

最常见的数据存储就是数据库,大多数每天干的 CURD 就是围绕着数据库各种操作,大多数人处理数据用的最多无非就是数组、Map 这 2 个结构。所谓算法,用的最多估计还是循环遍历、查找、排序等等。

程序员每天变着法子对这些数据各种处理,得到一层又一层的数据,基于这些数据再得到另一层数据。。。

[新人向] react 练手项目,计算器

Posted: 14 Aug 2021 01:23 AM PDT

之前刚学习的时候写了一个计算器,看官网的计算器支持只到了 16.8,也全都是拿类组件写的

自己最近又看了看自己之前写的代码,发现很多地方都写的好蠢,重构了一版 hooks+一些目录安排

觉得可以让想入门的伙伴们康康

https://github.com/Dreamerryao/React-Calculator

飞书 + Lua 实现企业级组织架构登录认证

Posted: 13 Aug 2021 09:42 PM PDT

飞书是字节跳动旗下一款企业级协同办公软件,本文将介绍如何基于飞书开放平台的身份验证能力,使用 Lua 实现企业级组织架构的登录认证网关。

登录流程

让我们首先看一下飞书第三方网站免登的整体流程:

第一步: 网页后端发现用户未登录,请求身份验证; 第二步: 用户登录后,开放平台生成登录预授权码,302 跳转至重定向地址; 第三步: 网页后端调用获取登录用户身份校验登录预授权码合法性,获取到用户身份; 第四步: 如需其他用户信息,网页后端可调用获取用户信息(身份验证)。

浏览器内网页登录

Lua 实现

飞书接口部分实现

获取应用的 access_token

function _M:get_app_access_token()     local url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"     local body = {         app_id = self.app_id,         app_secret = self.app_secret     }     local res, err = http_post(url, body, nil)     if not res then         return nil, err     end     if res.status ~= 200 then         return nil, res.body     end     local data = json.decode(res.body)     if data["code"] ~= 0 then         return nil, res.body     end     return data["tenant_access_token"] end 

通过回调 code 获取登录用户信息

function _M:get_login_user(code)     local app_access_token, err = self:get_app_access_token()     if not app_access_token then         return nil, "get app_access_token failed: " .. err     end     local url = "https://open.feishu.cn/open-apis/authen/v1/access_token"     local headers = {         Authorization = "Bearer " .. app_access_token     }     local body = {         grant_type = "authorization_code",         code = code     }     ngx.log(ngx.ERR, json.encode(body))     local res, err = http_post(url, body, headers)     if not res then         return nil, err     end     local data = json.decode(res.body)     if data["code"] ~= 0 then         return nil, res.body     end     return data["data"] end 

获取用户详细信息

获取登录用户信息时无法获取到用户的部门信息,故这里需要使用登录用户信息中的 open_id 获取用户的详细信息,同时 user_access_token 也是来自于获取到的登录用户信息。

function _M:get_user(user_access_token, open_id)     local url = "https://open.feishu.cn/open-apis/contact/v3/users/" .. open_id     local headers = {         Authorization = "Bearer " .. user_access_token     }     local res, err = http_get(url, nil, headers)     if not res then         return nil, err     end     local data = json.decode(res.body)     if data["code"] ~= 0 then         return nil, res.body     end     return data["data"]["user"], nil end 

登录信息

JWT 登录凭证

我们使用 JWT 作为登录凭证,同时用于保存用户的 open_iddepartment_ids

-- 生成 token function _M:sign_token(user)     local open_id = user["open_id"]     if not open_id or open_id == "" then         return nil, "invalid open_id"     end     local department_ids = user["department_ids"]     if not department_ids or type(department_ids) ~= "table" then         return nil, "invalid department_ids"     end      return jwt:sign(         self.jwt_secret,         {             header = {                 typ = "JWT",                 alg = jwt_header_alg,                 exp = ngx.time() + self.jwt_expire             },             payload = {                 open_id = open_id,                 department_ids = json.encode(department_ids)             }         }     ) end  -- 验证与解析 token function _M:verify_token()     local token = ngx.var.cookie_feishu_auth_token     if not token then         return nil, "token not found"     end      local result = jwt:verify(self.jwt_secret, token)     ngx.log(ngx.ERR, "jwt_obj: ", json.encode(result))     if result["valid"] then         local payload = result["payload"]         if payload["department_ids"] and payload["open_id"] then             return payload         end         return nil, "invalid token: " .. json.encode(result)     end     return nil, "invalid token: " .. json.encode(result) end 

使用 Cookie 存储登录凭证

ngx.header["Set-Cookie"] = self.cookie_key .. "=" .. token 

组织架构白名单

我们在用户登录时获取用户的部门信息,或者在用户后续访问应用时解析登录凭证中的部门信息,根据设置的部门白名单,判断用户是否拥有访问应用的权限。

-- 部门白名单配置 _M.department_whitelist = {}  function _M:check_user_access(user)     if type(self.department_whitelist) ~= "table" then         ngx.log(ngx.ERR, "department_whitelist is not a table")         return false     end     if #self.department_whitelist == 0 then         return true     end      local department_ids = user["department_ids"]     if not department_ids or department_ids == "" then         return false     end     if type(department_ids) ~= "table" then         department_ids = json.decode(department_ids)     end     for i=1, #department_ids do         if has_value(self.department_whitelist, department_ids[i]) then             return true         end     end     return false end 

更多网关配置

同时支持 IP 黑名单和路由白名单配置。

-- IP 黑名单配置 _M.ip_blacklist = {} -- 路由白名单配置 _M.uri_whitelist = {}  function _M:auth()     local request_uri = ngx.var.uri     ngx.log(ngx.ERR, "request uri: ", request_uri)      if has_value(self.uri_whitelist, request_uri) then         ngx.log(ngx.ERR, "uri in whitelist: ", request_uri)         return     end      local request_ip = ngx.var.remote_addr     if has_value(self.ip_blacklist, request_ip) then         ngx.log(ngx.ERR, "forbided ip: ", request_ip)         return ngx.exit(ngx.HTTP_FORBIDDEN)     end      if request_uri == self.logout_uri then         return self:logout()     end      local payload, err = self:verify_token()     if payload then         if self:check_user_access(payload) then             return         end          ngx.log(ngx.ERR, "user access not permitted")         self:clear_token()         return self:sso()     end     ngx.log(ngx.ERR, "verify token failed: ", err)      if request_uri ~= self.callback_uri then         return self:sso()     end     return self:sso_callback() end 

使用

本文就不赘述 OpenResty 的安装了,可以参考我的另一篇文章《在 Ubuntu 上使用源码安装 OpenResty 》

下载

cd /path/to git clone git@github.com:ledgetech/lua-resty-http.git git clone git@github.com:SkyLothar/lua-resty-jwt.git git clone git@github.com:k8scat/lua-resty-feishu-auth.git 

配置

lua_package_path "/path/to/lua-resty-feishu-auth/lib/?.lua;/path/to/lua-resty-jwt/lib/?.lua;/path/to/lua-resty-http/lib/?.lua;/path/to/lua-resty-redis/lib/?.lua;/path/to/lua-resty-redis-lock/lib/?.lua;;";  server {     access_by_lua_block {         local feishu_auth = require "resty.feishu_auth"         feishu_auth.app_id = ""         feishu_auth.app_secret = ""         feishu_auth.callback_uri = "/feishu_auth_callback"         feishu_auth.logout_uri = "/feishu_auth_logout"         feishu_auth.app_domain = "feishu-auth.example.com"          feishu_auth.jwt_secret = "thisisjwtsecret"          feishu_auth.ip_blacklist = {"47.1.2.3"}         feishu_auth.uri_whitelist = {"/"}         feishu_auth.department_whitelist = {"0"}          feishu_auth:auth()     } } 

配置说明

  • app_id 用于设置飞书企业自建应用的 App ID
  • app_secret 用于设置飞书企业自建应用的 App Secret
  • callback_uri 用于设置飞书网页登录后的回调地址(需在飞书企业自建应用的安全设置中设置重定向 URL )
  • logout_uri 用于设置登出地址
  • app_domain 用于设置访问域名(需和业务服务的访问域名一致)
  • jwt_secret 用于设置 JWT secret
  • ip_blacklist 用于设置 IP 黑名单
  • uri_whitelist 用于设置地址白名单,例如首页不需要登录认证
  • department_whitelist 用于设置部门白名单(字符串)

应用权限说明

  • 获取部门基础信息
  • 获取部门组织架构信息
  • 以应用身份读取通讯录
  • 获取用户组织架构信息
  • 获取用户基本信息

开源

本项目已完成且已在 GitHub 上开源:k8scat/lua-resty-feishu-auth,希望大家可以动动手指点个 Star,表示对本项目的肯定与支持!

你知道 StackOverFlow 的话题拥有「聊天室」吗?

Posted: 13 Aug 2021 08:20 PM PDT

在 StackOverFlow 上发帖必须严肃认真,满足要求,否则帖子就可能会被反对甚至删除。

但有时候只是想随便谈一谈,不想那么严肃,StackOverFlow 好像就满足不了要求了。

实际上不然很多的主题都有聊天室,在那里面交流是同步的,是相对宽松的。

不知道为什么聊天室里的人比较少,但好在有不少人经验丰富又很活跃,所以往往还是能获得回复的。

不只是 StackOverFlow,StackExchange 的其他站也都有这样的聊天室,在对应的站点前面加入chat.即可访问,例如 Python 的是 Chat - Python | chat.stackoverflow.com

大家有用 Next DNS 的嘛?感觉解析好慢,是我的个例嘛,还是通病?

Posted: 13 Aug 2021 02:32 PM PDT

Next DNS
是 Next DNS 的 Doh 服务,经常出现解析第一次超时或错误,往往需要解析第二次
详情请看图
572B3601-EFEC-4ACA-8F86-D54178DDC877.jpeg 2EE6DA76-C8A0-4326-B86B-0A0068B9C8FC.jpeg

如何将一个技术公众号做到 1 万+?

Posted: 13 Aug 2021 01:32 PM PDT

我想要将一个关于 Java 虚拟机、Java 编译器的公众号做到 1 万+,请问有什么好的办法吗? 感觉 JVM 和 Java 编译器相关技术的受众人群有点少呀,不太好做。

请教大家关于 google benchmark 的一个问题

Posted: 13 Aug 2021 12:50 PM PDT

晚上在虚拟机上安装了 google benchmark 运行了一个网上的例子,运行 ok,自己写了一个始终显示都是 0ns 耗时,请求各位大佬分析,哪里有问题?

#include <benchmark/benchmark.h> #include <vector>  int loop = 100000; static void bench_vector_reserve(benchmark::State& state) {     std::vector<int> ans;     ans.reserve(loop);     for(int i = 0;i < loop;i++)         ans.push_back(i); } BENCHMARK(bench_vector_reserve);  static void bench_vector(benchmark::State& state) {     std::vector<int> ans;     for(int i = 0;i < loop;i++)         ans.push_back(i); } BENCHMARK(bench_vector);  BENCHMARK_MAIN();  

最近学习 C++了解到 vector 会动态扩容,比如每次空间 double,我上面的例子不管 loop 调多大,运行结果都显示:

[root workspace]#./a.out 2021-08-13T12:00:19-04:00 Running ./a.out Run on (4 X 1900 MHz CPU s) CPU Caches:   L1 Data 32 KiB (x2)   L1 Instruction 32 KiB (x2)   L2 Unified 256 KiB (x2)   L3 Unified 3072 KiB (x1) Load Average: 0.02, 0.03, 0.00 --------------------------------------------------------------- Benchmark                     Time             CPU   Iterations --------------------------------------------------------------- bench_vector_reserve      0.000 ns        0.000 ns            0 bench_vector              0.000 ns        0.000 ns            0 [root workspace]# 

有没有帮忙老哥分析一波?

作为后端,电商领域的营销开发是比较好的方向吗

Posted: 13 Aug 2021 12:38 PM PDT

最近拿到一家垂直领域 b2c 电商的营销岗后端开发 offer,想向大家了解下营销方向的问题

  • 营销是电商中比较核心的部门吗,技术挑战性如何,能否在这个领域深耕
  • leader 说主要是做活动这块(优惠券等),会不会压力比较大,容易背锅

我目前本科毕业 2 年,之前在直播行业工作,对电商不太熟悉,希望大家能提供分享和建议,感谢

吐槽自己的两个开源工具(msmbps, V File Name)

Posted: 13 Aug 2021 08:14 AM PDT

msmbps 测量云服务的延时和下载,V File Name 是粗暴的基于压缩包的版本管理。

刚开始的时候,想着国外云服务是小众需求;而粗暴的版本管理,倒腾 office 文档的普罗大众都需要(它也是个归档备份的好助手)。

后面就翻车了:测量云服务很多 star,开心呀;粗暴版本管理,star 就比较少了。

我看了一下,然后明白了:v2ex 程序员很多,不少人需要国外云服务;对于粗暴的版本管理,需求较少。

小广告:
https://www.msmbps.com/
https://github.com/msmbps/msmbps
https://www.vfilename.com/
https://github.com/vfilename/vfilename
(求 star 啦)

求助使用 git lfs 上传大文件到 github 失败

Posted: 13 Aug 2021 07:36 AM PDT

我想上传一个 150MB 的 rar 文件到 github 的一个空仓库上面。

1 、使用 Github Desktop: 但是每次到了 150MB(100%)时,他又从 0%开始重新上传一遍,周而复始。

2 、使用命令行: 上传到 150MB 后,他会卡一会,然后继续重新上传,会显示到几百 MB 。如果我不手动停止的话,他可以上传到 1G 。 https://ww1.sinaimg.cn/large/006JF9PWgy1gtfeizz0kej30km01sq33.jpg

github 仓库为空,不会有被限制的情况。也没有超过 github lfs 的 1G 宽带限制。

所以请教各位彦祖大佬,是哪里的问题?

git version 2.29.2.windows.3

git-lfs/2.12.1 (GitHub; windows amd64; go 1.14.10; git 85b28e06)

.gitattributes 文件内容:

*.rar filter=lfs diff=lfs merge=lfs -text 

No comments:

Post a Comment