要想学好一门语言,是一个需要长期花时间的过程,听说读写一样都不能落下。之前我也要推荐过学习英语,就应该使用英英字典(当达到一定的词汇量之后),学习英语就应该让自己的耳朵沉浸在英语发音中(可以通过听英语播客),当能够听懂大部分的内容的时候,无字幕看电影也是一种沉浸式的学习方法,到通过[[影子跟读法]] 来练习发音,完成一个语言的听说读写之后才能形成一个学习的闭环。
这篇文章抛开那些枯燥的学习方法介绍几个非常有意思的语言学习小工具。
Language Reactor 是一个 Chrome 插件,可以在 Netflix,YouTube 等等流媒体平台上实时显示多语言字幕。
YouGlish 是一个通过单词短语来搜索视频(音频)的网站,非常适合用来学习英语发音,在网站中随便搜索一个单词,YouGlish 就会在 Youtube 上搜索包含这个单词的视频句子,听到真正的 Native Speaker 发音,可以通过模仿,重复来提高自己的英语口语。
也可以选择各种类型的发音,当然也可以学习其他语言。
这个网站支持非常多的语言。
比如日语:
Immersive Translate 是一款开源的 Chrome 插件,可以将网页的内容翻译在原文下方。
比如当看到日文的,或英文的网页时,可以将翻译内容直接显示在文字下方。
selectext 是一款可以复制视频内文字的浏览器插件。当你在看英文,或其他语言教程的时候,遇到想要查字典的单词,可以暂停视频,然后复制视频中的文字。
比如当看到这个视频,想要查一下 町 的意思,就可以暂停视频,然后点击视频左上方的 S,之后插件就会对视频内容进行 OCR,视频出其中的文字,然后点击其中的方框就立即能复制到粘贴板中。
数字签名是一种基于摘要算法和非对称加密技术的防止数据在传输过程中被篡改的安全技术。
数字签名的原理是对传输的内容做摘要(SHA245 等),然后把摘要和用到的摘要算法使用非对称加密技术的公钥或私钥(大部分情况下是私钥)生成签名。接收方接受到数据后,把签名信息用私钥或公钥验证来确保内容的完整性。
XML 数字签名是数字签名的基础上定义出来的一种 XML 数字签名规范,和普通的数字签名相比较有不少优点,比较灵活。XML 数字签名即可以对传输的所有内容签名,也可以只对传输的一小部分内容进行部分签名。不同的签名还可以使用不同的算法和密钥。[^1]
[^1]:https://www.w3.org/TR/xmldsig-core2/
XML Signature 是一个定义数字签名的 XML 语法的 W3C 推荐标准。从功能上或,XML Signature 与 PKCS#7 有很多共同点,但是 XML 签名具有更好的可扩展性,并为签名 XML 文档做了调整。XML Signature 在许多 Web 技术,如 SOAP, SAML 等中使用。
最近在调研日本 e-Gov 电子申请的时候,所使用的签名技术就是基于 XML 的签名,因为提交的数据格式是 XML ,并且涉及到敏感信息所以签名是必不可少的部分。
XML 数字签名分成三种类型:
它们的差别在于 XML 文档结构不同。
Enveloped 格式 XML 签名是把签名节点 Signature
直接嵌入到原始 XML 文档中。比如下方的样式中的 <Signature>
节点。
e-Gov 采用的方式就是这个 Enveloped 格式。
<?xml version="1.0" encoding="UTF-8"?>
<POrder>
<Item number="130055555232">
<Description>Game</Description>
<Price>19.99</Price>
</Item>
<Customer id="8492340">
<Name>My Name</Name>
<Address>
<Street>One Network Drive</Street>
<Town>Burlington</Town>
<State>MA</State>
<Country>United States</Country>
<PostalCode>01803</PostalCode>
</Address>
</Customer>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>tVicG91o5+L31M=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
...
</SignatureValue>
<KeyInfo>
<X509Data>
<X509SubjectName>
CN=Your Name,O=Certificates Inc.,C=US
</X509SubjectName>
<X509Certificate>
...
</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</POrder>
Enveloping 格式的 XML 签名和 Enveloped 正好相反,把原始 XML 文档作为子节点,插入到新生成的 Signature 节点的 Object 子节点中。
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#order">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>+8cIU+LQ=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
...
</SignatureValue>
<KeyInfo>
<X509Data>
<X509SubjectName>
CN=Your Name,O=Test Certificates Inc.,C=US
</X509SubjectName>
<X509Certificate>
...
</X509Certificate>
</X509Data>
</KeyInfo>
<Object ID="order">
<POrder>
<Item number="130045555532">
<Description>Game</Description>
<Price>19.99</Price>
</Item>
<Customer id="849">
<Name>Your Name</Name>
<Address>
<Street>One Network Drive</Street>
<Town>Burlington</Town>
<State>MA</State>
<Country>United States</Country>
<PostalCode>01803</PostalCode>
</Address>
</Customer>
</POrder>
</Object>
</Signature>
这里需要注意的是 Reference 节点中指向的部分,如果使用空值表示指向文档根节点,而如果指定了值,那就是指向 XML 文档中的部分内容。
Detached 格式是指新生成的 Signature 节点作为一个独立的文档单独保存和传输,而不会对原始文档进行修改。
对于 XML 签名来说就是根据 XML 文档内容以及证书生成下面的一个签名结构。
<Signature ID?>
<SignedInfo>
<CanonicalizationMethod />
<SignatureMethod />
(<Reference URI? >
(<Transforms>)?
<DigestMethod>
<DigestValue>
</Reference>)+
</SignedInfo>
<SignatureValue>
(<KeyInfo>)?
(<Object ID?>)*
</Signature>
举例
<署名情報>
<Signature
xmlns="http://www.w3.org/2000/09/xmldsig#" Id="20230720113000">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod>
<Reference URI="#%E6%A7%8B%E6%88%90%E6%83%85%E5%A0%B1">
<Transforms>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
<DigestValue>BdQwkfm3lyDWV2mTu+CxBPU=</DigestValue>
</Reference>
<Reference URI="900A01000200800001_01.xml">
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
<DigestValue>2WrlTW71oH+E6FuhxGR0=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>gjeaEM7qng==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIEizCU</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</署名情報>
Signature
节点是数字签名根节点SignedInfo
保存签名和摘要信息以及使用的各种算法
SignedInfo
中的 CanonicalizationMethod
子节点用来指定生成签名的 SignedInfo 节点规范化处理方法,具体的方法可以参考规范中的 「Exclusive XML Canonicalization」
SignatureMethod
子节点用来指定签名使用的摘要算法和签名算法
Algorithm
值是 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
表示使用的签名算法是 SHA256-RSASignedInfo
可以包含一个或多个 Reference
子节点,每个 Reference 用来指定某个引用的 XML 节点经过规范化后的摘要信息和生成摘要的方法
#node
,或者直接是指定文件名。SignatureValue
用来记录整个 SignedInfo
节点经过规范化后输出内容的签名,并使用 Base64 编码算法转换成可见的字符串KeyInfo
可选,用来保存验证签名的非对称加密算法公钥(只有公钥可以公开)Object
节点是可选的,只有在 Enveloping XML 签名时才会用到XMLSec Library 支持 W3C 的 XML Signature 和 XML Encryption 规范,同时也支持 Canonical XML 和 Exclusive Canonical XML 规范。
主要工作是根据内容创建 Signature 节点。主要是分成三个步骤
構成情報
,另外一个是手续的申请书。当有了完整的 Signature 节点之后再根据不同的格式对 XML 内容进行操作。
有 XML 签名的过程,同样在验证时只需要对上面的过程进行逆向就可以。当接收方接收到了包含 Signature 的 XML 文档。
通过以上的验证就可以确保传输的内容没有被篡改。
引入依赖
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>2.2.3</version>
</dependency>
编码例子
public static void sign(Key signKey, X509Certificate signCert, Element signElement) throws XKMSException {
String elementId = signElement.getAttribute("Id");
if (elementId == null) {
throw new XKMSException("Id of the signing element is not set");
}
String elementRefId = "#" + elementId;
IdResolver.registerElementById(signElement, elementId);
try {
XMLSignature signature = new XMLSignature(signElement
.getOwnerDocument(), elementRefId,
XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1,
Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
signElement.appendChild(signature.getElement());
Transforms transforms = new Transforms(signElement
.getOwnerDocument());
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms
.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
signature.addDocument(elementRefId, transforms,
MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1);
signature.addKeyInfo(signCert);
signature.addKeyInfo(signCert.getPublicKey());
signature.sign(signKey);
} catch (XMLSecurityException xmse) {
throw new XKMSException(xmse);
}
}
最近 macOS 系统磁盘空间告急,之前就出现过因为磁盘空间不足导致系统卡顿还出现突然黑屏的状态,所以这次就看到还剩余几十个 GB 的时候就开始清理工作了。清理的同时顺便就整理一下常用的几个清理工具。
在清理之前首先要对本地磁盘文件做一个整体的了解,虽然 macOS 自带一个存储管理的查看面板,但是实在是太简陋,也只能提供非常简单地查找大文件的工具。
比如说从系统提供的 Storage 预览中能看到 Documents 占用的空间最多,可以点开后面的圆形 i 图标,可以看到其中占用空间很大的几个文件。
比如说对于我,就是我安装的两个虚拟机占用了比较多的空间,但这也是预想之内的。
上面的方式只能找出来系统中的大文件所在,如果我想知道每一个文件夹所占用的空间大小,我之前的文章中介绍过gdu ,这个时候就派上了用场。
brew install gdu
然后直接对想要统计的目录运行 sudo gdu ~/
PrettyClean 是一款 macOS 上的免费清理工具,界面非常简单。
App Cleaner 是一款可以用来快速卸载应用以及应用相关残留文件的应用,非常小巧,但是非常强大。
listmonk 是一个开源的,使用 Go 语言编写的,自托管的邮件列表订阅应用。目前已经在 GitHub 收获了超过 10000 颗星星,listmon 速度非常快,功能丰富,并且可以直接打包成一个二进制文件,和 PostgreSQL 数据库一起使用。
借助 listmonk 可以非常快速的搭建属于自己的 Newsletter,Newsletter 是一种基于邮件的时事通讯,企业或组织可以通过邮箱给其成员,客户,员工或其他订阅者发送活动的新闻及广告营销的方式,但最近也逐渐成为个人出版、自媒体的流行订阅形式,相比 RSS,它更加自主,有更好的阅读体验,并且可以有更灵活的付费方式。
特性:
具体的 docker-compose 可以看这里,listmonk 需要依赖一个配置文件,我一般习惯直接放在 HOME 目录中
git clone git@github.com:einverne/dockerfile.git
cd dockerfile/listmonk
cp env .env
# edit .env
# create config.toml
vi ~/listmonk/config.toml
然后填入一下内容。注意将配置文件中的内容填写,比如用户名和密码,数据库连接方式替换为自己的内容。
[app]
# Interface and port where the app will run its webserver.
address = "0.0.0.0:9000"
admin_username = "username"
admin_password = "password"
# Database.
[db]
host = "host"
port = 5432
user = "listmonk"
password = "pass"
database = "listmonk"
ssl_mode = "disable"
max_open = 25
max_idle = 25
max_lifetime = "300s"
当添加完配置文件之后,就可以使用 docker-compose up -d db
来启动数据库了,但是 listmonk 应用不回初始化数据库 Schema,所以还需要进行初始化数据库操作。
docker-compose run --rm app ./listmonk --install
等初始化数据操作完成,可以通过进入 PostgreSQL 容器查看表结构来验证。
docker exec -it listmonk_db /bin/bash
psql -d listmonk -U listmonk -W
\dt
最后就可以启动应用 docker-compose up -d
这部分内容已经在我上面提及的 docker-compose.yml
文件中存在。
app:
<<: *app-defaults
container_name: listmonk_app
depends_on:
- db
command: "./listmonk --static-dir=/listmonk/static"
volumes:
- "${LISTMONK_CONFIG}/config.toml:/listmonk/config.toml"
- "./static:/listmonk/static"
加入已经在 [[MailChimp]] 或者 [[Substack]] 上有一定的订阅用户,那么可以通过后台工具导入 csv 文件。但需要注意的是,导入的用户默认状态是 Unconfirmed,所以需要进入数据库手动更新用户的状态。
docker exec -it listmonk_db /bin/bash
psql -d listmonk -U listmonk -W
输入密码登录数据库,然后执行 \dt
查看表。然后查看表内容
SELECT * from subscriber_lists;
然后更新所有人
UPDATE subscriber_lists SET status='confirmed' WHERE list_id=4;
默认情况下 listmonk 运行在 HTTP,不提供 SSL,我们可以借助 Nginx 和 Let’s Encrypt 来生成证书提供更安全的访问。
有很多种方式可以完成
之前好几篇文章也介绍过 HestiaCP 面板中的模板文件,所以这里就简单再总结一下。
首先与进入 root 账户 sudo su -
然后进入如下的目录
cd /usr/local/hestia/data/templates/web/nginx/php-fpm/
这个目录中包含了 HestiaCP 默认的 Nginx 模板。
cp default.tpl listmonk.tpl
cp default.stpl listmonk.stpl
然后分别修改这两个新生成的 listmonk 配置文件。
将其中 location 部分修改
location / {
proxy_pass http://localhost:9001;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
然后最好把 stpl
文件中的 proxy_hide_header Upgrade;
删除。
再进入 HestiaCP 管理后台,创建用户,然后创建网站,填入域名。创建域名进入高级管理,在 Web Template(Nginx)中选择刚刚创建的 listmonk,保存。然后在高级设置中,配置 SSL,等待获取证书,保存之后就能通过域名来访问 listmonk 了。
如果使用 Docker 安装,那么升级非常简单,更新镜像,更新数据库,重启即可。
docker compose pull
docker compose run --rm app ./listmonk --upgrade
docker compose up app db
今天在 Twiter 上看到 .box 这个顶级域名开始开放 Early Access,然后就突然想起来之前突然某一天 Twitter 大家都换上了 .eth 的昵称。突然很多陌生的名词出现了,比如什么是 ENS,什么是 DID。
.eth 是 ENS(Ethereum Name Service)域名服务提供的一种以太坊地址命名方式。它是一种去中心化的域名系统,将难以记忆的以太坊地址转换为更容易记忆的名称。.eth
域名可以被认为是一种以太坊上的虚拟资产,可以购买、出售、转让和租赁。与传统的域名系统不同,.eth
域名是在以太坊区块链上注册的,所有权也是通过智能合约进行管理和转移。
ENS 全称为 Ethereum Name Service,是以太坊上的一种域名服务,类似于互联网上的 DNS。它通过将以太坊地址映射到易于记忆的名称,使用户能够更轻松地发送和接收加密货币。通过 ENS,用户可以使用类似于“myname.eth”这样的名称来代替其以太坊地址。ENS 名称可以用于接收以太币和其他以太坊资产,还可以用于智能合约和去中心化应用程序(DApps)。
DID 全称为 Decentralized Identifier,是一种去中心化身份标识符。与传统身份验证方式不同的是,DID 是基于分布式账本技术建立的,它使得用户可以在不泄露自己身份信息的情况下进行认证和授权。每个 DID 都是唯一的,且由该 DID 的所有者完全控制。DID 可以与加密货币钱包等数字身份验证系统相结合,为用户提供更安全、更私密的身份验证方式。
DAO 是“去中心化自治组织”的缩写,是一种基于区块链技术的组织形式。DAO 的核心思想是将组织的管理权和所有权分散到所有的成员手中,实现去中心化的组织管理。
DAO 是由一组智能合约和区块链技术构成的自动化组织,它们的运行是由算法和代码决定的,而不是由人类中央管理。成员可以通过投票决定组织的战略、预算、分配和其他重要事项。
DAO 的主要优点是去除了传统组织中的中心化、层级化结构,使组织更加透明、公正和开放。此外,DAO 还可以通过智能合约的执行自动化流程,以降低运营成本和提高效率。但是,DAO 也存在一些风险和挑战,例如智能合约的漏洞、成员之间的信任问题等。
DApps 全称为 Decentralized Applications,即去中心化应用程序。与传统的应用程序不同,DApps 是基于区块链技术构建的应用程序,其数据和运行代码存储在区块链网络中,而不是集中式服务器上。DApps 使用智能合约来实现代码逻辑,保证了应用程序的去中心化和安全性,同时也去除了中间商的干预。DApps 可以用于各种场景,如数字货币钱包、去中心化交易所、投票系统、游戏等。
再回到本文的主角 .box 身上,box 是一个基于 Web 3.0 的顶级域名,但是 .box 兼容 Web 2.0 可以直接被访问到。我们知道在加密货币区块链的领域,每个人的帐号都是一大串几乎不能被记忆的地址。Ethereum Name Service (ENS) 就是想要扮演 Web 3.0 的 DNS 系统,让所有的地址都可以通过一次「解析」而被访问到。
box 域名可以作为 :
Ethereum Name Service (ENS) 将会在今年 9 月份发布 .box 域名,注册使用 .box 域名会和 .eth 域名一样,都是通过区块链完成。
Ethereum Name Service (ENS)是一种区块链原生的域名系统,为用户在 Web3 和加密平台上提供身份认证。 它与传统域名系统有着相同的基本概念,只是使用了基于以太坊区块链的分布式技术。 ENS 的主要功能是将机器可读的标识符(如加密货币地址)转换为人类可读的域名。ENS 地址或 URL 以.eth 结尾,用简单的域名如”James.eth”取代了加密地址中的长串数字。
每个.eth 域名是用于识别以太坊地址、哈希、元数据和其他基于区块链的地址的标识符。即将推出的.box 命名系统与.eth 类似,主要区别在于.box 域名将通过 ENS 和 Web 浏览器访问,而不使用传统的 Web DNS。通过新的.box 域名,用户可以在当前使用的 Web 浏览器上访问他们的区块链地址。
Atuin 是一个可以同步,备份 Shell 命令历史的服务。借助 Atuin 可以在多台设备之前同步 Shell 命令历史,所有的命令都在数据库(SQLite)中加密存储。
安装 Atuin 命令行工具
brew install atuin
安装完成之后配置 ZSH
echo 'eval "$(atuin init zsh)"' >> ~/.zshrc
配置服务器地址,首先创建一个配置文件
vi ~/.config/atuin/config.toml
sync_address = "https://atuin.xxx.com"
注册帐号
atuin register -u username -e email@gmail.com -p password
登录
atuin login -u username -p password
同步
atuin sync
今天我购买了一个 Ledger Nano S Plus,是一个入门款的[[硬件钱包]](冷钱包),借此契机也正好从头开始学习和整理一下[[加密货币]]相关知识。
之前已经写过一篇文章系统的讲述了什么是助记词,以及为什么可以通过助记词来回复加密货币钱包。简单来说就是助记词就是一连串特定单词组成的字符串,一般是 12 个,或 24 个单词,可以用来备份或恢复钱包的私钥。
[[硬件钱包]] (也被称为冷钱包)是一种物理的电子设备,使用随机数生成器(RNG)生成公钥以及私钥。生成的密钥随后存入设备内,设备不会接入互联网,所以比较安全。
照着官方的手册和在线的说明流程,下载 Ledger Live,然后用 USB 数据线连接电脑。设置 4 到 8 位 PIN 码,然后用笔在赠送的纸上写下 24 个助记词(千万记住助记词是不能接触互联网的,不管是记录到电脑中,还是拍照都是不可以的),完成设置之后,可以用 Ledger Live 下载对应的 App 到 Nano S Plus 中之后,就可以创建钱包,生成地址了。
但是为了为了更安全,更熟悉地使用使用硬件钱包,我故意输错了 3 次 PIN 码,让 Ledger 重置,然后再用刚刚记下来的 24 个单词恢复钱包。这一步的目的就是为了确保我记录下来的助记词是完全正确并且可以恢复的。否则如果遇到硬件钱包丢失,或者损毁都可以不再担心,只需要保管好助记词就可以了。
在恢复完成之后,我又从 [[Binance]] 转出了少量的 BNB 到 Ledger 钱包中,为了确保 Ledger 钱包是完全可以正常工作的。至此初始化的过程就做完了,之后就可以正常的利用起来。
另外一个小技巧就是当只有一个 Ledger 的时候,也可以通过故意输错 PIN 的方式,让设备重置,然后重新生成一个新的助记词,那么原来的钱包还是存在的,也可以定期往其中转入加密货币,但是这个钱包就没有任何设备可以管理。于是就可以通过一个 Ledger 来生成多个钱包的目的。
另外一个需要注意的是,Ledger 生成的助记词是可以恢复到任何厂家的硬件钱包上的,但是需要查看该硬件钱包是否支持全部的币种,如果有不支持的币种,就没有办法管理了。但是不需要荒,加密货币还是在的,只需要将助记词恢复到支持的设备上即可开始管理。另外一个需要注意的是,冷钱包生成的助记词也是可以被恢复到热钱包中的,但是一旦恢复到热钱包中,那么这个钱包就不再「安全」。
目前 Ledger 官方正在对彩色版本的 Ledger 进行打折销售,提供了 30% 的优惠力度,你可以通过我的邀请链接去购买,你我都可以得到价值 $10 的 BTC 返现,在选购彩色版本时,享受总价 7 折优惠,Nano X 只需要 16799 日元,Nano S Plus 只需要 8749 日元。
介绍几款在 macOS 上能使用的 ChatGPT 客户端。
ChatX 是我目前个人在使用的客户端,界面简洁,提供了内置的 [[prompt]]。
MacGPT 是一个 macOS 下的 ChatGPT 客户端,提供了 Native 和 Web 两种方式可以访问 ChatGPT。
MacGPT 提供的特色功能就是可以使用关键字来在任何应用中触发 ChatGPT。比如说在设置中设定了 +gpt
,那么在任何编辑器中,只要输入 +gpt questions
加上问题,然后回车,MacGPT 就可以在聊天窗口中直接进行回答,非常方便。
MacGPT 另外一个功能就是提供了一个全局的快捷键,可以一键呼出全局对话框,可以在这个全局对话框中和 ChatGPT 交互。
AMA (Ask Me Anything)是一个由 @gaodengming 开发的跨平台的 ChatGPT 客户端 ,我在 iOS 下面就使用这个客户端。
Chatbox 是一款开源的 macOS 上的 ChatGPT 客户端,使用 TypeScript 开发打包。
OpenCat 是 @waylybaye 开发的一款 ChatGPT 客户端
在微信上关注了先知书店店长荐书,某一天的公众号文章中推荐了 [[罗斯巴德]] 这位经济学家的几部著作,这一本《美国大萧条》一下子就抓住了我的眼球,他的另外一部作品 [[人,经济与国家]] 也在我的待看清单上。
[[罗斯巴德]] (Murray Newton Rothbard) 是一位美国犹太裔经济学家,历史学家,自然法理论家,政治理论家,是[[奥地利学派]]著名的学者。他的著作大量的介绍了 [[米塞斯]] 的工作,对现代的自由意志主义,和无政府资本主义理论的发展和传播有着极大的贡献。
这一本《美国大萧条》是罗斯巴德对 1929 年美国大萧条原因的分析和梳理,他提出了一个和主流观点截然不同的视角去剖析大萧条的成因。
简单的说这本书罗斯巴德根据[[商业周期理论]] 分析大萧条的原因是政府对市场的干预太多(低利率和信贷扩张)。
主流的观点(国内教科书上流行的观点)通常将 1929 年的经济危机归结于自由市场经济的失灵,但罗斯巴德认为与其说是市场的失败,不如说是政府货币政策的失败。虽然为了解决大萧条许多政府逢兴[[凯恩斯主义]],但是过去近百年,再回望就能知道凯恩斯主义已经不再行得通。
[[奥地利学派]] 通过 [[商业周期理论]] 尽管没有指出准确的时间,但是预测到了世界性的经济大萧条。奥地利学派认为政府的扩张性货币政策,利率非常低,信贷规模膨胀,因为利率过低扭曲了资源配置信号,使得市场自我调节失灵,一旦信贷收缩,萧条就发生了。
与米塞斯和哈耶克不同的是,凯恩斯认为,大萧条是由于需求不足导致,有效需求不足的原因是居民储蓄太多,而企业对未来太悲观,不愿意投资。大危机造就了凯恩斯主义经济学,大危机过后的 30 年代,凯恩斯主义获得了主流地位,一直到 80 年代才开始被人质疑。凯恩斯主义为政府干预经济提供了很好的理论依据,需求不足,市场失灵,解决的办法就是政府介入市场,增加需求。
但是奥地利学派认为,萧条是市场自身调整的必然过程,有助于释放经济中已经存在的问题,政府干预只能使得问题更糟糕。书中更是花了大量的笔墨描写胡佛政府的干预(扩大公共投资,限制工资下调,贸易保护主义法律等),使得这次危机持续很长时间。
区分商业周期和普通商业波动。
商业变动,通过普遍的交易媒介—-货币进行传播。货币把经济活动串联起来,货币供给量上升,货币的需求保持不变,那么每一美元所体现的购买力会下降,价格会普遍上升。
金本位制度的废弃使得美联储可以无限制扩大纸币供应量和银行的美元数量,致使价格上升,经济陷入混乱,收入因为通货膨胀而下降。
奥地利学派的理论揭示了通货膨胀并非政府扩大货币和信贷供给量的唯一恶果,这种扩张扭曲了投资和生产的结构,使得资本品行业对不良项目投资过度。
避免萧条的最好的方法就是,禁止美联储利用权力扩大货币和信贷。如果陷入了萧条,那么合理的措施是避免政府对萧条进行干预,使萧条的过程能尽快自行完成,然后重建一套健康和繁荣的经济体系。
大萧条的错误并不在于自由市场经济,而应该归咎于政客、官僚。
《美国大萧条》一书让我重新更换了一个视角去看待 1929 年发生的大萧条,也通过作者补充的大量胡佛的新政,和当时政府社会上大量具体的经济数据,来再次回到了那个动荡的时代。就像书中说的那样,从完全不相信市场经济的马克思主义经济学,到到摇摆的[[凯恩斯主义]],到适度干预的 [[芝加哥学派]],再到完全信任市场的[[奥地利学派]],对于同样的一件灾难,有不同的解释和叙事。站在我们这个时间点上,我还无法判断出来究竟是哪一种学说能真正根治大萧条的产生。虽然我已经感觉到大萧条在疫情的催化作用中,已经渐渐显露出了头角,但我还是从心底中希望不要发生,毕竟没有人一生之中有 10 年的时间可以虚度,已经被疫情浪费的三年时间也尽量想挽回一些。
每一个人,我在看书的过程中无时不刻联想到当今的现实,虽然这本书距离出版已经过去了 60 年,但其中的理论无一不是当今现实的写照,疫情的三年美国因为救济向社会发放了大量的美元,导致市场美元增多,信贷扩张,而从去年开始的加息,缩表,导致如今的萧条,虽然程度上可能并不及当年但这依然可以说是过去几十年里面很罕见的了。
Shortcat 是一个 macOS 上的效率工具,可以利用键盘了操作 UI 界面上的一切,而不需要使用到触摸板或鼠标。理念有一些类似于 Chrome 上的 [[vimium]] 插件,利用快捷键在界面上的每一个可以点击的区域加上快捷按键,通过按键来操作界面的内容。
可以直接通过 brew 安装
brew install shortcat
打开
然后可以使用默认的快捷键 Shift+Cmd+Space 来调用出来 Shortcat,然后界面每个可以点击的地方都可以直接看到一个黄色的标签,通过这个搜索框就可以直接进行检索然后,按下
不过我个人在尝试了一下之后,发现在 macOS 上触摸板相对来说更加便捷,并且 Shortcat 虽然可以让用户扔掉鼠标,但是由于操作系统可操作的区域非常多,所以导致搜索出现的选项非常多,而这个检索的过程,使用触摸板早就已经操作完成了。