3 Commits

51 changed files with 888 additions and 2318 deletions

View File

@@ -3,15 +3,15 @@ name: Check and correct img CDN URLs
on:
push:
branches: [master]
# pull_request:
# branches: [master]
pull_request:
branches: [master]
jobs:
check-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Find and Replace Release
uses: jacobtomlinson/gha-find-replace@2.0.0
@@ -22,13 +22,12 @@ jobs:
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Change img CDN URL"
title: "Update imgs' CDN URL"
labels: "URL"
base: "master"
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
branch: "update-img-url"
body: "Some imgs' URL need to be updated."

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
with:
submodules: true
- name: Build And Deploy

View File

@@ -37,12 +37,12 @@ jobs:
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v3
with:
submodules: recursive
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
uses: actions/configure-pages@v2
- name: Build with Hugo
env:
# For maximum backward compatibility with Hugo modules
@@ -53,7 +53,7 @@ jobs:
--minify \
--baseURL "/"
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
uses: actions/upload-pages-artifact@v1
with:
path: ./public
@@ -67,4 +67,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v1

20
.github/workflows/mardkwon-SEO.yaml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: MD SEO check
on: [push, pull_request]
jobs:
seocheck:
name: Markdown SEO Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Markdown SEO Check
uses: zentered/markdown-seo-check@v1.1.5
with:
max_title_length: 70
max_description_length: 150
max_slug_length: 100
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,30 +0,0 @@
name: Check and correct text
on:
push:
branches: [master]
# pull_request:
# branches: [master]
jobs:
check-and-lint-text:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: huacnlee.autocorrect
uses: huacnlee/autocorrect-action@v2.10.0
with:
args: --fix
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore: lint text and auto correct"
title: "Text lint and fix"
labels: "Lint"
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
branch: "text-lint"
body: "Some words and sentences need to be updated."

View File

@@ -2,12 +2,8 @@
framed = true
+++
# Hi there!👋
# Hi there!
<p align="center">
<img src="/favicon.png" width=120 />
</p>
Welcome to my blog👋 Check these
Welcome to my blog🎩 Check these
[💻 技术文章](/categories/%E6%8A%80%E6%9C%AF/) | [💡 My Github](https://github.com/Colin-XKL/) | [💎 公开服务&个人作品](/services/)
[💻 技术文章](/categories/%E6%8A%80%E6%9C%AF/) | [📖 My Readings](https://reading.colinx.one) | [💡 My Github](https://github.com/Colin-XKL/) | [💎 公开服务](/services/)

View File

@@ -19,7 +19,7 @@ lastmod: 2021-05-10
## Catch Me
- 博客主页https://blog.colinx.one
- Github 主页https://github.com/Colin-XKL
- Github 主页: https://github.com/Colin-XKL
- Email: Colin_XKL#outlook.com
@@ -27,6 +27,6 @@ lastmod: 2021-05-10
获取支持/服务
支持公益事业发展如任何非盈利机构有 IT 服务部署 / 网站托管或维护 / 架构咨询 / 问题排障 等需求可直接联系在能力范围内提供无偿支持
支持公益事业发展, 如任何非盈利机构有 IT 服务部署 / 网站托管或维护 / 架构咨询 / 问题排障 等需求可直接联系, 在能力范围内提供无偿支持
其他个人或企业有相关需求的可通过email免费咨询或以其他形式提供付费支持

View File

@@ -1,4 +1,5 @@
---
title: 2020 年度总结
date: 2020-12-26
lastmod: 2020-12-31
@@ -9,6 +10,8 @@ categories:
tags:
- 总结
- 杂记
- 2020
---
<!-- # 2020年度总结 -->

View File

@@ -1,4 +1,5 @@
---
title: 2021 年度总结
date: 2021-12-31
lastmod: 2021-12-31
@@ -9,6 +10,8 @@ categories:
tags:
- 总结
- 杂记
- 2021
---
<!-- # 2021 年度总结 -->

View File

@@ -9,6 +9,7 @@ categories:
tags:
- 总结
- 杂记
- 2022
---
## 我的 2022 年度关键词

View File

@@ -1,123 +0,0 @@
---
title: 2023 年度总结
date: 2023-12-31
lastmod: 2023-12-31
description: 我的 2023 年度关键词 空虚&丰满
categories:
- 杂记
- 年度总结
tags:
- 总结
- 杂记
---
## 年度关键词
**空虚**, **丰满**
2023 年,久违的没有疫情了,这一年跑了很多地方,也解锁了工作一周年的成就,尝试做了很多东西,也入手了不少好物,有些切切实实提升了日常体验,有些则是放以前我能兴奋把玩很久,但是如今买了一堆,兴奋和喜悦却只能持续一个周末。这一年有很多睡不着的晚上,虽然大多数时候都是喝了咖啡或者茶睡不着,不过睡不着的时候也不能全赖咖啡因,睡不着就开始胡思乱想,越想就越睡不着了。到后面脑子里到处都是 idea, 受不来了就爬起来打开电脑哐哐哐开始写,可惜最后一个周末过去上了几天班,这些项目就推进不下去了。上班还是挺消耗心智的。可能这也是为什么今年的很多时候都隐隐感觉到空虚吧。
在尝试写下这篇年度总结的时候,我又回去翻了相册、购物记录、代码记录,梳理一通发现今年虽然主观上感觉比较空虚,但其实还是做了不少事情的,或者说有了不少独特的体验。无论是演唱会、打卡的景点、折腾的玩具、入坑的剧集,还是说工作上的一些事项,同事和老板的一些肯定,这些加起来,总体来看,似乎也不能说过去的一年是一个平平无奇的,无聊的,一事无成的一年。那我为什么会感到空虚呢?
我不禁想反问自己,空虚的反义词是什么?什么情况下我才不会感到空虚呢?为什么我回忆起过去的一年会觉得自己很空虚呢?
追自己非常喜欢的剧集不会让我感到空虚,今年看的几部剧也确实都不错,看了挺长时间。
去外面旅游打卡不会让我感到空虚,但是今年也没少出去玩,甚至中间还有几个长假玩了挺久
折腾自己的玩具项目不会让我感到空虚,但是今年折腾的东西一点都不少
入手心仪很久的科技产品不会让我感到空虚,今年同样没少买,又是小主机又是 3D 打印机的
得到赞赏不会让我感到空虚,可是今年,无论是来自同事的,来自老板的,来自开源社区的陌生人的,都不少
那什么也没缺,为什么我会觉得自己很空虚呢?
细细想来,过去的一年高光时刻很多,但是总的时长其实很有限。可能正是因为高光时刻太令人兴奋了,相比之下,日常普普通通,波澜不惊的那些日子,显得尤为空虚。
满打满算,有高光时刻,非常“精彩”的天数可能才 60 天,也就是说一年里 300 多天我都是在“刚刚经历高光时刻,兴奋刚刚退去”的“戒断反应”下度过的,这些平常的日子相比较起来确实非常无聊,非常空虚。
所谓“平平淡淡才是真”, 平凡的日子才是生活的主旋律。这样一看,统计下那些“不平凡”的天数,其实过去的一年是相当丰富、充盈的,这里我选择了“丰满”这个词作为年度关键词之一。一方面是指“高光时刻”真的很多,另外一方面也是有“羽翼渐丰”的意思。
2023 解锁了工作一周年的成就,无论是在社会角色,经济能力,还是消费理念,工作能力等方面,我发觉自己都开始达到了一个新的台阶。我开始能够作为子女,作为业务的核心成员,能够“独当一面”, 在社交和消费时也能从过往十几年的枷锁中突破开来,更加开放,果断,自信。用 2023 年的流行语来说由“I 人”变得更“E”了。
这里也引出另外一个话题如何判断自己到底是“I 人”还是“E 人”, 为什么我是“I 人”而不是“E 人”呢为什么我只能是“I 人”或“E 人”而不是两者兼具呢?
我一度因为自己厌恶社交不会“来事”而给自己贴上内向的标签。按照评测结果来看我是妥妥的“I 人”, 但是过去的几年里,接触到不少同学、朋友、同事,不少人给我打的标签都是“积极的”,“勇敢的”,“外向的”, 甚至还有同学来问我,如何才能像我一样,在公开场合讲话时“临危不惧”,“娓娓道来”, 我诧异了,我一直都觉得自己是个内向寡言胆小怕事的小透明,至少从小学开始,我就是给自己立的这个人设,每逢过年走亲戚、外出活动和社交的时候我也总是尽量一个人在角落里企图避开所有其他人的交流。
我回忆起每次有大人来尝试给我开玩笑我后面总是气到不行原地大哭,现在想想当时只是因为开的玩笑太过分,不尊重人,我那时不懂得反驳而已。
我回忆起每次过年走亲戚我总是躲在房间里不想出去,饭桌上也总是沉默不语只企图尽快逃离。现在想来,一桌子不认识的亲戚,聊着我都听不懂的家长里短,我怎么可能会有待下去的意图。
我回忆起以前在学校总是避开所有的社交活动、体育活动,一个人在座位上看书,现在看来单纯只是因为那个时候自己已经和班里的大部分同学不在一个频道上面了,无论是成绩还是兴趣方向、话题等等。上大学以及后面工作时,遇见过很多很优秀的朋友,日常交流时我从来都没感觉到自己需要逃避,反而我会非常期待,以及非常珍惜在一起交流玩耍的时间。
回过头来看,过去几年的我并不是变得更外向,更积极,更擅长社交了,而是我从人设的枷锁中解放了自己的人格,在与优秀的伙伴相处时找回了真实的自己。新的一年,希望自己能够更多地发展真实的自我,没有定义,没有标签,做自己想做的自己!
## 2023 年度高光时刻 ✨
- 花了好几个晚上做铃芽主题曲的短片,每天盼着下班就回家开始剪辑和调整节奏,那股热情和冲劲可遇而不可求
- 部门团建去贵州玩了四天,不知道是不是因为上班压抑的太久,感觉玩了一个星期多,很充实
- 下半年去湖南参加婚礼顺带玩了一周,行程满满当当,天气也很给力,错峰出行总体体验也非常不错
## 2023 年度遗憾 ☁️
- 铃芽的短片做完了投稿没有 check 状态,后面过了好几天才发现之前投错了被审核拒绝了,错失了流量热点
- 在窗帘伴侣接入 HomeAssistant 这件事情上浪费了太多时间,早知道应该直接钞能力解决,时间和精力可以做更多的事
## Flags From 2022
- 阅读 6 本书 (✅, 包括球状闪电在内的 4 部文学作品1 部心理学1 部技术类)
- 发布 6 篇博客文章 (✅, 虽然有赶工的嫌疑不过最后还是完成了 hhh )
- 打卡 6 个景点 (✅13/6, 217% 超额完成,广州的大学城,海心沙亚运公园,贵州的肇兴侗寨,荔波小七孔等,湖南的桃花源,张家界,凤凰古城等)
- 在各种公共平台发表总共 6 个作品 (✅, 勉强完成,可惜很多都只开了个头没有继续运营下去)
## Question From 2022
> **一年后的自己,有没有变得更加善于表达自己,有没有更多、更畅酣地表达自己?**
这个问题需要分成两个部分来回答。首先毫无疑问的是2023 的我在表达自己的时候更加顺畅了,但是还算不上酣畅。目前来看,我表达自己的一个重要途径是创作,任何内容的创作。我需要一些创作的动机和契机来实现这一点,期待在新的一年里,能够有更多,更深度,更持续的创作。
## Flags For 2024
- 发布 6 篇博客文章
- 做 3 个 Weekend Project, 两天马拉松直接从 0 到上线
- 做 2 个 Side Project, 并持续投入运营
## Question For 2024
一年后的自己,有没有找到或者建立一个会愿意持续投入 3 年以上的项目,方向,或者事业?
---
## 年度流水账环节
- 没有寒假的春节,失去了才发现有长假是真的爽
- 春节期间三五好友的露天烧烤
- 年后没几天就匆匆回来上班,不过开头几天大家都是不约而同默契摸鱼,加上不知道因为是不是疫情退散加上新年新气象,感觉倒也没那么糟糕
- 入坑 Astro, 这个集合 SSR+CSR+Component Island + Hydration 众多新概念的框架确实有点意思,尝试做了个 version selector 的玩具项目,可以给项目开坑或者升级的时候选择技术组件的版本提供查询和参考,使用 headless CMS 方案,虽然最后没做成多大的规模,不过这个 Headless CMS 方案却给朋友带来了一点小小的震撼,激动到回家就开始准备写小程序开店 hhh
- 公司年会,抽中了个 AirPods 3, 运气还不错
- 打卡海上世界,华强北等地,之后几天又去深圳湾、南山公园,疫情放开感觉有点想报复性地多出去走走
- 尝试折腾水族,买了鱼缸、水泵等一大堆东西,后面发现水泵太吵、缸放阳台顶不住夏天暴晒
- 疯狂追剧 Futurama 系列
- 给铃芽的主题曲做了个中日粤三语的 MV(或者说 MAD?), 一直以来我都对音乐以及画面之间的节奏很感兴趣,这一次真正动手做,花了很多时间和精力,而且久违的有很多热情和冲动,每天下班回家就是疯狂剪辑和调整节奏,成片一遍又一遍检查和调整。不过最终的效果还可以,虽然没能蹭上热点,但是评论区和弹幕还是有不少小伙伴表示了认可和赞赏。
- 折腾 Azure windows vm, 未果,教训是远离 win vm, 太麻烦了
- 折腾智能家居,入手了空调伴侣、远程控制空调和红外控制风扇等,体验不错,值得颁一个年度好物奖 👍
- 五一难得趁假期回了趟家,久违的又遇见了初夏季节的家乡
- 去广州看杨千嬅的演唱会,不得不说实力派歌手的现场真的很棒
- 借着朋友还没毕业的机会,逛了下广州大学城,看了场篮球赛,短暂的感受了一下没有疫情下的,慢慢的校园活力
- 部门团建,去贵州玩了几天,风景很好,活动也很精彩,短短四天玩的很开心很充实,不知道是不是因为平时节假日都是中午才起,白天太短,这次加上往返只有四天但是感觉玩了整整一个星期
- 折腾 GPT 和 wordpress, 尝试通过 AI 自动生成内容建站,后面发现对中文支持不太行,人工审校还是需要花不少经历
- 折腾智能家居,买的窗帘伴侣不能接 Home Assistant, 不能每天早上定时开启,很烦,尝试通过闲置的安卓手机模拟操控,打开米家每天定时开窗帘。为此又久违的操起了 ROOT 安卓手机的旧活,最后终于在 Mi6 上跑起来类原生的 Android 13
- 脑袋一热研究 AI 写网文小说脑洞打开写了不少可惜网文要求的水分实在太大AI 对于超长上下文也处理不好,不太听使唤
- 折腾旁路由OpenWRT on Raspberry Pi 的方案最终失败OpenWRT 对容器场景并没有做优化,插件更新和升级等的体验比较糟糕,再叠加其他一些因素,后面回归独立路由器 OpenWRT 的方案
- 折腾 NAS on Cloud, 由于网络环境变化,在家里连接我那新加坡的服务器使用 plex 时晚高峰丢包非常严重,折腾了好久的内核参数和 TCP 协议,最后发现在丢包率高达 20+%的情况下神仙来了也没用
- 疯狂追剧 The Simpsons 系列
- 折腾双语字幕的自动化方案,自动从 bundle 了多国语言字幕的视频资源文件中提取两种语言字幕并合并,以及根据 SDH 字幕自动把网上搜到的双语字幕进行时间轴对齐操作
- 办公室坐太久,切身体会到对身体的影响,火速下单腰靠和人体工学鼠标等配件,不得不说,用上之后确实能缓解不少,日常也开始多多注意一些屏幕前久坐的坏习惯
- 折腾把窗帘伴侣接入 Home Assistant 无果,又不想自己写驱动适配,后面妥协还是入手了小米的多模网关。回头想想自己花了那么多时间和精力,投入的远远不止网关这点钱,真是不值当
- 赶上中秋和十一连休,超长假期又回了趟老家
- 香港初体验,不由得感叹香港在文化氛围、无障碍设施覆盖、商业活力真的很好,相较于内地的一线城市还要高一个层次
- 拿起吃灰许久的电饭煲折腾自制酸奶,味道还不错
- 双十一疯狂剁手,入手了 3D 打印机、超迷你精悍全金属的双网口迷你小主机等等,以及在某东几分钱几毛钱薅了一堆羊毛,包括两毛钱包邮的十棵多肉,薅羊毛薅的欲罢不能
- 借着参加婚礼的机会,连休了一周,在湖南玩了一大圈,景区人很少,错峰出来玩又是一周连休真的很爽
- 入坑老头环,开场被虐的体无完肤,后面才发现逃课才是最大的乐趣
- 疯狂追剧星际牛仔
- 疯狂追剧浩瀚苍穹系列
- 又跑了一趟香港办卡,本来以为流程会很麻烦没想到当天现场就丝滑下卡
- 打卡少数派线下店,有些硬件的东西还是实际摸起来更有感觉
- 2023 the end

View File

@@ -1,7 +1,7 @@
---
title: 2023静态网站托管服务速度对比
date: 2022-12-25
description: 对几家喜闻乐见的静态网站托管服务商 Vercel、Netlify、Cloudflare Pages、Azure Static Pages 测个速2023 版
description: 对几家喜闻乐见的静态网站托管服务商 Vercel、Netlify、Cloudflare Pages、Azure Static Pages 测个速, 2023 版
categories:
- 技术
tags:

View File

@@ -1,128 +0,0 @@
---
title: LLM Agent is All You Need - 当我用大模型助手来指导我完成 MVP 产品 - 「Colin's Weekend Project」
date: 2025-09-14
description: 我个人喜欢挑一个周末在一个很短很专注的时间内,捣鼓点小玩意。这个栏目用来记录我的这些 idea、作品、创作过程以及吐槽。今天来挑战一下在大模型的指导下完成一个最小可行产品 (MVP)
categories:
- Weekend Project
tags:
- 技术
- JAMStack
- LLM
- AI
---
> **「Colin's Weekend Project」**
> 我个人喜欢挑一个周末在一个很短很专注的时间内,捣鼓点小玩意。这个栏目用来记录我的这些 idea、作品、创作过程以及吐槽
今天来挑战一下,在大模型的指导下,完成一个最小可行产品 (MVP)
## idea
如果单纯是开发一个完整的 web 程序 or 移动端程序,其实没啥意思。我之前已经搞过很多,更别提日常在公司里面就是在开发各种功能。今天我打算以一个非专业人士的视角,探究一下:
- 当下各种 AI 助手已经百花齐放,飞入寻常百姓家。但是当下的 AI 在真实世界的任务中,究竟能做到什么地步
- 如果作为一名非专业人士,究竟能不能借助这些 AI 工具做出一个可用的产品
- 如果真正要做一个面向 C 端的产品,把流程 Run 起来持续下去,需要考虑哪些因素
## 如果一切都从 LLM 开始...
我需要代入一个非专业开发人员的视角,来进行这次的项目。首先项目启动的第一个问题:在没有任何产品经理的知识,不懂得产品开发流程的小白的情况下,我需要如何开始?
在没有 LLM 以前,或许我需要先各种查阅资料学习,或者各种摇人让懂行的朋友进行指导。但是现在,一切都不一样了:随便一个 LLM 都可以帮我快速入门
一开始,我是打算接住 LLM 让我快速了解产品相关的知识。但是突然觉得,既然都用 AI 了,为什么还在遵循原有的路径,一步步自己学习、理解然后教 AI 做事呢换个思路我只要提供需求AI 来拆解任务。
于是
![image|476x415](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249632.png)
![image-1|700x472](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249633.png)
![image-2|700x472](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249634.png)
利用 AI 生成一套提示词,来指导我如果分析我的需求、拆解任务
不得不说,对于这些跨领域的知识,能有一个不厌其烦的 AI 助手来循序渐进地跟你交流、帮你分析,效果非常好。人类可能还真不好干这个活。
## 「AI 教我做产品」
经过跟这个「MVP 导师」的 LLM Agent 反复沟通,确定了产品的主要构想和核心事项。以下是摘录的一部分
```markdown
#### MVP 概要3句话
- **为谁**2030 岁、周末感到无聊且有意愿尝试新事物的年轻人。
- **解决什么痛点**:不清楚该尝试哪些活动、如何快速入门、活动是否适合自己、以及能获得什么收益。
- **提供的核心功能**:活动列表页面 → 点击感兴趣的活动 → 展示入门门槛与材料推荐(入门材料按钮)并埋点上报。
```
```markdown
## MVP 核心功能:
1. **活动列表**:集中展示多种可入门活动(绘画、球类、手工等)。
2. **入门详情**:点击任意活动 → 展示入门门槛、必备材料、推荐教程链接。
3. **埋点追踪**:记录“点击 → ≥1min 外部阅读 → 回站”行为,用于验证假设。
```
这里印象深刻的是MVP 导师让我先确保用户痛点一定要是真实的在初期没有论证的情况下MVP 的意义就在于基于一个假设 (假设用户的痛点是 xxx), 我们要围绕这个痛点先开发出 1-2 个核心功能,然后通过用户数据分析,来验证我们关于用户痛点的假设是否成立。如果不成立说明是伪需求,也就没有继续投入的必要了。
这一点还是让我挺惊喜的,因为大部分人有个 idea 想做 xx 产品,大部分都是脑门一热,想要有 xxx 功能但是其实根本的需求并不是这个。花了很多精力搞出来的功能其实是伪需求。而 AI 导师专业水准还是挺在线的,能够在一开始就识别这个风险
## Vibe Coding
接下来就是要进入开发的部分了。我选择的 AI 代码工具是字节的 Trae 海外版,不用验证手机号而且可以使用 Google Gemini、OpenAI GPT-4o、Anthropic Claude 4 等高级模型。
首先让 AI 根据产品需求文档、拆解任务文档,确定了技术方案。不过这里我为了效率简化了下&注入了一些自己的私房调料,最终使用的方案为:
- astro + vue3 + tailwind css 来构建 web 站点
- directus cms 作为后端,省去编写后端和对接数据库的麻烦
- vercel 快速部署
这部分没啥好说的,简单列几个吐槽的点吧:
- astro 配置 tailwindcss, 换了一圈大模型没一个正确的。应该是跟近期大版本更新有关系。最后还是我手动跟着 astro 官方的文档搞定的
- trae 高级模型试用额度很低,没写几个功能就超限了开始排队,动不动前面几百号人基本没法用
- 现阶段 AI IDE 基本都是基于 vs code 改的。所以 vscode 的缺点也都一并继承了过来,很多语言的插件需要额外手动安装、各种变量跳转用不了、各种奇怪的波浪线报错又没法快速修正
最后简要看下最终的成果吧
![image-3](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249635.png)
![image-4](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249636.png)
后台数据:
![image-5](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249637.png)
## 埋点上报与用户行为分析
之前做的都是玩具项目和公司内部平台,没怎么接触过 C 端用户行为分析。这块确实还是个挺陌生的领域。不过好在我们有万能的 AI. 在经过埋点需求分析、技术方案对比、任务拆解之后,最后采用了 Umami 平台来进行上报,并简单配置了下指标用于计算用户停留,辅助验证我们关于用户痛点的假设
![image-6|0x0](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249639.png)
跟 MVP 导师沟通的时候,确定了验证假设的方式为:衡量用户是否点击「查看详情」按钮
- 用户点击并在外部阅读 ≥1 分钟后回站
- 成功阈值25% 的访问者完成“点击 → ≥1min 回站
为了方便统计,借助 umaimi 的统计功能快速实现,我只需要统计有多少比例的用户至少点击了一次「了解详情」. 具体到代码实现上,就是在「点击详情」按钮添加一个上报,上报内容包括用户的 session id, 后面在 umaimi 统计一段时间内,按钮点击事件里面,有多少独立的 session id 处以总的 uv 就可以。
![image-7](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249640.png)
## 投放
众所周知,天朝桌面端 web 用户已经约等于 0 了技术博客都很少人看更别提这种泛娱乐向的内容。MVP 导师提供的方案,也是路线正确,但是 web 端用户数据反馈验证的路子基本没用。不过这个 web 页面我也不指望能成为流量主力,最多算个 wiki.
要想真的有人看,收获真实用户反馈,还是需要到各种新媒体平台去投放的。然后再收集数据进行分析,不过这个工作量就是另外一回事了。运营起来还是需要挺多时间精力的。
尝试做了几个图投放到小红书,放几个示例图
![image-8](https://blog-1301127393.file.myqcloud.com/BlogImgs/202509172249641.png)
用的搞定设计的模版调整了下,插图是用 Gemini, 效果还可以,能很好地遵循用户指令,不过美学方面跟 MidJourney 那些还是差了一截,毕竟人家专攻的方向。提示词里面限制好风格的话出图效果还是可以的,这里后续如果有必要的话,其实也可以 AI 批量生产插图。
不过小红书账号冷启动,反响平平。这里后续有时间再研究吧
## The End

View File

@@ -216,7 +216,7 @@ volumes:
| Mod名称 | 说明 |
| -------- | ------------------------------------------------------------ |
| LootBags | 击杀怪物得到战利品带,随机开出各种物品。不过你的箱子很快就会被一堆奇奇怪怪的东西堆满(比如我有一大箱无用的钻石马铠) |
| Cuisine | 中文名烹饪工艺,国人作者开发的 Mod挺有趣很好地还原了做菜的过程做完之后的菜会获得药水一样的效果。不过目测已经停更而且没有很好的教程 |
| Cuisine | 中文名烹饪工艺,默认开发的Mod挺有趣很好地还原了做菜的过程做完之后的菜会获得药水一样的效果。不过目测已经停更而且没有很好的教程 |
**注意**上面列举的所有Mod都是Mod本体有些Mod的功能还依赖于其他Mod在安装时必须同时安装Mod本体和他依赖的Mod。具体的依赖关系可以参考mcmod.cn上对Mod介绍页的Mod关系选项卡CurseForge的Mod介绍页的Relation选项卡。

View File

@@ -12,7 +12,6 @@ tags:
- Github
- 代理
---
![logo](https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/.github/logo.png)
![license](https://img.shields.io/github/license/Colin-XKL/RSSmanX)

View File

@@ -10,6 +10,7 @@ tags:
- Linux
- 教程
- Docker
---
<!-- # RSSManX安装部署指南 -->
@@ -23,7 +24,6 @@ RSS Man X 会利用到 docker 和 docker-compose首先需要确保你的服
检查服务器中是否已经安装了docker和docker-compose并检查他们的版本是否太老。比如输入`docker --version`来检查docker的版本
docker的版本建议不要低于19docker-compose的版本建议不要低于1.20
(注Docker 新版本可使用`docker compose` 替代 `docker-compose`)
```shell
~ » docker --version
@@ -114,6 +114,8 @@ sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
### 1.3 安装或更新docker-compose
docker-compose目前有两个主要版本V1和V2都是可用的。V1使用Python编写使用时类似`sudo docker-compose up -d`V2则是Golang编写与前者高度兼容但是是作为docker的插件安装的使用时类似`sudo docker compose up -d`,中间的短杠不需要了。
@@ -148,7 +150,6 @@ pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple
```
如果提示pip命令不存在需要先安装一下
```shell
# Ubuntu/Debian
sudo apt install python3-pip
@@ -163,30 +164,26 @@ sudo yum install python3-pip
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
```
### 1.4 为Docker配置镜像源
如果Docker下载镜像非常慢你可能需要单独配置一下Docker的镜像源。==**注意Docker安装软件源的镜像和Docker镜像或者说映像的国内源并不是同一个英文表述可能更准确一些**==
- 上文安装 docker 时配置的是 dockerreporepo 里含有 docker 的软件包,[国内的镜像](https://mirrors.ustc.edu.cn/help/docker-ce.html)为 Docker CE 安装软件包的镜像
- 现在我们要配置的是 Docker HubMirrorDocker 里拉取 Image 默认会访问[Docker Hub](https://hub.docker.com),国内有多个 Docker Hub 镜像或是 Docker 镜像加速器,如[中科大的源](https://mirrors.ustc.edu.cn/help/dockerhub.html)
* 上文安装docker时配置的是dockerreporepo里含有docker的软件包[国内的镜像](https://mirrors.ustc.edu.cn/help/docker-ce.html)为Docker CE安装软件包的镜像
* 现在我们要配置的是Docker HubMirrorDocker里拉取Image默认会访问[Docker Hub](https://hub.docker.com)国内有多个Docker Hub镜像或是Docker镜像加速器如[中科大的源](https://mirrors.ustc.edu.cn/help/dockerhub.html)
`/etc/docker/daemon.json`文件中写入以下内容如不存在可先行创建注意json中列表的最后一项末尾是没有逗号的
```json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://dockerproxy.com",
"https://docker.m.daocloud.io"
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
```
update 20230720: 部分镜像源不再可用,更新镜像源配置。参考 https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6
配置完成后`sudo systemctl restart docker`重启docker服务然后输入`sudo docker info`,在输出结果的末尾可以看到`Registry Mirrors`里会出现我们刚刚配置的Docker Hub镜像
群辉等NAS的系统并不是标准版Linux安装的也是魔改版docker上面的配置文件地址并不适用建议自行搜索对应的文档或教程。
@@ -196,7 +193,7 @@ update 20230720: 部分镜像源不再可用,更新镜像源配置。参考 ht
[RSS MAN X项目](https://github.com/Colin-XKL/RSSmanX)旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径,毕竟不是所有 RSS 爱好者都懂代码 😂。RSS Man X能够有 RSS 订阅管理、RSS 在线阅读界面,进阶功能包括服务健康自检、海外站点 RSS 解锁等,提供不同的版本供选择,三个版本的 `docker-compose` 文件对应不同的需求,包含的组件和服务有差异。
| 组件 / 服务 / 功能名称 | 标准版 | Lite 版 | Ultimate 版 ✨ |
| ---------------------- | ------ | ------- | -------------- |
| ---------------------- | ------ | ------- | ------------- |
| TTRSS | ✅ | ✅ | ✅ |
| RSSHub | ✅ | ✅ | ✅ |
| Huginn | | | ✅ |
@@ -238,7 +235,7 @@ update 20230720: 部分镜像源不再可用,更新镜像源配置。参考 ht
8. RSS Man X的除 lite 以外的版本默认包含了自托管的 mercury 实例,你只需要在插件配置页面设置 mercury 实例地址为 `service.mercury:3000` 即可同理OpenCC实例地址为`service.opencc:3000`
9. 如果部分 RSS 源不能订阅,检查是否使用了非常规端口。在`.env`文件中设置`RSS_ALLOW_PORTS`
9. 如果部分RSS源不能订阅检查是否使用了非常规端口。在`.env`文件中设置`RSS_ALLOEW_PORTS`
10. 若部署后某个应用一直无法通过浏览器访问,请检查是否绑定到了`6000`/`6666`等特殊端口,浏览器会拦截对这些端口的访问参见[这里](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
@@ -248,19 +245,21 @@ update 20230720: 部分镜像源不再可用,更新镜像源配置。参考 ht
13. RSS Man 里所有容器绑定了服务器的/etc/localtime使用`sudo timedatectl set-timezone Asia/Shanghai` 设定系统的时区为上海后,容器里的时区也可以同步,这样日志里的时间就是东八区了
**获取帮助**
- **For Tiny tiny RSS problems:**
* **For Tiny tiny RSS problems:**
[https://tt-rss.org/wiki.php](https://tt-rss.org/wiki.php)
[http://ttrss.henry.wang/](http://ttrss.henry.wang/)
- **For RSSHub problems:**
* **For RSShub problems:**
[https://docs.rsshub.app/faq.html](https://docs.rsshub.app/faq.html)
- **For Huginn problems:**
* **For Huginn problems:**
[https://github.com/huginn/huginn#readme](https://github.com/huginn/huginn#readme)
### 2.3 链接
- [我的 RSS 方案与心得](https://blog.colinx.one/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/)
- [RSS Man X GitHub repo](https://github.com/Colin-XKL/RSSmanX)
- [Huginn 指南:为任意网站制作 RSS](https://blog.colinx.one/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/)
- [docker compose 的错误使用姿势](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
* [我的 RSS 方案与心得](https://blog.colinx.one/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/)
* [RSS Man X GitHub repo](https://github.com/Colin-XKL/RSSmanX)
* [Huginn 指南:为任意网站制作 RSS](https://blog.colinx.one/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/)
* [docker compose 的错误使用姿势](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)

View File

@@ -175,9 +175,9 @@ Cygwin 的安装程序可以[从其官方站点下载](https://cygwin.com/instal
## 配置 VSCode 的作为 C 语言学习环境
配置VSCode的作为C语言学习环境
VSCode 是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
<span id="vscode">VSCode</span>是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
前往[VSCode官网](https://code.visualstudio.com/)下载Windows 版VScode。并按照安装程序的指引进行安装。

View File

@@ -1,26 +1,28 @@
---
title: 个人向 Linux 新服务器初始化清单
date: 2023-03-14
lastmod: 2025-06-21
description: 一份 Linux 初始化清单避免每次拿到新的服务器都要一个个去各种地方搜集指令以做备忘 & 供有需要的朋友参考以目前最新的 Debian 11 Bullseye 为例
lastmod: 2023-03-15T09:14:44.308Z
description: 一份 Linux 初始化清单, 避免每次拿到新的服务器都要一个个去各种地方搜集指令, 以做备忘 & 供有需要的朋友参考. 以目前最新的
Debian 11 Bullseye 为例
draft: false
categories:
- 技术
tags:
- 技术
- Linux
- Debian
- Traefik
- Headless CMS
---
一份 Linux 初始化清单, 避免每次拿到新的服务器都要一个个去各种地方搜集指令, 以做备忘 & 供有需要的朋友参考.
服务器发行版我个人推荐 Debian 系列, CentOS 系现在已经开始分裂而且说实话对新手其实并不友好. Debian 是在兼容性, 易用性和稳定性之间都取得不错平衡的发行版. 新手推荐 Ubuntu, 不过最近商业化有点过度, 夹带了越来越多的私活, 我个人所有新安装的 Linux 已经全线转向 Debian. 下文以目前最新的 Debian 11 Bullseye 为例
一份 Linux 初始化清单,避免每次拿到新的服务器都要一个个去各种地方搜集指令,以做备忘 & 供有需要的朋友参考
服务器发行版我个人推荐 Debian 系列CentOS 系现在已经开始分裂而且说实话对新手其实并不友好。Debian 是在兼容性,易用性和稳定性之间都取得不错平衡的发行版。新手推荐 Ubuntu, 不过最近商业化有点过度,夹带了越来越多的私活,我个人所有新安装的 Linux 已经全线转向 Debian. 下文以目前最新的 Debian 11 Bullseye 为例。Debian 12 bookworm 也测试通过。
> azure 干净的 debian 11 镜像,资源使用情况供参考:
> azure 干净的 debian 11 镜像, 资源使用情况供参考
>
> ~1G Disk, ~100M RAM, ~300 packages
> \~1G Disk, \~100M RAM, ~300 packages
本文仅列举主要事项和操作新手可先行阅读这篇文章熟悉概念[云服务器入门指南](https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/)
本文仅列举主要事项和操作, 新手可先行阅读这篇文章熟悉概念. [云服务器入门指南](https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/)
正文开始
@@ -31,18 +33,15 @@ tags:
检查服务商防火墙和系统自带防火墙(debian 系一般为 `ufw`, cent os 系一般为 `firewall-cmd`).放行 SSH(22), 新的 SSH(自定义), HTTP, HTTPS, 以及其他常用开发端口
### 1.2 新建用户与检查 sudoer
登录到 root 用户,创建个人账户并设定密码
```shell
// -m 创建对应home文件夹
// 添加到 sudo 用户组自动获得sudo权限, 部分发行版为wheel组
// 添加到wheel用户组自动获得sudo权限
useradd -m --groups sudo colin
// 设定密码
passwd colin
useradd -m --groups wheel colin
```
也可直接编辑`/etc/sudoers` 文件为新用户添加 sudo 权限使用 `visudo` 指令可以自动帮你校验避免配置写错把系统搞崩
也可直接编辑`/etc/sudoers` 文件为新用户添加 sudo 权限, 使用 `visudo` 指令可以自动帮你校验, 避免配置写错把系统搞崩
### 1.3 镜像源与基础软件
@@ -56,13 +55,14 @@ passwd colin
//for debian
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
//for ubuntu
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
```
CentOS 系建议启用 EPEL, PowerTools 等 repo 以更方便地安装常用软件和工具此处不再赘述
CentOS 系建议启用 EPEL, PowerTools 等 repo 以更方便地安装常用软件和工具. 此处不再赘述
推荐的几个国内镜像站[清华大学 TUNA 镜像站](https://mirrors.tuna.tsinghua.edu.cn/), [中科大 USTC LUG 镜像站](https://mirrors.ustc.edu.cn/), [腾讯镜像站](https://mirrors.cloud.tencent.com/)
推荐的几个国内镜像站: [清华大学 TUNA 镜像站](https://mirrors.tuna.tsinghua.edu.cn/), [中科大 USTC LUG 镜像站](https://mirrors.ustc.edu.cn/), [腾讯镜像站](https://mirrors.cloud.tencent.com/)
#### 基础软件
@@ -74,44 +74,38 @@ sudo apt install zsh tmux htop duf htop tldr screenfetch tree
### 1.4 SSH 安全
修改端口配置文件`/etc/ssh/sshd_config`. 重启机器或 sshd 服务后生效
此外最好将`PermitRootLogin`修改为`no`, 可以禁用 root 登录。
修改端口, 配置文件`/etc/ssh/sshd_config`. 重启机器或 sshd 服务后生效
在本机检查`~/.ssh/`有无 id_rsa 等已生成的 key. 如没有再使用 `ssh-keygen` 生成私钥
将本机的公钥上传到远端再写入远端的 `authorized_keys`
将本机的公钥上传到远端, 再写入远端的 `authorized_keys`
`cat ~/id_rsa.pub >> ~/.ssh/authorized_keys`
注意修改权限`~/.ssh/authorized_keys` 权限为 600. `~/.ssh/`700
注意修改权限, `~/.ssh/authorized_keys` 权限为 600. `~/.ssh/`400
可以参考以下设置
> .ssh/ 0700/rwx------
> .ssh/*.pub 644/rw-r--r--
> .ssh/* 0600/rw-------
如失败可参考这篇文章 debug. [https://superuser.com/questions/1137438/ssh-key-authentication-fails](https://superuser.com/questions/1137438/ssh-key-authentication-fails)
如失败可参考这篇文章 debug. <https://superuser.com/questions/1137438/ssh-key-authentication-fails>
### 1.5 设置 hostname
可选为了便于识别和后续配置 oh-my-zsh 更美观。这里修改完后还需要更新 hosts 设置,把刚才设置的新的主机名指向 localhost
可选, 为了便于识别和后续配置 oh-my-zsh 更美观
```shell
sudo hostnamectl set-hostname my-new-server
sudo hostnamectl status
```
此外`/etc/hosts` 中默认会有个本机 hostname 映射到`127.0.0.1` 的配置,修改 host 之后这里别名的映射也要修改下,不然终端执行命令会一直弹 `sudo: unable to resolve host xxx: Name or service not known`
修改后需重启
- - -
### 1.6 SWAP
可选建议内存<2G 配置 swap, 大小至少为 2 倍物理内存可以有效避免意外爆内存的情况仅推荐 SSD 盘的服务器开启
可选, 建议内存<2G 配置 swap, 大小至少为 2 倍物理内存
推荐用 `fallocate` , 因为这个是最简单最快速的创建交换空间的方法 `fallocate`  命令用于为文件预分配块 / 大小
以下内容参考 linux.cn
使用  `fallocate`  创建交换空间首先在  `/`  目录下创建一个名为  `swap_space`  的文件然后分配 2GB  `swap_space`  文件
```shell
@@ -129,7 +123,6 @@ sudo swapon /swap_space
// 使用 s 参数查看列表
sudo swapon -s
```
每次重启后都要重新挂载磁盘分区因此为了使之持久化就像上面一样我们编辑  `/etc/fstab`  并输入下面行
@@ -140,20 +133,17 @@ sudo swapon -s
保存并退出文件现在我们的交换分区会一直被挂载了我们重启后可以在终端运行  `free -m`  来检查交换分区是否生效
还可以按需选择使用 zram提升内存可用量不过会略微增加 cpu 使用和内存延时可以搜索 zramctl, zramswap 等关键字
- - -
### 1.7 绑定域名  
可选绑定一个域名或者改下本地 host 便于后续访问
可选, 绑定一个域名或者改下本地 host 便于后续访问
### 1.8 添加本地 SSH 别名
配置文件为本机的 `~/.ssh/config`
格式如下
```config
Host serverA
HostName myserver.domain.xyz
@@ -167,53 +157,34 @@ Host serverA
#### Docker 安装
可参考官网文档注意是 docker engine 的安装[Docker 官方安装文档](https://docs.docker.com/engine/install/debian/)
可参考官网文档, 注意是 docker engine 的安装. [Docker 官方安装文档](https://docs.docker.com/engine/install/debian/)
或者我之前写的 RSS MAN 部署文档中 docker 安装的部分
[RSS MAN X 安装部署指南/#1-docker 环境准备](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/#1-docker%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87)
#### Docker 镜像源配置及日志配置
docker mirror 配置可以加速 image pull, 国内公开可用的加速站点可以参考这里 [docker 加速站点](https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6)
此外服务器上的 docker 都是长时间持续运行的不少容器日志打的很随意log 文件容易占据过多空间也最好限制一下
#### Docker 镜像源配置
文件位置`/etc/docker/daemon.json`, 下面的配置供参考
```json
{
"registry-mirrors": [
"https://docker.nastool.de",
"https://docker.actima.top",
"https://docker.unsee.tech",
"https://docker.gh-proxy.com",
"https://docker.zhai.cm",
"https://docker.1panel.live",
"https://docker.1ms.run",
"https://docker.imgdb.de",
"https://dockerproxy.net"
],
"log-opts": {
"max-file": "5",
"max-size": "1m"
}
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "http://hub-mirror.c.163.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
```
修改完保存重启 docker 服务即可生效可使用 `docker info` 命令检查是否生效
修改完保存重启 docker 服务即可生效. 可使用 `docker info` 命令检查是否生效
### 2.2 OH-MY-ZSH
安装OH-MY-ZSH, 在此之前确保已安装 `git` `zsh`
```shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 如果在墙内 github 速度不加可以考虑使用清华的镜像
# https://mirrors.tuna.tsinghua.edu.cn/help/ohmyzsh.git/
# 先下载到任意位置然后指定REMOTE 参数执行安装程序
git clone https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git --depth=1
cd ohmyzsh/tools
REMOTE=https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git sh install.sh
sh -c "$(curl -fsSL [https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh](https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh))"
```
安装插件
@@ -224,23 +195,24 @@ git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/z
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting --depth=1
```
git clone 速度不佳可以考虑一些开放的加速服务比如
- https://ghproxy.org/
- https://mirror.ghproxy.com/
按需修改配置文件位置`~/.zshrc`, 下面为个人常用配置供参考注意去源文件修改对应项没有再到末尾加
按需修改配置. 文件位置`~/.zshrc`, 下面为个人常用配置供参考. 注意去源文件修改对应项, 没有再到末尾加
```shell
# custom theme
ZSH_THEME="af-magic" // 简洁的主题, 一行, 推荐
ZSH_THEME="gnzh" // 更丰富的主题, 提示信息一行, 输入命令在另一行
# custom conf override
ZSH_THEME="af-magic"
CASE_SENSITIVE="false"
HYPHEN_INSENSITIVE="false"
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting sudo)
```
自定义配置添加到末尾
日常管理服务器比较多,以及经常复制命令的建议用 gnzh 这个主题.
![](https://user-images.githubusercontent.com/49100982/108254837-882d2a00-716c-11eb-9f49-3b5e6e62eb52.jpg "gnzh theme")
自定义配置, 添加到末尾
```shell
export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20
@@ -252,9 +224,31 @@ export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20
source ~/.zshrc
```
```shell
// 自定义需求较高的推荐 space ship 这个主题
// 本地安装 nerd font 以正确显示部分图标
brew tap homebrew/cask-fonts
brew install --cask font-<FONT NAME>-nerd-font
// 推荐字体 fira code pro with nerd fonts. 安装完后更改本机终端字体
brew install --cask font-fira-mono-nerd-font
// 安装zsh 主题 space-ship
git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt" --depth=1
ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"
// 之后设置主题
ZSH_THEME="spaceship"
// 还有一些自用的推荐配置件文末附录
```
### 2.3 nano 代码文件规则
日常常用文本编辑器为 nano, 轻量级编辑需求完全满足
日常常用文本编辑器为 nano, 轻量级编辑需求完全满足.
```shell
curl https://cdn.jsdelivr.net/gh/scopatz/nanorc/install.sh | sh
@@ -262,9 +256,9 @@ curl https://cdn.jsdelivr.net/gh/scopatz/nanorc/install.sh | sh
### 2.4 时区调整
一般安装完都是 UTC+0, 看日志什么的不方便服务器初始化的时候配置好后面可以免去很多麻烦
一般安装完都是 UTC+0, 看日志什么的不方便. 服务器初始化的时候配置好后面可以免去很多麻烦
debian 系可用过 `timedatectl` 命令调整时区东八区可以用这个命令
debian 系可用过 `timedatectl` 命令调整时区. 东八区可以用这个命令
```shell
sudo timedatectl set-timezone Asia/Shanghai
@@ -272,64 +266,17 @@ sudo timedatectl set-timezone Asia/Shanghai
### 2.5 厂商监控/SDK 卸载
懂得都懂自己搜
### 2.6 fail2ban 配置
使用 fail2ban 可以很好地保护你的服务器避免被人恶意爆破 SSH 等服务
```bash
// 安装 fail2ban
sudo apt update && sudo apt install fail2ban
sudo systemctl enable fail2ban
```
之后需要按照实际情况修改一下配置文件这里记录一下最小配置注意默认的配置 `/etc/fail2ban/jail.conf`不要改不然每次软件更新会被覆盖 jaid.d 这个目录下面新建一个文件`/etc/fail2ban/jail.d/local.conf`
```conf
[sshd]
enabled = true
# 这里修改为实际的 sshd 端口
port = 20000
filter = sshd
banaction = iptables-allports
[DEFAULT]
# 1h 时间窗口
findtime = 3600
maxretry = 3
bantime = 6h
```
之后重启`sudo systemctl restart fail2ban`然后可以看下服务状态是否正常 `sudo systemctl status fail2ban`如果配置文件有问题会报错如果是显示` active (running)` 就说明没有问题了
fail2ban 的测试及关闭服务方法
查看当前封禁 IP`sudo fail2ban-client status sshd`
解禁某一 IP: `sudo fail2ban-client set sshd unbanip IP_ADDRESS`
停止 fail2ban 服务`sudo systemctl stop fail2ban`
关闭 fail2ban 服务`sudo systemctl disable fail2ban`
刚配置没一会就有 IP 被封禁了可以看到效果还是很给力也安心了不少
```
➜ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 6
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 154.216.19.42
```
懂得都懂, 自己搜
## 3 - 进阶内容
### 3.1 内核参数调优
一些内核参数调整交换内存阈值和 bbr, tcp fast open 按需启用启用前务必确认自己了解对应字段的含义否则不如保留系统初始值
一些内核参数调整, 交换内存阈值和 bbr, tcp fast open , 按需启用. 启用前务必确认自己了解对应字段的含义, 否则不如保留系统初始值.
配置文件位置 `/etc/sysctl.conf`
```conf
```c
# mem
vm.swappiness = 10
@@ -338,11 +285,6 @@ net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.ipv4.tcp_fastopen=3
net.ipv4.tcp_slow_start_after_idle=0
# zram 相关配置,配合下文 zram 使用
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0
```
配置完之后保存并应用
@@ -351,87 +293,20 @@ vm.page-cluster = 0
sudo sysctl -p
```
### 3.2 其他进阶配置
### 3.2 更多内存空间 - ZRAM
ZRAM 内存压缩对于个人服务器来说始终活跃的程序占用的内存只有比较小一部分启用 zram 可以将这部分内存压缩从而可以部署更多的服务
建议使用`zramtool`, 简单方便
```shell
sudo apt install zram-tools
```
修改`/etc/default/zramswap`, 末尾添加
```ini
ALGO=zstd
PERCENT=60
```
之后执行`sudo service zramswap reload`重载生效
可以使用 swapon 命令查看生效情况
```
~ » sudo swapon -show
NAME TYPE SIZE USED PRIO
/swap_space file 2G 32.1M -2
/dev/zram0 partition 489.9M 0B 100
```
这样一来会将机器物理内存的 50% 配置 zram, 使用 zstd 压缩算法一般压缩比能达到 3:1, 也就是说1G 的机器可以相当于有`0.5G+3*0.5G=2G`的内存
注意 Debian 新版本 swapon 等工具所在的目录 /usr/sbin 不在普通用户的 PATH 可能需要手动执行前缀使用 /usr/sbin/swapon
### 3.3 更多内存空间 - 关闭 kdump释放预留的内存空间
新服务器开起来之后你会发现无论是 htop 还是 free 等命令看到的总内存就是比你买服务器时页面上写的要小比如我开的两核 1G 的机器实际机器上看到的总内存只有 816M. 这是因为 linux 系统会默认开启 kdump预留了一部分内存不让我们使用
Kdump Linux 系统的一种内核崩溃转储机制它允许在系统发生内核崩溃例如内核 panic捕获内存的转储信息从而帮助事后分析故障原因默认的配置`2G-8G:256M,8G-16G:512M,16G-:768M`, 如果你买的是 2G 的机器上来就有 1/8 的空间用不了
但是我们个人日常使用的 linux 机器基本用不到这个功能不用预留这部分空间
操作方法有两种将预留内存改为 0 or 直接关闭 kdump 服务对于个人玩家小内存机器我建议直接关闭操作如下
```bash
# 备份grub配置文件
sudo cp /etc/default/grub /etc/default/grub.bak
# 编辑grub配置,删除 crashkernel=0M-2G:0M,2G-8G:192M 这样的部分
sudo nano /etc/default/grub
# 部分发行版镜像可能还有单独的kdump配置文件,直接删除
sudo rm /etc/default/grub.d/kdump-tools.cfg
# 更新grub配置
sudo update-grub
# 关闭并禁用Kdump服务
sudo systemctl disable kdump-tools
sudo systemctl stop kdump-tools
# 重启系统
sudo reboot
# 检查是否生效, 状态为 inactive(dead),即 kdump 服务已停止运行
sudo systemctl status kdump
# 检查 crash size 是否为0
cat /sys/kernel/kexec_crash_size
```
更多内容可以参见这篇文档[预留内存相关文档 - 阿里云](https://help.aliyun.com/zh/ecs/use-cases/view-and-change-the-size-of-reserved-memory-on-a-linux-instance#7d5ae6803amdp) 或者 [预留内存相关文档 - 腾讯云](https://cloud.tencent.com/document/product/213/115734)
### 3.3 其他进阶配置
一些其他的系统维护技巧与策略
一些其他的系统维护技巧与策略,
**配置文件管理**
所有应用 docker 通过 `docker compose` 文件管理
配置共享存储`rclone` 挂载 webdav, 同步 docker compose 等配置文件;
traefik 网关作为统一出口负责服务发现和自动维护 HTTPS 证书自定义配置通过 headless CMS directus 管理traefik 设定为通过 http 方式获取远端配置即可
所有应用 docker ,通过 `docker compose` 文件管理
配置共享存储, `rclone` 挂载 webdav, 同步 docker compose 等配置文件;
traefik 网关作为统一出口, 负责服务发现和自动维护 HTTPS 证书, 自定义配置通过 headless CMS directus 管理, traefik 设定为通过 http 方式获取远端配置即可.
**数据库备份**
所有数据相关的统一挂载到`/data/database/xxx`, 配置定时任务进行备份
以及配置 s3 上传到其他存储介质和其他地域
以及配置 s3 , 上传到其他存储介质和其他地域.
这些内容此处不再赘述有机会再单独写篇文章分享吧
这些内容此处不再赘述, 有机会再单独写篇文章分享吧
END
@@ -439,10 +314,102 @@ END
## 附录
* Install Docker Engine <https://docs.docker.com/engine/install/>
* RSSManX 安装部署指南 <https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/>
* 云服务器入门指南 <https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/>
* Portainer Install Doc <https://docs.portainer.io/start/install-ce/server/docker/linux>
- Install Docker Engine [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
- RSSManX 安装部署指南 [https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
- 云服务器入门指南 [https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/](https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/)
- Portainer Install Doc [https://docs.portainer.io/start/install-ce/server/docker/linux](https://docs.portainer.io/start/install-ce/server/docker/linux)
```shell
# 个人自用配置, 搭配 space ship 主题使用, 建议安装 nerd font 以正确显示图标
# ~/.spaceshiprc.zsh
# space ship 主题文档
# https://spaceship-prompt.sh/getting-started/
SPACESHIP_USER_SHOW="always"
SPACESHIP_USER_PREFIX=""
SPACESHIP_USER_COLOR="007"
SPACESHIP_USER_COLOR_ROOT="red"
SPACESHIP_USER_SUFFIX=""
SPACESHIP_HOST_SHOW="always"
#SPACESHIP_HOST_PREFIX="\e[3#1m@"
SPACESHIP_HOST_PREFIX="@"
SPACESHIP_HOST_COLOR="black"
SPACESHIP_HOST_COLOR_SSH="green"
SPACESHIP_DIR_TRUNC="0"
SPACESHIP_DIR_TRUNC_PREFIX=".../"
SPACESHIP_PROMPT_ORDER=(
dir # Current directory section
git # Git section (git_branch + git_status)
hg # Mercurial section (hg_branch + hg_status)
package # Package version
node # Node.js section
bun # Bun section
deno # Deno section
ruby # Ruby section
python # Python section
elm # Elm section
elixir # Elixir section
xcode # Xcode section
swift # Swift section
golang # Go section
perl # Perl section
php # PHP section
rust # Rust section
haskell # Haskell Stack section
scala # Scala section
kotlin # Kotlin section
java # Java section
lua # Lua section
dart # Dart section
julia # Julia section
crystal # Crystal section
docker # Docker section
docker_compose # Docker section
aws # Amazon Web Services section
gcloud # Google Cloud Platform section
azure # Azure section
venv # virtualenv section
conda # conda virtualenv section
dotnet # .NET section
ocaml # OCaml section
vlang # V section
zig # Zig section
purescript # PureScript section
erlang # Erlang section
kubectl # Kubectl context section
ansible # Ansible section
terraform # Terraform workspace section
pulumi # Pulumi stack section
ibmcloud # IBM Cloud section
nix_shell # Nix shell
gnu_screen # GNU Screen section
exec_time # Execution time
async # Async jobs indicator
line_sep # Line break
battery # Battery level and status
jobs # Background jobs indicator
exit_code # Exit code section
sudo # Sudo indicator
char # Prompt character
)
SPACESHIP_RPROMPT_ORDER=(
time # Time stamps section
user # Username section
host # Hostname section
)
cdl() {
cd "$@" && ls;
}
cdll() {
cd "$@" && ls -lh;
}
```

View File

@@ -8,7 +8,9 @@ categories:
tags:
- Apple
- 小米
- 小米手环
- 杂记
---
<!-- # 伪·苹果全家桶喜添新成员小米手环6使用体验 -->

View File

@@ -1,112 +0,0 @@
---
title: 关于双语字幕这件小事
date: 2023-09-10
description: 今天这篇文章来探讨下双语字幕这件小事。首先对于一部外语影片或剧集,原生的英文字幕肯定是能够轻松获得的,但是匹配、高质量的翻译字幕缺并不总是能找到。这里分享一些我在寻找和手动 DIY 双语字幕的一些经验和想法,我自己也编写了一些工具,有同样需求的朋友也可以快速上手:D
categories:
- 杂记
- 技术
tags:
- 技术
- Linux
---
今天这篇文章来探讨下双语字幕这件小事。
首先对于一部外语影片或剧集,原生的英文字幕肯定是能够轻松获得的,但是匹配、高质量的翻译字幕缺并不总是能找到。这里分享一些我在寻找和手动 DIY 双语字幕的一些经验和想法,我自己也编写了一些工具,有同样需求的朋友也可以快速上手:D
## 1. 考虑寻找现成的高质量字幕
很多大火的剧集都会有字幕组第一时间跟进字幕制作和资源的发布,我们可以在各种 BT, PT 站点找到这些字幕组打包好的自带字幕的资源,或者也可以在第三方的字幕站点上寻找合适的字幕。
这里安利一个油猴脚本:[豆瓣资源下载大师](https://greasyfork.org/zh-CN/scripts/329484-%E8%B1%86%E7%93%A3%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%B8%88-1%E7%A7%92%E6%90%9E%E5%AE%9A%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1-%E9%9F%B3%E4%B9%90-%E5%9B%BE%E4%B9%A6%E4%B8%8B%E8%BD%BD),可以在豆瓣的影视详情页右侧显示有资源的站点,非常方便
![Pasted image 20230910152405](https://blog-1301127393.file.myqcloud.com/BlogImgs/202309102054802.png)
效果如下图所示
![image-20220509144533549](https://blog-1301127393.file.myqcloud.com/BlogImgs/202309102054800.png)
中文字幕推荐 [字幕库](http://zimuku.org/), 大部分字幕都可以在这里找到。其他语言可以到 [OpentSubtitles](https://www.opensubtitles.org/zh) 碰碰运气,虽然界面有点古朴,但是人家资源还是很丰富滴
## 2. 字幕的时间轴修正
对于下载的字幕,我们常遇到的问题就是时间轴不匹配,相信每个影视爱好者都或多或少碰到过这样的问题。产生不匹配有多种原因,典型的比如:
- 视频帧率不匹配
- 视频有删减 (片头或者片中都有可能,常见于电视剧集,有些中间有广告转场有些没有)
- 视频版本不一样 (各种删减版,完整版,导演剪辑版等等)
最后一种差异的地方太多,建议重新找字幕。对于前面两种情况,文本的部分没有太多差异,只需要调整字幕的时间轴就可以了。
这里需要一些对齐时间轴的工具,这个市面上已经有很多了,大部分都是基于将对白音频持续时间和字幕对白持续时间做匹配,然后进行字幕整体时间轴的缩放或平移来实现对齐的。
比如 [Sushi](https://github.com/tp7/Sushi), 以及[ffsubsync](https://github.com/smacke/ffsubsync)
还有一类是最近比较火的,利用 AI 来对语音进行识别,输出对应的字幕。一半都是通过 Whisper 这个开源的语音识别模型来实现的,比如[autosubsync](https://github.com/oseiskar/autosubsync).
这类语音识别的 AI 目前已经很成熟了,市面上有很多商业应用,比如办公软件 飞书,腾讯会议一般都会支持会议语音转文字。但是这种都是为会议场景准备的。其实国内网易有道在这块做的更早,对英文支持更好,[网易见外](https://jianwai.youdao.com/)可以直接对音频进行识别,并生成 srt 文件,甚至还可以直接加上翻译,效率直接拉满。免费额度基本够用,各位轻度使用的朋友不要错过。
当然,这类 AI 语音识别和翻译现阶段还是差了点意思,在各种影视作品中,各类人名,专有名词,还有各种各样的梗 (比如 The Simpsons ), AI 处理起来还是有点够呛,所以最好还是优先选择人工调教后的字幕比较好。
上面罗列的那些对齐工具只能处理字幕和影片都是原生语言的情况,比如处理英文电影的英文字幕,但是对于要对时间轴不匹配的中英文双语字幕就基本没辙了。找遍了全网都没找到合适的工具,所以我就自己写了一个 [srt-fuzzy-sync](https://github.com/Colin-XKL/srt-fuzzy-sync)
> fuzzy-sync 是一个简单的同步 srt 字幕的工具,通过指定一个与音轨匹配的参考字幕文件,来将另一个未同步的字幕进行匹配,时间轴修正,使得其可以与音轨正确对齐。
简单点来说呢,这是一个专门用来对双语字幕时间轴进行修正的工具。你手头有一个英文电影资源,一个正确对齐的英文字幕,一个没对齐的双语字幕,这个时候你就可以用 srt-fuzzy-sync 这个工具,将英文字幕设定为参考,然后对双语字幕的时间轴进行修正,就可以得到一个时间轴正确的双语字幕啦!
为什么叫 fuzzy-sync 呢,这主要是为了通用性,只对两个字幕之间高度相同的一些关键对白进行匹配,其他的对白则只是基于匹配结果进行整体偏移,这样做的好处是即便你找的这两个字幕的对白数量不一样,仍然可以完成同步。
一般英文的 SDH 无障碍字幕里都会有很多非对白场景下的文字提示,比如
> (Theme Music Playing)
> (sigh)
> (Bird Singing)
而影片对应中文字幕里一般都不会加上这些翻译。此外中文字幕还常常对影片中出现的标题、店铺招牌、标语、新闻标题做翻译说明,种种因素导致中英文字幕在句子的数量上不是严格对等的。
此外这些字幕出现的时间,通常是没有对应的对白音频的。上面基于音频匹配的都无法很好地处理这类情况,所以我才抛弃按句匹配的方法,改为按一些句子很长,具有标志性,在影片中通常只会出现一次的关键语句匹配。
至于找不到的现成双语字幕的,那就需要我们自己动手制作啦。
## 3. 自制双语字幕
有时只能找到现成的中文字幕和原版英文字幕,但是没有双语的版本,这个时候就需要我们手动合并了。
这里推荐一个工具网站 [Subtitle Tools](https://subtitletools.com/merge-subtitles-online), 里面有各种简单的字幕工具,比如字幕合并,字幕格式转换。
对于手上又对齐的英文字幕和对齐的英文字幕,但是数量很多不想一个个到网站上去合并的,可以考虑 srt-merge 这个工具。不过原作者很久没更新了,我这里也编写了一个工具,也可以实现一样的功能。[dual-lang-sub-tool](https://github.com/Colin-XKL/dual-lang-sub-tool/tree/main)
此外还有一种常见的情况,就是我们下载的 WebRip 版本资源,影片已经内置了多国语言分别的字幕,这些资源大部分是来源于 Netfilx, Disney Plus , iTunes 这些,我们可以直接提取影片资源内置的两种语言的字幕然后将它们合并。
内置字幕的提取可以使用 ffmpeg 工具,首先用 ffmpeg -i 文件路径 来查看基本信息,确定好字幕所在的 track, 比如 Stream #0:3(chi) Subtitle, 这种就是说明 3 号 stream 是中文字幕。
```shell
# example output # ......
Stream #0:1(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
Metadata: title : 日语
Stream #0:2(chi): Audio: aac (LC), 48000 Hz, stereo, fltp
Metadata: title : 国语
Stream #0:3(chi): Subtitle: ass (default)
Metadata: title : gb
Stream #0:4(chi): Subtitle: ass
Metadata: title : big5
```
可以用下面的命令将其提取出来并转换成 srt 格式
```shell
ffmpeg -i xxx.mkv -map 0:3 -c:s srt output.srt
```
提取完成后就可以直接合并得到成品的双语字幕了,但是你应该也会觉得这样提取太麻烦,尤其是一部剧几十集的情况。一般同一个资源,里面各个音轨和字幕的排布是一样的,比如上面只取了一集进行查看,其他集数都是一样的,中文字幕都是在 stream 0:3, shell 循环一下就可以了。
当然你可能觉得这还是太麻烦了,我也是这么想的,所以 dual-lang-srt-tool 工具也支持自动检测,导出,合并双语字幕啦:D DIY 双语字幕可以很简单
## 后记
对于一些专有名词太多AI 翻译质量欠佳,又没有现成中文字幕可供参考的,那目前就没有很好的办法了。通常我遇到这种情况是用 AI 的版本将就下,或者直接全英文一把梭。不过随着 AI 技术的发展,后面或许可以考虑将过往季的字幕喂给 AI 让 ta 自己学习人名地名翻译,再辅以各种新闻八卦材料让 AI 也能对各种潮流热梗烂熟于心,到那个时候制作双语字幕就是分分种的事情了,可以预见的是这样的 AI 应该有生之年就可以用上,至于是好事还是坏事,那就交给未来去评判吧。

View File

@@ -26,7 +26,7 @@ categories:
## 答案
我想要什么
我想要什么?
这个问题困扰了我很久。

View File

@@ -1,7 +1,7 @@
---
title: 前端静态资源加载的一些优化
date: 2022-05-06
description: 最近在折腾优化博客,由于全站都是部署在 Netlify、VercelCDN 上,都是海外节点,国内访问延迟高,在想办法优化下访问速度和体验。这篇文章来探讨下前端 CSSJS 资源的加载。优化目标主要就两个1. 尽可能快,但是不希望我引入的辅助性第三方库影响到页面体验,不要阻塞主要内容渲染2. 为了快第三方静态资源肯定是上 CDN但是要有容灾CDN 挂了要能 fallback 到其他 url
description: 最近在折腾优化博客由于全站都是部署在Netlify、VercelCDN上都是海外节点国内访问延迟高在想办法优化下访问速度和体验。这篇文章来探讨下前端CSSJS资源的加载。优化目标主要就两个1. 尽可能快,但是不希望我引入的辅助性第三方库影响到页面体验,不要阻塞主要内容渲染. 2. 为了快第三方静态资源肯定是上CDN但是要有容灾CDN挂了要能fallback到其他url
categories:
- 技术
tags:

View File

@@ -1,202 +0,0 @@
---
title: 安全不是特权 - 雷池 WAF 使用体验及部署安装教程
date: 2023-12-18
description: 近期刚好关注到雷池 WAF 这个项目比较火,看了下是国内一个安全公司搞得,看 Github Repo 和官方文档像模像样的,虽然文档跟大多数中文项目一样,很多地方写的不够清晰,一些小细节没有跟最新的版本同步,但是总体而言,可用,不难用。值得一试
categories:
- 技术
tags:
- 技术
- WAF
- docker
---
自从开始倒腾服务器,部署各种各样服务以来,网站安全一直是那个令我焦虑的一个话题。暴露了那么多服务在公网,总免不了有无聊的人或者别有用心的人在搞事。(当然也有可能不是人类 hhh) 之前也有几次被攻击的历史,比如阿里云控制台一堆 SSH 爆破攻击记录,还有 Wordpress 被攻陷,出现一堆奇怪的文章和评论。虽然损失不是很大,但是处理起来还是有点麻烦的。(被攻击之后学乖了,老老实实定期备份) 况且我在明敌在暗,我们总是处于被动的那个,时间一长,网站的风险和潜在的损失还是不小的,最好是可以有一些防火墙和策略能够拦截点大部分不友好的请求。
很早以前就有调研过世面上的网站防火墙类产品,主要就几种类型:
- 各大云厂商配套的 WAF, 不过收费都很贵
- Cloudflare 等 CDN 服务商提供的服务,不过必须要接入其 CDN 反代才能用。而且大陆地区联通性并不好
- [ModSecurity](https://github.com/SpiderLabs/ModSecurity) 等开源方案,开源免费可自托管,不过配置比较麻烦,而且没有好用的 web 页面
近期刚好关注到雷池 WAF 这个项目比较火,看了下是国内一个安全公司搞得,看 Github Repo 和官方文档像模像样的,虽然文档跟大多数中文项目一样,很多地方写的不够清晰,一些小细节没有跟最新的版本同步,但是**总体而言,可用,不难用。值得一试**
![Pasted image 20231218222249](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312182326408.png)
## 使用体验
谈一谈我为什么选择使用雷池 WAF:
- 免费,开源 (这点存疑,没有详细审计过所有 submoudule, 目前看起来只有部分开源,仓库里大部分都是文档啥的。不过有有安全厂商实名,应该不会做出来一些自毁招牌的操作)
- 支持通过 `docker compose` 自部署
- 功能够用。基本反代站点配置SSL, 多种规则的黑白名单,频率限制,人机验证,攻击历史看板
目前已经使用了有几个月了,来谈一谈一些个人感受
优点:
- 又要免费,又要能自部署,又要有方便使用的 web 页面,目前这个好像是唯一能选的...
- 支持 `docker compose` 自部署,可以自行编排和自定义很多配置
- TOTP 认证,加分
- UI 简约清晰,加分
缺点:
- 有一些小 bug, 挺影响使用体验的,比如我最开始用的那个版本,那时候还不知道这个只能 TOTP 验证,又找不到地方和文档设置初始账号密码,但是进首页直接跳到了仪表盘,又一直刷报错。这种情况没登录就不应该显示仪表盘界面的,非常误导人,我还以为是强制开了 HTTPS 但是我没有上传 SSL 证书导致的后端请求一直报错。
- 开源了但是又没有完全开。人家企业做这个的本意是推销自家的收费套餐这个没毛病。但是请不要挂羊头卖狗肉影响不好。GitHub Repo 都是些文档内容,有个所谓的语义检测引擎倒是放了一点代码,但是这个代码量级太少了,像个玩具项目,不像是正儿八经投入使用的引擎的源码。看了下这个社区版本的文档之类的,从头到尾就没有提过怎么参与项目贡献代码,挂了个 GitHub 链接似乎只是诱导大家去 star, 这样好做宣传。合着这个所谓的社区版就只是部署了之后有个按钮,可以共享攻击记录的 ip?
- `docker compose` 写的方式令人费解。竟然需要在`.env` 文件中自定义一个内网网段,然后用 docker compose 的时候自动创建一个子网,每个容器根据子网的前缀指定了一个 ip, 然后其他容器连接都是在环境变量里写死....明明可以用 compose 文件里定义的 service name 或者 container name 作为 alias 使用内置的 dns 轻松实现的服务发现,为什么搞得如此麻烦?而且有没有考虑过,如果要更新,再执行 compose up 的时候,先前的子网 ip 是被占用的,每次还得先看一下当前用了哪些子网,然后找个没用的,这操作也是没谁了... 你说人家懂吧,他还通过 env 文件自定义 compose 创建的子网前缀,说人家不懂吧,用 container name 做 alias 自动实现服务发现这么简单的方式竟然不用。可能有安全或者性能方面的考量?不过我个人使用还是全部删掉了写死子网前缀的配置,这个使用方法真实太离谱了
- 目前只会记录疑似恶意的请求,正常请求不会记录,没法通过这个来看网站总访问情况了,有点可惜
## 安装部署流程
简单分享下我调优后的安装流程,不使用写死的子网前缀做服务发现。
### 1. 获取 compose 文件
官方文档默认提供的不是通过 `docker compose` 安装,而是他们的一个脚本。可能是为了照顾广大墙内被 CSDN "惯坏"的用户吧,脚本里除了基本的环境检测,主要是提供 docker 的便捷安装,但是怎么说呢...本意是给墙内用户便捷安装,但是为什么安装的操作还是到 docker 官方安装脚本,有没有一种可能,大部分大陆的服务器访问这个站点都很慢甚至连不上呢?但凡这里切一下 docker ce 镜像源都没这么离谱...
回到正题,这里还是大家通过 `docker compose` 安装。没安装 docker 的建议先去安装,有条件的可以直接按照官方文档来,[安装文档链接](https://docs.docker.com/engine/install/ubuntu/). 也可以参考我之前写的 RSSMAN 部署文档中 Docker 安装的部分,有讲解在国内环境下提前更换镜像源以更快完成下载安装。[Docker 安装-RSSMAN 部署指南 - RSS101](https://rss101.colinx.one/deploy/rssman-full-guide/#1-docker)
[RSSMan 部署指南](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
之后获取官方最新的 compose 文件。文档里贴的链接是在离线安装的章节有个 compose 文件链接 https://waf-ce.chaitin.cn/release/latest/compose.yaml
当然也可以直接去 Github 找,在 release 文件夹下。https://github.com/chaitin/SafeLine/blob/main/release/latest/compose.yaml
之后需要按照文档指示,在 compose 文件同文件夹位置,创建一个`.env`文件,并填写相关的变量。这里推荐使用我调整后的版本。后续如果官方对于整个架构有更新,以官方的为准,可以自行根据需要调整 compose 文件。
```yaml
services:
safeline.manager:
container_name: safeline-manager
restart: always
image: chaitin/safeline-mgt-api:${IMAGE_TAG:?image tag required}
volumes:
- ${SAFELINE_DIR?safeline dir required}/resources/management:/resources/management
- ${SAFELINE_DIR}/resources/nginx:/resources/nginx
- ${SAFELINE_DIR}/logs:/logs
- /etc/localtime:/etc/localtime:ro
ports:
- ${MGT_PORT:-9443}:1443
environment:
- MANAGEMENT_RESOURCES_DIR=/resources/management
- NGINX_RESOURCES_DIR=/resources/nginx
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-db/safeline-ce
- MARIO_URL=http://safeline-mario:3335
- FVM_MANAGER_URL=safeline.fvm-manager:9004
- MANAGEMENT_LOGS_DIR=/logs/management
dns:
- 119.29.29.29
- 223.5.5.5
- 8.8.8.8
networks:
- safeline
cap_drop:
- net_raw
safeline.detector:
container_name: safeline-detector
restart: always
image: chaitin/safeline-detector:${IMAGE_TAG}
volumes:
- ${SAFELINE_DIR}/resources/detector:/resources/detector
- ${SAFELINE_DIR}/logs/detector:/logs/detector
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/detector
networks:
- safeline
cap_drop:
- net_raw
safeline.mario:
container_name: safeline-mario
restart: always
image: chaitin/safeline-mario:${IMAGE_TAG}
volumes:
- ${SAFELINE_DIR}/resources/mario:/resources/mario
- ${SAFELINE_DIR}/logs/mario:/logs/mario
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/mario
- GOGC=100
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline.postgres/safeline-ce
networks:
- safeline
cap_drop:
- net_raw
safeline.tengine:
container_name: safeline-gateway
restart: always
image: chaitin/safeline-tengine:${IMAGE_TAG}
volumes:
- ${SAFELINE_DIR}/resources/nginx:/etc/nginx
- ${SAFELINE_DIR}/resources/management:/resources/management
- ${SAFELINE_DIR}/resources/detector:/resources/detector
- ${SAFELINE_DIR}/logs/nginx:/var/log/nginx
- /etc/localtime:/etc/localtime:ro
# - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
- tengine-cache:/usr/local/nginx/cache
environment:
- MGT_API=https://safeline.manager:1443/api/publish/server
ulimits:
nofile: 131072
networks:
- safeline
ports:
- 80:80
- 443:443
safeline.fvm-manager:
container_name: safeline-fvm-manager
restart: always
image: chaitin/safeline-fvm-manager:${IMAGE_TAG}
environment:
- FVM_LOGS_DIR=/logs/management
- DETECTOR_URL=http://safeline-detector:8001
volumes:
- /etc/localtime:/etc/localtime:ro
- ${SAFELINE_DIR}/logs:/logs
networks:
- safeline
cap_drop:
- net_raw
safeline.postgres:
container_name: safeline-db
restart: always
image: postgres:15-alpine
volumes:
- ${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=safeline-ce
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}
networks:
- safeline
cap_drop:
- net_raw
command: [postgres, -c, max_connections=200]
volumes:
tengine-cache:
networks:
safeline:
name: safeline
driver: bridge
driver_opts:
com.docker.network.bridge.name: safeline
```
### 2. 安装部署
部署成功后,第一次使用理论上会跳转到 TOTP 绑定页面。我之前这里卡到 bug, 第一次访问不是首页,没有看到那个绑定 TOTP 的二维码,后面就一直没法跳转到绑定页面了....不知道后面这个 bug 修复了没有,如果大家也遇到这个问题可以考虑全部清理干净,重新安装。
TOTP 软件推荐和对比:
- Microsoft Authenticator( 微软出品,支持云同步,国内可用,微软账户验证有单独的通道和验证方式,速度和体积一般)
- Google Authenticator (谷歌出品,简约好用,体积小速度快,可惜大陆地区没法云同步)
- BitWarden (支持使用自建实例,可惜 app 略卡)
## 总结
雷池 WAF 目前来看是一款够用,不难用的免费 WAF, 建议一试。
此外重要数据还是要经常备份,多副本 + 多地存储,数据无价!

View File

@@ -1,252 +0,0 @@
---
title: 我创作AI与网文小说
date: 2023-08-27
lastmod: 2023-08-27
description: 上周,我发布了一部网文小说作品。它的特别之处在于,这是一部 AI 高度参与创作过程的作品。今天我想来聊一聊创作AI和网文小说。
categories:
- 杂记
tags:
- 总结
- 杂记
- AI
- GPT
---
上周,我发布了一部网文小说作品。它的特别之处在于,这是一部我尝试的第一部长篇文字类作品,一部企图可以面向大众市场的作品,一部 AI 高度参与创作过程的作品。
今天我想来聊一聊创作AI和网文小说。
首先在小说达到五万字左右数量的节点先来概览一下这部作品。《决战核废水引爆的亚特兰蒂斯》这个故事包括一开始创作的动机其实都是我和朋友一时兴起想尝试下社会热点AI 创作工具,以及曾经一个阅文无数,一腔热血想书写自己的小说的少年之前,和另一个对网文知之甚少,惜字如金的软件工程师之间,到底能碰撞出什么样的火花。于是我利用调休和周末的几天时间,构建出了这样一部作品并正式上架了番茄小说的平台。
![Xnip2023-08-27_15-27-41](https://blog-1301127393.file.myqcloud.com/BlogImgs/202308272353573.png)
TLDR当前的 AI 工具尚且不足以完成整部中文网文小说作品,但是对于短篇偏纪实和科幻类已经能有比较不错的效果了。主要的挑战在于:
- 上下文。网文每章节动辄几千上万字,现有的大模型根本无法完整记录好超长的上下文信息,容易出现前后驴唇不对马嘴的情况。
- 中文优质语料的缺失。
- 大模型预训练时期人为添加的诸多限制
但是 GPT 的出现已经让我们看到了这种可能。相信不出十年AI 在超长上下文的文学创作能力就能有质的飞跃。
## 谈一谈使用的 AI 工具
在创作这部小说的过程中,主要用到了以下几个工具,在各自的领域都是代表性的存在,这里拿出来单独说一下。
**文生图模型:稿定设计-AI 绘图**
这次的封面图的底图就是采用 AI 绘制的,坦白说一开始我个人不是特别满意,不是我预期想象中的样子。但是对于这整个过程使用的时间来说,我觉得这个效率反而是最惊人的。一分钟不到,符合基本设定要求的底图生成好了。我再画三分钟添加个文字,摆一摆位置,一个基本元素完备,风格色彩合格的网文小说封面图就制作好了。相比较之下,听闻之前的类似出图都是以天级别计算的,费用甚至几百上千,这其中的效率差简直恐怖。
我之前也尝试过手动搭建 stable diffusion 在自己的 GPU 服务器上运行,用的 gradio 那个 web ui自我感觉良好出图的效果也挺不错。但是拿给非工科的朋友用上来就是吐槽界面怎么全是英文怎么那么多按钮该怎么启动该怎么写提示词怎么不会画中国风。有一说一那个时候的 AI 工具更像是一个工程原型机,而现在被稿定设计这样的 toC 平台引进做好本土化适配和产品化设计之后,使用上手出乎意料的简单。
**图片超分模型Upscayl**
图片超分这是一个起步较早的方向,门槛低,效果好,我是用它来对上述生成的封面图进行超分后降采样得到一个更加可用的画面,毕竟上面没交钱开会员只能用截图工具获取画稿 hhh
可以预先选择好图片的风格以获取更好的超分效果,比如原图是偏动漫插画类的,还是偏写诗类的。
**LLM 大语言模型Claude-2-100k**
![Pasted image 20230827234731](https://blog-1301127393.file.myqcloud.com/BlogImgs/202308272353574.png)
GPT 早已经火出圈了,但是之前由于上下文长度限制,其实并不能很好的作用于网文小说写作这种场景。尝试了一众 AI 模型LLama, Palm 这些因为对中文支持不友好所以排除名单。Claude-2-100k 综合使用下来是最合适的。可以在一开始给他说明好他的任务,是作家,然后再把故事背景和设定给他,后面就可以根据情节安排写出一段段故事了。
这类大模型是需要使用者通过不断调整 Prompt 才能发挥好的,比如让他写一段餐馆里的闲谈的场景,一开始会写的比较干,几句话描述下什么人,进到里面,坐下来,点了餐,吃了饭,干了什么事,走了。这种就很没意思。需要手动调教他,添加更多的环境描写,设定是在秋天,傍晚时分,温馨的环境,餐厅里面有什么,路人的神态是放松的,背景是本世纪初,对白偏生活化一点,诸如此类。很惊喜的是,它完成的很好,语言流畅自然,中文里一些高级的词汇和中文里一些口语化的描述,都能写出来。但是作为网文小说这种,就太死板了,目前看来写写严肃文学倒是很合适。
**LLM 大语言模型:彩云小梦**
Claude 和 GPT 说到底还是外国人训练的,对于网文小说这种题材,还是国内的公司做的更有那味。
产品从一开始就是为小说的场景而设计的。进来就会指引你填写世界观设定,风格选择等,续写风格可以选言情,玄幻,脑洞大开等等,看起来很有趣。实际体验下来,写出来的东西也确实很有网文那味,比如霸道总裁,玄幻武功,炼丹修仙,这个『中国特色文学体裁』那是信手拈来。甚至还会写擦边球。可以看得出来这个模型的确是用各种五发八门的国内网文小说训练出来的。
不过缺点也很明显,其底层技术应该是类似于 GPT3.5 的技术,主要问题是上下文太短,生成的故事没有连贯性,而且风格差异化太明显,经常跑偏。经常写着写着上一句还是霸道总裁的现代都市言情,下一段就斗气三段直接来到玄幻世界。还出现过前面一段是两人往事的叙事,转成霸道总裁风,然后两人调情没几句就直接变成讥讽和争吵,变成了一场战斗戏,再一转又是欲情故纵的调情擦边球戏。
不过总体来说,用来添加一些言情类的对白细节和玄幻类的战斗戏细节还是非常合适的。
## 当前 AI 创作工具的局限性
在使用 AI 创作这部小说的几天时间里,我最大的瓶颈,不是奇葩又烧脑的设定,不是新书上线缺乏积极反馈的一丢丢沮丧,也不是因为各个 AI 输出结果千疮百孔需要我人工救场时的懊恼,最大的问题,是白嫖额度到期。
没错,上面使用的平台,全部都是我白嫖的。即便他们都拥有可以加钱获得力量的会员方案,但在这个时间点,我还不想为了一本读者都没几个,收益遥遥无期的这么一个作品,甚至连完本都不能保证的作品去投入。毕竟这目前还只是一时兴起的一个玩具,还是想用一个更大众化的视角去看看当前 AI 技术在国内的发展和普及。
不过好在这些平台都很大方,每天都有免费额度,第二天就可以继续用了。这配额也一定程度上避免了我熬夜爆肝 hhh
这里就不得不提到当前 AI 普及和发展的一个大难题:算力要求。
这里不仅仅是这些大模型对运行的硬件规格要求高,目前在手机那样的平台上运行还是非常吃力。更重要的一点是,这些质量高效果好的模型需要更多参数,更多材料,更高规格的 GPU 去训练,更多个人和企业推送整个生态发展。而现在这些高端 GPU 而设计和制造技术都是掌握在美国科技企业手里,目前还有相关法案禁止出口先进制程的 GPU 到中国,国内高质量的材料也是少的可怜,生态更是无从谈起,各家都想自己搞自己的。国内本就不强的 AI 技术将雪上加霜。
国内前几年吹得牛逼哄哄的各种超算,各种国产芯片,在 AI 的浪潮前,似乎都没声了。国内外的 AI 技术和生态差距将被进一步拉大。不出意外的是,不久之后国内的 AI 就会落后于欧美一到两个世代。
下面再来探讨下这些国际领先的 AI 模型才需要考虑的,在这种内容创作场景下的一些局限性。
**第一:上下文**
这里并不单纯指的是上下文长度的问题,还有上下文形式的问题。
首先显而易见的,对于网文这种篇幅超长,水货超过的类型,现有的大模型的上下文长度还是不太够。短期来看,提高上下文长度可以很大程度上改善续写跑偏的问题。但是有些问题不是单纯增加这个长度就可以解决的。一个很明显的例子,就是伏笔。
挖坑,或者说埋伏笔,是文学写作过程中非常常见的一种手法。悬念的制造,气氛的推动,离不开伏笔。而且对于长篇幅的作品来说,伏笔的呼应可以强化作品的连贯性,让读者能够清晰地认识到,这些文字是一个整体,他们共同构建了这个作品。这对于网文小说更是尤其重要。
但是从目前我使用 AI 创作的体验来看,目前的 AI 完全无法掌控好伏笔。几乎全部都是需要我人工来盯着,并思考什么时候适合去挖坑和填坑,一个坑挖了又需要以什么样的方式把他填上。
另外一个问题是,这些伏笔,人物关系,概念设定等,很多时候他都并不是一个线性的结构,所以通过文字的形式作为输入放到上下文里其实都不是很合适。我个人感觉他们更像是网状的结构,但是这种模式似乎又与当前这些模型的原理和运行模式格格不入,就期待后续有没有使用网状结构信息训练和推理的模型出现了。
**第二:预训练时期人为添加的限制**
这一限制在国外这些大厂的 AI 模型上尤为明显,『政治正确』对他们来说太重要了。非常明显的体现就是,我要求 AI 构思一个反派角色,并输出人物的基本设定,以及往事的一些碎片特写。
但是 AI 返回的结果让我总是苦笑不得,说我们要保持正确的积极的价值观,同时不能对性别,种族,外貌等方面有任何的歧视。而且对环保还有 happy ending 有着莫名的执念。举例来说的话就是一个反派有这黑暗的过往后来成为了故事中的反派烧杀抢掠破坏环境最后迷途知返众人谅解the end.
这些限制不仅仅使得 AI 在构思故事时,尤其是反派或者一些消极的事物时缺乏真实性和张力,此外也是的故事中的很多人物缺乏性格。男主就是男主,女主就是女主。关键情节上戏份谁多一点谁少一点罢了。
相较之下,国内的 AI 在处理人物性格这个问题上就太过极端。以彩云小梦为例,写出来的男性任务,要么就是霸道总裁,要么就是童年悲惨,后来灵力爆棚;女生呢要么是冷淡的御姐,要么就是看起来古灵精怪故作娇羞其实前言不搭后语的神经病。从体验的结果来看,倒是非常符合我对国内网文的刻板印象呢。
作为对比,就几个我认为人物塑造上很有特色的几个例子。
- 一个就是最近看的《阿基拉》,铁雄在一个孤儿院长大,处处被大哥一般的金田保护着,使唤着,在他面前,铁雄似乎永远是个长不大的弟弟。他向往着金田那酷炫的红色摩托座驾,几次试图驾驭他却失败闹了笑话。后来机缘巧合下被改造获得了超乎常人的力量,也成为了乱世里麻木,愤慨的民众敬仰和追随的救世主,神明。铁雄获得力量,在一次慌乱恐惧的半梦半醒的战斗中,意识到自己的强大后,进行了一番发泄,暴击了追赶而来的武装部队。对追赶而来的金田等人,他的第一反应是再也不是小弟了,现在换成铁雄保护他了。后来他的反应不是对所有欺负过自己的人复仇,也不是什么圣母拯救世界。不知道是出于害怕还是好奇,他继续追寻着终极的力量,阿基拉。后来追寻阿基拉成为一场空,在一片废墟上,双方战斗有来有回,这段给我的感觉,甚至不像是少年打败怪兽,更像是两个童年玩伴之间,想象自己化身超人后的嬉戏。后面铁雄身体里的力量不受控制,他变成一个肌肉组织疯狂增生甚至吞噬女友的巨型肉瘤怪兽后,又一次向金田发起了救助『救救我』。
- 科幻巨著《三体》,动画作品《我的三体》里,对于章北海这个人物的刻画也很有意思。一个从海军时代走到太空军时代,意志坚定,正义凛然的军人,为了保卫人类文明,为了应对无处不在,封锁人类科技的质子,章北海对整个世界封锁了自己的内心,坚定他的信念。跨越了几个世纪,在他冬眠几百年后醒来,三体的探测器水滴第一次到达太阳系与人类文明接触前夕,章北海利用他代理星际舰长的身份,带着保卫人类文明的使命,带着整艘星舰以最大速度脱离了太阳系,向着无尽星辰大海远去。他深知人类文明在三体世界的技术面前毫无还手之力,他拼尽全力,为人类文明留下一个火种。后面假装追击叛逃者章北海,实则心有灵犀,志同道合的褚岩舰长等也与其汇合。但是在资源储备不同的情况下,四只舰队不得不自相残杀争夺所剩无几的资源以支撑长途的星际航行。这场战斗中章北海以释然的心态交出了这个接力棒,由之前与他素未谋面不曾相识的褚岩舰长,作为他的精神延续来完成这个延续人类文明火种的使命。
这两个人物塑造都很有意思,风格迥异,不落俗套,却又富有戏剧张力,而且透露出作者对生活和人性的观察,有独特的人文温度。
而这样的人物塑造,不仅现阶段的 AI 无法直接达到甚至作为创作者给定故事大纲和发展脉络AI 都很难写出对应的契合特定作品风格和人物个性的文字。
当然上面拿文学上获得高度评价的作品来欺负现阶段不够成熟的 AI 有点不够意思。但即便对于网文,要写出让人印象深刻的角色和情节,只有这么几个脸谱化高度同质化的画像,我觉得是几乎不可能的。如果要写流水账形式,刻板印象的,没有太多要求的工业流水线作品,我觉得目前还是有这个可能的,不过需要足够好的模型能力和预训练作为基石,再加上创作者对 AI 模型和提示词的了解才行。这个想必在未来两到三年应该就会有突破,到时候市面上这些高度同质化的小说只会更加泛滥。
## 浅谈字节与番茄小说
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/202308272353572.png)
番茄小说的产品的月活,营收之类的我在此就不再过多赘述,大家有兴趣的可以去找些商业分析报告看看。这里主要探讨的是,他作为字节旗下的产品,身上有这哪些字节的影子,又有这什么独特的优势和产品策略?
首先,和头牌产品抖音一样,番茄小说是一个 UGC 的,重流量,数据,反馈和推荐算法驱动的这样一个产品。
说起推荐算法,很多人都会觉得 AI 这一块国外技术这个牛批,为什么抖音这种模式首先在国内流行起来,后来又席卷国外互联网。
这里有几个抖音发家致富很重要的因素,推荐算法需要大量数据做训练,相较于奈飞这样的长视频流媒体平台,抖音的短视频在相同时间内能够采集到的用户的反馈数据是前者的几十上百倍。数据量有了,训练算法的模型也就更精准了,用户得到的反馈越来越积极,在内容制造者层面和内容消费者层面都开始扩张开来,越来越多的流量,越来越多的用户反馈数据,越来越好的算法,越来越好的用户积极反馈,越来越多的内容创作者涌入,这个商业飞轮就运转起来了,而且转的越来越快。
在这一点上,番茄小说师承抖音,在这条正反馈链路上也是做的很好,小说免费,叠加头条的引流,大家都跑过来看,用的人多了,反馈数据有了,推进更精准了,反响更好了,更多的写作者入驻,内容多了,整个盘子越来越大,越来越好。
除此以外小说作为当代国内文娱领域一个重要组成部分IP 也是一个非常重要的资产。每本小说都会在两万字的时候有一个跟番茄签约的流程,签了,就能获得被搜索推荐的资格,获得平台分成,不签,对不起啥也没有。签约之后 IP 相关的内容肯定是要被平台买去了的,具体作者能分到几个点吗。。。那就是另外一个故事了。
这一点跟腾讯阅文集团的布局是一样的流量IP影视和周边。这些大体都是同一套商业逻辑。不知道其他平台怎么样番茄应该是非常注重反馈数据的那一个了更新频率完读率互动活跃度等等各种指标来考核作者整的比上班还累。
不过总体来说,番茄和字节整个的这个商业逻辑和发家致富历史还是很值得我们去学习的。尤其是这个恐怖的飞轮,一旦转动起来,就是能以势不可挡的架势冲击大半个互联网。
## 创作历程分享
平心而论,我认为自己一直都不是,也无法成为一个优秀的文字工作者。也许我可以写出中学时期那些所谓的辞藻华丽,立意高深的『好』作文,也许可以写出一篇简洁,严谨的工作文档。但是我知道,这里面缺乏温度,缺少灵魂。见过真正有人文关怀,突破天际的想象力,性格迥异却又充满戏剧性张力的人物故事,见过那些有天赋的作者和同学,我觉得有些东西就是需要天赋,没天赋就是没天赋,可能终其一生都赶不上。
如果我要写一个故事,可能最多也只是一篇平平无奇,逻辑上通顺,偶尔有那么几个脑洞,大部分时间都只能在前辈的影子下拙劣地模仿的一个故事。
在创作这部甚至不能称为作品的作品中,我的大部分时间也都是在构思一个试图有些新鲜东西的『合理』的情节,补充各种细节和设定,挖坑,填坑,水字数,调整 AI 生成文本中的 bug。
不过也不是完全没有收获,在尝试使用 AI 创作整个小说的时候,我大概掌握了一些技巧。比如设定要预先给 GPT 定好,情节的节奏和衔接还是要亲自把控,但是一些细节可以让 GPT 代劳,这个真的很有用,(尤其是对于需要大量水字数的网文小说)
比如让 GPT 写一段餐馆里众人围着小电视机的日常对白。
> 街道上行人并不多,都是些步履匆匆的上班族,或悠哉散步的老人。秋阳从树隙间洒落下来,洋洋洒洒铺满了整条街道。路边的建筑不是传统的日式木质结构,而是夹杂着些西式的红砖或水泥房屋,显得格调混杂却又和谐统一。
>
> 这是一条看似平凡却让人感到亲切温馨的小街道,没有太多喧嚣与烦扰,却处处透着人情味。林凡和明石正要开始一段充满未知冒险的旅程,这家小餐馆像一个温暖的港湾,让疲惫的身心得以喘息。
>
> 两人兴许不知道前方有怎样的险阻在等待,但是此刻,享受这份静谧与温情,已经足够。
>
> 小餐馆的电视上,又在播放着新闻。
>
> “天呐,蔬菜价格又要涨价了!”一个头发花白的老奶奶放下碗筷,双手扶额无奈地说。
>
> “是呀,最近物价飞涨,生活费用压力太大了。”旁边一位白胡子老头也叹了口气。
>
> “就是有证据显示这起事件有阴谋!”那名中年男子神秘兮兮地小声说。
>
> “天哪!这也太可怕了。”老奶奶捂住嘴巴,一副震惊的表情。
>
> “唉,真不知道这社会要到什么地步。”老头叹道。
>
> 电视上又切换到了其他新闻,几名上班族模样的青年男女也加入了讨论。
>
> “诶,你们看,股市又跌了!”一个男生着急地说。
>
> “最近经济形势越来越不景气啊。”一个女生也愁眉苦脸地说。
>
> “工作这么辛苦,钱还是省不下来,年轻人现在日子没指望了。”另一个男生一脸失望。
>
> 三名年轻人叹息连连,满脸忧虑之色。这时,电视画面跳转到了娱乐新闻,几名艺人的花边新闻占据了荧屏。
>
> “来来来,看这个,明星的绯闻啦!”一个女生眼前一亮,话锋一转。
>
> “嗨,这些娱乐新闻才叫有意思。”另一个女生也来了精神。
>
> “工作那么辛苦,看点这些解压解压嘛。”一个男生笑着说。
>
> 三人又投入到了对明星私生活的讨论中,烦恼的表情一扫而空,兴奋地指点着电视画面。
>
> 林凡和明石面面相觑,感慨百态人心,千头万绪,便也没去打扰他们继续闲聊。
还有一些人物对白类的,写起来很麻烦的,也可以让 GPT 代劳水字数。
> 他们一边在海上漂流,一边在研究这片海域的变异生物,寻找着这个世界的根源。他们的进展很顺利,在几天之后,他们终于查到了一些蛛丝马迹。一处人迹罕至的海岛上,有一座奇怪的建筑。
>
> 在研究中心的顶楼,一个房间的窗户被打开,里面站立着数十名科学家。这些科学家都身着白大褂,戴着墨镜,一副严肃冷漠的表情。他们正在进行一项实验。
>
> 在林凡和明石的监视之下,他们在实验台上摆弄着一块金属板。这块金属板通体呈现黄铜颜色,表面光滑如镜。
>
> 一位穿着白大褂的科学家拿着一把匕首,匕首微微泛着幽蓝的光芒。
>
> 不知为什么,林凡看到这个光芒第一个想起的是明石。
>
> 匕首插进了那块金属板。金属板的表面顿时出现了一阵阵波纹,波纹越来越大,最后化作一张人脸出现。
>
> 林凡看着这张诡异的人脸,心脏不由自主地加速跳动,呼吸急促,额头渗出细汗,双腿忍不住微微发抖。
>
> "你在害怕什么?你是不是害怕这块金属板上有一张狰狞的人脸?"
>
> 科学家的声音响起,让林凡清醒了过来。他看着林凡,露出一丝嘲讽的微笑:"害怕什么?你在害怕这块金属板上的人脸是假的?哈哈!你真幼稚啊!"
> "你在胡说八道些什么!"林凡怒声反驳,"你们的实验已经失败了,现在我们就能证明它不是真的!"
>
> "证明?怎么证明?"科学家冷哼一声,"如果这块金属板上没有人类的话,你认为你有资格跟我们谈条件吗?"
>
> 林凡愣了愣,一时语塞。这个时候,明石走了过来,"我们已经找到了这个实验的关键,我想我们应该跟他们谈判一下。"
>
> 他们跟着科学家走到了那个办公室里。那里坐着四个人,分别是两男三女,男人的年纪约摸四十岁左右,看上去有些阴郁,眼睛里透露着一抹狡黠的寒光。女人的年龄比较大,约有七十多岁,头发花白,脸上的皱纹深邃。男人看上去三十多岁,皮肤黝黑,眼眸深邃。三女中有两个看上去年龄稍微小一点的女孩,大约只有十六七岁,但是却穿着一套白大褂,一看就像是医院里的护士装。
>
> "你们是谁?想干什么?"其中一个男人开口问道。
上面这两段文字,前面一段是 Claude 生成的,后面这段时彩云小梦生成的。可以看出有这非常明显的风格差异。
Claude 生成的很『正确』,前后通顺合理,但是总感觉没那味,像是先生成的英文再翻译过来一样,而且感觉很平淡,里面的每个人物,换成男人女人,大人小孩,感觉都没有什么不会有什么违和感。
彩云小梦生成的相较而言就很『疯癫』,写的一长剧情上就容易出 bug而且动不动就『冷哼』『嘲讽』情绪波动倒是有了不过总感觉全是国内网文的套路化应该是国内网文看多了吧也怪不得人家的模型 hhh
![一副 AI 创作的插图](https://blog-1301127393.file.myqcloud.com/BlogImgs/202308280001121.webp)
## 关于创作欲
最后的最后,来聊一聊『创作欲』这个东西。
马斯洛需求层次理论模型
人的需求分成**生理需求**、**安全需求**、**归属与爱**、**尊重需求**和**自我实现**五个层次。需求是由低到高逐级形成并得到满足的。
创作这件事正是最高的那一层,自我实现的层次。
创作这件事,其实并不是单纯指的是创作小说,音乐,电影等。我个人理解,他应该是一种更广义的,自身能力参与建设最终使得一样事物变得独一无二。至此,个人的价值得到了体现,收获了『心流』状态的正向反馈,『归属感』的反馈,以及这一件事物变得独一无二带来的价值的提升。
举例来说,写代码是一种创作,摄影是一种创作,唱歌是一种创作,某时某刻你在朋友圈留下一段自己的文字,也是一种创作。
『我』的参与,让这个事物变得独一无二。『我』的沉浸,给我带来积极的反馈,『我』创作的作品,属于我,有一种归属感。
我在给自己的年度目标中,也把中大型创作作为我的指标之一。我觉得首先无论结果时好时坏,我很享受创作的过程。就比如本文开头提到的这本小说,以及前段时间制作的『铃芽之旅』中日粤三语 MV花了很多时间和精力但是并不会觉得累反而会觉得很有成就感甚至是反向充电。也许这就是『为爱发电』的魅力吧。
## 畅想
时代的发展技术的更迭让我们有机会去尝试和实现我们的祖辈做梦也想不到的东西。当前AI 作为创作的辅助工具尚且处在初级阶段AI 绘图AI 写小说AI 写代码,都还只是高度场景化,模板化的一些应用。也许未来的某一天,让我们可以真正地,从脑机接口将我们的想法输入到 AI通过 AI 进行解读和艺术加工。到那个时候,创作的权利,属于我们每个人。人类世界会变得更好吗,我不知道。但是我期待未来的某一天,我能够通过这种方式,记录下脑海中的旋律,梦境中的画面,以及记忆中的故事。

View File

@@ -54,7 +54,7 @@ tags:
安装好油猴插件后,你可以在 [Greasyfork.org](https://greasyfork.org/zh-CN/) 上下载各种黑科技般的脚本。安装成功后,油猴会在你进入符合条件的网页时自动启用对应的脚本。比如,你安装了 AC 的这个脚本,而这个网页是适配了某度的,那么当你进入某度的网页时,油猴就会自动启用这个脚本。快来领取属于你的纯净版度度吧。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121231059.png)
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素? 对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
### 使用浏览器自带的阅读工具
@@ -67,7 +67,7 @@ _[注:区别与 2020 年新的基于 Chromium 内核的新 Edge 浏览器,
### 使用第三方阅读工具 - [简阅 SimpRead](http://ksria.com/simpread/)
![](https://i.loli.net/2020/01/21/ZcsEIv8wBfjOmVa.png)
也许你买不起苹果,受不了 Win10你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅正如他的名字旨在为你提供简约的阅读视图。作者为了实现“简单阅读”这个小目标主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
也许你买不起苹果,受不了 Win10你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅正如他的名字旨在为你提供简约的阅读视图。作者为了实现 “简单阅读” 这个小目标, 主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
恭喜你!利用上面介绍的几个工具,你已经可以在国内互联网环境中求的一份净土了。如果你感兴趣或是强迫症患者,欢迎前往 **打造沉浸式互联网体验 【广告篇 - 下】**
温馨提示:下篇介绍的内容的内容将略有一点偏硬核,需要一点点的动手能力哦~

View File

@@ -1,152 +0,0 @@
---
title: 来谈谈日志集中管理方案 - syslog 是你的好伙伴
date: 2024-10-13
lastmod: 2024-10-13
description: 身为一个数码宅,家里总是会有越来越多的数码设备,智能化的设备多起来,总是难免会遇到各种各样的问题,排查问题的时候日志就很重要了,对于一些偶发的 case, 比如偶发网络卡顿,能够看到足够完整清晰的日志,就很方便了。
categories:
- 技术
tags:
- Linux
- NAS
- OpenWRT
- Docker
---
身为一个数码宅,家里总是会有越来越多的数码设备,智能化的设备多起来,总是难免会遇到各种各样的问题,排查问题的时候日志就很重要了,对于一些偶发的 case, 比如偶发网络卡顿,能够看到足够完整清晰的日志,就很方便了。
对于一些低功耗设备,比如路由器,其磁盘资源很紧张,日志通常不会保存很久。这个时候要排查一些偶发的持续时间长的小 bug 就很头痛了。好在 openwrt 原生就支持将日志通过 syslog 协议发送到远程服务器。不过看了一圈,发送是发送过去了,但是看日志还得命令行一个个看,要想有个方便的地方看的话就得上 ELK 那一套非常繁琐且吃资源的那一套,我的需求是这样的:
- 免费,可以持续使用
- 能够通过 syslog 协议收集日志
- 能够自部署最佳,但是不希望是 ELK 那种繁琐且非常消耗资源的
- 有个 web 界面能方便的查找日志
- 能够配置监控,那样的话如果设备有 fatal 日志我可以立即知道
搜寻了一番,发现有个 datalust 公司出的 seq 看起来挺不错,在自己服务器上部署了一套,完美符合我的需求,分享一下。
seq 不仅支持 syslog, 还支持程序主动上报、采集容器日志等很多功能,这里只主要围绕 syslog, 收集各种终端设备日志做介绍
![Pasted image 20241013170403](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128864.png)
![Pasted image 20241013170340](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128865.png)
## 安装:通过 docker compose 部署 seq
首先生成下默认密码,这里需要通过程序自身的指令生成明文密码对应的密文才行。比如我这里指定初始密码的明文为`initP@ss`, 运行这个指令,就会输出对应的密文,这个待会部署的时候需要使用
```bash
echo 'initP@ss' | sudo docker run --rm -i datalust/seq config hash
QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd
```
之后通过 docker compose 进行部署,下面为 compose 文件示例
```yaml
services:
seq-input-syslog:
image: datalust/seq-input-syslog:latest
container_name: seq_syslog_input
depends_on:
- seq
ports:
- "20014:514/udp" # 接收 syslog 协议请求的端口,这里配置的是 20014, 可以自定义,后面需要用到
environment:
SEQ_ADDRESS: "http://seq:5341" # 要转发到主程序进行处理,端口为默认的 5341, 不用改
restart: unless-stopped
seq:
image: datalust/seq:latest
container_name: seq_log
ports:
- "20054:80" # web ui
environment:
ACCEPT_EULA: Y
SEQ_FIRSTRUN_ADMINPASSWORDHASH: QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd # 这里填写刚生成的密文
restart: unless-stopped
volumes:
- /data/seq-data:/data
```
之后执行 sudo docker compose up -d , 顺利的话,在配置的 web ui 端口,就可以看到管理台了。默认账户为 admin, 密码为刚才设置的密码的原始明文。
## 使用syslog 配置
基本上所有 Linux-base 系统都支持将系统日志通过 syslog 协议发送到远端服务器。我手头主要的 openwrt 路由器、运行 truenas 系统的 nas、树莓派上跑的 debian, 以及其他 linux 云服务器都可以无缝接入,这里简单介绍下
### openwrt 配置远程 log
在 system -> system 菜单下,有个 logging 的 tab, 里面配置好服务器 ip、端口就可以使用了。协议记得选 udp
![Pasted image 20241013165852](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128867.png)
### truenas 配置远程 log
在 system setting -> advaned -> syslog 菜单下,配置远程服务器地址和端口,协议选择 udp, 保存就可以了
![Pasted image 20241013171725](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128868.png)
### linux 服务器配置远程 log
大多数 Linux 发行版已经预装了 rsyslog。可以通过以下命令检查是否已安装
`rsyslogd -version`
如果未安装,可以使用以下命令安装:
```bash
# Debian/Ubuntu:
sudo apt update
sudo apt install rsyslog
# CentOS/RHEL:
sudo yum install rsyslog
```
步骤 2配置客户端的 rsyslog
编辑 rsyslog 配置文件:打开配置文件进行编辑,通常位于 `/etc/rsyslog.conf``/etc/rsyslog.d/` 目录下。
```bash
sudo nano /etc/rsyslog.conf
```
添加远程服务器配置:在文件末尾,添加以下行以指定远程服务器的 IP 地址和端口(默认是 UDP 514 或 TCP 514
```conf
*.* @remote-server-ip:514 # 使用 UDP
*.* @@remote-server-ip:514 # 使用 TCP
```
这里我们需要使用 udp 协议的。
将 remote-server-ip 替换为远程 Syslog 服务器的实际 IP 地址或者域名,保存并关闭文件。
比如
```conf
*.* @syslog.myserver.com:20014
```
步骤 3重启 rsyslog 服务
在进行更改后,重启 rsyslog 服务以应用新配置:
```bash
sudo systemctl restart rsyslog
```
## 其他配置
### 配置日志定期清理
默认情况下,是没有配置日志清理规则的,时间一长服务器硬盘可能直接满了,所以这里一定不要忘记配置自动清理。在菜单里的 retention 可以配置过多少天删除
![Pasted image 20241013170659](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128869.png)
![Pasted image 20241013170654](https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128870.png)
### 配置告警通知
各种通知渠道的支持是通过插件形式提供的,在 设置里可以自行安装。可以支持 email、http webhook, 钉钉机器人、telegram 机器人等多种渠道。
[插件市场链接](https://www.nuget.org/packages?q=Tags%3A%22seq-app%22)
---

View File

@@ -1,104 +0,0 @@
---
title: 浅谈如何获得满血版互联网体验
date: 2023-12-30
description: 众所周知,国情所限,大家基本都是局域网玩家。在 AI 爆火的 2023, 我们甚至输在了起跑线上……GPT 不对大陆地区开放,普通银联卡无法注册,甚至有代理都不一定行。受够了二等公民的气,这篇文章来结合我自身的经历和经验探讨一下,身为互联网二等公民,我们缺失了什么,身在墙内如何通过一些手段,获得满血版互联网体验 🕶️
draft: false
categories:
- 指南
tags:
- AI
- Apple
- Google
---
众所周知,国情所限,大家基本都是局域网玩家。在 AI 爆火的 2023, 我们甚至输在了起跑线上……GPT 不对大陆地区开放,普通银联卡无法注册,甚至有代理都不一定行。受够了二等公民的气,这篇文章来结合我自身的经历和经验探讨一下,身为互联网二等公民,我们缺失了什么,身在墙内如何通过一些手段,获得满血版互联网体验 🕶️
**TLDR - 你需要解锁以下技能 (按照难度和依赖排序):**
- 解锁基础版盾构机,能访问 Google 等站点
- 解锁进阶版盾构机,海外 VPS, 可以玩一些进阶的操作,比如 Google Gemini 的话普通 HK 的 🐔 都是不行的,如果你有新加坡的 VPS就可以转发一下解锁 Gemini
- 解锁海外平台的账号,常用的有 Gmail, 美区 App Store, X(原 Twitter) 等
- 解锁基础版海外支付,国内银行的支持外币支付有 Visa/MasterCard 标的,可以美区 App Store 付款购买 App 等
- 解锁进阶版海外支付,无外汇限制,可以自由出入金,外币交易无障碍
- 解锁可长久持有的海外手机号,很多平台都会通过手机号来决定你可以使用哪个地区的服务,重要性毋庸置疑。可长期持有是个重难点,不过在解锁上面的能力之后这一步稍微花点心思都能达到
## Level 0: 局域网和互联网差一个 Google
🌍 **新手村 BOSS: Google**
GFW List 成百上千,但是最具代表性的就是 Google. Google 在国外影响力之大,导致你可以在很多平台上看到,外国友人听说大陆地区不能用 Google 都表示无法理喻。不过解锁了 Google 你也就基本解锁其他 GFW List 里所有的项目
**基础版:**
通过各个奇怪的网站和搜索内容触发`VPN``海外加速``外贸电商助手` 等关键词,或者身边有朋友在用相关工具的找人家要一个安装包,然后先随便找一个试用,速度和可用性先不用关注,解锁 Google 后,你就可以自由的所有其他的产品,你可以挑选速度快,节点多,服务好,质量高,价格实惠的其他产品了。这里主要是有个鸡生蛋蛋生鸡的问题,只有通过某个突破点先能访问 Google 才能自由搜索其他的产品
**进阶版:**
购置一个海外的服务器然后自行部署安装相关配套工具。这里服务商可以自行选择国内厂商的可以作为跳板但是不适宜长期使用。海外的搬瓦工Vultr 等服务商都比较著名,不过价格偏贵,这些后期都可以慢慢比较选择。
部署的话2023 年 Clash 已经删库跑路,这里推荐 **singbox**, 支持的协议众多,性能也不错,还有官方的 android, ios 客户端 (免费,划重点,隔壁小火箭虽然好用,风评也挺不错,但是需要付费,淘宝虽然很多卖的不过这里自行斟酌)
如果家里,实验室等长期固定位置使用的话,建议通过旁路由方式接入,更为方便便捷。很多代理软件都支持 TUN 模式模拟出一个网关,只需要把局域网中设备的网关地址修改指向它即可,非常方便快捷。还可以通过修改 DHCP 设定,所有设备默认连接到该网关,无缝接管网络流量,解锁海外网站。
## Level 1: 平台为王,你需要账号作为敲门砖
📒 众所周知,各个~~国家都有各个国家的国歌~~ (bushi) 平台都有各个平台的账号,很多小的产品和服务会选择通过依附于某些大平台的账号,减少开发适配成本,降低用户使用门槛等等。一些外网冲浪必备的平台账户:
- **Gmail 账号**: 这个不仅仅是 Google 账号,邮箱也是必备品。很多海外的产品都是不认国内的邮箱的,有个 Gmail 账号会方便很多。不过近些年注册难度提高了,可能需要找些攻略突破一下
- **美区 App Store 账号,** **美区 Google Play 账号**: 很多 App 都是不在国区上架的,想用就必须到美区才能下载到。大多数时候这里注册需要生成虚拟海外地址,以及接码平台做一个临时的验证,不过总体难度不大。
- X(原 Twitter) 账号Facebook 账号Instagram 账号Telegram 账号等一些流行的社交平台外网冲浪必备。这里按需去找攻略注册即可。不过要注意尽量不要在一些敏感问题上发言不然容易被查水表。THE BIG BROTHER IS WATCHING YOU!
## Level 2: Shut up and take my money
💰 海淘,买游戏,买 App, 这些都需要你有外币的卡可以进行这些交易
这里一般去找个银行开一张支持 Visa/MasterCard 的外币卡即可,借机卡或者信用卡都行,这里简单谈一下可选项以及个人办卡的一些经验。
- 中国银行的汇率应该是比较优惠的一个了,可以去办一个他家的 Visa/MasterCard 借记卡或者信用卡。App 里提供信用卡的申请,过了的直接邮寄到家。如果非常担心盗用盗刷或者单纯不想用信用卡的话,可以去申请借记卡。不过这个得去线下申请,而且一般级别比较低的网店也搞不了需要去分行。即便如此也最好提前打电话问一下可不可以办,以及有哪些种类和卡面。避免白跑一趟
- 无论办哪家的,办信用卡还是借记卡,**要确认清楚收不收年费,年费多少**. 很多活动推销说的免年费都只是首年免年费,或是消费达到多少笔,达到多少金额然后给你免下一年的年费。这里我们办的境外卡可能没法稳定的进行消费,消费满多少多少,所以一般要主要好年费的问题。有一些种类是基本上一直面年费的,可以留意下。
- 小红书B 站也有很多博主分享各家银行,各个卡种的区别和使用体验,可以了解下。注意部分活动有时效性,留意博主发布的时间
- 信用卡到手最好限制下额度,避免一些不必要的麻烦。各大银行的 App 都可以设置,甚至如果使用频次很低可以用完先锁卡
国内银行开的外币卡都是要受外汇额度限制的,可以考虑办外资的卡。这里简要介绍几个比较容易获取到的类别
**类别一:肉身去香港办理外资银行实体卡**
汇丰,中银香港,招商永隆,渣打银行,新加坡南洋银行等都是不错的选择,其中:
- **中银香港**是中国银行的,最大的优势就是同名账户转账没有杂七杂八的手续费克扣,经常需要跨境转账的可以考虑。
- **招商永隆**申请门槛相对较低,只需要提前在单独的 App 上填写申请资料,如果审核通过了你就可以去香港任意一家招商永隆的网店面签认证,即可当场下卡。这个好处就是你是在确定可以下卡的情况下再去香港,避免出现当天现场办卡没通过审核,开不了户拿不了卡的情况。额外注意招商永隆这个是对存款有要求的,卡里面没能持续保持至少一万港币的余额是要收年费的
- **汇丰**, **渣打**, **南洋**等都是外资银行,相对来说比较独立不过审核也会更严格些,如果是专程去香港办卡最好不要在一棵树上吊死,提前准备 plan b, 避免一张卡都办不下来的尴尬局面。
**类别二:肉身去香港顺带办理虚拟银行**
虚拟银行顾名思义就是没有实体网点的银行,好处就是高度数字化,很多流程手续都可以在线下完成,少了很多繁琐的步骤; 而且没有了线下网点的开支,一般他们的优惠力度啥的也会更大。除此之外他们的开户门槛也会低不少。香港有几家虚拟银行比较受欢迎,据说本地都有很多人日常在用。比较受欢迎的有**众安银行**(ZA Bank), **理慧银行**(Livi Bank), **Mox Bank**, **天星银行**, **蚂蚁银行**的,这些后面基本都有国内的一线科技企业如腾讯,蚂蚁金服,小米,京东参与投资,或是背靠传统实力雄厚的传统银行,如渣打银行,中银香港等。即便如此还是不建议作为主力账户存放资金,毕竟哪天人家要是跑路了或者是强制破产了,你的钱不一定能全拿回来。
这些虚拟银行一般申请都比较简单,审批也不会卡的很严。你在 App 上直接提交申请,填写相应资料,然后后台自动给你审核。不过因为政策法规的限制,你必须人在 HK 内,用的当地的 IP(手机流量,公共 WiFi 都可以), 才能正常走申请流程。
**类别三:在家线上办理虚拟信用卡**
DuPay, NodePay, OneKey Card 等专门搞虚拟信用卡的平台都是支持线上认证直接开卡的,不过这些有的充值渠道有限制,需要 USDT 加密货币才能转入不支持人民币直接转入,还有的需要月费年费,还有各种交易手续费,这些就见仁见智,各取所需了。这类门槛低,使用方便,可靠度也是最低的,像 OpenAI 之前大规模封过一波虚拟银行卡,上述这些账户都会被拦截了,相对而言传统的银行和有实体卡的那些账户就要稳不少。
此外像 Wise 这类换汇平台在某书上也是挺火的,可以开虚拟信用卡,服务质量也有保证,不过默认不对大陆地区开放服务,得曲线救国,这个感兴趣的可以自行搜索攻略。
## Level 3: 手机号 与 Duck Typing
> 如果一个东西走路像鸭子,叫的也像鸭子,那它就是一只鸭子
📱 当代互联网世界中,手机号几乎就是最通用的身份认证 id. 如果你有新加坡节点的梯子工具,有新加坡的手机号码,那么你就是一个新加坡用户,你就可以解锁所有新加坡地区的互联网服务。
这里的主要难点
- 需要先解锁海外支付技能
- 很多找到可以保号,保号成本低的运营商和套餐
- **需要找到支持在大陆激活**, 能在大陆长期漫游且能收到短信的运营商和套餐。很多淘宝卖的旅游流量卡,那种都是要在目标地区才能激活和使用的
- 所在地区最好限制比较少,能解锁尽可能多的服务 (如 HK 的解锁不了 GPT), 最理想的 OpenAI, Tiktok 等都要能解锁
- 最好不要是虚拟号码,不然很多平台会受限制
这里给几个参考,可自行搜索攻略选购
- Giffgaff 英国的
- haha SIM, club SIM ,香港的
- UltraMobile 美国
- Knowroaming 加拿大一家公司的
- Piranha Mobile 英国的
鉴于有些套餐并不是长期开放,政策也一直在变,一些详细套餐配置和购买途径,保号方式等此处不再详述
## 结语
总的来说,梯子节点,海外信用卡,海外手机号这三个都集齐了,你基本就可以畅快体验满血版互联网了。当然更直接的方法是肉身翻墙 hhh. Anyway, 希望各位都能生活在一个开放,互联,自由的互联网,而不要被被迫做互联网的二等公民。

View File

@@ -1,49 +0,0 @@
---
title: 解决安装 Plex 时无法进入安装页面的问题
date: 2023-12-31
description: 近期在部署 Plex 的时候死活找不到安装初始化的页面,看了几遍安装文档和官网的流程,都没找到问题在哪。后来 Google 了一圈才意识到自己这次不是局域网环境部署Plex 为了安全性考虑,每个新实例的安装部署页面是只对局域网访问的 IP 开放的,甚至不是全部局域网 IP, 只有本机 (Localhost). 这里简单记录下排查和解决的流程,其他朋友在这块可以少踩些坑。
draft: false
categories:
- 指南
tags:
- Plex
- Linux
- SSH
- Docker
---
Plex 是一款非常好用的影音库,可自托管,支持 Web, 颜值在线。近期在部署 Plex 的时候死活找不到安装初始化的页面,看了几遍安装文档和官网的流程,都没找到问题在哪。后来 Google 了一圈才意识到自己这次不是局域网环境部署Plex 为了安全性考虑,每个新实例的安装部署页面是只对局域网访问的 IP 开放的,甚至不是全部局域网 IP, 只有本机 (Localhost). 这里简单记录下排查和解决的流程,其他朋友在这块可以少踩些坑。
问题页面如图所示,正常来说新 Plex 服务器是要设定电影资料库,电视节目资料库的文件夹位置,绑定 Plex 账号等。官方文档和其他人的流程都大致如此。但是我访问这个新 Plex 实例对应的初始化 URL, 进来怎么也找不到配置文件夹位置的入口。
![Pasted image 20221216213737](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254779.png)
后来在这两个地方的资料才发现一些端倪,人家一般都是在 NAS 本机安装,然后访问本机地址进入初始化页面,但是我这个就不是。
https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server
https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804
知道了问题所在,解决方案还是比较简单的,那就是 SSH 连接使用端口转发,将目标服务器 Plex 网页服务的端口,映射到本机的一个端口。这样访问本机的这个端口,就能访问到 Plex 服务了,而对于 Plex 服务器的 Web 端来说,我们就是访问的本机地址。
访问 http://localhost:8888/web/ 即可看到 Plex 的页面。如果没有带上后面的`web` 后缀的话,直接访问可能会显示一个 XML 页面。
```bash
ssh user@192.0.2.1 -L 8888:localhost:32400
```
上面这句话就是 ssh 连接到 192.0.2.1 这个远端,然后在本地,即 ssh 客户端的机器,监听 8888 端口,本地所有访问 8888 端口的请求都会被重定向,等同为远端机器访问自身的 32400 端口,即为上文提到的,部署 plex 服务的端口
![Pasted image 20221216213514](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254781.png)
如下是正常的初始化页面:
![Pasted image 20221216214020](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254782.png)
有些情况下可能会遇到需要额外执行关联操作的情况,不过问题不大
![Pasted image 20221216214456](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254783.png)
![Pasted image 20221216214521](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254784.png)
配置成功后就可以正常享受影音资源啦 😎
![Pasted image 20231231225353](https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254785.png)

View File

@@ -1,170 +0,0 @@
---
title: 踏着风,去远方 - 我的 2024 年度总结
date: 2024-12-31
lastmod: 2025-02-09
description: 我的 2024 年度关键词 去远方&心流
categories:
- 杂记
- 年度总结
tags:
- 总结
- 杂记
---
## Part 1. 回顾
### 年度关键词:去远方
2024 年里,我去了更远的地方,尝试了更多以前不曾想到的体验,并决定了几个长期投入的方向,以更高的视角来看,我「拓宽」了我的边界。总有很多鸡汤营销号喜欢鼓吹「走出舒适区」,虽然这句话现在已经打上深深地 PUA 标签了,不过确实挑战陌生领域能更快地成长。但我觉得真正有意义的事是「扩张舒适区」。方向有两个,一个是降低自己的欲望,降低阈值,提高自己的韧性;另一个方向就是扩大疆域,发现更多舒适区。
### 年度关键词:心流
工作上的事情太烦杂,躺在床上没睡着又容易胡思乱想。但是当我在涂装模型,在给涂色书上色,在练习架子鼓的时候,发现我真的可以做到什么都不想,很放松,脑海里面也不会有各种杂音。本来我以为向给涂色书上色这种活动,只是消磨时间用的,像疫情的时候无聊肯定很合适。没想到简简单单,用画笔涂色,能够有这么治愈的效果。
这种跟玩游戏或者写代码时的高度专注还不太一样,给我的感觉是完全不需要动脑,基本处于放空状态,像是泡在热水里。不过也有可能是用脑区域不一样?
不管怎么说,我非常庆幸找到了这样一种状态,一个从另一种角度放松和疗愈自己的手段。
### 2024 highlights
- 泰国游,解锁了新地图,还是挺新鲜的,很多在国内习以为常的事物或者文化,换个角度能看到很多不一样的东西
- 搬家,同等价位房间面积升级,大 house 就是更爽啊
#### 年度好物
- **扫地机器人**!懒人福音,每天回家都是干干净净的真的超赞
- **回音壁 with 实体后环绕**!没有大 house 原来也可以有家庭影院,实体环绕才是真牛批
- **Homepod**!从 mini 换到大 homepod, 低频清晰了不止一星半点,听到了很多听不出的低频细节
#### 年度五星书影音
- 进击的巨人系列
- 混沌武士
- 迷宫饭
- 跃动青春
### 年度遗憾
- 今年也是 AI 大爆发的一年,上半年在折腾 AI 生图,做了一个基于 AI 生图的混剪视频,从分镜到粗剪都做的七七八八,不过最后没能解决好角色一致性问题,没能达到上线标准
- 十一 A 股和港股爆火的行情没能高位下车,果然会买是徒弟,会卖的才是师傅啊
### Flags From 2024
- 发布 6 篇博客文章(❌ 零零散散写了几篇笔记,但是没有到博客文章的完成度)
- 做 3 个 Weekend Project, 两天马拉松直接从 0 到上线(❓ 混剪类视频倒是做了几个,不过时间超长了)
- 做 2 个 Side Project, 并持续投入运营(✅ 一个是 FeedCraft目前是自用为主计划长期维护另外就是 模型设计 + 涂装,从图片到拿在手上的模型,真的超有成就感)
### Question From 2024
> 一年后的自己,有没有找到或者建立一个会愿意持续投入 3 年以上的项目,方向,或者事业?
找到了,而且还是 3 个。
1. 学习乐器,目前刚入坑架子鼓,感觉良好,持续投入
2. 模型设计&涂装,随着 3D 打印 + AI 3D 生成的技术的不断进化,我相信普通人也可以离手办自由更近一些。不过打印归打印,上色目前来看还只有靠人工,计划先从上色开始入门,除了模型涂装可以用到,后面也可以考虑尝试学习绘画
3. 第二收入。延迟退休政策叠加国内这糟糕的职工体系,让我对正常工作到退休不敢抱有幻想。搞钱才是硬道理
## Part 2. 「一夜暴富」and「早日退休」
延迟退休的新闻一出,一想到还有几十年才能退休,我才发觉这个时代的「工作」有多离谱。科技在进步,时代在发展,我们的生活我们的人生真的变得更好了吗?动辄几十年的房贷,不断动荡的市场行情,让当下的很多年轻人都萌生了不买房不生娃的理念。如果可以的话,谁不想有个安稳的家,享受生活呢?结合 24 年很多反社会事件的新闻,可以看到当下大众的压力是不小的。
「一夜暴富」,「早日退休」,是安慰,是自嘲,也是祝福。无论是路人的手机壳,各种活动的文案,都可以见到这样类似的标语。不过空有口号是没用,「想致富,先修路」,今年我开始更多地关注这一方面的内容,看了很多 up 的案例和一些所谓的「理论支撑」,谈到最多的就是「被动收入」、「复利」「副业」等等。先不考虑一夜暴富,能有更多的收入来源也能在很多时候多提供一些底气和选择。
### 我的被动收入现状
#### 投资理财
- 银行理财:收益率 2.69%
- 港股:收益率 10.1%
- A 股:持仓收益算下来其实是小亏的,不过总体量级很小,忽略不计
- 美股:年底又回到了之前的水位,前后比较基本没赚,忽略不计
#### 年度总收入占比
银行稳定理财收益占比 0.18%
股票收入在总收入 1.85%
总体来看,被动收入占比只有 2.03%,之前的理财策略还是太保守了。大部分闲钱都在卡里没动过,其实放余额宝都好。还有进阶理财的部分,也是配比太低。
#### 时薪变化追踪
以总收入情况来看2024 相较于 2023 年:
- 只看税后到卡上的部分,月均工资 +19.4%
- 但其实加上各类奖金补贴等综合来看,+8.6%
以综合后的总收入为基准,计算时薪。
工作时长 +4.76%
工作时薪 +3.67%
虽然账面上说涨工资了,但是隐形的加班也变多了,总体感觉更累了。如果继续这个趋势下去,工资越来越高,但是却越来越累,这不是一个好的结果。
## Part 3. 2025 plan
### 一些想法
#### better me 专项基金计划
以前学生时代没有收入总是习惯性的避免开销,现在工作了这个惯性还是很大。很多事物是值得去花小钱去投资或者体验的,比如今年去找了几个乐器和绘画的体验课,以及尝试了涂色书、涂装等,感觉很不错,投入其实也很低。一方面从每天重复的工作领域抽离开来,有很多新鲜感。另外这些艺术类活动,有创作的成分在里面,「我」和这个世界的事物产生交互,融入了「我」的劳动和表达,诞生出了这个世界上独一无二的事物,这件事情本身就是令人欣喜的。
2025 年,我期望通过一些指定领域的专项基金,定额投入,尽量全部消费完,来「强迫」自己,去做出一些新的尝试。比如这些方向
- **户外基金**:多运动,避免久坐。可能我会去买个自行车,日常溜达溜达;买个穿越机,周末多去外面转转拍拍
- **AI 探索基金**:一方面探索当下最流行的 AI 应用,以及探索 AI 应用的可能。现在 LLM 的 API 已经非常便宜了,之前一直碍于价格没有用起来,如果价格不再是瓶颈,我能用 AI 做出什么,这个是一个很值得探索的问题。预计 25 年我会投入不少于 1k 专门来做这个
- 小确幸基金:提升日常幸福感,比如买些鲜花、装饰画、香氛等
- **投资能力成长基金**:尝试各类投资类型,如股票,债权,贵金属,加密货币等等
#### AI Agent & 人类 Manager
AI agent 一定是未来一个非常有潜力的领域AI 能不能给人类社会带来进步,给普通大众带来幸福暂且不谈。「超级个体」+ 超级 AI agent 一定是有很大的发展空间的。
但是从我目前的一些经验来看,虽然当前 AI 的能力有限,先达到了瓶颈,但是按照这个发展速度,用不了几年,主导 AI agent 的人一定是先达到瓶颈的那个。那么这里 个体的组织能力,管理能力,以及部分领域的专业高度就显得非常重要了。
目前来看,项目组织和管理能力一定是值得去花时间精力去投资的,未来一堆 agent 就相当于一堆打工人,能创造什么价值很大程度上取决于主导的那个人类个体。
### 2025 小目标
- 更多的收入来源,薪资外收入占比超过 5%
- 在至少两个领域,分别至少有一个阶段性的代表作
### 2025 时空信件
一年后的自己,有没有找到一件不后悔青春的事?
---
## Part 4. 年度流水账环节
- 年前幻兽帕鲁爆火,狂肝帕鲁,久违地又能拉一群朋友打同一款游戏
- 元旦到春节的间隔格外的长,格外不适应,之前都是过完元旦差不多就快回家过年了的,今年还要上很久的班
- 年会运气爆棚,抽中了年会现场的门票,还是第一排!晚会嘉宾还是周深,感受到什么是行走的 CD
- 城里过春节,相较而言可以说是非常单调了,没有那么多亲戚朋友和邻里的来来往往,虽说时间更自由了,却突然有点不太适应
- 春节一个星期主要都在狂肝老头环,很上头
- 攒了个纯固态 NAS 方案,算是很好地满足了我的需求,安静,低功耗
- 元宵跟朋友去香港澳门转了一圈,特种兵行程一天一城,超级充实。要说印象最深刻的场面的话,香港的海水很漂亮,澳门的赌场第一次去很震撼,富丽堂皇而且很有格调
- 不知道是澳门赌场的香氛里面有令人上头的东西,还是单纯是玩的很嗨突然第二天要去上班,节后回来那几天像是有戒断反应一样,上班上的很痛苦
- 突然上头开始玩 stable diffusion不得不说 AI 进化的速度真的很恐怖,去年那会儿用 disco diffusion 画个风景画勉勉强强,画个蛋糕都能画崩。今年上手玩了下,社区已经发展的很成熟了,出来的效果也挺惊艳,在舒适区内,合适的调教下可以秒杀大部分人类画师了,更别说这逆天的效率
- 养的多肉里面有一株突然开花了,第一次知道多肉还能这样开花,淡黄色的小花娇弱,很漂亮
- 尝试用 AI 生图做了个短片,学习了不少 AI 绘图流程的东西,风格、景别等等。发现到最后成片的瓶颈其实还是人类作者的编剧和分镜质量
- 清明休了个小长假去四川和重庆玩了一圈,老友相聚很欢乐。不知道是因为出来玩心境不一样,还是单纯是不同城市的气质不一样,成都这边明显更有活力,即便是工作日地铁上都更热闹些
- 翻出吃灰的电饭锅开始尝试做酸奶,成色还不错挺有成就感的,不过发现真的酸,外面卖的酸奶原来加了那么多糖。另外还物理意义上感知到了好牛奶和差牛奶的差距,生鲜牛乳做出来的酸奶真不错
- 爆肝塞尔达,太上头了
- 五一终于把之前一直想做的 RSS 处理中间件做出来的,起名叫 FeedCraft反响还不错
- 第一次出国去泰国玩了一周,体验了骑大象、真枪射击、看线下拳击表演、各种东南亚的菜系。泰国的文化和娱乐产业原来这么丰富,感觉很多地方做的比国内一线城市还要好不少,不知道是国内监管太严格了还是我们近代的文化发展落后太多
- 搬家,没想到能找到个很实惠的房子,相较于之前的加量不加价,大 house 幸福感拉满
- 趁活动入了个扫地机器人,每天到点自动扫地拖地自动洗拖布,每天回家都是干干净净的,幸福感++
- 带刚毕业的发小逛香港和澳门,给他一点小小的赌场震撼
- 抢到票了,去看了 tia 的演唱会,舞美和演唱等各个方面真的很用心,期待 tia 后面继续做出更好的作品
- 又有同学离开北京过来深圳发展了,小聚了下。还去蹭了场 livehouse
- 团建去惠州漂流,刺激是真刺激,不过后知后觉感觉也挺危险的。还是要趁年轻去体验这些刺激的项目啊
- 从 homepod mini 升级到了大的 homepod低音部分非常不错贝斯、鼓声、低音提琴这些头一次听得这么清晰睡前放几首感觉低频的振动就是在给心灵按摩年度最佳电子产品
- 入坑涂色书,上色的过程很放松,能够放空自己安静地享受上色,年度最具性价比投入
- 入坑巨人系列,从第一季一口气追到完结,不得不说还是很震撼的
- 国庆带北京来的同学玩了一周,逛漫展、华强北、广州塔、长隆野生动物园、高达基地等等,野生动物园真是一分钱一分货,跟之前逛的那些动物园完全不是一个维度的。漫展上看到巨人粉的 coser 激动不已,切身感受到了什么叫打破了次元壁
- 某团上经常有各种免费体验课,心血来潮找了几个去试着玩了下,找了一个周末试了水彩画和乐器课,体验很新鲜,也很有成就感。而且每一项其实时间也才不超过两个小时,看来还是要更多去探索些新鲜事物啊,重复的事物里面很难找到激情和活力
- 突然想起自己还有个吃灰的 3D 打印机,之前房子太小施展不开一直闲置,翻出来重新发光发热,每天走之前把他开起来,下班之后回来直接就打好了,有种收菜的快感
- 3D 打印了一堆玩具之后开始尝试模型涂装,努力实现手办自由,没想到很上头,一开始用丙烯画笔简单粗暴效果好,后来部分颜色不太够,又开始自己调色,自由度更高。出来的效果也很不错,涂装过程也很治愈
- 抢到了 Jessie J 的演唱会门票,结石姐的 vocal 功力真的强的可怕
- 开始每周上课学习和练习架子鼓,也算是圆了一直以来内心隐蔽角落的一个心愿
- 整了个带实体后环绕和低音炮的回音壁,结合投影仪超大荧幕,观影体验拉满!原来整套方案其实不贵也不麻烦
- 2024 the end

View File

@@ -230,9 +230,9 @@
margin-top: 4rem;
padding: 1.2rem 3rem;
color: white;
color: #9dd5c0;
color: #01ac88;
/* background-color: #04cba0; */
border: #9dd5c0;
border: #01ac88;
border-width: 2px;
border-style: solid;
transition: all 0.15s ease-in-out
@@ -242,7 +242,7 @@
.button:hover {
color: white;
background-color: #9dd5c0;
background-color: #01ac88;
font-weight: bold;
}
@@ -258,23 +258,7 @@
}
.byLink {
color: #9dd5c0;
}
/* custom ::selection */
::selection {
background: #9dd5c0;
color: #fff;
}
::-moz-selection {
background: #9dd5c0;
color: #fff;
}
::-webkit-selection {
background: #9dd5c0;
color: #fff;
color: #04cba0;
}
</style>
</body>

View File

@@ -38,15 +38,15 @@
src="{{ "assets/prism.js" | absURL }}"></script>
<script defer onload="tocbot_init()"
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/tocbot/4.9.1/tocbot.min.js','tocbot_init')"
onerror="fallbackJSloader('https://cdn.staticfile.org/tocbot/4.9.1/tocbot.min.js','tocbot_init')"
src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js"></script>
<link rel="stylesheet"
onerror="fallbackCSSloader('https://s4.zstatic.net/ajax/libs/tocbot/4.9.1/tocbot.css')"
onerror="fallbackCSSloader('https://cdn.staticfile.org/tocbot/4.9.1/tocbot.css')"
href="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.css">
<script defer onload="init_gitalk()"
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/gitalk/1.7.2/gitalk.min.js','init_gitalk')"
onerror="fallbackJSloader('https://cdn.staticfile.org/gitalk/1.7.2/gitalk.min.js','init_gitalk')"
src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<link rel="stylesheet"
onerror="fallbackCSSloader('https://s4.zstatic.net/ajax/libs/gitalk/1.7.2/gitalk.css')"
onerror="fallbackCSSloader('https://cdn.staticfile.org/gitalk/1.7.2/gitalk.css')"
href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.css">
<!-- no min css version fallback for gitalk css -->

View File

@@ -20,8 +20,8 @@ onerror="fallbackJSloader('https://cdn.staticaly.com/gh/panr/hugo-theme-hello-fr
src="{{ "assets/main.js" | absURL }}"></script>
<script async onload="panguSpaing()"
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/pangu/4.0.7/pangu.min.js','panguSpaing')"
onerror="fallbackJSloader('https://cdn.staticfile.org/pangu/4.0.7/pangu.min.js','panguSpaing')"
src="https://cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
<script async onload="initQuickLink()"
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/quicklink/2.3.0/quicklink.umd.js','initQuickLink')"
onerror="fallbackJSloader('https://cdn.staticfile.org/quicklink/2.3.0/quicklink.umd.js','initQuickLink')"
src="https://cdn.jsdelivr.net/npm/quicklink@2/dist/quicklink.umd.js"></script>

View File

@@ -1,6 +1,5 @@
<link rel="icon" href="/favicon.png">
<link rel="apple-touch-icon" href="/favicon.png">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22>
<text y=%22.9em%22 font-size=%2290%22>👋</text></svg>">
<script>
function loadAgies() {
const aegis = new Aegis({

View File

@@ -8,71 +8,23 @@ Params:
{{ with $.Get "name" }}
{{ $name := . }}
{{ $data := getJSON $url }}
{{ range $data.data }}
{{ $item := . }}
<div class="card">
<h3 id="{{$item.name}}">{{$item.name}} <span class="badge">{{$item.type}}</span></h3>
<p>{{$item.subtitle}}</p>
<p><strong>地址:</strong>
<h3 id="{{$item.name}}">{{$item.name}}</h3>
{{ $link := urls.Parse $item.link }}
<p>{{$item.type}} - {{$item.subtitle}}</p>
<p>地址:
{{ if (gt (len $link.Host) 1) }}
<a href="{{$item.link}}" >{{$link.Host}}</a>
{{ else }}
{{$item.link}}
{{ end }}
</p>
<p><strong>上线时间:</strong>
{{ if (gt (len $item.StartServingAt) 1) }}
{{$item.StartServingAt}}
{{ else }}
<p>上线于{{$item.StartServingAt}}</p>
{{ end }}
</p>
</div>
{{ end }}
{{ end }}
<style>
:root {
--card-border: #cccccc51;
--badge-background: #9dd5c0;
--badge-color: white;
}
[data-theme='dark'] {
--card-border: #44444451;
--badge-background: #9dd5c0;
--badge-color: white;
}
.card {
border: 1px solid var(--card-border);
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
margin: 1rem;
padding: 2rem;
transition: transform 0.2s ease-in-out;
}
.card:hover {
transform: scale(1.02);
}
.card h3 {
margin: 0;
display: inline-flex;
align-items: center;
}
.card p {
margin: 5px 0;
}
.card a {
text-decoration: none;
}
.badge {
background-color: #9dd5c0;
color: white;
border-radius: 12px;
padding: 4px 8px;
font-size: 0.6em;
margin-left: 8px;
}
</style>
{{ end }}
{{ end }}
{{ end }}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -57,47 +57,45 @@ ol.toc-list>li>a:hover {
}
.is-active-link::before {
background-color: #9dd5c0 !important;
background-color: #d71a1b !important;
}
.logo__cursor {
background: #9dd5c0;
background: #d71a1b;
}
/* 超链接样式 */
.post-tags a,
.post-content a,
.index-content a {
.post-content a {
text-decoration: none;
border-bottom: 1px dashed #9dd5c0;
border-bottom: 1px dashed #d71a1b;
-webkit-transition: all 0.2s;
transition: all 0.2s;
}
.post-tags a:hover,
.post-content a:hover,
.index-content a:hover,
nav a:hover {
text-decoration: none;
border-bottom: 2px solid #9dd5c0;
border-bottom: 2px solid #d71a1b;
-webkit-transition: all 0.1s ease;
transition: all 0.1s ease;
}
/* custom ::selection */
::selection {
background: #9dd5c0;
background: #b5b5b5;
color: #fff;
}
::-moz-selection {
background: #9dd5c0;
background: #b5b5b5;
color: #fff;
}
::-webkit-selection {
background: #9dd5c0;
background: #b5b5b5;
color: #fff;
}
@@ -118,33 +116,3 @@ nav a:hover {
.post-content a:active {
background-size: 80% 100%;
} */
.logo__cursor {
background-color: #9dd5c0 !important;
}
.on-list .post-title:hover {
transform: translateY(-0.1rem);
-webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}
.read-more:hover {
transform: translateX(0.1rem);
-webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}
span.button.next:hover {
display: block;
transform: translateX(0.2rem);
-webkit-transition: all 0.1s ease-in-out;
transition: all 0.21s ease-in-out;
}
span.button.previous:hover {
display: block;
transform: translateX(-0.2rem);
-webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}