Saturday, April 16, 2022

V2EX - 技术

V2EX - 技术


[吐槽]为何 iOS 闲鱼越更新越卡?

Posted: 16 Apr 2022 04:42 AM PDT

这几年闲鱼的流畅度丝毫没有改善,反而越来越卡,掉帧严重,毫无过度动画可言。这是大厂的产品么?

GV 号注册的今日头条,无法发短信验证

Posted: 16 Apr 2022 04:34 AM PDT

登录说安全问题,让我发短信验证,但是 GV 应该是无法发短信给+86 吧?
号废了?

我的 bilibili 主号也用 GV ,还是大会员,万一哪天让我发短信验证岂不是也废了?

有没有一个命令可以把如下输出转成表格形式的?

Posted: 16 Apr 2022 04:15 AM PDT

# ethtool -i <网卡名> driver: tun version: 1.6 firmware-version: expansion-rom-version: bus-info: tap supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no 

我想要的功能如下:

# ethtool -i <网卡名> |nbcmd driver | version | firmware-version | ... tun    | 1.6     |                  | ... 

看了一下 column 命令太傻了,好像不支持这种行内解析。

当然,如果类似 xargs 这种方式就更好了

awesome_cmd ethtool -i <网卡名> input 1  | driver | version | firmware-version | ... 网卡名    | tun     | 1.6     |                  | ... 

大家好,请教红米 k40 的 Google play 商店版本不会自己更新怎么解决?

Posted: 16 Apr 2022 04:09 AM PDT

大家好,请教红米 k40 的 Google play 商店版本不会自己更新怎么解决? 试过几个办法都不行是不是手机自带的下载器有问题。 每次在设置里面按更新都是最新版本。 我的另一个手机刷了国际版里面的谷歌商店已经更新了。

谢谢大家.

关于 Spring 5 的 WebClient 的困惑

Posted: 16 Apr 2022 03:22 AM PDT

公司新项目用上了 JDK 17 + Spring 2.6.6 。发现 Spring 5 新增了 WebClient 类,使用非阻塞 IO 、支持函数式编程等等一大堆优点。但是使用时,很多跟 Apache HttpClient 那一套有太多不同。

想问问各位大佬,有没有关于 WebClient 的最佳实践?

另外,如果要使用 WebClient 封装一个通用的 HttpClient 类,要注意什么?

LotusDB 设计与实现—2 WAL 日志

Posted: 16 Apr 2022 02:44 AM PDT

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

WAL 是 Write Ahead Log 的简称,通常叫做预写日志,是为了预防内存崩溃,保证数据不丢失的常用手段。WAL 是 LSM 存储模型中重要的组件,在 LotusDB 当中的重要性是一样的。 design-overview.png 试想一下,如果没有 WAL ,写入的数据直接到内存的话,由于内存是易失性的,崩溃之后数据无法恢复,如果数据写到一半发生了这种情况,会造成数据不一致甚至丢失,在一个系统底层的存储引擎当中,这通常是不可接受的。

日志结构的数据文件一般是追加写的,WAL 也是一样。在 LotusDB 当中写入 k/v 时,会先将数据封装成一条日志项 LogEntry ,并将其追加到 WAL ,日志项 LogEntry 的结构体定义如下:

// LogEntry is the data will be appended in log file. type LogEntry struct { 	Key       []byte 	Value     []byte 	ExpiredAt int64 // time.Unix 	Type      EntryType } 

写入前需要将 LogEntry 结构体进行编码,然后再追加到文件中,编码后主要包含 key 、value 信息,还有对应的长度 size 信息,以及对整条数据有效性做校验的 crc 值,格式如下:

// EncodeEntry will encode entry into a byte slice. // The encoded Entry looks like: // +-------+--------+----------+------------+-----------+-------+---------+ // |  crc  |  type  | key size | value size | expiresAt |  key  |  value  | // +-------+--------+----------+------------+-----------+-------+---------+ // |------------------------HEADER----------------------| //         |--------------------------crc check---------------------------| 

编码后的数据写到 WAL 时,LotusDB 提供了两种 IO 模式:系统标准 IO 和 mmap ,可在打开数据库时通过配置项进行选择,LogFile 结构体定义的 IoSelector 负责实现:

// LogFile is an abstraction of a disk file, entry`s read and write will go through it. type LogFile struct { 	sync.RWMutex 	Fid        uint32 	WriteAt    int64 	IoSelector ioselector.IOSelector } 

LogFile 是操作文件数据读写的结构体,其中最重要的是 IoSelector ,它是一个 interface ,负责具体的读写操作,具体的实现有 FileIO 和 MMap 。

// IOSelector io selector for fileio and mmap, used by wal and value log right now. type IOSelector interface { 	// Write a slice to log file at offset. 	// It returns the number of bytes written and an error, if any. 	Write(b []byte, offset int64) (int, error)  	// Read a slice from offset. 	// It returns the number of bytes read and any error encountered. 	Read(b []byte, offset int64) (int, error)  	// Sync commits the current contents of the file to stable storage. 	// Typically, this means flushing the file system's in-memory copy 	// of recently written data to disk. 	Sync() error  	// Close closes the File, rendering it unusable for I/O. 	// It will return an error if it has already been closed. 	Close() error  	// Delete delete the file. 	// Must close it before delete, and will unmap if in MMapSelector. 	Delete() error } 

LotusDB 中的一个 WAL 和 一个 memtable 绑定,从 memtable 的结构体定义就能够体现出来:

type memtable struct {     sync.RWMutex     sklIter      *arenaskl.Iterator     skl          *arenaskl.Skiplist     wal          *logfile.LogFile     bytesWritten uint32 // number of bytes written, used for flush wal file.     opts         memOptions } 

WAL 文件的大小和跟之相绑定的 memtable 的容量相关,由于 memtable 通常会有一个阈值,写满之后就关闭了,WAL 此时也不会接受新的写入,因此 WAL 文件的容量通常不会无限膨胀。 memtable 中的数据被后台线程 flush 到磁盘之后,并且没有其他的错误发生,WAL 就可以被安全的删除了。

在 LotusDB 启动打开 memtable 的时候,会全量加载 WAL 中的数据,逻辑很简单,就是打开 WAL 文件,然后遍历其中的每条数据,将其应用到 memtable 的跳表数据结构当中,通过这样的方式,达到了 WAL 恢复数据的作用,参考代码如下:

	for { 		if entry, size, err := wal.ReadLogEntry(offset); err == nil { 			offset += size 			// No need to use atomic updates. 			// This function is only be executed in one goroutine at startup. 			wal.WriteAt += size  			// build memtable...             // ... 		} else { 			if err == io.EOF || err == logfile.ErrEndOfEntry { 				break 			} 			return nil, err 		} 	} 

WAL 刷盘策略

数据写到 WAL 文件中,实际上并没有完全落到磁盘,由于操作系统的实现,可能只是到了 page cache ,需要我们手动调用 Flush 才能够真正将数据持久化。

针对 Flush 的策略,LotusDB 提供了两个配置项: 一是在 WriteOptions 中的 Sync ,如果在数据写入时传递了这个 Options 并且将 Sync 设置为 true ,那么写 WAL 完成后会立即 Flush ,这种策略能够保证数据不丢,但性能是最差的。

二是 ColumnFamilyOptions 中的 WalBytesFlush ,表示写入累积到配置的字节后进行 Flush ,可以理解为每 WalBytesFlush 个字节 Flush 一次。这种情况下,如果系统发生异常,最多丢失 WalBytesFlush 个字节的数据。 如果都不设置,则完全交给操作系统,这是默认的策略,性能是最好的,但是如果系统崩溃,丢失的数据可能是最多的。

LotusDB 也提供了手动进行刷盘的方法,用户可以在适当的时候,调用 Sync 方法进行数据刷盘持久化。

其他和 WAL 相关的配置项: ColumnFamilyOptions: WalMMap 是否使用 mmap 进行写入,默认:false WriteOptions: DisableWal 是否禁用 WAL ,默认:false


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

请教一个 C++模板问题 (≥C++17)

Posted: 16 Apr 2022 01:55 AM PDT

有这样一些我无法修改的类(简化一下):

struct SomeComplexBase{     static inline int data_1 = 1;     static inline int data_2 = 2;     // ...     // static inline int data_n = N; };  struct ClassA: SomeComplexBase{  };  struct ClassB {     typedef SomeComplexBase Base; }; 

我自己实现的一个模板函数

void func(){ /*  * 接收 ClassA, ClassB 类型  * 有没有什么模板技巧可以消除 ClassA::data_n, ClassB::Base::data_n 这种不一致的成员访问方式?  * 比如, 可以这样访问成员 NewType::data_n?  *  * if constexpr(std::is_same_v(T, ClassB))的方式纵然可行,  * 但是两个分支代码都是一样的, 仅有以上提到的访问成员不一致的区别, 跟写两个完全重复的模板函数一样.  * */ } 

谢谢各位

想请教各位 v2 shell 脚本比较精通的,被这个问题卡住了.

Posted: 16 Apr 2022 01:50 AM PDT

自己写了个检测宽带公网出口 ip 变化的脚本,并通过企微的群聊机器人通知,想放到后台一直运行,但都是运行了:
nohup sh scriptName.sh > /dev/null 2>&1 & 后 使用 ps - ef | grep scriptName.sh 后显示了一次,在此运行命令就看不到运行了。我用 bash -x script Name.sh 可以运行成功,也可以发起通知,但就是放不到后台执行,不知道哪里出问题了,还请各位大神不吝赐教,小弟在此谢过了. 搜了好多文章也没找到问题原因,要😭了.

pm2 允许多个脚本 为啥日志只有一个脚本的运行记录

Posted: 16 Apr 2022 01:41 AM PDT

使用 pm2 运行了多个脚本 但是为啥每次只看到一个脚本的日志 其他脚本没日志
pm2 logs

路由上做透明代理能不能判断请求源?

Posted: 16 Apr 2022 12:55 AM PDT

迫于内鬼程序多,想着不能把全部的路打通。
比如 win 系统上开 Q 、微之类的会使得各梯更容易坏,更不稳。
而放到虚拟机里面的话则没事。

路由上开全局透明的话,那些终端的请求就默认打通了,
就更容易被拿到节点地址并被直接堵住。
所以还是得判断是从哪里来的,
赵狗 app 及浏览器之类来源的话,就忽略。
其它的才作判断。

能做到吗?

如何只通话转移所有陌生号码?

Posted: 16 Apr 2022 12:37 AM PDT

最近骚扰电话好多,不想接这些电话,有没有办法把所有不在通讯录的号码全部通话转移到其他号码?比如转移到一个空号

设备 未越狱的 iPhone 11

请教 VR 实训以及直播的技术方案

Posted: 16 Apr 2022 12:36 AM PDT

1 、直播系统:直播、电子白板与 PPT 切换、本地资源共享、万人在线、1 对 1 、1 对 n 直播、直播回放; 2 、360 全视角实训教学系统:日常教室授课采用全景智慧教学大屏 ,教师自主直播或授课等场景采用 PC/PAD/手机,全程多台悬挂式 AI 追踪摄像头拍摄,提供线上 360°全方位同步实训教学功能,同时可根据培训需求增加实时实训加血、数据处理、实时答疑、在线测评等功能。

有个项目在跟进,这 2 个模块我们不太熟悉。请问有谁做过吗?咱们私下聊下。

关于 Python 「多进程」「异步」

Posted: 16 Apr 2022 12:12 AM PDT

首先声明,不讨论数据爬取的道德&法律问题,只是一个技术上的尝试。

尝试了一下 python 的多进程或者异步 2 中写法发起网络请求,都没问题。

不过,异步的本质还是一个线程在执行,效率虽然已经很高,但是仍然没有发挥多核优势。对于大量的数据,能否多进程+异步完成?

尝试了下,始终没能成功,网上多进程+同步,或者单进程+异步倒是挺多的,但是多进程+异步相关资料比较少,有大神实践过吗。感谢

用到的异步请求库 httpx

bootstrap-table 回调函数中异步和同步的问题

Posted: 15 Apr 2022 11:18 PM PDT

我想做一个表格,列出用户钱包和其在币安智能链上某个币种的余额 钱包地址全部在 data1.json 中,余额需要实时从链上获取

<link href="https://unpkg.com/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" rel="stylesheet">  <script src="https://unpkg.com/bootstrap-table@1.19.1/dist/bootstrap-table.min.js"></script>  <table   id="table"   data-toggle="table"   data-height="460"   data-url="json/data1.json">   <thead>     <tr>       <th data-field="owner" data-formatter="ownerFormatter">Item Name</th>       <th data-field="balance" data-formatter="priceFormatter">Item Price</th>     </tr>   </thead> </table>  <script>   function ownerFormatter(value, row) {     return '<span>'+value+'</span>';   }    async function balanceFormatter(value, row) {     let wallet_address = row['owner'];     let sss_balance = 0;     //window.abi_json 在其他地方定义     let MyContract = new web3.eth.Contract(window.abi_json,'0xC3028FbC1742a16A5D69dE1B334cbce28f5d7EB3');     //根据 WEB3 文档在线读取某币种余额 ,console.log(sss_balance)是可以正常打印余额的     sss_balance = await MyContract.methods.balanceOf(wallet_address).call();     //返回余额     return sss_balance;   } </script> 

上面的 balanceFormatter 肯定是有错误的. async 返回的是一个 Promise 对象,但是删除 async 和内部的 await 也不行.求助大神....太菜了我

Win10 关闭了在任务栏按钮上显示角标的选项没用

Posted: 15 Apr 2022 09:32 PM PDT

Win10 专业版在 关闭了在任务栏按钮上显示角标的选项没用,任务栏还是有角标,强迫症看着很难受

推荐工具: ExplorerPatcher —— 让 Explorer 的功能回到 Win10

Posted: 15 Apr 2022 07:29 PM PDT

前两天看到有推荐 Start11 的,但是个人感觉用起来不舒服。之后想看看现在有没有比较好的回归全屏开始的工具。对比了几个之后发现 ExplorerPatcher 是最适合个人使用的。 ExplorerPatcher 下载之后双击就会自动安装(之后会导致 explorer 进程重启,可能需要等一下) 之后现在有的功能——回到 Windows 10 的任务栏 /开始菜单;调整 Alt+Tab 的样式;等基于 explorer.exe 的功能

虽然功能很多但是个人用的只有一个:回到 Windows 10 的全屏幕开始菜单。Windows 11 的开始菜单对于大屏幕来说利用率过低。(指 显示所有应用 的页面)

平铺的感觉真好(但是这个不能默认显示 所有应用 有点难受)。

个人还是喜欢 Lanchpad 的风格(但是现有的 Lanchpad 风格 Windows 应用都是以模仿 MacOS 的 Dock 为主的

Github: https://github.com/valinet/ExplorerPatcher

关于抖店定制的问题

Posted: 15 Apr 2022 07:24 PM PDT

比如卖 T 恤的店,有个定制图案的需求,希望客户下单后,有个系统支持收集客户上传的图片和文字,否则需要客服一对一服务,目前没那么多客服。我查了下抖店和字节小程序,目前抖店融合方案是废弃的:https://forum.microapp.bytedance.com/mini-app/posts/5f8ecc1f010ef1022e4cf827

想问下 v 友有没做过类似的功能,有没办法,感谢!

VSCode 右下角一直转圈 “正在加载 IntelliSense 状态” 正常吗?

Posted: 15 Apr 2022 07:23 PM PDT




如题,正常吗?记得以前没有的,没注意什么时候开始一直转。
如果不正常,应该是什么样的,可能什么原因导致一直在加载?

八股文疑问, redis sds buffer 最大长度在 512M 限制?

Posted: 15 Apr 2022 08:57 AM PDT

大家好,之前看网上 redis 相关文档,有提到 sds 最大长度 512M 限制,给出理由是因为 len 的类型是 int ,最长 32 位,最大长度 2**29-1 。

最近查看 redis 源码,6.2.6 版本,sdshdr64 ,最长 2**61-1 , 是否意味着 sds 可以存将近 2E 字节长度的字符串。。。

uint64_t len; /* used */

uint64_t alloc; /* excluding the header and null terminator */

No comments:

Post a Comment