Skip to content

Commit 069b505

Browse files
committed
cn support
1 parent af08710 commit 069b505

14 files changed

+996
-6
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,24 @@ export MINIFY_ASSETS="false" # Set to "true" for production
6060
4. Serve locally: `cd ~/blog/public && python -m http.server`
6161
5. Deploy: Push to GitHub, automatic deployment via Actions
6262

63+
### Working with Drafts
64+
65+
To create draft posts that won't be published:
66+
67+
1. Add `#+DRAFT: true` to the post header
68+
2. When ready to publish, change to `#+DRAFT: false` or remove the line
69+
3. Draft posts are excluded from the sitemap and won't be built
70+
71+
Example draft post header:
72+
```org
73+
#+TITLE: My Draft Post
74+
#+DATE: <2025-01-01>
75+
#+AUTHOR: bytenoob
76+
#+DRAFT: true
77+
#+OPTIONS: toc:t num:nil
78+
```
79+
80+
6381
### Features
6482

6583
The blog includes:

build.sh

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ if emacs --batch \
103103
\"<nav class=\\\"site-nav\\\">\"
104104
\"<a href=\\\"/\\\">Home</a>\"
105105
\"<a href=\\\"/about.html\\\">About</a>\"
106+
\"<div class=\\\"lang-switcher\\\">\"
107+
\"<button class=\\\"lang-btn active\\\" data-lang=\\\"en\\\">EN</button>\"
108+
\"<span class=\\\"lang-divider\\\">|</span>\"
109+
\"<button class=\\\"lang-btn\\\" data-lang=\\\"cn\\\">中文</button>\"
110+
\"</div>\"
106111
\"</nav>\"
107112
\"</div>\"
108113
\"</header>\"))
@@ -117,9 +122,23 @@ if emacs --batch \
117122
\"</div>\"
118123
\"</footer>\"))
119124
120-
;; Custom sitemap function to exclude author
125+
;; Function to check if a file is a draft
126+
(defun blog/is-draft-p (file)
127+
\"Check if FILE has #+DRAFT: true property.\"
128+
(with-temp-buffer
129+
(insert-file-contents file)
130+
(goto-char (point-min))
131+
(re-search-forward \"^#\\\\+DRAFT:\\\\s-*\\\\(true\\\\|t\\\\|yes\\\\)\" nil t)))
132+
133+
;; Custom publishing function that skips drafts
134+
(defun blog/publish-to-html (plist filename pub-dir)
135+
\"Publish an org file to HTML, but skip if it's a draft.\"
136+
(unless (blog/is-draft-p filename)
137+
(org-html-publish-to-html plist filename pub-dir)))
138+
139+
;; Custom sitemap function to exclude author and draft posts
121140
(defun blog/sitemap-function (title list)
122-
\"Generate sitemap as an Org file without author metadata.\"
141+
\"Generate sitemap as an Org file without author metadata and draft posts.\"
123142
(concat \"#+TITLE: Noob Notes\\n\"
124143
\"#+AUTHOR:\\n\"
125144
\"#+OPTIONS: author:nil toc:nil num:nil h:0\\n\\n\"
@@ -132,7 +151,7 @@ if emacs --batch \
132151
:base-extension \"org\"
133152
:publishing-directory ,blog-publish-directory
134153
:recursive t
135-
:publishing-function org-html-publish-to-html
154+
:publishing-function blog/publish-to-html
136155
:headline-levels 4
137156
:section-numbers nil
138157
:with-toc t
@@ -158,14 +177,14 @@ if emacs --batch \
158177
entry
159178
(org-publish-find-title entry project)))
160179
:sitemap-function blog/sitemap-function
161-
:exclude \"404\\\\.org\\\\|about\\\\.org\")
180+
:exclude \"404\\\\.org\\\\|about\\\\.org\\\\|-cn\\\\.org\")
162181
163182
(\"blog-pages\"
164183
:base-directory ,blog-posts-directory
165184
:base-extension \"org\"
166185
:publishing-directory ,blog-publish-directory
167186
:recursive nil
168-
:publishing-function org-html-publish-to-html
187+
:publishing-function blog/publish-to-html
169188
:headline-levels 4
170189
:section-numbers nil
171190
:with-toc t

generate-sitemap.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ cat >> "$OUTPUT_FILE" << EOF
2727
</url>
2828
EOF
2929

30-
# Add all HTML files
30+
# Add all HTML files (excluding drafts)
3131
for file in public/*.html; do
3232
if [ -f "$file" ] && [ "$(basename "$file")" != "404.html" ]; then
3333
# Get last modified date
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#+TITLE: Emacs 入门指南:现代化方法
2+
#+DATE: <2024-01-29 Mon>
3+
#+AUTHOR: bytenoob
4+
#+DESCRIPTION: 2025 年 Emacs 入门综合指南
5+
#+KEYWORDS: emacs, 编辑器, 编程, 生产力
6+
#+FILETAGS: :emacs:教程:生产力:
7+
#+LASTMOD: <2025-06-30 Mon>
8+
#+OPTIONS: toc:t num:nil
9+
10+
* 简介
11+
12+
Emacs 不仅仅是一个文本编辑器——它是一个经受住时间考验的完整计算环境。在这篇文章中,我将分享我学习 Emacs 的历程,以及它如何改变了我的工作流程。无论你是完全的初学者,还是之前尝试过 Emacs 但觉得它过于复杂的人,这份指南都将帮助你以现代、实用的方法开始使用 Emacs。
13+
14+
* 为什么在 2025 年选择 Emacs?
15+
16+
你可能会问,在有这么多现代编辑器可选的情况下,为什么还要选择 Emacs。以下是一些令人信服的理由:
17+
18+
- *可扩展性*:通过 Emacs Lisp,Emacs 可以无限定制
19+
- *持久性*:你在学习 Emacs 上的投资将受益数十年
20+
- *集成性*:从电子邮件到 git,一切都可以在 Emacs 中管理
21+
- *社区*:充满活力、乐于助人的社区持续创新
22+
23+
* 入门:现代化方法
24+
25+
** 安装 Doom Emacs
26+
27+
我建议不要从原版 Emacs 开始,而是从 Doom Emacs 开始,这是一个提供合理默认设置的现代配置框架:
28+
29+
#+BEGIN_SRC bash
30+
git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
31+
~/.config/emacs/bin/doom install
32+
#+END_SRC
33+
34+
** 基本概念
35+
36+
理解这些核心概念将使你的 Emacs 之旅更加顺畅:
37+
38+
1. *缓冲区(Buffers)*:Emacs 中的一切都是缓冲区——文件、终端,甚至配置界面
39+
2. *主模式和次模式*:这些决定了每个缓冲区中可用的行为和功能
40+
3. *迷你缓冲区(Minibuffer)*:你与 Emacs 命令交互的地方
41+
4. *键绑定*:Emacs 高效的秘诀
42+
43+
** 你的第一个配置
44+
45+
这是一个帮助你开始的最小配置:
46+
47+
#+BEGIN_SRC emacs-lisp
48+
;; 设置你的个人信息
49+
(setq user-full-name "你的名字"
50+
user-mail-address "your.email@example.com")
51+
52+
;; 选择主题
53+
(setq doom-theme 'doom-one)
54+
55+
;; 启用行号
56+
(setq display-line-numbers-type t)
57+
58+
;; 设置默认字体
59+
(setq doom-font (font-spec :family "Fira Code" :size 14))
60+
#+END_SRC
61+
62+
* 构建你的工作流程
63+
64+
** 使用 Dired 进行文件管理
65+
66+
Dired 是 Emacs 内置的文件管理器。按 =SPC .= 打开文件,或按 =SPC f f= 浏览文件。一些有用的 Dired 命令:
67+
68+
- =d= - 标记为删除
69+
- =u= - 取消标记
70+
- =x= - 执行标记的操作
71+
- =C= - 复制文件
72+
- =R= - 重命名/移动文件
73+
74+
** 使用 Projectile 进行项目管理
75+
76+
Projectile 让项目管理变得轻而易举:
77+
78+
- =SPC p p= - 在项目间切换
79+
- =SPC p f= - 在项目中查找文件
80+
- =SPC p s= - 在项目中搜索
81+
82+
** 使用 Magit 进行版本控制
83+
84+
Magit 可以说是有史以来最好的 Git 界面:
85+
86+
- =SPC g g= - 打开 Magit 状态
87+
- =s= - 暂存更改
88+
- =c c= - 提交
89+
- =P p= - 推送
90+
91+
* 成功秘诀
92+
93+
1. *不要试图一次学会所有东西*:每次专注于一个功能
94+
2. *使用内置帮助*:=SPC h= 打开帮助菜单
95+
3. *做笔记*:记录你的学习历程和有用的命令
96+
4. *加入社区*:Emacs subreddit 和 Discord 是很好的资源
97+
5. *要有耐心*:初始学习曲线陡峭,但回报是巨大的
98+
99+
* 学习资源
100+
101+
- [[https://www.emacswiki.org/][EmacsWiki]] - 综合文档
102+
- [[https://www.masteringemacs.org/][Mastering Emacs]] - 优秀的博客和书籍
103+
- [[https://github.com/doomemacs/doomemacs][Doom Emacs 文档]] - Doom 特定功能
104+
- [[https://www.youtube.com/c/SystemCrafters][System Crafters YouTube]] - 视频教程
105+
106+
* 结语
107+
108+
Emacs 不仅仅是一个编辑器——它是一种计算思维方式。虽然初始投资很大,但回报是指数级的。从小处着手,保持一致,不知不觉中,你会想知道没有它你是如何生活的。
109+
110+
祝编程愉快!

posts/2024-01-29-getting-started-with-emacs.org

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#+KEYWORDS: emacs, editor, programming, productivity
66
#+FILETAGS: :emacs:tutorial:productivity:
77
#+LASTMOD: <2025-06-30 Mon>
8+
#+DRAFT: false
89
#+OPTIONS: toc:t num:nil
910

1011
* Introduction

posts/2024-06-16-waku-cn.org

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#+TITLE: Waku 网络
2+
#+DATE: <2024-06-16 Sun>
3+
#+AUTHOR: bytenoob
4+
#+DESCRIPTION: Waku 网络简介 - 一个开放访问、隐私保护且可扩展的共享 P2P 消息网络
5+
#+KEYWORDS: waku, p2p, 消息传递, 隐私, 去中心化
6+
#+FILETAGS: :网络:p2p:隐私:
7+
#+LASTMOD: <2025-06-30 Mon>
8+
#+OPTIONS: toc:t num:nil
9+
10+
11+
* Waku
12+
Waku 网络是一个共享的 P2P 消息网络,具有开放访问、通用消息传递、隐私保护、可扩展等特性,即使资源受限的设备也能访问。一些最突出的特性包括:
13+
1. 通过隐私保护的限速空值器(Rate-Limiting Nullifiers)实现 DoS/垃圾邮件防护。
14+
2. 通过将流量分片到 8 个发布订阅主题来实现可扩展性。
15+
3. 基于内容主题的自动分片选择。
16+
4. 为资源受限节点提供的服务,包括历史消息存储和检索、过滤等。
17+
18+
19+
* 起源
20+
21+
如果你一直在关注 Waku 或 Status,你可能对 Waku 的起源很熟悉。Status 移动应用被创建为 web3 超级应用,是进入以太坊生态系统的门户,它利用了三个原始支柱:以太坊用于共识,Swarm 用于存储,Whisper 用于通信。
22+
23+
Status 开发团队尝试使用 Whisper 构建 Status,但该协议存在根本性限制,特别是对于资源受限的设备,如手机。
24+
25+
Waku 作为 Whisper 的继任者诞生,从其缺陷中学习,提供一个适合移动设备和浏览器的可扩展点对点通信网络。
26+
27+
* 挑战 / 期望的属性
28+
29+
Waku 旨在克服以下挑战:
30+
31+
通用消息传递:Waku 旨在提供能够传输任意有效载荷的协议和网络。虽然 Waku 最初是为聊天应用 Status 创建的,但目标是足够通用,能够在 Waku 上构建任何去中心化的通信或信号应用。
32+
33+
短暂消息传递:Waku 旨在解决实时通信问题,提供公平的延迟,使一个或多个用户能够交换小数据有效载荷。这与 IPFS 或其他去中心化存储系统形成对比,后者以延迟和响应性为代价提供存储大量数据的方式。
34+
35+
抗审查:Waku 旨在提供抗审查的解决方案,外部参与者无法阻止用户访问 Waku 基础设施。同时也让应用开发者能够以"不作恶"的心态进行构建,他们没有掌控王国的钥匙,也没有能力将用户从平台上移除。
36+
37+
隐私意识:为应用开发者提供在用户数据和元数据收集方面以"不作恶"原则运营的能力。这意味着即使他们想要或受到压力,他们或任何第三方都无法收集用户的元数据,如社交图谱或活动模式。
38+
39+
匿名性:与隐私类似,这是用户不将个人身份信息(PII)与其在 Waku 网络或使用该网络的应用上的活动关联的能力。这里考虑的 PII 涉及网络(IP 地址)、区块链(如以太坊地址)和路由(消息关联)。
40+
41+
资源受限设备:如前所述,在设计 Waku 时,努力考虑移动设备和浏览器等环境,使开发者能够为这些平台构建 DApp,并尽可能提供上述属性。
42+
43+
可扩展性:Waku 旨在支持数百万用户,同时保持上述原则;这需要经过深思熟虑的设计和测试。
44+
45+
所有上述属性意味着在设计 Waku 时需要克服其他问题:
46+
47+
DOS 防护:确保网络不会被消息淹没,导致资源较少的用户被踢出网络。
48+
49+
网络可持续性和激励:我们如何确保网络中有足够的资源,使浏览器和移动设备等设备能够访问网络?
50+
51+
去中心化:Waku 需要在多个层面上去中心化以实现这些属性。我们如何保持公平的去中心化水平,以确保这些属性随时间保持?
52+
53+
54+
* Waku 网络
55+
Waku 网络如何帮助实现上述属性?
56+
57+
让我们回顾一下在网络中组合的不同 Waku 协议,以及它们如何使我们能够实现这一壮举。
58+
59+
* 对等节点发现
60+
discv5,对 ENR 的小幅增强
61+
62+
* 消息路由 - Gossipsub
63+
类似于以太坊共识层
64+
65+
* 消息路由 - 分片
66+
67+
* 消息路由 - RLN 中继
68+
69+
* 为大部分离线和资源受限设备提供服务
70+
轻量推送
71+
72+
* Waku 网络的价值主张
73+
74+
* 我们达到目标了吗?

posts/2024-06-16-waku.org

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#+KEYWORDS: waku, p2p, messaging, privacy, decentralized
66
#+FILETAGS: :networking:p2p:privacy:
77
#+LASTMOD: <2025-06-30 Mon>
8+
#+DRAFT: false
89
#+OPTIONS: toc:t num:nil
910

1011

0 commit comments

Comments
 (0)