Saturday, April 9, 2022

V2EX - 技术

V2EX - 技术


想请大家帮忙跑一下这个 PHP 文件,看看我们设备差距有多少

Posted: 09 Apr 2022 11:48 AM PDT

我最近一直在看二手区,想更新 PC 主机
刚好有个 V 友说写一亿个 IP 到文件中花费时间
我刚好在学习 PHP ,就用 PHP 写了一个

下载地址:
http://175.178.215.195/ip.php

电脑装了 PHP 的 V 友有空可以帮跑一下,看看时间是多少,这样我可以比较直观地看出我电脑和其他设备的差距
我的总耗时大概是 6000 ms

如何快速向文件中写入 1 亿个 ip?

Posted: 09 Apr 2022 11:28 AM PDT

背景:需要向一个文件中写入 1 亿个 ip ,最快的方法是什么?机器配置是 mac book,双核 cpu,8GB 内存。 我用 java 实现了一个多线程的写入,发现速度慢的要死(写入时间 5 分钟以上)。有没有人推荐一下速度写入大文件的方法,或者其他语言快速写入大文件的方案。

在 serverless computing 下,有哪些方向可以给程序员提供服务?这样范式下有什么痛点?

Posted: 09 Apr 2022 11:03 AM PDT

在 serverless computing 下,有哪些方向可以给程序员提供服务?这样范式下有什么痛点?

根据伯克利大学的预测未来十年,在 serverless computing 一定是未来,如果这样的话,随着技术的变更,一定也产生大量的开发需求,大家预测会有什什么样的需求产生呢?

Qbittorrent 性能参数校准

Posted: 09 Apr 2022 10:53 AM PDT

随手糊了一篇文档。

Qbittorrent 性能参数校准

请教 MySQL8 建表使用 FEDERATED 引擎连接 MySQL5 的数据库表,提示 1492,Bad handshake...

Posted: 09 Apr 2022 10:25 AM PDT

CREATE TABLE `ln_mt` (   `id` int unsigned NOT NULL AUTO_INCREMENT,   lockcasenum tinyint DEFAULT NULL,   PRIMARY KEY (`id`),   xxx   xxx   xxx ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CONNECTION='mysql://root:root123@192.168.89.71:3306/testyyy/mttable'; 

CONNECTION 的账户密码 IP ,库表路径反复核对过多次,不会错,
MySQL8 上新建的 ln_mt 表,和 MySQL5 服务器上的表完全一致,
MySQL8 上安装默认使用了 CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
而 MySQL5 服务器上默认的是 DEFAULT CHARSET=utf8 ,这个应该不会是 handshake 失败的原因吧?
请教这个表外映射失败的原因会是什么呢?
"Unable to connect to foreign data source: Bad handshake"

怎么理解操作系统的 Peterson 算法的特殊情况

Posted: 09 Apr 2022 10:18 AM PDT

1649519892_1_.jpg 我理解正常一个进程的程序是这样写的:

int number; enter_region(number); 这里是临界区的操作; leave_region(); 

当进程 0 执行了 enter_region(0);,但还没有执行 leave_region 时。此时进程 1 去执行 enter_region(1);,会发现:

  • 不仅turn == process成立了(我理解,这代表当前进程正在请求)
  • 而且 interested[other] == True 所以进程 1 要进入这个无限循环,直到进程 0 执行 leave_region 。

1649522343.jpg 但是现在有这种特殊情况:

  • 都运行到 while 语句前时,turn 这个全局变量被设为 1 ,因为进程 1 后执行
  • 然后进程 0 ,由于不满足turn == process&&interested[other] == True的第一个条件,直接短路,然后不执行这个循环,然后进程 0 进入到 临界区。
  • 我的疑惑点在于:为什么turn == process不成立,就直接短路,然后就让当前进程去临界区了呢(虽然确实是正常工作了,这之后,进程 0 进入临界区,进程 1 则无限循环了)?总感觉有点反直觉,不知道该怎么解释
    • 感觉正常情况的话,应该是如上的:turn == process成立,但interested[other] == True不成立。

udemy 上的课无法截图,是怎么做到的?

Posted: 09 Apr 2022 09:26 AM PDT

试了好多种方法,snipaste ,windows 截屏键,还有 OBS 录频,都是一片黑色,好神奇

发现一个远程桌面串流神器,还可以当远程桌面。好流畅!延迟好低!但是有一点小问题

Posted: 09 Apr 2022 09:03 AM PDT

今天无意间刷到一个远程串流软件,parsec 。原理类似 steam link ,可以远程串流电脑画面,比一般的远程软件流畅很多很多,因为非常流畅。所以很多人拿来远程办公。在线剪辑这些的,于是我就试了一下。

Linux 客户端官方只做了 ubuntu 的兼容,而我用的是 manjaroKDE + Mac 。装的这个 yay -S parsec-bin

现在的问题是,Linux 可以连 Mac ,但是 Mac 不能连 manjaro ,因为 Linux 没有 host 这个模式(没有相关设置选项),host也就是说没办法当主机,只能当客户端连接别人,不能被连接,很喜欢这个软件,有办法解决吗?或者有没有类似的软件?

mac 是 bugsur + amd 的显卡。manjaroKDE 是 gtx1070 显卡

被 golang 坑了一下午, win 平台无法正常调用外部程序看这里。

Posted: 09 Apr 2022 08:54 AM PDT

很简单的调用:

cmd := exec.Command( "TeraCopy.exe", fmt.Sprintf(`*"%s" "%s"`, copyPaths, targetDir) ) err := cmd.Start() 

报错:

---------------------------  TeraCopy - Error --------------------------- File not found: \e:\**\tc.tmp \E:\**\b\ --------------------------- 确定    --------------------------- 

??? 啥玩意 ???

本着出了问题先找自身原因的混帐话优良传统,控制台与 TeraCopy 软件试了各种参数,都正常……

感觉是转义出了问题,谷歌了半天,除了复制粘贴就没别的了。

米田共里淘金终于发现了一片文章:Go 在 windows 上调用本地进程传参时的一个天坑

MD ,最终 tm 还是 go 的问题,一直不敢往那想,属实被喷怕了。 摘抄一下:

On Windows, processes receive the whole command line as a single string and do their own parsing. Command combines and quotes Args into a command line string with an algorithm compatible with applications using CommandLineToArgvW (which is the most common way). Notable exceptions are msiexec.exe and cmd.exe (and thus, all batch files), which have a different unquoting algorithm. In these or other similar cases, you can do the quoting yourself and provide the full command line in SysProcAttr.CmdLine, leaving Args empty.

反正我看不懂,看人家的解释:

也就是说,针对 cmd 参数加的引号参数会有不同的逻辑,必须在 SysProcAttr.CmdLine 中写入原始参数了,但是 Args 留空,又会导致 SysProcAttr 值为 nil ,所以简单赋值也是不行的

改了一下代码:

cmdLine := fmt.Sprintf(`copy *"%s" "%s"`, copyPaths, targetDir) cmd := exec.Command("TeraCopy.exe") cmd.SysProcAttr = &syscall.SysProcAttr{CmdLine: "/c " + cmdLine} err := cmd.Start() 

解决。

学习 go 一段时间,觉得它的开发者很矛盾,比如三元运算符,很多人都想要它,但官方却以语法统一、可能会导致阅读困难之类的理由推脱。 但

return r ? true : false 

不比你 if 要整洁易读? 对多字节的处理也很费劲,我到现在不知道怎样查找某个中文的位置,IndexRune 报错,也没谷歌到答案

fmt.Println(strings.IndexRune("学习", "习"))   Error ./prog.go:9:42: cannot use "习" (untyped string constant) as rune value in argument to strings.IndexRune 

是不是有人要说,爱用用,不用滚呢?

SQL Style

Posted: 09 Apr 2022 08:31 AM PDT

读《SQL for Data Analysis》,作者推荐的 SQL style ,觉得还挺有借鉴意义的。

"There is no single universally accepted SQL style, but you may find the SQL Style Guide and the Modern SQL Style Guide useful."

paddlehub 使用 pyzmq 作为 GPU 服务后台是有什么独特的作用吗?

Posted: 09 Apr 2022 07:57 AM PDT

在学习 paddlehub 的服务部署,其中使用 gpu 实现服务时使用的是 ZMQ+FLask( https://github.com/PaddlePaddle/PaddleHub/issues/1726),这样处理是可以更好地以队列形式处理信息吗?

因为没用过消息队列,zmq 有可能被 kill 吗,是否应该加监听保证服务及时重启?

如何实现多线程计算组合数

Posted: 09 Apr 2022 07:49 AM PDT

现在我想计算 80 里面取 20 个数的所有组合可能, 这个数据量比较大, 计算比较耗时, 享用多线程计算应该会快, 但是不知到多线程怎么写这个程序

https://stackoverflow.com/questions/9430568/generating-combinations-in-c

计算方法参考的这个链接

#include <iostream> #include <algorithm> #include <vector>  int main() {     int n, r;     std::cin >> n;     std::cin >> r;      std::vector<bool> v(n);     std::fill(v.end() - r, v.end(), true);      do {         for (int i = 0; i < n; ++i) {             if (v[i]) {                 std::cout << (i + 1) << " ";             }         }         std::cout << "\n";     } while (std::next_permutation(v.begin(), v.end()));     return 0; } 

ASP.NET Core 通过 antiForgery.GetAndStoreTokens 生成的 CSRF Token 会被存储在服务器上吗?还是随机生成,仅校验是否和请求头相同?对所有 API 请求 verify 并 rotate

Posted: 09 Apr 2022 07:29 AM PDT

ASP.NET Core 通过 antiForgery.GetAndStoreTokens 生成的 CSRF Token 会被存储下来吗?还是随机生成,仅校验是否和请求头相同?对所有 API 请求 verify 并 rotate CSRF Token 对性能影响多大?

Python 绘图的时候像这个图里面的两个竖线之间的双箭头是怎么加的?

Posted: 09 Apr 2022 06:44 AM PDT

就是这两个竖线之间,一个双箭头,然后右边有个数字表示距离

8pUrqZBosnRHim3

文字我知道可以用plt.text

这个双箭头是有什么函数么

生产环境 Redis 连接,长时间无响应被服务器断开问题

Posted: 09 Apr 2022 06:00 AM PDT

上个月线上生产环境有几个接口出现异常响应,查看生产日志后发现,如下错误 线上日志

线上 Redis 客户端使用的是SpringBoot默认的Lettuce客户端,并且没有指定连接池,connection reset by peer这个错误是当前客户端连接在不知情的情况下被服务端断开后产生,也就是说当前客户端 Redis 连接已经在服务端断开了,但是客户端并不知道,当请求进来时,Lettuce继续使用当前 Redis 连接请求数据时,就会提示connection reset by peer

一般情况下服务端断开连接都会发送FIN包通知客户端,但是当我在用tcpdump监控服务端 tcp 传输后,发现 Redis 服务端 tcp 连接在无活动一段时间,比如 10 分钟后会收到来自客户端的RST包,然而我的客户端也在使用 wireshark 抓包中,并没有发送给服务端RST包,这就很奇怪了,猜测这里是可能是服务器对 tcp 连接的限制导致,对长时间无活动的 tcp 连接强制断开处理。所以这里线上环境 Redis 连接偶尔产生connection reset by peer错误是被我复现出来了。

既然这里知道是 Redis 连接长时间无活动后被断开导致的 bug ,那怎么解决?

博主一开始以为重试可以解决,但是发现事情没有想象的简单。上代码

   // 查询 Redis     public <T> T getCacheObject(final String key) {         try {             ValueOperations<String, T> operation = redisTemplate.opsForValue();             return operation.get(key);         } catch (Exception e) {             log.error(e.getMessage(), e);             return retryGetCacheObject(key, 3);         }     }    // 重试查询 Redis     public <T> T retryGetCacheObject(final String key, int retryCount) {         try {             log.info("retryGetCacheObject, key:{}, retryCount:{}", key, retryCount);             if (retryCount <= 0) {                 return null;             }             Thread.sleep(200L);             retryCount--;             ValueOperations<String, T> operation = redisTemplate.opsForValue();             return operation.get(key);         } catch (Exception e) {             log.error(e.getMessage(), e);             return retryGetCacheObject(key, retryCount);         }     } 

上面代码的意思是第一次查询 Redis 发生异常后,每隔 200 毫秒在查 3 次。当实际运行时,发现这里会提示三次connection reset by peer错误,一直没有取到新的 Redis 连接。

到这里这个问题的我的解决思路其实就是怎么在 Redis 连接发生异常后,怎么创建一条新的连接进行代替。

不多说直接上代码:

    // Lettuce 连接工厂     @Autowired     private LettuceConnectionFactory lettuceConnectionFactory;      /**      * 获得缓存的基本对象。      *      * @param key 缓存键值      * @return 缓存键值对应的数据      */     public <T> T getCacheObject(final String key) {         try {             ValueOperations<String, T> operation = redisTemplate.opsForValue();             return operation.get(key);         } catch (Exception e) {             log.error(e.getMessage(), e);             return retryGetCacheObject(key, 1);         }     }      public <T> T retryGetCacheObject(final String key, int retryCount) {         try {             log.info("retryGetCacheObject, key:{}, retryCount:{}", key, retryCount);             if (retryCount <= 0) {                 return null;             }             lettuceConnectionFactory.resetConnection();             Thread.sleep(200L);             retryCount--;             ValueOperations<String, T> operation = redisTemplate.opsForValue();             return operation.get(key);         } catch (Exception e) {             log.error(e.getMessage(), e);             return retryGetCacheObject(key, retryCount);         }     } 

在用当前 Redis 连接获取数据发生异常超过timeout间隔后,抛出异常,进入重试方法,使用 lettuceConnectionFactory.resetConnection()方法进行连接重置,创建一条新的连接后,继续获取数据,从而正常响应客户端。lettuceConnectionFactory对象是对Lettuce无池化连接的工厂实现,提供了 lettuceConnectionFactory.getConnection(); lettuceConnectionFactory.initConnection(); lettuceConnectionFactory.resetConnection();等获取、初始化、重置连接的方法

配合springboot配置timeout将获取数据的超时时间设置为 2 秒,从而将接口请求耗时也控制在 2 秒左右

  redis:     xx: xx     timeout: 2000 

到此生产环境这里SpringBoot项目下Lettuce客户端无池化连接偶尔断开的 bug 算是解决了

最后贴一下实战项目地址newbeemall,newbee-mall 商城的 mybatis plus 版本 实现了优惠卷领取, 支付宝沙箱支付,后台添加搜索,RedisSearch 分词检索

关于博客图片存储方案问题,直接保存在博客所在服务器、用第三方对象存储还是单独买一个便宜的服务器自己部署 OSS 服务?

Posted: 09 Apr 2022 04:43 AM PDT

如题,之前是 gitee ,后来用不了了,只能考虑用其他方案

有没有什么 APP 能将骑行的所有轨迹汇集到一张地图上?

Posted: 09 Apr 2022 02:47 AM PDT

有没有什么 APP 能将骑行的所有轨迹汇集到一张地图上?
现在用的是行者,每条记录的路线,都是分开的。
每条记录点击去后,会有此次的路线记录

我想要的是把自己所骑行过的路线,汇集在一张地图上。
这样可以看到自己已经探索了城市的哪些角落,还有哪些地方没有探索。
成就感会好很多。

DataGrip 里使用脚本生成数据库

Posted: 09 Apr 2022 02:19 AM PDT

我现在在用 DataGrip,自己写一个 js 脚本文件,为数据库里所有表重成一个 Model 类.能运行,但用起来不太爽,主要是没有语法提示.甚至找不到一个帮助文档介绍一下 DataGrip 脚本引擎能提供的对象模型,只是照着例子琢磨,有没有高手介绍一下,是否有详细的文档,或者更好的做法?

LotusDB 设计与实现—1 基本概念

Posted: 09 Apr 2022 02:11 AM PDT

LotusDB 是一个全新的 KV 存储引擎,Github 地址:https://github.com/flower-corp/lotusdb,希望大家多多支持呀,点个 star 或者参与进来!

LotusDB 是一个基于 LSM Tree 进行设计,并结合 B+ 树优势的单机 KV 存储引擎,读写性能稳定、快速。

在传统的 LSM Tree 架构中,增删数据均是追加有序写入到 SST 文件中,相同的 key 对应的数据可能存在多份,需要通过复杂的 compaction 策略来进行空间回收,这同时带来了空间放大和写放大问题。

LSM Tree 在磁盘上维护多级 SSTable 文件,在数据读取时,需要逐层扫描文件来查找指定的数据,最坏情况下需要扫描每一层的 SSTable ,读性能不稳定。

和 LSM Tree 相对应的,另一种常见的数据存储模型是 B+ Tree ,B+ 树由于有着很好的适配磁盘页的特性,在数据库存储引擎中广泛应用,例如最为人熟知的 Mysql 的 InnoDB 引擎。

B+ Tree 将数据维护在树最底层叶子节点中,读性能比较稳定,但是数据的插入和更新均是随机 IO 进行写入,导致 B+ Tree 的写性能相对较低。

我们知道,LSM 存储模型诞生于 HDD (机械硬盘) 时代,HDD 的随机和顺序读写速度差别巨大,所以 LSM 的设计最大限度的发挥了顺序 IO 的优势,所有的数据先到内存 buffer 里缓存,然后批量有序写入到文件中。但是随着存储硬件的更新迭代,磁盘的随机和顺序读写差别变小了,在一些介质中,顺序和随机读写甚至没有太大的差别。

LSM Tree 针对顺序 IO 的一些设计就会显得过于复杂,导致整个系统难以实现和控制(如果你熟悉 rocksdb 的话,就会深有体会)。

自行设计一个系统的底层存储引擎,比掌握一个复杂的项目要更加容易,出现了相关的问题也更容易定位和解决,这也是为什么 cockroach 采用自研的 Pebble 存储引擎替代 rocksdb ,而 LotusDB 就是一个这样可以轻易学习和掌握的存储引擎,因为它简洁、直观且高效。

LotusDB 的整体架构图如下: design-overview.png

LotusDB 仍然保留了 LSM Tree 中的写流程,因为这能够最大限度的保证写入数据的持久性以及写吞吐,所以在磁盘上维护了 WAL 日志,新写入的数据先追加到 WAL 中保证数据不丢失,然后再写入到内存中。 内存中维护了多个跳表结构,最新的跳表叫做 active memtable ,一个 memtable 写满之后,会变为 immutable memtable ,即不可变的 memtable ,其不能接收新的写入,并且等待被后台线程 flush 到磁盘中。

Flush 的时候,数据索引信息会被存放到 B+ 树中,而 value 会被单独存放到 Value Log 中,value log 的结构类似于 WAL ,数据写入都是采用日志追加,只不过 value log 会有一个阈值,写满之后会打开一个新的 value log ,因此 value log 是存在多个的。

需要注意的是,B+ Tree 应该尽量存储新的存储介质中,例如固态硬盘,因为前面提到过 B+ 树是随机写入,如果使用传统机械硬盘的话,写性能受限制,写放大严重,Flush 可能会是一个瓶颈。

这就是 LotusDB 的整体实现,在这种实现下,我们来看看基本的数据读写流程是什么样的。 写一个 key/value:前面说过了,和 LSM 模型完全一致,先将 key/value 封装成一条日志追加到 WAL 中,然后将 k/v 写入到内存的 active memtable 。 根据 key 读一个 value:先在内存当中的 active memtable 和 immutable memtable 中依次查找,如果找到直接返回。否则说明 value 可能在磁盘中,就从 B+ 树获取 key 的索引信息,索引信息是一个二元组 <fid, offset>,标识 value 位于 value log 中具体哪个文件,以及文件中的位置,然后直接根据这个索引信息到 value log 文件中获取 value 即可。

最后再来总结下 LotusDB 架构的优点,简单归纳大概有如下几点: 1 、写数据流程和传统 LSM 模型完全一致,保证了顺序 IO 的高吞吐,以及数据持久性 2 、读性能相较于原生 LSM 模型更加稳定,读放大降低,因为引入了 B+ 树,得益于 B+ 树稳定的读性能,整体的读取效率会更加可控 3 、完全去除了 LSM Tree 模型中的多级 SSTable ,没有了 SSTable 的维护,并且采用已有的 B+ 树实现( BoltDB ),大大降低了系统的复杂性 4 、Compaction 对存储介质的损耗降低,LotusDB 中只有 value log 存在 Compaction ;原生 LSM 不仅 SSTable 需要 Compaction ,并且如果进行了 kv 分离的话,value log 也同样需要 Compaction 5 、读写流程简洁直观,没有 bloom filter 、block cache 等


LotusDB Github 地址:https://github.com/flower-corp/lotusdb

Java 有什么非业务性的工作吗?

Posted: 09 Apr 2022 01:12 AM PDT

本人一直在做 Java Web 相关的业务开发。由于本人很喜欢 Java 这个语言,所以想着,如果不做业务开发,还能有什么工作是和 Java 相关的。

比如:

  • JVM 的开发?
  • 各种优秀的 Java 工具:比如 ES ,Kafka 、Hadoop 、Spring 等等。

我的问题是,国内能找到哪些工作呢,比如 JVM 的开发,哪些公司需要吗,能远程吗,成都有类似工作机会吗(本人在成都,并不想去外地)。

上面那些著名的框架、工具,都是开源项目,并不像商业公司那样(选商业公司是因为还是需要赚钱养家糊口)。

当然,本人还有个想法是,做业务开发似乎有传说中的 35 岁危机(本人 31 ,还没经历到,所以是传言),做这种底层的项目,应该就没有这类问题,这也是一个原因。

有没有类似 txt2re 的网站

Posted: 09 Apr 2022 12:57 AM PDT

有没有类似 txt2re 的网站

txt2re 可根据你提供的字符串,由你自己选择匹配那些字符,且按照什么模式去匹配,然后就可以获得一个表达式。

https://txt2re.com/index3_s_42_43_2.html 网站停止服务了,找了几个都不好用。

算法工程师的开发环境都是什么样的?

Posted: 08 Apr 2022 10:57 PM PDT

各位算法工程师,你们平时在公司内部开发模型,做实验,上线模型的环境是什么样的?方便分享一下经验吗? 我们最近想在内部统一开发环境,这是我们初步的构想:

  1. 使用 jupyterhub 跑在 k8s 上为多位工程师自助式提供 jupyter 的环境
  2. 提供若干个常见的算法开发镜像,启动 jupyter 环境的时候可以选择( tensorflow ,pytorch 之类的)
  3. 使用 GPU 设备插件,来像算法同事提供带 GPU 的环境
  4. 鼓励大家使用 mlflow 来管理实验
  5. 使用kubeflow pipeline和 notebook 中的elyra 插件来使用多个 notebook 构建复杂的算法流程,方便重复实验
  6. 批量推理的话也是使用 kubeflow pipeline 来完成
  7. 在线推理的话使用kserve通过写 yaml 的方式完成

这套东西看起来很美好,就是组件比较多,比较大的依赖 kubeflow 这个项目,这个项目的成熟度不知如何。

不知道大家有什么最佳实践可以分享吗?公司属于中小规模,没有什么历史负担。已经在使用 k8s ,业务主要是提供各种定制化的 AI 服务 API ,所以对上线速度和开发效率比较看重。

谢谢

请教大佬: mongo4.2 多个事务修改 document 报 WriteConflict

Posted: 08 Apr 2022 08:44 PM PDT

ps:我的业务确实要并发修改同一个 document 我看网上有两种解决方案

1.比如修改 maxTransactionLockRequestTimeoutMillis=36000000 
2.应用层限制,比如实现排队系统 

请问大佬有什么好的建议吗,感谢感谢

ASP.NET Core 的 Cookie Authentication 使用的是什么密钥加密存在 Cookies 用户数据?安全性怎么样?

Posted: 08 Apr 2022 06:59 PM PDT

enchilada 如何看电池健康度

Posted: 08 Apr 2022 02:24 PM PDT

感觉 enchilada 的电池不经用了,又找不到哪里看电池健康度,哪位高手介绍一下。

CPU 指令重排是 cache 同步太慢的表征么?

Posted: 08 Apr 2022 02:08 PM PDT

最近想加深一下对 CPU core 之间的缓存同步,内存模型的理解,读了一些文章。在此之前,我知道除了编译器以外,多核 CPU 也是可以对指令进行重排的,比如下图中两个核心的指令,如果没有重排的话,r1 == 0 && r2 == 0是不可能发生的,

实际情况下,CPU 是可以把指令重排成如下顺序,以至于r1 == 0 && r2 == 0是可能发生的,

但标准又说了,在单核的情况下,这种重排是不可能发生的。由此我联想到了 MESI 协议,CPU 在不同核之间,MESI 协议保证了缓存生效 /失效。

请问是否可以这么理解,CPU 某个核心上的指令重排现象(上图 CPU2 上)是否只是因为 MESI 消息太慢导致的的表征?实际上 CPU2 还是按照既定的指令顺序执行,还是说 CPU2 真的就是调换了两个指令的顺序呢?

cs 架构的程序,数据库连接串都是如何加密的?

Posted: 08 Apr 2022 12:41 PM PDT

1 cs 架构,数据库连接串要保存在本地,或者放在 web 上。base64 太弱了。aes 或者 des 也很容易破解吧,因为你要告诉程序如何解密吧。rsa 类似,密钥要写在程序里。如何防止数据库访问用户名密码被破解?

如何把一段简单的代码变复杂?

Posted: 08 Apr 2022 12:34 PM PDT

这问题你应该去问企业级 Java 架构师。

就比如 print 一句 hello world 吧。main 函数里 print 一下?太面向过程,太 low 了。

得封装一个类。叫 Printer. Printer 有个成员方法,叫 print 。

但是!光一个类太 low 了,以后要是有不同的实现怎么办?所以得加一个接口。PrinterInterface 。

但是! interface 是没有实现的,还是要有默认实现才行。所以得加个虚拟类,AbstractPrinter 实现 PrinterInterface ,然后 Printer 继承 AbstractPrinter 。

但是!你有了那么一套,该怎么创建实例呢?直接 new Printer()?太 low 了,那叫实现依赖。肯定不行的,所以要搞一个工厂类,PrinterFactory ,PrinterFactory 用 PrinterInterface 返回实例,这样就隐藏了实现细节了。

但是! PrinterFactory 本身也是实现类啊,太 low 了,所以得有 PrinterFactoryInterface, AbstractPrinterFactory.

而且在 PrinterFactory 里面该怎么写呢?直接 new Printer()? 太 low 了。还是实现依赖。

最后,你要把这一堆玩意在代码里组装起来,也太难看了,各种 new 实现类。太 low !

好在我们有个高级玩意,叫依赖注入!把程序对象结构全写到配置文件里面。这一套当然是不能自己造轮子的。配置 Spring 吧。搞了那么多 lib ,靠命令行或者 IDE 的项目管理肯定不够啊,得有依赖管理。Maven 啊 Gradle 啊使劲上。

最最后,要 print 的东西怎么传给程序呢?硬编码?命令行传参数?太 low !当然得写在 XML 里头。

光是 XML 当然还不够企业级,再加上 DTD 验证吧。

然后就涉及到了 XML 解析的问题了。代码里直接操起 parser 吗?太 low! 当然要写个 parser 的包装类,interface, abstract class, implementation class, factory class 再来一套。毕竟,不能依赖实现啊,以后我要是换 parser 了怎么办。

所以最后是成品是一堆配置文件,一堆 jar ,compile 出来的程序 200MB 。

IDE 得装上 300 个插件,打开项目硬盘响老半天吃掉 2GB 内存,然后一堆插件弹提示要求升级。

哦对了,在这一切发生之前,还得画 UML 图呢。

三年后项目完工了,部署到客户的服务器上一跑,立马崩溃,一地的 stack trace 。原来客户服务器上用的是 JDK 5 而新项目需要 JDK 6. 然后问客户你们不能升级吗,答案是不行,因为另外一个企业级开发组给做的企业级解决方案只支持 JDK 5 。接着客户把你们的架构师臭骂了一顿,你搞了那么多设计就没有想过可能会换 JDK 吗?

电信 1000M 跑满的上网科学是如何做到的?

Posted: 08 Apr 2022 09:35 AM PDT

为啥可以那么牛,还那么嚣张? 没人管吗?

https://i.sw15.icu/gHV

请教大佬: mongo4.2 多个事务修改 document 报 WriteConflict

Posted: 08 Apr 2022 08:09 AM PDT

ps:我的业务确实要并发修改同一个 document 我看网上有两种解决方案 1.比如修改 maxTransactionLockRequestTimeoutMillis=36000000 2.应用层限制,比如实现排队系统

请问大佬有什么好的建议吗,感谢感谢

不知道大家有没有遇到这种渲染 bug

Posted: 08 Apr 2022 08:06 AM PDT

因为暂时没法主动复现,所以不能截图,我尽量描述得清楚一点。。

举一个例子,比如下面是一行代码,"|"表示光标所在的位置。

abcd|efg 

这时候按一次BackSpace (退格键),就直接变成这样了:

ab| 

这时候输入任意一个键,比如".",就又会变成这样:

abcdefgbalabala.| 

感觉就是实际的内容和 vscode 渲染出来的不一致,紊乱。然后 reload window 一下就又好了。

装了很多插件。。也可能是 neovim 插件的问题,这 bug 偶尔触发所以一时半会也没法排错

国产安卓系统是不是都不内置 FCM?

Posted: 08 Apr 2022 07:15 AM PDT

第一次玩国产 ROM 。我的联想拯救者 Y700 运行的是联想 ZUI 13 。我可以直接从 ZUI 应用商店安装 Google Play ,然后从 Google Play 安装各种 app ,但是安装的 GMail 、Telegram 等等都只能在后台运行的状态下接收推送通知。是不是国产安卓都不带 FCM ?我看 Google Play Services 也是安装了的。有办法不用在后台跑 app 接收推送通知么?

如何编写代码才能实现这种关联

Posted: 08 Apr 2022 06:56 AM PDT

比如有 django model 类

 	class Table(models.Model): 		mgr = models.ForeignKey(to=Manager, ..          

有 Table 类对象 tab ,我们在调用 tab 的 mgr 属性时
Pycharm 能够提示出 tab.mgr_id ,请问这种提示是怎么做到的?
是因为ForeignKey中实现了什么方法吗,还是 Pycharm 专门针对 django 做了优化提示呢

Vue 3 的服务端与异步数据获取

Posted: 08 Apr 2022 06:06 AM PDT

最近项目才上线, 打算修一下 SSR 半残的状态. 以下内容是根据实践得出的结论, 不过我还是有点迷糊, 所以分享出来给大家看一下, 如果有错误或者有什么想法可以在下面指正.

内容基于使用 setup script 的情况.

几个基本点:

  1. SSR 渲染时, 生命周期钩子里只有 beforeCreate 和 created 会被触发. 意味着你不能在其他钩子里执行获取数据的逻辑.
  2. SSR 渲染时, 响应式变量不会被触发更新, 渲染状态以逻辑执行时的数据为准. 意味着如果你使用空数据占位, 等到数据到达时更新数据的做法会在 SSR 时失效.

几个建议:

  1. 如果你在用响应式变量控制组件的加载状态(isLoading), 替换成Suspense和 Async Setup. 因为isLoading不会触发组件更新, 最后即便你获取到了数据仍然可能渲染出一个骨架屏.
  2. 不要通过监听响应式变量的值变化来控制 Async Function 的挂起状态. 同样是出于响应式变量不会更新的原因, 使用响应式变量挂起和恢复 Async Function 不会起作用, 如果以这种方式去控制 Async Setup, 那么就会导致渲染死锁, 而且如果没有经验, 你几乎难以找到死锁的原因, 因为这样做在客户端是能够正常工作的, 但是在服务端是不行的.
  3. 如果你想往子组件里 Provide 你的异步数据, 请使用注入一个Ref<Promise<T>>, 而不是Ref<T | undefined>, 通过 Promise, 同样还是因为响应式变量不会触发更新, 你只能通过注入 Promise 并 await 他以挂起 setup 函数, 以确保组件被渲染时数据不为空.

腾讯公共 ntp 升级了

Posted: 08 Apr 2022 05:01 AM PDT

新域名 ntp.tencent.com
境内解析到广州 139.199.215.251
境外解析到香港 119.28.230.190
stratum = 3

看起来同步效果还是比较好的

做了一个干货 Top 文章榜,求星

Posted: 08 Apr 2022 03:12 AM PDT

No comments:

Post a Comment