mirror of
https://github.com/Colin-XKL/Colinx-Blog.git
synced 2026-01-11 02:01:29 +08:00
Compare commits
223 Commits
cms/blog/2
...
93f0c2110b
| Author | SHA1 | Date | |
|---|---|---|---|
| 93f0c2110b | |||
| 9e72f30ff4 | |||
|
|
f718df5a11 | ||
| ad8fbc6fc2 | |||
| d2368e9008 | |||
|
|
c0e9369ebf | ||
|
|
0f95c8de33 | ||
|
|
767e3ae8a5 | ||
|
|
b7d529f579 | ||
| b1565d9c3e | |||
|
|
2f9267f4c4 | ||
| bf30cadbde | |||
| 5594f822b1 | |||
| 5c10849e64 | |||
| 283269d4b5 | |||
| 14a221facd | |||
|
|
6a13d8c366 | ||
| d37f0f4a9e | |||
| 03bcf813be | |||
| 687dcf0353 | |||
| 6b08b7ae93 | |||
|
|
69e98a0a09 | ||
| 5ea07ab91a | |||
|
|
dd23178da7 | ||
| 3b96b5bf7d | |||
| 97109397c7 | |||
|
|
4e94713d41 | ||
| ad0bb3a482 | |||
|
|
d50b8359c0 | ||
| 95135588fc | |||
| d1e6c28649 | |||
| 45e5bafcef | |||
|
|
4b10bcfdac | ||
| 83d6a8ba7f | |||
|
|
0e27520929 | ||
| 69f2c54965 | |||
| 28f928b570 | |||
| f97d55835b | |||
| 0195d85641 | |||
| 4b6100bfee | |||
| 2aede33107 | |||
| 233bc3fa9b | |||
| 7668b918ee | |||
| 55f5bbd15e | |||
| 99d00283e1 | |||
| 65c0429ce5 | |||
|
|
a17e1106bc | ||
| d5caf5e0a5 | |||
| 379e1a1557 | |||
|
|
3e3fb03791 | ||
| 3aba40b4de | |||
| 9ac9b49cc1 | |||
|
|
e76f833e27 | ||
| 1d4a05c0b7 | |||
| 84af25f948 | |||
| 0e688cf099 | |||
| 1b9dc286d9 | |||
| 7091956af0 | |||
| a672c3b56e | |||
| d90f4b0c43 | |||
|
|
283a4d635a | ||
| 85fea90b07 | |||
| 91e62836e5 | |||
| b1c2b0bccf | |||
| 29d991c5b5 | |||
|
|
0c6092abe0 | ||
| 3875a6074d | |||
| 8d43db3c12 | |||
| c4d3536b22 | |||
|
|
148e6969d9 | ||
| f04bb7dc4e | |||
|
|
663265dccc | ||
| 263610a74c | |||
| 17f59aa8c7 | |||
| 5f995e92ba | |||
| 25c82b55e0 | |||
| 6e971cb648 | |||
| db4c7b5ae0 | |||
| 2c2e5906e1 | |||
|
|
5eb2854016 | ||
| a562f6bddc | |||
| 44cebddbb7 | |||
| 2ceb83fec5 | |||
| ca085f4e47 | |||
| 9befd5ec30 | |||
| a68184bf49 | |||
| f74e8ffee2 | |||
| 466f11a0fc | |||
| 367ea57468 | |||
| 3ae5f81cce | |||
| 775ddeb957 | |||
| a455b41ece | |||
| 20241d192a | |||
| 49054b692e | |||
| 40409b0cfd | |||
| 6eb54d9e28 | |||
| c5fa1cc71a | |||
| dc15508604 | |||
| 6b5b31ac1d | |||
| ff83511554 | |||
| 752fa0dc8d | |||
| 4b98fa70b7 | |||
| 0b8517447a | |||
| cfb065fd2a | |||
| 3d0cbfc7fa | |||
| ad2edaf2b5 | |||
| 4a59b6c8a4 | |||
| 2029053806 | |||
| 991b5df375 | |||
| 3daf74ba7c | |||
| 21593165a4 | |||
| 8f8d3d5ee0 | |||
| 2b88d459e1 | |||
| 101523d7ff | |||
| 3941f5764d | |||
|
|
4047d29c7a | ||
|
|
cda0005008 | ||
|
|
cec9d1d715 | ||
|
|
880dc66d2f | ||
| f9e2f6f17a | |||
|
|
06fe5df3f8 | ||
| 9b8f97d70c | |||
|
|
65918969c6 | ||
|
|
ef089af2ae | ||
|
|
e77792122c | ||
| b442e2b8a4 | |||
| ba5815c21e | |||
|
|
d2761e5703 | ||
|
|
ae67a52b30 | ||
|
|
1702210f5c | ||
|
|
53147d8f1c | ||
|
|
fcddee6fee | ||
|
|
44ff5e0cde | ||
| c3b1a1bbf5 | |||
| 1c1b28c8ff | |||
|
|
9d467ca37b | ||
| faa34cc6e8 | |||
|
|
7a73bb83d5 | ||
|
|
cbea3b6a9a | ||
|
|
0bc1036aca | ||
|
|
f63f48be88 | ||
| fb852d495f | |||
|
|
2277453cd3 | ||
|
|
aa23084a0f | ||
|
|
e1df33d06c | ||
|
|
048491464e | ||
|
|
b4f3f45659 | ||
|
|
87d9aefea3 | ||
|
|
77d3d4a3ae | ||
|
|
c27c816cbd | ||
|
|
1447f9d96b | ||
|
|
793db16f56 | ||
| 1ddb1325e1 | |||
|
|
fe68dc9cd2 | ||
|
|
17ec6cd6c6 | ||
|
|
09fcc1019a | ||
|
|
725c36f308 | ||
|
|
86dfa1f0aa | ||
|
|
2de7c4d103 | ||
|
|
75b1617469 | ||
|
|
3d605d2a47 | ||
|
|
a546f3639e | ||
|
|
8d3f2ef7f7 | ||
|
|
5637a49ba9 | ||
|
|
69cdac3d64 | ||
|
|
17e98f9773 | ||
|
|
7e80fac61c | ||
|
|
28b24d48a1 | ||
|
|
5fd052d8b3 | ||
| dac3061c54 | |||
|
|
7cf3361731 | ||
| a8c677aa8b | |||
|
|
f21aa9442e | ||
|
|
533cc59ced | ||
|
|
85cb7854a5 | ||
|
|
8970113e4e | ||
|
|
e94b283ce2 | ||
| dce5b41142 | |||
| 704066888a | |||
| 114649a211 | |||
| 11d130fcbf | |||
| d912a20a94 | |||
|
|
4b254fabba | ||
|
|
65b15e1e6e | ||
|
|
c469e1f85d | ||
| 21812905b3 | |||
| 337d9b487b | |||
| 949637b4a1 | |||
| 040164aa9a | |||
| 28e090d14f | |||
| 867ed5d2c9 | |||
| 3d57066bb2 | |||
| 9716b24e38 | |||
| f465808c87 | |||
| b788496f72 | |||
| f911124352 | |||
| 7e55d65585 | |||
| 83941e408d | |||
| 1a1a0832c4 | |||
| d378650996 | |||
| 64b83e9aa5 | |||
| e0c389798e | |||
| d8268a65fd | |||
| 9a763c8612 | |||
| 473ded54c1 | |||
|
|
3aef9b302d | ||
|
|
e265a97c00 | ||
|
|
b8dd8f7f37 | ||
|
|
d8b5634ef3 | ||
|
|
816ac1b143 | ||
|
|
a3645d9fb5 | ||
|
|
f88756a87c | ||
|
|
00355b9619 | ||
|
|
b0189bdea9 | ||
|
|
d2bfa1be69 | ||
|
|
a510168a04 | ||
|
|
2fd4e20255 | ||
|
|
1158e2cd97 | ||
| 16e278f633 | |||
| 01ab968756 | |||
| 0dedc852af | |||
| 00e04588c9 | |||
| 77d8f86070 |
15
.github/dependabot.yml
vendored
Normal file
15
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# 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"
|
||||
34
.github/workflows/CDN-URL.yaml
vendored
Normal file
34
.github/workflows/CDN-URL.yaml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
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@v4
|
||||
|
||||
- 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@v5
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: "Change img CDN URL"
|
||||
title: "Update imgs' CDN URL"
|
||||
labels: "URL"
|
||||
base: "master"
|
||||
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
|
||||
branch: "update-img-url"
|
||||
body: "Some imgs' URL need to be updated."
|
||||
47
.github/workflows/azure-static-web-apps-nice-glacier-095b09e00.yml
vendored
Normal file
47
.github/workflows/azure-static-web-apps-nice-glacier-095b09e00.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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@v4
|
||||
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"
|
||||
70
.github/workflows/gh-pages.yml
vendored
Normal file
70
.github/workflows/gh-pages.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# 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@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v5
|
||||
- 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@v3
|
||||
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@v4
|
||||
18
.github/workflows/main.workflow
vendored
Normal file
18
.github/workflows/main.workflow
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
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"
|
||||
}
|
||||
}
|
||||
30
.github/workflows/text-lint.yml
vendored
Normal file
30
.github/workflows/text-lint.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
name: Check and correct text
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
# pull_request:
|
||||
# branches: [master]
|
||||
|
||||
jobs:
|
||||
check-and-lint-text:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: huacnlee.autocorrect
|
||||
uses: huacnlee/autocorrect-action@v2.10.0
|
||||
with:
|
||||
args: --fix
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: "chore: lint text and auto correct"
|
||||
title: "Text lint and fix"
|
||||
labels: "Lint"
|
||||
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
|
||||
branch: "text-lint"
|
||||
body: "Some words and sentences need to be updated."
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -97,3 +97,4 @@ $RECYCLE.BIN/
|
||||
|
||||
# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
|
||||
|
||||
.hugo_build.lock
|
||||
|
||||
41
README.md
Normal file
41
README.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Colinx-Blog 
|
||||
[](https://app.netlify.com/sites/colins-blog/deploys)
|
||||

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
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) 
|
||||
|
||||
|
||||
|
||||
* Vercel
|
||||
[colinx-blog.vercel.app](https://colinx-blog.vercel.app) 
|
||||
|
||||
|
||||
|
||||
* CloudFlare Pages
|
||||
[colinx-blog.pages.dev](https://colinx-blog.pages.dev) 
|
||||
|
||||
|
||||
* Azure Static Web
|
||||
[nice-glacier-095b09e00.1.azurestaticapps.net](https://nice-glacier-095b09e00.1.azurestaticapps.net) 
|
||||
|
||||
|
||||
* Github Pages
|
||||
[gh-pages.colinx.one](https://gh-pages.colinx.one/)
|
||||
|
||||
|
||||
* Tencent CDN Oversea
|
||||
[blog-txcdn.colinx.one](https://blog-txcdn.colinx.one/) 
|
||||
197
config.toml
197
config.toml
@@ -2,108 +2,119 @@ baseurl = "/"
|
||||
languageCode = "en-us"
|
||||
defaultContentLanguage = "zh-cn"
|
||||
defaultContentLanguageInSubdir = false
|
||||
hasCJKLanguage = true
|
||||
theme = "hello-friend"
|
||||
paginate = 7
|
||||
paginate = 10
|
||||
enableRobotsTXT = true
|
||||
|
||||
# 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 = "最后修改"
|
||||
# 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'
|
||||
|
||||
[languages]
|
||||
[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]
|
||||
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.params.logo]
|
||||
logoText = "Colinx Blog"
|
||||
logoHomeLink = "/"
|
||||
# or
|
||||
#
|
||||
# path = "/img/your-example-logo.svg"
|
||||
# alt = "Your example logo alt text"
|
||||
[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.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]
|
||||
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.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.params.logo]
|
||||
logoText = "Colinx Blog"
|
||||
logoHomeLink = "/"
|
||||
# or
|
||||
#
|
||||
# path = "/img/your-example-logo.svg"
|
||||
# alt = "Your example logo alt text"
|
||||
|
||||
[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]
|
||||
|
||||
[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"
|
||||
|
||||
[[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
|
||||
|
||||
13
content/_index.md
Normal file
13
content/_index.md
Normal file
@@ -0,0 +1,13 @@
|
||||
+++
|
||||
framed = true
|
||||
+++
|
||||
|
||||
# Hi there!👋
|
||||
|
||||
<p align="center">
|
||||
<img src="/favicon.png" width=120 />
|
||||
</p>
|
||||
|
||||
Welcome to my blog🎩 Check these
|
||||
|
||||
[💻 技术文章](/categories/%E6%8A%80%E6%9C%AF/) | [💡 My Github](https://github.com/Colin-XKL/) | [💎 公开服务&个人作品](/services/)
|
||||
@@ -8,7 +8,7 @@ lastmod: 2021-05-10
|
||||
|
||||
## About Me
|
||||
|
||||
00 后,性别男,爱好女,CS 在读,准软件工程师,业余摄影师、音乐制作人,RSS 爱好者
|
||||
00 后,性别男,爱好女,CS 专业,软件攻城狮一枚,业余摄影师、音乐制作人,RSS 爱好者
|
||||
|
||||
### I Like
|
||||
|
||||
@@ -19,5 +19,14 @@ 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 免费咨询或以其他形式提供付费支持
|
||||
@@ -1,30 +1,27 @@
|
||||
---
|
||||
|
||||
title: 2020 年度总结
|
||||
date: 2020-12-26
|
||||
lastmod: 2020-12-31
|
||||
description: 新冠疫情侵袭下的2020过的额外的快,仿佛上一秒还在家里上完课,下一刻就是秋季复学,一晃眼又是一年圣诞,2020就快过完了。这里记录一下我的2020.
|
||||
description: 新冠疫情侵袭下的 2020 过的额外的快,仿佛上一秒还在家里上完课,下一刻就是秋季复学,一晃眼又是一年圣诞,2020 就快过完了。这里记录一下我的 2020.
|
||||
categories:
|
||||
- 杂记
|
||||
- 年度总结
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
- 2020
|
||||
|
||||
---
|
||||
|
||||
# 2020年度总结
|
||||
<!-- # 2020 年度总结 -->
|
||||
|
||||
## 序
|
||||
|
||||
新冠疫情侵袭下的2020过的额外的快,仿佛上一秒还在家里上完课,下一刻就是秋季复学,一晃眼又是一年圣诞,2020就快过完了。这里记录一下我的2020.
|
||||
新冠疫情侵袭下的 2020 过的额外的快,仿佛上一秒还在家里上完课,下一刻就是秋季复学,一晃眼又是一年圣诞,2020 就快过完了。这里记录一下我的 2020.
|
||||
|
||||
|
||||
|
||||
## 我的2020简述
|
||||
## 我的 2020 简述
|
||||
|
||||
* 博客2.0、3.0
|
||||
* 博客 2.0、3.0
|
||||
* 刷完了几部经典动漫
|
||||
* 刷完了我的三体和三体三部曲
|
||||
* 上半年在家中了花花草草
|
||||
@@ -36,30 +33,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 +71,7 @@ tags:
|
||||
|
||||
## 终
|
||||
|
||||
最后的最后,2020年度流水账
|
||||
最后的最后,2020 年度流水账
|
||||
|
||||
* 不拜年的春节,开心😄
|
||||
* 寒假放完了,直接线上教学,懵逼
|
||||
@@ -84,11 +81,11 @@ tags:
|
||||
* 快递初步解封,买了花种子
|
||||
* 发小高三无心复习,我又不能放开耍
|
||||
* 每天照料种子,感受初生的喜悦,超有成就感
|
||||
* 折腾docker
|
||||
* 折腾 docker
|
||||
* 折腾博客,Hugo
|
||||
* 刷红七
|
||||
* 水水的网页设计比赛拿了个一等奖,奖品自选,我们队选了三大箱零食哈哈
|
||||
* 折腾RSS
|
||||
* 折腾 RSS
|
||||
* 复学
|
||||
* 一头雾水的组原实验,可是看看四周好像只有自己在做
|
||||
* 水水的中青杯,说好的组队到头来基本是自己一个人写
|
||||
@@ -99,33 +96,16 @@ tags:
|
||||
* 小一个月过了科二科三,刺激
|
||||
* 刷了三体三部曲,必须点赞
|
||||
* 开学数模比赛,很辛苦,但是挺考验人的
|
||||
* 捡垃圾组了第一台主机,吃上了Catalina黑苹果
|
||||
* 捡垃圾组了第一台主机,吃上了 Catalina 黑苹果
|
||||
* 十一过后每天学习吉他
|
||||
* 继续折腾RSS
|
||||
* 继续折腾 RSS
|
||||
* 实验室开通了微信公众号
|
||||
* 正式开始做Logic项目,但是发现思绪混乱不堪,工作方式与预期相差甚远
|
||||
* CFC 四级小班课,消灭了四级 (updated)
|
||||
* 正式开始做 Logic 项目,但是发现思绪混乱不堪,工作方式与预期相差甚远
|
||||
* 第一次穿西装
|
||||
* 挖了又没填完的几个坑
|
||||
* 肝课设
|
||||
* 写这篇文章
|
||||
* 抓住2020的尾巴上线了https://coding-step-one.colinx.one/
|
||||
* 2020终
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 抓住 2020 的尾巴上线了 https://coding-step-one.colinx.one/
|
||||
* 2020 终
|
||||
|
||||
|
||||
112
content/posts/2021年度总结.md
Executable file
112
content/posts/2021年度总结.md
Executable file
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: 2021 年度总结
|
||||
date: 2021-12-31
|
||||
lastmod: 2021-12-31
|
||||
description: 转眼又快是新的一年,似乎岁数越大,会感觉时间过得越快。想起小时候下课前的三分钟都无比漫长,现在在学校待两个月却仿佛只是两天。纵有万分感慨,但无法阻挡的事实是,2021 结束了,我又长了一岁,父母又老了一岁,我的大学时光又少了一年,我在自己的道路上又行走了一年。
|
||||
categories:
|
||||
- 杂记
|
||||
- 年度总结
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
---
|
||||
|
||||
<!-- # 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 项目渐渐获得关注和认可,感觉超棒
|
||||
* 第一次体验翻,土蔷,真墙
|
||||
* 入坑并追完星际宝贝系列
|
||||
* 入手 XBOX,XGP 真香
|
||||
* 最后一次参加 CFC 招新
|
||||
* 入手极米投影仪,躺在宿舍床上看电影美滋滋
|
||||
* 📕《编码:隐匿在计算机软硬件背后的语言》👍
|
||||
* Linux&Git 小班课,一周从`ls`到 nginx
|
||||
* 搞到了三百块 4c16g 的服务器,y1s1 真的给力
|
||||
* 赶在年末疫情没严重溜回家,保住我的最后一个寒假
|
||||
* 2021 the end
|
||||
|
||||
106
content/posts/2022年度总结.md
Normal file
106
content/posts/2022年度总结.md
Normal file
@@ -0,0 +1,106 @@
|
||||
---
|
||||
title: 2022 年度总结
|
||||
date: 2022-12-31
|
||||
lastmod: 2023-01-16
|
||||
description: 我的 2022 年度关键词 幸运,尝试躺下,表达自己
|
||||
categories:
|
||||
- 杂记
|
||||
- 年度总结
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
---
|
||||
|
||||
## 我的 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.
|
||||
123
content/posts/2023年度总结.md
Normal file
123
content/posts/2023年度总结.md
Normal file
@@ -0,0 +1,123 @@
|
||||
---
|
||||
title: 2023 年度总结
|
||||
date: 2023-12-31
|
||||
lastmod: 2023-12-31
|
||||
description: 我的 2023 年度关键词 空虚&丰满
|
||||
categories:
|
||||
- 杂记
|
||||
- 年度总结
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
---
|
||||
|
||||
## 年度关键词
|
||||
|
||||
**空虚**, **丰满**
|
||||
|
||||
2023 年,久违的没有疫情了,这一年跑了很多地方,也解锁了工作一周年的成就,尝试做了很多东西,也入手了不少好物,有些切切实实提升了日常体验,有些则是放以前我能兴奋把玩很久,但是如今买了一堆,兴奋和喜悦却只能持续一个周末。这一年有很多睡不着的晚上,虽然大多数时候都是喝了咖啡或者茶睡不着,不过睡不着的时候也不能全赖咖啡因,睡不着就开始胡思乱想,越想就越睡不着了。到后面脑子里到处都是 idea, 受不来了就爬起来打开电脑哐哐哐开始写,可惜最后一个周末过去上了几天班,这些项目就推进不下去了。上班还是挺消耗心智的。可能这也是为什么今年的很多时候都隐隐感觉到空虚吧。
|
||||
|
||||
在尝试写下这篇年度总结的时候,我又回去翻了相册、购物记录、代码记录,梳理一通发现今年虽然主观上感觉比较空虚,但其实还是做了不少事情的,或者说有了不少独特的体验。无论是演唱会、打卡的景点、折腾的玩具、入坑的剧集,还是说工作上的一些事项,同事和老板的一些肯定,这些加起来,总体来看,似乎也不能说过去的一年是一个平平无奇的,无聊的,一事无成的一年。那我为什么会感到空虚呢?
|
||||
|
||||
我不禁想反问自己,空虚的反义词是什么?什么情况下我才不会感到空虚呢?为什么我回忆起过去的一年会觉得自己很空虚呢?
|
||||
追自己非常喜欢的剧集不会让我感到空虚,今年看的几部剧也确实都不错,看了挺长时间。
|
||||
去外面旅游打卡不会让我感到空虚,但是今年也没少出去玩,甚至中间还有几个长假玩了挺久
|
||||
折腾自己的玩具项目不会让我感到空虚,但是今年折腾的东西一点都不少
|
||||
入手心仪很久的科技产品不会让我感到空虚,今年同样没少买,又是小主机又是 3D 打印机的
|
||||
得到赞赏不会让我感到空虚,可是今年,无论是来自同事的,来自老板的,来自开源社区的陌生人的,都不少
|
||||
|
||||
那什么也没缺,为什么我会觉得自己很空虚呢?
|
||||
|
||||
细细想来,过去的一年高光时刻很多,但是总的时长其实很有限。可能正是因为高光时刻太令人兴奋了,相比之下,日常普普通通,波澜不惊的那些日子,显得尤为空虚。
|
||||
|
||||
满打满算,有高光时刻,非常“精彩”的天数可能才 60 天,也就是说一年里 300 多天我都是在“刚刚经历高光时刻,兴奋刚刚退去”的“戒断反应”下度过的,这些平常的日子相比较起来确实非常无聊,非常空虚。
|
||||
|
||||
所谓“平平淡淡才是真”, 平凡的日子才是生活的主旋律。这样一看,统计下那些“不平凡”的天数,其实过去的一年是相当丰富、充盈的,这里我选择了“丰满”这个词作为年度关键词之一。一方面是指“高光时刻”真的很多,另外一方面也是有“羽翼渐丰”的意思。
|
||||
|
||||
2023 解锁了工作一周年的成就,无论是在社会角色,经济能力,还是消费理念,工作能力等方面,我发觉自己都开始达到了一个新的台阶。我开始能够作为子女,作为业务的核心成员,能够“独当一面”, 在社交和消费时也能从过往十几年的枷锁中突破开来,更加开放,果断,自信。用 2023 年的流行语来说,由“I 人”变得更“E”了。
|
||||
|
||||
这里也引出另外一个话题,如何判断自己到底是“I 人”还是“E 人”, 为什么我是“I 人”而不是“E 人”呢?为什么我只能是“I 人”或“E 人”而不是两者兼具呢?
|
||||
|
||||
我一度因为自己厌恶社交,不会“来事”而给自己贴上内向的标签。按照评测结果来看,我是妥妥的“I 人”, 但是过去的几年里,接触到不少同学、朋友、同事,不少人给我打的标签都是“积极的”,“勇敢的”,“外向的”, 甚至还有同学来问我,如何才能像我一样,在公开场合讲话时“临危不惧”,“娓娓道来”, 我诧异了,我一直都觉得自己是个内向寡言胆小怕事的小透明,至少从小学开始,我就是给自己立的这个人设,每逢过年走亲戚、外出活动和社交的时候我也总是尽量一个人在角落里企图避开所有其他人的交流。
|
||||
|
||||
我回忆起每次有大人来尝试给我开玩笑我后面总是气到不行原地大哭,现在想想当时只是因为开的玩笑太过分,不尊重人,我那时不懂得反驳而已。
|
||||
|
||||
我回忆起每次过年走亲戚我总是躲在房间里不想出去,饭桌上也总是沉默不语只企图尽快逃离。现在想来,一桌子不认识的亲戚,聊着我都听不懂的家长里短,我怎么可能会有待下去的意图。
|
||||
|
||||
我回忆起以前在学校总是避开所有的社交活动、体育活动,一个人在座位上看书,现在看来单纯只是因为那个时候自己已经和班里的大部分同学不在一个频道上面了,无论是成绩还是兴趣方向、话题等等。上大学以及后面工作时,遇见过很多很优秀的朋友,日常交流时我从来都没感觉到自己需要逃避,反而我会非常期待,以及非常珍惜在一起交流玩耍的时间。
|
||||
|
||||
回过头来看,过去几年的我并不是变得更外向,更积极,更擅长社交了,而是我从人设的枷锁中解放了自己的人格,在与优秀的伙伴相处时找回了真实的自己。新的一年,希望自己能够更多地发展真实的自我,没有定义,没有标签,做自己想做的自己!
|
||||
|
||||
## 2023 年度高光时刻 ✨
|
||||
|
||||
- 花了好几个晚上做铃芽主题曲的短片,每天盼着下班就回家开始剪辑和调整节奏,那股热情和冲劲可遇而不可求
|
||||
- 部门团建去贵州玩了四天,不知道是不是因为上班压抑的太久,感觉玩了一个星期多,很充实
|
||||
- 下半年去湖南参加婚礼顺带玩了一周,行程满满当当,天气也很给力,错峰出行总体体验也非常不错
|
||||
|
||||
## 2023 年度遗憾 ☁️
|
||||
|
||||
- 铃芽的短片做完了投稿没有 check 状态,后面过了好几天才发现之前投错了被审核拒绝了,错失了流量热点
|
||||
- 在窗帘伴侣接入 HomeAssistant 这件事情上浪费了太多时间,早知道应该直接钞能力解决,时间和精力可以做更多的事
|
||||
|
||||
## Flags From 2022
|
||||
|
||||
- 阅读 6 本书 (✅, 包括球状闪电在内的 4 部文学作品,1 部心理学,1 部技术类)
|
||||
- 发布 6 篇博客文章 (✅, 虽然有赶工的嫌疑不过最后还是完成了 hhh )
|
||||
- 打卡 6 个景点 (✅13/6, 217% 超额完成,广州的大学城,海心沙亚运公园,贵州的肇兴侗寨,荔波小七孔等,湖南的桃花源,张家界,凤凰古城等)
|
||||
- 在各种公共平台发表总共 6 个作品 (✅, 勉强完成,可惜很多都只开了个头没有继续运营下去)
|
||||
|
||||
## Question From 2022
|
||||
|
||||
> **一年后的自己,有没有变得更加善于表达自己,有没有更多、更畅酣地表达自己?**
|
||||
|
||||
这个问题需要分成两个部分来回答。首先毫无疑问的是,2023 的我在表达自己的时候更加顺畅了,但是还算不上酣畅。目前来看,我表达自己的一个重要途径是创作,任何内容的创作。我需要一些创作的动机和契机来实现这一点,期待在新的一年里,能够有更多,更深度,更持续的创作。
|
||||
|
||||
## Flags For 2024
|
||||
|
||||
- 发布 6 篇博客文章
|
||||
- 做 3 个 Weekend Project, 两天马拉松直接从 0 到上线
|
||||
- 做 2 个 Side Project, 并持续投入运营
|
||||
|
||||
## Question For 2024
|
||||
|
||||
一年后的自己,有没有找到或者建立一个会愿意持续投入 3 年以上的项目,方向,或者事业?
|
||||
|
||||
---
|
||||
|
||||
## 年度流水账环节
|
||||
|
||||
- 没有寒假的春节,失去了才发现有长假是真的爽
|
||||
- 春节期间三五好友的露天烧烤
|
||||
- 年后没几天就匆匆回来上班,不过开头几天大家都是不约而同默契摸鱼,加上不知道因为是不是疫情退散加上新年新气象,感觉倒也没那么糟糕
|
||||
- 入坑 Astro, 这个集合 SSR+CSR+Component Island + Hydration 众多新概念的框架确实有点意思,尝试做了个 version selector 的玩具项目,可以给项目开坑或者升级的时候选择技术组件的版本提供查询和参考,使用 headless CMS 方案,虽然最后没做成多大的规模,不过这个 Headless CMS 方案却给朋友带来了一点小小的震撼,激动到回家就开始准备写小程序开店 hhh
|
||||
- 公司年会,抽中了个 AirPods 3, 运气还不错
|
||||
- 打卡海上世界,华强北等地,之后几天又去深圳湾、南山公园,疫情放开感觉有点想报复性地多出去走走
|
||||
- 尝试折腾水族,买了鱼缸、水泵等一大堆东西,后面发现水泵太吵、缸放阳台顶不住夏天暴晒
|
||||
- 疯狂追剧 Futurama 系列
|
||||
- 给铃芽的主题曲做了个中日粤三语的 MV(或者说 MAD?), 一直以来我都对音乐以及画面之间的节奏很感兴趣,这一次真正动手做,花了很多时间和精力,而且久违的有很多热情和冲动,每天下班回家就是疯狂剪辑和调整节奏,成片一遍又一遍检查和调整。不过最终的效果还可以,虽然没能蹭上热点,但是评论区和弹幕还是有不少小伙伴表示了认可和赞赏。
|
||||
- 折腾 Azure windows vm, 未果,教训是远离 win vm, 太麻烦了
|
||||
- 折腾智能家居,入手了空调伴侣、远程控制空调和红外控制风扇等,体验不错,值得颁一个年度好物奖 👍
|
||||
- 五一难得趁假期回了趟家,久违的又遇见了初夏季节的家乡
|
||||
- 去广州看杨千嬅的演唱会,不得不说实力派歌手的现场真的很棒
|
||||
- 借着朋友还没毕业的机会,逛了下广州大学城,看了场篮球赛,短暂的感受了一下没有疫情下的,慢慢的校园活力
|
||||
- 部门团建,去贵州玩了几天,风景很好,活动也很精彩,短短四天玩的很开心很充实,不知道是不是因为平时节假日都是中午才起,白天太短,这次加上往返只有四天但是感觉玩了整整一个星期
|
||||
- 折腾 GPT 和 wordpress, 尝试通过 AI 自动生成内容建站,后面发现对中文支持不太行,人工审校还是需要花不少经历
|
||||
- 折腾智能家居,买的窗帘伴侣不能接 Home Assistant, 不能每天早上定时开启,很烦,尝试通过闲置的安卓手机模拟操控,打开米家每天定时开窗帘。为此又久违的操起了 ROOT 安卓手机的旧活,最后终于在 Mi6 上跑起来类原生的 Android 13
|
||||
- 脑袋一热研究 AI 写网文小说,脑洞打开写了不少,可惜网文要求的水分实在太大,AI 对于超长上下文也处理不好,不太听使唤
|
||||
- 折腾旁路由,OpenWRT on Raspberry Pi 的方案最终失败,OpenWRT 对容器场景并没有做优化,插件更新和升级等的体验比较糟糕,再叠加其他一些因素,后面回归独立路由器 OpenWRT 的方案
|
||||
- 折腾 NAS on Cloud, 由于网络环境变化,在家里连接我那新加坡的服务器使用 plex 时晚高峰丢包非常严重,折腾了好久的内核参数和 TCP 协议,最后发现在丢包率高达 20+%的情况下神仙来了也没用
|
||||
- 疯狂追剧 The Simpsons 系列
|
||||
- 折腾双语字幕的自动化方案,自动从 bundle 了多国语言字幕的视频资源文件中提取两种语言字幕并合并,以及根据 SDH 字幕自动把网上搜到的双语字幕进行时间轴对齐操作
|
||||
- 办公室坐太久,切身体会到对身体的影响,火速下单腰靠和人体工学鼠标等配件,不得不说,用上之后确实能缓解不少,日常也开始多多注意一些屏幕前久坐的坏习惯
|
||||
- 折腾把窗帘伴侣接入 Home Assistant 无果,又不想自己写驱动适配,后面妥协还是入手了小米的多模网关。回头想想自己花了那么多时间和精力,投入的远远不止网关这点钱,真是不值当
|
||||
- 赶上中秋和十一连休,超长假期又回了趟老家
|
||||
- 香港初体验,不由得感叹香港在文化氛围、无障碍设施覆盖、商业活力真的很好,相较于内地的一线城市还要高一个层次
|
||||
- 拿起吃灰许久的电饭煲折腾自制酸奶,味道还不错
|
||||
- 双十一疯狂剁手,入手了 3D 打印机、超迷你精悍全金属的双网口迷你小主机等等,以及在某东几分钱几毛钱薅了一堆羊毛,包括两毛钱包邮的十棵多肉,薅羊毛薅的欲罢不能
|
||||
- 借着参加婚礼的机会,连休了一周,在湖南玩了一大圈,景区人很少,错峰出来玩又是一周连休真的很爽
|
||||
- 入坑老头环,开场被虐的体无完肤,后面才发现逃课才是最大的乐趣
|
||||
- 疯狂追剧星际牛仔
|
||||
- 疯狂追剧浩瀚苍穹系列
|
||||
- 又跑了一趟香港办卡,本来以为流程会很麻烦没想到当天现场就丝滑下卡
|
||||
- 打卡少数派线下店,有些硬件的东西还是实际摸起来更有感觉
|
||||
- 2023 the end
|
||||
122
content/posts/2023静态网站托管服务速度对比.md
Normal file
122
content/posts/2023静态网站托管服务速度对比.md
Normal file
@@ -0,0 +1,122 @@
|
||||
---
|
||||
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 测个速
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
**测速后结论:**
|
||||
|
||||
- Vercel 全部爆炸,大陆地区全部不通
|
||||
- Netlify 对三家支持都比较不错,不过都有些不太稳定
|
||||
- Cloudflare 对电信友好,联通次之,移动大规模连不上
|
||||
- Azure 电信友好,联通次之,移动也是大规模连不上
|
||||
|
||||
## 特邀嘉宾:腾讯云海外 CDN
|
||||
|
||||
号称「充钱就可以获得力量」,那么让我们来看下冲了钱后的效果
|
||||
|
||||

|
||||
|
||||
##### 腾讯云海外 CDN
|
||||
|
||||
- 大陆地区大部分路由到香港,极少数华东地区路由到美国,全部为 AWS 节点
|
||||
- 移动除西北地区外都尚可,联通次之也是除西北外都还行,电信惨不忍睹
|
||||
|
||||
> **用腾讯云 CDN 被 D 怎么办?天价账单可付不起**
|
||||
> 小时结计费模式,欠费后保护期为 2 小时,还可以按流量或带宽单独设定防护策略
|
||||
|
||||
接下来开始真正的试炼:检测晚高峰期间各家的性能,晚上这个点各大运营商的出口都比较拥堵,这个时候更能体现出各家的性能优劣
|
||||
|
||||
## 晚高峰测速结果
|
||||
|
||||

|
||||
|
||||
Azure 全线炸裂 ⬆️
|
||||
|
||||

|
||||
|
||||
Netlify 依然给力 ⬆️
|
||||
|
||||

|
||||
Vercel 依然一片红 ⬆️
|
||||
|
||||

|
||||
CF 跟白天差不多,电信联通勉强可用 ⬆️
|
||||
|
||||

|
||||
|
||||
TX 海外 CDN 红绿参半,不过可以看到很强的地域特性
|
||||
|
||||
#### 其他补充信息:
|
||||
|
||||
##### Vercel
|
||||
|
||||
- 不能自定义 HTTPS 证书,走 Let‘s Encrypt
|
||||
- 有 Anycast,76.76.21.21,用 DNS 做负载均衡会比较方便
|
||||
- 使用分钟级监控看过,时不时有连不上的情况,比 Cloudflare 明显差些,不过免费没有 SLA 保障也正常
|
||||
- 大陆地区全部爆炸,不予考虑
|
||||
|
||||
##### Netlify
|
||||
|
||||
- 可以自定义 HTTPS 证书
|
||||
- 无 Anycast,去年看都是 AWS 承载,今年看有近一半由 Google Cloud 承载
|
||||
- 移动可以优先 Netlify
|
||||
- 可以安装插件,网站更新可以自动推送 Google 比较方便
|
||||
- 全部路由到新加坡,北方用户可能延迟较高
|
||||
|
||||
##### Cloudflare Pages
|
||||
|
||||
- Cloudflare 可以自己签发证书,不像其他使用 Let‘s 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)
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ date: 2019-04-08
|
||||
lastmod: 2020-04-29
|
||||
description: 经过两三天的折腾,从 Linux 结构及指令,到 LNMP 框架搭建,再到数据库的配置,最后端口转发 + 内网穿透,博客终于成功上线!在此将部署过程及踩过的坑记录下来,一方面是纪念,另一方面希望能够后来人提供一点帮助。
|
||||
categories:
|
||||
- 踩坑记
|
||||
- 技术
|
||||
tags:
|
||||
- Blog
|
||||
- 网站
|
||||
|
||||
@@ -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:
|
||||
|
||||
> 自动分割给定的英文文本,提取词元后在数据库中搜索,根据给定的词汇量和难度等级进行筛选,只能提取阅读障碍词汇并高亮当前备考项目(如四级)的重点单词
|
||||
|
||||

|
||||

|
||||
|
||||
## 知乎爬虫及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 服务器搭建与极限优化
|
||||
|
||||
> 1核2G学生机,从2人联机频频崩溃到8人挖矿毫无压力,学习了JVM GC种种,对服务端程序的一些参数也渐渐熟悉。优化效果喜人,总有还能压榨的性能,就像资本家看手下的骡子一样hhh
|
||||
> 1 核 2G 学生机,从 2 人联机频频崩溃到 8 人挖矿毫无压力,学习了 JVM GC 种种,对服务端程序的一些参数也渐渐熟悉。优化效果喜人,总有还能压榨的性能,就像资本家看手下的骡子一样 hhh
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
## 洞洞板/冰箱贴/CVPRO/(...没想好名字)
|
||||
|
||||
> 一款跨平台的灵感素材收集与简易管理App,基于Flutter构建,跨平台,颜值在线。
|
||||
> 一款跨平台的灵感素材收集与简易管理 App,基于 Flutter 构建,跨平台,颜值在线。
|
||||
|
||||

|
||||

|
||||
|
||||
> 持续开发中,附roadmap
|
||||
> 持续开发中,附 roadmap
|
||||
>
|
||||
> version 1.0
|
||||
>
|
||||
|
||||
@@ -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中实现拖动排序的列表非常简单,使用官方的`ReorderableL
|
||||
}
|
||||
```
|
||||
|
||||
上面是官方给的demo,简洁明了。[官方介绍视频](https://www.youtube.com/watch?v=yll3SNXvQCw)下面的评论里,人家直呼比原生Android写的过瘾的多。阅读文档后我给我的App的界面也加上了可拖动排序的功能。效果如下图
|
||||
上面是官方给的 demo,简洁明了。[官方介绍视频](https://www.youtube.com/watch?v=yll3SNXvQCw)下面的评论里,人家直呼比原生 Android 写的过瘾的多。阅读文档后我给我的 App 的界面也加上了可拖动排序的功能。效果如下图
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
虽然可以实现拖动了,但是右边有一个按钮很碍眼。不过这个是用来控制拖动的,鼠标移上去才能触发拖动。
|
||||
|
||||
翻了翻文档发现,这个地方`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`就不能再有响应了。刚好今天完成了滑动删除的实现,现在列表也的删除、排序已经高度可用且多平台统一了。
|
||||
|
||||

|
||||

|
||||
|
||||
附相关代码实现:
|
||||
|
||||
|
||||
315
content/posts/Huginn指南:为任意网站制作RSS.md
Normal file
315
content/posts/Huginn指南:为任意网站制作RSS.md
Normal file
@@ -0,0 +1,315 @@
|
||||
---
|
||||
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 选择器来指定爬取该项
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
该元素可以用 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 选择器是否正确以及是不是提取的你想要的内容
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
接下来在 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 属性值并删除多余的空白字符
|
||||
|
||||

|
||||
|
||||
接下来点击 Dry Run 按钮进行测试,不出意外我们会得到一个 json 的输出,里面包括我们爬取到的每一项他的 url 和 title。
|
||||
|
||||
如果没有成功,你可能需要删掉上面没有使用到的 hovertext 节点,因为该项指定的内容在我们刚才的网页中并不存在。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
点击 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.
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**Propagate immediately**是指即时处理来自 Source Agent 的 Event,启用他方便我们调试,但会略微增加服务器负载,你可以自行决定是否使用。
|
||||
|
||||

|
||||
|
||||
在 secret 字段中为你的这个 RSS 标注一个英文的名字,修改 title 字段标注你的 RSS 的名字。item 字段是每条文章会有的属性,一般来说主要就 title 和 link,分别设置为上文我们提取的值的变量名。这里添加一个 guid 字段,这是一篇文章的唯一标识符,避免 RSS 阅读器读到的文章标题不同但是内容相同,常见于某篇文章的标题被修改,这会导致 RSS 阅读器内出现多篇重复文章。
|
||||
|
||||
此外建议增加一个 link 字段,值设置为与爬取的网站的主域名一致,避免网站内使用相对链接开头的资源无法正常加载。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
点击 Save 保存,回到 Scenario 界面,第一次需要手动点击运行一下刚才的 Website Agent。稍等片刻后台会进行爬取,右上角会显示产生了多少个 Event。再点开刚才设置的 Data Output Agent 查看详情,vola!右侧就会显示生成的 RSS 链接了,复制以 xml 结尾的链接到 RSS 阅读器中就可以订阅啦🎉
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
如果你的配置正确但是 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 动态生成的
|
||||
|
||||

|
||||
|
||||
按照以下内容设置你的 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`字段且里面有文本内容说明调用成功。
|
||||
|
||||
调用不成功检查一下配置,以及是不是我们的爬虫被目标网站拦截了。若是爬虫被拦截可参考文末的解决方案。
|
||||
|
||||

|
||||
|
||||
接下来点击 Save 保存,再新建一个 Website Agent,Source 设置为刚才的 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 Agent,RSS 的链接就出来了
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 使用 PhantomJS 为动态页面生成 RSS
|
||||
|
||||
首先需要到[Phantom Js Cloud 的官网](https://phantomjscloud.com)注册一个账户,每个账户官方提供了一定的免费额度,每天大概可以爬取 500 个页面,对于做 RSS 来说妥妥的够用了。注册之后可以得到一个 API KEY,这个待会会使用到。
|
||||
|
||||
接下来新建一个 Phantom JS Cloud Agent,填写基本的名称、API KEY 和目标 URL,render 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 Agent,Source 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 就可以看到结果
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这里是刚才的 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,可以理解为有特定功能的函数
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 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/)
|
||||
|
||||
@@ -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 几个显著的优势**:
|
||||
|
||||
* 页面为静态,TTFT(TimeToFirstByte)的时间可以降到非常低
|
||||
* 页面为静态,服务器遭受的安全风险要低得多
|
||||
* 不同于客户端渲染,JAMStack对SEO会非常友好
|
||||
* 不同于客户端渲染,JAMStack 对 SEO 会非常友好
|
||||
* 不同于传统纯静态网站,内容可以方便地动态更新
|
||||
|
||||
## 为什么选择Gatsby
|
||||
## 为什么选择 Gatsby
|
||||
|
||||
|
||||
|
||||
作为一个网站生成器Site Generator,Gastby的入门门槛其实是较高的,相对于Hexo、Hugo那种简简单单配置下就是一个站点,Gatsby的难度要更高,因为其灵活度更大,所有的配置、页面都是Javascript来配置的,当然你也可以使用Typescript。其基于React,生态丰富且灵活度高,天生`GarphQL`是选择它的主要原因。
|
||||
作为一个网站生成器 Site Generator,Gastby 的入门门槛其实是较高的,相对于 Hexo、Hugo 那种简简单单配置下就是一个站点,Gatsby 的难度要更高,因为其灵活度更大,所有的配置、页面都是 Javascript 来配置的,当然你也可以使用 Typescript。其基于 React,生态丰富且灵活度高,天生`GarphQL`是选择它的主要原因。
|
||||
|
||||
|
||||
|
||||
@@ -46,22 +46,22 @@ JAMStack是一种新颖的网站架构,与传统的服务端渲染和近些年
|
||||
|
||||
流程:
|
||||
|
||||
1. 我在其他地方看到不错的文章,将其收藏到Pocket
|
||||
2. 定时任务,从`Pocket API`获取文章数据,交给Gatsby生成站点
|
||||
3. 自动部署,将生成的静态文件部署到CDN
|
||||
4. [reading.colinx.one](reading.colinx.one)站点主页就会出现我收藏的文章啦
|
||||
1. 我在其他地方看到不错的文章,将其收藏到 Pocket
|
||||
2. 定时任务,从`Pocket API`获取文章数据,交给 Gatsby 生成站点
|
||||
3. 自动部署,将生成的静态文件部署到 CDN
|
||||
4. [reading.colinx.one](https://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。你也可以去申请自己的Pocket API然后部署你自己的站点。
|
||||
项目已经开源,地址在[https://github.com/Colin-XKL/Colinx-Reading.git](https://github.com/Colin-XKL/Colinx-Reading)。你也可以去申请自己的 Pocket API 然后部署你自己的站点。
|
||||
|
||||
初始尝试JAMStack,感觉对于博客、文档这类的站点会非常友好,国外比较火的像Shopify这种的无头电商也不错,国内的碍于国情应该不大可能了。
|
||||
初始尝试 JAMStack,感觉对于博客、文档这类的站点会非常友好,国外比较火的像 Shopify 这种的无头电商也不错,国内的碍于国情应该不大可能了。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
---
|
||||
title: LLM Agent is All You Need - 当我用大模型助手来指导我完成MVP产品 - 「Colin's Weekend Project」
|
||||
date: 2025-09-14
|
||||
description: 我个人喜欢挑一个周末在一个很短很专注的时间内, 捣鼓点小玩意. 这个栏目用来记录我的这些 idea、作品、创作过程以及吐槽. 今天来挑战一下, 在大模型的指导下, 完成一个最小可行产品(MVP)
|
||||
categories:
|
||||
- Weekend Project
|
||||
tags:
|
||||
- 技术
|
||||
- JAMStack
|
||||
- LLM
|
||||
- AI
|
||||
---
|
||||
|
||||
> **「Colin's Weekend Project」**
|
||||
> 我个人喜欢挑一个周末在一个很短很专注的时间内, 捣鼓点小玩意. 这个栏目用来记录我的这些 idea、作品、创作过程以及吐槽
|
||||
|
||||
今天来挑战一下, 在大模型的指导下, 完成一个最小可行产品(MVP)
|
||||
|
||||
|
||||
|
||||
## idea
|
||||
|
||||
如果单纯是开发一个完整的 web 程序 or 移动端程序, 其实没啥意思. 我之前已经搞过很多, 更别提日常在公司里面就是在开发各种功能. 今天我打算以一个非专业人士的视角, 探究一下:
|
||||
|
||||
- 当下各种 AI 助手已经百花齐放, 飞入寻常百姓家. 但是当下的 AI 在真实世界的任务中, 究竟能做到什么地步
|
||||
- 如果作为一名非专业人士, 究竟能不能借助这些 AI 工具做出一个可用的产品
|
||||
- 如果真正要做一个面向 C 端的产品, 把流程 Run 起来持续下去, 需要考虑哪些因素
|
||||
|
||||
## 如果一切都从 LLM 开始...
|
||||
|
||||
我需要代入一个非专业开发人员的视角, 来进行这次的项目. 首先项目启动的第一个问题: 在没有任何产品经理的知识, 不懂得产品开发流程的小白的情况下, 我需要如何开始?
|
||||
|
||||
在没有 LLM 以前, 或许我需要先各种查阅资料学习, 或者各种摇人让懂行的朋友进行指导. 但是现在, 一切都不一样了: 随便一个 LLM 都可以帮我快速入门
|
||||
|
||||
一开始, 我是打算接住 LLM 让我快速了解产品相关的知识. 但是突然觉得, 既然都用 AI 了,为什么还在遵循原有的路径, 一步步自己学习、理解然后教 AI 做事呢? 换个思路, 我只要提供需求, AI 来拆解任务.
|
||||
|
||||
于是
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
利用 AI 生成一套提示词, 来指导我如果分析我的需求、拆解任务
|
||||
|
||||
不得不说, 对于这些跨领域的知识, 能有一个不厌其烦的 AI 助手来循序渐进地跟你交流、帮你分析, 效果非常好. 人类可能还真不好干这个活.
|
||||
|
||||
## 「AI 教我做产品」
|
||||
|
||||
经过跟这个「MVP 导师」的 LLM Agent 反复沟通, 确定了产品的主要构想和核心事项. 以下是摘录的一部分
|
||||
|
||||
```markdown
|
||||
#### MVP 概要(3 句话)
|
||||
|
||||
- **为谁**:20‑30 岁、周末感到无聊且有意愿尝试新事物的年轻人。
|
||||
- **解决什么痛点**:不清楚该尝试哪些活动、如何快速入门、活动是否适合自己、以及能获得什么收益。
|
||||
- **提供的核心功能**:活动列表页面 → 点击感兴趣的活动 → 展示入门门槛与材料推荐(入门材料按钮)并埋点上报。
|
||||
```
|
||||
|
||||
```markdown
|
||||
## MVP 核心功能:
|
||||
1. **活动列表**:集中展示多种可入门活动(绘画、球类、手工等)。
|
||||
2. **入门详情**:点击任意活动 → 展示入门门槛、必备材料、推荐教程链接。
|
||||
3. **埋点追踪**:记录 “点击 → ≥1 min 外部阅读 → 回站” 行为,用于验证假设。
|
||||
```
|
||||
|
||||
这里印象深刻的是, MVP 导师让我先确保用户痛点一定要是真实的, 在初期没有论证的情况下, MVP 的意义就在于基于一个假设(假设用户的痛点是 xxx), 我们要围绕这个痛点先开发出 1-2 个核心功能, 然后通过用户数据分析, 来验证我们关于用户痛点的假设是否成立. 如果不成立说明是伪需求, 也就没有继续投入的必要了.
|
||||
|
||||
这一点还是让我挺惊喜的, 因为大部分人有个 idea 想做 xx 产品, 大部分都是脑门一热, 想要有 xxx 功能但是其实根本的需求并不是这个. 花了很多精力搞出来的功能其实是伪需求. 而 AI 导师专业水准还是挺在线的, 能够在一开始就识别这个风险
|
||||
|
||||
## Vibe Coding
|
||||
|
||||
接下来就是要进入开发的部分了. 我选择的 AI 代码工具是字节的 Trae 海外版, 不用验证手机号而且可以使用 Google Gemini、OpenAI GPT-4o、Anthropic Claude 4 等高级模型.
|
||||
|
||||
首先让 AI 根据产品需求文档、拆解任务文档, 确定了技术方案. 不过这里我为了效率简化了下&注入了一些自己的私房调料, 最终使用的方案为:
|
||||
|
||||
- astro + vue3 + tailwind css 来构建 web 站点
|
||||
- directus cms 作为后端,省去编写后端和对接数据库的麻烦
|
||||
- vercel 快速部署
|
||||
|
||||
这部分没啥好说的, 简单列几个吐槽的点吧:
|
||||
|
||||
- astro 配置 tailwindcss, 换了一圈大模型没一个正确的. 应该是跟近期大版本更新有关系. 最后还是我手动跟着 astro 官方的文档搞定的
|
||||
- trae 高级模型试用额度很低, 没写几个功能就超限了开始排队, 动不动前面几百号人基本没法用
|
||||
- 现阶段 AI IDE 基本都是基于 vs code 改的. 所以 vscode 的缺点也都一并继承了过来, 很多语言的插件需要额外手动安装、各种变量跳转用不了、各种奇怪的波浪线报错又没法快速修正
|
||||
|
||||
最后简要看下最终的成果吧
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
后台数据:
|
||||

|
||||
|
||||
## 埋点上报与用户行为分析
|
||||
|
||||
之前做的都是玩具项目和公司内部平台, 没怎么接触过 C 端用户行为分析. 这块确实还是个挺陌生的领域. 不过好在我们有万能的 AI. 在经过埋点需求分析、 技术方案对比、任务拆解之后, 最后采用了 Umami 平台来进行上报, 并简单配置了下指标用于计算用户停留, 辅助验证我们关于用户痛点的假设
|
||||
|
||||

|
||||
|
||||
跟 MVP 导师沟通的时候,确定了验证假设的方式为: 衡量用户是否点击「查看详情」按钮
|
||||
|
||||
- 用户点击并在外部阅读 ≥ 1 分钟后回站
|
||||
- 成功阈值: ≥ 25 % 的访问者完成“点击 → ≥ 1 min 回站
|
||||
|
||||
为了方便统计, 借助 umaimi 的统计功能快速实现, 我只需要统计有多少比例的用户至少点击了一次「了解详情」. 具体到代码实现上, 就是在「点击详情」按钮添加一个上报, 上报内容包括用户的 session id, 后面在 umaimi 统计一段时间内, 按钮点击事件里面, 有多少独立的 session id 处以总的 uv 就可以.
|
||||
|
||||

|
||||
|
||||
## 投放
|
||||
|
||||
众所周知, 天朝桌面端 web 用户已经约等于 0 了, 技术博客都很少人看, 更别提这种泛娱乐向的内容. MVP 导师提供的方案, 也是路线正确, 但是 web 端用户数据反馈验证的路子基本没用. 不过这个 web 页面我也不指望能成为流量主力, 最多算个 wiki.
|
||||
|
||||
要想真的有人看, 收获真实用户反馈, 还是需要到各种新媒体平台去投放的. 然后再收集数据进行分析, 不过这个工作量就是另外一回事了. 运营起来还是需要挺多时间精力的.
|
||||
|
||||
尝试做了几个图投放到小红书, 放几个示例图
|
||||
|
||||

|
||||
|
||||
用的搞定设计的模版调整了下, 插图是用 Gemini, 效果还可以, 能很好地遵循用户指令, 不过美学方面跟 MidJourney 那些还是差了一截, 毕竟人家专攻的方向. 提示词里面限制好风格的话出图效果还是可以的, 这里后续如果有必要的话, 其实也可以 AI 批量生产插图.
|
||||
|
||||
不过小红书账号冷启动, 反响平平. 这里后续有时间再研究吧
|
||||
|
||||
## The End
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
title: Mac 平台配置C/Python/Java学习环境
|
||||
title: Mac 平台配置 C/Python/Java 学习环境
|
||||
date: 2020-12-18
|
||||
lastmod: 2020-12-19
|
||||
description: Mac 平台配置C/Python/Java学习环境
|
||||
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 的指令。在终端中进行查看:
|
||||
|
||||

|
||||

|
||||
|
||||
输入`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)。
|
||||
|
||||

|
||||

|
||||
|
||||
安装完毕后,打开会看到如下图所示的界面。默认界面为英文,下面对其进行汉化并安装一些必要的插件。
|
||||
|
||||

|
||||

|
||||
|
||||
单击方形图标,打开扩展面板。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015621.png" alt="image-20201218223234296" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015621.png" alt="image-20201218223234296" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
搜索`chinese`安装汉化插件。
|
||||
|
||||

|
||||

|
||||
|
||||
搜索`code runner`安装Code Runner插件。并按指示重启应用(Reload字样)
|
||||
搜索`code runner`安装 Code Runner 插件。并按指示重启应用(Reload 字样)
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015620.png" alt="image-20201218222511011" style="zoom:50%;" />(截图中因为本地已安装故只显示了Uninstall卸载按钮。未安装的情况下会显示Install按钮可点击安装)
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015620.png" alt="image-20201218222511011" style="zoom:50%;" />(截图中因为本地已安装故只显示了 Uninstall 卸载按钮。未安装的情况下会显示 Install 按钮可点击安装)
|
||||
|
||||
其他插件可根据需要安装。此处推荐安装C/C++插件以实现C代码的高亮和补全等功能。
|
||||
其他插件可根据需要安装。此处推荐安装 C/C++ 插件以实现 C 代码的高亮和补全等功能。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015624.png" alt="image-20201218223432859" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015624.png" alt="image-20201218223432859" style="zoom:50%;" />
|
||||
|
||||
重启后进入应用,界面自动切换到中文。再点击扩展图标,展开扩展列表,在已安装扩展中找到**Code Runner**,点击齿轮图标展开菜单,点击进入扩展设置。<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015627.png" alt="image-20201218224215676" style="zoom:50%;" />
|
||||
重启后进入应用,界面自动切换到中文。再点击扩展图标,展开扩展列表,在已安装扩展中找到**Code Runner**,点击齿轮图标展开菜单,点击进入扩展设置。<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015627.png" alt="image-20201218224215676" 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%;" />
|
||||
在输入栏中,在当前选项卡为**用户**的情况下,输入`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%;" />
|
||||
|
||||
|
||||
|
||||
完成了上述的设置,我们就可以来编写C语言的程序了。
|
||||
完成了上述的设置,我们就可以来编写 C 语言的程序了。
|
||||
|
||||
### Hello,C!
|
||||
|
||||
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
|
||||
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.c`
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
|
||||
键入代码。
|
||||
|
||||

|
||||

|
||||
|
||||
点击右上角的三角形按钮即可自动编译运行你的C语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
|
||||
点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
|
||||
|
||||

|
||||

|
||||
|
||||
### 完成✅
|
||||
|
||||
现在,开始你的C语言学习之旅吧!
|
||||
现在,开始你的 C 语言学习之旅吧!
|
||||
|
||||
|
||||
|
||||
## 配置Python语言学习环境
|
||||
## 配置 Python 语言学习环境
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 检查Python环境
|
||||
### 检查 Python 环境
|
||||
|
||||
Mac系统会自带有Python环境。在终端中输入python并回车。
|
||||
Mac 系统会自带有 Python 环境。在终端中输入 python 并回车。
|
||||
|
||||

|
||||

|
||||
|
||||
可以看到系统已经安装有Python,但是显示版本为2.7。现在的主流版本是Python3,Python2与Python3的语法并不兼容。
|
||||
可以看到系统已经安装有 Python,但是显示版本为 2.7。现在的主流版本是 Python3,Python2 与 Python3 的语法并不兼容。
|
||||
|
||||
在`>>>`后面键入`exit()`退出python2的交互程序。再次在终端输入`python3`
|
||||
在`>>>`后面键入`exit()`退出 python2 的交互程序。再次在终端输入`python3`
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
此时显示的版本为3.8.6。
|
||||
此时显示的版本为 3.8.6。
|
||||
|
||||
### Hello, Python!
|
||||
|
||||
在交互式命令行界面,我们可以直接输入python语句并执行。
|
||||
在交互式命令行界面,我们可以直接输入 python 语句并执行。
|
||||
|
||||

|
||||

|
||||
|
||||
一句一句地输入代码再执行显然太低效了。我们需要一个趁手的代码编辑器。
|
||||
|
||||
下面以VSCode为例。
|
||||
下面以 VSCode 为例。
|
||||
|
||||
|
||||
|
||||
**VSCode的下载和基本配置**请参考上文C语言环境配置中VSCode的配置环节。
|
||||
**VSCode 的下载和基本配置**请参考上文 C 语言环境配置中 VSCode 的配置环节。
|
||||
|
||||
完成基本的设置后,来安装Python的专属插件,以实现Python代码的高亮、补全等功能。
|
||||
完成基本的设置后,来安装 Python 的专属插件,以实现 Python 代码的高亮、补全等功能。
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
|
||||
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.py`
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
|
||||
键入代码。
|
||||
|
||||

|
||||

|
||||
|
||||
点击右上角的三角形按钮开始运行我们编写的代码
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
下载完成后点击打开,出现如下的安装界面。根据指引完成安装。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
安装完成后,在终端中输入`java -version`并回车确认。看到如下输出说明已经正确安装且Java的版本为`11.0.9.1`即Java 11.
|
||||
安装完成后,在终端中输入`java -version`并回车确认。看到如下输出说明已经正确安装且 Java 的版本为`11.0.9.1`即 Java 11.
|
||||
|
||||

|
||||

|
||||
|
||||
下面来为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.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015641.png" alt="image-20201218235514041" style="zoom:50%;" />
|
||||
<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/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
|
||||
|
||||
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.java`
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
|
||||
|
||||
键入代码。
|
||||
|
||||

|
||||

|
||||
|
||||
可以看到,在窗口下方的终端面板中,已经成功出现了**Hello, Java!**字样,代码运行成功。
|
||||
|
||||

|
||||

|
||||
|
||||
### 完成✅
|
||||
|
||||
至此,Mac平台下的Java语言学习环境配置完毕,开始你的Java学习之旅吧!
|
||||
至此,Mac 平台下的 Java 语言学习环境配置完毕,开始你的 Java 学习之旅吧!
|
||||
|
||||
|
||||
|
||||
@@ -249,11 +249,11 @@ Mac OS并没有内置Java语言的支持,需要我们另外安装。
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. Java扩展安装弹出提示JDK版本过低
|
||||
### 1. Java 扩展安装弹出提示 JDK 版本过低
|
||||
|
||||
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201219015638.png" alt="image-20201218234917588" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.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 的代码都可以被很好地支持。
|
||||
|
||||
|
||||
@@ -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站不少做MC的UP主的内容挺有趣,于是尝试重新拾起MC。
|
||||
距离上一次玩 MC 已有四年之久,上次玩的时候还用的是家里的老爷机,连独显都没有,玩个整合包都费劲。如今设备早已更新换代,B 站不少做 MC 的 UP 主的内容挺有趣,于是尝试重新拾起 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到15,Hotspot和OpenJ9都有,可以按需选用。有arm版本,树莓派也可食用。
|
||||
搭建方案千千万,不过 Docker 来的最实在。Github 找到一个非常方便的镜像,[itzg/minecraft-server](https://github.com/itzg/docker-minecraft-server)。这个镜像是运行时构建的,会根据指定的环境变量下载和安装对应的 MC 服务端程序。支持的服务端有 Bukkit、Spigot、PaperSpigot、SpongeForge 等等,MC 的版本和各项参数均支持通过环境变量自定义,非常方便。而且可以通过更换不同的 Tag 来使用不同的 JDK 版本,从 8 到 15,Hotspot 和 OpenJ9 都有,可以按需选用。有 arm 版本,树莓派也可食用。
|
||||
|
||||
安装Docker和docker-compose后,可以方便地编写脚本来快速启动一个MC服务器。这里放上我的`docker-compose.yml`文件
|
||||
安装 Docker 和 docker-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.cos.ap-shanghai.myqcloud.com/MC/Distribution/VNR-1.0.1.zip" # 我自己会用的资源包,这里填url
|
||||
RESOURCE_PACK: "https://blog-1301127393.file.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 的主页的图:
|
||||
|
||||

|
||||

|
||||
|
||||
其他没有使用过的启动器暂时不予评价。
|
||||
|
||||
### MC本体安装
|
||||
### MC 本体安装
|
||||
|
||||
(正版玩家略过、整合包玩家略过)
|
||||
|
||||
推荐方式为启动器内安装,还可以顺带把Forge和OptiFine也安装了。
|
||||
推荐方式为启动器内安装,还可以顺带把 Forge 和 OptiFine 也安装了。
|
||||
|
||||
* 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关系选项卡,CurseForge的Mod介绍页的Relation选项卡。
|
||||
**注意**:上面列举的所有 Mod 都是 Mod 本体,有些 Mod 的功能还依赖于其他 Mod,在安装时必须同时安装 Mod 本体和他依赖的 Mod。具体的依赖关系可以参考 mcmod.cn 上对 Mod 介绍页的 Mod 关系选项卡,CurseForge 的 Mod 介绍页的 Relation 选项卡。
|
||||
|
||||
|
||||
|
||||
> **踩坑笔记**
|
||||
>
|
||||
> 1. R键整理的快捷键与JEI的部分功能冲突,可自行修改快捷键
|
||||
> 2. R键整理对烹饪工艺中生产出来的菜品没辙
|
||||
> 3. 推荐仅将FTB-Ultimine用于挖泥巴和挖沙,实际使用时可能会出现挖了矿不掉东西的情况┭┮﹏┭┮
|
||||
> 4. 不要用铁镐、钻石镐开FTB-Ultimine挖东西!耐久掉的飞快
|
||||
> 5. DynamicSurroundings可以在设置里按需屏蔽特定的声音,比如装上后发现我家所在的地形会有乌鸦叫,就很烦。屏蔽之后整个世界都好起来了
|
||||
> 6. DynamicSurroundings与Animania有bug,对Animania的某些特有生物进行交互时会触发找不到特定媒体资源的bug,导致游戏崩溃,重新进入又会触发这个bug,只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环(血泪的教训)(最新版本已修复)
|
||||
> 7. Animania会对每个维度的世界进行注入,比较耗费资源。在同时安装虚无世界AoA的情况下,每次服务器启动Animania需要对其包含的二十多的世界维度进行注入,严重拖慢启动速度
|
||||
> 8. Quark模组对1.12的MC只有1.6版本而没有后续版本的内容更新和bug修复。实际使用中有点吃性能
|
||||
> 1. R 键整理的快捷键与 JEI 的部分功能冲突,可自行修改快捷键
|
||||
> 2. R 键整理对烹饪工艺中生产出来的菜品没辙
|
||||
> 3. 推荐仅将 FTB-Ultimine 用于挖泥巴和挖沙,实际使用时可能会出现挖了矿不掉东西的情况┭┮﹏┭┮
|
||||
> 4. 不要用铁镐、钻石镐开 FTB-Ultimine 挖东西!耐久掉的飞快
|
||||
> 5. DynamicSurroundings 可以在设置里按需屏蔽特定的声音,比如装上后发现我家所在的地形会有乌鸦叫,就很烦。屏蔽之后整个世界都好起来了
|
||||
> 6. DynamicSurroundings 与 Animania 有 bug,对 Animania 的某些特有生物进行交互时会触发找不到特定媒体资源的 bug,导致游戏崩溃,重新进入又会触发这个 bug,只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环(血泪的教训)(最新版本已修复)
|
||||
> 7. Animania 会对每个维度的世界进行注入,比较耗费资源。在同时安装虚无世界 AoA 的情况下,每次服务器启动 Animania 需要对其包含的二十多的世界维度进行注入,严重拖慢启动速度
|
||||
> 8. Quark 模组对 1.12 的 MC 只有 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,77 +330,76 @@ MC服务器的优化主要聚焦在两个地方
|
||||
|
||||
明确了上面两点我们可以开始着手进行优化了。
|
||||
|
||||
首先需要明确你开MC服务器的机器是什么配置。以我的为例,我使用的是腾讯云的**1核2G的云服务器**,**带宽2M**,即峰值速度为256k/s。
|
||||
首先需要明确你开 MC 服务器的机器是什么配置。以我的为例,我使用的是腾讯云的**1 核 2G 的云服务器**,**带宽 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`
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
那么以我的情况来看
|
||||
|
||||
* CPU性能富余
|
||||
* CPU 性能富余
|
||||
* 内存吃紧
|
||||
* 带宽够用
|
||||
|
||||
那么**我的优化目标**就是:利用好CPU资源,尽力减少内存占用,以便为其他程序让路,并且为未来可能要添加的新Mod留出空间。
|
||||
那么**我的优化目标**就是:利用好 CPU 资源,尽力减少内存占用,以便为其他程序让路,并且为未来可能要添加的新 Mod 留出空间。
|
||||
|
||||
|
||||
|
||||
##### 优化
|
||||
|
||||
JVM优化的大头是GC。网上吹的漫天飞的G1GC的确有他的可取之处,一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中,使用G1GC是有问题的:
|
||||
JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取之处,一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中,使用 G1GC 是有问题的:
|
||||
|
||||
* **G1GC天生是为了现代互联网应用环境而设计的**,需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器+大内存机器上的高负荷运算。而我的服务器是单核,内存也并不富裕。
|
||||
* **多线程的GC模式跑在单核机器上**时出现的问题就是:单核机器无法并行处理多个任务,其本质上只是在多个任务之间快速切换,来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的,**性能损耗积少成多**。
|
||||
* **G1GC追求在延迟可控的情况下达到更高的吞吐量**。但他的**代价是[更多的内存占用](jvm G1 垃圾收集器有什么缺点? - SegmentFault 思否
|
||||
https://segmentfault.com/q/1010000021658061)。**小内存机器并不适合使用G1GC。
|
||||
* **G1GC 天生是为了现代互联网应用环境而设计的**,需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器 + 大内存机器上的高负荷运算。而我的服务器是单核,内存也并不富裕。
|
||||
* **多线程的 GC 模式跑在单核机器上**时出现的问题就是:单核机器无法并行处理多个任务,其本质上只是在多个任务之间快速切换,来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的,**性能损耗积少成多**。
|
||||
* **G1GC 追求在延迟可控的情况下达到更高的吞吐量**。但他的**代价是[更多的内存占用](https://segmentfault.com/q/1010000021658061)。**小内存机器并不适合使用 G1GC。
|
||||
|
||||
物色了一番,我最终选择换用Serial GC代替原本的G1GC。
|
||||
物色了一番,我最终选择换用 Serial GC 代替原本的 G1GC。
|
||||
|
||||
> **Serial(-XX:+UseSerialGC)**
|
||||
>
|
||||
> 从名字我们可以看出,这是一个串行收集器。
|
||||
>
|
||||
> Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVM 、 ServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集,而是当 JVM 需要进行垃圾回收的时候,需暂停所有的用户线程,直到回收结束。
|
||||
> Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVM、ServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集,而是当 JVM 需要进行垃圾回收的时候,需暂停所有的用户线程,直到回收结束。
|
||||
>
|
||||
|
||||
|
||||
|
||||
##### 优化前后对比
|
||||
|
||||
1. 优化前MC服务器的资源占用情况
|
||||
1. 优化前 MC 服务器的资源占用情况
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
2. SERIAL GC (1 ONLINE)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
3. 进一步对mod优化后,2 online
|
||||
3. 进一步对 mod 优化后,2 online
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
##### 其他优化方法
|
||||
|
||||
更换GC只是众多优化方法中的一种,其他的诸如换用OpenJ9虚拟机也可以有不错的效果,可惜的是Forge对其的支持并不友好,只得作罢。还有启用指针压缩也可以获得不错的性能提升,不过JDK6_u23之后 `UseCompressedOops` 就已经被默认启用了,使用新版本Java基本不用关注这方面的优化了。
|
||||
更换 GC 只是众多优化方法中的一种,其他的诸如换用 OpenJ9 虚拟机也可以有不错的效果,可惜的是 Forge 对其的支持并不友好,只得作罢。还有启用指针压缩也可以获得不错的性能提升,不过 JDK6_u23 之后 `UseCompressedOops` 就已经被默认启用了,使用新版本 Java 基本不用关注这方面的优化了。
|
||||
|
||||
|
||||
|
||||
@@ -412,11 +411,11 @@ JVM优化的大头是GC。网上吹的漫天飞的G1GC的确有他的可取之
|
||||
|
||||
我家:
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -424,13 +423,13 @@ JVM优化的大头是GC。网上吹的漫天飞的G1GC的确有他的可取之
|
||||
|
||||
我安装的光影 Sildurs Vibrant Shaders v1.281 High 效果图
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
Better HUD + 旅行地图效果图
|
||||
|
||||

|
||||

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

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
[中文说明](https://github.com/Colin-XKL/RSSmanX/blob/master/README-zh_cn.md) | [English](https://github.com/Colin-XKL/RSSmanX/)
|
||||
|
||||
@@ -27,9 +24,9 @@ tags:
|
||||
|
||||
[RSSman X](https://github.com/Colin-XKL/RSSmanX) 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署,整合实用组件为你带来最佳 RSS 体验
|
||||
|
||||
**Feature: 简单一键部署,常用组件支持,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
|
||||
**Feature:简单一键部署,常用组件支持,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
|
||||
|
||||
## 快速开始
|
||||
### 快速开始
|
||||
|
||||
(若已安装 `docker` 和 `docker-compose`)
|
||||
|
||||
@@ -37,7 +34,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 信息源又不想跟着网上漫天飞的教程瞎折腾的话,那么你可以使用本仓库的脚本快速完成安装部署。
|
||||
|
||||
@@ -71,15 +68,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
|
||||
@@ -111,7 +108,7 @@ sudo apt install docker-compose
|
||||
- https://docs.docker.com/engine/install/
|
||||
- https://docs.docker.com/compose/install/
|
||||
|
||||
## 如何安装
|
||||
### 如何安装
|
||||
|
||||
安装好了 `docker` 和 `docker-compose` 后可以执行文章开头的快速开始的指令。或者可以按照下面的步骤手动操作:
|
||||
|
||||
@@ -133,7 +130,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 订阅管理与在线阅读工具
|
||||
@@ -165,7 +162,7 @@ RSS 订阅管理与在线阅读工具
|
||||
**Clash**
|
||||
智能路由与正向代理工具,用于解锁海外站点及提供海外 RSS 源的加速
|
||||
|
||||
# Acknowledgement
|
||||
## Acknowledgement
|
||||
|
||||
- [Tiny tiny RSS](https://tt-rss.org/)
|
||||
- [OpenCC](https://github.com/BYVoid/OpenCC)
|
||||
@@ -174,11 +171,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
|
||||
|
||||
266
content/posts/RSSManX安装部署指南.md
Normal file
266
content/posts/RSSManX安装部署指南.md
Normal file
@@ -0,0 +1,266 @@
|
||||
---
|
||||
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 的版本建议不要低于 19,docker-compose 的版本建议不要低于 1.20
|
||||
(注:Docker 新版本可使用`docker compose` 替代 `docker-compose`)
|
||||
|
||||
```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 的 repo,repo 里含有 docker 的软件包,[国内的镜像](https://mirrors.ustc.edu.cn/help/docker-ce.html)为 Docker CE 安装软件包的镜像
|
||||
- 现在我们要配置的是 Docker Hub 的 Mirror,Docker 里拉取 Image 默认会访问[Docker Hub](https://hub.docker.com),国内有多个 Docker Hub 镜像或是 Docker 镜像加速器,如[中科大的源](https://mirrors.ustc.edu.cn/help/dockerhub.html)
|
||||
|
||||
在`/etc/docker/daemon.json`文件中写入以下内容,如不存在可先行创建,注意 json 中列表的最后一项末尾是没有逗号的
|
||||
|
||||
```json
|
||||
{
|
||||
"registry-mirrors": [
|
||||
"https://hub-mirror.c.163.com",
|
||||
"https://mirror.baidubce.com",
|
||||
"https://docker.nju.edu.cn",
|
||||
"https://docker.mirrors.sjtug.sjtu.edu.cn",
|
||||
"https://dockerproxy.com",
|
||||
"https://docker.m.daocloud.io"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
update 20230720: 部分镜像源不再可用,更新镜像源配置。参考 https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6
|
||||
|
||||
配置完成后`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_ALLOW_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/)
|
||||
@@ -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/install
|
||||
|
||||
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164821.png" alt="image-20201224235413884" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164821.png" alt="image-20201224235413884" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
@@ -73,113 +73,113 @@ Cygwin的安装程序可以[从其官方站点下载](https://cygwin.com/install
|
||||
|
||||
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164829.png" alt="image-20201224235436360" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164829.png" alt="image-20201224235436360" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
如果让你选择安装路径的话,可以不用改,不过默认在C盘。自己改的话,一个尽量避免使用中文路径,还有一个就是要记住你自己自定义的路径,后面会用到。
|
||||
如果让你选择安装路径的话,可以不用改,不过默认在 C 盘。自己改的话,一个尽量避免使用中文路径,还有一个就是要记住你自己自定义的路径,后面会用到。
|
||||
|
||||
网络好的话,点击下一步会出来一个可用的国内镜像列表,那样的话随便选一个都可以直接进行后面的步骤。
|
||||
|
||||
网络条件不好的情况下,半分钟以内就会报错说网络连接失败。不过不用担心,接下来可以自己填写国内镜像地址。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164833.png" alt="image-20201224235644342" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.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.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164836.png" alt="image-20201224235719679" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.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.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164839.png" alt="image-20201225000518139" style="zoom:50%;" />
|
||||
<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/20201227164842.png" alt="image-20201225000604625" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164842.png" alt="image-20201225000604625" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
一般一到两分钟之内就可以下载完毕。如果过了很久还没有装完,要么是网络太垃圾,要么就是不小心勾了其他的软件,一直在安装。。。
|
||||
|
||||
#### 配置Cygwin
|
||||
#### 配置 Cygwin
|
||||
|
||||
下面要更改环境变量。如果你之前没有自定义安装目录的话,默认路径`C:\cygwin64\bin`。否则下文对应的地方使用你自定义的目录。
|
||||
|
||||
在开始菜单中找到`Windows系统` - 控制面板。如果这里没有的话,按`Windows徽标键`+`S`可以呼出搜索面板,可以在此搜索控制面板菜单项。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164856.png" alt="image-20201227152139118" style="zoom:50%;" />
|
||||
<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/20201227164910.png" alt="image-20201225001127874" style="zoom:50%;" />
|
||||
<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/20201227164913.png" alt="image-20201225000925342" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164913.png" alt="image-20201225000925342" style="zoom:50%;" />
|
||||
|
||||
在用户变量中,点击`Path`,点击下方编辑按钮进行编辑
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164916.png" alt="image-20201225000949291" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164916.png" alt="image-20201225000949291" style="zoom:50%;" />
|
||||
|
||||
输入Cygwin安装路径下的bin目录。如果你之前没有自定义安装路径,直接设置如图即可。否则设置为你自定义的路径。
|
||||
输入 Cygwin 安装路径下的 bin 目录。如果你之前没有自定义安装路径,直接设置如图即可。否则设置为你自定义的路径。
|
||||
|
||||
**注意:这一步只要添加这一个就好**,不要看我截图里面的很干净,就把其他的都删了
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164919.png" alt="image-20201225001045854" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.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.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164921.png" alt="image-20201225001234917" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164921.png" alt="image-20201225001234917" style="zoom:50%;" />
|
||||
|
||||
### 配置编辑器
|
||||
|
||||
安装完了编译器,可以先来Hello world了
|
||||
安装完了编译器,可以先来 Hello world 了
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
按住Shift键,右键点击文件夹空白处,会出现在此处打开Powershell窗口的选项。
|
||||
按住 Shift 键,右键点击文件夹空白处,会出现在此处打开 Powershell 窗口的选项。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227164932.png" alt="image-20201225001744160" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.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 文件。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
如果直接双击exe也可以,不过运行窗口会一闪而过,解决方案是在main函数末尾,return语句前,加一句getchar()。
|
||||
如果直接双击 exe 也可以,不过运行窗口会一闪而过,解决方案是在 main 函数末尾,return 语句前,加一句 getchar()。
|
||||
|
||||
|
||||
|
||||
配置VSCode的作为C语言学习环境
|
||||
## 配置 VSCode 的作为 C 语言学习环境
|
||||
|
||||
<span id="vscode">VSCode</span>是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
|
||||
VSCode 是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。
|
||||
|
||||
前往[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.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165016.png" alt="image-20201227155805507" style="zoom:50%;" />
|
||||
<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/20201227165019.png" alt="image-20201227155937465" 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/20201227165032.png" alt="image-20201227160939375" style="zoom:50%;" />
|
||||
<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/20201227165035.png" alt="image-20201227161003478" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165035.png" alt="image-20201227161003478" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
在输入栏中,在当前选项卡为**用户**的情况下,输入`run`并按回车进行搜索。修改`Run in Terminal`和 `Save File Before Run`的设置项。
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165038.png" alt="image-20201227161205762" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165038.png" alt="image-20201227161205762" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
完成了上述的设置,我们就可以来编写C语言的程序了。
|
||||
完成了上述的设置,我们就可以来编写 C 语言的程序了。
|
||||
|
||||
### Hello,C!
|
||||
|
||||
点击左侧第一个按钮,来到文件管理面板。点击打开文件夹按钮,打开一个空白的文件夹(任意文件夹都可以,只是保存你代码的地方,一般一个干净整洁的新文件夹为宜)
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165059.png" alt="image-20201227163528187" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165059.png" alt="image-20201227163528187" style="zoom:50%;" />
|
||||
|
||||
|
||||
打开文件夹后,在空白处单击右键,新建一个文件,文件名输入为`hello.c`
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
点击右上角的三角形按钮即可自动编译运行你的C语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
|
||||
点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的`Hello,C!`字样。
|
||||
|
||||
|
||||
<img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20201227165112.png" alt="image-20201227164041803" style="zoom:50%;" />
|
||||
<img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165112.png" alt="image-20201227164041803" style="zoom:50%;" />
|
||||
|
||||
|
||||
|
||||
### 完成✅
|
||||
|
||||
现在,开始你的C语言学习之旅吧!
|
||||
现在,开始你的 C 语言学习之旅吧!
|
||||
|
||||
162
content/posts/docker-compose的错误使用姿势.md
Normal file
162
content/posts/docker-compose的错误使用姿势.md
Normal file
@@ -0,0 +1,162 @@
|
||||
---
|
||||
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`以上的高位端口吧,避免不必要的麻烦:)
|
||||
@@ -4,7 +4,7 @@ date: 2019-10-10
|
||||
lastmod: 2020-04-29
|
||||
description: 在内网的树莓派上部署了 AdGuardHome,做 DNS 服务器的同时,也可以为内网所有设备过滤广告。本来嘛拦截了广告理应网络加载会更快,然而实际体验却很糟糕。网页加载要比之前慢得多。AdGuardHome 的面板显示的平均反应时间一度达到了 1000ms。1s 的延时还是会非常影响网络体验的。用 dig 命令看了下 DNS 查询的情况。不看不知道一看吓一跳,随便查询一个域名竟然废了四秒多!这怎么能忍受!
|
||||
categories:
|
||||
- 踩坑记
|
||||
- 技术
|
||||
tags:
|
||||
- 服务器
|
||||
- 树莓派
|
||||
@@ -13,7 +13,8 @@ tags:
|
||||
|
||||
在内网的树莓派上部署了 AdGuardHome,做 DNS 服务器的同时,也可以为内网所有设备过滤广告。本来嘛拦截了广告理应网络加载会更快,然而实际体验却很糟糕。网页加载要比之前慢得多。AdGuardHome 的面板显示的平均反应时间一度达到了 1000ms。1s 的延时还是会非常影响网络体验的。用 dig 命令看了下 DNS 查询的情况。不看不知道一看吓一跳,随便查询一个域名竟然废了四秒多!这怎么能忍受!
|
||||
|
||||

|
||||
\[图片已丢失\]
|
||||
<!--  -->
|
||||
|
||||
看网上其他人的评价,并没有我这种龟速的情况。况且我的上游 DNS 已经更换为了国内几个大厂的 DNS 比如阿里的腾讯的,测试查询一般反应时间也才 50ms。本地这个结果肯定是不能接受的。最开始还想过要根据常用域名手动制作 hosts 直接重定向。但是 dnspython 这个库不好直接指定 dns 查询,adguardhome 的 query 日志又经过特殊加密,这条路困难重重。决定将其作为备用方案。接下来进入漫长的排雷环节。
|
||||
|
||||
@@ -23,10 +24,14 @@ tags:
|
||||
|
||||
后来发现了这货:
|
||||
|
||||

|
||||
\[图片已丢失\]
|
||||
|
||||
<!--  -->
|
||||
|
||||
原来,他会把每次查询的域名先交给他服务器做安全性检查,这在国内的互联网环境中完全是鸡肋,而且因为每次都要连接境外服务器,其延迟可想而知。果然禁用了这一项,速度嗖嗖的就起来了:
|
||||
|
||||

|
||||
<!--  -->
|
||||
\[图片已丢失\]
|
||||
|
||||
|
||||
即便是冷门的实验室官网的域名,也在 100ms 内解决了,对于常见的热门网站由于多设备频繁访问,会直接查询本地缓存。虽然基本只有可怜的差不多 60s 的缓存时间,但是一旦命中,就可以在 < 10ms 的时间响应。如果是过滤器中的域名,更是可以达到 < 5ms。终于,这个 AdGuard Home DNS 可以正式投入使用了。
|
||||
448
content/posts/个人向Linux新服务器初始化清单.md
Normal file
448
content/posts/个人向Linux新服务器初始化清单.md
Normal file
@@ -0,0 +1,448 @@
|
||||
---
|
||||
title: 个人向 Linux 新服务器初始化清单
|
||||
date: 2023-03-14
|
||||
lastmod: 2025-06-21
|
||||
description: 一份 Linux 初始化清单,避免每次拿到新的服务器都要一个个去各种地方搜集指令,以做备忘 & 供有需要的朋友参考。以目前最新的 Debian 11 Bullseye 为例
|
||||
categories:
|
||||
- 技术
|
||||
tags:
|
||||
- 技术
|
||||
- Linux
|
||||
- Debian
|
||||
---
|
||||
|
||||
|
||||
一份 Linux 初始化清单,避免每次拿到新的服务器都要一个个去各种地方搜集指令,以做备忘 & 供有需要的朋友参考。
|
||||
|
||||
服务器发行版我个人推荐 Debian 系列,CentOS 系现在已经开始分裂而且说实话对新手其实并不友好。Debian 是在兼容性,易用性和稳定性之间都取得不错平衡的发行版。新手推荐 Ubuntu, 不过最近商业化有点过度,夹带了越来越多的私活,我个人所有新安装的 Linux 已经全线转向 Debian. 下文以目前最新的 Debian 11 Bullseye 为例。Debian 12 bookworm 也测试通过。
|
||||
|
||||
> 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
|
||||
登录到 root 用户,创建个人账户并设定密码
|
||||
```shell
|
||||
// -m 创建对应home文件夹
|
||||
// 添加到 sudo 用户组自动获得sudo权限, 部分发行版为wheel组
|
||||
|
||||
useradd -m --groups sudo colin
|
||||
|
||||
// 设定密码
|
||||
passwd 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 服务后生效。
|
||||
此外最好将`PermitRootLogin`修改为`no`, 可以禁用 root 登录。
|
||||
|
||||
在本机检查`~/.ssh/`有无 id_rsa 等已生成的 key. 如没有再使用 `ssh-keygen` 生成私钥
|
||||
将本机的公钥上传到远端,再写入远端的 `authorized_keys` 中
|
||||
|
||||
`cat ~/id_rsa.pub >> ~/.ssh/authorized_keys`
|
||||
|
||||
注意修改权限,`~/.ssh/authorized_keys` 权限为 600. `~/.ssh/`为 700
|
||||
|
||||
可以参考以下设置
|
||||
> .ssh/ 0700/rwx------
|
||||
> .ssh/*.pub 644/rw-r--r--
|
||||
> .ssh/* 0600/rw-------
|
||||
|
||||
如失败可参考这篇文章 debug. [https://superuser.com/questions/1137438/ssh-key-authentication-fails](https://superuser.com/questions/1137438/ssh-key-authentication-fails)
|
||||
|
||||
### 1.5 设置 hostname
|
||||
|
||||
可选,为了便于识别和后续配置 oh-my-zsh 更美观。这里修改完后还需要更新 hosts 设置,把刚才设置的新的主机名指向 localhost
|
||||
|
||||
```shell
|
||||
sudo hostnamectl set-hostname my-new-server
|
||||
sudo hostnamectl status
|
||||
```
|
||||
|
||||
此外`/etc/hosts` 中默认会有个本机 hostname 映射到`127.0.0.1` 的配置,修改 host 之后这里别名的映射也要修改下,不然终端执行命令会一直弹 `sudo: unable to resolve host xxx: Name or service not known`
|
||||
|
||||
修改后需重启
|
||||
|
||||
---
|
||||
|
||||
### 1.6 SWAP
|
||||
|
||||
可选,建议内存<2G 配置 swap, 大小至少为 2 倍物理内存,可以有效避免意外爆内存的情况。仅推荐 SSD 盘的服务器开启。
|
||||
|
||||
推荐用 `fallocate` , 因为这个是最简单、最快速的创建交换空间的方法。 `fallocate` 命令用于为文件预分配块 / 大小。
|
||||
|
||||
使用 `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` 来检查交换分区是否生效。
|
||||
|
||||
|
||||
还可以按需选择使用 zram,提升内存可用量,不过会略微增加 cpu 使用和内存延时。可以搜索 zramctl, zramswap 等关键字
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 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 镜像源配置及日志配置
|
||||
|
||||
docker mirror 配置可以加速 image pull, 国内公开可用的加速站点可以参考这里 [docker 加速站点](https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6)
|
||||
|
||||
此外服务器上的 docker 都是长时间持续运行的,不少容器日志打的很随意,log 文件容易占据过多空间,也最好限制一下。
|
||||
|
||||
文件位置`/etc/docker/daemon.json`, 下面的配置供参考
|
||||
|
||||
```json
|
||||
{
|
||||
"registry-mirrors": [
|
||||
"https://docker.nastool.de",
|
||||
"https://docker.actima.top",
|
||||
"https://docker.unsee.tech",
|
||||
"https://docker.gh-proxy.com",
|
||||
"https://docker.zhai.cm",
|
||||
"https://docker.1panel.live",
|
||||
"https://docker.1ms.run",
|
||||
"https://docker.imgdb.de",
|
||||
"https://dockerproxy.net"
|
||||
],
|
||||
"log-opts": {
|
||||
"max-file": "5",
|
||||
"max-size": "1m"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
修改完保存重启 docker 服务即可生效。可使用 `docker info` 命令检查是否生效
|
||||
|
||||
### 2.2 OH-MY-ZSH
|
||||
|
||||
安装 OH-MY-ZSH, 在此之前确保已安装 `git` 和 `zsh`
|
||||
|
||||
```shell
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
|
||||
# 如果在墙内 github 速度不加可以考虑使用清华的镜像
|
||||
# https://mirrors.tuna.tsinghua.edu.cn/help/ohmyzsh.git/
|
||||
# 先下载到任意位置,然后指定REMOTE 参数执行安装程序
|
||||
git clone https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git --depth=1
|
||||
cd ohmyzsh/tools
|
||||
REMOTE=https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git sh install.sh
|
||||
```
|
||||
|
||||
安装插件
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
git clone 速度不佳可以考虑一些开放的加速服务,比如:
|
||||
- https://ghproxy.org/
|
||||
- https://mirror.ghproxy.com/
|
||||
|
||||
|
||||
按需修改配置。文件位置`~/.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 卸载
|
||||
|
||||
懂得都懂,自己搜
|
||||
|
||||
### 2.6 fail2ban 配置
|
||||
使用 fail2ban 可以很好地保护你的服务器,避免被人恶意爆破 SSH 等服务。
|
||||
```bash
|
||||
// 安装 fail2ban
|
||||
sudo apt update && sudo apt install fail2ban
|
||||
sudo systemctl enable fail2ban
|
||||
```
|
||||
之后需要按照实际情况修改一下配置文件。这里记录一下最小配置。注意默认的配置 `/etc/fail2ban/jail.conf`不要改,不然每次软件更新会被覆盖。在 jaid.d 这个目录下面新建一个文件`/etc/fail2ban/jail.d/local.conf`
|
||||
```conf
|
||||
[sshd]
|
||||
enabled = true
|
||||
# 这里修改为实际的 sshd 端口
|
||||
port = 20000
|
||||
filter = sshd
|
||||
banaction = iptables-allports
|
||||
|
||||
[DEFAULT]
|
||||
# 1h 时间窗口
|
||||
findtime = 3600
|
||||
maxretry = 3
|
||||
bantime = 6h
|
||||
```
|
||||
|
||||
之后重启`sudo systemctl restart fail2ban`,然后可以看下服务状态是否正常 `sudo systemctl status fail2ban`,如果配置文件有问题会报错。如果是显示` active (running)` 就说明没有问题了。
|
||||
|
||||
fail2ban 的测试及关闭服务方法:
|
||||
|
||||
查看当前封禁 IP:`sudo fail2ban-client status sshd`
|
||||
解禁某一 IP: `sudo fail2ban-client set sshd unbanip IP_ADDRESS`
|
||||
停止 fail2ban 服务:`sudo systemctl stop fail2ban`
|
||||
关闭 fail2ban 服务:`sudo systemctl disable fail2ban`
|
||||
|
||||
刚配置没一会就有 IP 被封禁了,可以看到效果还是很给力,也安心了不少
|
||||
```
|
||||
➜ sudo fail2ban-client status sshd
|
||||
Status for the jail: sshd
|
||||
|- Filter
|
||||
| |- Currently failed: 1
|
||||
| |- Total failed: 6
|
||||
| `- File list: /var/log/auth.log
|
||||
`- Actions
|
||||
|- Currently banned: 1
|
||||
|- Total banned: 1
|
||||
`- Banned IP list: 154.216.19.42
|
||||
```
|
||||
|
||||
|
||||
## 3 - 进阶内容
|
||||
|
||||
### 3.1 内核参数调优
|
||||
|
||||
一些内核参数调整,交换内存阈值和 bbr, tcp fast open 等,按需启用。启用前务必确认自己了解对应字段的含义,否则不如保留系统初始值。
|
||||
|
||||
配置文件位置 `/etc/sysctl.conf`
|
||||
|
||||
```conf
|
||||
# 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
|
||||
|
||||
# zram 相关配置,配合下文 zram 使用
|
||||
vm.watermark_boost_factor = 0
|
||||
vm.watermark_scale_factor = 125
|
||||
vm.page-cluster = 0
|
||||
```
|
||||
|
||||
配置完之后保存并应用
|
||||
|
||||
```shell
|
||||
sudo sysctl -p
|
||||
```
|
||||
|
||||
|
||||
### 3.2 更多内存空间 - ZRAM
|
||||
ZRAM 内存压缩,对于个人服务器来说,始终活跃的程序占用的内存只有比较小一部分,启用 zram 可以将这部分内存压缩,从而可以部署更多的服务。
|
||||
|
||||
建议使用`zramtool`, 简单方便
|
||||
```shell
|
||||
sudo apt install zram-tools
|
||||
```
|
||||
修改`/etc/default/zramswap`, 末尾添加
|
||||
```ini
|
||||
ALGO=zstd
|
||||
PERCENT=60
|
||||
```
|
||||
|
||||
之后执行`sudo service zramswap reload`重载生效。
|
||||
可以使用 swapon 命令查看生效情况
|
||||
```
|
||||
~ » sudo swapon -show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/swap_space file 2G 32.1M -2
|
||||
/dev/zram0 partition 489.9M 0B 100
|
||||
```
|
||||
|
||||
这样一来,会将机器物理内存的 50% 配置 zram, 使用 zstd 压缩算法,一般压缩比能达到 3:1, 也就是说,1G 的机器,可以相当于有`0.5G+3*0.5G=2G`的内存。
|
||||
|
||||
注意 Debian 新版本 swapon 等工具所在的目录 /usr/sbin 不在普通用户的 PATH 中,可能需要手动执行前缀使用。如 /usr/sbin/swapon
|
||||
|
||||
### 3.3 更多内存空间 - 关闭 kdump,释放预留的内存空间
|
||||
|
||||
新服务器开起来之后,你会发现无论是 htop 还是 free 等命令,看到的总内存就是比你买服务器时页面上写的要小。比如我开的两核 1G 的机器,实际机器上看到的总内存只有 816M. 这是因为 linux 系统会默认开启 kdump,预留了一部分内存不让我们使用。
|
||||
|
||||
Kdump 是 Linux 系统的一种内核崩溃转储机制,它允许在系统发生内核崩溃(例如内核 panic)时,捕获内存的转储信息,从而帮助事后分析故障原因。默认的配置`2G-8G:256M,8G-16G:512M,16G-:768M`, 如果你买的是 2G 的机器,上来就有 1/8 的空间用不了。
|
||||
|
||||
但是我们个人日常使用的 linux 机器基本用不到这个功能,不用预留这部分空间。
|
||||
|
||||
操作方法有两种:将预留内存改为 0 or 直接关闭 kdump 服务。对于个人玩家小内存机器我建议直接关闭。操作如下:
|
||||
|
||||
```bash
|
||||
# 备份grub配置文件
|
||||
sudo cp /etc/default/grub /etc/default/grub.bak
|
||||
|
||||
# 编辑grub配置,删除 crashkernel=0M-2G:0M,2G-8G:192M 这样的部分
|
||||
sudo nano /etc/default/grub
|
||||
|
||||
# 部分发行版镜像可能还有单独的kdump配置文件,直接删除
|
||||
sudo rm /etc/default/grub.d/kdump-tools.cfg
|
||||
|
||||
# 更新grub配置
|
||||
sudo update-grub
|
||||
|
||||
# 关闭并禁用Kdump服务
|
||||
sudo systemctl disable kdump-tools
|
||||
sudo systemctl stop kdump-tools
|
||||
|
||||
# 重启系统
|
||||
sudo reboot
|
||||
|
||||
# 检查是否生效, 状态为 inactive(dead),即 kdump 服务已停止运行
|
||||
sudo systemctl status kdump
|
||||
|
||||
# 检查 crash size 是否为0
|
||||
cat /sys/kernel/kexec_crash_size
|
||||
```
|
||||
|
||||
更多内容可以参见这篇文档:[预留内存相关文档 - 阿里云](https://help.aliyun.com/zh/ecs/use-cases/view-and-change-the-size-of-reserved-memory-on-a-linux-instance#7d5ae6803amdp) 或者 [预留内存相关文档 - 腾讯云](https://cloud.tencent.com/document/product/213/115734)
|
||||
|
||||
|
||||
### 3.3 其他进阶配置
|
||||
|
||||
一些其他的系统维护技巧与策略,如
|
||||
|
||||
**配置文件管理**
|
||||
所有应用 docker 化,通过 `docker compose` 文件管理
|
||||
配置共享存储,`rclone` 挂载 webdav, 同步 docker compose 等配置文件;
|
||||
traefik 网关作为统一出口,负责服务发现和自动维护 HTTPS 证书,自定义配置通过 headless CMS 如 directus 管理,traefik 设定为通过 http 方式获取远端配置即可。
|
||||
|
||||
**数据库备份**
|
||||
所有数据相关的统一挂载到`/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)
|
||||
|
||||
|
||||
@@ -4,59 +4,58 @@ date: 2020-03-15
|
||||
lastmod: 2020-04-29
|
||||
description: 各大厂商持续发力云计算,上云的门槛也越来越低。获取云服务器的门槛越来越低,但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑
|
||||
categories:
|
||||
- 教程
|
||||
- 技术
|
||||
- 指南
|
||||
tags:
|
||||
- 服务器
|
||||
---
|
||||
|
||||
|
||||
<!-- # 云服务器入门指南 -->
|
||||
|
||||
# 云服务器入门指南
|
||||
|
||||
<a name="4lA6Y"></a>
|
||||
## 前言
|
||||
各大厂商持续发力云计算,上云的门槛也越来越低。获取云服务器的门槛越来越低,但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑 : )
|
||||
|
||||
<a name="7EZ9O"></a>
|
||||
|
||||
## 云服务器相关的几个概念
|
||||
<a name="8sCl1"></a>
|
||||
|
||||
### 服务器的操作系统
|
||||
主要分为两大阵营:Windows Server和Linux Server。前者一般自带可视化界面,基本兼容平时使用的exe程序,某种程度上也可以作为“云电脑”使用。后者一般不自带图形化界面,操作都通过特定命令完成,上手难度较高,但配置各种开发环境、安装各类高级工具比win平台更容易。没有Linux基础的用户建议先在本地建立虚拟机练习。
|
||||
主要分为两大阵营:Windows Server 和 Linux 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 的好处在于,你可以直接通过这个 IP 定位到你的服务器,相当于你的服务器在互联网世界中拥有了响当当的名号,只要说出这个名号,互联网世界的公民都能知道他,给他发消息。
|
||||
|
||||
_*此处公网内网 IP 的叙述仅适用于 IPv4 地址。更多关于 IPv4 地址和 IPv6 地址的相关信息参见文末扩展阅读。_
|
||||
|
||||
_*此处公网内网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`
|
||||
|
||||
一个服务也可能不是仅仅通过一个端口提供服务,他可能会将一个大的功能拆分为几个子功能,通过不同的端口与外界通讯。如FTP,SMB等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像FTP这样通过多个端口与外界通讯的端口,就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。
|
||||
一个服务也可能不是仅仅通过一个端口提供服务,他可能会将一个大的功能拆分为几个子功能,通过不同的端口与外界通讯。如 FTP,SMB 等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像 FTP 这样通过多个端口与外界通讯的端口,就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。
|
||||
|
||||
|
||||
_*FTP是一种文件传输协议,你可以在某些电影资源的下载链接里看见以 `ftp://` 开头的链接。这说明这个电影资源是存放在某个FTP服务器上。_<br />_*关于FTP、SMB的端口使用及配置参见文末扩展阅读_
|
||||
<a name="daIMz"></a>
|
||||
_*FTP 是一种文件传输协议,你可以在某些电影资源的下载链接里看见以 `ftp://` 开头的链接。这说明这个电影资源是存放在某个 FTP 服务器上。_
|
||||
_*关于 FTP、SMB 的端口使用及配置参见文末扩展阅读_
|
||||
|
||||
### 防火墙
|
||||
|
||||
防火墙(Firewall)某种程度上是控制本机与外界通讯的工具。下面以几个具体的实例来介绍下防火墙:
|
||||
|
||||
- 你的服务器建了个网站,需要向外提供HTTP服务,那么你需要在防火墙中设置开放80端口,允许其他所有IP访问。
|
||||
- 公司有一台服务器搭载了一个仅面向公司员工的网站,希望仅允许公司内的员工访问。而公司内员工的内网IP个格式为192.168.*.*,那么就可以在防火墙中设置,仅允许来自IP为192.168.*.*的设备访问这台服务器的80端口,其他一律禁止
|
||||
- 近期互联网上流行一种病毒X通过计算机的1234端口感染其他机器。那么为了保护本机不受病毒影响,你可以在防火墙中设置关闭1234端口,禁止任何来源访问1234端口,从而将病毒X阻挡在防火墙外。
|
||||
- 你的服务器建了个网站,需要向外提供 HTTP 服务,那么你需要在防火墙中设置开放 80 端口,允许其他所有 IP 访问。
|
||||
- 公司有一台服务器搭载了一个仅面向公司员工的网站,希望仅允许公司内的员工访问。而公司内员工的内网 IP 个格式为 192.168.*.*,那么就可以在防火墙中设置,仅允许来自 IP 为 192.168.*.*的设备访问这台服务器的 80 端口,其他一律禁止
|
||||
- 近期互联网上流行一种病毒 X 通过计算机的 1234 端口感染其他机器。那么为了保护本机不受病毒影响,你可以在防火墙中设置关闭 1234 端口,禁止任何来源访问 1234 端口,从而将病毒 X 阻挡在防火墙外。
|
||||
|
||||
**注意:对于云服务器来说,可能会存在多重防火墙。一般 Linux 系统自身会有一套防火墙(firewalld/ufw 等),云服务商会有一套网络防火墙(一般为网络安全组/网络访问控制等)**
|
||||
|
||||
**注意:对于云服务器来说,可能会存在多重防火墙。一般Linux系统自身会有一套防火墙(firewalld/ufw等),云服务商会有一套网络防火墙(一般为网络安全组/网络访问控制等) **
|
||||
<a name="8vffy"></a>
|
||||
### 几种远程连接方式对比
|
||||
|
||||
| **连接方式** | SSH | VNC | RDP |
|
||||
@@ -67,73 +66,87 @@ _*FTP是一种文件传输协议,你可以在某些电影资源的下载链接
|
||||
| **网络要求** | 极低 | 高 | 较高 |
|
||||
| **配置难度** | ★ | ★★★ | ★★ |
|
||||
|
||||
- _*__1 __部分Linux发行版自带VNC连接,不过大部分需手动启用_
|
||||
- _*__2__ RDP连接对于同为Win的机器更为容易,对于平台不一样的情况,配置比较麻烦_
|
||||
<a name="Q8OP1"></a>
|
||||
- 1 部分 Linux 发行版自带 VNC 连接,不过大部分需手动启用
|
||||
- 2 RDP 连接对于同为 Win 的机器更为容易,对于平台不一样的情况,配置比较麻烦
|
||||
|
||||
## 快速入门须知
|
||||
|
||||
当你拥有了一台属于自己的云服务器,你发现面对复杂的控制台手足无措,不知道怎么连接,不知道能拿来干什么。那么你可以参考一下的步骤。**下文仅适用于Linux Server & 有一点点Linux操作经验的选手**。
|
||||
当你拥有了一台属于自己的云服务器,你发现面对复杂的控制台手足无措,不知道怎么连接,不知道能拿来干什么。那么你可以参考一下的步骤。**下文仅适用于 Linux Server & 有一点点 Linux 操作经验的选手**。
|
||||
|
||||
|
||||
### 开启 SSH 远程连接
|
||||
|
||||
|
||||
<a name="YAQ3M"></a>
|
||||
### 开启SSH远程连接
|
||||
<br />
|
||||
<a name="7ahE2"></a>
|
||||
#### 服务器端设置
|
||||
1.首先,登陆你的账户,打开云服务器的控制台,开机(不解释) <br />2.定位到你的云服务器,一般新的账户只有一台云服务器实例,点击其菜单,找到远程连接选项 <br />3.接下来会打开一个网页端的黑框,根据其提示,设置实例密码等等。这里记录你的系统用户名和密码。<br />4.一般网页端会有提示,根据具体情况开启SSH服务,设置允许root权限远程登录。具体的操作因平台和操作系统不同而不同,此处不再赘述。<br />5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置,点击进入,**开启服务器22端口的访问权限**。
|
||||
1.首先,登陆你的账户,打开云服务器的控制台,开机(不解释)
|
||||
2.定位到你的云服务器,一般新的账户只有一台云服务器实例,点击其菜单,找到远程连接选项
|
||||
3.接下来会打开一个网页端的黑框,根据其提示,设置实例密码等等。这里记录你的系统用户名和密码。
|
||||
4.一般网页端会有提示,根据具体情况开启 SSH 服务,设置允许 root 权限远程登录。具体的操作因平台和操作系统不同而不同,此处不再赘述。
|
||||
5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置,点击进入,**开启服务器 22 端口的访问权限**。
|
||||
|
||||
接下来在你的电脑上配置SSH远程访问。
|
||||
接下来在你的电脑上配置 SSH 远程访问。
|
||||
|
||||
<a name="51wEl"></a>
|
||||
#### 本地电脑设置
|
||||
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端口_。
|
||||
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端口`。
|
||||
|
||||
排查相关问题请带上相关关键字去搜索引擎搜索。
|
||||
|
||||
<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账户_
|
||||
<a name="HY0JM"></a>
|
||||
_*临时切换为 root 用户,执行完命令后,记得用 exit 命令退出 root 账户_
|
||||
|
||||
#### 镜像源的设置
|
||||
|
||||
执行完上述命令,当你尝试安装一个软件时,如果你云服务器提供商没有为你的系统进行“优化”的话,你会发现安装软件的速度非常慢。这是因为这些Linux系统基本都是由国外的厂商/组织进行开发,安装软件时需要到位于国外的服务器获取数据,你的网络请求可能会跨越大半个地球,网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点,我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。<br />国内的镜像站点有**阿里云镜像站**、**清华大学tuna镜像站**、**中国科学技术大学开源镜像站**等。这些站点提供多种主流Linux发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同,可以到以上镜像站点中查找特定系统更换软件源的详细步骤。
|
||||
执行完上述命令,当你尝试安装一个软件时,如果你云服务器提供商没有为你的系统进行“优化”的话,你会发现安装软件的速度非常慢。这是因为这些 Linux 系统基本都是由国外的厂商/组织进行开发,安装软件时需要到位于国外的服务器获取数据,你的网络请求可能会跨越大半个地球,网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点,我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。
|
||||
国内的镜像站点有**阿里云镜像站**、**清华大学 tuna 镜像站**、**中国科学技术大学开源镜像站**等。这些站点提供多种主流 Linux 发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同,可以到以上镜像站点中查找特定系统更换软件源的详细步骤。
|
||||
|
||||
_*请注意此处叙述并不准确,与一个站点通信的速度取决于很多因素。_
|
||||
<a name="Ivxvo"></a>
|
||||
|
||||
#### 常用工具的安装
|
||||
更换好了软件源后,我们就可以愉快的安装软件了。你可以尝试安装一下 `screenfetch` 的软件包进行测试,安装完成后输入 `screenfetch` 命令,他会在你的屏幕上输出字符画形式的系统图标和系统配置信息。
|
||||
|
||||
部分Linux发行版可能并没有预置很多的软件包,你可以根据自己的需要进行安装,如文本编辑工具 `nano` `vim` 等*。C编译工具 `gcc` ,C++编译工具 `g++` ,Java开发组件 `openjdk` 等。
|
||||
部分 Linux 发行版可能并没有预置很多的软件包,你可以根据自己的需要进行安装,如文本编辑工具 `nano` `vim` 等*。C 编译工具 `gcc` ,C++ 编译工具 `g++` ,Java 开发组件 `openjdk` 等。
|
||||
|
||||
_*推荐初学者使用易于上手的 `nano` 文本编辑器。大部分 Linux 发行版都有预置。_
|
||||
|
||||
_*推荐初学者使用易于上手的 `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)
|
||||
|
||||
@@ -4,14 +4,13 @@ date: 2020-02-08
|
||||
lastmod: 2020-04-29
|
||||
description: 经过两三天的折腾,从 Linux 结构及指令,到 LNMP 框架搭建,再到数据库的配置,最后端口转发 + 内网穿透,博客终于成功上线!在此将部署过程及踩过的坑记录下来,一方面是纪念,另一方面希望能够后来人提供一点帮助。
|
||||
categories:
|
||||
- 踩坑记
|
||||
- 技术
|
||||
tags:
|
||||
- 防火墙
|
||||
- 服务器
|
||||
- 局域网
|
||||
---
|
||||
|
||||
|
||||
序
|
||||
-
|
||||
|
||||
@@ -29,7 +28,7 @@ tags:
|
||||
由于要分配的公网 IPv6 地址是要由路由器从公网获取一个前缀然后再为局域网的每个支持 IPv6 的设备分配地址,这一项任务不能由内网的树莓派代劳,所以当时就没有改动,没想到现在竟然成了救命稻草。
|
||||
通过 IPv6 的方式,成功连接上了树莓派。查看了 AdGuardHome 的 DNS 服务以及 DHCP 服务,并没有发现任何异常。
|
||||
例行 SSH 连上查看日志。`sudo systemctl status AdGuardHome.service`,果然,发现了端倪。
|
||||

|
||||

|
||||
原来!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 连接。
|
||||
@@ -44,7 +43,7 @@ tags:
|
||||
-----
|
||||
|
||||
防火墙抵挡了来自外部的威胁,也会对现有的服务造成影响。除了网页访问的 80 和 443 端口,其他有固定端口的特定服务要手动在防火墙中添加规则。对于像 BT 下载这种没有固定端口的,需要根据实际设定来更新防火墙规则。
|
||||

|
||||

|
||||
图中为 Aria2 的默认监听端口,为了保证正常的 BT 下载,需要保证这个范围的端口也添加进防火墙允许通过的规则。
|
||||
最简单有效的办法是,将所有出站的请求默认允许,对于外部传入的请求,除了必要的几个服务,其他一概默认禁止。
|
||||
|
||||
@@ -55,4 +54,4 @@ sudo ufw default deny incoming
|
||||
|
||||
```
|
||||
|
||||
这样设置可以保证我们能够正常访问互联网上的绝大多数服务,且阻挡大部分外部的攻击。不过这种情况下,如果你的系统被植入了后门,那么这台机器依然可以向外发送请求。如之前爆发的 “永恒之蓝”,如果你的机器被感染了,那么他依然可以经由特定的端口,向外传送数据,从而感染局域网中的其他设备。防火墙的规则就要根据实际的情况来进行设置了。
|
||||
这样设置可以保证我们能够正常访问互联网上的绝大多数服务,且阻挡大部分外部的攻击。不过这种情况下,如果你的系统被植入了后门,那么这台机器依然可以向外发送请求。如之前爆发的“永恒之蓝”,如果你的机器被感染了,那么他依然可以经由特定的端口,向外传送数据,从而感染局域网中的其他设备。防火墙的规则就要根据实际的情况来进行设置了。
|
||||
@@ -1,30 +1,28 @@
|
||||
---
|
||||
title: 伪·苹果全家桶喜添新成员:小米手环6使用体验
|
||||
title: 伪·苹果全家桶喜添新成员:小米手环 6 使用体验
|
||||
date: 2021-07-25
|
||||
lastmod: 2021-07-25
|
||||
description: 继iPad 2018,iPhone SE2,漫步者无线耳机(伪·AirPods),黑苹果Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机+4K显示器(伪·iMac)后,我的伪·苹果全家桶终于迎来了新成员:智能穿戴设备,小米手环6。
|
||||
description: 继 iPad 2018,iPhone SE2,漫步者无线耳机(伪·AirPods),黑苹果 Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机 +4K 显示器(伪·iMac)后,我的伪·苹果全家桶终于迎来了新成员:智能穿戴设备,小米手环 6。
|
||||
categories:
|
||||
- 分享
|
||||
tags:
|
||||
- Apple
|
||||
- 小米
|
||||
- 小米手环
|
||||
- 杂记
|
||||
|
||||
---
|
||||
|
||||
# 伪·苹果全家桶喜添新成员:小米手环6使用体验
|
||||
<!-- # 伪·苹果全家桶喜添新成员:小米手环 6 使用体验 -->
|
||||
|
||||
继iPad 2018,iPhone Se2,漫步者无线耳机(伪·AirPods),黑苹果Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机+4K显示器(伪·iMac)后,我的伪·苹果全家桶终于迎来了新成员:智能穿戴设备,小米手环6。
|
||||
继 iPad 2018,iPhone Se2,漫步者无线耳机(伪·AirPods),黑苹果 Dell G3 3579(伪·MacBook Pro),千元捡垃圾华强北黑苹果主机 +4K 显示器(伪·iMac)后,我的伪·苹果全家桶终于迎来了新成员:智能穿戴设备,小米手环 6。
|
||||
|
||||
## 选购原因
|
||||
|
||||
我购买电子产品一向是非常谨慎的,而且来回确认必要性和对比参数、价格通常都要很久,但这一次,吃个午饭的功夫我就下单了小米手环6。严格意义上来说,他对我并不是一个必需品,促使我这么快下单的因素主要有两个:
|
||||
我购买电子产品一向是非常谨慎的,而且来回确认必要性和对比参数、价格通常都要很久,但这一次,吃个午饭的功夫我就下单了小米手环 6。严格意义上来说,他对我并不是一个必需品,促使我这么快下单的因素主要有两个:
|
||||
|
||||
1. 近期对健康的重视
|
||||
2. 对睡眠质量不满意,对白天的工作学习效率和状态不满意
|
||||
|
||||
在与公司几个我很钦佩的leader和boss的饭局中,我发觉到那些很厉害的人,他们在学习和生活的时候总是以一种全情投入、高效专注的姿态投入进去,而让他们保持精力旺盛和高效的秘诀,或者说这几位牛人的共同点,就是他们都非常**关注健康,保持运动,注重效率**。
|
||||
在与公司几个我很钦佩的 leader 和 boss 的饭局中,我发觉到那些很厉害的人,他们在学习和生活的时候总是以一种全情投入、高效专注的姿态投入进去,而让他们保持精力旺盛和高效的秘诀,或者说这几位牛人的共同点,就是他们都非常**关注健康,保持运动,注重效率**。
|
||||
|
||||
同时身边几位朋友各种身体原因,耽误学习、工作的真实案例,也让我愈发感受到健康的重要性,包括但不限于心理健康、口腔健康、心肺能力、睡眠质量等方面。
|
||||
|
||||
@@ -32,13 +30,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 +46,7 @@ tags:
|
||||
|
||||
**重量**:几乎可以忽略,没有坠手感
|
||||
|
||||
**续航**:没有打开PAI等高度崩续航的功能,十分钟检测一次,日常使用一到两次运动模式,一周一充没有压力
|
||||
**续航**:没有打开 PAI 等高度崩续航的功能,十分钟检测一次,日常使用一到两次运动模式,一周一充没有压力
|
||||
|
||||
**充电**:磁吸充电真的超香
|
||||
|
||||
@@ -56,22 +54,22 @@ tags:
|
||||
|
||||
**腕带佩戴体验**:不是很透气,夏天出汗或是沾了水会有点难受
|
||||
|
||||
**腕表卡扣**:一只手轻松扣上,很久以前佩戴的1代手环真的是两只手都扣不上
|
||||
**腕表卡扣**:一只手轻松扣上,很久以前佩戴的 1 代手环真的是两只手都扣不上
|
||||
|
||||
**硌手程度**:低,正常佩戴,一天下来皮肤上不会有印记
|
||||
|
||||
## 使用体验
|
||||
|
||||
iOS兼容性:尚可,APP功能完备,部分健康数据可写入苹果健康应用。据说一众国产手环手表中,小米家的是对苹果支持最友好的
|
||||
iOS 兼容性:尚可,APP 功能完备,部分健康数据可写入苹果健康应用。据说一众国产手环手表中,小米家的是对苹果支持最友好的
|
||||
|
||||
设备联动:无,毕竟只是手环,没法安装三方APP。不过听说NFC版的小爱同学可以控制智能家居,听起来还不错
|
||||
设备联动:无,毕竟只是手环,没法安装三方 APP。不过听说 NFC 版的小爱同学可以控制智能家居,听起来还不错
|
||||
|
||||
响应速度:尚可,抬腕亮屏的灵敏度和速度都还可以,偶有不灵,正常范围内
|
||||
|
||||
## 购买建议
|
||||
|
||||
Apple生态内用户,Apple Watch少有的平价替代品(两百块要什么自行车)
|
||||
Apple 生态内用户,Apple Watch 少有的平价替代品(两百块要什么自行车)
|
||||
|
||||
腕上空空选手的智能穿戴尝鲜优选
|
||||
|
||||
小米手环123代用户无脑升级(磁吸充电真香)
|
||||
小米手环 123 代用户无脑升级(磁吸充电真香)
|
||||
|
||||
112
content/posts/关于双语字幕这件小事.md
Normal file
112
content/posts/关于双语字幕这件小事.md
Normal file
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: 关于双语字幕这件小事
|
||||
date: 2023-09-10
|
||||
description: 今天这篇文章来探讨下双语字幕这件小事。首先对于一部外语影片或剧集,原生的英文字幕肯定是能够轻松获得的,但是匹配、高质量的翻译字幕缺并不总是能找到。这里分享一些我在寻找和手动 DIY 双语字幕的一些经验和想法,我自己也编写了一些工具,有同样需求的朋友也可以快速上手:D
|
||||
categories:
|
||||
- 杂记
|
||||
- 技术
|
||||
tags:
|
||||
- 技术
|
||||
- Linux
|
||||
---
|
||||
|
||||
|
||||
今天这篇文章来探讨下双语字幕这件小事。
|
||||
|
||||
首先对于一部外语影片或剧集,原生的英文字幕肯定是能够轻松获得的,但是匹配、高质量的翻译字幕缺并不总是能找到。这里分享一些我在寻找和手动 DIY 双语字幕的一些经验和想法,我自己也编写了一些工具,有同样需求的朋友也可以快速上手:D
|
||||
|
||||
## 1. 考虑寻找现成的高质量字幕
|
||||
|
||||
很多大火的剧集都会有字幕组第一时间跟进字幕制作和资源的发布,我们可以在各种 BT, PT 站点找到这些字幕组打包好的自带字幕的资源,或者也可以在第三方的字幕站点上寻找合适的字幕。
|
||||
|
||||
这里安利一个油猴脚本:[豆瓣资源下载大师](https://greasyfork.org/zh-CN/scripts/329484-%E8%B1%86%E7%93%A3%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%B8%88-1%E7%A7%92%E6%90%9E%E5%AE%9A%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1-%E9%9F%B3%E4%B9%90-%E5%9B%BE%E4%B9%A6%E4%B8%8B%E8%BD%BD),可以在豆瓣的影视详情页右侧显示有资源的站点,非常方便
|
||||
|
||||

|
||||
效果如下图所示
|
||||
|
||||

|
||||
|
||||
中文字幕推荐 [字幕库](http://zimuku.org/), 大部分字幕都可以在这里找到。其他语言可以到 [OpentSubtitles](https://www.opensubtitles.org/zh) 碰碰运气,虽然界面有点古朴,但是人家资源还是很丰富滴
|
||||
|
||||
## 2. 字幕的时间轴修正
|
||||
|
||||
对于下载的字幕,我们常遇到的问题就是时间轴不匹配,相信每个影视爱好者都或多或少碰到过这样的问题。产生不匹配有多种原因,典型的比如:
|
||||
|
||||
- 视频帧率不匹配
|
||||
- 视频有删减 (片头或者片中都有可能,常见于电视剧集,有些中间有广告转场有些没有)
|
||||
- 视频版本不一样 (各种删减版,完整版,导演剪辑版等等)
|
||||
|
||||
最后一种差异的地方太多,建议重新找字幕。对于前面两种情况,文本的部分没有太多差异,只需要调整字幕的时间轴就可以了。
|
||||
|
||||
这里需要一些对齐时间轴的工具,这个市面上已经有很多了,大部分都是基于将对白音频持续时间和字幕对白持续时间做匹配,然后进行字幕整体时间轴的缩放或平移来实现对齐的。
|
||||
|
||||
比如 [Sushi](https://github.com/tp7/Sushi), 以及[ffsubsync](https://github.com/smacke/ffsubsync)
|
||||
|
||||
还有一类是最近比较火的,利用 AI 来对语音进行识别,输出对应的字幕。一半都是通过 Whisper 这个开源的语音识别模型来实现的,比如[autosubsync](https://github.com/oseiskar/autosubsync).
|
||||
|
||||
这类语音识别的 AI 目前已经很成熟了,市面上有很多商业应用,比如办公软件 飞书,腾讯会议一般都会支持会议语音转文字。但是这种都是为会议场景准备的。其实国内网易有道在这块做的更早,对英文支持更好,[网易见外](https://jianwai.youdao.com/)可以直接对音频进行识别,并生成 srt 文件,甚至还可以直接加上翻译,效率直接拉满。免费额度基本够用,各位轻度使用的朋友不要错过。
|
||||
|
||||
当然,这类 AI 语音识别和翻译现阶段还是差了点意思,在各种影视作品中,各类人名,专有名词,还有各种各样的梗 (比如 The Simpsons ), AI 处理起来还是有点够呛,所以最好还是优先选择人工调教后的字幕比较好。
|
||||
|
||||
上面罗列的那些对齐工具只能处理字幕和影片都是原生语言的情况,比如处理英文电影的英文字幕,但是对于要对时间轴不匹配的中英文双语字幕就基本没辙了。找遍了全网都没找到合适的工具,所以我就自己写了一个 [srt-fuzzy-sync](https://github.com/Colin-XKL/srt-fuzzy-sync)
|
||||
|
||||
> fuzzy-sync 是一个简单的同步 srt 字幕的工具,通过指定一个与音轨匹配的参考字幕文件,来将另一个未同步的字幕进行匹配,时间轴修正,使得其可以与音轨正确对齐。
|
||||
|
||||
简单点来说呢,这是一个专门用来对双语字幕时间轴进行修正的工具。你手头有一个英文电影资源,一个正确对齐的英文字幕,一个没对齐的双语字幕,这个时候你就可以用 srt-fuzzy-sync 这个工具,将英文字幕设定为参考,然后对双语字幕的时间轴进行修正,就可以得到一个时间轴正确的双语字幕啦!
|
||||
|
||||
为什么叫 fuzzy-sync 呢,这主要是为了通用性,只对两个字幕之间高度相同的一些关键对白进行匹配,其他的对白则只是基于匹配结果进行整体偏移,这样做的好处是即便你找的这两个字幕的对白数量不一样,仍然可以完成同步。
|
||||
|
||||
一般英文的 SDH 无障碍字幕里都会有很多非对白场景下的文字提示,比如
|
||||
|
||||
> (Theme Music Playing)
|
||||
|
||||
> (sigh)
|
||||
|
||||
> (Bird Singing)
|
||||
|
||||
而影片对应中文字幕里一般都不会加上这些翻译。此外中文字幕还常常对影片中出现的标题、店铺招牌、标语、新闻标题做翻译说明,种种因素导致中英文字幕在句子的数量上不是严格对等的。
|
||||
|
||||
此外这些字幕出现的时间,通常是没有对应的对白音频的。上面基于音频匹配的都无法很好地处理这类情况,所以我才抛弃按句匹配的方法,改为按一些句子很长,具有标志性,在影片中通常只会出现一次的关键语句匹配。
|
||||
|
||||
至于找不到的现成双语字幕的,那就需要我们自己动手制作啦。
|
||||
|
||||
## 3. 自制双语字幕
|
||||
|
||||
有时只能找到现成的中文字幕和原版英文字幕,但是没有双语的版本,这个时候就需要我们手动合并了。
|
||||
|
||||
这里推荐一个工具网站 [Subtitle Tools](https://subtitletools.com/merge-subtitles-online), 里面有各种简单的字幕工具,比如字幕合并,字幕格式转换。
|
||||
|
||||
对于手上又对齐的英文字幕和对齐的英文字幕,但是数量很多不想一个个到网站上去合并的,可以考虑 srt-merge 这个工具。不过原作者很久没更新了,我这里也编写了一个工具,也可以实现一样的功能。[dual-lang-sub-tool](https://github.com/Colin-XKL/dual-lang-sub-tool/tree/main)
|
||||
|
||||
此外还有一种常见的情况,就是我们下载的 WebRip 版本资源,影片已经内置了多国语言分别的字幕,这些资源大部分是来源于 Netfilx, Disney Plus , iTunes 这些,我们可以直接提取影片资源内置的两种语言的字幕然后将它们合并。
|
||||
|
||||
内置字幕的提取可以使用 ffmpeg 工具,首先用 ffmpeg -i 文件路径 来查看基本信息,确定好字幕所在的 track, 比如 Stream #0:3(chi) Subtitle, 这种就是说明 3 号 stream 是中文字幕。
|
||||
|
||||
```shell
|
||||
# example output # ......
|
||||
Stream #0:1(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
|
||||
Metadata: title : 日语
|
||||
|
||||
Stream #0:2(chi): Audio: aac (LC), 48000 Hz, stereo, fltp
|
||||
Metadata: title : 国语
|
||||
|
||||
Stream #0:3(chi): Subtitle: ass (default)
|
||||
Metadata: title : gb
|
||||
|
||||
Stream #0:4(chi): Subtitle: ass
|
||||
Metadata: title : big5
|
||||
```
|
||||
|
||||
可以用下面的命令将其提取出来并转换成 srt 格式
|
||||
|
||||
```shell
|
||||
ffmpeg -i xxx.mkv -map 0:3 -c:s srt output.srt
|
||||
```
|
||||
|
||||
提取完成后就可以直接合并得到成品的双语字幕了,但是你应该也会觉得这样提取太麻烦,尤其是一部剧几十集的情况。一般同一个资源,里面各个音轨和字幕的排布是一样的,比如上面只取了一集进行查看,其他集数都是一样的,中文字幕都是在 stream 0:3, shell 循环一下就可以了。
|
||||
|
||||
当然你可能觉得这还是太麻烦了,我也是这么想的,所以 dual-lang-srt-tool 工具也支持自动检测,导出,合并双语字幕啦:D DIY 双语字幕可以很简单
|
||||
|
||||
## 后记
|
||||
|
||||
对于一些专有名词太多,AI 翻译质量欠佳,又没有现成中文字幕可供参考的,那目前就没有很好的办法了。通常我遇到这种情况是用 AI 的版本将就下,或者直接全英文一把梭。不过随着 AI 技术的发展,后面或许可以考虑将过往季的字幕喂给 AI 让 ta 自己学习人名地名翻译,再辅以各种新闻八卦材料让 AI 也能对各种潮流热梗烂熟于心,到那个时候制作双语字幕就是分分种的事情了,可以预见的是这样的 AI 应该有生之年就可以用上,至于是好事还是坏事,那就交给未来去评判吧。
|
||||
201
content/posts/写在毕业季.md
Normal file
201
content/posts/写在毕业季.md
Normal file
@@ -0,0 +1,201 @@
|
||||
---
|
||||
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 里面的某种原始本能,也不是某种“一见钟情”,小时候那些高质量的动漫节目、书籍、电影,都对我产生了深远的影响。
|
||||
|
||||
兴趣是需要被培养的,是可以培养的。我觉得兴趣更像是一段友情,或是一团火,需要投入时间和精力,予以恰当的方式,才能让其不断发展。不断尝试,不断突破,取得进展,可以获得正向的反馈,从而不断学习,不断进步。
|
||||
|
||||
---
|
||||
|
||||
## 短平快高刺激的短视频会不会影响到兴趣的培养
|
||||
|
||||
我的观点是:会
|
||||
|
||||
兴趣需要培养,而培养需要长时间持续的投入。
|
||||
|
||||
想要真正觉得一些事情“很有意思”,产生“反复做这件事都不会厌倦”的状态,需要我们有“能力”足够充分地感受到这件事的美妙之处。用拥有这个能力需要持续投入,而品尝到美妙之处也需要长期的投入。
|
||||
|
||||
习惯了高频高刺激的短视频后,是很难投入到这样长期的活动当中的。我认为短视频会消磨一个人对于事物的兴趣。
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 几个曾经不以为然后来恍然大悟的古话:
|
||||
|
||||
* 知足常乐
|
||||
* 学而不思则罔,思而不学则殆
|
||||
|
||||
记忆中人生的高光时刻与记忆中最开心的时刻并不是一致的。有付出但颇具意外的收获更能让我得到满足感,中考体育的超常发挥,数学建模的国赛获奖,这些事件能够带给我幸福感和满足感远远超过其他事件。突然理解了为什么有些人会主动去追求“生活中不期而遇的小确幸”。降低期待值才是获取幸福的捷径。
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 关于“人生苦短,及时行乐”
|
||||
|
||||
|
||||
|
||||
很多人都只看见了后面这半句话,认为及时行乐最重要。奇葩说有一期节目就是对“做人最重要的就是开心吗?”这个命题做辩论,此处不再讨论这个话题。依我来看,其实这句话的可以以另一个姿势打开。
|
||||
|
||||
“人生苦短”是预设条件,是假定的事实,“及时行乐”这半句算是一个解决方案。
|
||||
|
||||
如果我们愿意接受这个预设条件,那么“及时行乐”算是一个可能的解决方案,但并不是唯一的。
|
||||
|
||||
读书,旅游,欣赏电影,都可以让苦短的人生拥有更多精彩。
|
||||
|
||||
乔治•马丁在他的《冰与火之歌》一书中说过:“读书可以经历一千种人生,不读书的人只能活一次。”
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 感谢
|
||||
|
||||
感谢时间线上每一个过去的自己,每一个人生十字路口做出的这些决定塑造了今天的我自己
|
||||
|
||||
感谢时间线上每一个人,见贤思齐焉,见不贤而内自省也。
|
||||
|
||||
154
content/posts/前端静态资源加载的一些优化.md
Normal file
154
content/posts/前端静态资源加载的一些优化.md
Normal file
@@ -0,0 +1,154 @@
|
||||
---
|
||||
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,详见下文
|
||||
|
||||
这里跑了个测试看下优化前后的差距
|
||||
|
||||
**优化前**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
First Contentful Pain Time 在 1.5s,整个页面到 1.5s 才能可见,DOM 加载总时间达到了 2.5s
|
||||
|
||||
本来我都已经把首页不需要加载的三方库都拿走了,但是还剩下一个,这个用于前端性能监控的 js 阻塞了渲染,挂的是腾讯云的 CDN,国内快到飞起,国外就卡到不行(作为对比上图里从 jsdelivr 加载的 js 也是快到飞起,墙内就慢得一批)
|
||||
|
||||
**优化后**
|
||||
|
||||

|
||||
|
||||
优化后页面没有再阻塞,0.8s 页面就可用了,总 DOM 加载时间只有 1.5s,相较之前简直直接起飞。
|
||||
|
||||
|
||||

|
||||
|
||||
国内某检测平台的结果也显示优化效果明显
|
||||
|
||||
## 静态资源 Fallback 加载
|
||||
|
||||
国内好用的静态资源 CDN 还真没有,新浪那种只提供那么几个热门的库完全不符合需求,BootCDN 炸了不是一次两次,字节 CDN 的资源 URL 有够 ugly,URL 里面还带节点信息多半后面会出问题。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 加载资源,这下网站的可用性又提升了一点点🤏哈哈哈
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 扩展阅读
|
||||
|
||||
* [消除阻塞页面渲染的资源](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)
|
||||
180
content/posts/国外静态网站托管在国内速度对比及线路优化.md
Normal file
180
content/posts/国外静态网站托管在国内速度对比及线路优化.md
Normal file
@@ -0,0 +1,180 @@
|
||||
---
|
||||
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)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**Vercel**
|
||||
|
||||
[colinx-blog.vercel.app](https://colinx-blog.vercel.app)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**Azure**
|
||||
|
||||
[nice-glacier-095b09e00.1.azurestaticapps.net](https://nice-glacier-095b09e00.1.azurestaticapps.net)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**CloudFlare Pages**
|
||||
|
||||
[colinx-blog.pages.dev](https://colinx-blog.pages.dev)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
emmm Cloudflare 这在国内的速度可太拉胯了,虽说可以通过自选节点的方式曲线救国,但想了想还是算了。利用好其他三家的节点应该足够国内大部分用户访问。
|
||||
|
||||
---Update on 2022-05-22---
|
||||
|
||||
又重新测了一下 cloudflare 的速度,这次倒是一片绿,看来还是要运气,不太稳定。电信和联通都嗖嗖的,移动基本上全挂了。。。
|
||||
|
||||

|
||||
|
||||
这次能连接的节点主要就两个 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
|
||||
```
|
||||
|
||||
检测一波,红了好几个省份
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
慢点可以接受,线路不通可不能忍。之前粗略筛的几个节点,如今过了快两年了,线路估计也发生了变化,简单跑了一下这几条,发现这个线路现在的状况实在不咋地
|
||||
|
||||

|
||||
|
||||
这圈子兜的也太大了些。。。哦原来是 Digital Ocean 的节点啊,那没事了。
|
||||
|
||||
亚马逊的节点稍微好些,没有绕道日本这么离谱的行为
|
||||
|
||||

|
||||
|
||||
再来看看 vercel 节点的表现
|
||||
|
||||

|
||||
|
||||
这里是自选的节点,直连东京节点,好评
|
||||
|
||||

|
||||
|
||||
但是默认的 AnyCast 节点这个路由就稍微绕路了,看来大中华区还是得自己动手调整下线路
|
||||
|
||||
|
||||
|
||||
## 优化后
|
||||
|
||||
after
|
||||
|
||||

|
||||
|
||||
检测优化过程就不赘述了,都是拿几个基本的工具`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/
|
||||
@@ -4,13 +4,12 @@ date: 2019-09-12
|
||||
lastmod: 2020-04-29
|
||||
description: 在一次编译 VSCode 的项目中,跨越千山万水,解决重重依赖后,终于来到了编译环节。然而才开始没多久,就出现了一个匪夷所思的报错。
|
||||
categories:
|
||||
- 踩坑记
|
||||
- 技术
|
||||
tags:
|
||||
- 服务器
|
||||
---
|
||||
|
||||
|
||||
|
||||
在一次编译 VSCode 的项目中,跨越千山万水,解决重重依赖后,终于来到了编译环节。然而才开始没多久,就出现了一个匪夷所思的报错。
|
||||
|
||||
谷歌一番,又到 /var/log/message 里查看了一番系统日志,竟然说是内存爆满,进程被 kill 了。想来我阿里云的那台服务器内存的统计曲线基本就没超过一半,今儿个怎么会出现内存爆掉的情况。又是一顿折腾发现这台阿里云的机子 Swap 大小竟然为 0??Swap 为物理内存达到一定临界值之后,系统将磁盘的一部分空间作内存使用,一般在 Windows 系统上都是由系统自动管控,新安装的 Linux 桌面发行版也会在安装时提醒用户设置,这坑爹的阿里云在安装的时候没给我分配 Swap 分区?
|
||||
|
||||
202
content/posts/安全不是特权 - 雷池WAF使用体验及部署安装教程.md
Normal file
202
content/posts/安全不是特权 - 雷池WAF使用体验及部署安装教程.md
Normal file
@@ -0,0 +1,202 @@
|
||||
---
|
||||
title: 安全不是特权 - 雷池 WAF 使用体验及部署安装教程
|
||||
date: 2023-12-18
|
||||
description: 近期刚好关注到雷池 WAF 这个项目比较火,看了下是国内一个安全公司搞得,看 Github Repo 和官方文档像模像样的,虽然文档跟大多数中文项目一样,很多地方写的不够清晰,一些小细节没有跟最新的版本同步,但是总体而言,可用,不难用。值得一试
|
||||
categories:
|
||||
- 技术
|
||||
tags:
|
||||
- 技术
|
||||
- WAF
|
||||
- docker
|
||||
---
|
||||
|
||||
|
||||
自从开始倒腾服务器,部署各种各样服务以来,网站安全一直是那个令我焦虑的一个话题。暴露了那么多服务在公网,总免不了有无聊的人或者别有用心的人在搞事。(当然也有可能不是人类 hhh) 之前也有几次被攻击的历史,比如阿里云控制台一堆 SSH 爆破攻击记录,还有 Wordpress 被攻陷,出现一堆奇怪的文章和评论。虽然损失不是很大,但是处理起来还是有点麻烦的。(被攻击之后学乖了,老老实实定期备份) 况且我在明敌在暗,我们总是处于被动的那个,时间一长,网站的风险和潜在的损失还是不小的,最好是可以有一些防火墙和策略能够拦截点大部分不友好的请求。
|
||||
|
||||
很早以前就有调研过世面上的网站防火墙类产品,主要就几种类型:
|
||||
|
||||
- 各大云厂商配套的 WAF, 不过收费都很贵
|
||||
- Cloudflare 等 CDN 服务商提供的服务,不过必须要接入其 CDN 反代才能用。而且大陆地区联通性并不好
|
||||
- [ModSecurity](https://github.com/SpiderLabs/ModSecurity) 等开源方案,开源免费可自托管,不过配置比较麻烦,而且没有好用的 web 页面
|
||||
|
||||
近期刚好关注到雷池 WAF 这个项目比较火,看了下是国内一个安全公司搞得,看 Github Repo 和官方文档像模像样的,虽然文档跟大多数中文项目一样,很多地方写的不够清晰,一些小细节没有跟最新的版本同步,但是**总体而言,可用,不难用。值得一试**
|
||||
|
||||

|
||||
|
||||
## 使用体验
|
||||
|
||||
谈一谈我为什么选择使用雷池 WAF:
|
||||
|
||||
- 免费,开源 (这点存疑,没有详细审计过所有 submoudule, 目前看起来只有部分开源,仓库里大部分都是文档啥的。不过有有安全厂商实名,应该不会做出来一些自毁招牌的操作)
|
||||
- 支持通过 `docker compose` 自部署
|
||||
- 功能够用。基本反代站点配置,SSL, 多种规则的黑白名单,频率限制,人机验证,攻击历史看板
|
||||
|
||||
目前已经使用了有几个月了,来谈一谈一些个人感受
|
||||
|
||||
优点:
|
||||
|
||||
- 又要免费,又要能自部署,又要有方便使用的 web 页面,目前这个好像是唯一能选的...
|
||||
- 支持 `docker compose` 自部署,可以自行编排和自定义很多配置
|
||||
- TOTP 认证,加分
|
||||
- UI 简约清晰,加分
|
||||
|
||||
缺点:
|
||||
|
||||
- 有一些小 bug, 挺影响使用体验的,比如我最开始用的那个版本,那时候还不知道这个只能 TOTP 验证,又找不到地方和文档设置初始账号密码,但是进首页直接跳到了仪表盘,又一直刷报错。这种情况没登录就不应该显示仪表盘界面的,非常误导人,我还以为是强制开了 HTTPS 但是我没有上传 SSL 证书导致的后端请求一直报错。
|
||||
- 开源了但是又没有完全开。人家企业做这个的本意是推销自家的收费套餐,这个没毛病。但是请不要挂羊头卖狗肉,影响不好。GitHub Repo 都是些文档内容,有个所谓的语义检测引擎倒是放了一点代码,但是这个代码量级太少了,像个玩具项目,不像是正儿八经投入使用的引擎的源码。看了下这个社区版本的文档之类的,从头到尾就没有提过怎么参与项目贡献代码,挂了个 GitHub 链接似乎只是诱导大家去 star, 这样好做宣传。合着这个所谓的社区版就只是部署了之后有个按钮,可以共享攻击记录的 ip?
|
||||
- `docker compose` 写的方式令人费解。竟然需要在`.env` 文件中自定义一个内网网段,然后用 docker compose 的时候自动创建一个子网,每个容器根据子网的前缀指定了一个 ip, 然后其他容器连接都是在环境变量里写死....明明可以用 compose 文件里定义的 service name 或者 container name 作为 alias 使用内置的 dns 轻松实现的服务发现,为什么搞得如此麻烦?而且有没有考虑过,如果要更新,再执行 compose up 的时候,先前的子网 ip 是被占用的,每次还得先看一下当前用了哪些子网,然后找个没用的,这操作也是没谁了... 你说人家懂吧,他还通过 env 文件自定义 compose 创建的子网前缀,说人家不懂吧,用 container name 做 alias 自动实现服务发现这么简单的方式竟然不用。可能有安全或者性能方面的考量?不过我个人使用还是全部删掉了写死子网前缀的配置,这个使用方法真实太离谱了
|
||||
- 目前只会记录疑似恶意的请求,正常请求不会记录,没法通过这个来看网站总访问情况了,有点可惜
|
||||
|
||||
## 安装部署流程
|
||||
|
||||
简单分享下我调优后的安装流程,不使用写死的子网前缀做服务发现。
|
||||
|
||||
### 1. 获取 compose 文件
|
||||
|
||||
官方文档默认提供的不是通过 `docker compose` 安装,而是他们的一个脚本。可能是为了照顾广大墙内被 CSDN "惯坏"的用户吧,脚本里除了基本的环境检测,主要是提供 docker 的便捷安装,但是怎么说呢...本意是给墙内用户便捷安装,但是为什么安装的操作还是到 docker 官方安装脚本,有没有一种可能,大部分大陆的服务器访问这个站点都很慢甚至连不上呢?但凡这里切一下 docker ce 镜像源都没这么离谱...
|
||||
|
||||
回到正题,这里还是大家通过 `docker compose` 安装。没安装 docker 的建议先去安装,有条件的可以直接按照官方文档来,[安装文档链接](https://docs.docker.com/engine/install/ubuntu/). 也可以参考我之前写的 RSSMAN 部署文档中 Docker 安装的部分,有讲解在国内环境下提前更换镜像源以更快完成下载安装。[Docker 安装-RSSMAN 部署指南 - RSS101](https://rss101.colinx.one/deploy/rssman-full-guide/#1-docker)
|
||||
[RSSMan 部署指南](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
|
||||
|
||||
之后获取官方最新的 compose 文件。文档里贴的链接是在离线安装的章节有个 compose 文件链接 https://waf-ce.chaitin.cn/release/latest/compose.yaml
|
||||
|
||||
当然也可以直接去 Github 找,在 release 文件夹下。https://github.com/chaitin/SafeLine/blob/main/release/latest/compose.yaml
|
||||
|
||||
之后需要按照文档指示,在 compose 文件同文件夹位置,创建一个`.env`文件,并填写相关的变量。这里推荐使用我调整后的版本。后续如果官方对于整个架构有更新,以官方的为准,可以自行根据需要调整 compose 文件。
|
||||
|
||||
```yaml
|
||||
services:
|
||||
safeline.manager:
|
||||
container_name: safeline-manager
|
||||
restart: always
|
||||
image: chaitin/safeline-mgt-api:${IMAGE_TAG:?image tag required}
|
||||
volumes:
|
||||
- ${SAFELINE_DIR?safeline dir required}/resources/management:/resources/management
|
||||
- ${SAFELINE_DIR}/resources/nginx:/resources/nginx
|
||||
- ${SAFELINE_DIR}/logs:/logs
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- ${MGT_PORT:-9443}:1443
|
||||
environment:
|
||||
- MANAGEMENT_RESOURCES_DIR=/resources/management
|
||||
- NGINX_RESOURCES_DIR=/resources/nginx
|
||||
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-db/safeline-ce
|
||||
- MARIO_URL=http://safeline-mario:3335
|
||||
- FVM_MANAGER_URL=safeline.fvm-manager:9004
|
||||
- MANAGEMENT_LOGS_DIR=/logs/management
|
||||
dns:
|
||||
- 119.29.29.29
|
||||
- 223.5.5.5
|
||||
- 8.8.8.8
|
||||
networks:
|
||||
- safeline
|
||||
cap_drop:
|
||||
- net_raw
|
||||
safeline.detector:
|
||||
container_name: safeline-detector
|
||||
restart: always
|
||||
image: chaitin/safeline-detector:${IMAGE_TAG}
|
||||
volumes:
|
||||
- ${SAFELINE_DIR}/resources/detector:/resources/detector
|
||||
- ${SAFELINE_DIR}/logs/detector:/logs/detector
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- LOG_DIR=/logs/detector
|
||||
networks:
|
||||
- safeline
|
||||
cap_drop:
|
||||
- net_raw
|
||||
safeline.mario:
|
||||
container_name: safeline-mario
|
||||
restart: always
|
||||
image: chaitin/safeline-mario:${IMAGE_TAG}
|
||||
volumes:
|
||||
- ${SAFELINE_DIR}/resources/mario:/resources/mario
|
||||
- ${SAFELINE_DIR}/logs/mario:/logs/mario
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- LOG_DIR=/logs/mario
|
||||
- GOGC=100
|
||||
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline.postgres/safeline-ce
|
||||
networks:
|
||||
- safeline
|
||||
cap_drop:
|
||||
- net_raw
|
||||
safeline.tengine:
|
||||
container_name: safeline-gateway
|
||||
restart: always
|
||||
image: chaitin/safeline-tengine:${IMAGE_TAG}
|
||||
volumes:
|
||||
- ${SAFELINE_DIR}/resources/nginx:/etc/nginx
|
||||
- ${SAFELINE_DIR}/resources/management:/resources/management
|
||||
- ${SAFELINE_DIR}/resources/detector:/resources/detector
|
||||
- ${SAFELINE_DIR}/logs/nginx:/var/log/nginx
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
# - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
|
||||
- tengine-cache:/usr/local/nginx/cache
|
||||
environment:
|
||||
- MGT_API=https://safeline.manager:1443/api/publish/server
|
||||
ulimits:
|
||||
nofile: 131072
|
||||
networks:
|
||||
- safeline
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
safeline.fvm-manager:
|
||||
container_name: safeline-fvm-manager
|
||||
restart: always
|
||||
image: chaitin/safeline-fvm-manager:${IMAGE_TAG}
|
||||
environment:
|
||||
- FVM_LOGS_DIR=/logs/management
|
||||
- DETECTOR_URL=http://safeline-detector:8001
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- ${SAFELINE_DIR}/logs:/logs
|
||||
networks:
|
||||
- safeline
|
||||
cap_drop:
|
||||
- net_raw
|
||||
|
||||
safeline.postgres:
|
||||
container_name: safeline-db
|
||||
restart: always
|
||||
image: postgres:15-alpine
|
||||
volumes:
|
||||
- ${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- POSTGRES_USER=safeline-ce
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}
|
||||
networks:
|
||||
- safeline
|
||||
cap_drop:
|
||||
- net_raw
|
||||
command: [postgres, -c, max_connections=200]
|
||||
|
||||
volumes:
|
||||
tengine-cache:
|
||||
|
||||
networks:
|
||||
safeline:
|
||||
name: safeline
|
||||
driver: bridge
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: safeline
|
||||
```
|
||||
|
||||
### 2. 安装部署
|
||||
|
||||
部署成功后,第一次使用理论上会跳转到 TOTP 绑定页面。我之前这里卡到 bug, 第一次访问不是首页,没有看到那个绑定 TOTP 的二维码,后面就一直没法跳转到绑定页面了....不知道后面这个 bug 修复了没有,如果大家也遇到这个问题可以考虑全部清理干净,重新安装。
|
||||
|
||||
TOTP 软件推荐和对比:
|
||||
|
||||
- Microsoft Authenticator( 微软出品,支持云同步,国内可用,微软账户验证有单独的通道和验证方式,速度和体积一般)
|
||||
- Google Authenticator (谷歌出品,简约好用,体积小速度快,可惜大陆地区没法云同步)
|
||||
- BitWarden (支持使用自建实例,可惜 app 略卡)
|
||||
|
||||
## 总结
|
||||
|
||||
雷池 WAF 目前来看是一款够用,不难用的免费 WAF, 建议一试。
|
||||
|
||||
此外重要数据还是要经常备份,多副本 + 多地存储,数据无价!
|
||||
@@ -1,57 +1,71 @@
|
||||
---
|
||||
title: 我的RSS方案与心得
|
||||
title: 我的 RSS 方案与心得
|
||||
date: 2021-05-10
|
||||
lastmod: 2021-05-10
|
||||
description: 使用RSS已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用TTRSS做服务端,安卓手机使用FeedMe订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用Feed43或Feedburner压制的源。随着我逐渐加大RSS阅读在我闲暇、琐碎时间内的比重,我对RSS有了更高的期望和要求,便开始了对如何构建更高效、更易用的RSS方案的探索。
|
||||
categories:
|
||||
- 杂记
|
||||
- 指南
|
||||
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
|
||||
tags:
|
||||
- RSS
|
||||
- Docker
|
||||
- Github
|
||||
- 代理
|
||||
categories:
|
||||
- 杂记
|
||||
- 技术
|
||||
---
|
||||
|
||||
# 我的 RSS 方案与心得
|
||||
<!-- # 我的 RSS 方案与心得 -->
|
||||
|
||||
使用 RSS 已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端,安卓手机使用 FeedMe 订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重,我对 RSS 有了更高的期望和要求,便开始了对如何构建更高效、更易用的 RSS 方案的探索。
|
||||
使用 RSS 已经一年有余,这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端,安卓手机使用 [FeedMe](https://github.com/seazon/FeedMe) 订阅,主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重,我对 RSS 有了更高的期望和要求,便开始了对如何构建更高效、更易用的 RSS 方案的探索。
|
||||
|
||||
## 借助 RSSHub 订阅各种热门冷门网站
|
||||
## 0x01 借助 RSSHub 订阅各种热门冷门网站
|
||||
|
||||
RSSHub 是个很赞的项目,它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知,网站提供 RSS 并不能为他的站点带来更高的收入,反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。
|
||||
[RSSHub](https://docs.rsshub.app/) 是个很赞的项目,它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知,网站提供 RSS 并不能为他的站点带来更高的收入,反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。
|
||||
|
||||
## 获取 Feed 文章全文
|
||||
## 0x02 获取 Feed 文章全文
|
||||
|
||||
部分 RSS 源并不会在 xml 文件内提供文章全文,说白了是想让你点进他们的网站去浏览,这样网页上的广告才有可能被你点击。解决的方案有很多,方便起见我使用了 TTRSS 的插件 Readability 和 Mercury。两者都不能完美适配所有站点,同时启用这两者以实现互补。
|
||||
|
||||
## 无障碍阅读繁体中文 Feed
|
||||
## 0x03 无障碍阅读繁体中文 Feed
|
||||
|
||||
发现了几个质量不错的繁体中文信息源,主要是台湾的站点,如泛科学。由于文字和部分两岸文化差异,直接阅读繁体中文的文章有些困难。我的解决方案是使用 OpenCC 简繁转换服务,它能够对可映射的简繁汉字以及同一事物的两岸不同的表述进行翻译,输出的简体中文版文章基本可以无障碍阅读。Awesome-TTRSS 内有集成相应的插件和服务程序。
|
||||
|
||||
不过原作者是使用 node.js 编写的服务端,翻译数据库得不到及时更新,如翻译后还是写的是`义大利`而不是`意大利`。而且 docker image 体积 100+M,内存占用也较大。我在考虑用 Go 语言重写 OpenCC 的服务端并兼容 TTRSS 的 OpenCC 插件,并加入 CI 自动从上游同步翻译数据库。
|
||||
|
||||
## 为不支持 RSS 的网站自制源
|
||||
## 0x04 为不支持 RSS 的网站自制源
|
||||
|
||||
繁茂如 RSSHub 也不能保证拥有所有站点的 RSS 源。对于自制源,网上的方案大多数为使用 Feed43 和 Feedburner,但是人家是商业服务,虽然使用确实方便,但说到底还是为了商业。白嫖用户限制多不说,天知道哪天会有 break change 或者直接被墙或者跑路。最稳妥的做法还是自建。
|
||||
|
||||
手写爬虫程序简单灵活,不过后期维护难度较高而且难以复用。对于我想要订阅而有没有现成的源的网站,我的解决方案主要是两个:
|
||||
|
||||
### 为 RSSHub 编写目标站点的规则,并 Pull Request 申请合并
|
||||
### 1. 为 RSSHub 编写目标站点的规则,并 Pull Request 申请合并
|
||||
|
||||
RSSHub 除了提供众多现成的各类站点的 RSS 规则之外,也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 Javascript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支,如 CQUT 的教务处通知和知乎的用户文章列表。
|
||||
RSSHub 除了提供众多现成的各类站点的 RSS 规则之外,也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 JavaScript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支,如 CQUT 的教务处通知和[知乎的用户文章列表](https://docs.rsshub.app/social-media.html#zhi-hu-yong-hu-wen-zhang)。
|
||||
|
||||
### 使用 Huginn 为目标站点自制源
|
||||
### 2. 使用 Huginn 为目标站点自制源
|
||||
|
||||
Huginn 是一个强大的 IFTTT 应用,用它来生成 RSS 源简直是大材小用(主要是他动辄 200M 的内存占用)。不过某些情况下我需要监视特定站点并在内容变化时得到通知,个人向为主,这类就不适合写 RSSHub 的规则。
|
||||
[Huginn](https://github.com/huginn/huginn) 是一个强大的 [IFTTT](https://sspai.com/post/25270#!) 应用,用它来生成 RSS 源简直是大材小用(主要是他动辄 200M 的内存占用)。不过某些情况下我需要监视特定站点并在内容变化时得到通知,个人向为主,这类就不适合写 RSSHub 的规则。
|
||||
|
||||
使用门槛比 RSSHub 略低,可视化界面还是比较友好的,不过新手上手还是会有点困难,了解了 Huginn 的工作原理和基本的 Liquid 语法之后就手到擒来了。
|
||||
|
||||
## 解锁海外 RSS 源
|
||||
### 3. 使用 feed43 和 rss-proxy 这类可视化工具自助生成 RSS 链接
|
||||
|
||||
手写解析规则还是太麻烦,很多网页结构很简单根本没必要单独花时间写一堆解析规则,而且有些时候只是想临时订阅一段时间或是订阅个很小的网站,不想大费周章,选择 feed43 这类工具不失为一个轻量又便捷的选择。不过[feed43](https://feed43.com/)对免费账户创建的 RSS 并不保证稳定,时常无法连接甚至直接失效。在 Github 上发现一个不错的替代品[rss-proxy](https://github.com/damoeb/rss-proxy/),一个可视化的,快速自助生成站点 RSS 链接的工具。
|
||||
|
||||

|
||||
|
||||
填入目标网址就可以自动解析目标网页,程序会自动检测网页上的列表内容,可以自己选择要订阅哪个列表,然后就可以生成一个 RSS 链接。生成的 RSS 链接包括的信息有目标网址、要订阅的目标列表的节点信息和输出格式(RSS/ATOM)等,也就是说,rss-proxy 并不像 feed43 会把解析的规则存储在服务端,它是直接编码在 url 里面的!rss-proxy 开源支持自部署,不想用它提供的公用实例也可以自建,迁移零门槛。rss-proxy 也支持调用无头浏览器渲染异步获取数据的网页,可玩性很高。
|
||||
|
||||
->>>> [rss-proxy 公用实例](https://rssproxy-v1.migor.org/),可以点击体验下,还是很方便的
|
||||
|
||||
使用了一段时间体验挺不错,有个小问题就是对 UTF-8 以外的编码不太友好。
|
||||
|
||||
## 0x05 解锁海外 RSS 源
|
||||
|
||||
由于众所周知的原因,我国的互联网是不「互联」的。rsshub.app 部署在国外,现已基本无法直接访问。国内服务器上自建的 RSSHub 订阅如 Facebook 等国外站点更是不可行。为此我使用了 Clash 代理,并添加了一些公开的机场订阅,虽然速度和稳定性不是很高,但对于 RSS 这种需求还是绰绰有余的。又完善了一些爬墙的规则,比如对 google、facebook,rsshub.app 走代理,内网地址和 CN 的 IP 直连,反爬严格的网站完全走随机节点。一番操作下来,基本可以实现全球 RSS 订阅自由了 😁
|
||||
|
||||
## RSS 订阅破 CloudFlare 五秒盾
|
||||
## 0x06 RSS 订阅破 CloudFlare 五秒盾
|
||||
|
||||
如上所述,海外 RSS 源走公用机场可以解决国内的网络问题。但是很多站点会使用 CloudFlare 做 CDN 和防火墙,我们使用的公用机场其实一大半都是被用作非法用途的,IP 很多都在人家的黑名单里面,但凡通过那个节点访问 CloudFlare 保护的网站都会触发五秒盾防御,浏览器访问倒是没什么,但是可苦了 RSS。
|
||||
|
||||
@@ -65,13 +79,13 @@ google 了一番,没人写过我这个问题。。。人家都是爬虫绕过
|
||||
|
||||
可能的改进:匹配到 CF 节点,选择从本机连接东亚的连接较好的 CF 节点来请求目标站点的内容,可以一次解决那两个问题
|
||||
|
||||
以上都被我整合进了我的 Github 项目 RSSManX
|
||||
以上都被我整合进了我的 Github 项目 [RSSman X](https://github.com/Colin-XKL/RSSmanX)
|
||||
|
||||
> [RSSman X](https://github.com/Colin-XKL/RSSmanX) 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署,整合实用组件为你带来最佳 RSS 体验
|
||||
>
|
||||
> **Feature: 简单一键部署,常用组件整合,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
|
||||
> **Feature:简单一键部署,常用组件整合,自动更新支持,服务健康自检支持,海外站点 RSS 解锁**
|
||||
|
||||

|
||||

|
||||
|
||||
感兴趣的朋友可以关注一下 🍺
|
||||
|
||||
|
||||
252
content/posts/我,创作,AI,与网文小说.md
Normal file
252
content/posts/我,创作,AI,与网文小说.md
Normal file
@@ -0,0 +1,252 @@
|
||||
---
|
||||
title: 我,创作,AI,与网文小说
|
||||
date: 2023-08-27
|
||||
lastmod: 2023-08-27
|
||||
description: 上周,我发布了一部网文小说作品。它的特别之处在于,这是一部 AI 高度参与创作过程的作品。今天,我想来聊一聊,创作,AI,和网文小说。
|
||||
categories:
|
||||
- 杂记
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
- AI
|
||||
- GPT
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
上周,我发布了一部网文小说作品。它的特别之处在于,这是一部我尝试的第一部长篇文字类作品,一部企图可以面向大众市场的作品,一部 AI 高度参与创作过程的作品。
|
||||
|
||||
今天,我想来聊一聊,创作,AI,和网文小说。
|
||||
|
||||
首先在小说达到五万字左右数量的节点,先来概览一下这部作品。《决战!核废水引爆的亚特兰蒂斯》,这个故事包括一开始创作的动机其实都是我和朋友一时兴起想尝试下社会热点,AI 创作工具,以及曾经一个阅文无数,一腔热血想书写自己的小说的少年之前,和另一个对网文知之甚少,惜字如金的软件工程师之间,到底能碰撞出什么样的火花。于是我利用调休和周末的几天时间,构建出了这样一部作品并正式上架了番茄小说的平台。
|
||||
|
||||

|
||||
|
||||
TLDR:当前的 AI 工具尚且不足以完成整部中文网文小说作品,但是对于短篇偏纪实和科幻类已经能有比较不错的效果了。主要的挑战在于:
|
||||
|
||||
- 上下文。网文每章节动辄几千上万字,现有的大模型根本无法完整记录好超长的上下文信息,容易出现前后驴唇不对马嘴的情况。
|
||||
- 中文优质语料的缺失。
|
||||
- 大模型预训练时期人为添加的诸多限制
|
||||
|
||||
但是 GPT 的出现,已经让我们看到了这种可能。相信不出十年,AI 在超长上下文的文学创作能力就能有质的飞跃。
|
||||
|
||||
## 谈一谈使用的 AI 工具
|
||||
|
||||
在创作这部小说的过程中,主要用到了以下几个工具,在各自的领域都是代表性的存在,这里拿出来单独说一下。
|
||||
|
||||
**文生图模型:稿定设计-AI 绘图**
|
||||
|
||||
|
||||
这次的封面图的底图就是采用 AI 绘制的,坦白说一开始我个人不是特别满意,不是我预期想象中的样子。但是对于这整个过程使用的时间来说,我觉得这个效率反而是最惊人的。一分钟不到,符合基本设定要求的底图生成好了。我再画三分钟添加个文字,摆一摆位置,一个基本元素完备,风格色彩合格的网文小说封面图就制作好了。相比较之下,听闻之前的类似出图都是以天级别计算的,费用甚至几百上千,这其中的效率差简直恐怖。
|
||||
|
||||
我之前也尝试过手动搭建 stable diffusion 在自己的 GPU 服务器上运行,用的 gradio 那个 web ui,自我感觉良好,出图的效果也挺不错。但是拿给非工科的朋友用,上来就是吐槽界面怎么全是英文,怎么那么多按钮,该怎么启动,该怎么写提示词,怎么不会画中国风。有一说一,那个时候的 AI 工具更像是一个工程原型机,而现在被稿定设计这样的 toC 平台引进做好本土化适配和产品化设计之后,使用上手出乎意料的简单。
|
||||
|
||||
**图片超分模型:Upscayl**
|
||||
|
||||
|
||||
图片超分这是一个起步较早的方向,门槛低,效果好,我是用它来对上述生成的封面图进行超分后降采样得到一个更加可用的画面,毕竟上面没交钱开会员只能用截图工具获取画稿 hhh
|
||||
|
||||
可以预先选择好图片的风格以获取更好的超分效果,比如原图是偏动漫插画类的,还是偏写诗类的。
|
||||
|
||||
**LLM 大语言模型:Claude-2-100k**
|
||||
|
||||

|
||||
|
||||
GPT 早已经火出圈了,但是之前由于上下文长度限制,其实并不能很好的作用于网文小说写作这种场景。尝试了一众 AI 模型,LLama, Palm 这些因为对中文支持不友好所以排除名单。Claude-2-100k 综合使用下来是最合适的。可以在一开始给他说明好他的任务,是作家,然后再把故事背景和设定给他,后面就可以根据情节安排写出一段段故事了。
|
||||
|
||||
这类大模型是需要使用者通过不断调整 Prompt 才能发挥好的,比如让他写一段餐馆里的闲谈的场景,一开始会写的比较干,几句话描述下什么人,进到里面,坐下来,点了餐,吃了饭,干了什么事,走了。这种就很没意思。需要手动调教他,添加更多的环境描写,设定是在秋天,傍晚时分,温馨的环境,餐厅里面有什么,路人的神态是放松的,背景是本世纪初,对白偏生活化一点,诸如此类。很惊喜的是,它完成的很好,语言流畅自然,中文里一些高级的词汇和中文里一些口语化的描述,都能写出来。但是作为网文小说这种,就太死板了,目前看来写写严肃文学倒是很合适。
|
||||
|
||||
**LLM 大语言模型:彩云小梦**
|
||||
|
||||
Claude 和 GPT 说到底还是外国人训练的,对于网文小说这种题材,还是国内的公司做的更有那味。
|
||||
|
||||
产品从一开始就是为小说的场景而设计的。进来就会指引你填写世界观设定,风格选择等,续写风格可以选言情,玄幻,脑洞大开等等,看起来很有趣。实际体验下来,写出来的东西也确实很有网文那味,比如霸道总裁,玄幻武功,炼丹修仙,这个『中国特色文学体裁』那是信手拈来。甚至还会写擦边球。可以看得出来这个模型的确是用各种五发八门的国内网文小说训练出来的。
|
||||
|
||||
不过缺点也很明显,其底层技术应该是类似于 GPT3.5 的技术,主要问题是上下文太短,生成的故事没有连贯性,而且风格差异化太明显,经常跑偏。经常写着写着上一句还是霸道总裁的现代都市言情,下一段就斗气三段直接来到玄幻世界。还出现过前面一段是两人往事的叙事,转成霸道总裁风,然后两人调情没几句就直接变成讥讽和争吵,变成了一场战斗戏,再一转又是欲情故纵的调情擦边球戏。
|
||||
|
||||
不过总体来说,用来添加一些言情类的对白细节和玄幻类的战斗戏细节还是非常合适的。
|
||||
|
||||
## 当前 AI 创作工具的局限性
|
||||
|
||||
在使用 AI 创作这部小说的几天时间里,我最大的瓶颈,不是奇葩又烧脑的设定,不是新书上线缺乏积极反馈的一丢丢沮丧,也不是因为各个 AI 输出结果千疮百孔需要我人工救场时的懊恼,最大的问题,是白嫖额度到期。
|
||||
|
||||
没错,上面使用的平台,全部都是我白嫖的。即便他们都拥有可以加钱获得力量的会员方案,但在这个时间点,我还不想为了一本读者都没几个,收益遥遥无期的这么一个作品,甚至连完本都不能保证的作品去投入。毕竟这目前还只是一时兴起的一个玩具,还是想用一个更大众化的视角去看看当前 AI 技术在国内的发展和普及。
|
||||
|
||||
不过好在这些平台都很大方,每天都有免费额度,第二天就可以继续用了。这配额也一定程度上避免了我熬夜爆肝 hhh
|
||||
|
||||
这里就不得不提到当前 AI 普及和发展的一个大难题:算力要求。
|
||||
|
||||
这里不仅仅是这些大模型对运行的硬件规格要求高,目前在手机那样的平台上运行还是非常吃力。更重要的一点是,这些质量高效果好的模型需要更多参数,更多材料,更高规格的 GPU 去训练,更多个人和企业推送整个生态发展。而现在这些高端 GPU 而设计和制造技术都是掌握在美国科技企业手里,目前还有相关法案禁止出口先进制程的 GPU 到中国,国内高质量的材料也是少的可怜,生态更是无从谈起,各家都想自己搞自己的。国内本就不强的 AI 技术将雪上加霜。
|
||||
|
||||
国内前几年吹得牛逼哄哄的各种超算,各种国产芯片,在 AI 的浪潮前,似乎都没声了。国内外的 AI 技术和生态差距将被进一步拉大。不出意外的是,不久之后国内的 AI 就会落后于欧美一到两个世代。
|
||||
|
||||
下面再来探讨下这些国际领先的 AI 模型才需要考虑的,在这种内容创作场景下的一些局限性。
|
||||
|
||||
**第一:上下文**
|
||||
|
||||
|
||||
这里并不单纯指的是上下文长度的问题,还有上下文形式的问题。
|
||||
|
||||
首先显而易见的,对于网文这种篇幅超长,水货超过的类型,现有的大模型的上下文长度还是不太够。短期来看,提高上下文长度可以很大程度上改善续写跑偏的问题。但是有些问题不是单纯增加这个长度就可以解决的。一个很明显的例子,就是伏笔。
|
||||
|
||||
挖坑,或者说埋伏笔,是文学写作过程中非常常见的一种手法。悬念的制造,气氛的推动,离不开伏笔。而且对于长篇幅的作品来说,伏笔的呼应可以强化作品的连贯性,让读者能够清晰地认识到,这些文字是一个整体,他们共同构建了这个作品。这对于网文小说更是尤其重要。
|
||||
|
||||
但是从目前我使用 AI 创作的体验来看,目前的 AI 完全无法掌控好伏笔。几乎全部都是需要我人工来盯着,并思考什么时候适合去挖坑和填坑,一个坑挖了又需要以什么样的方式把他填上。
|
||||
|
||||
另外一个问题是,这些伏笔,人物关系,概念设定等,很多时候他都并不是一个线性的结构,所以通过文字的形式作为输入放到上下文里其实都不是很合适。我个人感觉他们更像是网状的结构,但是这种模式似乎又与当前这些模型的原理和运行模式格格不入,就期待后续有没有使用网状结构信息训练和推理的模型出现了。
|
||||
|
||||
**第二:预训练时期人为添加的限制**
|
||||
|
||||
|
||||
这一限制在国外这些大厂的 AI 模型上尤为明显,『政治正确』对他们来说太重要了。非常明显的体现就是,我要求 AI 构思一个反派角色,并输出人物的基本设定,以及往事的一些碎片特写。
|
||||
|
||||
但是 AI 返回的结果让我总是苦笑不得,说我们要保持正确的积极的价值观,同时不能对性别,种族,外貌等方面有任何的歧视。而且对环保还有 happy ending 有着莫名的执念。举例来说的话就是一个反派,有这黑暗的过往,后来成为了故事中的反派,烧杀抢掠,破坏环境,最后迷途知返,众人谅解,the end.
|
||||
|
||||
这些限制不仅仅使得 AI 在构思故事时,尤其是反派或者一些消极的事物时缺乏真实性和张力,此外也是的故事中的很多人物缺乏性格。男主就是男主,女主就是女主。关键情节上戏份谁多一点谁少一点罢了。
|
||||
|
||||
相较之下,国内的 AI 在处理人物性格这个问题上就太过极端。以彩云小梦为例,写出来的男性任务,要么就是霸道总裁,要么就是童年悲惨,后来灵力爆棚;女生呢要么是冷淡的御姐,要么就是看起来古灵精怪故作娇羞其实前言不搭后语的神经病。从体验的结果来看,倒是非常符合我对国内网文的刻板印象呢。
|
||||
|
||||
作为对比,就几个我认为人物塑造上很有特色的几个例子。
|
||||
|
||||
- 一个就是最近看的《阿基拉》,铁雄在一个孤儿院长大,处处被大哥一般的金田保护着,使唤着,在他面前,铁雄似乎永远是个长不大的弟弟。他向往着金田那酷炫的红色摩托座驾,几次试图驾驭他却失败闹了笑话。后来机缘巧合下被改造获得了超乎常人的力量,也成为了乱世里麻木,愤慨的民众敬仰和追随的救世主,神明。铁雄获得力量,在一次慌乱恐惧的半梦半醒的战斗中,意识到自己的强大后,进行了一番发泄,暴击了追赶而来的武装部队。对追赶而来的金田等人,他的第一反应是再也不是小弟了,现在换成铁雄保护他了。后来他的反应不是对所有欺负过自己的人复仇,也不是什么圣母拯救世界。不知道是出于害怕还是好奇,他继续追寻着终极的力量,阿基拉。后来追寻阿基拉成为一场空,在一片废墟上,双方战斗有来有回,这段给我的感觉,甚至不像是少年打败怪兽,更像是两个童年玩伴之间,想象自己化身超人后的嬉戏。后面铁雄身体里的力量不受控制,他变成一个肌肉组织疯狂增生甚至吞噬女友的巨型肉瘤怪兽后,又一次向金田发起了救助『救救我』。
|
||||
- 科幻巨著《三体》,动画作品《我的三体》里,对于章北海这个人物的刻画也很有意思。一个从海军时代走到太空军时代,意志坚定,正义凛然的军人,为了保卫人类文明,为了应对无处不在,封锁人类科技的质子,章北海对整个世界封锁了自己的内心,坚定他的信念。跨越了几个世纪,在他冬眠几百年后醒来,三体的探测器水滴第一次到达太阳系与人类文明接触前夕,章北海利用他代理星际舰长的身份,带着保卫人类文明的使命,带着整艘星舰以最大速度脱离了太阳系,向着无尽星辰大海远去。他深知人类文明在三体世界的技术面前毫无还手之力,他拼尽全力,为人类文明留下一个火种。后面假装追击叛逃者章北海,实则心有灵犀,志同道合的褚岩舰长等也与其汇合。但是在资源储备不同的情况下,四只舰队不得不自相残杀争夺所剩无几的资源以支撑长途的星际航行。这场战斗中章北海以释然的心态交出了这个接力棒,由之前与他素未谋面不曾相识的褚岩舰长,作为他的精神延续来完成这个延续人类文明火种的使命。
|
||||
|
||||
这两个人物塑造都很有意思,风格迥异,不落俗套,却又富有戏剧张力,而且透露出作者对生活和人性的观察,有独特的人文温度。
|
||||
|
||||
而这样的人物塑造,不仅现阶段的 AI 无法直接达到,甚至作为创作者给定故事大纲和发展脉络,AI 都很难写出对应的契合特定作品风格和人物个性的文字。
|
||||
|
||||
当然上面拿文学上获得高度评价的作品来欺负现阶段不够成熟的 AI 有点不够意思。但即便对于网文,要写出让人印象深刻的角色和情节,只有这么几个脸谱化高度同质化的画像,我觉得是几乎不可能的。如果要写流水账形式,刻板印象的,没有太多要求的工业流水线作品,我觉得目前还是有这个可能的,不过需要足够好的模型能力和预训练作为基石,再加上创作者对 AI 模型和提示词的了解才行。这个想必在未来两到三年应该就会有突破,到时候市面上这些高度同质化的小说只会更加泛滥。
|
||||
|
||||
## 浅谈字节与番茄小说
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
番茄小说的产品的月活,营收之类的我在此就不再过多赘述,大家有兴趣的可以去找些商业分析报告看看。这里主要探讨的是,他作为字节旗下的产品,身上有这哪些字节的影子,又有这什么独特的优势和产品策略?
|
||||
|
||||
首先,和头牌产品抖音一样,番茄小说是一个 UGC 的,重流量,数据,反馈和推荐算法驱动的这样一个产品。
|
||||
|
||||
说起推荐算法,很多人都会觉得 AI 这一块国外技术这个牛批,为什么抖音这种模式首先在国内流行起来,后来又席卷国外互联网。
|
||||
|
||||
这里有几个抖音发家致富很重要的因素,推荐算法需要大量数据做训练,相较于奈飞这样的长视频流媒体平台,抖音的短视频在相同时间内能够采集到的用户的反馈数据是前者的几十上百倍。数据量有了,训练算法的模型也就更精准了,用户得到的反馈越来越积极,在内容制造者层面和内容消费者层面都开始扩张开来,越来越多的流量,越来越多的用户反馈数据,越来越好的算法,越来越好的用户积极反馈,越来越多的内容创作者涌入,这个商业飞轮就运转起来了,而且转的越来越快。
|
||||
|
||||
在这一点上,番茄小说师承抖音,在这条正反馈链路上也是做的很好,小说免费,叠加头条的引流,大家都跑过来看,用的人多了,反馈数据有了,推进更精准了,反响更好了,更多的写作者入驻,内容多了,整个盘子越来越大,越来越好。
|
||||
|
||||
除此以外,小说作为当代国内文娱领域一个重要组成部分,IP 也是一个非常重要的资产。每本小说都会在两万字的时候有一个跟番茄签约的流程,签了,就能获得被搜索推荐的资格,获得平台分成,不签,对不起啥也没有。签约之后 IP 相关的内容肯定是要被平台买去了的,具体作者能分到几个点吗。。。那就是另外一个故事了。
|
||||
|
||||
这一点跟腾讯阅文集团的布局是一样的,流量,IP,影视和周边。这些大体都是同一套商业逻辑。不知道其他平台怎么样,番茄应该是非常注重反馈数据的那一个了,更新频率,完读率,互动活跃度等等各种指标来考核作者,整的比上班还累。
|
||||
|
||||
不过总体来说,番茄和字节整个的这个商业逻辑和发家致富历史还是很值得我们去学习的。尤其是这个恐怖的飞轮,一旦转动起来,就是能以势不可挡的架势冲击大半个互联网。
|
||||
|
||||
## 创作历程分享
|
||||
|
||||
平心而论,我认为自己一直都不是,也无法成为一个优秀的文字工作者。也许我可以写出中学时期那些所谓的辞藻华丽,立意高深的『好』作文,也许可以写出一篇简洁,严谨的工作文档。但是我知道,这里面缺乏温度,缺少灵魂。见过真正有人文关怀,突破天际的想象力,性格迥异却又充满戏剧性张力的人物故事,见过那些有天赋的作者和同学,我觉得有些东西就是需要天赋,没天赋就是没天赋,可能终其一生都赶不上。
|
||||
|
||||
如果我要写一个故事,可能最多也只是一篇平平无奇,逻辑上通顺,偶尔有那么几个脑洞,大部分时间都只能在前辈的影子下拙劣地模仿的一个故事。
|
||||
|
||||
在创作这部甚至不能称为作品的作品中,我的大部分时间也都是在构思一个试图有些新鲜东西的『合理』的情节,补充各种细节和设定,挖坑,填坑,水字数,调整 AI 生成文本中的 bug。
|
||||
|
||||
不过也不是完全没有收获,在尝试使用 AI 创作整个小说的时候,我大概掌握了一些技巧。比如设定要预先给 GPT 定好,情节的节奏和衔接还是要亲自把控,但是一些细节可以让 GPT 代劳,这个真的很有用,(尤其是对于需要大量水字数的网文小说)
|
||||
|
||||
比如让 GPT 写一段餐馆里众人围着小电视机的日常对白。
|
||||
|
||||
> 街道上行人并不多,都是些步履匆匆的上班族,或悠哉散步的老人。秋阳从树隙间洒落下来,洋洋洒洒铺满了整条街道。路边的建筑不是传统的日式木质结构,而是夹杂着些西式的红砖或水泥房屋,显得格调混杂却又和谐统一。
|
||||
>
|
||||
> 这是一条看似平凡却让人感到亲切温馨的小街道,没有太多喧嚣与烦扰,却处处透着人情味。林凡和明石正要开始一段充满未知冒险的旅程,这家小餐馆像一个温暖的港湾,让疲惫的身心得以喘息。
|
||||
>
|
||||
> 两人兴许不知道前方有怎样的险阻在等待,但是此刻,享受这份静谧与温情,已经足够。
|
||||
>
|
||||
> 小餐馆的电视上,又在播放着新闻。
|
||||
>
|
||||
> “天呐,蔬菜价格又要涨价了!”一个头发花白的老奶奶放下碗筷,双手扶额无奈地说。
|
||||
>
|
||||
> “是呀,最近物价飞涨,生活费用压力太大了。”旁边一位白胡子老头也叹了口气。
|
||||
>
|
||||
> “就是有证据显示这起事件有阴谋!”那名中年男子神秘兮兮地小声说。
|
||||
>
|
||||
> “天哪!这也太可怕了。”老奶奶捂住嘴巴,一副震惊的表情。
|
||||
>
|
||||
> “唉,真不知道这社会要到什么地步。”老头叹道。
|
||||
>
|
||||
> 电视上又切换到了其他新闻,几名上班族模样的青年男女也加入了讨论。
|
||||
>
|
||||
> “诶,你们看,股市又跌了!”一个男生着急地说。
|
||||
>
|
||||
> “最近经济形势越来越不景气啊。”一个女生也愁眉苦脸地说。
|
||||
>
|
||||
> “工作这么辛苦,钱还是省不下来,年轻人现在日子没指望了。”另一个男生一脸失望。
|
||||
>
|
||||
> 三名年轻人叹息连连,满脸忧虑之色。这时,电视画面跳转到了娱乐新闻,几名艺人的花边新闻占据了荧屏。
|
||||
>
|
||||
> “来来来,看这个,明星的绯闻啦!”一个女生眼前一亮,话锋一转。
|
||||
>
|
||||
> “嗨,这些娱乐新闻才叫有意思。”另一个女生也来了精神。
|
||||
>
|
||||
> “工作那么辛苦,看点这些解压解压嘛。”一个男生笑着说。
|
||||
>
|
||||
> 三人又投入到了对明星私生活的讨论中,烦恼的表情一扫而空,兴奋地指点着电视画面。
|
||||
>
|
||||
> 林凡和明石面面相觑,感慨百态人心,千头万绪,便也没去打扰他们继续闲聊。
|
||||
|
||||
还有一些人物对白类的,写起来很麻烦的,也可以让 GPT 代劳水字数。
|
||||
|
||||
> 他们一边在海上漂流,一边在研究这片海域的变异生物,寻找着这个世界的根源。他们的进展很顺利,在几天之后,他们终于查到了一些蛛丝马迹。一处人迹罕至的海岛上,有一座奇怪的建筑。
|
||||
>
|
||||
> 在研究中心的顶楼,一个房间的窗户被打开,里面站立着数十名科学家。这些科学家都身着白大褂,戴着墨镜,一副严肃冷漠的表情。他们正在进行一项实验。
|
||||
>
|
||||
> 在林凡和明石的监视之下,他们在实验台上摆弄着一块金属板。这块金属板通体呈现黄铜颜色,表面光滑如镜。
|
||||
>
|
||||
> 一位穿着白大褂的科学家拿着一把匕首,匕首微微泛着幽蓝的光芒。
|
||||
>
|
||||
> 不知为什么,林凡看到这个光芒第一个想起的是明石。
|
||||
>
|
||||
> 匕首插进了那块金属板。金属板的表面顿时出现了一阵阵波纹,波纹越来越大,最后化作一张人脸出现。
|
||||
>
|
||||
> 林凡看着这张诡异的人脸,心脏不由自主地加速跳动,呼吸急促,额头渗出细汗,双腿忍不住微微发抖。
|
||||
>
|
||||
> "你在害怕什么?你是不是害怕这块金属板上有一张狰狞的人脸?"
|
||||
>
|
||||
> 科学家的声音响起,让林凡清醒了过来。他看着林凡,露出一丝嘲讽的微笑:"害怕什么?你在害怕这块金属板上的人脸是假的?哈哈!你真幼稚啊!"
|
||||
> "你在胡说八道些什么!"林凡怒声反驳,"你们的实验已经失败了,现在我们就能证明它不是真的!"
|
||||
>
|
||||
> "证明?怎么证明?"科学家冷哼一声,"如果这块金属板上没有人类的话,你认为你有资格跟我们谈条件吗?"
|
||||
>
|
||||
> 林凡愣了愣,一时语塞。这个时候,明石走了过来,"我们已经找到了这个实验的关键,我想我们应该跟他们谈判一下。"
|
||||
>
|
||||
> 他们跟着科学家走到了那个办公室里。那里坐着四个人,分别是两男三女,男人的年纪约摸四十岁左右,看上去有些阴郁,眼睛里透露着一抹狡黠的寒光。女人的年龄比较大,约有七十多岁,头发花白,脸上的皱纹深邃。男人看上去三十多岁,皮肤黝黑,眼眸深邃。三女中有两个看上去年龄稍微小一点的女孩,大约只有十六七岁,但是却穿着一套白大褂,一看就像是医院里的护士装。
|
||||
>
|
||||
> "你们是谁?想干什么?"其中一个男人开口问道。
|
||||
|
||||
上面这两段文字,前面一段是 Claude 生成的,后面这段时彩云小梦生成的。可以看出有这非常明显的风格差异。
|
||||
|
||||
Claude 生成的很『正确』,前后通顺合理,但是总感觉没那味,像是先生成的英文再翻译过来一样,而且感觉很平淡,里面的每个人物,换成男人女人,大人小孩,感觉都没有什么不会有什么违和感。
|
||||
|
||||
彩云小梦生成的相较而言就很『疯癫』,写的一长剧情上就容易出 bug,而且动不动就『冷哼』『嘲讽』,情绪波动倒是有了,不过总感觉全是国内网文的套路化,应该是国内网文看多了吧也怪不得人家的模型 hhh
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
## 关于创作欲
|
||||
|
||||
最后的最后,来聊一聊『创作欲』这个东西。
|
||||
|
||||
马斯洛需求层次理论模型
|
||||
|
||||
人的需求分成**生理需求**、**安全需求**、**归属与爱**、**尊重需求**和**自我实现**五个层次。需求是由低到高逐级形成并得到满足的。
|
||||
|
||||
创作这件事正是最高的那一层,自我实现的层次。
|
||||
|
||||
创作这件事,其实并不是单纯指的是创作小说,音乐,电影等。我个人理解,他应该是一种更广义的,自身能力参与建设最终使得一样事物变得独一无二。至此,个人的价值得到了体现,收获了『心流』状态的正向反馈,『归属感』的反馈,以及这一件事物变得独一无二带来的价值的提升。
|
||||
|
||||
举例来说,写代码是一种创作,摄影是一种创作,唱歌是一种创作,某时某刻你在朋友圈留下一段自己的文字,也是一种创作。
|
||||
|
||||
『我』的参与,让这个事物变得独一无二。『我』的沉浸,给我带来积极的反馈,『我』创作的作品,属于我,有一种归属感。
|
||||
|
||||
我在给自己的年度目标中,也把中大型创作作为我的指标之一。我觉得首先无论结果时好时坏,我很享受创作的过程。就比如本文开头提到的这本小说,以及前段时间制作的『铃芽之旅』中日粤三语 MV,花了很多时间和精力,但是并不会觉得累,反而会觉得很有成就感,甚至是反向充电。也许这就是『为爱发电』的魅力吧。
|
||||
|
||||
## 畅想
|
||||
|
||||
时代的发展,技术的更迭,让我们有机会去尝试和实现我们的祖辈做梦也想不到的东西。当前,AI 作为创作的辅助工具,尚且处在初级阶段,AI 绘图,AI 写小说,AI 写代码,都还只是高度场景化,模板化的一些应用。也许未来的某一天,让我们可以真正地,从脑机接口将我们的想法输入到 AI,通过 AI 进行解读和艺术加工。到那个时候,创作的权利,属于我们每个人。人类世界会变得更好吗,我不知道。但是我期待未来的某一天,我能够通过这种方式,记录下脑海中的旋律,梦境中的画面,以及记忆中的故事。
|
||||
@@ -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:
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
这样的广告呢,虽然他的侵略性或许比以往更小了,不过还是有点碍眼。而且在某种程度上,依然可能会误导家里的老人或是小孩。为了统一家庭的互联网体验,减少不必要的麻烦,这个广告也是我们的 target。由于这个广告是嵌入搜索结果中的,如果你用之前的小伎俩,打算单独屏蔽这个广告对应的元素的话,你就要失望了。因为他会连带着屏蔽所有的搜索结果。这显然是不可取的。下面我们要介绍另外两个工具。
|
||||
|
||||
@@ -52,22 +52,22 @@ tags:
|
||||

|
||||
|
||||
安装好油猴插件后,你可以在 [Greasyfork.org](https://greasyfork.org/zh-CN/) 上下载各种黑科技般的脚本。安装成功后,油猴会在你进入符合条件的网页时自动启用对应的脚本。比如,你安装了 AC 的这个脚本,而这个网页是适配了某度的,那么当你进入某度的网页时,油猴就会自动启用这个脚本。快来领取属于你的纯净版度度吧。
|
||||

|
||||

|
||||
|
||||
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素? 对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
|
||||
前面介绍的几个,都只是借助第三方工具来屏蔽网页上特定的碍眼的元素。如果我们要阅读来自不同网站的新闻,为了获得机制纯净的阅读体验,难道要用 AdBlock 一个一个选中页面中除文章主体文字以外其他所有元素?对于这种页面结构非常固定的一类网站,我们是否可以通过某种方式,来只提取页面主体的文字,以优化我们的阅读体验呢?
|
||||
|
||||
### 使用浏览器自带的阅读工具
|
||||
|
||||
苹果很早就想到了这一点,Safari 浏览器可以识别当前的的页面是否是一个结构简单,文字为主题的页面。在符合条件的网页上,Safari 会提示你使用阅读工具来优化页面,以获得更好的阅读体验。当然,你也可以手动启用他。
|
||||

|
||||

|
||||
微软也不甘示弱,在随 Win10 推出的 Microsoft Edge 上,也内置了阅读工具。你可以在地址栏的右边找到他。
|
||||

|
||||

|
||||
_[注:区别与 2020 年新的基于 Chromium 内核的新 Edge 浏览器,此处指的是老版 Edge HTML 内核的 Microsoft Edge 浏览器]_
|
||||
|
||||
### 使用第三方阅读工具 - [简阅 SimpRead](http://ksria.com/simpread/)
|
||||
|
||||

|
||||
也许你买不起苹果,受不了 Win10,你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅,正如他的名字,旨在为你提供简约的阅读视图。作者为了实现 “简单阅读” 这个小目标, 主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
|
||||
也许你买不起苹果,受不了 Win10,你依然可以通过安装第三方工具的方式享受纯净的阅读体验。简阅,正如他的名字,旨在为你提供简约的阅读视图。作者为了实现“简单阅读”这个小目标,主动适配了数百个常见的文字为主体的网站,并设计为可以自动检测网页结构,对于漫天飞舞的各类热门冷门的小说网站、新闻网站,都可以自动识别并优化为适合阅读的页面。
|
||||
|
||||
恭喜你!利用上面介绍的几个工具,你已经可以在国内互联网环境中求的一份净土了。如果你感兴趣或是强迫症患者,欢迎前往 **打造沉浸式互联网体验 【广告篇 - 下】**
|
||||
恭喜你!利用上面介绍的几个工具,你已经可以在国内互联网环境中求的一份净土了。如果你感兴趣或是强迫症患者,欢迎前往 **打造沉浸式互联网体验【广告篇 - 下】**
|
||||
温馨提示:下篇介绍的内容的内容将略有一点偏硬核,需要一点点的动手能力哦~
|
||||
152
content/posts/来谈谈日志集中管理方案 - syslog是你的好伙伴.md
Normal file
152
content/posts/来谈谈日志集中管理方案 - syslog是你的好伙伴.md
Normal file
@@ -0,0 +1,152 @@
|
||||
---
|
||||
title: 来谈谈日志集中管理方案 - syslog 是你的好伙伴
|
||||
date: 2024-10-13
|
||||
lastmod: 2024-10-13
|
||||
description: 身为一个数码宅,家里总是会有越来越多的数码设备,智能化的设备多起来,总是难免会遇到各种各样的问题,排查问题的时候日志就很重要了,对于一些偶发的 case, 比如偶发网络卡顿,能够看到足够完整清晰的日志,就很方便了。
|
||||
categories:
|
||||
- 技术
|
||||
tags:
|
||||
- Linux
|
||||
- NAS
|
||||
- OpenWRT
|
||||
- Docker
|
||||
---
|
||||
|
||||
|
||||
身为一个数码宅,家里总是会有越来越多的数码设备,智能化的设备多起来,总是难免会遇到各种各样的问题,排查问题的时候日志就很重要了,对于一些偶发的 case, 比如偶发网络卡顿,能够看到足够完整清晰的日志,就很方便了。
|
||||
|
||||
对于一些低功耗设备,比如路由器,其磁盘资源很紧张,日志通常不会保存很久。这个时候要排查一些偶发的持续时间长的小 bug 就很头痛了。好在 openwrt 原生就支持将日志通过 syslog 协议发送到远程服务器。不过看了一圈,发送是发送过去了,但是看日志还得命令行一个个看,要想有个方便的地方看的话就得上 ELK 那一套非常繁琐且吃资源的那一套,我的需求是这样的:
|
||||
|
||||
- 免费,可以持续使用
|
||||
- 能够通过 syslog 协议收集日志
|
||||
- 能够自部署最佳,但是不希望是 ELK 那种繁琐且非常消耗资源的
|
||||
- 有个 web 界面能方便的查找日志
|
||||
- 能够配置监控,那样的话如果设备有 fatal 日志我可以立即知道
|
||||
|
||||
搜寻了一番,发现有个 datalust 公司出的 seq 看起来挺不错,在自己服务器上部署了一套,完美符合我的需求,分享一下。
|
||||
|
||||
seq 不仅支持 syslog, 还支持程序主动上报、采集容器日志等很多功能,这里只主要围绕 syslog, 收集各种终端设备日志做介绍
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 安装:通过 docker compose 部署 seq
|
||||
|
||||
首先生成下默认密码,这里需要通过程序自身的指令生成明文密码对应的密文才行。比如我这里指定初始密码的明文为`initP@ss`, 运行这个指令,就会输出对应的密文,这个待会部署的时候需要使用
|
||||
|
||||
```bash
|
||||
➜ echo 'initP@ss' | sudo docker run --rm -i datalust/seq config hash
|
||||
|
||||
|
||||
QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd
|
||||
```
|
||||
|
||||
之后通过 docker compose 进行部署,下面为 compose 文件示例
|
||||
|
||||
```yaml
|
||||
services:
|
||||
seq-input-syslog:
|
||||
image: datalust/seq-input-syslog:latest
|
||||
container_name: seq_syslog_input
|
||||
depends_on:
|
||||
- seq
|
||||
ports:
|
||||
- "20014:514/udp" # 接收 syslog 协议请求的端口,这里配置的是 20014, 可以自定义,后面需要用到
|
||||
environment:
|
||||
SEQ_ADDRESS: "http://seq:5341" # 要转发到主程序进行处理,端口为默认的 5341, 不用改
|
||||
restart: unless-stopped
|
||||
|
||||
seq:
|
||||
image: datalust/seq:latest
|
||||
container_name: seq_log
|
||||
ports:
|
||||
- "20054:80" # web ui
|
||||
environment:
|
||||
ACCEPT_EULA: Y
|
||||
SEQ_FIRSTRUN_ADMINPASSWORDHASH: QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd # 这里填写刚生成的密文
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /data/seq-data:/data
|
||||
```
|
||||
|
||||
之后执行 sudo docker compose up -d , 顺利的话,在配置的 web ui 端口,就可以看到管理台了。默认账户为 admin, 密码为刚才设置的密码的原始明文。
|
||||
|
||||
## 使用:syslog 配置
|
||||
|
||||
基本上所有 Linux-base 系统都支持将系统日志通过 syslog 协议发送到远端服务器。我手头主要的 openwrt 路由器、运行 truenas 系统的 nas、树莓派上跑的 debian, 以及其他 linux 云服务器都可以无缝接入,这里简单介绍下
|
||||
|
||||
### openwrt 配置远程 log
|
||||
|
||||
在 system -> system 菜单下,有个 logging 的 tab, 里面配置好服务器 ip、端口就可以使用了。协议记得选 udp
|
||||
|
||||

|
||||
|
||||
### truenas 配置远程 log
|
||||
|
||||
在 system setting -> advaned -> syslog 菜单下,配置远程服务器地址和端口,协议选择 udp, 保存就可以了
|
||||
|
||||

|
||||
|
||||
### linux 服务器配置远程 log
|
||||
|
||||
大多数 Linux 发行版已经预装了 rsyslog。可以通过以下命令检查是否已安装:
|
||||
`rsyslogd -version`
|
||||
如果未安装,可以使用以下命令安装:
|
||||
|
||||
```bash
|
||||
# Debian/Ubuntu:
|
||||
sudo apt update
|
||||
sudo apt install rsyslog
|
||||
|
||||
# CentOS/RHEL:
|
||||
sudo yum install rsyslog
|
||||
```
|
||||
|
||||
步骤 2:配置客户端的 rsyslog
|
||||
编辑 rsyslog 配置文件:打开配置文件进行编辑,通常位于 `/etc/rsyslog.conf` 或 `/etc/rsyslog.d/` 目录下。
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rsyslog.conf
|
||||
```
|
||||
|
||||
添加远程服务器配置:在文件末尾,添加以下行以指定远程服务器的 IP 地址和端口(默认是 UDP 514 或 TCP 514):
|
||||
|
||||
```conf
|
||||
*.* @remote-server-ip:514 # 使用 UDP
|
||||
*.* @@remote-server-ip:514 # 使用 TCP
|
||||
```
|
||||
|
||||
这里我们需要使用 udp 协议的。
|
||||
将 remote-server-ip 替换为远程 Syslog 服务器的实际 IP 地址或者域名,保存并关闭文件。
|
||||
|
||||
比如
|
||||
|
||||
```conf
|
||||
*.* @syslog.myserver.com:20014
|
||||
```
|
||||
|
||||
步骤 3:重启 rsyslog 服务
|
||||
在进行更改后,重启 rsyslog 服务以应用新配置:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rsyslog
|
||||
```
|
||||
|
||||
## 其他配置
|
||||
|
||||
### 配置日志定期清理
|
||||
|
||||
默认情况下,是没有配置日志清理规则的,时间一长服务器硬盘可能直接满了,所以这里一定不要忘记配置自动清理。在菜单里的 retention 可以配置过多少天删除
|
||||
|
||||

|
||||
|
||||

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

|
||||
后来在这两个地方的资料才发现一些端倪,人家一般都是在 NAS 本机安装,然后访问本机地址进入初始化页面,但是我这个就不是。
|
||||
|
||||
https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server
|
||||
|
||||
https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804
|
||||
|
||||
知道了问题所在,解决方案还是比较简单的,那就是 SSH 连接使用端口转发,将目标服务器 Plex 网页服务的端口,映射到本机的一个端口。这样访问本机的这个端口,就能访问到 Plex 服务了,而对于 Plex 服务器的 Web 端来说,我们就是访问的本机地址。
|
||||
|
||||
访问 http://localhost:8888/web/ 即可看到 Plex 的页面。如果没有带上后面的`web` 后缀的话,直接访问可能会显示一个 XML 页面。
|
||||
|
||||
```bash
|
||||
ssh user@192.0.2.1 -L 8888:localhost:32400
|
||||
```
|
||||
|
||||
上面这句话就是 ssh 连接到 192.0.2.1 这个远端,然后在本地,即 ssh 客户端的机器,监听 8888 端口,本地所有访问 8888 端口的请求都会被重定向,等同为远端机器访问自身的 32400 端口,即为上文提到的,部署 plex 服务的端口
|
||||
|
||||
|
||||

|
||||
如下是正常的初始化页面:
|
||||

|
||||
有些情况下可能会遇到需要额外执行关联操作的情况,不过问题不大
|
||||
|
||||

|
||||

|
||||
|
||||
配置成功后就可以正常享受影音资源啦 😎
|
||||
|
||||

|
||||
124
content/posts/论如何下载任意网站视频.md
Normal file
124
content/posts/论如何下载任意网站视频.md
Normal file
@@ -0,0 +1,124 @@
|
||||
---
|
||||
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),可以在豆瓣的影视详情页右侧显示有资源的站点,非常方便
|
||||
|
||||

|
||||
|
||||
分享下个人常用的下载站点:
|
||||
|
||||
* 欧美资源下载:[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-DLP(YouTube 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 来下发分片文件的信息
|
||||
|
||||

|
||||
|
||||
打开开发者工具的网络选项卡,监听网络活动,点击播放视频,会多出来很多条目分别代表每一个网络请求。在搜索框输入 m3u8 来进行过滤。定位到该请求后可以在新标签页打开,保存这个 m3u8 文件。
|
||||
|
||||

|
||||
|
||||
之后我们可以利用 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
|
||||
```
|
||||
|
||||

|
||||
|
||||
解析并下载 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/)
|
||||
|
||||
- - -
|
||||
|
||||
以上
|
||||
170
content/posts/踏着风,去远方 - 我的2024 年度总结.md
Normal file
170
content/posts/踏着风,去远方 - 我的2024 年度总结.md
Normal file
@@ -0,0 +1,170 @@
|
||||
---
|
||||
title: 踏着风,去远方 - 我的 2024 年度总结
|
||||
date: 2024-12-31
|
||||
lastmod: 2025-02-09
|
||||
description: 我的 2024 年度关键词 去远方&心流
|
||||
categories:
|
||||
- 杂记
|
||||
- 年度总结
|
||||
tags:
|
||||
- 总结
|
||||
- 杂记
|
||||
---
|
||||
|
||||
## Part 1. 回顾
|
||||
|
||||
### 年度关键词:去远方
|
||||
|
||||
2024 年里,我去了更远的地方,尝试了更多以前不曾想到的体验,并决定了几个长期投入的方向,以更高的视角来看,我「拓宽」了我的边界。总有很多鸡汤营销号喜欢鼓吹「走出舒适区」,虽然这句话现在已经打上深深地 PUA 标签了,不过确实挑战陌生领域能更快地成长。但我觉得真正有意义的事是「扩张舒适区」。方向有两个,一个是降低自己的欲望,降低阈值,提高自己的韧性;另一个方向就是扩大疆域,发现更多舒适区。
|
||||
|
||||
### 年度关键词:心流
|
||||
|
||||
工作上的事情太烦杂,躺在床上没睡着又容易胡思乱想。但是当我在涂装模型,在给涂色书上色,在练习架子鼓的时候,发现我真的可以做到什么都不想,很放松,脑海里面也不会有各种杂音。本来我以为向给涂色书上色这种活动,只是消磨时间用的,像疫情的时候无聊肯定很合适。没想到简简单单,用画笔涂色,能够有这么治愈的效果。
|
||||
|
||||
这种跟玩游戏或者写代码时的高度专注还不太一样,给我的感觉是完全不需要动脑,基本处于放空状态,像是泡在热水里。不过也有可能是用脑区域不一样?
|
||||
|
||||
不管怎么说,我非常庆幸找到了这样一种状态,一个从另一种角度放松和疗愈自己的手段。
|
||||
|
||||
### 2024 highlights
|
||||
|
||||
- 泰国游,解锁了新地图,还是挺新鲜的,很多在国内习以为常的事物或者文化,换个角度能看到很多不一样的东西
|
||||
- 搬家,同等价位房间面积升级,大 house 就是更爽啊
|
||||
|
||||
#### 年度好物
|
||||
|
||||
- **扫地机器人**!懒人福音,每天回家都是干干净净的真的超赞
|
||||
- **回音壁 with 实体后环绕**!没有大 house 原来也可以有家庭影院,实体环绕才是真牛批
|
||||
- **Homepod**!从 mini 换到大 homepod, 低频清晰了不止一星半点,听到了很多听不出的低频细节
|
||||
|
||||
#### 年度五星书影音
|
||||
|
||||
- 进击的巨人系列
|
||||
- 混沌武士
|
||||
- 迷宫饭
|
||||
- 跃动青春
|
||||
|
||||
### 年度遗憾
|
||||
|
||||
- 今年也是 AI 大爆发的一年,上半年在折腾 AI 生图,做了一个基于 AI 生图的混剪视频,从分镜到粗剪都做的七七八八,不过最后没能解决好角色一致性问题,没能达到上线标准
|
||||
- 十一 A 股和港股爆火的行情没能高位下车,果然会买是徒弟,会卖的才是师傅啊
|
||||
|
||||
### Flags From 2024
|
||||
|
||||
- 发布 6 篇博客文章(❌ 零零散散写了几篇笔记,但是没有到博客文章的完成度)
|
||||
- 做 3 个 Weekend Project, 两天马拉松直接从 0 到上线(❓ 混剪类视频倒是做了几个,不过时间超长了)
|
||||
- 做 2 个 Side Project, 并持续投入运营(✅ 一个是 FeedCraft,目前是自用为主,计划长期维护;另外就是 模型设计 + 涂装,从图片到拿在手上的模型,真的超有成就感)
|
||||
|
||||
### Question From 2024
|
||||
|
||||
> 一年后的自己,有没有找到或者建立一个会愿意持续投入 3 年以上的项目,方向,或者事业?
|
||||
|
||||
找到了,而且还是 3 个。
|
||||
|
||||
1. 学习乐器,目前刚入坑架子鼓,感觉良好,持续投入
|
||||
2. 模型设计&涂装,随着 3D 打印 + AI 3D 生成的技术的不断进化,我相信普通人也可以离手办自由更近一些。不过打印归打印,上色目前来看还只有靠人工,计划先从上色开始入门,除了模型涂装可以用到,后面也可以考虑尝试学习绘画
|
||||
3. 第二收入。延迟退休政策叠加国内这糟糕的职工体系,让我对正常工作到退休不敢抱有幻想。搞钱才是硬道理
|
||||
|
||||
## Part 2. 「一夜暴富」and「早日退休」
|
||||
|
||||
延迟退休的新闻一出,一想到还有几十年才能退休,我才发觉这个时代的「工作」有多离谱。科技在进步,时代在发展,我们的生活我们的人生真的变得更好了吗?动辄几十年的房贷,不断动荡的市场行情,让当下的很多年轻人都萌生了不买房不生娃的理念。如果可以的话,谁不想有个安稳的家,享受生活呢?结合 24 年很多反社会事件的新闻,可以看到当下大众的压力是不小的。
|
||||
|
||||
「一夜暴富」,「早日退休」,是安慰,是自嘲,也是祝福。无论是路人的手机壳,各种活动的文案,都可以见到这样类似的标语。不过空有口号是没用,「想致富,先修路」,今年我开始更多地关注这一方面的内容,看了很多 up 的案例和一些所谓的「理论支撑」,谈到最多的就是「被动收入」、「复利」「副业」等等。先不考虑一夜暴富,能有更多的收入来源也能在很多时候多提供一些底气和选择。
|
||||
|
||||
### 我的被动收入现状
|
||||
|
||||
#### 投资理财
|
||||
|
||||
- 银行理财:收益率 2.69%
|
||||
- 港股:收益率 10.1%
|
||||
- A 股:持仓收益算下来其实是小亏的,不过总体量级很小,忽略不计
|
||||
- 美股:年底又回到了之前的水位,前后比较基本没赚,忽略不计
|
||||
|
||||
#### 年度总收入占比
|
||||
|
||||
银行稳定理财收益占比 0.18%
|
||||
股票收入在总收入 1.85%
|
||||
|
||||
总体来看,被动收入占比只有 2.03%,之前的理财策略还是太保守了。大部分闲钱都在卡里没动过,其实放余额宝都好。还有进阶理财的部分,也是配比太低。
|
||||
|
||||
#### 时薪变化追踪
|
||||
|
||||
以总收入情况来看,2024 相较于 2023 年:
|
||||
|
||||
- 只看税后到卡上的部分,月均工资 +19.4%
|
||||
- 但其实加上各类奖金补贴等综合来看,+8.6%
|
||||
|
||||
以综合后的总收入为基准,计算时薪。
|
||||
工作时长 +4.76%
|
||||
工作时薪 +3.67%
|
||||
|
||||
虽然账面上说涨工资了,但是隐形的加班也变多了,总体感觉更累了。如果继续这个趋势下去,工资越来越高,但是却越来越累,这不是一个好的结果。
|
||||
|
||||
## Part 3. 2025 plan
|
||||
|
||||
### 一些想法
|
||||
|
||||
#### better me 专项基金计划
|
||||
|
||||
以前学生时代没有收入总是习惯性的避免开销,现在工作了这个惯性还是很大。很多事物是值得去花小钱去投资或者体验的,比如今年去找了几个乐器和绘画的体验课,以及尝试了涂色书、涂装等,感觉很不错,投入其实也很低。一方面从每天重复的工作领域抽离开来,有很多新鲜感。另外这些艺术类活动,有创作的成分在里面,「我」和这个世界的事物产生交互,融入了「我」的劳动和表达,诞生出了这个世界上独一无二的事物,这件事情本身就是令人欣喜的。
|
||||
|
||||
2025 年,我期望通过一些指定领域的专项基金,定额投入,尽量全部消费完,来「强迫」自己,去做出一些新的尝试。比如这些方向
|
||||
|
||||
- **户外基金**:多运动,避免久坐。可能我会去买个自行车,日常溜达溜达;买个穿越机,周末多去外面转转拍拍
|
||||
- **AI 探索基金**:一方面探索当下最流行的 AI 应用,以及探索 AI 应用的可能。现在 LLM 的 API 已经非常便宜了,之前一直碍于价格没有用起来,如果价格不再是瓶颈,我能用 AI 做出什么,这个是一个很值得探索的问题。预计 25 年我会投入不少于 1k 专门来做这个
|
||||
- 小确幸基金:提升日常幸福感,比如买些鲜花、装饰画、香氛等
|
||||
- **投资能力成长基金**:尝试各类投资类型,如股票,债权,贵金属,加密货币等等
|
||||
|
||||
#### AI Agent & 人类 Manager
|
||||
|
||||
AI agent 一定是未来一个非常有潜力的领域,AI 能不能给人类社会带来进步,给普通大众带来幸福暂且不谈。「超级个体」+ 超级 AI agent 一定是有很大的发展空间的。
|
||||
但是从我目前的一些经验来看,虽然当前 AI 的能力有限,先达到了瓶颈,但是按照这个发展速度,用不了几年,主导 AI agent 的人一定是先达到瓶颈的那个。那么这里 个体的组织能力,管理能力,以及部分领域的专业高度就显得非常重要了。
|
||||
|
||||
目前来看,项目组织和管理能力一定是值得去花时间精力去投资的,未来一堆 agent 就相当于一堆打工人,能创造什么价值很大程度上取决于主导的那个人类个体。
|
||||
|
||||
### 2025 小目标
|
||||
|
||||
- 更多的收入来源,薪资外收入占比超过 5%
|
||||
- 在至少两个领域,分别至少有一个阶段性的代表作
|
||||
|
||||
### 2025 时空信件
|
||||
|
||||
一年后的自己,有没有找到一件不后悔青春的事?
|
||||
|
||||
---
|
||||
|
||||
## Part 4. 年度流水账环节
|
||||
|
||||
- 年前幻兽帕鲁爆火,狂肝帕鲁,久违地又能拉一群朋友打同一款游戏
|
||||
- 元旦到春节的间隔格外的长,格外不适应,之前都是过完元旦差不多就快回家过年了的,今年还要上很久的班
|
||||
- 年会运气爆棚,抽中了年会现场的门票,还是第一排!晚会嘉宾还是周深,感受到什么是行走的 CD
|
||||
- 城里过春节,相较而言可以说是非常单调了,没有那么多亲戚朋友和邻里的来来往往,虽说时间更自由了,却突然有点不太适应
|
||||
- 春节一个星期主要都在狂肝老头环,很上头
|
||||
- 攒了个纯固态 NAS 方案,算是很好地满足了我的需求,安静,低功耗
|
||||
- 元宵跟朋友去香港澳门转了一圈,特种兵行程一天一城,超级充实。要说印象最深刻的场面的话,香港的海水很漂亮,澳门的赌场第一次去很震撼,富丽堂皇而且很有格调
|
||||
- 不知道是澳门赌场的香氛里面有令人上头的东西,还是单纯是玩的很嗨突然第二天要去上班,节后回来那几天像是有戒断反应一样,上班上的很痛苦
|
||||
- 突然上头开始玩 stable diffusion,不得不说 AI 进化的速度真的很恐怖,去年那会儿用 disco diffusion 画个风景画勉勉强强,画个蛋糕都能画崩。今年上手玩了下,社区已经发展的很成熟了,出来的效果也挺惊艳,在舒适区内,合适的调教下可以秒杀大部分人类画师了,更别说这逆天的效率
|
||||
- 养的多肉里面有一株突然开花了,第一次知道多肉还能这样开花,淡黄色的小花娇弱,很漂亮
|
||||
- 尝试用 AI 生图做了个短片,学习了不少 AI 绘图流程的东西,风格、景别等等。发现到最后成片的瓶颈其实还是人类作者的编剧和分镜质量
|
||||
- 清明休了个小长假去四川和重庆玩了一圈,老友相聚很欢乐。不知道是因为出来玩心境不一样,还是单纯是不同城市的气质不一样,成都这边明显更有活力,即便是工作日地铁上都更热闹些
|
||||
- 翻出吃灰的电饭锅开始尝试做酸奶,成色还不错挺有成就感的,不过发现真的酸,外面卖的酸奶原来加了那么多糖。另外还物理意义上感知到了好牛奶和差牛奶的差距,生鲜牛乳做出来的酸奶真不错
|
||||
- 爆肝塞尔达,太上头了
|
||||
- 五一终于把之前一直想做的 RSS 处理中间件做出来的,起名叫 FeedCraft,反响还不错
|
||||
- 第一次出国去泰国玩了一周,体验了骑大象、真枪射击、看线下拳击表演、各种东南亚的菜系。泰国的文化和娱乐产业原来这么丰富,感觉很多地方做的比国内一线城市还要好不少,不知道是国内监管太严格了还是我们近代的文化发展落后太多
|
||||
- 搬家,没想到能找到个很实惠的房子,相较于之前的加量不加价,大 house 幸福感拉满
|
||||
- 趁活动入了个扫地机器人,每天到点自动扫地拖地自动洗拖布,每天回家都是干干净净的,幸福感++
|
||||
- 带刚毕业的发小逛香港和澳门,给他一点小小的赌场震撼
|
||||
- 抢到票了,去看了 tia 的演唱会,舞美和演唱等各个方面真的很用心,期待 tia 后面继续做出更好的作品
|
||||
- 又有同学离开北京过来深圳发展了,小聚了下。还去蹭了场 livehouse
|
||||
- 团建去惠州漂流,刺激是真刺激,不过后知后觉感觉也挺危险的。还是要趁年轻去体验这些刺激的项目啊
|
||||
- 从 homepod mini 升级到了大的 homepod,低音部分非常不错,贝斯、鼓声、低音提琴这些头一次听得这么清晰,睡前放几首,感觉低频的振动就是在给心灵按摩,年度最佳电子产品
|
||||
- 入坑涂色书,上色的过程很放松,能够放空自己安静地享受上色,年度最具性价比投入
|
||||
- 入坑巨人系列,从第一季一口气追到完结,不得不说还是很震撼的
|
||||
- 国庆带北京来的同学玩了一周,逛漫展、华强北、广州塔、长隆野生动物园、高达基地等等,野生动物园真是一分钱一分货,跟之前逛的那些动物园完全不是一个维度的。漫展上看到巨人粉的 coser 激动不已,切身感受到了什么叫打破了次元壁
|
||||
- 某团上经常有各种免费体验课,心血来潮找了几个去试着玩了下,找了一个周末试了水彩画和乐器课,体验很新鲜,也很有成就感。而且每一项其实时间也才不超过两个小时,看来还是要更多去探索些新鲜事物啊,重复的事物里面很难找到激情和活力
|
||||
- 突然想起自己还有个吃灰的 3D 打印机,之前房子太小施展不开一直闲置,翻出来重新发光发热,每天走之前把他开起来,下班之后回来直接就打好了,有种收菜的快感
|
||||
- 3D 打印了一堆玩具之后开始尝试模型涂装,努力实现手办自由,没想到很上头,一开始用丙烯画笔简单粗暴效果好,后来部分颜色不太够,又开始自己调色,自由度更高。出来的效果也很不错,涂装过程也很治愈
|
||||
- 抢到了 Jessie J 的演唱会门票,结石姐的 vocal 功力真的强的可怕
|
||||
- 开始每周上课学习和练习架子鼓,也算是圆了一直以来内心隐蔽角落的一个心愿
|
||||
- 整了个带实体后环绕和低音炮的回音壁,结合投影仪超大荧幕,观影体验拉满!原来整套方案其实不贵也不麻烦
|
||||
- 2024 the end
|
||||
|
||||
@@ -4,15 +4,13 @@ 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
|
||||
@@ -84,7 +82,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
|
||||
@@ -92,7 +90,7 @@ V2.3 @2019.3.15 修补声卡
|
||||
暂告一段落
|
||||
-----
|
||||
|
||||
黑苹果的显示 + 声音 + 网络等基本问题已经解决,虽然还 不是很完美,但是用 Logic 和 Xcode 已经没问题了 ,后续有时间 有需要 再继续折腾。
|
||||
黑苹果的显示 + 声音 + 网络等基本问题已经解决,虽然还 不是很完美,但是用 Logic 和 Xcode 已经没问题了,后续有时间 有需要 再继续折腾。
|
||||
|
||||
Logic Pro X +USB 连接 iPad 上 Logic Remote 爽到飞起!看来不需要买 MIDI 键盘了,准备把资金换个大点的、更快的固态,把黑苹果装上去~
|
||||
|
||||
|
||||
10
content/services.md
Normal file
10
content/services.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: 公开服务
|
||||
date: 2022-06-16
|
||||
|
||||
---
|
||||
|
||||
这里是一些开放的服务以及一些个人作品
|
||||
|
||||
|
||||
{{< service_list name="aaa" url="http://sg.colinx.one:10055/items/OpenServices" >}}
|
||||
30
content/subscribe.md
Normal file
30
content/subscribe.md
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
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 实现
|
||||
|
||||
|
||||
暂未开放,有足够多的需求时再考虑开放
|
||||
|
||||
282
layouts/404.html
Normal file
282
layouts/404.html
Normal file
@@ -0,0 +1,282 @@
|
||||
<!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: #9dd5c0;
|
||||
/* background-color: #04cba0; */
|
||||
border: #9dd5c0;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
transition: all 0.15s ease-in-out
|
||||
/* transition: all 1s ease; */
|
||||
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
color: white;
|
||||
background-color: #9dd5c0;
|
||||
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: #9dd5c0;
|
||||
}
|
||||
|
||||
/* custom ::selection */
|
||||
::selection {
|
||||
background: #9dd5c0;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
background: #9dd5c0;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
::-webkit-selection {
|
||||
background: #9dd5c0;
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
52
layouts/partials/comments.html
Normal file
52
layouts/partials/comments.html
Normal file
@@ -0,0 +1,52 @@
|
||||
<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://s4.zstatic.net/ajax/libs/tocbot/4.9.1/tocbot.min.js','tocbot_init')"
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js"></script>
|
||||
<link rel="stylesheet"
|
||||
onerror="fallbackCSSloader('https://s4.zstatic.net/ajax/libs/tocbot/4.9.1/tocbot.css')"
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.css">
|
||||
<script defer onload="init_gitalk()"
|
||||
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/gitalk/1.7.2/gitalk.min.js','init_gitalk')"
|
||||
src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
|
||||
<link rel="stylesheet"
|
||||
onerror="fallbackCSSloader('https://s4.zstatic.net/ajax/libs/gitalk/1.7.2/gitalk.css')"
|
||||
href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.css">
|
||||
<!-- no min css version fallback for gitalk css -->
|
||||
27
layouts/partials/extended_footer.html
Normal file
27
layouts/partials/extended_footer.html
Normal file
@@ -0,0 +1,27 @@
|
||||
<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://s4.zstatic.net/ajax/libs/pangu/4.0.7/pangu.min.js','panguSpaing')"
|
||||
src="https://cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
|
||||
<script async onload="initQuickLink()"
|
||||
onerror="fallbackJSloader('https://s4.zstatic.net/ajax/libs/quicklink/2.3.0/quicklink.umd.js','initQuickLink')"
|
||||
src="https://cdn.jsdelivr.net/npm/quicklink@2/dist/quicklink.umd.js"></script>
|
||||
@@ -1,7 +1,49 @@
|
||||
<!--
|
||||
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>
|
||||
<link rel="icon" href="/favicon.png">
|
||||
<link rel="apple-touch-icon" href="/favicon.png">
|
||||
|
||||
<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);
|
||||
|
||||
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>
|
||||
|
||||
@@ -18,11 +18,4 @@
|
||||
</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" . }}
|
||||
38
layouts/partials/head.html
Normal file
38
layouts/partials/head.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<!-- 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" . }}
|
||||
78
layouts/shortcodes/service_list.html
Normal file
78
layouts/shortcodes/service_list.html
Normal file
@@ -0,0 +1,78 @@
|
||||
<!--
|
||||
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 := . }}
|
||||
<div class="card">
|
||||
<h3 id="{{$item.name}}">{{$item.name}} <span class="badge">{{$item.type}}</span></h3>
|
||||
<p>{{$item.subtitle}}</p>
|
||||
<p><strong>地址:</strong>
|
||||
{{ $link := urls.Parse $item.link }}
|
||||
{{ if (gt (len $link.Host) 1) }}
|
||||
<a href="{{$item.link}}">{{$link.Host}}</a>
|
||||
{{ else }}
|
||||
{{$item.link}}
|
||||
{{ end }}
|
||||
</p>
|
||||
<p><strong>上线时间:</strong>
|
||||
{{ if (gt (len $item.StartServingAt) 1) }}
|
||||
{{$item.StartServingAt}}
|
||||
{{ else }}
|
||||
无
|
||||
{{ end }}
|
||||
</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<style>
|
||||
:root {
|
||||
--card-border: #cccccc51;
|
||||
--badge-background: #9dd5c0;
|
||||
--badge-color: white;
|
||||
}
|
||||
|
||||
[data-theme='dark'] {
|
||||
--card-border: #44444451;
|
||||
--badge-background: #9dd5c0;
|
||||
--badge-color: white;
|
||||
}
|
||||
.card {
|
||||
border: 1px solid var(--card-border);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
margin: 1rem;
|
||||
padding: 2rem;
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
.card:hover {
|
||||
transform: scale(1.02);
|
||||
}
|
||||
.card h3 {
|
||||
margin: 0;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
.card p {
|
||||
margin: 5px 0;
|
||||
}
|
||||
.card a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.badge {
|
||||
background-color: #9dd5c0;
|
||||
color: white;
|
||||
border-radius: 12px;
|
||||
padding: 4px 8px;
|
||||
font-size: 0.6em;
|
||||
margin-left: 8px;
|
||||
}
|
||||
</style>
|
||||
{{ end }}
|
||||
@@ -3,7 +3,7 @@ publish = "public"
|
||||
command = "hugo --gc --minify"
|
||||
|
||||
[context.production.environment]
|
||||
HUGO_VERSION = "0.69.2"
|
||||
HUGO_VERSION = "0.91.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.69.2"
|
||||
HUGO_VERSION = "0.91.2"
|
||||
HUGO_ENV = "production"
|
||||
|
||||
[context.deploy-preview]
|
||||
command = "hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL"
|
||||
|
||||
[context.deploy-preview.environment]
|
||||
HUGO_VERSION = "0.69.2"
|
||||
HUGO_VERSION = "0.91.2"
|
||||
|
||||
[context.branch-deploy]
|
||||
command = "hugo --gc --minify -b $DEPLOY_PRIME_URL"
|
||||
|
||||
[context.branch-deploy.environment]
|
||||
HUGO_VERSION = "0.69.2"
|
||||
HUGO_VERSION = "0.91.2"
|
||||
|
||||
[context.next.environment]
|
||||
HUGO_ENABLEGITINFO = "true"
|
||||
|
||||
49
static/admin/config.yml
Normal file
49
static/admin/config.yml
Normal file
@@ -0,0 +1,49 @@
|
||||
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" }
|
||||
17
static/admin/index.html
Normal file
17
static/admin/index.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!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>
|
||||
1
static/connect-test.svg
Normal file
1
static/connect-test.svg
Normal file
@@ -0,0 +1 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 636 B |
BIN
static/favicon.png
Normal file
BIN
static/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
150
static/style.css
Normal file
150
static/style.css
Normal file
@@ -0,0 +1,150 @@
|
||||
/* 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: #9dd5c0 !important;
|
||||
}
|
||||
|
||||
.logo__cursor {
|
||||
background: #9dd5c0;
|
||||
}
|
||||
|
||||
/* 超链接样式 */
|
||||
|
||||
.post-tags a,
|
||||
.post-content a,
|
||||
.index-content a {
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dashed #9dd5c0;
|
||||
-webkit-transition: all 0.2s;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.post-tags a:hover,
|
||||
.post-content a:hover,
|
||||
.index-content a:hover,
|
||||
nav a:hover {
|
||||
text-decoration: none;
|
||||
border-bottom: 2px solid #9dd5c0;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
transition: all 0.1s ease;
|
||||
}
|
||||
|
||||
/* custom ::selection */
|
||||
::selection {
|
||||
background: #9dd5c0;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
background: #9dd5c0;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
::-webkit-selection {
|
||||
background: #9dd5c0;
|
||||
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%;
|
||||
} */
|
||||
|
||||
.logo__cursor {
|
||||
background-color: #9dd5c0 !important;
|
||||
}
|
||||
|
||||
.on-list .post-title:hover {
|
||||
transform: translateY(-0.1rem);
|
||||
-webkit-transition: all 0.1s ease-in-out;
|
||||
transition: all 0.1s ease-in-out;
|
||||
}
|
||||
|
||||
.read-more:hover {
|
||||
transform: translateX(0.1rem);
|
||||
-webkit-transition: all 0.1s ease-in-out;
|
||||
transition: all 0.1s ease-in-out;
|
||||
}
|
||||
|
||||
span.button.next:hover {
|
||||
display: block;
|
||||
transform: translateX(0.2rem);
|
||||
-webkit-transition: all 0.1s ease-in-out;
|
||||
transition: all 0.21s ease-in-out;
|
||||
}
|
||||
|
||||
span.button.previous:hover {
|
||||
display: block;
|
||||
transform: translateX(-0.2rem);
|
||||
-webkit-transition: all 0.1s ease-in-out;
|
||||
transition: all 0.1s ease-in-out;
|
||||
}
|
||||
11
staticwebapp.config.json
Normal file
11
staticwebapp.config.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"responseOverrides": {
|
||||
"400": {
|
||||
"statusCode": 301,
|
||||
"redirect": "/404"
|
||||
},
|
||||
"404": {
|
||||
"rewrite": "/404"
|
||||
}
|
||||
}
|
||||
}
|
||||
Submodule themes/hello-friend updated: cf5e597491...3ffa8121a0
Reference in New Issue
Block a user