create-jant 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -3
- package/package.json +1 -1
- package/template/scripts/export-demo.mjs +79 -0
- package/template/scripts/export-seed.mjs +83 -0
- package/template/scripts/{reset.sql → reset-demo.sql} +4 -3
- package/template/scripts/reset-local.sql +27 -0
- package/template/scripts/seed-demo.sql +70 -0
- package/template/scripts/seed-local.sql +338 -0
- package/template/wrangler.demo.toml +1 -0
- package/template/wrangler.toml +4 -1
- package/template/scripts/seed.sql +0 -100
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import path from "path";
|
|
|
8
8
|
import { fileURLToPath } from "url";
|
|
9
9
|
var __filename = fileURLToPath(import.meta.url);
|
|
10
10
|
var __dirname = path.dirname(__filename);
|
|
11
|
-
var CORE_VERSION = "0.3.
|
|
11
|
+
var CORE_VERSION = "0.3.8";
|
|
12
12
|
var TEMPLATE_DIR = fs.existsSync(path.resolve(__dirname, "../template")) ? path.resolve(__dirname, "../template") : path.resolve(__dirname, "../../../templates/jant-site");
|
|
13
13
|
function isValidProjectName(name) {
|
|
14
14
|
return /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(name);
|
|
@@ -32,8 +32,11 @@ async function copyTemplate(config) {
|
|
|
32
32
|
if (basename === "pnpm-lock.yaml") return false;
|
|
33
33
|
if (basename === "dist") return false;
|
|
34
34
|
if (basename === "wrangler.demo.toml") return false;
|
|
35
|
-
if (basename === "reset.sql") return false;
|
|
36
|
-
if (basename === "seed.sql") return false;
|
|
35
|
+
if (basename === "reset-demo.sql") return false;
|
|
36
|
+
if (basename === "seed-demo.sql") return false;
|
|
37
|
+
if (basename === "reset-local.sql") return false;
|
|
38
|
+
if (basename === "seed-local.sql") return false;
|
|
39
|
+
if (basename === "export-demo.mjs") return false;
|
|
37
40
|
return true;
|
|
38
41
|
}
|
|
39
42
|
});
|
|
@@ -72,6 +75,7 @@ async function copyTemplate(config) {
|
|
|
72
75
|
return `${prefix}"${value}"`;
|
|
73
76
|
}
|
|
74
77
|
);
|
|
78
|
+
content = content.replace(/^.*#\s*@create-jant:\s*@remove\s*\n?/gm, "");
|
|
75
79
|
await fs.writeFile(wranglerPath, content, "utf-8");
|
|
76
80
|
}
|
|
77
81
|
const authSecret = generateAuthSecret();
|
package/package.json
CHANGED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { writeFileSync } from "fs";
|
|
3
|
+
import { resolve, dirname } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
8
|
+
function sqlValue(v) {
|
|
9
|
+
if (v === null) return "NULL";
|
|
10
|
+
if (typeof v === "number") return String(v);
|
|
11
|
+
return "'" + String(v).replaceAll("'", "''") + "'";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function queryRemote(sql) {
|
|
15
|
+
let stdout;
|
|
16
|
+
try {
|
|
17
|
+
stdout = execSync(
|
|
18
|
+
`pnpm exec wrangler d1 execute DB --remote --config wrangler.demo.toml --command "${sql}" --json`,
|
|
19
|
+
{ encoding: "utf-8", cwd: resolve(__dirname, "..") }
|
|
20
|
+
);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
// Wrangler returns JSON errors on stdout even with non-zero exit codes
|
|
23
|
+
const output = err.stdout || err.stderr || "";
|
|
24
|
+
try {
|
|
25
|
+
const errJson = JSON.parse(output.trim());
|
|
26
|
+
if (errJson.error?.text) {
|
|
27
|
+
console.error(`Wrangler error: ${errJson.error.text}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
// Not JSON, fall through
|
|
32
|
+
}
|
|
33
|
+
console.error(`Failed to query remote database: ${output || err.message}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const parsed = JSON.parse(stdout);
|
|
37
|
+
if (parsed.error?.text) {
|
|
38
|
+
console.error(`Wrangler error: ${parsed.error.text}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
return parsed[0]?.results || [];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function dumpTable(name, query) {
|
|
45
|
+
const rows = queryRemote(query || `SELECT * FROM ${name}`);
|
|
46
|
+
return rows
|
|
47
|
+
.map(
|
|
48
|
+
(row) =>
|
|
49
|
+
`INSERT INTO ${name} VALUES(${Object.values(row).map(sqlValue).join(",")});`
|
|
50
|
+
)
|
|
51
|
+
.join("\n");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const header = `-- =============================================================================
|
|
55
|
+
-- Demo seed data for Jant (demo.jant.me)
|
|
56
|
+
-- Exported from remote demo D1 database via: mise run demo-backup
|
|
57
|
+
-- Usage: mise run demo-reset
|
|
58
|
+
-- =============================================================================
|
|
59
|
+
`;
|
|
60
|
+
|
|
61
|
+
const tables = [
|
|
62
|
+
["settings"],
|
|
63
|
+
["user"],
|
|
64
|
+
["account"],
|
|
65
|
+
["posts", "SELECT * FROM posts WHERE deleted_at IS NULL"],
|
|
66
|
+
["collections"],
|
|
67
|
+
["post_collections"],
|
|
68
|
+
["media"],
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
let sql = header;
|
|
72
|
+
for (const [name, query] of tables) {
|
|
73
|
+
const data = dumpTable(name, query);
|
|
74
|
+
if (data) sql += `\n-- ${name}\n${data}\n`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const out = resolve(__dirname, "seed-demo.sql");
|
|
78
|
+
writeFileSync(out, sql);
|
|
79
|
+
console.log("Exported demo database to templates/jant-site/scripts/seed-demo.sql");
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createRequire } from "module";
|
|
2
|
+
import { readdirSync, writeFileSync } from "fs";
|
|
3
|
+
import { resolve, dirname } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
|
|
6
|
+
// Parse flags
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const noMedia = args.includes("--no-media");
|
|
9
|
+
const outputIndex = args.indexOf("--output");
|
|
10
|
+
const outputFile =
|
|
11
|
+
outputIndex !== -1 ? args[outputIndex + 1] : "seed-local.sql";
|
|
12
|
+
|
|
13
|
+
// better-sqlite3 is installed in packages/core
|
|
14
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
const coreRequire = createRequire(
|
|
16
|
+
resolve(__dirname, "../../../packages/core/package.json")
|
|
17
|
+
);
|
|
18
|
+
const Database = coreRequire("better-sqlite3");
|
|
19
|
+
|
|
20
|
+
const dbDir = resolve(
|
|
21
|
+
__dirname,
|
|
22
|
+
"../.wrangler/state/v3/d1/miniflare-D1DatabaseObject"
|
|
23
|
+
);
|
|
24
|
+
const files = readdirSync(dbDir).filter((f) => f.endsWith(".sqlite"));
|
|
25
|
+
if (!files.length) {
|
|
26
|
+
console.error("No local D1 database found. Run mise run dev first.");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const db = new Database(resolve(dbDir, files[0]), { readonly: true });
|
|
31
|
+
|
|
32
|
+
function sqlValue(v) {
|
|
33
|
+
if (v === null) return "NULL";
|
|
34
|
+
if (typeof v === "number") return String(v);
|
|
35
|
+
return "'" + String(v).replaceAll("'", "''") + "'";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function dumpTable(name, query) {
|
|
39
|
+
const rows = db.prepare(query || `SELECT * FROM ${name}`).all();
|
|
40
|
+
return rows
|
|
41
|
+
.map(
|
|
42
|
+
(row) =>
|
|
43
|
+
`INSERT INTO ${name} VALUES(${Object.values(row).map(sqlValue).join(",")});`
|
|
44
|
+
)
|
|
45
|
+
.join("\n");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const header = `-- =============================================================================
|
|
49
|
+
-- ${noMedia ? "Seed data (without media)" : "Local development seed data"} for Jant
|
|
50
|
+
-- Exported from local D1 database
|
|
51
|
+
-- Usage: mise run db-seed
|
|
52
|
+
-- =============================================================================
|
|
53
|
+
`;
|
|
54
|
+
|
|
55
|
+
const tables = [
|
|
56
|
+
["settings"],
|
|
57
|
+
["user"],
|
|
58
|
+
["account"],
|
|
59
|
+
[
|
|
60
|
+
"posts",
|
|
61
|
+
noMedia
|
|
62
|
+
? "SELECT * FROM posts WHERE deleted_at IS NULL AND type != 'image'"
|
|
63
|
+
: "SELECT * FROM posts WHERE deleted_at IS NULL",
|
|
64
|
+
],
|
|
65
|
+
["collections"],
|
|
66
|
+
["post_collections"],
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
// Include media table only when --no-media is not set
|
|
70
|
+
if (!noMedia) {
|
|
71
|
+
tables.push(["media"]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let sql = header;
|
|
75
|
+
for (const [name, query] of tables) {
|
|
76
|
+
const data = dumpTable(name, query);
|
|
77
|
+
if (data) sql += `\n-- ${name}\n${data}\n`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const out = resolve(__dirname, outputFile);
|
|
81
|
+
writeFileSync(out, sql);
|
|
82
|
+
db.close();
|
|
83
|
+
console.log(`Exported to templates/jant-site/scripts/${outputFile}`);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
-- Reset script for Jant demo site
|
|
2
|
-
-- Clears all user-created data while preserving schema
|
|
1
|
+
-- Reset script for Jant demo site (demo.jant.me)
|
|
2
|
+
-- Clears all user-created data while preserving users/schema
|
|
3
|
+
-- Usage: mise run demo-reset (runs this then seed-demo.sql)
|
|
3
4
|
|
|
4
5
|
-- Clear FTS index first (to avoid foreign key issues)
|
|
5
6
|
DELETE FROM posts_fts;
|
|
@@ -21,4 +22,4 @@ DELETE FROM verification;
|
|
|
21
22
|
DELETE FROM sqlite_sequence WHERE name IN ('posts', 'media', 'collections', 'redirects');
|
|
22
23
|
|
|
23
24
|
-- Note: Settings and users are preserved
|
|
24
|
-
-- Seed data will be re-inserted by seed.sql
|
|
25
|
+
-- Seed data will be re-inserted by seed-demo.sql
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- =============================================================================
|
|
2
|
+
-- Reset script for local development
|
|
3
|
+
-- Clears ALL data (including users) to prepare for re-seeding
|
|
4
|
+
-- Usage: mise run db-seed (runs this then seed-local.sql)
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
|
|
7
|
+
-- Clear FTS index first
|
|
8
|
+
DELETE FROM posts_fts;
|
|
9
|
+
|
|
10
|
+
-- Clear join tables
|
|
11
|
+
DELETE FROM post_collections;
|
|
12
|
+
|
|
13
|
+
-- Clear main tables
|
|
14
|
+
DELETE FROM media;
|
|
15
|
+
DELETE FROM posts;
|
|
16
|
+
DELETE FROM collections;
|
|
17
|
+
DELETE FROM redirects;
|
|
18
|
+
DELETE FROM settings;
|
|
19
|
+
|
|
20
|
+
-- Clear auth tables
|
|
21
|
+
DELETE FROM session;
|
|
22
|
+
DELETE FROM verification;
|
|
23
|
+
DELETE FROM account;
|
|
24
|
+
DELETE FROM user;
|
|
25
|
+
|
|
26
|
+
-- Reset auto-increment counters
|
|
27
|
+
DELETE FROM sqlite_sequence;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
-- =============================================================================
|
|
2
|
+
-- Demo seed data for Jant (demo.jant.me)
|
|
3
|
+
-- Exported from remote demo D1 database via: mise run demo-backup
|
|
4
|
+
-- Usage: mise run demo-reset
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
|
|
7
|
+
-- settings
|
|
8
|
+
INSERT INTO settings VALUES('ONBOARDING_STATUS','completed',1770657027);
|
|
9
|
+
INSERT INTO settings VALUES('SITE_LANGUAGE','zh-Hans',1770673922);
|
|
10
|
+
INSERT INTO settings VALUES('siteName','Jant Demo',1770689095);
|
|
11
|
+
INSERT INTO settings VALUES('siteDescription','A demo site for Jant - Modern microblog for Cloudflare Workers',1770689095);
|
|
12
|
+
INSERT INTO settings VALUES('siteUrl','https://demo.jant.me',1770689095);
|
|
13
|
+
INSERT INTO settings VALUES('postsPerPage','10',1770689095);
|
|
14
|
+
INSERT INTO settings VALUES('timezone','UTC',1770689095);
|
|
15
|
+
INSERT INTO settings VALUES('language','en',1770689095);
|
|
16
|
+
|
|
17
|
+
-- user
|
|
18
|
+
INSERT INTO user VALUES('cV9uL2nAhiFTPKgJnoiKVKyesEoWBdkY','Demo User','demo@jant.me',0,NULL,'admin',1770657027,1770657027);
|
|
19
|
+
|
|
20
|
+
-- account
|
|
21
|
+
INSERT INTO account VALUES('ARFNGzzGCjXacVOYu9vVbq4dwL2XuecG','cV9uL2nAhiFTPKgJnoiKVKyesEoWBdkY','credential','cV9uL2nAhiFTPKgJnoiKVKyesEoWBdkY',NULL,NULL,NULL,NULL,NULL,NULL,'2f0586376d6b21415b93d39aa00b31c3:f7adf50ededaaf477b27eb095035dc38f20ed8baa349bd10762eb5a916602342f32ac21bc8e384047361d2c67d82dbd922c906cc8fa1c43da68d8fa76e414562',1770657027,1770657027);
|
|
22
|
+
|
|
23
|
+
-- posts
|
|
24
|
+
INSERT INTO posts VALUES(1,'article','featured','Welcome to Jant',NULL,'# Welcome to Jant Demo
|
|
25
|
+
|
|
26
|
+
Jant is a modern microblog platform built for Cloudflare Workers. This demo site resets daily at 00:00 UTC.
|
|
27
|
+
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
- **Multiple post types**: Notes, articles, links, quotes, images, and pages
|
|
31
|
+
- **Collections**: Organize posts into collections
|
|
32
|
+
- **Full-text search**: Search across all your content
|
|
33
|
+
- **Internationalization**: Built-in i18n support
|
|
34
|
+
- **Fast**: Edge-deployed on Cloudflare Workers
|
|
35
|
+
|
|
36
|
+
## Getting Started
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pnpm create jant my-blog
|
|
40
|
+
cd my-blog
|
|
41
|
+
pnpm install
|
|
42
|
+
pnpm dev
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Visit the [dashboard](/dash) to create your own posts!','<h1>Welcome to Jant Demo</h1>
|
|
46
|
+
<p>Jant is a modern microblog platform built for Cloudflare Workers. This demo site resets daily at 00:00 UTC.</p>
|
|
47
|
+
<h2>Features</h2>
|
|
48
|
+
<ul>
|
|
49
|
+
<li><strong>Multiple post types</strong>: Notes, articles, links, quotes, images, and pages</li>
|
|
50
|
+
<li><strong>Collections</strong>: Organize posts into collections</li>
|
|
51
|
+
<li><strong>Full-text search</strong>: Search across all your content</li>
|
|
52
|
+
<li><strong>Internationalization</strong>: Built-in i18n support</li>
|
|
53
|
+
<li><strong>Fast</strong>: Edge-deployed on Cloudflare Workers</li>
|
|
54
|
+
</ul>
|
|
55
|
+
<h2>Getting Started</h2>
|
|
56
|
+
<pre><code class="language-bash">pnpm create jant my-blog
|
|
57
|
+
cd my-blog
|
|
58
|
+
pnpm install
|
|
59
|
+
pnpm dev
|
|
60
|
+
</code></pre>
|
|
61
|
+
<p>Visit the <a href="/dash">dashboard</a> to create your own posts!</p>',NULL,NULL,NULL,NULL,NULL,NULL,1770689095,1770689095,1770689095);
|
|
62
|
+
INSERT INTO posts VALUES(2,'note','quiet',NULL,NULL,'This is a demo note. Notes are short posts without titles, perfect for quick thoughts and updates.','<p>This is a demo note. Notes are short posts without titles, perfect for quick thoughts and updates.</p>',NULL,NULL,NULL,NULL,NULL,NULL,1770685495,1770685495,1770685495);
|
|
63
|
+
INSERT INTO posts VALUES(3,'link','quiet','Jant on GitHub',NULL,'Check out the source code and documentation for Jant.','<p>Check out the source code and documentation for Jant.</p>','https://github.com/nicepkg/jant','GitHub','github.com',NULL,NULL,NULL,1770681895,1770681895,1770681895);
|
|
64
|
+
INSERT INTO posts VALUES(4,'quote','quiet',NULL,NULL,'The best way to predict the future is to invent it.','<p>The best way to predict the future is to invent it.</p>',NULL,'Alan Kay',NULL,NULL,NULL,NULL,1770678295,1770678295,1770678295);
|
|
65
|
+
|
|
66
|
+
-- collections
|
|
67
|
+
INSERT INTO collections VALUES(1,'getting-started','Getting Started','Resources for getting started with Jant',1770689095,1770689095);
|
|
68
|
+
|
|
69
|
+
-- post_collections
|
|
70
|
+
INSERT INTO post_collections VALUES(1,1,1770689095);
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
-- =============================================================================
|
|
2
|
+
-- Local development seed data for Jant
|
|
3
|
+
-- Exported from local D1 database via: mise run db-export
|
|
4
|
+
-- Usage: mise run db-seed
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
|
|
7
|
+
-- settings
|
|
8
|
+
INSERT INTO settings VALUES('ONBOARDING_STATUS','completed',1770673269);
|
|
9
|
+
|
|
10
|
+
-- user
|
|
11
|
+
INSERT INTO user VALUES('mwSiDRYsgAO87Gp39abp75kTUIpBjGLP','Test','theowenyoung@gmail.com',0,NULL,'admin',1770673269,1770673269);
|
|
12
|
+
|
|
13
|
+
-- account
|
|
14
|
+
INSERT INTO account VALUES('wwg6ATsM2Xw8pULzhUy2uzezb8j1pq7z','mwSiDRYsgAO87Gp39abp75kTUIpBjGLP','credential','mwSiDRYsgAO87Gp39abp75kTUIpBjGLP',NULL,NULL,NULL,NULL,NULL,NULL,'3d25c01b6aa8baf102da43ac13245376:366ccf6f4b0054315ab338b4b43183a242dfe74441de38a43999b5b2b277a33360f2ac8fda535462cd6fac497beba59bb2ac34c96c0e4c2fddf16c7ae0e56e05',1770673269,1770673269);
|
|
15
|
+
|
|
16
|
+
-- posts
|
|
17
|
+
INSERT INTO posts VALUES(1,'note','quiet',NULL,NULL,'好的组织,是保护人“在乎”的本能。
|
|
18
|
+
|
|
19
|
+
没有人真的想交付自己都看不上的东西。我们天然就想把事情做得更对一点、更好一点。
|
|
20
|
+
|
|
21
|
+
问题在于这种原本强劲的驱动力,会被不好的组织慢慢消磨掉。当数字比价值更重要,“快点上线”比“做对”更重要。
|
|
22
|
+
|
|
23
|
+
一个好的组织要做的,其实就是:找到那些“在乎”的人,然后清理掉让“在乎”变成奢侈的障碍,让“在乎”重新成为组织的本能。
|
|
24
|
+
|
|
25
|
+
有了“在乎”,再加上手艺和品味,“对的东西”就会自然生长出来。','<p>好的组织,是保护人“在乎”的本能。</p>
|
|
26
|
+
<p>没有人真的想交付自己都看不上的东西。我们天然就想把事情做得更对一点、更好一点。</p>
|
|
27
|
+
<p>问题在于这种原本强劲的驱动力,会被不好的组织慢慢消磨掉。当数字比价值更重要,“快点上线”比“做对”更重要。</p>
|
|
28
|
+
<p>一个好的组织要做的,其实就是:找到那些“在乎”的人,然后清理掉让“在乎”变成奢侈的障碍,让“在乎”重新成为组织的本能。</p>
|
|
29
|
+
<p>有了“在乎”,再加上手艺和品味,“对的东西”就会自然生长出来。</p>
|
|
30
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770723842,1770723842,1770723842);
|
|
31
|
+
INSERT INTO posts VALUES(2,'note','quiet',NULL,NULL,'每次参加内容创作者的活动(比如今天的小宇宙播客大赏)都会被感染到。看到这么多优秀的创作者都在认真地做好东西,特别受到鼓舞,也要做好东西!','<p>每次参加内容创作者的活动(比如今天的小宇宙播客大赏)都会被感染到。看到这么多优秀的创作者都在认真地做好东西,特别受到鼓舞,也要做好东西!</p>
|
|
32
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770723863,1770723863,1770723863);
|
|
33
|
+
INSERT INTO posts VALUES(3,'quote','quiet',NULL,NULL,'我二十一岁时最擅长提供理财建议,可那时没人听我的。即便我站出来说出最精辟的见解,也无人正眼相看。而如今,纵使我讲出世上最愚蠢的话,总会有不少人觉得其中暗藏玄机。','<p>我二十一岁时最擅长提供理财建议,可那时没人听我的。即便我站出来说出最精辟的见解,也无人正眼相看。而如今,纵使我讲出世上最愚蠢的话,总会有不少人觉得其中暗藏玄机。</p>
|
|
34
|
+
',NULL,'巴菲特',NULL,NULL,NULL,NULL,1770726749,1770726749,1770726749);
|
|
35
|
+
INSERT INTO posts VALUES(4,'quote','quiet',NULL,NULL,'说到底,等你到了我这把年纪,人生的成功与否,其实取决于你渴望爱你的人中,究竟有多少人真正爱着你。 我见过许多富人,他们享有盛宴致敬,医院楼翼以他们命名。但真相是世上无人真心爱他们。若活到我这般年纪,却无人对你心怀善意——管你银行账户有多丰厚,你的人生就是场灾难。','<p>说到底,等你到了我这把年纪,人生的成功与否,其实取决于你渴望爱你的人中,究竟有多少人真正爱着你。 我见过许多富人,他们享有盛宴致敬,医院楼翼以他们命名。但真相是世上无人真心爱他们。若活到我这般年纪,却无人对你心怀善意——管你银行账户有多丰厚,你的人生就是场灾难。</p>
|
|
36
|
+
',NULL,'沃伦·巴菲特',NULL,NULL,NULL,NULL,1770726782,1770726782,1770726782);
|
|
37
|
+
INSERT INTO posts VALUES(5,'quote','quiet',NULL,NULL,'当你强迫才华横溢的人扮演非本色角色时,他们很快就会沦为平庸之辈。','<p>当你强迫才华横溢的人扮演非本色角色时,他们很快就会沦为平庸之辈。</p>
|
|
38
|
+
','https://collabfund.com/blog/your-way-is-the-only-way/',NULL,'collabfund.com',NULL,NULL,NULL,1770726816,1770726816,1770726816);
|
|
39
|
+
INSERT INTO posts VALUES(6,'link','quiet','世界运行的规律',NULL,'> 查马斯·帕利哈皮蒂亚曾指出 ,无论企业发展多快,其衰亡速度也与之相当。如今众多企业正深刻体会到这一点——它们在过去几年里坐拥廉价资金,如今却面临严峻考验。 每个企业、每个行业都存在自然增长率 ——若强行突破此界限,短期增长将以长期质量为代价,最终危及生存根基。
|
|
40
|
+
|
|
41
|
+
','<blockquote>
|
|
42
|
+
<p>查马斯·帕利哈皮蒂亚曾指出 ,无论企业发展多快,其衰亡速度也与之相当。如今众多企业正深刻体会到这一点——它们在过去几年里坐拥廉价资金,如今却面临严峻考验。 每个企业、每个行业都存在自然增长率 ——若强行突破此界限,短期增长将以长期质量为代价,最终危及生存根基。</p>
|
|
43
|
+
</blockquote>
|
|
44
|
+
','https://collabfund.com/blog/little-ways-the-world-works/',NULL,'collabfund.com',NULL,NULL,NULL,1770726887,1770726887,1770726887);
|
|
45
|
+
INSERT INTO posts VALUES(7,'article','quiet','刷社交网络,阅读文章以及读书的区别是什么?',NULL,'之前我一直都在思考这个问题:为什么我明明在社交网络上也能学到不少东西,但为什么大家都说社交网络纯属浪费时间?那假如我在社交网络上关注的都是精心筛选过的用户,那么刷社交网络还是很浪费时间吗?
|
|
46
|
+
|
|
47
|
+
阅读文章比刷社交网络要好吗?
|
|
48
|
+
|
|
49
|
+
读书又比阅读文章要好吗?
|
|
50
|
+
|
|
51
|
+
最近在用[遛狗的时间](@/blog/reading-while-walking-dogs.md)读一本叫《打造第二大腦》的书,读完之后,我对此有了新的想法。
|
|
52
|
+
|
|
53
|
+
**首先,社交网络的确能刷出好东西**。 碎片化并不一定比长篇的文章或者图书低级,有的时候它可以是一句非常精辟的话。
|
|
54
|
+
|
|
55
|
+
那么为什么我们觉得看书的感觉更好呢?
|
|
56
|
+
|
|
57
|
+
因为碎片化的东西就算再精辟,那也只是很短的一段话,我们人脑更倾向于忘记这些简短,孤立的东西。所谓刷过就忘了。
|
|
58
|
+
|
|
59
|
+
读书不太一样的是,每本书都有一个非常明确的主题,作者会用非常长的篇幅,抽丝剥茧地为你剖析这个主题,所以我们读完之后,大概率印象会非常深刻,可以在脑子里保鲜很长时间。
|
|
60
|
+
|
|
61
|
+
阅读文章同理,它比碎片化的东西更具体,但是又比书简略的多,读完一篇文章之后,它在我们的脑子中保鲜的时间其实并不长。
|
|
62
|
+
|
|
63
|
+
但是如果把时间拉长,比如 10 年,再假设你阅读文章和看书从来不做笔记,或者笔记分散在各个不同的地方,那么这三者的区别就非常小了。对,即使你很喜欢看书,但是如果你没有写下来,在第二大脑里回顾,那么这些宝贵的素材基本就算是消失了。
|
|
64
|
+
|
|
65
|
+
所以重点是:**我们必须把我们在刷这些知识时筛选出来的材料记录下来**,这个记录的地方就是我们的第二大脑,它可以被方便的搜索,也可以被方便的浏览和新增笔记。
|
|
66
|
+
|
|
67
|
+
只有这些写下来的东西的才是我们的,其他的一切都会随着时间的消逝逐渐被遗忘。
|
|
68
|
+
|
|
69
|
+
所以仔细想一想,如果我在过去的 10 年都没有记下一些东西,那么这 10 年我是不是相当于白活了?因为所有的感受都会随着时间慢慢被冲淡,只有写下的东西,拍摄的照片才能代表我们的智识足迹。
|
|
70
|
+
|
|
71
|
+
## 结论
|
|
72
|
+
|
|
73
|
+
如果把时间拉长后,你会发现刷社交网络,阅读文章和读书 几乎一样了,所以这就是为什么我们把这些东西记下来,当作我们的第二大脑。
|
|
74
|
+
|
|
75
|
+
同时我也推荐你也看一下《打造第二大脑》这本书,参考书中的建议建立你的第二大脑。这样我们在刷社交网络,读文章,读书的时候,就可以把所有你觉得有需要记下来的东西,都保存在第二大脑中。
|
|
76
|
+
|
|
77
|
+
我的博客目前极大的充当了这个第二大脑,但是我的照片管理目前一团遭,我还在探索如何让照片保存,浏览,搜索流程上变得更流畅,等我探索出来之后,再写一篇文章分享我的经验~
|
|
78
|
+
|
|
79
|
+
> 由于我阅读的是用[沉浸式翻译](https://immersivetranslate.com/)制作的双语电子书,它的英文原文相对很简单,所以我可以在遛狗的时候只看原文,并且读出来,遇到不懂的原文,再看一下译文这样,所以进度很慢,截止目前进度差不多 57%,等我读完之后,我会重新规划一下我的第二大脑运行流程,同时,本博客绝对会是一个非常重要的地方。
|
|
80
|
+
','<p>之前我一直都在思考这个问题:为什么我明明在社交网络上也能学到不少东西,但为什么大家都说社交网络纯属浪费时间?那假如我在社交网络上关注的都是精心筛选过的用户,那么刷社交网络还是很浪费时间吗?</p>
|
|
81
|
+
<p>阅读文章比刷社交网络要好吗?</p>
|
|
82
|
+
<p>读书又比阅读文章要好吗?</p>
|
|
83
|
+
<p>最近在用<a href="@/blog/reading-while-walking-dogs.md">遛狗的时间</a>读一本叫《打造第二大腦》的书,读完之后,我对此有了新的想法。</p>
|
|
84
|
+
<p><strong>首先,社交网络的确能刷出好东西</strong>。 碎片化并不一定比长篇的文章或者图书低级,有的时候它可以是一句非常精辟的话。</p>
|
|
85
|
+
<p>那么为什么我们觉得看书的感觉更好呢?</p>
|
|
86
|
+
<p>因为碎片化的东西就算再精辟,那也只是很短的一段话,我们人脑更倾向于忘记这些简短,孤立的东西。所谓刷过就忘了。</p>
|
|
87
|
+
<p>读书不太一样的是,每本书都有一个非常明确的主题,作者会用非常长的篇幅,抽丝剥茧地为你剖析这个主题,所以我们读完之后,大概率印象会非常深刻,可以在脑子里保鲜很长时间。</p>
|
|
88
|
+
<p>阅读文章同理,它比碎片化的东西更具体,但是又比书简略的多,读完一篇文章之后,它在我们的脑子中保鲜的时间其实并不长。</p>
|
|
89
|
+
<p>但是如果把时间拉长,比如 10 年,再假设你阅读文章和看书从来不做笔记,或者笔记分散在各个不同的地方,那么这三者的区别就非常小了。对,即使你很喜欢看书,但是如果你没有写下来,在第二大脑里回顾,那么这些宝贵的素材基本就算是消失了。</p>
|
|
90
|
+
<p>所以重点是:<strong>我们必须把我们在刷这些知识时筛选出来的材料记录下来</strong>,这个记录的地方就是我们的第二大脑,它可以被方便的搜索,也可以被方便的浏览和新增笔记。</p>
|
|
91
|
+
<p>只有这些写下来的东西的才是我们的,其他的一切都会随着时间的消逝逐渐被遗忘。</p>
|
|
92
|
+
<p>所以仔细想一想,如果我在过去的 10 年都没有记下一些东西,那么这 10 年我是不是相当于白活了?因为所有的感受都会随着时间慢慢被冲淡,只有写下的东西,拍摄的照片才能代表我们的智识足迹。</p>
|
|
93
|
+
<h2>结论</h2>
|
|
94
|
+
<p>如果把时间拉长后,你会发现刷社交网络,阅读文章和读书 几乎一样了,所以这就是为什么我们把这些东西记下来,当作我们的第二大脑。</p>
|
|
95
|
+
<p>同时我也推荐你也看一下《打造第二大脑》这本书,参考书中的建议建立你的第二大脑。这样我们在刷社交网络,读文章,读书的时候,就可以把所有你觉得有需要记下来的东西,都保存在第二大脑中。</p>
|
|
96
|
+
<p>我的博客目前极大的充当了这个第二大脑,但是我的照片管理目前一团遭,我还在探索如何让照片保存,浏览,搜索流程上变得更流畅,等我探索出来之后,再写一篇文章分享我的经验~</p>
|
|
97
|
+
<blockquote>
|
|
98
|
+
<p>由于我阅读的是用<a href="https://immersivetranslate.com/">沉浸式翻译</a>制作的双语电子书,它的英文原文相对很简单,所以我可以在遛狗的时候只看原文,并且读出来,遇到不懂的原文,再看一下译文这样,所以进度很慢,截止目前进度差不多 57%,等我读完之后,我会重新规划一下我的第二大脑运行流程,同时,本博客绝对会是一个非常重要的地方。</p>
|
|
99
|
+
</blockquote>
|
|
100
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770727016,1770727016,1770734841);
|
|
101
|
+
INSERT INTO posts VALUES(8,'article','featured','在遛狗的时候用 Kindle 读书',NULL,'在如今的时代里,一个人想要坚持看书其实挺困难的。我经常怀疑现代科技对人脑的刺激已经无法让人类做像读书这样需要长时间保持专注的事了,所以对于已经有读书习惯的人,我真的很羡慕他们。对我来说,尽管我非常赞同读书的意义,但即便如此,像我这种没有在小时候培养起读书习惯,后来又被互联网把眼球喂刁的人来说,要做到每天都能看书,其实还挺困难的,因为通常来说,互联网上总有更吸引我的东西。
|
|
102
|
+
|
|
103
|
+
倒不是说读书是一种有用但做起来无聊的事。因为读书不像抖音的15秒短视频,第一眼就能吸引你的眼球,书的问题是:一般都需要读上那么一两章,才能进入“抖音”状态,这个时候就不需要外力强迫自己了,书籍本身的乐趣就会吸引你继续看下去(如果还是没有吸引力,那说明这本书不适合你,没必要继续看下去了),所以读书的难点从来都是能不能先耐心读完前两章。
|
|
104
|
+
|
|
105
|
+
我以前的读书契机主要有以下几个:
|
|
106
|
+
|
|
107
|
+
1. 看完某部电影,想看原著,于是会有机会看一本书。(通常来讲,我觉得原著都比电影精彩,也有极少部分原著和电影都非常精彩,比如《银翼杀手》,《那不勒斯四部曲》等)
|
|
108
|
+
2. 坐火车或者飞机的时候。(无网络且大块时间)
|
|
109
|
+
3. 在网上看到别人的强烈推荐,而我也感兴趣的时候
|
|
110
|
+
|
|
111
|
+
这种看书的习惯其实只会让我读到一些我非常感兴趣的书,而那些看起来可有可无的书,比如《堂吉柯德》,《百年孤独》就不会被选中。
|
|
112
|
+
|
|
113
|
+
幸运的是,我在最近一年的时间里,找到了一个稳定的时间块和稳定的工具来看书,就是利用遛狗时间和 Kindle。
|
|
114
|
+
|
|
115
|
+
这个时间段很稳定,对我来说是不可抗力,无论风吹日晒,每天遛狗2次是免不了的。每次大约15-30分钟左右,不长不短,身边没有电脑,我也故意不开手机套餐的流量,这个时间段就很适合强迫自己做一些当做但是很难做的事,比如开始一本新书的阅读。
|
|
116
|
+
|
|
117
|
+
Kindle 这个工具也必不可少,它有几个特点特别适合在遛狗的时候用:
|
|
118
|
+
|
|
119
|
+
1. 在阳光直射下,Kindle 的屏幕异常的清晰,清晰到什么程度?就是我经常专门跑到阳光下去用 Kindle
|
|
120
|
+
,我觉得都可以把墨水屏名字改为阳光屏,这样才更突出 Kindle 最大的特点。我遛狗的环境又刚好是户外,在这种情境下阅读 Kindle 是一种享受。
|
|
121
|
+
2. Kindle 非常轻,182g,屏幕大小对我来说非常合适,我的裤兜可以装的下,在路上拿在手上看很轻松。
|
|
122
|
+
3. Kindle 还有背光,晚上遛狗也能轻松应对
|
|
123
|
+
4. Kindle 的离线化设计,所有东西都是离线可用的,没有任何打扰,所有东西立即可用。
|
|
124
|
+
5. Kindle 的电池,依我的看书(遛狗)频率,差不多是2周左右,需要充一次电。
|
|
125
|
+
6. 它可以通过电子邮件发送电子书,甚至是RSS。比如我使用
|
|
126
|
+
[Kindle4RSS](https://kindle4rss.com/)的服务,每天自动向我发送端传媒最新文章的电子书,所以我甚至可以在遛狗的时候,离线地了解一些最新时事。
|
|
127
|
+
|
|
128
|
+
通常来讲,我一般能在遛狗的 20 分钟左右的时间里看完一本书里的一章,所以平均下来,十来天就能读完一本完整的大书。
|
|
129
|
+
|
|
130
|
+
在这一年里,我应该已经看完了 30 多本书,这可能是我过去 10 年的读书总量。
|
|
131
|
+
|
|
132
|
+
这期间还有过一个小插曲,我在遛狗的时候,看了一本书,作者应该是写深度工作的[Cal Newport](https://www.newyorker.com/contributors/cal-newport),他建议我们每天都要安排一个无目的的漫步时间,在此期间不做任何事,就只是漫无目的的走。他的理论是这种无压力的散步会激活你脑子里的一些东西,比如说你可能会想到一些伟大的创意,或者写作的灵感。所以有一段时间,我就尝试在遛狗的时候不看
|
|
133
|
+
Kindle,改为漫无目的的边走边乱想。但是施行了一段时间之后,我好像啥也没想到,所以就放弃了。不过我怀疑是因为我脑袋空空,所以没法激活脑袋里的东西,也许再过两年再尝试下会有不错的收获。
|
|
134
|
+
|
|
135
|
+
我很感谢自己最终能发现 Kindle 的优点,因为在此之前由于它拙劣的翻页体验,我把它闲置了6年多。而遛狗,让这种不好的体验变得微不足道。
|
|
136
|
+
','<p>在如今的时代里,一个人想要坚持看书其实挺困难的。我经常怀疑现代科技对人脑的刺激已经无法让人类做像读书这样需要长时间保持专注的事了,所以对于已经有读书习惯的人,我真的很羡慕他们。对我来说,尽管我非常赞同读书的意义,但即便如此,像我这种没有在小时候培养起读书习惯,后来又被互联网把眼球喂刁的人来说,要做到每天都能看书,其实还挺困难的,因为通常来说,互联网上总有更吸引我的东西。</p>
|
|
137
|
+
<p>倒不是说读书是一种有用但做起来无聊的事。因为读书不像抖音的15秒短视频,第一眼就能吸引你的眼球,书的问题是:一般都需要读上那么一两章,才能进入“抖音”状态,这个时候就不需要外力强迫自己了,书籍本身的乐趣就会吸引你继续看下去(如果还是没有吸引力,那说明这本书不适合你,没必要继续看下去了),所以读书的难点从来都是能不能先耐心读完前两章。</p>
|
|
138
|
+
<p>我以前的读书契机主要有以下几个:</p>
|
|
139
|
+
<ol>
|
|
140
|
+
<li>看完某部电影,想看原著,于是会有机会看一本书。(通常来讲,我觉得原著都比电影精彩,也有极少部分原著和电影都非常精彩,比如《银翼杀手》,《那不勒斯四部曲》等)</li>
|
|
141
|
+
<li>坐火车或者飞机的时候。(无网络且大块时间)</li>
|
|
142
|
+
<li>在网上看到别人的强烈推荐,而我也感兴趣的时候</li>
|
|
143
|
+
</ol>
|
|
144
|
+
<p>这种看书的习惯其实只会让我读到一些我非常感兴趣的书,而那些看起来可有可无的书,比如《堂吉柯德》,《百年孤独》就不会被选中。</p>
|
|
145
|
+
<p>幸运的是,我在最近一年的时间里,找到了一个稳定的时间块和稳定的工具来看书,就是利用遛狗时间和 Kindle。</p>
|
|
146
|
+
<p>这个时间段很稳定,对我来说是不可抗力,无论风吹日晒,每天遛狗2次是免不了的。每次大约15-30分钟左右,不长不短,身边没有电脑,我也故意不开手机套餐的流量,这个时间段就很适合强迫自己做一些当做但是很难做的事,比如开始一本新书的阅读。</p>
|
|
147
|
+
<p>Kindle 这个工具也必不可少,它有几个特点特别适合在遛狗的时候用:</p>
|
|
148
|
+
<ol>
|
|
149
|
+
<li>在阳光直射下,Kindle 的屏幕异常的清晰,清晰到什么程度?就是我经常专门跑到阳光下去用 Kindle<br>,我觉得都可以把墨水屏名字改为阳光屏,这样才更突出 Kindle 最大的特点。我遛狗的环境又刚好是户外,在这种情境下阅读 Kindle 是一种享受。</li>
|
|
150
|
+
<li>Kindle 非常轻,182g,屏幕大小对我来说非常合适,我的裤兜可以装的下,在路上拿在手上看很轻松。</li>
|
|
151
|
+
<li>Kindle 还有背光,晚上遛狗也能轻松应对</li>
|
|
152
|
+
<li>Kindle 的离线化设计,所有东西都是离线可用的,没有任何打扰,所有东西立即可用。</li>
|
|
153
|
+
<li>Kindle 的电池,依我的看书(遛狗)频率,差不多是2周左右,需要充一次电。</li>
|
|
154
|
+
<li>它可以通过电子邮件发送电子书,甚至是RSS。比如我使用<br><a href="https://kindle4rss.com/">Kindle4RSS</a>的服务,每天自动向我发送端传媒最新文章的电子书,所以我甚至可以在遛狗的时候,离线地了解一些最新时事。</li>
|
|
155
|
+
</ol>
|
|
156
|
+
<p>通常来讲,我一般能在遛狗的 20 分钟左右的时间里看完一本书里的一章,所以平均下来,十来天就能读完一本完整的大书。</p>
|
|
157
|
+
<p>在这一年里,我应该已经看完了 30 多本书,这可能是我过去 10 年的读书总量。</p>
|
|
158
|
+
<p>这期间还有过一个小插曲,我在遛狗的时候,看了一本书,作者应该是写深度工作的<a href="https://www.newyorker.com/contributors/cal-newport">Cal Newport</a>,他建议我们每天都要安排一个无目的的漫步时间,在此期间不做任何事,就只是漫无目的的走。他的理论是这种无压力的散步会激活你脑子里的一些东西,比如说你可能会想到一些伟大的创意,或者写作的灵感。所以有一段时间,我就尝试在遛狗的时候不看<br>Kindle,改为漫无目的的边走边乱想。但是施行了一段时间之后,我好像啥也没想到,所以就放弃了。不过我怀疑是因为我脑袋空空,所以没法激活脑袋里的东西,也许再过两年再尝试下会有不错的收获。</p>
|
|
159
|
+
<p>我很感谢自己最终能发现 Kindle 的优点,因为在此之前由于它拙劣的翻页体验,我把它闲置了6年多。而遛狗,让这种不好的体验变得微不足道。</p>
|
|
160
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770727463,1770727463,1770734864);
|
|
161
|
+
INSERT INTO posts VALUES(9,'link','quiet','花钱的艺术',NULL,'你花钱的方式改变了别人看你的方式,而这些改变是你不想要的。','<p>你花钱的方式改变了别人看你的方式,而这些改变是你不想要的。</p>
|
|
162
|
+
','https://share.owenyoung.com/upload/ape-bee-jaguar',NULL,'share.owenyoung.com',NULL,NULL,NULL,1770727557,1770727557,1770734833);
|
|
163
|
+
INSERT INTO posts VALUES(10,'page','unlisted','About','about','[Derek Sivers](https://sive.rs/)
|
|
164
|
+
在[《Anything You Want》](https://sive.rs/a)中写道:"我遇到的所有最酷的人,都是通过我写的东西找到我的人。",从我有限的经验来看,我也是,所以请不要吝啬,如果你觉得我们的气质有点契合,那么
|
|
165
|
+
i 人也可以先建立一种联系(因为是 i
|
|
166
|
+
人,所以我们可以只建立联系而暂时不说话,但希望你在添加我的时候附上你的公开主页如博客,小红书,即刻,推特等等(还没有?快去[建立](https://pika.page/)!)
|
|
167
|
+
)!
|
|
168
|
+
|
|
169
|
+
## 我的生活哲学
|
|
170
|
+
|
|
171
|
+
**追求注意力自由而不是财富自由。**
|
|
172
|
+
|
|
173
|
+
虽然财富自由会有更大的机率获得注意力自由,但是追求注意力自由却不一定非要财富自由。
|
|
174
|
+
|
|
175
|
+
如果我们能抱着一种朴素主义的生活态度,其实根本不需要那么多的财富去获取注意力自由。
|
|
176
|
+
|
|
177
|
+
我们需要多少钱才能辞职过上注意力自由的生活?换句话说,需要攒多少钱,就可以 10-15
|
|
178
|
+
年不用工作也没问题?
|
|
179
|
+
|
|
180
|
+
在中国的语境下,维持一个健康而简朴的生活,每个人 5
|
|
181
|
+
万元/年可能是一个不错的平衡。也就是说没有负债,50 万元以上的存款,即可享受 10
|
|
182
|
+
年以上的注意力自由,我想称之为“穷有闲阶级”。
|
|
183
|
+
|
|
184
|
+
但是注意力自由并不意味着我们完全不会收入,恰恰相反,只有注意力自由之后,我们才能发挥真正的创造力,没有边界的探索任何事情。而且,在这个过程中,我们非常有可能获得一些未知的财富。即便
|
|
185
|
+
10 年过后没有获得任何财富,在经历 10
|
|
186
|
+
年的闲暇时间之后,我们一定在各方面都成为了一个更好的自己,从而拥有更多的能力去做任何事情。
|
|
187
|
+
|
|
188
|
+
我知道整个世界都是建立在工作伦理上的,所以我以前也会对闲暇时间感到焦虑,浪费。但是在经历过大公司,独立开发者,创业公司的阶段后,我现在可以对闲暇时间表达最强烈的赞美,如果我有公司,我会聘用那些有幸拥有过更多闲暇时间的候选者,对我自己而言,我会将注意力自由作为人生最高的追求。我有倾向认为有更多闲暇时间的人通常会更博学,而较忙的人很可能在很多事情上很无知。
|
|
189
|
+
|
|
190
|
+
在这里强调我的生活哲学是因为我很遗憾没有在更早的时候看到类似的想法,这导致我以前对闲暇时间感到焦虑。我想给那些正在经历闲暇时间并感到焦虑的同学一个笃定的视角,希望我们最终都能获得注意力自由。
|
|
191
|
+
|
|
192
|
+
## 找到我的方式
|
|
193
|
+
|
|
194
|
+
- 我为这个博客建立的 Telegram 讨论群组:<https://t.me/+m124rcTl9FE3M2Vh>
|
|
195
|
+
- 我的电子邮件:`owen#owenyoung.com` (把`#`换成`@`)
|
|
196
|
+
- 推特 [@OwenYoungZh](https://twitter.com/OwenYoungZh)
|
|
197
|
+
- Telegram 频道: <https://t.me/owenyoungzh>
|
|
198
|
+
- Telegram 私人账户: <https://t.me/itsowenyoung>
|
|
199
|
+
- 微信朋友圈(请大胆通过邮件或者 [Telegram](https://t.me/itsowenyoung)
|
|
200
|
+
联系我索要微信号,或者告诉我你的微信号,希望能同时附上你的公开主页如博客,小红书,即刻,推特等等(还没有?快去[建立](https://pika.page/)!)
|
|
201
|
+
- Twitter English [@TheOwenYoung](https://twitter.com/TheOwenYoung)
|
|
202
|
+
|
|
203
|
+
## 关于这个博客
|
|
204
|
+
|
|
205
|
+
我喜欢用明文纯文本记录东西,因为这是最通用的格式,不会被运营商锁定,在所有平台都能开箱即用的直接编辑。该博客全部内容托管在这个[Github 的 Repo 里](https://github.com/theowenyoung/blog),用[Zola (getzola.org)](https://www.getzola.org/)生成,最终部署在[Cloudflare Pages](https://pages.cloudflare.com/)上。
|
|
206
|
+
|
|
207
|
+
和大多数的博客不一样的是,这个博客不只是文章,我把这里当成是我的数字花园,里面主要包含[6 类内容](/categories/):
|
|
208
|
+
|
|
209
|
+
- [博文](/blog/),
|
|
210
|
+
这个和传统的博客类似,当我想写点什么的时候我会把它放在这个类别下,博文主要分为:
|
|
211
|
+
|
|
212
|
+
- [技术类](/categories/dev/),这个下面放纯技术类的文章。
|
|
213
|
+
- [通用](/categories/random/),这个下面放任何其他类的文章,我不喜欢分类,对于一篇要写的文章来说,我只能一眼判断出这篇文章是技术还是非技术,所以我只有这两个分类。
|
|
214
|
+
|
|
215
|
+
- [我在阅读什么](/categories/journal/)
|
|
216
|
+
我会把定期把我最近看过的优质文章的链接,以及我的对此的简要总结放在这个分类下。
|
|
217
|
+
- [笔记](/categories/notes/),我会精心收集某个主题下相关的链接,然后把他们归类到某个主题的笔记里,比如:
|
|
218
|
+
- [探索互联网上高质量的内容](@/sources.md)
|
|
219
|
+
- [最好用的工具集合](@/tools.md)
|
|
220
|
+
- [有意思的问题收集](@/answers.md)
|
|
221
|
+
- [收集一些给人灵感的东西](@/inspires.md)
|
|
222
|
+
- [收集值得阅读的文章](@/articles.md)
|
|
223
|
+
- [收集一些有意思的社区](@/communities.md)
|
|
224
|
+
- [英语学习相关资源](@/english-learning.md)
|
|
225
|
+
- [读书笔记](/categories/books/)
|
|
226
|
+
读书如果只是阅读的话,那么随着时间的流逝,总会慢慢淡忘,所以我要求自己对每本书都要写读书笔记,大多数时候是摘抄其中的一些高亮段落。
|
|
227
|
+
- [短想法](/thoughts/)
|
|
228
|
+
其实就只是一篇长期更新的[普通的文章](https://github.com/theowenyoung/blog/edit/main/content/thoughts.md),但是我在里面写我的各种短想法,相当于推特,但是不会出现在别人的时间轴上,所以我可以在里面随便写,不用担心别人的眼光。
|
|
229
|
+
- [引用](/quotes/)
|
|
230
|
+
也是一篇长期更新的[普通文章](https://github.com/theowenyoung/blog/edit/main/content/quotes.md),我在里面记录我看到的一些有意思的高亮段落。
|
|
231
|
+
|
|
232
|
+
我有一个
|
|
233
|
+
[Now 页面](@/pages/now.md),这个页面是响应[Derek Sivers](https://sive.rs/)的呼吁,用[Now 页面](https://nownownow.com/about)
|
|
234
|
+
`/now/` 代替 About 页面,用于记录最近在做的事,`/about/`页面是只是一个概览页面。
|
|
235
|
+
[点这里查看我最近在做什么](@/pages/now.md)
|
|
236
|
+
|
|
237
|
+
我还有一个[Change Log](/en/changelog/)页面,里面会存放这个博客本身的更新日志。
|
|
238
|
+
|
|
239
|
+
这个网站遵循 [IndieWeb](@/blog/indieweb.en.md) 的规范,支持
|
|
240
|
+
[webmention](https://indieweb.org/Webmention),
|
|
241
|
+
但是我现在有点无感了,因为现在对于这种高门槛的技术越来越失去兴趣,它没有促进交流,反而增加了很多障碍,但是我一时之间又没找到什么喜欢的替代品,很可能最后会自己再造一个轮子。
|
|
242
|
+
|
|
243
|
+
这个博客加入了[Webring](https://xn--sr8hvo.ws/),这是一个古早的互联网概念,大概是这样:加入
|
|
244
|
+
Webring 的博客,需要在底部加一个如下的链接:
|
|
245
|
+
|
|
246
|
+
[←](https://xn--sr8hvo.ws/%F0%9F%93%AE%F0%9F%86%99%F0%9F%93%A9/previous) An
|
|
247
|
+
IndieWeb Webring 🕸💍
|
|
248
|
+
[→](https://xn--sr8hvo.ws/%F0%9F%93%AE%F0%9F%86%99%F0%9F%93%A9/next)
|
|
249
|
+
|
|
250
|
+
点击前后的箭头链接,会随机的跳转到另一个 Webring
|
|
251
|
+
里的博客,这样就大大的增加了独立博客的可发现性,经常能发现一些很有意思的博客,比友情链接这种方式要更好。
|
|
252
|
+
|
|
253
|
+
## 其他链接
|
|
254
|
+
|
|
255
|
+
- Github [@theowenyoung](https://github.com/theowenyoung)
|
|
256
|
+
- Github [Sponsors](https://github.com/sponsors/theowenyoung)
|
|
257
|
+
- Patreon [@theowenyoung](https://www.patreon.com/theowenyoung)
|
|
258
|
+
','<p><a href="https://sive.rs/">Derek Sivers</a><br>在<a href="https://sive.rs/a">《Anything You Want》</a>中写道:"我遇到的所有最酷的人,都是通过我写的东西找到我的人。",从我有限的经验来看,我也是,所以请不要吝啬,如果你觉得我们的气质有点契合,那么<br>i 人也可以先建立一种联系(因为是 i<br>人,所以我们可以只建立联系而暂时不说话,但希望你在添加我的时候附上你的公开主页如博客,小红书,即刻,推特等等(还没有?快去<a href="https://pika.page/">建立</a>!)<br>)!</p>
|
|
259
|
+
<h2>我的生活哲学</h2>
|
|
260
|
+
<p><strong>追求注意力自由而不是财富自由。</strong></p>
|
|
261
|
+
<p>虽然财富自由会有更大的机率获得注意力自由,但是追求注意力自由却不一定非要财富自由。</p>
|
|
262
|
+
<p>如果我们能抱着一种朴素主义的生活态度,其实根本不需要那么多的财富去获取注意力自由。</p>
|
|
263
|
+
<p>我们需要多少钱才能辞职过上注意力自由的生活?换句话说,需要攒多少钱,就可以 10-15<br>年不用工作也没问题?</p>
|
|
264
|
+
<p>在中国的语境下,维持一个健康而简朴的生活,每个人 5<br>万元/年可能是一个不错的平衡。也就是说没有负债,50 万元以上的存款,即可享受 10<br>年以上的注意力自由,我想称之为“穷有闲阶级”。</p>
|
|
265
|
+
<p>但是注意力自由并不意味着我们完全不会收入,恰恰相反,只有注意力自由之后,我们才能发挥真正的创造力,没有边界的探索任何事情。而且,在这个过程中,我们非常有可能获得一些未知的财富。即便<br>10 年过后没有获得任何财富,在经历 10<br>年的闲暇时间之后,我们一定在各方面都成为了一个更好的自己,从而拥有更多的能力去做任何事情。</p>
|
|
266
|
+
<p>我知道整个世界都是建立在工作伦理上的,所以我以前也会对闲暇时间感到焦虑,浪费。但是在经历过大公司,独立开发者,创业公司的阶段后,我现在可以对闲暇时间表达最强烈的赞美,如果我有公司,我会聘用那些有幸拥有过更多闲暇时间的候选者,对我自己而言,我会将注意力自由作为人生最高的追求。我有倾向认为有更多闲暇时间的人通常会更博学,而较忙的人很可能在很多事情上很无知。</p>
|
|
267
|
+
<p>在这里强调我的生活哲学是因为我很遗憾没有在更早的时候看到类似的想法,这导致我以前对闲暇时间感到焦虑。我想给那些正在经历闲暇时间并感到焦虑的同学一个笃定的视角,希望我们最终都能获得注意力自由。</p>
|
|
268
|
+
<h2>找到我的方式</h2>
|
|
269
|
+
<ul>
|
|
270
|
+
<li>我为这个博客建立的 Telegram 讨论群组:<a href="https://t.me/+m124rcTl9FE3M2Vh">https://t.me/+m124rcTl9FE3M2Vh</a></li>
|
|
271
|
+
<li>我的电子邮件:<code>owen#owenyoung.com</code> (把<code>#</code>换成<code>@</code>)</li>
|
|
272
|
+
<li>推特 <a href="https://twitter.com/OwenYoungZh">@OwenYoungZh</a></li>
|
|
273
|
+
<li>Telegram 频道: <a href="https://t.me/owenyoungzh">https://t.me/owenyoungzh</a></li>
|
|
274
|
+
<li>Telegram 私人账户: <a href="https://t.me/itsowenyoung">https://t.me/itsowenyoung</a></li>
|
|
275
|
+
<li>微信朋友圈(请大胆通过邮件或者 <a href="https://t.me/itsowenyoung">Telegram</a><br>联系我索要微信号,或者告诉我你的微信号,希望能同时附上你的公开主页如博客,小红书,即刻,推特等等(还没有?快去<a href="https://pika.page/">建立</a>!)</li>
|
|
276
|
+
<li>Twitter English <a href="https://twitter.com/TheOwenYoung">@TheOwenYoung</a></li>
|
|
277
|
+
</ul>
|
|
278
|
+
<h2>关于这个博客</h2>
|
|
279
|
+
<p>我喜欢用明文纯文本记录东西,因为这是最通用的格式,不会被运营商锁定,在所有平台都能开箱即用的直接编辑。该博客全部内容托管在这个<a href="https://github.com/theowenyoung/blog">Github 的 Repo 里</a>,用<a href="https://www.getzola.org/">Zola (getzola.org)</a>生成,最终部署在<a href="https://pages.cloudflare.com/">Cloudflare Pages</a>上。</p>
|
|
280
|
+
<p>和大多数的博客不一样的是,这个博客不只是文章,我把这里当成是我的数字花园,里面主要包含<a href="/categories/">6 类内容</a>:</p>
|
|
281
|
+
<ul>
|
|
282
|
+
<li><p><a href="/blog/">博文</a>,<br>这个和传统的博客类似,当我想写点什么的时候我会把它放在这个类别下,博文主要分为:</p>
|
|
283
|
+
<ul>
|
|
284
|
+
<li><a href="/categories/dev/">技术类</a>,这个下面放纯技术类的文章。</li>
|
|
285
|
+
<li><a href="/categories/random/">通用</a>,这个下面放任何其他类的文章,我不喜欢分类,对于一篇要写的文章来说,我只能一眼判断出这篇文章是技术还是非技术,所以我只有这两个分类。</li>
|
|
286
|
+
</ul>
|
|
287
|
+
</li>
|
|
288
|
+
<li><p><a href="/categories/journal/">我在阅读什么</a><br>我会把定期把我最近看过的优质文章的链接,以及我的对此的简要总结放在这个分类下。</p>
|
|
289
|
+
</li>
|
|
290
|
+
<li><p><a href="/categories/notes/">笔记</a>,我会精心收集某个主题下相关的链接,然后把他们归类到某个主题的笔记里,比如:</p>
|
|
291
|
+
<ul>
|
|
292
|
+
<li><a href="@/sources.md">探索互联网上高质量的内容</a></li>
|
|
293
|
+
<li><a href="@/tools.md">最好用的工具集合</a></li>
|
|
294
|
+
<li><a href="@/answers.md">有意思的问题收集</a></li>
|
|
295
|
+
<li><a href="@/inspires.md">收集一些给人灵感的东西</a></li>
|
|
296
|
+
<li><a href="@/articles.md">收集值得阅读的文章</a></li>
|
|
297
|
+
<li><a href="@/communities.md">收集一些有意思的社区</a></li>
|
|
298
|
+
<li><a href="@/english-learning.md">英语学习相关资源</a></li>
|
|
299
|
+
</ul>
|
|
300
|
+
</li>
|
|
301
|
+
<li><p><a href="/categories/books/">读书笔记</a><br>读书如果只是阅读的话,那么随着时间的流逝,总会慢慢淡忘,所以我要求自己对每本书都要写读书笔记,大多数时候是摘抄其中的一些高亮段落。</p>
|
|
302
|
+
</li>
|
|
303
|
+
<li><p><a href="/thoughts/">短想法</a><br>其实就只是一篇长期更新的<a href="https://github.com/theowenyoung/blog/edit/main/content/thoughts.md">普通的文章</a>,但是我在里面写我的各种短想法,相当于推特,但是不会出现在别人的时间轴上,所以我可以在里面随便写,不用担心别人的眼光。</p>
|
|
304
|
+
</li>
|
|
305
|
+
<li><p><a href="/quotes/">引用</a><br>也是一篇长期更新的<a href="https://github.com/theowenyoung/blog/edit/main/content/quotes.md">普通文章</a>,我在里面记录我看到的一些有意思的高亮段落。</p>
|
|
306
|
+
</li>
|
|
307
|
+
</ul>
|
|
308
|
+
<p>我有一个<br><a href="@/pages/now.md">Now 页面</a>,这个页面是响应<a href="https://sive.rs/">Derek Sivers</a>的呼吁,用<a href="https://nownownow.com/about">Now 页面</a><br><code>/now/</code> 代替 About 页面,用于记录最近在做的事,<code>/about/</code>页面是只是一个概览页面。<br><a href="@/pages/now.md">点这里查看我最近在做什么</a></p>
|
|
309
|
+
<p>我还有一个<a href="/en/changelog/">Change Log</a>页面,里面会存放这个博客本身的更新日志。</p>
|
|
310
|
+
<p>这个网站遵循 <a href="@/blog/indieweb.en.md">IndieWeb</a> 的规范,支持<br><a href="https://indieweb.org/Webmention">webmention</a>,<br>但是我现在有点无感了,因为现在对于这种高门槛的技术越来越失去兴趣,它没有促进交流,反而增加了很多障碍,但是我一时之间又没找到什么喜欢的替代品,很可能最后会自己再造一个轮子。</p>
|
|
311
|
+
<p>这个博客加入了<a href="https://xn--sr8hvo.ws/">Webring</a>,这是一个古早的互联网概念,大概是这样:加入<br>Webring 的博客,需要在底部加一个如下的链接:</p>
|
|
312
|
+
<p><a href="https://xn--sr8hvo.ws/%F0%9F%93%AE%F0%9F%86%99%F0%9F%93%A9/previous">←</a> An<br>IndieWeb Webring 🕸💍<br><a href="https://xn--sr8hvo.ws/%F0%9F%93%AE%F0%9F%86%99%F0%9F%93%A9/next">→</a></p>
|
|
313
|
+
<p>点击前后的箭头链接,会随机的跳转到另一个 Webring<br>里的博客,这样就大大的增加了独立博客的可发现性,经常能发现一些很有意思的博客,比友情链接这种方式要更好。</p>
|
|
314
|
+
<h2>其他链接</h2>
|
|
315
|
+
<ul>
|
|
316
|
+
<li>Github <a href="https://github.com/theowenyoung">@theowenyoung</a></li>
|
|
317
|
+
<li>Github <a href="https://github.com/sponsors/theowenyoung">Sponsors</a></li>
|
|
318
|
+
<li>Patreon <a href="https://www.patreon.com/theowenyoung">@theowenyoung</a></li>
|
|
319
|
+
</ul>
|
|
320
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770727612,1770727612,1770727612);
|
|
321
|
+
INSERT INTO posts VALUES(11,'image','quiet',NULL,NULL,'Image 1','<p>Image 1</p>
|
|
322
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770733473,1770733473,1770733847);
|
|
323
|
+
INSERT INTO posts VALUES(12,'image','quiet','Image 2',NULL,'Image 2 Desc','<p>Image 2 Desc</p>
|
|
324
|
+
',NULL,NULL,NULL,NULL,NULL,NULL,1770733590,1770733590,1770734789);
|
|
325
|
+
|
|
326
|
+
-- collections
|
|
327
|
+
INSERT INTO collections VALUES(1,'liked-images','给人灵感的图片',NULL,1770733901,1770733901);
|
|
328
|
+
INSERT INTO collections VALUES(2,'yes','发人深醒',NULL,1770734820,1770734820);
|
|
329
|
+
|
|
330
|
+
-- post_collections
|
|
331
|
+
INSERT INTO post_collections VALUES(12,1,1770734789);
|
|
332
|
+
INSERT INTO post_collections VALUES(9,2,1770734833);
|
|
333
|
+
INSERT INTO post_collections VALUES(7,2,1770734841);
|
|
334
|
+
|
|
335
|
+
-- media
|
|
336
|
+
INSERT INTO media VALUES('019c4797-593d-7e71-bac7-af328774e91e',11,'1770727627050-xrhl2o.webp','CleanShot 2026-02-10 at 19.37.25@2x.webp','image/webp',228300,'uploads/1770727627050-xrhl2o.webp',NULL,NULL,NULL,1770727627,0,NULL);
|
|
337
|
+
INSERT INTO media VALUES('019c47f1-c288-7a78-a8b3-8979625b5176',12,'1770733552257-ztkxs7.webp','CleanShot 2026-02-10 at 20.58.33@2x.webp','image/webp',27496,'uploads/1770733552257-ztkxs7.webp',NULL,NULL,NULL,1770733552,1,NULL);
|
|
338
|
+
INSERT INTO media VALUES('019c47f1-f80c-77be-b2d5-bbb0d8e82673',12,'1770733565958-xbvhb4.webp','CleanShot 2026-02-10 at 22.04.03@2x.webp','image/webp',50038,'uploads/1770733565958-xbvhb4.webp',NULL,NULL,NULL,1770733565,0,NULL);
|
package/template/wrangler.toml
CHANGED
|
@@ -2,6 +2,7 @@ name = "jant-site" # @create-jant: "${name}"
|
|
|
2
2
|
main = "src/index.ts"
|
|
3
3
|
compatibility_date = "2026-01-20"
|
|
4
4
|
compatibility_flags = ["nodejs_compat"]
|
|
5
|
+
account_id = "03e7294bdb3750ed5a0d6afef6d770e4" # @create-jant: @remove
|
|
5
6
|
|
|
6
7
|
[dev]
|
|
7
8
|
port = 9019
|
|
@@ -28,6 +29,7 @@ SITE_URL = "http://localhost:9019"
|
|
|
28
29
|
|
|
29
30
|
# Optional: R2 Storage (for media uploads)
|
|
30
31
|
# R2_PUBLIC_URL = "https://cdn.example.com"
|
|
32
|
+
R2_PUBLIC_URL = "https://demo-media.jant.me" # @create-jant: @remove
|
|
31
33
|
|
|
32
34
|
# Optional: Cloudflare Image Transformations
|
|
33
35
|
# For automatic thumbnail generation and image optimization
|
|
@@ -45,4 +47,5 @@ migrations_dir = "../../packages/core/src/db/migrations" # @create-jant: "node_m
|
|
|
45
47
|
|
|
46
48
|
[[r2_buckets]]
|
|
47
49
|
binding = "R2"
|
|
48
|
-
bucket_name = "jant-
|
|
50
|
+
bucket_name = "jant-demo-media" # @create-jant: "${name}-media"
|
|
51
|
+
remote = true # @create-jant: @remove
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
-- Seed data for Jant demo site
|
|
2
|
-
-- This data will be restored after each daily reset
|
|
3
|
-
|
|
4
|
-
-- Settings
|
|
5
|
-
INSERT OR REPLACE INTO settings (key, value, updated_at) VALUES
|
|
6
|
-
('siteName', 'Jant Demo', strftime('%s', 'now')),
|
|
7
|
-
('siteDescription', 'A demo site for Jant - Modern microblog for Cloudflare Workers', strftime('%s', 'now')),
|
|
8
|
-
('siteUrl', 'https://demo.jant.me', strftime('%s', 'now')),
|
|
9
|
-
('postsPerPage', '10', strftime('%s', 'now')),
|
|
10
|
-
('timezone', 'UTC', strftime('%s', 'now')),
|
|
11
|
-
('language', 'en', strftime('%s', 'now'));
|
|
12
|
-
|
|
13
|
-
-- Demo posts
|
|
14
|
-
INSERT INTO posts (type, visibility, title, content, content_html, published_at, created_at, updated_at) VALUES
|
|
15
|
-
-- Welcome article
|
|
16
|
-
('article', 'featured', 'Welcome to Jant',
|
|
17
|
-
'# Welcome to Jant Demo
|
|
18
|
-
|
|
19
|
-
Jant is a modern microblog platform built for Cloudflare Workers. This demo site resets daily at 00:00 UTC.
|
|
20
|
-
|
|
21
|
-
## Features
|
|
22
|
-
|
|
23
|
-
- **Multiple post types**: Notes, articles, links, quotes, images, and pages
|
|
24
|
-
- **Collections**: Organize posts into collections
|
|
25
|
-
- **Full-text search**: Search across all your content
|
|
26
|
-
- **Internationalization**: Built-in i18n support
|
|
27
|
-
- **Fast**: Edge-deployed on Cloudflare Workers
|
|
28
|
-
|
|
29
|
-
## Getting Started
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
pnpm create jant my-blog
|
|
33
|
-
cd my-blog
|
|
34
|
-
pnpm install
|
|
35
|
-
pnpm dev
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Visit the [dashboard](/dash) to create your own posts!',
|
|
39
|
-
'<h1>Welcome to Jant Demo</h1>
|
|
40
|
-
<p>Jant is a modern microblog platform built for Cloudflare Workers. This demo site resets daily at 00:00 UTC.</p>
|
|
41
|
-
<h2>Features</h2>
|
|
42
|
-
<ul>
|
|
43
|
-
<li><strong>Multiple post types</strong>: Notes, articles, links, quotes, images, and pages</li>
|
|
44
|
-
<li><strong>Collections</strong>: Organize posts into collections</li>
|
|
45
|
-
<li><strong>Full-text search</strong>: Search across all your content</li>
|
|
46
|
-
<li><strong>Internationalization</strong>: Built-in i18n support</li>
|
|
47
|
-
<li><strong>Fast</strong>: Edge-deployed on Cloudflare Workers</li>
|
|
48
|
-
</ul>
|
|
49
|
-
<h2>Getting Started</h2>
|
|
50
|
-
<pre><code class="language-bash">pnpm create jant my-blog
|
|
51
|
-
cd my-blog
|
|
52
|
-
pnpm install
|
|
53
|
-
pnpm dev
|
|
54
|
-
</code></pre>
|
|
55
|
-
<p>Visit the <a href="/dash">dashboard</a> to create your own posts!</p>',
|
|
56
|
-
strftime('%s', 'now'), strftime('%s', 'now'), strftime('%s', 'now')),
|
|
57
|
-
|
|
58
|
-
-- A note
|
|
59
|
-
('note', 'quiet', NULL,
|
|
60
|
-
'This is a demo note. Notes are short posts without titles, perfect for quick thoughts and updates.',
|
|
61
|
-
'<p>This is a demo note. Notes are short posts without titles, perfect for quick thoughts and updates.</p>',
|
|
62
|
-
strftime('%s', 'now') - 3600, strftime('%s', 'now') - 3600, strftime('%s', 'now') - 3600),
|
|
63
|
-
|
|
64
|
-
-- A link post
|
|
65
|
-
('link', 'quiet', 'Jant on GitHub',
|
|
66
|
-
'Check out the source code and documentation for Jant.',
|
|
67
|
-
'<p>Check out the source code and documentation for Jant.</p>',
|
|
68
|
-
strftime('%s', 'now') - 7200, strftime('%s', 'now') - 7200, strftime('%s', 'now') - 7200),
|
|
69
|
-
|
|
70
|
-
-- A quote
|
|
71
|
-
('quote', 'quiet', NULL,
|
|
72
|
-
'The best way to predict the future is to invent it.',
|
|
73
|
-
'<p>The best way to predict the future is to invent it.</p>',
|
|
74
|
-
strftime('%s', 'now') - 10800, strftime('%s', 'now') - 10800, strftime('%s', 'now') - 10800);
|
|
75
|
-
|
|
76
|
-
-- Update the link post with source info
|
|
77
|
-
UPDATE posts SET
|
|
78
|
-
source_url = 'https://github.com/nicepkg/jant',
|
|
79
|
-
source_name = 'GitHub',
|
|
80
|
-
source_domain = 'github.com'
|
|
81
|
-
WHERE type = 'link' AND title = 'Jant on GitHub';
|
|
82
|
-
|
|
83
|
-
-- Update the quote with source info
|
|
84
|
-
UPDATE posts SET
|
|
85
|
-
source_name = 'Alan Kay'
|
|
86
|
-
WHERE type = 'quote' AND content LIKE '%predict the future%';
|
|
87
|
-
|
|
88
|
-
-- Demo collection
|
|
89
|
-
INSERT INTO collections (path, title, description, created_at, updated_at) VALUES
|
|
90
|
-
('getting-started', 'Getting Started', 'Resources for getting started with Jant', strftime('%s', 'now'), strftime('%s', 'now'));
|
|
91
|
-
|
|
92
|
-
-- Add the welcome article to the collection
|
|
93
|
-
INSERT INTO post_collections (post_id, collection_id, added_at)
|
|
94
|
-
SELECT p.id, c.id, strftime('%s', 'now')
|
|
95
|
-
FROM posts p, collections c
|
|
96
|
-
WHERE p.title = 'Welcome to Jant' AND c.path = 'getting-started';
|
|
97
|
-
|
|
98
|
-
-- Update FTS index
|
|
99
|
-
INSERT INTO posts_fts (rowid, title, content)
|
|
100
|
-
SELECT id, COALESCE(title, ''), COALESCE(content, '') FROM posts WHERE deleted_at IS NULL;
|