我们的笔记

  • 友情链接
  • 关于

  • domain 的自言自语 2512

    云原生

    At which size is a configmap the wrong solution? : r/kubernetes
    超过 Config Maps 大小限制的超大文件需要注入容器的场景,可以借助 Init Containers 复制到共享的 Empty Dir。真实世界案例在 OpenTelemetry Instrumentation 中可见。

    Annotated Gateway resource – cert-manager Documentation
    如果需要启用 Gateway 资源上的注解支持,则需要在 values 中启用。

    Embed a PodTemplate or Container[] list in the OpentelemetryCollector CRD · Issue #901 · open-telemetry/opentelemetry-operator
    Add podLabels to collectors · Issue #3186 · open-telemetry/opentelemetry-operator
    OpenTelemetryCollectors CRD 暂时无法为 Pod 添加 Label,但可以对 CRD 本身加 Label 使其附加在 Deployment 上。

    AWS and Google Cloud collaborate on multicloud networking | Google Cloud Blog

    Clarify `–node-ip` vs `–node-public-ip` vs `–flannel-iface` · k3s-io/k3s · Discussion #9888

    让kong监听80和443端口 – jeremy的技术点滴
    setcap CAP_NET_BIND_SERVICE to support deploying Kong to port 80 in h… by JoyZhang66 · Pull Request #213 · Kong/docker-kong
    其实不需要各种骚操作,如果是云下裸金属,可以直接使用 DaemonSet + hostPort。

    开发

    原來 CORS 沒有我想像中的簡單 | TechBridge 技術共筆部落格

    The Future of Fleet | The Fleet Blog
    红极一时的 Fleet 在 AI 浪潮中落幕。

    网络

    PredictableNetworkInterfaceNames
    Difference between eth0 and enp0s3? : r/linuxquestions

    setsockopt(3p) – Linux manual page
    好像可以用这个系统调用配置 TCP 连接的拥塞控制算法。

    Limiting WireGuard Bandwidth | Pro Custodibus

    解决Kubernetes集群Pod访问入口网关CLB地址不通-服务网格-阿里云
    eni模式下设置LoadBalancer 或 NodePort Service 的 externalTrafficPolicy 为 Local时,通信异常 · Issue #531 · AliyunContainerService/terway
    spiderpool/cmd/coordinator/cmd/utils.go at 9160105851ace1128b8b069debcf148c82a193c1 · spidernet-io/spiderpool

    Optimizing TLS over TCP to reduce latency

    杂项

    Cloudflare outage on December 5, 2025
    反反复复…

    时代的眼泪!《电脑爱好者》注销了

    403 Forbidden

    domain

    在

    自言自语

    于

    2025年12月1日

  • domain 的自言自语 2511

    云原生

    Ingress NGINX Retirement: What You Need to Know | Kubernetes

    Annotated Gateway resource – cert-manager Documentation

    When not to use docker run –init – Stack Overflow

    开发

    The request was rejected because the header value “TomažĔ is not allowed. · Issue #24480 · spring-projects/spring-boot
    Spring Security 默认阻止头部带有中文字符的请求,类似 Cloudflare 在大陆地区插入源 IP 归属地请求头包含中文,将导致异常,如有必要可根据实际情况调整。

    Linux

    The Life of a Packet in the Linux kernel | 0xkato

    Limiting WireGuard Bandwidth | Pro Custodibus

    domain

    在

    自言自语

    于

    2025年11月1日

  • domain 的自言自语 2510

    云原生

    How to configure Containerd to pull from a mirror ? · containerd/containerd · Discussion #10909
    给 containerd 配置 registry mirrors – asdf
    How to configure containerd to use a registry mirror? – Stack Overflow

    杂项

    Rclone v1.70 重磅更新:使用 `convmv` 和 `–name-transform` 在云端随心所欲地转换文件名 | 青蛙小白

    Nginx Reverse Proxy 的 DNS Issue | hwchiu learning note
    linux – How to force nginx to resolve DNS (of a dynamic hostname) everytime when doing proxy_pass? – Server Fault

    网络

    RouterOS <> AWS VPN – Asymmetric Routing problem – RouterOS / General – MikroTik community forum
    Amazon AWS VPN — A Working Configuration Example and Bug – RouterOS / General – MikroTik community forum
    Configure dynamic routing-based AWS VPN with MickroTik router | AWS re:Post
    Redundant or at least failover IPSec VPN Tunnels – RouterOS / General – MikroTik community forum
    Redundant IPsec tunnel – second tunnel cannot connect – a bug? – RouterOS / General – MikroTik community forum
    实在是没搞懂 RouterOS 是怎么对接 AWS IPsec 的。

    Linux 网络调优:内核网络栈参数篇 | 星尘独奏曲

    I’m giving up on HPKP

    domain

    在

    自言自语

    于

    2025年10月1日

  • domain 的自言自语 2509

    开发

    At the end you use git bisect | Kevin Jivani

    Linux

    veeso/termscp: 🖥 A feature rich terminal UI file transfer and explorer with support for SCP/SFTP/FTP/S3/SMB

    trzsz/trzsz-ssh: trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features. Such as login prompt, batch login, remember password, automated interaction, trzsz, zmodem(rz/sz), udp mode like mosh, etc.
    终极 SSH 工具方案:Windows Terminal + PowerShell + Trzsz-ssh 深度指南 – 阿张Respect – 博客园

    終端機 session 管理神器 — tmux. 身為一名開發者對終端機應該不陌生,不管是要執行腳本、ssh… | by Larry Lu | Larry・Blog
    Tmux Cheat Sheet & Quick Reference | Session, window, pane and more

    网络

    用 Rust 从零开始写 QUIC:MTU 探测

    domain

    在

    自言自语

    于

    2025年9月1日

  • domain 的自言自语 2508

    开发

    vmware_exporter/vmware_exporter/vmware_exporter.py at 9f9bfaf0b96cdaeb3ff293c1d489f9f3c716097f · pryorda/vmware_exporter
    vmware/pyvmomi: VMware vSphere API Python Bindings
    Network Counters | vSphere Web Services API
    你是否好奇,vmware_host_net_bytesRx_average 或者 vmware_host_net_bytesTx_average 代表什么呢?如果找到源头,你会发现它的含义是平均每秒钟的收发量(Average amount of data received per second.),单位是 KB/s(kiloBytesPerSecond)。

    Harbor docs | Configure OIDC Provider Authentication

    Unexpected security footguns in Go’s parsers -The Trail of Bits Blog

    Linux

    Linux 201

    安全

    [SECURITY] busybox tar: TOCTOU symlink race overwrites arbitrary root file with –overwrite

    网络

    Why Do We Need IBGP Full Mesh? « ipSpace.net blog

    基于VPC对等连接与转发路由器组合实现多VPC互通方案
    在阿里云上,混合转发路由器和对等连接的方案。通常大流量传输使用对等连接(因为不要流量费),反之可以使用转发路由器以降低复杂度,易于管理。

    配置 TCP KeepAlive 設定 – IBM 說明文件
    TCP keepalive | 小不的笔记 | 时间之外的往事

    domain

    在

    自言自语

    于

    2025年8月1日

  • domain 的自言自语 2507

    云原生

    The complete Kustomize tutorial | Glasskube

    Kustomize Components | SIG CLI

    maximum of series (500) reached for a single query · Issue #3045 · grafana/loki

    Google Chrome won’t start after changing hostname – Ask Ubuntu
    Ubuntu 上面的 Chrome 有一天突然打不开了,尝试 Shell 执行 google-chrome,提示 The profile appears to be in use by another Google Chrome process,然后找到了原因:修改了主机名导致的问题。

    杂项

    KrishKrosh/TrackWeight: Use your Mac trackpad as a weighing scale

    GL-Kageyama/UNIQLO_Akamai_T-shirt_Code

    RB5009/L009 3D打印1U标准安装支架 – YuS

    domain

    在

    自言自语

    于

    2025年7月1日

  • domain 的自言自语 2506

    云原生

    prune option doesn’t play nice with CiliumIdentity resource · Issue #10456 · argoproj/argo-cd
    旧事重提。

    网络

    大故障:阿里云核心域名被拖走了
    aliyuncs.com 这个核心域名 NS 记录被修改错误,导致无法正常解析。你凌晨被告警叫醒了吗?

    arduinocelentano/cdimage: A tool for burning visible pictures on a compact disc surfase
    改天找个刻录机试试。

    Failover (WAN Backup) – RouterOS – MikroTik Documentation

    Active subsription shows “warp=on” not “warp=plus” · Issue #492 · ViRb3/wgcf

    no socket implementation registered · strongswan/strongswan · Discussion #2443

    安全

    安卓GPU漏洞攻防介绍 | 京东獬豸信息安全实验室

    杂项

    geekan/HowToLiveLonger: 程序员延寿指南 | A programmer’s guide to live longer

    domain

    在

    自言自语

    于

    2025年6月1日

  • Node.js ORM框架Sequelize实践小结

    摘自 2023/4 笔记

    对象-关系映射(Object-Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统之间数据的转换。

    面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。

    简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

    参考:https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping

    为什么要使用ORM框架

    1. 提高开发效率,降低开发成本
    2. 使开发更加对象化
    3. 可以很方便地引入数据缓存等附加功能

    Sequelize

    Sequelize是一个基于 promise 的 Node.js ORM框架, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

    • 安装
    npm install --save egg-sequelize mysql2
    • 引入插件, config/plugin.js文件引入egg-sequelize
    exports.sequelize = {
      enable: true,
      package: 'egg-sequelize',
    };
    • config/config.default.js配置数据库连接
    exports.sequelize = {
      dialect: 'mysql',
      host: '127.0.0.1',
      port: 3306,
      database: 'database',
      username: 'username',
      password: '*******',
      define: {
        freezeTableName: true, //禁止转换为复数
      },
    };

    踩坑:默认情况下,当未提供表名时,Sequelize 会自动将模型名复数并将其用作表名,导致sql语句报错找不到对应的表,可以使用 freezeTableName: true 参数停止自动复数化

    定义Model

    以app/model/user.js为例

    sequelize.define(modelName, attributes, options),第一个参数为模型名;第二个为定义的模型字段,基本为表格内字段,也可以定义表格中不存在的字段;第三个参数为配置。

    'use strict';
    
    module.exports = (app) => {
      const { STRING, INTEGER, DATE } = app.Sequelize;
    
      const User = app.model.define('t_user', {
        id: { type: INTEGER, primaryKey: true, autoIncrement: true },
        name: STRING(30),
        age: INTEGER
      });
    
      return User;
    };

    如果模型名和表名不一致,可以直接配置表名称:

    sequelize.define('User', {
      // ... (属性)
    }, {
      tableName: 'Employees'
    });

    如果需要修改返回字段,举例:数据库中字段为user_id,想直接返回id,可以修改映射关系

    id: {
        type: NUMBER,
        field: 'user_id'
    },

    设置默认值

    sequelize.define('User', {
      name: {
        type: DataTypes.STRING,
        defaultValue: "Nick"
      },
      time: {
        type: DataTypes.DATETIME,
        defaultValue: DataTypes.NOW // 当前时间
      }
    });

    配置校验方法

    const User = sequelize.define('user', {
      name: {
        type: STRING,
        validate: {
          len: [3, 6]
        }
      }
    });

    定义数据表中不存在的字段,引入VIRTUAL类型,定义getter和setter

    const { STRING, VIRTUAL } = app.Sequelize;
    
    const User = sequelize.define('user', {
      firstName: STRING,
      lastName: STRING,
      fullName: {
        type: VIRTUAL,
        get() {
          return `${this.firstName} ${this.lastName}`;
        },
        set(value) {
          throw new Error('不要尝试设置 `fullName` 的值!');
        }
      }
    });

    另外,创建时间和更新时间可以交给sequelize管理,这样在代码实现过程中,你不需要对创建时间和更新时间字段进行更新维护。配置options字段:

    {
      createdAt: 'create_time',
      updatedAt: 'update_time'
    }

    踩坑:默认情况下,Sequelize 自动向每个模型添加 createdAt 和 updatedAt 字段。

    如果你并不需要这两个字段,需要在Model层中配置timestamps: false

    {
      timestamps: false
    }

    如果只要其中一个

      // 启用时间戳!
      timestamps: true,
    
      // 不想要 createdAt
      createdAt: false,
    
      // 想要 updatedAt 但是希望名称叫做 updateTimestamp
      updatedAt: 'updateTimestamp'

    模型查询

    INSERT

    // 创建一个新用户
    const jane = await User.create({ firstName: "Jane", lastName: "Doe" });

    批量创建

    Model.bulkCreate 方法接收数组对象。

    const users = await User.bulkCreate([
      { name: 'Jack Sparrow' },
      { name: 'Davy Jones' }
    ]);

    默认情况下,bulkCreate 不会在要创建的每个对象上运行验证,可以通过配置validate: true, 但这会降低性能.

    UPDATE

    update方法第一个参数为更新字段,第二个传入被更新的记录条件

    // 将所有没有姓氏的人更改为 "Doe"
    await User.update({ lastName: "Doe" }, {
      where: {
        lastName: null
      }
    });

    DELETE

    // 删除所有名为 "Jane" 的人 
    await User.destroy({
      where: {
        firstName: "Jane"
      }
    });

    可以使用 TRUNCATE SQL,销毁所有内容。销毁后自增ID会重新从1开始

    await User.destroy({
      truncate: true
    });

    SELECT

    findByPk

    提供主键从表中仅获得一个条目

    const project = await Project.findByPk(123);

    findOne

    获得符合条件的第一个条目

    const project = await Project.findOne({ where: { title: 'My Title' } });

    fineOrCreate

    如果能找到一个满足查询参数的结果则返回,否则创建一个条目

    const [user, created] = await User.findOrCreate({
      where: { username: 'sdepold' }
    })

    findAll

    返回符合条件所有条目

    // 查询所有用户
    const users = await User.findAll();
    
    //  查询年龄为25的所有用户
    const users = await User.findAll({
        where: { age: 25 }
    });

    findAndCountAll

    结合了 findAll 和 count 的便捷方法,在处理与分页有关的查询时非常有用

    const { count, rows } = await Project.findAndCountAll({
      where: {
        title: {
          [Op.like]: 'foo%'
        }
      },
      offset: 10,
      limit: 2
    });

    联表查询

    Model层定义关联关系

    • 一对一关系:hasOne 和 belongsTo 关联一起使用
    • 一对多关系:hasMany 和 belongsTo 关联一起使用
    • 多对多关系:两个 belongsToMany 调用一起使用

    定义关联键

    如果没有自定义外键,默认使用id进行关联。如果要使用其他键值,需要在Model中配置。

    举例,系统中业务下有很多个模块,在模块表中记录的外键是project_id,对应业务表中的id

    app.model.Project.hasMany(app.model.Module, {
      as: 'module',
      foreignKey: 'project_id',
      sourceKey: 'id',
    });
    
    app.model.Module.belongsTo(app.model.Project, {
        as: 'project',
        foreignKey: 'project_id',
        sourceKey: 'id',
    });

    联表查询

    可以在同一模型之间定义多个关联. 需要为它们定义不同的别名

    举例,查询模块时将所属业务信息也返回给前端

     await Module.findOne({
        where: {
            id
        },
        include: {
            model:  ctx.model.Project,
            as: 'project'
        }
    })

    事务

    默认情况下,Sequelize 不使用事务. 但是,对于 Sequelize 的生产环境使用,你绝对应该将 Sequelize 配置为使用事务。

    Sequelize 支持两种使用事务的方式:

    • 非托管事务: 提交和回滚事务应由用户手动完成(通过调用适当的 Sequelize 方法)
    • 托管事务: 如果引发任何错误,Sequelize 将自动回滚事务,否则将提交事务

    官方非托管事务示例:

    // 首先,我们开始一个事务并将其保存到变量中
    const t = await sequelize.transaction();
    
    try {
      // 进行调用时将此事务作为参数传递:
      const user = await User.create({
        firstName: 'Bart',
        lastName: 'Simpson'
      }, { transaction: t });
    
      await user.addSibling({
        firstName: 'Lisa',
        lastName: 'Simpson'
      }, { transaction: t });
    
      // 如果执行到此行,且没有引发任何错误.
      // 我们提交事务.
      await t.commit();
    
    } catch (error) {
      // 如果执行到达此行,则抛出错误.
      // 我们回滚事务.
      await t.rollback();
    }

    踩坑:如果按照这个教程编写事务代码,就会报错TypeError: Cannot read property ‘transaction‘ of undefined。原因是这里的sequelize需要从数据连接对象获取,而不是直接require('sequelize'),官方文档这里没有写清楚,导致初次使用的人基本上都踩坑了。

    解决:将数据库连接封装成一个单独的模块后导出实例给事务使用

    const { Sequelize } = require('sequelize')
    
    const sequelize = new Sequelize({
        dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
        database: 'database',
        host: '10.133.145.xxx',
        port: 3306,
        username: 'xxx',
        password: 'xxx'
    })
    
    module.exports = {
        sequelize
    }
    Allison

    在

    Node, 前端

    于

    2025年5月2日

  • 淘宝小程序开发经验小结

    摘自 2023/4/26 笔记,已过滤业务敏感数据。

    淘宝小程序在UI、API、事件等都和微信小程序非常相似,如果你之前有微信小程序的开发经验,可以很快上手淘宝小程序。

    申请小程序

    淘宝小程序准入门槛较高。申请淘宝小程序要求你至少是淘宝的一名商家;其中很多类目还需要提供相应的资质文件才可以申请。

    API 请求

    和微信小程序不同,淘宝小程序无法直接请求第三方服务器,我们只能通过淘宝提供的云服务方案来实现:云函数和云应用。

    目前我们的实现是:在云应用中实现一个请求的代理转发功能,通过代理作为一个中间桥梁实现云与淘宝小程序的连接。

    更严格的发布审核

    淘宝小程序非常重视安全和性能,如果性能和安全审核不通过则无法进行发布

    提前对性能审核的标准有一个清楚的认识,避免赶着deadline发布却卡在审核通不过。

    坑

    淘宝开发者工具看不了异步请求,每次发起请求需要手动将请求参数、返回结果等打印在控制台进行调试。

    淘宝原不支持修改昵称,近两年才支持用户修改昵称,但云服务返回的混淆昵称(mix_nick)大部分仍为旧的淘宝名。如果你改了淘宝名,开通权限和开通会员通时大概率仍需要使用旧的淘宝名。

    • 淘宝大促期间(618和双十一等)禁止发布,尽管写了有紧急情况可以发邮件,但尝试过发邮件也一直没有回复,和运营、产品提前沟通好,尽量避免在大促期间安排发布重要功能。

    小程序开发文档:https://open.taobao.com/docCenter?spm=a219a.15212433.0.0.6a3b669ahlfPYP#/

    Allison

    在

    前端, 小程序

    于

    2025年5月2日

  • 在安卓系统画一个三角形

    摘自 2023/11/7 笔记

    需求背景:完成如下图原型,设计同学只给了”锁”的切图,三角形我们一看就知道可以用CSS Border完成

    <div class='triangle'></div>
    .triangle {
      width: 0;
      height: 0;
      border-right: 24px solid #1362FF;
      border-bottom: 24px solid #00000000;
      border-top-right-radius: 4px;
    }

    PC端效果符合预期,但到真机预览效果的时候,安卓端会显示成一个矩形( IOS 正常)。

    CSS border transparent 属性在安卓端有兼容性问题。

    经过一番折腾(试了网上一些奇技淫巧都没能解决),最后决定用clip-path自己画一个三角形。

    实现如下

    .triangle {
      width: 24px;
      height: 24px;
      clip-path: polygon(0 0, 100% 0, 100% 100%);
      background-color: #1362FF;
    }

    即定义一个24 * 24的盒子,连接三个转折点并填充颜色

    x    y
    
    0    0    -  上左
    
    100% 0    -  上右
    
    100% 100% -  下右

    真机预览正常!

    Allison

    在

    前端

    于

    2025年5月2日

1 2 3 … 11
下一页→

我们的笔记

Keep Coding

  • Mail
  • GitHub
  • Telegram
  • 首页
  • 友情链接
  • 关于

粤ICP备2021143753号-1

以 WordPress 设计