#1088 读书笔记怎么写

2025-02-09

一般来说,技术类书籍每一张的内容都需要仔细阅读,每个点都需要理解,甚至通过实践来促进或加深理解。
不过,我需要阅读管理类书籍,比如《可复制的领导力》、《卓有成效的管理者》等,然后写读书笔记。

这里我对我的阅读方法和怎么写读书笔记做一个总结。

  1. 获取电子书
  2. 阅读目录,通过章节名称了解内容框架
  3. AI 总结书本大意

    请帮忙总结一下《卓有成效的管理者》这本书的核心思想、主要观点、内容结构、适用对象。
    
    1. AI 并不那么可靠,所以放在自己粗读之后,AI 总结和自己的理解相互印证。
  4. 阅读别人的读后感、阅读笔记、思维导图

  5. 快速阅读全书
    1. 观点与故事
  6. 按照自己的理解阅读重点
    1. 总结核心关键词,在书本中搜索,直接跳转到那一段阅读

#1086 转载:照明的历史

2025-01-24

工业革命之前,世界是漆黑的,灯光极其昂贵,火是唯一的人造光源。

历史上,人造光一直是富人和有权势的人的特权,生产和维护既费力又肮脏,可用性和质量都很差。穷人很难获得人造光,总是生活在黑暗中。

古代房屋在夜晚有蜡烛照明,是巨大财富的标志。当时,蜂蜡制成的优质蜡烛是最好的光源,但天然蜂蜡的供应有限,加上手工制作的繁琐,除了最富有的人之外,其他人都买不到优质蜡烛。

一位作家写道:"打开你的冰箱门,你召唤出的光线比 18 世纪大多数家庭所享受的光线总量还要多。"

后来人们发现,鲸油(鲸鱼的皮下脂肪)是更好的蜡烛材料,燃烧时发出干净、稳定的光,是工业革命早期了最好的照明,但它也非常昂贵。

捕鲸业为世界带来了照明,但也将一些鲸鱼物种推向了灭绝的边缘。仅在 1700 年至 1800 年间,为了得到鲸油,就至少有 300,000 头鲸鱼被屠杀。

1800 年代初,欧洲和美国出现了燃气照明,燃烧煤气来发光。然而,燃气照明的安装和维护费用昂贵,而且有危险。所以,煤气灯一般不用在家里,而用在工商业和大城市的路灯。

煤气灯很亮,比之前的任何灯至少亮 20 倍。使用燃气照明是人类第一次体验明亮的照明。

1846 年,天然气生产的副产品煤焦油(简称煤油)做成灯,用来照明。煤油开始取代鲸油,导致照明成本直线下降,并且燃烧时明亮、无味。

正是因为煤油,夜间第一次变得明亮了,天黑后也能生产和娱乐。

19 世纪后半期,托马斯·爱迪生(Thomas Edison)发明了电灯,电照明的时代从此来临。

#1085 Doggo DNS 工具

2025-01-18
  • https://github.com/mr-karan/doggo
  • https://doggo.mrkaran.dev/docs/

安装

$ go install github.com/mr-karan/doggo/cmd/doggo@latest
$ doggo
NAME:
  doggo 🐶 DNS Client for Humans

USAGE:
  doggo [--] [query options] [arguments...]

VERSION:
  unknown - unknown

EXAMPLES:
  doggo mrkaran.dev                             Query a domain using defaults.
  doggo mrkaran.dev CNAME                       Query for a CNAME record.
  doggo mrkaran.dev MX @9.9.9.9                 Uses a custom DNS resolver.
  doggo -q mrkaran.dev -t MX -n 1.1.1.1         Using named arguments.
  doggo mrkaran.dev --aa --ad                   Query with Authoritative Answer and Authenticated Data flags set.
  doggo mrkaran.dev --cd --do                   Query with Checking Disabled and DNSSEC OK flags set.
  doggo mrkaran.dev --gp-from Germany           Query using Globalping API from a specific location.

FREE FORM ARGUMENTS:
  Supply hostnames, query types, and classes without flags. Example:
  doggo mrkaran.dev A @1.1.1.1

TRANSPORT OPTIONS:
  Specify the protocol with a URL-type scheme.
  UDP is used if no scheme is specified.
  @udp://     eg: @1.1.1.1                                                        initiates a UDP query to 1.1.1.1:53.
  @tcp://     eg: @tcp://1.1.1.1                                                  initiates a TCP query to 1.1.1.1:53.
  @https://   eg: @https://cloudflare-dns.com/dns-query                           initiates a DOH query to Cloudflare via DoH.
  @tls://     eg: @tls://1.1.1.1                                                  initiates a DoT query to 1.1.1.1:853.
  @sdns://    initiates a DNSCrypt or DoH query using a DNS stamp.
  @quic://    initiates a DOQ query.

SUBCOMMANDS:
  completions [bash|zsh|fish]   Generate the shell completion script for the specified shell.

QUERY OPTIONS:
  -q, --query=HOSTNAME          Hostname to query the DNS records for (eg mrkaran.dev).
  -t, --type=TYPE               Type of the DNS Record (A, MX, NS etc).
  -n, --nameserver=ADDR         Address of a specific nameserver to send queries to (9.9.9.9, 8.8.8.8 etc).
  -c, --class=CLASS             Network class of the DNS record (IN, CH, HS etc).
  -x, --reverse                 Performs a DNS Lookup for an IPv4 or IPv6 address. Sets the query type and class to PTR and IN respectively.
  --any                         Query all supported DNS record types (A, AAAA, CNAME, MX, NS, PTR, SOA, SRV, TXT, CAA).

RESOLVER OPTIONS:
  --strategy=STRATEGY           Specify strategy to query nameserver listed in etc/resolv.conf. (all, random, first).
  --ndots=INT                   Specify ndots parameter. Takes value from /etc/resolv.conf if using the system namesever or 1 otherwise.
  --search                      Use the search list defined in resolv.conf. Defaults to true. Set --search=false to disable search list.
  --timeout=DURATION            Specify timeout for the resolver to return a response (e.g., 5s, 400ms, 1m).
  -4, --ipv4                    Use IPv4 only.
  -6, --ipv6                    Use IPv6 only.
  --tls-hostname=HOSTNAME       Provide a hostname for verification of the certificate if the provided DoT nameserver is an IP.
  --skip-hostname-verification  Skip TLS Hostname Verification in case of DOT Lookups.

QUERY FLAGS:
  --aa                          Set Authoritative Answer flag.
  --ad                          Set Authenticated Data flag.
  --cd                          Set Checking Disabled flag.
  --rd                          Set Recursion Desired flag (default: true).
  --z                           Set Z flag (reserved for future use).
  --do                          Set DNSSEC OK flag.

OUTPUT OPTIONS:
  -J, --json                    Format the output as JSON.
  --short                       Short output format. Shows only the response section.
  --color                       Defaults to true. Set --color=false to disable colored output.
  --debug                       Enable debug logging.
  --time                        Shows how long the response took from the server.

GLOBALPING OPTIONS:
  --gp-from=Germany             Query using Globalping API from a specific location.
  --gp-limit=INT                Limit the number of probes to use from Globalping.

DNS 查询

$ doggo sendcloud.net a @223.5.5.5
NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER
sendcloud.net.  A       IN      60s     106.75.106.173  223.5.5.5:53
sendcloud.net.  A       IN      60s     106.75.106.166  223.5.5.5:53

$ doggo sendcloud.net a @223.5.5.5 --json
{
  "responses": [
    {
      "answers": [
        {
          "name": "sendcloud.net.",
          "type": "A",
          "class": "IN",
          "ttl": "60s",
          "address": "106.75.106.173",
          "status": "",
          "rtt": "67ms",
          "nameserver": "223.5.5.5:53"
        },
        {
          "name": "sendcloud.net.",
          "type": "A",
          "class": "IN",
          "ttl": "60s",
          "address": "106.75.106.166",
          "status": "",
          "rtt": "67ms",
          "nameserver": "223.5.5.5:53"
        }
      ],
      "authorities": null,
      "questions": [
        {
          "name": "sendcloud.net.",
          "type": "A",
          "class": "IN"
        }
      ]
    }
  ]
}

$ doggo sendcloud.net a @223.5.5.5 --json | jq ".responses[].answers[].address"
"106.75.106.166"
"106.75.106.173"

查反解

$ doggo --reverse 101.44.172.1 @223.5.5.5
NAME                            TYPE    CLASS   TTL     ADDRESS                         NAMESERVER
1.172.44.101.in-addr.arpa.      PTR     IN      300s    hwsg1c1.email.engagelab.com.    223.5.5.5:53

$ doggo hwsg1c1.email.engagelab.com. a @223.5.5.5
NAME                            TYPE    CLASS   TTL     ADDRESS         NAMESERVER
hwsg1c1.email.engagelab.com.    A       IN      600s    101.44.172.1    223.5.5.5:53

Global Ping

$ doggo markjour.com --gp-from Germany,Japan --gp-limit 2
LOCATION                        NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER
Falkenstein, DE, EU, Hetzner
Online GmbH (AS24940)
                                markjour.com.   A       IN      600s    121.42.82.115   private
Osaka, JP, AS, Oracle
Corporation (AS31898)
                                markjour.com.   A       IN      600s    121.42.82.115   8.8.8.8

#1083 Go 数据库默认连接池踩坑

2025-01-13

Go 标准库已经提供了 database/sql,为什么生产环境还要专门配置连接池?因为 sql.DB 本身就是连接池,而它的默认配置只是“能工作”,并不意味着适合所有 Web 服务。

#1082 中亚五国:连接俄罗斯、中国与欧洲的地缘枢纽

2025-01-12

中亚通常指哈萨克斯坦、乌兹别克斯坦、吉尔吉斯斯坦、塔吉克斯坦和土库曼斯坦五国,总面积约400万平方公里,人口已接近8100万。
五国均曾是苏联加盟共和国,但独立后形成了不同的政治制度、经济结构和外交路线。
俄罗斯在军事安全领域仍保持较强影响,中国则在贸易、能源和基础设施领域快速扩大存在,欧盟、土耳其、美国和伊朗等也在加强与该地区的合作。

国家 人口 主要民族 语言 主要宗教 GDP(2024) 人均GDP(2024)
🇰🇿 哈萨克斯坦 约2030万 哈萨克族、俄罗斯族 哈萨克语、俄语 伊斯兰教、东正教 2915亿美元 14300美元
🇺🇿 乌兹别克斯坦 约3570万 乌兹别克族 乌兹别克语、俄语 伊斯兰教 1150亿美元 3160美元
🇹🇲 土库曼斯坦 约760万 土库曼族 土库曼语、俄语 伊斯兰教 514亿美元 6860美元
🇰🇬 吉尔吉斯斯坦 约680万 吉尔吉斯族、乌兹别克族、俄罗斯族 吉尔吉斯语、俄语 伊斯兰教 175亿美元 2420美元
🇹🇯 塔吉克斯坦 约1080万 塔吉克族、乌兹别克族 塔吉克语、俄语 伊斯兰教 142亿美元 1340美元

注:人口为2025年前后估计值;GDP采用世界银行2024年名义美元数据。土库曼斯坦经济统计透明度相对较低,相关数据存在较大不确定性。

主要贸易伙伴:

国家 TOP1 TOP2 TOP3
哈萨克斯坦 🇪🇺 欧盟 约30% 🇨🇳 中国 约19% 🇷🇺 俄罗斯 约18%
乌兹别克斯坦 🇨🇳 中国 约21% 🇷🇺 俄罗斯 约18% 🇪🇺 欧盟 约8%
吉尔吉斯斯坦 🇨🇳 中国 约37% 🇷🇺 俄罗斯 约20% 🇪🇺 欧盟 约10%
塔吉克斯坦 🇨🇳 中国 约20% 🇷🇺 俄罗斯 约18% 🇪🇺 欧盟 约10%
土库曼斯坦 🇨🇳 中国 60%以上 🇪🇺 欧盟 约10% 🇹🇷 土耳其 约8%

哈萨克斯坦:中亚最大经济体

哈萨克斯坦是中亚面积最大、经济规模最大的国家,也是俄罗斯与中国之间的重要地缘枢纽。经济高度依赖石油、天然气、铀和金属资源,同时正在发展制造业、物流和新能源产业。俄罗斯族是规模较大的少数民族,俄语在社会和商业领域仍具有重要地位。

外交上,哈萨克斯坦典型地采取“多向外交”,既是集安组织成员,与俄罗斯保持军事合作,也积极发展与中国、欧盟、土耳其和美国的关系。其核心战略并不是在俄罗斯与中国之间选边,而是利用自身的资源和地理位置扩大外交与经济选择空间。

乌兹别克斯坦:人口与市场规模最大

乌兹别克斯坦拥有中亚最多的人口,也是地区最重要的消费市场和潜在增长中心。经济涵盖黄金、天然气、棉花、农业、制造业和服务业,近年来持续推进市场改革和对外开放。

乌兹别克斯坦最大的特点是强调战略自主。它不是集安组织成员,也没有加入俄罗斯主导的军事安全体系,同时与俄罗斯、中国、土耳其、欧盟和美国保持合作。由于人口优势、地理位置和经济体量不断增长,其在中亚地区的政治影响力也持续上升。

土库曼斯坦:天然气与永久中立

土库曼斯坦拥有丰富的天然气资源,经济高度依赖能源出口。中国是其最重要的天然气出口市场,中土天然气管道构成两国经济关系的核心。

外交上,土库曼斯坦与其他四国差异明显。它奉行永久中立政策,不加入集安组织等军事联盟,也尽量避免卷入大国竞争。其外交重点是维护政治中立,同时通过天然气出口与中国、土耳其、伊朗及其他市场保持联系。

吉尔吉斯斯坦:俄罗斯影响较深的小型经济体

吉尔吉斯斯坦人口和经济规模较小,山地占国土大部分,经济依赖黄金、农业、服务业以及海外劳务汇款。俄罗斯是其重要的劳务市场,因此俄罗斯对吉尔吉斯斯坦经济和社会仍具有较大影响。

军事安全方面,吉尔吉斯斯坦是集安组织成员,并与俄罗斯保持密切军事合作。与此同时,中国通过贸易、道路、电力和其他基础设施项目扩大经济影响。吉尔吉斯斯坦因此形成了安全领域依赖俄罗斯、经济领域加强多元合作的特点。

塔吉克斯坦:安全问题最突出

塔吉克斯坦是五国中人均GDP较低的国家之一,经济依赖农业、铝业、矿产、水电以及海外劳务汇款。由于与阿富汗接壤,边境安全、反恐和极端主义风险长期是其国家安全政策的重要组成部分。

塔吉克斯坦是集安组织成员,俄罗斯在当地保持军事存在,两国安全合作十分密切。同时,中国已经成为塔吉克斯坦重要的经济和投资伙伴,并参与交通、能源和安全领域合作。因此,塔吉克斯坦呈现出安全上高度依赖俄罗斯、经济上逐步扩大对华合作的特点。

中亚五国的地缘格局

五国并不是一个统一的政治集团。哈萨克斯坦和乌兹别克斯坦拥有较强的经济和人口基础,土库曼斯坦依靠天然气和永久中立政策保持独立性,吉尔吉斯斯坦和塔吉克斯坦则更加依赖俄罗斯的安全体系和海外劳务市场。

总体而言,可以将当前中亚格局概括为:俄罗斯在军事和安全领域仍具有明显优势,中国在贸易、能源和基础设施领域影响力快速上升,欧盟、土耳其、美国等外部力量则提供更多合作选择。五国通过多向外交,在大国竞争之间扩大自身战略自主空间。

#1081 Golang JSON RawMessage

2025-01-11

在 Go 的 encoding/json 包中,json.RawMessage 是一个很实用的类型。它本质上是 []byte,用于保存一段未经解析的 JSON 数据,让程序可以延迟决定如何解析。

例如接口返回的数据中,data 字段可能对应不同结构:

type Response struct {
    Code int             `json:"code"`
    Data json.RawMessage `json:"data"`
}

第一次 json.Unmarshal 时,Data 不会被解析成 map[string]any,而是直接保存原始 JSON。根据 Code 或其他字段确定具体类型后,再进行第二次解析:

var user User
if err := json.Unmarshal(resp.Data, &user); err != nil {
    return err
}

这种方式特别适合多态 JSON、动态字段、消息路由和兼容不同版本的数据结构。

与 any 的区别

如果使用 any 接收 JSON,就相当于把内容当作 map[string]any 解析,其中数字解析为 float64,导致类型信息丢失。

json.RawMessage 则保留 JSON 原文,可以在真正需要时再决定目标类型,也避免了不必要的解析。

type Response struct {
    Type string `json:"type"`
    Data any    `json:"data"`
}

{
  "type": "user",
  "data": {
    "id": 123,
    "name": "Woody"
  }
}

// map[string]any{
//     "id":   float64(123),
//     "name": "Woody",
// }

#1080 Docker 轻量基础镜像:scratch、Distroless、Alpine 与 Debian Slim

2025-01-10

在 Docker 镜像构建中,基础镜像决定了应用的运行环境,也直接影响镜像体积、安全性、兼容性和后期维护成本。
很多开发者在追求轻量化时,首先会想到 Alpine。但实际上,scratch、Distroless、Alpine 和 Debian Slim 分别代表了不同的设计思路,并不存在绝对最优的方案。
选择基础镜像的核心,不是单纯追求体积最小,而是在运行依赖、安全性和可维护性之间取得平衡。