锂电池的充电百分比以及寿命

我的MacBook Pro在闲鱼滞销了

在二手平台上出售我的14寸MacBook Pro M1的时候, 出于诚实,我写了池的健康度为88%.

好多人问了问, 就开始嫌弃电池太差, 就一直没卖出去, 我第一感觉是水果坑我呀, 一直插电用的, 电池都这么不经用.

进入阅读→

Clojrue+Dart的使用手册

dart

这是一份<ClojureDart 对 Clojurists 的备忘单>的全文翻译.

本文涵盖了使用 ClojureDart 进行 Dart 编程的多个方面, 包括命令行工具, Dart包的使用, 类型和可空性, 属性访问, 构造函数, Dart的函数签名, 枚举, 类的创建和 Flutter 的使用等.

进入阅读→

SQL风格指南

改编自 https://www.sqlstyle.guide Simon Holywell 所著的<SQL风格指南>.

General 一般原则

Do 应该做的事情

进入阅读→

Electron前端单元测试框架

report

框架概述

该单元测试框架旨在提供一套全面的工具集, 专注于前端交互测试, 同时集成了报告生成, 系统管理, 日志收集和通知机制等关键功能. 框架主要由以下两个核心部分组成:

进入阅读→

redux-thunk解决react中的异步state数据流

前言

本文适合已有一定基础的react开发者阅读, 主要结合几个实际业务场景解释为什么要用redux-thunk.

进入阅读→

常用的Wireshark过滤技巧

shark

  1. 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地址到过滤器栏, 这样就会自动填充相应的过滤器.
  2. 子网过滤器(Subnet Filter) 通过使用子网掩码, 可以过滤一个特定的IP地址范围. 例如, 可以使用ip.addr == 192.168.1.0/24来过滤所有在192.168.1.0到192.168.1.255范围内的IP地址.

  3. IPv6过滤器 如果需要过滤IPv6地址, 可以使用ipv6作为过滤器, 然后从结果中找到感兴趣的地址.

  4. 统计视图中的过滤 通过进入统计视图(Statistics -> Endpoints), 可以看到所有的地址, 并可以右键点击一个地址来应用为过滤器.

  5. 端口号过滤器(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
  6. 保存过滤器

    Wireshark允许保存常用的过滤器, 以便以后快速使用. 在Wireshark中, 可以保存常用的过滤器表达式并给它们起名字, 以便以后快速使用. 这样, 就不必每次都手动输入复杂的过滤表达式. 以下是如何做到这一点的步骤:

    1. 输入过滤器: 在Wireshark的顶部工具栏中的" 显示过滤器" 框里输入想保存的过滤表达式.
    2. 保存过滤器: 旁边有一个小书本图标, 点击它会弹出一个下拉菜单. 选择" 管理显示过滤器(Manage Display Filters)" .
    3. 添加新过滤器: 在弹出的窗口中, 点击左下角的" +" 按钮来添加一个新的过滤器.
    4. 命名和定义: 在" 名称(Name)" 字段中输入想给这个过滤器起的名字, 在" 显示过滤器(Display Filter)" 字段中输入或粘贴的过滤表达式.
    5. 保存: 点击" 确定(OK)" 来保存这个新的过滤器.
    6. 应用过滤器: 以后, 当想使用这个过滤器时, 可以直接在" 显示过滤器" 框中输入给它起的名字, 或者点击书本图标并从列表中选择它.
  7. TCP会话过滤器(TCP Conversation Filter) 这个过滤器用于查看两个特定端点之间的所有TCP数据包. 这比单独使用IP地址和端口号过滤器更为高级.

    • 手动设置: 需要设置两个IP地址和两个端口号来手动创建一个会话过滤器.
    • 自动设置: 通过右键单击一个数据包并选择" Follow TCP Stream" , Wireshark会自动设置一个会话过滤器.
  8. 多协议过滤(Multi-Protocol Filter) 当想查看多个协议时, 可以使用or操作符. 例如, tcp or dns会显示所有TCP和DNS协议的数据包.

  9. 字符串搜索(String Search)

    如果想在数据包中查找特定的字符串, 可以使用containsmatches操作符. 例如, ip contains "London"会查找包含字符串"London"的所有IPv4数据包.

    matchescontains都是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" 这样可以过滤所有的包.

  10. TCP标志位过滤(Tcp Flags Filter)

    tcp.analysis.flags 是一个在Wireshark中用于过滤TCP分析标志的特殊字段. 这个字段可以帮助识别网络中可能存在的问题, 如重传, 乱序数据包, 窗口更新等. 这些标志是Wireshark在分析TCP流时自动计算和添加的.

    以下是一些常见的tcp.analysis.flags选项:

    1. 重传(Retransmission): tcp.analysis.retransmission
    2. 快速重传(Fast Retransmission): tcp.analysis.fast_retransmission
    3. 乱序(Out-Of-Order): tcp.analysis.out_of_order
    4. 重复ACK(Duplicate ACK): tcp.analysis.duplicate_ack
    5. 窗口更新(Window Update): tcp.analysis.window_update
    6. 零窗口(Zero Window): tcp.analysis.zero_window
    7. 零窗口探测(Zero Window Probe): tcp.analysis.zero_window_probe
    8. 零窗口探测应答(Zero Window Probe Ack): tcp.analysis.zero_window_probe_ack
    9. 保持活动(Keep Alive): tcp.analysis.keep_alive
    10. 保持活动应答(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数据包.
    • &&: 这是一个逻辑" 与" 操作符, 用于组合前面两个条件.
  11. tcp payload字节过滤

    • 如果我要过滤payload中头两个字节是0x04 00tcp.payload[0:2] == 04:00
  12. 保存过滤后的数据(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-emacs

  • sqlite-mode 可以打开sqlite文件

    M-x sqlite-mode-open-file

  • use-package 是emacs的一部分了, 不用再额外安装

  • eglot

    EGlot是功能齐全的LSP模式的精简补充,现在内置在Emacs中。开箱即用M-x eglot 即可开始. Java支持的相当不错.

  • Tree-sitter

    Tree-sitter是一个第三方库,可以将您的文本(通常是代码,但也包括Markdown)解析为具体的语法树。这是Emacs 29的标志性功能之一

进入阅读→