1 Commits

Author SHA1 Message Date
cbb6a00744 Create Blog “2021-headless-cms” 2021-09-21 16:25:19 +08:00
60 changed files with 616 additions and 3646 deletions

View File

@@ -1,15 +0,0 @@
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "gitsubmodule"
directory: "/"
schedule:
interval: "weekly"
day: "sunday"

View File

@@ -1,33 +0,0 @@
name: Check and correct img CDN URLs
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
check-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Find and Replace Release
uses: jacobtomlinson/gha-find-replace@2.0.0
with:
find: "blog-1301127393.cos.ap-shanghai.myqcloud.com"
replace: "blog-1301127393.file.myqcloud.com"
include: "**/*.md"
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Change img CDN URL"
title: "Update imgs' CDN URL"
labels: "URL"
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
branch: "update-img-url"
body: "Some imgs' URL need to be updated."

View File

@@ -1,47 +0,0 @@
name: Azure Static Web Apps CI/CD
on:
push:
branches:
- master
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- master
jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_NICE_GLACIER_095B09E00 }}
repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
action: "upload"
###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
app_location: "/" # App source code path
api_location: "" # Api source code path - optional
output_location: "public" # Built app content directory - optional
###### End of Repository/Build Configurations ######
env:
HUGO_VERSION: 0.91.2
close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request Job
steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_NICE_GLACIER_095B09E00 }}
action: "close"

View File

@@ -1,70 +0,0 @@
# Sample workflow for building and deploying a Hugo site to GitHub Pages
name: Deploy Hugo site to Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["master"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true
# Default to bash
defaults:
run:
shell: bash
jobs:
# Build job
build:
runs-on: ubuntu-22.04
env:
HUGO_VERSION: 0.91.2
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Setup Pages
id: pages
uses: actions/configure-pages@v2
- name: Build with Hugo
env:
# For maximum backward compatibility with Hugo modules
HUGO_ENVIRONMENT: production
HUGO_ENV: production
run: |
hugo \
--minify \
--baseURL "/"
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
path: ./public
# Deployment job
deploy:
environment:
name: github-pages
url: https://colin-xkl.github.io/
runs-on: ubuntu-22.04
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1

View File

@@ -1,18 +0,0 @@
workflow "Hugo Link Check" {
resolves = "linkcheck"
on = "pull_request"
}
action "filter-to-pr-open-synced" {
uses = "actions/bin/filter@master"
args = "action 'opened|synchronize'"
}
action "linkcheck" {
uses = "marccampbell/hugo-linkcheck-action@v0.1.3"
needs = "filter-to-pr-open-synced"
secrets = ["GITHUB_TOKEN"]
env = {
HUGO_FINAL_URL = "https://blog.colinx.one"
}
}

View File

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

View File

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

1
.gitignore vendored
View File

@@ -97,4 +97,3 @@ $RECYCLE.BIN/
# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
.hugo_build.lock

3
CNAME
View File

@@ -1,3 +0,0 @@
blog.colinx.one
www.colinx.one
gh-pages.colinx.one

View File

@@ -1,41 +0,0 @@
# Colinx-Blog ![Website](https://img.shields.io/website?label=blog&style=flat-square&url=https%3A%2F%2Fblog.colinx.one)
[![Netlify Status](https://api.netlify.com/api/v1/badges/44687adc-b001-4295-b919-2ff15b914f37/deploy-status)](https://app.netlify.com/sites/colins-blog/deploys)
![Vercel Build Status](https://img.shields.io/github/deployments/Colin-XKL/Colinx-Blog/production?label=vercel&logo=vercel&logoColor=white)
![Blog-Netlify](https://img.shields.io/website?label=netlify&style=flat-square&url=https%3A%2F%2Fcolins-blog.netlify.app)
![Blog-Vercel](https://img.shields.io/website?label=vercel&style=flat-square&url=https%3A%2F%2Fcolinx-blog.vercel.app)
![Blog-CloudflarePages](https://img.shields.io/website?label=cloudflare%20pages&style=flat-square&url=https%3A%2F%2Fcolinx-blog.pages.dev)
![Blog-AzureStaticPages](https://img.shields.io/website?label=azure%20static%20pages&style=flat-square&url=https%3A%2F%2Fnice-glacier-095b09e00.1.azurestaticapps.net)
![Blog-GithubPages](https://img.shields.io/website?label=github%20pages&style=flat-square&url=https%3A%2F%2Fgh-pages.colinx.one)
![Blog-TencentCDN](https://img.shields.io/website?label=tencent%20cdn&style=flat-square&url=https%3A%2F%2Fblog-txcdn.colinx.one)
Colin's Personal Blog http://blog.colinx.one
## Mirrors
This site has been deployed to multiple static web hosting providers, for load balacing and performance testing.
* Netlify
[colins-blog.netlify.app](https://colins-blog.netlify.app) ![Netlify mirror status](https://colins-blog.netlify.app/connect-test.svg)
* Vercel
[colinx-blog.vercel.app](https://colinx-blog.vercel.app) ![Vercel mirror status](https://colinx-blog.vercel.app/connect-test.svg)
* CloudFlare Pages
[colinx-blog.pages.dev](https://colinx-blog.pages.dev) ![CloudFlare mirror status](https://colinx-blog.pages.dev/connect-test.svg)
* Azure Static Web
[nice-glacier-095b09e00.1.azurestaticapps.net](https://nice-glacier-095b09e00.1.azurestaticapps.net) ![Azure mirror status](https://nice-glacier-095b09e00.1.azurestaticapps.net/connect-test.svg)
* Github Pages
[gh-pages.colinx.one](https://gh-pages.colinx.one/)![Github mirror status](https://gh-pages.colinx.one/connect-test.svg)
* Tencent CDN Oversea
[blog-txcdn.colinx.one](https://blog-txcdn.colinx.one/) ![Tencent mirror status](https://blog-txcdn.colinx.one/connect-test.svg)

View File

@@ -2,119 +2,108 @@ baseurl = "/"
languageCode = "en-us"
defaultContentLanguage = "zh-cn"
defaultContentLanguageInSubdir = false
hasCJKLanguage = true
theme = "hello-friend"
paginate = 10
enableRobotsTXT = true
paginate = 7
# init theme sub module by this command
# git submodule update --init --recursive
[markup.goldmark.renderer]
unsafe = true #避免 MarkDown 内嵌的 HTML 被优化掉,尤其是 Typora 缩放过的图片
unsafe= true #避免MarkDown内嵌的HTML被优化掉尤其是Typora缩放过的图片
[params]
# dir name of your blog content (default is `content/posts`)
contentTypeName = "posts"
# "light" or "dark"
defaultTheme = "light"
# if you set this to 0, only submenu trigger will be visible
showMenuItems = 5
# Enable to show reading time in minutes for posts
showReadingTime = false
# leave empty to disable, enter display text to enable
lastModDisplay = "最后修改"
rssFullText = true
# custom params
# The values nested under params: will populate the .Site.Params variable for use in templates
canonicalRelLinkBase = 'https://blog.colinx.one'
# dir name of your blog content (default is `content/posts`)
contentTypeName = "posts"
# "light" or "dark"
defaultTheme = "light"
# if you set this to 0, only submenu trigger will be visible
showMenuItems = 5
# Enable to show reading time in minutes for posts
showReadingTime = false
# leave empty to disable, enter display text to enable
lastModDisplay = "最后修改"
[languages]
[languages.en]
title = "Colinx Blog"
subtitle = "Colin's Blog"
keywords = "Colin,Blog"
copyright = ""
menuMore = "Show more"
writtenBy = "Written by"
readMore = "Read more"
readOtherPosts = "Read other posts"
newerPosts = "Newer posts"
olderPosts = "Older posts"
minuteReadingTime = "min read"
dateFormatSingle = "2006-01-02"
dateFormatList = "2006-01-02"
[languages.en.params.logo]
logoText = "Colinx Blog"
logoHomeLink = "/"
# or
# path = "/img/your-example-logo.svg"
# alt = "Your example logo alt text"
[languages.en]
title = "Colinx Blog"
subtitle = "Colin's Blog"
keywords = ""
copyright = ""
menuMore = "Show more"
writtenBy = "Written by"
readMore = "Read more"
readOtherPosts = "Read other posts"
newerPosts = "Newer posts"
olderPosts = "Older posts"
minuteReadingTime = "min read"
dateFormatSingle = "2006-01-02"
dateFormatList = "2006-01-02"
[languages.en.menu]
[[languages.en.menu.main]]
identifier = "archive"
name = "Archive"
url = "/archive"
[[languages.en.menu.main]]
identifier = "categories"
name = "Categories"
url = "/categories"
[[languages.en.menu.main]]
identifier = "tags"
name = "Tags"
url = "/tags"
[[languages.en.menu.main]]
identifier = "about"
name = "About"
url = "/aboutme"
[languages.en.params.logo]
logoText = "Colinx Blog"
logoHomeLink = "/"
# or
#
# path = "/img/your-example-logo.svg"
# alt = "Your example logo alt text"
[languages.zh-cn]
title = "Colinx Blog"
subtitle = "Colin的个人博客"
keywords = "Colin,个人博客,技术,后端,Linux,前端"
copyright = ""
menuMore = "显示更多"
writtenBy = "作者"
readMore = "点击阅读"
readOtherPosts = "阅读更多"
newerPosts = "上一页"
olderPosts = "下一页"
minuteReadingTime = "分钟"
dateFormatSingle = "2006-01-02"
dateFormatList = "2006-01-02"
[languages.en.menu]
[[languages.en.menu.main]]
identifier = "archive"
name = "Archive"
url = "/archive"
[[languages.en.menu.main]]
identifier = "categories"
name = "Categories"
url = "/categories"
[[languages.en.menu.main]]
identifier = "tags"
name = "Tags"
url = "/tags"
[[languages.en.menu.main]]
identifier = "about"
name = "About"
url = "/aboutme"
[languages.zh-cn.params.logo]
logoText = "Colinx Blog"
logoHomeLink = "/"
# or
#
# path = "/img/your-example-logo.svg"
# alt = "Your example logo alt text"
[languages.zh-cn]
title = "Colinx Blog"
subtitle = "Colin的个人博客"
keywords = "Colin,个人博客"
copyright = ""
menuMore = "显示更多"
writtenBy = "作者"
readMore = "点击阅读"
readOtherPosts = "阅读更多"
newerPosts = "上一页"
olderPosts = "下一页"
minuteReadingTime = "分钟"
dateFormatSingle = "2006-01-02"
dateFormatList = "2006-01-02"
[languages.zh-cn.menu]
[languages.zh-cn.params.logo]
logoText = "Colinx Blog"
logoHomeLink = "/"
# or
#
# path = "/img/your-example-logo.svg"
# alt = "Your example logo alt text"
[[languages.zh-cn.menu.main]]
identifier = "archive"
name = "文章归档"
url = "/archive"
weight = 1
[[languages.zh-cn.menu.main]]
identifier = "categories"
name = "分类"
url = "/categories"
weight = 2
[[languages.zh-cn.menu.main]]
identifier = "tags"
name = "Tags"
url = "/tags"
weight = 3
[[languages.zh-cn.menu.main]]
identifier = "about"
name = "关于"
url = "/aboutme"
weight = 5
[[languages.zh-cn.menu.main]]
identifier = "subscribe"
name = "订阅"
url = "/subscribe"
weight = 10
[languages.zh-cn.menu]
[[languages.zh-cn.menu.main]]
identifier = "archive"
name = "归档"
url = "/archive"
[[languages.zh-cn.menu.main]]
identifier = "categories"
name = "分类"
url = "/categories"
[[languages.zh-cn.menu.main]]
identifier = "tags"
name = "标签"
url = "/tags"
[[languages.zh-cn.menu.main]]
identifier = "about"
name = "关于"
url = "/aboutme"
[[languages.zh-cn.menu.main]]
identifier = "rss"
name = "RSS"
url = "/index.xml"

View File

@@ -1,9 +0,0 @@
+++
framed = true
+++
# Hi there!
Welcome to my blog👋 Check these
[💻 技术文章](/categories/%E6%8A%80%E6%9C%AF/) | [📖 My Readings](https://reading.colinx.one) | [💡 My Github](https://github.com/Colin-XKL/) | [💎 公开服务](/services/)

View File

@@ -8,7 +8,7 @@ lastmod: 2021-05-10
## About Me
00 后性别男爱好女CS 专业,软件攻城狮一枚业余摄影师、音乐制作人RSS 爱好者
00 后性别男爱好女CS 在读,准软件工程师业余摄影师、音乐制作人RSS 爱好者
### I Like
@@ -19,14 +19,5 @@ lastmod: 2021-05-10
## Catch Me
- 博客主页https://blog.colinx.one
- Github 主页https://github.com/Colin-XKL
- Github 主页: https://github.com/Colin-XKL
- Email: Colin_XKL#outlook.com
---
获取支持/服务
支持公益事业发展,如任何非盈利机构有 IT 服务部署 / 网站托管或维护 / 架构咨询 / 问题排障 等需求可直接联系,在能力范围内提供无偿支持
其他个人或企业有相关需求的可通过 email 免费咨询或以其他形式提供付费支持

View File

@@ -3,7 +3,7 @@
title: 2020 年度总结
date: 2020-12-26
lastmod: 2020-12-31
description: 新冠疫情侵袭下的 2020 过的额外的快仿佛上一秒还在家里上完课下一刻就是秋季复学一晃眼又是一年圣诞2020 就快过完了。这里记录一下我的 2020.
description: 新冠疫情侵袭下的2020过的额外的快仿佛上一秒还在家里上完课下一刻就是秋季复学一晃眼又是一年圣诞2020就快过完了。这里记录一下我的2020.
categories:
- 杂记
- 年度总结
@@ -14,17 +14,17 @@ tags:
---
<!-- # 2020 年度总结 -->
# 2020年度总结
## 序
新冠疫情侵袭下的 2020 过的额外的快仿佛上一秒还在家里上完课下一刻就是秋季复学一晃眼又是一年圣诞2020 就快过完了。这里记录一下我的 2020.
新冠疫情侵袭下的2020过的额外的快仿佛上一秒还在家里上完课下一刻就是秋季复学一晃眼又是一年圣诞2020就快过完了。这里记录一下我的2020.
## 我的 2020 简述
## 我的2020简述
* 博客 2.0、3.0
* 博客2.0、3.0
* 刷完了几部经典动漫
* 刷完了我的三体和三体三部曲
* 上半年在家中了花花草草
@@ -36,30 +36,30 @@ tags:
## 2020 的遗憾
## 2020的遗憾
* 挖了好些坑都没填
* 种的花没能看到开花,人又在学校了
* 没能集齐老家四季的照片
* 2020 唯一的 Logic 作品没能上线,还没到令自己满意的程度
* 2020唯一的Logic作品没能上线还没到令自己满意的程度
## -
疫情给所有人都带来了冲击很庆幸的是疫情于我于我的家庭都没有造成任何大的影响。2020 有再多遗憾,在这一条面前都不值一提。曾经一度想逃离这个地区,在后疫情时代看来,大的灾难面前,不发达的内陆地区和偏远郊区是不可多得的避难所。人口和资源会自然地聚集在大城市那些经济发达的地区,但除此之外的地区并不是荒无人烟自有他的道理。
疫情给所有人都带来了冲击很庆幸的是疫情于我于我的家庭都没有造成任何大的影响。2020有再多遗憾在这一条面前都不值一提。曾经一度想逃离这个地区在后疫情时代看来大的灾难面前不发达的内陆地区和偏远郊区是不可多得的避难所。人口和资源会自然地聚集在大城市那些经济发达的地区但除此之外的地区并不是荒无人烟自有他的道理。
2020 下的中国无疑是值得肯定的,社会主义集中力量办大事的特征在这一场风波中展现地淋漓尽致,资本主义过渡不香了,所有的固有印象都被打破,疫情揭开了这层虚伪的面具,我能够以几乎为 0 的代价得到这个经验是我人生莫大的荣幸。
2020下的中国无疑是值得肯定的社会主义集中力量办大事的特征在这一场风波中展现地淋漓尽致资本主义过渡不香了所有的固有印象都被打破疫情揭开了这层虚伪的面具我能够以几乎为0的代价得到这个经验是我人生莫大的荣幸。
除了对制度的认知的变化2020 我也在重新思考两个问题。
除了对制度的认知的变化2020我也在重新思考两个问题。
1. **什么是我想要的?**
2. **如何逃离 IT 业的内卷**
2. **如何逃离IT业的内卷**
这两个问题本质上是同一个。十年来我想要的一直都没有变,在学生时代也一直没有足够的眼界、见识、能力和精力去仔细思考这个问题。
但这两个问题,在 2020 年的结束,我还是不能给自己一个答案。但是,正如 *数码宝贝:羁绊* 中所阐述的那样,我会努力去寻求自身更多的可能性,不放弃希望与初心。在没有答案之前,我选择
但这两个问题在2020年的结束我还是不能给自己一个答案。但是正如 *数码宝贝:羁绊* 中所阐述的那样,我会努力去寻求自身更多的可能性,不放弃希望与初心。在没有答案之前,我选择
* **保持健康的身体**,虽然近视了没办法,但只要我还有良好的听觉,我就还能欣赏世界上美妙的音乐;只要我还有良好的味觉,我就还能品尝世界上美味的食物;只要我还有良好的嗅觉,我就还能品味大自然的芬芳;只要我还能唱,我就还有机会把心中的旋律唱出来;只要我还能说,我就还有机会把脑海的故事说出来;还有只要我还有双脚,我就还有机会丈量世界;只要我还有双手,我就还有机会创造世界;
* **读更多的书,看更多的电影**。也许这些迷茫只是因为我太久没有阅读,思想僵化了吧。但我想,这个问题,书中一定有答案。我的人生是有限的,但是我可以通过书籍、电影和音乐来感受别人的人生。
@@ -74,7 +74,7 @@ tags:
## 终
最后的最后2020 年度流水账
最后的最后2020年度流水账
* 不拜年的春节,开心😄
* 寒假放完了,直接线上教学,懵逼
@@ -84,11 +84,11 @@ tags:
* 快递初步解封,买了花种子
* 发小高三无心复习,我又不能放开耍
* 每天照料种子,感受初生的喜悦,超有成就感
* 折腾 docker
* 折腾docker
* 折腾博客Hugo
* 刷红七
* 水水的网页设计比赛拿了个一等奖,奖品自选,我们队选了三大箱零食哈哈
* 折腾 RSS
* 折腾RSS
* 复学
* 一头雾水的组原实验,可是看看四周好像只有自己在做
* 水水的中青杯,说好的组队到头来基本是自己一个人写
@@ -99,16 +99,33 @@ tags:
* 小一个月过了科二科三,刺激
* 刷了三体三部曲,必须点赞
* 开学数模比赛,很辛苦,但是挺考验人的
* 捡垃圾组了第一台主机,吃上了 Catalina 黑苹果
* 捡垃圾组了第一台主机吃上了Catalina黑苹果
* 十一过后每天学习吉他
* 继续折腾 RSS
* 继续折腾RSS
* 实验室开通了微信公众号
* CFC 四级小班课,消灭了四级 (updated)
* 正式开始做 Logic 项目,但是发现思绪混乱不堪,工作方式与预期相差甚远
* 正式开始做Logic项目但是发现思绪混乱不堪工作方式与预期相差甚远
* 第一次穿西装
* 挖了又没填完的几个坑
* 肝课设
* 写这篇文章
* 抓住 2020 的尾巴上线了 https://coding-step-one.colinx.one/
* 2020
* 抓住2020的尾巴上线了https://coding-step-one.colinx.one/
* 2020终

View File

@@ -0,0 +1,8 @@
---
title: Headless CMS
date: 2021-09-21T08:23:00.595Z
lastmod: 2021-09-21T08:23:00.613Z
description: Guess what?
draft: false
---
Guess what?

View File

@@ -1,115 +0,0 @@
---
title: 2021 年度总结
date: 2021-12-31
lastmod: 2021-12-31
description: 转眼又快是新的一年似乎岁数越大会感觉时间过得越快。想起小时候下课前的三分钟都无比漫长现在在学校待两个月却仿佛只是两天。纵有万分感慨但无法阻挡的事实是2021 结束了,我又长了一岁,父母又老了一岁,我的大学时光又少了一年,我在自己的道路上又行走了一年。
categories:
- 杂记
- 年度总结
tags:
- 总结
- 杂记
- 2021
---
<!-- # 2021 年度总结 -->
## 序
转眼又快是新的一年似乎岁数越大会感觉时间过得越快。想起小时候下课前的三分钟都无比漫长现在在学校待两个月却仿佛只是两天。纵有万分感慨但无法阻挡的事实是2021 结束了,我又长了一岁,父母又老了一岁,我的大学时光又少了一年,我在自己的道路上又行走了一年。
## 我的 2021 简述
**印象·2021**
* 拿到 BATJ 实习
* 与公司 CEO 一起吃饭,认识了很多有趣的人和事
* 开源项目 RSS Man 获得认可,有 20+ star
* 完成年初的 flag阅读了 10 本书
* 入坑并追完了星际宝贝系列
* 买了 HomePod mini 作为自己的生日礼物,立体声组合相当 nice
* 爬长城,游故宫,打卡北京
* 体验了烫染get 枯草般的头发get 另一种自己
* 体验了打飞的,还全报销了,有种超级忙的 boss 赶脚
* 入手 XBOX 和极米投影仪,备战寒假`真·躺平`生活
**年度遗憾:**
* 博客 4.0 又咕咕咕了
* CFC 官网 4.0 又咕咕咕了
* RSS Man 3.0 又又又咕咕咕了。。。
* 没能完成 6.828
## 2021 关键词:工作、健康
2021 对我而言是特殊的一年,大三的我一只脚迈进了职场,体验了社会的酸甜。回学校的第二天着手开始面试,很荣幸,先后拿到了 BATJ 四家的实习 offer最终选择了把我最后一个暑假给阿里高德事业群。我的实习生活算是比较轻松的没有 pua没有疯狂加班以一种温和的方式熟悉了职场对技术和资本有了新的理解见到了不一样的世界也破灭了北京的幻想。有些人生在罗马有些人穷其一生也到不了罗马但还是很庆幸这是一个通过自己的努力就可以到达罗马的时代。
在北京实习的日子过得很快也很愉快。leader 和 mentor 都很 nice。不过在实习的日子里身边发生了好几件事让我对健康这个问题又有了新的看法。我看到公司 CEO 日理万机,事业蒸蒸日上,而他自己坚持锻炼,精力旺盛。我又看到接连几个朋友罹患肿瘤,昔日同学频频心里障碍,影响学业。平日里不起眼的几条消息,现在到了我身边,一时间竟无所适从。健康是一种隐形的财富,无病无痛时感知不到它,甚至认为毫无价值,只有病痛落到自己头上,才知道健康的可贵。单说起病痛其实并没有什么,疼哪医哪,问题不大。但是当我们谈及的是肿瘤和癌症,问题就变得复杂了起来。并不是被感染、受伤了才会有肿瘤,也并不是岁数大了抵抗力弱了一定会得癌症。甚至目前来看,它没有贫富之分,众生平等,有钱有势也无力回天。联合国世界卫生组织有长长一串致癌物清单,但这只是一小部分,现阶段被人类从统计学角度认知的一小部分,而且列表上的致癌物也并不是毒素,摄入即罹患癌症。
对于肿瘤和癌症这类问题,现在最有效的防治手段应该只有一个,早发现早治疗。而要减少患病的几率,我想环境应该是非常重要的一点。这里包括两个:居住环境和饮食环境。居住环境也包括物理上的,也有心理上的。物理上减少致癌物,保持通风,保持光照,减少不必要、明显不适的电磁场。心理上保持积极,保持开朗。
---
关于电磁场,我个人观点一向是认为,这的确会对生物体有影响。网络上大多数科普电磁辐射对人体没有危害的论点主要有两个:一是现在没有确切的实验数据说明电磁辐射对人体有明显的危害,二是论剂量,电磁辐射对人体的危害主要是热效应、升温,只有剂量非常大才会影响到人体。这两条放到现在来说没有什么问题,并不是说他们正确,而是不能说他们错了。电磁辐射的热效应的确是对人体造成最大伤害的一种途径,现阶段实验的确没有证据可以表明电磁辐射有害。但是电磁波不仅仅有振幅,还要考虑频率和他的波形,当年 3G 升 4G 就有很多人说打电话时间长了会头痛,而之前不会,我也有类似体感;现阶段实验不可能有长达二三十年的关于电磁场对生物体健康的实验,就算有确凿证据也不可能放出来,因为这触及资本利益,参考汽油产业和铅的故事。此外我们也不可能全部放弃无线时代带给我们的便利。
---
## Answers to 2020
2020 年底我的一个疑问是逃离 IT 业的内卷,这个问题我有了一个阶段性的答案。目前来看有两个方向,一是选择不同的赛道,另一个是选择资源富裕开发程度不高的领域。今年我选择了前者。
## Flags for 2022
* 阅读 12 本书
* 打卡 5 个景点
## 流水账时间
* 一个挺暖和的春节
* 过年在家有天晚上睡不着,翻身起来做了个数码宝贝的 MV但是咕咕咕又不想投稿。。
* 拿云台坐在电动车上给老家拍了个视频,等十年后再回来看
* 游万佛湖,几年没去没想到景区建设得很快
* MC 私服,云服务器好友联机爽歪歪,还有 1.5 个外国友人沟通变得奇妙了起来
* 返校第二天拿到 jd 实习 offer
* 无聊的编译原理课
* 各种上课接电话
* 各种准备面试和被面试,最终拿到 BAT 实习 offer
* 📕深入理解 Java 虚拟机👍
* 折腾 RSS对 RSS Man 做了不少优化
* CFC 六级冲关小班课
* 前往北京实习
* 打飞的回来考试
* 平平无奇的暑假,体验公司生活
* 搭建 ARK 私服,天天开黑
* 参加 Linux 平台的一个开发比赛,没想到白天上班晚上回来写点东西这么累
* 周末拿公司的 mbp 回去听歌爽歪歪,想买个 homepod 结果停产了。。
* 入坑鲁邦三世系列,很有魅力的一部剧
* 📕《凤凰架构》👍
* 龟龟到家
* 过生日入了一对 homepod mini立体声效果很 nice
* 第一次体验现场器乐表演
* 天气转凉,爬长城游故宫打卡北京
* 同学来北京玩,天天吃好的,才发现稍微奢侈一点点可以吃到超棒的美食
* 回学校体验隔离套餐:(
* 博客上线评论
* 随手做的 RSS Man 项目渐渐获得关注和认可,感觉超棒
* 第一次体验翻,土蔷,真墙
* 入坑并追完星际宝贝系列
* 入手 XBOXXGP 真香
* 最后一次参加 CFC 招新
* 入手极米投影仪,躺在宿舍床上看电影美滋滋
* 📕《编码:隐匿在计算机软硬件背后的语言》👍
* Linux&Git 小班课,一周从`ls`到 nginx
* 搞到了三百块 4c16g 的服务器y1s1 真的给力
* 赶在年末疫情没严重溜回家,保住我的最后一个寒假
* 2021 the end

View File

@@ -1,107 +0,0 @@
---
title: 2022 年度总结
date: 2022-12-31
lastmod: 2023-01-16
description: 我的 2022 年度关键词 幸运,尝试躺下,表达自己
categories:
- 杂记
- 年度总结
tags:
- 总结
- 杂记
- 2022
---
## 我的 2022 年度关键词
幸运,尝试躺下,表达自己
---
### 扩大幸运的表面积
我一直坚信机会总是留给有准备的人,换个角度,那就是所谓的「机会」的事件概率是基本均匀的,但是当你有更多抓住「机会」的能力的时候,你能够看到的和能够抓住的就更多了。
我希望未来的自己,能够看到更多机会,再把握住合适的机会。毕竟精力和能力都是挺有限的东西。
### 尝试躺下
时间那么宝贵,何必要浪费在没有意义的卷?当我主动暗示自己渐渐扩大「卷」的定义的边界,并避让这些事的时候,我发现自己更轻松了,节省的时间和精力无论是做事还是娱乐都很好,希望在新的一年里,能够更多地提高效率,在有限的时间里追寻更多的价值和成就感。
### 表达自己
今年有一个比较细微的变化,我发现自己变得能够表达自己了、有更多的表达欲了。
和别人交流问题时能够清晰明了地表达我的观点,并能够引导其他人输出我所需要的信息,推动双方解决问题,让一场对话是一次愉悦的、有意义的交流,我觉得这是非常重要的一件事。
表达也不单单只是言语上,其他途径比如文字,绘画,音乐等都是一种向这个世界表达自己的途径。记忆中高中的墙上一直写着我们的校训 To the world we commit ourselves,
现在回忆起来,那个标语是红红的,压迫着我们,也在不时煽动着台下一个个中二少年的心。
我自认难堪大任。不过换个角度作为一个社会人这个世界的一部分To the world we express ourselves这样更适合每一个平凡的、不屈的、骄傲的自己。我也接下来的几年里能在这条道路上继续探索下去。
---
## 2022 年度高光时刻
- 一段惬意的摸鱼抓虾的时光
- 封培期间认识了一群很优秀很有趣的小伙伴
- 跨年 party&阳康朋友聚合
- 入手 Mac Mini M1、Midiplus X6 mini 等,体验+++
## 2022 年度遗憾
- 因为疫情和自己的保守,没能进行一场长途毕业旅行
- 没能苟年底,居家三周还是阳了
## Flags From 2021
- 阅读 12 本书炸裂4/12事实证明上班了的确没什么留给看书的时间
- 打卡 5 个景点(✅ 勉强完成,广州塔、广州动物园、广州博物馆、珠海海滨泳场城市阳台、深圳大鹏海滩)
## Flags For 2023
新的一年,新的 flag
- 阅读 6 本书
- 发布 6 篇博客文章
- 打卡 6 个景点
- 在各种公共平台发表总共 6 个作品
## Question For 2023
一年后的自己,有没有变得更加善于表达自己,有没有更多、更畅酣地表达自己?
---
## 年度流水账环节
- 一个平淡而平凡的春节
- 回高中母校转转,很激动也很局促,在上课也没敢多逛,没见到班里的老师有点可惜
- 比赛的奖状奖杯、公司的新年礼盒陆续寄到家了,自己没什么感觉,但是家里人倒是挺高兴
- 回学校后每天背单词准备着大概率没用的托福考试
- qB+Plex+TMM+投影仪,打通了影视流,看片更方便体验更好了
- 入坑 JOJO、Rick&Morty 等神作
- 每日饭后娱乐:学校池塘抓龟,一段惬意自在的时光
- RSSMAN 项目获得更多认可,并与一个律师用户朋友进行深度交流,感觉很奇妙
- 毕设赶工的那段时间,意外地灵感爆发发了好几篇文章,但就是不愿意写毕设,真是矛盾呐哈哈
- 为因为疫情而泡汤的长途毕业旅行而懊恼
- 毕业前各种吃吃吃玩玩玩
- 毫无波澜地毕业了,迎来新的篇章
- 在广州歇脚,和朋友一起尝试各种广式和潮汕美食,感受到了广州的烟火气
- 在一个台风天来到深圳,体验了周六空无一人的地铁
- 逃过寒潮,「荣幸」地成为了一名打工人
- 入坑西部世界系列
- 狂追哆啦 A 梦系列,似乎想补回些什么
- 在公司为期一周的新人封培中认识了一群很优秀和有趣的小伙伴,还有一段珍贵的回忆
- 打工&打工
- 每天白嫖 Piano Academy 练琴
- 疫情反复,核酸不断,庆幸租房的时候选择了个不错的小区,每天小区门口就做核酸省下不少时间
- 中秋去珠海游玩,看到了另一种城市风貌,整洁、惬意
- 入手 Airpods Pro 2苹果全家桶喜加一
- 有两个星期 RSS MAN 疯狂涨 star还疑惑是不是被哪个大佬的号推荐了
- 终于入手了 Mac Mini M1 版,虽然没等到 M2但是体验仍然是超过预期的棒全家桶喜++
- 入手了 Midiplus X6 mini这下是连着 MIDI 键盘白嫖 Piano Academy 练琴了
- 疫情放开了,但是更不敢出去了
- 居家了三周还是没逃过阳的结局,索性症状不重之烧了一天
- 第一次和小伙伴一起跨年 party 暨阳康选手聚会
- 买回家的票,第一次近距离感受春运,打工人太难了
- 2022 the end.

View File

@@ -1,122 +0,0 @@
---
title: 2023 静态网站托管服务速度对比
date: 2022-12-25
description: 对几家喜闻乐见的静态网站托管服务商 Vercel、Netlify、Cloudflare Pages、Azure Static Pages 测个速, 2023 版
categories:
- 技术
tags:
- 技术
- Netlify
- Vercel
- 优化
- Cloudflare
- Azure
---
<!-- # 2023 静态网站托管服务速度对比 -->
对几家喜闻乐见的静态网站托管服务商 Vercel、Netlify、Cloudflare Pages、Azure Static Pages 测个速
![Pasted image 20221224164447](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033118.png)
![Pasted image 20221224173040](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033119.png)
![Pasted image 20221224164841](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033120.png)
![Pasted image 20221224165726](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033121.png)
**测速后结论:**
- Vercel 全部爆炸,大陆地区全部不通
- Netlify 对三家支持都比较不错,不过都有些不太稳定
- Cloudflare 对电信友好,联通次之,移动大规模连不上
- Azure 电信友好,联通次之,移动也是大规模连不上
## 特邀嘉宾:腾讯云海外 CDN
号称「充钱就可以获得力量」,那么让我们来看下冲了钱后的效果
![Pasted image 20221224181710](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033122.png)
##### 腾讯云海外 CDN
- 大陆地区大部分路由到香港,极少数华东地区路由到美国,全部为 AWS 节点
- 移动除西北地区外都尚可,联通次之也是除西北外都还行,电信惨不忍睹
> **用腾讯云 CDN 被 D 怎么办?天价账单可付不起**
> 小时结计费模式,欠费后保护期为 2 小时,还可以按流量或带宽单独设定防护策略
接下来开始真正的试炼:检测晚高峰期间各家的性能,晚上这个点各大运营商的出口都比较拥堵,这个时候更能体现出各家的性能优劣
## 晚高峰测速结果
![Pasted image 20221225190111](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033123.png)
Azure 全线炸裂 ⬆️
![Pasted image 20221225190148](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033124.png)
Netlify 依然给力 ⬆️
![Pasted image 20221225190325](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033125.png)
Vercel 依然一片红 ⬆️
![Pasted image 20221225190510](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033127.png)
CF 跟白天差不多,电信联通勉强可用 ⬆️
![Pasted image 20221225190728](https://blog-1301127393.file.myqcloud.com/BlogImgs/202212252033128.png)
TX 海外 CDN 红绿参半,不过可以看到很强的地域特性
#### 其他补充信息:
##### Vercel
- 不能自定义 HTTPS 证书,走 Lets Encrypt
- 有 Anycast76.76.21.21,用 DNS 做负载均衡会比较方便
- 使用分钟级监控看过,时不时有连不上的情况,比 Cloudflare 明显差些,不过免费没有 SLA 保障也正常
- 大陆地区全部爆炸,不予考虑
##### Netlify
- 可以自定义 HTTPS 证书
- 无 Anycast去年看都是 AWS 承载,今年看有近一半由 Google Cloud 承载
- 移动可以优先 Netlify
- 可以安装插件,网站更新可以自动推送 Google 比较方便
- 全部路由到新加坡,北方用户可能延迟较高
##### Cloudflare Pages
- Cloudflare 可以自己签发证书,不像其他使用 Lets Encrypt 的必须要能解析到
- 有 Anycast可以直接解析到 1.1.1.1,做负载均衡方便
- 移动 pass电信联通尚可
- 不太稳定,动不动就被墙,需要常检测更新节点联通性
##### Azure Static Pages
- 可以通过 TXT 记录验证和自动申请 HTTPS
- 无 Anycast只有香港的节点两个 IP方便负载均衡
- 移动 pass电信联通尚可
- 北方用户可能延迟较高
## 策略
- Vercel 全线不可用Azure 晚高峰全部炸裂,大陆地区不考虑
- Netlify 做全局默认 fallback
- 海外默认走 Cloudflare、Vercel
- 电信走 Netlify无可替代
- 移动走 Netlify 和腾讯云海外 CDN
- 联通走 Netlify、Cloudflare、腾讯云海外 CDN
博客的几个镜像站点我也挂在了仓库的 README 页面,加了几个 badge 可以快速看到几个 mirror 的联通性情况。[https://github.com/Colin-XKL/Colinx-Blog](https://github.com/Colin-XKL/Colinx-Blog)
![Blog-Netlify](https://img.shields.io/website?label=netlify&style=flat-square&url=https%3A%2F%2Fcolins-blog.netlify.app)
![Blog-Vercel](https://img.shields.io/website?label=vercel&style=flat-square&url=https%3A%2F%2Fcolinx-blog.vercel.app)
![Blog-CloudflarePages](https://img.shields.io/website?label=cloudflare%20pages&style=flat-square&url=https%3A%2F%2Fcolinx-blog.pages.dev)
![Blog-AzureStaticPages](https://img.shields.io/website?label=azure%20static%20pages&style=flat-square&url=https%3A%2F%2Fnice-glacier-095b09e00.1.azurestaticapps.net)
![Blog-GithubPages](https://img.shields.io/website?label=github%20pages&style=flat-square&url=https%3A%2F%2Fgh-pages.colinx.one)
![Blog-TencentCDN](https://img.shields.io/website?label=tencent%20cdn&style=flat-square&url=https%3A%2F%2Fblog-txcdn.colinx.one)

View File

@@ -4,7 +4,7 @@ date: 2019-04-08
lastmod: 2020-04-29
description: 经过两三天的折腾,从 Linux 结构及指令,到 LNMP 框架搭建,再到数据库的配置,最后端口转发 + 内网穿透,博客终于成功上线!在此将部署过程及踩过的坑记录下来,一方面是纪念,另一方面希望能够后来人提供一点帮助。
categories:
- 技术
- 踩坑记
tags:
- Blog
- 网站

View File

@@ -1,10 +1,10 @@
---
title: Colin's 实验室 - 2021
title: Colin's实验室 - 2021春
date: 2021-02-25
lastmod: 2021-03-30
description: 小玩具及他们的 demo
description: 小玩具及他们的demo
categories:
- 技术
- 杂记
tags:
- 技术
- Python
@@ -12,9 +12,9 @@ tags:
- Flutter
---
<!-- # Colin's 实验室 - 2021 春 -->
# Colin's实验室 - 2021
> 小玩具及他们的 demo
> 小玩具及他们的demo
>
>
@@ -22,35 +22,35 @@ tags:
> 自动分割给定的英文文本,提取词元后在数据库中搜索,根据给定的词汇量和难度等级进行筛选,只能提取阅读障碍词汇并高亮当前备考项目(如四级)的重点单词
![360 截图 20210206210445677](https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330233722.jpg)
![360截图20210206210445677](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20210330233722.jpg)
## 知乎爬虫及 JS 逆向
## 知乎爬虫及JS逆向
> 日常用 RSS 订阅知乎的一些高质量专栏。但由于知乎本事并不支持 RSS内容大多通过 RSShub 来的其本质是个爬虫经常会受到前端页面结构变更的影响。为了应对这个变化RSShub 中对于知乎相关页面的爬取规则必须得重写。
> 日常用RSS订阅知乎的一些高质量专栏。但由于知乎本事并不支持RSS内容大多通过RSShub来的其本质是个爬虫经常会受到前端页面结构变更的影响。为了应对这个变化RSShub中对于知乎相关页面的爬取规则必须得重写。
>
> 分析了一通知乎的页面,发现有个接口可以直接请求,但是会检验 header。header 里面有几项特殊的自定义参数,`x-zse-83` 和 `x-zse-86`等。为了搞清楚这里面的数值怎么来的,就必须对知乎前端页面资源中的一个 js 文件进行逆向分析。
> 分析了一通知乎的页面发现有个接口可以直接请求但是会检验header。header里面有几项特殊的自定义参数`x-zse-83` 和 `x-zse-86`等。为了搞清楚这里面的数值怎么来的就必须对知乎前端页面资源中的一个js文件进行逆向分析。
>
> 逆向折腾了大半天,就快要成功提取核心加密函数的时候,发现知乎的前端页面为了 SEO 有加入一页的文章列表数据,可以直接用上。考虑到逆向的工作量和潜在的法律问题,遂放弃原本的方案。
> 逆向折腾了大半天就快要成功提取核心加密函数的时候发现知乎的前端页面为了SEO有加入一页的文章列表数据可以直接用上。考虑到逆向的工作量和潜在的法律问题遂放弃原本的方案。
>
> 新的方案完成后,已向 RSShub 提交 PR 并已被合并。
> 新的方案完成后已向RSShub提交PR并已被合并。
## MC 服务器搭建与极限优化
## MC服务器搭建与极限优化
> 12G 学生机,从 2 人联机频频崩溃到 8 人挖矿毫无压力,学习了 JVM GC 种种,对服务端程序的一些参数也渐渐熟悉。优化效果喜人,总有还能压榨的性能,就像资本家看手下的骡子一样 hhh
> 12G学生机2人联机频频崩溃到8人挖矿毫无压力学习了JVM GC种种对服务端程序的一些参数也渐渐熟悉。优化效果喜人总有还能压榨的性能就像资本家看手下的骡子一样hhh
![屏幕截图 (12)](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205949.png)
![屏幕截图(12)](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205949.png)
## 洞洞板/冰箱贴/CVPRO/...没想好名字)
> 一款跨平台的灵感素材收集与简易管理 App基于 Flutter 构建,跨平台,颜值在线。
> 一款跨平台的灵感素材收集与简易管理App基于Flutter构建跨平台颜值在线。
![截屏 2021-03-30 23.21.32](https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330233350.png)
![截屏2021-03-30 23.21.32](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20210330233350.png)
> 持续开发中,附 roadmap
> 持续开发中附roadmap
>
> version 1.0
>

View File

@@ -4,17 +4,17 @@ date: 2021-03-30
lastmod: 2021-03-30
description: Flutter 拖动排序列表与跨平台优化实践
categories:
- 技术
- 教程
tags:
- 技术
- Flutter
---
<!-- # Flutter 拖动排序列表与跨平台优化实践 -->
# Flutter 拖动排序列表与跨平台优化实践
Flutter 中实现拖动排序的列表非常简单,使用官方的`ReorderableListView`替代原本的`ListView`即可,`ListView.builder`同理。
Flutter中实现拖动排序的列表非常简单使用官方的`ReorderableListView`替代原本的`ListView`即可,`ListView.builder`同理。
@@ -42,30 +42,30 @@ Flutter 中实现拖动排序的列表非常简单,使用官方的`Reorderable
}
```
上面是官方给的 demo简洁明了。[官方介绍视频](https://www.youtube.com/watch?v=yll3SNXvQCw)下面的评论里,人家直呼比原生 Android 写的过瘾的多。阅读文档后我给我的 App 的界面也加上了可拖动排序的功能。效果如下图
上面是官方给的demo简洁明了。[官方介绍视频](https://www.youtube.com/watch?v=yll3SNXvQCw)下面的评论里人家直呼比原生Android写的过瘾的多。阅读文档后我给我的App的界面也加上了可拖动排序的功能。效果如下图
![截屏 2021-03-30 23.04.59](https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330234001.png)
![截屏2021-03-30 23.04.59](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20210330234001.png)
虽然可以实现拖动了,但是右边有一个按钮很碍眼。不过这个是用来控制拖动的,鼠标移上去才能触发拖动。
翻了翻文档发现,这个地方`ReorderableListView`在移动端和桌面端的处理是不一样的,上图(桌面 macos右边会出现一个 dragHandler而移动端则是靠长按列表项触发拖动。
翻了翻文档发现,这个地方`ReorderableListView`在移动端和桌面端的处理是不一样的上图桌面macos右边会出现一个dragHandler而移动端则是靠长按列表项触发拖动。
要把这个碍眼的图标去掉,有两个方案:
- 找到定义这个图标的地方,更换一个合适的图标,并在外面包裹一层,仅在鼠标 hover 时将图标显示以进行拖动,其他情况下隐藏
- 找到定义这个图标的地方更换一个合适的图标并在外面包裹一层仅在鼠标hover时将图标显示以进行拖动其他情况下隐藏
- 将拖动的实现定义为和移动端相同,即都通过长按列表项触发拖动
针对方案一,以`ReorderableListView``Icon`为关键词搜索,很遗憾的是并没有这方面的资料,又翻了翻源码,并没有找到可以自定义右边这个拖拽按钮的实现。
Flutter 官方的 Github 仓库的 issue 中,[https://github.com/flutter/flutter/issues/66080#issuecomment-771123430](https://github.com/flutter/flutter/issues/66080#issuecomment-771123430) 对相关问题做了阐述,并有提案对`ReorderableListView`进行了改进。该 issue 对应的 pr 已经被合并到 stable channel查阅相关 API 后了解到可以使用`buildDefaultDragHandles: false`,关闭默认的拖拽触发实现,再使用`ReorderableDelayedDragStartListener`包裹原先的`ListTile`即可实现桌面端和移动端都通过长按列表项触发拖拽排序。
在Flutter官方的Github仓库的issue中[https://github.com/flutter/flutter/issues/66080#issuecomment-771123430](https://github.com/flutter/flutter/issues/66080#issuecomment-771123430) 对相关问题做了阐述,并有提案对`ReorderableListView`进行了改进。该issue对应的pr已经被合并到stable channel查阅相关API后了解到可以使用`buildDefaultDragHandles: false`,关闭默认的拖拽触发实现,再使用`ReorderableDelayedDragStartListener`包裹原先的`ListTile`即可实现桌面端和移动端都通过长按列表项触发拖拽排序。
不过相应的ListTile `onLongPress`就不能再有响应了。刚好今天完成了滑动删除的实现,现在列表也的删除、排序已经高度可用且多平台统一了。
不过相应的ListTile的`onLongPress`就不能再有响应了。刚好今天完成了滑动删除的实现,现在列表也的删除、排序已经高度可用且多平台统一了。
![截屏 2021-03-30 23.21.32](https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330233350.png)
![截屏2021-03-30 23.21.32](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20210330233350.png)
附相关代码实现:

View File

@@ -1,315 +0,0 @@
---
title: Huginn 指南:为任意网站制作 RSS
date: 2022-05-08
lastmod: 2022-05-08
description: 又一篇介绍使用 Huginn 制作 RSS 的教程🕶️
categories:
- 技术
- 指南
tags:
- Huginn
- RSS
- 爬虫
- CSS
- 技术
---
<!-- # Huginn 指南:为任意网站制作 RSS -->
Huginn 使用多个不同功能的 Agent 组合搭配来实现一系列功能,一个 Agent 可以执行特定的操作,并产生一个 Event你可以指定他产生的 Event 由哪个 Agent 接收处理。
比如我们需要使用 WebSite Agent 来爬取某个网站上的列表内容,爬取后列表的每一项会生成一个 Event我们可以指定一个 Output Agent 来接收这些 Event并将其转换为 RSS 的格式进行输出,复制 Output Agent 返回给你的 URL 就可以进行订阅啦Huginn 爬取网站生成 RSS 的基本原理就是这样。
## Huginn 爬取普通网页制作 RSS
右键网页打开开发者工具,屏幕会分出一部分空间显示开发者工具窗口,点击左上角的按钮再把鼠标移动到页面上可以选择页面的某一个元素,比如这里我们要爬取推荐文章列表,推荐文章列表的每一项都有同样的样式,我们可以使用 CSS 选择器来指定爬取该项
![image-20220508160659378](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207138.png)
该元素可以用 CSS 选择器`.meiwen`选择到。
**Tips:** class=xxx则使用`.xxx`,如果为id=xxx则使用`#xxx`
该标签是 a 标签,我们可以继续限定一下条件,使用`a.meiwen`
如果要限制必须是 h2 标签下的带有 meiwen 的 class 属性的 a 标签,可以使用`h2 a.meiwen`
如果要再加一个限制,是列表元素 li 下面的 h2 标签里带有 meiwen 的 class 属性的 a 标签,可以使用`li h2 a.meiwen`
添加其他附加限定条件以此类推
你也可以在右侧 Style 面板里点击加号添加一个自定义样式,输入 CSS 选择器,浏览器会自动高亮符合条件的网页元素,你可以使用这个功能来检验你写的 CSS 选择器是否正确以及是不是提取的你想要的内容
![image-20220508163359806](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207716.png)
接下来在 Huginn 里创建一个 Scenario然后点击新建一个 Agent类型选择 WebSite Agent填写一个名称并在最下面的配置处指定你要爬取的网页元素
> ###### **Website Agent**
>
> The Website Agent scrapes a website, XML document, or JSON feed and creates Events based on the results.
```json
url: {
css: li h2 a.meiwen
value: @href
}
```
以爬取 url 为例css 表示使用 css 选择器选择网页元素value 表示从哪里获取对应的值,对于刚才我们选取的一个元素来说
```html
<a class="meiwen" href="/article/58030.html" title="缘起则聚,缘灭则散">缘起则聚,缘灭则散</a>
```
href 属性里面的内容是他的链接title 属性里面的内容则是他的标题。接下来在 value 中填写`@href`指定从 href 属性提取内容,就可以取到链接地址了
> **Pro Tips:**
>
> 如果是纯文本节点或是想提取标签内嵌的文本value 里可以填写`string(.)`
>
> 如果想删除多余的空格,可以使用`normalize-space(.)`
> **Pro Tips 2:**
>
> 字符串处理函数和标签属性值变量可以一起使用,如`normalize-space(@title)`可以获取该标签的 title 属性值并删除多余的空白字符
![image-20220508163714342](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207717.png)
接下来点击 Dry Run 按钮进行测试,不出意外我们会得到一个 json 的输出,里面包括我们爬取到的每一项他的 url 和 title。
如果没有成功,你可能需要删掉上面没有使用到的 hovertext 节点,因为该项指定的内容在我们刚才的网页中并不存在。
![image-20220508164259295](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207718.png)
点击 Save 保存,我们开始下一步输出 RSS。在刚才的 Scenario 中再新建一个 Agent选择 Data Output Agent并设置他的名字和 Source Agent
> ###### Data output Agent
>
> The Data Output Agent outputs received events as either RSS or JSON. Use it to output a public or private stream of Huginn data.
![image-20220508164941647](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207719.png)
**Propagate immediately**是指即时处理来自 Source Agent 的 Event启用他方便我们调试但会略微增加服务器负载你可以自行决定是否使用。
![image-20220508165345792](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207720.png)
在 secret 字段中为你的这个 RSS 标注一个英文的名字,修改 title 字段标注你的 RSS 的名字。item 字段是每条文章会有的属性,一般来说主要就 title 和 link分别设置为上文我们提取的值的变量名。这里添加一个 guid 字段,这是一篇文章的唯一标识符,避免 RSS 阅读器读到的文章标题不同但是内容相同,常见于某篇文章的标题被修改,这会导致 RSS 阅读器内出现多篇重复文章。
此外建议增加一个 link 字段,值设置为与爬取的网站的主域名一致,避免网站内使用相对链接开头的资源无法正常加载。
![image-20220508170038722](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207721.png)
![image-20220508170115192](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207722.png)
点击 Save 保存,回到 Scenario 界面,第一次需要手动点击运行一下刚才的 Website Agent。稍等片刻后台会进行爬取右上角会显示产生了多少个 Event。再点开刚才设置的 Data Output Agent 查看详情vola右侧就会显示生成的 RSS 链接了,复制以 xml 结尾的链接到 RSS 阅读器中就可以订阅啦🎉
![image-20220508170212112](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207723.png)
如果你的配置正确但是 WebSite Agent 又没有输出任何内容的话,那么你要爬取的站点的内容应该是通过 JavaScript 在你带开浏览器时动态生成的。
> **Pro Tips:**
>
> 你可以右键网页在开发人员菜单中点击显示源代码,然后用 Ctrl+F 搜索你在页面上见到的想爬取的某一条内容,如果有说明该网站的页面时静态的,否则说明你要爬取的内容并不是静态的。
要爬取这样的站点,我们需要模拟浏览器操作,执行页面上的 JavaScript 脚本,待数据生成完毕后再使用上面的方法去爬取内容。要模拟浏览器操作,这里介绍两个方案:一个是利用 browserless 的无头浏览器,另一个是使用在线 PhatomJS 服务。
## 使用 Huginn+Browserless 为动态网页生成 RSS
部署了[RSS Man X](https://github.com/Colin-XKL/RSSmanX)的完整版的话默认已经包含 huginn 和 browserless 服务,无需重复安装。且 huginn 可以通过`service.browserless:3000`访问到 browserless 服务。
总体步骤与上文一样,不过因为被抓取的内容是通过 JavaScript 动态生成的,所以直接使用 WebSite Agent 是抓取不到东西的,我们需要先使用 Post Agent 向 browserless 服务发送指令,让他帮我们模拟浏览器操作,再将最终完整的网页返回给我们,再使用 WebSite Agent 进行后续处理。
> ###### **Post Agent**
>
> A Post Agent receives events from other agents (or runs periodically), merges those events with the Liquid-interpolated contents of payload, and sends the results as POST (or GET) requests to a specified url. To skip merging in the incoming event, but still send the interpolated payload, set no_merge to true.
接下来以[这个网站](https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0)为例介绍一下,这个列表页的内容是由 JavaScript 动态生成的
![image-20220508205159783](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207724.png)
按照以下内容设置你的 Post Agent
```json
{
"post_url": "http://service.browserless:3000/content",
"expected_receive_period_in_days": "1",
"content_type": "json",
"method": "post",
"payload": {
"url": "https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0"
},
"headers": {
"Cache-Control": "no-cache",
"Content-Type": "application/json"
},
"emit_events": "true",
"no_merge": "false",
"output_mode": "clean"
}
```
其中`post_url`为你的 browserless 实例地址,如果你使用了 RSS MAN X 里的 Huginn 可以直接向上面一样填写。`payload`中的`url`字段填写你需要的网页地址。注意 emit_events 要设置为`true`,这样才方便我们后续使用 WebSite Agent 操作。
点击 Dry Run如果能返回一个带有`body`字段且里面有文本内容说明调用成功。
调用不成功检查一下配置,以及是不是我们的爬虫被目标网站拦截了。若是爬虫被拦截可参考文末的解决方案。
![image-20220508195731732](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207725.png)
接下来点击 Save 保存,再新建一个 Website AgentSource 设置为刚才的 Post Agent。
```json
{
"expected_update_period_in_days": "2",
"data_from_event": "{{ body }}",
"type": "html",
"mode": "on_change",
"extract": {
"url": {
"css": "ul#wslb li a",
"value": "normalize-space(@href)"
},
"title": {
"css": "ul#wslb li a",
"value": "@title"
},
"author": {
"css": "ul#wslb li div.center",
"value": "normalize-space(.)"
}
}
}
```
注意修改`data_from_event`的值,其他地方与爬取普通网站一样。再新建并配置一下 Output AgentRSS 的链接就出来了
![image-20220508205856407](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207726.png)
## 使用 PhantomJS 为动态页面生成 RSS
首先需要到[Phantom Js Cloud 的官网](https://phantomjscloud.com)注册一个账户,每个账户官方提供了一定的免费额度,每天大概可以爬取 500 个页面,对于做 RSS 来说妥妥的够用了。注册之后可以得到一个 API KEY这个待会会使用到。
接下来新建一个 Phantom JS Cloud Agent填写基本的名称、API KEY 和目标 URLrender type 选择 html。底下 User Agent 建议改用真实的浏览器 UA减少触发反爬虫的可能性。如果不知道自己的 UA 可以到这个网站查看当前浏览器的 UA复制字符串即可。如果懒得查也可以用这个
```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.81 Safari/537.36
```
> ###### Phantom JS Cloud Agent
>
> This Agent generates PhantomJs Cloud URLs that can be used to render JavaScript-heavy webpages for content extraction.
>
> URLs generated by this Agent are formulated in accordance with the PhantomJs Cloud API. The generated URLs can then be supplied to a Website Agent to fetch and parse the content. Sign up to get an api key, and add it in Huginn credentials.
点击 Dry Run 后会返回一条 url返回格式类似这样
```json
[
{
"url": "https://phantomjscloud.com/api/browser/xxxxxxx"
}
]
```
之后创建一个 WebSite AgentSource Agent 设置为上面的 Phantom JS Cloud Agent然后稍微改一下 url 的部分
```json
{
"expected_update_period_in_days": "2",
"url_from_event": "{{url}}",
"type": "html",
"mode": "on_change",
"extract": {...}
}
```
注意将原来的`url:??`的部分更改为`"url_from_event": "{{url}}"`,这样就指定使用Phantom JS Cloud为我们获取的完整网页接下来的操作就大同小异了。配置好要爬取的字段和规则后点击Dry Run就可以看到结果
![image-20220508215636780](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207727.png)
这里是刚才的 Agent 产生的一个 Event。这里除了 url 和 title 我还提取了 date 字段。在 Output Agent 中,可以配置为每一条文章输出发布时间的信息。对于这种规整的日期字母串,可以使用`{{ date | date: %F }}`进行解析并格式化输出为 rss 规范的时间格式如果没有配置的话,每篇文章的发布时间显示的都是一样的,为 Huginn 爬虫更新的时间。
```json
"item": {
"title": "{{title}}",
"link": "{{url}}",
"pubDate": "{{ date | date: %F }}"
},
```
> **Pro Tips:**
>
> Huginn 解析日期
>
> 注意`{{ date | date: %F }}`里面,第一个`date`是上面的 Website Agent 产生的 Event 里面的变量名,第二个`date`是 Huginn 使用的 Liquid 模版引擎语法里内置的一个 filter可以理解为有特定功能的函数
![image-20220508220438696](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207637.png)
## FAQ
* **为什么启动 docker 容器后访问 Huginn 显示网络错误?**
Huignn 冷启动较慢,需要等待三五分钟。如果还是不行,检查端口映射和防火墙设置
* **为什么抓取到的包含相对路径的结果,网页上可以点击访问,但是生成的 RSS 不能正常使用?**
检查 link 的设置,有些网站只是域名,有些网站有子目录,具体查看该网页源码中 head 节点里 base url 的设置
* **如何对爬取到的某一项的字符串做更高级更复杂的处理?**
可以参考[Hugnn 官方对 Liquid 语法的文档](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid)以及[Shopify 官方关于 Liquid 模板的语法文档](https://shopify.dev/api/liquid)
* **为什么部署了 Huginn等了很长时间都无法访问后台页面**
若部署后某个应用一直无法通过浏览器访问,请检查是否绑定到了 6000/6666 等特殊端口,浏览器会拦截对这些端口的访问参见[这里](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
* **Huginn 爬虫访问目标网站被拦截了怎么解决**
介绍几个基本的反反爬虫策略:
1. 带上 User Agent要求是真实的浏览器 UA。
2. Browserless 去掉默认会和请求一起发送的可以被识别为爬虫的特征参数,设置 browserless 的环境变量`DEFAULT_HEADLESS=false`
3. 使用随机代理 IP适用于因爬取频率达到爬虫阈值
## 扩展阅读
* [Huginn 官方文档](https://github.com/huginn/huginn/wiki/)
* [Liquid 模板引擎语法官方文档](https://shopify.dev/api/liquid/filters/)
* [RSS Man X 部署指南](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
* [docker compose 的错误使用姿势](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)

View File

@@ -1,10 +1,10 @@
---
title: JAMStack 初体验 - 基于 Pocket 和 Gatsby 构建你的「网络日志」
title: JAMStack初体验 - 基于 Pocket 和 Gatsby 构建你的「网络日志」
date: 2021-01-09
lastmod: 2021-01-10
description: 折腾了自己的专属 RSS 信息流,每天都能从那些高质量的信息源中获得不少干货知识,一般就会顺手收藏一下。有一天突然想起自己收藏的那些文章,本身不就是经过二次筛选的高质量文章吗?于是便在构想能不能通过某种方式将这个信息源也公开出来,一方面是记录,另一方面也是间接地展示自己。恰逢遇见 JAMStack最近在国外非常火国内的阿里和腾讯也在跟进搞静态托管那一套。经多方物色最终确定基于 Pocket API+Gatsby 来构建这样一个自己的「网络日志」。
description: 折腾了自己的专属RSS信息流每天都能从那些高质量的信息源中获得不少干货知识一般就会顺手收藏一下。有一天突然想起自己收藏的那些文章本身不就是经过二次筛选的高质量文章吗于是便在构想能不能通过某种方式将这个信息源也公开出来一方面是记录另一方面也是间接地展示自己。恰逢遇见JAMStack最近在国外非常火国内的阿里和腾讯也在跟进搞静态托管那一套。经多方物色最终确定基于Pocket API+Gatsby来构建这样一个自己的「网络日志」。
categories:
- 技术
- 杂记
tags:
- 技术
- JAMStack
@@ -13,30 +13,30 @@ tags:
- Github
---
<!-- # JAMStack 初体验 - 基于 Pocket 和 Gatsby 构建你的「网络日志」 -->
# JAMStack初体验 - 基于Pocket 和 Gatsby 构建你的「网络日志」
折腾了自己的专属 RSS 信息流,每天都能从那些高质量的信息源中获得不少干货知识,一般就会顺手收藏一下。有一天突然想起自己收藏的那些文章,本身不就是经过二次筛选的高质量文章吗?于是便在构想能不能通过某种方式将这个信息源也公开出来,一方面是记录,另一方面也是间接地展示自己。恰逢遇见**JAMStack**,最近在国外非常火,国内的阿里和腾讯也在跟进,搞静态托管那一套。经多方物色,最终确定基于`Pocket API`+`Gatsby`来构建这样一个自己的「网络日志」。
折腾了自己的专属RSS信息流每天都能从那些高质量的信息源中获得不少干货知识一般就会顺手收藏一下。有一天突然想起自己收藏的那些文章本身不就是经过二次筛选的高质量文章吗于是便在构想能不能通过某种方式将这个信息源也公开出来一方面是记录另一方面也是间接地展示自己。恰逢遇见**JAMStack**,最近在国外非常火,国内的阿里和腾讯也在跟进,搞静态托管那一套。经多方物色,最终确定基于`Pocket API`+`Gatsby`来构建这样一个自己的「网络日志」。
> You are what you read.
## 简谈 JAMStack
## 简谈JAMStack
> JAMStack 即基于客户端 **J**avaScript可重用 **A**PI 和预先构建 **M**arkup 的现代 Web 开发架构。当我们谈论“堆栈”时,我们不再谈论操作系统,特定 Web JAMStack 与特定技术无关。这是一种构建网站和应用程序的新方法,可提供更好的性能,更高的安全性,更低的扩展成本以及更好的开发人员体验。
> JAMStack 即基于客户端 **J**avaScript可重用 **A**PI 和预先构建 **M**arkup 的现代 Web 开发架构。当我们谈论 “堆栈” 时,我们不再谈论操作系统,特定 Web JAMStack 与特定技术无关。这是一种构建网站和应用程序的新方法,可提供更好的性能,更高的安全性,更低的扩展成本以及更好的开发人员体验。
JAMStack 是一种新颖的网站架构,与传统的服务端渲染和近些年国内流行的前后端分离等架构不同的是,他的网页是静态的,可以托管在 CDN 上,内容是动态的,可以方便地进行修改。
JAMStack是一种新颖的网站架构与传统的服务端渲染和近些年国内流行的前后端分离等架构不同的是他的网页是静态的可以托管在CDN上内容是动态的可以方便地进行修改。
**JAMStack 几个显著的优势**
**JAMStack几个显著的优势**
* 页面为静态TTFTTimeToFirstByte的时间可以降到非常低
* 页面为静态,服务器遭受的安全风险要低得多
* 不同于客户端渲染JAMStackSEO 会非常友好
* 不同于客户端渲染JAMStackSEO会非常友好
* 不同于传统纯静态网站,内容可以方便地动态更新
## 为什么选择 Gatsby
## 为什么选择Gatsby
作为一个网站生成器 Site GeneratorGastby 的入门门槛其实是较高的,相对于 Hexo、Hugo 那种简简单单配置下就是一个站点Gatsby 的难度要更高,因为其灵活度更大,所有的配置、页面都是 Javascript 来配置的,当然你也可以使用 Typescript。其基于 React生态丰富且灵活度高天生`GarphQL`是选择它的主要原因。
作为一个网站生成器Site GeneratorGastby的入门门槛其实是较高的相对于Hexo、Hugo那种简简单单配置下就是一个站点Gatsby的难度要更高因为其灵活度更大所有的配置、页面都是Javascript来配置的当然你也可以使用Typescript。其基于React生态丰富且灵活度高天生`GarphQL`是选择它的主要原因。
@@ -46,22 +46,22 @@ JAMStack 是一种新颖的网站架构,与传统的服务端渲染和近些
流程:
1. 我在其他地方看到不错的文章,将其收藏到 Pocket
2. 定时任务,从`Pocket API`获取文章数据,交给 Gatsby 生成站点
3. 自动部署,将生成的静态文件部署到 CDN
4. [reading.colinx.one](https://reading.colinx.one)站点主页就会出现我收藏的文章啦
1. 我在其他地方看到不错的文章将其收藏到Pocket
2. 定时任务,从`Pocket API`获取文章数据交给Gatsby生成站点
3. 自动部署将生成的静态文件部署到CDN
4. [reading.colinx.one](reading.colinx.one)站点主页就会出现我收藏的文章啦
这其中Gastby 充当的是**Site Generator**的角色,而数据来源为我的`Pocket API`,也就是我把 Pocket 作为**Headless CMS**来管理我的数据,可以方便地进行更新和管理。
这其中Gastby充当的是**Site Generator**的角色,而数据来源为我的`Pocket API`也就是我把Pocket作为**Headless CMS**来管理我的数据,可以方便地进行更新和管理。
## 总结
项目已经开源,地址在[https://github.com/Colin-XKL/Colinx-Reading.git](https://github.com/Colin-XKL/Colinx-Reading)。你也可以去申请自己的 Pocket API 然后部署你自己的站点。
项目已经开源地址在https://github.com/Colin-XKL/Colinx-Reading.git。你也可以去申请自己的Pocket API然后部署你自己的站点。
初始尝试 JAMStack感觉对于博客、文档这类的站点会非常友好国外比较火的像 Shopify 这种的无头电商也不错,国内的碍于国情应该不大可能了。
初始尝试JAMStack感觉对于博客、文档这类的站点会非常友好国外比较火的像Shopify这种的无头电商也不错国内的碍于国情应该不大可能了。

View File

@@ -4,7 +4,7 @@ date: 2020-12-18
lastmod: 2020-12-19
description: Mac 平台配置C/Python/Java学习环境
categories:
- 技术
- 教程
- 指南
tags:
- C
@@ -18,7 +18,7 @@ tags:
<!-- # Mac平台配置C/Python/Java学习环境 -->
# Mac平台配置C/Python/Java学习环境
> 本系列教程旨在为刚入门的编程语言学习者做好指南工作,开始编码,本应很简单
>
@@ -28,143 +28,143 @@ tags:
## 配置 C 语言环境
## 配置C语言环境
下面以 clang+VSCode+CodeRunner 为例,搭建一个简单的 C 语言学习环境。
下面以clang+VSCode+CodeRunner为例搭建一个简单的C语言学习环境。
### 检查编译器支持
C 语言的编译需要编译器,一般可以选择 gcc 或是 clang。Mac 系统默认安装了 clang 同时兼容了 gcc 的指令。在终端中进行查看:
C语言的编译需要编译器一般可以选择gcc或是clang。Mac系统默认安装了clang同时兼容了gcc的指令。在终端中进行查看
![screenshot](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015258.png)
![screenshot](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015258.png)
输入`gcc -v`指令测试 gcc 命令是否可用并查看其版本,由上图输出可以看到,该命令可用,版本信息显示的则是 clang 的信息。一般来说,刚学习 C 语言无需关注两者的异同。
输入`gcc -v`指令测试gcc命令是否可用并查看其版本由上图输出可以看到该命令可用版本信息显示的则是clang的信息。一般来说刚学习C语言无需关注两者的异同。
### 配置 VSCode
### 配置VSCode
<span id="vscode">VSCode</span>是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
前往[VSCode 官网](https://code.visualstudio.com/)下载 Mac 版 VScode。并按照安装程序的指引进行安装。
前往[VSCode官网](https://code.visualstudio.com/)下载Mac 版VScode。并按照安装程序的指引进行安装。
如果下载速度太慢,可以参考[这篇文章](https://zhuanlan.zhihu.com/p/112215618)。
![截屏 2020-12-18 22.20.00](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015416.png)
![截屏2020-12-18 22.20.00](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015416.png)
安装完毕后,打开会看到如下图所示的界面。默认界面为英文,下面对其进行汉化并安装一些必要的插件。
![截屏 2020-12-18 22.21.59](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015546.png)
![截屏2020-12-18 22.21.59](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015546.png)
单击方形图标,打开扩展面板。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015621.png" alt="image-20201218223234296" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015621.png" alt="image-20201218223234296" style="zoom:50%;" />
搜索`chinese`安装汉化插件。
![image-20201218222747511](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015622.png)
![image-20201218222747511](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015622.png)
搜索`code runner`安装 Code Runner 插件。并按指示重启应用Reload 字样)
搜索`code runner`安装Code Runner插件。并按指示重启应用Reload字样
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015620.png" alt="image-20201218222511011" style="zoom:50%;" />(截图中因为本地已安装故只显示了 Uninstall 卸载按钮。未安装的情况下会显示 Install 按钮可点击安装)
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015620.png" alt="image-20201218222511011" style="zoom:50%;" />截图中因为本地已安装故只显示了Uninstall卸载按钮。未安装的情况下会显示Install按钮可点击安装
其他插件可根据需要安装。此处推荐安装 C/C++插件以实现 C 代码的高亮和补全等功能。
其他插件可根据需要安装。此处推荐安装C/C++插件以实现C代码的高亮和补全等功能。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015624.png" alt="image-20201218223432859" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015624.png" alt="image-20201218223432859" style="zoom:50%;" />
重启后进入应用,界面自动切换到中文。再点击扩展图标,展开扩展列表,在已安装扩展中找到**Code Runner**,点击齿轮图标展开菜单,点击进入扩展设置。<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015627.png" alt="image-20201218224215676" style="zoom:50%;" />
重启后进入应用,界面自动切换到中文。再点击扩展图标,展开扩展列表,在已安装扩展中找到**Code Runner**,点击齿轮图标展开菜单,点击进入扩展设置。<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015627.png" alt="image-20201218224215676" style="zoom:50%;" />
在输入栏中,在当前选项卡为**用户**的情况下,输入`run`并按回车进行搜索。修改`Run in Terminal``Save File Before Run`的设置项。<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015626.png" alt="image-20201218224059150" style="zoom:50%;" />
在输入栏中,在当前选项卡为**用户**的情况下,输入`run`并按回车进行搜索。修改`Run in Terminal``Save File Before Run`的设置项。<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015626.png" alt="image-20201218224059150" style="zoom:50%;" />
完成了上述的设置,我们就可以来编写 C 语言的程序了。
完成了上述的设置,我们就可以来编写C语言的程序了。
### HelloC
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.c`
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
键入代码。
![image-20201218224343393](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015628.png)
![image-20201218224343393](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015628.png)
点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
点击右上角的三角形按钮即可自动编译运行你的C语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
![image-20201219021624927](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219021631.png)
![image-20201219021624927](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219021631.png)
### 完成✅
现在,开始你的 C 语言学习之旅吧!
现在,开始你的C语言学习之旅吧!
## 配置 Python 语言学习环境
## 配置Python语言学习环境
### 检查 Python 环境
### 检查Python环境
Mac 系统会自带有 Python 环境。在终端中输入 python 并回车。
Mac系统会自带有Python环境。在终端中输入python并回车。
![截屏 2020-12-18 22.54.54](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015630.png)
![截屏2020-12-18 22.54.54](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015630.png)
可以看到系统已经安装有 Python但是显示版本为 2.7。现在的主流版本是 Python3Python2Python3 的语法并不兼容。
可以看到系统已经安装有Python但是显示版本为2.7。现在的主流版本是Python3Python2Python3的语法并不兼容。
`>>>`后面键入`exit()`退出 python2 的交互程序。再次在终端输入`python3`
`>>>`后面键入`exit()`退出python2的交互程序。再次在终端输入`python3`
![image-20201218231954777](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015634.png)
![image-20201218231954777](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015634.png)
此时显示的版本为 3.8.6。
此时显示的版本为3.8.6。
### Hello, Python!
在交互式命令行界面,我们可以直接输入 python 语句并执行。
在交互式命令行界面我们可以直接输入python语句并执行。
![截屏 2020-12-18 23.00.54](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219021016.png)
![截屏2020-12-18 23.00.54](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219021016.png)
一句一句地输入代码再执行显然太低效了。我们需要一个趁手的代码编辑器。
下面以 VSCode 为例。
下面以VSCode为例。
**VSCode 的下载和基本配置**请参考上文 C 语言环境配置中 VSCode 的配置环节。
**VSCode的下载和基本配置**请参考上文C语言环境配置中VSCode的配置环节。
完成基本的设置后,来安装 Python 的专属插件,以实现 Python 代码的高亮、补全等功能。
完成基本的设置后来安装Python的专属插件以实现Python代码的高亮、补全等功能。
![image-20201218230442930](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015633.png)
![image-20201218230442930](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015633.png)
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.py`
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
键入代码。
![截屏 2020-12-18 22.58.44](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015631.png)
![截屏2020-12-18 22.58.44](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015631.png)
点击右上角的三角形按钮开始运行我们编写的代码
![截屏 2020-12-18 23.00.54](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015632.png)
![截屏2020-12-18 23.00.54](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015632.png)
@@ -172,76 +172,76 @@ Mac 系统会自带有 Python 环境。在终端中输入 python 并回车。
### 完成✅
现在,开始你的 Python 语言学习之旅吧!
现在开始你的Python语言学习之旅吧
## 配置 Java 语言学习环境
## 配置Java 语言学习环境
### 安装 JDK
### 安装JDK
Mac OS 并没有内置 Java 语言的支持,需要我们另外安装。
Mac OS并没有内置Java语言的支持需要我们另外安装。
直接在终端输入`java`,系统会提示 Java 未安装并跳转到 Oracle 官方的下载页面。在官网下载会强制要求你注册并登陆 Oracle 账户,网站连接缓慢且步骤繁琐。此处我们到清华大学的 TUNA 开源软件镜像站下载相关软件。
直接在终端输入`java`系统会提示Java未安装并跳转到Oracle官方的下载页面。在官网下载会强制要求你注册并登陆Oracle账户网站连接缓慢且步骤繁琐。此处我们到清华大学的TUNA开源软件镜像站下载相关软件。
首先到 TUNA 开源软件镜像站,来到[AdoptOpenJDK 的下载页面](https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/)。在列表中找到你需要的版本,点击进入后依次选择处理器架构和平台。
首先到TUNA开源软件镜像站来到[AdoptOpenJDK的下载页面](https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/)。在列表中找到你需要的版本,点击进入后依次选择处理器架构和平台。
此处以 Java 11 为例,其 Mac OS 下安装程序的下载地址为[https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg](https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg)。需要其他版本的也可以自行选择。
此处以Java 11 为例其Mac OS 下安装程序的下载地址为[https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg](https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg)。需要其他版本的也可以自行选择。
> 自行选择时请注意:
>
> * jre 只是 java 运行环境,并不包括对 java 代码的编译功能。下载时请认准**jdk**
> * jre只是java运行环境并不包括对java代码的编译功能。下载时请认准**jdk**
>
> * 选择处理器架构时,传统 Intel 内核 Mac 请选择**x86**,对于 M1 内核的 Mac截止本文写作暂无相关支持请关注后续更新。
> * 最内层下载资源的列表中jdk 的资源文件名会有`hotspot`和 `openj9`两种字样。Java 入门请选择`hotspot`,文件后缀名请选择`.pkg`
> * 选择处理器架构时传统Intel内核Mac请选择**x86**对于M1内核的Mac截止本文写作暂无相关支持请关注后续更新。
> * 最内层下载资源的列表中jdk的资源文件名会有`hotspot`和 `openj9`两种字样。Java入门请选择`hotspot`,文件后缀名请选择`.pkg`
下载完成后点击打开,出现如下的安装界面。根据指引完成安装。
![image-20201218232011039](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015635.png)
![image-20201218232011039](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015635.png)
安装完成后,在终端中输入`java -version`并回车确认。看到如下输出说明已经正确安装且 Java 的版本为`11.0.9.1` Java 11.
安装完成后,在终端中输入`java -version`并回车确认。看到如下输出说明已经正确安装且Java的版本为`11.0.9.1`即Java 11.
![image-20201218235233365](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015640.png)
![image-20201218235233365](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015640.png)
下面来为 Java 的学习配置一个趁手的代码编辑器,以 VSCode 为例。
下面来为Java的学习配置一个趁手的代码编辑器以VSCode为例。
### 为 Java 语言学习配置 VSCode
### 为Java语言学习配置VSCode
**VSCode 的下载和基本配置**请参考上文 C 语言环境配置中 VSCode 的配置环节。
**VSCode的下载和基本配置**请参考上文C语言环境配置中VSCode的配置环节。
完成基本的设置后,来安装 Java 的专属插件,以实现 Java 代码的高亮、补全等功能。
完成基本的设置后来安装Java的专属插件以实现Java代码的高亮、补全等功能。
在左侧扩展面板的搜索栏中搜索`java`,选择`Language Support for Java`并安装。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015641.png" alt="image-20201218235514041" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015641.png" alt="image-20201218235514041" style="zoom:50%;" />
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.java`
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
键入代码。
![image-20201218235213233](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015639.png)
![image-20201218235213233](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015639.png)
可以看到,在窗口下方的终端面板中,已经成功出现了**Hello, Java!**字样,代码运行成功。
![截屏 2020-12-19 00.05.33](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015637.png)
![截屏2020-12-19 00.05.33](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015637.png)
### 完成✅
至此Mac 平台下的 Java 语言学习环境配置完毕,开始你的 Java 学习之旅吧!
至此Mac平台下的Java语言学习环境配置完毕开始你的Java学习之旅吧
@@ -249,11 +249,11 @@ Mac OS 并没有内置 Java 语言的支持,需要我们另外安装。
## 常见问题
### 1. Java 扩展安装弹出提示 JDK 版本过低
### 1. Java扩展安装弹出提示JDK版本过低
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015638.png" alt="image-20201218234917588" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015638.png" alt="image-20201218234917588" style="zoom:50%;" />
这是因为插件内置的一些功能需要 Java 来运行,而这些功能又依赖于一些较新的特性,这些特性最早出现在 Java 11 中。为了更好地学习和使用 Java这里推荐安装 Java 11 或 Java 12。网站教程或学校授课常常以 Java 8 为例但对于初学者来说几者无太大区别Java 8 的代码都可以被很好地支持。
这是因为插件内置的一些功能需要Java来运行而这些功能又依赖于一些较新的特性这些特性最早出现在Java 11中。为了更好地学习和使用Java这里推荐安装Java 11 或Java 12。网站教程或学校授课常常以Java 8为例但对于初学者来说几者无太大区别Java 8的代码都可以被很好地支持。

View File

@@ -1,15 +1,15 @@
---
title: Minecraft 上云笔记 - MC 服务器快速搭建&MOD 推荐&性能优化
title: Minecraft上云笔记 - MC服务器快速搭建&MOD推荐&性能优化
date: 2021-02-07
lastmod: 2021-02-07
description: Minecraft 上云笔记 - MC 服务器快速搭建&MOD 推荐&性能优化。MC 快速上云,学生机轻松带动,三五好友,畅快联机
description: Minecraft上云笔记 - MC服务器快速搭建&MOD推荐&性能优化。MC快速上云学生机轻松带动三五好友畅快联机
categories:
- 技术
- 教程
- 指南
tags:
- Java
- MC
- MC 服务器
- MC服务器
- Minecraft
- 我的世界
- 游戏
@@ -19,36 +19,36 @@ tags:
---
<!-- # Minecraft 上云笔记 - MC 服务器快速搭建&MOD 推荐&性能优化 -->
# Minecraft上云笔记 - MC服务器快速搭建&MOD推荐&性能优化
> MC 快速上云,学生机轻松带动,三五好友,畅快联机
> MC快速上云学生机轻松带动三五好友畅快联机
## 前言&踩坑
距离上一次玩 MC 已有四年之久上次玩的时候还用的是家里的老爷机连独显都没有玩个整合包都费劲。如今设备早已更新换代B 站不少做 MCUP 主的内容挺有趣,于是尝试重新拾起 MC。
距离上一次玩MC已有四年之久上次玩的时候还用的是家里的老爷机连独显都没有玩个整合包都费劲。如今设备早已更新换代B站不少做MCUP主的内容挺有趣于是尝试重新拾起MC。
手机端国内只有网易代理APP 卡顿严重,生态封闭,体验奇差。安卓下载的国际服倒是还不错,不过身为基岩版,与 Java 版的生态并不相通。Github 上找到了可以让基岩版进 Java 版服务器的轮子,不过手机端连接服务器又是一个麻烦事。连接远程服务器又需要登录 Xbox但是登上了连接的时候又出现奇怪的问题。
手机端国内只有网易代理APP卡顿严重生态封闭体验奇差。安卓下载的国际服倒是还不错不过身为基岩版与Java版的生态并不相通。Github上找到了可以让基岩版进Java版服务器的轮子不过手机端连接服务器又是一个麻烦事。连接远程服务器又需要登录Xbox但是登上了连接的时候又出现奇怪的问题。
贴吧有人给出解决方案,搭建 VPN形成局域网那样服务器会被视为局域网内开放的 MC 服务端。但天朝政策收紧,搭建 PPTP、L2TP 等隧道均未果,严重怀疑云服务商干扰了对应服务的端口。几番权衡决定投归 PC 端的 Java 版,生态丰富而且可以充分利用好硬件性能。
贴吧有人给出解决方案搭建VPN形成局域网那样服务器会被视为局域网内开放的MC服务端。但天朝政策收紧搭建PPTP、L2TP等隧道均未果严重怀疑云服务商干扰了对应服务的端口。几番权衡决定投归PC端的Java版生态丰富而且可以充分利用好硬件性能。
## MC 服务器快速搭建
## MC服务器快速搭建
### MC 服务端选择
### MC服务端选择
物色了很多 MC 服务端,但看了下主要可用且被应用广泛的就两类,
物色了很多MC服务端但看了下主要可用且被应用广泛的就两类
1. Spigot、PaperSpigot 这类加装插件的
2. SpongeForge 这类可以加装 Mod
1. Spigot、PaperSpigot这类加装插件的
2. SpongeForge这类可以加装Mod的
前者生态目测更丰富些MCBBS 上的开服板块大部分都是 PaperSpigot 搭建的。但是好像都是那种几十上百人的公用服务器,什么权限控制、小游戏、防作弊的插件居多,而我只是想要一个能够装 Mod 的可以供三五好友方便联机的服务器。我的选择是后者
前者生态目测更丰富些MCBBS上的开服板块大部分都是PaperSpigot搭建的。但是好像都是那种几十上百人的公用服务器什么权限控制、小游戏、防作弊的插件居多而我只是想要一个能够装Mod的可以供三五好友方便联机的服务器。我的选择是后者
### MC 服务器快速搭建
### MC服务器快速搭建
搭建方案千千万,不过 Docker 来的最实在。Github 找到一个非常方便的镜像,[itzg/minecraft-server](https://github.com/itzg/docker-minecraft-server)。这个镜像是运行时构建的,会根据指定的环境变量下载和安装对应的 MC 服务端程序。支持的服务端有 Bukkit、Spigot、PaperSpigot、SpongeForge 等等MC 的版本和各项参数均支持通过环境变量自定义,非常方便。而且可以通过更换不同的 Tag 来使用不同的 JDK 版本,从 8 到 15HotspotOpenJ9 都有,可以按需选用。有 arm 版本,树莓派也可食用。
搭建方案千千万不过Docker来的最实在。Github找到一个非常方便的镜像[itzg/minecraft-server](https://github.com/itzg/docker-minecraft-server)。这个镜像是运行时构建的会根据指定的环境变量下载和安装对应的MC服务端程序。支持的服务端有Bukkit、Spigot、PaperSpigot、SpongeForge等等MC的版本和各项参数均支持通过环境变量自定义非常方便。而且可以通过更换不同的Tag来使用不同的JDK版本8到15HotspotOpenJ9都有可以按需选用。有arm版本树莓派也可食用。
安装 Dockerdocker-compose 后,可以方便地编写脚本来快速启动一个 MC 服务器。这里放上我的`docker-compose.yml`文件
安装Dockerdocker-compose后可以方便地编写脚本来快速启动一个MC服务器。这里放上我的`docker-compose.yml`文件
```yaml
version: "3"
@@ -64,15 +64,15 @@ services:
- "25565:25565"
volumes:
- "mc:/data" # 主要数据,包括存档数据等
- "~/.minecraft/forgemods/:/data/mods/" #Forge Mod 位置
- "~/.minecraft/forgemods/:/data/mods/" #Forge Mod位置
# - "~/.minecraft/sponegemods/:/data/mods/plugins"
- "~/.minecraft/tmp/:/tmp" # Forge 下载失败可以自己放进去
- "~/.minecraft/tmp/:/tmp" # Forge下载失败可以自己放进去
- /etc/timezone:/etc/timezone:ro #绑定本机的时区,方便看日志
environment:
SERVER_NAME: "MCServer"
EULA: "TRUE"
VERSION: "1.12.2" #(Ensure this is compatbile with the version of SpongeForge you are using!)
TYPE: "FORGE" # 这里以 SpongeForge 的服务端为例,其他服务端也支持
TYPE: "FORGE" # 这里以SpongeForge的服务端为例其他服务端也支持
FORGEVERSION: "RECOMMENDED"
# FORGEVERSION: "14.23.5.2854"
CONSOLE: "false"
@@ -83,13 +83,13 @@ services:
MAX_MEMORY: 1536M # 内存根据实际需要修改
OVERRIDE_SERVER_PROPERTIES: "true"
SNOOPER_ENABLED: "false" # 统计数据
VIEW_DISTANCE: 8 #加载区块范围,默认 10建议 4~8
VIEW_DISTANCE: 8 #加载区块范围默认10建议4~8
SEED: "-505794890" # 初始生成世界的种子
PVP: "true"
ONLINE_MODE: "FALSE" #正版校验开关
ALLOW_FLIGHT: "FALSE"
USE_AIKAR_FLAGS: "false" # 一些优化
RESOURCE_PACK: "https://blog-1301127393.file.myqcloud.com/MC/Distribution/VNR-1.0.1.zip" # 我自己会用的资源包,这里填 url
RESOURCE_PACK: "https://blog-1301127393.cos.ap-shanghai.myqcloud.com/MC/Distribution/VNR-1.0.1.zip" # 我自己会用的资源包这里填url
NETWORK_COMPRESSION_THRESHOLD: 512 # 网络优化
restart: unless-stopped
rcon:
@@ -120,131 +120,131 @@ volumes:
环境变量可以设置的地方非常多,可以到项目主页的 README 查看。https://github.com/itzg/docker-minecraft-server
环境变量可以设置的地方非常多可以到项目主页的README查看。https://github.com/itzg/docker-minecraft-server
`docker-compose up -d` 启动,第一次启动他会下载 MC、下载 MC 服务端、初始化世界。之后就可以在 MC 客户端连接了。(启动完毕就测试一下,测试没问题再进行后面安装 mod、服务器调优按需的步骤
`docker-compose up -d` 启动第一次启动他会下载MC、下载MC服务端、初始化世界。之后就可以在MC客户端连接了。启动完毕就测试一下测试没问题再进行后面安装mod、服务器调优按需的步骤
## MC 客户端安装
## MC客户端安装
### MC 启动器选择
### MC启动器选择
(正版玩家略过,现在貌似正版购买的只支持官方启动器)
对于服务器选择MCBBS 有一篇讲的挺详细,可以到这里挑选:
对于服务器选择MCBBS有一篇讲的挺详细可以到这里挑选
> 我的世界 Minecraft Java 版 下载指南 | 文件结构说明 | 推荐启动器 - 软件资源 - Minecraft(我的世界) 中文论坛 -
> 我的世界Minecraft Java版 下载指南|文件结构说明|推荐启动器 - 软件资源 - Minecraft(我的世界)中文论坛 -
> https://www.mcbbs.net/forum.php?mod=viewthread&tid=38297&page=1#pid547821
我推荐的启动器:
* **HMCL**(力荐!跨平台、颜值高、功能完备,不过需要先装 Java)
* **HMCL**力荐跨平台、颜值高、功能完备不过需要先装Java)
* **BMCL**(次推荐,颜值略低,基于.Net功能完备
我不推荐的启动器:
* **Nsiso** (页面倒是做的漂亮,但是我装完 mod 启动竟然启动不了,兼容性或者说功能完备性欠缺,不知道后续版本如何。当时出问题之后我换 HMCL 就可以完美启动)
* **Nsiso** 页面倒是做的漂亮但是我装完mod启动竟然启动不了兼容性或者说功能完备性欠缺不知道后续版本如何。当时出问题之后我换HMCL就可以完美启动
上一张 HMCL 的主页的图:
上一张HMCL的主页的图
![image-20210129172401421](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205913.png)
![image-20210129172401421](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205913.png)
其他没有使用过的启动器暂时不予评价。
### MC 本体安装
### MC本体安装
(正版玩家略过、整合包玩家略过)
推荐方式为启动器内安装,还可以顺带把 ForgeOptiFine 也安装了。
推荐方式为启动器内安装还可以顺带把ForgeOptiFine也安装了。
* Forge安装第三方 Mod 需要
* Forge安装第三方Mod需要
* OptiFine游戏显示调优有些光影会需要。
版本选择的话,我的选择是 1.12.2。目前 Mod 支持比较完备,生态也很丰富。很多 Mod 最高只支持 1.12.2,目测是后面官方更新了 API 啥的。当然倾向于原版的同学可以选择更新的 1.16,后面的版本有很多有意思的更新。
版本选择的话我的选择是1.12.2。目前Mod支持比较完备生态也很丰富。很多Mod最高只支持1.12.2目测是后面官方更新了API啥的。当然倾向于原版的同学可以选择更新的1.16,后面的版本有很多有意思的更新。
> **踩坑笔记**
>
> 1. 这些启动器大多带有三个下载源官方服务器、MCBBS 镜像和 BMCL 镜像。不过我当时安装的时候 BMCL 的镜像抽风了,下载一直没进度。建议选择 MCBBS 的源(虽然可能部分内容更新没有很勤)
> 2. 通过启动器自动安装 OptiFine 的时候一直报错,换版本也是一样。后来的解决方案是选择窗口上方的【从本地文件安装/升级】
> 1. 这些启动器大多带有三个下载源官方服务器、MCBBS镜像和BMCL镜像。不过我当时安装的时候BMCL的镜像抽风了下载一直没进度。建议选择MCBBS的源虽然可能部分内容更新没有很勤
> 2. 通过启动器自动安装OptiFine的时候一直报错换版本也是一样。后来的解决方案是选择窗口上方的【从本地文件安装/升级】
>
>
## Mod 推荐
## Mod推荐
针对我实际使用和测试的情况做一些推荐。下文所有 Mod 均在 1.12.2 下测试并实际使用过,兼容性良好。
针对我实际使用和测试的情况做一些推荐。下文所有Mod均在1.12.2下测试并实际使用过,兼容性良好。
### 功能增强型 Mod客户端必装
### 功能增强型Mod客户端必装
这部分 Mod 主要是部分音效和部分不涉及多人游戏的功能的增强,可以随意安装,装不装都不影响好友联机与进服务器。
这部分Mod主要是部分音效和部分不涉及多人游戏的功能的增强可以随意安装装不装都不影响好友联机与进服务器。
| Mod 名称 | 说明 |
| Mod名称 | 说明 |
| -------------------- | ------------------------------------------------------------ |
| DynamicSurroundings | 动态环境音效,比如草地有蟋蟀的声音,夜晚有狼的声音,使游戏很有沉浸感 |
| SoundFilters | 环绕音效,使得 MC 里所有的声音更真实,比如矿洞里的脚步声会有回音,房子里面听外面的声音会更小等等 |
| BetterHUD | 加强版的 HUD 信息显示,比如方位信息、坐标信息、时间信息、人物护甲、健康状态信息等等很多功能,而且可自定义程度也很高。 |
| SoundFilters | 环绕音效使得MC里所有的声音更真实比如矿洞里的脚步声会有回音房子里面听外面的声音会更小等等 |
| BetterHUD | 加强版的HUD信息显示比如方位信息、坐标信息、时间信息、人物护甲、健康状态信息等等很多功能而且可自定义程度也很高。 |
| JEI | 可以方便地查看物品的合成表,一般整合包必备的插件 |
| JustEnoughCharacters | JEI 的扩展,支持按拼音、简拼搜索物品 |
| JustEnoughCharacters | JEI的扩展支持按拼音、简拼搜索物品 |
| Journeymap | 旅行地图,貌似已经停更,但是功能上没有什么欠缺。支持小地图显示、快速传送等。也是一般整合包必备的插件 |
| InventoryTweaks | 按 R 键整理背包 |
| InventoryTweaks | 按R键整理背包 |
### 功能增强型 Mod服务端&客户端都必装)
### 功能增强型Mod服务端&客户端都必装)
| Mod 名称 | 说明 |
| Mod名称 | 说明 |
| ---------------- | ------------------------------------------------------------ |
| FTB-Ultimine | 超级挖掘,挖矿、清理场地好帮手 |
| Doubledoors | 双开门可以一键开关,不用挨个点击开关啦 |
| OpenGlider | 滑翔翼,经济实用的交通工具 |
| Quark | 对原版 MC 的很多地方进行了一些加强,我最喜欢的是他增加了纸墙和纸灯笼这类物品,可以建造一些日系的建筑(文末有图) |
| Quark | 对原版MC的很多地方进行了一些加强我最喜欢的是他增加了纸墙和纸灯笼这类物品可以建造一些日系的建筑文末有图 |
| KeepingInventory | 死亡不掉落,不解释,小白福音 |
### 内容增强型 Mod服务端&客户端都必装)
### 内容增强型Mod服务端&客户端都必装)
| Mod 名称 | 说明 |
| Mod名称 | 说明 |
| ------------------------ | ------------------------------------------------------------ |
| Natura | 添加了很多有意思的植物,整个世界变得生机勃勃,可以种樱花树,初期没食物还可以野外采蓝莓吃 |
| MrCrayfish`s Vehicle Mod | 载具 Mod可以在 MC 开车哦 |
| MrCrayfish`s Vehicle Mod | 载具Mod可以在MC开车哦 |
| Animania | 动物谷,更多的小动物、更加真实的动物喂养与繁殖 |
| Twilightforest | 鼎鼎有名的暮色森林,不解释 |
### 谨慎选用的 Mod
### 谨慎选用的Mod
| Mod 名称 | 说明 |
| Mod名称 | 说明 |
| -------- | ------------------------------------------------------------ |
| LootBags | 击杀怪物得到战利品带,随机开出各种物品。不过你的箱子很快就会被一堆奇奇怪怪的东西堆满(比如我有一大箱无用的钻石马铠) |
| Cuisine | 中文名烹饪工艺,默认开发的 Mod挺有趣很好地还原了做菜的过程做完之后的菜会获得药水一样的效果。不过目测已经停更而且没有很好的教程 |
| Cuisine | 中文名烹饪工艺默认开发的Mod挺有趣很好地还原了做菜的过程做完之后的菜会获得药水一样的效果。不过目测已经停更而且没有很好的教程 |
**注意**:上面列举的所有 Mod 都是 Mod 本体,有些 Mod 的功能还依赖于其他 Mod在安装时必须同时安装 Mod 本体和他依赖的 Mod。具体的依赖关系可以参考 mcmod.cn 上对 Mod 介绍页的 Mod 关系选项卡CurseForgeMod 介绍页的 Relation 选项卡。
**注意**上面列举的所有Mod都是Mod本体有些Mod的功能还依赖于其他Mod在安装时必须同时安装Mod本体和他依赖的Mod。具体的依赖关系可以参考mcmod.cn上对Mod介绍页的Mod关系选项卡CurseForgeMod介绍页的Relation选项卡。
> **踩坑笔记**
>
> 1. R 键整理的快捷键与 JEI 的部分功能冲突,可自行修改快捷键
> 2. R 键整理对烹饪工艺中生产出来的菜品没辙
> 3. 推荐仅将 FTB-Ultimine 用于挖泥巴和挖沙,实际使用时可能会出现挖了矿不掉东西的情况┭┮﹏┭┮
> 4. 不要用铁镐、钻石镐开 FTB-Ultimine 挖东西!耐久掉的飞快
> 5. DynamicSurroundings 可以在设置里按需屏蔽特定的声音,比如装上后发现我家所在的地形会有乌鸦叫,就很烦。屏蔽之后整个世界都好起来了
> 6. DynamicSurroundingsAnimaniabug Animania 的某些特有生物进行交互时会触发找不到特定媒体资源的 bug导致游戏崩溃重新进入又会触发这个 bug只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环血泪的教训最新版本已修复
> 7. Animania 会对每个维度的世界进行注入,比较耗费资源。在同时安装虚无世界 AoA 的情况下,每次服务器启动 Animania 需要对其包含的二十多的世界维度进行注入,严重拖慢启动速度
> 8. Quark 模组对 1.12MC 只有 1.6 版本而没有后续版本的内容更新和 bug 修复。实际使用中有点吃性能
> 1. R键整理的快捷键与JEI的部分功能冲突可自行修改快捷键
> 2. R键整理对烹饪工艺中生产出来的菜品没辙
> 3. 推荐仅将FTB-Ultimine用于挖泥巴和挖沙实际使用时可能会出现挖了矿不掉东西的情况┭┮┭┮
> 4. 不要用铁镐、钻石镐开FTB-Ultimine挖东西耐久掉的飞快
> 5. DynamicSurroundings可以在设置里按需屏蔽特定的声音比如装上后发现我家所在的地形会有乌鸦叫就很烦。屏蔽之后整个世界都好起来了
> 6. DynamicSurroundingsAnimaniabug对Animania的某些特有生物进行交互时会触发找不到特定媒体资源的bug导致游戏崩溃重新进入又会触发这个bug只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环血泪的教训最新版本已修复
> 7. Animania会对每个维度的世界进行注入比较耗费资源。在同时安装虚无世界AoA的情况下每次服务器启动Animania需要对其包含的二十多的世界维度进行注入严重拖慢启动速度
> 8. Quark模组对1.12MC只有1.6版本而没有后续版本的内容更新和bug修复。实际使用中有点吃性能
## MC 服务器优化
## MC服务器优化
> 我使用的是 SpongeForge因此只对一些通用的优化手段和原版服务器的一些参数做介绍。使用 Spigot 等的可以参考 MCBBS 的帖子进行更加深入的调优:
> 我使用的是SpongeForge因此只对一些通用的优化手段和原版服务器的一些参数做介绍。使用Spigot等的可以参考MCBBS的帖子进行更加深入的调优
>
> Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
> Minecraft服务器优化教程 —— 让多带50%的玩家不再是梦 - 联机教程 - Minecraft(我的世界)中文论坛
> https://www.mcbbs.net/forum.php?mod=viewthread&tid=478126
对于一台长期运行的 MC 服务器,我们需要关注的主要是下面几点
对于一台长期运行的MC服务器我们需要关注的主要是下面几点
### 1. 稳定性
@@ -252,13 +252,13 @@ volumes:
**防止服务端程序自己崩溃**的方法有:
* 尽量使用稳定版的 MC 和稳定版的 Forge
* 避免使用评分较低的 Mod
* 加载大量 Mod 前先在本地做好测试,避免冲突,同时保障所有依赖项已安装好
* 尽量使用稳定版的MC和稳定版的Forge
* 避免使用评分较低的Mod
* 加载大量Mod前先在本地做好测试避免冲突同时保障所有依赖项已安装好
**避免外在影响致 MC 服务器崩溃**的方法有:
**避免外在影响致MC服务器崩溃**的方法有:
* 为 JVM 设置合适的内存限制,避免因`OutOfMemory`导致 MC 服务端进程被系统杀掉
* 为JVM设置合适的内存限制避免因`OutOfMemory`导致MC服务端进程被系统杀掉
* 开放的服务器最好限制下权限并封堵一些游戏内的漏洞,避免熊孩子炸服
### 2. 可维护性
@@ -267,62 +267,62 @@ volumes:
我的建议有以下几点:
* **使用 Docker**。这样可以方便地进行服务的停启与迁移、升级。
* **使用 Docker-Compose**并保存`docker-coompose.yml`文件,这样你可以方便地更改一些参数而不用每次都输入一串长长的`docker run`指令。
* **使用Docker**。这样可以方便地进行服务的停启与迁移、升级。
* **使用Docker-Compose**并保存`docker-coompose.yml`文件,这样你可以方便地更改一些参数而不用每次都输入一串长长的`docker run`指令。
* **经常备份**。数据无价。
* **尽量避免使用已经停止维护的 Mod**。到时候要是出了奇怪的 Bug你就只能含泪把这个 Mod 所有相关的内容从你的世界剥离。
* **尽量避免使用已经停止维护的Mod**。到时候要是出了奇怪的Bug你就只能含泪把这个Mod所有相关的内容从你的世界剥离。
### 3. 响应及时性
响应及时性也体现在几个方面:
* CPU 运算能力够强,复杂的时间(战斗、爆炸)等能很快地处理过来
* 存储设备 IO 速度快,服务启动、区块加载可以非常迅速
* CPU运算能力够强复杂的时间战斗、爆炸等能很快地处理过来
* 存储设备IO速度快服务启动、区块加载可以非常迅速
* 网络连接稳定、延迟低,波动小
上面三点可以通过堆硬件来实现。不过有没有不辛苦钱包又能提高游戏体验的方法呢?
自然是有的。我们可以通过修改服务端程序的部分配置来实现。不过本质上是牺牲一小部分游戏体验换取一大部分游戏体验,就看你能忍受的牺牲的部分能有多少咯。
MC 服务器的优化主要聚焦在两个地方
MC服务器的优化主要聚焦在两个地方
1. MC 服务端程序的参数优化
2. JVM 参数调优
1. MC服务端程序的参数优化
2. JVM参数调优
#### MC 服务端优化
#### MC服务端优化
**VIEW_DISTANCE: 8**
这一项可以更改加载的**区块**的数量。这个数值越大,就会加载更多的区块,占用的内存和 CPU 就会更多。这个数值过小可能会导致你家的作物不长以及怪物刷不出来,会显著影响游戏体验。减小这一项的数值可以显著减少内存和 CPU 占用。
这一项可以更改加载的**区块**的数量。这个数值越大就会加载更多的区块占用的内存和CPU就会更多。这个数值过小可能会导致你家的作物不长以及怪物刷不出来会显著影响游戏体验。减小这一项的数值可以显著减少内存和CPU占用。
默认值 10建议值 4~8。
默认值10建议值4~8。
> **注意**1 个***区块***并不是指一个方块,而是指一个`16*16`的区域。这个数值对可视区域的影响并不会很大,你可以放心地减小这个数值。这一项的值每减小 1你的服务器每次就可以少计算`16*16*256`个方块
> **注意**1个***区块***并不是指一个方块,而是指一个`16*16`的区域。这个数值对可视区域的影响并不会很大你可以放心地减小这个数值。这一项的值每减小1你的服务器每次就可以少计算`16*16*256`个方块
**NETWORK_COMPRESSION_THRESHOLD: 512**
这一项的含义是对大于特定大小的数据包进行压缩。压缩会消耗一定量的 CPU 资源,不过可以减缓网络的压力。如果你的网络条件较差,可以减小这一项的数值。
这一项的含义是对大于特定大小的数据包进行压缩。压缩会消耗一定量的CPU资源不过可以减缓网络的压力。如果你的网络条件较差可以减小这一项的数值。
默认值256
#### JVM 调优
#### JVM调优
> 首先需要声明的是,我不是 JVM 调参专业户,下文的数据也并不是严格的评测。结论并不严谨,仅仅从一个技术人员的视角出发,结合我实际的使用体验,给出的一些建议,供大家参考。
> 首先需要声明的是我不是JVM调参专业户下文的数据也并不是严格的评测。结论并不严谨仅仅从一个技术人员的视角出发结合我实际的使用体验给出的一些建议供大家参考。
##### 当我们在讨论 JVM 调优时,我们在谈论什么?
##### 当我们在讨论JVM调优时我们在谈论什么
**垃圾回收****G**arbage **C**ollection一直以来都是众多 JVM 调优教程的核心所在。Java 运行于 VM 上,运行过程中不可避免的垃圾回收是最影响应用整体性能的存在。
**垃圾回收****G**arbage **C**ollection一直以来都是众多JVM调优教程的核心所在。Java运行于VM上运行过程中不可避免的垃圾回收是最影响应用整体性能的存在。
这里我们不去纠结那些新生代、老年代的划分、各种比率、各种单元的大小,我们只需要明白几点:
1. 不要觉得你比 JVM 的开发人员牛 X
2. 不要觉得网上各路 JVM 调参大神的方法就适用于你
1. 不要觉得你比JVM的开发人员牛X
2. 不要觉得网上各路JVM调参大神的方法就适用于你
众多顶级公司都在使用 Java其母公司 Oracle 自然会招聘全球最优秀的一批开发人员去开发,所以**JVM 的大部分设置都是开箱即用的,默认最佳的。**在你不了解某一项参数的含义、不知道更改某一项配置的目的时,最好是不要做改动。
众多顶级公司都在使用Java其母公司Oracle自然会招聘全球最优秀的一批开发人员去开发所以**JVM的大部分设置都是开箱即用的默认最佳的。**在你不了解某一项参数的含义、不知道更改某一项配置的目的时,最好是不要做改动。
其次,网络上大部分 JVM 的调优教程都是应对“面试造火箭”的,即便是以实际应用为主的 JVM 优化教程,人家那都是几十核几百 G 内存的机器,一秒钟要承担几百万的访问量,他们做优化的出发点、目标都**不一定适用于你。**
其次网络上大部分JVM的调优教程都是应对“面试造火箭”的即便是以实际应用为主的JVM优化教程人家那都是几十核几百G内存的机器,一秒钟要承担几百万的访问量,他们做优化的出发点、目标都**不一定适用于你。**
@@ -330,76 +330,77 @@ MC 服务器的优化主要聚焦在两个地方
明确了上面两点我们可以开始着手进行优化了。
首先需要明确你开 MC 服务器的机器是什么配置。以我的为例,我使用的是腾讯云的**12G 的云服务器****带宽 2M**,即峰值速度为 256k/s。
首先需要明确你开MC服务器的机器是什么配置。以我的为例我使用的是腾讯云的**12G的云服务器****带宽2M**即峰值速度为256k/s。
其次需要知道你的优化目标。网络上大多数 JVM 的优化教程都是追求更低的响应时间,以便能够承载更多的并发访问。
其次需要知道你的优化目标。网络上大多数JVM的优化教程都是追求更低的响应时间以便能够承载更多的并发访问。
以我的情况为例:我开这个 MC 服务器的目的,只是希望能够与**不超过 5 个好友**联机,玩带一些暮色森林这样的**Mod**的 MC。
以我的情况为例我开这个MC服务器的目的只是希望能够与**不超过5个好友**联机,玩带一些暮色森林这样的**Mod**的MC。
搭建完服务器后,观察了了一段时间后发现,
* 只有在 MC 服务器刚启动的时候 CPU 占用率会达到 100%,空载(没有玩家在线,后台没有高负荷任务)只有 2% 左右,两人联机时 CPU 平均负载在 30% 左右。
* 加装了十几个 Mod 的情况下,空载占用 CPU 资源在 1G 左右,两人联机 1.4G 左右。
* 只有在客户端刚进入的时候会跑满带宽,之后正常游戏时,每台客户端需要占用 10K/s 左右的带宽。
* 只有在MC服务器刚启动的时候CPU占用率会达到100%空载没有玩家在线后台没有高负荷任务只有2%左右两人联机时CPU平均负载在30%左右。
* 加装了十几个Mod的情况下空载占用CPU资源在1G左右两人联机1.4G左右。
* 只有在客户端刚进入的时候会跑满带宽之后正常游戏时每台客户端需要占用10K/s左右的带宽。
* 联机游戏间或卡顿,但很快恢复
* 查看日志发现空载时时竟然仍会`can't keep up`
![服务器在空载](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205922.png)
![服务器在空载](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205922.png)
那么以我的情况来看
* CPU 性能富余
* CPU性能富余
* 内存吃紧
* 带宽够用
那么**我的优化目标**就是:利用好 CPU 资源,尽力减少内存占用,以便为其他程序让路,并且为未来可能要添加的新 Mod 留出空间。
那么**我的优化目标**就是利用好CPU资源尽力减少内存占用以便为其他程序让路并且为未来可能要添加的新Mod留出空间。
##### 优化
JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取之处,一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中,使用 G1GC 是有问题的:
JVM优化的大头是GC。网上吹的漫天飞的G1GC的确有他的可取之处一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中使用G1GC是有问题的
* **G1GC 天生是为了现代互联网应用环境而设计的**,需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器 + 大内存机器上的高负荷运算。而我的服务器是单核,内存也并不富裕。
* **多线程的 GC 模式跑在单核机器上**时出现的问题就是:单核机器无法并行处理多个任务,其本质上只是在多个任务之间快速切换,来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的,**性能损耗积少成多**。
* **G1GC 追求在延迟可控的情况下达到更高的吞吐量**。但他的**代价是[更多的内存占用](https://segmentfault.com/q/1010000021658061)。**小内存机器并不适合使用 G1GC。
* **G1GC天生是为了现代互联网应用环境而设计的**,需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器+大内存机器上的高负荷运算。而我的服务器是单核,内存也并不富裕。
* **多线程的GC模式跑在单核机器上**时出现的问题就是:单核机器无法并行处理多个任务,其本质上只是在多个任务之间快速切换,来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的,**性能损耗积少成多**。
* **G1GC追求在延迟可控的情况下达到更高的吞吐量**。但他的**代价是[更多的内存占用](jvm G1 垃圾收集器有什么缺点? - SegmentFault 思否
https://segmentfault.com/q/1010000021658061)。**小内存机器并不适合使用G1GC。
物色了一番,我最终选择换用 Serial GC 代替原本的 G1GC。
物色了一番我最终选择换用Serial GC代替原本的G1GC。
> **Serial-XX:+UseSerialGC**
>
> 从名字我们可以看出,这是一个串行收集器。
>
> Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVMServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集,而是当 JVM 需要进行垃圾回收的时候,需暂停所有的用户线程,直到回收结束。
> Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVMServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集,而是当 JVM 需要进行垃圾回收的时候,需暂停所有的用户线程,直到回收结束。
>
##### 优化前后对比
1. 优化前 MC 服务器的资源占用情况
1. 优化前MC服务器的资源占用情况
![360 截图 20210129163301881](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205932.jpg)
![360截图20210129163301881](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205932.jpg)
2. SERIAL GC (1 ONLINE)
![image-20210202194034351](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205936.png)
![image-20210202194034351](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205936.png)
3. 进一步对 mod 优化后2 online
3. 进一步对mod优化后2 online
![image-20210202221554906](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205939.png)
![image-20210202221554906](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205939.png)
##### 其他优化方法
更换 GC 只是众多优化方法中的一种,其他的诸如换用 OpenJ9 虚拟机也可以有不错的效果,可惜的是 Forge 对其的支持并不友好,只得作罢。还有启用指针压缩也可以获得不错的性能提升,不过 JDK6_u23 之后 `UseCompressedOops` 就已经被默认启用了,使用新版本 Java 基本不用关注这方面的优化了。
更换GC只是众多优化方法中的一种其他的诸如换用OpenJ9虚拟机也可以有不错的效果可惜的是Forge对其的支持并不友好只得作罢。还有启用指针压缩也可以获得不错的性能提升不过JDK6_u23之后 `UseCompressedOops` 就已经被默认启用了使用新版本Java基本不用关注这方面的优化了。
@@ -411,11 +412,11 @@ JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取
我家:
![屏幕截图 (13)](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205942.png)
![屏幕截图(13)](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205942.png)
![屏幕截图 (16)](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205946.png)
![屏幕截图(16)](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205946.png)
@@ -423,13 +424,13 @@ JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取
我安装的光影 Sildurs Vibrant Shaders v1.281 High 效果图
![屏幕截图 (12)](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205949.png)
![屏幕截图(12)](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205949.png)
Better HUD + 旅行地图效果图
![屏幕截图 (17)](https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205953.png)
![屏幕截图(17)](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210207205953.png)
@@ -441,7 +442,7 @@ Better HUD + 旅行地图效果图
https://www.zhihu.com/question/54048310
* View Distance: optimize your Minecraft server
https://mtxserv.com/article/12535/view_distance_optimize_your_minecraft_server
* Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
* Minecraft服务器优化教程 —— 让多带50%的玩家不再是梦 - 联机教程 - Minecraft(我的世界)中文论坛
https://www.mcbbs.net/forum.php?mod=viewthread&tid=478126
* itzg/docker-minecraft-server: Docker image that provides a Minecraft Server that will automatically download selected version at startup
https://github.com/itzg/docker-minecraft-server

View File

@@ -1,23 +1,25 @@
---
title: Minecraft 上云笔记 - MC 自定义皮肤并支持联机
title: Minecraft上云笔记 - MC自定义皮肤并支持联机
date: 2021-02-22
lastmod: 2021-02-22
description: Minecraft 上云笔记 - MC 自定义皮肤并支持联机
description: Minecraft上云笔记 - MC自定义皮肤并支持联机
categories:
- 技术
- 教程
- 指南
tags:
- Java
- MC
- MC 服务器
- MC服务器
- Minecraft
- 我的世界
- 游戏
- 服务器
---
<!-- # Minecraft 上云笔记 - MC 自定义皮肤并支持联机 -->
# Minecraft上云笔记 - MC自定义皮肤并支持联机
@@ -27,7 +29,7 @@ tags:
https://mcskin.cn/user
* [CSL] 万用皮肤补丁 (CustomSkinLoader) - MC 百科 | 最大的 Minecraft 中文 MOD 百科
https://www.mcmod.cn/class/883.html
* 全员安装皮肤 mod即可保证所有人都可以看见对方的皮肤
* 全员安装皮肤mod即可保证所有人都可以看见对方的皮肤
@@ -35,11 +37,11 @@ tags:
使用:
1. 安装好 forge
1. 安装好forge
2. 安装好皮肤补丁的 mod
2. 安装好皮肤补丁的mod
3. 启动一次 MC让他自动生成配置文件
3. 启动一次MC让他自动生成配置文件
4. 在皮肤站注册,并建立与游戏中角色名字相同的角色并设定皮肤
@@ -63,7 +65,7 @@ tags:
> **注意**
>
> 自定义皮肤站最好排在 Mojang API 的前面,不然的话如果有正版用户起的角色名字和你的一样,就会默认载入他的皮肤(巨坑 +1
> 自定义皮肤站最好排在Mojang API的前面不然的话如果有正版用户起的角色名字和你的一样就会默认载入他的皮肤巨坑+1
>
>

View File

@@ -1,10 +1,10 @@
---
title: RSSManX - 一套 RSS 综合解决方案
title: RSSManX - 一套RSS综合解决方案
date: 2021-05-08
lastmod: 2021-05-08
description: 网站没有源,海外站的源看不了?这也许是第一个自带海外加速的 RSS 解决方案
description: 网站没有源海外站的源看不了这也许是第一个自带海外加速的RSS解决方案
categories:
- 技术
- 教程
- 指南
tags:
- RSS
@@ -12,10 +12,14 @@ tags:
- Github
- 代理
---
![logo](https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/.github/logo.png)
![license](https://img.shields.io/github/license/Colin-XKL/RSSmanX)
![release](https://img.shields.io/github/v/release/Colin-XKL/RSSmanX)
![author](https://img.shields.io/badge/author-Colin-blue)
![license](https://img.shields.io/github/license/Colin-XKL/RSSmanX)
![release](https://img.shields.io/github/v/release/Colin-XKL/RSSmanX)
![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FColin-XKL%2FRSSmanX.svg?type=shield)
![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)
[中文说明](https://github.com/Colin-XKL/RSSmanX/blob/master/README-zh_cn.md) [English](https://github.com/Colin-XKL/RSSmanX/)
@@ -23,9 +27,9 @@ tags:
[RSSman X](https://github.com/Colin-XKL/RSSmanX) 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署,整合实用组件为你带来最佳 RSS 体验
**Feature简单一键部署常用组件支持自动更新支持服务健康自检支持海外站点 RSS 解锁**
**Feature 简单一键部署,常用组件支持,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
### 快速开始
## 快速开始
(若已安装 `docker``docker-compose`)
@@ -33,7 +37,7 @@ tags:
mkdir RSSmanX && cd $_ && wget https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/docker-compose.yml && sudo docker-compose up -d
```
## 说明
# 说明
本项目旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径。毕竟不是所有 RSS 爱好者都懂代码 😂。如果你想快速地搭建自己的 RSS 服务,能够有 RSS 订阅管理、RSS 在线阅读界面,进阶功能包括服务健康自检、海外站点 RSS 解锁等。希望订阅国内外的各大网站的 RSS 信息源又不想跟着网上漫天飞的教程瞎折腾的话,那么你可以使用本仓库的脚本快速完成安装部署。
@@ -67,15 +71,15 @@ mkdir RSSmanX && cd $_ && wget https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/doc
选择对应版本下载到本地后都 compose 文件需要重命名为标准的`docker-compose.yml`才可使用
## 安装说明
# 安装说明
### 需求
## 需求
- 一台 Linux 系统的服务器
> 本文以腾讯云 Ubuntu 18.04 系统的服务器为例,其他云服务商的没差,系统为 CentOS 的会有点差异
### 依赖项
## 依赖项
- docker
- docker-compose
@@ -107,7 +111,7 @@ sudo apt install docker-compose
- https://docs.docker.com/engine/install/
- https://docs.docker.com/compose/install/
### 如何安装
## 如何安装
安装好了 `docker``docker-compose` 后可以执行文章开头的快速开始的指令。或者可以按照下面的步骤手动操作:
@@ -129,7 +133,7 @@ sudo apt install docker-compose
- TTRSS 相关文档 [https://ttrss.henry.wang/](https://ttrss.henry.wang/)
- RSSHub 相关文档 [https://docs.rsshub.app/](https://docs.rsshub.app/)
### 功能模块介绍
## 功能模块介绍
**Tiny Tiny RSS**
RSS 订阅管理与在线阅读工具
@@ -161,7 +165,7 @@ RSS 订阅管理与在线阅读工具
**Clash**
智能路由与正向代理工具,用于解锁海外站点及提供海外 RSS 源的加速
## Acknowledgement
# Acknowledgement
- [Tiny tiny RSS](https://tt-rss.org/)
- [OpenCC](https://github.com/BYVoid/OpenCC)
@@ -170,11 +174,11 @@ RSS 订阅管理与在线阅读工具
- [RSShub](https://github.com/DIYgod/RSSHub)
- [Awesome TTRSS](https://github.com/HenryQW/Awesome-TTRSS)
## License
# License
GPL-3.0
## Changelogs
# Changelogs
- 2020-07-07 v1.0 First release
- 2020-07-14 v1.1 Update quick start shell script

View File

@@ -1,265 +0,0 @@
---
title: RSSManX 安装部署指南
date: 2022-05-07
description: RSS Man X 是我两年前入坑 RSS 后,为了方便更多人更方便地使用 RSS 所发起的一个项目,主要是用 docker-compose 整合了一些常用的服务如 TTRSS、RSSHub、Huginn、OpenCC 等并进行了一些优化调整,如自动更新,反反爬虫等。这篇文章会尽可能详尽地讲解安装部署的步骤以及安装过程中可能会遇到的一些问题。
categories:
- 技术
- 指南
tags:
- RSS
- Linux
- 教程
- Docker
---
<!-- # RSSManX 安装部署指南 -->
RSS Man X 是我两年前入坑 RSS 后,为了方便更多人更方便地使用 RSS 所发起的一个项目,主要是用 docker-compose 整合了一些常用的服务如 TTRSS、RSSHub、Huginn、OpenCC 等并进行了一些优化调整,如自动更新,反反爬虫等。这篇文章会尽可能详尽地讲解安装部署的步骤以及安装过程中可能会遇到的一些问题。
RSS Man X 会利用到 docker 和 docker-compose首先需要确保你的服务器正确安装了这些软件
## 1. Docker 环境准备
检查服务器中是否已经安装了 docker 和 docker-compose并检查他们的版本是否太老。比如输入`docker --version`来检查 docker 的版本
docker 的版本建议不要低于 19docker-compose 的版本建议不要低于 1.20
```shell
~ » docker --version
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1
```
```shell
~ » docker-compose --version
docker-compose version 1.25.0, build unknown
```
如果上面命令执行后提示`command not found`,那么说明并没有安装对应的软件包(或是安装的路径并不在当前用户的 PATH 变量中,尝试切换到 root 操作,详细的原因和解决方法见后文)
### 1.1 Ubuntu/Debian安装Docker
ubuntu 和 debian 主要是用 apt 安装和管理软件包,可以使用以下命令来安装,根据实际情况选择是否要加 sudo。下面以 Ubuntu 为例。Debian 下的安装略有不同,可以参见[Docker 官方文档](https://docs.docker.com/engine/install/debian/),以及[清华镜像源](https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/)。其中`download.docker.com`连接不同的可以尝试讲域名部分更换为[中科大提供的镜像](https://mirrors.ustc.edu.cn/help/docker-ce.html)地址`mirrors.ustc.edu.cn/docker-ce`
```shell
# 首先移除老旧的软件包
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
# 安装一些必要的依赖
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
```
如果你的服务器在墙外,可以直接使用 docker 官方的软件源
```shell
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
如果你的服务器在墙内,可以使用由中科大提供的镜像
```shell
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
导入 docker 软件源后即可开始安装 docker安装完成后可以输入`docker --version`来检查 docker 的版本
```shell
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
### 1.2 CentOS/Fedora安装Docker
CentOS 和 Fedora 使用 yum 安装和管理软件包,新版本则是使用 dnf不过两者功能一致且高度兼容。下面以 CentOS 为例Fedora 可参见[官方文档](https://docs.docker.com/engine/install/fedora/)或[清华镜像源](https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/)
```shell
# 1. 首先移除老旧的软件包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.
sudo yum install -y yum-utils
# 3.A 之后使用官方docker软件库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 3.B 墙内方案
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 4. 即可开始安装
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
### 1.3 安装或更新 docker-compose
docker-compose 目前有两个主要版本 V1 和 V2都是可用的。V1 使用 Python 编写,使用时类似`sudo docker-compose up -d`V2 则是 Golang 编写,与前者高度兼容,但是是作为 docker 的插件安装的,使用时类似`sudo docker compose up -d`,中间的短杠不需要了。
如果是按照上文的步骤安装的 docker那么默认已经安装了 docker compose v2可以通过`docker compose version`查看版本
```shell
~ » docker compose version
Docker Compose version v2.3.3
```
如果需要是安装的比较老的 v1 版本的 docker-compose想要单纯更新 docker-compose 而又不想动其他东西的话,可以更新安装 v1 版本的 docker-compose。
首先删除老旧版本(如果有的话)
```shell
rm $DOCKER_CONFIG/cli-plugins/docker-compose
sudo rm /usr/local/lib/docker/cli-plugins/docker-compose
pip uninstall docker-compose
```
然后使用 pip 来安装
```shell
pip3 install docker-compose
```
墙内也可以临时使用镜像源下载
```shell
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple
```
如果提示 pip 命令不存在需要先安装一下
```shell
# Ubuntu/Debian
sudo apt install python3-pip
# CentOS/Fedora
sudo yum install python3-pip
```
如果 pip 报错试着升级一下 pip 的版本
```shell
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
```
### 1.4 为 Docker 配置镜像源
如果 Docker 下载镜像非常慢,你可能需要单独配置一下 Docker 的镜像源。==**注意Docker 安装软件源的镜像和 Docker 镜像或者说映像的国内源并不是同一个,英文表述可能更准确一些:**==
* 上文安装 docker 时配置的是 docker 的 reporepo 里含有 docker 的软件包,[国内的镜像](https://mirrors.ustc.edu.cn/help/docker-ce.html)为 Docker CE 安装软件包的镜像
* 现在我们要配置的是 Docker Hub 的 MirrorDocker 里拉取 Image 默认会访问[Docker Hub](https://hub.docker.com),国内有多个 Docker Hub 镜像或是 Docker 镜像加速器,如[中科大的源](https://mirrors.ustc.edu.cn/help/dockerhub.html)
`/etc/docker/daemon.json`文件中写入以下内容,如不存在可先行创建,注意 json 中列表的最后一项末尾是没有逗号的
```json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
```
配置完成后`sudo systemctl restart docker`重启 docker 服务,然后输入`sudo docker info`,在输出结果的末尾可以看到`Registry Mirrors`里会出现我们刚刚配置的 Docker Hub 镜像
群辉等 NAS 的系统并不是标准版 Linux安装的也是魔改版 docker上面的配置文件地址并不适用建议自行搜索对应的文档或教程。
## 2. 安装 RSS Man X
[RSS MAN X 项目](https://github.com/Colin-XKL/RSSmanX)旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径,毕竟不是所有 RSS 爱好者都懂代码 😂。RSS Man X 能够有 RSS 订阅管理、RSS 在线阅读界面,进阶功能包括服务健康自检、海外站点 RSS 解锁等,提供不同的版本供选择,三个版本的 `docker-compose` 文件对应不同的需求,包含的组件和服务有差异。
| 组件 / 服务 / 功能名称 | 标准版 | Lite 版 | Ultimate 版 ✨ |
| ---------------------- | ------ | ------- | ------------- |
| TTRSS | ✅ | ✅ | ✅ |
| RSSHub | ✅ | ✅ | ✅ |
| Huginn | | | ✅ |
| Mercury | ✅ | | ✅ |
| OpenCC | | | ✅ |
| Redis | ✅ | | ✅ |
| Browserless | | | ✅ |
| 数据持久化保存 | ✅ | ✅ | ✅ |
| 容器自动更新 | ✅ | | ✅ |
| 容器健康检查 | ✅ | | ✅ |
| 海外站点加速 | | | ✅ |
| 智能路由 | | | ✅ |
| 反反爬虫 | | | ✅ |
### 2.1 安装流程
安装好了 `docker``docker-compose` 后,可以使用`git clone https://github.com/Colin-XKL/RSSmanX --depth=1`快速克隆本仓库,也可以通过[这个镜像地址](https://archive.fastgit.org/Colin-XKL/RSSmanX/archive/refs/heads/master.zip)下载仓库 zip 文件,[Gitee 上也有镜像](https://gitee.com/colin-xkl/RSSmanX)不过不经常更新。
1. cd 进入文件夹,修改`.env`中的值,如密码和 TTRSS 入口 URL 等
2. 运行 `sudo docker-compose up -d`
3. 等待程序跑完
4. 安装完成 ✅
### 2.2 相关事宜
1. 访问你设置的 `SELF_URL` 即可看到 Tiny Tiny RSS 的登陆页面,使用默认账户 `admin`,密码 `password` 登陆即可开始使用
2. 如开启海外站点解锁支持,第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。
3. 数据默认保存位置`~/.docker/Database`(注意以执行 docker 命令的用户为准,如使用 root 账户执行,则文件位于 root 用户 home 目录)
4. 默认情况下只有 TTRSS 和 Huginn 可以从外部访问,其他组件互相可以访问但不能直接从外部访问以提高安全性。组件间互相访问可以使用`容器名+指定端口`,端口默认为 80`http://rsshub/xxxxx`即可访问到 RSS Man X 内的监听 80 端口的 rsshub 实例。
5. 在 TTRSS 中将原来订阅的 `https://rsshub.app/*` 更改为 `http://rsshub/*` 即可使用 RSS Man X 内的自建 RSSHub 实例,并激活反反爬虫和海外源加速等功能
6. 如无法访问 rsshub 的官方文档站点,可以使用我维护的反代站点[https://rsshub-doc.azure.colinx.one/](https://rsshub-doc.azure.colinx.one/)
7. 关于 ARM 平台的支持可查阅[置顶的 issue](https://github.com/Colin-XKL/RSSmanX/issues/5),替换部分不支持 arm 架构的 docker 镜像为支持 arm 的镜像即可。
8. RSS Man X 的除 lite 以外的版本默认包含了自托管的 mercury 实例,你只需要在插件配置页面设置 mercury 实例地址为 `service.mercury:3000` 即可同理OpenCC 实例地址为`service.opencc:3000`
9. 如果部分 RSS 源不能订阅,检查是否使用了非常规端口。在`.env`文件中设置`RSS_ALLOEW_PORTS`
10. 若部署后某个应用一直无法通过浏览器访问,请检查是否绑定到了`6000`/`6666`等特殊端口,浏览器会拦截对这些端口的访问参见[这里](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
11. `ls`没有显示`.env`文件是因为以点开头的文件在 Linux 中都是默认隐藏的,可以使用`ls -a`查看到
12. vi/vim编辑文本太麻烦可以尝试使用nano
13. RSS Man 里所有容器绑定了服务器的/etc/localtime使用`sudo timedatectl set-timezone Asia/Shanghai` 设定系统的时区为上海后,容器里的时区也可以同步,这样日志里的时间就是东八区了
**获取帮助**
* **For Tiny tiny RSS problems:**
[https://tt-rss.org/wiki.php](https://tt-rss.org/wiki.php)
[http://ttrss.henry.wang/](http://ttrss.henry.wang/)
* **For RSShub problems:**
[https://docs.rsshub.app/faq.html](https://docs.rsshub.app/faq.html)
* **For Huginn problems:**
[https://github.com/huginn/huginn#readme](https://github.com/huginn/huginn#readme)
### 2.3 链接
* [我的 RSS 方案与心得](https://blog.colinx.one/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/)
* [RSS Man X GitHub repo](https://github.com/Colin-XKL/RSSmanX)
* [Huginn 指南:为任意网站制作 RSS](https://blog.colinx.one/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/)
* [docker compose 的错误使用姿势](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)

View File

@@ -1,10 +1,10 @@
---
title: Win 10 配置 C 语言环境的正确姿势
title: Win 10配置C语言环境的正确姿势
date: 2020-12-27
lastmod: 2020-12-27
description: VC6.0 太古老Dev C++没补全不友好MinGW 安装太烦恼?你用着最新的电脑,最新的系统,却在用着上个世纪的软件开始你人生第一门编程课?你需要这篇指南:在现代化的硬件和平台上使用现代化工具学习 C 语言
description: VC6.0太古老Dev C++没补全不友好MinGW安装太烦恼你用着最新的电脑最新的系统却在用着上个世纪的软件开始你人生第一门编程课你需要这篇指南在现代化的硬件和平台上使用现代化工具学习C语言
categories:
- 技术
- 教程
- 指南
tags:
- C
@@ -12,52 +12,52 @@ tags:
- 环境配置
---
<!-- # Win 10 配置 C 语言环境的正确姿势 -->
# Win 10配置C语言环境的正确姿势
> 本系列教程旨在为刚入门的编程语言学习者做好指南工作,开始编码,本应很简单
>
> The PAINLESS way to start coding!
VC6.0 太古老Dev C++没补全不友好MinGW 安装太烦恼?
VC6.0太古老Dev C++没补全不友好MinGW安装太烦恼
你用着最新的电脑,最新的系统,却在用着上个世纪的软件开始你人生第一门编程课?
你需要这篇指南:**在现代化的硬件和平台上使用现代化工具学习 C 语言**
你需要这篇指南:**在现代化的硬件和平台上使用现代化工具学习C语言**
*aka***Win10 配置 C 语言环境的正确姿势**
*aka***Win10配置C语言环境的正确姿势**
>截止 2020 年末Win10 配置 C 语言环境的常见方案有:
>截止2020年末Win10配置C语言环境的常见方案有:
>
>* 使用 scoop 来便捷地安装所需的环境
>* 使用 Winget 来安装所需的环境 *[不成熟]*
>* 使用国内镜像 Cygwin+VSCode 配置 C 语言环境【快速】
>* 使用 WSL+VSCode
>* 使用 WSL+Clion
>* 使用scoop来便捷地安装所需的环境
>* 使用Winget来安装所需的环境 *[不成熟]*
>* 使用国内镜像Cygwin+VSCode配置C语言环境 【快速】
>* 使用WSL+VSCode
>* 使用WSL+Clion
综合考虑可行性与小白友好性,我们推荐的方案是:
## 使用国内镜像 Cygwin+VSCode 快速配置 C 语言环境
## 使用国内镜像Cygwin+VSCode快速配置C语言环境
C 语言编写的`.c`源代码文件需要通过编译器编译生成可执行文件`.exe`后才能运行。Windows 系统默认没有自带 C 语言的编译器,这里我们需要手动下载配置才行。
C语言编写的`.c`源代码文件需要通过编译器编译生成可执行文件`.exe`后才能运行。Windows系统默认没有自带C语言的编译器,这里我们需要手动下载配置才行。
C 语言编译器在 Win 平台下的选择多种多样,但要么配置麻烦,使用门槛高;要么就是下载源在国外,国内下载慢如龟,甚至直接下不成。这里给出基于国内镜像 Cygwin+VSCode 配置 C 语言环境的方案,**实测可用,步骤清晰易懂,国内网络也可在几分钟内配置好!**
C语言编译器在Win平台下的选择多种多样但要么配置麻烦使用门槛高要么就是下载源在国外国内下载慢如龟甚至直接下不成。这里给出基于国内镜像Cygwin+VSCode配置C语言环境的方案,**实测可用,步骤清晰易懂,国内网络也可在几分钟内配置好!**
### 编译器的下载与配置
Cygwin 的下载安装分为两个部分:
Cygwin的下载安装分为两个部分
1. Cygwin 安装程序的下载1MB
1. Cygwin安装程序的下载1MB
2. 安装器来完整后续的编译器核心部分的安装100MB
#### Cygwin 的下载安装
#### Cygwin的下载安装
Cygwin 的安装程序可以[从其官方站点下载](https://cygwin.com/install.html)。不过站点为全英文且国内访问速度堪忧,这里给出快速下载链接
Cygwin的安装程序可以[从其官方站点下载](https://cygwin.com/install.html)。不过站点为全英文且国内访问速度堪忧,这里给出快速下载链接
> Cygwin 安装程序**快速下载**(不限速,免登陆)
> Cygwin安装程序**快速下载**(不限速,免登陆)
>
> https://wws.lanzous.com/iUpUKjojq5i
@@ -65,7 +65,7 @@ Cygwin 的安装程序可以[从其官方站点下载](https://cygwin.com/instal
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164821.png" alt="image-20201224235413884" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164821.png" alt="image-20201224235413884" style="zoom:50%;" />
@@ -73,113 +73,113 @@ Cygwin 的安装程序可以[从其官方站点下载](https://cygwin.com/instal
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164829.png" alt="image-20201224235436360" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164829.png" alt="image-20201224235436360" style="zoom:50%;" />
如果让你选择安装路径的话,可以不用改,不过默认在 C 盘。自己改的话,一个尽量避免使用中文路径,还有一个就是要记住你自己自定义的路径,后面会用到。
如果让你选择安装路径的话,可以不用改,不过默认在C盘。自己改的话,一个尽量避免使用中文路径,还有一个就是要记住你自己自定义的路径,后面会用到。
网络好的话,点击下一步会出来一个可用的国内镜像列表,那样的话随便选一个都可以直接进行后面的步骤。
网络条件不好的情况下,半分钟以内就会报错说网络连接失败。不过不用担心,接下来可以自己填写国内镜像地址。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164833.png" alt="image-20201224235644342" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164833.png" alt="image-20201224235644342" style="zoom:50%;" />
User URL 的输入框输入`https://mirrors.tuna.tsinghua.edu.cn/cygwin/`并点击 Add 添加。之后点击下一步继续。
在User URL的输入框输入`https://mirrors.tuna.tsinghua.edu.cn/cygwin/`并点击Add添加。之后点击下一步继续。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164836.png" alt="image-20201224235719679" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164836.png" alt="image-20201224235719679" style="zoom:50%;" />
之后会进入一个选择界面。这里选择要安装的组件。我们只需要 C 语言的编译器,这里在搜索框内输入`gcc`,然后在下方找到`gcc-core``gcc-g++`,点击右侧的三角形打开下拉菜单,选择 9 开头的版本。如下图所示。
之后会进入一个选择界面。这里选择要安装的组件。我们只需要C语言的编译器,这里在搜索框内输入`gcc`,然后在下方找到`gcc-core``gcc-g++`,点击右侧的三角形打开下拉菜单,选择9开头的版本。如下图所示。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164839.png" alt="image-20201225000518139" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164839.png" alt="image-20201225000518139" style="zoom:50%;" />
选择完成后,一路点击下一步安装。如果出现如下的警告信息,直接用默认的设置,点下一步继续就可以了。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164842.png" alt="image-20201225000604625" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164842.png" alt="image-20201225000604625" style="zoom:50%;" />
一般一到两分钟之内就可以下载完毕。如果过了很久还没有装完,要么是网络太垃圾,要么就是不小心勾了其他的软件,一直在安装。。。
#### 配置 Cygwin
#### 配置Cygwin
下面要更改环境变量。如果你之前没有自定义安装目录的话,默认路径`C:\cygwin64\bin`。否则下文对应的地方使用你自定义的目录。
在开始菜单中找到`Windows系统` - 控制面板。如果这里没有的话,按`Windows徽标键`+`S`可以呼出搜索面板,可以在此搜索控制面板菜单项。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164856.png" alt="image-20201227152139118" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164856.png" alt="image-20201227152139118" style="zoom:50%;" />
在控制面板主页找到系统与安全。
![image-20201227152347064](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164859.png)
![image-20201227152347064](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164859.png)
或者如果你的控制面板打开不是上面的布局而是下面这种布局的话,找到系统菜单。
![image-20201227152420458](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164903.png)
![image-20201227152420458](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164903.png)
进入如下的页面,点击高级系统设置。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164910.png" alt="image-20201225001127874" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164910.png" alt="image-20201225001127874" style="zoom:50%;" />
切换到高级选项卡,点击下方的环境变量菜单
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164913.png" alt="image-20201225000925342" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164913.png" alt="image-20201225000925342" style="zoom:50%;" />
在用户变量中,点击`Path`,点击下方编辑按钮进行编辑
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164916.png" alt="image-20201225000949291" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164916.png" alt="image-20201225000949291" style="zoom:50%;" />
输入 Cygwin 安装路径下的 bin 目录。如果你之前没有自定义安装路径,直接设置如图即可。否则设置为你自定义的路径。
输入Cygwin安装路径下的bin目录。如果你之前没有自定义安装路径直接设置如图即可。否则设置为你自定义的路径。
**注意:这一步只要添加这一个就好**,不要看我截图里面的很干净,就把其他的都删了
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164919.png" alt="image-20201225001045854" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164919.png" alt="image-20201225001045854" style="zoom:50%;" />
一路点击确定。修改完之后重启下电脑确保改动生效。
PowerShell 中或者命令提示符中输入 gcc 并回车。如果显示 no input files 则表示安装成功。
在PowerShell中或者命令提示符中输入gcc并回车。如果显示no input files则表示安装成功。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164921.png" alt="image-20201225001234917" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164921.png" alt="image-20201225001234917" style="zoom:50%;" />
### 配置编辑器
安装完了编译器,可以先来 Hello world
安装完了编译器可以先来Hello world了
![image-20201225001723920](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164924.png)
![image-20201225001723920](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164924.png)
按住 Shift 键,右键点击文件夹空白处,会出现在此处打开 Powershell 窗口的选项。
按住Shift键右键点击文件夹空白处会出现在此处打开Powershell窗口的选项。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164932.png" alt="image-20201225001744160" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164932.png" alt="image-20201225001744160" style="zoom:50%;" />
`gcc hello.c` 命令就会在当前目录下生成一个 exe 可执行文件。如果要指定文件名,可以`gcc hello.c -o hello.exe`
`gcc hello.c` 命令就会在当前目录下生成一个exe可执行文件。如果要指定文件名可以`gcc hello.c -o hello.exe`
输入`./hello.exe`即可执行该 exe 文件。
输入`./hello.exe`即可执行该exe文件。
![image-20201225002338213](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164937.png)
![image-20201225002338213](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164937.png)
如果直接双击 exe 也可以,不过运行窗口会一闪而过,解决方案是在 main 函数末尾return 语句前,加一句 getchar()。
如果直接双击exe也可以不过运行窗口会一闪而过解决方案是在main函数末尾return语句前加一句getchar()。
配置 VSCode 的作为 C 语言学习环境
配置VSCode的作为C语言学习环境
<span id="vscode">VSCode</span>是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
前往[VSCode 官网](https://code.visualstudio.com/)下载 Windows 版 VScode。并按照安装程序的指引进行安装。
前往[VSCode官网](https://code.visualstudio.com/)下载Windows 版VScode。并按照安装程序的指引进行安装。
直接下载链接
@@ -191,7 +191,7 @@ https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user
>
> https://az764295.vo.msecnd.net/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe
>
> 将开头的 az764295.vo.msecnd.net 替换掉,如下。
> 将开头的az764295.vo.msecnd.net替换掉如下。
>
> https://vscode.cdn.azure.cn/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe
>
@@ -201,67 +201,67 @@ https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165016.png" alt="image-20201227155805507" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165016.png" alt="image-20201227155805507" style="zoom:50%;" />
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165019.png" alt="image-20201227155937465" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165019.png" alt="image-20201227155937465" style="zoom:50%;" />
![image-20201227160036085](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165022.png)
![image-20201227160036085](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165022.png)
![image-20201227160129001](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165026.png)
![image-20201227160129001](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165026.png)
![image-20201227160209263](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165029.png)
![image-20201227160209263](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165029.png)
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165032.png" alt="image-20201227160939375" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165032.png" alt="image-20201227160939375" style="zoom:50%;" />
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165035.png" alt="image-20201227161003478" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165035.png" alt="image-20201227161003478" style="zoom:50%;" />
在输入栏中,在当前选项卡为**用户**的情况下,输入`run`并按回车进行搜索。修改`Run in Terminal``Save File Before Run`的设置项。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165038.png" alt="image-20201227161205762" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165038.png" alt="image-20201227161205762" style="zoom:50%;" />
完成了上述的设置,我们就可以来编写 C 语言的程序了。
完成了上述的设置,我们就可以来编写C语言的程序了。
### HelloC
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165059.png" alt="image-20201227163528187" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165059.png" alt="image-20201227163528187" style="zoom:50%;" />
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.c`
![image-20201227164010460](https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165107.png)
![image-20201227164010460](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165107.png)
点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
点击右上角的三角形按钮即可自动编译运行你的C语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165112.png" alt="image-20201227164041803" style="zoom:50%;" />
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165112.png" alt="image-20201227164041803" style="zoom:50%;" />
### 完成✅
现在,开始你的 C 语言学习之旅吧!
现在,开始你的C语言学习之旅吧!

View File

@@ -1,162 +0,0 @@
---
title: docker compose 的错误使用姿势
date: 2022-05-11
description: 这篇文章记录几个 docker compose 使用过程中几个难以察觉的错误使用姿势。1. 变量值使用`@`符号开头 2. 使用 6000 或 6666 端口
categories:
- 技术
- 指南
tags:
- YAML
- Linux
- Docker
- docker-compose
---
<!-- # docker compose 的错误使用姿势 -->
这篇文章记录几个 docker compose 使用过程中几个难以察觉的错误使用姿势
## 1. 变量值使用`@`符号开头
我在 RSS MAN X 的 docker-compose 配置文件中huignn 的环境变量出来时是这样写的
```yaml
environment:
- DATABASE_ADAPTER=postgresql
- DATABASE_HOST=database.huginn
- DATABASE_USERNAME=postgres
- DATABASE_PASSWORD=@pass_for_DB
- DATABASE_PORT=5432
```
自己使用的时候没发现什么问题,别人从零创建容器的时候报错了。刚开始排查了很久,后面发现我默认密码这样写其实是有问题的。
上面的使用列表来描述环境变量在 docker-compose 解析的时候没有任何报错信息。但是使用下面这种 key-value 的 map 的形式时,`docker-compose up`命令报错了,说 YAML 解析时出现问题
```yaml
environment:
DATABASE_ADAPTER: postgresql
DATABASE_HOST: database.huginn
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: @pass_for_DB
DATABASE_PORT: 5432
```
```
yaml: line 17: found character that cannot start any token
```
删除前导`@`符号则一切正常了。
```yaml
DATABASE_PASSWORD: pass_for_DB
```
后续测试了几次到底是什么原因导致的
```yaml
# error
DATABASE_PASSWORD: @pass_for_DB
# correct
DATABASE_PASSWORD: pass_for_DB
# correct
DATABASE_PASSWORD: ${DB_Password:-'pass_for_DB'}
## in .env
DB_Password=www_123
# correct
DATABASE_PASSWORD: ${DB_Password:-'@pass_for_DB'}
## in .env
DB_Password=www_123
# error
DATABASE_PASSWORD: ${DB_Password:-'@pass_for_DB'}
## no .env
# error
DATABASE_PASSWORD: ${DB_Password:-'@pass_for_DB'}
## in .env
DB_Password=@www_123
# correct
DATABASE_PASSWORD: ${DB_Password:-'@pass_for_DB'}
## in .env
DB_Password=A@www_123
```
最终发现无论是否使用 docker-compose 变量替换,只要最终设定值的时候,包含前导@符号最终一定会失败。Huginn 的这边的报错为解析容器内的一个 YAML 文件时失败
```
huginn1 | foreman stderr |
huginn1 | Caused by:
huginn1 | foreman stderr | Psych::SyntaxError: (<unknown>): found character that cannot start any token while scanning for the next token at line 8 column 13
huginn1 | foreman stderr | /app/vendor/bundle/ruby/2.6.0/gems/railties-6.0.4.4/lib/rails/application/configuration.rb:232:in `database_configuration'
```
后面我又进入容器查看了下容器内部读取到的环境变量到底是不是预期的值,发现了问题所在
能正常使用的情况
```shell
~ » sudo docker exec -it huginn1 /bin/bash
default@3b652a8413fb:~$ echo $DATABASE_HOST
database.huginn
default@3b652a8413fb:~$ echo $DATABASE_PASSWORD
A@www_123
```
出错的情况
```shell
~ » sudo docker exec -it huginn1 /bin/bash
default@42e19e692b24:~$ echo $DATABASE_HOST
database.huginn
default@42e19e692b24:~$ echo $DATABASE_PASSWORD
'@pass_for_DB'
```
可以看到,如果以`@`符号开头,最终的环境变量会加上引号,这对于某些应用来说会产生预期之外的结果,如此处测试的 Huginn。
## 2. 使用 6000 或 6666 端口
这也是一定挺特殊的场景,虽然与 docker compose 关系不大,但是难免会遇到。在映射端口的时候有一个很坑的地方,如果你要部署一个 web 服务,然后映射的时候填写的是`6000`端口或者是`6666`端口,你会发现无论怎么重启容器、更改容器设置、更换 Edge/Chrome浏览器就是访问不了页面。
实在折腾地快疯了,点开 Chrome 的错误详情,才发现这么一句
***ERR_UNSAFE_PORT***
一查才发现Chrome 等浏览器会限制部分特殊端口的网页访问,这些端口一般都已经有特殊的作用。
https://www.jianshu.com/p/40f79f584eae
这里列出 1000 以上的部分会有相关问题的端口,别的不说,感觉`6000``6666`还是很容易一不小心就会设置的端口。。。。
```c
2049, // nfs
3659, // apple-sasl / PasswordServer
4045, // lockd
6000, // X11
6665, // Alternate IRC
6666, // Alternate IRC
6667, // Standard IRC
6668, // Alternate IRC
6669, // Alternate IRC
```
Chrome、FireFox 等都会有类似的行为,换多少浏览器、换多少版本可能也都不行。。。
根据网友描述,部分特殊情况下,其他可能会被拦截的端口也包括`8080``8443``10080`
总之,日常映射端口还是选取`10000`以上的高位端口吧,避免不必要的麻烦:)

View File

@@ -4,7 +4,7 @@ date: 2019-10-10
lastmod: 2020-04-29
description: 在内网的树莓派上部署了 AdGuardHome做 DNS 服务器的同时也可以为内网所有设备过滤广告。本来嘛拦截了广告理应网络加载会更快然而实际体验却很糟糕。网页加载要比之前慢得多。AdGuardHome 的面板显示的平均反应时间一度达到了 1000ms。1s 的延时还是会非常影响网络体验的。用 dig 命令看了下 DNS 查询的情况。不看不知道一看吓一跳,随便查询一个域名竟然废了四秒多!这怎么能忍受!
categories:
- 技术
- 踩坑记
tags:
- 服务器
- 树莓派
@@ -13,8 +13,7 @@ tags:
在内网的树莓派上部署了 AdGuardHome做 DNS 服务器的同时也可以为内网所有设备过滤广告。本来嘛拦截了广告理应网络加载会更快然而实际体验却很糟糕。网页加载要比之前慢得多。AdGuardHome 的面板显示的平均反应时间一度达到了 1000ms。1s 的延时还是会非常影响网络体验的。用 dig 命令看了下 DNS 查询的情况。不看不知道一看吓一跳,随便查询一个域名竟然废了四秒多!这怎么能忍受!
\[图片已丢失\]
<!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-1-1280x784.png) -->
![](http://192.168.1.200/wp-content/uploads/2019/12/image-1-1280x784.png)
看网上其他人的评价,并没有我这种龟速的情况。况且我的上游 DNS 已经更换为了国内几个大厂的 DNS 比如阿里的腾讯的,测试查询一般反应时间也才 50ms。本地这个结果肯定是不能接受的。最开始还想过要根据常用域名手动制作 hosts 直接重定向。但是 dnspython 这个库不好直接指定 dns 查询adguardhome 的 query 日志又经过特殊加密,这条路困难重重。决定将其作为备用方案。接下来进入漫长的排雷环节。
@@ -24,14 +23,10 @@ tags:
后来发现了这货:
\[图片已丢失\]
<!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-1280x191.png) -->
![](http://192.168.1.200/wp-content/uploads/2019/12/image-1280x191.png)
原来,他会把每次查询的域名先交给他服务器做安全性检查,这在国内的互联网环境中完全是鸡肋,而且因为每次都要连接境外服务器,其延迟可想而知。果然禁用了这一项,速度嗖嗖的就起来了:
<!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-2-1280x708.png) -->
\[图片已丢失\]
![](http://192.168.1.200/wp-content/uploads/2019/12/image-2-1280x708.png)
即便是冷门的实验室官网的域名,也在 100ms 内解决了,对于常见的热门网站由于多设备频繁访问,会直接查询本地缓存。虽然基本只有可怜的差不多 60s 的缓存时间,但是一旦命中,就可以在 < 10ms 的时间响应如果是过滤器中的域名更是可以达到 < 5ms终于这个 AdGuard Home DNS 可以正式投入使用了

View File

@@ -1,299 +0,0 @@
---
title: 个人向 Linux 新服务器初始化清单
date: 2023-03-14
description: 一份 Linux 初始化清单, 避免每次拿到新的服务器都要一个个去各种地方搜集指令, 以做备忘 & 供有需要的朋友参考. 以目前最新的 Debian 11 Bullseye 为例
categories:
- 技术
tags:
- 技术
- Linux
- Debian
- Traefik
- Headless CMS
---
一份 Linux 初始化清单,避免每次拿到新的服务器都要一个个去各种地方搜集指令,以做备忘 & 供有需要的朋友参考。
服务器发行版我个人推荐 Debian 系列CentOS 系现在已经开始分裂而且说实话对新手其实并不友好。Debian 是在兼容性,易用性和稳定性之间都取得不错平衡的发行版。新手推荐 Ubuntu, 不过最近商业化有点过度,夹带了越来越多的私活,我个人所有新安装的 Linux 已经全线转向 Debian. 下文以目前最新的 Debian 11 Bullseye 为例
> azure 干净的 debian 11 镜像,资源使用情况供参考
>
> ~1G Disk, ~100M RAM, ~300 packages
本文仅列举主要事项和操作,新手可先行阅读这篇文章熟悉概念。[云服务器入门指南](https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/)
正文开始
## 1 - 基础环境搭建
### 1.1 防火墙
检查服务商防火墙和系统自带防火墙 (debian 系一般为 `ufw`, cent os 系一般为 `firewall-cmd`).放行 SSH(22), 新的 SSH(自定义), HTTP, HTTPS, 以及其他常用开发端口
### 1.2 新建用户与检查 sudoer
```shell
// -m 创建对应home文件夹
// 添加到wheel用户组自动获得sudo权限
useradd -m --groups wheel colin
```
也可直接编辑`/etc/sudoers` 文件为新用户添加 sudo 权限,使用 `visudo` 指令可以自动帮你校验,避免配置写错把系统搞崩
### 1.3 镜像源与基础软件
如为境内服务器需要更换镜像源
#### 更换国内镜像源
一般情况下,将  `/etc/apt/sources.list`  文件中 Debian 默认的源地址  `http://deb.debian.org/`  替换为  `http://mirrors.ustc.edu.cn`  即可。
```shell
//for debian
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
//for ubuntu
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
```
CentOS 系建议启用 EPEL, PowerTools 等 repo 以更方便地安装常用软件和工具。此处不再赘述
推荐的几个国内镜像站: [清华大学 TUNA 镜像站](https://mirrors.tuna.tsinghua.edu.cn/), [中科大 USTC LUG 镜像站](https://mirrors.ustc.edu.cn/), [腾讯镜像站](https://mirrors.cloud.tencent.com/)
#### 基础软件
```shell
sudo apt update
sudo apt install wget curl git nano
sudo apt install zsh tmux htop duf htop tldr screenfetch tree
```
### 1.4 SSH 安全
修改端口,配置文件`/etc/ssh/sshd_config`. 重启机器或 sshd 服务后生效
在本机检查`~/.ssh/`有无 id_rsa 等已生成的 key. 如没有再使用 `ssh-keygen` 生成私钥
将本机的公钥上传到远端,再写入远端的 `authorized_keys`
`cat ~/id_rsa.pub >> ~/.ssh/authorized_keys`
注意修改权限,`~/.ssh/authorized_keys` 权限为 600. `~/.ssh/`为 400
如失败可参考这篇文章 debug. [https://superuser.com/questions/1137438/ssh-key-authentication-fails](https://superuser.com/questions/1137438/ssh-key-authentication-fails)
### 1.5 设置 hostname
可选,为了便于识别和后续配置 oh-my-zsh 更美观
```shell
sudo hostnamectl set-hostname my-new-server
sudo hostnamectl status
```
修改后需重启
---
### 1.6 SWAP
可选,建议内存<2G 配置 swap, 大小至少为 2 倍物理内存
推荐用 `fallocate` , 因为这个是最简单最快速的创建交换空间的方法 `fallocate`  命令用于为文件预分配块 / 大小
以下内容参考 linux.cn
使用  `fallocate`  创建交换空间首先在  `/`  目录下创建一个名为  `swap_space`  的文件然后分配 2GB  `swap_space`  文件
```shell
sudo fallocate -l 2G /swap_space
ls -lh /swap_space
// 然后更改文件权限,让 `/swap_space` 更安全:
sudo chmod 600 /swap_space
// 创建交换空间
sudo mkswap /swap_space
// 启用
sudo swapon /swap_space
// 使用 s 参数查看列表
sudo swapon -s
```
每次重启后都要重新挂载磁盘分区因此为了使之持久化就像上面一样我们编辑  `/etc/fstab`  并输入下面行
```
/swap_space swap  swap  sw  0  0
```
保存并退出文件现在我们的交换分区会一直被挂载了我们重启后可以在终端运行  `free -m`  来检查交换分区是否生效
---
### 1.7 绑定域名  
可选绑定一个域名或者改下本地 host 便于后续访问
### 1.8 添加本地 SSH 别名
配置文件为本机的 `~/.ssh/config`
格式如下
```config
Host serverA
HostName myserver.domain.xyz
User colinx
Port 2333
```
## 2 - 常用工具与配置
### 2.1 Docker 环境
#### Docker 安装
可参考官网文档注意是 docker engine 的安装[Docker 官方安装文档](https://docs.docker.com/engine/install/debian/)
或者我之前写的 RSS MAN 部署文档中 docker 安装的部分
[RSS MAN X 安装部署指南/#1-docker 环境准备](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/#1-docker%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87)
#### Docker 镜像源配置
文件位置`/etc/docker/daemon.json`, 下面的配置供参考
```json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "http://hub-mirror.c.163.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
```
修改完保存重启 docker 服务即可生效可使用 `docker info` 命令检查是否生效
### 2.2 OH-MY-ZSH
安装 OH-MY-ZSH, 在此之前确保已安装 `git` `zsh`
```shell
sh -c "$(curl -fsSL [https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh](https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh))"
```
安装插件
```shell
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions --depth=1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting --depth=1
```
按需修改配置文件位置`~/.zshrc`, 下面为个人常用配置供参考注意去源文件修改对应项没有再到末尾加
```shell
# custom conf override
ZSH_THEME="af-magic"
CASE_SENSITIVE="false"
HYPHEN_INSENSITIVE="false"
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting sudo)
```
自定义配置添加到末尾
```shell
export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20
```
保存并应用
```shell
source ~/.zshrc
```
### 2.3 nano 代码文件规则
日常常用文本编辑器为 nano, 轻量级编辑需求完全满足
```shell
curl https://cdn.jsdelivr.net/gh/scopatz/nanorc/install.sh | sh
```
### 2.4 时区调整
一般安装完都是 UTC+0, 看日志什么的不方便服务器初始化的时候配置好后面可以免去很多麻烦
debian 系可用过 `timedatectl` 命令调整时区东八区可以用这个命令
```shell
sudo timedatectl set-timezone Asia/Shanghai
```
### 2.5 厂商监控/SDK 卸载
懂得都懂自己搜
## 3 - 进阶内容
### 3.1 内核参数调优
一些内核参数调整交换内存阈值和 bbr, tcp fast open 按需启用启用前务必确认自己了解对应字段的含义否则不如保留系统初始值
配置文件位置 `/etc/sysctl.conf`
```c
# mem
vm.swappiness = 10
# bbr and network tune 
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.ipv4.tcp_fastopen=3
net.ipv4.tcp_slow_start_after_idle=0
```
配置完之后保存并应用
```shell
sudo sysctl -p
```
### 3.2 其他进阶配置
一些其他的系统维护技巧与策略
**配置文件管理**
所有应用 docker 通过 `docker compose` 文件管理
配置共享存储`rclone` 挂载 webdav, 同步 docker compose 等配置文件;
traefik 网关作为统一出口负责服务发现和自动维护 HTTPS 证书自定义配置通过 headless CMS directus 管理traefik 设定为通过 http 方式获取远端配置即可
**数据库备份**
所有数据相关的统一挂载到`/data/database/xxx`, 配置定时任务进行备份
以及配置 s3 上传到其他存储介质和其他地域
这些内容此处不再赘述有机会再单独写篇文章分享吧
END
---
## 附录
- Install Docker Engine [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
- RSSManX 安装部署指南 [https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
- 云服务器入门指南 [https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/](https://blog.colinx.one/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/)
- Portainer Install Doc [https://docs.portainer.io/start/install-ce/server/docker/linux](https://docs.portainer.io/start/install-ce/server/docker/linux)

View File

@@ -4,58 +4,59 @@ date: 2020-03-15
lastmod: 2020-04-29
description: 各大厂商持续发力云计算,上云的门槛也越来越低。获取云服务器的门槛越来越低,但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑
categories:
- 技术
- 教程
- 指南
tags:
- 服务器
---
<!-- # 云服务器入门指南 -->
# 云服务器入门指南
<a name="4lA6Y"></a>
## 前言
各大厂商持续发力云计算,上云的门槛也越来越低。获取云服务器的门槛越来越低,但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑  : )
<a name="7EZ9O"></a>
## 云服务器相关的几个概念
<a name="8sCl1"></a>
### 服务器的操作系统
主要分为两大阵营Windows ServerLinux Server。前者一般自带可视化界面基本兼容平时使用的 exe 程序,某种程度上也可以作为“云电脑”使用。后者一般不自带图形化界面,操作都通过特定命令完成,上手难度较高,但配置各种开发环境、安装各类高级工具比 win 平台更容易。没有 Linux 基础的用户建议先在本地建立虚拟机练习。
主要分为两大阵营Windows ServerLinux Server。前者一般自带可视化界面基本兼容平时使用的exe程序某种程度上也可以作为“云电脑”使用。后者一般不自带图形化界面操作都通过特定命令完成上手难度较高但配置各种开发环境、安装各类高级工具比win平台更容易。没有Linux基础的用户建议先在本地建立虚拟机练习。
Linux Server 主要的两个阵营为 Debian 系、RedHat 系。主要的发行版
Linux Server主要的两个阵营为Debian系、RedHat系。主要的发行版
- Debian Debian, Ubuntu
- RedHat RedHat, CentOS, Fedora
- Debian系Debian, Ubuntu
- RedHat系RedHat, CentOS, Fedora
对于初学者来说,最明显的区别在于前者使用 `apt install xxx`  来安装软件,而后者是通过 `yum install xxx`  来安装。
<a name="VUFQF"></a>
### 公网IP
IP可以理解为一台设备在互联网世界中的门牌号和地址相当于知道某个具体的地址就能发快递包裹。IP分为公网IP和内网IP。顾名思义内网IP一般用于公司或学校内部。一般来说只知道一台设备的内网IP的情况下并不能准确定位这台设备就类似于只知道你的朋友的名字并不能直接给他寄快递你必须要知道他学校/单位/家的地址才行。
### 公网 IP
IP 可以理解为一台设备在互联网世界中的门牌号和地址相当于知道某个具体的地址就能发快递包裹。IP 分为公网 IP 和内网 IP。顾名思义内网 IP 一般用于公司或学校内部。一般来说,只知道一台设备的内网 IP 的情况下并不能准确定位这台设备,就类似于只知道你的朋友的名字,并不能直接给他寄快递,你必须要知道他学校/单位/家的地址才行。
服务器拥有公网 IP 的好处在于,你可以直接通过这个 IP 定位到你的服务器,相当于你的服务器在互联网世界中拥有了响当当的名号,只要说出这个名号,互联网世界的公民都能知道他,给他发消息。
_*此处公网内网 IP 的叙述仅适用于 IPv4 地址。更多关于 IPv4 地址和 IPv6 地址的相关信息参见文末扩展阅读。_
服务器拥有公网IP的好处在于你可以直接通过这个IP定位到你的服务器相当于你的服务器在互联网世界中拥有了响当当的名号只要说出这个名号互联网世界的公民都能知道他给他发消息。
_*此处公网内网IP的叙述仅适用于IPv4地址。更多关于IPv4地址和IPv6地址的相关信息参见文末扩展阅读。_
<a name="oWycK"></a>
### 端口 
端口的英文为 port有港口的意思。一般来说一台设备不同的端口运行着不同的服务我们可以很好的控制特定端口的开放与关闭从而控制不同的服务是否对外开放正如开放一个通商口岸。常见的服务端口有 `HTTP  80`   `HTTPS  443`   `DNS  53`   `SSH 22`  
端口的英文为port有港口的意思。一般来说一台设备不同的端口运行着不同的服务我们可以很好的控制特定端口的开放与关闭从而控制不同的服务是否对外开放正如开放一个通商口岸。常见的服务端口有 `HTTP  80`   `HTTPS  443`   `DNS  53`   `SSH 22`  
一个服务也可能不是仅仅通过一个端口提供服务,他可能会将一个大的功能拆分为几个子功能,通过不同的端口与外界通讯。如 FTPSMB 等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像 FTP 这样通过多个端口与外界通讯的端口,就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。
一个服务也可能不是仅仅通过一个端口提供服务他可能会将一个大的功能拆分为几个子功能通过不同的端口与外界通讯。如FTPSMB等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像FTP这样通过多个端口与外界通讯的端口就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。
_*FTP 是一种文件传输协议,你可以在某些电影资源的下载链接里看见以 `ftp://`  开头的链接。这说明这个电影资源是存放在某个 FTP 服务器上。_
_*关于 FTP、SMB 的端口使用及配置参见文末扩展阅读_
_*FTP是一种文件传输协议你可以在某些电影资源的下载链接里看见以 `ftp://`  开头的链接。这说明这个电影资源是存放在某个FTP服务器上。_<br />_*关于FTP、SMB的端口使用及配置参见文末扩展阅读_
<a name="daIMz"></a>
### 防火墙
防火墙Firewall某种程度上是控制本机与外界通讯的工具。下面以几个具体的实例来介绍下防火墙
- 你的服务器建了个网站,需要向外提供 HTTP 服务,那么你需要在防火墙中设置开放 80 端口,允许其他所有 IP 访问。
- 公司有一台服务器搭载了一个仅面向公司员工的网站,希望仅允许公司内的员工访问。而公司内员工的内网 IP 个格式为 192.168.*.*,那么就可以在防火墙中设置,仅允许来自 IP192.168.*.*的设备访问这台服务器的 80 端口,其他一律禁止
- 近期互联网上流行一种病毒 X 通过计算机的 1234 端口感染其他机器。那么为了保护本机不受病毒影响,你可以在防火墙中设置关闭 1234 端口,禁止任何来源访问 1234 端口,从而将病毒 X 阻挡在防火墙外。
**注意:对于云服务器来说,可能会存在多重防火墙。一般 Linux 系统自身会有一套防火墙firewalld/ufw 等),云服务商会有一套网络防火墙(一般为网络安全组/网络访问控制等)**
- 你的服务器建了个网站需要向外提供HTTP服务那么你需要在防火墙中设置开放80端口允许其他所有IP访问。
- 公司有一台服务器搭载了一个仅面向公司员工的网站希望仅允许公司内的员工访问。而公司内员工的内网IP个格式为192.168.*.*那么就可以在防火墙中设置仅允许来自IP192.168.*.*的设备访问这台服务器的80端口其他一律禁止
- 近期互联网上流行一种病毒X通过计算机的1234端口感染其他机器。那么为了保护本机不受病毒影响你可以在防火墙中设置关闭1234端口禁止任何来源访问1234端口从而将病毒X阻挡在防火墙外。
**注意对于云服务器来说可能会存在多重防火墙。一般Linux系统自身会有一套防火墙firewalld/ufw等云服务商会有一套网络防火墙一般为网络安全组/网络访问控制等)  **
<a name="8vffy"></a>
### 几种远程连接方式对比
| **连接方式** | SSH | VNC | RDP |
@@ -66,87 +67,73 @@ _*关于 FTP、SMB 的端口使用及配置参见文末扩展阅读_
| **网络要求** | 极低 | 高 | 较高 |
| **配置难度** | ★ | ★★★ | ★★ |
- 1 部分 Linux 发行版自带 VNC 连接,不过大部分需手动启用
- 2 RDP 连接对于同为 Win 的机器更为容易,对于平台不一样的情况,配置比较麻烦
- _*__1 __部分Linux发行版自带VNC连接不过大部分需手动启用_
- _*__2__ RDP连接对于同为Win的机器更为容易对于平台不一样的情况配置比较麻烦_
<a name="Q8OP1"></a>
## 快速入门须知
当你拥有了一台属于自己的云服务器,你发现面对复杂的控制台手足无措,不知道怎么连接,不知道能拿来干什么。那么你可以参考一下的步骤。**下文仅适用于 Linux Server & 有一点点 Linux 操作经验的选手**。
### 开启 SSH 远程连接
当你拥有了一台属于自己的云服务器,你发现面对复杂的控制台手足无措,不知道怎么连接,不知道能拿来干什么。那么你可以参考一下的步骤。**下文仅适用于Linux Server & 有一点点Linux操作经验的选手**。
<a name="YAQ3M"></a>
### 开启SSH远程连接
<br />
<a name="7ahE2"></a>
#### 服务器端设置
1.首先,登陆你的账户,打开云服务器的控制台,开机(不解释)  
2.定位到你的云服务器,一般新的账户只有一台云服务器实例,点击其菜单,找到远程连接选项  
3.接下来会打开一个网页端的黑框,根据其提示,设置实例密码等等。这里记录你的系统用户名和密码。
4.一般网页端会有提示,根据具体情况开启 SSH 服务,设置允许 root 权限远程登录。具体的操作因平台和操作系统不同而不同,此处不再赘述。
5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置,点击进入,**开启服务器 22 端口的访问权限**。
1.首先,登陆你的账户,打开云服务器的控制台,开机(不解释)  <br />2.定位到你的云服务器,一般新的账户只有一台云服务器实例,点击其菜单,找到远程连接选项  <br />3.接下来会打开一个网页端的黑框,根据其提示,设置实例密码等等。这里记录你的系统用户名和密码。<br />4.一般网页端会有提示根据具体情况开启SSH服务设置允许root权限远程登录。具体的操作因平台和操作系统不同而不同此处不再赘述。<br />5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置,点击进入,**开启服务器22端口的访问权限**。
接下来在你的电脑上配置 SSH 远程访问。 
接下来在你的电脑上配置SSH远程访问。 
<a name="51wEl"></a>
#### 本地电脑设置
1.1 Win10 用户和 Linux 用户、Mac OS 用户一般系统会预装 ssh 客户端。打开 CMD 命令控制符/PowerShell输入 ssh 回车看是否有反应。**如果没有提示 xxx 找不到,可以直接到步骤 2.1**。
1.2 如果没有反应,你需要到 设置 - 应用 - 可选功能 中,安装 SSH 客户端。
1.3 Windows 其他版本用户需要安装第三方 SSH 客户端。这里推荐使用 Putty。
2.1 接下来使用 `ssh 你的用户名@你的服务器IP` 来连接到你的服务器。注意**At 符号@前后没有空格,输完回车确认**。正常情况下可以成功连接到。
2.2 如果出现 Permission denied可能的原因有`用户名密码错误` / `未开启root账户远程登录`
2.3 如果出现 Connection time out则大概率是你`IP地址填写错误`,也有可能是你的`服务器没开机`/ `你的服务器系统没有默认开启ssh服务 `/ `防火墙未放行22端口`
1.1 Win10用户和Linux用户、Mac OS用户一般系统会预装ssh客户端。打开CMD命令控制符/PowerShell输入ssh回车看是否有反应。**如果没有提示xxx找不到可以直接到步骤2.1**<br />1.2 如果没有反应,你需要到 设置-应用-可选功能 中安装SSH客户端。<br />1.3 Windows其他版本用户需要安装第三方SSH客户端。这里推荐使用Putty。<br />2.1 接下来使用 `ssh 你的用户名@你的服务器IP`   来连接到你的服务器。注意**@符号前后没有空格****输完回车确认**。正常情况下可以成功连接到。<br />2.2 如果出现Permission denied可能的原因有_用户名密码错误_/_未开启root账户远程登录_。<br />2.3 如果出现Connection time out则大概率是你_IP地址填写错误_也有可能是你的_服务器没开机_/_你的服务器系统没有默认开启ssh服务_/_防火墙未放行22端口_
排查相关问题请带上相关关键字去搜索引擎搜索。
<a name="X9DJ5"></a>
### 安装软件
<a name="by8iU"></a>
#### 安装软件的命令及常见问题
参见上文介绍操作系统的部分。不过具体安装的时候,经常会遇到的问题为安装需要 root 权限。一般来说,日常使用时为了安全期间,我们不会直接用 root 账户进行操作。通常的做法为创建一个普通的账户,当执行需要高权限的指令时在命令前加上 sudo或是使用 `su root`  来临时切换为 root 用户*,并输入密码来进行二次确认,以确保安全性。此处涉及到的操作有:  
参见上文介绍操作系统的部分。不过具体安装的时候经常会遇到的问题为安装需要root权限。一般来说日常使用时为了安全期间我们不会直接用root账户进行操作。通常的做法为创建一个普通的账户当执行需要高权限的指令时在命令前加上sudo或是使用 `su root`  来临时切换为root用户*,并输入密码来进行二次确认,以确保安全性。此处涉及到的操作有:  
- 添加一个普通用户 ( `useradd NEWUSERNAME`  /  `adduser NEWUSERNAME`  )
- 设置新用户的密码  ( `passwd USERNAME`  )
- 将新用户添加到 sudoers 的列表中  ( 修改 `/etc/sudoers`  ) 
- 将新用户添加到sudoers的列表中  ( 修改 `/etc/sudoers`  ) 
具体操作可以以  `操作系统名称+操作关键字`  为关键字在搜索引擎中自行搜索详细教程。
_*临时切换为 root 用户,执行完命令后,记得用 exit 命令退出 root 账户_
_*临时切换为root用户执行完命令后记得用exit命令退出root账户_
<a name="HY0JM"></a>
#### 镜像源的设置
执行完上述命令,当你尝试安装一个软件时,如果你云服务器提供商没有为你的系统进行“优化”的话,你会发现安装软件的速度非常慢。这是因为这些 Linux 系统基本都是由国外的厂商/组织进行开发,安装软件时需要到位于国外的服务器获取数据,你的网络请求可能会跨越大半个地球,网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点,我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。
国内的镜像站点有**阿里云镜像站**、**清华大学 tuna 镜像站**、**中国科学技术大学开源镜像站**等。这些站点提供多种主流 Linux 发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同,可以到以上镜像站点中查找特定系统更换软件源的详细步骤。
执行完上述命令当你尝试安装一个软件时如果你云服务器提供商没有为你的系统进行“优化”的话你会发现安装软件的速度非常慢。这是因为这些Linux系统基本都是由国外的厂商/组织进行开发,安装软件时需要到位于国外的服务器获取数据,你的网络请求可能会跨越大半个地球,网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点,我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。<br />国内的镜像站点有**阿里云镜像站**、**清华大学tuna镜像站**、**中国科学技术大学开源镜像站**等。这些站点提供多种主流Linux发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同可以到以上镜像站点中查找特定系统更换软件源的详细步骤。
_*请注意此处叙述并不准确与一个站点通信的速度取决于很多因素。_
<a name="Ivxvo"></a>
#### 常用工具的安装
更换好了软件源后,我们就可以愉快的安装软件了。你可以尝试安装一下 `screenfetch`  的软件包进行测试,安装完成后输入 `screenfetch`  命令,他会在你的屏幕上输出字符画形式的系统图标和系统配置信息。
部分 Linux 发行版可能并没有预置很多的软件包,你可以根据自己的需要进行安装,如文本编辑工具 `nano`  `vim`  等*。C 编译工具 `gcc`  ,C++编译工具 `g++`  Java 开发组件 `openjdk`  等。
_*推荐初学者使用易于上手的 `nano`  文本编辑器。大部分 Linux 发行版都有预置。_
部分Linux发行版可能并没有预置很多的软件包你可以根据自己的需要进行安装如文本编辑工具 `nano`  `vim`  等*。C编译工具 `gcc`  ,C++编译工具 `g++`  Java开发组件 `openjdk`  等。
_*推荐初学者使用易于上手的 `nano`  文本编辑器。大部分Linux发行版都有预置。_
<a name="buNrX"></a>
## 初级玩法
- **搭建 Wordpress 网站**:为服务器安装好基础设施,部署 wordpress 服务。参见 [服务器 LAMP 部署](https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1134.26fc7ed9zbIv5a)[Wordpress 搭建](https://segmentfault.com/a/1190000013035065)
- **作为远程开发环境**  [VSCode 进行远程开发](https://www.jianshu.com/p/0f2fb935a9a1)
- **搭建Wordpress网站**为服务器安装好基础设施部署wordpress服务。参见 [服务器LAMP部署](https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1134.26fc7ed9zbIv5a)[Wordpress搭建](https://segmentfault.com/a/1190000013035065)
- **作为远程开发环境**  [VSCode进行远程开发](https://www.jianshu.com/p/0f2fb935a9a1)
<a name="Nj6Qf"></a>
## 其他高级玩法
参见:[知乎问答:自己拥有一台服务器可以做哪些很酷的事情?](https://www.zhihu.com/question/40854395)
<a name="QmdHY"></a>
## 扩展阅读
- [IPv6 是什么?](https://zhuanlan.zhihu.com/p/36542469)
- [IPv6是什么](https://zhuanlan.zhihu.com/p/36542469)
- [CentOS7 firewall 开放服务 / 端口](https://www.jianshu.com/p/016ee3b7ff97)
- [在 Ubuntu 中用 UFW 配置防火墙](https://linux.cn/article-8087-1.html)
- [让你的 WordPress 网站更快的 16 条建议](https://www.wpdaxue.com/make-your-wordpress-site-faster.html)

View File

@@ -4,13 +4,14 @@ date: 2020-02-08
lastmod: 2020-04-29
description: 经过两三天的折腾,从 Linux 结构及指令,到 LNMP 框架搭建,再到数据库的配置,最后端口转发 + 内网穿透,博客终于成功上线!在此将部署过程及踩过的坑记录下来,一方面是纪念,另一方面希望能够后来人提供一点帮助。
categories:
- 技术
- 踩坑记
tags:
- 防火墙
- 服务器
- 局域网
---
-
@@ -28,7 +29,7 @@ tags:
由于要分配的公网 IPv6 地址是要由路由器从公网获取一个前缀然后再为局域网的每个支持 IPv6 的设备分配地址,这一项任务不能由内网的树莓派代劳,所以当时就没有改动,没想到现在竟然成了救命稻草。
通过 IPv6 的方式,成功连接上了树莓派。查看了 AdGuardHome 的 DNS 服务以及 DHCP 服务,并没有发现任何异常。
例行 SSH 连上查看日志。`sudo systemctl status AdGuardHome.service`,果然,发现了端倪。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121221431.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200121221431.png)
原来DHCP 服务!是要单独监听 67 端口的!
而一个小时之前,为了防止暴露在公网上的树莓派遭到攻击,我特地启用了防火墙,并设置规则为,除了放行的 DNS 53 等端口,其他默认屏蔽。想来应该是误伤了 DHCP 的 67 端口。而之前 DHCP 设置每个 IP 地址的租约为一个小时,即,每间隔一个小时才会重新进行一次 DHCP 请求。于是`sudo ufw allow 67/tcp`端口放行 DHCP 服务信息。win10 断网重连以令其重新获取 IP 地址。
没想到还是不成功。AdGuardHome 的 DHCP 租约面板,依然显示没有任何设备连接。依据以往的经验,乖乖去查了 DHCP 所使用的端口信息,发现 DHCP 需要`67/udp``68/udp`两个端口,且还是使用 udp 连接。
@@ -43,7 +44,7 @@ tags:
-----
防火墙抵挡了来自外部的威胁,也会对现有的服务造成影响。除了网页访问的 80 和 443 端口,其他有固定端口的特定服务要手动在防火墙中添加规则。对于像 BT 下载这种没有固定端口的,需要根据实际设定来更新防火墙规则。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200122140951.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200122140951.png)
图中为 Aria2 的默认监听端口,为了保证正常的 BT 下载,需要保证这个范围的端口也添加进防火墙允许通过的规则。
最简单有效的办法是,将所有出站的请求默认允许,对于外部传入的请求,除了必要的几个服务,其他一概默认禁止。
@@ -54,4 +55,4 @@ sudo ufw default deny incoming
```
这样设置可以保证我们能够正常访问互联网上的绝大多数服务,且阻挡大部分外部的攻击。不过这种情况下,如果你的系统被植入了后门,那么这台机器依然可以向外发送请求。如之前爆发的“永恒之蓝”,如果你的机器被感染了,那么他依然可以经由特定的端口,向外传送数据,从而感染局域网中的其他设备。防火墙的规则就要根据实际的情况来进行设置了。
这样设置可以保证我们能够正常访问互联网上的绝大多数服务,且阻挡大部分外部的攻击。不过这种情况下,如果你的系统被植入了后门,那么这台机器依然可以向外发送请求。如之前爆发的 “永恒之蓝”,如果你的机器被感染了,那么他依然可以经由特定的端口,向外传送数据,从而感染局域网中的其他设备。防火墙的规则就要根据实际的情况来进行设置了。

View File

@@ -1,8 +1,8 @@
---
title: 伪·苹果全家桶喜添新成员:小米手环 6 使用体验
title: 伪·苹果全家桶喜添新成员:小米手环6使用体验
date: 2021-07-25
lastmod: 2021-07-25
description: 继 iPad 2018iPhone SE2漫步者无线耳机伪·AirPods黑苹果 Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机 +4K 显示器伪·iMac我的伪·苹果全家桶终于迎来了新成员智能穿戴设备小米手环 6。
description: 继iPad 2018iPhone SE2漫步者无线耳机伪·AirPods黑苹果Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机+4K显示器伪·iMac我的伪·苹果全家桶终于迎来了新成员智能穿戴设备小米手环6。
categories:
- 分享
tags:
@@ -13,18 +13,18 @@ tags:
---
<!-- # 伪·苹果全家桶喜添新成员:小米手环 6 使用体验 -->
# 伪·苹果全家桶喜添新成员:小米手环6使用体验
iPad 2018iPhone Se2漫步者无线耳机伪·AirPods黑苹果 Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机 +4K 显示器伪·iMac我的伪·苹果全家桶终于迎来了新成员智能穿戴设备小米手环 6。
继iPad 2018iPhone Se2漫步者无线耳机伪·AirPods黑苹果Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机+4K显示器伪·iMac我的伪·苹果全家桶终于迎来了新成员智能穿戴设备小米手环6。
## 选购原因
我购买电子产品一向是非常谨慎的,而且来回确认必要性和对比参数、价格通常都要很久,但这一次,吃个午饭的功夫我就下单了小米手环 6。严格意义上来说他对我并不是一个必需品促使我这么快下单的因素主要有两个
我购买电子产品一向是非常谨慎的而且来回确认必要性和对比参数、价格通常都要很久但这一次吃个午饭的功夫我就下单了小米手环6。严格意义上来说他对我并不是一个必需品促使我这么快下单的因素主要有两个
1. 近期对健康的重视
2. 对睡眠质量不满意,对白天的工作学习效率和状态不满意
在与公司几个我很钦佩的 leaderboss 的饭局中,我发觉到那些很厉害的人,他们在学习和生活的时候总是以一种全情投入、高效专注的姿态投入进去,而让他们保持精力旺盛和高效的秘诀,或者说这几位牛人的共同点,就是他们都非常**关注健康,保持运动,注重效率**。
在与公司几个我很钦佩的leaderboss的饭局中我发觉到那些很厉害的人他们在学习和生活的时候总是以一种全情投入、高效专注的姿态投入进去而让他们保持精力旺盛和高效的秘诀或者说这几位牛人的共同点就是他们都非常**关注健康,保持运动,注重效率**。
同时身边几位朋友各种身体原因,耽误学习、工作的真实案例,也让我愈发感受到健康的重要性,包括但不限于心理健康、口腔健康、心肺能力、睡眠质量等方面。
@@ -32,13 +32,13 @@ tags:
## 我最关注的功能
通知提醒、运动统计、心率检测,这些都已经是目前市面上的绝大多智能手环、手表的标配了,小米手环 6 代还支持的功能包括睡眠监测、遥控拍照、血氧检测、支付宝离线支付、音乐切换、闹钟、番茄钟、倒计时以及多种运动模式的检测与支持NFC 版还额外支持 NFC 刷卡以及小爱同学,不过没有扬声器小爱同学不能发声😂。我购入的是无 NFC 的普通版,谈一下我个人认为很实用的以及几个非常鸡肋的功能。
通知提醒、运动统计、心率检测,这些都已经是目前市面上的绝大多智能手环、手表的标配了,小米手环6代还支持的功能包括睡眠监测、遥控拍照、血氧检测、支付宝离线支付、音乐切换、闹钟、番茄钟、倒计时以及多种运动模式的检测与支持NFC版还额外支持NFC刷卡以及小爱同学不过没有扬声器小爱同学不能发声😂。我购入的是无NFC的普通版谈一下我个人认为很实用的以及几个非常鸡肋的功能。
1. 🎯**平时使用的核心功能**:运动目标(步数和卡路里),睡眠监测
2. 😃**经常使用的实用工具**:倒计时,番茄钟,事件提醒
3. 👎🏻**营销效果>实用**血氧检测心率检测压力检测PAI 趋势
3. 👎🏻**营销效果>实用**血氧检测心率检测压力检测PAI趋势
**几天实际体验下来,血氧检测、心率这些东西对于一个正常生活的年轻人没有必要**,测了几次血氧都是 98%晚上也没有呼吸不畅心率也不会突然变动压力也没必要全天候检测自己心里烦躁的时候自己还不知道吗。。。PAI 是一个需要全天候检测的东西1 分钟检测 1 次,续航崩的厉害,而且也没啥必要。。。
**几天实际体验下来,血氧检测、心率这些东西对于一个正常生活的年轻人没有必要**测了几次血氧都是98%晚上也没有呼吸不畅心率也不会突然变动压力也没必要全天候检测自己心里烦躁的时候自己还不知道吗。。。PAI是一个需要全天候检测的东西1分钟检测1次,续航崩的厉害,而且也没啥必要。。。
**最令我惊喜的是倒计时、番茄钟和事件提醒功能**。拿我最近的使用场景举例,近期开始重点关注口腔健康,每次刷牙时可以定个三分钟的倒计时,每次刷牙必须满三分钟;再设定一个每日重复的事件提醒,每天提醒我十一点刷牙,保持口腔清洁。这些事固然用手机都可以办到,只是**用手环进行这些操作出乎意料的方便**。番茄钟也是非常非常好用的一个工具,这个功能是近期更新才添加的,现在在手环上设定番茄钟,接收到时提醒更加轻量、便捷,也减少了手机的干扰,大大滴实用~😄
@@ -48,7 +48,7 @@ tags:
**重量**:几乎可以忽略,没有坠手感
**续航**:没有打开 PAI 等高度崩续航的功能,十分钟检测一次,日常使用一到两次运动模式,一周一充没有压力
**续航**没有打开PAI等高度崩续航的功能十分钟检测一次日常使用一到两次运动模式一周一充没有压力
**充电**:磁吸充电真的超香
@@ -56,22 +56,22 @@ tags:
**腕带佩戴体验**:不是很透气,夏天出汗或是沾了水会有点难受
**腕表卡扣**:一只手轻松扣上,很久以前佩戴的 1 代手环真的是两只手都扣不上
**腕表卡扣**:一只手轻松扣上,很久以前佩戴的1代手环真的是两只手都扣不上
**硌手程度**:低,正常佩戴,一天下来皮肤上不会有印记
## 使用体验
iOS 兼容性尚可APP 功能完备,部分健康数据可写入苹果健康应用。据说一众国产手环手表中,小米家的是对苹果支持最友好的
iOS兼容性尚可APP功能完备部分健康数据可写入苹果健康应用。据说一众国产手环手表中小米家的是对苹果支持最友好的
设备联动:无,毕竟只是手环,没法安装三方 APP。不过听说 NFC 版的小爱同学可以控制智能家居,听起来还不错
设备联动毕竟只是手环没法安装三方APP。不过听说NFC版的小爱同学可以控制智能家居听起来还不错
响应速度:尚可,抬腕亮屏的灵敏度和速度都还可以,偶有不灵,正常范围内
## 购买建议
Apple 生态内用户Apple Watch 少有的平价替代品(两百块要什么自行车)
Apple生态内用户Apple Watch少有的平价替代品两百块要什么自行车
腕上空空选手的智能穿戴尝鲜优选
小米手环 123 代用户无脑升级(磁吸充电真香)
小米手环123代用户无脑升级磁吸充电真香

View File

@@ -1,201 +0,0 @@
---
title: 写在毕业季
date: 2022-06-20
lastmod: 2022-07-10
description: 这是一张毕业照,一张灵魂和思想的快照。
draft: false
tags:
- 总结
categories:
- 杂记
---
<!-- # 写在毕业季 -->
这是一张毕业照,一张灵魂和思想的快照。
---
## 和解
和自己和解,和家人和解,和朋友和解,和这个世界和解
## 答案
我想要什么?
这个问题困扰了我很久。
在这个时间点,我给自己的答案,是自由。
我要的是选择的自由。在那之前,我需要有足够多的资本,以及足够的能力和足够的可能性。
---
## 共情
曾经以为自己可以可以并将会成为一名硬核技术人,一心钻研技术,靠技术吃饭,不用在意外界的繁杂,对技术的极致追求可以为我带来内心和物理世界的充裕。
长期以来我一直在有意无意封闭内心,压抑或是忽略多余的情感,向外界屏蔽我的情绪,企图远离外部世界繁杂的声音。当半个机器人也挺好的,里里外外全部都是一个没有感情的机器人的话似乎也没有什么不好。
但当我开始动情,各种复杂的情感在某个不确定的时间点突然来访,
当我不想或不再能掩盖自己的情绪,喜怒哀乐不由自主地表现出来
当我开始突然懂得“察言观色”,突然读懂了一个人的微表情,读懂了一个人的谎话
当我开始利用共情能力和一些心理学、社会学的内容操作对话、活动,去表现得体贴、亲和,感到很别扭。但其实这些特性并不是什么坏事,只是“表现得会处事”和“会处事”还是两回事,有些东西并没有内化成我的一部分
我开始讨厌这样的自己,变得“油滑”,变得“世故”。
这种感觉有点像是在某些方面突然“开窍”。理论上来说这的确可以提高我在社会上的生存能力,但相应地,也会看到各种阴暗面,感受到各种负面情绪。开窍了也不能还回去,只能坦然接受了。
---
## 谈创作
人们总是对自己所创造的作品拥有独特的感情,做的菜,写的文字,唱的歌,画的画,都像孩子一样,与自己有着微妙的联系。
创作能给人带来一种高层次的满足感。品尝美食和制作美食,两者得到的满足感是不一样的。
小时候畅想的未来的自己:是一个技术人,发明自己的产品;或是一个作家,将自己的情感寄托在文字里;或是一名小众的音乐人,将那些失眠的夜和混沌的梦都用音符记录下来
这些形象都有着共同的特征,他们都是创作者。
年少的理想具体是什么已经不再重要了。重要的是,一直以来,我都希望自己是一个创作者。现在是,以后也是
---
## 一件小事
我发现我总是会被各种“预期之外”的事情所困扰,有些完全是突如其来的偶然事件,打乱了我原本的计划,进而导致很多想法没能实现,很多事情最终没有完成。我越是想做好一件事,就越想制定完备详尽的计划,但无论我计划地多么缜密,考虑了多少可能的情况,最终结果总是不尽人意。后面我对自己、对心理学的认知更深入了以后,才发现这个想法的荒唐之处
* 我只会记得或者说希望记得那些我计划得很好,后来被意外事件打断,最终没能成功的事件
* 我会放大这一点来试图佐证:事情没能完成不是我的能力问题,而完全是意外事件导致的
* 我的计划越缜密,考虑的越多,最终意外事件给我的冲击就越大
当我意识到自己的误区之后,我不再试图做详尽的计划,因为那样只会适得其反。计划得越详细,最终事情不按照预期执行的可能性就越大,最终给我带来的挫败感就会越强烈。
我的解决方案是:关注结果和里程碑,不再对细节引入任何预先的设想,其他的随机应变灵活处理。
从这个误区中走出来后,我感觉做起事来变得更加轻松了,不用再费心费力去计划什么,也不用为事情发展脱离预期而焦躁,坦然的心态也有利于我专注于这个事情本身。
最近看的《嫌疑人 X 的献身》中提到一个有趣的观点:证明一个答案是错误的,比找出一个问题的正确答案可能要更难。
我已全然忘记我意识到这个误区是什么时间,什么场景,有什么契机。或许我根本就不是在某一个特定的时间点顿悟的,我更倾向于将这一点归于我的积累。毕竟,在你一无所有的时候,你能投资的只有你自己。
You are what you read.
就像我们吃饭一样,你每天吃的白米饭,最终会称为你身体的一部分。同样的,你读的书,看的电影,经历过的事,这些东西最终都会成为塑造你人格的养分。当然也可能不是养分,如果每天吃的都是垃圾食品,那么大量的油脂和不健康的化学物质最终也会进入你的体内,成为你的一部分,这些都会决定着你有一个怎样的肉体。同理,天天刷垃圾短视频,和天天阅读名家著作这两种行为,注定会塑造出两个截然不同的,两个世界的人。
孟母三迁、“近朱者赤近墨者黑”讲的也都是类似的道理。
大二的时候我开始接触到 RSS开始有意识地掌控我的信息源。卸载了知乎关闭了所有算法驱动的信息推送流。我订阅的信息源主要有两大类编辑精挑细选的文章和优秀作者或优质站点的文章。我认识到自己的时间很值钱我不希望把时间浪费在没有意义和低质量的信息以及一些琐事上。
我们生活的时代早已不是那个信息匮乏的年代,现在的人们普遍都面临信息过载的问题。但是问题是,咨询类 App 给你推荐的 xx 国新闻xx 地的 xx 奇葩事件,与你有何干系?浏览这些信息能得到什么?满足人类与生俱来的猎奇心理,让你变得“学富五车”吗?
我发现一个很有趣的现象:有那么一群人,尤其是出租车司机和中年男性,喜欢对近期的事件、政治或是某个特定领域高谈阔论,试图吹嘘自己对这个领域有多么多么了解。典型的无非出租车师傅指点江山,大谈特谈世界局势,以及我教张小龙做微信系列。
马斯洛对人的需求的金字塔模型中,其中有一层就是被认同的需求,人们渴望获得认可,需要被认可来体现自己的价值。之前有一名同事和我聊过类似的话题,他比我大五六岁,家里已经安排了车房,还有不少不错的相亲对象,但是他执意要留在一线城市,留在一线大厂。他说他现在工作完全不是为了钱,而是希望能被认可。
我挺钦佩这个同事,因为他知道自己做了什么,在做什么,想做什么。某种程度上来说,是“活得明白”。
相较而言同期一起工作的另外几名同事虽然有更好的学历更优秀的履历更强的工作能力但是他们更像是依仗着自己的硬实力和资本在随波逐流。C9 高校本硕学历,一线城市大厂工作,相当耀眼。但是他们走到这里,可能并没有什么漂亮的逆袭,有什么决定命运的重要转折,人家只是到了顺风顺水的得到了保研资格就读了个研,刚好有用人单位看上了就进了大公司。但是在与他们聊天的过程中,我发觉他们对自己,对世界,对人生并没有什么比较深刻的认知或者想法,对很多问题依然很迷茫,平时也没有什么热爱的事业,给我的感觉就是很干巴巴的,很浅薄的一个灵魂,在一个光鲜亮丽的身体里。
你可能会说,人家只是一个普通人,只是起点比我们其他人更高罢了。或者你会说,我完全只是嫉妒人家所拥有的,尝试安慰自己罢了。
这些观点都没有错,我也并不试图去佐证我的观点是对的。我只感觉可惜,人家明明可以,但是没有。
如果是外人,我大可以当个没事人,安心当一个吃瓜群众。但是当这个人是我的朋友,我开始犹豫,是做个局外人,还是推他一把。
后面这个问题困扰了我数年,直至我现在本科毕业,我还是不能给出一个确切的答案。
曾经有过尝试,但是似乎并没有什么效果。可能正如鲁迅先生所说的那样吧,把屋子里昏睡的人吵醒,他们不会感谢你,只是会愤怒为什么打搅他们。一切可能只是我的自作多情。
有一张图很有意思,三个人分别站在不同高度的书上,看到的是截然不同的风景。书最少的那个人看到的都是矮墙地下的花花草草,书稍微多些的人跨国墙头看到了远处阴云密布的天空,眼前一片黑暗。而最右侧的人站在一摞高高垒起的书上,看到了云层之上璀璨的星空。
这张图显然是在暗指读书多少决定了眼中世界的模样。我曾经也是认为对这个世界的认知越通透的人越厉害,这也是以前我 judge 别人的主要标准。不过后面我发现生活中有一类人即便并没有深刻的思想但是仍然能让我感觉很“Wow”。后面发现这类人有一个共同的特征那就是他们都有各自热爱的人或事或是生活本身。
这个热爱显然不是简单的“我喜欢 xxx”那只是喜欢称不上热爱。我不知道应该给热爱下一个什么样的定义但是有一点是可以确定的心怀热爱的人眼里有光。他们愿意去为了自己热爱的事业去付出去不断尝试去不断深入学习不断进步。
我敬佩一切心怀热爱的人,他们眼里有光,拥有可以跨越苦难的人生勇气。
如果有人问起我:人的大学四年应当怎样度过?我想我会在高尔基原话的最后,再加上一句:找到你热爱的事业吧!
---
## 关于兴趣
KnowYourself 有[一期文章](https://www.zhihu.com/question/299527411)谈到了人们对于“兴趣”的几个误区
**误解 1“不需要做什么我就可以对某件事物一直感兴趣。”**
**误解 2 “兴趣一定可以被‘找到’。”**
我曾经也认为兴趣是与生俱来的,一定可以被找到的,记忆中我很小的时候就对科技类的理工类的东西很感兴趣,这些兴趣驱使着我不断学习这些知识和技能,一路走到今天。后面发现这并不是我与生俱来的刻在 DNA 里面的某种原始本能,也不是某种“一见钟情”,小时候那些高质量的动漫节目、书籍、电影,都对我产生了深远的影响。
兴趣是需要被培养的,是可以培养的。我觉得兴趣更像是一段友情,或是一团火,需要投入时间和精力,予以恰当的方式,才能让其不断发展。不断尝试,不断突破,取得进展,可以获得正向的反馈,从而不断学习,不断进步。
---
## 短平快高刺激的短视频会不会影响到兴趣的培养
我的观点是:会
兴趣需要培养,而培养需要长时间持续的投入。
想要真正觉得一些事情“很有意思”,产生“反复做这件事都不会厌倦”的状态,需要我们有“能力”足够充分地感受到这件事的美妙之处。用拥有这个能力需要持续投入,而品尝到美妙之处也需要长期的投入。
习惯了高频高刺激的短视频后,是很难投入到这样长期的活动当中的。我认为短视频会消磨一个人对于事物的兴趣。
---
## 几个曾经不以为然后来恍然大悟的古话:
* 知足常乐
* 学而不思则罔,思而不学则殆
记忆中人生的高光时刻与记忆中最开心的时刻并不是一致的。有付出但颇具意外的收获更能让我得到满足感,中考体育的超常发挥,数学建模的国赛获奖,这些事件能够带给我幸福感和满足感远远超过其他事件。突然理解了为什么有些人会主动去追求“生活中不期而遇的小确幸”。降低期待值才是获取幸福的捷径。
---
## 关于“人生苦短,及时行乐”
很多人都只看见了后面这半句话,认为及时行乐最重要。奇葩说有一期节目就是对“做人最重要的就是开心吗?”这个命题做辩论,此处不再讨论这个话题。依我来看,其实这句话的可以以另一个姿势打开。
“人生苦短”是预设条件,是假定的事实,“及时行乐”这半句算是一个解决方案。
如果我们愿意接受这个预设条件,那么“及时行乐”算是一个可能的解决方案,但并不是唯一的。
读书,旅游,欣赏电影,都可以让苦短的人生拥有更多精彩。
乔治•马丁在他的《冰与火之歌》一书中说过:“读书可以经历一千种人生,不读书的人只能活一次。”
---
## 感谢
感谢时间线上每一个过去的自己,每一个人生十字路口做出的这些决定塑造了今天的我自己
感谢时间线上每一个人,见贤思齐焉,见不贤而内自省也。

View File

@@ -1,154 +0,0 @@
---
title: 前端静态资源加载的一些优化
date: 2022-05-06
description: 最近在折腾优化博客,由于全站都是部署在 Netlify、Vercel 的 CDN 上,都是海外节点,国内访问延迟高,在想办法优化下访问速度和体验。这篇文章来探讨下前端 CSS 和 JS 资源的加载。优化目标主要就两个1. 尽可能快但是不希望我引入的辅助性第三方库影响到页面体验不要阻塞主要内容渲染。2. 为了快第三方静态资源肯定是上 CDN但是要有容灾CDN 挂了要能 fallback 到其他 url
categories:
- 技术
tags:
- 技术
- 前端
- CDN
- JavaScript
---
<!-- # 前端静态资源加载的一些优化 -->
最近在折腾优化博客,由于全站都是部署在 Netlify、Vercel 的 CDN 上,都是海外节点,国内访问延迟高,在想办法优化下访问速度和体验。线路部分的优化可以看另一篇文章[国外静态网站托管服务商国内速度对比及线路优化](https://blog.colinx.one/posts/%E5%9B%BD%E5%A4%96%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99%E6%89%98%E7%AE%A1%E5%9C%A8%E5%9B%BD%E5%86%85%E9%80%9F%E5%BA%A6%E5%AF%B9%E6%AF%94%E5%8F%8A%E7%BA%BF%E8%B7%AF%E4%BC%98%E5%8C%96/)。这篇文章来探讨下前端 CSS 和 JS 资源的加载。
优化目标主要就两个:
* 尽可能快,但是不希望我引入的辅助性第三方库影响到页面体验,不要阻塞主要内容渲染
* 为了快第三方静态资源肯定是上 CDN但是要有容灾CDN 挂了要能 fallback 到其他 url
## 静态资源异步加载
`prefetch``preload`这些预加载技术暂且不谈,博客站点没那么多资源。这里主要是用`async``defer`来控制脚本异步加载,以避免阻塞 DOM 解析和页面渲染。
使用`async`异步加载,对于[pangu](https://github.com/vinta/pangu.js/)这种会影响到内容呈现的使用`async`,对于统计类第三方库使用`defer`延迟加载,到 DOM 加载完再执行
有些第三方库需要手动 init这样就不能使用`defer``async`关键字加载资源了,**`defer``async`关键字只适用于远程资源**,本以为把远程资源的`<script>`和内嵌在 HTML 里用来 init 的`<script>`都加上`defer`就可以利用它顺序加载的特性解决这个问题结果发现不是这样的。。。。异步打乱脚本执行顺序init 脚本不等待资源下载完毕会先执行。利用好`onload`事件可以解决这个问题。
before
```html
<script src="https://cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
<script>
pangu.spacingElementByClassName('post');
pangu.spacingElementByTagName('p');
document.addEventListener('DOMContentLoaded', () => {
pangu.autoSpacingPage();
});
</script>
```
after
```html
<script>
function panguSpaing() {
pangu.spacingElementByClassName('post');
pangu.spacingElementByTagName('p');
document.addEventListener('DOMContentLoaded', () => {
// listen to any DOM change and automatically perform spacing via MutationObserver()
pangu.autoSpacingPage();
});
}
</script>
<script async onload="panguSpaing()" src="https://cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
```
除了`onload`还有`onerror`,还可以利用`onerror`事件在资源加载失败时 fallback 到其他 CDN详见下文
这里跑了个测试看下优化前后的差距
**优化前**
![image-20220506193639029](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205062117479.png)
![image-20220506193800266](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205062117127.png)
First Contentful Pain Time 在 1.5s,整个页面到 1.5s 才能可见DOM 加载总时间达到了 2.5s
本来我都已经把首页不需要加载的三方库都拿走了,但是还剩下一个,这个用于前端性能监控的 js 阻塞了渲染,挂的是腾讯云的 CDN国内快到飞起国外就卡到不行作为对比上图里从 jsdelivr 加载的 js 也是快到飞起,墙内就慢得一批)
**优化后**
![image-20220506193652188](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205062117498.png)
优化后页面没有再阻塞0.8s 页面就可用了,总 DOM 加载时间只有 1.5s,相较之前简直直接起飞。
![cn](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205071426038.png)
国内某检测平台的结果也显示优化效果明显
## 静态资源 Fallback 加载
国内好用的静态资源 CDN 还真没有新浪那种只提供那么几个热门的库完全不符合需求BootCDN 炸了不是一次两次,字节 CDN 的资源 URL 有够 uglyURL 里面还带节点信息多半后面会出问题。360 奇舞 CDN 之前也换过域名、备案出问题,感觉每一个能省心用。七牛的目前看上去还行,也不知道后面会不会出什么幺蛾子。。。为了稳妥起见 + 照顾全球的访客,还是优先使用的 cloudflare 和 jsdelivr 的 CDN
网站主要三方库都是通过 jsdelivr 和 cloudflare 引入的,但是毕竟是海外的节点不知道哪一天就被墙了,所以还要为墙内的访客准备一个 fallback 方案。这里利用到`script`标签的`onerror`事件
现代浏览器都支持`script``link`标签上的`onload``onerror`事件,详细支持情况可以查看这里
[https://pie.gd/test/script-link-events/](https://pie.gd/test/script-link-events/)
关于`onerror`,中文互联网上有好几篇文章说他会捕获`script`标签里的代码的执行错误。。。简直离谱。稍微查下 MDN 之类的文档就可以发现这玩意本来就是只捕获资源加载错误的
> The onerror event is triggered if an error occurs while loading an external file (e.g. a document or an image).
>
> https://www.w3schools.com/jsref/event_onerror.asp
利用好这个特性,就可以实现在资源加载失败时 fallback 从另一个 url 加载资源。
```html
<script>
function fallbackJSloader(url, loadedEvent) {
console.log('Error loading asset, using fallback url');
console.log('load asset from', url);
let script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
script.async = true;
if (loadedEvent)
script.setAttribute('onload', `${loadedEvent}()`)
document.body.appendChild(script);
}
</script>
<script defer onload="init_gitalk()"
onerror="fallbackJSloader('https://cdn.staticfile.org/gitalk/1.7.2/gitalk.min.js','init_gitalk')"
src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js">
```
CSS 的 fallback 加载同理,此处不再赘述
优化后如图,在开发者工具中手动 block 资源网站,可以自动 fallback 从另一个 url 加载资源,这下网站的可用性又提升了一点点🤏哈哈哈
![66230832-3581-42DF-9F2F-B817E88DAF4D](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205062133393.png)
## 扩展阅读
* [消除阻塞页面渲染的资源](https://www.w3cplus.com/performance/remove-block-rendering.html)
* [defer 和 async 的区别](https://segmentfault.com/q/1010000000640869)
* [动态加载 css](http://lengyun.github.io/js/3-2-2dynamicAddCSS.html#%E4%B8%8E%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BDjs%E7%9A%84%E5%8C%BA%E5%88%AB)
**网站 profile**工具
* [https://www.webpagetest.org](https://www.webpagetest.org)

View File

@@ -1,180 +0,0 @@
---
title: 国外静态网站托管服务商国内速度对比及线路优化
date: 2022-05-05
description: 主要探讨 Netlify、Vercel、Cloudflare Pages、Azure Web Hosting 在国内的速度对比及线路优化
categories:
- 技术
tags:
- 技术
- Netlify
- Vercel
- 优化
---
# 国外静态网站托管服务商国内速度对比及线路优化
本文主要探讨 Netlify、Vercel、Cloudflare Pages、Azure Web Hosting 在国内的速度对比及线路优化
以我的博客站点 blog.colinx.one 为例,使用 hugo 构建,选用的模板也很轻量没有太多奇奇怪怪的第三方组件,使用这些静态服务托管主要图个方便,不用备案而且基本流量不限。
分别挂了四个服务商的 CI, 每次更新 Git 仓库都会自动触发构建。分别对四个默认分配的域名进行检测。
## 四家服务商默认设置国内速度测试对比
**Netlify**
[colins-blog.netlify.app](https://colins-blog.netlify.app)
![Netlify 在国内的速度检测](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191719.png)
**Vercel**
[colinx-blog.vercel.app](https://colinx-blog.vercel.app)
![Vercel 在国内的速度检测](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191728.png)
**Azure**
[nice-glacier-095b09e00.1.azurestaticapps.net](https://nice-glacier-095b09e00.1.azurestaticapps.net)
![Azure 在国内的速度检测](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191733.png)
**CloudFlare Pages**
[colinx-blog.pages.dev](https://colinx-blog.pages.dev)
![Cloudflare Pages 在国内的速度检测](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191738.png)
emmm Cloudflare 这在国内的速度可太拉胯了,虽说可以通过自选节点的方式曲线救国,但想了想还是算了。利用好其他三家的节点应该足够国内大部分用户访问。
---Update on 2022-05-22---
又重新测了一下 cloudflare 的速度,这次倒是一片绿,看来还是要运气,不太稳定。电信和联通都嗖嗖的,移动基本上全挂了。。。
![image-20220522190417139](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205221906656.png)
这次能连接的节点主要就两个 172.66.45.34 和 172.66.46.222。
---end---
筛选后可用的节点
```
Netlify
18.140.226.100 amazon SG
54.255.56.197 amazon SG
206.189.46.168 digital ocean SG
Vercel
显示caronet据说为AWS节点 (76.76.21.21 Anycast)
76.76.21.241
76.76.21.98
76.76.21.93
76.76.21.142
76.76.21.22
76.76.21.61
76.76.21.164
Azure
52.175.64.109 US MS
13.70.37.114 HK MS
51.124.12.35 UK
```
## 优化前
优化前使用了 dnspod 的解析服务做 4 个 A 记录的负载均衡,免费版套餐单记录单线路只能设置最多两个负载均衡记录,我这个是之前开通专业版套餐设置的,套餐到期了原有记录依旧保留,所以能设置四条同线路 A 记录负载均衡。
```
before
206.189.46.168 digital ocean %netlify
76.223.126.88 %vercel
18.140.226.100 amazon %netlify
18.139.201.98 amazon %netlify
```
检测一波,红了好几个省份
![image-20220504222718997](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191745.png)
慢点可以接受,线路不通可不能忍。之前粗略筛的几个节点,如今过了快两年了,线路估计也发生了变化,简单跑了一下这几条,发现这个线路现在的状况实在不咋地
![trace](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191749.png)
这圈子兜的也太大了些。。。哦原来是 Digital Ocean 的节点啊,那没事了。
亚马逊的节点稍微好些,没有绕道日本这么离谱的行为
![trace](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191834.png)
再来看看 vercel 节点的表现
![trace2](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505191933.png)
这里是自选的节点,直连东京节点,好评
![trace3](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505192022.png)
但是默认的 AnyCast 节点这个路由就稍微绕路了,看来大中华区还是得自己动手调整下线路
## 优化后
after
![image-20220505190011635](https://blog-1301127393.file.myqcloud.com/BlogImgs/20220505192417.png)
检测优化过程就不赘述了,都是拿几个基本的工具`ping``tcping``httping``traceroute`还有上文的全国网速检测网站对那几个节点挨个检测,直接上结论:
1. Vercel 的 Anycast 基本上都是路由到日本,但是同一个地方可能会被路由到不同的路线,比如有些 IP 从上海出口转日本东京,有些是从广东出口转日本
2. Netlify 的节点主要是在新加坡,提供商有 AWS 和 Digital Ocean实测后者的节点经常性抽风国内流量过去会绕个大圈子还是 AWS 的靠谱些
3. Azure 的静态网页托管服务现在是免费的,带宽和流量啥的妥妥够用,不过开账户有门槛,我是用 Github Education Pack 在 Azure 开了个 Azure for Students 订阅,每年 100 刀额度,到期可续
4. Azure 能用的就香港节点,其他都是去往北美和欧洲的,直接 pass。对电信友好移动和联通很不友好饶了一大圈
5. AWS 的节点对移动和联通挺友好,对电信支持略差
6. Vercel 节点也是对移动和联通友好些
其他附加信息
1. Netlify 可自定义证书Vercel 不可以。所以要保证 vercel 的服务器可以把域名解析到自家服务器,不然没法续签 SSL 证书
2. Cloudflare 的 CI 啥的做的挺垃圾,起步晚,很多东西不完善
3. Netlify 可以安装插件,推送 sitemap 和网站安全性检测这些我感觉挺好使
最终线路设置
* 电信和其他走 Azure 与 Vercel
* 移动联通走 Netlify 的 AWS 节点,以及 Vercel 在 JP 的节点
* 海外走 Vercel 的 Anycast IP
## 常用线路检测与优化工具链接
Best Trace
https://apps.apple.com/us/app/best-trace/id1037779758?l=zh
IP 批量查询
http://www.jsons.cn/ipbatch/

View File

@@ -4,12 +4,13 @@ date: 2019-09-12
lastmod: 2020-04-29
description: 在一次编译 VSCode 的项目中,跨越千山万水,解决重重依赖后,终于来到了编译环节。然而才开始没多久,就出现了一个匪夷所思的报错。
categories:
- 技术
- 踩坑记
tags:
- 服务器
---
在一次编译 VSCode 的项目中,跨越千山万水,解决重重依赖后,终于来到了编译环节。然而才开始没多久,就出现了一个匪夷所思的报错。
谷歌一番,又到 /var/log/message 里查看了一番系统日志,竟然说是内存爆满,进程被 kill 了。想来我阿里云的那台服务器内存的统计曲线基本就没超过一半,今儿个怎么会出现内存爆掉的情况。又是一顿折腾发现这台阿里云的机子 Swap 大小竟然为 0Swap 为物理内存达到一定临界值之后,系统将磁盘的一部分空间作内存使用,一般在 Windows 系统上都是由系统自动管控,新安装的 Linux 桌面发行版也会在安装时提醒用户设置,这坑爹的阿里云在安装的时候没给我分配 Swap 分区?

View File

@@ -1,71 +1,57 @@
---
title: 我的 RSS 方案与心得
title: 我的RSS方案与心得
date: 2021-05-10
lastmod: 2021-12-03
cover: https://www.gethow.org/wp-content/uploads/2013/07/feed-297x140.jpg
description: 使用 RSS 已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端,安卓手机使用 FeedMe 订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重,我对 RSS 有了更高的期望和要求,便开始了对如何构建更高效、更易用的 RSS 方案的探索。
draft: false
lastmod: 2021-05-10
description: 使用RSS已经一年有余这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用TTRSS做服务端安卓手机使用FeedMe订阅主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用Feed43或Feedburner压制的源。随着我逐渐加大RSS阅读在我闲暇、琐碎时间内的比重我对RSS有了更高的期望和要求便开始了对如何构建更高效、更易用的RSS方案的探索。
categories:
- 杂记
- 指南
tags:
- RSS
- Docker
- Github
- 代理
categories:
- 杂记
- 技术
---
<!-- # 我的 RSS 方案与心得 -->
# 我的 RSS 方案与心得
使用 RSS 已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端,安卓手机使用 [FeedMe](https://github.com/seazon/FeedMe) 订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重,我对 RSS 有了更高的期望和要求,便开始了对如何构建更高效、更易用的 RSS 方案的探索。
使用 RSS 已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端,安卓手机使用 FeedMe 订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重,我对 RSS 有了更高的期望和要求,便开始了对如何构建更高效、更易用的 RSS 方案的探索。
## 0x01 借助 RSSHub 订阅各种热门冷门网站
## 借助 RSSHub 订阅各种热门冷门网站
[RSSHub](https://docs.rsshub.app/) 是个很赞的项目,它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知,网站提供 RSS 并不能为他的站点带来更高的收入,反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。
RSSHub 是个很赞的项目,它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知,网站提供 RSS 并不能为他的站点带来更高的收入,反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。
## 0x02 获取 Feed 文章全文
## 获取 Feed 文章全文
部分 RSS 源并不会在 xml 文件内提供文章全文,说白了是想让你点进他们的网站去浏览,这样网页上的广告才有可能被你点击。解决的方案有很多,方便起见我使用了 TTRSS 的插件 Readability 和 Mercury。两者都不能完美适配所有站点同时启用这两者以实现互补。
## 0x03 无障碍阅读繁体中文 Feed
## 无障碍阅读繁体中文 Feed
发现了几个质量不错的繁体中文信息源,主要是台湾的站点,如泛科学。由于文字和部分两岸文化差异,直接阅读繁体中文的文章有些困难。我的解决方案是使用 OpenCC 简繁转换服务它能够对可映射的简繁汉字以及同一事物的两岸不同的表述进行翻译输出的简体中文版文章基本可以无障碍阅读。Awesome-TTRSS 内有集成相应的插件和服务程序。
不过原作者是使用 node.js 编写的服务端,翻译数据库得不到及时更新,如翻译后还是写的是`义大利`而不是`意大利`。而且 docker image 体积 100+M内存占用也较大。我在考虑用 Go 语言重写 OpenCC 的服务端并兼容 TTRSS 的 OpenCC 插件,并加入 CI 自动从上游同步翻译数据库。
## 0x04 为不支持 RSS 的网站自制源
## 为不支持 RSS 的网站自制源
繁茂如 RSSHub 也不能保证拥有所有站点的 RSS 源。对于自制源,网上的方案大多数为使用 Feed43 和 Feedburner但是人家是商业服务虽然使用确实方便但说到底还是为了商业。白嫖用户限制多不说天知道哪天会有 break change 或者直接被墙或者跑路。最稳妥的做法还是自建。
手写爬虫程序简单灵活,不过后期维护难度较高而且难以复用。对于我想要订阅而有没有现成的源的网站,我的解决方案主要是两个:
### 1. 为 RSSHub 编写目标站点的规则,并 Pull Request 申请合并
### 为 RSSHub 编写目标站点的规则,并 Pull Request 申请合并
RSSHub 除了提供众多现成的各类站点的 RSS 规则之外,也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 JavaScript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支,如 CQUT 的教务处通知和[知乎的用户文章列表](https://docs.rsshub.app/social-media.html#zhi-hu-yong-hu-wen-zhang)
RSSHub 除了提供众多现成的各类站点的 RSS 规则之外,也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 Javascript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支,如 CQUT 的教务处通知和知乎的用户文章列表。
### 2. 使用 Huginn 为目标站点自制源
### 使用 Huginn 为目标站点自制源
[Huginn](https://github.com/huginn/huginn) 是一个强大的 [IFTTT](https://sspai.com/post/25270#!) 应用,用它来生成 RSS 源简直是大材小用(主要是他动辄 200M 的内存占用)。不过某些情况下我需要监视特定站点并在内容变化时得到通知,个人向为主,这类就不适合写 RSSHub 的规则。
Huginn 是一个强大的 IFTTT 应用,用它来生成 RSS 源简直是大材小用(主要是他动辄 200M 的内存占用)。不过某些情况下我需要监视特定站点并在内容变化时得到通知,个人向为主,这类就不适合写 RSSHub 的规则。
使用门槛比 RSSHub 略低,可视化界面还是比较友好的,不过新手上手还是会有点困难,了解了 Huginn 的工作原理和基本的 Liquid 语法之后就手到擒来了。
### 3. 使用 feed43 和 rss-proxy 这类可视化工具自助生成 RSS 链接
手写解析规则还是太麻烦,很多网页结构很简单根本没必要单独花时间写一堆解析规则,而且有些时候只是想临时订阅一段时间或是订阅个很小的网站,不想大费周章,选择 feed43 这类工具不失为一个轻量又便捷的选择。不过[feed43](https://feed43.com/)对免费账户创建的 RSS 并不保证稳定,时常无法连接甚至直接失效。在 Github 上发现一个不错的替代品[rss-proxy](https://github.com/damoeb/rss-proxy/),一个可视化的,快速自助生成站点 RSS 链接的工具。
![rss-proxy screenshot](https://cdn.jsdelivr.net/gh/damoeb/rss-proxy/docs/rssproxy-candidates.png)
填入目标网址就可以自动解析目标网页,程序会自动检测网页上的列表内容,可以自己选择要订阅哪个列表,然后就可以生成一个 RSS 链接。生成的 RSS 链接包括的信息有目标网址、要订阅的目标列表的节点信息和输出格式RSS/ATOM也就是说rss-proxy 并不像 feed43 会把解析的规则存储在服务端,它是直接编码在 url 里面的rss-proxy 开源支持自部署不想用它提供的公用实例也可以自建迁移零门槛。rss-proxy 也支持调用无头浏览器渲染异步获取数据的网页,可玩性很高。
->>>> [rss-proxy 公用实例](https://rssproxy-v1.migor.org/),可以点击体验下,还是很方便的
使用了一段时间体验挺不错,有个小问题就是对 UTF-8 以外的编码不太友好。
## 0x05 解锁海外 RSS 源
## 解锁海外 RSS
由于众所周知的原因我国的互联网是不「互联」的。rsshub.app 部署在国外,现已基本无法直接访问。国内服务器上自建的 RSSHub 订阅如 Facebook 等国外站点更是不可行。为此我使用了 Clash 代理,并添加了一些公开的机场订阅,虽然速度和稳定性不是很高,但对于 RSS 这种需求还是绰绰有余的。又完善了一些爬墙的规则,比如对 google、facebookrsshub.app 走代理,内网地址和 CN 的 IP 直连,反爬严格的网站完全走随机节点。一番操作下来,基本可以实现全球 RSS 订阅自由了 😁
## 0x06 RSS 订阅破 CloudFlare 五秒盾
## RSS 订阅破 CloudFlare 五秒盾
如上所述,海外 RSS 源走公用机场可以解决国内的网络问题。但是很多站点会使用 CloudFlare 做 CDN 和防火墙我们使用的公用机场其实一大半都是被用作非法用途的IP 很多都在人家的黑名单里面,但凡通过那个节点访问 CloudFlare 保护的网站都会触发五秒盾防御,浏览器访问倒是没什么,但是可苦了 RSS。
@@ -79,13 +65,13 @@ google 了一番,没人写过我这个问题。。。人家都是爬虫绕过
可能的改进:匹配到 CF 节点,选择从本机连接东亚的连接较好的 CF 节点来请求目标站点的内容,可以一次解决那两个问题
以上都被我整合进了我的 Github 项目 [RSSman X](https://github.com/Colin-XKL/RSSmanX)
以上都被我整合进了我的 Github 项目 RSSManX
> [RSSman X](https://github.com/Colin-XKL/RSSmanX) 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署,整合实用组件为你带来最佳 RSS 体验
>
> **Feature简单一键部署常用组件整合自动更新支持服务健康自检支持海外站点 RSS 解锁**
> **Feature 简单一键部署,常用组件整合,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
![image-20210512190732383](https://blog-1301127393.file.myqcloud.com/BlogImgs20210512190819.png)
![image-20210512190732383](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs20210512190819.png)
感兴趣的朋友可以关注一下 🍺

View File

@@ -1,10 +1,10 @@
---
title: 打造沉浸式互联网体验「广告篇 - 上」
title: 打造沉浸式互联网体验 「广告篇 - 上」
date: 2020-02-18
lastmod: 2020-04-29
description: 继机械化、电气化、自动化的三次工业革命后,人类正迎来以互联网为载体的智能化时代。互联网与我们的生活结合得越来越紧密。除了装修房子,购置服装,优化家庭互联网体验也是提升生活质量的一个良好途径。本篇中我们将聚焦网页浏览来优化我们的互联网体验。
categories:
- 技术
- 教程
tags:
- 去广告
- 黑科技
@@ -18,7 +18,7 @@ tags:
前言
--
“上网冲浪”这样的词已经淡出公众的视野,身边的 10 后甚至 00 后都鲜有人熟悉这个词了。也许我们现在与互联网的交互并不局限于网页交互了,但我想,你也肯定不希望被自己偶然上某度查资料的时候被漫天的广告破坏了一天的心情。
“上网冲浪” 这样的词已经淡出公众的视野,身边的 10 后甚至 00 后都鲜有人熟悉这个词了。也许我们现在与互联网的交互并不局限于网页交互了,但我想,你也肯定不希望被自己偶然上某度查资料的时候被漫天的广告破坏了一天的心情。
本系列将从以下几点从易到难,逐步优化日常的网页体验。无需任何代码基础,使用文中推荐的工具,小白亦可轻松上手!
@@ -36,9 +36,9 @@ tags:
![](https://i.loli.net/2020/01/20/JgRAjFCdDpwreBU.png)
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200120213009.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200120213009.png)
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121223647.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200121223647.png)
这样的广告呢,虽然他的侵略性或许比以往更小了,不过还是有点碍眼。而且在某种程度上,依然可能会误导家里的老人或是小孩。为了统一家庭的互联网体验,减少不必要的麻烦,这个广告也是我们的 target。由于这个广告是嵌入搜索结果中的如果你用之前的小伎俩打算单独屏蔽这个广告对应的元素的话你就要失望了。因为他会连带着屏蔽所有的搜索结果。这显然是不可取的。下面我们要介绍另外两个工具。
@@ -52,22 +52,22 @@ tags:
![](https://i.loli.net/2020/01/21/ZYhCx2Xzd9yABcI.png)
安装好油猴插件后,你可以在 [Greasyfork.org](https://greasyfork.org/zh-CN/) 上下载各种黑科技般的脚本。安装成功后,油猴会在你进入符合条件的网页时自动启用对应的脚本。比如,你安装了 AC 的这个脚本,而这个网页是适配了某度的,那么当你进入某度的网页时,油猴就会自动启用这个脚本。快来领取属于你的纯净版度度吧。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121231059.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200121231059.png)
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素? 对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
### 使用浏览器自带的阅读工具
苹果很早就想到了这一点Safari 浏览器可以识别当前的的页面是否是一个结构简单文字为主题的页面。在符合条件的网页上Safari 会提示你使用阅读工具来优化页面,以获得更好的阅读体验。当然,你也可以手动启用他。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121233256.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200121233256.png)
微软也不甘示弱,在随 Win10 推出的 Microsoft Edge 上,也内置了阅读工具。你可以在地址栏的右边找到他。
![](https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121233739.png)
![](https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20200121233739.png)
_[注:区别与 2020 年新的基于 Chromium 内核的新 Edge 浏览器,此处指的是老版 Edge HTML 内核的 Microsoft Edge 浏览器]_
### 使用第三方阅读工具 - [简阅 SimpRead](http://ksria.com/simpread/)
![](https://i.loli.net/2020/01/21/ZcsEIv8wBfjOmVa.png)
也许你买不起苹果,受不了 Win10你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅正如他的名字旨在为你提供简约的阅读视图。作者为了实现“简单阅读”这个小目标主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
也许你买不起苹果,受不了 Win10你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅正如他的名字旨在为你提供简约的阅读视图。作者为了实现 “简单阅读” 这个小目标, 主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
恭喜你!利用上面介绍的几个工具,你已经可以在国内互联网环境中求的一份净土了。如果你感兴趣或是强迫症患者,欢迎前往 **打造沉浸式互联网体验【广告篇 - 下】**
恭喜你!利用上面介绍的几个工具,你已经可以在国内互联网环境中求的一份净土了。如果你感兴趣或是强迫症患者,欢迎前往 **打造沉浸式互联网体验 【广告篇 - 下】**
温馨提示:下篇介绍的内容的内容将略有一点偏硬核,需要一点点的动手能力哦~

View File

@@ -4,7 +4,7 @@ date: 2020-03-10
lastmod: 2020-04-29
description: 随着树莓派上部署的项目越来越多,每次使用 IP + 端口 访问也越来越不方便。考虑使用 Apache 来特定子域名跳转到不同端口对应的不同应用。
categories:
- 技术
- 踩坑记
tags:
- 服务器
- 树莓派

View File

@@ -1,124 +0,0 @@
---
title: 论如何下载任意网站视频
date: 2022-05-09
lastmod: 2022-10-25T04:26:12.121Z
description: 视频已然成为当今互联网上信息传播的一个重要载体,有时会需要下载一些网上某个站点的视频插入 PPT或用作视频素材无论是自己用或是给朋友帮忙掌握一些使用的下载视频的小技巧总是不会错的这里分享一些自用的小技巧包括热门站点下载工具以及应对冷门网站视频下载的技巧应该可以覆盖 99.9% 的视频下载场景
draft: false
categories:
- 技术
- 指南
tags:
- 视频
- Linux
- 前端
- FFMPEG
---
<!-- # 论如何下载任意网站视频 -->
视频已然成为当今互联网上信息传播的一个重要载体,有时会需要下载一些网上某个站点的视频插入 PPT或者视频素材无论是自己用抑或单纯是给朋友帮个忙掌握一些使用的下载视频的小技巧总是不会错的这里分享一些自用的小技巧包括热门站点下载工具以及应对冷门网站视频下载的技巧应该可以覆盖 99.9% 的视频下载场景
## 热门网站电影/电视剧下载
这种其实建议直接找对应资源而不是从源站点下载,百度云,阿里云盘等找资源的方式我就不再赘述了,网上教程多的是。如果是电影资源或者是欧美、日韩的剧,可以搜索 BT 资源自行下载。
这里安利一个油猴脚本:[豆瓣资源下载大师](https://greasyfork.org/zh-CN/scripts/329484-%E8%B1%86%E7%93%A3%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%B8%88-1%E7%A7%92%E6%90%9E%E5%AE%9A%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1-%E9%9F%B3%E4%B9%90-%E5%9B%BE%E4%B9%A6%E4%B8%8B%E8%BD%BD),可以在豆瓣的影视详情页右侧显示有资源的站点,非常方便
![image-20220509144533549](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548956.png)
分享下个人常用的下载站点:
* 欧美资源下载:[1337X](https://www.1337x.to/)
* 欧美资源下载:[海盗湾](https://piratebay.live/)
* 动漫资源下载:[ACG RIP](https://acg.rip/?term=JOJO%E7%9A%84%E5%A5%87%E5%A6%99%E5%86%92%E9%99%A9)
* 中文字幕下载:[字幕库](http://zimuku.org)
个人推荐的下载工具:
* [qBittorrent](https://www.qbittorrent.org):强推,老牌专业 BT 工具,有图形化界面,[支持 Docker 部署](https://hub.docker.com/r/linuxserver/qbittorrent)且带 Web 界面
* [aria2](http://aria2.github.io):强大的命令行下载工具,灵活但上手成本略高,可[自行部署 Web GUI 界面](https://ariang.mayswind.net/zh_Hans/),也可使用[公开版本 demo](http://ariang.mayswind.net/latest)
* [Motrix](https://motrix.app):高颜值跨平台的下载工具,有漂亮的 GUI 界面,底层基于 aria2
Tracker 列表:
* 一个独立的收集 trackerlist 的页面:<https://trackerslist.com/#/zh>
* 通用 tracker list[ngosang/trackerslist](https://github.com/ngosang/trackerslist)
* 动漫资源 tracker list[animeTrackerList](https://github.com/DeSireFire/animeTrackerList) (๑•̀ㅂ•́)و✧
## 热门站点普通视频资源下载
如果是 UGC 内容,比如 B 站用户上传的视频,那么 BT 通常是没有资源的,需要单独从源网站下载。不过既然是热门站点,都有很多人造过轮子了,这里推荐几个
**[YouTube-DL](https://github.com/ytdl-org/youtube-dl)**
一款强大的命令行视频下载工具,别看人家名字只写了 youtube但其实国内爱优腾都是支持的。命令行调用也非常简洁[知乎也有教程](https://github.com/ytdl-org/youtube-dl)需要的话可以瞅瞅。
**[YT-DLPYouTube DownLoader Plus](https://github.com/yt-dlp/yt-dlp)**
YouTube-DL 的一个分支,包括一些 bug 修复和增强的特性
**[Lux原名 Annie](https://github.com/iawia002/lux)**
Golang 编写的一个视频下载工具,同样支持国内站点
**[硕鼠](https://www.flvcd.com/index.htm)**
很早之前就出的一款免费视频下载合并工具主要针对国内视频网站但是像腾讯视频这种之前发过律师函人家就迫不得已取消了支持。Windows 版,有界面,对于不是那么热门但是稍微又有点名气的网站支持较好
## 冷门站点普通视频资源下载
冷门站点的资源得我们自己动手了,不过利用浏览器的开发人员工具还是很容易获取的资源的。右键找到开发人员选项打开开发人员工具,可以点击左上角的按钮选择网页元素,找到`<video>`标签,里面一般会有一个链接地址,复制地址打开即可。
这种简单的视频嵌入很容易下载,浏览器工具也很容易嗅探到。比如可以使用`专业视频下载工具`插件,你可以[访问 360 插件中心下载](https://ext.chrome.360.cn/webstore/detail/noaehhegaeigebicejggjdecdkfphced)。这种工具很多,这里不再赘述
链接后缀为`mp4`的一般来说都是说明该网页上面的视频只是从那一个文件加载的,没有经过分片和其他处理。如果没有后缀名,或者是`flv``ts`或者链接含有`m3u8`字样的,说明该网页的资源是经过分片的,需要我们动点手段。
## 冷门站点 m3u8 动态分片视频资源下载
以中国庭审网的庭审录像视频为例,打开开发者工具定位到视频的部分发现 video 标签里面的 url 很奇怪,访问该链接也并不能访问到有效的视频。这种网页一般都是通过 m3u8 来下发分片文件的信息
![image-20220509151813071](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548957.png)
打开开发者工具的网络选项卡,监听网络活动,点击播放视频,会多出来很多条目分别代表每一个网络请求。在搜索框输入 m3u8 来进行过滤。定位到该请求后可以在新标签页打开,保存这个 m3u8 文件。
![image-20220509144410278](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548958.png)
之后我们可以利用 ffmpeg 载入这个 m3u8 文件并进行合并,如有需要可一并进行转码操作
```shell
ffmpeg -i xxxx.m3u8 -c xxxx.mp4
```
如果报错提示不支持的 protocol那么需要再加个参数让 ffmpeg 使用 http 下载
```shell
ffmpeg -protocol_whitelist concat,file,http,https,tcp,tls,crypto -i xxxx.m3u8 -c copy xxxx.mp4
```
接下来等待命令跑完,我们就可以得到需要的视频文件了。
其他常用处理命令
使用`-i`参数读取文件,查看详细参数
```shell
ffmpeg -i xxxx.mp4
```
使用 ffmepg 提取视频中的音频部分,方便后续处理。比如要生成字幕或是转写为文本,省的上传几百兆的视频文件。[网易见外工作台](https://jianwai.youdao.com/)做这些很方便,而且免费额度也很足,安利一波
```shell
ffmpeg -i xxxx.mp4 -vn -codec copy xxxx.aac
```
![image-20220509153021601](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548959.png)
解析并下载 m3u8 视频的其他方案
* 使用硕鼠解析https://www.flvcd.com/index.htm
* 使用 Chrome 插件:[CoCoCut](https://chrome.google.com/webstore/detail/video-downloader-cococut/gddbgllpilhpnjpkdbopahnpealaklle)[猫抓 (cat-catch)](https://github.com/xifangczy/cat-catch)
* 使用油猴脚本:[m3u8-downloader](https://greasyfork.org/zh-CN/scripts/440577-m3u8-%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD-vip%E8%A7%A3%E6%9E%90%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD-%E7%BD%91%E7%AB%99%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD),配套工具[地址](https://github.com/Momo707577045/m3u8-downloader)
* 使用软件:[NeatDownloadManager](http://www.neatdownloadmanager.com/index.php/en/)
- - -
以上

View File

@@ -4,13 +4,15 @@ date: 2019-03-12
lastmod: 2020-04-29
description: 从两年前第一次听说黑苹果,到暑假第一次装黑苹果,再到几个月前成功装上黑苹果,一路走来,收获颇丰。在这里将 Dell G3 大致安装过程记录下来。
categories:
- 技术
- 教程
- 笔记
tags:
- 黑苹果
- Apple
---
* Last Update: April 9th,2019
从两年前第一次听说黑苹果,到暑假第一次装黑苹果,再到几个月前成功装上黑苹果,一路走来,收获颇丰。在这里将 Dell G3 大致安装过程记录下来。
配置Dell G3 3579 Intel i5-8300H UHD630 GTX1050Ti
@@ -82,7 +84,7 @@ V2.2 @2019.3.15 USB 端口修补
V2.3 @2019.3.15 修补声卡
--------------------
用了一段时间发现之前弄好的声卡驱动只能外放,插上耳机就没声音了。经过一番探索,大致了解到 Layout-id 是布局文件,记录了不同的端口之间的映射关系。我这种情况是属于端口映射不当,耳机孔的输入与输出没能够正确映射。改了下声卡注入的 Platform-ID解决了问题。当晚就用黑苹果看了个电影。Mac 的音效比较 清亮,也没有什么破音的现象,声卡驱动的很好。接下来可以放心的耍 Logic Pro X 了哈哈(当初想装黑苹果就是冲着 Logic Pro X 和 XCode 来的)
用了一段时间发现之前弄好的声卡驱动只能外放,插上耳机就没声音了。经过一番探索,大致了解到 Layout-id 是布局文件,记录了不同的端口之间的映射关系。我这种情况是属于端口映射不当,耳机孔的输入与输出没能够正确映射。改了下声卡注入的 Platform-ID 解决了问题。当晚就用黑苹果看了个电影。Mac 的音效比较 清亮,也没有什么破音的现象,声卡驱动的很好。接下来可以放心的耍 Logic Pro X 了哈哈(当初想装黑苹果就是冲着 Logic Pro X 和 XCode 来的)
> 声卡 platform-id 修改为 15外放 OK 麦克风 OK 耳机 OK
> 耳机麦克风 Failed
@@ -90,7 +92,7 @@ V2.3 @2019.3.15 修补声卡
暂告一段落
-----
黑苹果的显示 + 声音 + 网络等基本问题已经解决,虽然还 不是很完美,但是用 Logic 和 Xcode 已经没问题了,后续有时间 有需要 再继续折腾。
黑苹果的显示 + 声音 + 网络等基本问题已经解决,虽然还 不是很完美,但是用 Logic 和 Xcode 已经没问题了 ,后续有时间 有需要 再继续折腾。
Logic Pro X +USB 连接 iPad 上 Logic Remote 爽到飞起!看来不需要买 MIDI 键盘了,准备把资金换个大点的、更快的固态,把黑苹果装上去~

View File

@@ -1,10 +0,0 @@
---
title: 公开服务
date: 2022-06-16
---
这里是一些开放的服务以及一些个人作品
{{< service_list name="aaa" url="http://sg.colinx.one:10055/items/OpenServices" >}}

View File

@@ -1,30 +0,0 @@
---
title: 订阅
date: 2022-08-07
---
## 通过 RSS 订阅文章更新
将 RSS 资源地址加入到你的 RSS 阅读器中即可订阅
你可以添加这个地址来订阅所有文章
https://blog.colinx.one/index.xml
也可以使用这个地址仅订阅技术类文章
https://blog.colinx.one/categories/%E6%8A%80%E6%9C%AF/index.xml
## 订阅评论
博客评论是基于 Github Issue 的,你在某篇文章下使用 Github 账户登录进行评论后,后续所有的新评论和回复会自动发到你的邮箱,不用担心错过评论回复。
## 通过邮箱订阅文章更新
暂未开放,有足够多的需求时再考虑开放
## 通过浏览器消息订阅文章更新
使用 Push API + Service Worker 实现
暂未开放,有足够多的需求时再考虑开放

View File

@@ -1,266 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>404</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<div class="center">
<div class="error">
<div class="number">4</div>
<div class="illustration">
<div class="circle"></div>
<div class="clip">
<div class="paper">
<div class="face">
<div class="eyes">
<div class="eye eye-left"></div>
<div class="eye eye-right"></div>
</div>
<div class="rosyCheeks rosyCheeks-left"></div>
<div class="rosyCheeks rosyCheeks-right"></div>
<div class="mouth"></div>
</div>
</div>
</div>
</div>
<div class="number">4</div>
</div>
<h1 class="text">Oops. The page you're looking for doesn't exist.</h1>
<a class="button" href="https://blog.colinx.one">Back To Colin's Blog</a>
</div>
<div class="by">
Illustration by <a class="byLink" href="https://dribbble.com/shots/3965778-Cezan-404-Page-Not-Found"
target="_blank">Masoud Ardestani</a>
</div>
<style>
html,
body {
height: 95%;
margin: 0;
}
html {
font-size: 0.625rem;
}
body {
font-family: monospace;
font-size: 1.5rem;
color: #293b49;
text-align: center;
}
a {
text-decoration: none;
}
.center {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.error {
display: flex;
flex-direction: row;
justify-content: space-between;
align-content: center;
}
.number {
font-weight: 900;
font-size: 15rem;
line-height: 1;
}
.illustration {
position: relative;
width: 12.2rem;
margin: 0 2.1rem;
}
.circle {
position: absolute;
bottom: 0;
left: 0;
width: 12.2rem;
height: 11.4rem;
border-radius: 50%;
background-color: #293b49;
}
.clip {
position: absolute;
bottom: 0.3rem;
left: 50%;
transform: translateX(-50%);
overflow: hidden;
width: 12.5rem;
height: 13rem;
border-radius: 0 0 50% 50%;
}
.paper {
position: absolute;
bottom: -0.3rem;
left: 50%;
transform: translateX(-50%);
width: 9.2rem;
height: 12.4rem;
border: 0.3rem solid #293b49;
background-color: white;
border-radius: 0.8rem;
}
.paper::before {
content: "";
position: absolute;
top: -0.7rem;
right: -0.7rem;
width: 1.4rem;
height: 1rem;
background-color: white;
border-bottom: 0.3rem solid #293b49;
transform: rotate(45deg);
}
.face {
position: relative;
margin-top: 2.3rem;
}
.eyes {
position: absolute;
top: 0;
left: 2.4rem;
width: 4.6rem;
height: 0.8rem;
}
.eye {
position: absolute;
bottom: 0;
width: 0.8rem;
height: 0.8rem;
border-radius: 50%;
background-color: #293b49;
animation-name: eye;
animation-duration: 4s;
animation-iteration-count: infinite;
animation-timing-function: ease-in-out;
}
.eye-left {
left: 0;
}
.eye-right {
right: 0;
}
@keyframes eye {
0% {
height: 0.8rem;
}
50% {
height: 0.8rem;
}
52% {
height: 0.1rem;
}
54% {
height: 0.8rem;
}
100% {
height: 0.8rem;
}
}
.rosyCheeks {
position: absolute;
top: 1.6rem;
width: 1rem;
height: 0.2rem;
border-radius: 50%;
background-color: #fdabaf;
}
.rosyCheeks-left {
left: 1.4rem;
}
.rosyCheeks-right {
right: 1.4rem;
}
.mouth {
position: absolute;
top: 3.1rem;
left: 50%;
width: 1.6rem;
height: 0.2rem;
border-radius: 0.1rem;
transform: translateX(-50%);
background-color: #293b49;
}
.text {
margin-top: 5rem;
margin-bottom: 0;
font-weight: 300;
color: #293b49;
font-size: 1.5rem;
line-height: 1rem;
}
.button {
margin-top: 4rem;
padding: 1.2rem 3rem;
color: white;
color: #01ac88;
/* background-color: #04cba0; */
border: #01ac88;
border-width: 2px;
border-style: solid;
transition: all 0.15s ease-in-out
/* transition: all 1s ease; */
}
.button:hover {
color: white;
background-color: #01ac88;
font-weight: bold;
}
.by {
position: absolute;
bottom: 0.5rem;
left: 0.5rem;
text-transform: uppercase;
color: #293b49;
width: 95%;
text-align: center;
opacity: 0.1;
}
.byLink {
color: #04cba0;
}
</style>
</body>
</html>

View File

@@ -1,52 +0,0 @@
<div id="gitalk-container"></div>
<div class='js-toc'></div>
<script>
let meta = document.querySelectorAll('.post:not(.on-list) .post-meta')[0];
const visitors = `<span id="busuanzi_container_page_pv" style='display:none'> 浏览:<span id="busuanzi_value_page_pv"></span>次</span>`
if (meta) meta.innerHTML = meta.innerHTML + visitors
</script>
<script>
function tocbot_init() {
tocbot.init({
// Where to render the table of contents.
tocSelector: '.js-toc',
// Where to grab the headings to build the table of contents.
contentSelector: '.post-content',
// Which headings to grab inside of the contentSelector element.
headingSelector: 'h1, h2, h3',
// For headings inside relative or absolute positioned containers within content.
hasInnerContainers: true,
});
}
function init_gitalk() {
const gitalk = new Gitalk({
clientID: '94eae56b89dcc480bf4d',
clientSecret: '1e4218c0293a998a9483ab09ba9ace46cabc76b3',
repo: 'Colinx-Blog', // The repository of store comments,
owner: 'Colin-XKL',
admin: ['Colin-XKL'],
id: decodeURI(location.pathname), // Ensure uniqueness and length less than 50
distractionFreeMode: false // Facebook-like distraction free mode
});
gitalk.render('gitalk-container');
}
</script>
<script defer
onerror="fallbackJSloader('https://cdn.staticaly.com/gh/panr/hugo-theme-hello-friend/master/static/assets/prism.js')"
src="{{ "assets/prism.js" | absURL }}"></script>
<script defer onload="tocbot_init()"
onerror="fallbackJSloader('https://cdn.staticfile.org/tocbot/4.9.1/tocbot.min.js','tocbot_init')"
src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js"></script>
<link rel="stylesheet"
onerror="fallbackCSSloader('https://cdn.staticfile.org/tocbot/4.9.1/tocbot.css')"
href="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.css">
<script defer onload="init_gitalk()"
onerror="fallbackJSloader('https://cdn.staticfile.org/gitalk/1.7.2/gitalk.min.js','init_gitalk')"
src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<link rel="stylesheet"
onerror="fallbackCSSloader('https://cdn.staticfile.org/gitalk/1.7.2/gitalk.css')"
href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.css">
<!-- no min css version fallback for gitalk css -->

View File

@@ -1,27 +0,0 @@
<script>
function panguSpaing() {
pangu.spacingElementByClassName('post');
pangu.spacingElementByTagName('p');
// listen to any DOM change and automatically perform spacing via MutationObserver()
document.addEventListener('DOMContentLoaded', () => {
pangu.autoSpacingPage();
});
}
</script>
<script>
function initQuickLink(){
quicklink.listen();
}
</script>
<script async
onerror="fallbackJSloader('https://cdn.staticaly.com/gh/panr/hugo-theme-hello-friend/master/static/assets/main.js')"
src="{{ "assets/main.js" | absURL }}"></script>
<script async onload="panguSpaing()"
onerror="fallbackJSloader('https://cdn.staticfile.org/pangu/4.0.7/pangu.min.js','panguSpaing')"
src="https://cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
<script async onload="initQuickLink()"
onerror="fallbackJSloader('https://cdn.staticfile.org/quicklink/2.3.0/quicklink.umd.js','initQuickLink')"
src="https://cdn.jsdelivr.net/npm/quicklink@2/dist/quicklink.umd.js"></script>

View File

@@ -1,48 +1,7 @@
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22>
<text y=%22.9em%22 font-size=%2290%22>👋</text></svg>">
<script>
function loadAgies() {
const aegis = new Aegis({
id: 'gQ7V9SgjxZdOm1gy35', // 上报 id
// uin: 'xxx', // 用户唯一 ID可选
reportApiSpeed: true, // 接口测速
reportAssetSpeed: true, // 静态资源测速
spa: true // spa 应用页面跳转的时候开启 pv 计算
});
}
function fallbackJSloader(url, loadedEvent) {
console.log('Error loading asset, using fallback url');
console.log('load asset from', url);
<!--
If you want to include any custom html just before </head>, put it in /layouts/partials/extended_head.html
Do not put anything in this file - it's only here so that hugo won't throw an error if /layouts/partials/extended_head.html doesn't exist.
-->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<style type="text/css">body {font-weight: unset !important;}</style>
let script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
script.async = true;
if (loadedEvent)
script.setAttribute('onload', `${loadedEvent}()`)
document.body.appendChild(script);
}
function fallbackCSSloader(url) {
console.log('Error loading asset, using fallback url');
console.log('load asset from', url);
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
let head = document.getElementsByTagName("head")[0];
head.appendChild(link);
}
</script>
<script async onload="loadAgies()" src="https://cdn-go.cn/aegis/aegis-sdk/latest/aegis.min.js"></script>
<link rel="preconnect" href="https://cdnjs.cloudflare.com">
<link rel="preconnect" href="https://cdn.jsdelivr.net">
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//api.github.com" />
<link rel="dns-prefetch" href="//avatars.githubusercontent.com" />
<script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<style type="text/css">body {font-weight: unset !important;font-family: -apple-system,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif!important;}
.framed{width: 100%;} .framed .h-anchor{display: none;} .post-content p {font-size:1.1rem; line-height:1.8rem; margin:1em 0; }</style>

View File

@@ -18,4 +18,11 @@
</div>
</footer>
<script src="{{ "assets/main.js" | absURL }}"></script>
<script async src="{{ "assets/prism.js" | absURL }}"></script>
<script >
meta=document.querySelectorAll('.post:not(.on-list) .post-meta')[0];
var visitors=`<span id="busuanzi_container_page_pv" style='display:none'> 浏览:<span id="busuanzi_value_page_pv"></span>次</span>`
meta.innerHTML=meta.innerHTML+visitors
</script>
{{- partial "extended_footer.html" . }}

View File

@@ -1,38 +0,0 @@
<!-- this file was ported and edited from theme, check if there's any update in the original repo -->
<!-- do not use code formatting -->
<!-- do not edit this file unless neccessary -->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
content="{{ if .IsHome }}{{ $.Site.Params.Subtitle }}{{ else }}{{ .Summary | plainify }}{{ end }}"
/>
<meta
name="keywords"
content="{{ with .Params.Keywords }}{{ delimit . ", " }}{{ else }}{{ $.Site.Params.Keywords }}{{ end }}"
/>
<link rel="canonical" href="{{ $.Site.Params.canonicalRelLinkBase }}{{ .RelPermalink }}" />
<!-- head custom -->
{{- partial "prepended_head.html" . }}
<!-- Custom CSS to override theme properties (/static/style.css) -->
<link rel="stylesheet" href="{{ "style.css" | absURL }}" />
<!-- Theme CSS -->
<link rel="stylesheet" href="{{ "assets/style.css" | absURL }}" />
<!-- Icons,deleted for using emoji favicon-->
<!-- Fonts, disabled-->
<!-- OG data -->
{{ template "_internal/opengraph.html" . }}
<!-- RSS | JSON -->
{{ range .AlternativeOutputFormats -}}
{{ printf `<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
{{ end -}}
<!-- head custom -->
{{- partial "extended_head.html" . }}

View File

@@ -1,30 +0,0 @@
<!--
Params:
name: css #id
url: path or url of your data.json
-->
{{ with .Get "url" }}
{{ $url := . }}
{{ with $.Get "name" }}
{{ $name := . }}
{{ $data := getJSON $url }}
{{ range $data.data }}
{{ $item := . }}
<h3 id="{{$item.name}}">{{$item.name}}</h3>
{{ $link := urls.Parse $item.link }}
<p>{{$item.type}} - {{$item.subtitle}}</p>
<p>地址:
{{ if (gt (len $link.Host) 1) }}
<a href="{{$item.link}}" >{{$link.Host}}</a>
{{ else }}
{{$item.link}}
{{ end }}
</p>
{{ if (gt (len $item.StartServingAt) 1) }}
<p>上线于{{$item.StartServingAt}}</p>
{{ end }}
{{ end }}
{{ end }}
{{ end }}

View File

@@ -3,7 +3,7 @@ publish = "public"
command = "hugo --gc --minify"
[context.production.environment]
HUGO_VERSION = "0.91.2"
HUGO_VERSION = "0.69.2"
HUGO_ENV = "production"
HUGO_ENABLEGITINFO = "true"
@@ -11,20 +11,20 @@ HUGO_ENABLEGITINFO = "true"
command = "hugo --gc --minify --enableGitInfo"
[context.split1.environment]
HUGO_VERSION = "0.91.2"
HUGO_VERSION = "0.69.2"
HUGO_ENV = "production"
[context.deploy-preview]
command = "hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL"
[context.deploy-preview.environment]
HUGO_VERSION = "0.91.2"
HUGO_VERSION = "0.69.2"
[context.branch-deploy]
command = "hugo --gc --minify -b $DEPLOY_PRIME_URL"
[context.branch-deploy.environment]
HUGO_VERSION = "0.91.2"
HUGO_VERSION = "0.69.2"
[context.next.environment]
HUGO_ENABLEGITINFO = "true"

View File

@@ -1,49 +0,0 @@
backend:
name: github
repo: Colin-XKL/Colinx-Blog
# This line should *not* be indented
publish_mode: editorial_workflow
# These lines should *not* be indented
media_folder: "static/images/uploads" # Media files will be stored in the repo under static/images/uploads
public_folder: "/images/uploads" # The src attribute for uploaded media will begin with /images/uploads
slug:
encoding: "unicode"
clean_accents: true
sanitize_replacement: "_"
collections:
- name: "blog" # Used in routes, e.g., /admin/collections/blog
label: "Blog" # Used in the UI
folder: "content/posts" # The path to the folder where the documents are stored
create: true # Allow users to create new documents in this collection
format: "frontmatter"
slug: "{{year}}-{{slug}}" # Filename template, e.g., YYYY-MM-DD-title.md
fields: # The fields for each document, usually in front matter
- { label: "Title", name: "title", widget: "string" }
- {
label: "Date",
name: "date",
widget: "datetime",
date_format: "YYYY-MM-DD",
time_format: "HH:mm",
preview: false,
}
- {
label: "Last Mod Date",
name: "lastmod",
widget: "datetime",
date_format: "YYYY-MM-DD",
time_format: "HH:mm",
preview: false,
required: false,
}
- {
label: "Featured Image",
name: "cover",
widget: "image",
required: false,
}
- { label: "Description", name: "description", widget: "text" }
- { label: "Draft", name: "draft", widget: "boolean", default: false }
- { label: "Categories", name: "categories", widget: "list" }
- { label: "Tags", name: "tags", widget: "list" }
- { label: "Body", name: "body", widget: "markdown" }

View File

@@ -1,17 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Panel For Colin's Blog</title>
<style>
[data-slate-editor] {
-webkit-user-modify: read-write !important;
}
</style>
</head>
<body>
<!-- Include the script that builds the page and powers Netlify CMS -->
<script src="https://cdn.jsdelivr.net/npm/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
</body>
</html>

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="110" height="20" role="img" aria-label="mirror: accessible"><title>mirror: accessible</title><g shape-rendering="crispEdges"><rect width="45" height="20" fill="#555"/><rect x="45" width="65" height="20" fill="#4c1"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="235" y="140" transform="scale(.1)" fill="#fff" textLength="350">mirror</text><text x="765" y="140" transform="scale(.1)" fill="#fff" textLength="550">accessible</text></g></svg>

Before

Width:  |  Height:  |  Size: 636 B

View File

@@ -1,118 +0,0 @@
/* gittalk comment style */
#gitalk-container {
margin: 20px auto;
max-width: 800px;
padding: 20px;
width: 100%;
text-align: left;
}
/* toc style */
@media (min-width: 1500px) {
.js-toc {
display: block !important;
}
}
.js-toc {
display: none;
/* IE and Edge */
-ms-overflow-style: none;
/* Firefox */
scrollbar-width: none;
}
.js-toc::-webkit-scrollbar {
/* Chrome, Safari and Opera */
display: none;
}
.js-toc {
position: fixed;
width: 20%;
max-width: 400px;
right: 3rem;
top: 10em;
text-align: left;
overflow-y: scroll;
overflow-x: hidden;
padding: 1rem 0rem;
}
ol.toc-list > li > a:hover {
text-underline-position: under;
font-weight: bolder;
}
.toc-list li {
list-style: none;
}
.toc-list a {
text-decoration: none;
text-overflow: ellipsis;
display: inline-block;
white-space: nowrap;
font-size: 1rem;
}
.is-active-link::before {
background-color: #d71a1b !important;
}
.logo__cursor {
background: #d71a1b;
}
/* 超链接样式 */
.post-tags a,
.post-content a {
text-decoration: none;
border-bottom: 1px dashed #d71a1b;
-webkit-transition: all 0.2s;
transition: all 0.2s;
}
.post-tags a:hover,
.post-content a:hover,
nav a:hover {
text-decoration: none;
border-bottom: 2px solid #d71a1b;
-webkit-transition: all 0.1s ease;
transition: all 0.1s ease;
}
/* custom ::selection */
::selection {
background: #b5b5b5;
color: #fff;
}
::-moz-selection {
background: #b5b5b5;
color: #fff;
}
::-webkit-selection {
background: #b5b5b5;
color: #fff;
}
/* abandoned link style */
/* .post-content a {
transition: background-size 0.1s ease;
background: linear-gradient(to bottom, transparent 62%, #fff56644 0) center center/0% 75% no-repeat;
color: #52c41a;
cursor: pointer;
}
.post-content a:hover {
background-size: 100% 100%;
color: #389e0d;
}
.post-content a:active {
background-size: 80% 100%;
} */

View File

@@ -1,11 +0,0 @@
{
"responseOverrides": {
"400": {
"statusCode": 301,
"redirect": "/404"
},
"404": {
"rewrite": "/404"
}
}
}