#1102 尼日尔对华政策

2025-06-17
  • 尼日尔,非洲西部,讲法语,原法国殖民地(1904 年成为法属西非领地),1960 年独立。

    • 已探明铀储量 42 万吨。(被法国公司以极低价格购买)
    • 磷酸盐储量 12.54 亿吨,但尚未开发。
    • 煤储量 600 万吨。
    • 初步探明石油储量约 4.99 亿吨。(石油收入占 GDP 20%,主要由中石油控制)
    • 还有锡、铁、石膏、黄金等矿藏。

    尼日尔 1963 年 7 月 7 日与中华民国政府建交,1974 年 7 月 20 日改同中华人民共和国政府建交,1992 年 7 月 30 日尼日尔再同中华民国政府复交四年,直至 1996 年 8 月 19 日尼日尔同中华人民共和国政府二度复交,并与中华民国断交。
    2024 年 1 月 2 日法国关闭驻尼日尔使馆,直至“另行通知”为止。
    尼日尔 2024 年 8 月 6 日宣布与乌克兰断交。

  • 2023 年,军政府政变上台,执行民族主义政策(努力摆脱法国控制,逐步收回国内矿场控制权)。

    • 2023 年 7 月 26 日,尼日尔军人扣押巴祖姆总统,宣布成立“保卫祖国国家委员会”接管权力,总统卫队司令奇亚尼出任委员会主席、国家元首,并成立过渡政府。
    • 2023 年 7 月下旬,尼日尔“保卫祖国国家委员会”接管权力,宣布承认和延续尼政府此前同外国签订的所有合作协议,但同美西方关系紧张,反对西非国家经济共同体制裁干预。
    • 2023 年 9 月,马里、布基纳法索、尼日尔宣布成立萨赫勒国家联盟。
    • 2024 年 1 月,三国宣布退出西共体。同月,西共体召开特别峰会,决定解除对尼经济制裁。2024 年 7 月,三国宣布成立“萨赫勒国家邦联”。
    • 2025 年 1 月,西共体发布公报正式宣布三国退出生效,但保留对三国人员流通、贸易和服务等方面优惠政策。
    • 2025 年 3 月,三国宣布退出法语国家与地区组织。
    • 2025 年 3 月,奇亚尼正式宣誓就任尼日尔共和国总统。
  • 2024 年,中国还向尼日尔军政府提供了一笔 4 亿美元的贷款,用于尼日尔建设石油输送管道、偿还其他债务等。
    据说,今年到期,但是没有钱偿还,企图赖账。

  • 今年 3 月,尼日尔军政府以薪酬不公平、税务违规等理由,驱逐了中国石油天然气集团的三名高层管理人员,冻结了炼油厂的银行账户,还撤销了中资酒店的营业执照。

    军政府诉求:

    1. 将原油分成比例从 15% 提高至 30%;
    2. 追缴炼油厂“欠税”1.3 亿美元;
    3. 强制要求中企高管本土化。

    同时:

    1. 撕毁与美国和法国的国防协议,驱逐法国驻军,控制铀矿
    2. 与乌克兰断交(可以看到俄罗斯对新政权的影响)
    3. 俄罗斯瓦格纳雇佣兵公司接管了尼日尔首都包围工作
  • 今年 5 月,局势进一步升级,尼日尔方面计划削减石油工人人数,要求一些中国员工在 5 月 31 日之前离开该国,人数可能多达数十人。给出的理由是外籍员工在当地工作时间超过其法律规定时长。

    • 五月底,尼日尔政府又在阻拦中石油员工离境。
  • 今年 6 月,尼日尔外长访华,并在与中方的谈话中表示,希望加强与中方之间的经贸合作。

尼日尔的问题

  1. 长期以来经济不发达,在摆脱法国殖民影响后,经济发展缺乏稳定支撑。
  2. 虽然拥有丰富的矿产资源(铀矿储量位居世界前列),但是没有开采技术,需要外资的帮助。
  3. 资源开采中获得的资金收入没有能够用于发展经济和改善民生,还承担了环境破坏的后果。

现状

  1. 尼日尔国内安全局势不佳,武装冲突频发,中国铺设的石油管道多次被炸断
  2. 尼日尔石油产能下降了 70%
    本国油价上涨 4 倍
  3. 营商环境恶化导致的国际舆论压力
    主权信用评级下调到 CCC
  4. 中国对尼日尔军政府的不信任

对中国的影响

  1. 过去数十年,中国对尼日尔大量援助和支持,广泛参与当地的基础设施建设,帮助其构建原油出口产业链。
  2. 西方媒体恶意抹黑中非合作(“新殖民主义”),中方的应对是非常无力的。
  3. 为了避免类似情况再次发生,必须对尼日尔采取严厉的处罚措施。

此次事件暴露了中企在非投资的三大风险:

  • 政权更迭风险:非洲 54 国中,23 国近十年发生过政变;
  • 资源民族主义:刚果(金)、津巴布韦等国频繁以环保、劳工权益为名强制外资股权转让;
  • 地缘政治裹挟:美西方通过舆论战将中非合作污名化为“新殖民主义”。

参考资料与拓展阅读

#1101 K8S 环境搭建

2025-06-09

Kubernetes 学习环境搭建手册 (Ubuntu 25.04)

架构

Kubernetes (K8S) 是一个开源的容器编排系统,采用主从架构,主要组件包括:

控制平面 (Control Plane):

  • API Server: 集群的统一入口,提供 RESTful API 接口,所有组件都通过它与集群交互
  • etcd: 高可用的分布式键值存储,持久化保存所有集群数据(唯一有状态组件)
  • Scheduler: 负责资源调度,根据策略将 Pod 绑定到合适的工作节点
  • Controller Manager: 运行各种控制器的主进程(如 Deployment 控制器、Node 控制器等),确保集群状态符合预期声明

工作节点 (Worker Nodes):

  • Kubelet: 节点上的核心代理,负责与 API Server 通信并管理本节点容器的生命周期
  • Kube-proxy: 实现 Service 抽象,通过 iptables/IPVS 维护网络规则,实现服务发现和负载均衡
  • 容器运行时: 负责镜像管理和容器运行(推荐 containerd,Docker 已被弃用)

步骤

  1. 环境准备

    # 更新系统
    sudo apt update && sudo apt upgrade -y
    # 安装必要工具
    sudo apt install -y curl apt-transport-https ca-certificates
    
  2. 安装容器运行时 (containerd)

    # 安装containerd
    sudo apt install -y containerd
    # 配置 containerd
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    sudo systemctl restart containerd
    
  3. 安装 kubeadm, kubelet 和 kubectl

    # 添加Kubernetes仓库
    sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    # 安装组件
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    
  4. 初始化集群

    # 初始化控制平面
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
    # 配置kubectl
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown (id -u):(id -g) $HOME/.kube/config
    
  5. 安装网络插件 (Flannel)

    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
    
  6. 允许主节点调度 Pod (单节点集群)

    kubectl taint nodes --all node-role.kubernetes.io/control-plane-
    

配置

  1. 日志管理

    # 查看Pod日志
    kubectl logs <pod-name>
    
  2. 存储配置

    创建 PersistentVolume (PV):

    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: pv-local
    spec:
    capacity:
        storage: 5Gi
    accessModes:
        - ReadWriteOnce
    hostPath:
        path: "/mnt/data"
    persistentVolumeReclaimPolicy: Retain
    

    创建 PersistentVolumeClaim (PVC):

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: pvc-local
    spec:
    accessModes:
        - ReadWriteOnce
    resources:
        requests:
            storage: 1Gi
    
    kubectl get pv
    kubectl get pvc
    kubectl describe pvc pvc-local
    

数据库部署 (MySQL 示例)

apiVersion: apps/v1
kind: Deployment
metadata:
    name: mysql
spec:
    selector:
        matchLabels:
            app: mysql
    replicas: 1
    template:
        metadata:
            labels:
                app: mysql
        spec:
            containers:
                - name: mysql
                  image: mysql:5.7
                  env:
                      - name: MYSQL_ROOT_PASSWORD
                        value: "password"
                  ports:
                      - containerPort: 3306
                  volumeMounts:
                      - name: mysql-persistent-storage
                        mountPath: /var/lib/mysql
            volumes:
                - name: mysql-persistent-storage
                  persistentVolumeClaim:
                      claimName: pvc-local

动态伸缩

手动伸缩:

kubectl scale deployment <deployment-name> --replicas=3 -n <namespace>
# 不带命名空间的话,就用 default

自动伸缩 (HPA):

# 1. 部署服务(资源限制)
# resources:
#   requests:
#     cpu: "100m"

# 2. 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 如果遇到证书错误
kubectl patch deployment metrics-server -n kube-system --type='json' -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'

# 3. 创建 HPA
kubectl autoscale deployment <deployment-name> --cpu-percent=50 --min=1 --max=5

# 4. 生成负载测试(新终端)
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://hpa-test; done"

# 5. 观察HPA
watch kubectl get hpa

常用命令速查

  • 查看节点状态
    kubectl get nodes
  • 查看所有 Pod
    kubectl get pods -A
  • 查看服务
    kubectl get services
  • 查看部署
    kubectl get deployments
  • 进入 Pod 容器
    kubectl exec -it -- /bin/bash
  • 删除资源
    kubectl delete

#1100 Bash timeout

2025-06-01

https://heitorpb.github.io/bla/timeout/

until 是 Shell 控制结构,表示直到命令执行成功,一直循环。

加上 timeout 超时控制,在一分钟内重复尝试访问服务。一旦访问成功,命令立即结束;如果在 60 秒内仍未成功,timeout 会强制终止该命令,并返回错误码。

until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1; done

timeout 1m bash -c "until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1; done"

#1099 SMTP 状态图

2025-05-31
stateDiagram-v2
    [*] --> Connected
    Connected --> AwaitingGreeting: TCP连接建立

    # 协议握手阶段
    AwaitingGreeting --> HelloCommand: 收到220后发送EHLO
    HelloCommand --> TLS_Decision: 解析250扩展

    # 加密与认证决策
    TLS_Decision --> TLS_Handshake: 需要STARTTLS
    TLS_Handshake --> HelloCommand: 加密后重发EHLO
    TLS_Decision --> Auth_Decision: 无需TLS

    Auth_Decision --> AUTH_Login: 需要认证
    AUTH_Login --> MailFromCommand: 认证成功
    Auth_Decision --> MailFromCommand: 无需认证

    # 邮件传输流程
    MailFromCommand --> RcptToCommand: 收到250后发送RCPT TO
    RcptToCommand --> DataCommand: 收到250(最终收件人)后发送DATA
    DataCommand --> Data: 收到354后发送邮件内容
    Data --> QuitCommand: 收到250后发送QUIT
    QuitCommand --> Disconnected: 收到221断开连接

    Disconnected --> [*]

    # 统一错误处理
    state ErrorHandler <<choice>>
        HelloCommand --> ErrorHandler: 错误响应
        MailFromCommand --> ErrorHandler: 错误响应
        RcptToCommand --> ErrorHandler: 错误响应
        DataCommand --> ErrorHandler: 错误响应
        Data --> ErrorHandler: 错误响应

        ErrorHandler --> RSETCommand: 可恢复错误
        RSETCommand --> MailFromCommand: 重置到发件人状态
        ErrorHandler --> Disconnected: 致命错误

#1098 Git 配置的建议

2025-05-26

看了 《How Core Git Developers Configure Git》,作者建议配置应该尽可能简单一些,不要使用 alias 定义别名。

最后作者也提供了一些他建议配置的条目,我在这个基础上做了一点调整(想要原版去上面的链接里面找),如下:

# clearly makes git better

[column]
    # 自动分栏(比如列出分支的时候,会按照屏幕宽度自动分栏显示)
    ui = auto
[branch]
    # 按照最新提交时间排序
    sort = -committerdate
[tag]
    # 默认按字母排序不是好的选择,比如:
    # v0.1
    # v0.10
    # v0.2
    sort = version:refname
[init]
    defaultBranch = master
[diff]
    algorithm = histogram
    colorMoved = plain
    mnemonicPrefix = true
    renames = true
[push]
    default = simple
    autoSetupRemote = true
    followTags = true
[fetch]
    prune = true
    pruneTags = true
    all = true

# why the hell not?

[help]
    autocorrect = prompt
[commit]
    verbose = true
[rerere]
    enabled = true
    autoupdate = true
[core]
    excludesfile = ~/.gitignore
[rebase]
    autoSquash = true
    autoStash = true
    updateRefs = true

# a matter of taste (uncomment if you dare)

[core]
    # fsmonitor = true
    # untrackedCache = true
[merge]
    # (just 'diff3' if git version < 2.3)
    # conflictstyle = zdiff3
[pull]
    # rebase = true

#1096 网络工具:sunny

2025-05-24

几年前就用过 sunny,这次因为一些特殊场景又要用到网络穿透,又捡起来了。

  1. 先在他们官网上创建隧道(选择本地地址,还有远程端口)
  2. 下载 sunny 程序(他们定制的 ngrok 客户端)
  3. 执行他们隧道管理页面提供的命令 sunny --server=free.idcfengye.com:4443 --key=xxxx 就行了

如果临时使用一下的话,nuhup + & 就够:

nuhup sunny --server=free.idcfengye.com:4443 --key=xxx &

如果要求更高,那就用 systemd 保活:

sudo vim /etc/systemd/system/sunny-eqr.service
sudo chmod 644 /etc/systemd/system/sunny-eqr.service
sudo systemctl enable sunny-eqr.service
sudo systemctl start sunny-eqr.service
sudo systemctl status sunny-eqr.service

需要吧把注删除
[Service]
ExecStart=/home/catroll/Documents/Mine/sunny --server=free.idcfengye.com:4443 --key=xxx
Restart=always
RestartSec=3
# 每10秒检查一次 (程序不支持 watchdog 协议)
# WatchdogSec=10
# 启动前等待2秒
ExecStartPre=/bin/sleep 2
# 自定义停止命令
ExecStop=/usr/bin/pkill -f sunny
# 限制最大内存使用
MemoryMax=512M
# 限制CPU使用率
CPUQuota=80%

先配置 ssh 证书信任,然后就关闭密码登录,后续就通过证书认证。

# 将自己的公钥配置到服务器上(在本地执行)
ssh-copy-id -i /path/to/id_rsa -p 10022 admin@free.idcfengye.com

# 修改服务器 ssh 配置(在服务器执行)
# PermitRootLogin no
# PasswordAuthentication no
sudo vim /etc/ssh/sshd_config
sudo systemctl restart sshd

# 测试链接情况(在本地执行)
ssh -i /path/to/id_rsa -p 10022 admin@free.idcfengye.com

#1094 第一原理

2025-05-19

抖音上刷到一个视频(心理医生老秦):

家庭的第一原理是经济,而不是感情
职场的第一原理是功劳,而不是苦劳
人脉的第一原理是资源互换,而不是卑微讨好
爱情的第一原理是筛选,而不是培养
健康的第一原理是自我管理,而不是医疗
养老的第一原理是金钱,而不是医疗

我又搜索到了这一篇 人性的第一性原理

结合我自己的认知,总结如下:

最重要的事:

  1. 家庭 -> 经济基础 + 感情经营
  2. 爱情 -> 互相尊重、互相理解
  3. 职场 -> 功劳 + 苦劳,我的定位是什么,我为团队带来了什么,我是不是不可替代
  4. 人脉 -> 价值互换(可能有点功利,但是确实比真诚、善良等优秀品质更可靠、更持久)
  5. 养老 -> 提前规划(财务储备) + 健康管理 + 心态调整(知足常乐)
  6. 健康 -> 自律 + 医疗
  7. 教育 -> 不迷信(独立思考) + 知识积累 + 实践迭代(实践->总结->改进 循环)

我认为好的做事方法:

  1. 用心做事,以诚待人。
  2. 要深入思考事情的核心,不要被表面上不那么重要的事情所蒙蔽。
  3. 方法论:
    1. 制度设计:要能够围绕一个目标形成一个正向循环,而不是指望单方面持续投入。
    2. 优先级管理。

第一原理

又叫第一性原理,希腊哲学家亚里士多德提出,指那些不言而喻的真理,整个理论系统的基础。

希腊哲学家亚里士多德提出。

马斯克在采访中提到“第一原理思维”(first principle thinking),是一种从根本出发,追问事物本质的思维方式。
大概是指人们做事总是习惯看着前人的脚步,在其基础之上做一些小的创新。
而在做革命性事业时,需要抛开前人的经验,不要被那些“前提条件”所阻碍,从最根本的问题开始思考。

“电池组太贵了,每千瓦时要 600 美元。但如果根据构成电池的原料价格计算成本,你会发现其实只需每千瓦时 80 美元。那么一定有办法把这些材料组合成电池,并大幅降低成本。”

“火箭是由什么材料组成的?航空级铝合金、钛、铜、碳纤维… 如果把这些材料按市场价计算,成本只有传统火箭价格的 2%。所以问题在于,如何将这些材料组装成一枚火箭。”

#1093 《原则》阅读笔记

2025-05-07

原则读后感 - 如何考核?

以考核为关键词,搜索到 “用对人” 这一章中 9.5 / 9.6 两小节,笔记如下:

  1. 必须建立在数据的基础上,不要做主观判断
    1. 问题是缺少数据支撑 -- 重要改进方向!!!
  2. 在长期累积的数据中寻找规律,不要依据孤立的事件给人下定论
  3. 规则透明、数据公开
  4. 持续反馈、持续考核(不要事后算总账) -- 重要改进方向!!!
  5. 员工自评与管理者评价对比,共同确认之间的 Gap,通过数据和第三方来验证
  6. 以帮助者,而非审判者的心态,在考核中协助员工找到问题,获得解决方法

  1. 每周周会上让大家对本周最重要的工作进行分享,至少 5 分钟,然后以此作为后续的考核依据
  2. 针对这项工作必须当面给出评价,当场记录
  3. 指出的问题要有配套的改进措施