政治
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 月,尼日尔军政府以薪酬不公平、税务违规等理由,驱逐了中国石油天然气集团的三名高层管理人员,冻结了炼油厂的银行账户,还撤销了中资酒店的营业执照。
军政府诉求:
- 将原油分成比例从 15% 提高至 30%;
- 追缴炼油厂“欠税”1.3 亿美元;
- 强制要求中企高管本土化。
同时:
- 撕毁与美国和法国的国防协议,驱逐法国驻军,控制铀矿
- 与乌克兰断交(可以看到俄罗斯对新政权的影响)
- 俄罗斯瓦格纳雇佣兵公司接管了尼日尔首都包围工作
-
今年 5 月,局势进一步升级,尼日尔方面计划削减石油工人人数,要求一些中国员工在 5 月 31 日之前离开该国,人数可能多达数十人。给出的理由是外籍员工在当地工作时间超过其法律规定时长。
- 今年 6 月,尼日尔外长访华,并在与中方的谈话中表示,希望加强与中方之间的经贸合作。
尼日尔的问题
- 长期以来经济不发达,在摆脱法国殖民影响后,经济发展缺乏稳定支撑。
- 虽然拥有丰富的矿产资源(铀矿储量位居世界前列),但是没有开采技术,需要外资的帮助。
- 资源开采中获得的资金收入没有能够用于发展经济和改善民生,还承担了环境破坏的后果。
现状
- 尼日尔国内安全局势不佳,武装冲突频发,中国铺设的石油管道多次被炸断
- 尼日尔石油产能下降了 70%
本国油价上涨 4 倍
- 营商环境恶化导致的国际舆论压力
主权信用评级下调到 CCC
- 中国对尼日尔军政府的不信任
对中国的影响
- 过去数十年,中国对尼日尔大量援助和支持,广泛参与当地的基础设施建设,帮助其构建原油出口产业链。
- 西方媒体恶意抹黑中非合作(“新殖民主义”),中方的应对是非常无力的。
- 为了避免类似情况再次发生,必须对尼日尔采取严厉的处罚措施。
此次事件暴露了中企在非投资的三大风险:
- 政权更迭风险:非洲 54 国中,23 国近十年发生过政变;
- 资源民族主义:刚果(金)、津巴布韦等国频繁以环保、劳工权益为名强制外资股权转让;
- 地缘政治裹挟:美西方通过舆论战将中非合作污名化为“新殖民主义”。
参考资料与拓展阅读
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 已被弃用)
步骤
-
环境准备
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要工具
sudo apt install -y curl apt-transport-https ca-certificates
-
安装容器运行时 (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
-
安装 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
-
初始化集群
# 初始化控制平面
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
-
安装网络插件 (Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
-
允许主节点调度 Pod (单节点集群)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
配置
-
日志管理
# 查看Pod日志
kubectl logs <pod-name>
-
存储配置
创建 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
Shell
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"
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: 致命错误
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
WebDev
2025-05-26
开发工具
2025-05-24
几年前就用过 sunny,这次因为一些特殊场景又要用到网络穿透,又捡起来了。
- 先在他们官网上创建隧道(选择本地地址,还有远程端口)
- 下载 sunny 程序(他们定制的 ngrok 客户端)
- 执行他们隧道管理页面提供的命令 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
DB
2025-05-22
个人
2025-05-19
抖音上刷到一个视频(心理医生老秦):
家庭的第一原理是经济,而不是感情
职场的第一原理是功劳,而不是苦劳
人脉的第一原理是资源互换,而不是卑微讨好
爱情的第一原理是筛选,而不是培养
健康的第一原理是自我管理,而不是医疗
养老的第一原理是金钱,而不是医疗
我又搜索到了这一篇 人性的第一性原理
结合我自己的认知,总结如下:
最重要的事:
- 家庭 -> 经济基础 + 感情经营
- 爱情 -> 互相尊重、互相理解
- 职场 -> 功劳 + 苦劳,我的定位是什么,我为团队带来了什么,我是不是不可替代
- 人脉 -> 价值互换(可能有点功利,但是确实比真诚、善良等优秀品质更可靠、更持久)
- 养老 -> 提前规划(财务储备) + 健康管理 + 心态调整(知足常乐)
- 健康 -> 自律 + 医疗
- 教育 -> 不迷信(独立思考) + 知识积累 + 实践迭代(实践->总结->改进 循环)
我认为好的做事方法:
- 用心做事,以诚待人。
- 要深入思考事情的核心,不要被表面上不那么重要的事情所蒙蔽。
- 方法论:
- 制度设计:要能够围绕一个目标形成一个正向循环,而不是指望单方面持续投入。
- 优先级管理。
第一原理
又叫第一性原理,希腊哲学家亚里士多德提出,指那些不言而喻的真理,整个理论系统的基础。
希腊哲学家亚里士多德提出。
马斯克在采访中提到“第一原理思维”(first principle thinking),是一种从根本出发,追问事物本质的思维方式。
大概是指人们做事总是习惯看着前人的脚步,在其基础之上做一些小的创新。
而在做革命性事业时,需要抛开前人的经验,不要被那些“前提条件”所阻碍,从最根本的问题开始思考。
“电池组太贵了,每千瓦时要 600 美元。但如果根据构成电池的原料价格计算成本,你会发现其实只需每千瓦时 80 美元。那么一定有办法把这些材料组合成电池,并大幅降低成本。”
“火箭是由什么材料组成的?航空级铝合金、钛、铜、碳纤维… 如果把这些材料按市场价计算,成本只有传统火箭价格的 2%。所以问题在于,如何将这些材料组装成一枚火箭。”
阅读 管理
2025-05-07
原则读后感 - 如何考核?
以考核为关键词,搜索到 “用对人” 这一章中 9.5 / 9.6 两小节,笔记如下:
- 必须建立在数据的基础上,不要做主观判断
- 问题是缺少数据支撑 -- 重要改进方向!!!
- 在长期累积的数据中寻找规律,不要依据孤立的事件给人下定论
- 规则透明、数据公开
- 持续反馈、持续考核(不要事后算总账) -- 重要改进方向!!!
- 员工自评与管理者评价对比,共同确认之间的 Gap,通过数据和第三方来验证
- 以帮助者,而非审判者的心态,在考核中协助员工找到问题,获得解决方法
- 每周周会上让大家对本周最重要的工作进行分享,至少 5 分钟,然后以此作为后续的考核依据
- 针对这项工作必须当面给出评价,当场记录
- 指出的问题要有配套的改进措施