Tana 又是一款 All-in-one 的笔记软件。我虽然很早就已经拿到了 Tana 的使用体验,但是初次体验之后因为其只提供了在线版本,无法离线使用,很快就放弃了。还是坚守在 [[Obsidian]] ,在桌面版上,随着插件的不断丰富已经成为了我常驻应用了,代替了我之前的所有笔记软件,代替了 Read it later 应用,代替了我的 WordPress 编辑器,代替了我 Jekyll 的编辑器,还代替了我用了很久的 Trello,并且我发现本地的看板完全可以代替需要网络 Loading 才能使用的 Trello。
但这一次再次想起了 Tana 是因为我又看到有人提起了 Supertags 的概念,这是一个陌生的概念。
在初次体验 Tana 的时候,最初的印象就是 Tana 的设计,所有的笔记都是通过当天的笔记开始,每一个笔记都是一个「节点」。节点之间可以相互引用,嵌套。
在 Tana 中已经完全没有了传统笔记的文件夹,文件(文档)的概念,最顶层的组织结构 Tana 称之为 Workspaces,在 Workspaces 下所有的笔记都只有节点的概念,它们可以并列,嵌套,以任意的组织形式存在。
对于普通的 Tag,我们都非常熟悉,不论是文章,还是帖子,还是 Twitter,我们都可以用 #tag
这样的方式来对文章内容进行贴标签。通过标签我们可以很快的定位这个文章、这个帖子是什么样的内容,而搜索引擎或者推荐系统也可以很快速的识别这个内容的分类。同样的浏览者也可以通过标签来找到更多的相似的内容。
而 Tana 定义的 Supertags 就是给普通的标签(tag)加上了元数据(metadata)。在 [[Obsidian]] 中普通笔记最基本的描述信息就是标签,Obsidian 也提供了方法让笔记通过标签的形式组织和检索,但是 Obsidian 中 Tag 就是最小的单位了。
相信说到上面,很多就有疑问了,既然已经有了传统的 Tag,为什么还需要一个新概念 Supertags? 在上文中我提到在 Tana 中已经模糊了笔记的边界,所有节点都是一条笔记,笔记和笔记之前没有了明显的边界,那么如何在一个庞大的节点库中对这些内容进行组织就成为了棘手的问题,通过搜索?显然不够迅速,通过传统的标签,最后就会像 Obsidian 中那样还是退化成为了标签的搜索。
而 Tana 提出的解决办法就是 Supertags,比如官方的例子中,用户可以对不同节点中的内容打上 #book
的标签,并且结合 #book
和内容本身,对 book 标签进行进一步的扩充,比如 book 可以包含作者,出版时间,包含简介等等更具体的信息。在 Tana 中官方也实现了一个 AI 自动进行标签填充的功能(借助 OpenAI)。
有了这个功能之后,比如我经常在 Obsidian 中记录读书笔记的时候,常常在以书名命名的笔记前使用 YAML 定义笔记的 metadata(借助模板),而在 Tana 中我仅仅需要在节点上添加一个 #book
标签,那这个节点所需要的所有元数据都会包含在这个标签中。通过这样组织方式,节点之间会形成非常复杂的关系。
而每当用户创建一个标签,Tana 都会自动提示创建一个 List of #book
通过标签的关键,可以直接查询出所有包含这个 #book 的笔记内容,间接地将网状结构的笔记内容提取成为了一个线性的。怪不得 Tana 自己在介绍 Supertags 的时候就称 Supertags 是所有内容的 Glue。
在 Tana 之中,标签是有继承关系的,我们都知道面向对象编程三大特点之一的继承目的就是为了复用代码,而在 Tana 中,通过继承(Extend)就使得标签也可以继承标签。这样就非常容易扩展标签。
比如有 #book
这样的标签,同样会有 #fiction
,#non-fiction
等等的标签,而这些具体的标签都可以继承 #book
的属性。
一个设计良好的 Supertags 可以让界面变成任何你想要达成的效果。
比如设计一个 #todo
标签,包含 Start Date, Due Date,Status 等属性,那么就可以轻松地创建一个类似 Trello 的看板画面。
如果像上面一样创建一个 #book
权限,添加一个属性 Status(待读,在读,已读),你就创建了一个类似豆瓣的 Track 读书记录的工具。
所以这就是为什么很多人说 Tana 实际上就是一个数据库的原因。只要用户发挥想想,充分利用 Tana 的展示形式(List,Table,Cards,Tabs,Calendar),以及 Filter,Group,Sort 就能展示出任何想要的界面。
只有当一个工具对当前工作效率提高具有压倒性的优势时,我才会考虑替换。我过去曾经使用很多年的 [[WizNote]],积累了上千条笔记,虽然有 Evernote,OneNote 等等工具的出现,但都没有让我切换过去,直到 Obisidian 的出现,弥补了 WizNote 对 Markdown 的支持,强大的双链,非常快速的检索,以及强大的社区插件支持,让我在体验不久之后就毅然决定使用,并一直使用到现在。
我切换使用 Obsidian 的决定性原因就是 Obsidian 让我意识到了笔记不是一个摘录的工具,而是可以组织自己想法,让想法和想法之间产生关联的思考方式。并且 Obisidian 的全离线化设计让我非常放心的不会去考虑隐私等等问题。Obsidian 的开放程度也让 Obsidian 可以快速的融入任何其他的工具中,[[Anki]],[[Zotero]],[[Readwise]] 等等。
Tana 的设计思想,确实融合了很多优秀笔记的特点,但是其 Supertags 的功能,还不足以让我放弃现在的 Obsidian。所以之后还会继续观察 Tana 的发展。
JIS 键盘布局是日本是最常见的键盘布局,它与国内常用的美式键盘布局有一些不同之处。如果你习惯了美式键盘布局,使用 JIS 键盘可能会感到不便。
可以明显感到区别的是
~
按键,写 Markdown 非常常用的 tilde 按键(行内格式化代码) 在 JIS 键盘中消失了Karabiner Elements 是一款强大的键盘映射工具,可以很容易地修改 JIS 键盘布局到美式键盘布局。本文将向你展示如何使用 Karabiner Elements 来实现这一目标。
首先,你需要下载并安装 Karabiner Elements。你可以在官方网站上找到适用于 macOS 的安装程序,并按照指示进行安装。一旦安装完成,你就可以打开 Karabiner Elements 并开始配置键盘映射。
或者通过 brew 来安装
brew install --cask karabiner-elements
在 Karabiner Elements 的界面中,点击左侧的“Complex Modifications”选项卡,然后点击右下角的“Add rule”按钮。在这个界面也可以通过从在线网站导入的方式。点击 Import more rules from Internet,来从网站下载更多的规则。打开网站规则列表,其中包含各种可用的键盘映射规则。
在规则列表中,找到“Japanese JIS Keyboard to US Keyboard:Remap Symbol Keys”规则,并勾选它。这将启用该规则并应用键盘映射。
接下来,你可以点击右侧的“Details”按钮,以查看该规则的详细信息。在这里,你可以看到该规则将会对哪些键进行映射,以及映射的具体内容。默认情况下,该规则将会将 JIS 键盘布局中的一些键映射为美式键盘布局中的相应键。例如,JIS 键盘布局中的 “@” 键将会映射为 “[” 键,而 “[” 键将会映射为 “]” 键。
现在,可以关闭 Karabiner Elements,并开始使用修改后的键盘布局。打开任何文本编辑器或其他应用程序,你会发现 JIS 键盘布局已经被修改为美式键盘布局。
要想学好一门语言,是一个需要长期花时间的过程,听说读写一样都不能落下。之前我也要推荐过学习英语,就应该使用英英字典(当达到一定的词汇量之后),学习英语就应该让自己的耳朵沉浸在英语发音中(可以通过听英语播客),当能够听懂大部分的内容的时候,无字幕看电影也是一种沉浸式的学习方法,到通过[[影子跟读法]] 来练习发音,完成一个语言的听说读写之后才能形成一个学习的闭环。
这篇文章抛开那些枯燥的学习方法介绍几个非常有意思的语言学习小工具。
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 [email protected]: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 protected] -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 客户端