法国大革命前夕的舆论与谣言 读书笔记

怎么知道的这一本书

在疫情的初期,我非常厌恶一个词「辟谣」,原本这是一个非常正面的词语,用「正确」的事实来反驳谣言。而事实是,大量使用这个词的行政机构,把「辟谣」作为了一个收束话语权的工具,造成了社会只有一家之言。而这一家之言在大部分的情况下,也并不是事实。这就造成了社会上大量民众认知的失调。

至今为止,当我听到上面的这一段播报的时候也还是会不寒而栗。

当我不断被「谣言」,「辟谣」这些词汇轰炸的时候,在豆瓣上刚好看到了这一本叫做《法国大革命前夕的舆论与谣言》的书,很少有书能够在名字上如此贴近现实,就把他加入了待看列表。

什么是谣言

什么是谣言?英文是 rumour,牛津词典的解释是:

a piece of information, or a story, that people talk about, but that may not be true.

这里可以看到 may not be true,当然谣言是没有事实依据的传闻,但谣言之所以是谣言,是人们并没有足够的事实来佐证自己,只能道听途说,这其中必然可能产生错误,但禁止谣言,甚至禁止民众出声,那便是不对的。

[[密尔]] 在 [[论自由]] 中对压制思想和言论自由有如下的探讨,大致可以分成三种情况:

  • 被压制的言论可能是一个正确的意见,那么人类就失去了一个获得真理的机会
  • 被压制的可能是一个完全错误、荒谬的意见,如此,人类也可能失去一个机会,即从真理和错误冲突中产生出对于真理的更加清楚的认识和印象
  • 大部分情况下,被压制的言论可能部分是真理,部分是谬误,压制者所持有的观点也部分真理,部分错误,如此,压制自由就会导致既丧失获得真理的机会,又失去在错误冲突中完善真理的机会

法国学者让·诺埃尔•卡普费雷对谣言的论述可以帮助我们思考谣言的根本性质。

  • 由于害怕谣言而控制言论,正是产生谣言的重要根源之一;
  • 你可能不会相信谣言,但谣言会使你产生怀疑;
  • “虚假”的谣言是有根据的谣言必须付出的代价;
  • 谣言是不受控制的,因而意味着有可能接近秘密和找到被掩盖的事实;

在《谣言:世界最古老的传媒》一书中,作者提出,只有不受监控、约束和强迫的信息交流才是真实的交流,哪怕其可靠性会受到影响。1

关于书名

在看到澎湃的这一篇 文章 ,我才知道我被这个中文书名翻译给误导了。原名是「Dire et mal dire: L’opinion Publique au XVIIIe Siècle」,翻译成 18 世纪的舆论是比较准确。澎湃进一步补充了,这一本书不是一本揭示舆论和谣言造成法国大革命的书,二者之间并不是简单的因果关系。

关于作者

阿莱特·法尔热从事法国社会史研究,关注 18 世纪法国民众身份,两性关系和历史书写等问题。

几句话总结书的内容

作者通过法国革命前(18 实际)的大量舆论资料(编年史、报刊、回忆录、警方笔录、大量的手写新闻,还有巴士底狱的档案),为我们勾画了革命前夕法国的舆论背景,为我们了解法国大革命的起源具有重大参考价值。

整本书分为三个部分,第一部分整理了日记、报纸和警方记录;第二部分分析了谣言的形式和动机;第三部分则是梳理了在 1661 年到 1775 年之前反对国王的言论和巴士底狱的相关档案。

作者通过翔实的资料发现在 18 世纪中叶,巴黎民众在舆论和谣言的环境中逐渐发展起对公共政治的关心,以及对表达意见和观点的权力的渴望。

启发或想法

疫情一晃已经三年过去了,当前国内的舆论环境只能说比疫情前更糟糕,每当有「大事」发生再听不到从各个角度发出的声音,徐州八孩被铁链所在家中的悲剧从发生到消沉,很难相信竟然只有官方的通告,竟然没有一家媒体去报道她的近况;唐山被打女孩,那家火锅店主,竟然连谣言都已经不存在。在 18 世纪人们尚能通过手抄新闻的方式来传播信息,而如今自诩为信息时代的我们,甚至连关键字都无法发出。

就像作者在书中所写的那样,在「在这些舆论和谣言中,人民开始有了一种意识,了解政治的要求是合法的,对政治的知情权和批判权是必要的(284 页)」,尤其在涉及到公共事务时,人们不断地提出诉求,他们认为说话不仅仅是他们的能力,更应该是一项亟待确立的合法权利。

谁应该看这本书

  • 所有人
  1. 卡普费雷《谣言:世界最古老的传媒》,郑若麟译,上海人民出版社,2008 年 12 月 


2022-07-21 reading , reading-2022 , french-revolution , rumour

利率史 读书笔记

怎么知道的这一本书

在看上一本 [[金融的本质]] 时突然对利率的变动比较好奇,所以就发现这一本《利率史》,一本关于利率变化历史的书籍。

在 [[金融的本质]] 一书中可以看到美联储可以通过影响隔夜拆借利率进而来影响整体市场的利率,从而通过利率来调控宏观经济。为什么利率对整个经济有如此巨大的影响?美联储加息成为了 2022 年全球经济的关键字。而国内房地产市场萧条,央行为什么通过调整房贷利率进而进一步影响房地产市场?这些问题都是我想通过这一本书想要了解的。

关于作者

本书的作者是[[悉尼 霍默]],债券经纪人,职业早期创办了自己的债券公司,开了固定收益分析的先河。霍默率先应用了相对价值分析、收益曲线以及金融世界与经济的关系等分析工具。他是使用金融市场资金流动分析的第一人,远远早于美联储正式采用这种分析手段。1961 年来到所罗门兄弟公司,后组建并管理第一个严格局限于固定收益的研究部门。霍默首次提出将债券和其利息剥离,分别销售。

作者于 1983 年去世,本书的第四版由理查德·西勒修订,在第三版的基础上新增了 1990 年到 2005 年的世界。

几句话总结书的内容

就如书名所述,这是一本关于利率历史的书。作者通过对古代(史前史,美索不达米亚,希腊,罗马),中世纪,文艺复兴,以及近现代近 4000 年的经济史来叙述全世界各个地区的利率变化,进而去观察地区经济,以及民族兴盛和衰亡的历史。

古代

公元前 1800 年,汉漠拉比法典就已经出现了对债务人和债权人相关的法律。 公元 600 年,希腊的索伦法典也对个人债务做出了规定,取消了利率的限制,豁免了过度的债务,以及取消个人劳役偿债。

公元前 450 年,罗马的《十二铜表法》也对信贷有所规定,贷款的利息被限制在每年不超过 8.333%,高于法定上限的利息将被处以 4 倍的赔偿。允许个人劳役偿债,但是得保证奴隶的健康。

公元 800 年《查理曼法典》,禁止一切贷款。

宗教改革之后,现代欧洲对收取利息合法化,利率成为了经济学家、金融家和政治家讨论的焦点,是放任自由还是国家控制。最终英国走了索伦的路子,废除了对利率的所有法律限制,而美国各州则在自己的高利贷法中确定了固定的利率上限,继承了汉谟拉比和古罗马的法律传统。

最高利率,伯林的 10000% ,最低纽约的 0.01% 。

20 世纪的美国 1900~1945

20 世纪前 90 年,多事之秋,四大政治事件

  • 1914~1918 第一次世界大战
  • 1933~1938 新政
  • 1939~1945 第二次世界大战
  • 1974~1989 冷战

三大经济事件:

  • 1914~1917 美联储的创建
  • 1929~1939 经济大萧条
  • 1965 年开始的大幅度通货膨胀

这些事件对美国经济和利率产生了巨大影响。

利率是各国政府最直接影响的价格之一,历史的最终裁决会将近几十年利率幅震荡的一部分原因与政治因素联系在一起。

1917 年开始美联储采用欧洲已经使用很久的方式来影响利率,从而根本上改变了美国货币市场结构。通过集中银行储备金、设立最后贷款人机制,该立法终结了短期利率的无规律上涨(过去,只要出现急需贷款额超过资金供应量,就会出现短期暴涨)。短期利率仍然随着信贷供求关系的变化而起伏,但是有了封顶保底。建立美联储主要是希望通过短期商业借贷来提供一种灵活货币以服务于贸易。然而第一次世界大战不久就爆发,巨额的政府新债改变了货币市场,提升了美联储的政治责任。在接下来的几十年中,政府债务取代了银行和美联储银行投资组合中的商业票据的地位。新政、大萧条和第二次世界大战强化了这种趋势。并且利用低利率来促进就业,已经成为了一种政治目标。1921 年以前,美国的利率通常平均远远高于长期债券收益率,而在 1921 年之后,短期利率通常平均低于长期债券的收益率。

20 世纪的美国 1946~1990

通胀在 1974 年达到两位数,OPEC 组织在 1973 年末实施石油价格急剧上涨措施,通胀蔓延到自由世界大部分地区。1974,1975 年的衰退降低里通胀率,但是 1979~1981 年通胀再次席卷而来,再次回到两位数,1979 年又一次石油价格飙升,物价飞涨,1980 年代的衰退对通胀几乎没有影响。利率上升到了美国历史上的最高水平,导致了 1981,1982 年的严重衰退,之后,通胀率在 80 年代后几年减弱到 3~5%。利率和收益率也随之下滑。

从 1946 年到 1981 年,美国经历了历史上最长的一个债券熊市,持续 35 年。

20 世纪美国利率

四件政治大事(一战、罗斯福新政、二战以及 1989 年前的冷战)和三大经济事件(建立美联储、经济大萧条以及 1965 年开始的大幅通胀)对于美国经济及美国利率产生了尤其重大的影响

日本

1970 年以后的 20 年里,日本发展成为世界金融大国,从 20 世纪 50 年代开始到 70 年代,政府确定了几个重点发展对象,包括炼油、化工、工业机械和电子电器。高速发展阶段,日本采用豁免利息税的储蓄账户来鼓励个人大量存款。然而,日本的金融市场远不如西欧和北美发达,利率相对比较高;金融业比较分散,而不是集中的形式,利率受到管制,与其他国家的金融交易也受到控制。

70 年代中期,日本发生金融改革,浮动汇率,1973 年第一次石油危机,造成了管制型旧金融系统的紧张,经济已经发展到了规模巨大、在国际上非常重要的成都,无法在严格管制、封闭的金融系统下继续。日本在 1975 年放松了金融系统的大部分管制。日本货币市场和债券市场得以发展,伴随日本股市的发展,越来越向国外开放。尤其是 1975 年政府通过发行债券进行了大规模的融资以弥补财政赤字。

90 年代开始,日本的金融自由完善了许多,日本已经不再是一个高利率的国家。而事实上 80 年代,日本就成为了利率最低的国家之一。

启发或想法

利率是什么

在谈论所有其他的概念之前,我们先来回答一个问题,什么是利率?

利率的英文叫做 interest rate, 是利息率的简称。在 Longman 词典中的解释是:

the percentage amount charged by a bank etc when you borrow money, or paid to you by a bank when you keep money in an account there

新闻中常常提到美联储加息或降息,很多人都会误认为美联储可以直接决定利率,而事实是美联储只能通过控制货币供给量来决定短期利率。但是影响经济最重要的是实际利率或者称为通胀调整利率(市场利率减去通胀率)。实际利率才是对资本决策最有实质性影响的。美联储影响长期实际利率的能力是间接的。实际利率受到经济因素影响,包括经济前景这些是不受美联储控制的。

作者试图通过漫漫历史长河的利率变化来给读者展示国家和文明的兴衰,作者认为在一个自由市场条件下,长期利率的趋势可以帮助分析这个国家的经济和政治状况。

利率如何影响经济

几乎在所有的教科书或百科上面都会提到,几乎所有的国家都会将利率作为调节宏观经济的重要工具,当经济过热,通胀上升的时候就提高利率,收紧信贷。当通胀得到控制,便把利率适当的调低。

缺点

就如作者所说,本书的目的并不是为了探讨利率波动对于社会和经济方面带来的后果,而只是要搜寻、记录并分析多个国家数世纪中通行利率。

在我个人看来本书的一大优点同样也是其最大的缺点,就是数据太翔实,大面积的原始数据,以至于欠缺了作者更深入的思考和总结。并且这些数据大大影响了阅读体验,不过如果是作为一本参考书来说,倒是非常不错的资料。

谁应该看这本书

  • 这本书更像是一本工具参考书,作者用大量翔实的数据介绍了各个时期各个地区的利率,非常适合页内人士按需查阅
  • 想了解利率对经济产生影响的人
  • 专业投资债券的人

印象深刻的 Quotes


2022-07-10 reading , reading-2022 , interest-rate , rate-history

Elasticsearch 导入数据

Elasticsearch 既然作为一个全文检索引擎,那么自然需要将数据导入,让 Elasticsearch 去索引。

Elasticsearch(后简写为 ES) 的基本单元是文档,使用 JSON 来描述。

有很多方法可以把数据导入到 ES:

  • RESTful 接口
  • Bulk API 批量导入
  • elasticsearch-dump
  • Logstash 将收集的数据导入

Prerequisite

导入数据前要了解的知识。

  • Cluster,集群,通常由多个节点组成 ES 集群
  • Index,通常称为索引,文档的属性
  • Document,文档,JSON 格式定义的数据
  • Shard,分片,索引会水平分片
  • Replicas,ES 允许用户创建索引和分片的 Replicas

RESTful 接口导入

如果数据文件比较简单,只有单层 JSON 结构,并且小于 1MB,可以使用 POST 请求直接将数据提交到 ES。

假设有数据 accounts.json

{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}

然后可以使用如下命令导入:

curl -u admin:my_elastic_pass -H 'Content-Type: application/json' -XPOST 'http://localhost:9200/accounts/_doc/_bulk?pretty' --data-binary @accounts.json

返回:

{
  "_index" : "accounts",
  "_id" : "_bulk",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

可以通过如下命令来查看所有索引的情况:

curl "localhost:9200/_cat/indices?v"

然后访问 Kibana,在后台就可以查询导入的内容:

kibana

Bulk

这里使用官方的样例数据:

wget https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip
unzip accounts.zip
curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json

需要注意的是如果使用 Bulk 批量导入,那么格式需要按照:

action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n

或者可以在 Kibana 后台,点击侧边栏 Dev Tools,然后在编辑框中输入:

POST bank/_bulk
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"[email protected]","city":"Dante","state":"TN"}
省略...

最后点击执行。

kibana devtool bulk import

执行成功后,可以运行 curl localhost:9200/bank/_search,如果返回值中 value 是导入的条数就表示成功了。

elasticsearch-dump

Logstash

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到 Elasticsearch 中。Logstash 的官方文档请参见:https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html

reference

  • <https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

2022-07-08 elasticsearch , kibana , import-data , csv

使用 Docker 安装最新 8.x Elasticsearch 和 Kibana

[[Elasticsearch]] 是基于 [[Lucene]] 开源的全文搜索引擎。提供 RESTful 接口,可以实现精确快速的实时检索。

[[Kibana]] 是一个基于 Web 的可视化前端。还有一个 [[elasticsearch-head]] 也是一个 Elasticsearch 的前端,不过这里因为 Kibana 使用场景更加广泛,就选择 Kibana。

Installation

创建 network:

docker network create elastic

这里仅演示单节点的 Elasticsearch 搭建过程,如果要搭建集群模式,可以自行参考官网。

version: "3.0"

services:
  elasticsearch:
    container_name: es
    image: elasticsearch:8.3.2
    environment:
      - xpack.security.enabled=false
      - "discovery.type=single-node"
      - "ELASTIC_PASSWORD=${ELASTIC_PASSWORD}"
    networks:
      - elastic
    ports:
      - 9200:9200
  kibana:
    container_name: kibana
    image: kibana:8.3.2
    environment:
      - ELASTICSEARCH_HOSTS=http://es:9200
    networks:
      - elastic
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601

networks:
  elastic:
    driver: bridge

Docker compose 会启动两个容器,一个容器运行 Elasticsearch,使用端口 9200,一个容器运行 Kibana 使用端口 5601.

两个镜像最新的版本可以分别在这里查看:

使用如下的命令检查 Elasticsearch 的状态:

❯ curl http://localhost:9200
{
  "name" : "d9f0b969f13c",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "VRWzzZpISPugOCQadlC88A",
  "version" : {
    "number" : "8.3.2",
    "build_type" : "docker",
    "build_hash" : "8b0b1f23fbebecc3c88e4464319dea8989f374fd",
    "build_date" : "2022-07-06T15:15:15.901688194Z",
    "build_snapshot" : false,
    "lucene_version" : "9.2.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

当启动 Elasticsearch 之后会产生一些证书,这些证书用来安全的在 Kibana 中访问 Elasticsearch。

  • http_ca.crt:CA 证书,用来签名 HTTP 请求
  • http.p12:Keystore that contains the key and certificate for the HTTP layer for this node.
  • transport.p12:Keystore that contains the key and certificate for the transport layer for all the nodes in your cluster.

http.p12transport.p12 是密码保护的 PKSC#12 keystore。

可以使用如下命令获取 http.p12 密码:

bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password

可以使用如下命令获取 transport.p12 密码:

bin/elasticsearch-keystore show xpack.security.transport.ssl.keystore.secure_password

等待容器启动之后可以直接访问 Kibana http://localhost:5601/

reference


2022-07-07 docker , elasticsearch , kibana

FFmpeg 使用指南之 concat demuxer 串联多个文件

FFmpeg 可以使用 -i 参数来输入一个或多个文件,但有些时候会有一些将多个文件串联成一个文件的需求。比如将多个视频合并成一个视频文件,将多个音频文件合并和一个长音频文件。这个时候就需要使用到 FFmpeg 的 concat demuxer

concat demuxer 是 FFmpeg 1.1 引入的。主要可以用来合并多个媒体文件。

串联多个相同编码的文件

FFmpeg 有两种方式可以串联相同的文件:

  • the concat “demuxer”
  • the concat “protocol”

demuxer 更加灵活,需要相同的编码,容器格式可以不一样。而 protocol 则需要容器的格式也一致。

Concat demuxer

demuxer 通过从一个固定格式的文件中读取文件列表,然后 FFmpeg 可以对这些文件一同处理。

创建文件 mylist.txt,包含所有想要串联的文件:

# this is a comment
file '/path/to/file1.wav'
file '/path/to/file2.wav'
file '/path/to/file3.wav'

注意,这里的 # 是注释语句。文件中的文件路径可以是绝对的或相对的路径,然后就可以使用 FFmpeg 对这多个文件 stream-copy 或者 re-encode(重新编码) :

ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav

如果路径是相对的,这里的 -safe 0 可以省略。

如果有多个文件要添加到 mylist.txt 文件中,可以使用 Bash 脚本批量生成:

# with a bash for loop
for f in *.wav; do echo "file '$f'" >> mylist.txt; done
# or with printf
printf "file '%s'\n" *.wav > mylist.txt

Concat protocol

demuxer 在文件流级别工作,concat protocol 在文件级别工作。特定的文件(比如 MPEG-2 传输流,或者其他)可以串联起来。

下面的命令将三个 MPEG-2 TS 文件串联到一起,不重编码:

ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts

串联不同编码的文件

某些情况下,多个文件可能使用不同的编码,那么上面的命令就都无法使用。

Concat filter

如果要让 concat filter 工作,输入的文件必须拥有相同的 frame dimensions (eg. 1920*1080 pixels) 并且要有相同的 framerate。

假设有三个文件需要串联起来,每一个文件都有一个视频流和一个音频流:

ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv

来拆解一下命令,首先指定所有的输入文件,然后实例化一个 -filter_complex filtergraph

然后:

[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]

告诉 ffmpeg 使用输入文件中的哪一个流,然后发送给 concat filter。在这个例子中,第一个文件的视频流 0 [0: v:0] 和音频流 0 [0: a:0] ,第二个文件的视频流 0 [1: v:0] 和音频流 0 [1: a:0]

concat=n=3:v=1:a=1[outv][outa]

这个就是 concat fitler, n=3 告诉 filter 这里有三个输入分段,v=1 则表明每一个分段有一个视频流,a=1 表明每一个分段有一个音频流。filter 然后将这些分段连接产生两个输出流, [outv][outa] 两个输出流的名字。

注意的是两侧的双引号是必须的。

然后使用这些输出流,将他们 组合成输出文件

-map "[outv]" -map "[outa]" output.mkv

这行告诉 FFmpeg 使用 concat filter 的结果,而不是直接使用输入的 streams。

有一个叫做 mmcat 的 Bash script,可以在老版本的 FFmpeg 中实现 concat filter。

reference


2022-07-06 ffmpeg , linux , video , encoder , ffmpeg-concat

Linux 服务器控制面板 Hestia 使用

Hestia 是一个开源的 Linux 服务器控制面板,HestiaCP fork 自另一款流行的控制面板 VestaCP 。由于 VestaCP 开发和维护趋于停止,很多安全问题和漏洞没有及时修复,所以有人从 VestaCP 拉出新分支进行开发和维护。

HestiaCP 提供了一个简单干净的网页界面,给网站维护人员提供了更加简单的方式维护网页服务器。HestiaCP 提供了很多功能,包括管理部署网站(Nginx, Apache,PHP),数据库(MySQL,PostgreSQL), FTP([[ProFTPd]], [[vsftpd]]),DNS zones(Bind),邮件服务器([[Dovecot]], [[exim4]]),垃圾邮件扫描([[SpamAssassin Score]]),邮件病毒扫描([[ClamAV]])等等。

HestiaCP 还提供了基于命令行的管理工具,具体可以见 文档

另一个值得一说的功能就是,HestiaCP 提供了一键安装网站(Quick Install App)的功能,默认提供了一些非常受欢迎的网页应用,包括 [[WordPress]], [[Drupal]], [[Joomla]], [[Opencart]], [[PrestaShop]], [[Lavarvel]], [[Symfony]]。

在接触 Hestia 之前,有段时间直接使用 LNMP,或者使用 [[aapanel]],但后来发现 aaPanel 的 License 或许存在某些问题,并且在读了 Stallman著作 之后对自由软件的认识更深刻了一些,所以直接替换成 GPL 发布的 Hestia。作为 aaPanel 的开源代替品,发现 Hestia 还是非常不错的。

后台演示:

Features

  • Apache2, Nginx, PHP-FPM
  • 多 PHP 版本
  • 集群功能的 DNS 服务器
  • POP/IMAP/SMTP 邮件服务器,带反垃圾邮件,病毒扫描
  • 支持 MariaDB 和 PostgreSQL 数据库
  • 自带 [[fail2ban]] 和防火墙

Prerequisites

  • 一台运行 Debian 或 Ubuntu 的服务器或 VPS,推荐使用一个全新安装的系统,避免可能出现的任何问题
  • root 权限,或者使用 sudo

Installation

本文中演示在 Ubuntu 20.04 上安装 HestiaCP。整个过程可能会需要 15 分钟左右。

安装脚本:

wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
bash hst-install.sh

可以通过 安装器 自己选择安装的组件。选择组件之后会产生一个命令:

wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh --apache no --phpfpm yes --multiphp no --vsftpd yes --proftpd no --named yes --mysql yes --postgresql no --exim yes --dovecot yes --sieve no --clamav no --spamassassin no --iptables yes --fail2ban yes --quota no --api yes --interactive yes --with-debs no  --port '8083' --hostname 'your_hostname' --email '[email protected]' --password 'your_password' --lang 'en'

你可以根据自己的需要自行选择需要的组件。可以在官网 文档 中查看默认会安装的组件。

安装完成之后会在日志中看到后台登录的链接,已经默认的用户名和密码。安装完成后可能会需要一次重启来完成安装。

访问 https://ip:8083 ,或者如果已经配置了域名 A 记录指向该 IP,也可以使用域名加端口来访问。

netplan 错误

安装过程中如果遇到:

[ * ] Installing dependencies...
!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!                                             
WARNING: Your network configuration may not be set up correctly.
Details: The netplan configuration directory is empty.
You may have a network configuration file that was created using                                                systemd-networkd.

It is strongly recommended to migrate to netplan, which is now the
default network configuration system in newer releases of Ubuntu.

While you can leave your configuration as-is, please note that you
will not be able to use additional IPs properly.

If you wish to continue and force the installation,
run this script with -f option:
Example: bash hst-install-ubuntu.sh --force

!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
Error: Unable to detect netplan configuration.

是因为 Ubuntu 没有使用 netplan,或者 VPS 主机提供的镜像没有使用 netplan,但是 /etc/netplan 文件夹存在,这就导致 HestiaCP 安装脚本执行过程中判断错误。

解决方案:查看 /etc/netplan 文件夹,如果配置文件夹是空的,那么可以直接删除该文件夹,如果确定自己已经使用了 netplan 作为网络配置,那么检查一下网络配置。

Usage

申请 Let’s Encrypt SSL 证书

在完成安装访问后台的时候,浏览器会报 Your connection is not private 的错误,这是因为 SSL 证书缺失了。

可以使用 v-add-letsencrypt-host 命令来圣晴证书。

不过我在执行的过程中发生一些问题,报错:

Error: Let's Encrypt validation status 400 (xxx.einverne.info). Details: Unable to update challenge :: authorization must be pending
Error: Let's Encrypt SSL creation failed

查看发现因为在机器上安装了 Docker,所以虚拟了一个网络端口,在后台 Web 查看域名的时候,看到其中关联的 IP 地址是一个本地的地址 172.17.0.1,把这个地址修改成 VPS 的真实 IP 地址。然后重新执行命令即可。

如果出现其他的错误,也可以到如下的目录中查看日志:

/var/log/hestia/LE-user-domain-timestamp

Create a new user

虽然以 admin 登录可以在后台做任何事情,但是还是推荐创建一个新用户,以新用户的身份来操作。

添加域名

创建完用户之后以该用户登录,然后在 Web 中,选择添加域名。

添加的过程中有如下配置:

  • Domain:需要添加的域名
  • IP Address: IP 地址,如果服务器有多个 IP 这里也会显示出来
  • Create DNS zone: 如果想要 HestiaCP 来管理 [[DNS zone]] 可以配置
  • Enable mail for this domain: 如果要使用该域名来发送邮件可以配置该选项

在高级选项中:

  • Aliases: 默认你需要配置 www.yourdomain.com 指向你的域名
  • Proxy Support: HestiaCP 默认使用 Nginx 来代理静态文件
  • Web Statistics: 是否开启数据记录,默认未开启,但是 HestiaCP 自带了强大的 AWStats,可以到其 官网 查看
  • Custom document root: 默认是 /home/your_user/web/your_website/public_html/
  • Enable SSL for this domain: 开启 SSL
  • Additional FTP Accounts: 是否创建 FTP 账号

Tips

修改面板的端口

默认情况下 HestiaCP 使用 8083 端口,当然在安装的时候也可以指定,但是如果安装完成之后想要调整端口,可以使用如下的命令:

v-change-sys-port 2083

强制主机 SSL

强制主机名使用 SSL

v-add-letsencrypt-host
v-add-web-domain-ssl-hsts 'admin' 'hcp.domain.com'
v.add-web-domain-ssl-force 'admin' 'hcp.domain.com'

删除不需要的主机方案

rm -fr /usr/local/hestia/install/rhel
rm -fr /usr/local/hestia/install/ubuntu
rm -fr /usr/local/hestia/install/debian/7
rm -fr /usr/local/hestia/install/debian/8
rm -fr /usr/local/hestia/install/debian/9

开放端口

touch /etc/iptables.up.rules
v-add-firewall-rule ACCEPT 0.0.0.0/0 22 TCP SSH
v-add-firewall-rule ACCEPT 0.0.0.0/0 5566 TCP HestiaCP

使用命令行工具

source /etc/profile
PATH=$PATH:/usr/local/hestia/bin && export PATH

修改控制面板的 IP

可以使用命令行:

v-update-sys-ip 1.2.3.4
v-rebuild-web-domains admin
v-rebuild-mail-domains admin

HestiaCP vs VestaCP

HestiaCP 是 VestaCP fork,VestaCP 开发和维护趋于停止,存在许多漏洞和安全性问题。VestaCP 是第一个 Nginx 的 GUI 控制面板。在 VestaCP 之前有很多 CLI-only 的管理工具。

  • HestiaCP 支持 Debian 和 Ubuntu
  • HestiaCP 添加了 CardDAV/CalDAV/ActiveSync 支持。1
  • [[aapanel]]
  • [[CyberPanel]]
  • [[DirectAdmin]]

2022-07-05 linux , control-panel , hestia , web-server , mail-server , dns , aapanel

编码 读书笔记

怎么知道的这一本书

之前在 Twitter 上看到一则帖子,有人求推荐书,如果要向一位学金融的朋友推荐一本计算机入门书籍,你会选择哪一本?在答复里面,我看到了有人推荐这一本《编码:隐匿在计算机软硬件背后的语言》。所以我把这一本书作为 [[20220627 21 天挑战计划]] 中要阅读的一本书。当时我没有想到的是,在豆瓣标记的时候我意外发现我早已经在 2018 年标记读过,但当时没有做笔记,也没有整理标记,4 年过去,就像没有读过一样。这更加坚定了我之后读书一定要整理书摘,用自己的语言撰写一下读书笔记的决心。

几句话总结书的内容

编码是一本由实体世界中信息传递,进而一步步带领读者进入计算机编码的通俗读物。作者会使用通俗易懂的语言,循序渐进地引领读者理解计算机是如何工作的。

什么是编码?

作者在本书的开头引用了《美国传统英语词典》对编码(code)的解释:

  • 3.1 a system of signals used to represent letters or numbers in transmitting messages
  • 3.2 a system of symbols, letters, or words given certain arbitrary meanings, used for transmitting messages requiring secrecy or brevity
    1. a system of symbols and rules used to represent instructions to a computer

这其中可以看到两层含义,一种是表达在信息传输过程中用来表述字母或数字的信号,可以是直接的信号,也可以是加密的,或简练的信息;另外一层含义是由字符和规则组成的系统用来向计算机传达指令。

同样在《牛津高阶英汉词典》中的解释更为直接:

    1. a system of computer programming instructions

也就是,计算机编程指令系统。

而在本书中,编码特指的是在机器和人之间传递信息的方式。我们所编写的代码,需要让计算机可以理解执行。

莫尔斯编码

我们都知道一个国际求救信号 SOS,但为什么是 SOS 呢,是什么的缩写吗?是比较好读吗?其实都不是,而原因是因为在莫尔斯编码中,S 是三个点,而 O 是三个划(-),SOS 是一个比较容易记忆的编码序列,并且不容易和其他序列搞混。于是这个编码就作为国际通用的求救信号留了下来。

莫尔斯编码通过对字母进行点和划的编码以实现信息的传递,但这个效率无疑是比较低的,如果在手动操作的情况下,每分钟也只能传递各位数字的单词,而通过口头交流可以达到每分钟 100 个单词左右的速度。

布莱叶盲文

布莱叶盲文通过凸起的点编码文字,使得盲人可以阅读。布莱叶盲文通过三行两列的六个凸起的点编码信息,布莱叶盲文也是一种二进制编码方式,每一个凸起的点可以表示两种状态,通过不同的组合,六位的编码可以表达出 2^6,也就是 64 种不同的编码。

除了 24 个字母,为了使用的简便,后续人们还引入了字母组合,常用单词,充分利用这 64 种不同的变化。

手电筒

作者在介绍了莫尔斯编码和布莱叶盲文之后用了整整一章的内容介绍了手电,以及基本的电路知识,也许你会感到奇怪为什么在这个时候介绍了这么多电流、电压、电阻、功率的知识。但电气化的开始才是之后计算机时代来临的前提。

欧姆定律:

I = E / R

电流(I)等于电压(电动势 E)除以电阻(R)。

瓦特:

P = E * I

瓦特等于电压(E)乘以电流(I)。

但作者真正要介绍的并不是这些物理知识,而是控制电灯的开关,这一个开关,又可以将一个最简单的电路(手电)变成一个二进制的编码,开和关分别是两个状态。

电报机和继电器 电报系统

电报系统的诞生正式开启了全球即时通信的时代,但是电报是怎么来的呢?想想一想如果将一个简单的控制电灯开关的电路系统分别放到你和朋友的家中,那你们就可以分别通过开关来控制对方家中的电灯,那么就可以信息的传递。电路系统使用的原理就是如此:在线路的一端通过一些措施,使得线路的另一端发生某种变化。

[[萨缪尔 莫尔斯]] 通过电磁现象在 1836 年通过专利局,成功发明电报机,但直到 1843 年,才说服国会为其创建公共基金。1844 年 5 月 24 日,华盛顿特区和马里兰州巴尔迪摩市电报线路架设完成,完成了人类历史上第一条信息的传递:「What hath God wrought!」

电报机的发明标志着现代通信的开始,人们第一次能够在视线或听力之外的距离开始实时交流,信息的传递速度比骏马还有快。

但是电报机最大的问题是长导线带来的电阻,电报线路使用高达 300 伏的电压使得有效距离可以超过 300 英里,但线路还是无法无限延长。

于是人们发明了中继系统,每隔 200 英里设定一个中继,接收信息,然后再转发出去。于是人们发明了继电器。通过电路的方式将信息转发出去。

阿拉伯数字 十进制

全球通用的数字系统通常被称为阿拉伯数字,起源于印度,被阿拉伯数学家带入欧洲。波斯数学家穆罕默德·伊本穆萨·奥瑞兹穆(根据这个人的名字衍生出英文单词 algorithm)在公元 825 年写了一本关于代数的书,使用了印度计数系统。

  • 阿拉伯数字系统和位置有关,一个数字的位置不同,表示计量不同
  • 没有专门用来表示数字 10 的符号
  • 比代表数字 10 的符号还有用得多嗯符号 0

这个 0,是数字和数学史上最重要的一个发明。0 的出现简化了乘法和除法。

十进制的代替

因为人类是有 10 个手指,所以适应了 10 进制,于是作者通过循序渐进的方式提问,如果是 4 指动物呢?于是进一步介绍了 8 进制,再如果是龙虾呢?两个大钳子,4 进制,再如果是海豚呢?两个鳍,2 进制。

当我们把数字系统减少到只有 0 和 1 的二进制系统时,我们无法找到比二进制系统更加简单的数字系统了。但是之前提到过的所有开关、电线、灯泡、继电器都可以用来表示二进制的 0 和 1。

二进制

1948 年,美国数学家约翰·威尔德·特克(John Wilder Turkey)意识到随着计算机的普及,二进制可能为发挥极大作用,所以发明了一个新的、更短的词语来替代不方便的 binary digital,选择了短小、简单、精巧的词 bit。

逻辑与开关

交换律:

A + B = B + A
A * B = B * A

结合律:

A + (B + C) = (A + B) + C
A*(B*C) = (A*B)*C

分配率:

A*(B+C) = A*B + A*C

传统代数是处理数字的,布尔的天才在于将代数从数的概念中抽离出来,更加抽象。在布尔代数中,操作数不是数字而是类(class),简单来说,一个类就是一个食物的群体(集合 Set)。

布尔代数中,符号 + 表示两个集合的并集,x 表示两个集合的交集。

但是布尔生活的那个时代,没有人把布尔代数用于电路。直到 20 世纪 30 年代的香农。

逻辑门

克洛德·艾尔伍德·香农在 1938 年,完成了《继电器和开关电路的符号分析》(A Symbolic Analysis of Relay and Switching Circuits)一篇著名的硕士论文,并在 10 年之后,发表《通信的数学原理》(The Mathematical Theory of Communication) 清晰尔严谨地阐述了,电子工程师可以运用布尔代数的所有工具去设计开关电路。如果简化了一个网络的布尔表达式,那么也可以简化相应的电路。

于是人们在简单的电路基础上抽象出了与门、或门、与非门、与或门等等。

字节与十六进制

8 比特表示一个字节(byte),8 比特在很多方面都比单独的比特更胜一筹。

全世界大部分书面语言(除了中日韩中使用的象形文字)的基本字符都少于 256 ,字节是一种理想的保存文本的手段。

当一个字节无法表示所有信息时,使用两个字节,也可以很好的表达。

从算盘到芯片

20 世纪 40 年代初期,真空管开始取代继电器,到 1945 年,真空管已经完全取代了继电器。

晶体管不再需要真空而是使用固体制造,体积比真空管更小,晶体管需要的电量更小,产生的热量更小,更持久耐用。

开发真空管的最初目的是为了放大电信号,但是同样可以应用于逻辑门的开关,作用和晶体管一样。

诺伊斯在 1957 年与其他 7 位科学家离开肖克利半导体创办仙童(Fairchild)半导体公司,并随后发明了集成电路。

1965 年摩尔(Moore)发现从 1959 年开始,同一块芯片上可以集成的晶体管数目每年番一倍。

到 20 世纪 70 年代,使用集成电路在一块电路板上制造一个完整的计算机处理器变得可能。

在比较微处理器时使用三个标准:

  • 多少位处理器,表示数据宽度,能够处理加减的比特位数
  • 最大时钟频率,单位 Hz,连接到微处理器并驱动运行的振荡器的最大频率,超过此时钟频率,微处理器将不能正常工作
  • 可寻址存储器的字节数

到 1972 年 4 月,英特尔发布 8008 芯片,一个时钟频率位 200KHz,可寻址空间为 16 KB 的 8 位微处理器。

启发或想法

虽然看到介绍已经大致了解了这绝不是一本晦涩难懂的书,但还是惊讶于作者可以将电路,布尔代数等等复杂的概念如此深入浅出地描述给作者,并且中间穿插非常多的物理学、数学发展历史,以及历史上这种对计算机硬件发展起决定性作用的部件,继电器,晶体管等等,让这一本书不但在了解计算机组成部分之外还了解到了大量有趣的历史决定时刻,让我感受到了那个天才,英雄辈出的时代精神。

在读书的过程中,不断地有各个时期学过的课程浮现在眼前,物理中的电磁学,到大学时期的,电路,代数,汇编等课程,在阅读的过程中非常享受所有知识融为一体的感觉。

曾经有一个问题总是困扰着我,[[人类为什么在近 200 年发展如此快]]?在这一本书中我更进一步的体会到了如下的几点:

  • 人类信息交换的速度变快了,这也就意味着[[波普尔]]所说的假设验证的速度变快了,在地球一端所提出的概念,可以在地球的另一端被验证。而这一过程恰恰是伴随着电路,电报,计算机,网络的发明而发生的
  • 社会的分工和合作,知识的交换创造了更高的价值,知识的自由分享产生了巨大的复利,[[布尔]]多年前的代数理论,[[冯诺伊曼]]构想的计算机结构,等等一系列思想的发展总是以超前的姿态引领着人类科技的发展

谁应该看这本书

  • 想要了解计算机是如何工作的人
  • 想要了解计算机发展历史的人

印象深刻的 Quotes

在作者对芯片的描述中,作者总结出三点去描述微处理器,时钟频率,可寻址字节数,以及位数,而这三者则是作者铺垫了非常多章节的内容,当我读到时顿时感受到了作者清晰的写作思路。


2022-07-03 reading , reading-2022 , code , computer , computer-language , encoding , computer-software , language

使用 Owncast 搭建自己的在线视频串流直播间

Owncast 是一个开源,可自行架设的、去中心化的,单用户视频串流工具。Owncast 使用 Go 语言编写。支持简单的在线聊天,支持 HLS 和 S3 存储。

Owncast 可以很好的成为 Twitch,YouTube Live 等等在线直播平台的代替。用户可以完整地控制自己的内容以及服务器。

Prerequisite

  • Ubuntu 20.04
  • [[FFmpeg]] 4.2 以上版本,需带有 x264/var_stream_map

Docker 安装

Docker compose1 如下:

version: '3.3'

services:
  owncast:
    image: 'gabekangas/owncast:latest'
    restart: always
    volumes:
      - '${CONFIG_PATH}/data:/app/data'
    ports:
      - '8080:8080'
      - '1935:1935'

启动容器之后,进入 /admin 页面,默认的用户名和密码是,admin 和 abc123

手动安装

安装 FFmpeg

apt update
apt install ffmpeg

下载 owncast:

mkdir -p /opt/owncast && cd /opt/owncast
wget https://github.com/owncast/owncast/releases/download/v0.0.2/owncast-0.0.2-linux-64bit.zip
unzip owncast-0.0.2-linux-64bit.zip

修改配置文件:

vim config.yaml

修改自己的串流秘钥和信息,样例文件内容如下:

# See https://owncast.online/docs/configuration/ for more details

instanceDetails:
  name: EV   //名称
  title: EV Live Stream  //网站标题

  logo:
    small: /img/logo128.png
    large: /img/logo256.png

  tags:
    - music
    - software
    - streaming

  # https://owncast.online/docs/configuration/#external-links
  # for full list of supported social links.  All optional.
  socialHandles:
    - platform: github
      url: http://github.com/owncast/owncast
    - platform: mastodon
      url: http://mastodon.something/owncast

videoSettings:
  # Change this value and keep it secure.  Treat it like a password to your live stream.
  streamingKey: secret_key   //串流秘钥

启动 owncast

./owncast

启动后查看日志文件 transcoder.log 如果没有报错着运行成功,如报错无法正常串流播放

可以使用 screen 或者 [[tmux]] 等工具在使用后台运行 owncast:

screen -S live  //创建新的命令行
cd cd /opt/owncast  //进入目录
./owncast  //执行脚本

服务器需要开放端口 1935,8080 设置 OBS 串流

服务器 rtmp://127.0.0.1/live 串流秘钥 [secret]

播放地址 http://127.0.0.1:8080

成功运行之后,日志文件在 transcoder.log

自动安装

cd /your/own/path
curl -s https://owncast.online/install.sh | bash

执行成功之后会返回默认的端口和默认的 streaming key。

cd owncast
./owncast
# change port
./owncast -webserverport 8095

配置 Nginx 反向代理,如果熟悉 [[Nginx Proxy Manager]] 也可以直接使用这个反向代理。

添加配置文件 vi /etc/nginx/conf.d/owncast.conf:

server {
    listen 80;
    server_name     你的域名;

    location / {
        proxy_pass http://127.0.0.1:8080;    #8080改为Owncast对外开放的端口,默认为8080
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

测试:

nginx -t

使配置生效:

nginx -s reload
sudo systemctl start nginx
sudo systemctl enable nginx
# 获取证书
sudo certbot --nginx

配置 [[systemd]],修改文件 vi /etc/systemd/system/owncast.service:

[Unit]
Description=Owncast Service

[Service]
Type=simple
WorkingDirectory=/your/own/path/owncast  #注意替换位置
ExecStart=/your/own/path/owncast/owncast  #注意替换位置
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

生效:

systemctl daemon-reload
systemctl enable owncast
systemctl start owncast

设置 OBS

OBS 官网 安装OBS,在设置>服务中选择自定义(Custom),在管理员页面获取RTMP服务器链接和流密钥并填入OBS中,点击Start Streaming测试链接,开始推流。

FFmpeg

也可以直接从命令行使用 [[FFmpeg]] 来推流到 Owncast 服务器。

ffmpeg -re -i /path/to/video.mp4 -c copy -f flv rtmp://localhost:1935/live/secret_key
# or
ffmpeg -i "http://IP_OF_HDHR:5004/auto/vCH.N" -c:v libx264 -c:a aac -b:v 512K -maxrate 512K -bufsize 1M -f flv rtmps://OWNCAST_URL:PORT/live/STREAM_KEY
# or
ffmpeg -video_size 1280x720 -i $1 \
  -c:v libx264 -b:v 512k -maxrate 1984k -bufsize 3968k \
  -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://live.einvrne.info/live/KEY

或者:

ffmpeg -f alsa -ac 2 -i hw:1,0 -thread_queue_size 64 \
  -f v4l2 -framerate 60 -video_size 1280x720 -input_format yuyv422 -i /dev/video2 \
  -c:v libx264 -preset veryfast -b:v 1984k -maxrate 1984k -bufsize 3968k \
  -vf "format=yuv420p" -g 60 -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://<ip-of-your-server>/live/<your-streaming-key>

如果串流 MP4 遇到:

Codec mpeg4 is not supported in the official FLV specification,

解决方案:

ffmpeg -re -nostdin -i "$file" \
    -vcodec libx264 -preset:v ultrafast \
    -acodec aac \
    -f flv rtmp://<your-server>/app/STREAM_KEY

说明:

  • -vcodec codec 设置视频编码器,是 -codec:v 的别名
  • -acodec codec 设置音频解码器,是 -codec:a 的别名
  • -nostdin 表示禁止交互输入
  • -preset:v 表示使用 FFmpeg 默认的编码,按速度降序 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
  • -f fmt 强制指定输入或输出的文件格式

ffmpeg -re -i ~/INPUT_FILE -vcodec libx264 -profile:v main -preset:v medium -r 30 -g 60 -keyint_min 60 -sc_threshold 0 -b:v 2500k -maxrate 2500k -bufsize 2500k -filter:v scale=”trunc(oha/2)2:720” -sws_flags lanczos+accurate_rnd -acodec libfdk_aac -b:a 96k -ar 48000 -ac 2 -f flv rtmp://live.twitch.tv/app/STREAM_KEY

reference


2022-06-29 owncast , docker-compose , docker , livesteam

修复突然断电后 git 仓库 corrupt

今天在 Ubuntu 下编译项目,突然负载飙升到 140 多,然后整个系统就卡住,所有 UI 卡死,无奈之下只能对系统强制重启,不过重启之后发生了一件更严重的问题,当我访问我的项目,执行 git status 之后,显示:

error: object file .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55 is empty
error: object file .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55 is empty
fatal: loose object 2bca69094c49050b232756d8d862c39be9d4fe55 (stored in .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55) is corrupt

git 仓库损坏了!虽然之前因为把 git 放到 Syncthing 中同步也曾经出现过一次 corrupt 的情况,但是之前修复的时候已经把全部代码 push 到了远端仓库,所以直接重新拉一下代码就可以。

但是这一次我本地的分支没有推送到远端所有的修改还在本地,但是这个时候已经无法访问本地的分支代码了!

这个时候立马去网上 Google 解决办法,大部分的回答都让我删除掉 .git 目录,然后重新去远端获取。但这个方法一定会丢掉本地的修改,所以没有尝试,等到最后实在没有办法的时候再试试吧。

rm -fr .git  
git init  
git remote add origin your-git-remote-url  
git fetch  
git reset --hard origin/master  
git branch --set-upstream-to=origin/master master   

然后继续查看解决办法的时候发现了,可以使用:

git repair
git repair --force

执行完成之后,发现分支回来了。然后赶紧拉一下代码 git pull

之后在切换分支的时候发现本地的分支还在,所以基本完成修复。

另外一个项目也出现了相同的问题,不过本地分支名丢失了,不过还好之前合并过其他分支,在 git log 中找到之前的分支最后一次提交 commit id,重新 checkout 一个新分支即可。

深入 .git 目录 refs

Git 中大部分行为都会有一个 hash 来存储,可以使用 git show 52611da62ae41498fa186ec8b4913b5c7173a896 ,但是这需要用户记住所有的 hash 值,但 hash 值是一个随机的字符串,非常难以记忆,所以 Git 提供了一个 references(引用),或者简称 refs

引用是存储在 .git/refs 目录下的文件,通常这个文件中包含一个 commit object 的 hash。

$ ls -F1 .git/refs 
heads/
master
remotes/
tags/
v0.3

heads 目录中包含了所有本地分支,每一个文件都对应着一个分支名字,文件内容就是该分支最新的 commit hash。

在 Git 中,分支其实就是一个引用,修改 master 分支,其实 Git 只需要做的事情就是改变 /refs/heads/master 文件内容。而类似的,创建一个分支,其实就是将 commit hash 写到一个新的文件中。

而同样 tags 目录也是一样的,这个目录中包含标签的信息。

Special Refs

Git 也有一个特殊的引用,HEAD,这个一个当前分支的引用,而非对 commit hash 的引用。

cat .git/HEAD
ref: refs/heads/dev

可以看到的是当前正在 dev 分支。当然也可以将 HEAD 直接指向一个真实的 commit id,这个时候 Git 会提示 detached HEAD state,意味着你当前不是在一个分支上。

除了 HEAD 这个特殊的 refs,还有一些其他的:

  • FETCH_HEAD: 从远端最近一次拉取的分支
  • ORIG_HEAD: A backup reference to HEAD before drastic changes to it
  • MERGE_HEAD: The commit(s) that you’re merging into the current branch with git merge.
  • CHERRY_PICK_HEAD: The commit that you’re cherry-picking.

Reflog

Reflog 是 Git 的安全网,他会记录在仓库中所有的操作。可以将其想象成一个本地仓库修改的时序历史记录.

Git reflog 是一个你对本地仓库所作的所有修改的记录。每一次提交,每一次切换分支,都会在 reflog 中留下记录。

在 Git 仓库中执行:

git reflog
ceb40ab [email protected]{0}: commit: messsage

reference


2022-06-27 git , linux , git-repair

金融的本质 读书笔记

《金融的本质》是美联储主席[[本 伯南克]]关于美联储历史,以及在 2008 年应对金融危机手段的一本科普读物。本伯南克以非常通俗的语言讲述了美联储的历史,以及央行的职能。每一章节后面都有一个答学生的提问,所以看起来就像是一本写给学生的科普读物,读完可以对美联储是做什么的?为什么要成立美联储?以及当危机来临时美联储能够做什么?有非常详细的介绍和解释。

怎么知道的这一本书

在和朋友聊天的时候,说到美联储,于是朋友给推荐了这一本。

几句话总结书的内容

  • 美联储的起源与历史,以及美联储调整经济的手段
  • 本 伯南克应对金融危机的应对措施和后续影响
  • 危机之后有什么弥补手段

启发或想法

美联储的作用

美联储作为美国的央行,其决定对全世界的经济都会产生一定的影响,这两天美联储加息,股市暴跌,成为了日常的新闻。而美联储为什么要这么做呢?很多报道都会提到为了压制美国的通货膨胀,而为什么美联储能够通过调整利率来影响通货膨胀呢?这一本书里面都有详细的说明。

中央银行的职能:

  • 维持金融稳定,保证金融体系正常运行,缓解或阻止金融危机或金融恐慌
  • 维持经济稳定,保持经济增长,保持低通胀,避免大幅波动

美联储的影响经济的手段

显然为了实现央行的职能,美联储能够使用一些工具来调整经济运行。

  • 维持金融稳定,央行的工具是成为最后贷款人角色,为金融机构提供短期流动性和资金支持。
  • 为了维持经济稳定,央行最重要的工具是货币政策,在正常时期,货币政策主要体现为短期利率的调整。在通常情况下美联储可以通过在公开市场买卖证券(通常是短期政府债券),来降低或提高短期利率。当经济增长过缓或通胀水平过低时,美联储可以通过降息来刺激经济发展。

这里提到的短期利率,主要是对隔夜拆借利率的管理。也就是调整各银行向美联储借钱的成本,隔夜利率又称联邦基金利率。通过提高或降低短期利率,美联储可以影响更大范围的利率。

在最极端的情况下,如果调整货币政策已经无法影响经济,美联储还可以实行大规模资产购买计划,即媒体和其他地方所说的量化宽松。

基本工具:

  • 货币政策,隔夜拆借利率
  • 流动性供给(最后贷款人)

金本位的问题

什么是金本位呢?相信大部分人在教科书上曾经学过,简单来说就是一个国家的货币发行和黄金储备挂钩,央行有多少黄金才能发行多少货币,金本位是一种货币体系,在这个体系中,货币的价值以黄金的重量来衡量。这也就意味着手上的货币可以到央行兑换黄金。

但是也相信大部分人都知道金本位在上世纪已经破产了,大部分的国家已经抛弃了金本位。

金本位的缺点:

  • 资源浪费,开采,运输成本
  • 限制了货币供给,央行不能灵活地调整利率(在经济不景气时下调利率,在通胀时上调利率)
  • 金本位的国家货币之间形成一个固定汇率体系,一个国家货币供应量出现问题,会传导到另一个国家,从而剥夺另一个国家独立管理其本国货币政策的权力
  • 投机,短期的投机行为,挤兑银行

金本位的优点:

  • 维持货币价值的稳定,让通胀维持在一定水平(长期如此),但是短期会经常发生通货膨胀或通货紧缩

通货膨胀的本质

通货膨胀无论在何时何地都是一个货币现象。通过货币政策来维持过底的失业率,最终会引发通货膨胀。 价格是经济的温控器,是经济赖以运行的机制。所以,管控工资和物价意味着整个经济体存在短缺及其他各种问题。 低通胀是一件非常好的事情,长时间低而稳定的通胀率会使经济更加稳定,有利于保持健康的增长率和生产率以维持经济活动。

大而不倒

[[大而不倒]],有一部同名的纪录片讲述的就是 08 年金融危机之后,美国财政部长,联合美联储,巴菲特等等在经济中扮演重要角色的人物拯救华尔街金融机构的故事。而大而不倒也成为了经济中一个潜在的问题,如果一家机构大到足够影响经济,那么就不会让其轻易地倒闭,显然长期来看对于整个宏观经济是不利的。如果一个体系中存在一些企业“大而不倒”(too big to fail),那么这个体系一定存在某些根本性缺陷。

想要确保金融体系有所变革,为的是以后再有类似美国国际集团这样的系统重要性机构面临此类压力时,能够以一种安全的方式倒闭。


2022-06-21 reading , reading-2022 , financial , financial-crisis

电子书

最近文章

  • PlanetScale 云端 MySQL 数据库使用记录 [[PlanetScale]] 构建在 Vitess 之上。[[Vitess]] 是一个可以扩展的 MySQL 集群,集合了很多MySQL特性和NoSQL 的扩展能力。 Vitess 创建于 2010 年,主用用于解决 YouTube 团队面临的 MySQL 扩容问题。
  • 新教伦理与资本主义精神 读书笔记 怎么知道的这一本书 在了解 [[马克思 韦伯]] 的时候,不管是介绍其人,或者是他的传记作品中都不断提及这一部巨著。
  • 谣言 世界最古老的传媒 读书笔记 在阅读上一本 [[法国大革命前夕的舆论和谣言]] 的时候接触到了这一本《谣言:世界上最古老的传媒》,作者让-诺埃尔-卡普费雷(Jean-Noël Kapferer)系统地剖析了什么是谣言,为什么会存在谣言,谣言的传递遵从什么样的规则,我们能不能消灭谣言等等。作者收集了世界上曾经流行的种种谣言,引用了诸多社会心理学实验,去阐述了这些谣言的来源,人们为什么会相信这些谣言,人们又是如何利用谣言来达成自己的目的。
  • 在 IntelliJ IDEA 中使用 reset frame 回退 Debug 在 IntelliJ IDEA 中调试的时候,如果不小心断点跳过了,如果可以往前跳转就可以省去很多时间。搜索一下之后发现,在 IDEA 中叫做 Reset Frame(之前叫做 Drop Frame)。
  • 从 mkv 文件中提取字幕文件 mkv 是一种容器,可以包含视频,音频流,也可以包含字幕等等文件,如果要从 mkv 文件中提取字幕,可以使用一款叫做 mkvtoolnix 的命令行工具。