diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..013df3b --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,61 @@ +name: docs build + +on: + push: + branches: + # 确保这是你正在使用的分支名称 + - main + +jobs: + LearnHubs-build: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + with: + # 获取所有标记和分支的所有历史记录(updatetime 必须,否则每次都会变化) + fetch-depth: 0 + # 如果你文档需要 Git 子模块,取消注释下一行 + # submodules: true + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + run_install: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: pnpm + + # 将读书笔记复制到静态页路径,然后构建页面 + - name: Build Docs + env: + NODE_OPTIONS: --max_old_space_size=8192 + run: |- + pnpm cpx "docs/reading/**" docs/.vuepress/public/reading + pnpm run docs:build + > docs/.vuepress/dist/.nojekyll + + - name: Deploy GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4 + with: + # 这是文档部署到的分支名称 + branch: lh-pages + folder: docs/.vuepress/dist + # 将页面更新到 Vercel + - name: Copy file to Vercel + if: always() + uses: andstor/copycat-action@v3 + with: + personal_token: ${{ secrets.PERSONAL_TOKEN }} + src_path: /. + dst_path: / + # 你的用户名 + dst_owner: libaxuan + # 与 Vercel 链接的仓库名,也就是 Vercel 部署时新建的仓库 + dst_repo_name: LearnHubs-vercel + dst_branch: main + src_branch: lh-pages + clean: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3ed162 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Node modules +**/node_modules/** + +# Cache +**/.vuepress/.cache/** +# Temp +**/.vuepress/.temp/** +# Output +**/.vuepress/dist/** + +# 自定义草稿箱 +docs/_temp/ + +# GoodSync +_gsdata_/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/LearnHubs.iml b/.idea/LearnHubs.iml new file mode 100644 index 0000000..0c8867d --- /dev/null +++ b/.idea/LearnHubs.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fe8a936 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..1a86aee --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,24 @@ +{ + "default": true, + "MD003": { + "style": "atx" + }, + "MD004": { + "style": "dash" + }, + "MD013": false, + "MD024": { + "allow_different_nesting": true + }, + "MD033": { + "allowed_elements": ["br", "template", "script", "style", "BiliBili"] + }, + "MD035": { + "style": "---" + }, + "MD036": false, + "MD040": false, + "MD045": false, + "MD046": false, + "MD049": false +} diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000..4ca1a03 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1 @@ +docs/reading/** diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..8051a48 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +auto-install-peers=true +strict-peer-dependencies=false \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..979b152 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,16 @@ +# Vuepress Cache +**/.vuepress/.cache/** +# Vuepress Temp +**/.vuepress/.temp/** +# Vuepress Output +**/.vuepress/dist/** +**/.vuepress/templateBuild.html + +# live2d +docs/.vuepress/public/live2d-widget/** + +# Node modules +node_modules/ + +# pnpm lock file +pnpm-lock.yaml diff --git a/.vercel/README.txt b/.vercel/README.txt new file mode 100644 index 0000000..525d8ce --- /dev/null +++ b/.vercel/README.txt @@ -0,0 +1,11 @@ +> Why do I have a folder named ".vercel" in my project? +The ".vercel" folder is created when you link a directory to a Vercel project. + +> What does the "project.json" file contain? +The "project.json" file contains: +- The ID of the Vercel project that you linked ("projectId") +- The ID of the user or team your Vercel project is owned by ("orgId") + +> Should I commit the ".vercel" folder? +No, you should not share the ".vercel" folder with anyone. +Upon creation, it will be automatically added to your ".gitignore" file. diff --git a/.vercel/project.json b/.vercel/project.json new file mode 100644 index 0000000..b90a86c --- /dev/null +++ b/.vercel/project.json @@ -0,0 +1 @@ +{"orgId":"ranNkfMcGsOCEN6rlr5hLh70","projectId":"prj_40UNYZwDdnvbBY7BZhpWuvRsmu5R"} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..66b6570 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 libaxuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a7bf7c --- /dev/null +++ b/README.md @@ -0,0 +1,265 @@ +> 开源工具、效率方法、心理学探索的自我提升笔记 + + +
+ Table of Contents + +
+ + + chat on Discord + + +## ✨ 初衷 + +曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 + +更重要的是,**笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。** + +为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnHubs 学习中心,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。 + +![](/img/流程1.png?imageMogr2/thumbnail/600x "笔记 + 文章 = LearnHubs 知识库") + +![](/img/流程2.png "笔记/博客自动化发布") + +## 🧱 笔记结构 + +- 置顶:日常习惯、健身、阅读; +- 软件应用:常用应用、Chrome 扩展和相关教程; +- Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署; +- 系统问题:Windows 系统优化和相关问题; +- 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集; +- 生活角落:说明书、生活记录和小技巧; +- 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。 + +## 🍥 搭建 LearnHubs + +1. 首先,进入 [LearnHubs](https://github.com/libaxuan/LearnHubs) 项目页,点击右上角「Use this template」后选择「Create a new repository」。 + + + +2. 接着,进入项目仓库的「Settings」>「Actions」>「General」,选中底部 Workflow permissions 中的 `Read and write permissions`,然后点击保存即可。如果未授权,GitHub Page 部署会由于 repo 权限不足而报错 `failed with exit code 128`。 + + ![](/img/readandwrite.webp?imageMogr2/format/webp) + +3. 接下来,请进入菜单栏顶部的「Actions」>「最新的 workflow」,并点击右上方的「Re-run jobs」>「Re-run all jobs」,以重新生成网页。若部署正确,GitHub 将自动搭建 gh-page 分支页面。 + + ![](/img/actions.png) + + + 需要注意的是:如果你不需要将网页部署同步到个人服务器,**请删除 `.github/workflows/main.yml` 中 Sync files 区块的代码**,否则会出现报错 `Error: Input required and not supplied: server`。 + + ```yaml + ### 没有服务器的话,请删除本区块代码,防止报错 ### + # 将页面推送到服务器,timeout 时间从默认的 1 分钟调整到 10 分钟。 + - name: 📂 Sync files + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + with: + local-dir: docs/.vuepress/dist/ + server: ${{ secrets.ftp_host }} + username: ${{ secrets.ftp_username }} + password: ${{ secrets.ftp_password }} + port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 + timeout: 600000 + ### 没有服务器的话,请删除本区块代码,防止报错 ### + ``` + +4. 然后点击「Settings」, 修改 `Repository name` 为 `用户名.github.io`。假设你的仓库链接是 `https://github.com/xxx/LearnHubs`,那么中间的 `xxx` 就是你的用户名。如果该仓库名称已被使用,GitHub Pages 将无法正常显示样式,请查看页面底部的常见问题来设置子域名。 + + ![](/img/libaxuan-github-io.png) + +5. 在同一页面选择「Settings」>「Pages」>「Build and deployment」>「Branch」, 将 gh-page branch 设为 GitHub Pages 的来源,网站运行目录默认为 `/(root)`。设置完成后,点击「Save」。如果找不到 lh-pages 分支,可以按照上面提到的第三步进行操作,或在 GitHub 中修改任意文件以手动触发 GitHub Action,等待其执行完成后,再重新设置 Pages 的来源。 + + ![](https://iili.io/JnQjSpe.webp?imageMogr2/format/webp) + +6. 设置成功后,页面会提示访问链接:`https://xxx.github.io/`。此时,你的知识库就已经搭建完成了。 + + 如果未出现访问链接提示或不能打开 GitHub Pages,则删除 `docs/_posts` 路径下的博客文章。这是因为 GitHub Pages 有时会对旧文章里的代码报错。 + +注意:如果出现报错 `Error: Input required and not supplied: server`,请删除 `.github/workflows/main.yml` 中 Sync files 区块的代码,以避免出现报错。 + +## 🔣 配置 LearnHubs + +### 文档结构 + +LearnHubs 网站的配置和文本都存放在 `docs` 文件夹中。文章和页面的配置可参考主目录下的 [samplepage.md](https://github.com/libaxuan/LearnHubs/blob/main/samplepage.md?plain=1)。其中,`order` 参数表示侧边栏的顺序,数字越小越靠前,支持非整数和负数。我个人的偏好是将非干货或随想短文的 order 设置在 -0.01 到 -0.99,将干货类长文的 order 设置在 -1 到负无穷。每次新增文章都会在上一篇的基础上递减 order 值。这种设置使我能随时记录低于 1000 字的短文,同时不会影响那些寻求干货文章的用户体验,因为干货文章的排序始终保持在最上方。 + +docs 目录结构如下: + +```bash +docs +|── .vuepress # 网站配置 +│ ├── config.ts # 网站环境依赖和网站属性 +│ ├── sidebar.ts # 侧边栏 +│ ├── navbar.ts # 导航栏 +│ ├── theme.ts # 主题和插件 +│ └── templateBuild.html # 网页模板,网站关键词和统计 +|── _posts # 博客文章目录 +├── _temp # 草稿箱 +├── reading # 读书笔记 +├── anyname # 自定义笔记 +├── blog.md # 博客页面 +└── intro.md # 博主个人介绍 +``` + +`docs/.vuepress` 路径下是网站的配置文件,我已添加了详细的注释。你可以参考注释和 [vuepress-theme-hope 配置案例](https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress)来调整配置。请在 `docs/.vuepress/sidebar.ts` 文件中修改文件夹路径,后台会自动抓取路径下的 md 文件来生成侧边栏。`docs/.vuepress/theme.ts` 有[评论插件](https://gpt-vip.top/web/Comments.html)的相关配置。 + +注意: + +- LearnHubs 默认使用了 algolia 全文搜索。如果你没有使用 algolia 爬虫,则可以在 `docs/.vuepress/config.ts` 文件中删除 plugins 下的 docsearchPlugin 区块,网站将转用本地全文索引搜索。 +- `docs/_temp` 文件夹默认不同步到 GitHub 上。你可以手动在本地建立 `_temp` 文件夹,用来存放草稿。 +- 自 VuePress2 的 beta.54 版本开始,文件夹名前缀为 `_` 在生成链接时将被省略,例如文章路径为 `/_posts/`,但网页链接路径会是 `/posts/`。 + +### 看板娘 + +LearnHubs 集成了看板娘 [Live2D Widget](https://github.com/stevenjoezhang/live2d-widget),支持随机对话、切换人物服饰和玩打飞机游戏,能提升网站美观度和趣味性。如果不需要看板娘,可以删除 `docs\.vuepress\public` 下的 live2d-widget 文件夹。 + +如果网站部署在子页面 `https://xxx.github.io/yyy`,则需将子页面路径 yyy 加入到以下两个文件: + +- 将 `docs\.vuepress\public\live2d-widget\autoload.js` 文件第三行的 `const live2d_path = "/live2d-widget/"` 修改为 `const live2d_path = "/yyy/live2d-widget/"`。 +- 将 `docs\.vuepress\templateBuild.html` 文件中看板娘区块代码 ` + + + + + + + +
+ + + + + + + diff --git a/docs/.vuepress/theme.ts b/docs/.vuepress/theme.ts new file mode 100644 index 0000000..6aec0a4 --- /dev/null +++ b/docs/.vuepress/theme.ts @@ -0,0 +1,175 @@ +import { getDirname, path } from "@vuepress/utils"; +import { hopeTheme } from "vuepress-theme-hope"; +import navbar from "./navbar"; +import sidebar from "./sidebar"; + +// @ts-ignore +const __dirname = getDirname(import.meta.url); + +export default hopeTheme({ + // 主题选项:https://theme-hope.vuejs.press/zh/config/theme/layout.html + hostname: "https://gpt-vip.top", + + iconAssets: "iconfont", + + author: { + name: "清顺", + url: "https://gpt-vip.top", + }, + + logo: "/logo.svg", + + // 是否全局启用路径导航 + breadcrumb: false, + + // 页面元数据:贡献者,最后修改时间,编辑链接 + contributors: false, + lastUpdated: true, + editLink: true, + + // 深色模式配置 + darkmode: "switch", + // 全屏按钮 + fullscreen: true, + + // 默认为 GitHub. 同时也可以是一个完整的 URL + repo: "libaxuan/LearnHubs", + // 自定义仓库链接文字。默认从 `repo` 中自动推断为 "GitHub" / "GitLab" / "Gitee" / "Bitbucket" 其中之一,或是 "Source"。 + repoLabel: "GitHub", + // 是否在导航栏内显示仓库链接,默认为 `true` + repoDisplay: true, + // 文档存放路径 + docsDir: "docs", + + // navbar + navbar: navbar, + // 导航栏布局 + navbarLayout: { + start: ["Brand"], + center: ["Links"], + end: ["Repo", "Outlook", "Search"], + }, + // 是否在向下滚动时自动隐藏导航栏 + // navbarAutoHide: "always", + + // sidebar + sidebar: sidebar, + // 侧边栏排序规则 + // sidebarSorter: ['readme', 'order', 'title'], + + // footer: "默认页脚", + // displayFooter: true, + + // 页面布局 Frontmatter 配置:https://theme-hope.vuejs.press/zh/config/frontmatter/layout.html#pageinfo + pageInfo: ["Category", "Tag", "Word", "ReadingTime", "PageView"], + + // 主题功能选项:https://theme-hope.vuejs.press/zh/config/theme/feature.html + blog: { + articleInfo: ["Date", "PageView", "Category", "Tag", "ReadingTime"], + name: "清顺", + avatar: "/avatar_self.webp", + description: "迷信新工具,热衷于人工智能,定期分享探索成果", + intro: "/intro.html", + roundAvatar: true, + medias: { + GitHub: "https://github.com/libaxuan", +// Zhihu: "https://www.zhihu.com/", + Wechat: "https://iili.io/Hr4MJ5l.jpg", + Email: "mailto:libaxuan@gmail.com", + Discord: "https://discord.gg/TeUFcFJy", + RSS: "https://gpt-vip.top/rss.xml", + }, + }, + + // 隐藏打印按钮 + // print: false, + + plugins: { + blog: true, + + // 评论配置(仅做样例,记得更换) + comment: { + provider: "Waline", + serverURL: "https://waline.gpt-vip.top", + reaction: [ + "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44d.png", + "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44f.png", + "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f60e.png", + "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f602.png", + "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f635-200d-1f4ab.png", + ], + // 部署 Waline:https://waline.js.org/guide/get-started.html + // pageview: true, // 浏览量统计 + locales: { + "/": { + // 表情互动提示文字 + reactionTitle: "已到达文章底部,欢迎留言、表情互动~", + reaction0: "赞一个", + reaction1: "支持下", + reaction2: "有点酷", + reaction3: "啥玩意", + reaction4: "看不懂", + // Waline 等级标签 + admin: "盛年不重来,一日难再晨", + level0: "锻体", + level1: "炼气", + level2: "筑基", + level3: "金丹", + level4: "元婴", + level5: "化神", + }, + }, + + // Giscus 备用配置 + /* + provider: "Giscus", + repo: "libaxuan/LearnHubs", + repoId: "R_kgDOHdfk6Q", + category: "Comments", + categoryId: "DIC_kwDOHdfk6c4CQYNn", + */ + }, + + // 组件库 + components: { + components: ["Badge", "BiliBili", "AudioPlayer", "VideoPlayer", "YouTube"], + }, + + // 禁用不需要的配置 + mdEnhance: { + align: true, + attrs: true, // 使用特殊标记为 Markdown 元素添加属性 + // chart: true, + // codetabs: true, // 代码块分组 + container: true, + // demo: true, //代码演示 + // echarts: true, + // flowchart: true, + gfm: true, + imgLazyload: true, + // imgMark: true, + imgSize: true, + figure: true, + include: true, //导入文件 + // katex: true, + mark: true, + // mermaid: true, + footnote: true, + tasklist: true, + sub: true, // 上下角标 + sup: true, + // tabs: true, // 选项卡 + // vpre: true, + // vuePlayground: true, // Vue 交互演示 + }, + + // rss 属性 + feed: { + rss: true, + count: 10, + }, + }, + + // 开发模式下是否启动热更新,显示所有更改并重新渲染 + hotReload: true, +}); diff --git a/docs/DailyRoutine.md b/docs/DailyRoutine.md new file mode 100644 index 0000000..ef428ec --- /dev/null +++ b/docs/DailyRoutine.md @@ -0,0 +1,138 @@ +--- +article: false +title: 每日仪式 +icon: check +--- + +每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:**遵循一个固定、程序化的流程,有规律地养成习惯**,实现自我提升。 + +## 仪式清单 + +### 5AM Club + +5AM Club 是我的[高效早晨方案](https://gpt-vip.top/posts/2023-03-31-efficient_morning_5am_club.html): + +1. 早上 5 点起床,使用手环震动闹钟。 +2. 泡杯咖啡,准备早餐,开始第一个工作番茄。 +3. 工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。 +4. 每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。 +5. 晚上 10 点睡觉,保证充足的睡眠时间。 + +[Huberman Lab](https://hubermanlab.com/sleep-toolkit-tools-for-optimizing-sleep-and-sleep-wake-timing/) 建议早晨不一定需要进食,可以到中午再进食,改变身体的新陈代谢周期;醒来后两到四小时再摄入咖啡因,并尽量避免在午后摄入咖啡因,以防下午的 cafferine crush。请根据个人情况灵活调整计划。 + +### 每日 + +- **早上创造美好情绪**:赞美、仪式感、吃好吃的、看搞笑视频、听歌。 + + - 唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。 + - 自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。 + - 参考[积极心理学](https://www.xuetangx.com/course/THU07111001088/),收集积极情绪材料,放在显眼的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术(音乐、名画、诗句)。 + +- **人际连接**:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。 + + - 别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。 + - 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。 + +- **微习惯**: + + - 每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。 + - 睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。^[[睡前淋浴有助于快速入睡](https://www.solidot.org/story?sid=72099)] + +- **间隔学习**:穿插学习不同领域内容 + + - 阅读看书:每天花 30 分钟读书,并输出笔记。 + - 墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。 + - 笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。 + +- **当日回顾**:每天记录 3 件好事,总结好事发生的原因,并与家人分享。 + + > 这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。 + +### 定期 + +- **月底反思**:检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 + - 每月复盘参照 [Allison Seboldt](https://allisonseboldt.com/),作者会分享他的收入并反思上个月的成就。 + - 阅读 [JustinJ ackson](https://justinjackson.ca/bootstrap),作者在 2018 年初创办 Transistor 以来,一直在分享他的项目,整理了在此过程中学到的许多经验教训。 +- **积极自我介绍**:每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。 + +### 自我监控 + +为了更好地监督自己,我制定了一套[自我监控方案](https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html),以记录自己的私人工作状态。 + +1. 开机(8 点)启动录屏命令,并检测护眼提醒是否开启。可参考 [FFmpeg 录屏方案](https://gpt-vip.top/posts/2022-11-03-ffmpeg_screen_recording.html)来修改命令: + + ```bash + ffmpeg -f gdigrab -r 0.1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 output.mp4 -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y + ``` + +2. 晚上 10 点执行关机程序:静音、关闭护眼提醒、关闭录屏终端,并使用 dvr-scan 删除视频中的静止帧。这些步骤可以通过 AutoHotkey 命令自动完成。 + + ```autohotkey + Send, {Volume_Mute} + Process, Close, Stretchly.exe + Process, Close, pwsh.exe + Sleep, 500000 + Run, PowerShell.exe -NoExit -Command &{dvr-scan -i output.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\Backup\Libraries\Desktop + ``` + +3. 使用 VLC 播放器可以以 31.25 倍的速度回放监控视频,并结合 ManicTime 来回顾当日内容。要轻松实现 VLC 的高倍速播放,可以在「菜单栏」->「视图」中开启「状态栏」。此外,通过剪映,可以达到 100 倍的播放速度。 + +## 时间管理 + +GTD 的存在是让大脑清空不混乱目的,明确知道下一步应该做什么。GTD 流程依次为**捕获(Capture),明晰(Clarify),组织(Organize),回顾(Reflect),执行(Engage)**。 + +执行时,将 GTD 按功能与目的划分为多个清单。 + +- 收集箱(Inbox) +- 执行清单(@Context task) +- 等待清单("Waiting for" task) +- 项目清单("Plan project" plan) +- 可能清单(Someday/maybe) +- 参考资料(Reference) +- 回收箱(Trash) + +当任务捕获到收集箱后,参考下方的固定流程将其整理不同的清单中。 + +![](https://img.gpt-vip.top/2022-11-02-11-02-43.png "GTD 任务转移到清单") + +从 GTD 流程角度,执行任务和计划。 + +![](https://iili.io/JnQectn.png "GTD 流程步骤") + +GTD 工具原本用的是 Microsoft To Do,「我的一天」功能非常适合聚焦,但有次出现了同步问题,就转用滴答清单。滴答清单除基础 Todo 功能外,还能用日视图管理具体时间安排,添加跨天长时间任务,并在日历、看板和甘特图中查看。 + +滴答清单的缺点也很明显,功能过于追求全,功能打磨得不够细节,无法满足定制需求。比如,没有任务跳过功能,对于循环任务只能点完成,导致记录与实际不符;跨越多天的任务不想在「今天清单」中出现出现,但一直在提醒,导致无法清空;过滤器逻辑单一,筛选元素教少。如果你的任务都可以一天内完成,不需要记录持续多天的计划,不需要买滴答的高级会员,基础功能足够满足你了。 + +本节内容来自 Topbook 的 [GTD 自我管理 - 时间管理教程](https://topbook.cc/course/detail/153),改变了我对 GTD 的认知,**把事情做好,而不是把事情做完**。建议完整阅读。 + +## 日常习惯 + +| 锚点 | 在我…… | 我会…… | 庆祝 | +| -------------- | ------------------------ | -------------------- | ------------ | +| 20s 休息提示 | 拿下眼镜,画板上添笔画后 | 深蹲 15 个 | 双手肘向后 | +| 5mins 休息提示 | 拿下眼镜,画板上添笔画后 | 重力拉伸 15 次,2 组 | 双手肘向后 | +| 上完厕所 | 洗好手,画板上添笔画后 | 俯卧撑 15 个 | 双手肘向后 | +| 出书房 | 画板上添笔画后 | 俯卧撑 15 个 | 双手肘向后 | +| 午餐 | 放下碗筷 | 吃维生素 | 想象自己发光 | +| 午睡 | 打开大排灯 | 设置 30 分钟的闹钟 | 想象自己发光 | +| 洗澡 | 打开花洒 | 深蹲 15 个 | 哼歌 | +| 刷完牙 | 放下牙刷 | 俯卧撑 15 个 | 双手肘向后 | +| 晚上 | 上床 | 伸展并触碰脚趾;读书 | 想象自己发光 | +| 睡觉 | 关灯 | 打开白噪音 | 想象自己发光 | + +休息选项:喝口水、洗脸、看看窗外、眼部按摩仪、按摩头皮。 + +运动选项:跳绳、有氧拳击、B 站轻度健身操(Jo 姐?)。 + +睡眠知识:睡眠时的体温理想情况下会比正常体温低二到三度,因此睡前应尽量降低低温,避免激烈运动。同时,手机屏幕等产生的光线会非常影响睡眠,建议尽量避免睡前使用手机。睡醒后应尽快暴露在室外,让自然光线把身体唤醒,只需要短短十分钟。 + +## 美容仪器 + +为了避免家里的美容仪器闲置浪费,我制定了定期使用计划。(请勿参考型号购买) + +- 按摩椅 + 眼部按摩仪 + belulu hikari LED 彩光美容仪,模式 A「嫩肤」10 分钟,模式 B「祛痘」8 分钟。 +- Panasonic EH-SA96 蒸面喷雾器:每周两次喷雾蒸面,需变压器转接。 +- 射频仪:每周使用 1-2 次 RF 射频,10 分钟一次,除皱紧肤,射频后敷面膜或蒸面补水。 + - Tripollar STOP RF 射频美颜仪,Dr. Bauer Eye Reshaping RF System II(涂抹适量 Elixir 导入霜于眼周,去黑眼圈) + - ~~YAMAN 嫩肤美容仪 + LaboLabo Lotion + HABA G-LOTION,用于精华导入导出。~~ + - 使用前,请除下身上所佩戴之饰物,如戒指、手表、颈饰、手链、耳环或一切以金属制造的仼何配件,并于涂抹导入霜后彻底洁净及抹干双手,才可进行疗程。可按个人皮肤状况及需要,选择合适疗程温度,普通可设置等级「2」,疗程温度随等级设置而增加。 diff --git a/docs/Fitness.md b/docs/Fitness.md new file mode 100644 index 0000000..7b42a50 --- /dev/null +++ b/docs/Fitness.md @@ -0,0 +1,98 @@ +--- +article: false +title: 健身计划 +icon: strong +--- + +早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 + +消除饥饿感:**10 秒内原地高抬腿快跑 20 次**!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 + +晨间锻炼使用八段锦(12mins)热身。每天保持 [9000 步](https://www.solidot.org/story?sid=71166),日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 + +## K 歌减肥 + +[K 歌减肥](https://mp.weixin.qq.com/s/QKJ9PnmGTK7XY0yUWxsMRw)容易吵到邻居,没找到隔音口罩,用发泄壶代替。 + +- **每天唱三首歌**,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要**一边按住 E 点,一边用力发声唱歌**。 + + ![E 点](https://img.gpt-vip.top/2022-06-10-14-38-20.png?imageMogr2/format/webp "E 点位置") + +- 喊叫减肥:臀桥的同时,将眼睛、鼻孔和嘴巴都用尽全力张到最大,然后气沉丹田,用力地怒吼出声:啊——啊——啊!啊!啊!喊的时候**一定要用全力,一直叫**,叫足 3 分钟。如果声音过大,可以咬毛巾,降低音量。 + + ![喊叫减肥动图](https://img.gpt-vip.top/202206101441570.gif?imageMogr2/format/webp "喊叫减肥动图") + +该方法类似于上面的《卡拉 OK 健康法》,里面提到唱 K 不仅可以增加肺活量,还有瘦身作用。这原理就和瑜伽中常用的腹式呼吸法差不多,**利用腹部肌肉收缩,促进新陈代谢**,吸收脂肪分解时所需的氧气,从而达到减肥效果。 + +## 坐立减肥 + +研究者开创了一种名叫[比目鱼俯卧撑(SPU)](https://mp.weixin.qq.com/s/LN0xu-FZaHP1oFvSwilGrA)的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。 + +![比目鱼俯卧撑演示图](https://img.gpt-vip.top/2022-09-25-16-54-16.gif "比目鱼俯卧撑演示图") + +当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 SPU。 + +## 健身理论 + +- 早餐一定要吃!吃早餐的人比不吃早餐的人更容易减少体重。因为在睡觉的时候,身体的新陈代谢会减慢,而只有在你再次进食的时候,它才会回升。所以,如果你跳过早餐不吃,身体消耗卡路里的能力在午餐前都无法达到正常水平。这也就是为什么新的一天最好从一顿拥有 300 ~ 400 卡路里的早餐开始,它能立刻把你的新陈代谢带入「工作状态」。另外,早餐应该尽量多食用些高纤维食物。习惯吃高热量早餐的人更容易很快感到饥饿;而高纤维碳水化合物的消化和吸收时间更长,不会导致身体里血糖的迅速改变,你自然也就不那么容易饿了。 +- 高于或者低于靶心率 `142~154` 的运动算无效运动,基本没有减脂的作用。所以说,神马仰卧起坐瘦小腹,蹬腿瘦大腿都是扯淡,那些运动都达不到有氧运动的下限,根本燃烧不了脂肪。可进行适当的拉伸运动,开始 HIIT,然后用 5 分钟整理运动结束训练,然后接着进行全面的拉伸。 + +## 每周健身 4 小时 + +早上半小时内要吃早餐,饭前 60 个深蹲或推墙俯卧撑。早餐:蛋、小扁豆、菠菜。 + +- 别吃水果,水果的糖分太多,可以一天一个牛油果 +- 瓶颈期时,加大蛋白摄入,早餐吃 3 个鸡蛋 +- 晚上冰敷:冰袋放在脖子后部和上斜方肌附近,保持 20 ~ 30 分钟。 + +早饭前、睡前:各 5 ~ 10 分钟的冷水澡。先用热水把整个身体淋湿,大概用时 1~2 分钟。然后,用洗发水洗头、用洗面奶洗脸,把淋浴调成完全的冷水清洗头发和脸部,身体别的部分先别碰冷水。洗干净后,转身,背对淋浴喷头,让水浇在你的后脖颈下方和背部上方的区域,保持这个姿势 1 ~ 3 分钟不动。然后,转过身,正常清洗身体就可以了。 + +## 室内健身 + +::: warning +本部分的内容,我不确定其来源,也未加以理解和消化,仅将其作为参考资料。 +::: + +如果你只是想降低体重,提高身体素质,那么 Slim in 6 和 P90 已经够了,可以来回多刷几周目,如果你还想对自己进行更深入的训练,那么就可以试试 Les Mills BodyCombat 和 T25,如果需要挑战自己,P90X 和 insanity 在等着你。 + +在锻炼过程中,先把动作做标准,而不是勉强去跟上视频的动作数量,当你觉得自己需要休息,就停一下,不要 over do it,做好热身和关节保护,锻炼期间吃好睡好。 + +### Slim in 6 + +这是一套专门针对无运动基础、体重基数大、身体状态较差的人的健身操,没有太剧烈的动作,基本没有跳跃动作,非常注意对膝盖等关节的保护,各种动作里糅合了大量拉伸,教练非常 nice。课程不复杂,只有三套主题操和一个核心肌肉附加训练和一个拉伸附件训练,每一套主题操反复做两周然后进入下一套,附加训练视自己的情况逐渐加入主题操之后。这套操好评如潮,无数购买者在官网留下评论表示坚持这套操给自己的身体带来了显著的良性变化,体重明显降低、线条更优美、体态更匀称等等...... + +我上手便是做这套,但是虽然看的时候觉得也还挺容易的,真正做起来也并不是那么轻松,但是难度真的控制得很好,很多动作的难度和频率都刚好在让你觉得“吃力但是咬一咬牙就坚持下来并且很有成就感”的程度,这套操所需的东西仅仅是一张大一点的瑜伽垫,几条拉力绳,几个平方的空地,在哪都能做,我就是在办公室利用中午时间做的。 + +当然这套操也有缺点,一个是从第二套主题操开始时间变得很长,如果做完附件训练,需要大概 1 个多小时,第三套更长一些。一个是相对比较枯燥,每天重复同样的动作,容易厌烦,这也是为什么我只做到第四周的一般就放弃的原因之一,另一个原因是我肩膀比较弱,这个操又有大量的保持手臂平举的动作...... + +但是这三周多的效果是很明显的,我的体重有接近 5 公斤的下降幅度,最重要的是肺活量和肌肉力量有了很明显的提高,为进入下一步打好了基础。我推荐所有从零开始或者长期不运动的同学从这套操开始恢复,我相信如果能坚持做完六周,你们会感谢我的推荐的。 + +哦,对了,这套操有很多深蹲动作,大家做的时候一定要注意正确的姿势,保护好膝盖。 + +### P90 + +注意,这个是 P90 而不是 P90X,虽然只差一个字,但是难度有天壤之别,都是金牌教练豪顿的作品,P90 是他整个健身操系列的基石,也是面对缺乏运动基础的人来设计的,同样有很好的评价,这套训练是一天有氧一天肌肉抗阻训练的模式,但是强度都比较低,肌肉抗阻训练比起健身房差很远,但是对刚起步的人来说很合适。这套训练我没有系统性地做过,在放弃 Slim in 6 之后短暂地做过几天,因为跳的动作比较多,而且我不是很喜欢豪顿那样的块状肌肉,也没有打算进军 P90X,而且当时我的身体状态做 P90 已经感觉不到太大的效果了。 + +P90 和 Slim in 6 一样,只需要一块垫子,哑铃或者拉力绳就可以做,推荐想进入 P90X 的同学从这个开始,这套操的难度和强度与 Slim in 6 是很接近的。 + +### Les Mills BodyCombat + +到我最喜欢的部分了,这是莱美健身房推出的一套搏击操,这套操总体上强度高于上面两个,这套操一共有十三个视频,分别是有氧搏击系列,HITT 系列和核心肌肉训练系列,然后根据每天做的视频不同,编排了三个 60 天的课程表,难度一个大于一个,我只做完了第一个。我之所以喜欢这套操的原因如下:跳跃动作不多、非常好玩、教练帅气逼人。 + +这套操比起前面两个需要的空间略大,因为有一些滑步动作和一些各个方向的踢腿动作,但是也只是略大,器械也就是部分课程需要两只哑铃而已。这套操的有氧搏击部分我个人认为是最精华所在,它将拳击、跆拳道、泰拳等格斗技术的一些基础动作编排在一起,通过各种出拳、踢腿、顶膝等动作大量消耗热量,而且非常好玩,脑补能力稍微强一点的,提高一点中二值,一节课很容易就过去了。 + +这套操的难度体现在 HITT 和核心肌肉训练部分,开始出现急速提高心率的剧烈动作和组合型动作,比如俯卧撑跳跃深蹲再跳趴俯卧撑,这部分需要锻炼者有不错的肺活量和肌肉力量基础,不然会承担比较高的运动受伤风险。 + +推荐有了基础的大家来做这一套,我每天在办公室做完真的是全身湿透,桌子地板都要擦一遍,哪哪都是汗水,非常爽。 + +### T25 + +这个的难度与 Les Mills BodyCombat 相仿,是大名鼎鼎的熊 T,也就是可怕的 insanity 健身操的教练推出的一套难度低于 insanity 的训练计划,你可以把他看做简化版的 insanity,里面的很多动作都会在 insanity 里面出现,只是频率和强度没那么大。 + +这套在我刷完 Les Mills BodyCombat,进军 insanity 之前做过,真的很累,因为这套计划有很多都是 HIIT,短时间高强度的重复动作,比如 30 秒急速高抬腿马上接 30 秒虎跳之类的,但是 HIIT 的效果是非常明显的,坚持一段时间可以让你的身体素质在原有基础上进入一个新的阶段。 + +对于所有想进军 insanity 的朋友,真诚推荐这一套作为预热,如果能很好地掌控这套,那么在 insanity 里你肯定能坚持下去。 + +### P90X 和 insanity + +把这两个放在一起,是因为它们在家庭训练计划界的地位实在是难分伯仲,大名鼎鼎的腹肌撕裂者就出自 P90X 的项目,而 insanity 更是让无数家庭健身者得到了梦寐以求的良好身体素质和美妙的身体线条。首先 P90X 我没有做过,原因和我不喜欢 P90 是一样的,我不喜欢豪顿那样的块状肌肉,所以对 P90X 里面大量的独立肌群抗阻训练无感,而 insanity 的熊 T 很少设计单一肌肉的训练动作,都是大量的 HIIT 和核心肌肉训练,更注重整体的塑造。 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..1f3864d --- /dev/null +++ b/docs/README.md @@ -0,0 +1,223 @@ +--- +article: false +title: LearnHubs +icon: note +--- + +> 开源工具、效率方法、心理学探索的自我提升笔记 + +[![](https://img.shields.io/discord/1048780149899939881?color=%2385c8c8&label=Discord&logo=discord&style=for-the-badge)](https://discord.gg/TeUFcFJy) + +## ✨ 初衷 + +曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 + +更重要的是,**笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。** + +为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnHubs ,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。 + +![](/img/流程1.png?imageMogr2/thumbnail/600x "笔记 + 文章 = LearnHubs 知识库") + +![](/img/流程2.png "笔记/博客自动化发布") + +## 🧱 笔记结构 + +- 置顶:日常习惯、健身、阅读; +- 软件应用:常用应用、Chrome 扩展和相关教程; +- Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署; +- 系统问题:Windows 系统优化和相关问题; +- 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集; +- 生活角落:说明书、生活记录和小技巧; +- 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。 + +## 🍥 搭建 LearnHubs + +1. 首先,进入 [LearnHubs](https://github.com/libaxuan/LearnHubs) 项目页,点击右上角「Use this template」后选择「Create a new repository」。 + + + +2. 接着,进入项目仓库的「Settings」>「Actions」>「General」,选中底部 Workflow permissions 中的 `Read and write permissions`,然后点击保存即可。如果未授权,GitHub Page 部署会由于 repo 权限不足而报错 `failed with exit code 128`。 + + ![](/img/readandwrite.webp?imageMogr2/format/webp) + +3. 接下来,请进入菜单栏顶部的「Actions」>「最新的 workflow」,并点击右上方的「Re-run jobs」>「Re-run all jobs」,以重新生成网页。若部署正确,GitHub 将自动搭建 gh-page 分支页面。 + + ![](/img/actions.png) + + + 需要注意的是:如果你不需要将网页部署同步到个人服务器,**请删除 `.github/workflows/main.yml` 中 Sync files 区块的代码**,否则会出现报错 `Error: Input required and not supplied: server`。 + + ```yaml + ### 没有服务器的话,请删除本区块代码,防止报错 ### + # 将页面推送到服务器,timeout 时间从默认的 1 分钟调整到 10 分钟。 + - name: 📂 Sync files + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + with: + local-dir: docs/.vuepress/dist/ + server: ${{ secrets.ftp_host }} + username: ${{ secrets.ftp_username }} + password: ${{ secrets.ftp_password }} + port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 + timeout: 600000 + ### 没有服务器的话,请删除本区块代码,防止报错 ### + ``` + +4. 然后点击「Settings」, 修改 `Repository name` 为 `用户名.github.io`。假设你的仓库链接是 `https://github.com/xxx/LearnHubs`,那么中间的 `xxx` 就是你的用户名。如果该仓库名称已被使用,GitHub Pages 将无法正常显示样式,请查看页面底部的常见问题来设置子域名。 + + ![](/img/libaxuan-github-io.png) + +5. 在同一页面选择「Settings」>「Pages」>「Build and deployment」>「Branch」, 将 gh-page branch 设为 GitHub Pages 的来源,网站运行目录默认为 `/(root)`。设置完成后,点击「Save」。如果找不到 gh-pages 分支,可以按照上面提到的第三步进行操作,或在 GitHub 中修改任意文件以手动触发 GitHub Action,等待其执行完成后,再重新设置 Pages 的来源。 + + ![](https://iili.io/JnQjSpe.webp?imageMogr2/format/webp) + +6. 设置成功后,页面会提示访问链接:`https://xxx.github.io/`。此时,你的知识库就已经搭建完成了。 + + 如果未出现访问链接提示或不能打开 GitHub Pages,则删除 `docs/_posts` 路径下的博客文章。这是因为 GitHub Pages 有时会对旧文章里的代码报错。 + +注意:如果出现报错 `Error: Input required and not supplied: server`,请删除 `.github/workflows/main.yml` 中 Sync files 区块的代码,以避免出现报错。 + +## 🔣 配置 LearnHubs + +### 文档结构 + +LearnHubs 网站的配置和文本都存放在 `docs` 文件夹中。文章和页面的配置可参考主目录下的 [samplepage.md](https://github.com/libaxuan/LearnHubs/blob/main/samplepage.md?plain=1)。其中,`order` 参数表示侧边栏的顺序,数字越小越靠前,支持非整数和负数。我个人的偏好是将非干货或随想短文的 order 设置在 -0.01 到 -0.99,将干货类长文的 order 设置在 -1 到负无穷。每次新增文章都会在上一篇的基础上递减 order 值。这种设置使我能随时记录低于 1000 字的短文,同时不会影响那些寻求干货文章的用户体验,因为干货文章的排序始终保持在最上方。 + +docs 目录结构如下: + +```bash +docs +|── .vuepress # 网站配置 +│ ├── config.ts # 网站环境依赖和网站属性 +│ ├── sidebar.ts # 侧边栏 +│ ├── navbar.ts # 导航栏 +│ ├── theme.ts # 主题和插件 +│ └── templateBuild.html # 网页模板,网站关键词和统计 +|── _posts # 博客文章目录 +├── _temp # 草稿箱 +├── reading # 读书笔记 +├── anyname # 自定义笔记 +├── blog.md # 博客页面 +└── intro.md # 博主个人介绍 +``` + +`docs/.vuepress` 路径下是网站的配置文件,我已添加了详细的注释。你可以参考注释和 [vuepress-theme-hope 配置案例](https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress)来调整配置。请在 `docs/.vuepress/sidebar.ts` 文件中修改文件夹路径,后台会自动抓取路径下的 md 文件来生成侧边栏。`docs/.vuepress/theme.ts` 有[评论插件](https://gpt-vip.top/web/Comments.html)的相关配置。 + +注意: + +- LearnHubs 默认使用了 algolia 全文搜索。如果你没有使用 algolia 爬虫,则可以在 `docs/.vuepress/config.ts` 文件中删除 plugins 下的 docsearchPlugin 区块,网站将转用本地全文索引搜索。 +- `docs/_temp` 文件夹默认不同步到 GitHub 上。你可以手动在本地建立 `_temp` 文件夹,用来存放草稿。 +- 自 VuePress2 的 beta.54 版本开始,文件夹名前缀为 `_` 在生成链接时将被省略,例如文章路径为 `/_posts/`,但网页链接路径会是 `/posts/`。 + +### 看板娘 + +LearnHubs 集成了看板娘 [Live2D Widget](https://github.com/stevenjoezhang/live2d-widget),支持随机对话、切换人物服饰和玩打飞机游戏,能提升网站美观度和趣味性。如果不需要看板娘,可以删除 `docs\.vuepress\public` 下的 live2d-widget 文件夹。 + +如果网站部署在子页面 `https://xxx.github.io/yyy`,则需将子页面路径 yyy 加入到以下两个文件: + +- 将 `docs\.vuepress\public\live2d-widget\autoload.js` 文件第三行的 `const live2d_path = "/live2d-widget/"` 修改为 `const live2d_path = "/yyy/live2d-widget/"`。 +- 将 `docs\.vuepress\templateBuild.html` 文件中看板娘区块代码 ` + + +``` + +### 本地压缩 HTML + +[html-minifier](https://github.com/kangax/html-minifier) 能在本地批量压缩 HTML、CSS 和 JavaScript 源码。 + +```shell +# 全局安装 html-minifier +npm install html-minifier -g +# 终端中执行压缩命令,默认压缩 input 下所有文件,压缩选项参照 http://kangax.github.io/html-minifier/ +html-minifier --collapse-boolean-attributes --collapse-whitespace --decode-entities --no-html5 --minify-css true --minify-js true --process-conditional-comments --process-scripts text/html --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --remove-tag-whitespace --sort-attributes --sort-class-name --trim-custom-fragments --use-short-doctype --input-dir D:\Backup\raw --output-dir D:\Backup\1 +``` diff --git a/docs/code/Javascript.md b/docs/code/Javascript.md new file mode 100644 index 0000000..f422a21 --- /dev/null +++ b/docs/code/Javascript.md @@ -0,0 +1,350 @@ +--- +article: false +title: JavaScript +icon: javascript +order: 2 +--- + +JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 [ECMAScript 6.0](https://es6.ruanyifeng.com/)。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 + +推荐学习流程:「JavaScript」>「ES6」>「[TypeScript](https://jkchao.github.io/typescript-book-chinese/)」。 + +## ES6 + +`sayHi(){console.log("Hi");}` 等同于 `sayHi:function(){console.log("Hi");}`。 + +`let` 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 `for` 循环的计数器。 + +`const` 声明一个只读的常量,一旦声明,常量的值就不能改变。 + +`=>` 是指箭头函数,是一种函数的简写方式,语法为 `(参数)=>{函数体};`。 + +```JavaScript +x => 2x +//等于下方函数 +function (x) { + return 2x; +} +``` + +## 数据结构 + +`Set` 类似于数组,但是成员的值都是唯一的,没有重复的值。向 Set 加入值的时候,不会发生类型转换。 + +```JavaScript +// 例一 +const set = new Set([1, 2, 3, 4, 4]); +[...set] +// [1, 2, 3, 4] + +// 例二 +const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); +items.size // 5 +``` + +`Map` 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 + +Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。因此有时看起来是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此 get 方法无法读取该键,返回 undefined。 + +## 常用函数 + +```JavaScript +document.getElementById() +document.getElementsByClassName("v-modal")[0] +document.getElementsByTagName("body")[0].remove(); //通过 Tagname 获取元素,删除指定元素 +for (var i=0;i");} //循环语句,i++会在代码被执行后增加一个值 +break; //跳出当前循环但继续函数 + +//js 暂停 +while (true){ + //100 毫秒延时 + setTimeout(f1,100) + //直接跳出循环和函数 + return; +} + +//截取中间的字符串,A 有多少字符就需要加多少位置 +str = str.substring(str.indexOf("A") + 1,str.indexOf("B")) + +//取特定字符前后的字符串 +var ture_tkl01 = taokouling.value.trim().split('打')[0]; +//取第 4 位后的字符串 (4 代表开始位置,相当于从 5 开始截取到尾部) +var ture_tkl = ture_tkl01.substring(4); + +//报错处理 +function f1(){ + try{ + if (document.getElementById("pro-operation").getElementsByClassName("product-button02 disabled")[0].innerHTML.indexOf("立即申购")!=-1) { + window.location.reload(); + }else{ + window.location.reload(); + } + }catch(e){ + //下单 + document.getElementById("product-operation").getElementsByClassName("product-button02")[0].click(); + } +} + +//js 函数为同步处理,只有 if else、setTimeour、for each 等函数才能按序运行 + +//setInterval 不要包含多个函数,否则 clearInterval 容易出错 + +//替换,不添加/g,则替换只发生一次 +text.value = text.value.replace(" ", "----"); +//全局替换,如果使用/\s/g,则换行符也会被替换 +text.value = text.value.replace(/ /g, "----"); + +//载入完成后,自动或取焦点。textSour 为元素 id,需配合 jquery +window.onload = function(){ + textSour.focus(); +}; +//按钮点击后使用函数 +$("#clearEmoji").click(function () { +} + +//去除每行首尾空格,支持特殊字符,首尾的空格、制表符、特殊字符的组合都倍清除 +strResult += split_result[i].replace(/(^[\t\s]*)|([\t\s]*$)/g, "") + '\n'; +``` + +## JavaScript 对象 + +对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。 +对象一定要用**英文冒号**来注明,否则整段代码失效。属性由逗号分隔: + +```JavaScript +var person={firstname:"John", lastname:"Doe", id:5566}; +//对象属性有两种寻址方式 +name=person.lastname; +name=person["lastname"]; + +//对象的方法定义了一个函数,并作为对象的属性存储。对象方法通过添加 () 调用 (作为一个函数)。 +

+ +``` + +### 全局变量 + +js 的全部变量要用 `window.` 来定义。如果变量在函数内没有声明(没有使用 var),该变量为全局变量。 + +局部变量:在函数中通过 var 声明的变量。全局变量:在函数外通过 var 声明的变量。 + +没有声明就使用的变量,默认为全局变量,不论这个变量在哪被使用。 + +```JavaScript +

+ +``` + +### 变量类型 + +当您声明新变量时,可以使用关键词 "new" 来声明其类型: + +```JavaScript +var carname = new String(); +字符串; +var x = new Number(); +数字; +var y = new Boolean(); +布尔; +var cars = new Array(); +数组; +var person = new Object(); +对象; +var y = new String("John"); +对象; + +// 数据赋值 +var length = 16; // Number 通过数字字面量赋值 +var points = x * 10; // Number 通过表达式字面量赋值 +var lastName = "Johnson"; // String 通过字符串字面量赋值 +var cars = ["Saab", "Volvo", "BMW"]; // Array 通过数组字面量赋值 +var person = { firstName: "John", lastName: "Doe" }; // Object 通过对象字面量赋值 +``` + +## 运算符 + +```JavaScript +//后置++是将自身的值赋给新变量,然后才自身加 1. +//前置++是将自身加 1 的值赋值给新变量,同时自身也加 1; +int a; +a=i++;//将 i 的值赋值给 a,即 a=i;然后再执行 i=i+1;也就是【a=i++;】与【a=i; i=i+1;】等价。 +a=++i;//将 i+1 的值赋给 a,即 a=i+1;然后再执行 i=i+1;也就是【a=++i;】与【a=i+1;i=i+1;】等价。 +``` + +```JavaScript +// 描述 (x=5) 比较 +// == 等于 +x==8 false +x==5 true +// === 绝对等于(值和类型均相等) +x==="5" false +x===5 true +// != 不等于 +x!=8 true +// !== 不绝对等于(值和类型有一个不相等,或两个都不相等) +x!=="5" true +x!==5 false + +&& 且 +|| 或 +``` + +## JavaScript 应用 + +### 取随机值 + +```JavaScript +//[任意随机值](https://www.runoob.com/w3cnote/js-random.html) +Math.floor(Math.random() * (max - min + 1) + min); + +// +var arr01 = textSour.value.split("\n"); +//分割字符数组,主要用于淘口令网 +var arr01 = ["打", "哒", "达"]; +//循环语句,i++会在代码被执行后增加一个值 +for (var x = 0; x < arr01.length; x++) { + //存在循环后分割,并跳出循环 + if (taokouling.value.indexOf(arr01[x]) != -1) { + ture_tkl01 = taokouling.value.trim().split(arr01[x])[0]; + break; + } +} + +// https://segmentfault.com/q/1010000006819233 //不重复获取 +for (var i = 0; i < rn; ++i) { + var index = ~~(Math.random() * count) + i; + result[i] = split_result[index]; + split_result[index] = split_result[i]; + count--; + strResult = strResult + result[i] + "\n"; +} +``` + +### 文本框清空 + +input 文本框获取焦点后,自动清空内容。 + +```JavaScript +onfocus = "this.value=''"; +``` + +### 内部文件读取 + +以下代码用于服务器读取文档,本地无法直接使用。 + +```JavaScript +$.ajax({ + url: "./xx.txt", + success: function (result) { + var strs = result.split("\n"); + addTableTR(strs, true); + }, +}); +``` + +### 选择框状态 + +调用 attr 给选择框 radio、checkbox 添加 checked 属性和移调,并不能真实改变不能单选和选中框的真实状态,可用下方代码改变。^[[radio、checkbox 选中状态研究](https://www.cnblogs.com/jimloveq/p/10602060.html)] + +```JavaScript +//取消导航项的 checked,同类名称都会取消 checked 状态 +$("input[name=daoruRadio]").prop("checked", false); +//点击对映 id 的单选框 +$("input[id=Radio1]").prop("checked", true); +``` + +### 复制隐藏内容 + +clipboardjs 可复制隐藏区域内容。 + +```JavaScript +//新设将粘贴板设在特定按钮上,#copyresult 为按钮 id,#CopyValue 为区域 id +var clipboard2 = new ClipboardJS("#copyresult", { + text: function () { + return $("#CopyValue").val(); + }, +}); + +clipboard2.on("success", function (e) { + toastr["success"]("复制成功!"); +}); + +clipboard2.on("error", function (e) { + toastr["error"]("复制失败,请手动重新复制!"); +}); +``` + +### 引入 html 页面 + +利用 link 标签的 rel=import 引入 html 页面 + +```html + +``` + +### 视频全屏弹窗 + +品牌首页经常需要在动加载视频,可将下方代码放入首页源码的 body 区。 + +```html + + + + +``` + +插入视频代码 + +```html +
+ +
+``` diff --git a/docs/code/Markdown.md b/docs/code/Markdown.md new file mode 100644 index 0000000..b31a958 --- /dev/null +++ b/docs/code/Markdown.md @@ -0,0 +1,67 @@ +--- +article: false +title: Markdown +icon: markdown +order: 5 +--- + +Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 + +Markdown 入门:[Markdown 基本撰写和格式语法](https://docs.github.com/cn/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#styling-text),[Markdown 转 HTML 语法介绍](https://theme-hope.vuejs.press/zh/cookbook/markdown/) + +## 图片尺寸 + +md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。 + +```markdown + + + + + +![同时设置宽度和高度](https://files.mdnice.com/logo.png =150x150) +![只设置宽度,推荐使用百分比](https://files.mdnice.com/logo.png =40%x) + + + +![name](https://docsify.js.org/_media/icon.svg "图片说明") +``` + +七牛云图床提供[图片流量优化压缩策略](https://developer.qiniu.com/dora/kb/1627/flow-optimization-compression-of-images),可用于调整图片的分辨率、大小和格式,具体参数请参考[七牛云图片高级处理](https://developer.qiniu.com/dora/8255/the-zoom)。此外,我还会定期使用 PP 鸭对图床中的图片进行重新压缩。 + +```html + +?imageMogr2/thumbnail/!60p + + +?imageMogr2/thumbnail/500x + + +?imageMogr2/thumbnail/500x/strip/quality/50/format/webp +``` + +## 资料引用 + +文章中加 `^[引用内容]` 会在底部自动添加引用资料。如果想添加链接标题,则为 `^[[标题](链接)]`。 + +如果同一引用要在多个地方使用,则需要手动编号。 + +```markdown +这是一条引用 [^1] +这是一条引用 [^2] +这是一条引用 [^1] +这是一条引用 [^3] +[^1]:链接 +[^2]:[标题](链接) +[^3]:
![图片描述](图片链接) +``` + +## 代码块自动换行 + +自动换行需要 css 支持,暂不能自动启用。 + +## 整段删除线 + +`~~` 只支持对本行内容添加删除线。 + +如果要对大段内容添加删除线,可以用 HTML 标签 `` 和 ``,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。 diff --git a/docs/code/Python.md b/docs/code/Python.md new file mode 100644 index 0000000..9073cef --- /dev/null +++ b/docs/code/Python.md @@ -0,0 +1,297 @@ +--- +article: false +title: Python +icon: python +order: 3 +--- + +Python 很久没用了,暂时只做记录作用。 + +## 入门文档 + +- [Python3 语法](http://www.runoob.com/python3/python3-basic-syntax.html) +- [Scrapy 入门](http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html#intro-tutorial) + 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 +- [requests](https://requests.readthedocs.io/zh_CN/latest/) 模块 - 获取数据 +- [BeautifulSoup4](https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/) 模块 - 解析 HTML +- [openpyxl](https://openpyxl.readthedocs.io/en/stable/) 模块 - 读写 Excel 文件 +- Pillow 模块 - 图片 +- re 模块 - 正则表达式 + +## 简单示例 + +```python +import requests #载入指定库 +headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0', 'Content-Type': 'text/html; charset=utf-8'} +r = requests.get("", headers=headers) +#r.encoding = 'utf-8' #如果没设置表头,可以设置编码防止中文出现乱码 +r.encoding = r.apparent_encoding #使用网页固定编码 +print(r.text) +print(r.headers) + +from bs4 import BeautifulSoup +soup = BeautifulSoup(r.text, "html.parser") +print(soup.title.string) + +from PIL import Image + +# 打开一个 jpg 图像文件,注意是当前路径 +im = Image.open('test.jpg') +# 获得图像尺寸 +w, h = im.size +print('Original image size: %sx%s' % (w, h)) +# 缩放到 50% +im.thumbnail((w//2, h//2)) +print('Resize image to: %sx%s' % (w//2, h//2)) +# 把缩放后的图像用 jpeg 格式保存 +im.save('thumbnail.jpg', 'jpeg') +``` + +`if __name__ = "__main__"` 是只在主程序中运行,如果是作为模块引用,则不运行。 +`sys.path.append("c:\\\\Python37\\\\test)` 添加模块的搜索路径文件夹。`\\` 在 Pythone 中会转义,所以要输入两个。 + +## 基础语法 + +```python +# end=" "为后缀,可空,默认为换行符 +print("密码不能含有“*”,你还有",count,"次机会", end=" ") + +# ''' 三引号可以用多行,或在每行后添加 \\ ,或每行用引号括起来 + +type(a) #判别变量种类,容易出问题,不要用于判定 +isinstance(a,float) #判断变量是否是该类型,主要使用 + +# s 为字符串 +s.isalnum() #所有字符都是数字或者字母,为真返回 True, 否则返回 False +s.isalpha() #所有字符都是字母,为真返回 True, 否则返回 False +s.isdigit() #所有字符都是数字,为真返回 True, 否则返回 False +s.islower() #所有字符都是小写,为真返回 True, 否则返回 False +s.isupper() #所有字符都是大写,为真返回 True, 否则返回 False +s.istitle #所有单词都是首字母大写,为真返回 True, 否则返回 False +s.isspace #所有字符都是空白字符,为真返回 True, 否则返回 False +``` + +## 序列类型 + +```python +#列表 +list =[1,2,3,"a","b"] +list.append([4,1]) +list =[1,2,3,"a","b",[4,1]] #append() 函数是方法向列表的尾部添加一个新的元素 + +#元组 +tuple = (1,2,3,"a","b") +tuple = (1,) #元组只有一个元素时,必须在后面加逗号 + +#字符串 +set() 是个集合函数,括号里的参数可以是字典类型,列表类型,元组类型,字符串类型,不能是数字类型。 +s1 = "abc123" +s2 = "abc,123" +s2.split(",")) #字符串分割后变为列表,使用逗号进行分割 ["abc",123] +print("|".join(list)) #join 只能对字符串进行操作,用"|"中的符号连接字符串,比如 ab + +r1 = range(1, 4) + +#集合是无序列的,每次出现顺序都不同,不支持按索引提取 +set() +set1 = set(list) =([1,2,3,"a","b"]) +college1 = {"哲学", "经济学", "法学"} +print(college1) #每次集合排列顺序是随机的 +college2 = set(["哲学", "经济学", "法学"]) #将其他数据转换为集合 + +#字典 +dict() +{} +``` + +## 字符串用法 + +```python +len(string) #返回字符串长度 +join(seq) # 以指定字符串作为分隔符,将 seq 中所有的元素 (的字符串表示) 合并为一个新的字符串 +startswith(str, beg=0,end=len(string)) #检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。 +endswith(suffix, beg=0, end=len(string)) # 检查字符串是否以 obj 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. + +count(str, beg= 0,end=len(string)) # 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 +find(str, beg=0 end=len(string)) #检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回 -1 +rfind(str, beg=0,end=len(string)) #类似于 find() 函数,不过是从右边开始查找。 +index(str, beg=0, end=len(string)) # 跟 find() 方法一样,只不过如果 str 不在字符串中会报一个异常。 +rindex( str, beg=0, end=len(string)) #类似于 index(),不过是从右边开始。 + +strip([chars]) #在字符串上执行 lstrip() 和 rstrip(),移除头尾指定字符 +replace(old, new [, max]) #把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。 +split(str="", num=string.count(str)) #num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串 +splitlines([keepends]) #按照行 ('\\r', '\\r\\n', \\n') 分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。 + +lower() #转换字符串中所有大写字符为小写。 +upper() #转换字符串中的小写字母为大写 +swapcase() #将字符串中大写转换为小写,小写转换为大写 +``` + +## 运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------- | --------------------------------------- | +| % | 取模 - 返回除法的余数 | 21 % 10 输出结果 1 | +| \*\* | 幂 - 返回 x 的 y 次幂 | 10\*\*21 为 10 的 21 次方 | +| // | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 | + +优先级:not > and > or +not 1 or 0 and 1 or 3 and 4 or 5 +(not 1) or (0 and 1) or (3 and 4) or 5 + +![Python 运算符优先级](https://img.gpt-vip.top/2022-06-29-18-18-44.png?imageMogr2/format/webp) + +## 条件三元表达式 + +```python +x, y = 4, 5 +if x < y: + small = x +else: + small = y +# 可以缩略为下面一句 +small = x if x < y else y + +x,y,z=6,5,5 +if x 4 +``` + +```python +#条件循环参考,用户只有三次输入错误,内容中包含“*”不计算在内 +count=3 +password="xxxxdfd" + +while count: # 0 为 False,其他为 True + passwd = input("请输入密码:") + if passwd == password: + print("密码正确,进入程序") + break + elif "*" in passwd: + # end=" "为后缀,可空,默认为换行符 + print("密码不能含有“*”,你还有",count,"次机会", end=" ") + continue + else: + print("密码错误,你还有",count-1,"次机会", end=" ") + count-=1 +``` + +## range() 函数 + +range(stop) + +range(start, stop[, step]) + +range 函数具有一些特性: + +- 如果 step 参数缺省,默认 1;如果 start 参数缺省,默认 0。 +- 如果 step 是正整数,则最后一个元素(start + i \_ step)小于 stop。 +- 如果 step 是负整数,则最后一个元素(start + i \_ step)大于 stop。 +- step 参数必须是非零整数,否则抛出 VauleError 异常。 + +## 向列表添加元素 + +[向列表添加元素](http://www.runoob.com/python/python-lists.html) + +```python +list =[1,"xxxx",3.14,[1,3,3]] +list.append(3) # 添加元素 +list.extend([1,2,"或"]) # 添加列表 +list.insert(index, obj) # index -- 对象 obj 需要插入的索引位置 (从 0 开始 ); obj -- 要插入列表中的对象。 + +list.remove("xxxx") # 删除第一个含有相同内容的元素 +del list[2] #删除指定索引位置的元素 +list.pop(obj=list[-1]) #obj -- 可选参数,从列表要移除指定索引位置的对象,默认为最后以为,返回被移出的元素对象 + +list.reverse() #将列表彻底反转 +list.sort() #从小往大排训 +list.sort(reverse=True) #从大往小排序 + +将指定列表的小甲鱼改为小鱿鱼 +list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18] +list1[1][2][0] = '小鱿鱼' +``` + +## 列表切片 + +L = ['Google', 'Runoob', 'Taobao'] + +L(start: stop[: step]) step 可以使用负数,从尾部往左走。 + +| 结果 Python 表达式 | 结果 | 描述 | +| ------------------ | ------------------------------ | ------------------------ | +| L[2] | 'Taobao' | 读取列表中第三个元素 | +| L[-2] | 'Runoob' | 读取列表中倒数第二个元素 | +| L[1:] | ['Runoob', 'Taobao'] | 从第二个元素开始截取列表 | +| L[:] | ['Google', 'Runoob', 'Taobao'] | 获取完整列表 | + +元祖 tuple 与列表 list 用法类似,但元祖不能直接修改元素,只能用切片的方法来修改 + +```python +temp=(1,"xxxxx","迷途",2) #元祖 +temp=temp[:2]+(“y”,)+temp[2:] +del temp #删除元祖 +``` + +### 列表解析 + +```python +list1 = [x**2 for x in range(10)] #list1 为 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] +#相当于 +list1 = [] +for x in range(10): + list1.append(x**2) + +>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0] +#相当于 +list1 = [] +for x in range(10): + for y in range(10): + if x%2==0: + if y%2!=0: + list1.extend([(x,y)]) +print(list1) +``` + +## 变量 + +Python 变量是贴标签,而非存储数据 + +```python +list1=[1,3,2,9,7,8] +list2=list1[:] +list3=list1 +# list2 和 list3 的值此时相同,但一旦对 list1 内部进行调整,比如排序、增减变量 +list1.sort() # list3 会随着 list1 发生变化,list2 不变 +``` + +lambda、filter、map + +```python +g=lambda x,y : x+y +g(3,4) +7 +list(filter(lambda x:x%2,range(10))) #过滤 0-9 中能整除 2 的数字 +list(map(lambda x : x%2, range(10))) #罗列 0-9 每个数字乘 2 的结果 +``` diff --git a/docs/code/README.md b/docs/code/README.md new file mode 100644 index 0000000..95941f3 --- /dev/null +++ b/docs/code/README.md @@ -0,0 +1,67 @@ +--- +article: false +title: Coding +icon: code +--- + +代码编程的学习路径: + +- 基础知识:ES6, MySQL,HTML,Markdown,正则表达式 +- 脚本/开发工具:AutoHotkey,Electron +- 编程语言:[TypeScript 4.x](https://www.typescriptlang.org/zh/) + [JavaScript](https://www.javascript.com/) +- 前端框架:[Vue 3.x](https://cn.vuejs.org/) + - 构建工具:[Vite 2.x](https://cn.vitejs.dev/) + - 路由工具:[Vue Router 4.x](https://router.vuejs.org/zh/index.html) + - 状态管理:[Vuex 4.x](https://next.vuex.vuejs.org/) +- UI 框架:[Element Plus](https://element-plus.gitee.io/zh-CN/guide/quickstart.html) + - CSS 预编译:[Stylus](https://stylus-lang.com/) / [Sass](https://sass.bootcss.com/documentation) / [Less](http://lesscss.cn/) + - CSS 后处理器:PostCSS,[tailwindcss](https://www.tailwindcss.cn/docs) +- Node.js 框架:[Midway](https://www.midwayjs.org/docs/intro) +- HTTP 工具:[Axios](https://axios-http.com/) + - Git Hook 工具:[husky](https://typicode.github.io/husky/#/) + [lint-staged](https://github.com/okonet/lint-staged) + - 代码规范:[EditorConfig](http://editorconfig.org) + [Prettier](https://prettier.io/) + [ESLint](https://eslint.org/) + [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript#translation) + - 提交规范:[Commitizen](http://commitizen.github.io/cz-cli/) + [Commitlint](https://commitlint.js.org/#/) + - 单元测试:[vue-test-utils](https://next.vue-test-utils.vuejs.org/) + [jest](https://jestjs.io/) + [vue-jest](https://github.com/vuejs/vue-jest) + [ts-jest](https://kulshekhar.github.io/ts-jest/) + - 自动部署:[GitHub Actions](https://docs.github.com/cn/actions/learn-github-actions) + - [Documate](https://documate.site/):用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。 + +## Visual Studio Code + +本地代码编辑器使用 Visual Studio Code,其插件生态成熟,能实现大部分的需求。 + +GitHub Copilot,CodeGeeX,Tabnine,aiXcoder 插件均可以辅助补全代码。Tabnine 和 aiXcoder 有免费版,可以预测一到两行的代码。CodeGeeX 由清华大学开发,提供完整补全功能。 + +### 修改快捷键 + +选择「菜单栏」>「文件」>「首选项」>「键盘快捷方式」,修改或解绑快捷键。 + +以 PicGo 图床为例,其默认配置放置于 `%AppData%\picgo\data.json`,推荐快捷键为 + +- 剪贴板图片上传:`ctrlOrCmd+alt+q` +- 打开文件管理器上传:`ctrlOrCmd+alt+e` +- 打开输入框输入路径上传:`ctrlOrCmd+alt+x` + +另外,右键对应快捷方式,点击「重置按键绑定」,即可将快捷键设为默认。 + +### 排除文件夹 + +在 VS Code 中点击快捷键 Ctrl/Command+Shift+P,输入「setting」,在设置中添加排除文件夹选项。注意:排除文件夹不能使用全路径,只能使用规则排除。 + +```json +"files.exclude": { + "**/blog": true, //隐藏指定文件夹 + "**/[Pp]lugins": true, //使用中括号时表示不区分大小写 + "**/*.pyc": true, //隐藏所有 pyc 文件 + "**/*.d.ts": true, //隐藏所有 d.ts 文件 +} +``` + +## 在线 IDE + +在线 IDE 最大的优势是开箱即用,无需搭建环境,避免本地环境错误导致的各类 bug。 + +[StackBlitz](https://stackblitz.com/):StackBlitz 界面类似 Visual Studio Code,可以直接 push 和拉取 GitHub 仓库的代码进行查看和编辑,项目支持离线开发,同时所有应用程序会自动部署在其服务器上。^[[六个好用的在线代码编辑器,你选哪个?](https://www.51cto.com/article/718302.html)] + +[CodePen](https://codepen.io/pen/):CodePen 是一个在线的 HTML、CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果,便于项目分享预览。CodePen 也一个庞大的前端社区,上面有来自全球开发者分享的各种各样炫酷的效果,并且这些代码都是开源和共享的。 + +[CodeSandbox](https://codesandbox.io/s/):CodeSandbox 编辑体验与 VSCode 类似,并支持 GitHub 导出、静态文件托管、本地项目导入等。缺点:不能直接导入 GitHub 项目。 diff --git a/docs/code/Regex.md b/docs/code/Regex.md new file mode 100644 index 0000000..2abf82e --- /dev/null +++ b/docs/code/Regex.md @@ -0,0 +1,112 @@ +--- +article: false +title: 正则表达式 +icon: regexp +order: 6 +--- + +正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 + +正则入门:[正则 30 分钟入门](https://deerchao.cn/tutorials/regex/regex.htm),[LEARN REGEX 中文版](https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md) + +## 实用表达式 + +`{}` 限定符 (表示固定位数)。比如:`\\d{5}` 匹配长度有 5 个的数字,`\\d{1,5}` 最少匹配 1 个,最长匹配 5 个数字。 + +`.{30,}` 指匹配长度 30 以上的任意字符串。 + +`[aeiou]` 匹配中括号中任意字符。 +`[^aeiou]` 匹配除了 aeiou 这几个字母以外的任意字符。 + +HTTP 链接匹配:`https?://[^\s"。?,,?)#]+`,句尾不含空格、中英文逗号、中文句号、问号,仅包含 http 和 https 链接 + +万能链接匹配:`[a-zA-Z]+://[^\s"。?,,?)#]+` 匹配万能前缀,如 ftp、tencent、lark。 + +匹配行: + +```javascript +//匹配含某个字符的行 +var ZZMactch = ".*" + inputMatch.value + ".*"; +//匹配不含指定字符的行 +var ZZMactch = "^((?!"+inputMatch.value+").)*$"; +//匹配所有不包括 CSDN 的行 +^((?!CSDN).)*$ +``` + +匹配不同文本组,`id=` 或 `contentId=` 后的多个数字符号 + +```javascript +(?<=id=)\d* +(?<=[?&](id|contentId)=)\d+ +``` + +`^((?!abc).)*admin((?!abc).)*$` 匹配 不包含 abc 但包含 admin 的字符串,匹配整行。^[[正则表达式匹配:包含且不包含](https://blog.csdn.net/thewindkee/article/details/52785763)] + +`((?!social.tmall.com)(?!ugc/detail.html).)*$` 匹配不包含 `social.tmall.com` 和 `ugc/detail.html` 的字符串,匹配整行。^[[正则表达式匹配不包含某些字符串的技巧](https://blog.csdn.net/xiiii/article/details/89450341)] + +`[₳$¢₴€₤¥$《]([a-zA-Z0-9]{11})[₳$¢₴€₤¥$《]` 匹配淘口令,`[]` 指中内容任意匹配一项皆可。 + +### 前后匹配 + +前后匹配,前后元素只能出现一次,否则容易覆盖过多。 + +```javascript +//匹配任意以 a 开头并以 b 结尾的字符,匹配内容不含 a、b +//如果 a 有 n 个,则同一行也会匹配 n 次 +(?<=a).+(?=b) + +//如果 b 有 n 个,则匹配最后一个 b; +//如果需要匹配第一个 b,则匹配区加懒惰限定符?,代表重复 1 次或更多次,但尽可能少重复 +(?<=.*a).+?(?=b) + +//匹配任意以 a 开头并以 b 结尾的字符,匹配内容包含 a、b +a(?<=a).+(?=b)b + +//匹配字符串中 a 和词组 abc 间的字符,如果 abc 不存在则去尾部 +(?<=.*a).+(?=abc) +``` + +### 正则替换 + +正则全局替换不能带 `\\`,此时用分割替换更方便。 + +```javascript +var str = "dogdogdog"; +var str2 = str.replace(/dog/g,"cat"); #全局替换 +var str2 = str.split("dog").join("cat"); #分割替换 +``` + +## 表达式修饰符 + +元字符:区分大小写 + +| 常用正则代码 | 说明 | +| ------------- | ----------------------------------------------- | +| . | 匹配除换行符以外的任意字符 | +| \* | 匹配 0 个或多个.(有多少匹配多少,贪婪模式) | +| ? | 匹配 0 个或 1 个 (至少匹配一个) | +| $ | 以什么结尾的,如`\\d+0$` (以 0 结尾) | +| ^ | 以什么开头的,如`^http`匹配以 http 开头的字符串 | +| \w | 匹配字母或数字或下划线或汉字 | +| \W | 匹配任意不是字母,数字,下划线,汉字的字符 | +| \d | 匹配数字 | +| \D | 匹配任意非数字的字符 | +| \s | 匹配任意的空白符(空格 ,制表符 ) | +| \S | 匹配任意不是空白符的字符 | +| \r | 回车符 | +| \n | 换行符 (一般情况下使用\r\n 匹配回车换行) | +| \t | 制表符,Tab | +| \u4e00-\u9fa5 | 非中文 | + +常用分组语法 + +| 分类 | 代码/语法 | 说明 | +| -------- | -------------- | -------------------------------------------------------------------- | +| 捕获 | (exp) | 匹配 exp,并捕获文本到自动命名的组里 | +| | `(?exp)` | 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp) | +| | (?:exp) | 匹配 exp,不捕获匹配的文本,也不给此分组分配组号 | +| 零宽断言 | (?=exp) | 匹配 exp 前面的位置 | +| | (?<=exp) | 匹配 exp 后面的位置 | +| | (?!exp) | 匹配后面跟的不是 exp 的位置 | +| | (? +// component:传递参数必须为 `modelValue`,传递方法必须为 `update:modelValue` +app.component('counter', { + props: ['modelValue'], + methods: { + handleClick() { + this.$emit('update:modelValue', this.modelValue + 3); + }, + }, + template: ` +
{{modelValue}}
+`, +}); + +// v-model 传递多个参数 count 和 count1 +// template + +// component +app.component('counterx', { + props: ['count', 'count1'], + methods: { + handleClick2() { + this.$emit('update:count', this.count + 1); + }, + handleClick3() { + this.$emit('update:count1', this.count1 + 10); + }, + }, + template: ` +
{{count}}
+
{{count1}}
+`, +}); +``` + +## 组件命名 + +全局组件,建议「小写字母单词,单次间用横线间隔」;局部组件,建议「每个单次都用大写字母开头(驼峰命名)」。按这个规则命名,Vue 才能自动转换。 + +```JavaScript +// Vue 会自动将 Counter(局部组件)转为 counter(全局组件),将 HelloWorld(局部组件)转为 hello-world(局部组件)。 +const Counter = { + data() { + return { + count: 1, + }; + }, + template: `
{{count}}
`, +}; + +const HelloWorld = { + template: `
hello world
`, +}; + +const app = Vue.createApp({ + // 引入局部组件(需放在引入之前) + components: { + // 手动定位 + // counter: Counter, + // 'hello-world': HelloWorld, + Counter, + HelloWorld, + }, + template: ` +
+ 11111111 + 222222 +
+`, +}); +``` + +## CDN 使用 vue + +```html + +
{{ message }}
+ + +``` + +使用 `
` 来引入 html 元素,功能类似于 `innerHTML`,不能加载外部 HTML,实现 `` 类似的功能。 diff --git a/docs/deploy/CloudServices.md b/docs/deploy/CloudServices.md new file mode 100644 index 0000000..0785d2d --- /dev/null +++ b/docs/deploy/CloudServices.md @@ -0,0 +1,74 @@ +--- +article: false +title: 云计算服务 +icon: class +order: 2 +--- + +## CDN + +国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 + +### 静态文件 + +静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.gpt-vip.top。 + +### 图床 + +自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。 + +曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。 + +### 全站加速 + +使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。 + +- 一个 CDN 只能为一个域名加速,加速的域名即为目标域名。 +- CDN 服务商可能要求使用其自有 DNS,比如阿里云。 +- 如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。 +- 迁移阿里云 DNS 时,注意关闭**静态协议跟随回源,否则会网站重复调整**。 + +## 第三方服务 + +### Vercel + +Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。 + +如果你的项目超出流量,可以参考 [How do I use a Cloudflare domain with Vercel?](https://vercel.com/guides/using-cloudflare-with-vercel),使用 CloudFlare 进行代理,但需注意检查是否出现过多重定向。在国内可能定位到被屏蔽的 CloudFlare 节点,从而导致有时无法访问。Vercel 现已支持国内电话认证。如流量超出不多,可切换账户部署。 + +### fly.io + +Fly.io 是一家提供容器化部署的服务商,能根据流量动态调整资源。由于国内无法部署 Google Auth,因此我将认证服务放在 Fly.io 上,使用了两台 shared-cpu-1x@512MB 的机器,每月账单 1.5 刀。但不清楚是不是配置不够,fly.io 的机器很容易报错。 + +```shell +# 初次构建 +fly launch +# 部署,官方建议开两台机器 +flyctl deploy + +# 将机器内存改为 512 +fly scale memory 512 +# 控制机器数量,默认为 2 +fly scale count 2 +# 无法连接docker,则使用 +fly wireguard websockets enable +``` + +### CloudFlare Tunnel + +CloudFlare Tunnel 可作为 NAS 的轻量级扩展,一个 Tunnel 能将多个服务托管到不同的子域名。具体部署流程,请参考 [CloudFlare Tunnel 免费内网穿透的简明教程](https://sspai.com/post/79278)。需注意,该服务与宝塔的官方 Docker 镜像存在冲突,因此不要同时使用。 + +目前,我已通过 CloudFlare Tunnel 部署了 RSS 订阅源、GoogleAuth、PodCast 等服务。 + +```shell +# 本地 Dockerfile 架构镜像 +sudo docker build -t strapiauth . +sudo docker run -d -p 1337:1337 --name strapiauth strapiauth + +# tunnel +sudo docker run --name cloudflaretunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token +``` + +### 腾讯云境外 + +腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。 diff --git a/docs/deploy/Cloudflare.md b/docs/deploy/Cloudflare.md new file mode 100644 index 0000000..301bc53 --- /dev/null +++ b/docs/deploy/Cloudflare.md @@ -0,0 +1,539 @@ +--- +article: false +title: Cloudflare +icon: proxy +order: 5 +--- + +官方文档:[Cloudflare Docs](https://developers.cloudflare.com/) + +Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 + +但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 + +## 反向代理 + +Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。 + +### 镜像整个网站 + +```javascript +// 替换成你想镜像的站点 +const upstream = "www.youtube.com"; + +// 如果那个站点有专门的移动适配站点,否则保持和上面一致 +const upstream_mobile = "www.youtube.com"; + +// 你希望禁止哪些国家访问 +const blocked_region = ["RU"]; + +// 禁止自访问 +const blocked_ip_address = ["0.0.0.0", "127.0.0.1"]; + +// 替换成你想镜像的站点 +const replace_dict = { + $upstream: "$custom_domain", + "//www.youtube.com": "", +}; + +//以下内容都不用动 +addEventListener("fetch", (event) => { + event.respondWith(fetchAndApply(event.request)); +}); + +async function fetchAndApply(request) { + const region = request.headers.get("cf-ipcountry").toUpperCase(); + const ip_address = request.headers.get("cf-connecting-ip"); + const user_agent = request.headers.get("user-agent"); + + let response = null; + let url = new URL(request.url); + let url_host = url.host; + + if (url.protocol == "http:") { + url.protocol = "https:"; + response = Response.redirect(url.href); + return response; + } + + if (await device_status(user_agent)) { + upstream_domain = upstream; + } else { + upstream_domain = upstream_mobile; + } + + url.host = upstream_domain; + + if (blocked_region.includes(region)) { + response = new Response( + "Access denied: WorkersProxy is not available in your region yet.", + { + status: 403, + } + ); + } else if (blocked_ip_address.includes(ip_address)) { + response = new Response( + "Access denied: Your IP address is blocked by WorkersProxy.", + { + status: 403, + } + ); + } else { + let method = request.method; + let request_headers = request.headers; + let new_request_headers = new Headers(request_headers); + + new_request_headers.set("Host", upstream_domain); + new_request_headers.set("Referer", url.href); + + let original_response = await fetch(url.href, { + method: method, + headers: new_request_headers, + }); + + let original_response_clone = original_response.clone(); + let original_text = null; + let response_headers = original_response.headers; + let new_response_headers = new Headers(response_headers); + let status = original_response.status; + + new_response_headers.set("access-control-allow-origin", "*"); + new_response_headers.set("access-control-allow-credentials", true); + new_response_headers.delete("content-security-policy"); + new_response_headers.delete("content-security-policy-report-only"); + new_response_headers.delete("clear-site-data"); + + const content_type = new_response_headers.get("content-type"); + if (content_type.includes("text/html") && content_type.includes("UTF-8")) { + original_text = await replace_response_text( + original_response_clone, + upstream_domain, + url_host + ); + } else { + original_text = original_response_clone.body; + } + + response = new Response(original_text, { + status, + headers: new_response_headers, + }); + } + return response; +} + +async function replace_response_text(response, upstream_domain, host_name) { + let text = await response.text(); + + var i, j; + for (i in replace_dict) { + j = replace_dict[i]; + if (i == "$upstream") { + i = upstream_domain; + } else if (i == "$custom_domain") { + i = host_name; + } + + if (j == "$upstream") { + j = upstream_domain; + } else if (j == "$custom_domain") { + j = host_name; + } + + let re = new RegExp(i, "g"); + text = text.replace(re, j); + } + return text; +} + +async function device_status(user_agent_info) { + var agents = [ + "Android", + "iPhone", + "SymbianOS", + "Windows Phone", + "iPad", + "iPod", + ]; + var flag = true; + for (var v = 0; v < agents.length; v++) { + if (user_agent_info.indexOf(agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} +``` + +### 镜像网站指定目录 + +```javascript +// 你要镜像的网站。 +const upstream = "objectstorage.ap-seoul-1.oraclecloud.com"; + +// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可。 +const upstream_path = "/test/"; + +// 镜像站是否有手机访问专用网址,没有则填一样的。 +const upstream_mobile = "objectstorage.ap-seoul-1.oraclecloud.com"; + +// 屏蔽国家和地区。 +const blocked_region = [""]; + +// 屏蔽 IP 地址。 +const blocked_ip_address = ["0.0.0.0", "127.0.0.1"]; + +// 镜像站是否开启 HTTPS. +const https = true; + +// 文本替换。填你要镜像的网站 +const replace_dict = { + $upstream: "$custom_domain", + "//objectstorage.ap-seoul-1.oraclecloud.com": "", +}; + +// 以下保持默认,不要动 +addEventListener("fetch", (event) => { + event.respondWith(fetchAndApply(event.request)); +}); + +async function fetchAndApply(request) { + const region = request.headers.get("cf-ipcountry").toUpperCase(); + const ip_address = request.headers.get("cf-connecting-ip"); + const user_agent = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"; + + let response = null; + let url = new URL(request.url); + let url_hostname = url.hostname; + + if (https == true) { + url.protocol = "https:"; + } else { + url.protocol = "http:"; + } + + if (await device_status(user_agent)) { + var upstream_domain = upstream; + } else { + var upstream_domain = upstream_mobile; + } + + url.host = upstream_domain; + if (url.pathname == "/") { + url.pathname = upstream_path; + } else { + url.pathname = upstream_path + url.pathname; + } + + if (blocked_region.includes(region)) { + response = new Response( + "Access denied: WorkersProxy is not available in your region yet.", + { + status: 403, + } + ); + } else if (blocked_ip_address.includes(ip_address)) { + response = new Response( + "Access denied: Your IP address is blocked by WorkersProxy.", + { + status: 403, + } + ); + } else { + let method = request.method; + let request_headers = request.headers; + let new_request_headers = new Headers(request_headers); + + new_request_headers.set("Host", url.hostname); + new_request_headers.set("Referer", url.hostname); + + let original_response = await fetch(url.href, { + method: method, + headers: new_request_headers, + }); + + let original_response_clone = original_response.clone(); + let original_text = null; + let response_headers = original_response.headers; + let new_response_headers = new Headers(response_headers); + let status = original_response.status; + + new_response_headers.set("access-control-allow-origin", "*"); + new_response_headers.set("access-control-allow-credentials", true); + new_response_headers.delete("content-security-policy"); + new_response_headers.delete("content-security-policy-report-only"); + new_response_headers.delete("clear-site-data"); + + const content_type = new_response_headers.get("content-type"); + if (content_type.includes("text/html") && content_type.includes("UTF-8")) { + original_text = await replace_response_text( + original_response_clone, + upstream_domain, + url_hostname + ); + } else { + original_text = original_response_clone.body; + } + + response = new Response(original_text, { + status, + headers: new_response_headers, + }); + } + return response; +} + +async function replace_response_text(response, upstream_domain, host_name) { + let text = await response.text(); + + var i, j; + for (i in replace_dict) { + j = replace_dict[i]; + if (i == "$upstream") { + i = upstream_domain; + } else if (i == "$custom_domain") { + i = host_name; + } + + if (j == "$upstream") { + j = upstream_domain; + } else if (j == "$custom_domain") { + j = host_name; + } + + let re = new RegExp(i, "g"); + text = text.replace(re, j); + } + return text; +} + +async function device_status(user_agent_info) { + var agents = [ + "Android", + "iPhone", + "SymbianOS", + "Windows Phone", + "iPad", + "iPod", + ]; + var flag = true; + for (var v = 0; v < agents.length; v++) { + if (user_agent_info.indexOf(agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} +``` + +### 镜像网站带密码访问 + +```javascript +// 替换成你想镜像的站点 +const upstream = "google.com"; + +// 如果那个站点有专门的移动适配站点,否则保持和上面一致 +const upstream_mobile = "m.google.com"; + +// 密码访问 + +const openAuth = false; +const username = "username"; +const password = "password"; + +// 你希望禁止哪些国家访问 +const blocked_region = ["RU"]; + +// 禁止自访问 +const blocked_ip_address = ["0.0.0.0", "127.0.0.1"]; + +// 替换成你想镜像的站点 +const replace_dict = { + $upstream: "$custom_domain", + "//google.com": "", +}; + +function unauthorized() { + return new Response("Unauthorized", { + headers: { + "WWW-Authenticate": 'Basic realm="goindex"', + "Access-Control-Allow-Origin": "*", + }, + status: 401, + }); +} + +function parseBasicAuth(auth) { + try { + return atob(auth.split(" ").pop()).split(":"); + } catch (e) { + return []; + } +} + +function doBasicAuth(request) { + const auth = request.headers.get("Authorization"); + + if (!auth || !/^Basic [A-Za-z0-9._~+/-]+=*$/i.test(auth)) { + return false; + } + + const [user, pass] = parseBasicAuth(auth); + return user === username && pass === password; +} + +async function fetchAndApply(request) { + if (request.method === "OPTIONS") + // allow preflight request + return new Response("", { + status: 200, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "*", + "Access-Control-Allow-Methods": "GET, POST, PUT, HEAD, OPTIONS", + }, + }); + + if (openAuth && !doBasicAuth(request)) { + return unauthorized(); + } + const region = request.headers.get("cf-ipcountry").toUpperCase(); + const ip_address = request.headers.get("cf-connecting-ip"); + const user_agent = request.headers.get("user-agent"); + + let response = null; + let url = new URL(request.url); + let url_host = url.host; + + if (url.protocol == "http:") { + url.protocol = "https:"; + response = Response.redirect(url.href); + return response; + } + + if (await device_status(user_agent)) { + upstream_domain = upstream; + } else { + upstream_domain = upstream_mobile; + } + + url.host = upstream_domain; + + if (blocked_region.includes(region)) { + response = new Response( + "Access denied: WorkersProxy is not available in your region yet.", + { + status: 403, + } + ); + } else if (blocked_ip_address.includes(ip_address)) { + response = new Response( + "Access denied: Your IP address is blocked by WorkersProxy.", + { + status: 403, + } + ); + } else { + let method = request.method; + let request_headers = request.headers; + let new_request_headers = new Headers(request_headers); + + new_request_headers.set("Host", upstream_domain); + new_request_headers.set("Referer", url.href); + + let original_response = await fetch(url.href, { + method: method, + headers: new_request_headers, + }); + + let original_response_clone = original_response.clone(); + let original_text = null; + let response_headers = original_response.headers; + let new_response_headers = new Headers(response_headers); + let status = original_response.status; + + new_response_headers.set("access-control-allow-origin", "*"); + new_response_headers.set("access-control-allow-credentials", true); + new_response_headers.delete("content-security-policy"); + new_response_headers.delete("content-security-policy-report-only"); + new_response_headers.delete("clear-site-data"); + + const content_type = new_response_headers.get("content-type"); + if (content_type.includes("text/html") && content_type.includes("UTF-8")) { + original_text = await replace_response_text( + original_response_clone, + upstream_domain, + url_host + ); + } else { + original_text = original_response_clone.body; + } + + response = new Response(original_text, { + status, + headers: new_response_headers, + }); + } + return response; +} + +addEventListener("fetch", (event) => { + event.respondWith( + fetchAndApply(event.request).catch((err) => { + console.error(err); + new Response(JSON.stringify(err.stack), { + status: 500, + headers: { + "Content-Type": "application/json", + }, + }); + }) + ); +}); + +async function replace_response_text(response, upstream_domain, host_name) { + let text = await response.text(); + + var i, j; + for (i in replace_dict) { + j = replace_dict[i]; + if (i == "$upstream") { + i = upstream_domain; + } else if (i == "$custom_domain") { + i = host_name; + } + + if (j == "$upstream") { + j = upstream_domain; + } else if (j == "$custom_domain") { + j = host_name; + } + + let re = new RegExp(i, "g"); + text = text.replace(re, j); + } + return text; +} + +async function device_status(user_agent_info) { + var agents = [ + "Android", + "iPhone", + "SymbianOS", + "Windows Phone", + "iPad", + "iPod", + ]; + var flag = true; + for (var v = 0; v < agents.length; v++) { + if (user_agent_info.indexOf(agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} +``` diff --git a/docs/deploy/DNS.md b/docs/deploy/DNS.md new file mode 100644 index 0000000..4b3a446 --- /dev/null +++ b/docs/deploy/DNS.md @@ -0,0 +1,14 @@ +--- +article: false +title: 域名 DNS 托管 +icon: sitemap +order: 6 +--- + +国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 + +- DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 +- 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。 +- 子域名可以使用 [NS 记录](https://help.aliyun.com/document_detail/29725.html?#h2-ns-7),托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。 + +域名 DNS 服务器修改(阿里云): diff --git a/docs/deploy/GitHub.md b/docs/deploy/GitHub.md new file mode 100644 index 0000000..17e158d --- /dev/null +++ b/docs/deploy/GitHub.md @@ -0,0 +1,126 @@ +--- +article: false +title: GitHub +icon: github +order: 4 +--- + +## GitHub Actions + +GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 `main.yml`,放于 `.github\workflows` 目录下,repo 发生指定调节的改变时,Actions 会自动运行。^[[了解 GitHub Actions](https://docs.github.com/cn/actions/learn-github-actions/understanding-github-actions)] + +- [GitHub Actions 官方市场](https://github.com/marketplace?type=actions) +- [Awesome Actions](https://github.com/sdras/awesome-actions) + +如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 `${{ secrets.PERSONAL_TOKEN }}` 来指代该密钥。 + +### 不同仓库间复制 + +复制文件到目的地,文档没变化则不会执行。案例为将当前仓库 main 分支下 docs 的 README.md 文件复制到另一个仓库 libaxuan/LearnHubs/ 路径下,如果目标路径存在相同文件,则将覆盖。如果让 `clean: true` 生效,Actions 会将目标路径情况,然后执行复制。 + +此动作需按 [Creating a personal access token](https://docs.github.com/cn/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token) 建立[个人访问令牌](https://github.com/settings/tokens),勾选权限「repo Full control of private repositories」,然后将该 token 值其保存在项目仓库的 Action 密钥。 + +```yml +- name: Copy file + uses: andstor/copycat-action@v3 + with: + personal_token: ${{ secrets.PERSONAL_TOKEN }} + src_path: docs/README.md + dst_path: / + dst_owner: rockbenben + dst_repo_name: LearnHubs + dst_branch: main + src_branch: main + #clean: true +``` + +### Actions 失败重试 + +在 job 和 step 中使用 if 语句,只有满足条件时才执行具体的 job 或 step。^[[最全总结,GitHub Action 自动化部署](https://blog.csdn.net/Ber_Bai/article/details/120310024)] + +```bash +# 任务状态检查函数 +success() # 当上一步执行成功时返回 true +always() # 总是返回 true +cancelled() # 当 workflow 被取消时返回 true +failure() # 当上一步执行失败时返回 true +``` + +first_step 会总是执行,second_step 需要上一步 first_step 执行成功才会执行,third_step 只有上一步 second_step 执行失败才执行。当 third_step 与 second_step 命令相同时,就可以达到失败重试的效果了。 + +```yml +jobs: + first_job: + name: My first job + runs-on: ubuntu-latest + steps: + - name: first_step + if: always() + + - name: second_step + if: success() + + - name: third_step + if: failure() +``` + +### uses 版本号 + +`uses: SamKirkland/FTP-Deploy-Action@4.3.1`:uses 会指定此步骤运行 SamKirkland/FTP-Deploy-Action 存储库中的 4.3.1 版本。 + +但有时 Actions 的版本不会这么快更新,又必须使用最新版,可以将版本号改为 branch name,比如 `uses: SamKirkland/FTP-Deploy-Action@master`。 + +## Git Commit + +标准化的 Commit message 可以提供清晰、易读的历史记录,使我们更容易理解每个提交的目的和内容,这有助于追踪和审查代码变更。通过 [conventional-changelog-cli](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli) 可以自动生成 CHANGELOG.md。建议都按照 [Conventional Commits](https://www.conventionalcommits.org/zh-hans/) 的规范来进行提交。 + +```shell +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### Type + +Type 用于说明 git commit 的类别,只允许使用下面的标识。^[[Git Commit 规范](https://www.jianshu.com/p/6433679cd10f)] + +- feat: 新特性或功能(feature) +- fix: 修复 bug +- docs: 文档更新(documentation) +- style: 代码风格或者组件样式更新(不影响代码运行的变动) +- refactor: 代码重构,不引入新功能和缺陷修复 +- perf: 优化相关,比如提升性能、体验 +- test: 增加测试 +- chore: 构建过程或辅助工具的变动 +- revert: 回滚到上一个版本 + +### Scope + +Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。如果其中包含了多个 scope,可以使用 `*` 代替。 + +### Footer + +如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。^[[Commit message 和 Change log 编写指南](http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html)] + +如果当前 commit 针对某个 issue,那么可以在 Footer 部分使用 `Closes #265` 关闭这个 issue。也可以在任意位置输入 `#265`,将 commit 与对应问题相关联。 + +## 常见问题 + +### GitHub 忽略指定文件 + +项目路径新建一个命名为 .gitignore 的文件,将想要忽略的文件夹和文件写入 .gitignore 文件,换行分隔。 + +比如要忽略 node_modules 文件夹,就直接在文件中输入 node_modules。 + +### 添加 Github 源作为依赖 + +一般情况下,依赖包会使用 npm 进行管理。但有时开发者可能并不会立即更新到 npm 上,这时我们可以选择使用 GitHub 源作为备用方案。 + +另外,在国内服务器连接不上 GitHub 的情况下,可以先使用 npm 安装依赖包,然后手动替换 node_modules 目录中对应的源为下载好的文件。 + +```shell +yarn add strapi-google-auth +yarn add https://github.com/arjusmoon860/strapi-google-auth.git +``` diff --git a/docs/deploy/MySQL.md b/docs/deploy/MySQL.md new file mode 100644 index 0000000..86babc7 --- /dev/null +++ b/docs/deploy/MySQL.md @@ -0,0 +1,35 @@ +--- +article: false +title: 数据库管理 +icon: mysql +order: 3 +--- + +我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 + +## 本地 MySQL 使用 + +在 Windows 平台上,你需要首先安装 [MySQL Server](https://downloads.mysql.com/archives/installer/),然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。 + +## 数据库恢复 + +数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 "SQL",然后将你的 SQL 代码粘贴到执行窗口,最后点击 "Go" 按钮以运行代码。字段的分隔通常以 `-- Table structure for table xxx` 开始。 + +如果出现错误 `#1217 - Cannot delete or update a parent row: a foreign key constraint fails`,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查: + +```sql +-- 禁用外键约束检查 +SET FOREIGN_KEY_CHECKS=0; + +-- 执行您的操作... + +-- 启用外键约束检查 +SET FOREIGN_KEY_CHECKS=1; + +``` + +## 数据库启动失败或损坏 + +1. 在 MySQL 配置文件中,找到 `mysqld` 行并添加 `innodb_force_recovery=4`。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。 +2. 在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。 +3. 重新导入数据库。 diff --git a/docs/deploy/Static.md b/docs/deploy/Static.md new file mode 100644 index 0000000..fd5650b --- /dev/null +++ b/docs/deploy/Static.md @@ -0,0 +1,170 @@ +--- +article: false +title: 静态部署 +icon: generic +order: 1 +--- + +## 静态托管 + +如果在国内静态资源库找不到所需的静态包,建议使用 `npm i` 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 + +静态资源库: + +- [Staticfile CDN](https://www.staticfile.org/):国内维护最稳定的 CDN。 +- [字节 CDN](https://cdn.bytedance.com/):测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。 + +emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。 + +### NPM 包 + +- UNPKG:**有墙风险且不稳定**,默认为最新版本,无需 `@latest` 标签。 + - 将静态文件发布为 npm 包,参考[一分钟教你发布 npm 包](https://segmentfault.com/a/1190000023075167)。 + - 加速:在 [npm 官方源](https://www.npmjs.com/)中搜索包位置,然后使用前缀 `https://unpkg.com/`。 +- [NPM MIRROR](https://npmmirror.com/):NPM 项目的国内镜像镜像,不能做静态托管用途。`https://registry.npmmirror.com/项目名/版本号` 可以看见项目的各种信息,但看不了里面的文件。 +- UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 + - ~~饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 `https://npm.elemecdn.com/react@latest/` 需要时间更新,具体频率未知,可固定大版本号来获取更新 `https://npm.elemecdn.com/react@^18/`。~~ +- GitHub:基于 GitHub 公共仓库的资源托管,资源不会失效,但有时需要根据 CDN 服务商而更换域名。 + - ~~[Statically](https://statically.io/):jsDeliver 的替代品,在中国大陆所有地区连接异常。~~ + - ~~jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 `curl https://purge.jsdelivr.net/gh/username/project/file`。~~ + +由于第三方托管过于不稳定,目前我使用自托管 oss.gpt-vip.top。 + +### 部署平台 + +- Cloudflare:Pages 和 Workers 两类部署方式。 + - [Workers](../deploy/Cloudflare.html#反向代理):复制镜像网站,可直接访问,但反向代理稳定性成疑。 + - Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。 +- Netlify:国内速度慢点,图片容易卡死,但还算稳定。 +- Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「\*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。 +- AWS: 邮箱注册,不过需要信用卡认证。 +- 国内平台:Gitee、WuliHub、CODING,都需要实名认证。 + +### IPFS + +IPFS 无需服务器就可建立静态网站,号称永不失效,但**国内稳定性成疑问,实用性一般**。IPFS 托管在一个网关上,并不会自动复制到所有网关。 + +[pinata](https://pinata.cloud/) 上传网站构建的目录文件夹,上传后,即可通过 IPFS Hash 访问。网站目录中必须有 index.html,否则网页中将显示网站目录。即使有 index.html,其他人在拥有 CID 后,可以通过 IPFS Desktop 来获取网站的完整目录。为确保私密性,建议只上传单文件。使用单文件 CID 视为单一网站,不可调用原目录中的文件。^[[How to Easily Host a Website on IPFS](https://medium.com/pinata/how-to-easily-host-a-website-on-ipfs-9d842b5d6a01)] + +上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。 + +cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 `http://gateway.pinata.cloud` 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。 + +对于文件较少且链接有效的域名,可按 [Cloudflare IPFS](https://www.cloudflare.com/zh-cn/distributed-web-gateway/) 页面说明来设置 DNS,提交 IPFS 域名 30 分钟后,即可获取 SSL 证书。 + +1. 添加 CNAME 记录,将你的 IPFS 域名 `xxx.example.com` 指向 `cloudflare-ipfs.com`。 +2. `_dnslink.xxx.example.com` 设置为 `dnslink=/ipfs/`。 + +## GitHub 同步到 VPS + +代码、文章推送到 GitHub 后,会自动生成可访问的网页,但国内访问 GitHub Pages 的速度极不稳定,为了确保网站能被正常访问,必须增加国内的访问节点。 + +很多人选择 Gitee Pages 作为国内节点,GitHub Actions 将新文档同步到 Gitee,生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 的限制非常多,免费版无法自定义域名,必须实名验证,更别提近期的下架风波。因此,我没选 Gitee,而是把文档同步到国内服务器(域名需备案)。 + +::: tip 文件夹名称请勿使用大写字母,否则在同步时容易产生错误。 +::: + +### 同步到 FTP + +如果你有 FTP 服务器,可使用 [FTP-Deploy-Action](https://github.com/SamKirkland/FTP-Deploy-Action) 将 github 代码推送到服务器上。Actions 步骤参考 [GitHub 说明](../deploy/GitHub.html)。 + +```shell +on: push +name: 🚀 Deploy website on push +jobs: + web-deploy: + name: 🎉 Deploy + runs-on: ubuntu-latest + steps: + - name: 🚚 Get latest code + uses: actions/checkout@v3 + + - name: 📂 Sync files + uses: SamKirkland/FTP-Deploy-Action@4.3.3 + with: + server: ${{ secrets.ftp_host }} + username: ${{ secrets.ftp_username }} + password: ${{ secrets.ftp_password }} + port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 +``` + +新建 FTP 时,需在云服务商的安全组和服务器上开放 FTP 端口,并临时暂停宝塔系统加固等安全插件(新建 FTP 容易与安全插件冲突)。 + +如果出现 `FTPError: 530 Login authentication failed`,则说明 FTP 密码错误或账号不存在,需用 FileZilla 测试 FTP 的有效性。确认 FTP 无效后,检查 FTP 密码是否填写正确,是否只有大小写字母和数字。如果密码错误,则在 github secrets 重新 update 密钥。如果密码正确,则进入 `/www/server/pure-ftpd/etc/pureftpd.passwd`,检查是否有该 FTP 账户。没有 FTP 账户的话,**暂停宝塔系统加固**等安全插件后,重新新建 FTP。 + +如果出现 `Error: Timeout (control socket)`,则说明同步服务器超时,可进入 Actions 页面点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭防火墙,测试是否 GitHub 服务器被拉黑了。 + +### SSH 同步 + +如果你有服务器的 SSH 权限,可以使用 [web-deploy](https://github.com/SamKirkland/web-deploy) 以 SSH 同步方式发布页面。但与 FTP 相比,不确定安全性、速度、时间是否会区别。我尝试连接一直报错 `Permission denied (publickey,password)`。(有可能是服务器需要非 root 用户,adduser 一直加不上。) + +```shell +on: push +name: Publish Website +jobs: + web-deploy: + name: 🚀 Deploy Website Every Commit + runs-on: ubuntu-latest + steps: + - name: 🚚 Get Latest Code + uses: actions/checkout@v3 + + - name: 📂 Sync Files + uses: SamKirkland/web-deploy@v1 + with: + source-path: docs/.vuepress/dist/ + target-server: ${{ secrets.host }} + remote-user: ${{ secrets.ssh_username }} + private-ssh-key: ${{ secrets.SSH_KEY }} + destination-path: ${{ secrets.destination_folder }} + ssh-port: ${{ secrets.ssh_port }} # 建议更改默认的 22 端口 +``` + +如果出现报错 `error in libcrypto`,说明 SSH 密钥错误,需要登陆服务器终端,运行以下命令。 + +```shell +ssh-keygen -m PEM -t rsa -b 4096 +cat id_rsa.pub >> authorized_keys +cat id_rsa +``` + +### 同步到 oss + +如果没有服务器,可以把文件部署在云运营商的云存储上。比如用 [aliyun-oss-website-action](https://github.com/marketplace/actions/aliyun-oss-website-action),将 repo 文件 build 成网站文件,然后同步到阿里云 oss 并运行网站。 + +```shell +name: deploy md to oss +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] +jobs: + build: + runs-on: ubuntu-latest + steps: + # load repo to /github/workspace + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: '14.x' + # 打包文档命令 + # - run: npm install yarn@1.22.4 -g + # - run: yarn install + # - run: yarn docs:build #需要配合 yarn 的 package.json + - name: aliyun-oss-website-action + uses: fangbinwei/aliyun-oss-website-action@v1.3.0 + with: + accessKeyId: ${{ secrets.ACCESS_KEY_ID }} + accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }} + bucket: learndata-notes + # use your own endpoint + endpoint: oss-cn-shanghai.aliyuncs.com + # 全目录上传 + folder: . + # 不上传的文件 + exclude: | + .github/ + .gitattributes +``` diff --git a/docs/deploy/VPS.md b/docs/deploy/VPS.md new file mode 100644 index 0000000..76c4460 --- /dev/null +++ b/docs/deploy/VPS.md @@ -0,0 +1,215 @@ +--- +article: false +title: 服务器 VPS +icon: IO +order: 3 +--- + +## 环境部署 + +部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 + +### 包管理安装 + +通过集成了 npm 的 [Node.js](https://nodejs.org/en/download/) 来安装 npm,然后执行 npm i 命令安装其他。 + +全局安装 yarn 是 `npm i yarn -g`,pnpm 是 `npm i pnpm -g`。如果不想全局安装,则去除 `-g`。 + +### 包管理源 + +包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。 + +```shell +#查看源 +npm config get registry +#更换国内源 +npm config set registry https://registry.npmmirror.com/ +#换回默认源 +npm config set registry https://registry.npmjs.org/ +``` + +### 部署包 + +npm、yarn 和 pnpm 的包安装及管理命令。 + +```shell +#全局安装 +npm i 包 -g +yarn global add 包 +pnpm add 包 -g + +#移除全局包 +pnpm remove 包 --global +#更新全局包 +pnpm upgrade 包 --global + +#升级当前目录的依赖以确保你的项目只包含单个版本的相关包 +#本方法能解决大部分的部署报错 +npm i && npm update +yarn && yarn upgrade +pnpm i && pnpm up +``` + +### 本地测试 + +有些静态文件不支持直接打开,可以用 anywhere 架构本地服务器来进行测试。 + +```shell +# 安装静态服务 anywhere +npm install anywhere -g +# 进入静态页面存放目录,执行 anywhere +anywhere -p 8081 +``` + +## 服务器 ECS + +服务器系统为 Debian 11,配置包管理器 nodejs 和 yarn。^[[通过包管理器方式安装 Node.js](https://nodejs.org/zh-cn/download/package-manager#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages)] + +```shell +apt-get update # 从数据源更新软件包的列表,运行产生软件包数据库 +apt-get install wget && apt-get install sudo # 安装 wget 和 sudo + +# 大版本升级必须先建立快照 +apt-get upgrade # 更新所有软件包(慎用,不要用!)之前 CentOS 系统错误就是使用了 upgrade 命令。 + +# 新建用户,非 root 权限 +adduser xxx +# 为新用户设置密码 +passwd xxx + +# 安装 Node.js 18 和 yarn +curl -fsSL https://deb.nodesource.com/setup_18.x | bash - +apt-get install -y nodejs +sudo apt-get install yarn +``` + +如果服务器的 Node.js 安装遇到问题,可以用宝塔面板的 Node.js 版本管理器来进行部署。 + +### 网站重定向 + +更改 nginx 配置后,nginx 重载配置后实现网站重定向。`$1` 表示第一个 `()` 内的正则匹配内容,`$2` 为第二个。^[[Nginx rewrite 设置](https://www.w3cschool.cn/nginxsysc/nginxsysc-rewrite.html)] + +[网站重定向](https://www.jb51.net/article/146957.htm) + +```ini +#隐性链接跳转 +location /xx1 {proxy_pass } + +#404 前,将旧文章链接格式转为新的,使用绝对路径 +location ^~ /p{ + rewrite ^/p/(.*)$ https://gpt-vip.top/posts/$1.html; +} + +# huginn 设置中 location 添加 301 定向,兼容老路径链接 +if ( $request_uri = "/users/1/web_requests/21/guoke.xml" ) { +rewrite ^ http://xxx.com/users/1/web_requests/19/guoke.xml permanent; +} + +#只匹配主页,将主页跳转为其中一个子页面 +location = / { + rewrite https://xxx.com/ permanent; +} +``` + +### 全新安装服务器 + +1. 安装[宝塔面板](https://www.bt.cn/bbs/thread-19376-1-1.html)。 +2. 删除阿里云主机监控。 + + ```shell + service aegis stop #停止服务 + chkconfig --del aegis # 删除服务 + ``` + +3. 配置[阿里云端口开放](https://www.bt.cn/bbs/thread-2897-1-1.html),导入安全规则。 +4. 宝塔上修改默认账号密码,并修改登录 22 的默认 SSH 端口。如果开通了 FTP,修改 FTP 端口。 +5. 选择「网站」>「添加站点」,将站点根目录放在 /www/wwwroot/xxx,同时新建数据库。 +6. 上传全站文件并解压,然后按照安装提示重新安装一次,最后导入备份数据库。 +7. 404.html 起效,宝塔网站配置文件中,删除 `error_page 404 /404.html;` 中的 `#`。 +8. SSL 证书设置,开启强制 HTTPS;PHP 版本;301 重定向;添加伪静态设置(metinfo 或其他网站后台有代码)。如果 301 设置失败,直接在「伪静态」配置中,放入跳转代码。 +9. 服务器设置参考 [NginxConfig](https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN) 适合新手配置高性能、安全、稳定的 NGINX 服务器的最简单方法。 +10. [ECS 宝塔设置优化](https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=3117): + + - 添加计划任务,定期释放内存,建议设置每天释放一次,执行时机为半夜,如:04:00。 + - 打开 Linux 工具箱添加 Swap。Swap 推荐与物理内存相同。 + - 安装 PHP 缓存扩展,尽量使用更高的 PHP 版本,另外安装 opcache(脚本缓存)、redis(内容缓存)、imagemagick、fileinfo、exif。 + - Redis 优化,在/etc/sysctl.conf 中添加 `net.core.somaxconn = 2048`,然后终端运行 `sysctl -p`。 + +11. 防火墙白名单(自定义),如:添加 url 规则 `^/rss.php` 到防火墙 URL 白名单,防止 rss 服务被屏蔽。 + +### 服务器迁移 + +1. 购买按量付费服务器。 +2. 用[服务器迁移中心 SMC](https://smc.console.aliyun.com/overview) 将旧服务器同步到临时服务器。 +3. 将域名解析到临时系统,确定服务基本正常。 +4. 对旧服务器先建立云盘快照,然后更换操作系统,进行全新部署。 +5. 对比新旧服务器,确认配置正常。 + +## 网站设计 + +### 网站字体 + +网站为了提高访问速度并保持设计的一致性,通常会选默认字体。这导致网站设计难以突出重点。针对这点,我通常会修改网站的导航栏字体,将其从默认字体改为 `思源黑体 - 粗`。 + +1. 进入 [iconfont‑webfont](https://www.iconfont.cn/webfont),输入导航栏内所有文字,并设置所需字体。 +2. 点击「生成字体」后,在选中字体的下方,点击「本地下载」。 +3. 将字体包上传到服务器,修改新字体的位置参数。 +4. 在导航栏的 `class` 属性中添加 `web-font`。 + +### 米拓 + +早期的动态网站通过米拓开发的,记录: + +- 后台忘记密码,使用 [Metinfo 米拓重置工具](https://www.metinfo.cn/download/54.html)。 +- metinfo 新版静态页会删除 index.html,后续都改用 index.php。 + +## 常见问题 + +### CPU 100% + +当服务器 CPU 或内存突然飙升 100% 时,依次排除当前运行进程,检查是否安装更新了插件、应用或服务。 + +如果找不到原因,可以临时设置定期任务。每隔 3 小时重启一次 nginx/apache。有时重启不正常,因此重启命令后 10 秒,再启动一次 nginx/apache。 + +```shell +/etc/init.d/nginx restart +sleep 10s +/etc/init.d/nginx start +``` + +### SSL 证书 + +如果 SSL 证书部署报错,可以按自动生成来部署。 + +```shell +#证书设置修改 /www/server/panel/vhost/nginx +if ($server_port !~ 443){ + rewrite ^(.*) permanent; +} +#证书修改 +/www/server/panel/vhost/cert/ +#证书位置 +/www/server/panel/vhost/ssl +``` + +如果同一网站部署了多个域名,并且都需要部署 SSL,则需要在 `/www/server/panel/vhost/cert` 目录下为每个域名创建独立的证书文件夹。同时,在网站的配置文件中创建两个独立的`server`配置,确保它们之间有换行。请注意,宝塔面板中的网站配置在重启 Nginx 后有时会被重置,所以请务必进行检查和确认配置的正确性。^[[针对宝塔面板一个站点多个域名使用 SSL 证书的解决方案](https://cloud.tencent.com/developer/article/2220049?areaSource=102001.7&traceId=SwSyuKeYOHVCQ_bcIFnkh)] + +### CORS 跨域 + +POST 表单等操作需要涉及第三方 API,需要添加扩域域名,避免 CORS 报错。 + +```bash + add_header Access-Control-Allow-Origin "*"; + add_header Access-Control-Allow-Credentials "true"; + add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; + add_header Access-Control-Allow-Headers "DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; + add_header Access-Control-Expose-Headers "Content-Length,Content-Range"; +``` + +### piwik 手动升级 + +Matomo/Piwik 是免费的统计服务。有时无法使用自动安装包,需要手动升级。 + +1. 下载最新版应用,并解压到服务器。 +2. 将原目录中的 config/config.ini.php 粘贴到新版中,然后就可以更新数据库进行升级了。 +3. 选择「设置」>「系统」>「地理位置」,拖到页面底部,按页面要求下载 DBIP 包,并重命名保存为 `/www/wwwroot/piwik/misc/DBIP-City.mmdb`。 diff --git a/docs/family/Coupon.md b/docs/family/Coupon.md new file mode 100644 index 0000000..d8fc720 --- /dev/null +++ b/docs/family/Coupon.md @@ -0,0 +1,65 @@ +--- +article: false +title: 网购攻略 +icon: free +order: 3 +--- + +> 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 + +电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 + +## 淘宝 + +- 当没有**省钱卡**和商品优惠券时,使用「一淘 app」下单,拿购物返利。 +- 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。 + - 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。 +- 购物节日前一天的预购和节日当天,是最优惠时候。 + - 商家在活动前说的保价,并不包含大额券,不用提前下单。 + +## 拼多多 + +拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。 + +- 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。 +- 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。 + +## 京东 + +京东新会员已经没有优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。 + +## 1688 + +1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,**代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改**。^[[1688「扫货」指南](https://sspai.com/prime/story/vol018-a-1688-shopping-guide)] + +- 持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。 +- 日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。 +- 日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。 +- 医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。 +- 食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考[手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)](https://post.smzdm.com/p/az5gg8zr/)。 +- 数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。 +- 餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。 + +购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货! + +## 抢购辅助 + +- Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。 +- 八戒任务:按顺序完成多坐标点击,适用秒杀? +- [冰狐智能辅助](https://aznfz.com):自动构建脚本,需付费,未实际使用,较复杂 +- [喵惠助手](https://docs.qq.com/doc/DU0FTQ1NKV0VKU2tN):第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。 +- [抢购助手脚本](https://greasyfork.org/zh-CN/scripts/393577-%E6%B7%98%E5%AE%9D-%E5%A4%A9%E7%8C%AB-%E8%81%9A%E5%88%92%E7%AE%97-%E4%BA%AC%E4%B8%9C-%E8%8B%8F%E5%AE%81-%E5%94%AF%E5%93%81%E4%BC%9A-%E5%8D%8E%E4%B8%BA-%E8%80%90%E5%85%8B-%E9%AD%85%E6%97%8F-%E8%81%94%E6%83%B3-%E5%8D%8E%E7%A1%95-%E5%B0%8F%E7%B1%B3%E6%9C%89%E5%93%81-%E8%80%83%E6%8B%89%E6%8A%A2%E8%B4%AD%E5%8A%A9%E6%89%8Bv2):网页 js 脚本,需搭配浏览器扩展 Tampermonkey。 + +### BP 模式 + +BP 即 ByPass,是一键下单的链接,可以跳过商品页缓存、选择尺码规格、结算这一系列繁琐的步骤,直接进入订单确认页,最大限度减少操作和页面跳转带来的延时,为大家抢购带来最快的下单体验。 + +手机端操作,可以把 BP 链接提前给淘宝/京东里面的好友或客服,到了点再进入下单。 + +BP 链接均为移动链接,电脑上使用需要提前登录网页。BP 下单时,可以先不付款,先提交锁定订单,然后再支付选择分期方式。 + +以京东 BP 链接为例:`https://p.m.jd.com/norder/order.action?wareId=100033551654&wareNum=1&enterOrder=true`,`wareId=100012043978` 中 `100012043978` 是商品 ITEM ID,`Num=1` 中 1 是购买数量。 + +## 购物思考 + +优惠券、抢购除了是让你下单,也是为了让你成为平台的忠实用户。正如劳力辩证:**当你对某事或某人投入了精力和劳力,你也会对他们有更高的评价**。而抢购成功,会让人有种不可自拔的快感。 diff --git a/docs/family/Diet.md b/docs/family/Diet.md new file mode 100644 index 0000000..6ae7ff2 --- /dev/null +++ b/docs/family/Diet.md @@ -0,0 +1,123 @@ +--- +article: false +title: 健康饮食 +icon: enum +order: 1 +--- + +16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 + +- 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 +- 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 +- 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 + +## 饮食 + +### 零食 + +- 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。 +- 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。 + +### 饮料 + +现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考[适量喝咖啡对身体有哪些好处?](https://www.zhihu.com/question/546343871/answer/2692019428)。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。 + +> 马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。 + +夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。^[[冷泡茶和热茶放凉,好喝级别能一样吗?](https://www.guokr.com/article/461818/)] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。 + +### 冷泡燕麦 + +牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点: + +- 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。 +- 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。 +- 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。 +- 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。 +- 放冰箱这一步很重要!不放可能会化身喷射战士。 +- 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。 + +## 健康理论 + +### 程序员延寿指南 + +[程序员延寿指南](https://github.com/geekan/HowToLiveLonger): + +- 输入 + - 固体:[吃白肉](https://github.com/geekan/HowToLiveLonger#611-%E5%9B%BA%E4%BD%93)(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%) + - 液体:喝咖啡(-22%~-12% ACM),**喝牛奶**(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限) + - 气体:不吸烟(否则+~50% ACM,-12~-11 年寿命) + - 光照:[晒太阳](https://github.com/geekan/HowToLiveLonger#614-%E5%85%89%E7%85%A7)(-~40% ACM) + - 药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM) +- 输出 + - 运动:每周 3 次 45 分钟挥拍运动(-47% ACM) + - 日常:刷牙(-25% ACM) + - 睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,_早睡 +43% ACM,晚睡 +15% ACM(存在争议)_ +- 上下文 + - 体重:减肥(-54% ACM) + +### 其他 + +在发表在《细胞》杂志的[综述文章]()中描述了[长寿饮食](https://news.sciencenet.cn/htmlnews/2022/4/478234.shtm),这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。 + +## 泡澡 + +浸泡 42℃ 以上的水温最多泡 3-5 分钟,40℃ 可以泡 10 分钟,37℃ 到 39℃ 的温水,可以泡 20-30 分钟。泡浴后的清水冲淋是有必要的,头发部位和面部用冷水冲淋则有极其良好的保健和延缓衰老的功效。 + +泡浴作用: + +- 低温、长时间的泡浴 - 失眠、压力带来的疲劳。 +- 上班前或者重大活动前高温或者低温并且短时间的泡浴 - 打起精神。 +- 0-21°,收敛组织器官和神经系统--冷水浴。 +- 32-40°,舒缓、愉快 - 温水浴。 +- 32-42°,止痛、镇静,浴后无力需要休息 - 热水浴。 +- 全身浴:覆盖肩膀为主,温水 - 提高新陈代谢。 +- 半身浴:肚脐平齐,不增加心脏负担,30-40 分钟,慢慢发汗,上半身披毛巾或间断性加水 - 改善心脏功能,改善冷性体质,特别适合老年人。注意:**39°,肚脐,30 分钟以上**。 +- 坐浴:20 厘米高度的水平线,浸入腰椎、尾椎、臀部,15 分钟 - 痔疮、便秘、尿路感染、生殖系统护理。 + +另外,饮酒后最好不要立即去洗澡,这很容易引发心血管病。洗澡时出现头晕、胸闷、眼花等“澡堂综合征”,也需立即停浴,到医院就诊。 + +## 减肥食谱 + +使用食谱前,先需要养成正确的减重习惯和心态。 + +- 不要让自己饿肚子,每天至少要吃 3 顿正餐。 +- 吃点心或正餐之前和之后都要喝一杯水,进食顺序按蔬菜> 鱼肉蛋> 主食 +- 饭后半小时不要坐下 +- 临睡前至少 1 小时停止用餐,并且要多喝水。 +- 每咬一口食物,都要咀嚼一段时间。从身体真正饱足到大脑产生饱足感需要 15 分钟。吃慢一点,就不容易吃得过多。 +- 每天称体重,然后找出 7 天的平均值。确保体重持续下降就好,不需要规定自己每周必须减掉多少体重。有时候体重可能会增加,尤其是女性在月经期间体内水分潴留,容易水肿,和你的饮食或锻炼习惯没有关系。 +- 每周只减掉 0.5-1 公斤。快速减肥会减掉肌肉,而不是脂肪,而且也很难长期维持体重。 + +| | 早餐 | 午餐 | 晚餐 | +| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Day01 | 谷物牛奶 (燕麦片 40g+ 全脂奶粉 40g+ 蛋白粉 5g+ 黑咖啡 2g);12 粒巴旦木;苹果 200g | 什锦饭 (大米 30g+ 小米 30g+ 甜豌豆 15g+ 松子仁 5g+ 酱牛肉碎 30g+ 胡萝卜丁 30g);蔬菜沙拉 (生菜 100g+ 熟鸡蛋 + 油醋汁半汤匙 4g);猕猴桃 120g;无糖酸奶 100g | 燕麦米饭 (燕麦粒 20g+ 大米 15g);油煮蘑菇鸡肉菠菜 (菠菜 200g+ 蘑菇 50g+ 鸡腿 40g+ 香油 1 汤匙 8g);豆浆 (黄豆 50g) | +| Day02 | 全麦三明治 (生菜 70g+ 鸡蛋 + 全麦吐司 60g+ 香油 2g);12 粒原味开心果;牛奶 250g | 双色菜花 (西兰花 100g+ 菜花 100g+ 香油 5g);茄汁虾仁 (虾仁 75g+ 番茄酱 30g+ 油 8g);二米饭 (小米 30g+ 糙米 30g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)(先吃一半菜花) | 木耳小白菜杂煮 (小白菜 150g+ 北豆腐 60g+ 鸡心 60g+ 黑木耳 6g+ 香油 3g);红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);蜜橘 100g(加餐) | +| Day03 | 红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);水煮蛋;果仁菠菜 (菠菜 80g+ 花生仁 10g+ 香油 3g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g) | 土豆沙拉 (土豆 200g+ 甜豌豆 30g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 1 汤匙 8g);酱卤鸭肝 60g;无糖酸奶 100g;10 粒小番茄 | 燕麦小米粥 (燕麦片 30g+ 小米 30g+ 小麦胚芽 10g);蒸虾皮小油菜 (小油菜 180g+ 虾皮 5g+ 全麦粉 30g+ 花椒油 3g);烤鸡腿 80g | +| Day04 | 奶香醪糟燕麦 (醪糟 100g+ 燕麦片 30g+ 全脂奶粉 40g);鸡蛋;12 粒巴旦木 | 紫菜蛋花汤 (海苔 4g+ 熟芝麻 1g+ 鸡蛋);牛奶燕麦 (燕麦片 20g+ 全脂牛奶 250g);酸奶 100g;小叶橘 150g;全麦吐司 30g | 火腿木耳煮油菜 (油菜 250g+ 木耳 10g+ 方火腿 60g+ 香油 1 汤匙 8g);蒸红薯 180g;无糖酸奶 (酸奶 100g+ 蛋白粉 5g)(先吃油菜) | +| Day05 | 蒸食物套餐 (铁棍山药 80g+ 糯玉米带轴 150g+ 胡萝卜半根 100g);奶香黄豆浆 (黄豆 20g+ 黑芝麻 5g+ 全脂奶粉 20g);鸡蛋羹 (鸡蛋 + 香油 2g);桂圆 150g | 冲杂粮糊 (烤红豆粉 15g+ 燕麦粉 20g+ 小米粉 15g+ 全脂奶粉 10g);生菜沙拉 (生菜 150g+ 千岛酱 10g);酸奶 200g;蓝莓 100g;葡萄干 10g | 坚果土豆泥 (土豆 250g+ 烤花生碎 12g+ 方火腿 70g);油煮木耳小白菜 (小白菜 200g+ 木耳 6g+ 香油 4g);酸奶 100g | +| Day06 | 香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 30g+ 鸡蛋 + 牛奶 200g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 15g+ 芝麻油 4g) | 鸡腿炖四宝 (鸡腿肉 100g+ 鲜蘑 80g+ 黄花菜 10g+ 甜豌豆 80g+ 木耳 10g);银耳西兰花 (西兰花 200g+ 银耳 8g+ 香油 4g) | 炖素三鲜 (冬笋 80g+ 香菇 10g+ 黄豆芽 120g+ 香油半汤匙 4g);清蒸鱼 (蒸鲈鱼 120g+ 花生油 4g);烤红薯 250g(按序食用) | +| Day07 | 苹果全麦煎饼 (苹果肉 180g+ 全麦粉 20g+ 葡萄干 3g+ 全脂奶粉 10g+ 油 3g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g) | 生菜鸡蛋沙拉 (生菜 200g+ 鸡蛋\*2+ 千岛沙拉酱 8g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g);酸奶 150g;猕猴桃 120g | 甘薯红米饭 (红薯 100g+ 红米 20g+ 白米 20g);牛肉炖菜 (牛肉 100g+ 香菇 8g+ 胡萝卜 40g+ 魔芋粉丝 20g);果仁菠菜 (菠菜 200g+ 花生仁 8g+ 香油 4g) | +| Day08 | 全麦面包 70g;牛奶 240g;水煮鸡蛋;桂圆 120g;9 粒巴旦木 | 油煮木耳小白菜鸡 (小白菜 25g+ 卤水豆腐 100g+ 鸡心 50g+ 黑木耳 2g+ 香油 3g);炖素三鲜 (冬笋 40g+ 香菇 4g+ 黄豆芽 20g+ 香油 2g);蒸红薯 200g;去皮小叶橘 200g | 杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 4g);火腿木耳煮油菜 (油菜 100g+ 木耳 5g+ 方火腿 75g+ 香油 5g);无糖酸奶 130g | +| Day09 | 香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g);15 粒开心果 | 燕麦小米浓粥 (燕麦片 25g+ 小米 13g+ 小麦胚芽 13g);生菜沙拉 (生菜 200g+ 千岛酱 4g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 4g);豆浆 (黄豆 44g) | 二米饭 (小米 38g+ 糙米 15g);蒸虾皮小油菜 (小油菜 200g+ 虾皮 6g+ 全麦粉 10g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 4g);烤鸡腿肉 45g | +| Day10 | 苹果全麦煎饼 (苹果肉 105g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 30g+ 油 3g);鸡蛋羹 (鸡蛋 + 香油 2g) | 蒸土豆 (土豆 200g+ 方火腿 75g+ 花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 3g);猕猴桃 150g | 甘薯红米饭 (红薯 50g+ 红米 25g+ 白米 25g);油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 50g+ 鸡心 50g+ 木耳 4g);豆浆 (黄豆 30g) | +| Day11 | 谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;10 粒巴旦木;蜜橘 120g | 什锦饭 (大米 50g+ 小米 25g+ 甜豌豆 8g+ 松子仁 2g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 50g+ 银耳 4g+ 香油 4g) | 燕麦米饭 (燕麦粒 25g+ 大米 38g);牛肉炖菜 (牛肉 50g+ 香菇 7g+ 胡萝卜 20g+ 魔芋粉丝 20g);烤鸡腿肉 50g | +| Day12 | 奶香醪糟燕麦 (醪糟 69g+ 燕麦片 38g+ 全脂奶粉 30g);果仁菠菜 (菠菜 150g+ 花生仁 3g+ 香油 3g);鸡蛋羹 | 土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 16g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 4g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 香油 2g) | 蒸食物套餐 (铁棍山药 100g+ 糯玉米带轴 300g+ 胡萝卜 20g);油煮蘑菇鸡肉菠菜 (菠菜 50g+ 蘑菇 35g+ 鸡腿 50g+ 香油 5g);无糖酸奶 120g | +| Day13 | 红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 红小豆 13g);蔬菜沙拉 (生菜 200g+ 熟鸡蛋 + 油醋汁 5g);牛奶咖啡 (牛奶 240g+ 咖啡 2g) | 核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 8g+ 香油 3g);烤红薯 200g;酱牛肉 70g;猕猴桃 150g | 麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 2g);果仁菠菜 (菠菜 150g+ 花生仁 2g+ 香油 1g) | +| Day14 | 鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 5g);牛奶 240g | 鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 35g+ 黄花菜 4g+ 甜豌豆 8g+ 木耳 4g);燕麦米饭 (燕麦粒 25g+ 大米 25g);葡萄干 25g | 双色菜花 (西兰花 50g+ 菜花 40g+ 油醋汁 2g);茄汁虾仁 (虾仁 80g+ 番茄 10g+ 油 2g);二米饭 (小米 38g+ 糙米 25g);紫菜蛋花汤 (海苔 2g+ 鸡蛋\*1) | +| Day15 | 红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 赤小豆 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 3g+ 香油 2g);鸡蛋羹 (鸡蛋\*1+ 香油 1g);无糖酸奶 240g | 油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 100g+ 鸡心 50g+ 木耳 4g+ 油 5g);二米饭 (小米 50g+ 糙米 25g) | 甘薯红米饭 (红薯 50g+ 红米 25g+ 大米 25g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 油 5g);烤鸡腿肉 50g | +| Day16 | 奶香醪糟燕麦 (醪糟 35g+ 燕麦片 38g+ 全脂奶粉 30g);鸡蛋;蜜橘 120g | 蔬菜沙拉 (生菜 200g+ 鸡蛋 + 油醋汁 5g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 5g);蒸土豆 300g | 油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 35g+ 鸡腿肉 75g+ 香油 5g);蒸红薯 250g;豆浆 (黄豆 50g) | +| Day17 | 香蕉燕麦蛋糕 (香蕉 80g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g) | 粉蒸土豆鸡肉 (土豆 200g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 3g);双色菜花 (西兰花 50g+ 菜花 80g+ 油醋汁 3g);酱牛肉 150g;猕猴桃 35g | 麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g+ 香油 4g) | +| Day18 | 鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 3g);奶香黄豆浆 (黄豆 13g+ 黑芝麻 3g+ 全脂奶粉 20g) | 杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 2g);油煮木耳小白菜鸡 (小白菜 150g+ 卤水豆腐 40g+ 鸡心 75g+ 木耳 4g+ 香油 5g);苹果 150g | 蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 17g+ 黄花菜 2g+ 甜豌豆 4g+ 黄豆芽 10g);生菜沙拉 (生菜 50g+ 千岛酱 4g);无糖酸奶 130g | +| Day19 | 苹果全麦煎饼 (苹果肉 60g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 20g+ 油 5g);牛奶 240g | 土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 32g+ 白芝麻 2g+ 鸡蛋 + 千岛酱 4g);茄汁虾仁 (虾仁 80g+ 番茄酱 2g+ 油 10g) | 燕麦小米浓粥 (燕麦片 13g+ 小米 38g+ 小麦胚芽 13g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g);无糖酸奶 130g | +| Day20 | 蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);紫菜蛋花汤 (海苔 2g+ 鸡蛋\*1);果仁菠菜 (菠菜 100g+ 花生仁 3g+ 香油 3g) | 炖素三鲜 (冬笋 40g+ 香菇 17g+ 黄豆芽 20g+ 香油 3g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 10g+ 魔芋粉丝 20g);燕麦米饭 (燕麦粒 25g+ 大米 50g);烤鸡腿肉 50g | 什锦饭 (大米 38g+ 小米 25g+ 甜豌豆 8g+ 松子仁 3g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 25g+ 银耳 4g+ 香油 2g) | +| Day21 | 谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;桂圆 120g | 油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 70g+ 鸡腿肉 50g+ 香油 5g);烤红薯 200g;猕猴桃 150g;无糖酸奶 130g | 粉蒸土豆鸡肉 (土豆 100g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 油 1g);二米饭 (小米 25g+ 糙米 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 5g+ 香油 2g) | + +以上食谱整理自范志红老师的《吃出好身材-21 天营养食谱》,侵权删。 + +食谱注意: + +- 晚餐时补充复合 B 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶。 +- 蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。 +- 小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。 +- 食谱部分可进行微调,如果不会做,可直接按原料食用。 diff --git a/docs/family/HomeAutomation.md b/docs/family/HomeAutomation.md new file mode 100644 index 0000000..3f308bb --- /dev/null +++ b/docs/family/HomeAutomation.md @@ -0,0 +1,69 @@ +--- +article: false +title: 智能家居 +icon: home +order: 3.1 +--- + +智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 + +## Home Assistant + +Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 + +Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。 + +1. 下载 [hacs](https://github.com/hacs/integration/releases/),将其解压到 Home Assistant 配置的 config\custom_components\hacs 文件夹下。 +2. 重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。 +3. 选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。^[[从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建](https://baijiahao.baidu.com/s?id=1721932088542289661)] + +Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。 + +> 对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用[多模网关](https://home.miot-spec.com/s/lumi.gateway.mgl03)配合 [XiaomiGateway3](https://github.com/AlexxIT/XiaomiGateway3) 集成。^[[为什么设备状态会有延迟?如何减小延迟?](https://github.com/al-one/hass-xiaomi-miot/issues/100#issuecomment-909031222)] + +## Node-RED + +[Node-RED](https://github.com/node-red/node-red) 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 [node-red 的入门教程集合](https://bbs.iobroker.cn/t/topic/1165)。 + +1. 部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 `chmod 777 /volume1/docker/nodered/data`。 +2. Node-RED 上安装 [node-red-contrib-home-assistant-websocket](https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#prerequisites)。 + - 选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。 + - 搜索并安装「node-red-contrib-home-assistant-websocket」。 +3. 选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。 +4. 选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。 +5. 进入 nodered 页面,配置 [home assistant websocket](https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#configuration),点击右上角的部署。^[[树莓派 HomeAssistant 系列(四)NodeRed 安装配置](https://zhuanlan.zhihu.com/p/456741817)] + +### 常用节点 + +- inject: 定时启动,周期性触发执行。 +- call service:改变智能设备状态,比如开灯。 + - Domain:触发方式 + - Service:触发命令 + - Device:设备与服务 + - Entity:设备执行模块 + +## 自动化场景 + +- 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。 +- 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。 + +## 智能硬件 + +### Zigbee2MQTT + +[Zigbee2MQTT](https://autoaigpt.cn/watch?v=R_CikjR7tiw) 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。 + +不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。 + +### 智趣盒子 + +[智趣盒子](https://item.taobao.com/item.htm?id=635639747170)集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。 + +> 盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等). + +不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。 + +### 其他硬件 + +- [远程键盘控制器](https://item.taobao.com/item.htm?id=631865647089):基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。 +- [MQTT 转 usb 虚拟键盘鼠标注入器](https://item.taobao.com/item.htm?id=675107124036):通过 wifi 来控制,店家不清楚 HA。 diff --git a/docs/family/Life.md b/docs/family/Life.md new file mode 100644 index 0000000..f064a18 --- /dev/null +++ b/docs/family/Life.md @@ -0,0 +1,63 @@ +--- +article: false +title: 生活窍门 +icon: creative +order: 6 +--- + +## 个人护理 + +### 理发 + +电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 + +- 不要从前向后理发,否则限位器不起作用,头发都被推平。 +- 短发方案:限位器分别使用 1.5、6 和 4.5。 + +### 衣物 + +- 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单调、路人。​ +- 图案:单一主题,小图案不要太大、条纹对齐不繁杂。横条纹显高显瘦,竖条纹相反。​^[[横纹衣服更显胖?你可能一直都弄错了](https://www.guokr.com/article/459972/)] +- T 恤:250g 32 支的纯棉面料,支数越高,面料就越柔软、越强韧 ​。 +- 5 分裤:不要七分裤或太宽松,裤长放在膝盖上方 5-10 厘米处。 + +## 妙用 + +### 磁铁 + +铷磁铁或强磁铁在生活中有许多用途,如:整理线材,吸附窗帘,悬挂物品,密封。 + +磁铁使用方便,不留痕迹,比小夹子有用。 + +## 小众记录 + +### 去客厅化 + +宝宝出生后,扔掉了家里的欧式沙发和茶几,转而采用模块沙发。模块沙发的好处是可以灵活使用,需要时可以拆分来变成床。我买了三组,每组有两个沙发垫,可以让三个人舒适地睡觉。不过,模块沙发的价格差异很大,很难区分哪个更优。 + +### 玻璃自爆 + +2022.06.11 更换阳台 90\*90 的弧形玻璃,要价 1100。 + +阳台玻璃自爆后,即使玻璃没碎也要及早拆下来,否则有可能发生事故。拆旧玻璃前,需要清理下方停放的车辆,并暂时不让行人通行。拆好后,如果掉落碎玻璃较多,可以拿包烟让环卫工人帮忙清理。 + +新玻璃未到之前,可以拿大的硬纸板挡住缺口,不要用薄膜遮掩,会被吸走。 + +### 花洒水小 + +手持花洒尾部与软管的连接处,有节水止逆阀。 + +如果家里水压不足时,拆下节水止逆阀后安装花洒,可以解决花洒出水不足问题。 + +### 网线更换 + +客厅网络连接不稳定,加上原本装修的网线不好,想着把埋在墙里的网线都更换掉,就搜索「墙内网线更换」找到本地的服务商询价,准备把埋在墙里的网线都升到 7 类,但对方说超六和七类的网线都比较粗,很难拉进管道,可能会拉到一半给卡住。6 类线据传可以稳定支持 2.5Gbps/5Gbps 网络;在特定布线环境下,最大可支持 10Gbps 传输速率。 + +师傅上门发现:除了客厅的 3 条网线是 6 类,其他房间都是超 5 类,可以上千兆,但不算稳定;管道里线特别多,无法更换网线。另外,单口网口面板改为双网口,需要连两根网线。 + +> 平层户型换线报价(包含 6 类网线,6 类水晶头及人工):网线能不能换。只能我们工作人员,上门查看来确认。确认没法换的,只收上门费 100 元。可以换的话。换首根 6 类网线 380 元。每增加 1 根收取 140 元。管道里包含 10 米,超出的每米 12 元。客户需要管道外面延长网线的,每米 12 元。除复式和大型场所外,绝大多数情况是超不过 10 米。 +> 实际付费:上门维修就是按户计算,不管问题大小都是 300 起。我原本的问题不大,所以让他把家里的网线全部检查了遍,替换坏掉的水晶头和网口面板,最终费用是 430. + +网线情况:客厅 TV,客厅沙发(2 条网线,一条放在电话线下),客卧床头,客卧 TV,主卧床头,主卧 TV,书房书桌。书房备用网口更换面板后,依然不能使用,可能是线断了,不再使用。 + +无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 [有线 mesh 组网](https://sspai.com/post/74200)。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。 diff --git a/docs/family/Maintenance.md b/docs/family/Maintenance.md new file mode 100644 index 0000000..78de8d6 --- /dev/null +++ b/docs/family/Maintenance.md @@ -0,0 +1,58 @@ +--- +article: false +title: 维修/保养 +icon: repair +order: 5 +--- + +## 牛皮席 + +平时隔一段脏了用温水毛巾擦就可以了,如果流汗很多的话,可以用淡肥皂水擦拭后再用清水毛巾擦。不宜暴晒,可以傍晚的阳光晾晒。 + +秋天收藏之前,用淡肥皂水湿毛巾彻底清洁牛皮席表面,然后再用清水擦干净,在阳台晾晒一天后,可以卷也可以折起打包起来收藏,也可以直接垫在床上,上面再铺被子使用。 + +## 升降桌 + +升降桌报错时,长按向下键,桌子会逐渐复位到最低,然后恢复正常。 + +## 通马桶 + +塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。 + +如果使用下方的疏通器,也在疏通头上绑好塑料袋,在气口位置撕开个小口,最后按通气开关。 + +![疏通器说明 1](https://img.gpt-vip.top/2022-06-10-14-55-01.png?imageMogr2/format/webp) + +![疏通器说明 2](https://img.gpt-vip.top/2022-06-10-14-55-14.png?imageMogr2/format/webp) + +## 林内锅炉 + +左侧为冬季采暖模式,地暖模式下温度设置在 45—55℃,原则上不超过 60℃。因为地暖管道是塑料的,如果温度太高,那么会影响到采暖管的使用寿命,还会导致锅炉内壁结垢。 + +燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间,补水过程中请不要离开现场。 + +### 锅炉补水 + +1. 先检查采暖系统中是否有漏水的地方,确认系统完全密闭。 + +2. 关闭燃气壁挂炉,切断电源。 + +3. 逆时针(向左)旋紧注水/补水阀约一周,听到有“呲”的声音。 + +4. 观察操作面板上的水压表,当水压表指针在 1bar~1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄关闭注水/补水阀。 + +5. 开机运行燃气壁挂炉。 + +注意事项: + +- 注水时,必须切断燃气壁挂炉总电源,以免因接头漏水而导致漏电; + +- 补水结束后必须将注水/补水阀旋紧关闭,否则燃气壁挂炉将过压溢水; + +- 如果您补水时不小心将采暖系统内的水压补到 3bar 左右,安全阀会泄水,所以再次提示您安全阀必须用接管与地漏连接,且中间不许有阀门。 + +## 地暖温控器 + +![地暖温控器 1](https://img.gpt-vip.top/2022-06-10-14-58-21.png?imageMogr2/format/webp) + +![地暖温控器 2](https://img.gpt-vip.top/2022-06-10-14-58-32.png?imageMogr2/format/webp) diff --git a/docs/family/Medical.md b/docs/family/Medical.md new file mode 100644 index 0000000..4268738 --- /dev/null +++ b/docs/family/Medical.md @@ -0,0 +1,34 @@ +--- +article: false +title: 医疗药品 +icon: like +order: 4 +--- + +## 自身健康 + +[尿素乳膏](https://detail.tmall.com/item.htm?id=542176943787):柔软皮肤,防止干裂,深层滋润。 + +[维 a 酸乳膏](https://detail.tmall.com/item.htm?id=568724954216):更新表皮,去除角质,避光只能晚上用。 + +[壬二酸](https://detail.tmall.com/item.htm?id=657520889974):疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后**立即清水清洗掉**,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。 + +黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。 + +## 维生素 + +维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。 + +护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。 + +补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。 + +## 看病技巧 + +- 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。^[[不用迷信主任,要是真有大病,年轻大夫会领着你去找的……](https://www.guokr.com/article/461939/)] + +- 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。 + +- 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。 + +- 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。^[[“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南](https://www.guokr.com/article/461706/)] diff --git a/docs/family/Shoppinglist.md b/docs/family/Shoppinglist.md new file mode 100644 index 0000000..d9b57f0 --- /dev/null +++ b/docs/family/Shoppinglist.md @@ -0,0 +1,225 @@ +--- +article: false +title: 购物评价 +icon: info +order: 2 +--- + +## 书房 + +### 摄像头 + +摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 + +谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 + +### 键盘 + +罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。 + +机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。 + +### 游戏手柄 + +如果不是在客厅玩游戏,建议买有线手柄,否则价格会高得多。 + +- 100-200 预算:北通阿修罗 2、八位堂、致动 O。 +- 400+ 预算:XBOX SERIES 手柄。 +- 廉价手柄的性能通常很差,比如,摇杆只支持四个方向,而遥控一般是可以 360 度控制的。 + +### 显示器 + +书桌上装有三台显示器。主显示器是小米 27 英寸 2K 165Hz,尽管存在轻微漏光,但对日常使用影响不大。两侧的显示器是 2012 年生产的 DELL 2412M。显卡为 3080Ti,考虑以后将三台都升级为 4K,使用每英寸像素数(PPI)来评估显示器清晰度更为合理和直观。4K 显示屏让眼睛更舒适,绝对提高幸福感。^[[选择合适自己的显示器](https://sspai.com/prime/story/display-04-buyingguide-01)] + +显示器疑问: + +- 使用不同分辨率和刷新率的显示器是否对视觉和视力产生影响?(之前看到的说法是影响不大。) +- 旧显示器需要多久更换一次?如何判断它们的寿命已到? +- 放在屏幕上方的防蓝光灯是否有效? + +DIY 显示器(面板 + 公版控制器): + +- 便宜,但没有厂家优化,显示效果打折扣。 +- 需要确认购买的显示面板是否为二手。 +- 我连续购买了两个面板都出了问题,分别是碎屏和无显示。 + +### 台式电脑 + +2022.03.16 淘宝入手 DIY 台机 i7+3080ti,费用 16500。虽然价格贵了点,不过赶在疫情封控两个月前,用上新电脑。原本想入手联想 刃 9000K 2022(i7+3070ti,价格 14000),但一直无货。这款机箱由联想定制,散热更好,配置足够日常使用,另外还有品牌机售后优势。相比联想,入手的 DIY 电脑内存频率从 4400 升至 5200,显卡从 3070ti 升至 3080ti,性价比更高,而且是现货。 + +如果使用悬挂主机托架,需考虑主机重量、升降桌承重。 + +### 书桌灯 + +我在书桌上使用了米典护眼读写灯,众筹价为 400 元。这款灯的光线级别达到 AA 级,可以替代屏幕上的挂灯。 + +通常情况下,我会开着书桌灯,而顶灯一般是关着的。当只有屏幕和桌面上有光,其他区域都处于黑暗中,我能更专心地工作。 + +未来,我希望能在书房里增加一些色彩,考虑使用 yeelight 灯带。 + +### 升降桌 + +电动升降桌的调节高度范围一般在 0.6 至 1.2 米之间,可以考虑乐歌和京造。如果你想站着阅读,还可以考虑添置一个阅读架。 + +### 静电墙贴 + +@chen 出的绝妙主意,将静电墙贴当白板用,可以任意随时的记录。不过为用红色白板笔不好擦,准备试试 PVC 材质的静电墙贴。 + +## 数码 + +### 降噪耳机 + +以下是降噪耳机的比较,按降噪效果从低到高排列: + +- Freebuds Studio:华为生态。 +- Sony 1000XM4:于 20 年发布,降噪效果强,但偶尔会翻车。 +- Bose 700:于 19 年发布,长时间佩戴舒适,但佩戴时间过长会感到很热,有人说这款不如旧款 QC 35 II。我于 2021 年 6 月以 1300 元购入,后来在闲鱼以 899 元售出。 + +还试用过其他无线耳机,如下所述: + +- 10 元:购买自拼多多,通话效果勉强,但音乐质量非常差,声音仿佛来自另一个世界。 +- 50 元:倍思,通话和音乐效果都还不错,但在地铁里几乎听不到声音。不知是不是因为习惯了降噪耳机,带普通耳机只能听到地铁的噪音。 +- 小度半入耳耳机:容易松动,甚至在走路时容易脱落;偶尔无法识别,必须重新放入电池仓进行充电。 +- 悦虎 1562M:闲鱼山寨品牌,据说音质不错(?),但主要适用于苹果设备。如果使用安卓设备,对音质要求不高,可以选择 QCY。 + +### 充电器 + +充电器用了几年后,注意及时更换,因为老化会导致充电速度变慢。 + +氮化镓充电器非常适合外出快速充电。不要购买无品牌的廉价充电器,虽然它们可能具有高参数和强大功能,但充电芯片质量没有保障,容易导致过热充电,从而影响设备的寿命。 + +### UPS + +随着 NAS 硬盘数量的增加,建议使用 UPS 以防止因突然断电而导致的硬盘损坏。 + +在考虑 NAS UPS 时,可以考虑购买 APC BK650M2-CH 和山特(SANTAK)TG-BOX 850。 + +### 3D 打印机 + +3D 打印机使用时,打印原料会产生有害气体,不适合在家中使用。如果偶尔需要打印,建议在网上寻找专业人士定制。 + +## 健康 + +### 代餐 + +代餐:无营养,不能起到减肥作用,容易掉肌肉。 + +### 体重秤 + +华为体脂秤 2 Pro 太过敏感,经常不准确。 + +### 椭圆机 + +椭圆机的稳定性至关重要,机身越重越好。一般型号只有 68 公斤,好的型号可以达到 86 公斤。飞轮重量必须达到 12 公斤,否则使用时可能不够稳定。 + +按照这些标准,推荐斯诺德 E690 和迪卡侬 EL 900。 + +### 眼部按摩仪 + +严选眼部按摩仪噪音较大,但其他品牌也没好多少。如果买新的眼睛按摩仪,建议选择蛋白皮材质,适合长期使用。 + +- 倍轻松:睡眠模式只有热敷。 +- 小米有品摩摩哒:无法关闭音乐,震动效果较弱,气囊挤。 + +### 泡脚桶 + +泡脚桶的新旧款别不大,比较特别的功能是蒸汽泡脚,但评价普遍一般。建议选择传统深桶,可以漫过小腿。 + +### 睡眠监测 + +在健康监测方面,我比较重视睡眠时间的监测。 + +曾使用过 37 度睡眠监测带,但准确性不高,只适合用于家庭自动化(例如,作为触发器自动拉开窗帘)。我也考虑过更换为 Apple Watch 8/SE。然而,戴上 Apple Watch 会舒适吗?另外,我的手机是安卓系统,Apple Watch 是否兼容安卓手机或 iPad? + +试过小米手环和华为 GT 手表,但无论使用何种手环,始终感到不舒适,尤其是在炎热的天气里容易出汗。我尝试过硅胶、金属和尼龙编织表带,都没有明显改善。 + +- @木木:用过 Nike 的那个孔状的表带改善了,然后我用洗眼镜的超声波盒子每天洗表带汗藓情况进一步改善,于是我最后通过实验,每天用酒精消毒液洗表带 +- @ZxoudXc:硅胶(最舒服的材质了) + 一点点风油精 不能说根治把。但是体感很爽,特别是在空调房里面。希望有帮助。 + +## 厨房 + +### 冰柜 + +与其他人不同,我想要冰柜只是冰箱放不下了。我喜欢买速冻包子、饺子,这类一买就得买很多包,否则价格高很多。换个思路,趁着优惠多买些速冻产品,冰柜的费用很快就回来了。我看中的是 135L 的卧式冰柜,价格 700,如果家里用不到了,扔起来也不会心疼。 + +比起卧式冰柜,立式拿取方便,但分层后存储空间受限,没法放体积特别大的东西,比如大包的生鲜,整条的羊腿。立式占地虽小,但小的有限,容量相等的情况下,基本是 0.4 平和 0.5 平的区别,而且立式高度更高,容易影响视线。 + +### 切肉机 + +电动切肉机用起来蛮慢的,切 5 斤肉需要 30 分钟。机器清洗也很麻烦,建议每次切肉时都将整条一起切好。 + +使用前,向滑轨喷食用油,可以降低切肉卡顿的几率。使用时,为了避免冻手,两只手都先带一层劳保手套,外面再套一层 PVC。左手固定肉块左侧,右手扶助肉块后端。不要过分往前推,避免肉切得太厚。 + +### 净水器 + +**RO 膜方案**:纯水过滤,可直饮。RO 膜机器较大,一定要量好厨柜尺寸。在选择时,不必参考废水量,废水量越低对滤芯压力更大。一些攻略指出 RO 膜的出水速度较慢,而滤芯更换频率较高(最快 1-3 个月一次)。然而,这些问题早已得到解决。相反,我因为滤芯更换速度过慢而感到焦虑。通常,DIY 前置滤芯寿命是 3-6 个月,但我购买的 DIY 净水器用了一年,还没提醒更换滤芯。最后我只能盲换,跟超滤方案一样了。 + +建议购买小米、美的等成熟净水器方案。它们的价格通常在 1500-2000 之间,仅需要更换两个滤芯:复合滤芯(2 年更换一次,售价 299 元)和 RO 膜滤芯(5 年更换一次,售价 999 元)。仅更换滤芯的年均成本为 350 元。总体来看,DIY 所谓的性价比并不太高。 + +**超滤方案**:保留矿物质(?),无需通电,大通量过滤。不足之处难以确认滤芯更换的时间,只能根据滤芯使用时间来预估。全套新机器的价格为 1500 元,之后每两年更换一次 EF-900P 滤芯(售价 350 元),每四年更换一次超滤 LU3B-5C 滤芯(售价 600 元),仅更换滤芯的年均成本为 325 元,如果全套更换,年均成本为 425 元。 + +旧配置:立升 LU3B-5C + 爱惠浦 EF-900P (别要赠品,折现) + 爱惠浦滤头垡头 QL2U + 无铅水龙头。这是用了几年的方案,但随着立升的超幅涨价,超滤玩家的变少,越来越难以实现了。另外,配机时记得买好配件。比如买爱惠浦滤头垡头 QL2U 时,问清楚是**几分进几分出**。常用的两边都是 3 分口,要配 2 个 3 分进 2 分出的接头,方便接 2 分水管。接口是可以送的,要跟店家说送接口、水管。没送的话,可以自己买 1 根 5 米的 2 分 PE 管、1 个 4 分转 2 分的接头 (立升转爱惠浦)、2 个 3 分转 2 分的接头、1 个 2 分球阀。 + +![](https://img.gpt-vip.top/2022-06-10-14-57-16.png?imageMogr2/thumbnail/500x "超滤净水示意图") + +## 家居 + +### 维修 + +日常维修以京东到家为主,或使用商家外包常用的[鲁班到家](https://www.lbdj.com/)。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。 + +### 电熨斗 + +挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。 + +### 牛皮席 + +夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。 + +最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。 + +### 消毒液 + +参考[消毒剂选购不完全指南](https://sspai.com/prime/story/disinfectant): + +- 84 消毒液:爱特福、龙安、蓝月亮、康威龙。 +- 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。 + - 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。 + - 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。 +- 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃 + - 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。 + +## 小物 + +- 能面具 (树脂),但带眼镜不方便使用。 +- 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔 +- 内裤清洗机 +- 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。^[[Room Tour |新家的厨房里有什么?](https://sspai.com/post/73604)] +- 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。 + +## 可能放弃 + +### 电子书 + +我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。 + +电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。 + +### 微单相机 + +原计划购买索尼 a7m4 微单相机,但随着疫情的发展,这个想法逐渐淡化,优先级下调。 + +关于镜头选择:F 值越小,光圈越大,适合虚化背景。 + +- 腾龙 28-75mm F2.8(适合日常旅行) +- 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影) + +### 无线麦克风 + +RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。 + +鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。 + +### 洗碗机 + +由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案? diff --git a/docs/family/baby/README.md b/docs/family/baby/README.md new file mode 100644 index 0000000..b2d185b --- /dev/null +++ b/docs/family/baby/README.md @@ -0,0 +1,16 @@ +--- +article: false +index: false +title: 育儿记录 +icon: emoji +--- + +面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 + + + +
+ +
+ + \ No newline at end of file diff --git a/docs/family/baby/birthing.md b/docs/family/baby/birthing.md new file mode 100644 index 0000000..516d4ae --- /dev/null +++ b/docs/family/baby/birthing.md @@ -0,0 +1,21 @@ +--- +article: false +title: 生产前的准备 +order: 1 +--- + +## 不要囤货 + +不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 + +## LDR 的选择 + +LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。 + +## 陪护的重要性 + +对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。 + +## 送花:一个小小的惊喜 + +若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。 diff --git a/docs/family/baby/newborn.md b/docs/family/baby/newborn.md new file mode 100644 index 0000000..923bb05 --- /dev/null +++ b/docs/family/baby/newborn.md @@ -0,0 +1,50 @@ +--- +article: false +title: 新生儿期(0-6 月) +order: 2 +--- + +## 坚持母乳喂养 + +为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) + +> - 母乳喂养是婴儿出生后最佳喂养方式。 +> - 婴儿出生后不要喂任何母乳以外的食物。 +> - 应坚持纯母乳喂养至婴儿满 6 月龄。 +> - 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。 +> - 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。 +> - 婴儿哭泣诱导母亲释放催产素。 + +## 宝宝醒了吗 + +初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。^[[母性科学](https://www.bilibili.com/bangumi/play/ep272469)] + +## 宝宝哭闹的原因 + +宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,**哭闹是婴儿表达饥饿信号的最晚表现**。 + +在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。 + +喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。 + +> 新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。 + +除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。 + +婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。 + +婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。 + +## 月嫂:助手还是潜在风险? + +月嫂为新父母提供宝贵的育儿知识,但务必确认其**是否携带药物**。若有,应要求其将药物存放于宝妈房中。 + +我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。 + +在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。 + +第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。 + +第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。 + +为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。 diff --git a/docs/intro.md b/docs/intro.md new file mode 100644 index 0000000..2770930 --- /dev/null +++ b/docs/intro.md @@ -0,0 +1,13 @@ +--- +article: false +title: 个人介绍 +icon: any +--- + +互联网广告人, + +迷信新工具、新方法, + +坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, + +热衷于研究开源软件和心理学理论,定期分享探索成果。 diff --git a/docs/reading/.nojekyll b/docs/reading/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git "a/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\345\220\203\346\216\211\351\202\243\345\217\252\351\235\222\350\233\231.md" "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\345\220\203\346\216\211\351\202\243\345\217\252\351\235\222\350\233\231.md" new file mode 100644 index 0000000..5425fcc --- /dev/null +++ "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\345\220\203\346\216\211\351\202\243\345\217\252\351\235\222\350\233\231.md" @@ -0,0 +1,153 @@ +# 吃掉那只青蛙 + +《[吃掉那只青蛙](https://book.douban.com/subject/27130739/)》的核心是每天先完成重要的工作、吃掉丑陋的青蛙。 + +## 明确目标 + +明确目标:确定自己究竟想要什么。目标清晰至关重要。在每天开始工作之前,把你的目标全部写下来。 + +1. 现在就拿出一张纸来,列出你明年最想实现的 10 个目标。在写下这些目标的时候,设想着明年已经过去,这些目标已经实现。 + 用第一人称、现在时、积极的语气来写,这些目标就能立即进入你的潜意识。例如,你可能会写,「我每年赚 X 美元」,「我的体重 X 斤」,或者「我开哪个品牌/哪一款车」。 +2. 然后,检查你前面列出的 10 个目标,并从中挑出一个,设想一下如果这个目标实现了,就会对你的生活产生最大程度的积极影响。无论这个目标是什么,都把它写在另外一张纸上,给这个目标设定一个实现的最后期限,然后制订一份计划,并针对计划采取相应的行动,而且坚持每天都做一些有助于你实现这一计划的事情。坚持去做,这项练习会改变你的生活。 + +## 每天提前做计划 + +每天提前做计划:一边思考,一边把你的想法写在纸上。你花费在准备工作上的每一分钟,都将使你在工作过程中节约 5 ~ 10 分钟。 + +1. 从今天开始,你要对每个月、每一周、每一天的工作提前制订计划。请拿出一个记事本或一张白纸(也可以用你的电子助手或手机上的软件),把未来 24 小时内要做的所有事情都列在上面。当你随时想起需要添加的事项时,就把它们写进去。把所有关系到你未来的重大项目写下来,放在一个单独的清单里。 +2. 把每一项主要目标和任务都写在计划上,然后根据优先级和时间顺序,把最重要的和需要最早完成的排在前面。然后安排次重要的,并以此类推。最后以计划的终点倒推工作的起点。 + 把你的想法都写在纸上!无论做任何工作,都先列出一份计划。这样做了之后,你会发现自己的生产力迅速提升,吃掉那只青蛙也变得更加容易。 + +## 将 80/20 法则用于你的所有任务 + +将 80/20 法则用于你的所有任务:你的所有任务中,其中有 20%的任务能产生 80%的结果。因此,尽量把你的精力集中在那 20%的任务上。 + +1. 制订一份计划,在上面列出今天你所有关键的目标、活动、项目、生活中的责任。有没有可能在这些任务中,最重要的 10%~ 20%代表或可能代表了你 80%~ 90%的结果? +2. 今天就来解决这个问题:对于可以改变你的人生和事业的少数活动,你应该花费越来越多的时间;对于不会影响你的人生和事业的低价值的大量活动,你花费的时间应该越来越少。 + +## 考虑效果 + +考虑效果:你最重要的、优先级最高的事情是那些将对你以后的生活或工作产生最重要影响的事情,无论其影响是正面的还是负面的。你应当最优先处理这些事情。 + +1. 回顾一下你的相关任务、活动、项目。不断重复地问自己:「在工作或个人生活中,我出色又及时地完成哪一项项目/活动,会给我带来极大的正向回报呢?」 +2. 每天的每个小时,你要决定这个时间单元最重要的事情是什么,然后约束自己不断地将时间用在最有价值的工作上。思考下一步最重要的事情又是什么,如此循环。 + 不管接下来要做的工作是什么,都把它设定为一个目标,为此制订一项计划,并立刻行动去完成这项计划。记住歌德的那句名言:「只有找到能够吸引你、让你燃起内心激情的部分,并马上投入其中,你才能完成你的工作。」 + +## 「创造性拖延」练习 + +「创造性拖延」:既然你没有时间去安排所有的事情,你就必须学会推迟处理那些没有什么意义的工作,从而腾出时间来处理那些少数的、重要的工作。 + +1. 在生活的各个方面,你都可以应用归零思考法(zero-based thinking)来思考问题。不断地问自己:「如果我还没有开始做这件事情,而且我已经知道做完的后果,今天我还会如此这般再做一次吗?」如果答案是否定的,那么这件事就应该创造性拖延或取消。 +2. 根据你目前的状况,重新审视、评估你工作和生活中的活动,挑出其中至少一项,立刻放弃,或者创造性拖延,直到你完成那些更重要的事情为止。 + +## 持续不断地练习使用 ABCDE 法 + +持续不断地练习使用 ABCDE 法:根据自己列出的任务计划,在开始工作之前,先抽出一点时间,根据优先级对这些事情进行安排,从而确保你先处理最重要、最有价值的事情。 + +1. 现在,回顾你的工作计划,然后在每一项任务或工作之前标上 A、B、C、D 或 E。选择标记为 A-1 的工作或任务,然后立即动手处理,切记必须在完成这项工作之后再开始做其他工作。 +2. 在接下来的一个月,每天都练习使用 ABCDE 法来处理每一项工作。这样坚持一个月以后,你就会养成先处理优先级最高的任务的习惯,你的未来就会尽在掌握之中! + +## 聚焦关键结果领域 + +聚焦关键结果领域:要想圆满地完成自己的工作你必须具备哪些能力和技能?找出答案,然后日益精进,解决上述问题。 + +1. 找出工作中的关键结果领域。这些职责是什么?把它们写下来。找出自己在每个环节内的优劣势。然后,确定一种技能,如果你在这方面优势突出的话,那么它将对你的工作有极大的帮助。 +2. 带着这张清单去拜访你的领导,并与他讨论清单上列出的工作。请他做诚实而中肯的评价。只有虚心听取他人提出的建设性意见,才能不断地完善自己并取得进步。此外,还要与你的同事、爱人进行探讨、交流。在你以后的职业生涯中,应该养成定期进行分析的习惯。不断强化这种习惯,这个决定本身载能改变你的生活。 + +## 遵守「3 个」定律 + +遵守「3 个」定律:找出你的工作中的最重要的 3 件事情,你对公司 90%的贡献都来自这 3 件事情。无论如何,都先把这些事情做好,然后,你才能腾出更多的时间来安排个人的家庭和生活。 + +1. 找出工作中最重要的 1 项任务。你可以问自己:「如果我每天只能完成 1 项任务,哪项任务对我的工作贡献最大?」然后重复两遍同样的问题。按照这种方法找到工作中最重要的 3 项任务之后,每天把所有的精力全部放在这 3 项任务上。 +2. 确定生活中最重要的 3 个目标,然后根据优先级别进行排序。针对这些目标制订相应的计划,然后全力以赴去实现。持续几个月至若干年之后,你会为自己取得的成就感到惊讶。 + +## 做好充分准备再行动 + +做好充分准备再行动:开始工作前,先把一切都准备就绪,包括所有的资料、信息、工具、材料,以及你需要的数据,然后,你就可以全身心地工作了。 + +1. 认真地检查你家中和公司的办公桌,然后问自己:「哪个类型的人会在这种环境中工作?」你的工作环境越干净、整洁,你就会越积极、高效、自信地投入工作。 +2. 下定决心,今天就把办公桌和办公室收拾得干干净净、整整齐齐,这样你会感觉每次都能高效地开始工作。 + +## 每次到达下一个油桶 + +每次到达下一个油桶:如果你每次能阶段性地推进下一步工作,那么你就能完成最艰巨、最复杂的工作。 + +1. 任意选择一个曾经被你拖延的目标、任务或项目,从现在就开始迈出第一步。有时候,要开始一件事情并不难,你只需坐下来,把所有必要的步骤都列出来就足够了。 +2. 接下来,马上从第一步开始,一步一步、循序渐进地去做这件事情。最终你会惊讶地发现自己取得的成就非凡。 + +## 升级核心技能 + +升级核心技能:你在自己的关键领域内知识越全面,技能越娴熟,你动手就越快,任务完成得就越早。 + +1. 找出能够帮助你更快更好地实现目标的、最有效的关键技能。决定你必须具备哪些核心竞争力,这些核心竞争力能够在未来让你在专业领域脱颖而出。不管这些能力是什么,你都要设定目标、制订计划、开始构建和提升该领域的能力。在自己能力所及的范围内做到最好。 +2. 为了出色地完成最重要的任务,你应该制订一项个人计划,让自己充分地做好准备。专注于那些你具有特殊天分,并且非常感兴趣的领域。这是打开个人潜能的钥匙。 + +## 找到最关键的限制因素 + +找到最关键的限制因素:确定影响你实现目标的瓶颈和主要障碍,无论是来自外部还是内部,然后集中精力消除这些障碍。 + +1. 现在就确定你生活中最重要的目标。这个目标是什么?一旦实现这个目标,是否会对你的生活产生极大的积极影响?你工作中的哪项成就会对你的职业生涯产生非常积极的影响? +2. 一旦明确了自己最重要的目标,你可以问自己这些问题:「是什么制约了我实现这个目标?为什么我还没有实现自己的目标?是什么制约着我的进步?」找到答案后,立刻行动起来解决这些问题。你想做什么都可以,但必须要行动起来。 + +## 自我设定压力目标 + +自我设定压力目标:假设你即将离开所在的城市,外出一个月,离开之前必须把所有重要的工作都处理完。 + +1. 为自己的每一项任务和活动设定最后期限和各个阶段的最后期限。自己制定一个「强制系统」。不断提醒自己设定的最后期限,不让自己有丝毫的松懈。一旦设定最后期限,就严格执行,力争提前完成工作。 +2. 在开始最重要的工作前,把你的每一个步骤都写下来,然后确定每一步需要用多长时间。在你一丝不苟地完成这些工作的过程中,让自己不断与时间赛跑,并尽量提前完成工作。可以把这个当作一项游戏,让自己胜出。 + +## 激励自己将理想转化成行动 + +激励自己将理想转化成行动:做你自己的啦啦队队长。在任何情况下,都寻求事情积极的一面。把精力集中在如何解决问题上,而不是问题本身。要保持乐观向上的态度。 + +1. 控制自己的思想,让自己总是保持积极的态度。记住,你会成为你想成为的那个人,所以,只说你想说的,只做你想做的。 +2. 勇于面对现实、承担责任,使自己保持积极的心态。无论遇到什么事情,都不要去批评、埋怨、指责别人。去改善,而不是责怪。集中思想和精力向前看,不要理会其他。 + +## 技术是一个可怕的主人 + +技术是一个可怕的主人:把你的时间收回,不要让各种技术分散你的注意力,停止做技术的奴隶。学着经常把手机设备关机,并放在一边。 + +1. 在日常生活中,给自己留出一部分独处的时间。每天上午和下午各安排一个小时,在这段时间里,把所有的通信设备都关掉。你会惊讶地发现,没有什么区别! +2. 每周都给自己安排一整天时间。在这一天里,不开电脑,不用手机,也不使用任何方式与外界联系。到一天结束的时候,你会发现自己的心灵异常平静,思路格外清晰。当你腾出时间重塑精神能量之后,你吃青蛙会更有效率。 + +## 技术是一个非常优秀的仆人 + +技术是一个非常优秀的仆人:用技术工具帮你自己处理最重要的工作,把自己从最不重要的工作中解放出来。 + +1. 今天就痛下决心,推掉所有的通告,只给自己留下一个处理紧急情况的渠道。为你最重要的任务创造一个数字化生活的特定空间。 +2. 下决心研究、安装一个软件或 App,让它帮你变得更加高效和专注。 + +## 集中注意力 + +集中注意力:停止不断地打扰和分心,影响你正在完成的最重要的工作。 + +1. 在大脑中保持对成功目标和高效生产力的追求。在你开始做任何事情之前,都要先问问自己,「这会帮助我达成最重要的目标吗,还是仅仅是一个干扰而已?」 +2. 拒绝成为各种警报声和提示音的奴隶,这些只会使你从即将真正改变人生的任务中分心。让你的通信设备处于关闭的状态。 + +## 奶酪和香肠工作法 + +奶酪和香肠工作法:把复杂而又艰巨的大任务分割开来,变成许多部分,每次只处理一小部分。 + +1. 立刻将这些技巧付诸实践。选择一项你拖延的复杂而艰巨的任务,无论是用「香肠工作法」还是「奶酪工作法」,都去立即着手处理这项任务。 +2. 把自己变身为「行动派」。高效能人士有一个共同点,每当他们听到一个好点子,就会立刻行动。所以他们学得更多,学得更快,并能得到更好的结果。不要迟疑。今天就试试这种方法! + +## 创造整块的时间 + +创造整块的时间:为自己安排一份日程表,然后留出大块的时间来处理对你来说最重要的事情。 + +1. 多思考和尝试用各种不同的办法来节约、安排或创造大块的时间。用这些时间去处理那些重要的、长期能产生重大影响的任务。 +2. 充分发挥每一分钟的价值。提前计划并做好准备,从而能够持续不断地、不受干扰地进行工作。最重要的是,把精力集中在你负责的最重要的工作上。 + +## 保持紧迫感 + +保持紧迫感:养成迅速处理关键任务的习惯。把自己培养成一个能迅速、圆满完成工作的人。 + +1. 从现在开始,无论做什么事情都要培养一种紧迫感。选择一个自己可能会拖延的领域,决定在这个领域内养成马上行动、决不拖泥带水的习惯。 +2. 当你看到一个机会或者发现一个问题时,应当立刻采取行动。当你接受了一项任务或承担了某个责任时,应当迅速完成并及时向领导汇报结果。你应当在生活的重要领域快速地行动。当这一切成为习惯之后,你的感觉会更好。 + +## 单独处理每一项任务 + +单独处理每一项任务:根据事情的优先级安排优先处理哪些事情,然后立即着手处理最重要的、必须优先处理的事情,全心全意地去做这件事情,决不中途停止,直到 100%完成为止。这是工作高效、个人生产力最大化的关键所在。 + +1. 立刻行动!现在就确定对你来说最重要的工作和任务,然后立刻全身心地投入这项工作。 +2. 一旦开始工作,就约束自己在工作过程中心无旁骛,不受外界干扰,也决不分散自己的注意力,直到工作 100%完成,把这个当作一项测试,看自己是否能做出决定并完成。一旦开始工作,就坚持到底,直到全部完成为止。 diff --git "a/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\217\220\345\215\207\346\200\235\347\273\264.md" "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\217\220\345\215\207\346\200\235\347\273\264.md" new file mode 100644 index 0000000..4d173d5 --- /dev/null +++ "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\217\220\345\215\207\346\200\235\347\273\264.md" @@ -0,0 +1,53 @@ +# 提升思维 + +## 成长的边界 + +《[成长的边界](https://book.douban.com/subject/35410754/)》是探索更多的可能性,从外部视角审视自己。 + +- 尝试新的活动、建立新的网络、寻找新的榜样——来发现这些可能性。 +- 不要纠结于执行细节,从外部视角去审视项目。多从其他案例来类比,这样更容易理解,也可以检查自己的项目是否靠谱。 +- 公正 P56:遵守传统可能将一个人引入令人满意的生活状态,并使他远离伤害。“可是他作为一个人所具有的相对价值是什么呢?” + +## 福格行为模型 + +> Behavior = Motivation + Ability + Prompt + +《[福格行为模型](https://book.douban.com/subject/35594496/)》是习惯养成的行为设计学。明确你的愿望或成果,然后尽可能多的罗列行为,最后找到适合你的黄金行为。习惯从微小的行动开始,比如:开煤气灶 - 烧开水 - 煮粥 - 早餐。 + +坏习惯的养成也是基于该行为模型。大部分的坏习惯并非出于 Motivation,而是被 Prompt 触发。按 `Prompt > Ability > Motivation` 顺序找到坏习惯的养成原因,依次解决。 + +## The 5 AM Club + +早上 5 点 - 8 点,专注做 Personal Project,比如读书、考证、写作和你特别想做的事情。 + +为了 5 点起,我们需要晚上 9 点半睡。刚开始时,无法立刻调到 10 点睡觉,可以以半小时为刻度,逐渐调整。 + +之所以把最重要的 Personal Project 放在凌晨 5 点,是因为早起的静力最好,凌晨也不会有其他人的打扰,而晚上是我们效率较低的时候。^[[坚持 5 点起床一年,我搞懂了早起改变人生的秘密](https://autoaigpt.cn/watch?v=4zXTyc2ZjXM)] + +## 终身成长 + +《[终身成长](https://book.douban.com/subject/27154533/)》书名与内容不太符合,它更多地是通过各种案例描述**成长型思维和固定型思维**。 + +- 称赞孩子:不要表扬她的智力和取得的成绩,而是问她一些问题,这些问题会让她回想起自己付出了多少努力学习,而且这一年中她取得了多大的进步。 +- 面对挑战:不要因害怕失败而停止努力,而是想如何去实现它。比如有个人申请学校失败,但在她主动找学校咨询准备再度申请,如何修改申请书时,她获得了录取。 +- 控制愤怒:1. 告诉对方你的感受;2. 离开现场,写下自己最丑恶的想法,再写下真正发生的情况。当你觉得自己足够平静了,可以再回到事情本身。 +- 应对固定型思维:注意并识别固定型思维出现的时刻,为其命名,并与之对话。 + +## 这就是 OKR + +《[这就是 OKR](https://book.douban.com/subject/30396635/)》介绍了硅谷创业团队在使用 OKR 时遇到的问题、阻碍以及取得的成果,让人更容易理解 OKR 的作用。个人觉得,OKR 的优点在于聚焦优先事务,提高团队透明度,让整个团队朝着一个方向努力。 + +OKR 可以分为承诺型和愿景型。承诺型 OKR 是必须完成的目标,而愿景型 OKR 则是超出团队执行能力,需要一点奇迹/运气发生,并且需要非常努力才能完成的目标。OKR 目标应该具有挑战性,但同时也要认清现实。 + +OKR Tips: + +- 指定 3-5 个关键结果。 +- 每周检查 OKR 进度。 +- 目标 > OKR(季度计划/指标) > 周清单 > 日清单 +- 生活 OKR 在家人间公开,互相监督,比如夫妻间。 + +## 拥抱可能 + +[拥抱可能](https://book.douban.com/subject/34934459/) 是由九十岁的著名心理医生 Edith Eva Eger 所写的回忆录。Eger 是一名来自匈牙利的犹太人,也是奥斯维辛集中营的幸存者。 + +书中前半部分,Eger 以深情的笔触描绘了她在困境中的选择,情节震撼人心;后半部分则转向描述她的患者和他们的情况,相较前半部分显得平淡。这本书并非典型的心理学著作,它的英文原名《The Choice: Embrace the Possible》比中文译名更能准确反映书的精髓。 diff --git "a/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\262\237\351\200\232.md" "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\262\237\351\200\232.md" new file mode 100644 index 0000000..da2adc7 --- /dev/null +++ "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\346\262\237\351\200\232.md" @@ -0,0 +1,67 @@ +# 沟通 + +## 阅人无数 + +《[阅人无数](https://book.douban.com/subject/35440574/)》是关于如何与他人建立有效沟通的书。 + +- 沟通技巧要经常锻炼。 +- 克服本能:本能诱使我们使用武力去促使他人按我们的希望行事。 +- 威胁、恐惧会让对方采取恶意顺从方式,表面服从,背地里做一些事去挑战那些企图控制他们的人的权威。 + - 提前组织语言,避免攻击性语言,同时尊重事实,承认对方的感受。 + - 将注意力放在解决问题上,而不是发泄情绪。 + - 比起控制,给予对方选择权更能促使对方配合,而控制常常引起叛逆。 +- 反馈式聆听(SONAR):复述 - 指出矛盾 - 不要争论 - 强化正面信息 - 诠释总结。(p.113) + +### 不会聊天怎么办? + +聊天的艺术并不在于说正确的话,而是在于倾听。将猴子模式融人你的人际互动中,意味着你要少说多听。你的目标应该是了解他人的背景、动力和价值观。要做到这点不容易,特别是对生来就内向的人来说。如果你觉得和别人聊天气都很不自在,那就更别谈去挖掘别人的价值观和信仰了。 + +第一步:倾听 +仔细倾听,从对方的言谈中找到他们的兴趣和价值观。良好的交流在于倾听和反馈(反馈技巧见第四章)。一旦你从他人那里获得一些信息后,就可以在这个基础上拓宽、深化你们之间的交流,直到你完全了解对方。其实这样挺轻松,因为你只需不断鼓励别人多说,而你却不必怎么谈论自己,除非你想这样做。 +第二步:分享 +相似的经历可以加强人们之间的纽带,使人们更亲密。相似的经历非常适合用来开启一次聊天,因为它能快速建立一些共同点。研究发现,如果我们遇到和自己相似的人,我们就会给他贴上正面的标签。火车延误让通勤的人互相同情;作业太难让学生们彼此理解;新生儿的父母们因睡眠不足感到同病相怜。相似的经历能够自然而然地将人们连接在一起。 +如果你不确定你和对方有什么共同的经历,你可以从大多数人都会经历的事情人手,比如假期、工作或家庭。如果你能让对方主动开口,那么你就掌握了聊天的密匙。你可以将他们分享的信息作为你的原材料。想必你曾遇到过一些善于交际的理发师或出租车司机,在们的引导下你会滔滔不绝地讲自己的经历。 +第三步:引导 +少说多听。心理学家十分擅长让客户提供信息,却很少透露自己的信息。因为人们总是喜欢谈论自己,这没什么难度。你可以就对方感兴趣的话题扔出几个问题或适当引导一下,对方就会打开话匣子谈下去。这并不是说你不能参与进去分享自己的故事和经验。只是,当你谈论自己时,尽量遵照 2:1 的比例,最好是 3:1。优秀的猴子善于把话题扔给对方,不会自己说个不停。 + +### 家庭十诫 + +1. 如果我对家人说脏话,我需要道歉: +2. 如果我冲家人嚷嚷,我需要道歉; +3. 如果我侵犯了家人的个人空间,我需要道歉; +4. 如果我说了什么不该说的话或者过分的话,我需要道歉;5.如果家人想冷静一下,我会给他们空间; +5. 如果我想冷静一下,我会告诉家人; +6. 我绝对不会为了在吵架中占上风而恐吓家人; +7. 当我需要发泄怒火时,我不会伤害任何人(包括我自己),也不会砸东西或损坏家里的任何物品; +8. 我永远也不会动手伤害我的家人; +9. 这是我的家,他们是我的家人,我会尊重他们,爱他们。 + +## 掌控力 + +《[掌控力](https://book.douban.com/subject/26970523/)》的大部分内容都是 CIA 的审讯记录,阅读起来相当费劲。书中的内容不仅与普通人的生活相距甚远,而且里面充斥的西方观点与东方的道德观也存在巨大差异。 + +以下是提取出的谈判技巧: + +- 开场:放慢语速、建立联系、降低音量。 +- 不要直接提出“你是否做了某事”的问题,而是提出相关问题,假设对方已经做了。例如:“詹,你现在还有多少氧可药在手上。”(涉及偷药问题) +- 称呼某人的名字,特别是去掉姓氏,可以积极影响双方的熟悉程度和好感度。当听到自己的名字时,我们通常会从说话模式切换到倾听模式。 +- 让对方喜欢自己。因为对于我们喜欢的人,拒绝他们或拒绝为他们做事会产生巨大的人际和社会压力。 +- 谈话中避免对他人进行评价。 + +### 促使他人坦白 + +- **合理化行为**:任何人的行为都有其理由或借口。对方行事时,总是有其合理性。通过对话,你可以在不损害对方尊严的情况下,帮助他们解释行为背后的理由,以便让对方坦白。 +- **引导责任**:我们都知道,当不好的事情发生时,把责任推到他人身上有多么轻而易举。承担全责是艰难的,尤其是在潜在后果非常严重时。所以,你需要让审讯对象承认他自己的过失变得尽可能容易。在对话中,告诉对方不管他做了什么都不完全是他的责任是非常有效的,那么错误由谁承担呢?社会、学校、制度或政府,往大了想——大的实体总是更容易辩护,因为它更为模糊。如果你具体了,就对自己不利,因为听上去你似乎在对他允诺什么,或让他洗脱罪名。 +- **淡化严重性**:鼓励对方不过分关注行为的潜在后果。一个有效方法是减轻问题的严重性。你不需要暗示说这不是个问题,而是应阐述问题可能更糟,而现在的情况是可以解决的。你可以说“这并不是世界末日”或“这是个可以解决的问题”,但你不能说明如何“解决”。 +- **社会化处境**:让对方感到自己不孤立,而是在一个共同体内。通过将其他人纳入对话,让他知道其他人也和自己在同一条船上,可以实现这一目标。例如,“我们以前什么都遇到过,没什么好惊讶的”。 + +### 让儿童坦白 + +在与儿童交谈时,请考虑以下要点: + +- 解释谈话的目的,以确保儿童感到舒适和安全。 +- 注意,儿童可能会说出他们认为你想听的话,而不是真话。 +- 分享自己的成长故事,特别是在儿童年龄时犯的错误,以建立联系和显示理解。 +- 提出明确、简单的问题,使用具体的词汇,确保儿童能够理解。 +- 避免对儿童说谎,因为这可能降低他们的信任,尤其在期望他们坦白时。 +- 作为家长,只在必要时采用对话技巧,例如在涉及作弊或犯罪情况时。但频繁用于督促孩子做家庭作业或打扫房间这样的事,会使这种方法的有效性降低。 diff --git "a/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\350\220\245\345\205\273.md" "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\350\220\245\345\205\273.md" new file mode 100644 index 0000000..2ddc74d --- /dev/null +++ "b/docs/reading/0_\350\207\252\346\210\221\346\217\220\345\215\207/\350\220\245\345\205\273.md" @@ -0,0 +1,42 @@ +# 中国居民膳食指南 + +《[中国居民膳食指南(2022)](https://book.douban.com/subject/35885945/)》是由中国营养学会对中国人提供的膳食指导。网上很多它的要点截图,为了完整阅读,我直接买了书。 + +## 食材 + +对于三口之家来说,一般全家每天需要购买 3 种或不少于 1kg 新鲜蔬菜,并将其分配在一日三餐中。中、晚餐时每餐至少有 2 个蔬菜的菜肴。在一餐的食物中,首先保证蔬菜重量大约占一半,这样才能满足一天“量”的目标。膳食讲究辈素搭配,做到餐餐有蔬菜。除此之外,一个三口之家,一周应该采购 4.5-7kg 的水果。选择新鲜应季的水果,变换种类购买。 + +- 每餐有肉,每天有蛋。一个鸡翅(50g)就可以满足每天肉类建议量。建议 40~50g 为一份,原则上成人每人每天 3~5 份。每周最好吃鱼 2 次或 300-500g,蛋类 300-350g,畜离肉 300~500g。每月可食用内脏 2~3 次。 +- 餐餐有蔬菜,保证每天摄入不少于 300g 的新鲜蔬菜,深色蔬菜应占 1/2。 +- 天天吃水果,保证每天摄入 200~350g 的新鲜水果,果汁不能代替鲜果。 +- 吃各种各样的奶制品,摄入量相当于每天 300ml 以上液态奶。 +- 经常吃全谷物、大豆制品,适量吃坚果。 + +## 烹饪 + +- 培养清淡饮食习惯,少吃高盐和油炸食品。成年人每天摄入食盐不超过 5g, 烹调油 25~30g +- 控制添加糖的摄入量,每天不超过 50g,最好控制在 25g 以下。 +- 反式脂肪酸每天摄入量不超过 2g。 +- 不喝或少喝含糖饮料。 +- 儿童青少年、孕妇、乳母以及慢性病患者不应饮酒。成年人如饮酒,一天饮用的酒精量不超过 15g。 +- 鸡蛋应在 2~5℃冷藏,最好在 20 天内食用。 +- 清洗是清除水果和蔬菜表面污物、微生物的基本方法,对去除农药残留也有一定的效果,尤其当直接生吃水果和蔬菜时,更需要清洗。水洗是最常用的方法,一般先简单冲洗后浸泡,浸泡时间不少于 10 分钟,然后再用清水冲洗即可,对于西蓝花等蔬菜尤其需要。 +- 水开后蔬菜再下锅更能保持营养。 + +## 婴幼儿 + +母乳是婴儿最理想的食物。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。母乳有利于肠道健康微生态环境的建立、肠道功能及免疫功能的成熟,降低感染性疾病和过敏发生的风 + +母乳喂养营造母子情感交流的环境,给婴儿最大的安全感,有利于婴儿心理行为和情感发展,母乳喂养的婴儿最聪明。母乳喂养经济、安全而方便,并有利于避免母亲产后体重滞留,降低母亲乳腺癌、卵巢癌和 2 型糖尿病的发病风险。纯母乳喂养应坚持至婴儿满 6 个月。 + +1.什么是回应式喂养和按需喂养 +婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。 + +2.如何判断何时哺喂 +识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿时可能会出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。 + +3.如何判断婴儿因饥饿哭闹 +婴儿饥饿的早期表现包括警觉、身体活动增加、脸部表情增加;婴儿饥饿的后续表现才是哭闹。以下反应有助于判断婴儿饥饿:婴儿转向或寻觅妈妈的乳房,张大嘴巴,舌头向下伸出;做出吸吮动作或者吸吮手指。除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。 + +4.从按需喂养模式到规律喂养模式 +新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。 diff --git "a/docs/reading/1_\345\277\203\347\220\206\345\255\246/\345\275\261\345\223\215\345\212\233.md" "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\345\275\261\345\223\215\345\212\233.md" new file mode 100644 index 0000000..24d5e90 --- /dev/null +++ "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\345\275\261\345\223\215\345\212\233.md" @@ -0,0 +1,47 @@ +# 影响力 + +《[影响力](https://book.douban.com/subject/1786387/)》让其他人按你的想法行为。 + +## 固定行为模式 + +**当我们请别人帮忙时,如果能够讲出一个理由,那我们得到别人帮助的可能性就更大**。原因很简单,人们就是喜欢为自己所做的事找一个理由。 + +## 对比原理 + +对比原理会影响我们对前后两件事情之间的差异的判断。简单地说,如果两件东西很不一样,我们往往会认为它们之间的差别比实际的更大。所以,如果我们先拿起一样轻的东西,然后再拿起一样重的东西,就会觉得后者比单独拿起来时还要沉。销售时,**先将比较贵重的商品展示给顾客可以赚到更多的钱。**人们可能不会去买一件 500 元的毛衣。但他如果刚刚花了 4500 元买了一套西装,那 500 元的毛衣看起来就没那么贵了。 + +## 互惠原理 + +互惠原理认为,我们应该尽量以相同的方式报答他人为我们所做的一切。如果一个人送给我们一件生日礼物,我们就应该记住他的生日,等到他过生日时,给他买一件礼品。一旦当人们习惯地接受和赠送别人礼物的时候,这个方法看起来就不容易奏效了。 + +- 在建立客户关系中,这个基本原理是被无形地应用在方方面面中的,只要是需要与客户建立长久的关系,如果互动行为中不符合这个原理,那么很快你的名字会被客户忘记,甚至列做讨厌的人名单中。 +- 从儿时起,只要我们得到了他人的恩惠,就如坐针毡,浑身不自在。负债感会让我们感到极不愉快,以至于我们必须要将它除去。因此,仅这一个原因就能使我们心甘情愿地付出比我们所得到的多得多的东西。这样做的目的,仅仅是为了让自己逃脱负债感造成的心理重压。 +- 在印度尼西亚遭受海啸以后,中国政府赠送了大量的救灾物资包括食品和基本的日常生活必需品,在随后的一年以后,以往针对住在印度尼西亚的中国籍华侨的冲突事件数量明显降低。这就是一种国际间的互惠原理的体现。 +- 如果一个男人送给一个女人一件贵重的礼物,或是慷慨地为她晚上的消遣买单时,通常会让这个女人产生一种负债感,从而使她感觉极不舒服。即使像一杯饮料这种小恩小惠,也会让人产生负债感。 +- 但是,还可以**在赠送的时候直接将会被对方以为的目的说出来,并且强调自己不是这个目的,而且安慰对方不要有这个负担。其实际结果是对方这个负担更加强烈。** + +## 拒绝—退让 + +先提出一个比较大的、极有可能会被拒绝的请求,然后,当拒绝了这个请求之后,再提出一个小一些的、你真正感兴趣的请求。如果你能很有技巧地提出第二个请求,就会让我认为这第二个请求是你做出的一个让步,因而让我觉得自己也有义务做出相应的让步。 + +- 拒绝一方觉得自己对谈判的最后结果负有更多的责任。连续的拒绝会给拒绝方一种责任和压力,容易补偿性的接受一个。 +- 当他的要求由大变小时,我由拒绝变成了顺从,即使我对他提供的两样东西都毫无兴趣。 + +## 承诺和一致 + +承诺策略会先诱使我们采取某种行为或发表某种声明,然后再利用我们要与过去的言行保持一致的压力迫使我们就范。当一个承诺具有主动性、公开性并且需要付出更多的努力才能做到时,它更容易改变一个人的自我形象和未来行为。 + +- 一个公开做出的承诺更有可能导致以后固执地保持一致的行为。书面声明之所以能够有效地改变一个人,一个重要的原因就是它很容易被公之于众。当一个人公开选择了某种立场之后,马上就产生一种维持这个立场的压力,因为他想在别人眼里显得前后一致。 + - 品牌选择:一旦我们对某件事情做了决定,固执地坚持这个决定就成了一件对我们非常有吸引力的事情,因为我们真的不需要再为这件事情左思右想了。我们不必从每天得到的大量信息中辨别出相关事实,我们也不必动脑筋去权衡利弊,更不必再做任何困难的决定。当我们再碰到同样的问题时,我们需要做的仅仅是使我们所相信的、所表达的或所做的事情与我们之前的决定相一致。 +- 书面承诺之所以有效,另一个原因就是它比那些口头承诺需要更多的努力。履行一个承诺所要付出的努力越多,这个承诺对许诺者的影响就越大。 + - 一些跨国企业在招聘员工的时候,通过多达十几种各种笔试、面试、小组面试等手段来提高进入公司的难度,来强化进入公司的过程的难度,从而使新员工一旦进入了该公司,忠诚度就相对较高,至少比那些很轻松就进来的员工的忠诚度高许多。这种行为就是这个原理的应用。而且通过这种严格的考察、测试进来的员工对自己企业的自豪感也会由此增加。而那些轻易就招聘来的员工,他们离开公司的时候也非常容易,内心没有建立起来什么明显的自豪感和对公司应该有的凝聚力。 + - 当学生们要经历身体上痛苦而不是面子上的难堪才能加入一个团体时,他们对这个团体的评价往往会更高。人们珍惜并且相信他们努力奋斗得到的东西。经历了这些仪式才成为会员的人所具有的忠贞不渝的态度和献身精神,会极大地增强团体的凝聚力和生存能力。 +- 一旦人们同意了某个请求(如在请愿书上签名),他的态度就会发生改变,他会变成他心目中的那种人。他会答应陌生人的请求,会对自己所信奉的事情采取行动,会大力支持正当的事情。 + - 跨国企业总喜欢搞有奖征文。在写征文的过程中,自己会不知不觉地偏好了这个品牌,从而形成了不用思考就采购的行为,从而塑造了这些企业产品的时常份额。这是一种很有效的营销手段。为了赢取那些不易到手的、极具诱惑力的奖品,人们自愿参加征文比赛。而且他们知道,要想在比赛中胜出,就免不了对这种商品大肆吹捧一番。所以,他们会挖空心思地找出该商品某种值得称赞的特性,并在他们的文章中尽情赞美。这样做的结果就是,成千上万的人都用书面的形式为一种商品做了见证,紧接着,他们都感受到了一股奇妙的推动力,令他们不知不觉地就相信了自己所写的东西。但奖品不能太高,他们希望这些人能对自己的行为负责,不让他们有任何借口,也不让他们有别的出路。仅仅让这些人做出承诺还不够,还要让他们从内心深处对这个承诺负起责任来。 + - 对同事的一次好的行为给予公开赞扬,那么他下次做类似行为的可能性就远远高于不公开赞扬的情况。 +- 实际应用: + - 虚报低价:先给出一个很有诱惑力的价钱,让顾客做出买车的决定;接着,在顾客产生对这商品的承诺感——填一大堆的表格、考虑贷款后,但还没有最后成交之前,最初给出的那个诱惑却被巧妙地拿掉了。这时,顾客会下意识地找出一大堆理由来支持自己的购买选择。 + - 对同事的一次好的行为给予公开赞扬,那么他下次做类似行为的可能性就远远高于不公开赞扬的情况。 + - 在请求帮助前,可以问下“您今天晚上感觉好吗”,获得帮助几率会更高。隐藏在这一技巧背后的理论是:那些刚刚表明了自己一切都好的人(即使这样做仅仅是出于社交的需要),如果接下来显得很吝啬,那会让自己感觉十分难堪。 + - 意大利西服的销售人员永远牢记的是,只要客户对某款西服有兴趣,那么最好怂恿他试穿一下,一旦客户穿到身上,那么最好让他停留 30 分钟。当客户脱下衣服的时候,他已经建立了对西服的好感和适应,因此一致性初步建立。 +- 当我们想要孩子们真正相信一件事情时,我们不应该去贿赂或威胁他们。一个简单的要求可能就够了(“撒谎是很坏的,小宝贝,所以我希望你不要说谎;因为如果你撒谎的话,我会很失望的。”)。这个理由既要能够让孩子们按照父母的要求去做,又要能够让他们对自己的行为负责。因为,它包含的可觉察的外部压力越少,它的效果也就越好。 diff --git "a/docs/reading/1_\345\277\203\347\220\206\345\255\246/\347\244\276\344\274\232\350\256\244\347\237\245.md" "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\347\244\276\344\274\232\350\256\244\347\237\245.md" new file mode 100644 index 0000000..530cf32 --- /dev/null +++ "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\347\244\276\344\274\232\350\256\244\347\237\245.md" @@ -0,0 +1,34 @@ +# 社会认知 + +## 巴拉巴西成功定律 + +《[巴拉巴西成功定律](https://book.douban.com/subject/34901765/)》并不是成功鸡汤,而是通过一些现象让你了解成功的部分规律。 + +- 能给人留下印象:朗朗为什么动作特别浮夸?观看无声视频的那些人,他们需要在激情洋溢、但听不到任何声音的音乐演奏者中做出选择。在这一组中,新手和专家在预测的准确性上都达到当次比赛的 50%。换句话说,那些完全听不见音乐的人预测的准确率是能够听见音乐的人的两倍。 + +- 面试/比赛越靠后越能成功。 + +世俗意义上的成功只有几个规律: + +- 有明确竞争标准的地方由个人表现决定,在顶尖高手的对决里,也不是业务表现决定。 +- 没有明确标准的地方由社会价值网络决定。 +- 个人的成功不是成功,带来一群人的成功才是成功,也就是我们的成功由别人决定。 +- 以前的成功会放大我们未来成功的机率。适应度也一样会放大。 +- 成功有很大的运气成分。 +- 大部分人取得成就,都在职业生涯的早期,至少早期就能显露出来。 + +## 商业至简 + +《[商业至简](https://book.douban.com/subject/35956375/)》涵盖了个人时间管理、品牌营销、团队建设、谈判等方面的商业知识。这本书更像是一本读书笔记,提取了 60 个知识点。它可以作为一本工具书,在需要时可以拿出来使用。例如,在制作报价单时使用。 + +- 把自己看成公开市场上的经济产品。你的薪水是否给公司带来 5 倍以上的收入? +- 没有人卷入过冲突,尤其是在关于不公正或不平等的问题上。每个人都更**希望受到尊重,而不是被人喜欢**。 +- 把自己看成英雄,而不是受害者。 + +## 炒作机器 + +《[炒作机器](https://book.douban.com/subject/35902963/)》更像是一本关于社交网络传播知识的科普书,向你介绍一些有关传播学的信息。 + +- 虚假新闻经常是由机器人最先发布,然后艾特一些有影响力的人,当这些人相信后,虚假新闻便开始传播。例如,一些机器人会艾特特朗普的推特账号,然后转发一些虚假新闻。当特朗普相信后,他会转发给其他人,导致更多人误认为这是真实的。 +- 数字营销中广告回报的数字通常被高估了 3-10 倍。 +- 2% 的网站访问好在第一次访问时下单,需要通过其他方式,比如信息流广告让这些用户回归。 diff --git "a/docs/reading/1_\345\277\203\347\220\206\345\255\246/\350\207\252\346\210\221\350\256\244\347\237\245.md" "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\350\207\252\346\210\221\350\256\244\347\237\245.md" new file mode 100644 index 0000000..677c79e --- /dev/null +++ "b/docs/reading/1_\345\277\203\347\220\206\345\255\246/\350\207\252\346\210\221\350\256\244\347\237\245.md" @@ -0,0 +1,31 @@ +# 自我认知 + +## 人性的弱点 + +《[人性的弱点](https://book.douban.com/subject/25985683/)》的副标题是如何赢取友谊与影响他人。 + +- 不应该看到优点,而是要看到对方的需求、心里缺失。 +- 代入感、共鸣:连问自己三次为什么,找到对方真实的原因。挖掘深层次精神需求,作为开场。 +- 刺激性言语:让对方想吐槽,想反馈。没心眼>真诚。例:一不小心一眼看成 XXX 了,然后把它给引导偏了。 + +## 了不起的我 + +《[了不起的我](https://book.douban.com/subject/34836531/)》罗列了我们生活中常见的心理学案例,你可以逐个的去寻找符合自己的案例,去比对,去思索是不是自己有哪些需要改善的。 + +接纳自我,**减少自我谴责**。自我谴责时提问:在哪些时候,你会谴责自己?你经常谴责自己什么地方?这种自我谴责,究竟促进了你的改变,还是阻碍了你的改变?如果用一种理解的方式来跟心里的大象对话,你会跟它说什么?然后以 5 年后自己的身份,给自己写一封信。告诉自己,5 年以后,你会怎么看现在的自己遇到的困难,以及现在的自己的坚持。 + +**自我认知**: + +- 拖延症的内核是害怕失败。 +- 区分愿望和现实,很多时候你说的「应该」并不是现实,而只是你的**愿望**而已。 +- 选择一个你想实现的改变,比如,想在工作中变得更有效率,在生活中更好地控制自己的脾气,或者在朋友面前表现得更自信。然后思考:在什么样的关系中,你会表现出拖沓、易怒、不自信?在什么样的关系中,你又会表现出高效、耐心、自信?关系是如何影响你的行为的? + +**育儿**: + +夸孩子聪明不仅不会增加孩子的自信,还极大地削弱了孩子的抗挫折能力。为什么表扬孩子聪明和表扬努力会产生这么大的区别?德韦克教授解释说,表扬聪明和表扬努力激发了孩子不同的心智模式。表扬聪明实际上暗示了这样的观点:人的能力是相对固定的,解难题只是证明一个人聪明不聪明的方式。一旦孩子接受了“人的能力是相对固定的”观点,而且被夸聪明,他们就会努力维护聪明的形象。这会使他们把注意力从挑战任务本身,转移到对自我的关注上来。这就是僵固型思维的特点。相反,表扬努力暗示着:人的能力并不是固定的,一个人可以通过努力来发展自己的能力。既然人的能力并不固定,那些孩子就没有证明自己的包袱,自然就能把目光专注到努力本身。 + +## 拖延心理学 + +[拖延心理学](https://book.douban.com/subject/4180711/) 翻译生涩,快速阅读认知自己的深层拖延心理。 + +4 个最可能导致拖延的原因:对成功信心不足、讨厌被人委派任务、注意力分散和易冲动、目标和回报太过遥远。 diff --git "a/docs/reading/2_\346\212\200\350\203\275/\345\206\231\344\275\234.md" "b/docs/reading/2_\346\212\200\350\203\275/\345\206\231\344\275\234.md" new file mode 100644 index 0000000..b54dace --- /dev/null +++ "b/docs/reading/2_\346\212\200\350\203\275/\345\206\231\344\275\234.md" @@ -0,0 +1,35 @@ +# 写作 + +## 吴军阅读与写作讲义 + +《[吴军阅读与写作讲义](https://book.douban.com/subject/35426741/)》的前半部分涵盖了很多实用技巧,帮助我澄清了对听、说、读、写的认识。而后半部分则是一些阅读范例,类似于语文书中的阅读理解,我准备将其当作工具书,等待无聊时慢慢阅读。 + +部分记录: + +- 在古希腊,奴隶也接受教育,但是他们所学的是谋生技能,相当于现在的白领工作。只有自由民才能学习通识教育,例如语文、历史等。 +- 中美教育差别:阅读理解并非只是简单理解一段话,而是从整体结构上出发,甚至是考卷上没出现的内容。 +- 人工智能在阅读理解方面有着卓越的表现,可以发现文章中的细节。但是在处理宏观问题方面却不如人类。 + +我是历史系毕业,班里只有一人在博物馆工作,而其他人则从事各行各业。因此,经常有人问我是否后悔学历史,我的回答是:我的做事思维都是从历史学习中得来的,历史学教给我如何从多个维度去看待事物并了解世界。在思考问题时,我甚至习惯于使用历史系常用的口头禅,「As a true historian」。所以,我非常赞同这本书里的通识教育概念。 + +## 故事:材质、结构、风格和银幕剧作的原理 + +《[故事:材质、结构、风格和银幕剧作的原理](https://book.douban.com/subject/26717137/)》 + +1. 设定背景,符合人物故事逻辑。 +2. 场景:正反都在同一场景。 +3. 剧情:顺礼应当的剧情不该在故事中出现 (如:敲门门开了,他进去了)。故事应不断有正负反转,逐层递进,直至最后爆发,出现鸿沟。 +4. 剧情中的转折点,打破平静生活的平衡,同时带来惊奇、增加好奇心、见识和新方向。 + +反面人物叙述后期再看,过于理论化了。 + +## 一本小小的红色写作书 + +《[一本小小的红色写作书](https://book.douban.com/subject/26990918/)》是基础写作,只适合中小学学生阅读,都为基础写作技巧,大多无参考作用。关键内容都在目录中。 + +- 自上而下:优先写重点,从总结到细节。 +- 将主题分解为二到四个要点,然后逐个描述。 +- 拆分长句,使文章更清晰 +- 用积极、个人化的语气写作,不要过于书面化 + - 积极:商店一直到晚上 7 点都开着。 + - 消极:商店晚上 7 点关门。 diff --git "a/docs/reading/3_\347\256\241\347\220\206/\345\225\206\344\270\232\344\274\240\350\256\260.md" "b/docs/reading/3_\347\256\241\347\220\206/\345\225\206\344\270\232\344\274\240\350\256\260.md" new file mode 100644 index 0000000..baf4125 --- /dev/null +++ "b/docs/reading/3_\347\256\241\347\220\206/\345\225\206\344\270\232\344\274\240\350\256\260.md" @@ -0,0 +1,16 @@ +# 商业传记 + +## 苏世民:我的经验与教训 + +《[苏世民:我的经验与教训](https://book.douban.com/subject/34952676/)》阅读体验不错,其中故事化的情节让本书更有趣,比如:「第一份工作是为了获取比同班同学更高的工资 (一万),强行跟对方招聘人员,说我要 10500 美元」,「工作初期的工作是审核对方公司报告,作者判断公司 A 不行,可是公司没有接受。过了几年话,公司 A 倒闭,证券公司被告。原告将作者形容成一个天才,而自己公司就把作者形容成白痴,最后原告赢了」。 + +从中可以汲取的经验有: + +- 人们总觉得最有意思的话题就是与自己相关的话题。 +- 在展示自己时,印象非常重要。整体形象必须毫无瑕疵。 +- 做一件不可能的事,挑战自己,也是打破自己。 +- 投资原则:**不要亏钱**。 + +## 原则 + +《[原则](https://book.douban.com/subject/27608239/)》对我的影响最大,结合批评与自我批评,找到了提升的方向。但一定要制订计划,并严格按照计划来走,否则只会是一本无聊的理论书。总结内容查看 [普通人的生活原则-批评与自我批评](https://gpt-vip.top/posts/2021-05-31-principles_criticism_and_self-criticism.html)。 diff --git "a/docs/reading/3_\347\256\241\347\220\206/\345\270\202\345\234\272\350\220\245\351\224\200.md" "b/docs/reading/3_\347\256\241\347\220\206/\345\270\202\345\234\272\350\220\245\351\224\200.md" new file mode 100644 index 0000000..d3f7dcf --- /dev/null +++ "b/docs/reading/3_\347\256\241\347\220\206/\345\270\202\345\234\272\350\220\245\351\224\200.md" @@ -0,0 +1,26 @@ +# 市场营销 + +## 你的顾客需要一个好故事 + +《[你的顾客需要一个好故事](https://book.douban.com/subject/30242424/)》教你把主人公的位置留给顾客,而把你的品牌放到向导的位置上。作者提出的故事品牌框架(SB7),能让你清晰有效地阐明品牌信息。 + +这本书很适合品牌故事构建和反思,需要经常翻阅以检查。例如,公司网站的主人公应该是客户,你的角色是向导,需要减少文字,增加图片权重,思考客户需要什么,以确保行动明确和有力。 + +1. 一个**人物**:永远把顾客当做主人公。一旦认定了主人公,你就必须搞清楚他想要什么东西,他的渴望是什么,你的产品能否匹配他的诉求。如果你对顾客的定位不清楚,你将无法精准地塑造品牌,也无法邀请顾客开启一段愉悦的体验之旅。 +2. 遇到一个**问题**:当稳定性被打破,故事就开始了。问题来自外部、内部和哲学层面。理解和处理顾客面对的三个层面的问题,有助于你与顾客建立深层联系。 +3. 得遇一位**向导**:向导能帮顾客解决他面临的问题,这个向导就是你的产品。当顾客身不由己地陷入某种困境时,他需要向导把他带离困境。向导并不是高高在上的指挥官,而是与顾客并肩的同行者,你能听见他的呼喊,你能理解他的焦虑,你能与他一起收获新的生命体验。 +4. 提供一套**方案**:方案给出了细节和过程,让顾客从天马行空的想象落到踏踏实实的行动。清晰明了的方案给顾客带来的安全感是不言而喻的,就像在湍急的河道中摆好了石头,顾客会很乐意继续接下来的旅程。 +5. 召唤他采取**行动**:除非受到激励,否则顾客不会采取行动。如果没有清晰的召唤,顾客甚至根本不会回应。直接式行动召唤和转化型行动召唤能帮助你选择更适合自己品牌的方式。 +6. 帮助他**免于失败**:失败固然有它的悲剧之美,但是人人都不想发生在自己身上。你的产品能帮助顾客避开什么风险。不跟你合作会给顾客带来损失吗?他的生活质量会因为忽略你而下降吗?一旦明确了利害得失,顾客的购买动机会进一步增强。 +7. 最终获得**成功**:为顾客提供一幅愿景,当他接受你的产品后,他的生活可以变得多么美好。你的产品将把顾客带往何处?他的生活会变成什么样子?如果不告诉顾客最终的走向,他是不会跟你走的。 + +## 增长黑客 + +《[增长黑客](https://book.douban.com/subject/27593848/)》的实用价值不是很高,因为书中介绍的增长手段大多数都是早在 2010 年左右就已经开始使用的通用方法。虽然可以作为参考,但更多的是用来反思当前产品是否存在不足。 + +- 要想知道用户为何会在某个节点放弃购买,最有用的回答往往来自那些没有放弃购买的用户。这看似有违直觉,却是事实。例如,要弄清为何这么多人在访问商店 App 之后没有下单,增长团队应该调查那些刚刚完成购买的用户。毕竟,**这些成功下单的用户同样遇到了令其他顾客却步的障碍,而且他们还可能道出当别人离开时他们为何仍然选择继续购买。** 因此,App 团队可以在订单确认页面显示一个简短的问卷调查,询问顾客“哪个因素让你差点放弃购买?”我们发现,用户对于“哪个因素”这个问题的反应率极高,有一些回答甚至让人瞠目结舌。很多人都愿意在离开前停下来回答你的问题(问卷越简洁回应率也会越高)。这种情况下,你需要询问用户为何不迈入下一步。提问可以包括: + - 在这个环节有没有什么因素阻碍你注册? + - 你是出于什么顾虑而没有完成订单? + - 你今天没有购买任何商品是什么原因? + - 你需要知道什么样的信息才会放心地注册? +- 鲜花配送店 daFlores 就通过在它的电商网站中加入了一条满足以上这些简单标准的证言提高了收益。最初它在网站上展示文字证言,但后来发现用户并不了解它的品牌,于是它**将证言换成了一张庆祝公司在脸谱网上的粉丝突破 60 万的图片**。结果,用这种可信、相关、有吸引力、可量化而且可视的方式向用户展示公司拥有数量庞大的粉丝群这一事实一举将收入提高了 44%。因为看到有这么多人喜欢在这家网站上购买鲜花能够让用户感到放心。”提高社会认可在转化旅程中的可见度可以为增长团队带来变现的机会。增加证词、知名客户的企业标志、客户使用产品的结果、当前在你的网站上购物或者订购的人数等,这些都可以向用户提供已经采取相同行动的其他客户的信息,从而让潜在客户相信他们的决定是对的。 diff --git "a/docs/reading/3_\347\256\241\347\220\206/\347\244\276\344\274\232\347\273\217\346\265\216.md" "b/docs/reading/3_\347\256\241\347\220\206/\347\244\276\344\274\232\347\273\217\346\265\216.md" new file mode 100644 index 0000000..ca53b73 --- /dev/null +++ "b/docs/reading/3_\347\256\241\347\220\206/\347\244\276\344\274\232\347\273\217\346\265\216.md" @@ -0,0 +1,5 @@ +# 社会经济 + +## 置身事内 + +《[置身事内](https://book.douban.com/subject/35546622/)》基本是概念介绍,对于问题浅尝则止,想通盘理解政府的税制变革和运作模式可以略读。不能明白评分为什么那么高。 diff --git a/docs/reading/README.md b/docs/reading/README.md new file mode 100644 index 0000000..8556755 --- /dev/null +++ b/docs/reading/README.md @@ -0,0 +1,42 @@ +# 读书笔记 + +曾经我尝试使用 Notion 来管理书单,用 Calibre、Logseq 来对电子书记读书笔记。然而,我渐渐发现自己几乎从不回头再看这些电子书的笔记。因此,我决定放弃电子书这种方式,而将我的注意力更多地集中在实体书籍上的摘要总结上。 + +现在,当我对某本书的知识点感兴趣时,我会重新翻开那本实体书,重新阅读其中的书签部分,将其变为工具书。这种方式使我能够更有针对性地利用我的阅读时间,确保我真正吸收并运用所学。 + +## 阅读技巧 + +当我们阅读书籍时,目标是理解其中的核心思想、论证逻辑、论据以及思考框架。我们应该能够**用自己的话语向朋友简要解释书中的内容**。将所读**书籍与自己的经验和见解相结合**,以建立深刻的理解。这种关联是真正理解书籍内容的关键。应**将书籍视为工具**,仅在需要时查看特定部分,以便将其应用到实际情境中,实现最大效益。 + +## 阅读准备 + +要明确一点,阅读是一项学习和工作活动,而非娱乐。在阅读时,应该尽量消除一切干扰,以确保大脑能够集中精力思考。可以**采用番茄工作法,确保没有音乐或其他干扰,以保持 3 小时的专注阅读**。 + +在开始阅读之前,进行一些准备工作。**查看书籍的书评**,以了解大致内容,翻阅目录,包括前言、后记和索引,以获取整体框架。 + +在阅读时,要**不求甚解**。不要在每一页都停下来查找或思考,而是尽量将整体理解。如果你坚持要了解每一页的意义,才肯往下读,那你一定读不了多少。努力了解细微的重点,反而会错过说得很清楚的大原则。 + +### 读书笔记 + +在阅读过程中,建立一个有效的笔记系统可以帮助你更好地理解和回顾所读内容。 + +使用书签标记关键信息和重点,同时进行自我思考,标记书中「**有道理**」和「**有问题**」的部分。这将有助于后续的复习,并将书籍转化为你的工具书。 + +阅读完成后,尝试用**一句话总结**书籍的主要内容,并将这个概括写在小卡片上,放入书中,以便以后回顾。 + +## 其他阅读理论 + +上述技巧参考了[戴雨森阅读法](https://zhuanlan.zhihu.com/p/25858189)和雪球速读法。此外,还有**费曼技巧**,它包括以下步骤: + +1. Choose a Concept 选择一个概念; +2. Teach it to a Toddle 假装把它讲给小孩子听; +3. Identify Gaps and Go Back to The Source Material 发现理解不到位的地方,返回原始材料学习; +4. Review and Simplify (Optional) 回顾和简化信息(可选)。 + +另一种方法是 **3-2-1 训练法**: + +1. 随便找一本书,开始阅读,倒计时 3 分钟结束后合上书,找一张纸,画一张思维导图,把刚才你读到的关键点靠回忆记录下来。 +2. 重新阅读刚才阅读的内容,区别是倒计时降低到 2 分钟,也就是你需要用 2 分钟完成刚才 3 分钟读完的内容,并补充刚才的导图里的内容。 +3. 用 1 分钟再次重复上述过程。^[[2.4 如何提升信息处理速度](https://sspai.com/post/53852)]^[[3.5 创建你的信息数据库](https://sspai.com/post/54065)] + +扩展:自动抓取字数与书单列表,功能参考 [郭飞书单](https://www.guofei.site/reading/#/)。 diff --git a/docs/reading/_navbar.md b/docs/reading/_navbar.md new file mode 100644 index 0000000..af02e18 --- /dev/null +++ b/docs/reading/_navbar.md @@ -0,0 +1,3 @@ +- [🚀 LearnHubs](https://gpt-vip.top) +- [📝 博客文章](https://gpt-vip.top/blog.html) +- [🔨 工具收藏](https://itools.site) diff --git a/docs/reading/_sidebar.md b/docs/reading/_sidebar.md new file mode 100644 index 0000000..5ab72aa --- /dev/null +++ b/docs/reading/_sidebar.md @@ -0,0 +1,12 @@ +- [读书方法]() +- 0.自我提升 + - [提升思维](0_自我提升/提升思维.md) + - [吃掉那只青蛙](0_自我提升/吃掉那只青蛙.md) +- 1.心理学 + - [自我认知](1_心理学/自我认知.md) + - [社会认知](1_心理学/社会认知.md) + - [影响力](1_心理学/影响力.md) +- [写作](2_技能/写作.md) +- [商业传记](3_管理/商业传记.md) +- [市场营销](3_管理/市场营销.md) +- [社会经济](3_管理/社会经济.md) diff --git a/docs/reading/index.html b/docs/reading/index.html new file mode 100644 index 0000000..e268b3b --- /dev/null +++ b/docs/reading/index.html @@ -0,0 +1,272 @@ + + + + + + + LearnHubs - 读书笔记 + + + + + + + + + + + + +
🏃‍🏃‍🏃‍💨 加载中...
+ + + + + + + + + + + + + + + + + + + + diff --git a/docs/services/Docker.md b/docs/services/Docker.md new file mode 100644 index 0000000..f7676f6 --- /dev/null +++ b/docs/services/Docker.md @@ -0,0 +1,85 @@ +--- +article: false +title: Docker +icon: any +order: 2 +--- + +Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 + +Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 [NAS 上搭建 Docker](../services/NAS.html#nas-docker)。 + +## Docker 命令 + +Docker 使用查看 [Docker — 从入门到实践](https://yeasy.gitbook.io/docker_practice/introduction/what)。 + +- 列出所有容器:`sudo docker ps -a`。 +- 停止容器运行:`sudo docker stop `。部分容器名有可能无法识别,最好在容器名称中添加数字。 +- 删除指定容器:`sudo docker rm `,删除前需先停止容器。 +- 清理容器(慎重):`sudo docker system prune -a`,用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及无 tag 和没使用的镜像。 +- 清理数据卷(慎重):`sudo docker volume prune`,关闭的容器数据卷会被删除,有可能破坏有用数据,需极度谨慎。 +- 导出容器中的 mysql 数据库 `sudo docker exec mysqldump -u root -p your_database_name > `。将 替换为实际的容器 ID,将 替换为你想要保存导出文件的路径和文件名。请将 替换为你的 MySQL root 用户密码。完成后,你将得到一个 MySQL 数据库备份文件。比如导出 Huginn 数据库,`sudo docker exec 3de3058e4468 mysqldump -u root -p huginn_production > /volume1/docker/huginn/backup.sql`。 + +## 定制 Docker 镜像 + +有时官方镜像可能不满足我们的需求。这时,我们可以使用 docker commit 命令定制自己的镜像。如何使用,可以查看[如何保存修改后的容器为镜像](https://blog.csdn.net/a772304419/article/details/123199579)。 + +例如: + +```bash +sudo docker commit \ + --message "基于 Ubuntu 18.04 构建的 Huginn" \ + ubuntu \ + huginnxubuntu:1.0 +``` + +另外,可以使用 Dockerfile 来构建镜像,如: + +```bash + build: + context: /volume1/docker/danmuji + dockerfile: Dockerfile +``` + +如何将镜像推送到 DockerHub: + +```bash +echo "您的密码" | docker login --username=您的用户名 --password-stdin + +docker build -t rockben/cors-anywhere:0.4.4 . +docker push rockben/cors-anywhere:0.4.4 +``` + +## Docker 数据库管理 + +在 Docker 中,数据库可以引用外部资源并被永久保留。但保存的外部数据是多个小文件而不是完整的 MySQL 文件。在实际操作中,我们应关注正在运行的数据库,而非外部存储文件。 + +首先,应将 Docker 数据库的端口暴露给外部,如将 MySQL 的默认端口 3306 映射到外部的 3307 端口。随后,使用数据库工具连接到 `192.168.3.3:3307`。这类似于使用 phpMyAdmin,可以轻松查看、编辑和导出 Docker 内的数据库。如果数据库连接遭到拒绝,可以参照 Huginn 的内部数据库连接设置,确保当前外部连接 IP 是允许的。 + +## 其他使用 + +### Windows Docker + +在 Windows 系统上,可以使用 [Docker Desktop](https://www.runoob.com/docker/windows-docker-install.html) 来管理容器,配置方法可参考 [Windows Docker 环境配置](https://gpt-vip.top/posts/2022-09-05-stable_diffusion_ai_painting.html#docker-环境配置)。 + +Windows 本地磁盘被挂载到 Linux 的 mnt 目录下,因此,如果需要在 WSL 中访问 Windows 文件,需要在路径前添加 `/mnt/` 前缀,并将磁盘符号改为小写字母,将反斜杠 `\` 替换为正斜杠 `/`。例如,如果 Windows 文件位于「D:\Backup\Libraries\Desktop\stable-diffusion-webui-docker」目录下,则其在 Linux 中的路径为「/mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker」。Windows 上的 WSL 本地路径为 `\\wsl.localhost\`。 + +请注意:WSL 上的 Linux 环境与其他环境有所不同,须查看[在适用于 Linux 的 Windows 子系统 (WSL2) 上安装 Node.js](https://learn.microsoft.com/zh-cn/windows/dev-environment/javascript/nodejs-on-wsl)。 + +### 宝塔镜像 + +如果要在 Docker 上部署网站,推荐使用宝塔官方的集成镜像。它基于 CentOS 7.9,解决了 Docker 内部链接问题,还支持将数据库定时备份到本地。有关配置信息,请参考[宝塔面板定制 docker 镜像发布 - 集成 LN/AMP 支持](https://www.bt.cn/bbs/thread-79499-1-1.html)和 [Docker 安装宝塔环境](http://blog.huangyuqiang.cn/index.php/2022/11/02/docker%E5%AE%89%E8%A3%85%E5%AE%9D%E5%A1%94%E7%8E%AF%E5%A2%83/)。但是,该镜像不适用于 Huginn 的部署,因为 Huginn 不支持 CentOS。我曾尝试将安装命令从 apt-get 替换为 yum,但仍然无法部署。当我尝试在 Docker 中直接安装宝塔而不使用官方集成镜像时,遇到了无法启动数据库的问题。 + +```bash +# 按需求修改映射端口和目录,1024 以下的端口不能给普通用户用 +sudo docker run -d --restart unless-stopped --name baota -p 8889:8888 -p 1033:22 -p 1044:443 -p 1081:80 -p 1889:888 -v /volume1/docker/btpanel/website_data:/www/wwwroot -v /volume1/docker/btpanel/mysql_data:/www/server/data -v /volume1/docker/btpanel/vhost:/www/server/panel/vhost btpanel/baota:lnmp +``` + +在站点设置中,绑定你的本地域名 home.xx.com 和内部地址 192.168.x.x,这样你就可以通过访问 home.xx.com:1081 来访问该站点。 + +- 默认地址 `http://192.168.x.x:8889/btpanel` 上的宝塔面板。 +- 默认用户:btpanel +- 默认密码:btpaneldocker +- 镜像默认 SSH 密码:btpaneldocker + +如果宝塔镜像仅用于测试环境,可以使用 `rm -f /www/server/panel/data/admin_path.pl` 命令来关闭面板入口。如果你关闭了 NAS 的 SSH 功能,宝塔面板也将停止,但不会影响已运行的网站。 diff --git a/docs/services/Huginn.md b/docs/services/Huginn.md new file mode 100644 index 0000000..0702cda --- /dev/null +++ b/docs/services/Huginn.md @@ -0,0 +1,1058 @@ +--- +article: false +title: Huginn +icon: customize +order: 3 +--- + +- Huginn 部署:查看 [deploy Huginn inside of Docker](https://github.com/huginn/huginn/blob/master/doc/docker/install.md) 和 [.env 设置](https://github.com/huginn/huginn/blob/master/.env.example),或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 +- Huginn 抓取教程:[RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)](https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html) + +## 常用 Agent + +[Huginn Agents](https://github.com/huginn/huginn/wiki/Agent-Types-&-Descriptions): + +- Website Agent 解析网页、XML 文档和 json 数据,最常使用 +- Event Formatting Agent 事件信息格式化,可以对收到的信息内容进行格式化,允许添加自定义新内容 +- Phantom Js Cloud Agent 借助 Phantom 抓取动态页面源码,防止部门网站屏蔽爬虫 +- Trigger Agent 监控事件反馈信息的触发器,多用来过滤部分内容 +- De Duplicate Agent 去重 + +- Data Output Agent 将数据以 RSS 和 Json 的形式向外部推送 +- Liquid Output Agent 自定义格式数据输出,可以用它创建 HTML 页面,json 数据等 + +- Webhook Agent +- Trigger Agent 监测敏感事件,然后可以用来发送邮件等提醒。 +- Javascript Agent 允许执行自定义的 JS 代码,可以用于个性化操作 +- Digest Agent 汇总节点,收集所有收到的事件再作为一个事件发送出去 +- Email Agent 用邮箱发送最新接收到的讯息 +- Post Agent 可以由其他节点触发,根据固定模板合并事件信息,并以 POST 或 GET 方式向指定的 URL 发起请求 +- Delay Agent 可以作为事件或者副本的暂存器或者缓冲区,统一触发发布 +- Scheduler Agent 定时器节点 + +- Attribute Difference Agent 数值差异比较 +- Commander Agent 触发器代理,可以用于向其他节点发起指令控制,控制节点的执行和停止等 + +{{created_at}} 为自带抓取时间,Agent 设置中的特殊字符`+`,需要用反义符`\\`。 + +## Huginn 部署 + +Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。 + +```bash +cd /home/huginn/huginn +sudo bundle exec rake production:force_stop +sudo bundle exec rake production:export +``` + +服务器重启后,需执行以下命令: + +```bash +sudo docker exec -it huginn bash +sudo service mysql restart +sudo service mysql start +sudo service nginx restart +cd /home/huginn/huginn +git config --global --add safe.directory /home/huginn/huginn +sudo runsvdir /etc/service & +sudo bundle exec rake production:export +``` + +Huginn 经常用到的位置包括 `/home/huginn/huginn`(`env` 环境设置)和 `/var/lib/mysql`(数据库)。为了使这些位置能够在外部存储上工作,需要将外部存储位置的权限设置为 `everyone`,否则会出现错误。 + +需要注意的是,内部数据库默认情况下不会被外部识别。为了使其能够与外部进行连接,需要进行以下操作: + +1. 使用 `sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf` 命令找到 `bind-address` 行,并注释掉(在行的前面添加 #):`#bind-address = 127.0.0.1`。同时,将 `max_allowed_packet` 设置为 `200M`。 +2. 根据连接反馈获取连接 IP 并授权,同时开放 process 权限,方便后期数据库备份。数据库备用可使用 backup_script.sh 脚本,定期将 sql 文件导出到外部存储。 + + ```bash + mysql -u root -p + GRANT ALL PRIVILEGES ON *.* TO 'huginn'@'172.17.0.1' IDENTIFIED BY 'YourPassword'; + GRANT PROCESS ON *.* TO 'huginn'@'localhost'; + FLUSH PRIVILEGES; + \q + sudo service mysql restart + ``` + +2 个疑问: + +- 测试当任务卡住时,`rake production:export` 是否有效。(优化后,一直没出现卡住问题?) +- 部署时 `production:export` 步骤会提示 `unable to lock supervise/lock: temporary failure`,但此报错似乎不影响 Huginn 的运行,等有时间看看是否有相关报错。 + +### Ubuntu 手动部署 + +部署环境:Ubuntu 18.04 的 Docker 镜像(同样适用于服务器) +安装参考:[Manual Installation on Debian/Ubuntu](https://github.com/huginn/huginn/blob/master/doc/manual/installation.md),[Novice-setup-guide](https://github.com/huginn/huginn/wiki/Novice-setup-guide) +手动升级:[manual Update](https://github.com/huginn/huginn/blob/master/doc/manual/update.md) + +Huginn 部署步骤: + +```bash +# 进入 huginn 容器命令行,某些容器命令为 /bin/bash +sudo docker exec -it huginn bash +# run as root! +apt-get update -y +apt-get upgrade -y +apt-get install sudo -y + +# Install vim and set as default editor +sudo apt-get install -y vim +sudo update-alternatives --set editor /usr/bin/vim.basic + +# Install the required packages +sudo apt-get install -y runit build-essential git zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate pkg-config cmake nodejs graphviz jq shared-mime-info + +# Ubuntu 18.04 Bionic +sudo apt-get install -y runit-systemd + +# Download Ruby and compile it: +mkdir /tmp/ruby && cd /tmp/ruby +curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.7.tar.bz2 | tar xj +cd ruby-2.7.7 +./configure --disable-install-rdoc +make -j`nproc` +sudo make install + +# curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.xz | tar xJ +# cd ruby-3.2.2 + +sudo gem update --system --no-document +sudo gem install foreman --no-document + +# Create a user for Huginn: +sudo adduser --disabled-login --gecos 'Huginn' huginn + +# Install the database packages +sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev +``` + +输入 `service mysql start` 启动数据库,否则下一步数据库设置容易报错 `Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'`。^[[ERROR 2002 (HY000)](https://blog.csdn.net/qq_36822217/article/details/103156327)] + +```bash +# 逐步设置数据库 root 密码 +sudo mysql_secure_installation + +# 用上方设置的密码登陆数据库 +mysql -u root -p + +# ⚠️逐行输入代码到数据库命令行 `mysql>`,需将 `$password` 替换为你要设置的密码 +CREATE USER 'huginn'@'localhost' IDENTIFIED BY '$password'; +SET default_storage_engine=INNODB; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `huginn_production`.* TO 'huginn'@'localhost'; +FLUSH PRIVILEGES; +\q +``` + +数据库设置好后,拉取 huginn 主体程序,此段命令可以整段复制到 ssh。 + +```bash +# We'll install Huginn into the home directory of the user "huginn" +cd /home/huginn + +# Clone Huginn repository,不能直接使用 master,避免 ruby 3.2 问题 +# sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b master huginn +sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b latest_rubygems huginn + +# Go to Huginn installation folder +cd /home/huginn/huginn + +# Copy the example Huginn config +sudo -u huginn -H cp .env.example .env + +# Create the log/, tmp/pids/ and tmp/sockets/ directories +sudo -u huginn mkdir -p log tmp/pids tmp/sockets + +# Make sure Huginn can write to the log/ and tmp/ directories +sudo chown -R huginn log/ tmp/ +sudo chmod -R u+rwX,go-w log/ tmp/ + +# Make sure permissions are set correctly +sudo chmod -R u+rwX,go-w log/ +sudo chmod -R u+rwX tmp/ +sudo -u huginn -H chmod o-rwx .env + +# Copy the example Unicorn config +sudo -u huginn -H cp config/unicorn.rb.example config/unicorn.rb + +``` + +`sudo -u huginn -H editor .env` 设置 huginn 环境依赖,更多选项查看 [.env 设置案例](https://github.com/huginn/huginn/blob/master/.env.example)。编辑器为上面安装的 vim,`i` 在光标所在的位置插入,`esc` 退出编辑,`:wq` 保存并退出。 + +```bash +DATABASE_ADAPTER=mysql2 +#DATABASE_ENCODING=utf8 # 修改点 +DATABASE_RECONNECT=true +DATABASE_NAME=huginn_production # 修改点 +DATABASE_POOL=20 +DATABASE_USERNAME=huginn # 修改点 +DATABASE_PASSWORD='$password' # 修改点,换为你自己的密码 +#DATABASE_HOST=your-domain-here.com +#DATABASE_PORT=3306 +#DATABASE_SOCKET=/tmp/mysql.sock + +# MySQL only: If you are running a MySQL server >=5.5.3, you should +# set DATABASE_ENCODING to utf8mb4 instead of utf8 so that the +# database can hold 4-byte UTF-8 characters like emoji. +DATABASE_ENCODING=utf8mb4 #修改点 + +... +RAILS_ENV=production # 修改点 + +USE_GRAPHVIZ_DOT=dot # 取消注释,启用 GRAPHVIZ 来生成 diagram + +TIMEZONE="Beijing" # bundle exec rake time:zones:local,时区需按指定格式填写,否则会报错 runsv not running + +DEFAULT_HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" # 浏览器访问 + +# 邮件发送设置 +SMTP_DOMAIN=gpt-vip.top +SMTP_USER_NAME=benson@gpt-vip.top +SMTP_PASSWORD=somepassword +SMTP_SERVER=smtp.feishu.cn +SMTP_PORT=465 +SMTP_AUTHENTICATION=plain +SMTP_ENABLE_STARTTLS_AUTO=true +SMTP_SSL=true +SEND_EMAIL_IN_DEVELOPMENT=true +``` + +Install Gems 前用子账户重新设置运行目录权限 `sudo chown -R huginn:huginn /home/huginn`,防止报错 `Your user account isn't allowed to install to the system RubyGems`。 + +```bash +# 注意看黄字警告 +gem install bundler +# Docker 环境中,时区容易丢失(6-70) +apt-get install tzdata +# Install Gems +sudo -u huginn -H bundle config set deployment 'true' +sudo -u huginn -H bundle config set without 'development test' +sudo -u huginn -H bundle install +# 备用 Gems 修复命令 +# bundle update +# gem update bundler +# vim /home/huginn/huginn/Gemfile + +# Initialize Database +# Create the database +sudo -u huginn -H bundle exec rake db:create RAILS_ENV=production + +# Migrate to the latest version +sudo -u huginn -H bundle exec rake db:migrate RAILS_ENV=production + +# ⚠️设置登陆账户密码,Create admin user and example agents using the default admin/password login +sudo -u huginn -H bundle exec rake db:seed RAILS_ENV=production SEED_USERNAME=admin SEED_PASSWORD=password + +# Compile Assets +sudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production +``` + +`sudo -u huginn -H editor Procfile` 修改 huginn 设置。如果需多现成运行,可移除 Multiple DelayedJob workers 部分的注释。 + +```bash +# 在下两行前,添加符号「#」 +#web: bundle exec rails server -p ${PORT-3000} -b ${IP-0.0.0.0} +#jobs: bundle exec rails runner bin/threaded.rb + +# 删除以下下两行前的符号「#」 +web: bundle exec unicorn -c config/unicorn.rb +jobs: bundle exec rails runner bin/threaded.rb +``` + +`'sv stop huginn-web-1' exited with a non-zero return value: fail: huginn-web-1: runsv not running` 的报错,使用 `foreman export runit -a huginn -l /home/huginn/huginn/log /etc/service` 和 `chown -R huginn:huginn /etc/service/huginn*`。^[[rake export hangs](https://github.com/huginn/huginn/issues/2410)] ^[[Huginn failed to restart after installed node and systemd](https://github.com/huginn/huginn/issues/1618)] 如果是重启 Huginn 时出现此报错,则检查 `sudo -u huginn -H editor .env` 设置。 + +```bash +# 切换到 +cd /home/huginn/huginn +# 设置 +git config --global --add safe.directory /home/huginn/huginn +# 设置开机启动 +sudo runsvdir /etc/service & +sudo bundle exec rake production:export + +# Setup Logrotate +sudo cp deployment/logrotate/huginn /etc/logrotate.d/huginn + +# Ensure Your Huginn Instance Is Running +sudo bundle exec rake production:status +``` + +Nginx 站点设置: + +```bash +sudo apt-get install -y nginx + +# Site Configuration +sudo cp deployment/nginx/huginn /etc/nginx/sites-available/huginn +sudo ln -s /etc/nginx/sites-available/huginn /etc/nginx/sites-enabled/huginn + +# Change YOUR_SERVER_FQDN to the fully-qualified domain name of your host serving Huginn. +sudo editor /etc/nginx/sites-available/huginn + +# 不需要 https,则改为下方配置 +server { + listen 80; # 监听的端⼝ + server_name localhost home.gpt-vip.top; # 域名或ip,这里启用了两个地址,用空格分开 + +# 测试设置是否正确 +sudo nginx -t + +# 移除默认网站设置,只有当服务器/容器只存在 Huginn 网站方执行下行命令 +sudo rm /etc/nginx/sites-enabled/default +``` + +以上完成了 Huginn 的所有部署,执行 `sudo service nginx restart` 即可访问网站。 + +### Huginn Docker + +Huginn [multi-process](https://github.com/huginn/huginn/tree/master/docker/multi-process) 镜像基于 Ubuntu 18.04,没有 root 权限。如果不导出卷,或者使用单独的数据库容器,则无法在不丢失数据的情况下更新 Huginn。可以手动设置数据库对外端口和外部存储路径。 + +此外,官方镜像路径与手动版不同,不支持 force_stop 命令。官方建议 Docker 中使用下方命令删除数据库中卡住的任务。这个命令实测是有效的,但我有次碰到了未知 bug,卡住的任务被删除,后续任务却没继续。 + +```bash +# get a shell inside the docker container (replace huginn with the name or id of the container) +sudo docker exec -it huginn /bin/bash + +# source the environment file +source .env + +# get a rails console +bundle exec rails console + +# inside the rails console delete the job +Delayed::Job.where('locked_at IS NOT NULL AND locked_by IS NOT NULL AND failed_at IS NULL').destroy_all +``` + +## Agents + +### Trigger Agent + +Trigger Agent 挑选符合条件的事件。 + +```yml +# content 字段中不包含 周雅萌 或 邓雅萌 +{ + "expected_receive_period_in_days": "2", + "keep_event": "true", + "rules": [ + { + "type": "!regex", + "value": "周雅萌 | 邓雅萌", + "path": "$.content" + } + ], + "message": "Looks like your pattern matched in '{{value}}'!" +} + +# title 中包含品牌词 iluminage 或 易美肌 +{ + "expected_receive_period_in_days": "4", + "keep_event": "true", + "rules": [ + { + "type": "regex", + "value": "iluminage|易美肌", + "path": "$.title" + } + ], + "message": "Looks like your pattern matched in '{{value}}'!" +} +``` + +### Liquid Output Agent + +用自定义模板将数据整理,输出为 HTML,json 和 xml 格式链接。 + +模式一般选 `Last X events`,将接收到的所有数据对外输出,默认为 1000。 + +`Last X events` 模式下,可以设置 `Event limit` 以控制输出数据的数量和时间段。`Event limit` 可以设为 100,即输出数据为 100;也可以设为「1 day」或「5 minutes」,即仅输出最近一天的内容。 + +### Event Formatting Agent + +Event Formatting Agent 允许您格式化传入的事件,根据需要添加新的字段。可以用正则来替换输入中的某些元素。具体样例参考,[新京报 #5 清理版面字段格式](http://huginnio.herokuapp.com/scenarios/14/download)。 + +```yml +# strftime() 方法中常用的占位符 +# %Y 表示年份,%m 表示月份,%d 表示日期,%H 表示小时(24小时制),%M 表示分钟,%S 表示秒,%B 代表英文的月份,`%I` 代表小时(12小时制),`%p` 代表 AM/PM。`%e` 代表日期,不会在首位添加零。 +"created_at": "{{created_at | date:'%Y-%m-%d'}}" + +# 将 2023-03-02 23:33:30 +0800 替换为 2023-03-02 +"created_at": "{{created_at | regex_replace: ' ', ''| regex_replace: '(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?', ''| regex_replace: '\\+0800', ''}}" +``` + +#### 正则重构 + +比如生成时间规则为 `"created_at": "{{created_at}}"`,默认时间 `2022-07-06 21:09:51 +0800`,使用正则删除规则为 +`"created_at": "{{created_at | regex_replace: ' ', ''| regex_replace: '(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?', ''| regex_replace: '\\+0800', ''}}"`。 + +#### 加前后缀 + +抓取链接不完整时,需要完善链接,比如 `"url_link": "https://so.toutiao.com{{temp_link}}"`。 + +For example, here is a possible Event: + +```yml +{ + "high": { "celsius": "18", "fahreinheit": "64" }, + "date": + { "epoch": "1357959600", "pretty": "10:00 PM EST on January 11, 2013" }, + "conditions": "Rain showers", + "data": "This is some data", +} +``` + +You may want to send this event to another Agent, for example a Twilio Agent, which expects a `message` key. You can use an Event Formatting Agent's `instructions` setting to do this in the following way: + +```json +"instructions": { + "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius.", + "subject": "{{data}}", + "created_at": "{{created_at}}" +} +``` + +Names here like `conditions`, `high` and `data` refer to the corresponding values in the Event hash. + +The special key `created_at` refers to the timestamp of the Event, which can be reformatted by the `date` filter, like `{{created_at | date:"at %I:%M %p" }}`. + +The upstream agent of each received event is accessible via the key `agent`, which has the following attributes: `name`, `options`, `sources`, `type`, `url`, `id`, `disabled`, `memory`, `controllers`, `schedule`, `keep_events_for`, `propagate_immediately`, `working`, `receivers`, `control_targets`. + +Have a look at the [Wiki](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid) to learn more about liquid templating. + +Events generated by this possible Event Formatting Agent will look like: + +```json +{ + "message": "Today's conditions look like Rain showers with a high temperature of 18 degrees Celsius.", + "subject": "This is some data" +} +``` + +In `matchers` setting you can perform regular expression matching against contents of events and expand the match data for use in `instructions` setting. Here is an example: + +```json +{ + "matchers": [ + { + "path": "{{date.pretty}}", + "regexp": "A(?