From 04adec4ff885301eae4dd0e632b86db806e510a1 Mon Sep 17 00:00:00 2001 From: Deven Liu Date: Sat, 22 Jul 2023 15:07:47 +0800 Subject: [PATCH] update --- .github/workflows/pages.yml | 34 - .gitignore | 2 - {packages => apps}/blog/.gitignore | 0 {packages => apps}/blog/.npmrc | 0 {packages => apps}/blog/.vscode/launch.json | 0 {packages => apps}/blog/_config.next.yml | 0 {packages => apps}/blog/_config.yml | 7 +- {packages => apps}/blog/package-lock.json | 0 {packages => apps}/blog/package.json | 0 {packages => apps}/blog/scaffolds/draft.md | 0 {packages => apps}/blog/scaffolds/page.md | 0 {packages => apps}/blog/scaffolds/post.md | 0 {packages => apps}/blog/source/404/index.md | 0 {packages => apps}/blog/source/_data/head.njk | 0 .../blog/source/_data/languages.yml | 0 .../blog/source/_data/sidebar.njk | 0 .../blog/source/_data/styles.styl | 0 .../blog/source/_data/variables.styl | 0 .../dotNET-Interview-Questions-and-Answers.md | 0 .../blog/source/_posts/zh-CN/welcome.md | 0 {packages => apps}/blog/source/about/index.md | 0 .../blog/source/categories/index.md | 0 .../blog/source/images/avatar.jpg | Bin {packages => apps}/blog/source/tags/index.md | 0 {packages => apps}/blog/themes/.gitkeep | 0 {packages => apps}/lover/LICENSE | 0 {packages => apps}/lover/README.md | 0 {packages => apps}/lover/dist/favicon.ico | Bin .../lover/dist/fonts/digital-7_mono.ttf | Bin {packages => apps}/lover/dist/index.html | 0 .../lover/dist/medias/_Liekkas.mp3 | Bin .../lover/dist/scripts/functions.js | 0 .../lover/dist/scripts/functions.min.js | 0 .../lover/dist/scripts/garden.js | 0 .../lover/dist/scripts/garden.min.js | 0 .../lover/dist/scripts/jquery.min.js | 0 .../lover/dist/styles/default.css | 0 .../lover/dist/styles/default.min.css | 0 {packages => apps}/lover/package.json | 0 {packages => apps}/lover/src/favicon.ico | Bin .../lover/src/fonts/digital-7_mono.ttf | Bin {packages => apps}/lover/src/index.html | 0 .../lover/src/medias/_Liekkas.mp3 | Bin .../lover/src/scripts/functions.js | 0 .../lover/src/scripts/functions.min.js | 0 .../lover/src/scripts/garden.js | 0 .../lover/src/scripts/garden.min.js | 0 .../lover/src/scripts/jquery.min.js | 0 .../lover/src/styles/default.css | 0 .../lover/src/styles/default.min.css | 0 docs/blog/2022/05/01/zh-CN/welcome/index.html | 407 +++ .../index.html | 680 ++++ docs/blog/404/index.html | 315 ++ docs/blog/about/index.html | 316 ++ docs/blog/archives/2022/05/index.html | 324 ++ docs/blog/archives/2022/06/index.html | 324 ++ docs/blog/archives/2022/index.html | 344 ++ docs/blog/archives/index.html | 344 ++ docs/blog/categories/NET/index.html | 325 ++ docs/blog/categories/index.html | 320 ++ docs/blog/css/main.css | 2947 +++++++++++++++++ docs/blog/css/noscript.css | 48 + docs/blog/images/apple-touch-icon-next.png | Bin 0 -> 1544 bytes docs/blog/images/avatar.gif | Bin 0 -> 1785 bytes docs/blog/images/avatar.jpg | Bin 0 -> 43313 bytes docs/blog/images/favicon-16x16-next.png | Bin 0 -> 435 bytes docs/blog/images/favicon-32x32-next.png | Bin 0 -> 640 bytes docs/blog/images/logo.svg | 1 + docs/blog/index.html | 504 +++ docs/blog/js/bookmark.js | 56 + docs/blog/js/comments.js | 21 + docs/blog/js/config.js | 66 + docs/blog/js/motion.js | 140 + docs/blog/js/next-boot.js | 75 + docs/blog/js/pjax.js | 50 + docs/blog/js/third-party/addtoany.js | 8 + .../third-party/analytics/baidu-analytics.js | 7 + docs/blog/js/third-party/analytics/matomo.js | 19 + docs/blog/js/third-party/comments/disqus.js | 41 + docs/blog/js/third-party/fancybox.js | 38 + docs/blog/js/third-party/pace.js | 7 + docs/blog/js/third-party/quicklink.js | 37 + .../js/third-party/search/local-search.js | 99 + docs/blog/js/third-party/tags/mermaid.js | 32 + docs/blog/js/third-party/tags/pdf.js | 23 + docs/blog/js/utils.js | 452 +++ docs/blog/search.xml | 261 ++ docs/blog/sitemap.txt | 11 + docs/blog/sitemap.xml | 97 + docs/blog/tags/ASP-NET/index.html | 325 ++ docs/blog/tags/C/index.html | 325 ++ docs/blog/tags/NET/index.html | 325 ++ docs/blog/tags/index.html | 320 ++ package.json | 8 - pnpm-lock.yaml | 5 - 95 files changed, 10038 insertions(+), 52 deletions(-) delete mode 100644 .github/workflows/pages.yml delete mode 100644 .gitignore rename {packages => apps}/blog/.gitignore (100%) rename {packages => apps}/blog/.npmrc (100%) rename {packages => apps}/blog/.vscode/launch.json (100%) rename {packages => apps}/blog/_config.next.yml (100%) rename {packages => apps}/blog/_config.yml (96%) rename {packages => apps}/blog/package-lock.json (100%) rename {packages => apps}/blog/package.json (100%) rename {packages => apps}/blog/scaffolds/draft.md (100%) rename {packages => apps}/blog/scaffolds/page.md (100%) rename {packages => apps}/blog/scaffolds/post.md (100%) rename {packages => apps}/blog/source/404/index.md (100%) rename {packages => apps}/blog/source/_data/head.njk (100%) rename {packages => apps}/blog/source/_data/languages.yml (100%) rename {packages => apps}/blog/source/_data/sidebar.njk (100%) rename {packages => apps}/blog/source/_data/styles.styl (100%) rename {packages => apps}/blog/source/_data/variables.styl (100%) rename {packages => apps}/blog/source/_posts/zh-CN/dotNET-Interview-Questions-and-Answers.md (100%) rename {packages => apps}/blog/source/_posts/zh-CN/welcome.md (100%) rename {packages => apps}/blog/source/about/index.md (100%) rename {packages => apps}/blog/source/categories/index.md (100%) rename {packages => apps}/blog/source/images/avatar.jpg (100%) rename {packages => apps}/blog/source/tags/index.md (100%) rename {packages => apps}/blog/themes/.gitkeep (100%) rename {packages => apps}/lover/LICENSE (100%) rename {packages => apps}/lover/README.md (100%) rename {packages => apps}/lover/dist/favicon.ico (100%) rename {packages => apps}/lover/dist/fonts/digital-7_mono.ttf (100%) rename {packages => apps}/lover/dist/index.html (100%) rename {packages => apps}/lover/dist/medias/_Liekkas.mp3 (100%) rename {packages => apps}/lover/dist/scripts/functions.js (100%) rename {packages => apps}/lover/dist/scripts/functions.min.js (100%) rename {packages => apps}/lover/dist/scripts/garden.js (100%) rename {packages => apps}/lover/dist/scripts/garden.min.js (100%) rename {packages => apps}/lover/dist/scripts/jquery.min.js (100%) rename {packages => apps}/lover/dist/styles/default.css (100%) rename {packages => apps}/lover/dist/styles/default.min.css (100%) rename {packages => apps}/lover/package.json (100%) rename {packages => apps}/lover/src/favicon.ico (100%) rename {packages => apps}/lover/src/fonts/digital-7_mono.ttf (100%) rename {packages => apps}/lover/src/index.html (100%) rename {packages => apps}/lover/src/medias/_Liekkas.mp3 (100%) rename {packages => apps}/lover/src/scripts/functions.js (100%) rename {packages => apps}/lover/src/scripts/functions.min.js (100%) rename {packages => apps}/lover/src/scripts/garden.js (100%) rename {packages => apps}/lover/src/scripts/garden.min.js (100%) rename {packages => apps}/lover/src/scripts/jquery.min.js (100%) rename {packages => apps}/lover/src/styles/default.css (100%) rename {packages => apps}/lover/src/styles/default.min.css (100%) create mode 100644 docs/blog/2022/05/01/zh-CN/welcome/index.html create mode 100644 docs/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/index.html create mode 100644 docs/blog/404/index.html create mode 100644 docs/blog/about/index.html create mode 100644 docs/blog/archives/2022/05/index.html create mode 100644 docs/blog/archives/2022/06/index.html create mode 100644 docs/blog/archives/2022/index.html create mode 100644 docs/blog/archives/index.html create mode 100644 docs/blog/categories/NET/index.html create mode 100644 docs/blog/categories/index.html create mode 100644 docs/blog/css/main.css create mode 100644 docs/blog/css/noscript.css create mode 100644 docs/blog/images/apple-touch-icon-next.png create mode 100644 docs/blog/images/avatar.gif create mode 100644 docs/blog/images/avatar.jpg create mode 100644 docs/blog/images/favicon-16x16-next.png create mode 100644 docs/blog/images/favicon-32x32-next.png create mode 100644 docs/blog/images/logo.svg create mode 100644 docs/blog/index.html create mode 100644 docs/blog/js/bookmark.js create mode 100644 docs/blog/js/comments.js create mode 100644 docs/blog/js/config.js create mode 100644 docs/blog/js/motion.js create mode 100644 docs/blog/js/next-boot.js create mode 100644 docs/blog/js/pjax.js create mode 100644 docs/blog/js/third-party/addtoany.js create mode 100644 docs/blog/js/third-party/analytics/baidu-analytics.js create mode 100644 docs/blog/js/third-party/analytics/matomo.js create mode 100644 docs/blog/js/third-party/comments/disqus.js create mode 100644 docs/blog/js/third-party/fancybox.js create mode 100644 docs/blog/js/third-party/pace.js create mode 100644 docs/blog/js/third-party/quicklink.js create mode 100644 docs/blog/js/third-party/search/local-search.js create mode 100644 docs/blog/js/third-party/tags/mermaid.js create mode 100644 docs/blog/js/third-party/tags/pdf.js create mode 100644 docs/blog/js/utils.js create mode 100644 docs/blog/search.xml create mode 100644 docs/blog/sitemap.txt create mode 100644 docs/blog/sitemap.xml create mode 100644 docs/blog/tags/ASP-NET/index.html create mode 100644 docs/blog/tags/C/index.html create mode 100644 docs/blog/tags/NET/index.html create mode 100644 docs/blog/tags/index.html delete mode 100644 package.json delete mode 100644 pnpm-lock.yaml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml deleted file mode 100644 index da3a59d..0000000 --- a/.github/workflows/pages.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Pages - -on: - push: - branches: - - main - -jobs: - pages: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v2 - - name: Use Node.js 16.x - uses: actions/setup-node@v2 - with: - node-version: "16" - - name: Cache NPM dependencies - uses: actions/cache@v2 - with: - path: node_modules - key: ${{ runner.OS }}-npm-cache - restore-keys: | - ${{ runner.OS }}-npm-cache - - name: Install Dependencies - run: npm install - - name: Build - run: npm run build - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 76438e0..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.log -node_modules/ \ No newline at end of file diff --git a/packages/blog/.gitignore b/apps/blog/.gitignore similarity index 100% rename from packages/blog/.gitignore rename to apps/blog/.gitignore diff --git a/packages/blog/.npmrc b/apps/blog/.npmrc similarity index 100% rename from packages/blog/.npmrc rename to apps/blog/.npmrc diff --git a/packages/blog/.vscode/launch.json b/apps/blog/.vscode/launch.json similarity index 100% rename from packages/blog/.vscode/launch.json rename to apps/blog/.vscode/launch.json diff --git a/packages/blog/_config.next.yml b/apps/blog/_config.next.yml similarity index 100% rename from packages/blog/_config.next.yml rename to apps/blog/_config.next.yml diff --git a/packages/blog/_config.yml b/apps/blog/_config.yml similarity index 96% rename from packages/blog/_config.yml rename to apps/blog/_config.yml index 223558c..1789429 100644 --- a/packages/blog/_config.yml +++ b/apps/blog/_config.yml @@ -133,6 +133,7 @@ theme: next # Deployment ## Docs: https://hexo.io/docs/one-command-deployment deploy: - type: git - repo: https://github.com/devenliu/devenliu.github.io - branch: gh-pages \ No newline at end of file + type: '' + # type: git + # repo: https://github.com/devenliu/devenliu.github.io + # branch: gh-pages \ No newline at end of file diff --git a/packages/blog/package-lock.json b/apps/blog/package-lock.json similarity index 100% rename from packages/blog/package-lock.json rename to apps/blog/package-lock.json diff --git a/packages/blog/package.json b/apps/blog/package.json similarity index 100% rename from packages/blog/package.json rename to apps/blog/package.json diff --git a/packages/blog/scaffolds/draft.md b/apps/blog/scaffolds/draft.md similarity index 100% rename from packages/blog/scaffolds/draft.md rename to apps/blog/scaffolds/draft.md diff --git a/packages/blog/scaffolds/page.md b/apps/blog/scaffolds/page.md similarity index 100% rename from packages/blog/scaffolds/page.md rename to apps/blog/scaffolds/page.md diff --git a/packages/blog/scaffolds/post.md b/apps/blog/scaffolds/post.md similarity index 100% rename from packages/blog/scaffolds/post.md rename to apps/blog/scaffolds/post.md diff --git a/packages/blog/source/404/index.md b/apps/blog/source/404/index.md similarity index 100% rename from packages/blog/source/404/index.md rename to apps/blog/source/404/index.md diff --git a/packages/blog/source/_data/head.njk b/apps/blog/source/_data/head.njk similarity index 100% rename from packages/blog/source/_data/head.njk rename to apps/blog/source/_data/head.njk diff --git a/packages/blog/source/_data/languages.yml b/apps/blog/source/_data/languages.yml similarity index 100% rename from packages/blog/source/_data/languages.yml rename to apps/blog/source/_data/languages.yml diff --git a/packages/blog/source/_data/sidebar.njk b/apps/blog/source/_data/sidebar.njk similarity index 100% rename from packages/blog/source/_data/sidebar.njk rename to apps/blog/source/_data/sidebar.njk diff --git a/packages/blog/source/_data/styles.styl b/apps/blog/source/_data/styles.styl similarity index 100% rename from packages/blog/source/_data/styles.styl rename to apps/blog/source/_data/styles.styl diff --git a/packages/blog/source/_data/variables.styl b/apps/blog/source/_data/variables.styl similarity index 100% rename from packages/blog/source/_data/variables.styl rename to apps/blog/source/_data/variables.styl diff --git a/packages/blog/source/_posts/zh-CN/dotNET-Interview-Questions-and-Answers.md b/apps/blog/source/_posts/zh-CN/dotNET-Interview-Questions-and-Answers.md similarity index 100% rename from packages/blog/source/_posts/zh-CN/dotNET-Interview-Questions-and-Answers.md rename to apps/blog/source/_posts/zh-CN/dotNET-Interview-Questions-and-Answers.md diff --git a/packages/blog/source/_posts/zh-CN/welcome.md b/apps/blog/source/_posts/zh-CN/welcome.md similarity index 100% rename from packages/blog/source/_posts/zh-CN/welcome.md rename to apps/blog/source/_posts/zh-CN/welcome.md diff --git a/packages/blog/source/about/index.md b/apps/blog/source/about/index.md similarity index 100% rename from packages/blog/source/about/index.md rename to apps/blog/source/about/index.md diff --git a/packages/blog/source/categories/index.md b/apps/blog/source/categories/index.md similarity index 100% rename from packages/blog/source/categories/index.md rename to apps/blog/source/categories/index.md diff --git a/packages/blog/source/images/avatar.jpg b/apps/blog/source/images/avatar.jpg similarity index 100% rename from packages/blog/source/images/avatar.jpg rename to apps/blog/source/images/avatar.jpg diff --git a/packages/blog/source/tags/index.md b/apps/blog/source/tags/index.md similarity index 100% rename from packages/blog/source/tags/index.md rename to apps/blog/source/tags/index.md diff --git a/packages/blog/themes/.gitkeep b/apps/blog/themes/.gitkeep similarity index 100% rename from packages/blog/themes/.gitkeep rename to apps/blog/themes/.gitkeep diff --git a/packages/lover/LICENSE b/apps/lover/LICENSE similarity index 100% rename from packages/lover/LICENSE rename to apps/lover/LICENSE diff --git a/packages/lover/README.md b/apps/lover/README.md similarity index 100% rename from packages/lover/README.md rename to apps/lover/README.md diff --git a/packages/lover/dist/favicon.ico b/apps/lover/dist/favicon.ico similarity index 100% rename from packages/lover/dist/favicon.ico rename to apps/lover/dist/favicon.ico diff --git a/packages/lover/dist/fonts/digital-7_mono.ttf b/apps/lover/dist/fonts/digital-7_mono.ttf similarity index 100% rename from packages/lover/dist/fonts/digital-7_mono.ttf rename to apps/lover/dist/fonts/digital-7_mono.ttf diff --git a/packages/lover/dist/index.html b/apps/lover/dist/index.html similarity index 100% rename from packages/lover/dist/index.html rename to apps/lover/dist/index.html diff --git a/packages/lover/dist/medias/_Liekkas.mp3 b/apps/lover/dist/medias/_Liekkas.mp3 similarity index 100% rename from packages/lover/dist/medias/_Liekkas.mp3 rename to apps/lover/dist/medias/_Liekkas.mp3 diff --git a/packages/lover/dist/scripts/functions.js b/apps/lover/dist/scripts/functions.js similarity index 100% rename from packages/lover/dist/scripts/functions.js rename to apps/lover/dist/scripts/functions.js diff --git a/packages/lover/dist/scripts/functions.min.js b/apps/lover/dist/scripts/functions.min.js similarity index 100% rename from packages/lover/dist/scripts/functions.min.js rename to apps/lover/dist/scripts/functions.min.js diff --git a/packages/lover/dist/scripts/garden.js b/apps/lover/dist/scripts/garden.js similarity index 100% rename from packages/lover/dist/scripts/garden.js rename to apps/lover/dist/scripts/garden.js diff --git a/packages/lover/dist/scripts/garden.min.js b/apps/lover/dist/scripts/garden.min.js similarity index 100% rename from packages/lover/dist/scripts/garden.min.js rename to apps/lover/dist/scripts/garden.min.js diff --git a/packages/lover/dist/scripts/jquery.min.js b/apps/lover/dist/scripts/jquery.min.js similarity index 100% rename from packages/lover/dist/scripts/jquery.min.js rename to apps/lover/dist/scripts/jquery.min.js diff --git a/packages/lover/dist/styles/default.css b/apps/lover/dist/styles/default.css similarity index 100% rename from packages/lover/dist/styles/default.css rename to apps/lover/dist/styles/default.css diff --git a/packages/lover/dist/styles/default.min.css b/apps/lover/dist/styles/default.min.css similarity index 100% rename from packages/lover/dist/styles/default.min.css rename to apps/lover/dist/styles/default.min.css diff --git a/packages/lover/package.json b/apps/lover/package.json similarity index 100% rename from packages/lover/package.json rename to apps/lover/package.json diff --git a/packages/lover/src/favicon.ico b/apps/lover/src/favicon.ico similarity index 100% rename from packages/lover/src/favicon.ico rename to apps/lover/src/favicon.ico diff --git a/packages/lover/src/fonts/digital-7_mono.ttf b/apps/lover/src/fonts/digital-7_mono.ttf similarity index 100% rename from packages/lover/src/fonts/digital-7_mono.ttf rename to apps/lover/src/fonts/digital-7_mono.ttf diff --git a/packages/lover/src/index.html b/apps/lover/src/index.html similarity index 100% rename from packages/lover/src/index.html rename to apps/lover/src/index.html diff --git a/packages/lover/src/medias/_Liekkas.mp3 b/apps/lover/src/medias/_Liekkas.mp3 similarity index 100% rename from packages/lover/src/medias/_Liekkas.mp3 rename to apps/lover/src/medias/_Liekkas.mp3 diff --git a/packages/lover/src/scripts/functions.js b/apps/lover/src/scripts/functions.js similarity index 100% rename from packages/lover/src/scripts/functions.js rename to apps/lover/src/scripts/functions.js diff --git a/packages/lover/src/scripts/functions.min.js b/apps/lover/src/scripts/functions.min.js similarity index 100% rename from packages/lover/src/scripts/functions.min.js rename to apps/lover/src/scripts/functions.min.js diff --git a/packages/lover/src/scripts/garden.js b/apps/lover/src/scripts/garden.js similarity index 100% rename from packages/lover/src/scripts/garden.js rename to apps/lover/src/scripts/garden.js diff --git a/packages/lover/src/scripts/garden.min.js b/apps/lover/src/scripts/garden.min.js similarity index 100% rename from packages/lover/src/scripts/garden.min.js rename to apps/lover/src/scripts/garden.min.js diff --git a/packages/lover/src/scripts/jquery.min.js b/apps/lover/src/scripts/jquery.min.js similarity index 100% rename from packages/lover/src/scripts/jquery.min.js rename to apps/lover/src/scripts/jquery.min.js diff --git a/packages/lover/src/styles/default.css b/apps/lover/src/styles/default.css similarity index 100% rename from packages/lover/src/styles/default.css rename to apps/lover/src/styles/default.css diff --git a/packages/lover/src/styles/default.min.css b/apps/lover/src/styles/default.min.css similarity index 100% rename from packages/lover/src/styles/default.min.css rename to apps/lover/src/styles/default.min.css diff --git a/docs/blog/2022/05/01/zh-CN/welcome/index.html b/docs/blog/2022/05/01/zh-CN/welcome/index.html new file mode 100644 index 0000000..12db84b --- /dev/null +++ b/docs/blog/2022/05/01/zh-CN/welcome/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +欢迎 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ + + +
+ + + + + + + +
+

+ 欢迎 +

+ + +
+ + + + +

+ +
+ + + + + + +
+
+ + + + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/index.html b/docs/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/index.html new file mode 100644 index 0000000..ed2c8a7 --- /dev/null +++ b/docs/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.NET 面试问答 | ASP.NET 面试问答 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ + + +
+ + + + + + + +
+

+ .NET 面试问答 | ASP.NET 面试问答 +

+ + +
+ + + + +

整理的关于 .NET Framework 和 ASP.NET 的一些面试问答。

+ + +

一、初级问题

01) 什么是 .NET Framework?

.NET Framework 支持用于在 Windows 上构建应用程序的面向对象的方法。
它支持各种语言,如 C#、VB、Cobol、Perl、.NET 等。
它具有多种工具和功能,如用于构建、部署和运行 Web 服务和不同应用程序的类、库和 API。

+

02) .NET Framework 有哪些不同的组件?

    +
  • Common Language Runtime
  • +
  • Application Domain (.NET Framework only)
  • +
  • Common Type System
  • +
  • .NET Class Library
  • +
  • .NET Framework / .NET Core
  • +
  • Profiling
  • +
+

03) 你对 CTS 了解多少?

CTS代表通用类型系统(Common Type System)。
它遵循一定的规则,数据类型应该根据这些规则在程序代码中声明和使用。
CTS还描述了将在应用程序中使用的数据类型。
我们甚至可以按照CTS中的规则创建自己的类和函数,它有助于调用其他编程语言在一种编程语言中声明的数据类型。

+

04) 什么是 CLR?

CLR 代表 Common Language Runtime它是 .NET Framework 的重要组成部分。
我们可以将 CLR 用作各种应用程序的构建块,并为应用程序提供安全的执行环境。
每当编译用 C# 编写的应用程序时,代码都会转换为中间语言。 在此之后,代码以 CLR 为目标,然后执行多项操作,如内存管理、安全检查、加载程序集和线程管理。

+

05) 解释一下 CLS

CLS 代表通用语言规范(Common Language Specification)。
它帮助开发人员使用与 CLS 附带的某些规则的跨语言兼容的组件。
然后,它有助于在其他 .NET 兼容语言中重用代码。

+

06) 你对 JIT 了解多少?

JIT 是一个编译器,代表 Just In Time。
它用于将中间代码转换为本地语言。
在执行期间,中间代码被转换为本地语言。

+

07) 为什么要使用 Response.Output.Write()?

Response.Output.Write() 用于获取格式化输出。

+

08) Response.Redirect 和 Server.Transfer 有什么区别?

Response.Redirect:
Response.Redirect 基本上是将用户的浏览器重定向到另一个页面或站点。
用户浏览器的历史记录也会更新以反映新地址。
它还执行返回客户端的行程,客户端的浏览器被重定向到新页面。

+

Server.Transfer:
然而,Server.Transfer 从一个页面传输到另一个页面,而不需要返回客户端的浏览器。
在 Server.Transfer 的情况下,历史记录不会更新。

+

09) 托管代码和非托管代码的区别?

托管代码(Managed code):

+
    +
  • 托管代码由 CLR 管理
  • +
  • .NET Framework 是执行托管代码所必需的
  • +
  • CLR 通过垃圾回收(Garbage Collection)管理内存管理
  • +
+

非托管代码(Unmanaged code):

+
    +
  • 任何不受 CLR 管理的代码
  • +
  • 独立于 .NET Framework
  • +
  • 拥有用于执行和编译的运行时环境
  • +
+

10) 类和对象的区别?

类(Class):

+
    +
  • 类是对象的定义
  • +
  • 是对象的模板
  • +
  • 描述了所有的方法,属性等
  • +
+

对象(Object):

+
    +
  • 对象是类的实例
  • +
  • 除非实例化,否则类不会成为对象
  • +
  • 对象访问类的所有属性
  • +
+

11) 你对装箱和拆箱了解多少?

装箱(Boxing):

+
    +
  • 隐式的
  • +
  • 将值类型转换为类型对象的过程
  • +
  • 例如 - object myObj = a ;
  • +
+

拆箱(Unboxing):

+
    +
  • 明确的
  • +
  • 从对象中提取值类型的过程
  • +
  • 例如 - int a = (int) myObj ;
  • +
+

12) 常量和只读变量的区别?

常量(const):

+
    +
  • 在编译时评估
  • +
  • 仅支持值类型变量
  • +
  • 在编译时值不变时使用
  • +
  • 不能在构造函数或声明中初始化
  • +
+

只读变量(readonly):

+
    +
  • 在运行时评估
  • +
  • 可以保存引用类型变量
  • +
  • 在运行时之前实际值未知时使用
  • +
  • 能在构造函数或声明中初始化
  • +
+

13) 什么是 BCL?

    +
  • BCL(Base Class Library),是类、接口和值类型的基类库。
  • +
  • 它是 .NET Framework 应用程序、组件和控件的基础
  • +
  • 封装了大量常用功能,方便开发人员使用
  • +
  • 它提供线程、输入/输出、安全、诊断、资源、全球化等功能
  • +
  • 还用于用户和运行时之间的交互目的
  • +
  • 它还提供了经常使用的命名空间。 例如:System,System.Activities 等。
  • +
+

14) .NET 有哪些不同版本?

    +
  • .NET Framework 1.0 / 1.1
  • +
  • .NET Framework 2.0
  • +
  • .NET Framework 3.0 / 3.5
  • +
  • .NET Framework 4.0 / 4.5 / 4.6 / 4.7 / 4.8
  • +
  • .NET Core 1.0 / 1.1
  • +
  • .NET Core 2.0 / 2.1
  • +
  • .NET Core 3.0 / 3.1
  • +
  • .NET 5
  • +
  • .NET 6
  • +
+

15) 命名空间和程序集有什么区别?

程序集(Assembly)是逻辑单元的物理分组,而命名空间(Namespace)对类进行分组。
此外,一个命名空间也可以跨越多个程序集。

+

16) 什么是 LINQ?

LINQ 代表语言集成查询(Lanuage Integrated Query)。

+
    +
  • 它是 Visual Studio 2008 引入的语言集成查询的首字母缩写词。
  • +
  • LINQ 是一组功能,可将查询功能扩展到 .NET Framework 语言语法,允许在不考虑数据源的情况下进行数据操作
  • +
  • LINQ 弥合了对象世界和数据世界之间的鸿沟
  • +
+

17) 什么是 MSIL?

MSIL 是微软中间语言(Microsoft Intermediate Language),它提供了调用方法、存储和初始化值、内存处理、异常处理等的指令。
所有 .NET 代码首先编译为中间语言。

+

18) 所有 Web 窗体都继承自哪个基类?

Page 类

+

二、中等问题

19) 解释程序集的不同部分?

清单(MANIFEST):
包含有关程序集版本的信息。

+

类型元数据(TYPE METADATA):
包含程序的二进制信息。

+

中间语言(MSIL):
中间语言代码。

+

资源(RESOURCES):
相关文件列表。

+

20) 如何防止类被继承?

在 C# 中,我们可以使用 sealed 关键字来防止类被继承。

+

21) C# 中有哪些不同类型的构造函数?

默认的:
如果未显示提供构造函数,则由编译器生成默认的无参数构造函数。

+

参数化的:
只要构造函数具有至少1个参数,就是参数化的构造函数。

+

副本:
在构造函数中接受另一个对象作为参数,并用其属性来初始化自身的属性。

+

静态:
没有访问修饰符,没有任何参数,由 CLR 自动执行,可初始化静态成员。

+

私有:
使用了 private 访问修饰符,用于防止通过 new 关键字进行实例化。
例如:可实现单例类。

+

22) 有哪些不同类型的程序集?

私有的:
只能由应用程序访问。
安装在应用程序的安装目录中。

+

共享的:
可以由多个应用程序共享。
安装在 GAC 中。

+

23) 什么是 MDI 和 SDI?

MDI(Multiple Document Interface):
MDI 允许您打开多个窗口。
它将有一个父窗口和尽可能多的子窗口。
组件从父窗口共享,如菜单栏、工具栏等。

+

SDI(Single Document Interface):
在单独的窗口中打开每个文档。
每个窗口都有自己的组件,如菜单栏、工具栏等。
因此它不受父窗口的限制。

+

24) 区分自定义控件和用户控件?

自定义控件(Custom Control):

+
    +
  • 派生自 Control
  • +
  • 动态布局
  • +
  • 定义单个控件
  • +
  • 有完整的工具箱支持
  • +
+

用户控件(User Control):

+
    +
  • 派生自 UserControl
  • +
  • 静态布局
  • +
  • 定义一组控件
  • +
  • 无法添加到工具箱
  • +
+

25) 什么是垃圾收集器?

.NET 中的垃圾收集器(Garbage Collector)功能释放内存中未使用的代码对象。

+

内存堆分为3代:

+
    +
  • 第 0 代(Generation 0)
    存储短生存期的对象

    +
  • +
  • 第 1 代(Generation 1)
    存储中等生存期的对象

    +
  • +
  • 第 2 代(Generation 2)
    存储长生存期的对象

    +
  • +
+

另外,内存堆也分为小型对象堆(SOH)和一个大型对象堆(LOH)。
小型对象堆完全符合上述的 3 代回收机制,
而这个大型对象堆略有不同,它在第 0 代被设置,只与第 2 代同时回收。

+

26) 什么是缓存?

缓存只是意味着将数据临时存储在内存中,以便可以从内存中访问数据,而不是在原始位置搜索它。 它提高了应用程序的效率,也提高了它的速度。

+
    +
  • 页面缓存(Page Caching)
    可以帮助改善网页加载时间,从而为搜索引擎优化您的网站。
    页面加载时间会显着影响您的用户体验以及您的网站将访问者转化为买家或潜在客户的能力。

    +
  • +
  • 数据缓存(Data Caching)
    缓存是一种在内存中存储常用数据或信息的技术。
    当下次需要相同的数据或信息时,可以直接从内存中检索,而不是由应用程序生成。

    +
  • +
  • 片段缓存(Fragment Caching)
    片段缓存实际上是指在 Web 表单中缓存单个用户控件。
    每个用户控件可以有独立的缓存持续时间和如何应用缓存行为的实现。
    当您只需要缓存页面的子集时,片段缓存很有用。

    +
  • +
+

解释一下 MVC

MVC 代表模型视图控制器(Model View Controller)。
它是构建 .NET 应用程序的架构。

+

模型(Model):
Model基本上是处理对象存储和从应用程序的数据库检索的任何应用程序的逻辑部分。

+

视图(View):
View处理应用程序的 UI 部分,即用户界面。
因此它们从模型中获取信息以进行展示。

+

控制器(Controller):
Controller 处理用户交互,从用户输入中找出响应,并呈现用户交互所需的视图。

+

28) 什么是 CAS?

CAS表示代码访问安全性(Code Access Security)。
CAS是安全模型的一部分,用于防止对资源的未授权访问。
它还允许用户设置代码的权限。CLR然后根据权限执行代码。

+

CAS只能用于托管代码。
如果程序集使用CAS,则将其视为部分受信任的。
尽管每次程序集试图访问资源时,它都会执行检查。

+

29) 解释一下本地化和全球化

本地化(Localization):
这意味着改变已经全球化的应用程序以适应特定的语言或文化。
Microsoft.Extension.Localization 用于本地化应用程序内容。

+

全球化(Globalization):
全球化是开发支持多种语言的应用程序的过程。
还可以将现有的应用程序转换为支持多种语言。

+

30) 什么是应用程序域?

ASP.NET 引入了一个应用程序域概念或 AppDomain,它就像一个轻量级进程,既像容器又像边界。

+

.NET 运行时使用 AppDomain 作为数据和代码的容器。CLR 允许多个 .NET 应用程序在单个 AppDomain 中运行。

+

31) .NET中的委托是什么?

.NET 中的委托(delegate)类似于其他编程语言(如 C 或 C++)中的函数指针。
委托允许用户将方法的引用封装在委托对象中。
可以在程序中传递委托对象,该程序将调用引用的方法。
我们可以使用委托方法在类中创建自定义事件。

+

32) .NET 中抽象类和接口的区别?

抽象类(abstact class):
抽象类为必须由继承实体实现的功能提供了部分实现。
抽象类也声明字段。

+

接口(interface):
接口仅声明实现类应具有的契约或行为。
接口只能声明没有访问修饰符的属性、方法和事件。

+

33) 区分栈和堆?

栈(Stack):

+
    +
  • 静态内存分配
  • +
  • 存储值类型
  • +
  • 跟踪每个线程及其位置
  • +
+

堆(Heap):

+
    +
  • 动态内存分配
  • +
  • 存储引用类型
  • +
  • 跟踪更精确的对象或数据
  • +
+

34) ASP.NET 中有哪些不同的验证器?

客户端验证(Client-side validation):
当在客户端浏览器上进行验证时,它被称为客户端验证。通常,JavaScript用于客户端验证。

+

服务端验证(Server-side validation):
当在服务器上进行验证时,就称为服务器端验证。
服务器端验证被认为是一种安全的验证形式,因为即使用户绕过了客户端验证,我们仍然可以在服务器端验证中捕捉到它。

+

三、高级问题

35) 什么是 EXE 和 DLL?

EXE:
它是一个可执行文件,可运行为其设计的应用程序。
当我们构建应用程序时,会生成一个 exe 文件。
因此,程序集在我们运行 exe 时直接加载。
但是exe文件不能与其他应用程序共享。

+

DLL:
它代表由需要隐藏的代码组成的动态链接库。
代码封装在这个库中,一个应用程序可以有很多DLL,也可以与其他应用程序共享。

+

36) 区分函数和存储过程?

函数(Fucntion):

+
    +
  • 必须返回单个值
  • +
  • 它只能有输入参数
  • +
  • 无法使用try catch块进行异常处理
  • +
  • 无法从函数调用存储过程
  • +
+

存储过程(Stored Procedure):

+
    +
  • 总是用于执行特定任务
  • +
  • 可以同时具有输入或输出参数
  • +
  • 可以使用try catch块进行异常处理
  • +
  • 可以从存储过程中调用函数
  • +
+

列出 ASP.NET 页面的生命周期事件。

Page_PreInit
Page_Init
Page_InitComplete
Page_PreLoad
Page_Load
Page_LoadComplete
Page_PreRender
Render

+

38) 从 ASP.NET 应用程序发送电子邮件的代码是什么?

Mail msg = new Mail();
msg.From = “abc@gmail.com“;
msg.To = “xyz@gmail.com“;
msg.Subject = “test”;
msg.Body = “hello”;

+

SmtpMail.SmtpServer = “localhost”;
SmtpMail.Send(msg);

+

以上代码无法运行,属于伪代码

+

39) ASP.NET 中 Global.asax 文件有哪些事件处理程序?

Application_Start
Application_End
Application_AuthenticatedRequest
Application_AuthorizeRequest
Application_BeginRequest
Application_Disposed
Application_EndRequest
Application_Error
Application_PostRequestHandlerExecute
Application_PreRequestHandlerExecute
Application_PreSendRequestContent
Application_PreSendRequestHeader
Application_ReleaseRequestState
Application_ResolveRequestCache
Application_UpdateRequestCache

+

40) 解释一下基于角色的安全性

基于角色的安全性是指根据组织中分配给用户的角色来实施安全措施。
然后根据用户在组织中的角色对其进行授权。
例如,Windows 具有基于角色的访问权限,例如用户、管理员和来宾。

+

41) 什么是跨页公布?

cross-page posting:

+
    +
  • 每当我们单击页面上的提交按钮时,数据都存储在同一个页面上。但如果数据存储在不同的页面上,则称为跨页面发布。
  • +
  • 跨页发布可以通过导致回发的 POSTBACKURL 属性实现。
  • +
  • FindControl 方法可用于获取该页面已发布到的该页面上发布的值。
  • +
+

42) 如何将主题应用于 ASP.NET 应用程序?

下面是更改主题的代码:

+ + + + + + +

43) 解释护照认证

在护照认证期间,它首先检查护照认证cookie,如果cookie不可用,应用程序将重定向到护照登录页面。 Passport 服务然后在登录页面上验证用户的详细信息,如果它们有效,则将它们存储在客户端计算机上,然后将用户重定向到请求的页面。

+

44) 什么是 ASP.NET 安全控件?

asp:Login
asp:LoginName
asp:LoginStatus
asp:LoginView
asp:PasswordRecovery

+

45) 列出 ASP.NET 转发器控件的所有模板?

ItemTemplate
AlternatingItemTemplate
SeparatorTemplate
HeaderTemplate
FooterTemplate

+

46) web.config 文件中的 appSettings 部分是什么?

+ + + + + +

web.config 文件中的 appsettings 部分是 web 应用程序的自定义配置

+

47) 什么是 MIME?

MIME 代表多用途互联网邮件扩展(multipurpose internet mail extensions)。
它是电子邮件协议的扩展,允许用户使用该协议在互联网上交换文件。
服务器在我们传输的开头插入 MIME 标头。
然后客户端使用此标头为标头指示的数据类型选择适当的“播放器”。
其中一些播放器内置于网络浏览器中。

+

48) 什么是 HTTP handler?

对 ASP.NET 应用程序的每个请求都由一个称为 HTTP 处理程序的专用组件处理。
它是处理 ASP.NET 应用程序请求的最重要的组件。
它使用不同的处理程序来处理不同的文件。
网页处理程序创建页面和控件对象,运行您的代码,然后呈现最终的 HTML。

+
    +
  • Page Handler (.aspx):处理 web 页面
  • +
  • User Control Handler (.ascx):处理 web 用户控件页面
  • +
  • Web Service Handler (.asmx):处理 web 服务页面
  • +
  • Trace Handler (trace.axd):处理跟踪功能
  • +
+

49) ASP.NET 中有哪些不同类型的 Cookie?

会话 Cookie(Session cookie):
对于单个会话,它驻留在客户端机器上,直到用户注销。

+

持久性 Cookie(Persistent cookie):
在指定的期限内驻留在用户计算机上。可能是一个小时,一个月或永远不会。

+

50) 区分 ExecuteScalar 和 ExecuteNonQuery?

ExecuteScalar:

+
    +
  • 返回输出值
  • +
  • 用于获取单个值
  • +
  • 不返回受影响的行数
  • +
+

ExecuteNonQuery:

+
    +
  • 不返回任何值
  • +
  • 用于执行插入和更新语句
  • +
  • 返回受影响的行数
  • +
+

相关视频

+
+ + + + + + +
+
+ + + + + + + +
+ +
+ +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/404/index.html b/docs/blog/404/index.html new file mode 100644 index 0000000..205dbb3 --- /dev/null +++ b/docs/blog/404/index.html @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +404 | Deven Liu' Blog + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ +

404 +

+ + + +
+ + + +
+ +
+ + + +
+ + + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/about/index.html b/docs/blog/about/index.html new file mode 100644 index 0000000..cca9c50 --- /dev/null +++ b/docs/blog/about/index.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +关于 | Deven Liu' Blog + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ +

关于 +

+ + + +
+ + + +
+

+ +
+ + + +
+ + + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/archives/2022/05/index.html b/docs/blog/archives/2022/05/index.html new file mode 100644 index 0000000..98b062a --- /dev/null +++ b/docs/blog/archives/2022/05/index.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +归档 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+ 嗯..! 目前共计 2 篇日志。 继续努力。 +
+ + +
+ 2022 +
+ + + + +
+
+ + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/archives/2022/06/index.html b/docs/blog/archives/2022/06/index.html new file mode 100644 index 0000000..73322da --- /dev/null +++ b/docs/blog/archives/2022/06/index.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +归档 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+ 嗯..! 目前共计 2 篇日志。 继续努力。 +
+ + +
+ 2022 +
+ + + + +
+
+ + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/archives/2022/index.html b/docs/blog/archives/2022/index.html new file mode 100644 index 0000000..245d649 --- /dev/null +++ b/docs/blog/archives/2022/index.html @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +归档 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+ 嗯..! 目前共计 2 篇日志。 继续努力。 +
+ + +
+ 2022 +
+ + + + + + +
+
+ + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/archives/index.html b/docs/blog/archives/index.html new file mode 100644 index 0000000..4d38979 --- /dev/null +++ b/docs/blog/archives/index.html @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +归档 | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+ 嗯..! 目前共计 2 篇日志。 继续努力。 +
+ + +
+ 2022 +
+ + + + + + +
+
+ + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/categories/NET/index.html b/docs/blog/categories/NET/index.html new file mode 100644 index 0000000..78459ba --- /dev/null +++ b/docs/blog/categories/NET/index.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +分类: .NET | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+

.NET + 分类 +

+
+ + +
+ 2022 +
+ + + +
+
+ + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/categories/index.html b/docs/blog/categories/index.html new file mode 100644 index 0000000..44ac7da --- /dev/null +++ b/docs/blog/categories/index.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +categories | Deven Liu' Blog + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ +

categories +

+ + + +
+ + + +
+
+ 目前共计 1 个分类 +
+
+ +
+
+ +
+ + + +
+ + + + + +
+
+ + + + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/css/main.css b/docs/blog/css/main.css new file mode 100644 index 0000000..c4f98e7 --- /dev/null +++ b/docs/blog/css/main.css @@ -0,0 +1,2947 @@ +:root { + --body-bg-color: #eee; + --content-bg-color: #fff; + --card-bg-color: #f5f5f5; + --text-color: #555; + --blockquote-color: #666; + --link-color: #555; + --link-hover-color: #222; + --brand-color: #fff; + --brand-hover-color: #fff; + --table-row-odd-bg-color: #f9f9f9; + --table-row-hover-bg-color: #f5f5f5; + --menu-item-bg-color: #f5f5f5; + --theme-color: #222; + --btn-default-bg: #fff; + --btn-default-color: #555; + --btn-default-border-color: #555; + --btn-default-hover-bg: #222; + --btn-default-hover-color: #fff; + --btn-default-hover-border-color: #222; + --highlight-background: #f3f3f3; + --highlight-foreground: #444; + --highlight-gutter-background: #e1e1e1; + --highlight-gutter-foreground: #555; + color-scheme: light; +} +@media (prefers-color-scheme: dark) { + :root { + --body-bg-color: #282828; + --content-bg-color: #333; + --card-bg-color: #555; + --text-color: #ccc; + --blockquote-color: #bbb; + --link-color: #ccc; + --link-hover-color: #eee; + --brand-color: #ddd; + --brand-hover-color: #ddd; + --table-row-odd-bg-color: #282828; + --table-row-hover-bg-color: #363636; + --menu-item-bg-color: #555; + --theme-color: #222; + --btn-default-bg: #222; + --btn-default-color: #ccc; + --btn-default-border-color: #555; + --btn-default-hover-bg: #666; + --btn-default-hover-color: #ccc; + --btn-default-hover-border-color: #666; + --highlight-background: #1c1b1b; + --highlight-foreground: #fff; + --highlight-gutter-background: #323131; + --highlight-gutter-foreground: #e8e8e8; + color-scheme: dark; + } + img { + opacity: 0.75; + } + img:hover { + opacity: 0.9; + } + iframe { + color-scheme: light; + } +} +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} +body { + margin: 0; +} +main { + display: block; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} +a { + background: transparent; +} +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} +b, +strong { + font-weight: bolder; +} +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +img { + border-style: none; +} +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} +button, +input { +/* 1 */ + overflow: visible; +} +button, +select { +/* 1 */ + text-transform: none; +} +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; +} +button:-moz-focusring, +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + padding: 0.35em 0.75em 0.625em; +} +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} +progress { + vertical-align: baseline; +} +textarea { + overflow: auto; +} +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + outline-offset: -2px; /* 2 */ + -webkit-appearance: textfield; /* 1 */ +} +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + font: inherit; /* 2 */ + -webkit-appearance: button; /* 1 */ +} +details { + display: block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none; +} +::selection { + background: #262a30; + color: #eee; +} +html, +body { + height: 100%; +} +body { + background: var(--body-bg-color); + box-sizing: border-box; + color: var(--text-color); + font-family: Lato, 'PingFang SC', 'Microsoft YaHei', sans-serif; + font-size: 1em; + line-height: 2; + min-height: 100%; + position: relative; + transition: padding 0.2s ease-in-out; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: Lato, 'PingFang SC', 'Microsoft YaHei', sans-serif; + font-weight: bold; + line-height: 1.5; + margin: 30px 0 15px; +} +h1 { + font-size: 1.5em; +} +h2 { + font-size: 1.375em; +} +h3 { + font-size: 1.25em; +} +h4 { + font-size: 1.125em; +} +h5 { + font-size: 1em; +} +h6 { + font-size: 0.875em; +} +p { + margin: 0 0 20px; +} +a { + border-bottom: 1px solid #999; + color: var(--link-color); + cursor: pointer; + outline: 0; + text-decoration: none; + overflow-wrap: break-word; +} +a:hover { + border-bottom-color: var(--link-hover-color); + color: var(--link-hover-color); +} +iframe, +img, +video, +embed { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 100%; +} +hr { + background-image: repeating-linear-gradient(-45deg, #ddd, #ddd 4px, transparent 4px, transparent 8px); + border: 0; + height: 3px; + margin: 40px 0; +} +blockquote { + border-left: 4px solid #ddd; + color: var(--blockquote-color); + margin: 0; + padding: 0 15px; +} +blockquote cite::before { + content: '-'; + padding: 0 5px; +} +dt { + font-weight: bold; +} +dd { + margin: 0; + padding: 0; +} +.table-container { + overflow: auto; +} +table { + border-collapse: collapse; + border-spacing: 0; + font-size: 0.875em; + margin: 0 0 20px; + width: 100%; +} +tbody tr:nth-of-type(odd) { + background: var(--table-row-odd-bg-color); +} +tbody tr:hover { + background: var(--table-row-hover-bg-color); +} +caption, +th, +td { + padding: 8px; +} +th, +td { + border: 1px solid #ddd; + border-bottom: 3px solid #ddd; +} +th { + font-weight: 700; + padding-bottom: 10px; +} +td { + border-bottom-width: 1px; +} +.btn { + background: var(--btn-default-bg); + border: 2px solid var(--btn-default-border-color); + border-radius: 2px; + color: var(--btn-default-color); + display: inline-block; + font-size: 0.875em; + line-height: 2; + padding: 0 20px; + transition: background-color 0.2s ease-in-out; +} +.btn:hover { + background: var(--btn-default-hover-bg); + border-color: var(--btn-default-hover-border-color); + color: var(--btn-default-hover-color); +} +.btn + .btn { + margin: 0 0 8px 8px; +} +.btn .fa-fw { + text-align: left; + width: 1.285714285714286em; +} +.toggle { + line-height: 0; +} +.toggle .toggle-line { + background: #fff; + display: block; + height: 2px; + left: 0; + position: relative; + top: 0; + transition: all 0.4s; + width: 100%; +} +.toggle .toggle-line:first-child { + margin-top: 1px; +} +.toggle .toggle-line:not(:first-child) { + margin-top: 4px; +} +.toggle.toggle-arrow :first-child { + left: 50%; + top: 2px; + transform: rotate(45deg); + width: 50%; +} +.toggle.toggle-arrow :last-child { + left: 50%; + top: -2px; + transform: rotate(-45deg); + width: 50%; +} +.toggle.toggle-close :nth-child(2) { + opacity: 0; +} +.toggle.toggle-close :first-child { + top: 6px; + transform: rotate(45deg); +} +.toggle.toggle-close :last-child { + top: -6px; + transform: rotate(-45deg); +} +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} +@media (prefers-color-scheme: dark) { +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: StackOverflow Dark + Description: Dark theme as used on stackoverflow.com + Author: stackoverflow.com + Maintainer: @Hirse + Website: https://github.com/StackExchange/Stacks + License: MIT + Updated: 2021-05-15 + + Updated for @stackoverflow/stacks v0.64.0 + Code Blocks: /blob/v0.64.0/lib/css/components/_stacks-code-blocks.less + Colors: /blob/v0.64.0/lib/css/exports/_stacks-constants-colors.less +*/.hljs{color:#fff;background:#1c1b1b}.hljs-subst{color:#fff}.hljs-comment{color:#999}.hljs-attr,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-section,.hljs-selector-tag{color:#88aece}.hljs-attribute{color:#c59bc1}.hljs-name,.hljs-number,.hljs-quote,.hljs-selector-id,.hljs-template-tag,.hljs-type{color:#f08d49}.hljs-selector-class{color:#88aece}.hljs-link,.hljs-regexp,.hljs-selector-attr,.hljs-string,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#b5bd68}.hljs-meta,.hljs-selector-pseudo{color:#88aece}.hljs-built_in,.hljs-literal,.hljs-title{color:#f08d49}.hljs-bullet,.hljs-code{color:#ccc}.hljs-meta .hljs-string{color:#b5bd68}.hljs-deletion{color:#de7176}.hljs-addition{color:#76c490}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} +} +.highlight:hover .copy-btn, +pre:hover .copy-btn { + opacity: 1; +} +figure.highlight .table-container { + position: relative; +} +.copy-btn { + color: #333; + cursor: pointer; + line-height: 1.6; + opacity: 0; + padding: 2px 6px; + position: absolute; + transition: opacity 0.2s ease-in-out; + background-color: #eee; + background-image: linear-gradient(#fcfcfc, #eee); + border: 1px solid #d5d5d5; + border-radius: 3px; + font-size: 0.8125em; + right: 4px; + top: 8px; +} +code, +kbd, +figure.highlight, +pre { + background: var(--highlight-background); + color: var(--highlight-foreground); +} +figure.highlight, +pre { + line-height: 1.6; + margin: 0 auto 20px; +} +figure.highlight figcaption, +pre .caption, +pre figcaption { + background: var(--highlight-gutter-background); + color: var(--highlight-foreground); + display: flow-root; + font-size: 0.875em; + line-height: 1.2; + padding: 0.5em; +} +figure.highlight figcaption a, +pre .caption a, +pre figcaption a { + color: var(--highlight-foreground); + float: right; +} +figure.highlight figcaption a:hover, +pre .caption a:hover, +pre figcaption a:hover { + border-bottom-color: var(--highlight-foreground); +} +pre, +code { + font-family: consolas, Menlo, monospace, 'PingFang SC', 'Microsoft YaHei'; +} +code { + border-radius: 3px; + font-size: 0.875em; + padding: 2px 4px; + overflow-wrap: break-word; +} +kbd { + border: 2px solid #ccc; + border-radius: 0.2em; + box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1); + font-family: inherit; + padding: 0.1em 0.3em; + white-space: nowrap; +} +figure.highlight { + overflow: auto; + position: relative; +} +figure.highlight pre { + border: 0; + margin: 0; + padding: 10px 0; +} +figure.highlight table { + border: 0; + margin: 0; + width: auto; +} +figure.highlight td { + border: 0; + padding: 0; +} +figure.highlight .gutter { + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} +figure.highlight .gutter pre { + background: var(--highlight-gutter-background); + color: var(--highlight-gutter-foreground); + padding-left: 10px; + padding-right: 10px; + text-align: right; +} +figure.highlight .code pre { + padding-left: 10px; + width: 100%; +} +figure.highlight .marked { + background: rgba(0,0,0,0.3); +} +pre .caption, +pre figcaption { + margin-bottom: 10px; +} +.gist table { + width: auto; +} +.gist table td { + border: 0; +} +pre { + overflow: auto; + padding: 10px; + position: relative; +} +pre code { + background: none; + padding: 0; + text-shadow: none; +} +.blockquote-center { + border-left: 0; + margin: 40px 0; + padding: 0; + position: relative; + text-align: center; +} +.blockquote-center::before, +.blockquote-center::after { + left: 0; + line-height: 1; + opacity: 0.6; + position: absolute; + width: 100%; +} +.blockquote-center::before { + border-top: 1px solid #ccc; + text-align: left; + top: -20px; + content: '\f10d'; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; +} +.blockquote-center::after { + border-bottom: 1px solid #ccc; + bottom: -20px; + text-align: right; + content: '\f10e'; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; +} +.blockquote-center p, +.blockquote-center div { + text-align: center; +} +.group-picture { + margin-bottom: 20px; +} +.group-picture .group-picture-row { + display: flex; + gap: 3px; + margin-bottom: 3px; +} +.group-picture .group-picture-column { + flex: 1; +} +.group-picture .group-picture-column img { + height: 100%; + margin: 0; + object-fit: cover; + width: 100%; +} +.post-body .label { + color: #555; + padding: 0 2px; +} +.post-body .label.default { + background: #f0f0f0; +} +.post-body .label.primary { + background: #efe6f7; +} +.post-body .label.info { + background: #e5f2f8; +} +.post-body .label.success { + background: #e7f4e9; +} +.post-body .label.warning { + background: #fcf6e1; +} +.post-body .label.danger { + background: #fae8eb; +} +.post-body .link-grid { + display: grid; + grid-gap: 1.5rem; + gap: 1.5rem; + grid-template-columns: 1fr 1fr; + margin-bottom: 20px; + padding: 1rem; +} +@media (max-width: 767px) { + .post-body .link-grid { + grid-template-columns: 1fr; + } +} +.post-body .link-grid .link-grid-container { + border: solid #ddd; + box-shadow: 1rem 1rem 0.5rem rgba(0,0,0,0.5); + min-height: 5rem; + min-width: 0; + padding: 0.5rem; + position: relative; + transition: background 0.3s; +} +.post-body .link-grid .link-grid-container:hover { + animation: next-shake 0.5s; + background: var(--card-bg-color); +} +.post-body .link-grid .link-grid-container:active { + box-shadow: 0.5rem 0.5rem 0.25rem rgba(0,0,0,0.5); + transform: translate(0.2rem, 0.2rem); +} +.post-body .link-grid .link-grid-container .link-grid-image { + border: 1px solid #ddd; + border-radius: 50%; + box-sizing: border-box; + height: 5rem; + padding: 3px; + position: absolute; + width: 5rem; +} +.post-body .link-grid .link-grid-container p { + margin: 0 1rem 0 6rem; +} +.post-body .link-grid .link-grid-container p:first-of-type { + font-size: 1.2em; +} +.post-body .link-grid .link-grid-container p:last-of-type { + font-size: 0.8em; + line-height: 1.3rem; + opacity: 0.7; +} +.post-body .link-grid .link-grid-container a { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +@keyframes next-shake { + 0% { + transform: translate(1pt, 1pt) rotate(0deg); + } + 10% { + transform: translate(-1pt, -2pt) rotate(-1deg); + } + 20% { + transform: translate(-3pt, 0pt) rotate(1deg); + } + 30% { + transform: translate(3pt, 2pt) rotate(0deg); + } + 40% { + transform: translate(1pt, -1pt) rotate(1deg); + } + 50% { + transform: translate(-1pt, 2pt) rotate(-1deg); + } + 60% { + transform: translate(-3pt, 1pt) rotate(0deg); + } + 70% { + transform: translate(3pt, 1pt) rotate(-1deg); + } + 80% { + transform: translate(-1pt, -1pt) rotate(1deg); + } + 90% { + transform: translate(1pt, 2pt) rotate(0deg); + } + 100% { + transform: translate(1pt, -2pt) rotate(-1deg); + } +} +.mermaid { + margin-bottom: 20px; + text-align: center; +} +.post-body .note { + border-radius: 3px; + margin-bottom: 20px; + padding: 1em; + position: relative; + border: 1px solid #eee; + border-left-width: 5px; +} +.post-body .note summary { + cursor: pointer; + outline: 0; +} +.post-body .note summary p { + display: inline; +} +.post-body .note h2, +.post-body .note h3, +.post-body .note h4, +.post-body .note h5, +.post-body .note h6 { + border-bottom: initial; + margin: 0; + padding-top: 0; +} +.post-body .note :first-child { + margin-top: 0; +} +.post-body .note :last-child { + margin-bottom: 0; +} +.post-body .note.default { + border-left-color: #777; +} +.post-body .note.default h2, +.post-body .note.default h3, +.post-body .note.default h4, +.post-body .note.default h5, +.post-body .note.default h6 { + color: #777; +} +.post-body .note.primary { + border-left-color: #6f42c1; +} +.post-body .note.primary h2, +.post-body .note.primary h3, +.post-body .note.primary h4, +.post-body .note.primary h5, +.post-body .note.primary h6 { + color: #6f42c1; +} +.post-body .note.info { + border-left-color: #428bca; +} +.post-body .note.info h2, +.post-body .note.info h3, +.post-body .note.info h4, +.post-body .note.info h5, +.post-body .note.info h6 { + color: #428bca; +} +.post-body .note.success { + border-left-color: #5cb85c; +} +.post-body .note.success h2, +.post-body .note.success h3, +.post-body .note.success h4, +.post-body .note.success h5, +.post-body .note.success h6 { + color: #5cb85c; +} +.post-body .note.warning { + border-left-color: #f0ad4e; +} +.post-body .note.warning h2, +.post-body .note.warning h3, +.post-body .note.warning h4, +.post-body .note.warning h5, +.post-body .note.warning h6 { + color: #f0ad4e; +} +.post-body .note.danger { + border-left-color: #d9534f; +} +.post-body .note.danger h2, +.post-body .note.danger h3, +.post-body .note.danger h4, +.post-body .note.danger h5, +.post-body .note.danger h6 { + color: #d9534f; +} +.pdfobject-container iframe, +.pdfobject-container embed { + height: 500px; + width: 100%; +} +.post-body .tabs { + margin-bottom: 20px; +} +.post-body .tabs, +.tabs-comment { + padding-top: 10px; +} +.post-body .tabs ul.nav-tabs, +.tabs-comment ul.nav-tabs { + background: var(--content-bg-color); + display: flex; + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 0; + padding: 0; + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 5; +} +@media (max-width: 413px) { + .post-body .tabs ul.nav-tabs, + .tabs-comment ul.nav-tabs { + display: block; + margin-bottom: 5px; + } +} +.post-body .tabs ul.nav-tabs li.tab, +.tabs-comment ul.nav-tabs li.tab { + border-bottom: 1px solid #ddd; + border-left: 1px solid transparent; + border-right: 1px solid transparent; + border-radius: 0 0 0 0; + border-top: 3px solid transparent; + flex-grow: 1; + list-style-type: none; +} +@media (max-width: 413px) { + .post-body .tabs ul.nav-tabs li.tab, + .tabs-comment ul.nav-tabs li.tab { + border-bottom: 1px solid transparent; + border-left: 3px solid transparent; + border-right: 1px solid transparent; + border-top: 1px solid transparent; + } +} +@media (max-width: 413px) { + .post-body .tabs ul.nav-tabs li.tab, + .tabs-comment ul.nav-tabs li.tab { + border-radius: 0; + } +} +.post-body .tabs ul.nav-tabs li.tab a, +.tabs-comment ul.nav-tabs li.tab a { + border-bottom: initial; + display: block; + line-height: 1.8; + padding: 0.25em 0.75em; + text-align: center; + transition: all 0.2s ease-out; +} +.post-body .tabs ul.nav-tabs li.tab a i, +.tabs-comment ul.nav-tabs li.tab a i { + width: 1.285714285714286em; +} +.post-body .tabs ul.nav-tabs li.tab.active, +.tabs-comment ul.nav-tabs li.tab.active { + border-bottom-color: transparent; + border-left-color: #ddd; + border-right-color: #ddd; + border-top-color: #fc6423; +} +@media (max-width: 413px) { + .post-body .tabs ul.nav-tabs li.tab.active, + .tabs-comment ul.nav-tabs li.tab.active { + border-bottom-color: #ddd; + border-left-color: #fc6423; + border-right-color: #ddd; + border-top-color: #ddd; + } +} +.post-body .tabs ul.nav-tabs li.tab.active a, +.tabs-comment ul.nav-tabs li.tab.active a { + cursor: default; +} +.post-body .tabs .tab-content, +.tabs-comment .tab-content { + border: 1px solid #ddd; + border-radius: 0 0 0 0; + border-top-color: transparent; +} +@media (max-width: 413px) { + .post-body .tabs .tab-content, + .tabs-comment .tab-content { + border-radius: 0; + border-top-color: #ddd; + } +} +.post-body .tabs .tab-content .tab-pane, +.tabs-comment .tab-content .tab-pane { + padding: 20px 20px 0; +} +.post-body .tabs .tab-content .tab-pane:not(.active), +.tabs-comment .tab-content .tab-pane:not(.active) { + display: none; +} +.pagination .prev, +.pagination .next, +.pagination .page-number, +.pagination .space { + display: inline-block; + margin: -1px 10px 0; + padding: 0 10px; +} +@media (max-width: 767px) { + .pagination .prev, + .pagination .next, + .pagination .page-number, + .pagination .space { + margin: 0 5px; + } +} +.pagination .page-number.current { + background: #ccc; + border-color: #ccc; + color: var(--content-bg-color); +} +.pagination { + border-top: 1px solid #eee; + margin: 120px 0 0; + text-align: center; +} +.pagination .prev, +.pagination .next, +.pagination .page-number { + border-bottom: 0; + border-top: 1px solid #eee; + transition: border-color 0.2s ease-in-out; +} +.pagination .prev:hover, +.pagination .next:hover, +.pagination .page-number:hover { + border-top-color: var(--link-hover-color); +} +@media (max-width: 767px) { + .pagination { + border-top: 0; + } + .pagination .prev, + .pagination .next, + .pagination .page-number { + border-bottom: 1px solid #eee; + border-top: 0; + } + .pagination .prev:hover, + .pagination .next:hover, + .pagination .page-number:hover { + border-bottom-color: var(--link-hover-color); + } +} +.pagination .space { + margin: 0; + padding: 0; +} +.comments { + margin-top: 60px; + overflow: hidden; +} +.comment-button-group { + display: flex; + display: flex; + flex-wrap: wrap; + justify-content: center; + justify-content: center; + margin: 1em 0; +} +.comment-button-group .comment-button { + margin: 0.1em 0.2em; +} +.comment-button-group .comment-button.active { + background: var(--btn-default-hover-bg); + border-color: var(--btn-default-hover-border-color); + color: var(--btn-default-hover-color); +} +.comment-position { + display: none; +} +.comment-position.active { + display: block; +} +.tabs-comment { + margin-top: 4em; + padding-top: 0; +} +.tabs-comment .comments { + margin-top: 0; + padding-top: 0; +} +.headband { + background: var(--theme-color); + height: 3px; +} +@media (max-width: 991px) { + .headband { + display: none; + } +} +.site-brand-container { + display: flex; + flex-shrink: 0; + padding: 0 10px; +} +.use-motion .column, +.use-motion .site-brand-container .toggle { + opacity: 0; +} +.site-meta { + flex-grow: 1; + text-align: center; +} +@media (max-width: 767px) { + .site-meta { + text-align: center; + } +} +.custom-logo-image { + margin-top: 20px; +} +@media (max-width: 991px) { + .custom-logo-image { + display: none; + } +} +.brand { + border-bottom: 0; + color: var(--brand-color); + display: inline-block; + padding: 0; +} +.brand:hover { + color: var(--brand-hover-color); +} +.site-title { + font-family: Lato, 'PingFang SC', 'Microsoft YaHei', sans-serif; + font-size: 1.375em; + font-weight: normal; + line-height: 1.5; + margin: 0; +} +.site-subtitle { + color: #ddd; + font-size: 0.8125em; + margin: 10px 10px 0; +} +.use-motion .site-title, +.use-motion .site-subtitle, +.use-motion .custom-logo-image { + opacity: 0; + position: relative; + top: -10px; +} +.site-nav-toggle, +.site-nav-right { + display: none; +} +@media (max-width: 767px) { + .site-nav-toggle, + .site-nav-right { + display: flex; + flex-direction: column; + justify-content: center; + } +} +.site-nav-toggle .toggle, +.site-nav-right .toggle { + color: var(--text-color); + padding: 10px; + width: 22px; +} +.site-nav-toggle .toggle .toggle-line, +.site-nav-right .toggle .toggle-line { + background: var(--text-color); + border-radius: 1px; +} +@media (max-width: 767px) { + .site-nav { + --scroll-height: 0; + height: 0; + overflow: hidden; + transition: 0.2s ease-in-out; + transition-property: height, visibility; + visibility: hidden; + } + body:not(.site-nav-on) .site-nav .animated { + animation: none; + } + body.site-nav-on .site-nav { + height: var(--scroll-height); + visibility: unset; + } +} +.menu { + margin: 0; + padding: 1em 0; + text-align: center; +} +.menu-item { + display: inline-block; + list-style: none; + margin: 0 10px; +} +@media (max-width: 767px) { + .menu-item { + display: block; + margin-top: 10px; + } + .menu-item.menu-item-search { + display: none; + } +} +.menu-item a { + border-bottom: 0; + display: block; + font-size: 0.8125em; + transition: border-color 0.2s ease-in-out; +} +.menu-item a:hover, +.menu-item a.menu-item-active { + background: var(--menu-item-bg-color); +} +.menu-item .fa, +.menu-item .fab, +.menu-item .far, +.menu-item .fas { + margin-right: 8px; +} +.menu-item .badge { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-left: 0.35em; + margin-top: 0.35em; + text-align: center; + white-space: nowrap; +} +@media (max-width: 767px) { + .menu-item .badge { + float: right; + margin-left: 0; + } +} +.use-motion .menu-item { + visibility: hidden; +} +.book-mark-link { + border-bottom: 0; + position: fixed; + top: -10px; + transition: top 0.3s; + right: 30px; +} +@media (max-width: 991px) { + .book-mark-link { + right: 20px; + } +} +@media (max-width: 991px) { + .book-mark-link { + display: none; + } +} +.book-mark-link::before { + color: #222; + font-size: 32px; + line-height: 1; + content: '\f02e'; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; +} +.book-mark-link:hover, +.book-mark-link-fixed { + top: -2px; +} +.github-corner :hover .octo-arm { + animation: octocat-wave 560ms ease-in-out; +} +.github-corner svg { + color: #fff; + fill: var(--theme-color); + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +@media (max-width: 991px) { + .github-corner { + display: none; + } + .github-corner svg { + color: var(--theme-color); + fill: #fff; + } + .github-corner .github-corner:hover .octo-arm { + animation: none; + } + .github-corner .github-corner .octo-arm { + animation: octocat-wave 560ms ease-in-out; + } +} +@keyframes octocat-wave { + 0%, 100% { + transform: rotate(0); + } + 20%, 60% { + transform: rotate(-25deg); + } + 40%, 80% { + transform: rotate(10deg); + } +} +.sidebar-inner { + color: #999; + padding: 18px 10px; + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; +} +.cc-license .cc-opacity { + border-bottom: 0; + opacity: 0.7; +} +.cc-license .cc-opacity:hover { + opacity: 0.9; +} +.cc-license img { + display: inline-block; +} +.site-author-image { + border: 1px solid #eee; + max-width: 120px; + padding: 2px; + border-radius: 50%; +} +.site-author-name { + color: var(--text-color); + font-weight: 600; + margin: 0; +} +.site-description { + color: #999; + font-size: 0.8125em; + margin-top: 0; +} +.links-of-author a { + font-size: 0.8125em; +} +.links-of-author .fa, +.links-of-author .fab, +.links-of-author .far, +.links-of-author .fas { + margin-right: 2px; +} +.sidebar .sidebar-button:not(:first-child) { + margin-top: 15px; +} +.sidebar .sidebar-button button { + background: transparent; + color: #fc6423; + cursor: pointer; + line-height: 2; + padding: 0 15px; + border: 1px solid #fc6423; + border-radius: 4px; +} +.sidebar .sidebar-button button:hover { + background: #fc6423; + color: #fff; +} +.sidebar .sidebar-button button .fa, +.sidebar .sidebar-button button .fab, +.sidebar .sidebar-button button .far, +.sidebar .sidebar-button button .fas { + margin-right: 5px; +} +.links-of-blogroll { + font-size: 0.8125em; +} +.links-of-blogroll-title { + font-size: 0.875em; + font-weight: 600; +} +.links-of-blogroll-list { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-nav { + font-size: 0.875em; + height: 0; + margin: 0; + overflow: hidden; + padding-left: 0; + pointer-events: none; + transition: 0.2s ease-in-out; + transition-property: height, visibility; + visibility: hidden; +} +.sidebar-nav-active .sidebar-nav { + height: calc(2em + 1px); + pointer-events: unset; + visibility: unset; +} +.sidebar-nav li { + border-bottom: 1px solid transparent; + color: var(--text-color); + cursor: pointer; + display: inline-block; + transition: 0.2s ease-in-out; + transition-property: border-bottom-color, color; +} +.sidebar-nav li.sidebar-nav-overview { + margin-left: 10px; +} +.sidebar-nav li:hover { + color: #fc6423; +} +.sidebar-toc-active .sidebar-nav-toc, +.sidebar-overview-active .sidebar-nav-overview { + border-bottom-color: #fc6423; + color: #fc6423; + transition-delay: 0.2s; +} +.sidebar-toc-active .sidebar-nav-toc:hover, +.sidebar-overview-active .sidebar-nav-overview:hover { + color: #fc6423; +} +.sidebar-panel-container { + align-items: start; + display: grid; + flex: 1; + overflow-x: hidden; + overflow-y: auto; + padding-top: 0; + transition: padding-top 0.2s ease-in-out; +} +.sidebar-nav-active .sidebar-panel-container { + padding-top: 20px; +} +.sidebar-panel { + animation: deactivate-sidebar-panel 0.2s ease-in-out; + grid-area: 1/1; + height: 0; + opacity: 0; + overflow: hidden; + pointer-events: none; + transform: translateY(0); + transition: 0.2s ease-in-out; + transition-delay: 0s; + transition-property: opacity, transform, visibility; + visibility: hidden; +} +.sidebar-nav-active .sidebar-panel, +.sidebar-overview-active .sidebar-panel.post-toc-wrap { + transform: translateY(-20px); +} +.sidebar-overview-active:not(.sidebar-nav-active) .sidebar-panel.post-toc-wrap { + transition-delay: 0s, 0.2s, 0s; +} +.sidebar-overview-active .sidebar-panel.site-overview-wrap, +.sidebar-toc-active .sidebar-panel.post-toc-wrap { + animation-name: activate-sidebar-panel; + height: auto; + opacity: 1; + pointer-events: unset; + transform: translateY(0); + transition-delay: 0.2s, 0.2s, 0s; + visibility: unset; +} +.sidebar-panel.site-overview-wrap { + display: flex; + flex-direction: column; + justify-content: center; + gap: 10px; + justify-content: flex-start; +} +@keyframes deactivate-sidebar-panel { + from { + height: var(--inactive-panel-height, 0); + } + to { + height: var(--active-panel-height, 0); + } +} +@keyframes activate-sidebar-panel { + from { + height: var(--inactive-panel-height, auto); + } + to { + height: var(--active-panel-height, auto); + } +} +.sidebar-toggle { + bottom: 61px; + height: 16px; + padding: 5px; + width: 16px; + background: #222; + cursor: pointer; + opacity: 0.6; + position: fixed; + z-index: 30; + right: 30px; +} +@media (max-width: 991px) { + .sidebar-toggle { + right: 20px; + } +} +.sidebar-toggle:hover { + opacity: 0.8; +} +@media (max-width: 991px) { + .sidebar-toggle { + opacity: 0.8; + } +} +.sidebar-toggle:hover .toggle-line { + background: #fc6423; +} +@media (any-hover: hover) { + body:not(.sidebar-active) .sidebar-toggle:hover :first-child { + left: 50%; + top: 2px; + transform: rotate(45deg); + width: 50%; + } + body:not(.sidebar-active) .sidebar-toggle:hover :last-child { + left: 50%; + top: -2px; + transform: rotate(-45deg); + width: 50%; + } +} +.sidebar-active .sidebar-toggle :nth-child(2) { + opacity: 0; +} +.sidebar-active .sidebar-toggle :first-child { + top: 6px; + transform: rotate(45deg); +} +.sidebar-active .sidebar-toggle :last-child { + top: -6px; + transform: rotate(-45deg); +} +.post-toc { + font-size: 0.875em; +} +.post-toc ol { + list-style: none; + margin: 0; + padding: 0 2px 0 10px; + text-align: left; +} +.post-toc ol > :last-child { + margin-bottom: 5px; +} +.post-toc ol > ol { + padding-left: 0; +} +.post-toc ol a { + transition: all 0.2s ease-in-out; +} +.post-toc .nav-item { + line-height: 1.8; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.post-toc .nav .nav-child { + --height: 0; + height: 0; + opacity: 0; + overflow: hidden; + transition-property: height, opacity, visibility; + transition: 0.2s ease-in-out; + visibility: hidden; +} +.post-toc .nav .active > .nav-child { + height: var(--height, auto); + opacity: 1; + visibility: unset; +} +.post-toc .nav .active > a { + border-bottom-color: #fc6423; + color: #fc6423; +} +.post-toc .nav .active-current > a { + color: #fc6423; +} +.post-toc .nav .active-current > a:hover { + color: #fc6423; +} +.site-state { + display: flex; + flex-wrap: wrap; + justify-content: center; + line-height: 1.4; +} +.site-state-item { + padding: 0 15px; +} +.site-state-item a { + border-bottom: 0; + display: block; +} +.site-state-item-count { + display: block; + font-size: 1em; + font-weight: 600; +} +.site-state-item-name { + color: #999; + font-size: 0.8125em; +} +.sidebar-post-related { + font-size: 0.8125em; + padding: 18px 0 0 0; +} +.popular-posts { + margin: 0; + padding: 1em 0; + text-align: left; +} +.popular-posts .popular-posts-item { + display: block; +} +.popular-posts .popular-posts-item .popular-posts-link { + border-bottom: 0; + display: block; + padding: 5px 20px; + transition: background 0.2s ease-in-out; +} +.popular-posts .popular-posts-item .popular-posts-link:hover { + background: var(--menu-item-bg-color); +} +.popular-posts .popular-posts-item .popular-posts-time { + color: #999; +} +.footer { + color: #999; + font-size: 0.875em; + padding: 20px 0; + transition: 0.2s ease-in-out; + transition-property: left, right; +} +.footer.footer-fixed { + bottom: 0; + left: 0; + position: absolute; + right: 0; +} +.footer-inner { + box-sizing: border-box; + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; + margin: 0 auto; + width: calc(100% - 20px); +} +@media (max-width: 767px) { + .footer-inner { + width: auto; + } +} +@media (min-width: 1200px) { + .footer-inner { + width: 1160px; + } +} +@media (min-width: 1600px) { + .footer-inner { + width: 73%; + } +} +.use-motion .footer { + opacity: 0; +} +.languages { + display: inline-block; + font-size: 1.125em; + position: relative; +} +.languages .lang-select-label span { + margin: 0 0.5em; +} +.languages .lang-select { + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + width: 100%; +} +.with-love { + color: #f00; + display: inline-block; + margin: 0 5px; + animation: icon-animate 1.33s ease-in-out infinite; +} +@keyframes icon-animate { + 0%, 100% { + transform: scale(1); + } + 10%, 30% { + transform: scale(0.9); + } + 20%, 40%, 60%, 80% { + transform: scale(1.1); + } + 50%, 70% { + transform: scale(1.1); + } +} +@media (max-width: 567px) { + .main-inner { + padding: initial !important; + } + .posts-expand .post-header { + margin-bottom: 10px !important; + } + .post-block { + margin-top: initial !important; + padding: 8px 18px 8px !important; + } + .post-body h1, + .post-body h2, + .post-body h3, + .post-body h4, + .post-body h5, + .post-body h6 { + margin: 20px 0 8px; + } + .post-body .note h1, + .post-body .tabs .tab-content .tab-pane h1, + .post-body .note h2, + .post-body .tabs .tab-content .tab-pane h2, + .post-body .note h3, + .post-body .tabs .tab-content .tab-pane h3, + .post-body .note h4, + .post-body .tabs .tab-content .tab-pane h4, + .post-body .note h5, + .post-body .tabs .tab-content .tab-pane h5, + .post-body .note h6, + .post-body .tabs .tab-content .tab-pane h6 { + margin: 0 5px; + } + .post-body > p { + margin: 0 0 10px; + } + .post-body .note > p, + .post-body .tabs .tab-content .tab-pane > p { + padding: 0 5px; + } + .post-body img, + .post-body video { + margin-bottom: 10px !important; + } + .post-body .image-caption, + .post-body img + figcaption, + .post-body .fancybox + figcaption { + margin: -5px auto 15px !important; + } + .post-body .note { + margin-bottom: 10px !important; + padding: 10px !important; + } + .post-body .tabs .tab-content .tab-pane { + padding: 10px 10px 0 !important; + } + .post-eof { + margin: 40px auto 20px !important; + } + .pagination { + margin-top: 40px; + } +} +.back-to-top { + font-size: 12px; + align-items: center; + bottom: -100px; + color: #fff; + display: flex; + height: 26px; + transition: bottom 0.2s ease-in-out; + background: #222; + cursor: pointer; + opacity: 0.6; + position: fixed; + z-index: 30; + right: 30px; +} +.back-to-top span { + margin-right: 8px; +} +.back-to-top .fa { + text-align: center; + width: 26px; +} +@media (max-width: 991px) { + .back-to-top { + right: 20px; + } +} +.back-to-top:hover { + opacity: 0.8; +} +@media (max-width: 991px) { + .back-to-top { + opacity: 0.8; + } +} +.back-to-top:hover { + color: #fc6423; +} +.back-to-top.back-to-top-on { + bottom: 30px; +} +.reading-progress-bar { + --progress: 0; + background: #37c6c0; + height: 3px; + position: fixed; + z-index: 50; + width: var(--progress); + left: 0; + top: 0; +} +.rtl.post-body p, +.rtl.post-body a, +.rtl.post-body h1, +.rtl.post-body h2, +.rtl.post-body h3, +.rtl.post-body h4, +.rtl.post-body h5, +.rtl.post-body h6, +.rtl.post-body li, +.rtl.post-body ul, +.rtl.post-body ol { + direction: rtl; + font-family: UKIJ Ekran; +} +.rtl.post-title { + font-family: UKIJ Ekran; +} +.post-button { + margin-top: 40px; + text-align: center; +} +.use-motion .post-block, +.use-motion .pagination, +.use-motion .comments { + visibility: hidden; +} +.use-motion .post-header { + visibility: hidden; +} +.use-motion .post-body { + visibility: hidden; +} +.use-motion .collection-header { + visibility: hidden; +} +.posts-collapse .post-content { + margin-bottom: 35px; + margin-left: 35px; + position: relative; +} +@media (max-width: 767px) { + .posts-collapse .post-content { + margin-left: 0; + margin-right: 0; + } +} +.posts-collapse .post-content .collection-title { + font-size: 1.125em; + position: relative; +} +.posts-collapse .post-content .collection-title::before { + background: #999; + border: 1px solid #fff; + margin-left: -6px; + margin-top: -4px; + position: absolute; + top: 50%; + border-radius: 50%; + content: ' '; + height: 10px; + width: 10px; +} +.posts-collapse .post-content .collection-year { + font-size: 1.5em; + font-weight: bold; + margin: 60px 0; + position: relative; +} +.posts-collapse .post-content .collection-year::before { + background: #bbb; + margin-left: -4px; + margin-top: -4px; + position: absolute; + top: 50%; + border-radius: 50%; + content: ' '; + height: 8px; + width: 8px; +} +.posts-collapse .post-content .collection-header { + display: block; + margin-left: 20px; +} +.posts-collapse .post-content .collection-header small { + color: #bbb; + margin-left: 5px; +} +.posts-collapse .post-content .post-header { + border-bottom: 1px dashed #ccc; + margin: 30px 2px 0; + padding-left: 15px; + position: relative; + transition: border 0.2s ease-in-out; +} +.posts-collapse .post-content .post-header::before { + background: #bbb; + border: 1px solid #fff; + left: -6px; + position: absolute; + top: 0.75em; + transition: background 0.2s ease-in-out; + border-radius: 50%; + content: ' '; + height: 6px; + width: 6px; +} +.posts-collapse .post-content .post-header:hover { + border-bottom-color: #666; +} +.posts-collapse .post-content .post-header:hover::before { + background: #222; +} +.posts-collapse .post-content .post-meta-container { + display: inline; + font-size: 0.75em; + margin-right: 10px; +} +.posts-collapse .post-content .post-title { + display: inline; +} +.posts-collapse .post-content .post-title a { + border-bottom: 0; + color: var(--link-color); +} +.posts-collapse .post-content .post-title .fa-external-link-alt { + font-size: 0.875em; + margin-left: 5px; +} +.posts-collapse .post-content::before { + background: #f5f5f5; + content: ' '; + height: 100%; + margin-left: -2px; + position: absolute; + top: 1.25em; + width: 4px; +} +.post-body { + font-family: Lato, 'PingFang SC', 'Microsoft YaHei', sans-serif; + overflow-wrap: break-word; +} +@media (min-width: 1200px) { + .post-body { + font-size: 1.125em; + } +} +@media (min-width: 992px) { + .post-body { + text-align: justify; + } +} +@media (max-width: 991px) { + .post-body { + text-align: justify; + } +} +.post-body h1 .header-anchor, +.post-body h2 .header-anchor, +.post-body h3 .header-anchor, +.post-body h4 .header-anchor, +.post-body h5 .header-anchor, +.post-body h6 .header-anchor, +.post-body h1 .headerlink, +.post-body h2 .headerlink, +.post-body h3 .headerlink, +.post-body h4 .headerlink, +.post-body h5 .headerlink, +.post-body h6 .headerlink { + border-bottom-style: none; + color: inherit; + float: right; + font-size: 0.875em; + margin-left: 10px; + opacity: 0; +} +.post-body h1 .header-anchor::before, +.post-body h2 .header-anchor::before, +.post-body h3 .header-anchor::before, +.post-body h4 .header-anchor::before, +.post-body h5 .header-anchor::before, +.post-body h6 .header-anchor::before, +.post-body h1 .headerlink::before, +.post-body h2 .headerlink::before, +.post-body h3 .headerlink::before, +.post-body h4 .headerlink::before, +.post-body h5 .headerlink::before, +.post-body h6 .headerlink::before { + content: '\f0c1'; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; +} +.post-body h1:hover .header-anchor, +.post-body h2:hover .header-anchor, +.post-body h3:hover .header-anchor, +.post-body h4:hover .header-anchor, +.post-body h5:hover .header-anchor, +.post-body h6:hover .header-anchor, +.post-body h1:hover .headerlink, +.post-body h2:hover .headerlink, +.post-body h3:hover .headerlink, +.post-body h4:hover .headerlink, +.post-body h5:hover .headerlink, +.post-body h6:hover .headerlink { + opacity: 0.5; +} +.post-body h1:hover .header-anchor:hover, +.post-body h2:hover .header-anchor:hover, +.post-body h3:hover .header-anchor:hover, +.post-body h4:hover .header-anchor:hover, +.post-body h5:hover .header-anchor:hover, +.post-body h6:hover .header-anchor:hover, +.post-body h1:hover .headerlink:hover, +.post-body h2:hover .headerlink:hover, +.post-body h3:hover .headerlink:hover, +.post-body h4:hover .headerlink:hover, +.post-body h5:hover .headerlink:hover, +.post-body h6:hover .headerlink:hover { + opacity: 1; +} +.post-body .exturl .fa { + font-size: 0.875em; + margin-left: 4px; +} +.post-body .image-caption, +.post-body img + figcaption, +.post-body .fancybox + figcaption { + color: #999; + font-size: 0.875em; + font-weight: bold; + line-height: 1; + margin: -15px auto 15px; + text-align: center; +} +.post-body iframe, +.post-body img, +.post-body video, +.post-body embed { + margin-bottom: 20px; +} +.post-body .video-container { + height: 0; + margin-bottom: 20px; + overflow: hidden; + padding-top: 75%; + position: relative; + width: 100%; +} +.post-body .video-container iframe, +.post-body .video-container object, +.post-body .video-container embed { + height: 100%; + left: 0; + margin: 0; + position: absolute; + top: 0; + width: 100%; +} +.post-gallery { + display: flex; + min-height: 200px; +} +.post-gallery .post-gallery-image { + flex: 1; +} +.post-gallery .post-gallery-image:not(:first-child) { + clip-path: polygon(40px 0, 100% 0, 100% 100%, 0 100%); + margin-left: -20px; +} +.post-gallery .post-gallery-image:not(:last-child) { + margin-right: -20px; +} +.post-gallery .post-gallery-image img { + height: 100%; + object-fit: cover; + opacity: 1; + width: 100%; +} +.posts-expand .post-gallery { + margin-bottom: 60px; +} +.posts-collapse .post-gallery { + margin: 15px 0; +} +.posts-expand .post-header { + font-size: 1.125em; + margin-bottom: 60px; + text-align: center; +} +.posts-expand .post-title { + font-size: 1.5em; + font-weight: normal; + margin: initial; + overflow-wrap: break-word; +} +.posts-expand .post-title-link { + border-bottom: 0; + color: var(--link-color); + display: inline-block; + position: relative; +} +.posts-expand .post-title-link::before { + background: var(--link-color); + bottom: 0; + content: ''; + height: 2px; + left: 0; + position: absolute; + transform: scaleX(0); + transition: transform 0.2s ease-in-out; + width: 100%; +} +.posts-expand .post-title-link:hover::before { + transform: scaleX(1); +} +.posts-expand .post-title-link .fa-external-link-alt { + font-size: 0.875em; + margin-left: 5px; +} +.post-sticky-flag { + display: inline-block; + margin-right: 8px; + transform: rotate(30deg); +} +.posts-expand .post-meta-container { + color: #999; + font-family: Lato, 'PingFang SC', 'Microsoft YaHei', sans-serif; + font-size: 0.75em; + margin-top: 3px; +} +.posts-expand .post-meta-container .post-description { + font-size: 0.875em; + margin-top: 2px; +} +.posts-expand .post-meta-container time { + border-bottom: 1px dashed #999; +} +.post-meta { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +:not(.post-meta-break) + .post-meta-item::before { + content: '|'; + margin: 0 0.5em; +} +.post-meta-item-icon { + margin-right: 3px; +} +@media (max-width: 991px) { + .post-meta-item-text { + display: none; + } +} +.post-meta-break { + flex-basis: 100%; + height: 0; +} +.post-nav { + border-top: 1px solid #eee; + display: flex; + gap: 30px; + justify-content: space-between; + margin-top: 1em; + padding: 10px 5px 0; +} +.post-nav-item { + flex: 1; +} +.post-nav-item a { + border-bottom: 0; + display: block; + font-size: 0.875em; + line-height: 1.6; +} +.post-nav-item a:active { + top: 2px; +} +.post-nav-item .fa { + font-size: 0.75em; +} +.post-nav-item:first-child .fa { + margin-right: 5px; +} +.post-nav-item:last-child { + text-align: right; +} +.post-nav-item:last-child .fa { + margin-left: 5px; +} +.post-footer { + display: flex; + flex-direction: column; + justify-content: center; +} +.post-eof { + background: #ccc; + height: 1px; + margin: 80px auto 60px; + width: 8%; +} +.post-block:last-of-type .post-eof { + display: none; +} +.post-copyright ul { + list-style: none; + overflow: hidden; + padding: 0.5em 1em; + position: relative; + background: var(--card-bg-color); + border-left: 3px solid #ff2a2a; + margin: 1em 0 0; +} +.post-copyright ul::after { + content: '\f25e'; + font-family: 'Font Awesome 6 Brands'; + font-size: 200px; + opacity: 0.1; + position: absolute; + right: -50px; + top: -150px; +} +.post-tags { + margin-top: 40px; + text-align: center; +} +.post-tags a { + display: inline-block; + font-size: 0.8125em; +} +.post-tags a:not(:last-child) { + margin-right: 10px; +} +.social-like { + border-top: 1px solid #eee; + font-size: 0.875em; + margin-top: 1em; + padding-top: 1em; + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.social-like a { + border-bottom: none; +} +.reward-container { + margin: 1em 0 0; + padding: 1em 0; + text-align: center; +} +.reward-container button { + background: transparent; + color: #fc6423; + cursor: pointer; + line-height: 2; + padding: 0 15px; + border: 2px solid #fc6423; + border-radius: 2px; + outline: 0; + transition: all 0.2s ease-in-out; + vertical-align: text-top; +} +.reward-container button:hover { + background: #fc6423; + color: #fff; +} +.post-reward { + display: none; + padding-top: 20px; +} +.post-reward.active { + display: block; +} +.post-reward div { + display: inline-block; +} +.post-reward div span { + display: block; +} +.post-reward img { + display: inline-block; + margin: 0.8em 2em 0; + max-width: 100%; + width: 180px; +} +@keyframes next-roll { + from { + transform: rotateZ(30deg); + } + to { + transform: rotateZ(-30deg); + } +} +.category-all-page .category-all-title { + text-align: center; +} +.category-all-page .category-all { + margin-top: 20px; +} +.category-all-page .category-list { + list-style: none; + margin: 0; + padding: 0; +} +.category-all-page .category-list-item { + margin: 5px 10px; +} +.category-all-page .category-list-count { + color: #bbb; +} +.category-all-page .category-list-count::before { + content: ' ('; +} +.category-all-page .category-list-count::after { + content: ') '; +} +.category-all-page .category-list-child { + padding-left: 10px; +} +.event-list hr { + background: #222; + margin: 20px 0 45px; +} +.event-list hr::after { + background: #222; + color: #fff; + content: 'NOW'; + display: inline-block; + font-weight: bold; + padding: 0 5px; +} +.event-list .event { + --event-background: #222; + --event-foreground: #bbb; + --event-title: #fff; + background: var(--event-background); + padding: 15px; +} +.event-list .event .event-summary { + border-bottom: 0; + color: var(--event-title); + margin: 0; + padding: 0 0 0 35px; + position: relative; +} +.event-list .event .event-summary::before { + animation: dot-flash 1s alternate infinite ease-in-out; + background: var(--event-title); + left: 0; + margin-top: -6px; + position: absolute; + top: 50%; + border-radius: 50%; + content: ' '; + height: 12px; + width: 12px; +} +.event-list .event:nth-of-type(odd) .event-summary::before { + animation-delay: 0.5s; +} +.event-list .event:not(:last-child) { + margin-bottom: 20px; +} +.event-list .event .event-relative-time { + color: var(--event-foreground); + display: inline-block; + font-size: 12px; + font-weight: normal; + padding-left: 12px; +} +.event-list .event .event-details { + color: var(--event-foreground); + display: block; + line-height: 18px; + padding: 6px 0 6px 35px; +} +.event-list .event .event-details::before { + color: var(--event-foreground); + display: inline-block; + margin-right: 9px; + width: 14px; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; +} +.event-list .event .event-details.event-location::before { + content: '\f041'; +} +.event-list .event .event-details.event-duration::before { + content: '\f017'; +} +.event-list .event .event-details.event-description::before { + content: '\f024'; +} +.event-list .event-past { + --event-background: #f5f5f5; + --event-foreground: #999; + --event-title: #222; +} +@keyframes dot-flash { + from { + opacity: 1; + transform: scale(1); + } + to { + opacity: 0; + transform: scale(0.8); + } +} +ul.breadcrumb { + font-size: 0.75em; + list-style: none; + margin: 1em 0; + padding: 0 2em; + text-align: center; +} +ul.breadcrumb li { + display: inline; +} +ul.breadcrumb li:not(:first-child)::before { + content: '/\00a0'; + font-weight: normal; + padding: 0.5em; +} +ul.breadcrumb li:last-child { + font-weight: bold; +} +.tag-cloud { + text-align: center; +} +.tag-cloud a { + display: inline-block; + margin: 10px; +} +.tag-cloud-0 { + border-bottom-color: #aaa; + color: #aaa; +} +.tag-cloud-1 { + border-bottom-color: #9a9a9a; + color: #9a9a9a; +} +.tag-cloud-2 { + border-bottom-color: #8b8b8b; + color: #8b8b8b; +} +.tag-cloud-3 { + border-bottom-color: #7c7c7c; + color: #7c7c7c; +} +.tag-cloud-4 { + border-bottom-color: #6c6c6c; + color: #6c6c6c; +} +.tag-cloud-5 { + border-bottom-color: #5d5d5d; + color: #5d5d5d; +} +.tag-cloud-6 { + border-bottom-color: #4e4e4e; + color: #4e4e4e; +} +.tag-cloud-7 { + border-bottom-color: #3e3e3e; + color: #3e3e3e; +} +.tag-cloud-8 { + border-bottom-color: #2f2f2f; + color: #2f2f2f; +} +.tag-cloud-9 { + border-bottom-color: #202020; + color: #202020; +} +.tag-cloud-10 { + border-bottom-color: #111; + color: #111; +} +@media (prefers-color-scheme: dark) { + .tag-cloud-0 { + border-bottom-color: #555; + color: #555; + } + .tag-cloud-1 { + border-bottom-color: #646464; + color: #646464; + } + .tag-cloud-2 { + border-bottom-color: #737373; + color: #737373; + } + .tag-cloud-3 { + border-bottom-color: #828282; + color: #828282; + } + .tag-cloud-4 { + border-bottom-color: #929292; + color: #929292; + } + .tag-cloud-5 { + border-bottom-color: #a1a1a1; + color: #a1a1a1; + } + .tag-cloud-6 { + border-bottom-color: #b0b0b0; + color: #b0b0b0; + } + .tag-cloud-7 { + border-bottom-color: #c0c0c0; + color: #c0c0c0; + } + .tag-cloud-8 { + border-bottom-color: #cfcfcf; + color: #cfcfcf; + } + .tag-cloud-9 { + border-bottom-color: #dedede; + color: #dedede; + } + .tag-cloud-10 { + border-bottom-color: #eee; + color: #eee; + } +} +.search-active { + overflow: hidden; +} +.search-pop-overlay { + background: rgba(0,0,0,0); + display: flex; + height: 100%; + left: 0; + position: fixed; + top: 0; + transition: visibility 0.4s, background 0.4s; + visibility: hidden; + width: 100%; + z-index: 40; +} +.search-active .search-pop-overlay { + background: rgba(0,0,0,0.3); + visibility: visible; +} +.search-popup { + background: var(--card-bg-color); + border-radius: 5px; + height: 80%; + margin: auto; + transform: scale(0); + transition: transform 0.4s; + width: 700px; +} +.search-active .search-popup { + transform: scale(1); +} +@media (max-width: 767px) { + .search-popup { + border-radius: 0; + height: 100%; + width: 100%; + } +} +.search-popup .search-icon, +.search-popup .popup-btn-close { + color: #999; + font-size: 18px; + padding: 0 10px; +} +.search-popup .popup-btn-close { + cursor: pointer; +} +.search-popup .popup-btn-close:hover .fa { + color: #222; +} +.search-popup .search-header { + background: #eee; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + display: flex; + padding: 5px; +} +@media (prefers-color-scheme: dark) { + .search-popup .search-header { + background: #666; + } +} +.search-popup input.search-input { + background: transparent; + border: 0; + outline: 0; + width: 100%; +} +.search-popup input.search-input::-webkit-search-cancel-button { + display: none; +} +.search-popup .search-result-container { + height: calc(100% - 55px); + overflow: auto; + padding: 5px 25px; +} +.search-popup .search-result-container hr { + margin: 5px 0 10px; +} +.search-popup .search-result-container hr:first-child { + display: none; +} +.search-popup .search-result-list { + margin: 0 5px; + padding: 0; +} +.search-popup a.search-result-title { + font-weight: bold; +} +.search-popup p.search-result { + border-bottom: 1px dashed #ccc; + padding: 5px 0; +} +.search-popup .search-input-container { + flex-grow: 1; + padding: 2px; +} +.search-popup .no-result { + display: flex; +} +.search-popup .search-result-list { + width: 100%; +} +.search-popup .search-result-icon { + color: #ccc; + margin: auto; +} +mark.search-keyword { + background: transparent; + border-bottom: 1px dashed #ff2a2a; + color: #ff2a2a; + font-weight: bold; +} +.use-motion .animated { + animation-fill-mode: none; + visibility: inherit; +} +.use-motion .sidebar .animated { + animation-fill-mode: both; +} +header.header { + background: var(--content-bg-color); + border-radius: initial; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12); +} +@media (max-width: 991px) { + header.header { + border-radius: initial; + } +} +.main { + align-items: stretch; + display: flex; + justify-content: space-between; + margin: 0 auto; + width: calc(100% - 20px); +} +@media (max-width: 767px) { + .main { + width: auto; + } +} +@media (min-width: 1200px) { + .main { + width: 1160px; + } +} +@media (min-width: 1600px) { + .main { + width: 73%; + } +} +@media (max-width: 991px) { + .main { + display: block; + width: auto; + } +} +.main-inner { + border-radius: initial; + box-sizing: border-box; + width: calc(100% - 252px); +} +@media (max-width: 991px) { + .main-inner { + border-radius: initial; + width: 100%; + } +} +.footer-inner { + padding-left: 252px; +} +@media (max-width: 991px) { + .footer-inner { + padding-left: 0; + padding-right: 0; + width: auto; + } +} +.column { + width: 240px; +} +@media (max-width: 991px) { + .column { + width: auto; + } +} +.site-brand-container { + background: var(--theme-color); +} +@media (max-width: 991px) { + .site-nav-on .site-brand-container { + box-shadow: 0 0 16px rgba(0,0,0,0.5); + } +} +.site-meta { + padding: 20px 0; +} +@media (min-width: 768px) and (max-width: 991px) { + .site-nav-toggle, + .site-nav-right { + display: flex; + flex-direction: column; + justify-content: center; + } +} +.site-nav-toggle .toggle, +.site-nav-right .toggle { + color: #fff; +} +.site-nav-toggle .toggle .toggle-line, +.site-nav-right .toggle .toggle-line { + background: #fff; +} +@media (min-width: 768px) and (max-width: 991px) { + .site-nav { + --scroll-height: 0; + height: 0; + overflow: hidden; + transition: 0.2s ease-in-out; + transition-property: height, visibility; + visibility: hidden; + } + body:not(.site-nav-on) .site-nav .animated { + animation: none; + } + body.site-nav-on .site-nav { + height: var(--scroll-height); + visibility: unset; + } +} +.menu .menu-item { + display: block; + margin: 0; +} +.menu .menu-item a { + padding: 5px 20px; + position: relative; + text-align: left; + transition-property: background-color; +} +@media (max-width: 991px) { + .menu .menu-item.menu-item-search { + display: none; + } +} +.menu .menu-item .badge { + background: #ccc; + border-radius: 10px; + color: var(--content-bg-color); + float: right; + padding: 2px 5px; + text-shadow: 1px 1px 0 rgba(0,0,0,0.1); +} +.main-menu .menu-item-active::after { + background: #bbb; + border-radius: 50%; + content: ' '; + height: 6px; + margin-top: -3px; + position: absolute; + right: 15px; + top: 50%; + width: 6px; +} +.sub-menu { + margin: 0; + padding: 6px 0; +} +.sub-menu .menu-item { + display: inline-block; +} +.sub-menu .menu-item a { + background: transparent; + margin: 5px 10px; + padding: initial; +} +.sub-menu .menu-item a:hover { + background: transparent; + color: #fc6423; +} +.sub-menu .menu-item-active { + border-bottom-color: #fc6423; + color: #fc6423; +} +.sub-menu .menu-item-active:hover { + border-bottom-color: #fc6423; +} +.sidebar { + position: -webkit-sticky; + position: sticky; + top: 12px; +} +@media (max-width: 991px) { + .sidebar { + display: none; + } +} +.sidebar-inner { + background: var(--content-bg-color); + border-radius: initial; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09); + box-sizing: border-box; + color: var(--text-color); + margin-top: 12px; + max-height: calc(100vh - 24px); + visibility: hidden; +} +.site-state-item { + padding: 0 10px; +} +.sidebar .sidebar-button { + border-bottom: 1px dotted #ccc; + border-top: 1px dotted #ccc; +} +.sidebar .sidebar-button button { + border: 0; + color: #fc6423; + display: block; + width: 100%; +} +.sidebar .sidebar-button button:hover { + background: none; + border: 0; + color: #e34603; +} +.links-of-author { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.links-of-author-item { + margin: 5px 0 0; + width: 50%; +} +.links-of-author-item a { + box-sizing: border-box; + display: inline-block; + max-width: 100%; + overflow: hidden; + padding: 0 5px; + text-overflow: ellipsis; + white-space: nowrap; +} +.links-of-author-item a { + border-bottom: 0; + border-radius: 4px; + display: block; +} +.links-of-author-item a:hover { + background: var(--body-bg-color); +} +.main-inner .sub-menu, +.main-inner .post-block, +.main-inner .tabs-comment, +.main-inner > .comments, +.main-inner .comment-position .comments, +.main-inner .pagination { + background: var(--content-bg-color); + border-radius: initial; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12); +} +.main-inner .post-block:not(:first-child):not(:first-child) { + border-radius: initial; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09); + margin-top: 12px; +} +@media (min-width: 768px) and (max-width: 991px) { + .main-inner .post-block:not(:first-child):not(:first-child) { + margin-top: 10px; + } +} +@media (max-width: 767px) { + .main-inner .post-block:not(:first-child):not(:first-child) { + margin-top: 8px; + } +} +.main-inner .tabs-comment, +.main-inner > .comments, +.main-inner .comment-position .comments, +.main-inner .pagination { + border-radius: initial; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09); + margin-top: 12px; +} +@media (min-width: 768px) and (max-width: 991px) { + .main-inner .tabs-comment, + .main-inner > .comments, + .main-inner .comment-position .comments, + .main-inner .pagination { + margin-top: 10px; + } +} +@media (max-width: 767px) { + .main-inner .tabs-comment, + .main-inner > .comments, + .main-inner .comment-position .comments, + .main-inner .pagination { + margin-top: 8px; + } +} +.post-block, +.comments { + padding: 40px; +} +.post-eof { + display: none; +} +.pagination { + border-top: initial; + padding: 10px 0; +} +.post-body h1, +.post-body h2 { + border-bottom: 1px solid #eee; +} +.post-body h3 { + border-bottom: 1px dotted #eee; +} +@media (min-width: 768px) and (max-width: 991px) { + .main-inner { + padding: 10px; + } + .posts-expand .post-button { + margin-top: 20px; + } + .post-block { + padding: 20px; + } + .comments { + padding: 10px 20px; + } +} +@media (max-width: 767px) { + .main-inner { + padding: 8px; + } + .posts-expand .post-button { + margin: 12px 0; + } + .post-block { + padding: 12px; + } + .comments { + padding: 10px 12px; + } +} +.sidebar-panel-container { + user-select: none; +} +.book-mark-link { + display: none; +} +.footer-inner { + text-align: center; +} +.archive .collection-title { + display: none !important; +} diff --git a/docs/blog/css/noscript.css b/docs/blog/css/noscript.css new file mode 100644 index 0000000..6418c57 --- /dev/null +++ b/docs/blog/css/noscript.css @@ -0,0 +1,48 @@ +body { + margin-top: 2rem; +} +.use-motion .menu-item, +.use-motion .sidebar, +.use-motion .sidebar-inner, +.use-motion .post-block, +.use-motion .pagination, +.use-motion .comments, +.use-motion .post-header, +.use-motion .post-body, +.use-motion .collection-header { + visibility: visible; +} +.use-motion .column, +.use-motion .site-brand-container .toggle, +.use-motion .footer { + opacity: initial; +} +.use-motion .site-title, +.use-motion .site-subtitle, +.use-motion .custom-logo-image { + opacity: initial; + top: initial; +} +.use-motion .logo-line { + transform: scaleX(1); +} +.search-pop-overlay, +.sidebar-nav { + display: none; +} +.sidebar-panel { + display: block; +} +.noscript-warning { + background-color: #f55; + color: #fff; + font-family: sans-serif; + font-size: 1rem; + font-weight: bold; + left: 0; + position: fixed; + text-align: center; + top: 0; + width: 100%; + z-index: 50; +} diff --git a/docs/blog/images/apple-touch-icon-next.png b/docs/blog/images/apple-touch-icon-next.png new file mode 100644 index 0000000000000000000000000000000000000000..86a0d1d33bc2ae8a0416ebba67d1bbb60aa29c38 GIT binary patch literal 1544 zcmV+j2KV`iP)Px#OHfQyMIs_1FE20E)zv2_C(h2!$jHdT!ovUm|GT@p zWo2de_xJq#{8d#|IyyQ>M@Qx533`J9dBE>4W{r{KFjMLpp4N$2iMRJCGfPM7@le{)BPzVgz zp?ByVdWYVj|4-=tUS5SkR}Te{-Fr#UrxsqJ9+ed6YY9KmoXq6n^B9DRMwF@T2u)qH z!=wh-sAdPH_8fFy0-I1d68Zp);!FTtdweUZc2nr)?5^hh99w*FOU z@NYFT^!v%iPrGly0Q*+sLVtesYh+the|AET4WK8lR^dv1IZ-3FhAuiK5V|-?gf2#j z&_yW`x^K3G&OKl4kP$$ih@p!?B6M+)2(4Rz(6$=G6WT(;6uP)cgkEi(xI(Yi7`D(w zo(Y6r>FyarFV`4e&^@lk@PfWf|DSeM5}?agV`>aDXt-c%3^!*Ij0g0Q8X5*mjbRC$9oB0MOK51O_53LU8p`RzcozW; zx3wC>721@58xhdzx?E$}LW9xpjUu4UhOZO>Z8Us+D+1bR_}&sQXJ}B}yadb|8fraT zV|YUw4WF(>KpPF;mjp}*eTo5XG<+u!&}PFoihwq!uhI`XPYZ1{e1FDs0nqR?Ym5YF zqv0DwK${KUMFjNpqb>9(0vg8Y^d$otmiJc}L#s|8wD~Z~fHtQu8PG6DgwAq-&}PFY z1KMo(WI!7YpAcwxN`zJiV(2pgG_<|npE+y^Z8UsBppAx42(;Po$$&N*J{izP!?y+W zi2YsL=fkK`KXsymhWcmL#_y-S*Y&V_u#us^S9pDvbMSkxv7uidoc36Qa`CQ+5AC^d z=CTJ%0ZkrQ=v?t(E_)>OCL8YaU+nX$$--iAUNb;m^jBG2!5*5enU|exmY3aQcv=O- znjO}ft-yw2|VZs2g-W`Epf@n*5gsJ2LLtC^nFlq8+?%Xc!{Z3_|hFI~!oeU$ep z%4jE9Y9n1{ah68@W{++)8|fc~HIM4)QycHpg}3P<_K$M$L~}7jBXs?6bDwjvo+I;D zsoi}398La6+~*osM@45l#ptQ6MrZFz597*no3v)ffsUEletxWeW~`A+ntYvaeQj?e z*kSqGXZsrrhZ>IsxH$({IR{z11zkG`GR^j$#{%z41lp5(Ne#glJc5nj-BUaKR!X?# zzN6F-<0?&z;|30?9q0Z}oHG*G)Q)s%Db~RbjMU)mp-u&Dmm0zkF~o9eRh}p?ByVnjn4wmEZ*c=^{+H00012dQ@0+Qek%>aB^>E zX>4U6ba`-PAZc)PV*mhnoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5BNI!L6ay0=M1VBI uWCJ6!R3OXP)X2ol#2my2%YaCrN-hBE7ZG&wLN%2D0000`v literal 0 HcmV?d00001 diff --git a/docs/blog/images/avatar.gif b/docs/blog/images/avatar.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b5d744b17ae541e331e9296640f0418d4e7c821 GIT binary patch literal 1785 zcmc(eiCfYK1Au>kC}AoSube4(tj%1XGs-IqwL{J4`&#nMW_^ZNl2cuo5V((w@KF|BSr-Dy?Ci?Qibx<>SXfwIUgogbVv$IpPzd>aHjAZHDkmh84Xt*5 zetu+ln8)SL&&~0%H{C|LeZF5GCnaWl}%00$Q845^9#jbGjmg0YYZq% z1HxF_nwpz|7kNflF9N9Q5iJvD0w&0S9`em0*f}BgKh?c=3?YfFSYWEn(AG8D&f9}T zF|^Ozg(s2g21~=--BqP2;U+HbKfJ-6t^Mpd+Vd(rH9aPG>VjZaYzrEFkzM1W4W*?PEbt7_?0ObX=R3 zfm*vF0T2e?IaX0s7omGCFNR2kL@?w2C0yDOh`J7v?|JOT+#U{?U0_{uqpk}`=r+VP zC12fo8O3{HxoZwDCgwbOZNi&VzKT}`9?t!=AVtC=y%<;l+psDMv*su+IEO5Q?TgN0 z=&H7$Gf?L=qqi5`@bimQ^6tFqKOeh&ck{=aiDvo7nlqFv&4wkwGeO}maQB{~k%?ck zE7Cdok^c8R9AM5IP1JJ)~Cz5Sv{>KNvX5%lB* z9%4%%UT_Wehfmg@gc%I&MaBNNZg03yUt|q!t%QXZJ9njhaoqbXT&%>qob*i$7vJ9{ z<5xiO5wWzi1105!#^PQCsto8sM4BepmIPkI5zoZ?*-1r_m8zst+M_T+_C9c`BdGyZ z()dMh4bJ_{K1iXtN>KzH?;xb$$ACsu8o5!>Fp}gw-jJ7^zUL{9PKe8II{SSj5atkhyp)&z8{9L0;5~dN8IV%e^8!Cm#@R*x{T5QR+y!yez%{*GTHhd}S&e?yi8`c_py&b`IA#{jM67?2A- z96X6KMj50BNJHBI?9Zj78OXyk^6Q>ufCnUfBpmb@X3fgX_M_S)8KAM>*1*t+*UyZc z^4w;`mO~qzDlqH`0`+#Ffh1i?m ztGf;Harv-B6uCo0TB=_qclsj^84AC_7^!(v;Oi5;Kl$z+X{K*fpE(N zWyVw!0PLHXpb*M(Bl@dIQsB%LhJP-?;tE={h{Y(QpYjdD9`hDbfEiJN) znh_Ry7j#5m>=)N|?3XDh_r1_zMIHc&wJ0=9`=ky7CuDT$ia(uo`t1DDrGgKeCI{e@ z{!P0)EBNAc7g6Tp|0X`9!<~%Y?miKrA{MDPqrRMh1+NgBt?oT@PRlxMyn2}v=_`HO z`{&U{yA!^h75UlWQ#)`T_pCemHpYGaJuhRu^ZY~){h#)L$)<4Zd(gT$0zX0)xk sj2>F=QOaOm@==$w^6D`S!9xiV>IXt*{ozi=Q1Vaehf=%aC;;&N3lE276aWAK literal 0 HcmV?d00001 diff --git a/docs/blog/images/avatar.jpg b/docs/blog/images/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c919869ab2307a02b6eb595a0d4b615c7db03fb GIT binary patch literal 43313 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 literal 0 HcmV?d00001 diff --git a/docs/blog/images/favicon-16x16-next.png b/docs/blog/images/favicon-16x16-next.png new file mode 100644 index 0000000000000000000000000000000000000000..de8c5d3a5f8215c3f7b095c9e284e061bda65f86 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%A+0*}aIAe|4wj2{=>aRxHH1AIbUeKHFb!9Yn#DLy_vBO^maMdk0`zd#Zw z0tY~@yu3V6p{Ay$mX_Az$B+O0`?r4m`qisfPnj~MwY3$f@^9nqaG!lvI6;x#X;^) z4C~IxyaaMM3p^r=f%IJvW-JI^#13S11^9%x`eYU=fq|TyoQjGHgbgIWfB*jF%NI8{ zx2;>Zu3x`iO-&6bs0aoM3JPUqWq0n}*}Qo(P|Le_@AmKC57(%ytPE5IHwwrGiqzKD z{{8#c)YSCg!Gk}3{P_R>|Gj(no6k4eJyZq^Jd4Jw%*zpM57yY9pK zMcQgs21j>QigM54W!RCVazM0UCtHDVhG46xh5pA!(TqDDnlwLEm~eRS(JM@6p3293 zNMwDW(!P~x!s$%jghh-wOB)P19fJ88oOHECttPa5*~LF^Vp#0%pwrbyN~~|szWB|o z_J4%n&U>rEu5s2%I6jof{A;(j!|>g|;yo?%ZfFGheBJp^9_Zijs*s41pu}>8f};Gi z%$!t(lFEWqh0KDIWCn(cIgdZ_a1@4VXq@stea7=?5CgL^w_Y;0u(GiCWD#az1(ybs x!zs+ln?n>%-?(z($eANDN7zp{cr5VJV|XPlSn|oqbSlsa22WQ%mvv4FO#p=N1nU3* literal 0 HcmV?d00001 diff --git a/docs/blog/images/logo.svg b/docs/blog/images/logo.svg new file mode 100644 index 0000000..992c1a5 --- /dev/null +++ b/docs/blog/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/blog/index.html b/docs/blog/index.html new file mode 100644 index 0000000..aa7102d --- /dev/null +++ b/docs/blog/index.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + + +
+

+ +

+ + +
+ + + + +
+

整理的关于 .NET Framework 和 ASP.NET 的一些面试问答。

+ +
+ + 阅读全文 » + +
+ + + +
+ + + + + +
+
+ +
+
+
+ + + + + + + +
+ + + +
+ + + + + + + +
+

+ +

+ + +
+ + + + +
+

+ +
+ + 阅读全文 » + +
+ + + +
+ + + + + +
+
+ +
+
+
+ + + + + +
+
+ +
+ +
+ + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/js/bookmark.js b/docs/blog/js/bookmark.js new file mode 100644 index 0000000..8e3ae6a --- /dev/null +++ b/docs/blog/js/bookmark.js @@ -0,0 +1,56 @@ +/* global CONFIG */ + +document.addEventListener('DOMContentLoaded', () => { + 'use strict'; + + const doSaveScroll = () => { + localStorage.setItem('bookmark' + location.pathname, window.scrollY); + }; + + const scrollToMark = () => { + let top = localStorage.getItem('bookmark' + location.pathname); + top = parseInt(top, 10); + // If the page opens with a specific hash, just jump out + if (!isNaN(top) && location.hash === '') { + // Auto scroll to the position + window.anime({ + targets : document.scrollingElement, + duration : 200, + easing : 'linear', + scrollTop: top + }); + } + }; + // Register everything + const init = function(trigger) { + // Create a link element + const link = document.querySelector('.book-mark-link'); + // Scroll event + window.addEventListener('scroll', () => link.classList.toggle('book-mark-link-fixed', window.scrollY === 0), { passive: true }); + // Register beforeunload event when the trigger is auto + if (trigger === 'auto') { + // Register beforeunload event + window.addEventListener('beforeunload', doSaveScroll); + document.addEventListener('pjax:send', doSaveScroll); + } + // Save the position by clicking the icon + link.addEventListener('click', () => { + doSaveScroll(); + window.anime({ + targets : link, + duration: 200, + easing : 'linear', + top : -30, + complete: () => { + setTimeout(() => { + link.style.top = ''; + }, 400); + } + }); + }); + scrollToMark(); + document.addEventListener('pjax:success', scrollToMark); + }; + + init(CONFIG.bookmark.save); +}); diff --git a/docs/blog/js/comments.js b/docs/blog/js/comments.js new file mode 100644 index 0000000..4045e8c --- /dev/null +++ b/docs/blog/js/comments.js @@ -0,0 +1,21 @@ +/* global CONFIG */ + +window.addEventListener('tabs:register', () => { + let { activeClass } = CONFIG.comments; + if (CONFIG.comments.storage) { + activeClass = localStorage.getItem('comments_active') || activeClass; + } + if (activeClass) { + const activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`); + if (activeTab) { + activeTab.click(); + } + } +}); +if (CONFIG.comments.storage) { + window.addEventListener('tabs:click', event => { + if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return; + const commentClass = event.target.classList[1]; + localStorage.setItem('comments_active', commentClass); + }); +} diff --git a/docs/blog/js/config.js b/docs/blog/js/config.js new file mode 100644 index 0000000..caa0075 --- /dev/null +++ b/docs/blog/js/config.js @@ -0,0 +1,66 @@ +if (!window.NexT) window.NexT = {}; + +(function() { + const className = 'next-config'; + + const staticConfig = {}; + let variableConfig = {}; + + const parse = text => JSON.parse(text || '{}'); + + const update = name => { + const targetEle = document.querySelector(`.${className}[data-name="${name}"]`); + if (!targetEle) return; + const parsedConfig = parse(targetEle.text); + if (name === 'main') { + Object.assign(staticConfig, parsedConfig); + } else { + variableConfig[name] = parsedConfig; + } + }; + + update('main'); + + window.CONFIG = new Proxy({}, { + get(overrideConfig, name) { + let existing; + if (name in staticConfig) { + existing = staticConfig[name]; + } else { + if (!(name in variableConfig)) update(name); + existing = variableConfig[name]; + } + + // For unset override and mixable existing + if (!(name in overrideConfig) && typeof existing === 'object') { + // Get ready to mix. + overrideConfig[name] = {}; + } + + if (name in overrideConfig) { + const override = overrideConfig[name]; + + // When mixable + if (typeof override === 'object' && typeof existing === 'object') { + // Mix, proxy changes to the override. + return new Proxy({ ...existing, ...override }, { + set(target, prop, value) { + target[prop] = value; + override[prop] = value; + return true; + } + }); + } + + return override; + } + + // Only when not mixable and override hasn't been set. + return existing; + } + }); + + document.addEventListener('pjax:success', () => { + variableConfig = {}; + }); +})(); diff --git a/docs/blog/js/motion.js b/docs/blog/js/motion.js new file mode 100644 index 0000000..aad22db --- /dev/null +++ b/docs/blog/js/motion.js @@ -0,0 +1,140 @@ +/* global NexT, CONFIG */ + +NexT.motion = {}; + +NexT.motion.integrator = { + queue: [], + init : function() { + this.queue = []; + return this; + }, + add: function(fn) { + const sequence = fn(); + if (CONFIG.motion.async) this.queue.push(sequence); + else this.queue = this.queue.concat(sequence); + return this; + }, + bootstrap: function() { + if (!CONFIG.motion.async) this.queue = [this.queue]; + this.queue.forEach(sequence => { + const timeline = window.anime.timeline({ + duration: 200, + easing : 'linear' + }); + sequence.forEach(item => { + if (item.deltaT) timeline.add(item, item.deltaT); + else timeline.add(item); + }); + }); + } +}; + +NexT.motion.middleWares = { + header: function() { + const sequence = []; + + function getMistLineSettings(targets) { + sequence.push({ + targets, + scaleX : [0, 1], + duration: 500, + deltaT : '-=200' + }); + } + + function pushToSequence(targets, sequenceQueue = false) { + sequence.push({ + targets, + opacity: 1, + top : 0, + deltaT : sequenceQueue ? '-=200' : '-=0' + }); + } + + pushToSequence('.column'); + CONFIG.scheme === 'Mist' && getMistLineSettings('.logo-line'); + CONFIG.scheme === 'Muse' && pushToSequence('.custom-logo-image'); + pushToSequence('.site-title'); + pushToSequence('.site-brand-container .toggle', true); + pushToSequence('.site-subtitle'); + (CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') && pushToSequence('.custom-logo-image'); + + const menuItemTransition = CONFIG.motion.transition.menu_item; + if (menuItemTransition) { + document.querySelectorAll('.menu-item').forEach(targets => { + sequence.push({ + targets, + complete: () => targets.classList.add('animated', menuItemTransition), + deltaT : '-=200' + }); + }); + } + + return sequence; + }, + + subMenu: function() { + const subMenuItem = document.querySelectorAll('.sub-menu .menu-item'); + if (subMenuItem.length > 0) { + subMenuItem.forEach(element => { + element.classList.add('animated'); + }); + } + return []; + }, + + postList: function() { + const sequence = []; + const { post_block, post_header, post_body, coll_header } = CONFIG.motion.transition; + + function animate(animation, elements) { + if (!animation) return; + elements.forEach(targets => { + sequence.push({ + targets, + complete: () => targets.classList.add('animated', animation), + deltaT : '-=100' + }); + }); + } + + document.querySelectorAll('.post-block').forEach(targets => { + sequence.push({ + targets, + complete: () => targets.classList.add('animated', post_block), + deltaT : '-=100' + }); + animate(coll_header, targets.querySelectorAll('.collection-header')); + animate(post_header, targets.querySelectorAll('.post-header')); + animate(post_body, targets.querySelectorAll('.post-body')); + }); + + animate(post_block, document.querySelectorAll('.pagination, .comments')); + + return sequence; + }, + + sidebar: function() { + const sequence = []; + const sidebar = document.querySelectorAll('.sidebar-inner'); + const sidebarTransition = CONFIG.motion.transition.sidebar; + // Only for Pisces | Gemini. + if (sidebarTransition && (CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini')) { + sidebar.forEach(targets => { + sequence.push({ + targets, + complete: () => targets.classList.add('animated', sidebarTransition), + deltaT : '-=100' + }); + }); + } + return sequence; + }, + + footer: function() { + return [{ + targets: document.querySelector('.footer'), + opacity: 1 + }]; + } +}; diff --git a/docs/blog/js/next-boot.js b/docs/blog/js/next-boot.js new file mode 100644 index 0000000..1225fd2 --- /dev/null +++ b/docs/blog/js/next-boot.js @@ -0,0 +1,75 @@ +/* global NexT, CONFIG */ + +NexT.boot = {}; + +NexT.boot.registerEvents = function() { + + NexT.utils.registerScrollPercent(); + NexT.utils.registerCanIUseTag(); + + // Mobile top menu bar. + document.querySelector('.site-nav-toggle .toggle').addEventListener('click', event => { + event.currentTarget.classList.toggle('toggle-close'); + const siteNav = document.querySelector('.site-nav'); + if (!siteNav) return; + siteNav.style.setProperty('--scroll-height', siteNav.scrollHeight + 'px'); + document.body.classList.toggle('site-nav-on'); + }); + + document.querySelectorAll('.sidebar-nav li').forEach((element, index) => { + element.addEventListener('click', () => { + NexT.utils.activateSidebarPanel(index); + }); + }); + + window.addEventListener('hashchange', () => { + const tHash = location.hash; + if (tHash !== '' && !tHash.match(/%\S{2}/)) { + const target = document.querySelector(`.tabs ul.nav-tabs li a[href="${tHash}"]`); + target && target.click(); + } + }); +}; + +NexT.boot.refresh = function() { + + /** + * Register JS handlers by condition option. + * Need to add config option in Front-End at 'scripts/helpers/next-config.js' file. + */ + CONFIG.prism && window.Prism.highlightAll(); + CONFIG.mediumzoom && window.mediumZoom('.post-body :not(a) > img, .post-body > img', { + background: 'var(--content-bg-color)' + }); + CONFIG.lazyload && window.lozad('.post-body img').observe(); + CONFIG.pangu && window.pangu.spacingPage(); + + CONFIG.exturl && NexT.utils.registerExtURL(); + NexT.utils.wrapTableWithBox(); + NexT.utils.registerCopyCode(); + NexT.utils.registerTabsTag(); + NexT.utils.registerActiveMenuItem(); + NexT.utils.registerLangSelect(); + NexT.utils.registerSidebarTOC(); + NexT.utils.registerPostReward(); + NexT.utils.registerVideoIframe(); +}; + +NexT.boot.motion = function() { + // Define Motion Sequence & Bootstrap Motion. + if (CONFIG.motion.enable) { + NexT.motion.integrator + .add(NexT.motion.middleWares.header) + .add(NexT.motion.middleWares.postList) + .add(NexT.motion.middleWares.sidebar) + .add(NexT.motion.middleWares.footer) + .bootstrap(); + } + NexT.utils.updateSidebarPosition(); +}; + +document.addEventListener('DOMContentLoaded', () => { + NexT.boot.registerEvents(); + NexT.boot.refresh(); + NexT.boot.motion(); +}); diff --git a/docs/blog/js/pjax.js b/docs/blog/js/pjax.js new file mode 100644 index 0000000..f81a6a0 --- /dev/null +++ b/docs/blog/js/pjax.js @@ -0,0 +1,50 @@ +/* global NexT, CONFIG, Pjax */ + +const pjax = new Pjax({ + selectors: [ + 'head title', + 'script[type="application/json"]', + // Precede .main-inner to prevent placeholder TOC changes asap + '.post-toc-wrap', + '.main-inner', + '.languages', + '.pjax' + ], + switches: { + '.post-toc-wrap': function(oldWrap, newWrap) { + if (newWrap.querySelector('.post-toc')) { + Pjax.switches.outerHTML.call(this, oldWrap, newWrap); + } else { + const curTOC = oldWrap.querySelector('.post-toc'); + if (curTOC) { + curTOC.classList.add('placeholder-toc'); + } + this.onSwitch(); + } + } + }, + analytics: false, + cacheBust: false, + scrollTo : !CONFIG.bookmark.enable +}); + +document.addEventListener('pjax:success', () => { + pjax.executeScripts(document.querySelectorAll('script[data-pjax]')); + NexT.boot.refresh(); + // Define Motion Sequence & Bootstrap Motion. + if (CONFIG.motion.enable) { + NexT.motion.integrator + .init() + .add(NexT.motion.middleWares.subMenu) + .add(NexT.motion.middleWares.postList) + // Add sidebar-post-related transition. + .add(NexT.motion.middleWares.sidebar) + .bootstrap(); + } + if (CONFIG.sidebar.display !== 'remove') { + const hasTOC = document.querySelector('.post-toc:not(.placeholder-toc)'); + document.querySelector('.sidebar-inner').classList.toggle('sidebar-nav-active', hasTOC); + NexT.utils.activateSidebarPanel(hasTOC ? 0 : 1); + NexT.utils.updateSidebarPosition(); + } +}); diff --git a/docs/blog/js/third-party/addtoany.js b/docs/blog/js/third-party/addtoany.js new file mode 100644 index 0000000..f9009f8 --- /dev/null +++ b/docs/blog/js/third-party/addtoany.js @@ -0,0 +1,8 @@ +/* global NexT */ + +document.addEventListener('page:loaded', () => { + NexT.utils.getScript('https://static.addtoany.com/menu/page.js', { condition: window.a2a }) + .then(() => { + window.a2a.init(); + }); +}); diff --git a/docs/blog/js/third-party/analytics/baidu-analytics.js b/docs/blog/js/third-party/analytics/baidu-analytics.js new file mode 100644 index 0000000..c10e7d0 --- /dev/null +++ b/docs/blog/js/third-party/analytics/baidu-analytics.js @@ -0,0 +1,7 @@ +/* global _hmt */ + +if (!window._hmt) window._hmt = []; + +document.addEventListener('pjax:success', () => { + _hmt.push(['_trackPageview', location.pathname]); +}); diff --git a/docs/blog/js/third-party/analytics/matomo.js b/docs/blog/js/third-party/analytics/matomo.js new file mode 100644 index 0000000..290a3e0 --- /dev/null +++ b/docs/blog/js/third-party/analytics/matomo.js @@ -0,0 +1,19 @@ +/* global CONFIG */ + +if (CONFIG.matomo.enable) { + window._paq = window._paq || []; + const _paq = window._paq; + + /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + const u = CONFIG.matomo.server_url; + _paq.push(['setTrackerUrl', u + 'matomo.php']); + _paq.push(['setSiteId', CONFIG.matomo.site_id]); + const d = document; + const g = d.createElement('script'); + const s = d.getElementsByTagName('script')[0]; + g.async = true; + g.src = u + 'matomo.js'; + s.parentNode.insertBefore(g, s); +} diff --git a/docs/blog/js/third-party/comments/disqus.js b/docs/blog/js/third-party/comments/disqus.js new file mode 100644 index 0000000..4d1ca9e --- /dev/null +++ b/docs/blog/js/third-party/comments/disqus.js @@ -0,0 +1,41 @@ +/* global NexT, CONFIG, DISQUS */ + +document.addEventListener('page:loaded', () => { + + if (CONFIG.disqus.count) { + if (window.DISQUSWIDGETS) { + window.DISQUSWIDGETS.getCount({ reset: true }); + } else { + // Defer loading until the whole page loading is completed + NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/count.js`, { + attributes: { id: 'dsq-count-scr', defer: true } + }); + } + } + + if (CONFIG.page.comments) { + // `disqus_config` should be a global variable + // See https://help.disqus.com/en/articles/1717084-javascript-configuration-variables + window.disqus_config = function() { + this.page.url = CONFIG.page.permalink; + this.page.identifier = CONFIG.page.path; + this.page.title = CONFIG.page.title; + if (CONFIG.disqus.i18n.disqus !== 'disqus') { + this.language = CONFIG.disqus.i18n.disqus; + } + }; + NexT.utils.loadComments('#disqus_thread').then(() => { + if (window.DISQUS) { + DISQUS.reset({ + reload: true, + config: window.disqus_config + }); + } else { + NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/embed.js`, { + attributes: { dataset: { timestamp: '' + +new Date() } } + }); + } + }); + } + +}); diff --git a/docs/blog/js/third-party/fancybox.js b/docs/blog/js/third-party/fancybox.js new file mode 100644 index 0000000..bb436ab --- /dev/null +++ b/docs/blog/js/third-party/fancybox.js @@ -0,0 +1,38 @@ +document.addEventListener('page:loaded', () => { + + /** + * Wrap images with fancybox. + */ + document.querySelectorAll('.post-body :not(a) > img, .post-body > img').forEach(element => { + const $image = $(element); + const imageLink = $image.attr('data-src') || $image.attr('src'); + const $imageWrapLink = $image.wrap(``).parent('a'); + if ($image.is('.post-gallery img')) { + $imageWrapLink.attr('data-fancybox', 'gallery').attr('rel', 'gallery'); + } else if ($image.is('.group-picture img')) { + $imageWrapLink.attr('data-fancybox', 'group').attr('rel', 'group'); + } else { + $imageWrapLink.attr('data-fancybox', 'default').attr('rel', 'default'); + } + + const imageTitle = $image.attr('title') || $image.attr('alt'); + if (imageTitle) { + // Do not append image-caption if pandoc has already created a figcaption + if (!$imageWrapLink.next('figcaption').length) { + $imageWrapLink.append(`

${imageTitle}

`); + } + // Make sure img title tag will show correctly in fancybox + $imageWrapLink.attr('title', imageTitle).attr('data-caption', imageTitle); + } + }); + + $.fancybox.defaults.hash = false; + $('.fancybox').fancybox({ + loop : true, + helpers: { + overlay: { + locked: false + } + } + }); +}); diff --git a/docs/blog/js/third-party/pace.js b/docs/blog/js/third-party/pace.js new file mode 100644 index 0000000..c22d59f --- /dev/null +++ b/docs/blog/js/third-party/pace.js @@ -0,0 +1,7 @@ +/* global Pace */ + +Pace.options.restartOnPushState = false; + +document.addEventListener('pjax:send', () => { + Pace.restart(); +}); diff --git a/docs/blog/js/third-party/quicklink.js b/docs/blog/js/third-party/quicklink.js new file mode 100644 index 0000000..2543ad1 --- /dev/null +++ b/docs/blog/js/third-party/quicklink.js @@ -0,0 +1,37 @@ +/* global CONFIG, quicklink */ + +(function() { + if (typeof CONFIG.quicklink.ignores === 'string') { + const ignoresStr = `[${CONFIG.quicklink.ignores}]`; + CONFIG.quicklink.ignores = JSON.parse(ignoresStr); + } + + let resetFn = null; + + const onRefresh = () => { + if (resetFn) resetFn(); + if (!CONFIG.quicklink.enable) return; + + let ignoresArr = CONFIG.quicklink.ignores || []; + if (!Array.isArray(ignoresArr)) { + ignoresArr = [ignoresArr]; + } + + resetFn = quicklink.listen({ + timeout : CONFIG.quicklink.timeout, + priority: CONFIG.quicklink.priority, + ignores : [ + uri => uri.includes('#'), + uri => uri === CONFIG.quicklink.url, + ...ignoresArr + ] + }); + }; + + if (CONFIG.quicklink.delay) { + window.addEventListener('load', onRefresh); + document.addEventListener('pjax:success', onRefresh); + } else { + document.addEventListener('page:loaded', onRefresh); + } +})(); diff --git a/docs/blog/js/third-party/search/local-search.js b/docs/blog/js/third-party/search/local-search.js new file mode 100644 index 0000000..92a264d --- /dev/null +++ b/docs/blog/js/third-party/search/local-search.js @@ -0,0 +1,99 @@ +/* global CONFIG, pjax, LocalSearch */ + +document.addEventListener('DOMContentLoaded', () => { + if (!CONFIG.path) { + // Search DB path + console.warn('`hexo-generator-searchdb` plugin is not installed!'); + return; + } + const localSearch = new LocalSearch({ + path : CONFIG.path, + top_n_per_article: CONFIG.localsearch.top_n_per_article, + unescape : CONFIG.localsearch.unescape + }); + + const input = document.querySelector('.search-input'); + + const inputEventFunction = () => { + if (!localSearch.isfetched) return; + const searchText = input.value.trim().toLowerCase(); + const keywords = searchText.split(/[-\s]+/); + const container = document.querySelector('.search-result-container'); + let resultItems = []; + if (searchText.length > 0) { + // Perform local searching + resultItems = localSearch.getResultItems(keywords); + } + if (keywords.length === 1 && keywords[0] === '') { + container.classList.add('no-result'); + container.innerHTML = '
'; + } else if (resultItems.length === 0) { + container.classList.add('no-result'); + container.innerHTML = '
'; + } else { + resultItems.sort((left, right) => { + if (left.includedCount !== right.includedCount) { + return right.includedCount - left.includedCount; + } else if (left.hitCount !== right.hitCount) { + return right.hitCount - left.hitCount; + } + return right.id - left.id; + }); + const stats = CONFIG.i18n.hits.replace('${hits}', resultItems.length); + + container.classList.remove('no-result'); + container.innerHTML = `
${stats}
+
+
    ${resultItems.map(result => result.item).join('')}
`; + if (typeof pjax === 'object') pjax.refresh(container); + } + }; + + localSearch.highlightSearchWords(document.querySelector('.post-body')); + if (CONFIG.localsearch.preload) { + localSearch.fetchData(); + } + + if (CONFIG.localsearch.trigger === 'auto') { + input.addEventListener('input', inputEventFunction); + } else { + document.querySelector('.search-icon').addEventListener('click', inputEventFunction); + input.addEventListener('keypress', event => { + if (event.key === 'Enter') { + inputEventFunction(); + } + }); + } + window.addEventListener('search:loaded', inputEventFunction); + + // Handle and trigger popup window + document.querySelectorAll('.popup-trigger').forEach(element => { + element.addEventListener('click', () => { + document.body.classList.add('search-active'); + // Wait for search-popup animation to complete + setTimeout(() => input.focus(), 500); + if (!localSearch.isfetched) localSearch.fetchData(); + }); + }); + + // Monitor main search box + const onPopupClose = () => { + document.body.classList.remove('search-active'); + }; + + document.querySelector('.search-pop-overlay').addEventListener('click', event => { + if (event.target === document.querySelector('.search-pop-overlay')) { + onPopupClose(); + } + }); + document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose); + document.addEventListener('pjax:success', () => { + localSearch.highlightSearchWords(document.querySelector('.post-body')); + onPopupClose(); + }); + window.addEventListener('keyup', event => { + if (event.key === 'Escape') { + onPopupClose(); + } + }); +}); diff --git a/docs/blog/js/third-party/tags/mermaid.js b/docs/blog/js/third-party/tags/mermaid.js new file mode 100644 index 0000000..54f6288 --- /dev/null +++ b/docs/blog/js/third-party/tags/mermaid.js @@ -0,0 +1,32 @@ +/* global NexT, CONFIG, mermaid */ + +document.addEventListener('page:loaded', () => { + const mermaidElements = document.querySelectorAll('.mermaid'); + if (mermaidElements.length) { + NexT.utils.getScript(CONFIG.mermaid.js, { + condition: window.mermaid + }).then(() => { + mermaidElements.forEach(element => { + const newElement = document.createElement('div'); + newElement.innerHTML = element.innerHTML; + newElement.className = element.className; + const parent = element.parentNode; + // Fix issue #347 + // Support mermaid inside backtick code block + if (parent.matches('pre')) { + parent.parentNode.replaceChild(newElement, parent); + } else { + parent.replaceChild(newElement, element); + } + }); + mermaid.initialize({ + theme : CONFIG.darkmode && window.matchMedia('(prefers-color-scheme: dark)').matches ? CONFIG.mermaid.theme.dark : CONFIG.mermaid.theme.light, + logLevel : 4, + flowchart: { curve: 'linear' }, + gantt : { axisFormat: '%m/%d/%Y' }, + sequence : { actorMargin: 50 } + }); + mermaid.run(); + }); + } +}); diff --git a/docs/blog/js/third-party/tags/pdf.js b/docs/blog/js/third-party/tags/pdf.js new file mode 100644 index 0000000..7e82891 --- /dev/null +++ b/docs/blog/js/third-party/tags/pdf.js @@ -0,0 +1,23 @@ +/* global NexT, CONFIG, PDFObject */ + +document.addEventListener('page:loaded', () => { + if (document.querySelectorAll('.pdf-container').length) { + NexT.utils.getScript(CONFIG.pdf.object_url, { + condition: window.PDFObject + }).then(() => { + document.querySelectorAll('.pdf-container').forEach(element => { + PDFObject.embed(element.dataset.target, element, { + pdfOpenParams: { + navpanes : 0, + toolbar : 0, + statusbar: 0, + pagemode : 'thumbs', + view : 'FitH' + }, + PDFJS_URL: CONFIG.pdf.url, + height : element.dataset.height + }); + }); + }); + } +}); diff --git a/docs/blog/js/utils.js b/docs/blog/js/utils.js new file mode 100644 index 0000000..ee10f61 --- /dev/null +++ b/docs/blog/js/utils.js @@ -0,0 +1,452 @@ +/* global NexT, CONFIG */ + +HTMLElement.prototype.wrap = function(wrapper) { + this.parentNode.insertBefore(wrapper, this); + this.parentNode.removeChild(this); + wrapper.appendChild(this); +}; + +(function() { + const onPageLoaded = () => document.dispatchEvent( + new Event('page:loaded', { + bubbles: true + }) + ); + + if (document.readyState === 'loading') { + document.addEventListener('readystatechange', onPageLoaded, { once: true }); + } else { + onPageLoaded(); + } + document.addEventListener('pjax:success', onPageLoaded); +})(); + +NexT.utils = { + + registerExtURL: function() { + document.querySelectorAll('span.exturl').forEach(element => { + const link = document.createElement('a'); + // https://stackoverflow.com/questions/30106476/using-javascripts-atob-to-decode-base64-doesnt-properly-decode-utf-8-strings + link.href = decodeURIComponent(atob(element.dataset.url).split('').map(c => { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + link.rel = 'noopener external nofollow noreferrer'; + link.target = '_blank'; + link.className = element.className; + link.title = element.title; + link.innerHTML = element.innerHTML; + element.parentNode.replaceChild(link, element); + }); + }, + + /** + * One-click copy code support. + */ + registerCopyCode: function() { + let figure = document.querySelectorAll('figure.highlight'); + if (figure.length === 0) figure = document.querySelectorAll('pre:not(.mermaid)'); + figure.forEach(element => { + element.querySelectorAll('.code .line span').forEach(span => { + span.classList.forEach(name => { + span.classList.replace(name, `hljs-${name}`); + }); + }); + if (!CONFIG.copycode.enable) return; + let target = element; + if (CONFIG.copycode.style !== 'mac') target = element.querySelector('.table-container') || element; + target.insertAdjacentHTML('beforeend', '
'); + const button = element.querySelector('.copy-btn'); + button.addEventListener('click', () => { + const lines = element.querySelector('.code') || element.querySelector('code'); + const code = lines.innerText; + if (navigator.clipboard) { + // https://caniuse.com/mdn-api_clipboard_writetext + navigator.clipboard.writeText(code).then(() => { + button.querySelector('i').className = 'fa fa-check-circle fa-fw'; + }, () => { + button.querySelector('i').className = 'fa fa-times-circle fa-fw'; + }); + } else { + const ta = document.createElement('textarea'); + ta.style.top = window.scrollY + 'px'; // Prevent page scrolling + ta.style.position = 'absolute'; + ta.style.opacity = '0'; + ta.readOnly = true; + ta.value = code; + document.body.append(ta); + ta.select(); + ta.setSelectionRange(0, code.length); + ta.readOnly = false; + const result = document.execCommand('copy'); + button.querySelector('i').className = result ? 'fa fa-check-circle fa-fw' : 'fa fa-times-circle fa-fw'; + ta.blur(); // For iOS + button.blur(); + document.body.removeChild(ta); + } + }); + element.addEventListener('mouseleave', () => { + setTimeout(() => { + button.querySelector('i').className = 'fa fa-copy fa-fw'; + }, 300); + }); + }); + }, + + wrapTableWithBox: function() { + document.querySelectorAll('table').forEach(element => { + const box = document.createElement('div'); + box.className = 'table-container'; + element.wrap(box); + }); + }, + + registerVideoIframe: function() { + document.querySelectorAll('iframe').forEach(element => { + const supported = [ + 'www.youtube.com', + 'player.vimeo.com', + 'player.youku.com', + 'player.bilibili.com', + 'www.tudou.com' + ].some(host => element.src.includes(host)); + if (supported && !element.parentNode.matches('.video-container')) { + const box = document.createElement('div'); + box.className = 'video-container'; + element.wrap(box); + const width = Number(element.width); + const height = Number(element.height); + if (width && height) { + box.style.paddingTop = (height / width * 100) + '%'; + } + } + }); + }, + + updateActiveNav: function() { + if (!Array.isArray(NexT.utils.sections)) return; + let index = NexT.utils.sections.findIndex(element => { + return element && element.getBoundingClientRect().top > 10; + }); + if (index === -1) { + index = NexT.utils.sections.length - 1; + } else if (index > 0) { + index--; + } + this.activateNavByIndex(index); + }, + + registerScrollPercent: function() { + const backToTop = document.querySelector('.back-to-top'); + const readingProgressBar = document.querySelector('.reading-progress-bar'); + // For init back to top in sidebar if page was scrolled after page refresh. + window.addEventListener('scroll', () => { + if (backToTop || readingProgressBar) { + const contentHeight = document.body.scrollHeight - window.innerHeight; + const scrollPercent = contentHeight > 0 ? Math.min(100 * window.scrollY / contentHeight, 100) : 0; + if (backToTop) { + backToTop.classList.toggle('back-to-top-on', Math.round(scrollPercent) >= 5); + backToTop.querySelector('span').innerText = Math.round(scrollPercent) + '%'; + } + if (readingProgressBar) { + readingProgressBar.style.setProperty('--progress', scrollPercent.toFixed(2) + '%'); + } + } + this.updateActiveNav(); + }, { passive: true }); + + backToTop && backToTop.addEventListener('click', () => { + window.anime({ + targets : document.scrollingElement, + duration : 500, + easing : 'linear', + scrollTop: 0 + }); + }); + }, + + /** + * Tabs tag listener (without twitter bootstrap). + */ + registerTabsTag: function() { + // Binding `nav-tabs` & `tab-content` by real time permalink changing. + document.querySelectorAll('.tabs ul.nav-tabs .tab').forEach(element => { + element.addEventListener('click', event => { + event.preventDefault(); + // Prevent selected tab to select again. + if (element.classList.contains('active')) return; + const nav = element.parentNode; + // Get the height of `tab-pane` which is activated before, and set it as the height of `tab-content` with extra margin / paddings. + const tabContent = nav.nextElementSibling; + tabContent.style.overflow = 'hidden'; + tabContent.style.transition = 'height 1s'; + // Comment system selection tab does not contain .active class. + const activeTab = tabContent.querySelector('.active') || tabContent.firstElementChild; + // Hight might be `auto`. + const prevHeight = parseInt(window.getComputedStyle(activeTab).height.replace('px', ''), 10) || 0; + const paddingTop = parseInt(window.getComputedStyle(activeTab).paddingTop.replace('px', ''), 10); + const marginBottom = parseInt(window.getComputedStyle(activeTab.firstElementChild).marginBottom.replace('px', ''), 10); + tabContent.style.height = prevHeight + paddingTop + marginBottom + 'px'; + // Add & Remove active class on `nav-tabs` & `tab-content`. + [...nav.children].forEach(target => { + target.classList.toggle('active', target === element); + }); + // https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers + const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', '')); + [...tActive.parentNode.children].forEach(target => { + target.classList.toggle('active', target === tActive); + }); + // Trigger event + tActive.dispatchEvent(new Event('tabs:click', { + bubbles: true + })); + // Get the height of `tab-pane` which is activated now. + const hasScrollBar = document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight); + const currHeight = parseInt(window.getComputedStyle(tabContent.querySelector('.active')).height.replace('px', ''), 10); + // Reset the height of `tab-content` and see the animation. + tabContent.style.height = currHeight + paddingTop + marginBottom + 'px'; + // Change the height of `tab-content` may cause scrollbar show / disappear, which may result in the change of the `tab-pane`'s height + setTimeout(() => { + if ((document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight)) !== hasScrollBar) { + tabContent.style.transition = 'height 0.3s linear'; + // After the animation, we need reset the height of `tab-content` again. + const currHeightAfterScrollBarChange = parseInt(window.getComputedStyle(tabContent.querySelector('.active')).height.replace('px', ''), 10); + tabContent.style.height = currHeightAfterScrollBarChange + paddingTop + marginBottom + 'px'; + } + // Remove all the inline styles, and let the height be adaptive again. + setTimeout(() => { + tabContent.style.transition = ''; + tabContent.style.height = ''; + }, 250); + }, 1000); + if (!CONFIG.stickytabs) return; + const offset = nav.parentNode.getBoundingClientRect().top + window.scrollY + 10; + window.anime({ + targets : document.scrollingElement, + duration : 500, + easing : 'linear', + scrollTop: offset + }); + }); + }); + + window.dispatchEvent(new Event('tabs:register')); + }, + + registerCanIUseTag: function() { + // Get responsive height passed from iframe. + window.addEventListener('message', ({ data }) => { + if (typeof data === 'string' && data.includes('ciu_embed')) { + const featureID = data.split(':')[1]; + const height = data.split(':')[2]; + document.querySelector(`iframe[data-feature=${featureID}]`).style.height = parseInt(height, 10) + 5 + 'px'; + } + }, false); + }, + + registerActiveMenuItem: function() { + document.querySelectorAll('.menu-item a[href]').forEach(target => { + const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', ''); + const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname); + target.classList.toggle('menu-item-active', target.hostname === location.hostname && (isSamePath || isSubPath)); + }); + }, + + registerLangSelect: function() { + const selects = document.querySelectorAll('.lang-select'); + selects.forEach(sel => { + sel.value = CONFIG.page.lang; + sel.addEventListener('change', () => { + const target = sel.options[sel.selectedIndex]; + document.querySelectorAll('.lang-select-label span').forEach(span => { + span.innerText = target.text; + }); + // Disable Pjax to force refresh translation of menu item + window.location.href = target.dataset.href; + }); + }); + }, + + registerSidebarTOC: function() { + this.sections = [...document.querySelectorAll('.post-toc:not(.placeholder-toc) li a.nav-link')].map(element => { + const target = document.getElementById(decodeURI(element.getAttribute('href')).replace('#', '')); + // TOC item animation navigate. + element.addEventListener('click', event => { + event.preventDefault(); + const offset = target.getBoundingClientRect().top + window.scrollY; + window.anime({ + targets : document.scrollingElement, + duration : 500, + easing : 'linear', + scrollTop: offset, + complete : () => { + history.pushState(null, document.title, element.href); + } + }); + }); + return target; + }); + this.updateActiveNav(); + }, + + registerPostReward: function() { + const button = document.querySelector('.reward-container button'); + if (!button) return; + button.addEventListener('click', () => { + document.querySelector('.post-reward').classList.toggle('active'); + }); + }, + + activateNavByIndex: function(index) { + const nav = document.querySelector('.post-toc:not(.placeholder-toc) .nav'); + if (!nav) return; + + const navItemList = nav.querySelectorAll('.nav-item'); + const target = navItemList[index]; + if (!target || target.classList.contains('active-current')) return; + + const singleHeight = navItemList[navItemList.length - 1].offsetHeight; + + nav.querySelectorAll('.active').forEach(navItem => { + navItem.classList.remove('active', 'active-current'); + }); + target.classList.add('active', 'active-current'); + + let activateEle = target.querySelector('.nav-child') || target.parentElement; + let navChildHeight = 0; + + while (nav.contains(activateEle)) { + if (activateEle.classList.contains('nav-item')) { + activateEle.classList.add('active'); + } else { // .nav-child or .nav + // scrollHeight isn't reliable for transitioning child items. + // The last nav-item in a list has a margin-bottom of 5px. + navChildHeight += (singleHeight * activateEle.childElementCount) + 5; + activateEle.style.setProperty('--height', `${navChildHeight}px`); + } + activateEle = activateEle.parentElement; + } + + // Scrolling to center active TOC element if TOC content is taller then viewport. + const tocElement = document.querySelector(CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini' ? '.sidebar-panel-container' : '.sidebar'); + if (!document.querySelector('.sidebar-toc-active')) return; + window.anime({ + targets : tocElement, + duration : 200, + easing : 'linear', + scrollTop: tocElement.scrollTop - (tocElement.offsetHeight / 2) + target.getBoundingClientRect().top - tocElement.getBoundingClientRect().top + }); + }, + + updateSidebarPosition: function() { + if (window.innerWidth < 1200 || CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') return; + // Expand sidebar on post detail page by default, when post has a toc. + const hasTOC = document.querySelector('.post-toc:not(.placeholder-toc)'); + let display = CONFIG.page.sidebar; + if (typeof display !== 'boolean') { + // There's no definition sidebar in the page front-matter. + display = CONFIG.sidebar.display === 'always' || (CONFIG.sidebar.display === 'post' && hasTOC); + } + if (display) { + window.dispatchEvent(new Event('sidebar:show')); + } + }, + + activateSidebarPanel: function(index) { + const sidebar = document.querySelector('.sidebar-inner'); + const activeClassNames = ['sidebar-toc-active', 'sidebar-overview-active']; + if (sidebar.classList.contains(activeClassNames[index])) return; + + const panelContainer = sidebar.querySelector('.sidebar-panel-container'); + const tocPanel = panelContainer.firstElementChild; + const overviewPanel = panelContainer.lastElementChild; + + let postTOCHeight = tocPanel.scrollHeight; + // For TOC activation, try to use the animated TOC height + if (index === 0) { + const nav = tocPanel.querySelector('.nav'); + if (nav) { + postTOCHeight = parseInt(nav.style.getPropertyValue('--height'), 10); + } + } + const panelHeights = [ + postTOCHeight, + overviewPanel.scrollHeight + ]; + panelContainer.style.setProperty('--inactive-panel-height', `${panelHeights[1 - index]}px`); + panelContainer.style.setProperty('--active-panel-height', `${panelHeights[index]}px`); + + sidebar.classList.replace(activeClassNames[1 - index], activeClassNames[index]); + }, + + getScript: function(src, options = {}, legacyCondition) { + if (typeof options === 'function') { + return this.getScript(src, { + condition: legacyCondition + }).then(options); + } + const { + condition = false, + attributes: { + id = '', + async = false, + defer = false, + crossOrigin = '', + dataset = {}, + ...otherAttributes + } = {}, + parentNode = null + } = options; + return new Promise((resolve, reject) => { + if (condition) { + resolve(); + } else { + const script = document.createElement('script'); + + if (id) script.id = id; + if (crossOrigin) script.crossOrigin = crossOrigin; + script.async = async; + script.defer = defer; + Object.assign(script.dataset, dataset); + Object.entries(otherAttributes).forEach(([name, value]) => { + script.setAttribute(name, String(value)); + }); + + script.onload = resolve; + script.onerror = reject; + + if (typeof src === 'object') { + const { url, integrity } = src; + script.src = url; + if (integrity) { + script.integrity = integrity; + script.crossOrigin = 'anonymous'; + } + } else { + script.src = src; + } + (parentNode || document.head).appendChild(script); + } + }); + }, + + loadComments: function(selector, legacyCallback) { + if (legacyCallback) { + return this.loadComments(selector).then(legacyCallback); + } + return new Promise(resolve => { + const element = document.querySelector(selector); + if (!CONFIG.comments.lazyload || !element) { + resolve(); + return; + } + const intersectionObserver = new IntersectionObserver((entries, observer) => { + const entry = entries[0]; + if (!entry.isIntersecting) return; + + resolve(); + observer.disconnect(); + }); + intersectionObserver.observe(element); + }); + } +}; diff --git a/docs/blog/search.xml b/docs/blog/search.xml new file mode 100644 index 0000000..0a3d6d1 --- /dev/null +++ b/docs/blog/search.xml @@ -0,0 +1,261 @@ + + + + 欢迎 + /blog/2022/05/01/zh-CN/welcome/ +

+]]>
+
+ + .NET 面试问答 | ASP.NET 面试问答 + /blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/ + 整理的关于 .NET Framework 和 ASP.NET 的一些面试问答。

+ + +

一、初级问题

01) 什么是 .NET Framework?

.NET Framework 支持用于在 Windows 上构建应用程序的面向对象的方法。
它支持各种语言,如 C#、VB、Cobol、Perl、.NET 等。
它具有多种工具和功能,如用于构建、部署和运行 Web 服务和不同应用程序的类、库和 API。

+

02) .NET Framework 有哪些不同的组件?

    +
  • Common Language Runtime
  • +
  • Application Domain (.NET Framework only)
  • +
  • Common Type System
  • +
  • .NET Class Library
  • +
  • .NET Framework / .NET Core
  • +
  • Profiling
  • +
+

03) 你对 CTS 了解多少?

CTS代表通用类型系统(Common Type System)。
它遵循一定的规则,数据类型应该根据这些规则在程序代码中声明和使用。
CTS还描述了将在应用程序中使用的数据类型。
我们甚至可以按照CTS中的规则创建自己的类和函数,它有助于调用其他编程语言在一种编程语言中声明的数据类型。

+

04) 什么是 CLR?

CLR 代表 Common Language Runtime它是 .NET Framework 的重要组成部分。
我们可以将 CLR 用作各种应用程序的构建块,并为应用程序提供安全的执行环境。
每当编译用 C# 编写的应用程序时,代码都会转换为中间语言。 在此之后,代码以 CLR 为目标,然后执行多项操作,如内存管理、安全检查、加载程序集和线程管理。

+

05) 解释一下 CLS

CLS 代表通用语言规范(Common Language Specification)。
它帮助开发人员使用与 CLS 附带的某些规则的跨语言兼容的组件。
然后,它有助于在其他 .NET 兼容语言中重用代码。

+

06) 你对 JIT 了解多少?

JIT 是一个编译器,代表 Just In Time。
它用于将中间代码转换为本地语言。
在执行期间,中间代码被转换为本地语言。

+

07) 为什么要使用 Response.Output.Write()?

Response.Output.Write() 用于获取格式化输出。

+

08) Response.Redirect 和 Server.Transfer 有什么区别?

Response.Redirect:
Response.Redirect 基本上是将用户的浏览器重定向到另一个页面或站点。
用户浏览器的历史记录也会更新以反映新地址。
它还执行返回客户端的行程,客户端的浏览器被重定向到新页面。

+

Server.Transfer:
然而,Server.Transfer 从一个页面传输到另一个页面,而不需要返回客户端的浏览器。
在 Server.Transfer 的情况下,历史记录不会更新。

+

09) 托管代码和非托管代码的区别?

托管代码(Managed code):

+
    +
  • 托管代码由 CLR 管理
  • +
  • .NET Framework 是执行托管代码所必需的
  • +
  • CLR 通过垃圾回收(Garbage Collection)管理内存管理
  • +
+

非托管代码(Unmanaged code):

+
    +
  • 任何不受 CLR 管理的代码
  • +
  • 独立于 .NET Framework
  • +
  • 拥有用于执行和编译的运行时环境
  • +
+

10) 类和对象的区别?

类(Class):

+
    +
  • 类是对象的定义
  • +
  • 是对象的模板
  • +
  • 描述了所有的方法,属性等
  • +
+

对象(Object):

+
    +
  • 对象是类的实例
  • +
  • 除非实例化,否则类不会成为对象
  • +
  • 对象访问类的所有属性
  • +
+

11) 你对装箱和拆箱了解多少?

装箱(Boxing):

+
    +
  • 隐式的
  • +
  • 将值类型转换为类型对象的过程
  • +
  • 例如 - object myObj = a ;
  • +
+

拆箱(Unboxing):

+
    +
  • 明确的
  • +
  • 从对象中提取值类型的过程
  • +
  • 例如 - int a = (int) myObj ;
  • +
+

12) 常量和只读变量的区别?

常量(const):

+
    +
  • 在编译时评估
  • +
  • 仅支持值类型变量
  • +
  • 在编译时值不变时使用
  • +
  • 不能在构造函数或声明中初始化
  • +
+

只读变量(readonly):

+
    +
  • 在运行时评估
  • +
  • 可以保存引用类型变量
  • +
  • 在运行时之前实际值未知时使用
  • +
  • 能在构造函数或声明中初始化
  • +
+

13) 什么是 BCL?

    +
  • BCL(Base Class Library),是类、接口和值类型的基类库。
  • +
  • 它是 .NET Framework 应用程序、组件和控件的基础
  • +
  • 封装了大量常用功能,方便开发人员使用
  • +
  • 它提供线程、输入/输出、安全、诊断、资源、全球化等功能
  • +
  • 还用于用户和运行时之间的交互目的
  • +
  • 它还提供了经常使用的命名空间。 例如:System,System.Activities 等。
  • +
+

14) .NET 有哪些不同版本?

    +
  • .NET Framework 1.0 / 1.1
  • +
  • .NET Framework 2.0
  • +
  • .NET Framework 3.0 / 3.5
  • +
  • .NET Framework 4.0 / 4.5 / 4.6 / 4.7 / 4.8
  • +
  • .NET Core 1.0 / 1.1
  • +
  • .NET Core 2.0 / 2.1
  • +
  • .NET Core 3.0 / 3.1
  • +
  • .NET 5
  • +
  • .NET 6
  • +
+

15) 命名空间和程序集有什么区别?

程序集(Assembly)是逻辑单元的物理分组,而命名空间(Namespace)对类进行分组。
此外,一个命名空间也可以跨越多个程序集。

+

16) 什么是 LINQ?

LINQ 代表语言集成查询(Lanuage Integrated Query)。

+
    +
  • 它是 Visual Studio 2008 引入的语言集成查询的首字母缩写词。
  • +
  • LINQ 是一组功能,可将查询功能扩展到 .NET Framework 语言语法,允许在不考虑数据源的情况下进行数据操作
  • +
  • LINQ 弥合了对象世界和数据世界之间的鸿沟
  • +
+

17) 什么是 MSIL?

MSIL 是微软中间语言(Microsoft Intermediate Language),它提供了调用方法、存储和初始化值、内存处理、异常处理等的指令。
所有 .NET 代码首先编译为中间语言。

+

18) 所有 Web 窗体都继承自哪个基类?

Page 类

+

二、中等问题

19) 解释程序集的不同部分?

清单(MANIFEST):
包含有关程序集版本的信息。

+

类型元数据(TYPE METADATA):
包含程序的二进制信息。

+

中间语言(MSIL):
中间语言代码。

+

资源(RESOURCES):
相关文件列表。

+

20) 如何防止类被继承?

在 C# 中,我们可以使用 sealed 关键字来防止类被继承。

+

21) C# 中有哪些不同类型的构造函数?

默认的:
如果未显示提供构造函数,则由编译器生成默认的无参数构造函数。

+

参数化的:
只要构造函数具有至少1个参数,就是参数化的构造函数。

+

副本:
在构造函数中接受另一个对象作为参数,并用其属性来初始化自身的属性。

+

静态:
没有访问修饰符,没有任何参数,由 CLR 自动执行,可初始化静态成员。

+

私有:
使用了 private 访问修饰符,用于防止通过 new 关键字进行实例化。
例如:可实现单例类。

+

22) 有哪些不同类型的程序集?

私有的:
只能由应用程序访问。
安装在应用程序的安装目录中。

+

共享的:
可以由多个应用程序共享。
安装在 GAC 中。

+

23) 什么是 MDI 和 SDI?

MDI(Multiple Document Interface):
MDI 允许您打开多个窗口。
它将有一个父窗口和尽可能多的子窗口。
组件从父窗口共享,如菜单栏、工具栏等。

+

SDI(Single Document Interface):
在单独的窗口中打开每个文档。
每个窗口都有自己的组件,如菜单栏、工具栏等。
因此它不受父窗口的限制。

+

24) 区分自定义控件和用户控件?

自定义控件(Custom Control):

+
    +
  • 派生自 Control
  • +
  • 动态布局
  • +
  • 定义单个控件
  • +
  • 有完整的工具箱支持
  • +
+

用户控件(User Control):

+
    +
  • 派生自 UserControl
  • +
  • 静态布局
  • +
  • 定义一组控件
  • +
  • 无法添加到工具箱
  • +
+

25) 什么是垃圾收集器?

.NET 中的垃圾收集器(Garbage Collector)功能释放内存中未使用的代码对象。

+

内存堆分为3代:

+
    +
  • 第 0 代(Generation 0)
    存储短生存期的对象

    +
  • +
  • 第 1 代(Generation 1)
    存储中等生存期的对象

    +
  • +
  • 第 2 代(Generation 2)
    存储长生存期的对象

    +
  • +
+

另外,内存堆也分为小型对象堆(SOH)和一个大型对象堆(LOH)。
小型对象堆完全符合上述的 3 代回收机制,
而这个大型对象堆略有不同,它在第 0 代被设置,只与第 2 代同时回收。

+

26) 什么是缓存?

缓存只是意味着将数据临时存储在内存中,以便可以从内存中访问数据,而不是在原始位置搜索它。 它提高了应用程序的效率,也提高了它的速度。

+
    +
  • 页面缓存(Page Caching)
    可以帮助改善网页加载时间,从而为搜索引擎优化您的网站。
    页面加载时间会显着影响您的用户体验以及您的网站将访问者转化为买家或潜在客户的能力。

    +
  • +
  • 数据缓存(Data Caching)
    缓存是一种在内存中存储常用数据或信息的技术。
    当下次需要相同的数据或信息时,可以直接从内存中检索,而不是由应用程序生成。

    +
  • +
  • 片段缓存(Fragment Caching)
    片段缓存实际上是指在 Web 表单中缓存单个用户控件。
    每个用户控件可以有独立的缓存持续时间和如何应用缓存行为的实现。
    当您只需要缓存页面的子集时,片段缓存很有用。

    +
  • +
+

解释一下 MVC

MVC 代表模型视图控制器(Model View Controller)。
它是构建 .NET 应用程序的架构。

+

模型(Model):
Model基本上是处理对象存储和从应用程序的数据库检索的任何应用程序的逻辑部分。

+

视图(View):
View处理应用程序的 UI 部分,即用户界面。
因此它们从模型中获取信息以进行展示。

+

控制器(Controller):
Controller 处理用户交互,从用户输入中找出响应,并呈现用户交互所需的视图。

+

28) 什么是 CAS?

CAS表示代码访问安全性(Code Access Security)。
CAS是安全模型的一部分,用于防止对资源的未授权访问。
它还允许用户设置代码的权限。CLR然后根据权限执行代码。

+

CAS只能用于托管代码。
如果程序集使用CAS,则将其视为部分受信任的。
尽管每次程序集试图访问资源时,它都会执行检查。

+

29) 解释一下本地化和全球化

本地化(Localization):
这意味着改变已经全球化的应用程序以适应特定的语言或文化。
Microsoft.Extension.Localization 用于本地化应用程序内容。

+

全球化(Globalization):
全球化是开发支持多种语言的应用程序的过程。
还可以将现有的应用程序转换为支持多种语言。

+

30) 什么是应用程序域?

ASP.NET 引入了一个应用程序域概念或 AppDomain,它就像一个轻量级进程,既像容器又像边界。

+

.NET 运行时使用 AppDomain 作为数据和代码的容器。CLR 允许多个 .NET 应用程序在单个 AppDomain 中运行。

+

31) .NET中的委托是什么?

.NET 中的委托(delegate)类似于其他编程语言(如 C 或 C++)中的函数指针。
委托允许用户将方法的引用封装在委托对象中。
可以在程序中传递委托对象,该程序将调用引用的方法。
我们可以使用委托方法在类中创建自定义事件。

+

32) .NET 中抽象类和接口的区别?

抽象类(abstact class):
抽象类为必须由继承实体实现的功能提供了部分实现。
抽象类也声明字段。

+

接口(interface):
接口仅声明实现类应具有的契约或行为。
接口只能声明没有访问修饰符的属性、方法和事件。

+

33) 区分栈和堆?

栈(Stack):

+
    +
  • 静态内存分配
  • +
  • 存储值类型
  • +
  • 跟踪每个线程及其位置
  • +
+

堆(Heap):

+
    +
  • 动态内存分配
  • +
  • 存储引用类型
  • +
  • 跟踪更精确的对象或数据
  • +
+

34) ASP.NET 中有哪些不同的验证器?

客户端验证(Client-side validation):
当在客户端浏览器上进行验证时,它被称为客户端验证。通常,JavaScript用于客户端验证。

+

服务端验证(Server-side validation):
当在服务器上进行验证时,就称为服务器端验证。
服务器端验证被认为是一种安全的验证形式,因为即使用户绕过了客户端验证,我们仍然可以在服务器端验证中捕捉到它。

+

三、高级问题

35) 什么是 EXE 和 DLL?

EXE:
它是一个可执行文件,可运行为其设计的应用程序。
当我们构建应用程序时,会生成一个 exe 文件。
因此,程序集在我们运行 exe 时直接加载。
但是exe文件不能与其他应用程序共享。

+

DLL:
它代表由需要隐藏的代码组成的动态链接库。
代码封装在这个库中,一个应用程序可以有很多DLL,也可以与其他应用程序共享。

+

36) 区分函数和存储过程?

函数(Fucntion):

+
    +
  • 必须返回单个值
  • +
  • 它只能有输入参数
  • +
  • 无法使用try catch块进行异常处理
  • +
  • 无法从函数调用存储过程
  • +
+

存储过程(Stored Procedure):

+
    +
  • 总是用于执行特定任务
  • +
  • 可以同时具有输入或输出参数
  • +
  • 可以使用try catch块进行异常处理
  • +
  • 可以从存储过程中调用函数
  • +
+

列出 ASP.NET 页面的生命周期事件。

Page_PreInit
Page_Init
Page_InitComplete
Page_PreLoad
Page_Load
Page_LoadComplete
Page_PreRender
Render

+

38) 从 ASP.NET 应用程序发送电子邮件的代码是什么?

Mail msg = new Mail();
msg.From = “abc@gmail.com“;
msg.To = “xyz@gmail.com“;
msg.Subject = “test”;
msg.Body = “hello”;

+

SmtpMail.SmtpServer = “localhost”;
SmtpMail.Send(msg);

+

以上代码无法运行,属于伪代码

+

39) ASP.NET 中 Global.asax 文件有哪些事件处理程序?

Application_Start
Application_End
Application_AuthenticatedRequest
Application_AuthorizeRequest
Application_BeginRequest
Application_Disposed
Application_EndRequest
Application_Error
Application_PostRequestHandlerExecute
Application_PreRequestHandlerExecute
Application_PreSendRequestContent
Application_PreSendRequestHeader
Application_ReleaseRequestState
Application_ResolveRequestCache
Application_UpdateRequestCache

+

40) 解释一下基于角色的安全性

基于角色的安全性是指根据组织中分配给用户的角色来实施安全措施。
然后根据用户在组织中的角色对其进行授权。
例如,Windows 具有基于角色的访问权限,例如用户、管理员和来宾。

+

41) 什么是跨页公布?

cross-page posting:

+
    +
  • 每当我们单击页面上的提交按钮时,数据都存储在同一个页面上。但如果数据存储在不同的页面上,则称为跨页面发布。
  • +
  • 跨页发布可以通过导致回发的 POSTBACKURL 属性实现。
  • +
  • FindControl 方法可用于获取该页面已发布到的该页面上发布的值。
  • +
+

42) 如何将主题应用于 ASP.NET 应用程序?

下面是更改主题的代码:

+ + + + + + +

43) 解释护照认证

在护照认证期间,它首先检查护照认证cookie,如果cookie不可用,应用程序将重定向到护照登录页面。 Passport 服务然后在登录页面上验证用户的详细信息,如果它们有效,则将它们存储在客户端计算机上,然后将用户重定向到请求的页面。

+

44) 什么是 ASP.NET 安全控件?

asp:Login
asp:LoginName
asp:LoginStatus
asp:LoginView
asp:PasswordRecovery

+

45) 列出 ASP.NET 转发器控件的所有模板?

ItemTemplate
AlternatingItemTemplate
SeparatorTemplate
HeaderTemplate
FooterTemplate

+

46) web.config 文件中的 appSettings 部分是什么?

+ + + + + +

web.config 文件中的 appsettings 部分是 web 应用程序的自定义配置

+

47) 什么是 MIME?

MIME 代表多用途互联网邮件扩展(multipurpose internet mail extensions)。
它是电子邮件协议的扩展,允许用户使用该协议在互联网上交换文件。
服务器在我们传输的开头插入 MIME 标头。
然后客户端使用此标头为标头指示的数据类型选择适当的“播放器”。
其中一些播放器内置于网络浏览器中。

+

48) 什么是 HTTP handler?

对 ASP.NET 应用程序的每个请求都由一个称为 HTTP 处理程序的专用组件处理。
它是处理 ASP.NET 应用程序请求的最重要的组件。
它使用不同的处理程序来处理不同的文件。
网页处理程序创建页面和控件对象,运行您的代码,然后呈现最终的 HTML。

+
    +
  • Page Handler (.aspx):处理 web 页面
  • +
  • User Control Handler (.ascx):处理 web 用户控件页面
  • +
  • Web Service Handler (.asmx):处理 web 服务页面
  • +
  • Trace Handler (trace.axd):处理跟踪功能
  • +
+

49) ASP.NET 中有哪些不同类型的 Cookie?

会话 Cookie(Session cookie):
对于单个会话,它驻留在客户端机器上,直到用户注销。

+

持久性 Cookie(Persistent cookie):
在指定的期限内驻留在用户计算机上。可能是一个小时,一个月或永远不会。

+

50) 区分 ExecuteScalar 和 ExecuteNonQuery?

ExecuteScalar:

+
    +
  • 返回输出值
  • +
  • 用于获取单个值
  • +
  • 不返回受影响的行数
  • +
+

ExecuteNonQuery:

+
    +
  • 不返回任何值
  • +
  • 用于执行插入和更新语句
  • +
  • 返回受影响的行数
  • +
+

相关视频

]]>
+ + .NET + + + C# + .NET + ASP.NET + +
+
diff --git a/docs/blog/sitemap.txt b/docs/blog/sitemap.txt new file mode 100644 index 0000000..5dd0782 --- /dev/null +++ b/docs/blog/sitemap.txt @@ -0,0 +1,11 @@ +https://devenliu.github.io/blog/404/index.html +https://devenliu.github.io/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/ +https://devenliu.github.io/blog/2022/05/01/zh-CN/welcome/ +https://devenliu.github.io/blog/categories/index.html +https://devenliu.github.io/blog/about/index.html +https://devenliu.github.io/blog/tags/index.html +https://devenliu.github.io/blog +https://devenliu.github.io/blog/tags/C/ +https://devenliu.github.io/blog/tags/NET/ +https://devenliu.github.io/blog/tags/ASP-NET/ +https://devenliu.github.io/blog/categories/NET/ diff --git a/docs/blog/sitemap.xml b/docs/blog/sitemap.xml new file mode 100644 index 0000000..ea51182 --- /dev/null +++ b/docs/blog/sitemap.xml @@ -0,0 +1,97 @@ + + + + + https://devenliu.github.io/blog/404/index.html + + 2023-07-22 + + monthly + 0.6 + + + + https://devenliu.github.io/blog/2022/06/14/zh-CN/dotNET-Interview-Questions-and-Answers/ + + 2023-07-22 + + monthly + 0.6 + + + + https://devenliu.github.io/blog/2022/05/01/zh-CN/welcome/ + + 2023-07-22 + + monthly + 0.6 + + + + https://devenliu.github.io/blog/categories/index.html + + 2023-07-22 + + monthly + 0.6 + + + + https://devenliu.github.io/blog/about/index.html + + 2023-07-22 + + monthly + 0.6 + + + + https://devenliu.github.io/blog/tags/index.html + + 2023-07-22 + + monthly + 0.6 + + + + + https://devenliu.github.io/blog + 2023-07-22 + daily + 1.0 + + + + + https://devenliu.github.io/blog/tags/C/ + 2023-07-22 + weekly + 0.2 + + + + https://devenliu.github.io/blog/tags/NET/ + 2023-07-22 + weekly + 0.2 + + + + https://devenliu.github.io/blog/tags/ASP-NET/ + 2023-07-22 + weekly + 0.2 + + + + + + https://devenliu.github.io/blog/categories/NET/ + 2023-07-22 + weekly + 0.2 + + + diff --git a/docs/blog/tags/ASP-NET/index.html b/docs/blog/tags/ASP-NET/index.html new file mode 100644 index 0000000..b47e34b --- /dev/null +++ b/docs/blog/tags/ASP-NET/index.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +标签: ASP.NET | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+

ASP.NET + 标签 +

+
+ + +
+ 2022 +
+ + + +
+
+ + + + +
+
+ +
+ +
+ + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/tags/C/index.html b/docs/blog/tags/C/index.html new file mode 100644 index 0000000..3327cee --- /dev/null +++ b/docs/blog/tags/C/index.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +标签: C# | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+

C# + 标签 +

+
+ + +
+ 2022 +
+ + + +
+
+ + + + +
+
+ +
+ +
+ + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/tags/NET/index.html b/docs/blog/tags/NET/index.html new file mode 100644 index 0000000..5547ce1 --- /dev/null +++ b/docs/blog/tags/NET/index.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +标签: .NET | Deven Liu' Blog + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+
+
+

.NET + 标签 +

+
+ + +
+ 2022 +
+ + + +
+
+ + + + +
+
+ +
+ +
+ + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog/tags/index.html b/docs/blog/tags/index.html new file mode 100644 index 0000000..478db0f --- /dev/null +++ b/docs/blog/tags/index.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tags | Deven Liu' Blog + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ +
+ + + + + +
+ +

tags +

+ + + +
+ + + +
+
+ 目前共计 3 个标签 +
+ +
+ +
+ + + +
+ + + + + +
+
+ +
+ +
+ + +
+ + 0% +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package.json b/package.json deleted file mode 100644 index 97d61cc..0000000 --- a/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "private": true, - "name": "devenliu.github.io", - "version": "1.0.0", - "main": "index.js", - "repository": "git@github.com:devenliu/devenliu.github.io.git", - "author": "Deven Liu " -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 2b9f188..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,5 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false