From 77b4f75126d44c5ce6826bf5bd9374b5ada6b2de Mon Sep 17 00:00:00 2001 From: baby195lxl Date: Wed, 11 Sep 2024 02:41:42 +0000 Subject: [PATCH] Update _config.yml UTC 2024-09-11 Wednesday 02:41:42 Updated By Github Actions --- CNAME | 1 + archives/2022/09/index.html | 176 + archives/2022/10/index.html | 176 + archives/2022/12/index.html | 176 + archives/2022/index.html | 176 + archives/2023/01/index.html | 176 + archives/2023/04/index.html | 176 + archives/2023/05/index.html | 176 + archives/2023/08/index.html | 176 + archives/2023/09/index.html | 176 + archives/2023/12/index.html | 176 + archives/2023/index.html | 176 + archives/2023/page/2/index.html | 176 + archives/2024/05/index.html | 176 + archives/2024/08/index.html | 176 + archives/2024/index.html | 176 + archives/index.html | 176 + archives/page/2/index.html | 176 + archives/page/3/index.html | 176 + categories/index.html | 176 + .../\346\212\200\346\234\257/index.html" | 176 + .../page/2/index.html" | 176 + .../page/3/index.html" | 176 + css/index.css | 5871 +++++++++++++++++ css/var.css | 0 img/404.jpg | Bin 0 -> 16393 bytes img/avatar.jpg | Bin 0 -> 70979 bytes img/default-banner.jpg | Bin 0 -> 367443 bytes img/favicon.png | Bin 0 -> 8732 bytes img/friend_404.gif | Bin 0 -> 65097 bytes index.html | 205 + js/main.js | 813 +++ js/search/algolia.js | 163 + js/search/local-search.js | 196 + js/tw_cn.js | 119 + js/utils.js | 290 + link/index.html | 248 + page/2/index.html | 205 + page/3/index.html | 205 + posts/0lozupq7.html | 190 + posts/18d22756.html | 191 + posts/56c3d658.html | 183 + posts/56ecg2fs.html | 203 + posts/56u6za0a.html | 214 + posts/58ea93b5.html | 185 + posts/5c9a9528.html | 253 + posts/5cm2dmd2.html | 187 + posts/7h4old6e.html | 200 + posts/9cf09888.html | 188 + posts/a7bp87o2.html | 238 + posts/akex76ga.html | 203 + posts/bd214e51.html | 306 + posts/e22de85.html | 184 + posts/f793f9ae.html | 183 + posts/fcf74e02.html | 199 + posts/i5v2u2.html | 196 + posts/l4j4c8hb.html | 181 + posts/pm7yb0b2.html | 207 + posts/u74pp23h.html | 208 + posts/xpyovm89.html | 211 + posts/zn4ra72x.html | 247 + posts/zr161ci0.html | 190 + search.xml | 663 ++ tags/C/index.html | 176 + tags/Docker/index.html | 176 + tags/Linux/index.html | 176 + tags/Podman/index.html | 176 + tags/Python/index.html | 176 + tags/Rust/index.html | 176 + .../index.html" | 176 + .../page/2/index.html" | 176 + tags/Selenium/index.html | 176 + tags/Vim/index.html | 176 + tags/asyncio/index.html | 176 + tags/bilibili/index.html | 176 + tags/index.html | 176 + "tags/\345\244\207\345\277\230/index.html" | 176 + .../index.html" | 176 + "tags/\347\210\254\350\231\253/index.html" | 176 + .../index.html" | 176 + 80 files changed, 20590 insertions(+) create mode 100644 CNAME create mode 100644 archives/2022/09/index.html create mode 100644 archives/2022/10/index.html create mode 100644 archives/2022/12/index.html create mode 100644 archives/2022/index.html create mode 100644 archives/2023/01/index.html create mode 100644 archives/2023/04/index.html create mode 100644 archives/2023/05/index.html create mode 100644 archives/2023/08/index.html create mode 100644 archives/2023/09/index.html create mode 100644 archives/2023/12/index.html create mode 100644 archives/2023/index.html create mode 100644 archives/2023/page/2/index.html create mode 100644 archives/2024/05/index.html create mode 100644 archives/2024/08/index.html create mode 100644 archives/2024/index.html create mode 100644 archives/index.html create mode 100644 archives/page/2/index.html create mode 100644 archives/page/3/index.html create mode 100644 categories/index.html create mode 100644 "categories/\346\212\200\346\234\257/index.html" create mode 100644 "categories/\346\212\200\346\234\257/page/2/index.html" create mode 100644 "categories/\346\212\200\346\234\257/page/3/index.html" create mode 100644 css/index.css create mode 100644 css/var.css create mode 100644 img/404.jpg create mode 100644 img/avatar.jpg create mode 100644 img/default-banner.jpg create mode 100644 img/favicon.png create mode 100644 img/friend_404.gif create mode 100644 index.html create mode 100644 js/main.js create mode 100644 js/search/algolia.js create mode 100644 js/search/local-search.js create mode 100644 js/tw_cn.js create mode 100644 js/utils.js create mode 100644 link/index.html create mode 100644 page/2/index.html create mode 100644 page/3/index.html create mode 100644 posts/0lozupq7.html create mode 100644 posts/18d22756.html create mode 100644 posts/56c3d658.html create mode 100644 posts/56ecg2fs.html create mode 100644 posts/56u6za0a.html create mode 100644 posts/58ea93b5.html create mode 100644 posts/5c9a9528.html create mode 100644 posts/5cm2dmd2.html create mode 100644 posts/7h4old6e.html create mode 100644 posts/9cf09888.html create mode 100644 posts/a7bp87o2.html create mode 100644 posts/akex76ga.html create mode 100644 posts/bd214e51.html create mode 100644 posts/e22de85.html create mode 100644 posts/f793f9ae.html create mode 100644 posts/fcf74e02.html create mode 100644 posts/i5v2u2.html create mode 100644 posts/l4j4c8hb.html create mode 100644 posts/pm7yb0b2.html create mode 100644 posts/u74pp23h.html create mode 100644 posts/xpyovm89.html create mode 100644 posts/zn4ra72x.html create mode 100644 posts/zr161ci0.html create mode 100644 search.xml create mode 100644 tags/C/index.html create mode 100644 tags/Docker/index.html create mode 100644 tags/Linux/index.html create mode 100644 tags/Podman/index.html create mode 100644 tags/Python/index.html create mode 100644 tags/Rust/index.html create mode 100644 "tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/index.html" create mode 100644 "tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/page/2/index.html" create mode 100644 tags/Selenium/index.html create mode 100644 tags/Vim/index.html create mode 100644 tags/asyncio/index.html create mode 100644 tags/bilibili/index.html create mode 100644 tags/index.html create mode 100644 "tags/\345\244\207\345\277\230/index.html" create mode 100644 "tags/\345\274\202\346\255\245\347\274\226\347\250\213/index.html" create mode 100644 "tags/\347\210\254\350\231\253/index.html" create mode 100644 "tags/\347\216\257\345\242\203\351\205\215\347\275\256/index.html" diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..18453d4d7 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +luoxiaolinn.space diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html new file mode 100644 index 000000000..05064bab9 --- /dev/null +++ b/archives/2022/09/index.html @@ -0,0 +1,176 @@ +九月 2022 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2022/10/index.html b/archives/2022/10/index.html new file mode 100644 index 000000000..e50cc9ab0 --- /dev/null +++ b/archives/2022/10/index.html @@ -0,0 +1,176 @@ +十月 2022 | 无眠呓语
文章总览 - 2
2022
使用Python操作Docker
使用Python操作Docker
Selenium及Webdriver环境安装
Selenium及Webdriver环境安装
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html new file mode 100644 index 000000000..b37243aa2 --- /dev/null +++ b/archives/2022/12/index.html @@ -0,0 +1,176 @@ +十二月 2022 | 无眠呓语
文章总览 - 1
2022
根据BV号爬取哔哩哔哩视频弹幕
根据BV号爬取哔哩哔哩视频弹幕
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html new file mode 100644 index 000000000..c9260ac1c --- /dev/null +++ b/archives/2022/index.html @@ -0,0 +1,176 @@ +2022 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/01/index.html b/archives/2023/01/index.html new file mode 100644 index 000000000..a041d27d4 --- /dev/null +++ b/archives/2023/01/index.html @@ -0,0 +1,176 @@ +一月 2023 | 无眠呓语
文章总览 - 1
2023
使用Python调用C语言动态链接库
使用Python调用C语言动态链接库
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/04/index.html b/archives/2023/04/index.html new file mode 100644 index 000000000..f2c67ccf1 --- /dev/null +++ b/archives/2023/04/index.html @@ -0,0 +1,176 @@ +四月 2023 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html new file mode 100644 index 000000000..8c87bd24c --- /dev/null +++ b/archives/2023/05/index.html @@ -0,0 +1,176 @@ +五月 2023 | 无眠呓语
文章总览 - 1
2023
Rust学习笔记:Trait对象
Rust学习笔记:Trait对象
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/08/index.html b/archives/2023/08/index.html new file mode 100644 index 000000000..7e27e7f80 --- /dev/null +++ b/archives/2023/08/index.html @@ -0,0 +1,176 @@ +八月 2023 | 无眠呓语
文章总览 - 1
2023
Rust学习笔记:迭代器
Rust学习笔记:迭代器
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html new file mode 100644 index 000000000..25895b9f5 --- /dev/null +++ b/archives/2023/09/index.html @@ -0,0 +1,176 @@ +九月 2023 | 无眠呓语
文章总览 - 1
2023
使用Rust为Python编写模块
使用Rust为Python编写模块
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html new file mode 100644 index 000000000..06c451041 --- /dev/null +++ b/archives/2023/12/index.html @@ -0,0 +1,176 @@ +十二月 2023 | 无眠呓语
文章总览 - 1
2023
使用Podman构建Rust项目
使用Podman构建Rust项目
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html new file mode 100644 index 000000000..8629a65e3 --- /dev/null +++ b/archives/2023/index.html @@ -0,0 +1,176 @@ +2023 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html new file mode 100644 index 000000000..370a51dce --- /dev/null +++ b/archives/2023/page/2/index.html @@ -0,0 +1,176 @@ +2023 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2024/05/index.html b/archives/2024/05/index.html new file mode 100644 index 000000000..66a67ca71 --- /dev/null +++ b/archives/2024/05/index.html @@ -0,0 +1,176 @@ +五月 2024 | 无眠呓语
文章总览 - 1
2024
Rust学习笔记:错误处理
Rust学习笔记:错误处理
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2024/08/index.html b/archives/2024/08/index.html new file mode 100644 index 000000000..9e60cedbb --- /dev/null +++ b/archives/2024/08/index.html @@ -0,0 +1,176 @@ +八月 2024 | 无眠呓语
文章总览 - 1
2024
Rust学习笔记:函数作为参数
Rust学习笔记:函数作为参数
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html new file mode 100644 index 000000000..529eb8853 --- /dev/null +++ b/archives/2024/index.html @@ -0,0 +1,176 @@ +2024 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 000000000..32682b825 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,176 @@ +时间线 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 000000000..0337f6e4a --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,176 @@ +时间线 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 000000000..6eba29451 --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,176 @@ +时间线 | 无眠呓语
文章总览 - 23
2022
AlmaLinux初上手
AlmaLinux初上手
Ubuntu初始配置
Ubuntu初始配置
Requests库常见用法
Requests库常见用法
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..edff8316a --- /dev/null +++ b/categories/index.html @@ -0,0 +1,176 @@ +分类 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/index.html" "b/categories/\346\212\200\346\234\257/index.html" new file mode 100644 index 000000000..814389ef6 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/index.html" @@ -0,0 +1,176 @@ +分类: 技术 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/page/2/index.html" "b/categories/\346\212\200\346\234\257/page/2/index.html" new file mode 100644 index 000000000..5e3989926 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/page/2/index.html" @@ -0,0 +1,176 @@ +分类: 技术 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/page/3/index.html" "b/categories/\346\212\200\346\234\257/page/3/index.html" new file mode 100644 index 000000000..0fc37c6ea --- /dev/null +++ "b/categories/\346\212\200\346\234\257/page/3/index.html" @@ -0,0 +1,176 @@ +分类: 技术 | 无眠呓语
分类 - 技术
2022
AlmaLinux初上手
AlmaLinux初上手
Ubuntu初始配置
Ubuntu初始配置
Requests库常见用法
Requests库常见用法
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 000000000..09aba6f4b --- /dev/null +++ b/css/index.css @@ -0,0 +1,5871 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +main { + display: block +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none +} +.limit-one-line, +#article-container .flink .flink-item-name, +#article-container .flink .flink-item-desc, +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span, +.site-data > a .headline, +#nav #blog-info, +#pagination .prev_info, +#pagination .next_info, +#sidebar #sidebar-menus .menus_items .site-page { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.limit-more-line, +.article-sort-item-title, +#recent-posts > .recent-post-item >.recent-post-info > .article-title, +#recent-posts > .recent-post-item >.recent-post-info > .content, +#aside-content .aside-list > .aside-list-item .content > .name, +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment, +#post-info .post-title, +.relatedPosts > .relatedPosts-list .content .title, +#article-container figure.gallery-group p, +#article-container figure.gallery-group .gallery-group-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; +} +.fontawesomeIcon, +hr:before, +#article-container h1:before, +#article-container h2:before, +#article-container h3:before, +#article-container h4:before, +#article-container h5:before, +#article-container h6:before, +#post .post-copyright:before, +#post .post-outdate-notice:before, +.note:not(.no-icon)::before { + display: inline-block; + font-weight: 600; + font-family: 'Font Awesome 6 Free'; + text-rendering: auto; + -webkit-font-smoothing: antialiased; +} +.cardHover, +.layout > div:first-child:not(.recent-posts), +#recent-posts > .recent-post-item, +#aside-content .card-widget, +.layout > .recent-posts .pagination > *:not(.space) { + border-radius: 8px; + background: var(--card-bg); + -webkit-box-shadow: var(--card-box-shadow); + box-shadow: var(--card-box-shadow); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.cardHover:hover, +.layout > div:first-child:not(.recent-posts):hover, +#recent-posts > .recent-post-item:hover, +#aside-content .card-widget:hover, +.layout > .recent-posts .pagination > *:not(.space):hover { + -webkit-box-shadow: var(--card-hover-box-shadow); + box-shadow: var(--card-hover-box-shadow); +} +.imgHover, +.article-sort-item-img :first-child, +#recent-posts > .recent-post-item .post_cover .post-bg, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.6s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.6s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.6s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.6s; + transition: filter 375ms ease-in 0.2s, transform 0.6s; + object-fit: cover; +} +.imgHover:hover, +.article-sort-item-img :first-child:hover, +#recent-posts > .recent-post-item .post_cover .post-bg:hover, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child:hover { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover:hover .cover, +#pagination .prev-post:hover .cover, +#pagination .next-post:hover .cover, +.relatedPosts > .relatedPosts-list > div:hover .cover { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover .cover, +#pagination .prev-post .cover, +#pagination .next-post .cover, +.relatedPosts > .relatedPosts-list > div .cover { + position: absolute; + width: 100%; + height: 100%; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transition: all 0.6s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.6s, filter 375ms ease-in 0.2s; + -o-transition: all 0.6s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.6s, filter 375ms ease-in 0.2s; + transition: all 0.6s, filter 375ms ease-in 0.2s; + object-fit: cover; +} +.list-beauty, +.category-lists ul { + list-style: none; +} +.list-beauty li, +.category-lists ul li { + position: relative; + padding: 0.12em 0.4em 0.12em 1.4em; +} +.list-beauty li:hover:before, +.category-lists ul li:hover:before { + border-color: var(--pseudo-hover); +} +.list-beauty li:before, +.category-lists ul li:before { + position: absolute; + top: 0.67em; + left: 0; + width: 0.43em; + height: 0.43em; + border: 0.215em solid #49b1f5; + border-radius: 0.43em; + background: transparent; + content: ''; + cursor: pointer; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#content-inner, +#footer { + -webkit-animation: bottom-top 1s; + -moz-animation: bottom-top 1s; + -o-animation: bottom-top 1s; + -ms-animation: bottom-top 1s; + animation: bottom-top 1s; +} +#page-header { + -webkit-animation: header-effect 1s; + -moz-animation: header-effect 1s; + -o-animation: header-effect 1s; + -ms-animation: header-effect 1s; + animation: header-effect 1s; +} +#site-title, +#site-subtitle { + -webkit-animation: titleScale 1s; + -moz-animation: titleScale 1s; + -o-animation: titleScale 1s; + -ms-animation: titleScale 1s; + animation: titleScale 1s; +} +#nav.show { + -webkit-animation: headerNoOpacity 1s; + -moz-animation: headerNoOpacity 1s; + -o-animation: headerNoOpacity 1s; + -ms-animation: headerNoOpacity 1s; + animation: headerNoOpacity 1s; +} +canvas:not(#ribbon-canvas), +#web_bg { + -webkit-animation: to_show 4s; + -moz-animation: to_show 4s; + -o-animation: to_show 4s; + -ms-animation: to_show 4s; + animation: to_show 4s; +} +#ribbon-canvas { + -webkit-animation: ribbon_to_show 4s; + -moz-animation: ribbon_to_show 4s; + -o-animation: ribbon_to_show 4s; + -ms-animation: ribbon_to_show 4s; + animation: ribbon_to_show 4s; +} +#sidebar-menus.open > :nth-child(1) { + -webkit-animation: sidebarItem 0.2s; + -moz-animation: sidebarItem 0.2s; + -o-animation: sidebarItem 0.2s; + -ms-animation: sidebarItem 0.2s; + animation: sidebarItem 0.2s; +} +#sidebar-menus.open > :nth-child(2) { + -webkit-animation: sidebarItem 0.4s; + -moz-animation: sidebarItem 0.4s; + -o-animation: sidebarItem 0.4s; + -ms-animation: sidebarItem 0.4s; + animation: sidebarItem 0.4s; +} +#sidebar-menus.open > :nth-child(3) { + -webkit-animation: sidebarItem 0.6s; + -moz-animation: sidebarItem 0.6s; + -o-animation: sidebarItem 0.6s; + -ms-animation: sidebarItem 0.6s; + animation: sidebarItem 0.6s; +} +#sidebar-menus.open > :nth-child(4) { + -webkit-animation: sidebarItem 0.8s; + -moz-animation: sidebarItem 0.8s; + -o-animation: sidebarItem 0.8s; + -ms-animation: sidebarItem 0.8s; + animation: sidebarItem 0.8s; +} +.scroll-down-effects { + -webkit-animation: scroll-down-effect 1.5s infinite; + -moz-animation: scroll-down-effect 1.5s infinite; + -o-animation: scroll-down-effect 1.5s infinite; + -ms-animation: scroll-down-effect 1.5s infinite; + animation: scroll-down-effect 1.5s infinite; +} +.reward-main { + -webkit-animation: donate_effcet 0.3s 0.1s ease both; + -moz-animation: donate_effcet 0.3s 0.1s ease both; + -o-animation: donate_effcet 0.3s 0.1s ease both; + -ms-animation: donate_effcet 0.3s 0.1s ease both; + animation: donate_effcet 0.3s 0.1s ease both; +} +@-moz-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-webkit-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-o-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-moz-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-moz-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-webkit-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-o-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-moz-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-moz-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-o-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-moz-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-o-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +:root { + --global-font-size: 14px; + --global-bg: #fff; + --font-color: #4c4948; + --hr-border: #a4d8fa; + --hr-before-color: #80c8f8; + --search-bg: #f6f8fa; + --search-input-color: #4c4948; + --search-result-title: #4c4948; + --preloader-bg: #37474f; + --preloader-color: #fff; + --tab-border-color: #f0f0f0; + --tab-botton-bg: #f0f0f0; + --tab-botton-color: #1f2d3d; + --tab-button-hover-bg: #dcdcdc; + --tab-button-active-bg: #fff; + --card-bg: #fff; + --sidebar-bg: #f6f8fa; + --btn-hover-color: #ff7242; + --btn-color: #fff; + --btn-bg: #49b1f5; + --text-bg-hover: rgba(73,177,245,0.7); + --light-grey: #eee; + --dark-grey: #cacaca; + --white: #fff; + --text-highlight-color: #1f2d3d; + --blockquote-color: #6a737d; + --blockquote-bg: rgba(73,177,245,0.1); + --reward-pop: #f5f5f5; + --toc-link-color: #666261; + --card-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); + --card-hover-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.09); + --pseudo-hover: #ff7242; + --headline-presudo: #a0a0a0; + --scrollbar-color: #49b1f5; + --default-bg-color: #49b1f5; +} +body { + position: relative; + min-height: 100%; + background: var(--global-bg); + color: var(--font-color); + font-size: var(--global-font-size); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft YaHei', sans-serif; + line-height: 2; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +*::-webkit-scrollbar { + width: 8px; + height: 8px; +} +*::-webkit-scrollbar-thumb { + background: var(--scrollbar-color); +} +*::-webkit-scrollbar-track { + background-color: transparent; +} +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-color) transparent; +} +input::placeholder { + color: var(--font-color); +} +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + margin: 20px 0 14px; + color: var(--text-highlight-color); + font-weight: bold; +} +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit !important; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +hr { + position: relative; + margin: 40px auto; + border: 2px dashed var(--hr-border); + width: calc(100% - 4px); +} +hr:hover:before { + left: calc(95% - 20px); +} +hr:before { + position: absolute; + top: -10px; + left: 5%; + z-index: 1; + color: var(--hr-before-color); + content: '\f0c4'; + font-size: 20px; + line-height: 1; + -webkit-transition: all 1s ease-in-out; + -moz-transition: all 1s ease-in-out; + -o-transition: all 1s ease-in-out; + -ms-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; +} +.table-wrap { + overflow-x: scroll; + margin: 0 0 20px; +} +table { + display: table; + width: 100%; + border-spacing: 0; + border-collapse: collapse; + empty-cells: show; +} +table thead { + background: rgba(153,169,191,0.1); +} +table th, +table td { + padding: 6px 12px; + border: 1px solid var(--light-grey); + vertical-align: middle; +} +*::selection { + background: #00c4b6; + color: #f7f7f7; +} +button { + padding: 0; + outline: 0; + border: none; + background: none; + cursor: pointer; + touch-action: manipulation; +} +a { + color: #99a9bf; + text-decoration: none; + word-wrap: break-word; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -o-transition: all 0.2s; + -ms-transition: all 0.2s; + transition: all 0.2s; + overflow-wrap: break-word; +} +a:hover { + color: #49b1f5; +} +.is-center { + text-align: center; +} +.copy-true { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; +} +.pull-left { + float: left; +} +.pull-right { + float: right; +} +img[src=''], +img:not([src]) { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.img-alt { + margin: -10px 0 10px; + color: #858585; +} +.img-alt:hover { + text-decoration: none !important; +} +blockquote { + margin: 0 0 20px; + padding: 12px 15px; + border-left: 3px solid #49b1f5; + background-color: var(--blockquote-bg); + color: var(--blockquote-color); +} +blockquote footer cite:before { + padding: 0 5px; + content: '—'; +} +blockquote > :last-child { + margin-bottom: 0 !important; +} +:root { + --hl-color: #eff; + --hl-bg: #212121; + --hltools-bg: #1c1c1c; + --hltools-color: rgba(238,255,255,0.8); + --hlnumber-bg: #212121; + --hlnumber-color: rgba(238,255,255,0.5); + --hlscrollbar-bg: #353535; + --hlexpand-bg: linear-gradient(180deg, rgba(33,33,33,0.6), rgba(33,33,33,0.9)); +} +figure.highlight table { + scrollbar-color: var(--hlscrollbar-bg) transparent; +} +figure.highlight table::-webkit-scrollbar-thumb { + background: var(--hlscrollbar-bg); +} +figure.highlight pre .deletion { + color: #bf42bf; +} +figure.highlight pre .addition { + color: #105ede; +} +figure.highlight pre .meta { + color: #c792ea; +} +figure.highlight pre .comment { + color: #969896; +} +figure.highlight pre .variable, +figure.highlight pre .attribute, +figure.highlight pre .regexp, +figure.highlight pre .ruby .constant, +figure.highlight pre .xml .tag .title, +figure.highlight pre .xml .pi, +figure.highlight pre .xml .doctype, +figure.highlight pre .html .doctype, +figure.highlight pre .css .id, +figure.highlight pre .tag .name, +figure.highlight pre .css .class, +figure.highlight pre .css .pseudo { + color: #ff5370; +} +figure.highlight pre .tag { + color: #89ddff; +} +figure.highlight pre .number, +figure.highlight pre .preprocessor, +figure.highlight pre .literal, +figure.highlight pre .params, +figure.highlight pre .constant, +figure.highlight pre .command { + color: #f78c6c; +} +figure.highlight pre .built_in { + color: #ffcb6b; +} +figure.highlight pre .ruby .class .title, +figure.highlight pre .css .rules .attribute, +figure.highlight pre .string, +figure.highlight pre .value, +figure.highlight pre .inheritance, +figure.highlight pre .header, +figure.highlight pre .ruby .symbol, +figure.highlight pre .xml .cdata, +figure.highlight pre .special, +figure.highlight pre .number, +figure.highlight pre .formula { + color: #c3e88d; +} +figure.highlight pre .keyword, +figure.highlight pre .title, +figure.highlight pre .css .hexcolor { + color: #89ddff; +} +figure.highlight pre .function, +figure.highlight pre .python .decorator, +figure.highlight pre .python .title, +figure.highlight pre .ruby .function .title, +figure.highlight pre .ruby .title .keyword, +figure.highlight pre .perl .sub, +figure.highlight pre .javascript .title, +figure.highlight pre .coffeescript .title { + color: #82aaff; +} +figure.highlight pre .tag .attr, +figure.highlight pre .javascript .function { + color: #c792ea; +} +#article-container figure.highlight .line.marked { + background-color: rgba(97,97,97,0.314); +} +#article-container figure.highlight table { + display: block; + overflow: auto; + border: none; +} +#article-container figure.highlight table td { + padding: 0; + border: none; +} +#article-container figure.highlight .gutter pre { + padding-right: 10px; + padding-left: 10px; + background-color: var(--hlnumber-bg); + color: var(--hlnumber-color); + text-align: right; +} +#article-container figure.highlight .code pre { + padding-right: 10px; + padding-left: 10px; + width: 100%; +} +#article-container pre, +#article-container figure.highlight { + overflow: auto; + margin: 0 0 20px; + padding: 0; + background: var(--hl-bg); + color: var(--hl-color); + line-height: 1.6; +} +#article-container pre, +#article-container code { + font-size: var(--global-font-size); + font-family: consolas, Menlo, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; +} +#article-container code { + padding: 2px 4px; + background: rgba(27,31,35,0.05); + color: #f47466; +} +#article-container pre { + padding: 10px 20px; +} +#article-container pre code { + padding: 0; + background: none; + color: var(--hl-color); + text-shadow: none; +} +#article-container figure.highlight { + position: relative; +} +#article-container figure.highlight pre { + margin: 0; + padding: 8px 0; + border: none; +} +#article-container figure.highlight figcaption, +#article-container figure.highlight .caption { + padding: 6px 0 2px 14px; + font-size: var(--global-font-size); + line-height: 1em; +} +#article-container figure.highlight figcaption a, +#article-container figure.highlight .caption a { + float: right; + padding-right: 10px; + color: var(--hl-color); +} +#article-container figure.highlight figcaption a:hover, +#article-container figure.highlight .caption a:hover { + border-bottom-color: var(--hl-color); +} +#article-container .highlight-tools { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + min-height: 24px; + height: 2.15em; + background: var(--hltools-bg); + color: var(--hltools-color); + font-size: var(--global-font-size); +} +#article-container .highlight-tools.closed ~ * { + display: none; +} +#article-container .highlight-tools .expand { + position: absolute; + padding: 0.57em 0.7em; + cursor: pointer; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#article-container .highlight-tools .expand + .code-lang { + left: 1.7em; +} +#article-container .highlight-tools .expand.closed { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: rotate(-90deg) !important; + -moz-transform: rotate(-90deg) !important; + -o-transform: rotate(-90deg) !important; + -ms-transform: rotate(-90deg) !important; + transform: rotate(-90deg) !important; +} +#article-container .highlight-tools .code-lang { + position: absolute; + left: 14px; + text-transform: uppercase; + font-weight: bold; + font-size: 1.15em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#article-container .highlight-tools .copy-notice { + position: absolute; + right: 2.4em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s; + -moz-transition: opacity 0.4s; + -o-transition: opacity 0.4s; + -ms-transition: opacity 0.4s; + transition: opacity 0.4s; +} +#article-container .highlight-tools .copy-button { + position: absolute; + right: 14px; + cursor: pointer; + -webkit-transition: color 0.2s; + -moz-transition: color 0.2s; + -o-transition: color 0.2s; + -ms-transition: color 0.2s; + transition: color 0.2s; +} +#article-container .highlight-tools .copy-button:hover { + color: #49b1f5; +} +#article-container .gutter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#article-container .gist table { + width: auto; +} +#article-container .gist table td { + border: none; +} +#article-container figure.highlight { + margin: 0 0 24px; + border-radius: 7px; + -webkit-box-shadow: 0 5px 10px 0 rgba(0,0,0,0.4); + box-shadow: 0 5px 10px 0 rgba(0,0,0,0.4); + -webkit-transform: translateZ(0); +} +#article-container figure.highlight .highlight-tools:after { + position: absolute; + left: 14px; + width: 12px; + height: 12px; + border-radius: 50%; + background: #fc625d; + -webkit-box-shadow: 20px 0 #fdbc40, 40px 0 #35cd4b; + box-shadow: 20px 0 #fdbc40, 40px 0 #35cd4b; + content: ' '; +} +#article-container figure.highlight .highlight-tools .expand { + right: 0; +} +#article-container figure.highlight .highlight-tools .expand.closed { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: rotate(90deg) !important; + -moz-transform: rotate(90deg) !important; + -o-transform: rotate(90deg) !important; + -ms-transform: rotate(90deg) !important; + transform: rotate(90deg) !important; +} +#article-container figure.highlight .highlight-tools .expand ~ .copy-notice { + right: 3.45em; +} +#article-container figure.highlight .highlight-tools .expand ~ .copy-button { + right: 2.1em; +} +#article-container figure.highlight .highlight-tools .code-lang { + left: 75px; +} +@-moz-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +.article-sort { + margin-left: 10px; + padding-left: 20px; + border-left: 2px solid #aadafa; +} +.article-sort-title { + position: relative; + margin-left: 10px; + padding-bottom: 20px; + padding-left: 20px; + font-size: 1.72em; +} +.article-sort-title:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-title:before { + position: absolute; + top: calc(((100% - 36px) / 2)); + left: -9px; + z-index: 1; + width: 10px; + height: 10px; + border: 5px solid #49b1f5; + border-radius: 10px; + background: var(--card-bg); + content: ''; + line-height: 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-title:after { + position: absolute; + bottom: 0; + left: 0; + z-index: 0; + width: 2px; + height: 1.5em; + background: #aadafa; + content: ''; +} +.article-sort-item { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + margin: 0 0 20px 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-item:before { + position: absolute; + left: calc(-20px - 17px); + width: 6px; + height: 6px; + border: 3px solid #49b1f5; + border-radius: 6px; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item.no-article-cover { + height: 80px; +} +.article-sort-item.no-article-cover .article-sort-item-info { + padding: 0; +} +.article-sort-item.year { + font-size: 1.43em; +} +.article-sort-item.year:hover:before { + border-color: #49b1f5; +} +.article-sort-item.year:before { + border-color: var(--pseudo-hover); +} +.article-sort-item-time { + color: #858585; + font-size: 95%; +} +.article-sort-item-time time { + padding-left: 6px; + cursor: default; +} +.article-sort-item-title { + color: var(--font-color); + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-line-clamp: 2; +} +.article-sort-item-title:hover { + color: #49b1f5; + -webkit-transform: translateX(10px); + -moz-transform: translateX(10px); + -o-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); +} +.article-sort-item-img { + overflow: hidden; + width: 80px; + height: 80px; +} +.article-sort-item-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 16px; +} +.category-lists .category-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .category-lists .category-title { + font-size: 2em; + } +} +.category-lists .category-list { + margin-bottom: 0; +} +.category-lists .category-list a { + color: var(--font-color); +} +.category-lists .category-list a:hover { + color: #49b1f5; +} +.category-lists .category-list .category-list-count { + margin-left: 8px; + color: #858585; +} +.category-lists .category-list .category-list-count:before { + content: '('; +} +.category-lists .category-list .category-list-count:after { + content: ')'; +} +.category-lists ul { + padding: 0 0 0 20px; +} +.category-lists ul ul { + padding-left: 4px; +} +.category-lists ul li { + position: relative; + margin: 6px 0; + padding: 0.12em 0.4em 0.12em 1.4em; +} +#body-wrap { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100vh; +} +.layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + margin: 0 auto; + padding: 40px 15px; + max-width: 1200px; + width: 100%; +} +@media screen and (max-width: 900px) { + .layout { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } +} +@media screen and (max-width: 768px) { + .layout { + padding: 20px 5px; + } +} +@media screen and (min-width: 2000px) { + .layout { + max-width: 1500px; + } +} +.layout > div:first-child:not(.recent-posts) { + -webkit-align-self: flex-start; + align-self: flex-start; + -ms-flex-item-align: start; + padding: 50px 40px; +} +@media screen and (max-width: 768px) { + .layout > div:first-child:not(.recent-posts) { + padding: 36px 14px; + } +} +.layout > div:first-child { + width: 74%; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +@media screen and (max-width: 900px) { + .layout > div:first-child { + width: 100% !important; + } +} +.layout.hide-aside { + max-width: 1000px; +} +@media screen and (min-width: 2000px) { + .layout.hide-aside { + max-width: 1300px; + } +} +.layout.hide-aside > div { + width: 100% !important; +} +.apple #page-header.full_page { + background-attachment: scroll !important; +} +.apple .recent-post-item, +.apple .avatar-img, +.apple .flink-item-icon { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +#article-container .flink { + margin-bottom: 20px; +} +#article-container .flink .flink-list { + overflow: auto; + padding: 10px 10px 0; + text-align: center; +} +#article-container .flink .flink-list > .flink-list-item { + position: relative; + float: left; + overflow: hidden; + margin: 15px 7px; + width: calc(100% / 3 - 15px); + height: 90px; + border-radius: 8px; + line-height: 17px; + -webkit-transform: translateZ(0); +} +@media screen and (max-width: 1024px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(50% - 15px) !important; + } +} +@media screen and (max-width: 600px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(100% - 15px) !important; + } +} +#article-container .flink .flink-list > .flink-list-item:hover .flink-item-icon { + margin-left: -10px; + width: 0; +} +#article-container .flink .flink-list > .flink-list-item:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: var(--text-bg-hover); + content: ''; + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + -ms-transition: -ms-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); +} +#article-container .flink .flink-list > .flink-list-item:hover:before, +#article-container .flink .flink-list > .flink-list-item:focus:before, +#article-container .flink .flink-list > .flink-list-item:active:before { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +#article-container .flink .flink-list > .flink-list-item a { + color: var(--font-color); + text-decoration: none; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon { + float: left; + overflow: hidden; + margin: 15px 10px; + width: 60px; + height: 60px; + border-radius: 35px; + -webkit-transition: width 0.3s ease-out; + -moz-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + -ms-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +#article-container .flink .flink-list > .flink-list-item a .img-alt { + display: none; +} +#article-container .flink .flink-item-name { + padding: 16px 10px 0 0; + height: 40px; + font-weight: bold; + font-size: 1.43em; +} +#article-container .flink .flink-item-desc { + padding: 16px 10px 16px 0; + height: 50px; + font-size: 0.93em; +} +#article-container .flink .flink-name { + margin-bottom: 5px; + font-weight: bold; + font-size: 1.5em; +} +#recent-posts > .recent-post-item:not(:first-child) { + margin-top: 20px; +} +#recent-posts > .recent-post-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + height: 18em; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + } +} +#recent-posts > .recent-post-item:hover img.post-bg { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +#recent-posts > .recent-post-item.ads-wrap { + display: block !important; + height: auto !important; +} +#recent-posts > .recent-post-item .post_cover { + overflow: hidden; + width: 44%; + height: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover { + width: 100%; + height: 230px; + } +} +#recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 1; + -moz-box-ordinal-group: 1; + -o-box-ordinal-group: 1; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 0; + -moz-box-ordinal-group: 0; + -o-box-ordinal-group: 0; + -ms-flex-order: 0; + -webkit-order: 0; + order: 0; + } +} +#recent-posts > .recent-post-item >.recent-post-info { + padding: 0 40px; + width: 57%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info { + padding: 20px 20px 30px; + width: 100%; + } +} +#recent-posts > .recent-post-item >.recent-post-info.no-cover { + width: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info.no-cover { + padding: 30px 20px; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title { + color: var(--text-highlight-color); + font-size: 1.72em; + line-height: 1.4; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-line-clamp: 2; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info > .article-title { + font-size: 1.43em; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title:hover { + color: #49b1f5; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap { + margin: 6px 0; + color: #858585; + font-size: 90%; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap > .post-meta-date { + cursor: default; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .sticky { + color: #ff7242; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap i { + margin: 0 4px 0 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .fa-spinner { + margin: 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-label { + padding-right: 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-separator { + margin: 0 6px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-link { + margin: 0 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a { + color: #858585; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a:hover { + color: #49b1f5; + text-decoration: underline; +} +#recent-posts > .recent-post-item >.recent-post-info > .content { + -webkit-line-clamp: 2; +} +.tag-cloud-list a { + display: inline-block; + padding: 0 8px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.tag-cloud-list a:hover { + color: #49b1f5 !important; + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +@media screen and (max-width: 768px) { + .tag-cloud-list a { + zoom: 0.85; + } +} +.tag-cloud-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .tag-cloud-title { + font-size: 2em; + } +} +h1.page-title + .tag-cloud-list { + text-align: left; +} +#aside-content { + width: 26%; +} +@media screen and (min-width: 900px) { + #aside-content { + padding-left: 15px; + } +} +@media screen and (max-width: 900px) { + #aside-content { + width: 100%; + } +} +#aside-content > .card-widget:first-child { + margin-top: 0; +} +@media screen and (max-width: 900px) { + #aside-content > .card-widget:first-child { + margin-top: 20px; + } +} +#aside-content .card-widget { + position: relative; + overflow: hidden; + margin-top: 20px; + padding: 20px 24px; +} +#aside-content .card-info .author-info__name { + font-weight: 500; + font-size: 1.57em; +} +#aside-content .card-info .author-info__description { + margin-top: -0.42em; +} +#aside-content .card-info .card-info-data { + margin: 14px 0 4px; +} +#aside-content .card-info .card-info-social-icons { + margin: 6px 0 -6px; +} +#aside-content .card-info .card-info-social-icons .social-icon { + margin: 0 10px; + color: var(--font-color); + font-size: 1.4em; +} +#aside-content .card-info .card-info-social-icons i { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#aside-content .card-info .card-info-social-icons i:hover { + -webkit-transform: rotate(540deg); + -moz-transform: rotate(540deg); + -o-transform: rotate(540deg); + -ms-transform: rotate(540deg); + transform: rotate(540deg); +} +#aside-content .card-info #card-info-btn { + display: block; + margin-top: 14px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + line-height: 2.4; +} +#aside-content .card-info #card-info-btn:hover { + background-color: var(--btn-hover-color); +} +#aside-content .card-info #card-info-btn span { + padding-left: 10px; +} +#aside-content .item-headline { + padding-bottom: 6px; + font-size: 1.2em; +} +#aside-content .item-headline span { + margin-left: 6px; +} +@media screen and (min-width: 900px) { + #aside-content .sticky_layout { + position: sticky; + position: -webkit-sticky; + top: 20px; + -webkit-transition: top 0.3s; + -moz-transition: top 0.3s; + -o-transition: top 0.3s; + -ms-transition: top 0.3s; + transition: top 0.3s; + } +} +#aside-content .card-tag-cloud a { + display: inline-block; + padding: 0 4px; +} +#aside-content .card-tag-cloud a:hover { + color: #49b1f5 !important; +} +#aside-content .aside-list > span { + display: block; + margin-bottom: 10px; + text-align: center; +} +#aside-content .aside-list > .aside-list-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 6px 0; +} +#aside-content .aside-list > .aside-list-item:first-child { + padding-top: 0; +} +#aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed #f5f5f5; +} +#aside-content .aside-list > .aside-list-item:last-child { + padding-bottom: 0; +} +#aside-content .aside-list > .aside-list-item .thumbnail { + overflow: hidden; + width: 4.2em; + height: 4.2em; +} +#aside-content .aside-list > .aside-list-item .content { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-left: 10px; + word-break: break-all; +} +#aside-content .aside-list > .aside-list-item .content > .name { + -webkit-line-clamp: 1; +} +#aside-content .aside-list > .aside-list-item .content > time, +#aside-content .aside-list > .aside-list-item .content > .name { + display: block; + color: #858585; + font-size: 85%; +} +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment { + color: var(--font-color); + font-size: 95%; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#aside-content .aside-list > .aside-list-item .content > .title:hover, +#aside-content .aside-list > .aside-list-item .content > .comment:hover { + color: #49b1f5; +} +#aside-content .aside-list > .aside-list-item.no-cover { + min-height: 4.4em; +} +#aside-content .card-archives ul.card-archive-list, +#aside-content .card-categories ul.card-category-list { + margin: 0; + padding: 0; + list-style: none; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 3px 10px; + color: var(--font-color); + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover { + padding: 3px 17px; + background-color: var(--text-bg-hover); +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +#aside-content .card-categories .card-category-list.child { + padding: 0 0 0 16px; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-name { + width: 70% !important; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-count { + width: calc(100% - 70% - 20px); + text-align: right; +} +#aside-content .card-categories .card-category-list > .parent i { + float: right; + margin-right: -0.5em; + padding: 0.5em; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); +} +#aside-content .card-categories .card-category-list > .parent i.expand { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +#aside-content .card-webinfo .webinfo .webinfo-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 2px 10px 0; +} +#aside-content .card-webinfo .webinfo .webinfo-item div:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 20px; +} +@media screen and (min-width: 901px) { + #aside-content #card-toc { + right: 0 !important; + } +} +@media screen and (max-width: 900px) { + #aside-content #card-toc { + position: fixed; + right: -100%; + bottom: 30px; + z-index: 100; + max-width: 380px; + max-height: calc(100% - 60px); + width: calc(100% - 80px); + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: initial; + -moz-transition: initial; + -o-transition: initial; + -ms-transition: initial; + transition: initial; + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -o-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + } +} +#aside-content #card-toc .toc-percentage { + float: right; + margin-top: -9px; + color: #a9a9a9; + font-style: italic; + font-size: 140%; +} +#aside-content #card-toc .toc-content { + overflow-y: scroll; + overflow-y: overlay; + margin: 0 -24px; + max-height: calc(100vh - 120px); +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content { + max-height: calc(100vh - 140px); + } +} +#aside-content #card-toc .toc-content > * { + margin: 0 20px !important; +} +#aside-content #card-toc .toc-content > * > .toc-item > .toc-child { + margin-left: 10px; + padding-left: 10px; + border-left: 1px solid var(--dark-grey); +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: none; +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: block !important; + } +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child { + display: block; +} +#aside-content #card-toc .toc-content ol, +#aside-content #card-toc .toc-content li { + list-style: none; +} +#aside-content #card-toc .toc-content > ol { + padding: 0 !important; +} +#aside-content #card-toc .toc-content ol { + margin: 0; + padding-left: 18px; +} +#aside-content #card-toc .toc-content .toc-link { + display: block; + margin: 4px 0; + padding: 1px 6px; + color: var(--toc-link-color); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#aside-content #card-toc .toc-content .toc-link:hover { + color: #49b1f5; +} +#aside-content #card-toc .toc-content .toc-link.active { + background: #00c4b6; + color: #fff; +} +#aside-content :only-child > .card-widget { + margin-top: 0; +} +#aside-content .card-more-btn { + float: right; + color: inherit; +} +#aside-content .card-more-btn:hover { + -webkit-animation: more-btn-move 1s infinite; + -moz-animation: more-btn-move 1s infinite; + -o-animation: more-btn-move 1s infinite; + -ms-animation: more-btn-move 1s infinite; + animation: more-btn-move 1s infinite; +} +#aside-content .card-announcement .item-headline i { + color: #f00; +} +.avatar-img { + overflow: hidden; + margin: 0 auto; + width: 110px; + height: 110px; + border-radius: 70px; +} +.avatar-img img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +.avatar-img img:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +.site-data { + display: table; + width: 100%; + table-layout: fixed; +} +.site-data > a { + display: table-cell; +} +.site-data > a div { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.site-data > a:hover div { + color: #49b1f5 !important; +} +.site-data > a .headline { + color: var(--font-color); +} +.site-data > a .length-num { + margin-top: -0.32em; + color: var(--text-highlight-color); + font-size: 1.4em; +} +@media screen and (min-width: 900px) { + html.hide-aside .layout { + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + } + html.hide-aside .layout > .aside-content { + display: none; + } + html.hide-aside .layout > div:first-child { + width: 80%; + } +} +.page .sticky_layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +@-moz-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-webkit-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-o-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-moz-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +#post-comment .comment-head { + margin-bottom: 20px; +} +#post-comment .comment-head .comment-headline { + display: inline-block; + vertical-align: middle; + font-weight: 700; + font-size: 1.43em; +} +#post-comment .comment-head #comment-switch { + display: inline-block; + float: right; + margin: 2px auto 0; + padding: 4px 16px; + width: max-content; + border-radius: 8px; + background: #f6f8fa; +} +#post-comment .comment-head #comment-switch .first-comment { + color: #49b1f5; +} +#post-comment .comment-head #comment-switch .second-comment { + color: #ff7242; +} +#post-comment .comment-head #comment-switch .switch-btn { + position: relative; + display: inline-block; + margin: -4px 8px 0; + width: 42px; + height: 22px; + border-radius: 34px; + background-color: #49b1f5; + vertical-align: middle; + cursor: pointer; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head #comment-switch .switch-btn:before { + position: absolute; + bottom: 4px; + left: 4px; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: #fff; + content: ''; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head #comment-switch .switch-btn.move { + background-color: #ff7242; +} +#post-comment .comment-head #comment-switch .switch-btn.move:before { + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -o-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} +#post-comment .comment-wrap > div:nth-child(2) { + display: none; +} +#footer { + position: relative; + background-color: #49b1f5; + background-attachment: scroll; + background-position: bottom; + background-size: cover; +} +#footer-wrap { + position: relative; + padding: 40px 20px; + color: var(--light-grey); + text-align: center; +} +#footer-wrap a { + color: var(--light-grey); +} +#footer-wrap a:hover { + text-decoration: underline; +} +#footer-wrap .footer-separator { + margin: 0 4px; +} +#footer-wrap .icp-icon { + padding: 0 4px; + max-height: 1.4em; + width: auto; + vertical-align: text-bottom; +} +#page-header { + position: relative; + width: 100%; + background-color: #49b1f5; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header:not(.not-top-img):before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.3); + content: ''; +} +#page-header.full_page { + height: 100vh; + background-attachment: fixed; +} +#page-header.full_page #site-info { + position: absolute; + top: 43%; + padding: 0 10px; + width: 100%; +} +#page-header #site-title, +#page-header #site-subtitle, +#page-header #scroll-down .scroll-down-effects { + text-align: center; + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + line-height: 1.5; +} +#page-header #site-title { + margin: 0; + color: var(--white); + font-size: 1.85em; +} +@media screen and (min-width: 768px) { + #page-header #site-title { + font-size: 2.85em; + } +} +#page-header #site-subtitle { + color: var(--light-grey); + font-size: 1.15em; +} +@media screen and (min-width: 768px) { + #page-header #site-subtitle { + font-size: 1.72em; + } +} +#page-header #site_social_icons { + display: none; + margin: 0 auto; + width: 300px; + text-align: center; +} +@media screen and (max-width: 768px) { + #page-header #site_social_icons { + display: block; + } +} +#page-header #site_social_icons .social-icon { + margin: 0 10px; + color: var(--light-grey); + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-size: 1.43em; +} +#page-header #scroll-down { + position: absolute; + bottom: 0; + width: 100%; + cursor: pointer; +} +#page-header #scroll-down .scroll-down-effects { + position: relative; + width: 100%; + color: var(--light-grey); + font-size: 30px; +} +#page-header.not-home-page { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.not-home-page { + height: 280px; + } +} +#page-header #page-site-info { + position: absolute; + top: 200px; + padding: 0 10px; + width: 100%; +} +@media screen and (max-width: 768px) { + #page-header #page-site-info { + top: 140px; + } +} +#page-header.post-bg { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.post-bg { + height: 360px; + } +} +#page-header.post-bg:before { + background-color: rgba(0,0,0,0.5); +} +#page-header #post-info { + position: absolute; + bottom: 100px; + padding: 0 8%; + width: 100%; + text-align: center; +} +@media screen and (max-width: 900px) { + #page-header #post-info { + bottom: 30px; + text-align: left; + } +} +@media screen and (max-width: 768px) { + #page-header #post-info { + bottom: 22px; + padding: 0 22px; + } +} +#page-header.not-top-img { + margin-bottom: 10px; + height: 60px; + background: 0; +} +#page-header.not-top-img #nav { + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); +} +#page-header.not-top-img #nav a, +#page-header.not-top-img #nav .site-name { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav { + position: fixed; + top: -60px; + z-index: 91; + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + -webkit-transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -moz-transition: -moz-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -o-transition: -o-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -ms-transition: -ms-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; +} +#page-header.nav-fixed #nav #blog-info { + color: var(--font-color); +} +#page-header.nav-fixed #nav #blog-info:hover { + color: #49b1f5; +} +#page-header.nav-fixed #nav #blog-info .site-name { + text-shadow: none; +} +#page-header.nav-fixed #nav a, +#page-header.nav-fixed #nav #toggle-menu { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav a:hover, +#page-header.nav-fixed #nav #toggle-menu:hover { + color: #49b1f5; +} +#page-header.nav-fixed.fixed #nav { + top: 0; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header.nav-visible:not(.fixed) #nav { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); +} +#page-header.nav-visible:not(.fixed) + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed #nav { + position: fixed; +} +#page-header.fixed + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed + .layout #card-toc .toc-content { + max-height: calc(100vh - 170px); +} +#page h1.page-title { + margin: 8px 0 20px; +} +#post > #post-info { + margin-bottom: 30px; +} +#post > #post-info .post-title { + padding-bottom: 4px; + border-bottom: 1px solid var(--light-grey); + color: var(--text-highlight-color); +} +#post > #post-info .post-title .post-edit-link { + float: right; +} +#post > #post-info #post-meta, +#post > #post-info #post-meta a { + color: #78818a; +} +#post-info .post-title { + margin-bottom: 8px; + color: var(--white); + font-weight: normal; + font-size: 2.5em; + line-height: 1.5; + -webkit-line-clamp: 3; +} +@media screen and (max-width: 768px) { + #post-info .post-title { + font-size: 2.1em; + } +} +#post-info .post-title .post-edit-link { + padding-left: 10px; +} +#post-info #post-meta { + color: var(--light-grey); + font-size: 95%; +} +@media screen and (min-width: 768px) { + #post-info #post-meta > .meta-secondline > span:first-child { + display: none; + } +} +@media screen and (max-width: 768px) { + #post-info #post-meta { + font-size: 90%; + } + #post-info #post-meta > .meta-firstline, + #post-info #post-meta > .meta-secondline { + display: inline; + } +} +#post-info #post-meta .post-meta-separator { + margin: 0 5px; +} +#post-info #post-meta .post-meta-icon { + margin-right: 4px; +} +#post-info #post-meta .post-meta-label { + margin-right: 4px; +} +#post-info #post-meta a { + color: var(--light-grey); + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#post-info #post-meta a:hover { + color: #49b1f5; + text-decoration: underline; +} +#nav { + position: absolute; + top: 0; + z-index: 90; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 0 36px; + width: 100%; + height: 60px; + font-size: 1.3em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +@media screen and (max-width: 768px) { + #nav { + padding: 0 16px; + } +} +#nav.show { + opacity: 1; + -ms-filter: none; + filter: none; +} +#nav #blog-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + color: var(--light-grey); +} +#nav #blog-info .site-icon { + margin-right: 6px; + height: 36px; + vertical-align: middle; +} +#nav #toggle-menu { + display: none; + padding: 2px 0 0 6px; + vertical-align: top; +} +#nav #toggle-menu:hover { + color: var(--white); +} +#nav a { + color: var(--light-grey); +} +#nav a:hover { + color: var(--white); +} +#nav .site-name { + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-weight: bold; +} +#nav .menus_items { + display: inline; +} +#nav .menus_items .menus_item { + position: relative; + display: inline-block; + padding: 0 0 0 14px; +} +#nav .menus_items .menus_item:hover .menus_item_child { + display: block; +} +#nav .menus_items .menus_item:hover > a > i:last-child { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +#nav .menus_items .menus_item > a > i:last-child { + padding: 4px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#nav .menus_items .menus_item .menus_item_child { + position: absolute; + right: 0; + display: none; + margin-top: 8px; + padding: 0; + width: max-content; + border-radius: 5px; + background-color: var(--sidebar-bg); + -webkit-box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + -webkit-animation: sub_menus 0.3s 0.1s ease both; + -moz-animation: sub_menus 0.3s 0.1s ease both; + -o-animation: sub_menus 0.3s 0.1s ease both; + -ms-animation: sub_menus 0.3s 0.1s ease both; + animation: sub_menus 0.3s 0.1s ease both; +} +#nav .menus_items .menus_item .menus_item_child:before { + position: absolute; + top: -8px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +#nav .menus_items .menus_item .menus_item_child li { + list-style: none; +} +#nav .menus_items .menus_item .menus_item_child li:hover { + background: var(--text-bg-hover); +} +#nav .menus_items .menus_item .menus_item_child li:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li a { + display: inline-block; + padding: 8px 16px; + width: 100%; + color: var(--font-color) !important; + text-shadow: none !important; +} +#nav.hide-menu #toggle-menu { + display: inline-block !important; +} +#nav.hide-menu #toggle-menu .site-page { + font-size: inherit; +} +#nav.hide-menu .menus_items { + display: none; +} +#nav.hide-menu #search-button span { + display: none; +} +#nav #search-button { + display: inline; + padding: 0 0 0 14px; +} +#nav .site-page { + position: relative; + padding-bottom: 6px; + text-shadow: 1px 1px 2px rgba(0,0,0,0.3); + font-size: 0.78em; + cursor: pointer; +} +#nav .site-page:not(.child):after { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + width: 0; + height: 3px; + background-color: #80c8f8; + content: ''; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#nav .site-page:not(.child):hover:after { + width: 100%; +} +#pagination .pagination { + margin-top: 20px; + text-align: center; +} +#pagination .page-number.current { + background: #00c4b6; + color: var(--white); +} +#pagination .pagination-info { + position: absolute; + top: 50%; + padding: 20px 40px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#pagination .prev_info, +#pagination .next_info { + color: var(--white); + font-weight: 500; +} +#pagination .next-post .pagination-info { + text-align: right; +} +#pagination .pull-full { + width: 100% !important; +} +#pagination .prev-post .label, +#pagination .next-post .label { + color: var(--light-grey); + text-transform: uppercase; + font-size: 90%; +} +#pagination .prev-post, +#pagination .next-post { + width: 50%; +} +@media screen and (max-width: 768px) { + #pagination .prev-post, + #pagination .next-post { + width: 100%; + } +} +#pagination .prev-post a, +#pagination .next-post a { + position: relative; + display: block; + overflow: hidden; + height: 150px; +} +#pagination.pagination-post { + overflow: hidden; + margin-top: 40px; + width: 100%; + background: #000; +} +.layout > .recent-posts .pagination > * { + display: inline-block; + margin: 0 6px; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; +} +.layout > .recent-posts .pagination > *:not(.space):hover { + background: var(--btn-hover-color); + color: var(--btn-color); +} +.layout > div:not(.recent-posts) .pagination .page-number { + display: inline-block; + margin: 0 4px; + min-width: 24px; + height: 24px; + text-align: center; + line-height: 24px; + cursor: pointer; +} +#article-container { + word-wrap: break-word; + overflow-wrap: break-word; +} +#article-container a { + color: #49b1f5; +} +#article-container a:hover { + text-decoration: underline; +} +#article-container img { + display: block; + margin: 0 auto 20px; + max-width: 100%; + -webkit-transition: filter 375ms ease-in 0.2s; + -moz-transition: filter 375ms ease-in 0.2s; + -o-transition: filter 375ms ease-in 0.2s; + -ms-transition: filter 375ms ease-in 0.2s; + transition: filter 375ms ease-in 0.2s; +} +#article-container p { + margin: 0 0 16px; +} +#article-container iframe { + margin: 0 0 20px; +} +#article-container kbd { + margin: 0 3px; + padding: 3px 5px; + border: 1px solid #b4b4b4; + border-radius: 3px; + background-color: #f8f8f8; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + color: #34495e; + white-space: nowrap; + font-weight: 600; + font-size: 0.9em; + font-family: Monaco, 'Ubuntu Mono', monospace; + line-height: 1em; +} +#article-container ol ol, +#article-container ul ol, +#article-container ol ul, +#article-container ul ul { + padding-left: 20px; +} +#article-container ol li, +#article-container ul li { + margin: 4px 0; +} +#article-container ol p, +#article-container ul p { + margin: 0 0 8px; +} +#article-container h1, +#article-container h2, +#article-container h3, +#article-container h4, +#article-container h5, +#article-container h6 { + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#article-container h1:before, +#article-container h2:before, +#article-container h3:before, +#article-container h4:before, +#article-container h5:before, +#article-container h6:before { + position: absolute; + top: calc(50% - 7px); + color: #00a7fa; + content: '\f52d'; + line-height: 1; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#article-container h1:hover:before, +#article-container h2:hover:before, +#article-container h3:hover:before, +#article-container h4:hover:before, +#article-container h5:hover:before, +#article-container h6:hover:before { + color: #49b1f5; +} +#article-container h1 { + padding-left: 32px; +} +#article-container h1:before { + margin-left: -26px; + font-size: 20px; +} +#article-container h1:hover { + padding-left: 38px; +} +#article-container h2 { + padding-left: 30px; +} +#article-container h2:before { + margin-left: -24px; + font-size: 18px; +} +#article-container h2:hover { + padding-left: 36px; +} +#article-container h3 { + padding-left: 28px; +} +#article-container h3:before { + margin-left: -22px; + font-size: 16px; +} +#article-container h3:hover { + padding-left: 34px; +} +#article-container h4 { + padding-left: 26px; +} +#article-container h4:before { + margin-left: -20px; + font-size: 14px; +} +#article-container h4:hover { + padding-left: 32px; +} +#article-container h5 { + padding-left: 24px; +} +#article-container h5:before { + margin-left: -18px; + font-size: 12px; +} +#article-container h5:hover { + padding-left: 30px; +} +#article-container h6 { + padding-left: 24px; +} +#article-container h6:before { + margin-left: -18px; + font-size: 12px; +} +#article-container h6:hover { + padding-left: 30px; +} +#article-container ol p, +#article-container ul p { + margin: 0 0 8px; +} +#article-container li::marker { + color: #49b1f5; + font-weight: 600; + font-size: 1.05em; +} +#article-container li:hover::marker { + color: var(--pseudo-hover); +} +#article-container ul > li { + list-style-type: circle; +} +#article-container > :last-child { + margin-bottom: 0 !important; +} +#post .tag_share:after { + display: block; + clear: both; + content: ''; +} +#post .tag_share .post-meta__tag-list { + display: inline-block; +} +#post .tag_share .post-meta__tags { + display: inline-block; + margin: 8px 8px 8px 0; + padding: 0 12px; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#post .tag_share .post-meta__tags:hover { + background: #49b1f5; + color: var(--white); +} +#post .tag_share .post_share { + display: inline-block; + float: right; + margin: 8px 0 0; + width: fit-content; +} +#post .tag_share .post_share .social-share { + font-size: 0.85em; +} +#post .tag_share .post_share .social-share .social-share-icon { + margin: 0 4px; + width: 1.85em; + height: 1.85em; + font-size: 1.2em; + line-height: 1.85em; +} +#post .post-copyright { + position: relative; + margin: 40px 0 10px; + padding: 10px 16px; + border: 1px solid var(--light-grey); + -webkit-transition: box-shadow 0.3s ease-in-out; + -moz-transition: box-shadow 0.3s ease-in-out; + -o-transition: box-shadow 0.3s ease-in-out; + -ms-transition: box-shadow 0.3s ease-in-out; + transition: box-shadow 0.3s ease-in-out; +} +#post .post-copyright:before { + position: absolute; + top: 2px; + right: 12px; + color: #49b1f5; + content: '\f1f9'; + font-size: 1.3em; +} +#post .post-copyright:hover { + -webkit-box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); + box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); +} +#post .post-copyright .post-copyright-meta { + color: #49b1f5; + font-weight: bold; +} +#post .post-copyright .post-copyright-info { + padding-left: 6px; +} +#post .post-copyright .post-copyright-info a { + text-decoration: underline; + word-break: break-word; +} +#post .post-copyright .post-copyright-info a:hover { + text-decoration: none; +} +#post .post-outdate-notice { + position: relative; + margin: 0 0 20px; + padding: 0.5em 1.2em; + border-radius: 3px; + background-color: #ffe6e6; + color: #f66; + padding: 0.5em 1em 0.5em 2.6em; + border-left: 5px solid #ff8080; +} +#post .post-outdate-notice:before { + position: absolute; + top: 50%; + left: 0.9em; + color: #ff8080; + content: '\f071'; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +#post .ads-wrap { + margin: 40px 0; +} +.relatedPosts { + margin-top: 40px; +} +.relatedPosts > .headline { + margin-bottom: 5px; + font-weight: 700; + font-size: 1.43em; +} +.relatedPosts > .relatedPosts-list > div { + position: relative; + display: inline-block; + overflow: hidden; + margin: 3px; + width: calc(33.333% - 6px); + height: 200px; + background: #000; + vertical-align: bottom; +} +@media screen and (max-width: 768px) { + .relatedPosts > .relatedPosts-list > div { + margin: 2px; + width: calc(50% - 4px); + height: 150px; + } +} +@media screen and (max-width: 600px) { + .relatedPosts > .relatedPosts-list > div { + width: calc(100% - 4px); + } +} +.relatedPosts > .relatedPosts-list .content { + position: absolute; + top: 50%; + padding: 0 20px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.relatedPosts > .relatedPosts-list .content .date { + color: var(--light-grey); + font-size: 90%; +} +.relatedPosts > .relatedPosts-list .content .title { + color: var(--white); + -webkit-line-clamp: 2; +} +.post-reward { + position: relative; + margin-top: 80px; + width: 100%; + text-align: center; + pointer-events: none; +} +.post-reward > * { + pointer-events: auto; +} +.post-reward .reward-button { + display: inline-block; + padding: 4px 24px; + background: var(--btn-bg); + color: var(--btn-color); + cursor: pointer; +} +.post-reward:hover .reward-button { + background: var(--btn-hover-color); +} +.post-reward:hover > .reward-main { + display: block; +} +.post-reward .reward-main { + position: absolute; + bottom: 40px; + left: 0; + z-index: 100; + display: none; + padding: 0 0 15px; + width: 100%; +} +.post-reward .reward-main .reward-all { + display: inline-block; + margin: 0; + padding: 20px 10px; + border-radius: 4px; + background: var(--reward-pop); +} +.post-reward .reward-main .reward-all:before { + position: absolute; + bottom: -10px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +.post-reward .reward-main .reward-all:after { + position: absolute; + right: 0; + bottom: 2px; + left: 0; + margin: 0 auto; + width: 0; + height: 0; + border-top: 13px solid var(--reward-pop); + border-right: 13px solid transparent; + border-left: 13px solid transparent; + content: ''; +} +.post-reward .reward-main .reward-all .reward-item { + display: inline-block; + padding: 0 8px; + list-style-type: none; + vertical-align: top; +} +.post-reward .reward-main .reward-all .reward-item img { + width: 130px; + height: 130px; +} +.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc { + width: 130px; + color: #858585; +} +#rightside { + position: fixed; + right: -48px; + bottom: 40px; + z-index: 100; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#rightside #rightside-config-hide { + height: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: -webkit-transform 0.4s; + -moz-transition: -moz-transform 0.4s; + -o-transition: -o-transform 0.4s; + -ms-transition: -ms-transform 0.4s; + transition: transform 0.4s; + -webkit-transform: translate(45px, 0); + -moz-transform: translate(45px, 0); + -o-transform: translate(45px, 0); + -ms-transform: translate(45px, 0); + transform: translate(45px, 0); +} +#rightside #rightside-config-hide.show { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +#rightside #rightside-config-hide.status { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; +} +#rightside > div > button, +#rightside > div > a { + display: block; + margin-bottom: 5px; + width: 35px; + height: 35px; + border-radius: 5px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + font-size: 16px; + line-height: 35px; +} +#rightside > div > button:hover, +#rightside > div > a:hover { + background-color: var(--btn-hover-color); +} +#rightside #mobile-toc-button { + display: none; +} +@media screen and (max-width: 900px) { + #rightside #mobile-toc-button { + display: block; + } +} +@media screen and (max-width: 900px) { + #rightside #hide-aside-btn { + display: none; + } +} +#sidebar #menu-mask { + position: fixed; + z-index: 102; + display: none; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.8); +} +#sidebar #sidebar-menus { + position: fixed; + top: 0; + right: -300px; + z-index: 103; + overflow-x: hidden; + overflow-y: auto; + width: 300px; + height: 100%; + background: var(--sidebar-bg); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#sidebar #sidebar-menus.open { + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#sidebar #sidebar-menus > .avatar-img { + margin: 20px auto; +} +#sidebar #sidebar-menus .sidebar-site-data { + padding: 0 10px; +} +#sidebar #sidebar-menus hr { + margin: 20px auto; +} +#sidebar #sidebar-menus .menus_items { + padding: 0 10px 40px; +} +#sidebar #sidebar-menus .menus_items .site-page { + position: relative; + display: block; + padding: 6px 30px 6px 22px; + color: var(--font-color); + font-size: 1.15em; +} +#sidebar #sidebar-menus .menus_items .site-page:hover { + background: var(--text-bg-hover); +} +#sidebar #sidebar-menus .menus_items .site-page i:first-child { + width: 15%; + text-align: left; +} +#sidebar #sidebar-menus .menus_items .site-page.group > i:last-child { + position: absolute; + top: 0.78em; + right: 18px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide > i:last-child { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide + .menus_item_child { + display: none; +} +#sidebar #sidebar-menus .menus_items .menus_item_child { + margin: 0; + list-style: none; +} +#vcomment { + font-size: 1.1em; +} +#vcomment .vbtn { + border: none; + background: var(--btn-bg); + color: var(--btn-color); +} +#vcomment .vbtn:hover { + background: var(--btn-hover-color); +} +#vcomment .vimg { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#vcomment .vimg:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#vcomment .vcards .vcard .vcontent.expand:before, +#vcomment .vcards .vcard .vcontent.expand:after { + z-index: 22; +} +#waline-wrap { + --waline-font-size: 1.1em; + --waline-theme-color: #49b1f5; + --waline-active-color: #ff7242; +} +#waline-wrap .wl-comment-actions > button:not(last-child) { + padding-right: 4px; +} +.fireworks { + position: fixed; + top: 0; + left: 0; + z-index: 9999; + pointer-events: none; +} +.medium-zoom-image--opened { + z-index: 99999 !important; + margin: 0 !important; +} +.medium-zoom-overlay { + z-index: 99999 !important; +} +.mermaid-wrap { + margin: 0 0 20px; + text-align: center; +} +.mermaid-wrap > svg { + height: 100%; +} +.utterances, +.fb-comments iframe { + width: 100% !important; +} +#gitalk-container .gt-meta { + margin: 0 0 0.8em; + padding: 6px 0 16px; +} +.katex-wrap { + overflow: auto; +} +.katex-wrap::-webkit-scrollbar { + display: none; +} +.mathjax-overflow { + overflow-x: auto; + overflow-y: hidden; +} +span.mathjax-overflow { + display: inline-block; + padding: 0 2px; + max-width: 100%; + vertical-align: bottom; +} +.aplayer { + color: #4c4948; +} +#article-container .aplayer { + margin: 0 0 20px; +} +#article-container .aplayer ol, +#article-container .aplayer ul { + margin: 0; + padding: 0; +} +#article-container .aplayer ol li, +#article-container .aplayer ul li { + margin: 0; + padding: 0 15px; +} +#article-container .aplayer ol li:before, +#article-container .aplayer ul li:before { + content: none; +} +.snackbar-css { + border-radius: 5px !important; +} +#article-container .btn-center { + margin: 0 0 20px; + text-align: center; +} +#article-container .btn-beautify { + display: inline-block; + margin: 0 4px 6px; + padding: 0 15px; + background-color: var(--btn-beautify-color, #777); + color: #fff; + line-height: 2; +} +#article-container .btn-beautify.blue { + --btn-beautify-color: #428bca; +} +#article-container .btn-beautify.pink { + --btn-beautify-color: #ff69b4; +} +#article-container .btn-beautify.red { + --btn-beautify-color: #f00; +} +#article-container .btn-beautify.purple { + --btn-beautify-color: #6f42c1; +} +#article-container .btn-beautify.orange { + --btn-beautify-color: #ff8c00; +} +#article-container .btn-beautify.green { + --btn-beautify-color: #5cb85c; +} +#article-container .btn-beautify:hover { + background-color: var(--btn-hover-color); +} +#article-container .btn-beautify i + span { + margin-left: 6px; +} +#article-container .btn-beautify:not(.block) + .btn-beautify:not(.block) { + margin: 0 4px 20px; +} +#article-container .btn-beautify.block { + display: block; + margin: 0 0 20px; + width: fit-content; + width: -moz-fit-content; +} +#article-container .btn-beautify.block.center { + margin: 0 auto 20px; +} +#article-container .btn-beautify.block.right { + margin: 0 0 20px auto; +} +#article-container .btn-beautify.larger { + padding: 6px 15px; +} +#article-container .btn-beautify:hover { + text-decoration: none; +} +#article-container .btn-beautify.outline { + border: 1px solid transparent; + border-color: var(--btn-beautify-color, #777); + background-color: transparent; + color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + background-color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + color: #fff !important; +} +#article-container figure.gallery-group { + position: relative; + float: left; + overflow: hidden; + margin: 6px 4px; + width: calc(50% - 8px); + height: 250px; + border-radius: 8px; + background: #000; + -webkit-transform: translate3d(0, 0, 0); +} +@media screen and (max-width: 600px) { + #article-container figure.gallery-group { + width: calc(100% - 8px); + } +} +#article-container figure.gallery-group:hover img { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover .gallery-group-name::after { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover p { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group img { + position: relative; + margin: 0; + max-width: none; + width: calc(100% + 20px); + height: 250px; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transition: all 0.3s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.3s, filter 375ms ease-in 0.2s; + -o-transition: all 0.3s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.3s, filter 375ms ease-in 0.2s; + transition: all 0.3s, filter 375ms ease-in 0.2s; + -webkit-transform: translate3d(-10px, 0, 0); + -moz-transform: translate3d(-10px, 0, 0); + -o-transform: translate3d(-10px, 0, 0); + -ms-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + object-fit: cover; +} +#article-container figure.gallery-group figcaption { + position: absolute; + top: 0; + left: 0; + padding: 30px; + width: 100%; + height: 100%; + color: #fff; + text-transform: uppercase; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} +#article-container figure.gallery-group figcaption > a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container figure.gallery-group p { + margin: 0; + padding: 8px 0 0; + letter-spacing: 1px; + font-size: 1.1em; + line-height: 1.5; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.35s, -webkit-transform 0.35s; + -moz-transition: opacity 0.35s, -moz-transform 0.35s; + -o-transition: opacity 0.35s, -o-transform 0.35s; + -ms-transition: opacity 0.35s, -ms-transform 0.35s; + transition: opacity 0.35s, transform 0.35s; + -webkit-transform: translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0); + -o-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + -webkit-line-clamp: 4; +} +#article-container figure.gallery-group .gallery-group-name { + position: relative; + margin: 0; + padding: 8px 0; + font-weight: bold; + font-size: 1.65em; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#article-container figure.gallery-group .gallery-group-name:after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: #fff; + content: ''; + -webkit-transition: -webkit-transform 0.35s; + -moz-transition: -moz-transform 0.35s; + -o-transition: -o-transform 0.35s; + -ms-transition: -ms-transform 0.35s; + transition: transform 0.35s; + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#article-container .gallery-group-main { + overflow: auto; + padding: 0 0 16px; +} +#article-container .gallery { + margin: 0 0 16px; + text-align: center; +} +#article-container .gallery .fj-gallery { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .gallery .fj-gallery .img-alt { + display: none; +} +#article-container .gallery .fj-gallery.lazyload + button { + display: inline-block; +} +#article-container .gallery .fj-gallery .gallery-data { + display: none; +} +#article-container .gallery button { + display: none; + margin-top: 25px; + padding: 10px; + width: 9em; + border-radius: 5px; + background: var(--btn-bg); + color: var(--btn-color); + font-weight: bold; + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#article-container .gallery button > * { + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#article-container .gallery button i { + width: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .gallery button:hover { + background: var(--btn-hover-color); +} +#article-container .gallery button:hover i { + margin-left: 2px; + width: 20px; + opacity: 1; + -ms-filter: none; + filter: none; +} +blockquote.pullquote { + position: relative; + max-width: 45%; + font-size: 110%; +} +blockquote.pullquote.left { + float: left; + margin: 1em 0.5em 0 0; +} +blockquote.pullquote.right { + float: right; + margin: 1em 0 0 0.5em; +} +.video-container { + position: relative; + overflow: hidden; + margin-bottom: 16px; + padding-top: 56.25%; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +.hide-inline > .hide-button, +.hide-block > .hide-button { + display: inline-block; + padding: 5px 18px; + background: #49b1f5; + color: var(--white); +} +.hide-inline > .hide-button:hover, +.hide-block > .hide-button:hover { + background-color: var(--btn-hover-color); +} +.hide-inline > .hide-button.open, +.hide-block > .hide-button.open { + display: none; +} +.hide-inline > .hide-button.open + div, +.hide-block > .hide-button.open + div { + display: block; +} +.hide-inline > .hide-button.open + span, +.hide-block > .hide-button.open + span { + display: inline; +} +.hide-inline > .hide-content, +.hide-block > .hide-content { + display: none; +} +.hide-inline > .hide-button { + margin: 0 6px; +} +.hide-inline > .hide-content { + margin: 0 6px; +} +.hide-block { + margin: 0 0 16px; +} +.toggle { + margin-bottom: 20px; + border: 1px solid #f0f0f0; +} +.toggle > .toggle-button { + padding: 6px 15px; + background: #f0f0f0; + color: #1f2d3d; + cursor: pointer; +} +.toggle > .toggle-content { + margin: 30px 24px; +} +#article-container .inline-img { + display: inline; + margin: 0 3px; + height: 1.1em; + vertical-align: text-bottom; +} +.hl-label { + padding: 2px 4px; + border-radius: 3px; + color: #fff; +} +.hl-label.default { + background-color: #777; +} +.hl-label.blue { + background-color: #428bca; +} +.hl-label.pink { + background-color: #ff69b4; +} +.hl-label.red { + background-color: #f00; +} +.hl-label.purple { + background-color: #6f42c1; +} +.hl-label.orange { + background-color: #ff8c00; +} +.hl-label.green { + background-color: #5cb85c; +} +.note { + position: relative; + margin: 0 0 20px; + padding: 15px; + border-radius: 3px; +} +.note.icon-padding { + padding-left: 3em; +} +.note > .note-icon { + position: absolute; + top: calc(50% - 0.5em); + left: 0.8em; + font-size: larger; +} +.note.blue:not(.disabled) { + border-left-color: #428bca !important; +} +.note.blue:not(.disabled).modern { + border-left-color: transparent !important; + color: #428bca; +} +.note.blue:not(.disabled):not(.simple) { + background: #e3eef7 !important; +} +.note.blue > .note-icon { + color: #428bca; +} +.note.pink:not(.disabled) { + border-left-color: #ff69b4 !important; +} +.note.pink:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff69b4; +} +.note.pink:not(.disabled):not(.simple) { + background: #ffe9f4 !important; +} +.note.pink > .note-icon { + color: #ff69b4; +} +.note.red:not(.disabled) { + border-left-color: #f00 !important; +} +.note.red:not(.disabled).modern { + border-left-color: transparent !important; + color: #f00; +} +.note.red:not(.disabled):not(.simple) { + background: #ffd9d9 !important; +} +.note.red > .note-icon { + color: #f00; +} +.note.purple:not(.disabled) { + border-left-color: #6f42c1 !important; +} +.note.purple:not(.disabled).modern { + border-left-color: transparent !important; + color: #6f42c1; +} +.note.purple:not(.disabled):not(.simple) { + background: #e9e3f6 !important; +} +.note.purple > .note-icon { + color: #6f42c1; +} +.note.orange:not(.disabled) { + border-left-color: #ff8c00 !important; +} +.note.orange:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff8c00; +} +.note.orange:not(.disabled):not(.simple) { + background: #ffeed9 !important; +} +.note.orange > .note-icon { + color: #ff8c00; +} +.note.green:not(.disabled) { + border-left-color: #5cb85c !important; +} +.note.green:not(.disabled).modern { + border-left-color: transparent !important; + color: #5cb85c; +} +.note.green:not(.disabled):not(.simple) { + background: #e7f4e7 !important; +} +.note.green > .note-icon { + color: #5cb85c; +} +.note.simple { + border: 1px solid #eee; + border-left-width: 5px; +} +.note.modern { + border: 1px solid transparent !important; + background-color: #f5f5f5; + color: #4c4948; +} +.note.flat { + border: initial; + border-left: 5px solid #eee; + background-color: #f9f9f9; + color: #4c4948; +} +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 3px; + margin-bottom: 0; + padding-top: 0 !important; + border-bottom: initial; +} +.note p:first-child, +.note ul:first-child, +.note ol:first-child, +.note table:first-child, +.note pre:first-child, +.note blockquote:first-child, +.note img:first-child { + margin-top: 0 !important; +} +.note p:last-child, +.note ul:last-child, +.note ol:last-child, +.note table:last-child, +.note pre:last-child, +.note blockquote:last-child, +.note img:last-child { + margin-bottom: 0 !important; +} +.note:not(.no-icon) { + padding-left: 3em; +} +.note:not(.no-icon)::before { + position: absolute; + top: calc(50% - 0.95em); + left: 0.8em; + font-size: larger; +} +.note.default.flat { + background: #f7f7f7; +} +.note.default.modern { + border-color: #e1e1e1; + background: #f3f3f3; + color: #666; +} +.note.default.modern a:not(.btn) { + color: #666; +} +.note.default.modern a:not(.btn):hover { + color: #454545; +} +.note.default:not(.modern) { + border-left-color: #777; +} +.note.default:not(.modern) h2, +.note.default:not(.modern) h3, +.note.default:not(.modern) h4, +.note.default:not(.modern) h5, +.note.default:not(.modern) h6 { + color: #777; +} +.note.default:not(.no-icon)::before { + content: '\f0a9'; +} +.note.default:not(.no-icon):not(.modern)::before { + color: #777; +} +.note.primary.flat { + background: #f5f0fa; +} +.note.primary.modern { + border-color: #e1c2ff; + background: #f3daff; + color: #6f42c1; +} +.note.primary.modern a:not(.btn) { + color: #6f42c1; +} +.note.primary.modern a:not(.btn):hover { + color: #453298; +} +.note.primary:not(.modern) { + border-left-color: #6f42c1; +} +.note.primary:not(.modern) h2, +.note.primary:not(.modern) h3, +.note.primary:not(.modern) h4, +.note.primary:not(.modern) h5, +.note.primary:not(.modern) h6 { + color: #6f42c1; +} +.note.primary:not(.no-icon)::before { + content: '\f055'; +} +.note.primary:not(.no-icon):not(.modern)::before { + color: #6f42c1; +} +.note.info.flat { + background: #eef7fa; +} +.note.info.modern { + border-color: #b3e5ef; + background: #d9edf7; + color: #31708f; +} +.note.info.modern a:not(.btn) { + color: #31708f; +} +.note.info.modern a:not(.btn):hover { + color: #215761; +} +.note.info:not(.modern) { + border-left-color: #428bca; +} +.note.info:not(.modern) h2, +.note.info:not(.modern) h3, +.note.info:not(.modern) h4, +.note.info:not(.modern) h5, +.note.info:not(.modern) h6 { + color: #428bca; +} +.note.info:not(.no-icon)::before { + content: '\f05a'; +} +.note.info:not(.no-icon):not(.modern)::before { + color: #428bca; +} +.note.success.flat { + background: #eff8f0; +} +.note.success.modern { + border-color: #d0e6be; + background: #dff0d8; + color: #3c763d; +} +.note.success.modern a:not(.btn) { + color: #3c763d; +} +.note.success.modern a:not(.btn):hover { + color: #32562c; +} +.note.success:not(.modern) { + border-left-color: #5cb85c; +} +.note.success:not(.modern) h2, +.note.success:not(.modern) h3, +.note.success:not(.modern) h4, +.note.success:not(.modern) h5, +.note.success:not(.modern) h6 { + color: #5cb85c; +} +.note.success:not(.no-icon)::before { + content: '\f058'; +} +.note.success:not(.no-icon):not(.modern)::before { + color: #5cb85c; +} +.note.warning.flat { + background: #fdf8ea; +} +.note.warning.modern { + border-color: #fae4cd; + background: #fcf4e3; + color: #8a6d3b; +} +.note.warning.modern a:not(.btn) { + color: #8a6d3b; +} +.note.warning.modern a:not(.btn):hover { + color: #714f30; +} +.note.warning:not(.modern) { + border-left-color: #f0ad4e; +} +.note.warning:not(.modern) h2, +.note.warning:not(.modern) h3, +.note.warning:not(.modern) h4, +.note.warning:not(.modern) h5, +.note.warning:not(.modern) h6 { + color: #f0ad4e; +} +.note.warning:not(.no-icon)::before { + content: '\f06a'; +} +.note.warning:not(.no-icon):not(.modern)::before { + color: #f0ad4e; +} +.note.danger.flat { + background: #fcf1f2; +} +.note.danger.modern { + border-color: #ebcdd2; + background: #f2dfdf; + color: #a94442; +} +.note.danger.modern a:not(.btn) { + color: #a94442; +} +.note.danger.modern a:not(.btn):hover { + color: #84333f; +} +.note.danger:not(.modern) { + border-left-color: #d9534f; +} +.note.danger:not(.modern) h2, +.note.danger:not(.modern) h3, +.note.danger:not(.modern) h4, +.note.danger:not(.modern) h5, +.note.danger:not(.modern) h6 { + color: #d9534f; +} +.note.danger:not(.no-icon)::before { + content: '\f056'; +} +.note.danger:not(.no-icon):not(.modern)::before { + color: #d9534f; +} +#article-container .tabs { + position: relative; + margin: 0 0 20px; + border-right: 1px solid var(--tab-border-color); + border-bottom: 1px solid var(--tab-border-color); + border-left: 1px solid var(--tab-border-color); +} +#article-container .tabs > .nav-tabs { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -o-box-lines: multiple; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; + background: var(--tab-botton-bg); +} +#article-container .tabs > .nav-tabs > .tab { + margin: 0; + padding: 0; + list-style: none; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .nav-tabs > .tab { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + -ms-box-flex: 1; + box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + } +} +#article-container .tabs > .nav-tabs > .tab button { + display: block; + padding: 8px 18px; + width: 100%; + border-top: 2px solid var(--tab-border-color); + background: var(--tab-botton-bg); + color: var(--tab-botton-color); + line-height: 2; + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#article-container .tabs > .nav-tabs > .tab button i { + width: 1.5em; +} +#article-container .tabs > .nav-tabs > .tab.active button { + border-top: 2px solid #49b1f5; + background: var(--tab-button-active-bg); + cursor: default; +} +#article-container .tabs > .nav-tabs > .tab:not(.active) button:hover { + border-top: 2px solid var(--tab-button-hover-bg); + background: var(--tab-button-hover-bg); +} +#article-container .tabs > .tab-contents .tab-item-content { + position: relative; + display: none; + padding: 36px 24px; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .tab-contents .tab-item-content { + padding: 24px 14px; + } +} +#article-container .tabs > .tab-contents .tab-item-content.active { + display: block; + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +#article-container .tabs .tab-to-top { + position: relative; + display: block; + margin: 0 0 0 auto; + color: #99a9bf; +} +@-moz-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +#article-container .timeline { + margin: 0 0 20px 10px; + padding: 14px 20px 5px; + border-left: 2px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline.blue { + --timeline-color: #428bca; + --timeline-bg: rgba(66,139,202, 0.2); +} +#article-container .timeline.pink { + --timeline-color: #ff69b4; + --timeline-bg: rgba(255,105,180, 0.2); +} +#article-container .timeline.red { + --timeline-color: #f00; + --timeline-bg: rgba(255,0,0, 0.2); +} +#article-container .timeline.purple { + --timeline-color: #6f42c1; + --timeline-bg: rgba(111,66,193, 0.2); +} +#article-container .timeline.orange { + --timeline-color: #ff8c00; + --timeline-bg: rgba(255,140,0, 0.2); +} +#article-container .timeline.green { + --timeline-color: #5cb85c; + --timeline-bg: rgba(92,184,92, 0.2); +} +#article-container .timeline .timeline-item { + margin: 0 0 15px; +} +#article-container .timeline .timeline-item:hover .item-circle:before { + border-color: var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle > p { + font-weight: 600; + font-size: 1.2em; +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before { + left: -28px; + border: 4px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline:hover .item-circle:before { + border-color: var(--pseudo-hover); +} +#article-container .timeline .timeline-item .timeline-item-title { + position: relative; +} +#article-container .timeline .timeline-item .item-circle:before { + position: absolute; + top: 50%; + left: -27px; + width: 6px; + height: 6px; + border: 3px solid var(--pseudo-hover); + border-radius: 50%; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#article-container .timeline .timeline-item .item-circle > p { + margin: 0 0 8px; + font-weight: 500; +} +#article-container .timeline .timeline-item .timeline-item-content { + position: relative; + padding: 12px 15px; + border-radius: 8px; + background: var(--timeline-bg, #e4f3fd); + font-size: 0.93em; +} +#article-container .timeline .timeline-item .timeline-item-content > :last-child { + margin-bottom: 0; +} +#article-container .timeline + .timeline { + margin-top: -20px; +} +[data-theme='dark'] { + --global-bg: #0d0d0d; + --font-color: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.4); + --hr-before-color: rgba(255,255,255,0.7); + --search-bg: #121212; + --search-input-color: rgba(255,255,255,0.7); + --search-result-title: rgba(255,255,255,0.9); + --preloader-bg: #0d0d0d; + --preloader-color: rgba(255,255,255,0.7); + --tab-border-color: #2c2c2c; + --tab-botton-bg: #2c2c2c; + --tab-botton-color: rgba(255,255,255,0.7); + --tab-button-hover-bg: #383838; + --tab-button-active-bg: #121212; + --card-bg: #121212; + --sidebar-bg: #121212; + --btn-hover-color: #787878; + --btn-color: rgba(255,255,255,0.7); + --btn-bg: #1f1f1f; + --text-bg-hover: #383838; + --light-grey: rgba(255,255,255,0.7); + --dark-grey: rgba(255,255,255,0.2); + --white: rgba(255,255,255,0.9); + --text-highlight-color: rgba(255,255,255,0.9); + --blockquote-color: rgba(255,255,255,0.7); + --blockquote-bg: #2c2c2c; + --reward-pop: #2c2c2c; + --toc-link-color: rgba(255,255,255,0.6); + --hl-color: rgba(255,255,255,0.7); + --hl-bg: #171717; + --hltools-bg: #1a1a1a; + --hltools-color: #90a4ae; + --hlnumber-bg: #171717; + --hlnumber-color: rgba(255,255,255,0.4); + --hlscrollbar-bg: #1f1f1f; + --hlexpand-bg: linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9)); + --scrollbar-color: #1f1f1f; + --timeline-bg: #1f1f1f; +} +[data-theme='dark'] #web_bg:before, +[data-theme='dark'] #footer:before, +[data-theme='dark'] #page-header:before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.7); + content: ''; +} +[data-theme='dark'] #article-container code { + background: #2c2c2c; +} +[data-theme='dark'] #article-container pre > code { + background: #171717; +} +[data-theme='dark'] #article-container figure.highlight { + -webkit-box-shadow: none; + box-shadow: none; +} +[data-theme='dark'] #article-container .note code { + background: rgba(27,31,35,0.05); +} +[data-theme='dark'] #article-container .aplayer { + filter: brightness(0.8); +} +[data-theme='dark'] #article-container kbd { + border-color: #696969; + background-color: #525252; + color: #e2f1ff; +} +[data-theme='dark'] #page-header.nav-fixed > #nav, +[data-theme='dark'] #page-header.not-top-img > #nav { + background: rgba(18,18,18,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0); +} +[data-theme='dark'] #post-comment #comment-switch { + background: #2c2c2c !important; +} +[data-theme='dark'] #post-comment #comment-switch .switch-btn { + filter: brightness(0.8); +} +[data-theme='dark'] .note { + filter: brightness(0.8); +} +[data-theme='dark'] .hide-button, +[data-theme='dark'] .btn-beautify, +[data-theme='dark'] .hl-label, +[data-theme='dark'] .post-outdate-notice, +[data-theme='dark'] .error-img, +[data-theme='dark'] #article-container iframe, +[data-theme='dark'] .gist, +[data-theme='dark'] .ads-wrap { + filter: brightness(0.8); +} +[data-theme='dark'] img { + filter: brightness(0.8); +} +[data-theme='dark'] #aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed rgba(255,255,255,0.1); +} +[data-theme='dark'] #gitalk-container { + filter: brightness(0.8); +} +[data-theme='dark'] #gitalk-container svg { + fill: rgba(255,255,255,0.9) !important; +} +[data-theme='dark'] #disqusjs #dsqjs:hover, +[data-theme='dark'] #disqusjs #dsqjs:focus, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-tab-active, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-no-comment { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-order-label { + background-color: #1f1f1f; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body code, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body pre { + background: #2c2c2c; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body blockquote { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #artitalk_main #lazy { + background: #121212; +} +[data-theme='dark'] #operare_artitalk .c2 { + background: #121212; +} +@media screen and (max-width: 900px) { + [data-theme='dark'] #card-toc { + background: #1f1f1f; + } +} +.read-mode { + --font-color: #4c4948; + --readmode-light-color: #fff; + --white: #4c4948; + --light-grey: #4c4948; + --gray: #d6dbdf; + --hr-border: #d6dbdf; + --hr-before-color: #b9c2c9; + --highlight-bg: #f7f7f7; + --exit-btn-bg: #c0c0c0; + --exit-btn-color: #fff; + --exit-btn-hover: #8d8d8d; + --pseudo-hover: none; +} +[data-theme='dark'] .read-mode { + --font-color: rgba(255,255,255,0.7); + --readmode-light-color: #0d0d0d; + --white: rgba(255,255,255,0.9); + --light-grey: rgba(255,255,255,0.7); + --gray: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.5); + --hr-before-color: rgba(255,255,255,0.7); + --highlight-bg: #171717; + --exit-btn-bg: #1f1f1f; + --exit-btn-color: rgba(255,255,255,0.9); + --exit-btn-hover: #525252; +} +.read-mode { + background: var(--readmode-light-color); +} +.read-mode .exit-readmode { + position: fixed; + top: 30px; + right: 30px; + z-index: 100; + width: 40px; + height: 40px; + border-radius: 8px; + background: var(--exit-btn-bg); + color: var(--exit-btn-color); + font-size: 16px; + -webkit-transition: background 0.3s; + -moz-transition: background 0.3s; + -o-transition: background 0.3s; + -ms-transition: background 0.3s; + transition: background 0.3s; +} +@media screen and (max-width: 768px) { + .read-mode .exit-readmode { + top: initial; + bottom: 30px; + } +} +.read-mode .exit-readmode:hover { + background: var(--exit-btn-hover); +} +.read-mode #aside-content { + display: none; +} +.read-mode #page-header.post-bg { + background-color: transparent; + background-image: none !important; +} +.read-mode #page-header.post-bg:before { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.read-mode #page-header.post-bg > #post-info { + text-align: center; +} +.read-mode #post { + margin: 0 auto; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode #post:hover { + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode > canvas { + display: none !important; +} +.read-mode .highlight-tools, +.read-mode #footer, +.read-mode #post > *:not(#post-info):not(.post-content), +.read-mode #nav, +.read-mode .post-outdate-notice, +.read-mode #web_bg, +.read-mode #rightside, +.read-mode .not-top-img { + display: none !important; +} +.read-mode #article-container a { + color: #99a9bf; +} +.read-mode #article-container pre, +.read-mode #article-container .highlight:not(.js-file-line-container) { + background: var(--highlight-bg) !important; +} +.read-mode #article-container pre *, +.read-mode #article-container .highlight:not(.js-file-line-container) * { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight { + border-radius: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.read-mode #article-container figure.highlight > :not(.highlight-tools) { + display: block !important; +} +.read-mode #article-container figure.highlight .line:before { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight .hljs { + background: var(--highlight-bg) !important; +} +.read-mode #article-container h1, +.read-mode #article-container h2, +.read-mode #article-container h3, +.read-mode #article-container h4, +.read-mode #article-container h5, +.read-mode #article-container h6 { + padding: 0; +} +.read-mode #article-container h1:before, +.read-mode #article-container h2:before, +.read-mode #article-container h3:before, +.read-mode #article-container h4:before, +.read-mode #article-container h5:before, +.read-mode #article-container h6:before { + content: ''; +} +.read-mode #article-container h1:hover, +.read-mode #article-container h2:hover, +.read-mode #article-container h3:hover, +.read-mode #article-container h4:hover, +.read-mode #article-container h5:hover, +.read-mode #article-container h6:hover { + padding: 0; +} +.read-mode #article-container ul:hover:before, +.read-mode #article-container li:hover:before, +.read-mode #article-container ol:hover:before { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.read-mode #article-container ol:before, +.read-mode #article-container li:before { + background: transparent !important; + color: var(--font-color) !important; +} +.read-mode #article-container ul >li:before { + border-color: var(--gray) !important; +} +.read-mode #article-container .tabs { + border: 2px solid var(--tab-border-color); +} +.read-mode #article-container .tabs > .nav-tabs { + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab { + border-bottom: 0; +} +.read-mode #article-container .tabs > .nav-tabs > .tab button { + border-top: none !important; + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab button:hover { + background: none !important; +} +.read-mode #article-container .tabs > .nav-tabs > .tab.active button { + text-decoration: underline; +} +.read-mode #article-container .tabs > .tab-contents .tab-item-content.active { + -webkit-animation: none; + -moz-animation: none; + -o-animation: none; + -ms-animation: none; + animation: none; +} +.read-mode #article-container code { + color: var(--font-color); +} +.read-mode #article-container blockquote { + border-color: var(--gray); + background-color: var(--readmode-light-color); +} +.read-mode #article-container kbd { + border: 1px solid var(--gray); + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: var(--font-color); +} +.read-mode #article-container .hide-toggle { + border: 1px solid var(--gray) !important; +} +.read-mode #article-container .hide-button, +.read-mode #article-container .btn-beautify, +.read-mode #article-container .hl-label { + border: 1px solid var(--gray) !important; + background: var(--readmode-light-color) !important; + color: var(--font-color) !important; +} +.read-mode #article-container .note { + border: 2px solid var(--gray); + border-left-color: var(--gray) !important; + filter: none; + background-color: var(--readmode-light-color) !important; + color: var(--font-color); +} +.read-mode #article-container .note:before, +.read-mode #article-container .note .note-icon { + color: var(--font-color); +} +.search-dialog { + position: fixed; + top: 10%; + left: 50%; + z-index: 1001; + display: none; + margin-left: -300px; + padding: 20px; + width: 600px; + border-radius: 8px; + background: var(--search-bg); +} +@media screen and (max-width: 768px) { + .search-dialog { + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +.search-dialog hr { + margin: 20px auto; +} +.search-dialog .search-nav { + margin: 0 0 14px; + color: #49b1f5; + font-size: 1.4em; + line-height: 1; +} +.search-dialog .search-nav .search-dialog-title { + margin-right: 10px; +} +.search-dialog .search-nav .search-close-button { + float: right; + color: #858585; + -webkit-transition: color 0.2s ease-in-out; + -moz-transition: color 0.2s ease-in-out; + -o-transition: color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out; + transition: color 0.2s ease-in-out; +} +.search-dialog .search-nav .search-close-button:hover { + color: #49b1f5; +} +#search-mask { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + display: none; + background: rgba(0,0,0,0.6); +} +#local-search .search-dialog .local-search-box { + margin: 0 auto; + max-width: 100%; + width: 100%; +} +#local-search .search-dialog .local-search-box input { + padding: 5px 14px; + width: 100%; + outline: none; + border: 2px solid #49b1f5; + border-radius: 40px; + background: var(--search-bg); + color: var(--search-input-color); + -webkit-appearance: none; +} +#local-search .search-dialog .search-wrap { + display: none; +} +#local-search .search-dialog .local-search__hit-item { + position: relative; + padding-left: 24px; + line-height: 1.7; +} +#local-search .search-dialog .local-search__hit-item:hover:before { + border-color: var(--pseudo-hover); +} +#local-search .search-dialog .local-search__hit-item:before { + position: absolute; + top: 0.45em; + left: 0; + width: 0.5em; + height: 0.5em; + border: 3px solid #49b1f5; + border-radius: 0.5em; + background: transparent; + content: ''; + line-height: 0.5em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#local-search .search-dialog .local-search__hit-item a { + display: block; + color: var(--search-result-title); + font-weight: 600; + cursor: pointer; +} +#local-search .search-dialog .local-search__hit-item a:hover { + color: #49b1f5; +} +#local-search .search-dialog .local-search__hit-item .search-result { + margin: 0 0 8px; + word-break: break-word; +} +#local-search .search-dialog .local-search__hit-item .search-keyword { + color: #f47466; + font-weight: bold; +} +#local-search .search-dialog .search-result-list { + overflow-y: overlay; + margin: 0 -20px; + padding: 0 22px; + max-height: calc(80vh - 130px); +} +@media screen and (max-width: 768px) { + #local-search .search-dialog .search-result-list { + padding-bottom: 40px; + max-height: 75vh !important; + } +} diff --git a/css/var.css b/css/var.css new file mode 100644 index 000000000..e69de29bb diff --git a/img/404.jpg b/img/404.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bab3c3f20a1e04b7e611f1b8e1d28357009007d GIT binary patch literal 16393 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 literal 0 HcmV?d00001 diff --git a/img/avatar.jpg b/img/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fda4136b57e576b42b88a215f4e584cb2c7f8d20 GIT binary patch literal 70979 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
\ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 000000000..80cff14b9 --- /dev/null +++ b/js/main.js @@ -0,0 +1,813 @@ +document.addEventListener('DOMContentLoaded', function () { + let headerContentWidth, $nav + let mobileSidebarOpen = false + + const adjustMenu = init => { + const getAllWidth = ele => { + let width = 0 + ele.length && Array.from(ele).forEach(i => { width += i.offsetWidth }) + return width + } + + if (init) { + const blogInfoWidth = getAllWidth(document.querySelector('#blog-info > a').children) + const menusWidth = getAllWidth(document.getElementById('menus').children) + headerContentWidth = blogInfoWidth + menusWidth + $nav = document.getElementById('nav') + } + + let hideMenuIndex = '' + if (window.innerWidth <= 768) hideMenuIndex = true + else hideMenuIndex = headerContentWidth > $nav.offsetWidth - 120 + + if (hideMenuIndex) { + $nav.classList.add('hide-menu') + } else { + $nav.classList.remove('hide-menu') + } + } + + // 初始化header + const initAdjust = () => { + adjustMenu(true) + $nav.classList.add('show') + } + + // sidebar menus + const sidebarFn = { + open: () => { + btf.sidebarPaddingR() + document.body.style.overflow = 'hidden' + btf.animateIn(document.getElementById('menu-mask'), 'to_show 0.5s') + document.getElementById('sidebar-menus').classList.add('open') + mobileSidebarOpen = true + }, + close: () => { + const $body = document.body + $body.style.overflow = '' + $body.style.paddingRight = '' + btf.animateOut(document.getElementById('menu-mask'), 'to_hide 0.5s') + document.getElementById('sidebar-menus').classList.remove('open') + mobileSidebarOpen = false + } + } + + /** + * 首頁top_img底下的箭頭 + */ + const scrollDownInIndex = () => { + const $scrollDownEle = document.getElementById('scroll-down') + $scrollDownEle && $scrollDownEle.addEventListener('click', function () { + btf.scrollToDest(document.getElementById('content-inner').offsetTop, 300) + }) + } + + /** + * 代碼 + * 只適用於Hexo默認的代碼渲染 + */ + const addHighlightTool = function () { + const highLight = GLOBAL_CONFIG.highlight + if (!highLight) return + + const isHighlightCopy = highLight.highlightCopy + const isHighlightLang = highLight.highlightLang + const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink + const highlightHeightLimit = highLight.highlightHeightLimit + const isShowTool = isHighlightCopy || isHighlightLang || isHighlightShrink !== undefined + const $figureHighlight = highLight.plugin === 'highlighjs' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]') + + if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return + + const isPrismjs = highLight.plugin === 'prismjs' + + let highlightShrinkEle = '' + let highlightCopyEle = '' + const highlightShrinkClass = isHighlightShrink === true ? 'closed' : '' + + if (isHighlightShrink !== undefined) { + highlightShrinkEle = `` + } + + if (isHighlightCopy) { + highlightCopyEle = '
' + } + + const copy = (text, ctx) => { + if (document.queryCommandSupported && document.queryCommandSupported('copy')) { + document.execCommand('copy') + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.success) + } else { + const prevEle = ctx.previousElementSibling + prevEle.innerText = GLOBAL_CONFIG.copy.success + prevEle.style.opacity = 1 + setTimeout(() => { prevEle.style.opacity = 0 }, 700) + } + } else { + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.noSupport) + } else { + ctx.previousElementSibling.innerText = GLOBAL_CONFIG.copy.noSupport + } + } + } + + // click events + const highlightCopyFn = (ele) => { + const $buttonParent = ele.parentNode + $buttonParent.classList.add('copy-true') + const selection = window.getSelection() + const range = document.createRange() + if (isPrismjs) range.selectNodeContents($buttonParent.querySelectorAll('pre code')[0]) + else range.selectNodeContents($buttonParent.querySelectorAll('table .code pre')[0]) + selection.removeAllRanges() + selection.addRange(range) + const text = selection.toString() + copy(text, ele.lastChild) + selection.removeAllRanges() + $buttonParent.classList.remove('copy-true') + } + + const highlightShrinkFn = (ele) => { + const $nextEle = [...ele.parentNode.children].slice(1) + ele.firstChild.classList.toggle('closed') + if (btf.isHidden($nextEle[$nextEle.length - 1])) { + $nextEle.forEach(e => { e.style.display = 'block' }) + } else { + $nextEle.forEach(e => { e.style.display = 'none' }) + } + } + + const highlightToolsFn = function (e) { + const $target = e.target.classList + if ($target.contains('expand')) highlightShrinkFn(this) + else if ($target.contains('copy-button')) highlightCopyFn(this) + } + + const expandCode = function () { + this.classList.toggle('expand-done') + } + + function createEle (lang, item, service) { + const fragment = document.createDocumentFragment() + + if (isShowTool) { + const hlTools = document.createElement('div') + hlTools.className = `highlight-tools ${highlightShrinkClass}` + hlTools.innerHTML = highlightShrinkEle + lang + highlightCopyEle + hlTools.addEventListener('click', highlightToolsFn) + fragment.appendChild(hlTools) + } + + if (highlightHeightLimit && item.offsetHeight > highlightHeightLimit + 30) { + const ele = document.createElement('div') + ele.className = 'code-expand-btn' + ele.innerHTML = '' + ele.addEventListener('click', expandCode) + fragment.appendChild(ele) + } + + if (service === 'hl') { + item.insertBefore(fragment, item.firstChild) + } else { + item.parentNode.insertBefore(fragment, item) + } + } + + if (isHighlightLang) { + if (isPrismjs) { + $figureHighlight.forEach(function (item) { + const langName = item.getAttribute('data-language') ? item.getAttribute('data-language') : 'Code' + const highlightLangEle = `
${langName}
` + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle(highlightLangEle, item) + }) + } else { + $figureHighlight.forEach(function (item) { + let langName = item.getAttribute('class').split(' ')[1] + if (langName === 'plain' || langName === undefined) langName = 'Code' + const highlightLangEle = `
${langName}
` + createEle(highlightLangEle, item, 'hl') + }) + } + } else { + if (isPrismjs) { + $figureHighlight.forEach(function (item) { + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle('', item) + }) + } else { + $figureHighlight.forEach(function (item) { + createEle('', item, 'hl') + }) + } + } + } + + /** + * PhotoFigcaption + */ + function addPhotoFigcaption () { + document.querySelectorAll('#article-container img').forEach(function (item) { + const parentEle = item.parentNode + const altValue = item.title || item.alt + if (altValue && !parentEle.parentNode.classList.contains('justified-gallery')) { + const ele = document.createElement('div') + ele.className = 'img-alt is-center' + ele.textContent = altValue + parentEle.insertBefore(ele, item.nextSibling) + } + }) + } + + /** + * Lightbox + */ + const runLightbox = () => { + btf.loadLightbox(document.querySelectorAll('#article-container img:not(.no-lightbox)')) + } + + /** + * justified-gallery 圖庫排版 + */ + const runJustifiedGallery = function (ele) { + const htmlStr = arr => { + let str = '' + const replaceDq = str => str.replace(/"/g, '"') // replace double quotes to " + arr.forEach(i => { + const alt = i.alt ? `alt="${replaceDq(i.alt)}"` : '' + const title = i.title ? `title="${replaceDq(i.title)}"` : '' + str += `` + }) + return str + } + + const lazyloadFn = (i, arr) => { + const loadItem = i.getAttribute('data-limit') + const arrLength = arr.length + if (arrLength > loadItem) i.insertAdjacentHTML('beforeend', htmlStr(arr.splice(0, loadItem))) + else { + i.insertAdjacentHTML('beforeend', htmlStr(arr)) + i.classList.remove('lazyload') + } + return arrLength > loadItem ? loadItem : arrLength + } + + ele.forEach(item => { + const arr = JSON.parse(item.querySelector('.gallery-data').textContent) + if (!item.classList.contains('lazyload')) item.innerHTML = htmlStr(arr) + else { + lazyloadFn(item, arr) + const limit = item.getAttribute('data-limit') + const clickBtnFn = () => { + const lastItemLength = lazyloadFn(item, arr) + fjGallery(item, 'appendImages', item.querySelectorAll(`.fj-gallery-item:nth-last-child(-n+${lastItemLength})`)) + btf.loadLightbox(item.querySelectorAll('img')) + lastItemLength < limit && item.nextElementSibling.removeEventListener('click', clickBtnFn) + } + item.nextElementSibling.addEventListener('click', clickBtnFn) + } + }) + + if (window.fjGallery) { + setTimeout(() => { btf.initJustifiedGallery(ele) }, 100) + return + } + + getCSS(`${GLOBAL_CONFIG.source.justifiedGallery.css}`) + getScript(`${GLOBAL_CONFIG.source.justifiedGallery.js}`).then(() => { btf.initJustifiedGallery(ele) }) + } + + /** + * rightside scroll percent + */ + const rightsideScrollPercent = currentTop => { + const perNum = btf.getScrollPercent(currentTop, document.body) + const $goUp = document.getElementById('go-up') + if (perNum < 95) { + $goUp.classList.add('show-percent') + $goUp.querySelector('.scroll-percent').textContent = perNum + } else { + $goUp.classList.remove('show-percent') + } + } + + /** + * 滾動處理 + */ + const scrollFn = function () { + const $rightside = document.getElementById('rightside') + const innerHeight = window.innerHeight + 56 + + // 當滾動條小于 56 的時候 + if (document.body.scrollHeight <= innerHeight) { + $rightside.style.cssText = 'opacity: 1; transform: translateX(-58px)' + return + } + + // find the scroll direction + function scrollDirection (currentTop) { + const result = currentTop > initTop // true is down & false is up + initTop = currentTop + return result + } + + let initTop = 0 + let isChatShow = true + const $header = document.getElementById('page-header') + const isChatBtnHide = typeof chatBtnHide === 'function' + const isChatBtnShow = typeof chatBtnShow === 'function' + const isShowPercent = GLOBAL_CONFIG.percent.rightside + + const scrollTask = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + const isDown = scrollDirection(currentTop) + if (currentTop > 56) { + if (isDown) { + if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible') + if (isChatBtnShow && isChatShow === true) { + chatBtnHide() + isChatShow = false + } + } else { + if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible') + if (isChatBtnHide && isChatShow === false) { + chatBtnShow() + isChatShow = true + } + } + $header.classList.add('nav-fixed') + if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') { + $rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)' + } + } else { + if (currentTop === 0) { + $header.classList.remove('nav-fixed', 'nav-visible') + } + $rightside.style.cssText = "opacity: ''; transform: ''" + } + + isShowPercent && rightsideScrollPercent(currentTop) + + if (document.body.scrollHeight <= innerHeight) { + $rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)' + } + }, 200) + + window.scrollCollect = scrollTask + + window.addEventListener('scroll', scrollCollect) + } + + /** + * toc,anchor + */ + const scrollFnToDo = function () { + const isToc = GLOBAL_CONFIG_SITE.isToc + const isAnchor = GLOBAL_CONFIG.isAnchor + const $article = document.getElementById('article-container') + + if (!($article && (isToc || isAnchor))) return + + let $tocLink, $cardToc, autoScrollToc, $tocPercentage, isExpand + + if (isToc) { + const $cardTocLayout = document.getElementById('card-toc') + $cardToc = $cardTocLayout.getElementsByClassName('toc-content')[0] + $tocLink = $cardToc.querySelectorAll('.toc-link') + $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') + isExpand = $cardToc.classList.contains('is-expand') + + window.mobileToc = { + open: () => { + $cardTocLayout.style.cssText = 'animation: toc-open .3s; opacity: 1; right: 55px' + }, + + close: () => { + $cardTocLayout.style.animation = 'toc-close .2s' + setTimeout(() => { + $cardTocLayout.style.cssText = "opacity:''; animation: ''; right: ''" + }, 100) + } + } + + // toc元素點擊 + $cardToc.addEventListener('click', e => { + e.preventDefault() + const target = e.target.classList + if (target.contains('toc-content')) return + const $target = target.contains('toc-link') + ? e.target + : e.target.parentElement + btf.scrollToDest(btf.getEleTop(document.getElementById(decodeURI($target.getAttribute('href')).replace('#', ''))), 300) + if (window.innerWidth < 900) { + window.mobileToc.close() + } + }) + + autoScrollToc = item => { + const activePosition = item.getBoundingClientRect().top + const sidebarScrollTop = $cardToc.scrollTop + if (activePosition > (document.documentElement.clientHeight - 100)) { + $cardToc.scrollTop = sidebarScrollTop + 150 + } + if (activePosition < 100) { + $cardToc.scrollTop = sidebarScrollTop - 150 + } + } + } + + // find head position & add active class + const list = $article.querySelectorAll('h1,h2,h3,h4,h5,h6') + let detectItem = '' + const findHeadPosition = function (top) { + if (top === 0) { + return false + } + + let currentId = '' + let currentIndex = '' + + list.forEach(function (ele, index) { + if (top > btf.getEleTop(ele) - 80) { + const id = ele.id + currentId = id ? '#' + encodeURI(id) : '' + currentIndex = index + } + }) + + if (detectItem === currentIndex) return + + if (isAnchor) btf.updateAnchor(currentId) + + detectItem = currentIndex + + if (isToc) { + $cardToc.querySelectorAll('.active').forEach(i => { i.classList.remove('active') }) + + if (currentId === '') { + return + } + + const currentActive = $tocLink[currentIndex] + currentActive.classList.add('active') + + setTimeout(() => { + autoScrollToc(currentActive) + }, 0) + + if (isExpand) return + let parent = currentActive.parentNode + + for (; !parent.matches('.toc'); parent = parent.parentNode) { + if (parent.matches('li')) parent.classList.add('active') + } + } + } + + // main of scroll + window.tocScrollFn = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + if (isToc && GLOBAL_CONFIG.percent.toc) { + $tocPercentage.textContent = btf.getScrollPercent(currentTop, $article) + } + findHeadPosition(currentTop) + }, 100) + + window.addEventListener('scroll', tocScrollFn) + } + + /** + * Rightside + */ + const rightSideFn = { + switchReadMode: () => { // read-mode + const $body = document.body + $body.classList.add('read-mode') + const newEle = document.createElement('button') + newEle.type = 'button' + newEle.className = 'fas fa-sign-out-alt exit-readmode' + $body.appendChild(newEle) + + function clickFn () { + $body.classList.remove('read-mode') + newEle.remove() + newEle.removeEventListener('click', clickFn) + } + + newEle.addEventListener('click', clickFn) + }, + switchDarkMode: () => { // Switch Between Light And Dark Mode + const nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light' + if (nowMode === 'light') { + activateDarkMode() + saveToLocal.set('theme', 'dark', 2) + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night) + } else { + activateLightMode() + saveToLocal.set('theme', 'light', 2) + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day) + } + // handle some cases + typeof utterancesTheme === 'function' && utterancesTheme() + typeof changeGiscusTheme === 'function' && changeGiscusTheme() + typeof FB === 'object' && window.loadFBComment && window.loadFBComment() + typeof runMermaid === 'function' && window.runMermaid() + }, + showOrHideBtn: (e) => { // rightside 點擊設置 按鈕 展開 + const rightsideHideClassList = document.getElementById('rightside-config-hide').classList + rightsideHideClassList.toggle('show') + if (e.classList.contains('show')) { + rightsideHideClassList.add('status') + setTimeout(() => { + rightsideHideClassList.remove('status') + }, 300) + } + e.classList.toggle('show') + }, + scrollToTop: () => { // Back to top + btf.scrollToDest(0, 500) + }, + hideAsideBtn: () => { // Hide aside + const $htmlDom = document.documentElement.classList + $htmlDom.contains('hide-aside') + ? saveToLocal.set('aside-status', 'show', 2) + : saveToLocal.set('aside-status', 'hide', 2) + $htmlDom.toggle('hide-aside') + }, + + runMobileToc: () => { + if (window.getComputedStyle(document.getElementById('card-toc')).getPropertyValue('opacity') === '0') window.mobileToc.open() + else window.mobileToc.close() + } + } + + document.getElementById('rightside').addEventListener('click', function (e) { + const $target = e.target.id ? e.target : e.target.parentNode + switch ($target.id) { + case 'go-up': + rightSideFn.scrollToTop() + break + case 'rightside_config': + rightSideFn.showOrHideBtn($target) + break + case 'mobile-toc-button': + rightSideFn.runMobileToc() + break + case 'readmode': + rightSideFn.switchReadMode() + break + case 'darkmode': + rightSideFn.switchDarkMode() + break + case 'hide-aside-btn': + rightSideFn.hideAsideBtn() + break + default: + break + } + }) + + /** + * menu + * 側邊欄sub-menu 展開/收縮 + */ + const clickFnOfSubMenu = () => { + document.querySelectorAll('#sidebar-menus .site-page.group').forEach(function (item) { + item.addEventListener('click', function () { + this.classList.toggle('hide') + }) + }) + } + + /** + * 複製時加上版權信息 + */ + const addCopyright = () => { + const copyright = GLOBAL_CONFIG.copyright + document.body.oncopy = (e) => { + e.preventDefault() + let textFont; const copyFont = window.getSelection(0).toString() + if (copyFont.length > copyright.limitCount) { + textFont = copyFont + '\n' + '\n' + '\n' + + copyright.languages.author + '\n' + + copyright.languages.link + window.location.href + '\n' + + copyright.languages.source + '\n' + + copyright.languages.info + } else { + textFont = copyFont + } + if (e.clipboardData) { + return e.clipboardData.setData('text', textFont) + } else { + return window.clipboardData.setData('text', textFont) + } + } + } + + /** + * 網頁運行時間 + */ + const addRuntime = () => { + const $runtimeCount = document.getElementById('runtimeshow') + if ($runtimeCount) { + const publishDate = $runtimeCount.getAttribute('data-publishDate') + $runtimeCount.innerText = btf.diffDate(publishDate) + ' ' + GLOBAL_CONFIG.runtime + } + } + + /** + * 最後一次更新時間 + */ + const addLastPushDate = () => { + const $lastPushDateItem = document.getElementById('last-push-date') + if ($lastPushDateItem) { + const lastPushDate = $lastPushDateItem.getAttribute('data-lastPushDate') + $lastPushDateItem.innerText = btf.diffDate(lastPushDate, true) + } + } + + /** + * table overflow + */ + const addTableWrap = () => { + const $table = document.querySelectorAll('#article-container :not(.highlight) > table, #article-container > table') + if ($table.length) { + $table.forEach(item => { + btf.wrap(item, 'div', { class: 'table-wrap' }) + }) + } + } + + /** + * tag-hide + */ + const clickFnOfTagHide = function () { + const $hideInline = document.querySelectorAll('#article-container .hide-button') + if ($hideInline.length) { + $hideInline.forEach(function (item) { + item.addEventListener('click', function (e) { + const $this = this + $this.classList.add('open') + const $fjGallery = $this.nextElementSibling.querySelectorAll('.fj-gallery') + $fjGallery.length && btf.initJustifiedGallery($fjGallery) + }) + }) + } + } + + const tabsFn = { + clickFnOfTabs: function () { + document.querySelectorAll('#article-container .tab > button').forEach(function (item) { + item.addEventListener('click', function (e) { + const $this = this + const $tabItem = $this.parentNode + + if (!$tabItem.classList.contains('active')) { + const $tabContent = $tabItem.parentNode.nextElementSibling + const $siblings = btf.siblings($tabItem, '.active')[0] + $siblings && $siblings.classList.remove('active') + $tabItem.classList.add('active') + const tabId = $this.getAttribute('data-href').replace('#', '') + const childList = [...$tabContent.children] + childList.forEach(item => { + if (item.id === tabId) item.classList.add('active') + else item.classList.remove('active') + }) + const $isTabJustifiedGallery = $tabContent.querySelectorAll(`#${tabId} .fj-gallery`) + if ($isTabJustifiedGallery.length > 0) { + btf.initJustifiedGallery($isTabJustifiedGallery) + } + } + }) + }) + }, + backToTop: () => { + document.querySelectorAll('#article-container .tabs .tab-to-top').forEach(function (item) { + item.addEventListener('click', function () { + btf.scrollToDest(btf.getEleTop(btf.getParents(this, '.tabs')), 300) + }) + }) + } + } + + const toggleCardCategory = function () { + const $cardCategory = document.querySelectorAll('#aside-cat-list .card-category-list-item.parent i') + if ($cardCategory.length) { + $cardCategory.forEach(function (item) { + item.addEventListener('click', function (e) { + e.preventDefault() + const $this = this + $this.classList.toggle('expand') + const $parentEle = $this.parentNode.nextElementSibling + if (btf.isHidden($parentEle)) { + $parentEle.style.display = 'block' + } else { + $parentEle.style.display = 'none' + } + }) + }) + } + } + + const switchComments = function () { + let switchDone = false + const $switchBtn = document.querySelector('#comment-switch > .switch-btn') + $switchBtn && $switchBtn.addEventListener('click', function () { + this.classList.toggle('move') + document.querySelectorAll('#post-comment > .comment-wrap > div').forEach(function (item) { + if (btf.isHidden(item)) { + item.style.cssText = 'display: block;animation: tabshow .5s' + } else { + item.style.cssText = "display: none;animation: ''" + } + }) + + if (!switchDone && typeof loadOtherComment === 'function') { + switchDone = true + loadOtherComment() + } + }) + } + + const addPostOutdateNotice = function () { + const data = GLOBAL_CONFIG.noticeOutdate + const diffDay = btf.diffDate(GLOBAL_CONFIG_SITE.postUpdate) + if (diffDay >= data.limitDay) { + const ele = document.createElement('div') + ele.className = 'post-outdate-notice' + ele.textContent = data.messagePrev + ' ' + diffDay + ' ' + data.messageNext + const $targetEle = document.getElementById('article-container') + if (data.position === 'top') { + $targetEle.insertBefore(ele, $targetEle.firstChild) + } else { + $targetEle.appendChild(ele) + } + } + } + + const lazyloadImg = () => { + window.lazyLoadInstance = new LazyLoad({ + elements_selector: 'img', + threshold: 0, + data_src: 'lazy-src' + }) + } + + const relativeDate = function (selector) { + selector.forEach(item => { + const $this = item + const timeVal = $this.getAttribute('datetime') + $this.innerText = btf.diffDate(timeVal, true) + $this.style.display = 'inline' + }) + } + + const unRefreshFn = function () { + window.addEventListener('resize', () => { + adjustMenu(false) + btf.isHidden(document.getElementById('toggle-menu')) && mobileSidebarOpen && sidebarFn.close() + }) + + document.getElementById('menu-mask').addEventListener('click', e => { sidebarFn.close() }) + + clickFnOfSubMenu() + GLOBAL_CONFIG.islazyload && lazyloadImg() + GLOBAL_CONFIG.copyright !== undefined && addCopyright() + } + + window.refreshFn = function () { + initAdjust() + + if (GLOBAL_CONFIG_SITE.isPost) { + GLOBAL_CONFIG.noticeOutdate !== undefined && addPostOutdateNotice() + GLOBAL_CONFIG.relativeDate.post && relativeDate(document.querySelectorAll('#post-meta time')) + } else { + GLOBAL_CONFIG.relativeDate.homepage && relativeDate(document.querySelectorAll('#recent-posts time')) + GLOBAL_CONFIG.runtime && addRuntime() + addLastPushDate() + toggleCardCategory() + } + + scrollFnToDo() + GLOBAL_CONFIG_SITE.isHome && scrollDownInIndex() + addHighlightTool() + GLOBAL_CONFIG.isPhotoFigcaption && addPhotoFigcaption() + scrollFn() + + const $jgEle = document.querySelectorAll('#article-container .fj-gallery') + $jgEle.length && runJustifiedGallery($jgEle) + + runLightbox() + addTableWrap() + clickFnOfTagHide() + tabsFn.clickFnOfTabs() + tabsFn.backToTop() + switchComments() + document.getElementById('toggle-menu').addEventListener('click', () => { sidebarFn.open() }) + } + + refreshFn() + unRefreshFn() +}) diff --git a/js/search/algolia.js b/js/search/algolia.js new file mode 100644 index 000000000..338c617fe --- /dev/null +++ b/js/search/algolia.js @@ -0,0 +1,163 @@ +window.addEventListener('load', () => { + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn(document.getElementById('search-mask'), 'to_show 0.5s') + btf.animateIn(document.querySelector('#algolia-search .search-dialog'), 'titleScale 0.5s') + setTimeout(() => { document.querySelector('#algolia-search .ais-SearchBox-input').focus() }, 100) + + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut(document.querySelector('#algolia-search .search-dialog'), 'search_close .5s') + btf.animateOut(document.getElementById('search-mask'), 'to_hide 0.5s') + } + + const searchClickFn = () => { + document.querySelector('#search-button > .search').addEventListener('click', openSearch) + } + + const searchClickFnOnce = () => { + document.getElementById('search-mask').addEventListener('click', closeSearch) + document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch) + } + + const cutContent = content => { + if (content === '') return '' + + const firstOccur = content.indexOf('') + + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + const matchContent = pre + content.substring(start, end) + post + return matchContent + } + + const algolia = GLOBAL_CONFIG.algolia + const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName + if (!isAlgoliaValid) { + return console.error('Algolia setting is invalid!') + } + + const search = instantsearch({ + indexName: algolia.indexName, + /* global algoliasearch */ + searchClient: algoliasearch(algolia.appId, algolia.apiKey), + searchFunction (helper) { + helper.state.query && helper.search() + } + }) + + const configure = instantsearch.widgets.configure({ + hitsPerPage: 5 + }) + + const searchBox = instantsearch.widgets.searchBox({ + container: '#algolia-search-input', + showReset: false, + showSubmit: false, + placeholder: GLOBAL_CONFIG.algolia.languages.input_placeholder, + showLoadingIndicator: true + }) + + const hits = instantsearch.widgets.hits({ + container: '#algolia-hits', + templates: { + item (data) { + const link = data.permalink ? data.permalink : (GLOBAL_CONFIG.root + data.path) + const result = data._highlightResult + const content = result.contentStripTruncate + ? cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? cutContent(result.contentStrip.value) + : result.content + ? cutContent(result.content.value) + : '' + return ` + + ${result.title.value || 'no-title'} + +

${content}

` + }, + empty: function (data) { + return ( + '
' + + GLOBAL_CONFIG.algolia.languages.hits_empty.replace(/\$\{query}/, data.query) + + '
' + ) + } + } + }) + + const stats = instantsearch.widgets.stats({ + container: '#algolia-info > .algolia-stats', + templates: { + text: function (data) { + const stats = GLOBAL_CONFIG.algolia.languages.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return ( + `
${stats}` + ) + } + } + }) + + const powerBy = instantsearch.widgets.poweredBy({ + container: '#algolia-info > .algolia-poweredBy' + }) + + const pagination = instantsearch.widgets.pagination({ + container: '#algolia-pagination', + totalPages: 5, + templates: { + first: '', + last: '', + previous: '', + next: '' + } + }) + + search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination]) // add the widgets to the instantsearch instance + + search.start() + + searchClickFn() + searchClickFnOnce() + + window.addEventListener('pjax:complete', () => { + getComputedStyle(document.querySelector('#algolia-search .search-dialog')).display === 'block' && closeSearch() + searchClickFn() + }) + + window.pjax && search.on('render', () => { + window.pjax.refresh(document.getElementById('algolia-hits')) + }) +}) diff --git a/js/search/local-search.js b/js/search/local-search.js new file mode 100644 index 000000000..11aa72a25 --- /dev/null +++ b/js/search/local-search.js @@ -0,0 +1,196 @@ +window.addEventListener('load', () => { + let loadFlag = false + let dataObj = [] + const $searchMask = document.getElementById('search-mask') + + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn(document.querySelector('#local-search .search-dialog'), 'titleScale 0.5s') + setTimeout(() => { document.querySelector('#local-search-input input').focus() }, 100) + if (!loadFlag) { + search() + loadFlag = true + } + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut(document.querySelector('#local-search .search-dialog'), 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + } + + const searchClickFn = () => { + document.querySelector('#search-button > .search').addEventListener('click', openSearch) + } + + const searchClickFnOnce = () => { + document.querySelector('#local-search .search-close-button').addEventListener('click', closeSearch) + $searchMask.addEventListener('click', closeSearch) + if (GLOBAL_CONFIG.localSearch.preload) dataObj = fetchData(GLOBAL_CONFIG.localSearch.path) + } + + // check url is json or not + const isJson = url => { + const reg = /\.json$/ + return reg.test(url) + } + + const fetchData = async (path) => { + let data = [] + const response = await fetch(path) + if (isJson(path)) { + data = await response.json() + } else { + const res = await response.text() + const t = await new window.DOMParser().parseFromString(res, 'text/xml') + const a = await t + data = [...a.querySelectorAll('entry')].map(item => { + return { + title: item.querySelector('title').textContent, + content: item.querySelector('content') && item.querySelector('content').textContent, + url: item.querySelector('url').textContent + } + }) + } + if (response.ok) { + const $loadDataItem = document.getElementById('loading-database') + $loadDataItem.nextElementSibling.style.display = 'block' + $loadDataItem.remove() + } + return data + } + + const search = () => { + if (!GLOBAL_CONFIG.localSearch.preload) { + dataObj = fetchData(GLOBAL_CONFIG.localSearch.path) + } + + const $input = document.querySelector('#local-search-input input') + const $resultContent = document.getElementById('local-search-results') + const $loadingStatus = document.getElementById('loading-status') + + $input.addEventListener('input', function () { + const keywords = this.value.trim().toLowerCase().split(/[\s]+/) + if (keywords[0] !== '') $loadingStatus.innerHTML = '' + else { + $resultContent.innerHTML = '' + return + } + + let str = '
' + if (keywords.length <= 0) return + let count = 0 + // perform local searching + dataObj.then(data => { + data.forEach(data => { + let isMatch = true + let dataTitle = data.title ? data.title.trim().toLowerCase() : '' + const dataContent = data.content ? data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() : '' + const dataUrl = data.url.startsWith('/') ? data.url : GLOBAL_CONFIG.root + data.url + let indexTitle = -1 + let indexContent = -1 + let firstOccur = -1 + // only match articles with not empty titles and contents + if (dataTitle !== '' || dataContent !== '') { + keywords.forEach((keyword, i) => { + indexTitle = dataTitle.indexOf(keyword) + indexContent = dataContent.indexOf(keyword) + if (indexTitle < 0 && indexContent < 0) { + isMatch = false + } else { + if (indexContent < 0) { + indexContent = 0 + } + if (i === 0) { + firstOccur = indexContent + } + } + }) + } else { + isMatch = false + } + + // show search results + if (isMatch) { + if (firstOccur >= 0) { + // cut out 130 characters + // let start = firstOccur - 30 < 0 ? 0 : firstOccur - 30 + // let end = firstOccur + 50 > dataContent.length ? dataContent.length : firstOccur + 50 + let start = firstOccur - 30 + let end = firstOccur + 100 + let pre = '' + let post = '' + + if (start < 0) { + start = 0 + } + + if (start === 0) { + end = 100 + } else { + pre = '...' + } + + if (end > dataContent.length) { + end = dataContent.length + } else { + post = '...' + } + + let matchContent = dataContent.substring(start, end) + + // highlight all keywords + keywords.forEach(keyword => { + let regexStr = keyword + const specialRegex = /[^\w\s]+/ // match special characters + if (keyword.length === 1 && specialRegex.test(keyword)) { + regexStr = `\\${keyword}` + } + const regS = new RegExp(regexStr, 'gi') + matchContent = matchContent.replace(regS, '' + keyword + '') + dataTitle = dataTitle.replace(regS, '' + keyword + '') + }) + + str += '
' + dataTitle + '' + count += 1 + + if (dataContent !== '') { + str += '

' + pre + matchContent + post + '

' + } + } + str += '
' + } + }) + if (count === 0) { + str += '
' + GLOBAL_CONFIG.localSearch.languages.hits_empty.replace(/\$\{query}/, this.value.trim()) + + '
' + } + str += '
' + $resultContent.innerHTML = str + if (keywords[0] !== '') $loadingStatus.innerHTML = '' + window.pjax && window.pjax.refresh($resultContent) + }) + }) + } + + searchClickFn() + searchClickFnOnce() + + // pjax + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + searchClickFn() + }) +}) diff --git a/js/tw_cn.js b/js/tw_cn.js new file mode 100644 index 000000000..cfff35253 --- /dev/null +++ b/js/tw_cn.js @@ -0,0 +1,119 @@ +document.addEventListener('DOMContentLoaded', function () { + const translate = GLOBAL_CONFIG.translate + const snackbarData = GLOBAL_CONFIG.Snackbar + const defaultEncoding = translate.defaultEncoding // 網站默認語言,1: 繁體中文, 2: 簡體中文 + const translateDelay = translate.translateDelay // 延遲時間,若不在前, 要設定延遲翻譯時間, 如100表示100ms,默認為0 + const msgToTraditionalChinese = translate.msgToTraditionalChinese // 此處可以更改為你想要顯示的文字 + const msgToSimplifiedChinese = translate.msgToSimplifiedChinese // 同上,但兩處均不建議更改 + let currentEncoding = defaultEncoding + const targetEncodingCookie = 'translate-chn-cht' + let targetEncoding = + saveToLocal.get(targetEncodingCookie) === undefined + ? defaultEncoding + : Number(saveToLocal.get('translate-chn-cht')) + let translateButtonObject + const isSnackbar = GLOBAL_CONFIG.Snackbar !== undefined + + function setLang () { + document.documentElement.lang = targetEncoding === 1 ? 'zh-TW' : 'zh-CN' + } + + function translateText (txt) { + if (txt === '' || txt == null) return '' + if (currentEncoding === 1 && targetEncoding === 2) return Simplized(txt) + else if (currentEncoding === 2 && targetEncoding === 1) { + return Traditionalized(txt) + } else return txt + } + function translateBody (fobj) { + let objs + if (typeof fobj === 'object') objs = fobj.childNodes + else objs = document.body.childNodes + for (let i = 0; i < objs.length; i++) { + const obj = objs.item(i) + if ( + '||BR|HR|'.indexOf('|' + obj.tagName + '|') > 0 || + obj === translateButtonObject + ) { + continue + } + if (obj.title !== '' && obj.title != null) { + obj.title = translateText(obj.title) + } + if (obj.alt !== '' && obj.alt != null) obj.alt = translateText(obj.alt) + if (obj.placeholder !== '' && obj.placeholder != null) { obj.placeholder = translateText(obj.placeholder) } + if ( + obj.tagName === 'INPUT' && + obj.value !== '' && + obj.type !== 'text' && + obj.type !== 'hidden' + ) { + obj.value = translateText(obj.value) + } + if (obj.nodeType === 3) obj.data = translateText(obj.data) + else translateBody(obj) + } + } + function translatePage () { + if (targetEncoding === 1) { + currentEncoding = 1 + targetEncoding = 2 + translateButtonObject.innerHTML = msgToTraditionalChinese + isSnackbar && btf.snackbarShow(snackbarData.cht_to_chs) + } else if (targetEncoding === 2) { + currentEncoding = 2 + targetEncoding = 1 + translateButtonObject.innerHTML = msgToSimplifiedChinese + isSnackbar && btf.snackbarShow(snackbarData.chs_to_cht) + } + saveToLocal.set(targetEncodingCookie, targetEncoding, 2) + setLang() + translateBody() + } + + function JTPYStr () { + return '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾龙历志制一台皋准复猛钟注范签' + } + function FTPYStr () { + return '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽龍歷誌製壹臺臯準復勐鐘註範籤' + } + function Traditionalized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) !== -1) { + str += tt.charAt(ss.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + function Simplized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) !== -1) { + str += ss.charAt(tt.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + function translateInitialization () { + translateButtonObject = document.getElementById('translateLink') + if (translateButtonObject) { + if (currentEncoding !== targetEncoding) { + translateButtonObject.innerHTML = + targetEncoding === 1 + ? msgToSimplifiedChinese + : msgToTraditionalChinese + setLang() + setTimeout(translateBody, translateDelay) + } + translateButtonObject.addEventListener('click', translatePage, false) + } + } + translateInitialization() + document.addEventListener('pjax:complete', translateInitialization) +}) diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 000000000..96beaaf10 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,290 @@ +const btf = { + debounce: function (func, wait, immediate) { + let timeout + return function () { + const context = this + const args = arguments + const later = function () { + timeout = null + if (!immediate) func.apply(context, args) + } + const callNow = immediate && !timeout + clearTimeout(timeout) + timeout = setTimeout(later, wait) + if (callNow) func.apply(context, args) + } + }, + + throttle: function (func, wait, options) { + let timeout, context, args + let previous = 0 + if (!options) options = {} + + const later = function () { + previous = options.leading === false ? 0 : new Date().getTime() + timeout = null + func.apply(context, args) + if (!timeout) context = args = null + } + + const throttled = function () { + const now = new Date().getTime() + if (!previous && options.leading === false) previous = now + const remaining = wait - (now - previous) + context = this + args = arguments + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout) + timeout = null + } + previous = now + func.apply(context, args) + if (!timeout) context = args = null + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining) + } + } + + return throttled + }, + + sidebarPaddingR: () => { + const innerWidth = window.innerWidth + const clientWidth = document.body.clientWidth + const paddingRight = innerWidth - clientWidth + if (innerWidth !== clientWidth) { + document.body.style.paddingRight = paddingRight + 'px' + } + }, + + snackbarShow: (text, showAction = false, duration = 2000) => { + const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar + const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark + Snackbar.show({ + text, + backgroundColor: bg, + showAction, + duration, + pos: position, + customClass: 'snackbar-css' + }) + }, + + diffDate: (d, more = false) => { + const dateNow = new Date() + const datePost = new Date(d) + const dateDiff = dateNow.getTime() - datePost.getTime() + const minute = 1000 * 60 + const hour = minute * 60 + const day = hour * 24 + const month = day * 30 + + let result + if (more) { + const monthCount = dateDiff / month + const dayCount = dateDiff / day + const hourCount = dateDiff / hour + const minuteCount = dateDiff / minute + + if (monthCount > 12) { + result = datePost.toISOString().slice(0, 10) + } else if (monthCount >= 1) { + result = parseInt(monthCount) + ' ' + GLOBAL_CONFIG.date_suffix.month + } else if (dayCount >= 1) { + result = parseInt(dayCount) + ' ' + GLOBAL_CONFIG.date_suffix.day + } else if (hourCount >= 1) { + result = parseInt(hourCount) + ' ' + GLOBAL_CONFIG.date_suffix.hour + } else if (minuteCount >= 1) { + result = parseInt(minuteCount) + ' ' + GLOBAL_CONFIG.date_suffix.min + } else { + result = GLOBAL_CONFIG.date_suffix.just + } + } else { + result = parseInt(dateDiff / day) + } + return result + }, + + loadComment: (dom, callback) => { + if ('IntersectionObserver' in window) { + const observerItem = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + callback() + observerItem.disconnect() + } + }, { threshold: [0] }) + observerItem.observe(dom) + } else { + callback() + } + }, + + scrollToDest: (pos, time = 500) => { + const currentPos = window.pageYOffset + const isNavFixed = document.getElementById('page-header').classList.contains('fixed') + if (currentPos > pos || isNavFixed) pos = pos - 70 + + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + top: pos, + behavior: 'smooth' + }) + return + } + + let start = null + pos = +pos + window.requestAnimationFrame(function step (currentTime) { + start = !start ? currentTime : start + const progress = currentTime - start + if (currentPos < pos) { + window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos) + } else { + window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time)) + } + if (progress < time) { + window.requestAnimationFrame(step) + } else { + window.scrollTo(0, pos) + } + }) + }, + + animateIn: (ele, text) => { + ele.style.display = 'block' + ele.style.animation = text + }, + + animateOut: (ele, text) => { + ele.addEventListener('animationend', function f () { + ele.style.display = '' + ele.style.animation = '' + ele.removeEventListener('animationend', f) + }) + ele.style.animation = text + }, + + getParents: (elem, selector) => { + for (; elem && elem !== document; elem = elem.parentNode) { + if (elem.matches(selector)) return elem + } + return null + }, + + siblings: (ele, selector) => { + return [...ele.parentNode.children].filter((child) => { + if (selector) { + return child !== ele && child.matches(selector) + } + return child !== ele + }) + }, + + /** + * @param {*} selector + * @param {*} eleType the type of create element + * @param {*} options object key: value + */ + wrap: (selector, eleType, options) => { + const createEle = document.createElement(eleType) + for (const [key, value] of Object.entries(options)) { + createEle.setAttribute(key, value) + } + selector.parentNode.insertBefore(createEle, selector) + createEle.appendChild(selector) + }, + + unwrap: el => { + const elParentNode = el.parentNode + if (elParentNode !== document.body) { + elParentNode.parentNode.insertBefore(el, elParentNode) + elParentNode.parentNode.removeChild(elParentNode) + } + }, + + isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0, + + getEleTop: ele => { + let actualTop = ele.offsetTop + let current = ele.offsetParent + + while (current !== null) { + actualTop += current.offsetTop + current = current.offsetParent + } + + return actualTop + }, + + loadLightbox: ele => { + const service = GLOBAL_CONFIG.lightbox + + if (service === 'mediumZoom') { + const zoom = mediumZoom(ele) + zoom.on('open', e => { + const photoBg = document.documentElement.getAttribute('data-theme') === 'dark' ? '#121212' : '#fff' + zoom.update({ + background: photoBg + }) + }) + } + + if (service === 'fancybox') { + ele.forEach(i => { + if (i.parentNode.tagName !== 'A') { + const dataSrc = i.dataset.lazySrc || i.src + const dataCaption = i.title || i.alt || '' + btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc }) + } + }) + + if (!window.fancyboxRun) { + Fancybox.bind('[data-fancybox]', { + Hash: false, + Thumbs: { + autoStart: false + } + }) + window.fancyboxRun = true + } + } + }, + + initJustifiedGallery: function (selector) { + selector.forEach(function (i) { + if (!btf.isHidden(i)) { + fjGallery(i, { + itemSelector: '.fj-gallery-item', + rowHeight: i.getAttribute('data-rowHeight'), + gutter: 4, + onJustify: function () { + this.$container.style.opacity = '1' + } + }) + } + }) + }, + + updateAnchor: (anchor) => { + if (anchor !== window.location.hash) { + if (!anchor) anchor = location.pathname + const title = GLOBAL_CONFIG_SITE.title + window.history.replaceState({ + url: location.href, + title + }, title, anchor) + } + }, + + getScrollPercent: (currentTop, ele) => { + const docHeight = ele.clientHeight + const winHeight = document.documentElement.clientHeight + const headerHeight = ele.offsetTop + const contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : (document.documentElement.scrollHeight - winHeight) + const scrollPercent = (currentTop - headerHeight) / (contentMath) + const scrollPercentRounded = Math.round(scrollPercent * 100) + const percentage = (scrollPercentRounded > 100) ? 100 : (scrollPercentRounded <= 0) ? 0 : scrollPercentRounded + return percentage + } +} diff --git a/link/index.html b/link/index.html new file mode 100644 index 000000000..f96d30830 --- /dev/null +++ b/link/index.html @@ -0,0 +1,248 @@ +链接 | 无眠呓语
\ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 000000000..a4c16de52 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,205 @@ +无眠呓语 - 你好,世界...
\ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 000000000..b02c13f48 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,205 @@ +无眠呓语 - 你好,世界...
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/posts/0lozupq7.html b/posts/0lozupq7.html new file mode 100644 index 000000000..7b94e1e11 --- /dev/null +++ b/posts/0lozupq7.html @@ -0,0 +1,190 @@ +Rust学习笔记:枚举 | 无眠呓语

Rust学习笔记:枚举

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

枚举的基本操作

在Rust中,枚举类型是一种通过enum关键字定义的特殊的类型,允许用户定义一个取值范围有限的变量

+

定义枚举

一个枚举可以包含一系列命名的值,这些值就被称为枚举成员(enumeration variant)

+
1
2
3
4
5
6
7
8
9
10
11
12
// 定义枚举
enum Species {
Human,
Animal,
Plant,
}

fn main() {
// 创建枚举变量
let john = Species::Human;
let tom = Species::Animal;
}
+

枚举类型作为自定义数据类型,和其他的数据类型一样,枚举变量也可以通过函数进行传递或作为结构体字段类型

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum Species {
Human,
Animal,
Plant,
}

// 作为结构体字段类型
struct Earth {
leader: Species,
member: String,
}

fn main() {
let john = Species::Human;
let tom = Species::Animal;

// 在函数间传递
sleep(john);
sleep(tom);
sleep(Species::Animal);
}

fn sleep(species: Species) {}
+

枚举成员可以是一个简单的标识符,也可以包含数据或者匿名结构体

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum Species {
Human(String),
Animal(String),
Plant(String),
Alien { name: String, attitude: String },
}

fn main() {
let john = Species::Human("Male".to_string());
let tom = Species::Animal("Cat".to_string());
let tiga = Species::Alien {
name: "Ultraman".to_string(),
attitude: "Friendly".to_string(),
};
}
+

枚举方法

和结构体类似,枚举也可以使用impl定义其关联的方法

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
enum Species {
Human(String),
Animal(String),
Plant(String),
Alien { name: String, attitude: String },
}

impl Species {
fn war(&self) {
// 使用模式匹配解构枚举变量
match self {
Species::Alien { name, attitude } if attitude == "Hostile" => {
println!("{} is a threat, Start War!", name);
}
_ => {
println!("Friendly!");
},
}
}
}

fn main() {
let tiga = Species::Alien {
name: "Ultraman".to_string(),
attitude: "Friendly".to_string(),
};
let thanos = Species::Alien {
name: "Eternals".to_string(),
attitude: "Hostile".to_string(),
};
tiga.war();
thanos.war();
}
+

枚举的解构

当我们想使用枚举中的值或针对特定枚举执行相应的操作时,就需要通过模式匹配(pattern matching)来解构枚举。具体来说,可以使用matchif let表达式,将枚举变量与每个可能的值进行比较,并执行相应的操作

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
enum Species {
Quit,
Human(String),
Animal(String),
Plant(String),
}

fn main() {
let flag = Species::Quit;
let person = Species::Human("john".to_string());
let cat = Species::Animal("tom".to_string());
let chaos = Species::Human("jeff".to_string());

// 使用match匹配所有条件
let person_name = match person {
Species::Human(name) => name,
Species::Plant(name) => name,
Species::Animal(name) => name,
Species::Quit => "No Person".to_string(),
};

// 使用if let匹配单个条件
let chaos_name = if let Species::Plant(name) = chaos {
name
} else if let Species::Animal(name) = chaos {
name
} else {
"chaos Unknown!".to_string()
};

// 使用"_"通配符匹配其余所有条件
let animal_name = match cat {
Species::Animal(name) => Some(name),
_ => None,
};

if let Species::Quit = flag {}

println!("{}", person_name);
println!("{:?}", animal_name);
println!("{}", chaos_name);
}
+

由上面例子可以看出来,使用match对枚举进行解构时需列举所有的可能情况,但我们也可以使用_通配符来简化匹配;if let则只适用于匹配单个模式的情况,但可配合使用elseelse if let来匹配多个模式

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/0lozupq7.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/18d22756.html b/posts/18d22756.html new file mode 100644 index 000000000..be5550ed6 --- /dev/null +++ b/posts/18d22756.html @@ -0,0 +1,191 @@ +Ubuntu初始配置 | 无眠呓语

Ubuntu初始配置

更换国内镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 进入目录
cd /etc/apt

# 备份原文件
sudo cp sources.list sources.list.bk
sudo vi sources.list

# 删除原来的文本,将下面的代码复制进去(以Ubuntu20.04阿里源为例)
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
+

软件源的选用需要根据系统的版本进行选择,否则可能会出现错误

+
+ + +

Docker配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装docker
sudo apt update
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# docker安装完成检测
sudo systemctl status docker
# 显示active(running),则说明docker安装完成

# 配置docker国内镜像库
依次操作:前往阿里云容器镜像服务网站[https://cr.console.aliyun.com] -> 登录阿里云 -> 选择镜像工具 -> 选择镜像加速器 -> 复制加速器地址
# 进入目录
cd /etc/docker/
sudo nano daemon.json
# 粘贴以下代码
{
"registry-mirrors":["加速器地址"]
}
# 重启docker让镜像配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看镜像配置是否生效
sudo docker info
+ +

卸载Snap

1
2
sudo apt update
sudo apt autoremove --purge snapd
+ +

配置swappiness

1
2
3
4
5
6
7
8
# 参看当前swappiness的值
cat /proc/sys/vm/swappiness

# 临时修改(重启后失效)
sudo sysctl vm.swappiness=10

# 永久修改
在/etc/sysctl.conf文件中添加vm.swappiness=10后重启系统
+ +

LVM扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看磁盘占用
df -h
# 查看物理实际磁盘空间
lsblk
# 如果上面两个命令显示的磁盘大小明显不一致,说明系统没有挂载所有的磁盘空间

# 查看LVM与实际磁盘区别
sudo lvdisplay
# 查看物理磁盘
sudo vgdisplay

# 扩展LVM文件(/dev/mapper/ubuntu--vg-ubuntu--lv)
sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
# 重新计算磁盘容量
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
+ +

创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建一个用户
sudo adduser 用户名

# 赋予用户sudo权限
sudo usermod -a -G sudo 用户名

# 删除用户但保留用户文件夹
sudo userdel 用户名
# 删除用户及用户文件夹
sudo userdel -r 用户名

# 查看系统中的用户
sudo cat /etc/passwd
# 查看用户密码
sudo cat /etc/shadow # 用户密码是以加密的形式储存的,如:$6$Gj81xm...
+

设置时区

1
2
3
4
5
6
# 查看本机时间
date
# 查看时区目录
timedatectl list-timezones
# 设置时区,如北京时间
timedatectl set-timezone Asia/Shanghai
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/18d22756.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/56c3d658.html b/posts/56c3d658.html new file mode 100644 index 000000000..87a17195a --- /dev/null +++ b/posts/56c3d658.html @@ -0,0 +1,183 @@ +使用Python操作Docker | 无眠呓语

使用Python操作Docker

在使用Selenium进行自动化测试的时候,为了到达能够简单部署的目的,可以直接选用selenium/standalone-chrome的官方Docker镜像来搭建服务,这样就可以不用考虑Webdriver和浏览器的版本适配问题。但是我每天需要进行自动化测试的时间只需要一小会儿,如果让selenium/standalone-chrome容器一直运行在后台,对我的1C2G的小服务器来说占用了太多资源。针对这个问题,Docker提供了SDK可以让Python程序在需要的时候启用容器,测试完成后再停止容器来节约服务器资源

+
+ +

docker库的基本配置

1
2
3
4
5
# docker库安装
sudo pip install docker
# 使用CPyhon解释器运行
import docker
# 如果没有报错就说明安装完成
+

docker库的常见用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 实例化
client = docker.from_env()

# 运行一个容器
client.containers.run('镜像名称', detach=True, **kwargs) # detach:后台运行 **kwargs:需要根据镜像所需的变量设置

# 创建一个容器但不运行
client.containers.create('镜像名称', detach=True, **kwargs) # 用法同.run

# 停止容器
container = client.containers.get('容器名称/容器ID')
container.stop()

# 启用容器
container = client.containers.get('容器名称/容器ID')
container.start()

# 查询容器并遍历相关信息
containers = client.containers.list(**kwargs) # 无参数:默认只显示正在运行的容器 all:显示所有容器
for container in containers:
print('容器ID:'+container.short_id)
print('容器名称:'+container.name)
print('容器状态:'+container.status)
+

需要注意的是,因为Docker的运行需要root权限,所以当在Python程序代码中添加操作Docker的相关功能后,Python程序也需要使用root权限运行

+
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/56c3d658.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/56ecg2fs.html b/posts/56ecg2fs.html new file mode 100644 index 000000000..b3fa121a7 --- /dev/null +++ b/posts/56ecg2fs.html @@ -0,0 +1,203 @@ +对asyncio的一点理解 | 无眠呓语

对asyncio的一点理解

Python异步编程的几个概念

协程函数(Coroutine Function)

在Python中,使用async def定义的函数就是协程函数,下面这段代码中,我们定义了一个名为asyncsleep的协程函数

+
1
2
async def asyncsleep(sec):
await asyncio.sleep(sec)
+

协程对象(Coroutine Object)

在Python中,当我们直接调用协程函数时,Python不会直接运行这个函数内的任何代码,而是返回一个协程对象,以下代码中的crt变量就是调用asyncsleep(1)后返回的协程对象

+
1
2
3
4
5
6
7
8
9
import asyncio

async def asyncsleep(sec):
await asyncio.sleep(sec)

crt = asyncsleep(1)
print(crt)

输出:<coroutine object asyncsleep at 0x7f5dcec10270>
+

Task对象

在这里我们可以先看一下Task对象是怎么运行的

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import asyncio

async def tsk(num):
await asyncio.sleep(1)
return num

async def main():
crt = tsk(10)
print(crt)

task = asyncio.create_task(crt)
print(task)

await task
print(task)

if __name__ == "__main__":
asyncio.run(main())

输出:
<coroutine object tsk at 0x7f32908051c0>
<Task pending name='Task-2' coro=<tsk() running at /workspace/PythonProject/main.py:3>>
<Task finished name='Task-2' coro=<tsk() done, defined at /workspace/PythonProject/main.py:3> result=10>
+

我们可以看出,在main函数中,crt首先被包装为处于pending状态的Task对象,在经过await后,其状态变成了finished,同时返回了一个值为10的result。其实,Task对象就是被asyncio.create_task()封装、注册进事件循环中的协程对象,以便当事件循环获得线程控制权时,可以异步执行这个特殊对象

+

事件循环(Event Loop)

事件循环是asyncio的核心,是asyncio中的低层级API。它的主要功能是运行异步任务和回调,执行网络 IO 操作,以及运行子进程,见下面的示意图
事件循环示意图
结合之前的内容我们可以知道,对于协程对象,我们是没法直接运行它的内部功能的,必须通过await运行。比如在下面这段代码中,我们使用await直接运行了两个协程对象中的功能,最终耗时3秒。在这里,await的作用可以理解为阻塞运行了asyncsleep(1)asyncsleep(2)两个协程对象

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import asyncio
import time

async def asyncsleep(sec):
print(f"sleep time: {sec}")
await asyncio.sleep(sec)

async def main():
print(time.strftime("%X"))
# await运行的是协程对象
await asyncsleep(1)
await asyncsleep(2)
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
03:15:38
sleep time: 1
sleep time: 2
03:15:41
+

以上的代码显然不能满足我们的要求,如果我们想让程序异步等待,就必须将协程对象封装成Task对象,将其注册进事件循环中,再通过await运行。比如在下面这段代码的main()函数中,我们使用create_task()创建了task1、task2两个Task对象,然后使用asyncio.run()运行事件循环,可以发现,程序只消耗了2秒就完成了运行

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import asyncio
import time

async def asyncsleep(sec):
print(f"sleep time: {sec}")
await asyncio.sleep(sec)

async def main():
task1 = asyncio.create_task(asyncsleep(1))
task2 = asyncio.create_task(asyncsleep(2))

print("Start Tasks")
print(time.strftime("%X"))
# await运行的是Task对象
await task1
await task2
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
Start Tasks
03:11:40
sleep time: 1
sleep time: 2
03:11:42
+

其实事件循环本质上是一个无限循环,我们可以使用asyncio.get_event_loop()等方法获取或创建它。它主要工作就是当我们使用await关键字处理Task对象时执行Task内部的功能,当遇到Task内部的阻塞等待时,便将Task挂起,执行其他的处于pending状态的Task,同时它会在循环中检查挂起的Task是否处于finished状态了,如果是就收集返回的result。当所有await的Task都完成后,事件循环便终止,将线程控制权交出

+

asyncio的应用场景

需要注意的是,使用asyncio的程序仍是单线程运行的,它只是利用了CPU在处理IO密集型任务时的等待时间,让CPU可以处理其他任务,所以当程序需要阻塞线程或处理计算密集型任务时,异步编程就没有优势了。比如下面的代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import asyncio
import time

async def blockingsleep(sec):
print(f"blocking sleep {sec}")
time.sleep(sec)

async def main():
task1 = asyncio.create_task(blockingsleep(1))
task2 = asyncio.create_task(blockingsleep(2))

print(time.strftime("%X"))
# sleep会阻塞当前线程,task2必须等待task1完成后才能执行
await task1
await task2
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
03:14:02
blocking sleep 1
blocking sleep 2
03:14:05
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import asyncio

async def addup(num):
print(f"addup: {num}")
res = 0
for i in range(1, num):
res = res + i
print(res)

async def main():
task1 = asyncio.create_task(addup(100000001))
task2 = asyncio.create_task(addup(100001))

# 在运行task1时,CPU在处理计算密集型任务而不是处于等待状态,此时task2没法异步运行
await task1
await task2

if __name__ == "__main__":
asyncio.run(main())
+

所以我们可以看出asyncio的应用场景主要是IO密集型任务,如网络读取、硬盘读取、数据库读取等

+

asyncio并发限制

有时我们需要对协程数量进行一定限制,比如在网络请求时,应该考虑站点的并发能力来设置请求规模,否则可能会被目标站点识别为网络攻击。在asyncio中提供了信号量对象Semaphore()来限制协程数量,具体使用可参考下面的代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import asyncio

async def tsk(sem, x):
async with sem:
print(f"Start Coroutine: {x}")
await asyncio.sleep(1)
print("Coroutine Done")

async def main():
# 设置协程数量为10
sem = asyncio.Semaphore(10)
tasks = [tsk(sem, n) for n in range(50)]
await asyncio.gather(*tasks)

if __name__ == "__main__":
asyncio.run(main())
+

运行以上代码可以发现,同时运行的协程对象数量会被限制在10个,这样就可以很方便地限制并发数量。但是在使用 asyncio.Semaphore()也有一些点需要注意,具体见下面的内容

+

不能使用async with … as …管理信号量对象

在使用asyncio.Semaphore()时不能使用async with ... as ...上下文管理语法,比如

+
1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio

async def main():
async with (sem:=asyncio.Semaphore(2)) as from_aenter:
print(f'{sem}')
print(f'{from_aenter}')

if __name__ == "__main__":
asyncio.run(main())

输出:
<asyncio.locks.Semaphore object at 0x7f197fc47550 [unlocked, value:1]>
None
+

这是因为使用async with ... as ...语法的对象需要实现__aenter__方法,而在asyncio中信号量对象__aenter__方法返回值为None

+

asyncio.Semaphore()的使用位置

在下面的代码中,我们设置了同时等待的协程对象最多为10个,预计需要时间为5秒。但是运行代码可以发现,完成所有任务只消耗了1秒

+
1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio
import time

async def main():
sem = asyncio.Semaphore(10)
async with sem:
tasks = [asyncio.sleep(1) for _ in range(50)]
print(time.strftime("%X"))
await asyncio.gather(*tasks)
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())
+

查看文档我们可以发现和下面演示代码一样的内容。即在使用async with ...时实际是协程对象 执行acquire()向信号量对象申请使用闲置队列使计数器减值,协程对象内部功能完成后执行release()向信号量对象释放队列使计数器增值。所以,在使用Semaphore()时,应该在每一个需要执行的协程对象内部 使用,由协程对象向信号量对象主动请求闲置队列

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""1"""
sem = asyncio.Semaphore(10)
# ... later
async with sem:
# work with shared resource

which is equivalent to:

"""2"""
sem = asyncio.Semaphore(10)
# ... later
await sem.acquire()
try:
# work with shared resource
finally:
sem.release()
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/56ecg2fs.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/56u6za0a.html b/posts/56u6za0a.html new file mode 100644 index 000000000..0022b11ea --- /dev/null +++ b/posts/56u6za0a.html @@ -0,0 +1,214 @@ +Rust学习笔记:结构体 | 无眠呓语

Rust学习笔记:结构体

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

结构体基本操作

定义、实例化

在实例化结构体时,字段内的赋值顺序可以和结构体定义不同,但是字段数量必须和定义一致

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定义结构体
struct Person {
name: String,
age: u8,
}

fn main() {
// 实例化
let tom = Person {
name: "tom".to_string(),
age: 10,
};

// 实例化
let jerry = Person {
age: 8,
name: "jerry".to_string(),
};
}
+

访问、修改内部字段

需要注意的是,当我们将结构体声明为可变对象时,它下属的所有字段就都是可变的

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Person {
name: String,
age: u8,
}

fn main() {
// 注意:这个结构体是可变的
let mut tom = Person {
name: "tom".to_string(),
age: 10,
};

// 访问结构体中的字段
println!("name: {}, age: {}", tom.name, tom.age);
// 修改结构体中的字段
tom.name = "jerry".to_string();
println!("name: {}, age: {}", tom.name, tom.age);
}
+

基于已有实例创建新实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Person {
name: String,
age: u8,
species: String,
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
species: "cat".to_string(),
};

// 基于已有实例创建新实例
let jerry = Person {
name: "jerry".to_string(),
species: "mouse".to_string(),
..tom
};
}
+

元组结构体(Tuple Struct)

在某些情况下,我们只想给元组整体取名来实现其相对于别的元组的不同。比如下面的例子中的black和origin,虽然它们内部的字段是一样的,但是他们是不同类型的结构体,这样就可以针对其类型定义它们不同的行为

+
1
2
3
4
5
6
7
8
// 注意:定义元组结构体需要以分号结尾
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}
+

空结构体(Unit-Like Struct)

当我们想在某个类型上只实现行为而不想在其中储存数据的时候,就可以使用空结构体

+
1
2
3
4
5
struct Empty;

fn main() {
let a = Empty;
}
+

结构体数据的所有权

一般类型数据

如果结构中的数据储存在堆内存上的数据或者基础类型数据的话,那么这个结构体实例就拥有其所有的数据。只要实例有效,其内部的数据就有效;反过来说,当其内部数据的所有权发生转移,实例也就失效

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Team {
leader: String,
member: String,
episode: u32,
}

fn main() {
let msm = Team {
leader: "tom".to_string(),
member: "jerry".to_string(),
episode: 201,
};

// 注意:这里传递的是&String
hello(&msm.leader);
// 如果传递的不是引用,下面这句代码会发生错误,实例因其内部数据的所有权转移而失效
println!("{:?}", msm);
}

fn hello(name: &String) {
println!("hello, {}", &name);
}
+

引用类型数据

在结构体中也可以储存引用,但是需要使用到生命周期标注来保证在实例有效的范围内,其内部引用也是有效的

+
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Team<'a> {
leader: &'a str,
member: &'a str,
episode: u32,
}

fn main() {
let msm = Team {
leader: "tom",
member: "jerry",
episode: 201,
};
}
+

结构体的解构

当我们想要获得解构体内部值的时候,除了直接使用.标记法访问结构体数据外,还可以通过模式匹配来解构结构体实现直接获取内部值,但需要注意匹配造成的所有权转移

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#[derive(Debug)]
struct Rectangle {
length: String,
width: String,
}

fn main() {
let rec = Rectangle {
length: 50.to_string(),
width: 30.to_string(),
};
// 这里的等号就相当于模式匹配
let Rectangle { length, width } = rec;
println!("length: {}, width: {}", length, width);
// 注意:这句代码会发生错误,因为所有权被转移
println!("{:?}", rec);
}
+

结构体方法

Rust中方法的作用和面向对象语言(如Python)中的方法有些类似但又有些区别,都是将行为与类型相关联,都可以访问关联类型的所有数据和方法,从而使代码更具可读性和可维护性。这里虽然标题是结构体方法,但其他的一些数据类型,比如枚举(enum)等也可以采用类似语法来实现与其关联的方法

+

定义方法

定义方法的语法要求

+
    +
  1. 使用impl关键词进行定义
  2. +
  3. 方法的定义在struct(或enum、trait对象)的上下文进行
  4. +
  5. 方法的第一个参数为self,表示被方法调用的实例
  6. +
  7. 一个类型可拥有多个impl块或多个方法
  8. +
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里是借用了实例
fn introduce(&self) {
println!("My name is {}, {} years old!", self.name, self.age);
}
// 定义第二个方法
fn hello(&self) {
println!("hello {}", self.name);
}
}

// 再次使用impl
impl Person {
fn sleep(&self) {
println!("{} is sleeping", self.name);
}
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
};

// 调用方法
tom.introduce();
}
+

结构体方法中实例的所有权

在上面的例子中,我们其实是使用借用的模式获得实例中的数据,但是也可以获得实例所有权或者得到实例的可变引用,这取决于用户想要实现的行为

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里获得了实例的所有权
fn introduce(self) {
println!("My name is {}, {} years old!", self.name, self.age);
}
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
};

tom.introduce();
// 下面这句代码会出现错误,因为实例的所有权已经离开这个作用域
println!("{:?}", tom);
}
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里是获得了可变引用
fn friend(&mut self) {
self.name.push_str(" and jerry");
}
}

fn main() {
let mut tom = Person {
name: "tom".to_string(),
age: 10,
};

println!("{:?}", tom);
tom.friend();
println!("{:?}", tom);
}
+

关联函数

如果学过Python知道,在类中有叫静态方法的特殊类型函数,其不以self作为函数的第一个参数。在Rust中也有类似的函数,即关联函数,关联函数通常被用于构造器,比如下面的例子

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
// new函数即为关联函数,它的作用是返回一个Rectangle实例
fn new(length: usize, width: usize) -> Rectangle {
// 这里使用了简化写法
Rectangle { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}
}

fn main() {
// 调用关联函数时使用"::"
let rec = Rectangle::new(50, 30);
println!("{}", rec.area());
}
+

在结构体方法中,self是一个指向当前对象的指针,类似于Python定义类时的self参数,表示当前对象。Self是一个特殊的类型,表示当前类型本身,比如上面的例子可以这样改写

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#[derive(Debug)]
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
// 使用Self作为返回类型
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}
}

fn main() {
let rec = Rectangle::new(50, 30);
println!("{:?}", rec);
}
+

关联函数和方法的内部调用

在impl块中方法调用其他方法和关联函数的模式是不一样的

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#[derive(Debug)]
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}

fn area_compare(&self, length: usize, width: usize) -> bool {
// 调用关联函数
let rec_new = Self::new(length, width);
// 调用方法
self.area() > rec_new.area()
}
}

fn main() {
let rec = Rectangle::new(50, 30);
println!("{:?}", rec);
let e = rec.area_compare(40, 35);
println!("{}", e);
}
+

如果关联函数想要调用结构体方法,则需要传入结构体实例

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}

fn double_area(rec: &Rectangle) -> usize {
let new_rec = Self::new(rec.length * 2, rec.width * 2);
new_rec.area()
}
}

fn main() {
let rec = Rectangle::new(50, 30);
let double_area = Rectangle::double_area(&rec);
println!("The double area of the rectangle is {} square pixels.", double_area);
}
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/56u6za0a.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/58ea93b5.html b/posts/58ea93b5.html new file mode 100644 index 000000000..5035cecd3 --- /dev/null +++ b/posts/58ea93b5.html @@ -0,0 +1,185 @@ +Vim的编译安装及使用入门 | 无眠呓语

Vim的编译安装及使用入门

Vim文本编辑器,是由Vi发展演变过来的文本编辑器,因其具有使用简单、功能强大等特点,是Linux 众多发行版的默认文本编辑器。如果你喜欢,你甚至可以把它配置成一个IDE

+
+

编译安装

此处安装环境以AlmaLinux9为例

+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编译环境安装
sudo dnf install git gcc ncurses-devel -y
# 克隆源代码
git clone https://github.com/vim/vim.git
# 编译安装(逐步执行)
cd vim/
./configure
make -j8
sudo make install
cd src
./vim
# 替换原有版本
sudo dnf remove vim -y
sudo rm /usr/bin/vim
sudo cp ./vim /usr/bin/
+

简单使用入门

跳转操作

1
2
3
4
5
6
7
8
9
10
11
12
13
上:k    下:j    左:h    右:l

滚动翻页:Ctrl+e 向下翻页:Ctrl+f 向上翻页:Ctrl+b 向下半页:Ctrl+d 向上半页:Ctrl+u

跳转至下一个单词或标点首位:w 跳转至下一个单词或标点末位:e
跳转至上一个单词或标点首位:b
跳转至行首:0 跳转至行尾:$ 跳转至本行第一个非空字符:^
跳转至文首:gg 跳转至文尾:G
跳转至n行:ngg/nG/:n

寻找光标所在行的x字符:fx 重复上一个f指令:;

向上寻找光标位置单词:* 向下寻找光标位置单词:#
+

复制操作、删除操作

1
2
3
4
5
6
7
8
删除光标所在行:dd    删除光标至行尾(不包括回车):d$    删除光标所在单词:dw
删除n行到xn行::n,xnd

复制光标所在行:yy 复制光标至行尾(不包括回车):y$ 复制光标及以下n行:nyy

粘贴剪切板内容部至光标后:p 粘贴剪切板内容部至光标前:P

撤销操作:u 前进操作:Ctrl+r
+

插入模式

1
2
3
在当前光标处插入:i    在当前光标后插入:a
在当前行首处插入:I 在当前行末处插入:A
在当前行下下新增一行:o 在当前行上新增一行:O
+

查找替换操作

1
2
向后搜索字符串:/字符串    向前搜索字符串:?字符串
匹配下一个搜索字符串:n 匹配上一个搜索字符串:N
+

保存退出操作

1
2
3
保存::w
退出::q 强制退出(放弃修改)::q!
保存并退出::wq/:x
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/58ea93b5.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/5c9a9528.html b/posts/5c9a9528.html new file mode 100644 index 000000000..fded07aeb --- /dev/null +++ b/posts/5c9a9528.html @@ -0,0 +1,253 @@ +Requests库常见用法 | 无眠呓语

Requests库常见用法

在使用Python的urllib库进行爬虫操作时非常繁琐,比如处理网页验证和Cookies时,需要编写Opener和Handler来处理。为了更加方便的实现这些操作,就有了更为强大的Requests库。Requests库是一个网页请求库,是基于urllib和urllib3封装的网络请求库,是目前公认的爬取网页最好的库,代码非常简洁,甚至一行代码就能爬取到网页

+
+

Requests环境配置

1
2
3
4
5
# requests库安装
pip install requests
# 使用CPython解释器运行
import requests
# 如果没有报错证明已经安装完成
+

Requests使用

requests.get

语法:requests.get(url, params=None, **kwargs)

+
1
2
3
4
实例
response = requests.get('www.baidu.com')
print(response.status_code)
输出:200
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
属性说明
.status_codeHTTP请求返回的请求码
.encoding从HTTP Header中推测出的网页编码
.apparent_encoding从内容中分析出的网页编码
.textHTTP响应内容的字符串形式,网页源代码
.contentHTTP响应内容的二进制形式
.json()对响应的内容进行json解析
.urlget请求目标url
.headers响应头中的相关信息
.request.headers请求头中的相关信息
.cookies请求头中的cookie
.history获取所有重定向的记录
+
    +
  • headers参数
    一般使用中,为了避免目标网站发现爬虫程序,一般会在请求头中设置User-Agent来让爬虫程序伪装成浏览器

    +
    1
    2
    3
    4
    5
    6
    header = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0'
    }
    response = requests.get('www.baidu.com', headers=header)
    print(response.status_code)
    输出:200
  • +
  • params参数
    Requests在请求中允许使用params关键字参数,以一个字符串字典来提供这些参数。在发起请求的时候,程序会自动地将字典里的参数拼接到URL后

    +
    1
    2
    3
    4
    param = {'q': 'python'}
    response = requests.get('https://search.gitee.com/', params=param)
    print(response.url)
    输出:https://search.gitee.com/?q=python
  • +
  • timeout参数
    在爬虫中,如果没有timeout,代码可能会挂起很长时间,这个时候我们可以对请求设置timeout,让它必须在特定的时间内返回结果,否则就抛出异常

    +
    1
    2
    3
    4
    # timeout可以传入浮点数将作为连接、读取的超时总时间
    response = requests.get('https://www.baidu.com/', timeout=0.05)
    print(response.status_code)
    输出:requests.exceptions.ConnectTimeout
    +
    1
    2
    3
    4
    # timeout也可以传入元组将分别作为连接、读取的超时时间
    response = requests.get('https://www.baidu.com/', timeout=(0.5, 0.01))
    print(response.status_code)
    输出:requests.exceptions.ReadTimeout
    +
  • +
  • proxies参数
    有时,在短时间内同一ip多次访问目标URL的时候会触发网站的反爬机制,这时可以通过在发起请求时设置代理来进行规避

    +
    1
    2
    3
    response = requests.get('http://myip.ipip.net/')
    print(response.text)
    输出:当前 IP:111.111.111.111 来自于:日本 东京 KDDI
    +
    1
    2
    3
    4
    proxy = {'http': 'http://183.89.147.172:8080'}
    response = requests.get('http://myip.ipip.net/', proxies=proxy)
    print(response.text)
    输出:当前 IP:183.89.147.172 来自于:泰国 曼谷 3bb.co.th
    +
  • +
  • verify参数
    Requests在发送网络请求的时候,默认会验证网站的CA证书。如果当前网站没有CA证书,那么就出现SSLError错误,我们可以用verify关键字参数,在请求的时候不验证网站的CA证书

    +

    添加verify=False会出现InsecureRequestWarning警告,但是不会影响后续代码的执行

    +
    +
    1
    2
    3
    response = requests.get('http://data.stats.gov.cn', verify=False)
    print(response.status_code)
    输出:200
    +

    未完待续…

    +
  • +
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/5c9a9528.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/5cm2dmd2.html b/posts/5cm2dmd2.html new file mode 100644 index 000000000..bc1d452f3 --- /dev/null +++ b/posts/5cm2dmd2.html @@ -0,0 +1,187 @@ +Rust学习笔记:Trait对象 | 无眠呓语

Rust学习笔记:Trait对象

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

静态分发(static dispatch)

Rust中的静态分发(static dispatch)主要靠泛型来完成,对于不同的泛型类型参数,编译器会执行单态化处理,即在编译阶段就确定好应该调用的函数 ,为每一个被泛型类型参数代替的具体类型生成不同版本的函数和方法,这部分可以查看泛型部分进行了解

+

单态化(monomorphization)

单态化(monomorphization):即Rust编译器将一个泛型类型转化为多个非泛型类型的过程,编译器会在编译期间对每个实例进行单独优化,优化的结果是静态分发 有着(1)性能更好、(2)代码体积更小、(3)能保证类型安全等优点 但也存在(1)代码灵活度不高、(2)编译时间更长、(3)输出二进制文件更大等不足

+

动态分发(dynamic dispatch)

Rust中的动态分发(dynamic dispatch)可以使用户在不知道具体的类型的情况下,调用泛型类型上的Trait方法。动态分发通过Trait对象(Trait Object)完成,具体的实现机制是:Trait对象将实现了某Trait的类型的指针包装在一个特殊的结构体中,而该结构体又包含一个指向实现该Trait的类型的指针和一个指向Trait的虚函数表(vtable)的指针 ,结合下面的示意图可以更好地理解这段话Trait对象示意图

+

虚函数表(vtable)

虚函数表(vtable)是一个包含Trait方法的函数指针的数组,它允许在运行时动态调用Trait方法,当一个类型实现了一个Trait时,编译器会为该Trait生成一个虚函数表,并将该类型的实现添加到虚函数表中,即当一个对象被转换为Trait对象时,其会被分配一个指向该Trait的虚函数表的指针

+

Trait对象

要创建一个Trait对象,需要使用Box<dyn trait>&dyn Trait关键字将实现了某Trait的类型的指针包装在一个Box<dyn trait>&dyn trait类型的变量中。这个变量可以被传递给函数或存储在变量中,并在运行时动态分配,比如下面的例子

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = return_trait_object(false);
println!("{:?}", rec.area());
}

// 以下的函数会返回一个Trait对象,这时用户不需关心返回的具体类型
// 只需要设置返回类型所需要满足的Trait
fn return_trait_object(flag: bool) -> Box<dyn Shape> {
if flag {
Box::new(Rectangle {
width: 11.0,
height: 9.0,
})
} else {
Box::new(Circle { radius: 7.0 })
}
}
// 可以把上面的例子和Trait部分最后的代码示例做一下对比,看一下有什么区别
+

但需要注意的是,动态分发相比于静态分发产生了更多的指针跳转操作,因此使用Trait对象时会在运行时产生一定额外的开销。实际情况下,用户应根据具体需求选择使用哪种分发模式

+

对象安全

在使用Trait对象时,应注意在Rust中,只能将对象安全(Object-Safe)的Trait转化为Trait对象 ,而对象安全的Trait应满足(1)方法返回的类型不是Self、(2)方法中不包含任何泛型类型参数 ,比如标准库中的Clone trait就是一个非对象安全的trait

+
1
2
3
4
// Clone trait返回类型是Self,所以它是一个非对象安全的trait
pub trait Clone {
fn clone(&self) -> Self;
}
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/5cm2dmd2.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/7h4old6e.html b/posts/7h4old6e.html new file mode 100644 index 000000000..edb3fadb7 --- /dev/null +++ b/posts/7h4old6e.html @@ -0,0 +1,200 @@ +Rust学习笔记:闭包 | 无眠呓语

Rust学习笔记:闭包

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

创建闭包

闭包的创建和函数的创建基本一致,但不用使用fn来定函数。比如下面的main函数中,我们定义了一个闭包

+
1
2
3
4
5
6
7
8
9
fn main() {
// 标准语法
let add = |x: f64, y: f64| -> f64 {
println!("{} + {} = {}", x, y, x + y);
x + y
};

let _result = add(1.0, 2.0); // 调用闭包
}
+

一般情况下,我们其实可以采用简化语法来创建闭包

+
1
2
3
4
5
6
7
8
9
fn main() {
// 简化语法
let add = |x, y| {
println!("{} + {} = {}", x, y, x + y);
x + y
};

let _result = add(1.0, 2.0); // 调用闭包
}
+

闭包中的变量类型

在创建和使用闭包时,编译器通常可以直接推断出使用的变量类型而不用自己定义。但需注意的是,变量类型确定后就不能再使用其他类型的变量了

+
1
2
3
4
5
6
fn main() {
let c = |x| x;

let s = c(String::from("hello"));
let n = c(5); // 注意:该行会发生panic,因为闭包c的参数类型已经确定为"String"类型
}
+

捕获环境

闭包可捕获其所在定义域的环境值,这让闭包的使用比普通函数灵活得多

+
1
2
3
4
5
6
7
8
fn main() {
let var = 3;
let var_add = |x| {
println!("{} + {} = {}", x, var, x + var)
};

var_add(3);
}
+

类似的,如果使用函数的话就不能满足这样的要求了

+
1
2
3
4
5
6
7
8
9
fn main() {
let var = 3;
// 以下的写法会引发panic
fn var_add(x: i32) {
println!("{} + {} = {}", x, var, x + var)
}

var_add(3)
}
+

闭包所捕获环境值的所有权

闭包捕获的环境值的所有权和普通函数的所有权保持一致,一共有三种方式

+

取得变量所有权:FnOnce

满足FnOnce trait的闭包捕获的环境值只能被闭包调用一次,后续无法再次调用

+
1
2
3
4
5
6
7
8
9
fn main() {
let name = String::from("rust");
let c = move |greeting: String| (greeting, name); // 使用move关键字将变量name的所有权传入闭包中

let result = c("hello".to_string());
println!("result: {:?}", result);

println!("{}", name); // 因为变量name的所有权已经转移了,所以这行会发生错误
}
+

获得变量的可变借用:FnMut

满足FnMut trait的闭包可以获得环境值的可变借用

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let mut name = String::from("hello");
let mut c_mut = || {
name.push_str(" rust");
println!("c: {}", name);
};
c_mut();

println!("{}", name); // 变量name的所有权没有改变,但其中的值已经被修改了
}
+

获得变量的不可变借用:Fn

满足Fn trait的闭包不会消耗所捕获环境值的所有权

+
1
2
3
4
5
6
7
8
fn main() {
let y = String::from("hello");
let closure = |x| {
x == y
};
println!("{}", closure("hello"));
println!("{}", y);
}
+

在创建闭包时,Rust可以通过闭包对环境值的使用来推断出闭包具体使用哪个trait,具体而言,即(1)所有的闭包都实现了FnOnce trait、(2)没有移动捕获变量的实现了FnMut trait、(3)无需可变访问捕获变量的闭包实现了Fn trait

+

闭包作为参数

Rust支持函数式编程,所以闭包也可以作为参数、返回值和结构体成员变量。但需注意值的类型是实现FnFnOnce或者FnMut trait的类型

+

作为传入参数

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
let closure = |x: i32| {
println!("print in closure: {}", x);
x
};

call_closure(closure)
}

fn call_closure(closure: impl Fn(i32) -> i32) {
closure(10);
}
+

作为返回值

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let a = call_closure();
a(1);
}

fn call_closure() -> impl Fn(i32) -> i32 {
|x: i32| {
println!("print in closure: {}", x);
x
}
}
+

作为结构体成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
struct Cacher<T> 
where T: Fn(i32) -> i32,
{
calc: T,
value: Option<i32>,
}

impl<T> Cacher<T>
where T: Fn(i32) -> i32,
{
fn new(clac: T) -> Self {
Cacher {
calc: clac,
value: None,
}
}

fn value(&mut self, arg: i32) -> i32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calc)(arg); // 调用传入闭包
self.value = Some(v);
v
}
}
}
}

fn main() {
let mut cacher = Cacher::new(|x| x); // 将闭包传递进结构体中,作为成员变量

println!("caching: {:?}", cacher.value(2));
}
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/7h4old6e.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/9cf09888.html b/posts/9cf09888.html new file mode 100644 index 000000000..3b094a3f5 --- /dev/null +++ b/posts/9cf09888.html @@ -0,0 +1,188 @@ +Selenium及Webdriver环境安装 | 无眠呓语

Selenium及Webdriver环境安装

Selenium是一个非常简单好用的WEB自动化工具,它可以模仿人类用户操作浏览器对网页进行自动化的测试,在实际使用中也能用于网络爬虫,以下内容是部署Python的Selenium基本测试环境教程

+
+

Selenium环境配置

1
2
3
4
5
# Selenium安装
pip install selenium
# 使用CPython解释器运行
import selenium
# 如果没有报错证明已经安装完成
+

浏览器和Webdriver安装配置

Selenium本身不含浏览器和Webdriver,其主要原理是模仿用户对浏览器进行操作,而浏览器本身和浏览器配套的Webdriver由浏览器厂商提供和维护。所以使用Selenium需要在电脑上安装浏览器环境,这里以谷歌Chrome浏览器为例

+
    +
  • Chrome浏览器安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 更新软件包
    sudo apt update
    # 下载Chorme浏览器
    # Ubuntu
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    # AlmaLinux
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
    # 安装浏览器(安装需root权限)
    # Ubuntu
    sudo apt install ./google-chrome-stable_current_amd64.deb
    # AlmaLinux
    sudo dnf install google-chrome-stable_current_x86_64.rpm
    # 检查安装成功
    google-chrome --version
    输出:Google Chrome 104.0.5112.101
  • +
  • Webdriver安装
    https://registry.npmmirror.com/binary.html?path=chromedriver/网站中选取与浏览器版本对应版本和系统的Webdriver,这里以Linux的104.0.5112.79版本的为例
    1
    2
    3
    4
    5
    6
    7
    8
    # 下载Webdriver
    wget https://registry.npmmirror.com/-/binary/chromedriver/104.0.5112.79/chromedriver_linux64.zip
    # 解压文件
    unzip chromedriver_linux64.zip
    # 配置Webdriver
    sudo mv -f chromedriver /usr/local/share/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
    +
  • +
+

环境完成检查

使用以下Python代码测试Selenium自动化测试环境是否部署完成

+
1
2
3
4
5
6
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.close()
# 如果正常的话,浏览器会自动打开百度网站然后浏览器关闭
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/9cf09888.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/a7bp87o2.html b/posts/a7bp87o2.html new file mode 100644 index 000000000..475ee5641 --- /dev/null +++ b/posts/a7bp87o2.html @@ -0,0 +1,238 @@ +Rust学习笔记:错误处理 | 无眠呓语

Rust学习笔记:错误处理

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

错误处理

Rust中的错误处理不同于Python或者Java中常见的try···except···模式,Rust将错误分为两大类:可恢复错误(recoverable)不可恢复错误(unrecoverable),对于可恢复错误,在编写代码时可以使用Result枚举或者Option枚举来打包,可以更好地实现后续的错误处理逻辑

+

Result枚举

在Rust中,Result枚举是处理可能产生错误操作的非常好用的工具,其在标准库中的定义可以看做

+
1
2
3
4
enum Result<T, E> {
Ok(T), // Ok(T):表示操作成功,并且包含一个类型为T的值
Err(E), // Err(E):表示操作失败,并且包含一个类型为E的错误值
}
+

在我们编写代码的时候,一般就可以这样来使用

+
1
2
3
4
5
6
fn file_to_read() -> Result<String, io::Error> {  // 注意这里返回值的类型是Result枚举类型
let mut f = File::open("hello.txt")?; // 这里使用了'?'进行错误传递
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
+

如果结合之前文章里的Trait对象的话可以实现更加通用的效果

+
1
2
3
4
5
6
7
fn file_to_read() -> Result<String, Box<dyn std::error::Error>> {  
// 这里返回值使用Trait对象让函数返回实现'Error'Trait的类型
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
+

is_ok()、is_err()方法

is_ok()is_err()方法主要是用来判断Result的类型值是否有效或存在错误,用法也很简单:
(1)is_ok()是在Result是Ok时返回true,Err则返回false
(2)is_err()是在Result是Ok时返回false,Ok则返回true

+
1
2
3
4
5
6
fn main() {
let res: Result<i32, &str> = Ok(5);
if res.is_ok() {
println!("Result is Ok");
}
}
+

ok()、err()方法

ok()err()方法主要是用来将Result枚举转换为Option枚举,它们的用法如下:
(1)ok()Result<T, E>转换为Option<T>,如果是Err则返回None
(2)err()Result<T, E>转换为Option<E>,如果是Ok则返回None

+
1
2
3
4
fn main() {
let res: Result<i32, &str> = Ok(5);
let opt = res.ok(); // opt is Some(5)
}
+
1
2
3
4
fn main() {
let res: Result<i32, &str> = Err("hello");
let opt = res.err(); // opt is Some("hello")
}
+

Option枚举

和Result枚举类似,Option枚举也是一个相当重要的工具,但它主要是为了解决NULL指针这种容易引起错误的操作,Option枚举在标准库的定义如下

+
1
2
3
4
enum Option<T> {
None,
Some(T),
}
+

当使用Option枚举作为返回值时,函数调用者就必须处理返回值为None这种情况,从而实现让程序更稳定的目的

+

is_some()、is_none()方法

和Result枚举类似,Option枚举的is_some()is_none()也是用来判断值是否有效或为None,即:
(1)is_some()是在Option为Some时返回true,否则返回false
(2)is_none()是在Option为Some时返回false,否则返回true

+
1
2
3
4
5
6
fn main() {
let opt = Some(5);
if opt.is_some() {
println!("Option has a value");
}
}
+

直接处理

除了以上介绍方法外,这两个枚举还有一些通用的方法

+

unwrap()方法

unwrap()方法在Rust中主要用来从Result或Option类型中提取值
(1)如果调用unwrap()时类型是Ok或Some,程序会直接进行提取
(2)如果调用unwrap()时类型是Err或None,程序则会panic并终止运行

+
1
2
3
4
5
6
7
8
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap();
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap(); // 这里会 panic
}
+
1
2
3
4
5
6
7
8
fn main() {
let some_value = Some(10);
let value = some_value.unwrap();
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap(); // 这里会 panic
}
+

unwrap_or()方法

unwrap_or()方法在Rust中用于处理Option和Result类型,提供一个默认值以防返回值为None或Err

+
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 0
}
+
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 0
}
+

unwrap_or_else()方法

unwrap_or_else()方法类似于unwrap_or(),但其接受一个闭包作为参数,当需要默认值时才会调用该闭包,对于计算开销较大的默认值、需要执行一些逻辑才能获得默认值或者需要对err进行处理时的情况非常有用,比如

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or_else(|err| {
println!("Encountered an error: {}", err);
0
});
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or_else(|err| {
println!("Encountered an error: {}", err);
0
});
println!("The value is: {}", value); // 输出: The value is: 0
}
+
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or_else(|| 0);
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or_else(|| 0);
println!("The value is: {}", value); // 输出: The value is: 0
}
+

而且,因为unwrap_or_else()是接受闭包作为参数的,这样就可以很方便的捕获环境值,具体怎么使用闭包可以参考之前的文章

+

unwrap_or_default()方法

unwrap_or_default()方法在Rust中主要用来处理Option和Result类型的值为None或Err时,返回类型的默认值,默认值则由Defaulttrait提供

+
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 0
}
+
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 0
}
+

我们也可以为自定义的类型实现Defaulttrait,使其能调用unwrap_or_default()方法,比如下面这样

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#[derive(Debug)]
struct MyStruct {
value: i32,
}

impl Default for MyStruct {
fn default() -> Self {
MyStruct { value: 42 }
}
}

fn main() {
let some_value: Option<MyStruct> = Some(MyStruct { value: 10 });
let value = some_value.unwrap_or_default();
println!("The value is: {:?}", value); // 输出: The value is: MyStruct { value: 10 }

let none_value: Option<MyStruct> = None;
let value = none_value.unwrap_or_default();
println!("The value is: {:?}", value); // 输出: The value is: MyStruct { value: 42 }
}
+

expect()方法

expect()方法和unwrap()方法类似,都是用于从Result或Option类型中提取值,但相比于unwrap(),expect()允许你提供更具描述性的错误信息,以便更容易调试和定位问题

+
1
2
3
4
5
6
7
8
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.expect("Expected Ok, but got Err");
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.expect("Expected Ok, but got Err"); // 这里会 panic,并显示 "Expected Ok, but got Err: An error occurred"
}
+
1
2
3
4
5
6
7
8
fn main() {
let some_value = Some(10);
let value = some_value.expect("Expected a value, but got None");
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.expect("Expected a value, but got None"); // 这里会 panic,并显示 "Expected a value, but got None"
}
+

map()方法

map()方法用于对Option或Result类型中的值应用一个函数,并返回一个新的Option或Result,通常用于在不改变原始类型的情况下处理值

+
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let new_value = some_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Some(20)

let none_value: Option<i32> = None;
let new_value = none_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: None
}
+
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(20)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("An error occurred")
}
+

对于Result类型,还提供了map_err()方法以适用发生错误的场景

+
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.map_err(|e| format!("Error: {}", e));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(10)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.map_err(|e| format!("Error: {}", e));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("Error: An error occurred")
}
+

and_then()方法

and_then()方法在Rust中用于在Option或Result类型中链式处理值。其作用与map()方法类似,但不同之处在于and_then()期望闭包返回一个新的Option或Result,从而使得链式处理更灵活

+
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let new_value = some_value.and_then(|x| Some(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Some(20)

let none_value: Option<i32> = None;
let new_value = none_value.and_then(|x| Some(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: None
}
+
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.and_then(|x| Ok(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(20)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.and_then(|x| Ok(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("An error occurred")
}
+

其实在生产环境中,应该避免直接使用unwrap()或expect(),因为其会在发生错误时导致程序崩溃,除非错误是可预见的或期望发生的,否则应该更多使用类似unwrap_or()、unwrap_or_else()这类方法

+
+

模式匹配

如上所述,我们在生产环境中应当避免直接使用一些会导致程序奔溃的方法,而当同时需要针对错误的类型实现更加复杂的处理逻辑时,上面的直接处理方法可能就存在一定局限,这时候我们也可以使用模式匹配来细分各种错误的类型进行分别处理,比如下面这样

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::fs::File;
use std::io::{self, Read};

fn read_file_content(file_path: &str) -> Result<String, io::Error> {
let mut file = File::open(file_path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn main() {
// 使用模式匹配对不同情况进行处理
match read_file_content("example.txt") {
Ok(content) => println!("File content: {}", content),
Err(e) => println!("Failed to read file: {}", e),
}
}
+

错误传递

在本文最开始的示例代码中,我们使用到了?操作符进行函数间错误的传递,在Rust中,?操作符主要用于简化错误处理和传递,即当一个函数返回Result或Option类型时,可以使用?操作符来自动处理错误或无值的情况,并将它们传递给函数调用者来进行后续处理

+

‘?’操作符的工作原理

(1)对于Result类型:如果表达式返回Ok,则?操作符将其解包并返回其中的值;如果返回Err,则?操作符会将Err提前返回,结束当前函数的执行
(2)对于Option类型:如果表达式返回Some,则?操作符将其解包并返回其中的值;如果返回None,则?操作符会将None提前返回,结束当前函数的执行

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::fs::File;
use std::io::{self, Read};

fn read_file_content(file_path: &str) -> Result<String, io::Error> {
let mut file = File::open(file_path)?; // 使用'?'进行错误处理和传递
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn main() -> Result<(), io::Error> {
let content = read_file_content("example.txt")?;
println!("File content: {}", content);
Ok(())
}
+

在以上示例中可以看出,?操作符大大简化了错误处理

+

‘?’操作符的注意事项

返回类型必须是Result或Option

使用?操作符的函数必须返回Result或Option类型,如果尝试在返回类型不是Result或Option的函数中使用,编译器就会报错,比如下面的例子

+
1
2
3
4
5
6
fn invalid_use_of_question_mark(file_path: &str) -> String {
let mut file = std::fs::File::open(file_path)?; // 此处会发生编译错误,因为函数返回类型为String
let mut content = String::new();
file.read_to_string(&mut content)?;
content
}
+

错误类型的转换

使用?操作符时,函数的错误类型必须与调用链中的错误类型一致,

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::io;

fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError> {
let num: i32 = s.trim().parse()?;
Ok(num)
}

fn main() -> Result<(), io::Error> {
let s = "195";
// 下面的代码会发生错误,因为parse_number函数传递的是std::num::ParseIntError错误
// 而main函数可能返回的是io::Error错误
let number = parse_number(&s)?;
println!("Parsed number: {}", number);
Ok(())
}
+

如果不一致,但是又确有这样的需求时,就需要通过Fromtrait或显式的错误转换来解决

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use std::fs::File;
use std::io::{self, Read};

#[allow(dead_code)]
#[derive(Debug)]
enum MyError {
Io(io::Error),
Parse(std::num::ParseIntError),
}

impl From<io::Error> for MyError {
fn from(err: io::Error) -> MyError {
MyError::Io(err)
}
}

impl From<std::num::ParseIntError> for MyError {
fn from(err: std::num::ParseIntError) -> MyError {
MyError::Parse(err)
}
}

fn read_file_content(file_path: &str) -> Result<String, MyError> {
let mut file = File::open(file_path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn parse_number(s: &str) -> Result<i32, MyError> {
let num: i32 = s.trim().parse()?;
Ok(num)
}

fn main() -> Result<(), MyError> {
let content = read_file_content("example.txt")?;
let number = parse_number(&content)?;
println!("Parsed number: {}", number);
Ok(())
}
+

不要滥用’?’

虽然?操作符非常方便,但也不应滥用,在某些情况下,明确处理错误可能更合适

+

确保错误传递的合理性

当使用?操作符传递错误时,应确保错误处理的设计合理,某些错误可能需要立即处理,而不是传递

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/a7bp87o2.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/akex76ga.html b/posts/akex76ga.html new file mode 100644 index 000000000..5ac537263 --- /dev/null +++ b/posts/akex76ga.html @@ -0,0 +1,203 @@ +Rust学习笔记:Trait | 无眠呓语

Rust学习笔记:Trait

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

Trait的作用

在Rust中Trait(特质)是一种任何类型都可以选择支持或不支持的一种定义行为的机制,Trait可以被认为是某类型能够做什么的一种能力,其类似于其他语言中的接口,但存在一定区别。Trait的作用主要包含(1)定义共享行为、(2)实现多态、(3)扩展类型的功能、(4)提高代码可读性和可维护性、(5)约束泛型类型(见泛型部分)

+

Trait的定义与实现

Trait的定义

使用trait关键字定义一个Trait。Trait的定义是将方法的签名进行封装,以定义实现某种目的所必须的一组行为

+
1
2
3
4
5
6
trait Shape {
// 定义计算面积的方法签名
fn area(&self) -> f64;
// 定义计算周长的方法签名
fn perimeter(&self) -> f64;
}
+

在Trait的定义中只有方法签名而没有具体的实现,其中封装的方法的具体实现由实现该Trait的类型提供

+

Trait的实现

Trait中定义方法的实现和结构体或枚举方法的实现很相似,都是使用impl关键字。具体写法为impl ... for ...

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
trait Shape {
fn area(&self) -> f64;
fn perimeter(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

// 为Rectangle提供Shape trait实现
impl Shape for Rectangle {
fn area(&self) -> f64 {
self.width * self.height
}
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
}

struct Circle {
radius: f64,
}

// 为Circle提供Shape trait实现
impl Shape for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

// 调用已经实现Trait中的方法也和调用普通方法一致
println!("area: {}, perimeter: {}", rec.area(), rec.perimeter());
}
+

在上面的例子中,“圆”和“矩形”是不同的类型,但我们可以在函数中使用同样的函数签名来调用它们绑定的方法

+

Trait的实现约束

在类型上实现Trait存在两个限制条件

+
    +
  1. 这个类型`或`这个Trait(至少有一个)是在本地crate定义的 ,比如我们可以为Rectangle类型实现Debug Trait,也可以为Vector类型实现Shape Trait
  2. +
  3. 为确保两个不同库的代码不互相影响,在Rust中无法为外部类型实现外部Trait ,比如我们无法为标准库中的String类型实现Display Trait
  4. +
+

Trait默认实现与重载

Trait的默认实现

在前面,我们说Trait所封装的方法的实现由实现这个Trait的类型提供,但在定义Trait时其实也可以提供默认实现

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
trait Shape {
fn perimeter(&self) -> f64;
// 提供默认实现
fn area(&self) -> f64 {
println!("default method, return perimeter");
// 在默认实现中可以调用trait中定义的方法,且不用管其他方法是否提供了默认实现
self.perimeter()
}
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
// 当一个类型想调用默认实现时,不需要为该类型实现已经默认实现的方法
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};
// 这里的代码调用了Shaper trait中的默认实现,最后打印的是周长
println!("rec area: {}", rec.area());
}
+

上面的例子中,Trait在定义时就提供了默认实现。但需要注意的是,默认实现无法获得类型中的字段(field) ,因为Trait定义的是具体类型的共享行为,它无法知道用户定义的类型会提供什么数据,比如我们在矩形中我们提供了长和宽,而圆只提供了半径

+

Trait的重载

虽然Trait可以提供默认实现,但我们也可以针对特定类型进行Trait的重载,重载不会影响其他类型调用默认实现

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64 {
println!("default method, return perimeter");
self.perimeter()
}
}

struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
// 重载默认实现
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let cir = Circle {
radius: 5.0,
};
// 因为Circle重载了area()方法,所以打印的是正确的面积值
println!("cir area: {}", cir.area());
}
+

Trait作为传入类型和返回类型

作为传入类型

在Rust中,我们可以将Trait作为函数传入的参数类型,就可以实现将多种具体的类型传入同一函数

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

trait_param(rec);
}

// 这个函数接收一个实现Shape trait的类型
fn trait_param(item: impl Shape) {
println!("{}", item.area());
}
+

在上面的例子中,trait_param()这个函数接收一个实现了Shape trait的类型,在调用时可以将任何实现Shape trait的类型传入。当我们想约束传入的类型需要实现多个Trait时,Trait之间可以使用+号连接

+

作为返回类型

和传入参数时类似,Trait也可以作为返回类型

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = return_trait();
println!("{:?}", rec);
}

// 这个函数会返回一个实现了Shape trait和Debug trait的类型
fn return_trait() -> impl Shape + Debug {
Rectangle {
width: 11.0,
height: 9.0,
}
}
+

上面的例子中,return_trait()函数会返回一个实现Shape trait和Debug trait的类型。但是需要注意的是,当我们使用特定trait作为返回类型时,用户必须保证这个函数返回的具体类型是确定的 ,否则就会像下面例子中的代码一样出现错误

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

#[derive(Debug)]
struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = return_trait(false);
println!("{:?}", rec);
}

// 以下的函数会出现一个错误,因为函数返回的具体类型的可能性不唯一
fn return_trait(flag: bool) -> impl Shape + Debug {
if flag {
Rectangle {
width: 11.0,
height: 9.0,
}
} else {
Circle { radius: 7.0 }
}
}
+

以上的例子是无法通过编译的,但如果我们确实需要实现与例子中return_trait()函数类似的功能也是有办法的,具体见Trait对象部分

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/akex76ga.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/bd214e51.html b/posts/bd214e51.html new file mode 100644 index 000000000..29ede9b7b --- /dev/null +++ b/posts/bd214e51.html @@ -0,0 +1,306 @@ +使用Python调用C语言动态链接库 | 无眠呓语

使用Python调用C语言动态链接库

Python以其开发简单、快捷和良好的生态受到全世界众多开发者的喜爱,但Python也因其较慢的运行速度被很多人诟病。同时,C语言以其能直接控制底层资源、运行速度快而广泛被用于操作系统和嵌入式设备的相关开发中,但C语言的缺点就是开发效率较低。那是否可以将两者结合起来?答案是可以的。关于Python调用C代码有好几种方式,在这里只举例介绍我个人常用且较为简单的使用Python的ctypes库调用C语言动态链接库的方法

+
+

实例:使用Python调用C语言编写的累加函数

C代码

1
2
3
4
5
6
7
8
9
10
11
12
// add.c(输入一个整数并返回1+2+3+...+num的值)
#include<stdio.h>

int add(long num)
{
long result = 0;
for(long i=1; i<=num; i++)
{
result += i;
}
return result;
}
+

C代码需要通过编译生成动态链接库文件(Linux系统下为.so文件,Windows系统下为.dll文件),这里以Linux为例

+
+
1
gcc -fPIC -O3 -shared add.c -o add.so
+

Python代码

使用Python调用C语言动态链接库

+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
from ctypes import *

def num_add_up(num: int) -> None:

result = 0
start = time.time()
lib = CDLL('./add.so')
lib.add.argtypes = [c_long] # 定义传入参数的类型
lib.add.restype = c_long # 定义返回值的类型
result = lib.add(num)
print(result)
print(time.time()-start)

if __name__ == '__main__':
num_add_up(100000000)

输出:
5000000050000000
0.03809380531311035
+

使用Python实现

+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time

def num_add_up(num: int) -> None:

result = 0
start = time.time()
for i in range(0, num+1):
result += i
print(result)
print(time.time()-start)

if __name__ == "__main__":
num_add_up(100000000)

输出:
5000000050000000
5.233763933181763
+

可以看出采用动态链接库的代码速度优势明显,可以通过这种方式对Python程序进行局部优化,提高程序的运行速度

+
+ +

ctypes参数类型

使用C语言动态链接库与Python的参数传递时,是无法直接传递Python中的变量的。需要ctypes进行相关的封装,ctypes在此定义了一些和C兼容的基本数据类型以供使用

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ctypes 类型C 类型Python 类型
c_bool_Boolbool (1)
c_charchar单字符字节串对象
c_wcharwchar_t单字符字符串
c_bytecharint
c_ubyteunsigned charint
c_shortshortint
c_ushortunsigned shortint
c_intintint
c_uintunsigned intint
c_longlongint
c_ulongunsigned longint
c_longlong__int64 or long longint
c_ulonglongunsigned __int64 or unsigned long longint
c_size_tsize_tint
c_ssize_tssize_t or Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar* (NUL terminated)字节串对象或 None
c_wchar_pwchar_t* (NUL terminated)字符串或 None
c_void_pvoid*int 或 None
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/bd214e51.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/e22de85.html b/posts/e22de85.html new file mode 100644 index 000000000..584f95a26 --- /dev/null +++ b/posts/e22de85.html @@ -0,0 +1,184 @@ +根据BV号爬取哔哩哔哩视频弹幕 | 无眠呓语

根据BV号爬取哔哩哔哩视频弹幕

喜欢逛B站的同学都知道,B站的最有意思就是“弹幕”,视频的播放量和弹幕数量基本上是成正比的。分析一个视频最好的方法就是看弹幕的情况,今天闲得无聊写一个爬弹幕的程序玩玩,后面可以搭配一些其他库进行词频分析,我这就只写爬取弹幕的部分了…

+
+ +

所需依赖库

1
2
3
4
# 请求库
requests
# 解析库
pyquery
+ +

资源页

1
2
3
4
# 获取视频cid
https://api.bilibili.com/x/player/pagelist?bvid=BV号
# 具体弹幕列表页
https://comment.bilibili.com/cid号.xml
+ +

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 爬取哔哩哔哩BV号对应视频的弹幕
import requests
from pyquery import PyQuery as pq

def get_url_page(url):
header = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0",
"Cookie": ""
}
response = requests.get(url, headers=header)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response
return None

def get_cid(bv):
cid_url = f"https://api.bilibili.com/x/player/pagelist?bvid={bv}"
cid_page = get_url_page(cid_url).json()

return cid_page["data"][0]["cid"]

def main():
bv_str = input("input the BV:")
danmaku_url = f"https://comment.bilibili.com/{get_cid(bv_str)}.xml"
danmaku_page = get_url_page(danmaku_url)
doc = pq(bytes(danmaku_page.text, encoding="utf-8"))
danmakus = doc("d").items()
with open("danmaku_list.txt", "a", encoding="utf-8") as f:
for danmaku in danmakus:
f.write(f"{danmaku.text()}\n")

if __name__ == "__main__":
main()
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/e22de85.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/f793f9ae.html b/posts/f793f9ae.html new file mode 100644 index 000000000..80ccc9f1b --- /dev/null +++ b/posts/f793f9ae.html @@ -0,0 +1,183 @@ +AlmaLinux初上手 | 无眠呓语

AlmaLinux初上手

前言

随着CentOS转为RHEL的上游滚动发行版,原CentOS的生态位出现了空缺,而目前CentOS的替代产品主要有AlmaLinuxRockyLinux。本人是Debian系的长期用户,对RedHat系不太熟悉,所以写这篇博客记录下AlmaLinux9的初始配置,以便后续查阅

+
+

具体配置

安装EPEL软件源

1
sudo dnf install epel-release
+

Rust环境配置

1
2
# Rust安装脚本
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+

Docker配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 卸载podman
sudo dnf remove podman buidah

# docker安装
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
# 设置开机启动
sudo systemctl start docker.service
sudo systemctl enable docker.service
# 安装完成检测
sudo systemctl status docker
# 显示active(running),则说明docker安装完成

# 配置docker国内镜像库
依次操作:前往阿里云容器镜像服务网站[https://cr.console.aliyun.com] -> 登录阿里云 -> 选择镜像工具 -> 选择镜像加速器 -> 复制加速器地址
# 进入目录
cd /etc/docker/
sudo vi daemon.json
# 粘贴以下代码
{
"registry-mirrors": ["加速器地址"]
}
# 重启docker让镜像配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看镜像配置是否生效
sudo docker info
+

防火墙相关操作

1
2
3
4
5
6
7
8
9
10
# 查看状态
sudo systemctl status firewalld
# 启动
sudo systemctl start firewalld
# 关闭
sudo systemctl stop firewalld
# 开机启用
sudo systemctl enable firewalld
# 开机禁用
sudo systemctl disable firewalld
+

创建、删除用户

1
2
3
4
5
6
7
8
9
10
11
12
# 新建用户
sudo adduser 用户名
# 配置用户密码
sudo passwd 用户名

# 赋予用户sudo权限
sudo usermod -aG wheel 用户名

# 删除用户但保留用户文件夹
sudo userdel 用户名
# 删除用户及用户文件夹
sudo userdel -r 用户名
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/f793f9ae.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/fcf74e02.html b/posts/fcf74e02.html new file mode 100644 index 000000000..019173a7e --- /dev/null +++ b/posts/fcf74e02.html @@ -0,0 +1,199 @@ +将Vim配置为Rust的简易IDE | 无眠呓语

将Vim配置为Rust的简易IDE

所需Vim插件

1
2
3
4
5
6
7
8
# vim-plug
库地址: https://github.com/junegunn/vim-plug

# rust.vim
库地址: https://github.com/rust-lang/rust.vim

# coc.nvim
库地址: https://github.com/neoclide/coc.nvim
+

安装教程

此处安装环境以AlmaLinux9为例

+
+

在安装这类工具时,应当注意插件所需Vim的版本,如果Vim的版本太低可能无法安装

+
+

vim-plug安装

1
2
3
# 下载源代码
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+

添加rust.vim和coc.nvim的配置到~/.vimrc文件

最终编辑好的~/.vimrc文件应该是下面这样

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
" vim-plug setup
call plug#begin('~/.vim/plugged')

Plug 'rust-lang/rust.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}

call plug#end()

" rust.vim setup
syntax enable
filetype plugin indent on
let g:rustfmt_autosave = 1

" coc.nvim setup
set updatetime=100

inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

autocmd CursorHold * silent call CocActionAsync('highlight')
+

Vim插件安装

Vim控制台输入

+
1
:PlugInstall
+

coc-rust-analyzer安装

等待rust.vim和coc.nvim安装完成后,在Vim控制台输入

+
1
:CocInstall coc-rust-analyzer
+

配置coc-settings.json文件

在Vim控制台输入命令来编辑coc-settings.json

+
1
:CocConfig
+

写入以下内容

+
1
2
3
4
{
"suggest.noselect": true,
"suggest.enablePreselect": false
}
+ +

coc.nvim需要Node.js才能正常运行,所以在使用时应检查是否安装了Node.js且其版本也应满足要求。在AlmaLinux下使用sudo dnf install nodejs安装Node.js

+
+ +

可能的问题

下载失败

因为众所周知的网络原因,在国内下载安装插件时可能会出现无法成功下载的情况,这时需要多次尝试下载或使用代理下载

+

启动rust-analyzer

进入cargo项目时,coc.nvim会提示需下载rust-analyzer,根据提示选择即可

+

~/.vimrc文件配置

顺便记录一下自己的~/.vimrc文件内容,以便今后重新配置的时候使用

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
" init setup
set nu
set ts=4
set expandtab
set listchars=tab:>-,trail:.
set list
set backspace=2

" vim-plug setup
call plug#begin('~/.vim/plugged')

Plug 'rust-lang/rust.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'preservim/nerdtree'
Plug 'vim-airline/vim-airline'
Plug 'morhetz/gruvbox'

call plug#end()

" rust.vim setup
syntax enable
filetype plugin indent on
let g:rustfmt_autosave = 1

" coc.nvim setup
set updatetime=100

inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

nmap <silent> <C-q> <Plug>(coc-diagnostic-prev)
nmap <silent> <C-a> <Plug>(coc-diagnostic-next)

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

autocmd CursorHold * silent call CocActionAsync('highlight')

" nerdtree setup
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

" airline setup
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline_powerline_fonts = 1

" theme setup
set background=dark
colorscheme gruvbox
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/fcf74e02.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/i5v2u2.html b/posts/i5v2u2.html new file mode 100644 index 000000000..3e4868771 --- /dev/null +++ b/posts/i5v2u2.html @@ -0,0 +1,196 @@ +Rust学习笔记:函数作为参数 | 无眠呓语

Rust学习笔记:函数作为参数

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

在之前闭包的文章中,我们可以知道,在Rust中函数也可以像在Python、Nodejs一样作为参数传入到另一个函数中,具体使用时主要有两种方法来实现

+

闭包作为参数

在之前的文章中讲到闭包对捕获的变量所有权有三种特性:FnFnMutFnOnce,其分别表示了闭包在捕获环境时的不同方式。

+

Fn闭包作为参数

Fn:闭包通过不可变借用捕获环境中的变量,可以在多次调用中复用,不会改变捕获的变量。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 定义一个函数,接受一个实现了 Fn 特性的闭包作为参数
fn apply_fn<F>(f: F, value: i32) -> i32
where
F: Fn(i32) -> i32,
{
f(value)
}

fn main() {
// 使用一个简单的闭包,返回输入的两倍
let result1 = apply_fn(|x| x * 2, 5);
println!("Result1: {}", result1); // 输出 Result1: 10

// 使用闭包捕获环境,但不改变环境变量的值
let offset = 3;
// 使用一个闭包,返回输入加上捕获的环境变量
let result2 = apply_fn(|x| x + offset, 5);
println!("Result2: {}", result2); // 输出 Result2: 8
println!("factor: {}", factor); // factor的值没有改变
}
+

FnMut闭包作为参数

FnMut:闭包通过可变借用捕获环境中的变量,可以修改捕获的变量。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn apply_fn_mut<F>(mut f: F, value: i32) -> i32
where
F: FnMut(i32) -> i32,
{
f(value)
}

fn main() {
// 使用 FnMut 闭包
let mut factor = 2;
let result1 = apply_fn_mut(
|x| {
factor *= 2;
x * factor
},
5,
);
println!("Result1 (FnMut): {}", result1); // 输出 Result1 (FnMut): 20
println!("factor: {}", factor); // 输出:factor: 4
}
+

运行上面的代码可以发现,变量factor的值发生了改变

+

FnOnce闭包作为参数

FnOnce:闭包通过值捕获环境中的变量,消耗捕获的变量,这种闭包只能调用一次。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fn apply_fn_once<F>(f: F, value: i32) -> i32
where
F: FnOnce(i32) -> i32,
{
f(value)
}

fn main() {
// 变量factor是一个String类型,是一个非Copy类型
let factor = String::from("2");
// 使用move关键字强制按值捕获
let result2 = apply_fn_once(move |x| x * factor.parse::<i32>().unwrap(), 5);
println!("Result2 (FnOnce): {}", result2);
// 下面这行会编译错误,因为factor的所有权已经被移动
println!("{}", factor);
}
+

函数指针作为参数

通过以上的例子可以看出,使用闭包在非常方便的将函数作为参数传入到其他函数中(闭包也是一种函数),但使用闭包不容易编写逻辑性较为复杂的代码,否则可能会造成代码难以阅读,这时我们可以使用函数指针

+

函数指针作为参数

下面是一个最简单的函数指针作为参数的例子

+
1
2
3
4
5
6
7
8
9
10
11
12
13
// apply函数接受一个函数指针f和一个整数x作为参数
fn apply(f: fn(i32) -> i32, x: i32) -> i32 {
f(x)
}

fn double(x: i32) -> i32 {
x * 2
}

fn main() {
let result = apply(double, 5);
println!("Result: {}", result); // 输出: Result: 10
}
+

多个函数指针参数

1
2
3
4
5
6
7
8
9
10
11
fn process(input: i32, f1: fn(i32) -> i32, f2: fn(i32) -> i32) -> i32 {
f2(f1(input))
}

fn double(x: i32) -> i32 { x * 2 }
fn square(x: i32) -> i32 { x * x }

fn main() {
let result = process(3, double, square);
println!("Result: {}", result); // 输出: Result: 36
}
+

函数指针作为返回值

1
2
3
4
5
6
7
8
9
10
11
12
fn get_operation(op: &str) -> fn(i32, i32) -> i32 {
match op {
"add" => |x, y| x + y,
"multiply" => |x, y| x * y,
_ => |x, _| x,
}
}

fn main() {
let add_op = get_operation("add");
println!("Result: {}", add_op(5, 3)); // 输出: Result: 8
}
+

特征对象

结合之前Box<T>智能指针,可以更灵活的使用函数指针,比如下面的例子

+
1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
let functions: Vec<Box<dyn Fn(i32) -> i32>> = vec![
// vector中的数据类型必须一致且大小需要在编译中确定
// 这里使用指针类型保证编译时类型和大小一致
Box::new(|x| x + 1),
Box::new(|x| x * 2),
Box::new(|x| x * x),
];

for f in functions.iter() {
println!("Result: {}", f(5));
}
}
+

以上只是一个非常基础的举例,事实上还有很多巧妙的用法,这里就不赘述了

+

总结

使用函数作为参数可以使程序更灵活、强大,可以提高代码的复用性和灵活性和实现回调机制等等优点,但在使用中也需要结合特定的场景来选择。比如需要考虑环境变量时,可能使用闭包更好用,但需要实现较为复杂的函数功能时,可能函数指针更加的方便,具体需要根据我们在实际编程中的使用场景来确定

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/i5v2u2.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/l4j4c8hb.html b/posts/l4j4c8hb.html new file mode 100644 index 000000000..db4af4990 --- /dev/null +++ b/posts/l4j4c8hb.html @@ -0,0 +1,181 @@ +使用Podman构建Rust项目 | 无眠呓语

使用Podman构建Rust项目

编写Rust程序

1
2
3
4
# 创建Cargo项目
cargo new hello
# 编辑main.rs文件
vi /hello/src/main.rs
+

拉取所需Rust版本的镜像

DockerHub项目地址:https://hub.docker.com/_/rust/tags

+
1
2
# 拉取所需版本的Rust镜像
podman pull rust:1.74.1
+

使用容器构建Rust程序

1
2
3
4
5
6
7
8
9
10
11
# 进入Rust项目目录
cd hello/
# 进入Podman容器
podman run -it --privileged=true --rm -v .:/app rust:1.74.1 /bin/bash
# 构建项目
cd app/
cargo build
# 退出容器
exit
# 在宿主机运行二进制程序
./target/debug/hello # 此处仅为示例,具体文件名应根据项目进行填写
+

在使用容器构建Rust项目时应注意容器中的libc和其他运行库的版本和宿主机环境是否兼容,否则编译出的二进制文件可能无法正常运行

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/l4j4c8hb.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/pm7yb0b2.html b/posts/pm7yb0b2.html new file mode 100644 index 000000000..015a06a92 --- /dev/null +++ b/posts/pm7yb0b2.html @@ -0,0 +1,207 @@ +Rust学习笔记:Box<T>智能指针 | 无眠呓语

Rust学习笔记:Box<T>智能指针

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

简介

Box<T>智能指针的组成

在Rust的智能指针中,Box<T>是最简单的智能指针,其主要由两部分组成:(1)储存在堆内存(heap)上的数据、(2)储存在栈内存(stack)上的、指向堆内存数据的指针 ,比如下面的例子中,我们使用Box::new()在堆内存上请求了一块区域来存储数字”5”,然后返回了一个指向该区域的指针并赋值给变量”a”

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let a = Box::new(5);
}
/* Box<T>示意图
------- ------
|stack| |heap|
------- ------
| ptr ------------>|data|
------- ------
*/
+

Box<T>指针的使用场景

    +
  1. 在编译时,某类型的大小无法确定。但使用该类型时,上下文却需要知道其确切大小
  2. +
  3. 当存在大量数据想要移交所有权,但需确保操作时数据不会被复制
  4. +
  5. 当使用某个值时,只关心其是否满足特定的Trait约束,而不关心其具体的类型
    总体而言,Box<T>的作用主要有:(1)动态分配内存、(2)所有权转移、(3)避免内存泄漏、(4)处理递归类型、(5)实现Trait对象(见Trait对象部分)
  6. +
+

使用Box<T>指针创建递归类型

我们首先必须了解这样一个规定:Rust在编译时,必须知道一个类型所占用的空间大小 ,而递归类型(如链表)因为递归层数的不确定,其大小在编译时也是无法确定的,比如下面的代码就无法通过编译,因为List所占用的空间大小在编译时没法确定

+
1
2
3
4
5
6
7
8
9
10
use crate::List::{Cons, Nil};

enum List {
Cons(i32, List),
Nil,
}

fn main() {
let list = Cons(1, Cons(2, Cons(3, Nil)));
}
+

但是,我们知道在Rust中指针变量的大小是可以确定的,在这里就可以使用Box<T>来定义递归类型

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use crate::List::{Cons, Nil};

enum List {
Cons(i32, Box<List>),
Nil,
}

fn main() {
let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
let mut current = &list;
// 遍历list
loop {
match current {
Cons(value, next) => {
println!("{}", value);
current = next;
}
Nil => break,
}
}
}
+

两个基本trait

Deref trait

    +
  • Deref trait的作用:Deref trait可以让用户自定义解引用运算符*的行为,即通过实现Deref trait,用户可以像使用常规引用一样使用智能指针
  • +
+

Box<T>的解引用

1
2
3
4
5
6
7
8
fn main() {
// 常规引用的解引用
let x = &5;
assert_eq!(5, *x);
// Box<T>的解引用
let y = Box::new(3);
assert_eq!(3, *y);
}
+

自定义Box<T>指针

在Rust中,Box<T>被定义为拥有一个元素的元组结构体(tuple struct)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use std::ops::Deref;

struct MyBox<T>(T);

impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}

// 为MyBox实现Deref trait让我们可以使用解引用运算符
impl<T> Deref for MyBox<T> {
type Target = T;
// 实现Deref trait中的deref方法
fn deref(&self) -> &Self::Target {
&self.0
}
}

fn main() {
let x = MyBox::new(5);
assert_eq!(5, *x); // 这里"*x"会被隐式的展开为"*(x.deref())"
}
+

隐式解引用转化(Deref Coercion)

隐式解引用转化(Deref Coercion)是为函数和方法提供的一种便捷特性 ,具体来说就是:如果一个类型T实现了Deref trait,那么在编译时,编译器就会将T的引用隐式地转换为经过Deref操作后生成的引用

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use std::ops::Deref;

struct MyBox<T>(T);

impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}

impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}

fn main() {
let x = MyBox::new("hello, world!".to_string());
// 注意:向hello()传参时会发生隐式解引用转化
hello(&x);
}

fn hello(s: &str) {
println!("{}", s);
}
+

在上面的代码中,变量x经过了两次Deref转换,即:&Mybox<String> -> &String -> &str(注:在标准库中String实现了Deref trait,所以它会隐式地转换为&str)

+

Drop trait

    +
  • Drop trait的作用:实现Drop trait,可以让用户自定义当值将要离开作用域时发生的动作,比如文件或其他资源的释放等,它有点像Python中的__del__方法
  • +
+

drop()方法的触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct CustomSmartPointer {
data: String,
}

// 为CustomSmartPointer实现Drop trait
impl Drop for CustomSmartPointer {
// 实现drop()方法
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}

fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}

/*
OutPut:
CustomSmartPointers created.
Dropping CustomSmartPointer with data `other stuff`!
Dropping CustomSmartPointer with data `my stuff`!
*/
+

通过输出信息可以知道:程序运行完成后,内存中变量释放的顺序是从下往上的

+

手动释放内存

在Rust中,我们并不能直接调用某类型的drop()方法,但一般也不需要手动调用drop()方法,因为Drop trait的功能是自动运行变量被释放后的一系列行为,但有时我们又确实存在手动释放内存的需求,这时我们可以使用标准库提供的std::mem::drop 函数

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use std::mem::drop;

struct CustomSmartPointer {
data: String,
}

impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}

fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
// 手动释放变量
drop(c);
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}

/*
OutPut:
Dropping CustomSmartPointer with data `my stuff`!
CustomSmartPointers created.
Dropping CustomSmartPointer with data `other stuff`!
*/
+

可以发现打印的信息顺序发生了变化,这是因为我们先显式地释放了变量cc在释放时触发了c.drop()方法,所以最后的结果表现不一样

+

其他智能指针

Box<T>外,Rust中还存在其他的智能指针,如Rc<T>Arc<T>Mutex<T>等等,这些就等用到的时候再写吧…

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/pm7yb0b2.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/u74pp23h.html b/posts/u74pp23h.html new file mode 100644 index 000000000..fc72914de --- /dev/null +++ b/posts/u74pp23h.html @@ -0,0 +1,208 @@ +Rust学习笔记:引用与借用 | 无眠呓语

Rust学习笔记:引用与借用

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

引言

在Rust的基于所有权的内存管理模式中,对于引用类型变量,其所有权会在传递过程中发生变化。比如下面的代码中,当我们将String类型的变量传入函数后,s的所有权发生变更,我们想在main函数中继续使用s就不行了

+
1
2
3
4
5
6
7
8
9
10
11
fn main() {
let s = "hello".to_string();
// 函数get_ownership()获得了变量s的所有权
get_ownership(s);
println!("{}", s);
}

fn get_ownership(s: String) {
println!("{}", s);
// get_ownership()函数执行完,s被释放
}
+

但是在实际开发过程中我们常常需要继续在main函数中使用这些变量,这时主要三种方法可以满足类似的需求

+

深拷贝

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
// 将原变量深拷贝后传递给调用函数
get_ownership(s.clone());
println!("{}", s);
}

fn get_ownership(sc: String) {
println!("{}", sc);
}
+

通过clone(),确实可以解决后续在main函数中使用变量的问题,但在实际情况中,我们如果要对原来的变量进行处理而不是单纯的传递,采用clone()就不是很友好了

+

归还所有权

归还所有权就是当调用函数结束的时候,将变量的所有权返回至原函数,见下面的例子

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
let s = give_back(s);
println!("{}", s);
}

fn give_back(s: String) -> String {
println!("{}", s);
s // 通过返回值,将s的所有权返回原函数
}
+

归还所有权很好理解,但这样写出的代码比较冗余,且在返回值的处理上会比较麻烦

+

传递引用

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
// 通过传递引用,将s的所有权保留在main函数中
give_reference(&s);
println!("{}", s);
}

fn give_reference(s: &String) {
println!("{}", s);
}
+

通过传递引用不会改变原变量的所有权,这样就可以避免后续处理所有权的麻烦

+

引用(Reference)

我们先分析下以下例子中的变量s和&s在内存中的关系。通过示意图可以看出:在引用变量s时程序创建了一个指针&s,它指向了变量s中指向堆内存数据的指针,当我们将&s传递到外部函数时,s1获得&s的所有权,在s1(&s)被释放后,不会导致变量s也被释放

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fn main() {
let s = "hello".to_string();
let length = calc_len(&s);
println!("{}", s);
}

fn calc_len(s1: &String) -> usize {
s1.len()
}

// 引用在内存上的相互关系
/*
&s s
+----+-----+ +--------+-----+ +-------+-----+
|name|value| | name |value| | index |value|
+----+-----+ +--------+-----+ +-------+-----+
| ptr|------------->| ptr |------------->| 0 | h |
+----+-----+ +--------+-----+ +-------+-----+
| len | 5 | | 1 | e |
+--------+-----+ +-------+-----+
|capacity| 5 | | 2 | l |
+--------+-----+ +-------+-----+
| 3 | l |
+-------+-----+
| 4 | o |
+-------+-----+
*/
+

Rust中的&符号就表示引用,它允许调用值而不取得其所有权

+

借用(Borrow)

在Rust中将创建一个引用的行为称为”借用”,即将引用作为函数参数的行为就是”借用”。如同现实生活中,我们向别人借物品,使用完毕后必须还回去一样,因为我们没有该物品的所有权

+

可变引用

采用类似&String写法时,默认情况下我们是没法改变引用值的,但在很多场景中又确有修改引用值的需求。在Rust中提供了可变引用实现此类功能,具体见下面的例子

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let mut s = "hello".to_string();
add_str(&mut s);
println!("{}", s);
}

fn add_str(s: &mut String) {
// 通过可变引用修改s中的数据
s.push_str(", world!");
}
+

可变引用的两个限制

Rust虽然提供了可变引用的方法,但同时也做了一些限制以保证内存安全

+

限制一

在特定作用域内,对某一块数据只能有一个可变引用,以避免产生数据竞争 。比如下面的代码在编译时就会报错 +
1
2
3
4
5
6
fn main() {
let mut s = "hello".to_string();
let s1 = &mut s;
let s2 = &mut s;
println!("s1: {} s2: {}", s1, s2);
}
+

可能发生数据竞争的三种行为:

+
    +
  1. 多个指针同时访问同一个数据
  2. +
  3. 至少有一个指针用于写入数据
  4. +
  5. 没有使用任何机制同步对数据的访问行为
  6. +
+
+对于以上的限制,我们其实可以通过采用划分作用域的方法达到非同时创建多个可变引用的目的 ,比如以下的例子 +
1
2
3
4
5
6
7
8
9
10
fn main() {
let mut s = "hello".to_string();
{
let s1 = &mut s;
s1.push_str(",world");
}
let s2 = &mut s;
s2.push_str("!");
println!("{}", s);
}
+

限制二

对一个数据可以同时存在多个不可变引用,但不能同时存在可变引用与不可变引用 ,因为这会导致不可变引用的作用失效 +
1
2
3
4
5
6
7
8
fn main() {
let mut s = "hello".to_string();
let s1 = &s;
// 此处会发生错误,因为同时存在对变量s的不可变引用和可变引用
let s2 =&mut s;

println!("{} {}", s1, s2)
}
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/u74pp23h.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/xpyovm89.html b/posts/xpyovm89.html new file mode 100644 index 000000000..bdfb9aeed --- /dev/null +++ b/posts/xpyovm89.html @@ -0,0 +1,211 @@ +Rust学习笔记:迭代器 | 无眠呓语

Rust学习笔记:迭代器

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

前言

和Python类似,Rust中的迭代器也是惰性的,即在调用消费迭代器的方法之前,迭代器本身没有任何效果,迭代器不会一次性计算和生成所有元素,而是在需要时逐个生成元素

+
1
2
3
4
5
6
7
fn main() {
let v = vec![1, 2, 3];
let v_iter = v.iter();
for ele in v_iter { // 注意:这里的变量"ele"的类型是&i32
println!("{}", ele);
}
}
+

Iterator trait

在Rust中,所有迭代器都需要实现Iterator trait,且因为Iterator trait中所包含的一些默认方法会调用到next()方法,故在Rust中要求实现这个trait时必须实现next()方法,Iterator trait的定义大致如下所示

+
1
2
3
4
5
6
pub trait Iterator {
// 关联类型
type Item;
// Iterator trait仅要求实现next()方法
fn next(&mut self) -> Option<Self::item>;
}
+

next()方法的主要作用是当每次调用迭代器的next()方法时,将迭代器中的一项包装在Some()里并返回,当迭代结束时返回None

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let v = vec![1, 2, 3];
let mut v_iter = v.iter(); // 注意: v_iter是可变的

let _a = v_iter.next(); // 变量"_a"的类型为Option<&i32>

println!("{:?}", v_iter.next());
println!("{:?}", v_iter.next());
println!("{:?}", v_iter.next()); // 最后打印的结果是None
}
+

需要注意的是,变量”v_iter”是mutable的,因为在用户在调用迭代器的next()方法时相当于改变迭代器中的记录位置序列的状态,可以理解成每一次调用next()方法时都消耗了迭代器中一个元素

+

迭代器中元素的所有权

iter()方法

在使用iter()方法时会返回一个不可变引用的迭代器,只允许对每个元素进行只读的操作,但不允许修改原始数据,通常可以用在可迭代的不可变引用类型,例如&[T]这样的类型

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 变量number的类型是&i32,是迭代器内元素的不可变引用
for number in numbers.iter() {
println!("Read Only: {}", number);
}

println!("{:?}", numbers);
}
+

注意:通过iter方法获得的是迭代器中元素的不可变引用而不是迭代器的不可变引用

+

into_iter()方法

在使用into_iter()方法时返回一个拥有所有权的迭代器,允许对每个元素进行拥有所有权的操作,即可以进行移动语义的操作,迭代后原始数据无法再使用,通常用于可迭代的拥有所有权的类型,例如Vec<T>

+
1
2
3
4
5
6
7
8
9
10
11
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 变量number的类型是i32,其拥有迭代器内元素的所有权
for number in numbers.into_iter() {
println!("Owned: {}", number);
}

// 此处会出现错误,因为numbers的所有权已被转移
println!("{:?}", numbers);
}
+

和iter()一样,into_iter()方法获得的也是迭代器内部元素的所有权而不是迭代器的所有权

+

iter_mut()方法

在使用iter_mut()方法时返回一个可变引用的迭代器,允许对每个元素进行读写操作,可以修改原始数据,适用于可迭代的可变引用类型,例如&mut [T]

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5]; // 变量numbers是可变的Vector

// 变量number的类型是&mut i32,是迭代器内元素的可变引用
for number in numbers.iter_mut() {
*number = *number + 1; // 修改原始数据
}

println!("{:?}", numbers);
}
+

产生迭代器方法(迭代器适配器)

enumerate()方法

enumerate()方法用于同时迭代集合中的元素和它们的索引,其返回一个产生元素和索引元组的迭代器

+
1
2
3
4
5
6
7
fn main() {
let fruits = vec!["apple", "banana", "cherry"];

for (index, fruit) in fruits.iter().enumerate() {
println!("Index: {}, Fruit: {}", index, fruit);
}
}
+

map()方法

map()方法用于将一个迭代器中的每个元素映射为另一个元素,然后返回一个产生映射结果的新迭代器,可以对集合中的每个元素应用某个函数,并在新迭代器中获取映射后的值

+
1
2
3
4
5
6
7
8
9
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 使用map()将每个数字平方
let squared_numbers: Vec<i32> = numbers.iter().map(|&x| x * x).collect();

println!("Original Numbers: {:?}", numbers);
println!("Squared Numbers: {:?}", squared_numbers);
}
+

zip()方法

zip()方法用于将两个迭代器逐对地组合,然后返回一个新的、产生元组的迭代器,其中第一个元素来自第一个迭代器,第二个元素来自第二个迭代器。可以理解成zip()将两个迭代器压缩在了一起,最后形成的元组的数量取决于两个迭代器中数量少的那个

+
1
2
3
4
5
6
7
8
9
10
11
fn main() {
let names = vec!["Alice", "Bob", "Charlie", "June"]; // 两个Vector内元素数量不一致
let ages = vec![25, 30, 22];

// 使用zip()将姓名和年龄逐对组合
let combined: Vec<(&&str, &i32)> = names.iter().zip(ages.iter()).collect();

for (name, age) in combined {
println!("Name: {}, Age: {}", name, age);
}
}
+

fliter()方法

filter()方法用于根据特定条件过滤出符合条件的元素生成一个新的迭代器

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let numbers = vec![3, 8, 1, 6, 4, 9, 2, 7, 5];
let limit = 6;

// 使用filter()方法筛选出大于等于6的元素
let filtered_numbers: Vec<i32> = numbers.iter().cloned().filter(|&x| x >= limit).collect(); // 这里使用闭包捕获了环境

println!("Original Numbers: {:?}", numbers);
println!("Filtered Numbers: {:?}", filtered_numbers);
}
+

除以上方法外,Rust中还有flat_map()、cycle()、take()、skip()、chain()、rev()等迭代器适配器,这里就不一一举例了

+

消耗迭代器方法(消耗型适配器)

collect()方法

collect()方法用于从一个迭代器中收集元素并创建一个集合,如数组、向量、哈希映射等,比如下面这个创建HashMap的例子

+
1
2
3
4
5
6
7
8
9
10
11
use std::collections::HashMap;

fn main() {
let person_data = vec![("Alice", 25), ("Bob", 30), ("Charlie", 22)];

// 使用collect()方法将键值对收集到一个新的HashMap中
let person_map: HashMap<_, _> = person_data.into_iter().collect();

println!("{:?}", person_map);
}

+

也可以配合使用zip()方法一起使用

+
1
2
3
4
5
6
7
8
9
10
use std::collections::HashMap;

fn main() {
let keys = vec!["Alice", "Bob", "Charlie"];
let values = vec![25, 30, 22, 27]; // 此处两个Vector内元素数量不一致

let map: HashMap<_, _> = keys.iter().zip(values.iter()).collect();

println!("{:?}", map);
}
+

一般情况下,在使用collect()方法时需要明确指定要收集的元素类型以及要返回的集合类型,如果不明确指定类型,编译器可能无法推断出正确的类型,导致编译错误

+
+

sum()方法

sum()方法会取得迭代器的所有权,其主要的原理是反复调用迭代器的next()方法,将当前元素累加到总和,最后耗尽迭代器,并返回总和

+
1
2
3
4
5
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let total: i32 = numbers.iter().sum();
println!("total: {}", total);
}
+

和迭代器适配器一样,Rust中还有min()、max()、nth()、last()、product()、fold()等消耗型适配器,这里也不展开了

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/xpyovm89.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/zn4ra72x.html b/posts/zn4ra72x.html new file mode 100644 index 000000000..f44636cb2 --- /dev/null +++ b/posts/zn4ra72x.html @@ -0,0 +1,247 @@ +使用Rust为Python编写模块 | 无眠呓语

使用Rust为Python编写模块

我在之前的博客中分享了使用Python调用C语言动态链接库的相关内容,在开发中我们也可以很方便地使用maturin配合pyo3为Python开发可调用的Rust模块来加速Python程序,这篇博客就来分享一下入门的用法

+
+

环境配置

maturin安装

关于Rust环境的配置这里就不多介绍了,具体可以参考之前的博客,这里介绍一下maturin的安装,具体命令如下

+
1
pip install maturin
+

环境初始化

maturin安装完成后,可以使用以下的命令进行Rust环境的初始化

+
1
2
# 初始化编译环境命令
maturin new sum
+

运行完成后可以看见当前目录下新增了sum目录,这就是我们的项目目录

+

实例:编写Rust下的累加函数

编辑lib.rs文件

1
2
cd sum
vi src/lib.rs
+

Rust代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use pyo3::prelude::*;

#[pyfunction]
fn add_up_u128(x: u128) -> PyResult<u128> {
let mut sum = 0;
let mut i = 0;

while i <= x {
sum += i;
i += 1;
}
Ok(sum)
}

#[pymodule]
fn sum(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add_up_u128, m)?)?;
Ok(())
}
+

编译、安装模块

使用maturin时有两种方式安装Python模块

+

直接编译、安装

模块代码编写完成之后,直接在项目目录下运行

+
1
2
3
4
# 编译项目
maturin build --release
# 安装模块(注意:此处需根据具体whl文件名称确定安装文件)
pip install target/wheels/sum-0.1.0-cp39-cp39-manylinux_2_34_x86_64.whl
+

注意:修改Rust模块代码导致需要重新安装模块时,可能需要添加--force-reinstall参数

+

使用Python虚拟环境安装

1
2
3
4
5
6
# 创建Python虚拟环境
python -m venv virtualenv
# 运行虚拟环境
source virtualenv/bin/activate
# 安装模块(项目目录运行)
maturin develop --release
+

注意:使用这种方法安装模块,之后想调用该模块时都需要先运行已安装模块的虚拟环境

+

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import sum

def num_add_up(x: int) -> None:
start = time.time()
result: int = sum.add_up_u128(x)
print(result)
print(time.time()-start)

if __name__ == "__main__":
num_add_up(100000000)

输出:
5000000050000000
0.08351874351501465
+

数据类型映射关系

和ctypes类似,使用Rust模块时也需要进行数据类型的映射,以下是一些Rust和Python的基础数据类型对应关系

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Rust 类型Python 类型
i32int
i64int
i128int
f32float
f64float
boolbool
stringstr
Vec<T>list
[T; N]list
(T1, T2, …)tuple
HashMap<K, V>dict
+

除以上数据类型外,还有其他如struct类型Result类型Option类型等,这些就不一一列出了

+

小结

其实从上面的运行结果可以看出,使用Rust编写的模块在速度上较C语言稍慢,但Rust在内存安全和数据类型支持上比C语言更好,比如读者可以将累加的数据设置为10000000000再运行一下查看结果。同时,也可以看出Rust模块在编写和调用时也更加简单

+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/zn4ra72x.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/posts/zr161ci0.html b/posts/zr161ci0.html new file mode 100644 index 000000000..33dae8e49 --- /dev/null +++ b/posts/zr161ci0.html @@ -0,0 +1,190 @@ +Rust学习笔记:泛型 | 无眠呓语

Rust学习笔记:泛型

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

+
+

泛型的作用主要体现在提高代码的复用能力。在官方文档中,泛型被定义为具体类型或其他属性的抽象代替,在实际使用时可以将泛型理解为一种模板占位符,编译器会在编译时 执行单态化(monomorphization)操作,即将泛型类型替换为具体的类型

+

在结构体中使用泛型

在结构体中使用泛型一般存在两种情况,其一为定义结构体时,其二为在方法定义时

+

在定义中使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 注意:这里的泛型类型要求x和y的类型必须一致
struct Point<T> {
x: T,
y: T,
}

fn main() {
let rec = Point { x: 12.5, y: 9.2 };

let squ = Point { x: 9, y: 9 };

println!("x: {}, y: {}", rec.x, rec.y);
println!("x: {}, y: {}", squ.x, squ.y);
}
+

在方法中使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 注意:这里的泛型类型要求x和y的类型可以不一致,也可以一致
struct Point<T, U> {
x: T,
y: U,
}

// 此处意思为针对泛型类型T和U实现的方法而不是针对某特定类型实现方法,即所有类型都可以调用该方法
impl<T, U> Point<T, U> {
fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
Point {
x: self.x,
y: other.y,
}
}
}

// 此处意思为仅针对数据类型为i32时实现方法,当结构体中字段为非i32类型时无法调用该方法
impl Point<i32, i32> {
fn mix_i32(self, other: Point<i32, i32>) -> Point<i32, i32> {
Point {
x: self.x,
y: other.y,
}
}
}

fn main() {
let p1 = Point { x: 5, y: 10.4 };
let p2 = Point { x: "Hello", y: 'c'};

let p3 = p1.mixup(p2);
println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
}
+

同时,由上面的例子可注意到在结构体中的泛型类型参数可以和方法的泛型类型参数不同

+

在枚举中使用泛型

在枚举中使用泛型和结构体类似,一般用在使枚举的变体持有泛型数据类型。比如Option枚举和Result枚举

1
2
3
4
5
6
7
8
9
10
11
// Option枚举
enum Option<T> {
Some(T),
None,
}

// Result枚举
enum Result<T, E> {
Ok(T),
Err(E),
}

+

在函数中使用泛型

以下是一个最简单的在函数中使用泛型的例子,但在实际项目中,我们通常需要对泛型进行限制以保证函数得到的参数能满足后续相关的功能要求 ,这时需要使用Trait对泛型参数进行约束

+
1
2
3
4
5
6
7
8
9
10
fn main() {
let a = 1;
let b = 2.0;
println!("{}", back(a));
println!("{}", back(b));
}

fn back<T>(item: T) -> T {
item
}
+

泛型的Trait约束

在Trait部分我们说,可以通过Trait对传入或返回参数的类型进行约束。在使用泛型类型参数时可以配合Trait使用,以实现对传入参数的类型进行约束

+

简单情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

trait_param(&rec);
}

// 类型T必须实现Shape trait和Debug trait
fn trait_param<T: Shape + Debug>(item: &T) {
println!("{:?}", item);
println!("{}", item.area());
}
+

使用where关键字

在上面的例子中,我们实现了对函数传入参数进行约束。但在实际项目中,泛型参数或Trait约束较多会造成代码不易阅读,我们可以使用where关键字来使代码更加直观。上面例子其实可以看做使用where关键字的语法糖

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

#[derive(Debug)]
struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

let cir = Circle { radius: 11.0 };

trait_param(&rec, &cir);
}

fn trait_param<T, U>(rec: &T, cir: &U)
// 使用where对多个泛型参数设置多个Trait约束
where
// 类型T必须实现Shape trait
T: Shape,
// 类型U必须实现Shape trait和Debug trait
U: Shape + Debug,
{
println!("{}", rec.area());
println!("{:?}", cir);
}
+
文章作者: 无眠呓语
文章链接: https://luoxiaolinn.fun/posts/zr161ci0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无眠呓语
\ No newline at end of file diff --git a/search.xml b/search.xml new file mode 100644 index 000000000..07b77ff28 --- /dev/null +++ b/search.xml @@ -0,0 +1,663 @@ + + + + + + + Rust学习笔记:函数作为参数 + + /posts/i5v2u2.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

在之前闭包的文章中,我们可以知道,在Rust中函数也可以像在Python、Nodejs一样作为参数传入到另一个函数中,具体使用时主要有两种方法来实现

闭包作为参数

在之前的文章中讲到闭包对捕获的变量所有权有三种特性:FnFnMutFnOnce,其分别表示了闭包在捕获环境时的不同方式。

Fn闭包作为参数

Fn:闭包通过不可变借用捕获环境中的变量,可以在多次调用中复用,不会改变捕获的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 定义一个函数,接受一个实现了 Fn 特性的闭包作为参数
fn apply_fn<F>(f: F, value: i32) -> i32
where
F: Fn(i32) -> i32,
{
f(value)
}

fn main() {
// 使用一个简单的闭包,返回输入的两倍
let result1 = apply_fn(|x| x * 2, 5);
println!("Result1: {}", result1); // 输出 Result1: 10

// 使用闭包捕获环境,但不改变环境变量的值
let offset = 3;
// 使用一个闭包,返回输入加上捕获的环境变量
let result2 = apply_fn(|x| x + offset, 5);
println!("Result2: {}", result2); // 输出 Result2: 8
println!("factor: {}", factor); // factor的值没有改变
}

FnMut闭包作为参数

FnMut:闭包通过可变借用捕获环境中的变量,可以修改捕获的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn apply_fn_mut<F>(mut f: F, value: i32) -> i32
where
F: FnMut(i32) -> i32,
{
f(value)
}

fn main() {
// 使用 FnMut 闭包
let mut factor = 2;
let result1 = apply_fn_mut(
|x| {
factor *= 2;
x * factor
},
5,
);
println!("Result1 (FnMut): {}", result1); // 输出 Result1 (FnMut): 20
println!("factor: {}", factor); // 输出:factor: 4
}

运行上面的代码可以发现,变量factor的值发生了改变

FnOnce闭包作为参数

FnOnce:闭包通过值捕获环境中的变量,消耗捕获的变量,这种闭包只能调用一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fn apply_fn_once<F>(f: F, value: i32) -> i32
where
F: FnOnce(i32) -> i32,
{
f(value)
}

fn main() {
// 变量factor是一个String类型,是一个非Copy类型
let factor = String::from("2");
// 使用move关键字强制按值捕获
let result2 = apply_fn_once(move |x| x * factor.parse::<i32>().unwrap(), 5);
println!("Result2 (FnOnce): {}", result2);
// 下面这行会编译错误,因为factor的所有权已经被移动
println!("{}", factor);
}

函数指针作为参数

通过以上的例子可以看出,使用闭包在非常方便的将函数作为参数传入到其他函数中(闭包也是一种函数),但使用闭包不容易编写逻辑性较为复杂的代码,否则可能会造成代码难以阅读,这时我们可以使用函数指针

函数指针作为参数

下面是一个最简单的函数指针作为参数的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
// apply函数接受一个函数指针f和一个整数x作为参数
fn apply(f: fn(i32) -> i32, x: i32) -> i32 {
f(x)
}

fn double(x: i32) -> i32 {
x * 2
}

fn main() {
let result = apply(double, 5);
println!("Result: {}", result); // 输出: Result: 10
}

多个函数指针参数

1
2
3
4
5
6
7
8
9
10
11
fn process(input: i32, f1: fn(i32) -> i32, f2: fn(i32) -> i32) -> i32 {
f2(f1(input))
}

fn double(x: i32) -> i32 { x * 2 }
fn square(x: i32) -> i32 { x * x }

fn main() {
let result = process(3, double, square);
println!("Result: {}", result); // 输出: Result: 36
}

函数指针作为返回值

1
2
3
4
5
6
7
8
9
10
11
12
fn get_operation(op: &str) -> fn(i32, i32) -> i32 {
match op {
"add" => |x, y| x + y,
"multiply" => |x, y| x * y,
_ => |x, _| x,
}
}

fn main() {
let add_op = get_operation("add");
println!("Result: {}", add_op(5, 3)); // 输出: Result: 8
}

特征对象

结合之前Box<T>智能指针,可以更灵活的使用函数指针,比如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
let functions: Vec<Box<dyn Fn(i32) -> i32>> = vec![
// vector中的数据类型必须一致且大小需要在编译中确定
// 这里使用指针类型保证编译时类型和大小一致
Box::new(|x| x + 1),
Box::new(|x| x * 2),
Box::new(|x| x * x),
];

for f in functions.iter() {
println!("Result: {}", f(5));
}
}

以上只是一个非常基础的举例,事实上还有很多巧妙的用法,这里就不赘述了

总结

使用函数作为参数可以使程序更灵活、强大,可以提高代码的复用性和灵活性和实现回调机制等等优点,但在使用中也需要结合特定的场景来选择。比如需要考虑环境变量时,可能使用闭包更好用,但需要实现较为复杂的函数功能时,可能函数指针更加的方便,具体需要根据我们在实际编程中的使用场景来确定

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:错误处理 + + /posts/a7bp87o2.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

错误处理

Rust中的错误处理不同于Python或者Java中常见的try···except···模式,Rust将错误分为两大类:可恢复错误(recoverable)不可恢复错误(unrecoverable),对于可恢复错误,在编写代码时可以使用Result枚举或者Option枚举来打包,可以更好地实现后续的错误处理逻辑

Result枚举

在Rust中,Result枚举是处理可能产生错误操作的非常好用的工具,其在标准库中的定义可以看做

1
2
3
4
enum Result<T, E> {
Ok(T), // Ok(T):表示操作成功,并且包含一个类型为T的值
Err(E), // Err(E):表示操作失败,并且包含一个类型为E的错误值
}

在我们编写代码的时候,一般就可以这样来使用

1
2
3
4
5
6
fn file_to_read() -> Result<String, io::Error> {  // 注意这里返回值的类型是Result枚举类型
let mut f = File::open("hello.txt")?; // 这里使用了'?'进行错误传递
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}

如果结合之前文章里的Trait对象的话可以实现更加通用的效果

1
2
3
4
5
6
7
fn file_to_read() -> Result<String, Box<dyn std::error::Error>> {  
// 这里返回值使用Trait对象让函数返回实现'Error'Trait的类型
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}

is_ok()、is_err()方法

is_ok()is_err()方法主要是用来判断Result的类型值是否有效或存在错误,用法也很简单:
(1)is_ok()是在Result是Ok时返回true,Err则返回false
(2)is_err()是在Result是Ok时返回false,Ok则返回true

1
2
3
4
5
6
fn main() {
let res: Result<i32, &str> = Ok(5);
if res.is_ok() {
println!("Result is Ok");
}
}

ok()、err()方法

ok()err()方法主要是用来将Result枚举转换为Option枚举,它们的用法如下:
(1)ok()Result<T, E>转换为Option<T>,如果是Err则返回None
(2)err()Result<T, E>转换为Option<E>,如果是Ok则返回None

1
2
3
4
fn main() {
let res: Result<i32, &str> = Ok(5);
let opt = res.ok(); // opt is Some(5)
}
1
2
3
4
fn main() {
let res: Result<i32, &str> = Err("hello");
let opt = res.err(); // opt is Some("hello")
}

Option枚举

和Result枚举类似,Option枚举也是一个相当重要的工具,但它主要是为了解决NULL指针这种容易引起错误的操作,Option枚举在标准库的定义如下

1
2
3
4
enum Option<T> {
None,
Some(T),
}

当使用Option枚举作为返回值时,函数调用者就必须处理返回值为None这种情况,从而实现让程序更稳定的目的

is_some()、is_none()方法

和Result枚举类似,Option枚举的is_some()is_none()也是用来判断值是否有效或为None,即:
(1)is_some()是在Option为Some时返回true,否则返回false
(2)is_none()是在Option为Some时返回false,否则返回true

1
2
3
4
5
6
fn main() {
let opt = Some(5);
if opt.is_some() {
println!("Option has a value");
}
}

直接处理

除了以上介绍方法外,这两个枚举还有一些通用的方法

unwrap()方法

unwrap()方法在Rust中主要用来从Result或Option类型中提取值
(1)如果调用unwrap()时类型是Ok或Some,程序会直接进行提取
(2)如果调用unwrap()时类型是Err或None,程序则会panic并终止运行

1
2
3
4
5
6
7
8
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap();
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap(); // 这里会 panic
}
1
2
3
4
5
6
7
8
fn main() {
let some_value = Some(10);
let value = some_value.unwrap();
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap(); // 这里会 panic
}

unwrap_or()方法

unwrap_or()方法在Rust中用于处理Option和Result类型,提供一个默认值以防返回值为None或Err

1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 0
}
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or(0);
println!("The value is: {}", value); // 输出: The value is: 0
}

unwrap_or_else()方法

unwrap_or_else()方法类似于unwrap_or(),但其接受一个闭包作为参数,当需要默认值时才会调用该闭包,对于计算开销较大的默认值、需要执行一些逻辑才能获得默认值或者需要对err进行处理时的情况非常有用,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or_else(|err| {
println!("Encountered an error: {}", err);
0
});
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or_else(|err| {
println!("Encountered an error: {}", err);
0
});
println!("The value is: {}", value); // 输出: The value is: 0
}
1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or_else(|| 0);
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or_else(|| 0);
println!("The value is: {}", value); // 输出: The value is: 0
}

而且,因为unwrap_or_else()是接受闭包作为参数的,这样就可以很方便的捕获环境值,具体怎么使用闭包可以参考之前的文章

unwrap_or_default()方法

unwrap_or_default()方法在Rust中主要用来处理Option和Result类型的值为None或Err时,返回类型的默认值,默认值则由Defaulttrait提供

1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let value = some_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 0
}
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.unwrap_or_default();
println!("The value is: {}", value); // 输出: The value is: 0
}

我们也可以为自定义的类型实现Defaulttrait,使其能调用unwrap_or_default()方法,比如下面这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#[derive(Debug)]
struct MyStruct {
value: i32,
}

impl Default for MyStruct {
fn default() -> Self {
MyStruct { value: 42 }
}
}

fn main() {
let some_value: Option<MyStruct> = Some(MyStruct { value: 10 });
let value = some_value.unwrap_or_default();
println!("The value is: {:?}", value); // 输出: The value is: MyStruct { value: 10 }

let none_value: Option<MyStruct> = None;
let value = none_value.unwrap_or_default();
println!("The value is: {:?}", value); // 输出: The value is: MyStruct { value: 42 }
}

expect()方法

expect()方法和unwrap()方法类似,都是用于从Result或Option类型中提取值,但相比于unwrap(),expect()允许你提供更具描述性的错误信息,以便更容易调试和定位问题

1
2
3
4
5
6
7
8
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let value = ok_value.expect("Expected Ok, but got Err");
println!("The value is: {}", value); // 输出: The value is: 10

let err_value: Result<i32, &str> = Err("An error occurred");
let value = err_value.expect("Expected Ok, but got Err"); // 这里会 panic,并显示 "Expected Ok, but got Err: An error occurred"
}
1
2
3
4
5
6
7
8
fn main() {
let some_value = Some(10);
let value = some_value.expect("Expected a value, but got None");
println!("The value is: {}", value); // 输出: The value is: 10

let none_value: Option<i32> = None;
let value = none_value.expect("Expected a value, but got None"); // 这里会 panic,并显示 "Expected a value, but got None"
}

map()方法

map()方法用于对Option或Result类型中的值应用一个函数,并返回一个新的Option或Result,通常用于在不改变原始类型的情况下处理值

1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let new_value = some_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Some(20)

let none_value: Option<i32> = None;
let new_value = none_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: None
}
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(20)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.map(|x| x * 2);
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("An error occurred")
}

对于Result类型,还提供了map_err()方法以适用发生错误的场景

1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.map_err(|e| format!("Error: {}", e));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(10)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.map_err(|e| format!("Error: {}", e));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("Error: An error occurred")
}

and_then()方法

and_then()方法在Rust中用于在Option或Result类型中链式处理值。其作用与map()方法类似,但不同之处在于and_then()期望闭包返回一个新的Option或Result,从而使得链式处理更灵活

1
2
3
4
5
6
7
8
9
fn main() {
let some_value = Some(10);
let new_value = some_value.and_then(|x| Some(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Some(20)

let none_value: Option<i32> = None;
let new_value = none_value.and_then(|x| Some(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: None
}
1
2
3
4
5
6
7
8
9
fn main() {
let ok_value: Result<i32, &str> = Ok(10);
let new_value = ok_value.and_then(|x| Ok(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Ok(20)

let err_value: Result<i32, &str> = Err("An error occurred");
let new_value = err_value.and_then(|x| Ok(x * 2));
println!("The new value is: {:?}", new_value); // 输出: The new value is: Err("An error occurred")
}

其实在生产环境中,应该避免直接使用unwrap()或expect(),因为其会在发生错误时导致程序崩溃,除非错误是可预见的或期望发生的,否则应该更多使用类似unwrap_or()、unwrap_or_else()这类方法

模式匹配

如上所述,我们在生产环境中应当避免直接使用一些会导致程序奔溃的方法,而当同时需要针对错误的类型实现更加复杂的处理逻辑时,上面的直接处理方法可能就存在一定局限,这时候我们也可以使用模式匹配来细分各种错误的类型进行分别处理,比如下面这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::fs::File;
use std::io::{self, Read};

fn read_file_content(file_path: &str) -> Result<String, io::Error> {
let mut file = File::open(file_path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn main() {
// 使用模式匹配对不同情况进行处理
match read_file_content("example.txt") {
Ok(content) => println!("File content: {}", content),
Err(e) => println!("Failed to read file: {}", e),
}
}

错误传递

在本文最开始的示例代码中,我们使用到了?操作符进行函数间错误的传递,在Rust中,?操作符主要用于简化错误处理和传递,即当一个函数返回Result或Option类型时,可以使用?操作符来自动处理错误或无值的情况,并将它们传递给函数调用者来进行后续处理

‘?’操作符的工作原理

(1)对于Result类型:如果表达式返回Ok,则?操作符将其解包并返回其中的值;如果返回Err,则?操作符会将Err提前返回,结束当前函数的执行
(2)对于Option类型:如果表达式返回Some,则?操作符将其解包并返回其中的值;如果返回None,则?操作符会将None提前返回,结束当前函数的执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::fs::File;
use std::io::{self, Read};

fn read_file_content(file_path: &str) -> Result<String, io::Error> {
let mut file = File::open(file_path)?; // 使用'?'进行错误处理和传递
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn main() -> Result<(), io::Error> {
let content = read_file_content("example.txt")?;
println!("File content: {}", content);
Ok(())
}

在以上示例中可以看出,?操作符大大简化了错误处理

‘?’操作符的注意事项

返回类型必须是Result或Option

使用?操作符的函数必须返回Result或Option类型,如果尝试在返回类型不是Result或Option的函数中使用,编译器就会报错,比如下面的例子

1
2
3
4
5
6
fn invalid_use_of_question_mark(file_path: &str) -> String {
let mut file = std::fs::File::open(file_path)?; // 此处会发生编译错误,因为函数返回类型为String
let mut content = String::new();
file.read_to_string(&mut content)?;
content
}

错误类型的转换

使用?操作符时,函数的错误类型必须与调用链中的错误类型一致,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::io;

fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError> {
let num: i32 = s.trim().parse()?;
Ok(num)
}

fn main() -> Result<(), io::Error> {
let s = "195";
// 下面的代码会发生错误,因为parse_number函数传递的是std::num::ParseIntError错误
// 而main函数可能返回的是io::Error错误
let number = parse_number(&s)?;
println!("Parsed number: {}", number);
Ok(())
}

如果不一致,但是又确有这样的需求时,就需要通过Fromtrait或显式的错误转换来解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use std::fs::File;
use std::io::{self, Read};

#[allow(dead_code)]
#[derive(Debug)]
enum MyError {
Io(io::Error),
Parse(std::num::ParseIntError),
}

impl From<io::Error> for MyError {
fn from(err: io::Error) -> MyError {
MyError::Io(err)
}
}

impl From<std::num::ParseIntError> for MyError {
fn from(err: std::num::ParseIntError) -> MyError {
MyError::Parse(err)
}
}

fn read_file_content(file_path: &str) -> Result<String, MyError> {
let mut file = File::open(file_path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}

fn parse_number(s: &str) -> Result<i32, MyError> {
let num: i32 = s.trim().parse()?;
Ok(num)
}

fn main() -> Result<(), MyError> {
let content = read_file_content("example.txt")?;
let number = parse_number(&content)?;
println!("Parsed number: {}", number);
Ok(())
}

不要滥用’?’

虽然?操作符非常方便,但也不应滥用,在某些情况下,明确处理错误可能更合适

确保错误传递的合理性

当使用?操作符传递错误时,应确保错误处理的设计合理,某些错误可能需要立即处理,而不是传递

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + 使用Podman构建Rust项目 + + /posts/l4j4c8hb.html + + 编写Rust程序

gPwEvx!CM{jG~Fq7zcOmC&50~0Ng)V`U~*P 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 literal 0 HcmV?d00001 diff --git a/img/favicon.png b/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e1f888c79aea144bcff664adcc76ca48b52060 GIT binary patch literal 8732 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 Hw~qcF)LE)e literal 0 HcmV?d00001 diff --git a/img/friend_404.gif b/img/friend_404.gif new file mode 100644 index 0000000000000000000000000000000000000000..91dd56a289327b6d869daa157912ee1f94eeec67 GIT binary patch literal 65097 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 000000000..14b2ef62a --- /dev/null +++ b/index.html @@ -0,0 +1,205 @@ +无眠呓语 - 你好,世界...

hhtE7^fUCF>F00#`zsEi9N(|8cnqX^0Gru?|XD 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

1
2
3
4
# 创建Cargo项目
cargo new hello
# 编辑main.rs文件
vi /hello/src/main.rs

拉取所需Rust版本的镜像

DockerHub项目地址:https://hub.docker.com/_/rust/tags

1
2
# 拉取所需版本的Rust镜像
podman pull rust:1.74.1

使用容器构建Rust程序

1
2
3
4
5
6
7
8
9
10
11
# 进入Rust项目目录
cd hello/
# 进入Podman容器
podman run -it --privileged=true --rm -v .:/app rust:1.74.1 /bin/bash
# 构建项目
cd app/
cargo build
# 退出容器
exit
# 在宿主机运行二进制程序
./target/debug/hello # 此处仅为示例,具体文件名应根据项目进行填写

在使用容器构建Rust项目时应注意容器中的libc和其他运行库的版本和宿主机环境是否兼容,否则编译出的二进制文件可能无法正常运行

]]> + + + + + 技术 + + + + + + + 环境配置 + + 备忘 + + Rust + + Podman + + + + + + + + + 使用Rust为Python编写模块 + + /posts/zn4ra72x.html + +

我在之前的博客中分享了使用Python调用C语言动态链接库的相关内容,在开发中我们也可以很方便地使用maturin配合pyo3为Python开发可调用的Rust模块来加速Python程序,这篇博客就来分享一下入门的用法

环境配置

maturin安装

关于Rust环境的配置这里就不多介绍了,具体可以参考之前的博客,这里介绍一下maturin的安装,具体命令如下

1
pip install maturin

环境初始化

maturin安装完成后,可以使用以下的命令进行Rust环境的初始化

1
2
# 初始化编译环境命令
maturin new sum

运行完成后可以看见当前目录下新增了sum目录,这就是我们的项目目录

实例:编写Rust下的累加函数

编辑lib.rs文件

1
2
cd sum
vi src/lib.rs

Rust代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use pyo3::prelude::*;

#[pyfunction]
fn add_up_u128(x: u128) -> PyResult<u128> {
let mut sum = 0;
let mut i = 0;

while i <= x {
sum += i;
i += 1;
}
Ok(sum)
}

#[pymodule]
fn sum(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add_up_u128, m)?)?;
Ok(())
}

编译、安装模块

使用maturin时有两种方式安装Python模块

直接编译、安装

模块代码编写完成之后,直接在项目目录下运行

1
2
3
4
# 编译项目
maturin build --release
# 安装模块(注意:此处需根据具体whl文件名称确定安装文件)
pip install target/wheels/sum-0.1.0-cp39-cp39-manylinux_2_34_x86_64.whl

注意:修改Rust模块代码导致需要重新安装模块时,可能需要添加--force-reinstall参数

使用Python虚拟环境安装

1
2
3
4
5
6
# 创建Python虚拟环境
python -m venv virtualenv
# 运行虚拟环境
source virtualenv/bin/activate
# 安装模块(项目目录运行)
maturin develop --release

注意:使用这种方法安装模块,之后想调用该模块时都需要先运行已安装模块的虚拟环境

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import sum

def num_add_up(x: int) -> None:
start = time.time()
result: int = sum.add_up_u128(x)
print(result)
print(time.time()-start)

if __name__ == "__main__":
num_add_up(100000000)

输出:
5000000050000000
0.08351874351501465

数据类型映射关系

和ctypes类似,使用Rust模块时也需要进行数据类型的映射,以下是一些Rust和Python的基础数据类型对应关系

Rust 类型Python 类型
i32int
i64int
i128int
f32float
f64float
boolbool
stringstr
Vec<T>list
[T; N]list
(T1, T2, …)tuple
HashMap<K, V>dict

除以上数据类型外,还有其他如struct类型Result类型Option类型等,这些就不一一列出了

小结

其实从上面的运行结果可以看出,使用Rust编写的模块在速度上较C语言稍慢,但Rust在内存安全和数据类型支持上比C语言更好,比如读者可以将累加的数据设置为10000000000再运行一下查看结果。同时,也可以看出Rust模块在编写和调用时也更加简单

]]>
+ + + + + 技术 + + + + + + + Python + + Rust + + + +
+ + + + + Rust学习笔记:迭代器 + + /posts/xpyovm89.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

前言

和Python类似,Rust中的迭代器也是惰性的,即在调用消费迭代器的方法之前,迭代器本身没有任何效果,迭代器不会一次性计算和生成所有元素,而是在需要时逐个生成元素

1
2
3
4
5
6
7
fn main() {
let v = vec![1, 2, 3];
let v_iter = v.iter();
for ele in v_iter { // 注意:这里的变量"ele"的类型是&i32
println!("{}", ele);
}
}

Iterator trait

在Rust中,所有迭代器都需要实现Iterator trait,且因为Iterator trait中所包含的一些默认方法会调用到next()方法,故在Rust中要求实现这个trait时必须实现next()方法,Iterator trait的定义大致如下所示

1
2
3
4
5
6
pub trait Iterator {
// 关联类型
type Item;
// Iterator trait仅要求实现next()方法
fn next(&mut self) -> Option<Self::item>;
}

next()方法的主要作用是当每次调用迭代器的next()方法时,将迭代器中的一项包装在Some()里并返回,当迭代结束时返回None

1
2
3
4
5
6
7
8
9
10
fn main() {
let v = vec![1, 2, 3];
let mut v_iter = v.iter(); // 注意: v_iter是可变的

let _a = v_iter.next(); // 变量"_a"的类型为Option<&i32>

println!("{:?}", v_iter.next());
println!("{:?}", v_iter.next());
println!("{:?}", v_iter.next()); // 最后打印的结果是None
}

需要注意的是,变量”v_iter”是mutable的,因为在用户在调用迭代器的next()方法时相当于改变迭代器中的记录位置序列的状态,可以理解成每一次调用next()方法时都消耗了迭代器中一个元素

迭代器中元素的所有权

iter()方法

在使用iter()方法时会返回一个不可变引用的迭代器,只允许对每个元素进行只读的操作,但不允许修改原始数据,通常可以用在可迭代的不可变引用类型,例如&[T]这样的类型

1
2
3
4
5
6
7
8
9
10
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 变量number的类型是&i32,是迭代器内元素的不可变引用
for number in numbers.iter() {
println!("Read Only: {}", number);
}

println!("{:?}", numbers);
}

注意:通过iter方法获得的是迭代器中元素的不可变引用而不是迭代器的不可变引用

into_iter()方法

在使用into_iter()方法时返回一个拥有所有权的迭代器,允许对每个元素进行拥有所有权的操作,即可以进行移动语义的操作,迭代后原始数据无法再使用,通常用于可迭代的拥有所有权的类型,例如Vec<T>

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 变量number的类型是i32,其拥有迭代器内元素的所有权
for number in numbers.into_iter() {
println!("Owned: {}", number);
}

// 此处会出现错误,因为numbers的所有权已被转移
println!("{:?}", numbers);
}

和iter()一样,into_iter()方法获得的也是迭代器内部元素的所有权而不是迭代器的所有权

iter_mut()方法

在使用iter_mut()方法时返回一个可变引用的迭代器,允许对每个元素进行读写操作,可以修改原始数据,适用于可迭代的可变引用类型,例如&mut [T]

1
2
3
4
5
6
7
8
9
10
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5]; // 变量numbers是可变的Vector

// 变量number的类型是&mut i32,是迭代器内元素的可变引用
for number in numbers.iter_mut() {
*number = *number + 1; // 修改原始数据
}

println!("{:?}", numbers);
}

产生迭代器方法(迭代器适配器)

enumerate()方法

enumerate()方法用于同时迭代集合中的元素和它们的索引,其返回一个产生元素和索引元组的迭代器

1
2
3
4
5
6
7
fn main() {
let fruits = vec!["apple", "banana", "cherry"];

for (index, fruit) in fruits.iter().enumerate() {
println!("Index: {}, Fruit: {}", index, fruit);
}
}

map()方法

map()方法用于将一个迭代器中的每个元素映射为另一个元素,然后返回一个产生映射结果的新迭代器,可以对集合中的每个元素应用某个函数,并在新迭代器中获取映射后的值

1
2
3
4
5
6
7
8
9
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// 使用map()将每个数字平方
let squared_numbers: Vec<i32> = numbers.iter().map(|&x| x * x).collect();

println!("Original Numbers: {:?}", numbers);
println!("Squared Numbers: {:?}", squared_numbers);
}

zip()方法

zip()方法用于将两个迭代器逐对地组合,然后返回一个新的、产生元组的迭代器,其中第一个元素来自第一个迭代器,第二个元素来自第二个迭代器。可以理解成zip()将两个迭代器压缩在了一起,最后形成的元组的数量取决于两个迭代器中数量少的那个

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let names = vec!["Alice", "Bob", "Charlie", "June"]; // 两个Vector内元素数量不一致
let ages = vec![25, 30, 22];

// 使用zip()将姓名和年龄逐对组合
let combined: Vec<(&&str, &i32)> = names.iter().zip(ages.iter()).collect();

for (name, age) in combined {
println!("Name: {}, Age: {}", name, age);
}
}

fliter()方法

filter()方法用于根据特定条件过滤出符合条件的元素生成一个新的迭代器

1
2
3
4
5
6
7
8
9
10
fn main() {
let numbers = vec![3, 8, 1, 6, 4, 9, 2, 7, 5];
let limit = 6;

// 使用filter()方法筛选出大于等于6的元素
let filtered_numbers: Vec<i32> = numbers.iter().cloned().filter(|&x| x >= limit).collect(); // 这里使用闭包捕获了环境

println!("Original Numbers: {:?}", numbers);
println!("Filtered Numbers: {:?}", filtered_numbers);
}

除以上方法外,Rust中还有flat_map()、cycle()、take()、skip()、chain()、rev()等迭代器适配器,这里就不一一举例了

消耗迭代器方法(消耗型适配器)

collect()方法

collect()方法用于从一个迭代器中收集元素并创建一个集合,如数组、向量、哈希映射等,比如下面这个创建HashMap的例子

1
2
3
4
5
6
7
8
9
10
11
use std::collections::HashMap;

fn main() {
let person_data = vec![("Alice", 25), ("Bob", 30), ("Charlie", 22)];

// 使用collect()方法将键值对收集到一个新的HashMap中
let person_map: HashMap<_, _> = person_data.into_iter().collect();

println!("{:?}", person_map);
}

也可以配合使用zip()方法一起使用

1
2
3
4
5
6
7
8
9
10
use std::collections::HashMap;

fn main() {
let keys = vec!["Alice", "Bob", "Charlie"];
let values = vec![25, 30, 22, 27]; // 此处两个Vector内元素数量不一致

let map: HashMap<_, _> = keys.iter().zip(values.iter()).collect();

println!("{:?}", map);
}

一般情况下,在使用collect()方法时需要明确指定要收集的元素类型以及要返回的集合类型,如果不明确指定类型,编译器可能无法推断出正确的类型,导致编译错误

sum()方法

sum()方法会取得迭代器的所有权,其主要的原理是反复调用迭代器的next()方法,将当前元素累加到总和,最后耗尽迭代器,并返回总和

1
2
3
4
5
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let total: i32 = numbers.iter().sum();
println!("total: {}", total);
}

和迭代器适配器一样,Rust中还有min()、max()、nth()、last()、product()、fold()等消耗型适配器,这里也不展开了

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:Trait对象 + + /posts/5cm2dmd2.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

静态分发(static dispatch)

Rust中的静态分发(static dispatch)主要靠泛型来完成,对于不同的泛型类型参数,编译器会执行单态化处理,即在编译阶段就确定好应该调用的函数 ,为每一个被泛型类型参数代替的具体类型生成不同版本的函数和方法,这部分可以查看泛型部分进行了解

单态化(monomorphization)

单态化(monomorphization):即Rust编译器将一个泛型类型转化为多个非泛型类型的过程,编译器会在编译期间对每个实例进行单独优化,优化的结果是静态分发 有着(1)性能更好、(2)代码体积更小、(3)能保证类型安全等优点 但也存在(1)代码灵活度不高、(2)编译时间更长、(3)输出二进制文件更大等不足

动态分发(dynamic dispatch)

Rust中的动态分发(dynamic dispatch)可以使用户在不知道具体的类型的情况下,调用泛型类型上的Trait方法。动态分发通过Trait对象(Trait Object)完成,具体的实现机制是:Trait对象将实现了某Trait的类型的指针包装在一个特殊的结构体中,而该结构体又包含一个指向实现该Trait的类型的指针和一个指向Trait的虚函数表(vtable)的指针 ,结合下面的示意图可以更好地理解这段话Trait对象示意图

虚函数表(vtable)

虚函数表(vtable)是一个包含Trait方法的函数指针的数组,它允许在运行时动态调用Trait方法,当一个类型实现了一个Trait时,编译器会为该Trait生成一个虚函数表,并将该类型的实现添加到虚函数表中,即当一个对象被转换为Trait对象时,其会被分配一个指向该Trait的虚函数表的指针

Trait对象

要创建一个Trait对象,需要使用Box<dyn trait>&dyn Trait关键字将实现了某Trait的类型的指针包装在一个Box<dyn trait>&dyn trait类型的变量中。这个变量可以被传递给函数或存储在变量中,并在运行时动态分配,比如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = return_trait_object(false);
println!("{:?}", rec.area());
}

// 以下的函数会返回一个Trait对象,这时用户不需关心返回的具体类型
// 只需要设置返回类型所需要满足的Trait
fn return_trait_object(flag: bool) -> Box<dyn Shape> {
if flag {
Box::new(Rectangle {
width: 11.0,
height: 9.0,
})
} else {
Box::new(Circle { radius: 7.0 })
}
}
// 可以把上面的例子和Trait部分最后的代码示例做一下对比,看一下有什么区别

但需要注意的是,动态分发相比于静态分发产生了更多的指针跳转操作,因此使用Trait对象时会在运行时产生一定额外的开销。实际情况下,用户应根据具体需求选择使用哪种分发模式

对象安全

在使用Trait对象时,应注意在Rust中,只能将对象安全(Object-Safe)的Trait转化为Trait对象 ,而对象安全的Trait应满足(1)方法返回的类型不是Self、(2)方法中不包含任何泛型类型参数 ,比如标准库中的Clone trait就是一个非对象安全的trait

1
2
3
4
// Clone trait返回类型是Self,所以它是一个非对象安全的trait
pub trait Clone {
fn clone(&self) -> Self;
}
]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:Box<T>智能指针 + + /posts/pm7yb0b2.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

简介

Box<T>智能指针的组成

在Rust的智能指针中,Box<T>是最简单的智能指针,其主要由两部分组成:(1)储存在堆内存(heap)上的数据、(2)储存在栈内存(stack)上的、指向堆内存数据的指针 ,比如下面的例子中,我们使用Box::new()在堆内存上请求了一块区域来存储数字”5”,然后返回了一个指向该区域的指针并赋值给变量”a”

1
2
3
4
5
6
7
8
9
10
fn main() {
let a = Box::new(5);
}
/* Box<T>示意图
------- ------
|stack| |heap|
------- ------
| ptr ------------>|data|
------- ------
*/

Box<T>指针的使用场景

  1. 在编译时,某类型的大小无法确定。但使用该类型时,上下文却需要知道其确切大小
  2. 当存在大量数据想要移交所有权,但需确保操作时数据不会被复制
  3. 当使用某个值时,只关心其是否满足特定的Trait约束,而不关心其具体的类型
    总体而言,Box<T>的作用主要有:(1)动态分配内存、(2)所有权转移、(3)避免内存泄漏、(4)处理递归类型、(5)实现Trait对象(见Trait对象部分)

使用Box<T>指针创建递归类型

我们首先必须了解这样一个规定:Rust在编译时,必须知道一个类型所占用的空间大小 ,而递归类型(如链表)因为递归层数的不确定,其大小在编译时也是无法确定的,比如下面的代码就无法通过编译,因为List所占用的空间大小在编译时没法确定

1
2
3
4
5
6
7
8
9
10
use crate::List::{Cons, Nil};

enum List {
Cons(i32, List),
Nil,
}

fn main() {
let list = Cons(1, Cons(2, Cons(3, Nil)));
}

但是,我们知道在Rust中指针变量的大小是可以确定的,在这里就可以使用Box<T>来定义递归类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use crate::List::{Cons, Nil};

enum List {
Cons(i32, Box<List>),
Nil,
}

fn main() {
let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
let mut current = &list;
// 遍历list
loop {
match current {
Cons(value, next) => {
println!("{}", value);
current = next;
}
Nil => break,
}
}
}

两个基本trait

Deref trait

  • Deref trait的作用:Deref trait可以让用户自定义解引用运算符*的行为,即通过实现Deref trait,用户可以像使用常规引用一样使用智能指针

Box<T>的解引用

1
2
3
4
5
6
7
8
fn main() {
// 常规引用的解引用
let x = &5;
assert_eq!(5, *x);
// Box<T>的解引用
let y = Box::new(3);
assert_eq!(3, *y);
}

自定义Box<T>指针

在Rust中,Box<T>被定义为拥有一个元素的元组结构体(tuple struct)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use std::ops::Deref;

struct MyBox<T>(T);

impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}

// 为MyBox实现Deref trait让我们可以使用解引用运算符
impl<T> Deref for MyBox<T> {
type Target = T;
// 实现Deref trait中的deref方法
fn deref(&self) -> &Self::Target {
&self.0
}
}

fn main() {
let x = MyBox::new(5);
assert_eq!(5, *x); // 这里"*x"会被隐式的展开为"*(x.deref())"
}

隐式解引用转化(Deref Coercion)

隐式解引用转化(Deref Coercion)是为函数和方法提供的一种便捷特性 ,具体来说就是:如果一个类型T实现了Deref trait,那么在编译时,编译器就会将T的引用隐式地转换为经过Deref操作后生成的引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use std::ops::Deref;

struct MyBox<T>(T);

impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}

impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}

fn main() {
let x = MyBox::new("hello, world!".to_string());
// 注意:向hello()传参时会发生隐式解引用转化
hello(&x);
}

fn hello(s: &str) {
println!("{}", s);
}

在上面的代码中,变量x经过了两次Deref转换,即:&Mybox<String> -> &String -> &str(注:在标准库中String实现了Deref trait,所以它会隐式地转换为&str)

Drop trait

  • Drop trait的作用:实现Drop trait,可以让用户自定义当值将要离开作用域时发生的动作,比如文件或其他资源的释放等,它有点像Python中的__del__方法

drop()方法的触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct CustomSmartPointer {
data: String,
}

// 为CustomSmartPointer实现Drop trait
impl Drop for CustomSmartPointer {
// 实现drop()方法
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}

fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}

/*
OutPut:
CustomSmartPointers created.
Dropping CustomSmartPointer with data `other stuff`!
Dropping CustomSmartPointer with data `my stuff`!
*/

通过输出信息可以知道:程序运行完成后,内存中变量释放的顺序是从下往上的

手动释放内存

在Rust中,我们并不能直接调用某类型的drop()方法,但一般也不需要手动调用drop()方法,因为Drop trait的功能是自动运行变量被释放后的一系列行为,但有时我们又确实存在手动释放内存的需求,这时我们可以使用标准库提供的std::mem::drop 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use std::mem::drop;

struct CustomSmartPointer {
data: String,
}

impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}

fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
// 手动释放变量
drop(c);
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}

/*
OutPut:
Dropping CustomSmartPointer with data `my stuff`!
CustomSmartPointers created.
Dropping CustomSmartPointer with data `other stuff`!
*/

可以发现打印的信息顺序发生了变化,这是因为我们先显式地释放了变量cc在释放时触发了c.drop()方法,所以最后的结果表现不一样

其他智能指针

Box<T>外,Rust中还存在其他的智能指针,如Rc<T>Arc<T>Mutex<T>等等,这些就等用到的时候再写吧…

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:闭包 + + /posts/7h4old6e.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

创建闭包

闭包的创建和函数的创建基本一致,但不用使用fn来定函数。比如下面的main函数中,我们定义了一个闭包

1
2
3
4
5
6
7
8
9
fn main() {
// 标准语法
let add = |x: f64, y: f64| -> f64 {
println!("{} + {} = {}", x, y, x + y);
x + y
};

let _result = add(1.0, 2.0); // 调用闭包
}

一般情况下,我们其实可以采用简化语法来创建闭包

1
2
3
4
5
6
7
8
9
fn main() {
// 简化语法
let add = |x, y| {
println!("{} + {} = {}", x, y, x + y);
x + y
};

let _result = add(1.0, 2.0); // 调用闭包
}

闭包中的变量类型

在创建和使用闭包时,编译器通常可以直接推断出使用的变量类型而不用自己定义。但需注意的是,变量类型确定后就不能再使用其他类型的变量了

1
2
3
4
5
6
fn main() {
let c = |x| x;

let s = c(String::from("hello"));
let n = c(5); // 注意:该行会发生panic,因为闭包c的参数类型已经确定为"String"类型
}

捕获环境

闭包可捕获其所在定义域的环境值,这让闭包的使用比普通函数灵活得多

1
2
3
4
5
6
7
8
fn main() {
let var = 3;
let var_add = |x| {
println!("{} + {} = {}", x, var, x + var)
};

var_add(3);
}

类似的,如果使用函数的话就不能满足这样的要求了

1
2
3
4
5
6
7
8
9
fn main() {
let var = 3;
// 以下的写法会引发panic
fn var_add(x: i32) {
println!("{} + {} = {}", x, var, x + var)
}

var_add(3)
}

闭包所捕获环境值的所有权

闭包捕获的环境值的所有权和普通函数的所有权保持一致,一共有三种方式

取得变量所有权:FnOnce

满足FnOnce trait的闭包捕获的环境值只能被闭包调用一次,后续无法再次调用

1
2
3
4
5
6
7
8
9
fn main() {
let name = String::from("rust");
let c = move |greeting: String| (greeting, name); // 使用move关键字将变量name的所有权传入闭包中

let result = c("hello".to_string());
println!("result: {:?}", result);

println!("{}", name); // 因为变量name的所有权已经转移了,所以这行会发生错误
}

获得变量的可变借用:FnMut

满足FnMut trait的闭包可以获得环境值的可变借用

1
2
3
4
5
6
7
8
9
10
fn main() {
let mut name = String::from("hello");
let mut c_mut = || {
name.push_str(" rust");
println!("c: {}", name);
};
c_mut();

println!("{}", name); // 变量name的所有权没有改变,但其中的值已经被修改了
}

获得变量的不可变借用:Fn

满足Fn trait的闭包不会消耗所捕获环境值的所有权

1
2
3
4
5
6
7
8
fn main() {
let y = String::from("hello");
let closure = |x| {
x == y
};
println!("{}", closure("hello"));
println!("{}", y);
}

在创建闭包时,Rust可以通过闭包对环境值的使用来推断出闭包具体使用哪个trait,具体而言,即(1)所有的闭包都实现了FnOnce trait、(2)没有移动捕获变量的实现了FnMut trait、(3)无需可变访问捕获变量的闭包实现了Fn trait

闭包作为参数

Rust支持函数式编程,所以闭包也可以作为参数、返回值和结构体成员变量。但需注意值的类型是实现FnFnOnce或者FnMut trait的类型

作为传入参数

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
let closure = |x: i32| {
println!("print in closure: {}", x);
x
};

call_closure(closure)
}

fn call_closure(closure: impl Fn(i32) -> i32) {
closure(10);
}

作为返回值

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let a = call_closure();
a(1);
}

fn call_closure() -> impl Fn(i32) -> i32 {
|x: i32| {
println!("print in closure: {}", x);
x
}
}

作为结构体成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
struct Cacher<T> 
where T: Fn(i32) -> i32,
{
calc: T,
value: Option<i32>,
}

impl<T> Cacher<T>
where T: Fn(i32) -> i32,
{
fn new(clac: T) -> Self {
Cacher {
calc: clac,
value: None,
}
}

fn value(&mut self, arg: i32) -> i32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calc)(arg); // 调用传入闭包
self.value = Some(v);
v
}
}
}
}

fn main() {
let mut cacher = Cacher::new(|x| x); // 将闭包传递进结构体中,作为成员变量

println!("caching: {:?}", cacher.value(2));
}
]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:泛型 + + /posts/zr161ci0.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

泛型的作用主要体现在提高代码的复用能力。在官方文档中,泛型被定义为具体类型或其他属性的抽象代替,在实际使用时可以将泛型理解为一种模板占位符,编译器会在编译时 执行单态化(monomorphization)操作,即将泛型类型替换为具体的类型

在结构体中使用泛型

在结构体中使用泛型一般存在两种情况,其一为定义结构体时,其二为在方法定义时

在定义中使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 注意:这里的泛型类型要求x和y的类型必须一致
struct Point<T> {
x: T,
y: T,
}

fn main() {
let rec = Point { x: 12.5, y: 9.2 };

let squ = Point { x: 9, y: 9 };

println!("x: {}, y: {}", rec.x, rec.y);
println!("x: {}, y: {}", squ.x, squ.y);
}

在方法中使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 注意:这里的泛型类型要求x和y的类型可以不一致,也可以一致
struct Point<T, U> {
x: T,
y: U,
}

// 此处意思为针对泛型类型T和U实现的方法而不是针对某特定类型实现方法,即所有类型都可以调用该方法
impl<T, U> Point<T, U> {
fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
Point {
x: self.x,
y: other.y,
}
}
}

// 此处意思为仅针对数据类型为i32时实现方法,当结构体中字段为非i32类型时无法调用该方法
impl Point<i32, i32> {
fn mix_i32(self, other: Point<i32, i32>) -> Point<i32, i32> {
Point {
x: self.x,
y: other.y,
}
}
}

fn main() {
let p1 = Point { x: 5, y: 10.4 };
let p2 = Point { x: "Hello", y: 'c'};

let p3 = p1.mixup(p2);
println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
}

同时,由上面的例子可注意到在结构体中的泛型类型参数可以和方法的泛型类型参数不同

在枚举中使用泛型

在枚举中使用泛型和结构体类似,一般用在使枚举的变体持有泛型数据类型。比如Option枚举和Result枚举

1
2
3
4
5
6
7
8
9
10
11
// Option枚举
enum Option<T> {
Some(T),
None,
}

// Result枚举
enum Result<T, E> {
Ok(T),
Err(E),
}

在函数中使用泛型

以下是一个最简单的在函数中使用泛型的例子,但在实际项目中,我们通常需要对泛型进行限制以保证函数得到的参数能满足后续相关的功能要求 ,这时需要使用Trait对泛型参数进行约束

1
2
3
4
5
6
7
8
9
10
fn main() {
let a = 1;
let b = 2.0;
println!("{}", back(a));
println!("{}", back(b));
}

fn back<T>(item: T) -> T {
item
}

泛型的Trait约束

在Trait部分我们说,可以通过Trait对传入或返回参数的类型进行约束。在使用泛型类型参数时可以配合Trait使用,以实现对传入参数的类型进行约束

简单情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

trait_param(&rec);
}

// 类型T必须实现Shape trait和Debug trait
fn trait_param<T: Shape + Debug>(item: &T) {
println!("{:?}", item);
println!("{}", item.area());
}

使用where关键字

在上面的例子中,我们实现了对函数传入参数进行约束。但在实际项目中,泛型参数或Trait约束较多会造成代码不易阅读,我们可以使用where关键字来使代码更加直观。上面例子其实可以看做使用where关键字的语法糖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

#[derive(Debug)]
struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

let cir = Circle { radius: 11.0 };

trait_param(&rec, &cir);
}

fn trait_param<T, U>(rec: &T, cir: &U)
// 使用where对多个泛型参数设置多个Trait约束
where
// 类型T必须实现Shape trait
T: Shape,
// 类型U必须实现Shape trait和Debug trait
U: Shape + Debug,
{
println!("{}", rec.area());
println!("{:?}", cir);
}
]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:Trait + + /posts/akex76ga.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

Trait的作用

在Rust中Trait(特质)是一种任何类型都可以选择支持或不支持的一种定义行为的机制,Trait可以被认为是某类型能够做什么的一种能力,其类似于其他语言中的接口,但存在一定区别。Trait的作用主要包含(1)定义共享行为、(2)实现多态、(3)扩展类型的功能、(4)提高代码可读性和可维护性、(5)约束泛型类型(见泛型部分)

Trait的定义与实现

Trait的定义

使用trait关键字定义一个Trait。Trait的定义是将方法的签名进行封装,以定义实现某种目的所必须的一组行为

1
2
3
4
5
6
trait Shape {
// 定义计算面积的方法签名
fn area(&self) -> f64;
// 定义计算周长的方法签名
fn perimeter(&self) -> f64;
}

在Trait的定义中只有方法签名而没有具体的实现,其中封装的方法的具体实现由实现该Trait的类型提供

Trait的实现

Trait中定义方法的实现和结构体或枚举方法的实现很相似,都是使用impl关键字。具体写法为impl ... for ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
trait Shape {
fn area(&self) -> f64;
fn perimeter(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

// 为Rectangle提供Shape trait实现
impl Shape for Rectangle {
fn area(&self) -> f64 {
self.width * self.height
}
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
}

struct Circle {
radius: f64,
}

// 为Circle提供Shape trait实现
impl Shape for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

// 调用已经实现Trait中的方法也和调用普通方法一致
println!("area: {}, perimeter: {}", rec.area(), rec.perimeter());
}

在上面的例子中,“圆”和“矩形”是不同的类型,但我们可以在函数中使用同样的函数签名来调用它们绑定的方法

Trait的实现约束

在类型上实现Trait存在两个限制条件

  1. 这个类型`或`这个Trait(至少有一个)是在本地crate定义的 ,比如我们可以为Rectangle类型实现Debug Trait,也可以为Vector类型实现Shape Trait
  2. 为确保两个不同库的代码不互相影响,在Rust中无法为外部类型实现外部Trait ,比如我们无法为标准库中的String类型实现Display Trait

Trait默认实现与重载

Trait的默认实现

在前面,我们说Trait所封装的方法的实现由实现这个Trait的类型提供,但在定义Trait时其实也可以提供默认实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
trait Shape {
fn perimeter(&self) -> f64;
// 提供默认实现
fn area(&self) -> f64 {
println!("default method, return perimeter");
// 在默认实现中可以调用trait中定义的方法,且不用管其他方法是否提供了默认实现
self.perimeter()
}
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
// 当一个类型想调用默认实现时,不需要为该类型实现已经默认实现的方法
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};
// 这里的代码调用了Shaper trait中的默认实现,最后打印的是周长
println!("rec area: {}", rec.area());
}

上面的例子中,Trait在定义时就提供了默认实现。但需要注意的是,默认实现无法获得类型中的字段(field) ,因为Trait定义的是具体类型的共享行为,它无法知道用户定义的类型会提供什么数据,比如我们在矩形中我们提供了长和宽,而圆只提供了半径

Trait的重载

虽然Trait可以提供默认实现,但我们也可以针对特定类型进行Trait的重载,重载不会影响其他类型调用默认实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64 {
println!("default method, return perimeter");
self.perimeter()
}
}

struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
// 重载默认实现
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let cir = Circle {
radius: 5.0,
};
// 因为Circle重载了area()方法,所以打印的是正确的面积值
println!("cir area: {}", cir.area());
}

Trait作为传入类型和返回类型

作为传入类型

在Rust中,我们可以将Trait作为函数传入的参数类型,就可以实现将多种具体的类型传入同一函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = Rectangle {
width: 12.0,
height: 20.0,
};

trait_param(rec);
}

// 这个函数接收一个实现Shape trait的类型
fn trait_param(item: impl Shape) {
println!("{}", item.area());
}

在上面的例子中,trait_param()这个函数接收一个实现了Shape trait的类型,在调用时可以将任何实现Shape trait的类型传入。当我们想约束传入的类型需要实现多个Trait时,Trait之间可以使用+号连接

作为返回类型

和传入参数时类似,Trait也可以作为返回类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

fn main() {
let rec = return_trait();
println!("{:?}", rec);
}

// 这个函数会返回一个实现了Shape trait和Debug trait的类型
fn return_trait() -> impl Shape + Debug {
Rectangle {
width: 11.0,
height: 9.0,
}
}

上面的例子中,return_trait()函数会返回一个实现Shape trait和Debug trait的类型。但是需要注意的是,当我们使用特定trait作为返回类型时,用户必须保证这个函数返回的具体类型是确定的 ,否则就会像下面例子中的代码一样出现错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::fmt::Debug;

trait Shape {
fn perimeter(&self) -> f64;
fn area(&self) -> f64;
}

#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Shape for Rectangle {
fn perimeter(&self) -> f64 {
2.0 * (self.width + self.height)
}
fn area(&self) -> f64 {
self.width * self.height
}
}

#[derive(Debug)]
struct Circle {
radius: f64,
}

impl Shape for Circle {
fn perimeter(&self) -> f64 {
2.0 * std::f64::consts::PI * self.radius
}
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}

fn main() {
let rec = return_trait(false);
println!("{:?}", rec);
}

// 以下的函数会出现一个错误,因为函数返回的具体类型的可能性不唯一
fn return_trait(flag: bool) -> impl Shape + Debug {
if flag {
Rectangle {
width: 11.0,
height: 9.0,
}
} else {
Circle { radius: 7.0 }
}
}

以上的例子是无法通过编译的,但如果我们确实需要实现与例子中return_trait()函数类似的功能也是有办法的,具体见Trait对象部分

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:枚举 + + /posts/0lozupq7.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

枚举的基本操作

在Rust中,枚举类型是一种通过enum关键字定义的特殊的类型,允许用户定义一个取值范围有限的变量

定义枚举

一个枚举可以包含一系列命名的值,这些值就被称为枚举成员(enumeration variant)

1
2
3
4
5
6
7
8
9
10
11
12
// 定义枚举
enum Species {
Human,
Animal,
Plant,
}

fn main() {
// 创建枚举变量
let john = Species::Human;
let tom = Species::Animal;
}

枚举类型作为自定义数据类型,和其他的数据类型一样,枚举变量也可以通过函数进行传递或作为结构体字段类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum Species {
Human,
Animal,
Plant,
}

// 作为结构体字段类型
struct Earth {
leader: Species,
member: String,
}

fn main() {
let john = Species::Human;
let tom = Species::Animal;

// 在函数间传递
sleep(john);
sleep(tom);
sleep(Species::Animal);
}

fn sleep(species: Species) {}

枚举成员可以是一个简单的标识符,也可以包含数据或者匿名结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum Species {
Human(String),
Animal(String),
Plant(String),
Alien { name: String, attitude: String },
}

fn main() {
let john = Species::Human("Male".to_string());
let tom = Species::Animal("Cat".to_string());
let tiga = Species::Alien {
name: "Ultraman".to_string(),
attitude: "Friendly".to_string(),
};
}

枚举方法

和结构体类似,枚举也可以使用impl定义其关联的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
enum Species {
Human(String),
Animal(String),
Plant(String),
Alien { name: String, attitude: String },
}

impl Species {
fn war(&self) {
// 使用模式匹配解构枚举变量
match self {
Species::Alien { name, attitude } if attitude == "Hostile" => {
println!("{} is a threat, Start War!", name);
}
_ => {
println!("Friendly!");
},
}
}
}

fn main() {
let tiga = Species::Alien {
name: "Ultraman".to_string(),
attitude: "Friendly".to_string(),
};
let thanos = Species::Alien {
name: "Eternals".to_string(),
attitude: "Hostile".to_string(),
};
tiga.war();
thanos.war();
}

枚举的解构

当我们想使用枚举中的值或针对特定枚举执行相应的操作时,就需要通过模式匹配(pattern matching)来解构枚举。具体来说,可以使用matchif let表达式,将枚举变量与每个可能的值进行比较,并执行相应的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
enum Species {
Quit,
Human(String),
Animal(String),
Plant(String),
}

fn main() {
let flag = Species::Quit;
let person = Species::Human("john".to_string());
let cat = Species::Animal("tom".to_string());
let chaos = Species::Human("jeff".to_string());

// 使用match匹配所有条件
let person_name = match person {
Species::Human(name) => name,
Species::Plant(name) => name,
Species::Animal(name) => name,
Species::Quit => "No Person".to_string(),
};

// 使用if let匹配单个条件
let chaos_name = if let Species::Plant(name) = chaos {
name
} else if let Species::Animal(name) = chaos {
name
} else {
"chaos Unknown!".to_string()
};

// 使用"_"通配符匹配其余所有条件
let animal_name = match cat {
Species::Animal(name) => Some(name),
_ => None,
};

if let Species::Quit = flag {}

println!("{}", person_name);
println!("{:?}", animal_name);
println!("{}", chaos_name);
}

由上面例子可以看出来,使用match对枚举进行解构时需列举所有的可能情况,但我们也可以使用_通配符来简化匹配;if let则只适用于匹配单个模式的情况,但可配合使用elseelse if let来匹配多个模式

]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:结构体 + + /posts/56u6za0a.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

结构体基本操作

定义、实例化

在实例化结构体时,字段内的赋值顺序可以和结构体定义不同,但是字段数量必须和定义一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定义结构体
struct Person {
name: String,
age: u8,
}

fn main() {
// 实例化
let tom = Person {
name: "tom".to_string(),
age: 10,
};

// 实例化
let jerry = Person {
age: 8,
name: "jerry".to_string(),
};
}

访问、修改内部字段

需要注意的是,当我们将结构体声明为可变对象时,它下属的所有字段就都是可变的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Person {
name: String,
age: u8,
}

fn main() {
// 注意:这个结构体是可变的
let mut tom = Person {
name: "tom".to_string(),
age: 10,
};

// 访问结构体中的字段
println!("name: {}, age: {}", tom.name, tom.age);
// 修改结构体中的字段
tom.name = "jerry".to_string();
println!("name: {}, age: {}", tom.name, tom.age);
}

基于已有实例创建新实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Person {
name: String,
age: u8,
species: String,
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
species: "cat".to_string(),
};

// 基于已有实例创建新实例
let jerry = Person {
name: "jerry".to_string(),
species: "mouse".to_string(),
..tom
};
}

元组结构体(Tuple Struct)

在某些情况下,我们只想给元组整体取名来实现其相对于别的元组的不同。比如下面的例子中的black和origin,虽然它们内部的字段是一样的,但是他们是不同类型的结构体,这样就可以针对其类型定义它们不同的行为

1
2
3
4
5
6
7
8
// 注意:定义元组结构体需要以分号结尾
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}

空结构体(Unit-Like Struct)

当我们想在某个类型上只实现行为而不想在其中储存数据的时候,就可以使用空结构体

1
2
3
4
5
struct Empty;

fn main() {
let a = Empty;
}

结构体数据的所有权

一般类型数据

如果结构中的数据储存在堆内存上的数据或者基础类型数据的话,那么这个结构体实例就拥有其所有的数据。只要实例有效,其内部的数据就有效;反过来说,当其内部数据的所有权发生转移,实例也就失效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Team {
leader: String,
member: String,
episode: u32,
}

fn main() {
let msm = Team {
leader: "tom".to_string(),
member: "jerry".to_string(),
episode: 201,
};

// 注意:这里传递的是&String
hello(&msm.leader);
// 如果传递的不是引用,下面这句代码会发生错误,实例因其内部数据的所有权转移而失效
println!("{:?}", msm);
}

fn hello(name: &String) {
println!("hello, {}", &name);
}

引用类型数据

在结构体中也可以储存引用,但是需要使用到生命周期标注来保证在实例有效的范围内,其内部引用也是有效的

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Team<'a> {
leader: &'a str,
member: &'a str,
episode: u32,
}

fn main() {
let msm = Team {
leader: "tom",
member: "jerry",
episode: 201,
};
}

结构体的解构

当我们想要获得解构体内部值的时候,除了直接使用.标记法访问结构体数据外,还可以通过模式匹配来解构结构体实现直接获取内部值,但需要注意匹配造成的所有权转移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#[derive(Debug)]
struct Rectangle {
length: String,
width: String,
}

fn main() {
let rec = Rectangle {
length: 50.to_string(),
width: 30.to_string(),
};
// 这里的等号就相当于模式匹配
let Rectangle { length, width } = rec;
println!("length: {}, width: {}", length, width);
// 注意:这句代码会发生错误,因为所有权被转移
println!("{:?}", rec);
}

结构体方法

Rust中方法的作用和面向对象语言(如Python)中的方法有些类似但又有些区别,都是将行为与类型相关联,都可以访问关联类型的所有数据和方法,从而使代码更具可读性和可维护性。这里虽然标题是结构体方法,但其他的一些数据类型,比如枚举(enum)等也可以采用类似语法来实现与其关联的方法

定义方法

定义方法的语法要求

  1. 使用impl关键词进行定义
  2. 方法的定义在struct(或enum、trait对象)的上下文进行
  3. 方法的第一个参数为self,表示被方法调用的实例
  4. 一个类型可拥有多个impl块或多个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里是借用了实例
fn introduce(&self) {
println!("My name is {}, {} years old!", self.name, self.age);
}
// 定义第二个方法
fn hello(&self) {
println!("hello {}", self.name);
}
}

// 再次使用impl
impl Person {
fn sleep(&self) {
println!("{} is sleeping", self.name);
}
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
};

// 调用方法
tom.introduce();
}

结构体方法中实例的所有权

在上面的例子中,我们其实是使用借用的模式获得实例中的数据,但是也可以获得实例所有权或者得到实例的可变引用,这取决于用户想要实现的行为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里获得了实例的所有权
fn introduce(self) {
println!("My name is {}, {} years old!", self.name, self.age);
}
}

fn main() {
let tom = Person {
name: "tom".to_string(),
age: 10,
};

tom.introduce();
// 下面这句代码会出现错误,因为实例的所有权已经离开这个作用域
println!("{:?}", tom);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}

impl Person {
// 注意:这里是获得了可变引用
fn friend(&mut self) {
self.name.push_str(" and jerry");
}
}

fn main() {
let mut tom = Person {
name: "tom".to_string(),
age: 10,
};

println!("{:?}", tom);
tom.friend();
println!("{:?}", tom);
}

关联函数

如果学过Python知道,在类中有叫静态方法的特殊类型函数,其不以self作为函数的第一个参数。在Rust中也有类似的函数,即关联函数,关联函数通常被用于构造器,比如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
// new函数即为关联函数,它的作用是返回一个Rectangle实例
fn new(length: usize, width: usize) -> Rectangle {
// 这里使用了简化写法
Rectangle { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}
}

fn main() {
// 调用关联函数时使用"::"
let rec = Rectangle::new(50, 30);
println!("{}", rec.area());
}

在结构体方法中,self是一个指向当前对象的指针,类似于Python定义类时的self参数,表示当前对象。Self是一个特殊的类型,表示当前类型本身,比如上面的例子可以这样改写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#[derive(Debug)]
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
// 使用Self作为返回类型
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}
}

fn main() {
let rec = Rectangle::new(50, 30);
println!("{:?}", rec);
}

关联函数和方法的内部调用

在impl块中方法调用其他方法和关联函数的模式是不一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#[derive(Debug)]
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}

fn area_compare(&self, length: usize, width: usize) -> bool {
// 调用关联函数
let rec_new = Self::new(length, width);
// 调用方法
self.area() > rec_new.area()
}
}

fn main() {
let rec = Rectangle::new(50, 30);
println!("{:?}", rec);
let e = rec.area_compare(40, 35);
println!("{}", e);
}

如果关联函数想要调用结构体方法,则需要传入结构体实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Rectangle {
length: usize,
width: usize,
}

impl Rectangle {
fn new(length: usize, width: usize) -> Self {
Self { length, width, }
}

fn area(&self) -> usize {
self.length * self.width
}

fn double_area(rec: &Rectangle) -> usize {
let new_rec = Self::new(rec.length * 2, rec.width * 2);
new_rec.area()
}
}

fn main() {
let rec = Rectangle::new(50, 30);
let double_area = Rectangle::double_area(&rec);
println!("The double area of the rectangle is {} square pixels.", double_area);
}
]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + Rust学习笔记:引用与借用 + + /posts/u74pp23h.html + +

以下内容为本人学习过程中的记录笔记,其中可能存在不准确或错误,欢迎勘误及指正

引言

在Rust的基于所有权的内存管理模式中,对于引用类型变量,其所有权会在传递过程中发生变化。比如下面的代码中,当我们将String类型的变量传入函数后,s的所有权发生变更,我们想在main函数中继续使用s就不行了

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let s = "hello".to_string();
// 函数get_ownership()获得了变量s的所有权
get_ownership(s);
println!("{}", s);
}

fn get_ownership(s: String) {
println!("{}", s);
// get_ownership()函数执行完,s被释放
}

但是在实际开发过程中我们常常需要继续在main函数中使用这些变量,这时主要三种方法可以满足类似的需求

深拷贝

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
// 将原变量深拷贝后传递给调用函数
get_ownership(s.clone());
println!("{}", s);
}

fn get_ownership(sc: String) {
println!("{}", sc);
}

通过clone(),确实可以解决后续在main函数中使用变量的问题,但在实际情况中,我们如果要对原来的变量进行处理而不是单纯的传递,采用clone()就不是很友好了

归还所有权

归还所有权就是当调用函数结束的时候,将变量的所有权返回至原函数,见下面的例子

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
let s = give_back(s);
println!("{}", s);
}

fn give_back(s: String) -> String {
println!("{}", s);
s // 通过返回值,将s的所有权返回原函数
}

归还所有权很好理解,但这样写出的代码比较冗余,且在返回值的处理上会比较麻烦

传递引用

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = "hello".to_string();
// 通过传递引用,将s的所有权保留在main函数中
give_reference(&s);
println!("{}", s);
}

fn give_reference(s: &String) {
println!("{}", s);
}

通过传递引用不会改变原变量的所有权,这样就可以避免后续处理所有权的麻烦

引用(Reference)

我们先分析下以下例子中的变量s和&s在内存中的关系。通过示意图可以看出:在引用变量s时程序创建了一个指针&s,它指向了变量s中指向堆内存数据的指针,当我们将&s传递到外部函数时,s1获得&s的所有权,在s1(&s)被释放后,不会导致变量s也被释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fn main() {
let s = "hello".to_string();
let length = calc_len(&s);
println!("{}", s);
}

fn calc_len(s1: &String) -> usize {
s1.len()
}

// 引用在内存上的相互关系
/*
&s s
+----+-----+ +--------+-----+ +-------+-----+
|name|value| | name |value| | index |value|
+----+-----+ +--------+-----+ +-------+-----+
| ptr|------------->| ptr |------------->| 0 | h |
+----+-----+ +--------+-----+ +-------+-----+
| len | 5 | | 1 | e |
+--------+-----+ +-------+-----+
|capacity| 5 | | 2 | l |
+--------+-----+ +-------+-----+
| 3 | l |
+-------+-----+
| 4 | o |
+-------+-----+
*/

Rust中的&符号就表示引用,它允许调用值而不取得其所有权

借用(Borrow)

在Rust中将创建一个引用的行为称为”借用”,即将引用作为函数参数的行为就是”借用”。如同现实生活中,我们向别人借物品,使用完毕后必须还回去一样,因为我们没有该物品的所有权

可变引用

采用类似&String写法时,默认情况下我们是没法改变引用值的,但在很多场景中又确有修改引用值的需求。在Rust中提供了可变引用实现此类功能,具体见下面的例子

1
2
3
4
5
6
7
8
9
10
fn main() {
let mut s = "hello".to_string();
add_str(&mut s);
println!("{}", s);
}

fn add_str(s: &mut String) {
// 通过可变引用修改s中的数据
s.push_str(", world!");
}

可变引用的两个限制

Rust虽然提供了可变引用的方法,但同时也做了一些限制以保证内存安全

限制一

在特定作用域内,对某一块数据只能有一个可变引用,以避免产生数据竞争 。比如下面的代码在编译时就会报错
1
2
3
4
5
6
fn main() {
let mut s = "hello".to_string();
let s1 = &mut s;
let s2 = &mut s;
println!("s1: {} s2: {}", s1, s2);
}

可能发生数据竞争的三种行为:

  1. 多个指针同时访问同一个数据
  2. 至少有一个指针用于写入数据
  3. 没有使用任何机制同步对数据的访问行为
对于以上的限制,我们其实可以通过采用划分作用域的方法达到非同时创建多个可变引用的目的 ,比如以下的例子
1
2
3
4
5
6
7
8
9
10
fn main() {
let mut s = "hello".to_string();
{
let s1 = &mut s;
s1.push_str(",world");
}
let s2 = &mut s;
s2.push_str("!");
println!("{}", s);
}

限制二

对一个数据可以同时存在多个不可变引用,但不能同时存在可变引用与不可变引用 ,因为这会导致不可变引用的作用失效
1
2
3
4
5
6
7
8
fn main() {
let mut s = "hello".to_string();
let s1 = &s;
// 此处会发生错误,因为同时存在对变量s的不可变引用和可变引用
let s2 =&mut s;

println!("{} {}", s1, s2)
}
]]>
+ + + + + 技术 + + + + + + + Rust学习笔记 + + + +
+ + + + + 对asyncio的一点理解 + + /posts/56ecg2fs.html + + Python异步编程的几个概念

协程函数(Coroutine Function)

在Python中,使用async def定义的函数就是协程函数,下面这段代码中,我们定义了一个名为asyncsleep的协程函数

1
2
async def asyncsleep(sec):
await asyncio.sleep(sec)

协程对象(Coroutine Object)

在Python中,当我们直接调用协程函数时,Python不会直接运行这个函数内的任何代码,而是返回一个协程对象,以下代码中的crt变量就是调用asyncsleep(1)后返回的协程对象

1
2
3
4
5
6
7
8
9
import asyncio

async def asyncsleep(sec):
await asyncio.sleep(sec)

crt = asyncsleep(1)
print(crt)

输出:<coroutine object asyncsleep at 0x7f5dcec10270>

Task对象

在这里我们可以先看一下Task对象是怎么运行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import asyncio

async def tsk(num):
await asyncio.sleep(1)
return num

async def main():
crt = tsk(10)
print(crt)

task = asyncio.create_task(crt)
print(task)

await task
print(task)

if __name__ == "__main__":
asyncio.run(main())

输出:
<coroutine object tsk at 0x7f32908051c0>
<Task pending name='Task-2' coro=<tsk() running at /workspace/PythonProject/main.py:3>>
<Task finished name='Task-2' coro=<tsk() done, defined at /workspace/PythonProject/main.py:3> result=10>

我们可以看出,在main函数中,crt首先被包装为处于pending状态的Task对象,在经过await后,其状态变成了finished,同时返回了一个值为10的result。其实,Task对象就是被asyncio.create_task()封装、注册进事件循环中的协程对象,以便当事件循环获得线程控制权时,可以异步执行这个特殊对象

事件循环(Event Loop)

事件循环是asyncio的核心,是asyncio中的低层级API。它的主要功能是运行异步任务和回调,执行网络 IO 操作,以及运行子进程,见下面的示意图
事件循环示意图
结合之前的内容我们可以知道,对于协程对象,我们是没法直接运行它的内部功能的,必须通过await运行。比如在下面这段代码中,我们使用await直接运行了两个协程对象中的功能,最终耗时3秒。在这里,await的作用可以理解为阻塞运行了asyncsleep(1)asyncsleep(2)两个协程对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import asyncio
import time

async def asyncsleep(sec):
print(f"sleep time: {sec}")
await asyncio.sleep(sec)

async def main():
print(time.strftime("%X"))
# await运行的是协程对象
await asyncsleep(1)
await asyncsleep(2)
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
03:15:38
sleep time: 1
sleep time: 2
03:15:41

以上的代码显然不能满足我们的要求,如果我们想让程序异步等待,就必须将协程对象封装成Task对象,将其注册进事件循环中,再通过await运行。比如在下面这段代码的main()函数中,我们使用create_task()创建了task1、task2两个Task对象,然后使用asyncio.run()运行事件循环,可以发现,程序只消耗了2秒就完成了运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import asyncio
import time

async def asyncsleep(sec):
print(f"sleep time: {sec}")
await asyncio.sleep(sec)

async def main():
task1 = asyncio.create_task(asyncsleep(1))
task2 = asyncio.create_task(asyncsleep(2))

print("Start Tasks")
print(time.strftime("%X"))
# await运行的是Task对象
await task1
await task2
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
Start Tasks
03:11:40
sleep time: 1
sleep time: 2
03:11:42

其实事件循环本质上是一个无限循环,我们可以使用asyncio.get_event_loop()等方法获取或创建它。它主要工作就是当我们使用await关键字处理Task对象时执行Task内部的功能,当遇到Task内部的阻塞等待时,便将Task挂起,执行其他的处于pending状态的Task,同时它会在循环中检查挂起的Task是否处于finished状态了,如果是就收集返回的result。当所有await的Task都完成后,事件循环便终止,将线程控制权交出

asyncio的应用场景

需要注意的是,使用asyncio的程序仍是单线程运行的,它只是利用了CPU在处理IO密集型任务时的等待时间,让CPU可以处理其他任务,所以当程序需要阻塞线程或处理计算密集型任务时,异步编程就没有优势了。比如下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import asyncio
import time

async def blockingsleep(sec):
print(f"blocking sleep {sec}")
time.sleep(sec)

async def main():
task1 = asyncio.create_task(blockingsleep(1))
task2 = asyncio.create_task(blockingsleep(2))

print(time.strftime("%X"))
# sleep会阻塞当前线程,task2必须等待task1完成后才能执行
await task1
await task2
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

输出:
03:14:02
blocking sleep 1
blocking sleep 2
03:14:05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import asyncio

async def addup(num):
print(f"addup: {num}")
res = 0
for i in range(1, num):
res = res + i
print(res)

async def main():
task1 = asyncio.create_task(addup(100000001))
task2 = asyncio.create_task(addup(100001))

# 在运行task1时,CPU在处理计算密集型任务而不是处于等待状态,此时task2没法异步运行
await task1
await task2

if __name__ == "__main__":
asyncio.run(main())

所以我们可以看出asyncio的应用场景主要是IO密集型任务,如网络读取、硬盘读取、数据库读取等

asyncio并发限制

有时我们需要对协程数量进行一定限制,比如在网络请求时,应该考虑站点的并发能力来设置请求规模,否则可能会被目标站点识别为网络攻击。在asyncio中提供了信号量对象Semaphore()来限制协程数量,具体使用可参考下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import asyncio

async def tsk(sem, x):
async with sem:
print(f"Start Coroutine: {x}")
await asyncio.sleep(1)
print("Coroutine Done")

async def main():
# 设置协程数量为10
sem = asyncio.Semaphore(10)
tasks = [tsk(sem, n) for n in range(50)]
await asyncio.gather(*tasks)

if __name__ == "__main__":
asyncio.run(main())

运行以上代码可以发现,同时运行的协程对象数量会被限制在10个,这样就可以很方便地限制并发数量。但是在使用 asyncio.Semaphore()也有一些点需要注意,具体见下面的内容

不能使用async with … as …管理信号量对象

在使用asyncio.Semaphore()时不能使用async with ... as ...上下文管理语法,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio

async def main():
async with (sem:=asyncio.Semaphore(2)) as from_aenter:
print(f'{sem}')
print(f'{from_aenter}')

if __name__ == "__main__":
asyncio.run(main())

输出:
<asyncio.locks.Semaphore object at 0x7f197fc47550 [unlocked, value:1]>
None

这是因为使用async with ... as ...语法的对象需要实现__aenter__方法,而在asyncio中信号量对象__aenter__方法返回值为None

asyncio.Semaphore()的使用位置

在下面的代码中,我们设置了同时等待的协程对象最多为10个,预计需要时间为5秒。但是运行代码可以发现,完成所有任务只消耗了1秒

1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio
import time

async def main():
sem = asyncio.Semaphore(10)
async with sem:
tasks = [asyncio.sleep(1) for _ in range(50)]
print(time.strftime("%X"))
await asyncio.gather(*tasks)
print(time.strftime("%X"))

if __name__ == "__main__":
asyncio.run(main())

查看文档我们可以发现和下面演示代码一样的内容。即在使用async with ...时实际是协程对象 执行acquire()向信号量对象申请使用闲置队列使计数器减值,协程对象内部功能完成后执行release()向信号量对象释放队列使计数器增值。所以,在使用Semaphore()时,应该在每一个需要执行的协程对象内部 使用,由协程对象向信号量对象主动请求闲置队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""1"""
sem = asyncio.Semaphore(10)
# ... later
async with sem:
# work with shared resource

which is equivalent to:

"""2"""
sem = asyncio.Semaphore(10)
# ... later
await sem.acquire()
try:
# work with shared resource
finally:
sem.release()
]]>
+ + + + + 技术 + + + + + + + Python + + asyncio + + 异步编程 + + + +
+ + + + + 使用Python调用C语言动态链接库 + + /posts/bd214e51.html + +

Python以其开发简单、快捷和良好的生态受到全世界众多开发者的喜爱,但Python也因其较慢的运行速度被很多人诟病。同时,C语言以其能直接控制底层资源、运行速度快而广泛被用于操作系统和嵌入式设备的相关开发中,但C语言的缺点就是开发效率较低。那是否可以将两者结合起来?答案是可以的。关于Python调用C代码有好几种方式,在这里只举例介绍我个人常用且较为简单的使用Python的ctypes库调用C语言动态链接库的方法

实例:使用Python调用C语言编写的累加函数

C代码

1
2
3
4
5
6
7
8
9
10
11
12
// add.c(输入一个整数并返回1+2+3+...+num的值)
#include<stdio.h>

int add(long num)
{
long result = 0;
for(long i=1; i<=num; i++)
{
result += i;
}
return result;
}

C代码需要通过编译生成动态链接库文件(Linux系统下为.so文件,Windows系统下为.dll文件),这里以Linux为例

1
gcc -fPIC -O3 -shared add.c -o add.so

Python代码

使用Python调用C语言动态链接库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
from ctypes import *

def num_add_up(num: int) -> None:

result = 0
start = time.time()
lib = CDLL('./add.so')
lib.add.argtypes = [c_long] # 定义传入参数的类型
lib.add.restype = c_long # 定义返回值的类型
result = lib.add(num)
print(result)
print(time.time()-start)

if __name__ == '__main__':
num_add_up(100000000)

输出:
5000000050000000
0.03809380531311035

使用Python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time

def num_add_up(num: int) -> None:

result = 0
start = time.time()
for i in range(0, num+1):
result += i
print(result)
print(time.time()-start)

if __name__ == "__main__":
num_add_up(100000000)

输出:
5000000050000000
5.233763933181763

可以看出采用动态链接库的代码速度优势明显,可以通过这种方式对Python程序进行局部优化,提高程序的运行速度

ctypes参数类型

使用C语言动态链接库与Python的参数传递时,是无法直接传递Python中的变量的。需要ctypes进行相关的封装,ctypes在此定义了一些和C兼容的基本数据类型以供使用

ctypes 类型C 类型Python 类型
c_bool_Boolbool (1)
c_charchar单字符字节串对象
c_wcharwchar_t单字符字符串
c_bytecharint
c_ubyteunsigned charint
c_shortshortint
c_ushortunsigned shortint
c_intintint
c_uintunsigned intint
c_longlongint
c_ulongunsigned longint
c_longlong__int64 or long longint
c_ulonglongunsigned __int64 or unsigned long longint
c_size_tsize_tint
c_ssize_tssize_t or Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar* (NUL terminated)字节串对象或 None
c_wchar_pwchar_t* (NUL terminated)字符串或 None
c_void_pvoid*int 或 None
]]>
+ + + + + 技术 + + + + + + + Python + + C + + + +
+ + + + + 根据BV号爬取哔哩哔哩视频弹幕 + + /posts/e22de85.html + +

喜欢逛B站的同学都知道,B站的最有意思就是“弹幕”,视频的播放量和弹幕数量基本上是成正比的。分析一个视频最好的方法就是看弹幕的情况,今天闲得无聊写一个爬弹幕的程序玩玩,后面可以搭配一些其他库进行词频分析,我这就只写爬取弹幕的部分了…

所需依赖库

1
2
3
4
# 请求库
requests
# 解析库
pyquery

资源页

1
2
3
4
# 获取视频cid
https://api.bilibili.com/x/player/pagelist?bvid=BV号
# 具体弹幕列表页
https://comment.bilibili.com/cid号.xml

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 爬取哔哩哔哩BV号对应视频的弹幕
import requests
from pyquery import PyQuery as pq

def get_url_page(url):
header = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0",
"Cookie": ""
}
response = requests.get(url, headers=header)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response
return None

def get_cid(bv):
cid_url = f"https://api.bilibili.com/x/player/pagelist?bvid={bv}"
cid_page = get_url_page(cid_url).json()

return cid_page["data"][0]["cid"]

def main():
bv_str = input("input the BV:")
danmaku_url = f"https://comment.bilibili.com/{get_cid(bv_str)}.xml"
danmaku_page = get_url_page(danmaku_url)
doc = pq(bytes(danmaku_page.text, encoding="utf-8"))
danmakus = doc("d").items()
with open("danmaku_list.txt", "a", encoding="utf-8") as f:
for danmaku in danmakus:
f.write(f"{danmaku.text()}\n")

if __name__ == "__main__":
main()
]]>
+ + + + + 技术 + + + + + + + Python + + 爬虫 + + bilibili + + + +
+ + + + + 使用Python操作Docker + + /posts/56c3d658.html + +

在使用Selenium进行自动化测试的时候,为了到达能够简单部署的目的,可以直接选用selenium/standalone-chrome的官方Docker镜像来搭建服务,这样就可以不用考虑Webdriver和浏览器的版本适配问题。但是我每天需要进行自动化测试的时间只需要一小会儿,如果让selenium/standalone-chrome容器一直运行在后台,对我的1C2G的小服务器来说占用了太多资源。针对这个问题,Docker提供了SDK可以让Python程序在需要的时候启用容器,测试完成后再停止容器来节约服务器资源

docker库的基本配置

1
2
3
4
5
# docker库安装
sudo pip install docker
# 使用CPyhon解释器运行
import docker
# 如果没有报错就说明安装完成

docker库的常见用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 实例化
client = docker.from_env()

# 运行一个容器
client.containers.run('镜像名称', detach=True, **kwargs) # detach:后台运行 **kwargs:需要根据镜像所需的变量设置

# 创建一个容器但不运行
client.containers.create('镜像名称', detach=True, **kwargs) # 用法同.run

# 停止容器
container = client.containers.get('容器名称/容器ID')
container.stop()

# 启用容器
container = client.containers.get('容器名称/容器ID')
container.start()

# 查询容器并遍历相关信息
containers = client.containers.list(**kwargs) # 无参数:默认只显示正在运行的容器 all:显示所有容器
for container in containers:
print('容器ID:'+container.short_id)
print('容器名称:'+container.name)
print('容器状态:'+container.status)

需要注意的是,因为Docker的运行需要root权限,所以当在Python程序代码中添加操作Docker的相关功能后,Python程序也需要使用root权限运行

]]>
+ + + + + 技术 + + + + + + + 备忘 + + Python + + Docker + + + +
+ + + + + Selenium及Webdriver环境安装 + + /posts/9cf09888.html + +

Selenium是一个非常简单好用的WEB自动化工具,它可以模仿人类用户操作浏览器对网页进行自动化的测试,在实际使用中也能用于网络爬虫,以下内容是部署Python的Selenium基本测试环境教程

Selenium环境配置

1
2
3
4
5
# Selenium安装
pip install selenium
# 使用CPython解释器运行
import selenium
# 如果没有报错证明已经安装完成

浏览器和Webdriver安装配置

Selenium本身不含浏览器和Webdriver,其主要原理是模仿用户对浏览器进行操作,而浏览器本身和浏览器配套的Webdriver由浏览器厂商提供和维护。所以使用Selenium需要在电脑上安装浏览器环境,这里以谷歌Chrome浏览器为例

  • Chrome浏览器安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 更新软件包
    sudo apt update
    # 下载Chorme浏览器
    # Ubuntu
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    # AlmaLinux
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
    # 安装浏览器(安装需root权限)
    # Ubuntu
    sudo apt install ./google-chrome-stable_current_amd64.deb
    # AlmaLinux
    sudo dnf install google-chrome-stable_current_x86_64.rpm
    # 检查安装成功
    google-chrome --version
    输出:Google Chrome 104.0.5112.101
  • Webdriver安装
    https://registry.npmmirror.com/binary.html?path=chromedriver/网站中选取与浏览器版本对应版本和系统的Webdriver,这里以Linux的104.0.5112.79版本的为例
    1
    2
    3
    4
    5
    6
    7
    8
    # 下载Webdriver
    wget https://registry.npmmirror.com/-/binary/chromedriver/104.0.5112.79/chromedriver_linux64.zip
    # 解压文件
    unzip chromedriver_linux64.zip
    # 配置Webdriver
    sudo mv -f chromedriver /usr/local/share/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

环境完成检查

使用以下Python代码测试Selenium自动化测试环境是否部署完成

1
2
3
4
5
6
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.close()
# 如果正常的话,浏览器会自动打开百度网站然后浏览器关闭
]]>
+ + + + + 技术 + + + + + + + 环境配置 + + 备忘 + + Python + + Selenium + + + +
+ + + + + 将Vim配置为Rust的简易IDE + + /posts/fcf74e02.html + + 所需Vim插件
1
2
3
4
5
6
7
8
# vim-plug
库地址: https://github.com/junegunn/vim-plug

# rust.vim
库地址: https://github.com/rust-lang/rust.vim

# coc.nvim
库地址: https://github.com/neoclide/coc.nvim

安装教程

此处安装环境以AlmaLinux9为例

在安装这类工具时,应当注意插件所需Vim的版本,如果Vim的版本太低可能无法安装

vim-plug安装

1
2
3
# 下载源代码
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

添加rust.vim和coc.nvim的配置到~/.vimrc文件

最终编辑好的~/.vimrc文件应该是下面这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
" vim-plug setup
call plug#begin('~/.vim/plugged')

Plug 'rust-lang/rust.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}

call plug#end()

" rust.vim setup
syntax enable
filetype plugin indent on
let g:rustfmt_autosave = 1

" coc.nvim setup
set updatetime=100

inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

autocmd CursorHold * silent call CocActionAsync('highlight')

Vim插件安装

Vim控制台输入

1
:PlugInstall

coc-rust-analyzer安装

等待rust.vim和coc.nvim安装完成后,在Vim控制台输入

1
:CocInstall coc-rust-analyzer

配置coc-settings.json文件

在Vim控制台输入命令来编辑coc-settings.json

1
:CocConfig

写入以下内容

1
2
3
4
{
"suggest.noselect": true,
"suggest.enablePreselect": false
}

coc.nvim需要Node.js才能正常运行,所以在使用时应检查是否安装了Node.js且其版本也应满足要求。在AlmaLinux下使用sudo dnf install nodejs安装Node.js

可能的问题

下载失败

因为众所周知的网络原因,在国内下载安装插件时可能会出现无法成功下载的情况,这时需要多次尝试下载或使用代理下载

启动rust-analyzer

进入cargo项目时,coc.nvim会提示需下载rust-analyzer,根据提示选择即可

~/.vimrc文件配置

顺便记录一下自己的~/.vimrc文件内容,以便今后重新配置的时候使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
" init setup
set nu
set ts=4
set expandtab
set listchars=tab:>-,trail:.
set list
set backspace=2

" vim-plug setup
call plug#begin('~/.vim/plugged')

Plug 'rust-lang/rust.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'preservim/nerdtree'
Plug 'vim-airline/vim-airline'
Plug 'morhetz/gruvbox'

call plug#end()

" rust.vim setup
syntax enable
filetype plugin indent on
let g:rustfmt_autosave = 1

" coc.nvim setup
set updatetime=100

inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

nmap <silent> <C-q> <Plug>(coc-diagnostic-prev)
nmap <silent> <C-a> <Plug>(coc-diagnostic-next)

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

autocmd CursorHold * silent call CocActionAsync('highlight')

" nerdtree setup
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

" airline setup
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline_powerline_fonts = 1

" theme setup
set background=dark
colorscheme gruvbox
]]>
+ + + + + 技术 + + + + + + + 环境配置 + + 备忘 + + Vim + + + +
+ + + + + Vim的编译安装及使用入门 + + /posts/58ea93b5.html + +

Vim文本编辑器,是由Vi发展演变过来的文本编辑器,因其具有使用简单、功能强大等特点,是Linux 众多发行版的默认文本编辑器。如果你喜欢,你甚至可以把它配置成一个IDE

编译安装

此处安装环境以AlmaLinux9为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编译环境安装
sudo dnf install git gcc ncurses-devel -y
# 克隆源代码
git clone https://github.com/vim/vim.git
# 编译安装(逐步执行)
cd vim/
./configure
make -j8
sudo make install
cd src
./vim
# 替换原有版本
sudo dnf remove vim -y
sudo rm /usr/bin/vim
sudo cp ./vim /usr/bin/

简单使用入门

跳转操作

1
2
3
4
5
6
7
8
9
10
11
12
13
上:k    下:j    左:h    右:l

滚动翻页:Ctrl+e 向下翻页:Ctrl+f 向上翻页:Ctrl+b 向下半页:Ctrl+d 向上半页:Ctrl+u

跳转至下一个单词或标点首位:w 跳转至下一个单词或标点末位:e
跳转至上一个单词或标点首位:b
跳转至行首:0 跳转至行尾:$ 跳转至本行第一个非空字符:^
跳转至文首:gg 跳转至文尾:G
跳转至n行:ngg/nG/:n

寻找光标所在行的x字符:fx 重复上一个f指令:;

向上寻找光标位置单词:* 向下寻找光标位置单词:#

复制操作、删除操作

1
2
3
4
5
6
7
8
删除光标所在行:dd    删除光标至行尾(不包括回车):d$    删除光标所在单词:dw
删除n行到xn行::n,xnd

复制光标所在行:yy 复制光标至行尾(不包括回车):y$ 复制光标及以下n行:nyy

粘贴剪切板内容部至光标后:p 粘贴剪切板内容部至光标前:P

撤销操作:u 前进操作:Ctrl+r

插入模式

1
2
3
在当前光标处插入:i    在当前光标后插入:a
在当前行首处插入:I 在当前行末处插入:A
在当前行下下新增一行:o 在当前行上新增一行:O

查找替换操作

1
2
向后搜索字符串:/字符串    向前搜索字符串:?字符串
匹配下一个搜索字符串:n 匹配上一个搜索字符串:N

保存退出操作

1
2
3
保存::w
退出::q 强制退出(放弃修改)::q!
保存并退出::wq/:x
]]>
+ + + + + 技术 + + + + + + + 备忘 + + Vim + + + +
+ + + + + AlmaLinux初上手 + + /posts/f793f9ae.html + + 前言

随着CentOS转为RHEL的上游滚动发行版,原CentOS的生态位出现了空缺,而目前CentOS的替代产品主要有AlmaLinuxRockyLinux。本人是Debian系的长期用户,对RedHat系不太熟悉,所以写这篇博客记录下AlmaLinux9的初始配置,以便后续查阅

具体配置

安装EPEL软件源

1
sudo dnf install epel-release

Rust环境配置

1
2
# Rust安装脚本
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Docker配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 卸载podman
sudo dnf remove podman buidah

# docker安装
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
# 设置开机启动
sudo systemctl start docker.service
sudo systemctl enable docker.service
# 安装完成检测
sudo systemctl status docker
# 显示active(running),则说明docker安装完成

# 配置docker国内镜像库
依次操作:前往阿里云容器镜像服务网站[https://cr.console.aliyun.com] -> 登录阿里云 -> 选择镜像工具 -> 选择镜像加速器 -> 复制加速器地址
# 进入目录
cd /etc/docker/
sudo vi daemon.json
# 粘贴以下代码
{
"registry-mirrors": ["加速器地址"]
}
# 重启docker让镜像配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看镜像配置是否生效
sudo docker info

防火墙相关操作

1
2
3
4
5
6
7
8
9
10
# 查看状态
sudo systemctl status firewalld
# 启动
sudo systemctl start firewalld
# 关闭
sudo systemctl stop firewalld
# 开机启用
sudo systemctl enable firewalld
# 开机禁用
sudo systemctl disable firewalld

创建、删除用户

1
2
3
4
5
6
7
8
9
10
11
12
# 新建用户
sudo adduser 用户名
# 配置用户密码
sudo passwd 用户名

# 赋予用户sudo权限
sudo usermod -aG wheel 用户名

# 删除用户但保留用户文件夹
sudo userdel 用户名
# 删除用户及用户文件夹
sudo userdel -r 用户名
]]>
+ + + + + 技术 + + + + + + + Linux + + 环境配置 + + 备忘 + + + +
+ + + + + Ubuntu初始配置 + + /posts/18d22756.html + + 更换国内镜像源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 进入目录
cd /etc/apt

# 备份原文件
sudo cp sources.list sources.list.bk
sudo vi sources.list

# 删除原来的文本,将下面的代码复制进去(以Ubuntu20.04阿里源为例)
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

软件源的选用需要根据系统的版本进行选择,否则可能会出现错误

Docker配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装docker
sudo apt update
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# docker安装完成检测
sudo systemctl status docker
# 显示active(running),则说明docker安装完成

# 配置docker国内镜像库
依次操作:前往阿里云容器镜像服务网站[https://cr.console.aliyun.com] -> 登录阿里云 -> 选择镜像工具 -> 选择镜像加速器 -> 复制加速器地址
# 进入目录
cd /etc/docker/
sudo nano daemon.json
# 粘贴以下代码
{
"registry-mirrors":["加速器地址"]
}
# 重启docker让镜像配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看镜像配置是否生效
sudo docker info

卸载Snap

1
2
sudo apt update
sudo apt autoremove --purge snapd

配置swappiness

1
2
3
4
5
6
7
8
# 参看当前swappiness的值
cat /proc/sys/vm/swappiness

# 临时修改(重启后失效)
sudo sysctl vm.swappiness=10

# 永久修改
在/etc/sysctl.conf文件中添加vm.swappiness=10后重启系统

LVM扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看磁盘占用
df -h
# 查看物理实际磁盘空间
lsblk
# 如果上面两个命令显示的磁盘大小明显不一致,说明系统没有挂载所有的磁盘空间

# 查看LVM与实际磁盘区别
sudo lvdisplay
# 查看物理磁盘
sudo vgdisplay

# 扩展LVM文件(/dev/mapper/ubuntu--vg-ubuntu--lv)
sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
# 重新计算磁盘容量
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建一个用户
sudo adduser 用户名

# 赋予用户sudo权限
sudo usermod -a -G sudo 用户名

# 删除用户但保留用户文件夹
sudo userdel 用户名
# 删除用户及用户文件夹
sudo userdel -r 用户名

# 查看系统中的用户
sudo cat /etc/passwd
# 查看用户密码
sudo cat /etc/shadow # 用户密码是以加密的形式储存的,如:$6$Gj81xm...

设置时区

1
2
3
4
5
6
# 查看本机时间
date
# 查看时区目录
timedatectl list-timezones
# 设置时区,如北京时间
timedatectl set-timezone Asia/Shanghai
]]>
+ + + + + 技术 + + + + + + + Linux + + 环境配置 + + 备忘 + + + +
+ + + + + Requests库常见用法 + + /posts/5c9a9528.html + +

在使用Python的urllib库进行爬虫操作时非常繁琐,比如处理网页验证和Cookies时,需要编写Opener和Handler来处理。为了更加方便的实现这些操作,就有了更为强大的Requests库。Requests库是一个网页请求库,是基于urllib和urllib3封装的网络请求库,是目前公认的爬取网页最好的库,代码非常简洁,甚至一行代码就能爬取到网页

Requests环境配置

1
2
3
4
5
# requests库安装
pip install requests
# 使用CPython解释器运行
import requests
# 如果没有报错证明已经安装完成

Requests使用

requests.get

语法:requests.get(url, params=None, **kwargs)

1
2
3
4
实例
response = requests.get('www.baidu.com')
print(response.status_code)
输出:200
属性说明
.status_codeHTTP请求返回的请求码
.encoding从HTTP Header中推测出的网页编码
.apparent_encoding从内容中分析出的网页编码
.textHTTP响应内容的字符串形式,网页源代码
.contentHTTP响应内容的二进制形式
.json()对响应的内容进行json解析
.urlget请求目标url
.headers响应头中的相关信息
.request.headers请求头中的相关信息
.cookies请求头中的cookie
.history获取所有重定向的记录
  • headers参数
    一般使用中,为了避免目标网站发现爬虫程序,一般会在请求头中设置User-Agent来让爬虫程序伪装成浏览器

    1
    2
    3
    4
    5
    6
    header = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0'
    }
    response = requests.get('www.baidu.com', headers=header)
    print(response.status_code)
    输出:200
  • params参数
    Requests在请求中允许使用params关键字参数,以一个字符串字典来提供这些参数。在发起请求的时候,程序会自动地将字典里的参数拼接到URL后

    1
    2
    3
    4
    param = {'q': 'python'}
    response = requests.get('https://search.gitee.com/', params=param)
    print(response.url)
    输出:https://search.gitee.com/?q=python
  • timeout参数
    在爬虫中,如果没有timeout,代码可能会挂起很长时间,这个时候我们可以对请求设置timeout,让它必须在特定的时间内返回结果,否则就抛出异常

    1
    2
    3
    4
    # timeout可以传入浮点数将作为连接、读取的超时总时间
    response = requests.get('https://www.baidu.com/', timeout=0.05)
    print(response.status_code)
    输出:requests.exceptions.ConnectTimeout
    1
    2
    3
    4
    # timeout也可以传入元组将分别作为连接、读取的超时时间
    response = requests.get('https://www.baidu.com/', timeout=(0.5, 0.01))
    print(response.status_code)
    输出:requests.exceptions.ReadTimeout
  • proxies参数
    有时,在短时间内同一ip多次访问目标URL的时候会触发网站的反爬机制,这时可以通过在发起请求时设置代理来进行规避

    1
    2
    3
    response = requests.get('http://myip.ipip.net/')
    print(response.text)
    输出:当前 IP:111.111.111.111 来自于:日本 东京 KDDI
    1
    2
    3
    4
    proxy = {'http': 'http://183.89.147.172:8080'}
    response = requests.get('http://myip.ipip.net/', proxies=proxy)
    print(response.text)
    输出:当前 IP:183.89.147.172 来自于:泰国 曼谷 3bb.co.th
  • verify参数
    Requests在发送网络请求的时候,默认会验证网站的CA证书。如果当前网站没有CA证书,那么就出现SSLError错误,我们可以用verify关键字参数,在请求的时候不验证网站的CA证书

    添加verify=False会出现InsecureRequestWarning警告,但是不会影响后续代码的执行

    1
    2
    3
    response = requests.get('http://data.stats.gov.cn', verify=False)
    print(response.status_code)
    输出:200

    未完待续…

]]>
+ + + + + 技术 + + + + + + + 备忘 + + Python + + 爬虫 + + + +
+ + + + + + + + 分类 + + /categories/index.html + + + + + + + + + 链接 + + /link/index.html + + + + + + + + + 标签 + + /tags/index.html + + + + + + + + diff --git a/tags/C/index.html b/tags/C/index.html new file mode 100644 index 000000000..df13ce455 --- /dev/null +++ b/tags/C/index.html @@ -0,0 +1,176 @@ +标签: C | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Docker/index.html b/tags/Docker/index.html new file mode 100644 index 000000000..ec562c592 --- /dev/null +++ b/tags/Docker/index.html @@ -0,0 +1,176 @@ +标签: Docker | 无眠呓语
标签 - Docker
2022
使用Python操作Docker
使用Python操作Docker
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Linux/index.html b/tags/Linux/index.html new file mode 100644 index 000000000..c63f66bbb --- /dev/null +++ b/tags/Linux/index.html @@ -0,0 +1,176 @@ +标签: Linux | 无眠呓语
标签 - Linux
2022
AlmaLinux初上手
AlmaLinux初上手
Ubuntu初始配置
Ubuntu初始配置
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Podman/index.html b/tags/Podman/index.html new file mode 100644 index 000000000..add280c1d --- /dev/null +++ b/tags/Podman/index.html @@ -0,0 +1,176 @@ +标签: Podman | 无眠呓语
标签 - Podman
2023
使用Podman构建Rust项目
使用Podman构建Rust项目
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Python/index.html b/tags/Python/index.html new file mode 100644 index 000000000..a6e0b7fb4 --- /dev/null +++ b/tags/Python/index.html @@ -0,0 +1,176 @@ +标签: Python | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Rust/index.html b/tags/Rust/index.html new file mode 100644 index 000000000..44359d2f8 --- /dev/null +++ b/tags/Rust/index.html @@ -0,0 +1,176 @@ +标签: Rust | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..6a188ed6e --- /dev/null +++ "b/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/index.html" @@ -0,0 +1,176 @@ +标签: Rust学习笔记 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/page/2/index.html" "b/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/page/2/index.html" new file mode 100644 index 000000000..ecd6c6d72 --- /dev/null +++ "b/tags/Rust\345\255\246\344\271\240\347\254\224\350\256\260/page/2/index.html" @@ -0,0 +1,176 @@ +标签: Rust学习笔记 | 无眠呓语
标签 - Rust学习笔记
2023
Rust学习笔记:引用与借用
Rust学习笔记:引用与借用
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Selenium/index.html b/tags/Selenium/index.html new file mode 100644 index 000000000..6d7858bf8 --- /dev/null +++ b/tags/Selenium/index.html @@ -0,0 +1,176 @@ +标签: Selenium | 无眠呓语
标签 - Selenium
2022
Selenium及Webdriver环境安装
Selenium及Webdriver环境安装
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/Vim/index.html b/tags/Vim/index.html new file mode 100644 index 000000000..6fbe3f2a1 --- /dev/null +++ b/tags/Vim/index.html @@ -0,0 +1,176 @@ +标签: Vim | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/asyncio/index.html b/tags/asyncio/index.html new file mode 100644 index 000000000..3aec4eaf9 --- /dev/null +++ b/tags/asyncio/index.html @@ -0,0 +1,176 @@ +标签: asyncio | 无眠呓语
标签 - asyncio
2023
对asyncio的一点理解
对asyncio的一点理解
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/bilibili/index.html b/tags/bilibili/index.html new file mode 100644 index 000000000..b4abe7371 --- /dev/null +++ b/tags/bilibili/index.html @@ -0,0 +1,176 @@ +标签: bilibili | 无眠呓语
标签 - bilibili
2022
根据BV号爬取哔哩哔哩视频弹幕
根据BV号爬取哔哩哔哩视频弹幕
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..a597fd644 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,176 @@ +标签 | 无眠呓语
\ No newline at end of file diff --git "a/tags/\345\244\207\345\277\230/index.html" "b/tags/\345\244\207\345\277\230/index.html" new file mode 100644 index 000000000..f99cbc508 --- /dev/null +++ "b/tags/\345\244\207\345\277\230/index.html" @@ -0,0 +1,176 @@ +标签: 备忘 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/tags/\345\274\202\346\255\245\347\274\226\347\250\213/index.html" "b/tags/\345\274\202\346\255\245\347\274\226\347\250\213/index.html" new file mode 100644 index 000000000..3e77829fc --- /dev/null +++ "b/tags/\345\274\202\346\255\245\347\274\226\347\250\213/index.html" @@ -0,0 +1,176 @@ +标签: 异步编程 | 无眠呓语
标签 - 异步编程
2023
对asyncio的一点理解
对asyncio的一点理解
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/tags/\347\210\254\350\231\253/index.html" "b/tags/\347\210\254\350\231\253/index.html" new file mode 100644 index 000000000..c825faeb6 --- /dev/null +++ "b/tags/\347\210\254\350\231\253/index.html" @@ -0,0 +1,176 @@ +标签: 爬虫 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file diff --git "a/tags/\347\216\257\345\242\203\351\205\215\347\275\256/index.html" "b/tags/\347\216\257\345\242\203\351\205\215\347\275\256/index.html" new file mode 100644 index 000000000..432f49135 --- /dev/null +++ "b/tags/\347\216\257\345\242\203\351\205\215\347\275\256/index.html" @@ -0,0 +1,176 @@ +标签: 环境配置 | 无眠呓语
公告
欢迎━(*`∀´*)ノ亻!
最新文章
网站资讯
文章数目 :
23
最后更新时间 :
\ No newline at end of file