锂电池的充电百分比以及寿命
我的MacBook Pro在闲鱼滞销了
在二手平台上出售我的14寸MacBook Pro M1的时候, 出于诚实,我写了池的健康度为88%.
好多人问了问, 就开始嫌弃电池太差, 就一直没卖出去, 我第一感觉是水果坑我呀, 一直插电用的, 电池都这么不经用.
进入阅读→Clojrue+Dart的使用手册

这是一份<ClojureDart 对 Clojurists 的备忘单>的全文翻译.
本文涵盖了使用 ClojureDart 进行 Dart 编程的多个方面, 包括命令行工具, Dart包的使用, 类型和可空性, 属性访问, 构造函数, Dart的函数签名, 枚举, 类的创建和 Flutter 的使用等.
进入阅读→SQL风格指南
改编自 https://www.sqlstyle.guide Simon Holywell 所著的<SQL风格指南>.
General 一般原则
Do 应该做的事情
进入阅读→Electron前端单元测试框架

框架概述
该单元测试框架旨在提供一套全面的工具集, 专注于前端交互测试, 同时集成了报告生成, 系统管理, 日志收集和通知机制等关键功能. 框架主要由以下两个核心部分组成:
进入阅读→redux-thunk解决react中的异步state数据流
前言
本文适合已有一定基础的react开发者阅读, 主要结合几个实际业务场景解释为什么要用redux-thunk.
常用的Wireshark过滤技巧

IP地址过滤器(IP Address Filter)
这是最基础的过滤器, 用于筛选特定IP地址的数据包. 在Wireshark中, 可以通过输入
ip.addr == [IP地址]来实现. 例如, 如果想查看与IP地址5.1.81.68有关的所有数据包, 可以输入ip.addr == 5.1.81.68.- 源地址和目标地址: 如果只关心源地址或目标地址, 可以使用
ip.src == [IP地址]或ip.dst == [IP地址]. - 拖放功能: 在Wireshark的界面中, 可以直接拖动一个IP地址到过滤器栏, 这样就会自动填充相应的过滤器.
- 源地址和目标地址: 如果只关心源地址或目标地址, 可以使用
子网过滤器(Subnet Filter) 通过使用子网掩码, 可以过滤一个特定的IP地址范围. 例如, 可以使用
ip.addr == 192.168.1.0/24来过滤所有在192.168.1.0到192.168.1.255范围内的IP地址.IPv6过滤器 如果需要过滤IPv6地址, 可以使用
ipv6作为过滤器, 然后从结果中找到感兴趣的地址.统计视图中的过滤 通过进入统计视图(
Statistics -> Endpoints), 可以看到所有的地址, 并可以右键点击一个地址来应用为过滤器.端口号过滤器(Port Number Filter)
这个过滤器用于筛选特定端口号的数据包. 例如,
tcp.port == 80会显示所有使用TCP协议并且端口号为80的数据包.- 多端口过滤: 可以使用
or操作符来过滤多个端口, 例如tcp.port == 80 or tcp.port == 443. - 端口范围过滤: 通过使用
in操作符和大括号, 可以一次性过滤多个端口. 例如,tcp.port in {80, 443, 8000..8005}. - 发送端口过滤:
tcp.srcport == 80 - 接收端口过滤:
tcp.dstport == 80
- 多端口过滤: 可以使用
保存过滤器
Wireshark允许保存常用的过滤器, 以便以后快速使用. 在Wireshark中, 可以保存常用的过滤器表达式并给它们起名字, 以便以后快速使用. 这样, 就不必每次都手动输入复杂的过滤表达式. 以下是如何做到这一点的步骤:
- 输入过滤器: 在Wireshark的顶部工具栏中的" 显示过滤器" 框里输入想保存的过滤表达式.
- 保存过滤器: 旁边有一个小书本图标, 点击它会弹出一个下拉菜单. 选择" 管理显示过滤器(Manage Display Filters)" .
- 添加新过滤器: 在弹出的窗口中, 点击左下角的" +" 按钮来添加一个新的过滤器.
- 命名和定义: 在" 名称(Name)" 字段中输入想给这个过滤器起的名字, 在" 显示过滤器(Display Filter)" 字段中输入或粘贴的过滤表达式.
- 保存: 点击" 确定(OK)" 来保存这个新的过滤器.
- 应用过滤器: 以后, 当想使用这个过滤器时, 可以直接在" 显示过滤器" 框中输入给它起的名字, 或者点击书本图标并从列表中选择它.
TCP会话过滤器(TCP Conversation Filter) 这个过滤器用于查看两个特定端点之间的所有TCP数据包. 这比单独使用IP地址和端口号过滤器更为高级.
- 手动设置: 需要设置两个IP地址和两个端口号来手动创建一个会话过滤器.
- 自动设置: 通过右键单击一个数据包并选择" Follow TCP Stream" , Wireshark会自动设置一个会话过滤器.
多协议过滤(Multi-Protocol Filter) 当想查看多个协议时, 可以使用
or操作符. 例如,tcp or dns会显示所有TCP和DNS协议的数据包.字符串搜索(String Search)
如果想在数据包中查找特定的字符串, 可以使用
contains或matches操作符. 例如,ip contains "London"会查找包含字符串"London"的所有IPv4数据包.matches和contains都是Wireshark过滤器中用于字符串搜索的操作符, 但它们的工作方式有所不同:contains- 功能:
contains用于查找包含特定子字符串的数据包. - 搜索方式: 它执行的是字面匹配, 即直接查找指定的子字符串.
- 示例: 如果使用
http contains "example", Wireshark会找到所有HTTP协议中包含子字符串"example"的数据包.
- 功能:
matches- 功能:
matches用于执行正则表达式匹配. - 搜索方式: 它允许使用正则表达式来定义更复杂的匹配模式.
- 示例: 如果使用
http matches "exa.ple", Wireshark会找到所有HTTP协议中符合正则表达式"exa.ple"的数据包, 这意味着它会匹配"example", "exa1ple", "exa-ple"等.
- 功能:
此外如果想不区分协议, 可以直接制定
eth0 matches "exa.ple"这样可以过滤所有的包.TCP标志位过滤(Tcp Flags Filter)
tcp.analysis.flags是一个在Wireshark中用于过滤TCP分析标志的特殊字段. 这个字段可以帮助识别网络中可能存在的问题, 如重传, 乱序数据包, 窗口更新等. 这些标志是Wireshark在分析TCP流时自动计算和添加的.以下是一些常见的
tcp.analysis.flags选项:- 重传(Retransmission):
tcp.analysis.retransmission - 快速重传(Fast Retransmission):
tcp.analysis.fast_retransmission - 乱序(Out-Of-Order):
tcp.analysis.out_of_order - 重复ACK(Duplicate ACK):
tcp.analysis.duplicate_ack - 窗口更新(Window Update):
tcp.analysis.window_update - 零窗口(Zero Window):
tcp.analysis.zero_window - 零窗口探测(Zero Window Probe):
tcp.analysis.zero_window_probe - 零窗口探测应答(Zero Window Probe Ack):
tcp.analysis.zero_window_probe_ack - 保持活动(Keep Alive):
tcp.analysis.keep_alive - 保持活动应答(Keep Alive Ack):
tcp.analysis.keep_alive_ack
可以直接在Wireshark的显示过滤器框中使用这些标志进行过滤. 例如:
- 想查看所有的TCP重传数据包, 可以使用:
tcp.analysis.retransmission - 只关心快速重传, 可以使用:
tcp.analysis.fast_retransmission - 想查看有多个这样的标志的数据包, 可以组合它们, 如:
tcp.analysis.retransmission || tcp.analysis.fast_retransmission
举个例子
(tcp.analysis.flags) && !(tcp.analysis.window_update)个过滤器在想要查看可能存在问题(如重传或乱序)但不关心窗口更新的TCP数据包时会非常有用.
tcp.analysis.flags: 这部分用于过滤所有带有TCP分析标志的数据包. 这些标志包括重传, 快速重传, 乱序数据包等, 它们是Wireshark在分析TCP流时自动计算和添加的.!(tcp.analysis.window_update): 这部分用于排除所有带有" 窗口更新(Window Update)" 标志的TCP数据包.&&: 这是一个逻辑" 与" 操作符, 用于组合前面两个条件.
- 重传(Retransmission):
tcp payload字节过滤
- 如果我要过滤payload中头两个字节是
0x04 00则tcp.payload[0:2] == 04:00
- 如果我要过滤payload中头两个字节是
保存过滤后的数据(Save Filtered Data)
在Wireshark中, 可以保存过滤后的数据包为一个新的pcap文件. 这是通过" Export Specified Packets" 选项完成的.
对于非常大的pcap文件(如几十GB), Wireshark可能无法有效地处理. 在这种情况下, 建议使用命令行工具, 比如说tshark进行切割.
前端项目配置域名二级目录访问(vue2、vue3、cljs)
一、背景需求
我们开发中会遇到这样的需求,让我们用服务器nginx部署一个用域名的二级目录来访问项目、下面将讲述使用vue2+webpack 和 vue3+vite及cljs 配置二级目录访问(cljs配置比较麻烦,耐心看)
https://xxx/二级目录/来放访问项目
进入阅读→
技术维度与技术选型
尺度差异极大的时候, 物理理论都是不兼容的, 应用于宇宙天文尺度应用相对论, 亚原子领域则只能用量子力学. 架构设计, 技术选型需要重视不同项目的维度差异, 不能生搬硬套.
在软件开发领域,工具的延展性超乎想象。以数据库为例,有几张表, 每个表百十行数据的数据库,也不乏上千个表,含有数百万甚至数十亿行数据的库.
编程语言也是, 可以写几行代码的脚本, 也能写数千万行代码的项目.
进入阅读→C#线程池/JIT/进程的一些使用方法
获取正在使用的线程count
当前进程中的线程数
using System;
using System.Diagnostics;
Process currentProcess = Process.GetCurrentProcess();
Console.WriteLine("Thread Count: " + currentProcess.Threads.Count);
进入阅读→
Emacs29.1的值得关注的几个功能
已经GA了, 在windows和mac上都很值得升级.
可以支持丝滑鼠标滚动, 在此之前只逐行滚动
M-x pixel-scroll-precision-mode更好的长行支持
多年来, 一不小心打开不换行的文件(比如压缩后的js)导致emacs卡住的问题非常烦人, 有时我不得不杀死Emacs, 性能确实好了很多.
更改init目录
现在可以指示Emacs从另一个目录读取其初始化。折腾多个多个Emacs配置的时候,非常有用.
可以重新启动emacs了
M-x restart-emacssqlite-mode 可以打开sqlite文件
M-x sqlite-mode-open-fileuse-package 是emacs的一部分了, 不用再额外安装
eglot
EGlot是功能齐全的LSP模式的精简补充,现在内置在Emacs中。开箱即用
M-x eglot即可开始. Java支持的相当不错.Tree-sitter
Tree-sitter是一个第三方库,可以将您的文本(通常是代码,但也包括Markdown)解析为具体的语法树。这是Emacs 29的标志性功能之一