你看,我就说吧,________。
比特币定投计划(二)资金准备
前提
可以一次性准备好要投入的资金,但更推荐的是保证每个月有稳定的收入来源,可以是打工、上班、摆摊等等,然后从收入中为计划保留一部分,具体保留多少因人而异,挣得多用得少的就可以多保留一点;每个月需要还房贷车贷、或者对计划不那么信任同时又想试试的可以少保留一点。需要注意的是,不管使用哪种形式,都必须是闲钱,也就是你未来几年内都用不到的钱,没有闲钱的话请不要参与这个计划。不要因为计划看起来收益颇丰就梭哈,更不要借贷,否则你无法坚持下去。
要投入的资金,尽早通过入金的方式放到交易所里面,因为可以吃利息,而且利率还可以,具体怎么操作下面会讲。
交易所
买卖比特币必须要通过交易所,国内最常用的是币安和欧易。
下载
这里以欧易为例,先在手机上下载 app,苹果用户参考这篇文章,需要一个外服的 Apple ID,然后在 App Store 中搜索 okx,显示开发者为 OKX MALTA LTD 的这个就是。 安卓用户可以从官方文档中提供的链接下载,也可以去官网下载,参考这篇文章。注意,如果是从文档中提供的官网链接下载,需要翻墙才能访问,可以直接点击文档左上角的欧易图标进入备用域名进行访问,这个不需要翻墙,地址是这个。
币安的下载也类似,苹果用户直接在外服的 App Store 下载,参考苹果手机下载币安 App 指南;安卓用户可以在这个页面扫码进行下载。
注册账号
以欧易为例,浏览器注册账号直接通过这个链接即可,app 上注册可以填一下我的邀请码 9558747,注册过程中需要绑定邮箱和手机号,参考这篇文章,注册完成后记得做一下实名认证。
实名认证年龄需满足18周岁及以上(无上限要求),未实名认证的账户无法进行买卖币、充提币(内部转账)、借贷以及资金划转等操作。
币安的注册也类似,可以找那种返佣比较高的邀请码填写一下,我的比例太低了就别考虑了。
入金
一般来说,需要使用一种叫稳定币(和美元保持 1:1 挂钩,常用的有 USDT 和 USDC 两种,入金基本上只考虑 USDT,以下简称 U)的东西来购买比特币,所以你需要先把自己的人民币换成稳定币,这个过程叫入金。交易所有大量的商家提供入金服务,由交易所做担保,你把人民币转账给商家提供的账号,商家收到转账后在交易所转稳定币给你。
一共有三种转账方式,分别是银行卡、支付宝和微信,不同的方式碰到的 U 价格可能不太一样,选其中比较便宜的就行了。这些转账方式的实名信息需要和你注册交易所账号时的实名信息保持一致,因为商家在接收转账的时候会进行比对,以减少收到黑钱的可能性。
为了防止被风控,需要准备一个专门的账户来进行入金操作,只在你需要购买 U 的时候才把钱转进去。你可以用一张平时不用的银行卡,或者专门注册一个支付宝账号(用多余的手机号进行注册,没有的话可以专门申请一张手机卡)。
欧易用户参考如何使用 C2C 买币/卖币?和C2C 交易全攻略中的内容进行买币,注意只购买 USDT,不要买其他的币。建议做一下视频认证,否则入金的总额度只有两万人民币。
稳定币放贷
入金后拿到的 USDT,请在欧易 app 的“探索”>“简单赚币”>“USDT活期”里面,把 USDT 都放进去吃利息,申购数量选最大、目标最低出借年化设置成 1%、勾选我已阅读并同意简单赚币用户协议、点击申购。这一步是稳定币放贷,也就是把 USDT 出借给有需要的人,收取他们的利息。在计划开始执行之前,USDT 一直放在简单赚币吃利息即可。当然也有其他的方式吃利息,比如期现套利、链上赚币等等,可以参考这篇博客,需要翻墙才能阅读。
最后,请在欧易 app 的“资产”>“赚币”里面,启用一下自动赚币,这样你后续购买的 U 就会自动转到简单赚币里面吃利息了。
…比特币定投计划(一)计划介绍
简介
这是一个针对比特币的、在熊市利用定投均摊成本、并在牛市赚钱的计划。
为什么选择比特币,而不是山寨币,或者黄金、股票等等?原因其实很简单,比特币的历史走势表现出了非常明显的大体跟时间有关的牛熊周期(这可能跟四年减半一次有关),这个计划正是利用这个规律来赚钱的。规律未来有没有可能失效?谁都不清楚,至少在规律还有效的时候,本计划会一直坚持下去。
为什么是定投,而不是在熊市最低点的时候全仓抄底?因为最低点的形成受偶然因素的影响很大,往往是某些黑天鹅事件引发价格的突然暴跌,这是技术分析无法预测的,也不存在某个指标可以精准地告诉你熊市中的哪一天或者哪个价格是最低点。要么你想梭哈的那个价位最终到不了,那样的话你熊市一分钱都不会买;要么你全仓买在了半山腰,那样的话后面再跌你就没钱买了,体验会很差。
为什么比特币会有跟时间有关的牛熊周期?我认为下面这段论述有一定道理:
我认为所有商品价格都是供需关系决定的。首先我们看一下比特币的供求关系,明白价格变化后面的物理过程。
比特币每天挖矿是出1800个币,每个币按照现在的价格6,000美元计算,每天支持这个价格需要进入的新钱是10.8million,一年大约是40亿美元。就是假设比特币现有持有人不卖出一个币,那么每年流入的新钱需要40亿美元来支持现在的价格。因为矿工需要支付电费、付人工工资,这些钱都是用当地货币结算的。新钱从哪里来,是从了解比特币的人的越来越多,认同比特币的价值的人买入中来的。如果这些新人的增加量越来越少,那么每天输入的新鲜血液就无法支撑这个价格。价格下跌,会让更多的人远离比特币,新鲜血液越来越少。新鲜血液越少,价格下跌的更多。这是一个正反馈过程,导致价格总是暴跌暴涨。直到比特币价格跌到和流入现金平衡了,市场价格稳定住了,那么可以说供求关系基本平衡。
每四年一次的减半是对这个供求关系的重新破坏。下一次的减半应该发生在2020年的5月份左右。无论比特币当时稳定在什么价格上,无论是1000美元还是6000美元,减半之后都会导致供求关系的失衡。供应突然减少一倍,流入的现金没有变化,会让价格产生飙升,飙升的价格会带动新闻媒体的宣传,会让更多的人对比特币感到好奇。看到那么多一夜暴富的神话,就会有更多的新鲜血液进来。更多的需求进来会刺激价格的进一步飙升,又进入一个新的正反馈循环,直到下一次泡沫破裂。
声明
本计划仅作为个人投资理财的记录,不构成任何投资建议。计划执行过程中可能会产生较大的浮亏,计划完成后也可能没办法产生特别高的收益。本计划对本金多少没有要求,但是请盈亏自负。
方案
本计划每四年进行一次,会选择熊市中的一段时间进行定投。
必须要能估计出大概定投的天数,然后将定投资金均分并投进去。实际情况一般会和估计有所偏差,比如熊市过长,提前用光了所有的资金;或者定投时间过长,导致定投成本偏高;或者定投区间和实际的低位区间偏差大,导致定投成本偏高。我们希望熊市底部出现在定投的过程中,所以定投时间不能太短(要防止因为一些偏差导致熊市底部落在定投时间以外);同时我们也希望尽可能降低定投成本价,所以定投时间不能太长(时间越长距离熊市底部越远的位置成本就越高)。
对于两类人群,有两套不同的方案可供选择:
- 固定总资金(每轮计划投入的总资金固定):把总投入资金(以U计)除以计划要定投的天数得到每天要投的资金,然后在计划期间每天定投即可
- 持续现金流(每个月都可以拿出一定资金参与计划):把资金分成三部分——计划开始前存下的资金、计划期间存下的资金、计划结束后存下的资金
- 计划开始前存下的资金:预留一个月的资金,其他部分和第一套方案相同
- 计划期间存下的资金:因为每个月只有某一天发工资,加上入金过程可能会耽误一些时间,所以前面预留的一个月资金可以在计划开始时先投入,当月的资金到下个月再投入。将一个月资金按照当月天数均分,计划期间每天投一份,当月剩余的部分留到下个月继续投
- 计划结束后存下的资金:这是和第一套方案最大的区别,因为计划结束后依然有资金可以投,而当时的价格可能还在低位,与其把这部分资金留到下一轮熊市再投,不如直接在这一轮投掉(下一轮定投的价格大概率是比这轮要高不少的)。每个月的资金按照当月天数均分,每天投一份,直到价格超过定投过程的最高点,结束定投
定投采用每日固定资金的方式,有两个优点:
- 容易计算和操作。只需要把总投入资金除以计划要定投的天数就能得到每天要投的资金。如果是每日固定币数的方式,一方面不好估算每天买多少币,另一方面很容易因为价格的波动导致最后要么钱不够要么剩下很多
- 投入相同资金的情况下买到的币会多一些。因为价格低的时候买的币会多一点,价格高的时候买的币会少一点。举个例子,如果是每日固定币数的方式,在价格为100的时候买一个币,在价格为200的时候也买一个币,这样一共花了300买到两个币;如果是每日固定资金的方式,在价格为100的时候花150买1.5个币,在价格为200的时候花150买0.75个币,这样一共花了300买到2.25个币
最后
第一轮定投计划预计在2026年下半年开始,现在要努力赚钱、好好存钱、提前准备好资金。
…MIT 6.5840 构建 Raft 调试工具
工欲善其事,必先利其器。
目标
本文参考这篇博客,对代码做了一些调整。
在实现 Labs 的过程中,为了弄清楚系统究竟在干什么,以及哪里出了问题,需要找到一种比较方便的方法。在分布式系统中,我们没法像单体应用程序那样可以用gdb或者pdb做调试,传统的print语句也帮不上什么忙,我们需要依赖对日志的分析。
用于调试的日志最重要的是要包含什么角色 在什么时间 做了什么类型 的事情,然后我们就可以设计工具来对日志的输出进行排版上的美化。简单来说,我们会让 Go 代码输出特定格式的日志,然后通过 Python 的 Rich 库解析日志,输出下图这样的结果。
图中包含三个维度的信息,纵轴自上而下代表时间的先后顺序(生产环境上使用需要保证各节点的时间进行同步,本例中都是单机运行无所谓),横轴代表不同的角色(节点),不同的颜色代表不同类型的事件。
Go 日志代码
为了方便 Python 脚本的处理,日志需要用指定的格式生成。我们定义一个单独的包来编写相关代码,方便其他包来调用。
$ cd src
$ mkdir dlog
$ cd dlog
$ touch dlog.go topic.go
控制日志是否输出
需要能够在运行的时候控制日志是否输出。习惯的做法是使用命令行参数,但是 6.5840 主要用go test命令做测试,不能直接使用命令行参数,所以我们通过环境变量来进行控制。下面的代码读取VERBOSE环境变量来决定是否输出日志。
// Retrieve the verbosity level from an environment variable
func getVerbosity() int {
v := os.Getenv("VERBOSE")
level := 0
if v != "" {
var err error
level, err = strconv.Atoi(v)
if err != nil {
log.Fatalf("Invalid verbosity %v", v)
}
}
return level
}
不同主题的日志
这边的主题指的是上面提到的不同类型的事情,不同系统中的主题也各不相同,在单独的文件中进行定义,这边以 lab3A 为例:
…MIT 6.5840 Lab 3A: Raft - leader election (2025)
前言
今年 Raft lab 的测试新增了一个功能,可以在测试失败时输出下面这样的 HTML 文件,帮助你确认在什么情况下出现了什么问题。
当然,光靠这个并不能帮你 debug 代码中的问题,关于如何实现更好的 debug 工具,请看这篇文章。
题目
Implement Raft leader election and heartbeats (
…AppendEntriesRPCs with no log entries). The goal for Part 3A is for a single leader to be elected, for the leader to remain the leader if there are no failures, and for a new leader to take over if the old leader fails or if packets to/from the old leader are lost. Rungo test -run 3Ato test your 3A code.
MIT 6.5840 Lab 2: Key/Value Server (2025)
前言
Lab 的页面 6.5840 Lab 2: Key/Value Server
2025 版的 Lab2 相比 2024 版做了一些修改,取消了Append操作,增加了一个version字段。每年的 Lab 都可能会做一些修改,所有的历史页面都在这里,上面的 Lab 页面是最新年份的,阅读题目时请确认是不是 2025 年的页面。
注意,题目的要求是先实现稳定连接版本的,后面再实现 RPC 数据可能丢失的,这边直接实现最终版本。
Client
Get
初始化 RPC 调用的参数和返回值,并且不断尝试调用 RPC 直到成功为止,调用成功后只需要返回 RPC 的结果即可,调用失败稍微等待一会再继续尝试。
Hint: Before the client retries, it should wait a little bit; you can use go‘s
timepackage and calltime.Sleep(100 * time.Millisecond)
func (ck *Clerk) Get(key string) (string, rpc.Tversion, rpc.Err) {
// You will have to modify this function.
args := rpc.GetArgs{Key: key}
var reply rpc.GetReply
for {
ok := ck.clnt.Call(ck.server, "KVServer.Get", &args, &reply)
if ok {
return reply.Value, reply.Version, reply.Err
}
time.Sleep(100 * time.Millisecond)
}
}
Put
Put也需要不断尝试调用 RPC 直到成功为止,但是情况比Get复杂一些,因为 RPC 调用失败,可能是 Server 没有收到 RPC 请求,也可能是 Server 收到了请求但是没有执行操作,还可能是 Server 收到请求也执行了操作但是 Client 没收到响应。对于执行了操作的情况,Get因为是幂等的所以没有问题,但是Put不一样,需要分情况讨论。RPC 调用成功的时候 Server 可能有三种返回结果:
MIT 6.5840 Lab 1: MapReduce (2025)
前言
Lab 的页面 6.5840 Lab 1: MapReduce
补充一个小知识,论文中的 master 在这个 Lab 中改名为 coordinator,主要是因为“Black Lives Matter”活动,具体可以看一下这篇文章:为什么 Git 分支开始从“master”变为“main”了?
Lab 页面中有这样一段话:
For this lab and all the others, we might issue updates to the code we provide you. To ensure that you can fetch those updates and easily merge them using
…git pull, it’s best to leave the code we provide in the original files. You can add to the code we provide as directed in the lab write-ups; just don’t move it. It’s OK to put your own new functions in new files.
Go 语言开发个人博客网站
前言
一直想开发自己的个人博客网站。之前学过一些 Golang 在 web 开发方面的知识,为了锻炼自己的开发能力,决定基于 Golang,不使用任何框架(包括 web 框架以及 blog 框架)进行开发。
想法是好的,但我对怎么开始、需要实现哪些功能、过程中需要用到哪些库还没有一个清晰的认识。我把问题扔给了 deepseek,看看它是怎么思考的:
我: 怎么用 golang 开发像 https://www.alexedwards.net 这样的个人博客网站,并且不依赖第三方框架
deepseek 思考过程: 嗯,用户想用 Golang 开发一个像 Alex Edwards 的个人博客网站,而且不依赖第三方框架。首先,我需要回想一下 Golang 的标准库,特别是 net/http 包,因为用户要求不依赖第三方框架。我记得有几个网页提到了使用原生库的方法,比如网页7、网页9和网页10,这些可能有用。
首先,用户需要一个基本的 HTTP 服务器,网页7和网页9都有例子,用 http.HandleFunc 处理路由,这样就能实现简单的路由功能。不过,像 Alex Edwards 的博客可能更复杂,需要动态路由或者更灵活的处理,但用户不想要第三方框架,所以得用标准库的方法。可能得用 ServeMux 自定义路由,或者用更基础的方式处理。
接下来,模板引擎。Golang有 html/template,网页9提到了使用模板来渲染页面,这样用户可以用模板来生成动态内容,比如博客文章列表和详情页。需要确保模板的结构正确,支持布局和部分模板,避免重复代码。
然后是内容管理。用户可能需要用 Markdown 来写文章,然后转换成 HTML。网页1提到的 ForestBlog 就是基于 Markdown 的,但需要自动拉取和更新。这里可能需要读取 Markdown 文件,解析元数据,比如标题、日期,然后用 blackfriday 或者 goldmark 这样的库转换。不过用户不依赖第三方库,但标准库可能没有 Markdown 解析,所以可能需要用第三方,但用户要求不依赖框架,但可能允许使用必要的库?或者有没有其他方法?可能需要明确,用户是否允许使用非框架的第三方库,比如仅用于 Markdown 解析?
不过用户的问题是不依赖第三方框架,可能允许使用第三方库,只要不是框架。比如 blackfriday 是 Markdown 解析库,不属于框架,所以应该可以。需要确认这一点,但根据搜索结果,网页1的 ForestBlog 可能也用了类似的方法,因为它不依赖第三方框架,但可能用了 Markdown 库?
另外,静态文件服务,比如 CSS 和 JS,可以用 http.FileServer 来处理,这在网页7和网页9的例子中有提到,设置静态目录。
…
博文的打赏方式
如果你喜欢我的文章,可以随意打赏。你可以使用以下方式付款。
- 支付宝:
- 微信: