├── CNAME ├── img ├── bg.jpg ├── bg.webp ├── 404-bg.jpg ├── favicon.ico ├── home-bg.jpg ├── about-bg.jpg ├── home-bg.webp ├── my │ ├── ypingcn.png │ └── ypingcn.webp ├── home-bg-Sm5ceH.jpg ├── home-bg-z2XLF8.jpg ├── home-bg-Sm5ceH.webp ├── home-bg-z2XLF8.webp ├── travelling-logo.gif ├── post │ ├── git-flow-main.png │ ├── 20211121-search-ublock.jpg │ ├── 20211205-dev-branch-release-main.png │ ├── 20211205-dev-main-release-main.png │ ├── 20230101-45b4e9085db1f6fe441f6c9604445601.jpg │ └── 20230101-ad5db8dd043df6904fb7eed16fdcbd56.jpg └── special │ ├── firefox │ ├── floorp.png │ ├── librewolf.png │ ├── firefox-trains.png │ ├── firefox-clearurls.png │ ├── firefox-gesturefy.png │ ├── firefox-nightly-about.png │ ├── firefox-ublock-origin.png │ ├── firefox-release-calendar.png │ ├── Fx-Browser-icon-fullColor-128.png │ ├── firefox-multi-account-containers.png │ ├── Fx-Browser-Beta-icon-fullColor-128.png │ ├── firefox-all-version-download-option.png │ ├── Fx-Browser-Nightly-icon-fullColor-128.png │ └── Fx-Browser-Developer-icon-fullColor-128.png │ └── fund │ └── china-fund-scale-1998-2021.jpg ├── favicon.ico ├── pwa ├── icons │ └── 128.png └── manifest.json ├── .gitignore ├── fonts ├── fontawesome-webfont.eot ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff ├── fontawesome-webfont.woff2 ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── about.html ├── less ├── variables.less ├── sidebar.less ├── mixins.less └── side-catalog.less ├── _layouts └── default.html ├── wiki ├── guestbook.md ├── affiliate.md ├── privacy.md ├── lctt.md └── index.md ├── robots.txt ├── notes ├── Linux │ ├── xargs.md │ ├── awk.md │ ├── sed.md │ └── find.md ├── C │ ├── apue9-process-relationship.md │ ├── apue7-process-environment.md │ ├── apue3-file-IO.md │ └── apue11-thread.md ├── Snippet │ ├── bin2hex.md │ ├── unique-ptr.md │ ├── shared-ptr.md │ └── union-find.md ├── sitemap.xml ├── Git │ ├── git-flow.md │ └── basic.md ├── Python │ ├── requests.md │ └── django-models.md ├── Cpp │ ├── function-bind.md │ └── gdb.md ├── Redis │ └── redis-in-cpp.md ├── Vim │ └── config.md ├── index-generate.py ├── Markdown │ └── basic.md ├── Https │ └── LetsEncrypt.md └── SQL │ └── syntax.md ├── _posts ├── 2016-04-01-hello-github-page.markdown ├── 2016-09-30-ssh-related-usage.markdown ├── 2018-01-28-annual-summary-2017.markdown ├── 2016-04-06-interesting-code-in-MATLAB-class.markdown ├── 2016-12-06-wps-catalogue-generate.markdown ├── 2018-03-18-spring-recruitment-2018.markdown ├── 2024-11-17-artificial-intelligence-for-work.markdown ├── 2016-11-30-nodeppt.markdown ├── 2022-10-24-seven-up.md ├── 2023-05-02-podcast.markdown ├── 2023-09-09-designing-data-intensive-applications.markdown ├── 2016-04-01-thanks.markdown ├── 2022-01-30-cache-in-microservice.markdown ├── 2017-11-21-firefox-quantum-and-related-discussion.markdown ├── 2023-01-01-annual-summary-2022.markdown ├── 2017-09-20-a-woman-like-me.markdown ├── 2016-04-04-how-to-use-jekyll-to-build-a-blog.markdown ├── 2020-10-23-investment-service.markdown ├── 2022-07-28-user-permission-service.md ├── 2019-01-27-the-south.markdown ├── 2022-06-02-promote-personal-blog.md ├── 2022-11-13-short-url-for-static-page.markdown ├── 2021-11-21-effective-search.markdown ├── 2023-12-31-implementation-linkmic-pk-voiceroom.markdown ├── 2022-10-14-user-attribute-service.md └── 2022-12-04-retirement-pension-plan.markdown ├── special ├── sitemap.xml ├── song │ ├── index.md │ ├── iu-the-forgotten-season.md │ ├── jukjae-lullaby.md │ ├── joy-introduce-me-a-good-person.md │ ├── iu-drama.md │ ├── janabi-a-thought-on-an-autumn-night.md │ ├── d.ear-december-24th.md │ ├── iu-your-meaning.md │ ├── jannabi-for-lover-who-hesitate.md │ ├── jannabi-november-rain.md │ └── iu-suga-eight.md └── firefox │ ├── zen.md │ ├── waterfox.md │ ├── index.md │ ├── floorp.md │ ├── trains.md │ ├── theme.md │ ├── website.md │ ├── librewolf.md │ ├── version.md │ ├── edition-faq.md │ └── mercury.md ├── js ├── hux-blog.min.js ├── jquery.tagcloud.js ├── hux-blog.js └── animatescroll.min.js ├── package.json ├── 404.html ├── offline.html ├── feed.xml ├── index.html ├── _config.yml ├── sitemap.xml ├── Gruntfile.js ├── tags.html ├── css └── syntax.css └── _includes └── nav.html /CNAME: -------------------------------------------------------------------------------- 1 | blog.ypingcn.com -------------------------------------------------------------------------------- /img/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/bg.jpg -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/favicon.ico -------------------------------------------------------------------------------- /img/bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/bg.webp -------------------------------------------------------------------------------- /img/404-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/404-bg.jpg -------------------------------------------------------------------------------- /img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/favicon.ico -------------------------------------------------------------------------------- /img/home-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg.jpg -------------------------------------------------------------------------------- /img/about-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/about-bg.jpg -------------------------------------------------------------------------------- /img/home-bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg.webp -------------------------------------------------------------------------------- /pwa/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/pwa/icons/128.png -------------------------------------------------------------------------------- /img/my/ypingcn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/my/ypingcn.png -------------------------------------------------------------------------------- /img/my/ypingcn.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/my/ypingcn.webp -------------------------------------------------------------------------------- /img/home-bg-Sm5ceH.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg-Sm5ceH.jpg -------------------------------------------------------------------------------- /img/home-bg-z2XLF8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg-z2XLF8.jpg -------------------------------------------------------------------------------- /img/home-bg-Sm5ceH.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg-Sm5ceH.webp -------------------------------------------------------------------------------- /img/home-bg-z2XLF8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/home-bg-z2XLF8.webp -------------------------------------------------------------------------------- /img/travelling-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/travelling-logo.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | node_modules 3 | .sass-cache 4 | .jekyll-cache 5 | .jekyll-metadate 6 | package-lock.json 7 | -------------------------------------------------------------------------------- /img/post/git-flow-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/git-flow-main.png -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /img/special/firefox/floorp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/floorp.png -------------------------------------------------------------------------------- /about.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /img/post/20211121-search-ublock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/20211121-search-ublock.jpg -------------------------------------------------------------------------------- /img/special/firefox/librewolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/librewolf.png -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /img/special/firefox/firefox-trains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-trains.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-clearurls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-clearurls.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-gesturefy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-gesturefy.png -------------------------------------------------------------------------------- /img/post/20211205-dev-branch-release-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/20211205-dev-branch-release-main.png -------------------------------------------------------------------------------- /img/post/20211205-dev-main-release-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/20211205-dev-main-release-main.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-nightly-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-nightly-about.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-ublock-origin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-ublock-origin.png -------------------------------------------------------------------------------- /img/special/fund/china-fund-scale-1998-2021.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/fund/china-fund-scale-1998-2021.jpg -------------------------------------------------------------------------------- /img/special/firefox/firefox-release-calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-release-calendar.png -------------------------------------------------------------------------------- /img/post/20230101-45b4e9085db1f6fe441f6c9604445601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/20230101-45b4e9085db1f6fe441f6c9604445601.jpg -------------------------------------------------------------------------------- /img/post/20230101-ad5db8dd043df6904fb7eed16fdcbd56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/post/20230101-ad5db8dd043df6904fb7eed16fdcbd56.jpg -------------------------------------------------------------------------------- /img/special/firefox/Fx-Browser-icon-fullColor-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/Fx-Browser-icon-fullColor-128.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-multi-account-containers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-multi-account-containers.png -------------------------------------------------------------------------------- /img/special/firefox/Fx-Browser-Beta-icon-fullColor-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/Fx-Browser-Beta-icon-fullColor-128.png -------------------------------------------------------------------------------- /img/special/firefox/firefox-all-version-download-option.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/firefox-all-version-download-option.png -------------------------------------------------------------------------------- /img/special/firefox/Fx-Browser-Nightly-icon-fullColor-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/Fx-Browser-Nightly-icon-fullColor-128.png -------------------------------------------------------------------------------- /img/special/firefox/Fx-Browser-Developer-icon-fullColor-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ypingcn/ypingcn.github.io/master/img/special/firefox/Fx-Browser-Developer-icon-fullColor-128.png -------------------------------------------------------------------------------- /less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | @brand-primary: #0085A1; 4 | @gray-dark: lighten(black, 25%); 5 | @gray: lighten(black, 50%); 6 | @gray-l: lighten(black, 75%); 7 | @white-faded: fade(white, 80%); 8 | @gray-light: #eee; 9 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | 6 | {% include nav.html %} 7 | {{ content }} 8 | {% include footer.html %} 9 | 10 | 11 | -------------------------------------------------------------------------------- /wiki/guestbook.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 留言 4 | update: 2022-11-11 00:00 +0800 5 | not_show_copyright: true 6 | not_show_ad: true 7 | --- 8 | 9 | 来者皆是客。欢迎! 10 | 11 | 由于多说、网易云跟帖等服务的相继关闭,无法维护本页面下的留言功能,请您留意本页面右侧 [ABOUT ME] 或者顶部 [关于] 栏目的信息更新。 12 | 13 | 后续暂无维护本页面留言功能的计划。抱歉。 14 | -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: robots.txt 4 | --- 5 | User-agent: * 6 | Disallow: /files/ 7 | Disallow: /img/my/ 8 | Disallow: /cdn-cgi/ 9 | Sitemap: {{ site.url }}/sitemap.xml 10 | Sitemap: {{ site.url }}/notes/sitemap.xml 11 | Sitemap: {{ site.url }}/special/sitemap.xml 12 | -------------------------------------------------------------------------------- /pwa/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Main()", 3 | "short_name": "Main()", 4 | "description": "A personal blog powered by hux's opensource code", 5 | "icons": [{ 6 | "src": "icons/128.png", 7 | "sizes": "128x128", 8 | "type": "image/png" 9 | }], 10 | "background_color": "#fff", 11 | "theme_color": "#000", 12 | "start_url": "/", 13 | "display": "standalone", 14 | "orientation": "portrait" 15 | } 16 | -------------------------------------------------------------------------------- /notes/Linux/xargs.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Linux 命令 - xargs 4 | update: 2018-03-25 00:05 +0800 5 | --- 6 | 7 | ## 基本 8 | 9 | xargs [option] 10 | 11 | ## 例子 12 | 13 | > cat example.txt | xargs 14 | 15 | 多行输入单行输出 16 | 17 | > cat example.txt | xargs -n3 18 | 19 | 多行输入多行输出 20 | 21 | > echo "test/test/test" | xargs -d/ 22 | > test test test 23 | 24 | 自定义分隔符 25 | 26 | > find -mtime -7 | xargs -I {} cp {} ~/test 27 | 28 | 自定义替换符号(把七天内修改的文件复制到 ~/test 里) 29 | 30 | -------------------------------------------------------------------------------- /notes/C/apue9-process-relationship.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 第九章 进程关系 4 | update: 2017-09-25 20:18 +0800 5 | --- 6 | 7 | ```cpp 8 | #include21 | 22 | 23 | 24 | 25 |
26 |20 | 21 | 22 | 23 | 24 |
25 |
22 |
23 |
19 |
20 |
51 |
52 |
12 |
13 | 如图所示,截止 2025 年 11 月 13 日,不同渠道最新版本如下(不同渠道的设计和区别详见 《Firefox 火狐浏览器各版本区别》)
14 |
15 | ESR 长期支持版:```140```
16 |
17 | Release 正式版:```145```
18 |
19 | Beta 测试版:```146```
20 |
21 | Nightly 每夜开发版:```147```
22 |
23 | ### 一、不同渠道的介绍
24 |
25 | 按主页所示,Firefox Trains 可以查询当前四个不同渠道的发布信息,它们分别是:
26 |
27 | ESR 长期支持版
28 |
29 | Release 正式版
30 |
31 | Beta 测试版
32 |
33 | Nightly 每夜开发版
34 |
35 | 点击访问对应版本的链接,可以了解到不同版本当前最新的开发测试进度(Milestones)和灰度发布的比例,还有很多其他信息可供各位探索!
36 |
37 | ### 二、不同版本的发布情况和发布日志
38 |
39 | Firefox Trains 提供了一个页面查询版本号对应的发布日期、对应的问题修复数和发布日志,如 113 版本如下
40 |
41 | https://whattrainisitnow.com/release/?version=113
42 |
43 | 如果对其他版本有兴趣了解查询的话,可以把地址栏中```113```的数字换成其他任意感兴趣的版本,即可快捷查询~
44 |
45 | ### 三、火狐浏览器发布计划(Firefox Release Calendar)
46 |
47 | Firefox Release Calendar 是 Firefox Trains 中的一个展示后续版本发布计划的页面。
48 |
49 |
50 |
51 | ```Version```是对应的大版本,每一个Q(Quarter,意为季度)都会有3-4个大版本的发布。
52 |
53 | ```Matching ESR```则是对应的ESR版本号,因为长期支持版的更新周期比较长,所以ESR的大版本号更新比较慢。
54 |
55 | ```Nightly starts```则是从该项对应的日期开始开发新版本,每天的改动都会出现在 Nightly 每夜开发版中,感兴趣可自行下载尝试。
56 |
57 | ```Soft code freeze```意味着该版本的功能开发已经基本完成不会再添加新功能。
58 |
59 | ```Beta starts```则是对应的测试版更新时间。
60 |
61 | ```Release day```对应着该版本正式发布稳定版的时间。
62 |
63 |
64 |
--------------------------------------------------------------------------------
/_posts/2017-09-20-a-woman-like-me.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "续写 《像我这样的一个女子》"
4 | subtitle: "A woman like me"
5 | description: "选修课作业,续写 西西的作品《像我这样的一个女子》"
6 | date: 2017-09-20 +0800
7 | update: 2022-01-08 17:55 +0800
8 | author: "ypingcn"
9 | header-img: "img/home-bg-Sm5ceH.webp"
10 | header-mask: 0.3
11 | catalog: false
12 | tags:
13 | - 文学
14 | ---
15 |
16 | > 这是之前选修课上要求续写的内容,今天在自己电脑上找到当初的文件,就发出来了。个人觉得并不是写得太好,只是在对原文只是浅显理解的基础上续写的,而且结尾收得有点快。
17 |
18 | > 2021.10.31 原发于简书,博客迁移后简书链接已经删除失效。本博客为最后一份记录
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 | 他拉我的手,离开房间并掩上房间门,紧紧地抱住了我。能互相理解,不隐瞒,才能有真的刚强、坚韧的爱吧。
--------------------------------------------------------------------------------
/sitemap.xml:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | 《现在 Linux 运行在 99.6% 的 TOP500 超级计算机上》
22 |《把SQL Server 迁移到Linux?不如换成MySQL》
23 |《如何在Ubuntu 16.10 的Unity 8 上运行老式Xorg 程序》
24 | 25 | 26 | 27 | 28 | 29 | 30 |《Hugo 对比 Jekyll :两大领先的静态页面生成器之间的比较 》
31 | 32 | 33 |《如何在 Linux 上使用 tcpdump 命令捕获和分析数据包 》
34 | 35 | 36 | 37 | ———————— 38 | 39 | 内容可能有时间延迟,欢迎访问以下链接获取最新信息 40 | 41 |ypingcn - Linux 中国翻译组(LCTT)- Linux.中国 - 开源社区
42 | -------------------------------------------------------------------------------- /js/jquery.tagcloud.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.fn.tagcloud = function(options) { 4 | var opts = $.extend({}, $.fn.tagcloud.defaults, options); 5 | tagWeights = this.map(function(){ 6 | return $(this).attr("rel"); 7 | }); 8 | tagWeights = jQuery.makeArray(tagWeights).sort(compareWeights); 9 | lowest = tagWeights[0]; 10 | highest = tagWeights.pop(); 11 | range = highest - lowest; 12 | if(range === 0) {range = 1;} 13 | // Sizes 14 | if (opts.size) { 15 | fontIncr = (opts.size.end - opts.size.start)/range; 16 | } 17 | // Colors 18 | if (opts.color) { 19 | colorIncr = colorIncrement (opts.color, range); 20 | } 21 | return this.each(function() { 22 | weighting = $(this).attr("rel") - lowest; 23 | if (opts.size) { 24 | $(this).css({"font-size": opts.size.start + (weighting * fontIncr) + opts.size.unit}); 25 | } 26 | if (opts.color) { 27 | // change color to background-color 28 | $(this).css({"backgroundColor": tagColor(opts.color, colorIncr, weighting)}); 29 | } 30 | }); 31 | }; 32 | 33 | $.fn.tagcloud.defaults = { 34 | size: {start: 14, end: 18, unit: "pt"} 35 | }; 36 | 37 | // Converts hex to an RGB array 38 | function toRGB (code) { 39 | if (code.length == 4) { 40 | code = jQuery.map(/\w+/.exec(code), function(el) {return el + el; }).join(""); 41 | } 42 | hex = /(\w{2})(\w{2})(\w{2})/.exec(code); 43 | return [parseInt(hex[1], 16), parseInt(hex[2], 16), parseInt(hex[3], 16)]; 44 | } 45 | 46 | // Converts an RGB array to hex 47 | function toHex (ary) { 48 | return "#" + jQuery.map(ary, function(i) { 49 | hex = i.toString(16); 50 | hex = (hex.length == 1) ? "0" + hex : hex; 51 | return hex; 52 | }).join(""); 53 | } 54 | 55 | function colorIncrement (color, range) { 56 | return jQuery.map(toRGB(color.end), function(n, i) { 57 | return (n - toRGB(color.start)[i])/range; 58 | }); 59 | } 60 | 61 | function tagColor (color, increment, weighting) { 62 | rgb = jQuery.map(toRGB(color.start), function(n, i) { 63 | ref = Math.round(n + (increment[i] * weighting)); 64 | if (ref > 255) { 65 | ref = 255; 66 | } else { 67 | if (ref < 0) { 68 | ref = 0; 69 | } 70 | } 71 | return ref; 72 | }); 73 | return toHex(rgb); 74 | } 75 | 76 | function compareWeights(a, b) 77 | { 78 | return a - b; 79 | } 80 | 81 | })(jQuery); 82 | -------------------------------------------------------------------------------- /special/song/janabi-a-thought-on-an-autumn-night.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 歌词音译 - 秋夜思绪 @Jannabi 4 | date: 2022-06-03 19:34 +0800 5 | update: 2022-07-07 10:30 +0800 6 | description: 秋夜思绪 @Jannabi - 韩语罗马音译+中文歌词 7 | --- 8 | 9 | 秋夜思绪 (A thought on an autumn night 가을밤에 든 생각) @Jannabi [更多] 10 | 11 | Lyrics Korean/Hangul Romanization/Chinese 12 | 13 | 韩语罗马音译+中文歌词。全文如下 14 | 15 | ``` 16 | meo na meon byeol bit ceo pyoe le seo do 17 | 머나먼 별빛 저 별에서도 18 | 纵使在那颗星 所散发的渺远星光 19 | 20 | no lael pu leu neun sa lang sal get ji 21 | 노랠 부르는 사랑 살겠지 22 | 歌唱着的爱情 也会鲜活永存的吧 23 | 24 | pa mi myeo no son do son keu li wun geot deul mo a seo 25 | 밤이면 오손도손 그리운 것들 모아서 26 | 每每夜幕低垂 思念的种种便其乐融融地相聚 (注: 오손도손 即和睦地欢聚一堂, 此处将想念的思绪拟人) 27 | 28 | no lael qi eo pu leu get ji 29 | 노랠 지어 부르겠지 30 | 会融作歌谣 放声歌唱的吧 31 | 32 | sae ga man pa ma neu leul su no eun byeol bin ma zeo 33 | 새까만 밤하늘을 수놓은 별빛마저 34 | 就连缀于那漆黑夜空的星光 35 | 36 | pu leo o neun pa lam da la ka go 37 | 불어오는 바람 따라가고 38 | 也追随吹拂的风而去 39 | 40 | po go peun geu dae saeng gak qi teo jyeo ka neun 41 | 보고픈 그대 생각 짙어져 가는 42 | 想念的你啊 在思念之情愈发浓厚的 43 | 44 | xi wo le a leum da wun ni ba me 45 | 시월의 아름다운 이 밤에 46 | 这十月美好的今夜 47 | 48 | ------ 49 | 50 | pu leu da po myeon eo ze ga ol ga 51 | 부르다 보면 어제가 올까 52 | 倘若试着呼唤 昨日便会到来吗 53 | 54 | keu lip deon na li cam ma nan neun de 55 | 그립던 날이 참 많았는데 56 | 曾怀念的时光 真是数不胜数 57 | 58 | ceo meol li pan za gi da a lyeo ni meo leo jyeo ka neun 59 | 저 멀리 반짝이다 아련히 멀어져 가는 60 | 在远方闪闪发光 不断模糊远去的你 61 | 62 | neo neun ca geun byeol ka ta 63 | 너는 작은 별 같아 64 | 就仿若一颗小小星辰 65 | 66 | Farewell Farewell 67 | 68 | meo leo jyeo ka neun 69 | 멀어져 가는 70 | 愈发渐行渐远的 71 | 72 | Farewell ooh- 73 | 74 | ------ 75 | 76 | sae ga man pa ma neu leul su no eun pyeol bi ma zeo 77 | 새까만 밤하늘을 수놓은 별빛마저 78 | 就连缀于那漆黑夜空的星光 79 | 80 | pu leo o neun pa lam da la ka go 81 | 불어오는 바람 따라 가고 82 | 也追随吹拂的风而去 83 | 84 | po go peun geu dae saeng gak qi teo jyeo ka neun 85 | 보고픈 그대 생각 짙어져 가는 86 | 想念的你啊 在思念之情愈发浓厚的 87 | 88 | xi wo le a leum da wun ni ba me 89 | 시월의 아름다운 이 밤에 90 | 这十月美好的此夜 91 | 92 | su ma neun pa lam pu leo on dae do 93 | 수많은 바람 불어온대도 94 | 就算无尽狂风席卷而来 95 | 96 | nal lyeo po nae ji na neul lae 97 | 날려 보내진 않을래 98 | 我也不会放手 任你飞去 99 | 100 | yi qyeo jil ga tu lyeo wo kyeo teul maem do neun 101 | 잊혀질까 두려워 곁을 맴도는 102 | 生怕被就此遗忘 仍在身边徘徊的 103 | 104 | xi wo le a leum da wun ni ba meul ki eo kae cu se yo 105 | 시월의 아름다운 이 밤을 기억해 주세요 106 | 这十月的美好之夜 就请你铭记于心 107 | 108 | Farewell Farewell 109 | ``` -------------------------------------------------------------------------------- /_posts/2016-04-04-how-to-use-jekyll-to-build-a-blog.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "用 Jekyll 在 Github 上搭建一个简易博客" 4 | subtitle: "Build a simple blog using Jekyll and Github" 5 | description: "如果你只是想简单的在 Github 上搭建一个简易的博客,生成静态网页的话,Jekyll 将是一个不错的选择。" 6 | date: 2016-04-04 +0800 7 | update: 2022-06-27 10:11 +0800 8 | author: "ypingcn" 9 | header-img: "img/home-bg-Sm5ceH.webp" 10 | header-mask: 0.3 11 | catalog: false 12 | tags: 13 | - 技术 14 | --- 15 | 16 | 如果你只是想简单的在 Github 上搭建一个简易的博客,生成静态网页的话,Jekyll 将是一个不错的选择。 17 | 18 | ### 安装Jekyll 19 | 20 | ```shell 21 | sudo apt-get update 22 | ``` 23 | 24 | 更新软件包列表。在这一步可以试着把更新源切换到 ubuntu 的官方主服务器,毕竟国内的更新源有延时(不知道这句说的对不对,不对还希望能指出错误)。 25 | 26 | ``` 27 | sudo apt-get install ruby 28 | ``` 29 | 30 | Jekyll 的依赖之一就是 ruby。 31 | 32 | ``` 33 | sudo apt-get install gem 34 | ``` 35 | 36 | 官网上的命令是 gem install jekyll ,先安装 gem。 37 | 38 | ``` 39 | gem sources -l 40 | gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ 41 | gem sources -u 42 | ``` 43 | 44 | 以上几步是更改 gem 的源,使得速度更快。 45 | 46 | ``` 47 | sudo gem install jekyll 48 | ``` 49 | 50 | 最后一步,安装成功的话会有下面的提示。 51 | 52 | ``` 53 | Successfully installed jekyll-3.1.2 54 | Parsing documentation for jekyll-3.1.2 55 | Done installing documentation for jekyll after 1 seconds 56 | 1 gem installed 57 | ``` 58 | 59 | 遇到类似的报错就是缺少相关头文件,需要再安装一个相关的依赖``` ruby2.*-dev ```。 60 | 61 | ``` 62 | Building native extensions. This could take a while... 63 | ERROR: Error installing jekyll: 64 | ERROR: Failed to build gem native extension. 65 | 66 | current directory: /var/lib/gems/2.7.0/gems/http_parser.rb-0.8.0/ext/ruby_http_parser 67 | /usr/bin/ruby2.7 -I /usr/lib/ruby/2.7.0 -r ./siteconf20220627-4252-dpxce9.rb extconf.rb 68 | mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h 69 | 70 | You might have to install separate package for the ruby development 71 | environment, ruby-dev or ruby-devel for example. 72 | 73 | extconf failed, exit code 1 74 | 75 | Gem files will remain installed in /var/lib/gems/2.7.0/gems/http_parser.rb-0.8.0 for inspection. 76 | Results logged to /var/lib/gems/2.7.0/extensions/x86_64-linux/2.7.0/http_parser.rb-0.8.0/gem_make.out 77 | ``` 78 | 79 | 最后一步安装的版本号要根据系统返回的已经安装 ruby 的版本号来确定,例如返回 2.1 就要安装 ```ruby2.1-dev```,版本号是2.7 就要安装 ```ruby2.7-dev``` 80 | 81 | ``` 82 | ruby -v 83 | ruby 2.1.5p273 (2014-11-13) [x86_64-linux-gnu] 84 | sudo apt-get install ruby2.1-dev 85 | 86 | ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu] 87 | sudo apt-get install ruby2.7-dev 88 | ``` 89 | 90 | 91 | 92 | 93 | > 参考 94 | 95 | [Jekyll • 简单的博客、静态网站工具](http://jekyll.com.cn) 96 | -------------------------------------------------------------------------------- /notes/C/apue3-file-IO.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 第三章 文件IO 4 | date: 2017-09-25 20:18 +0800 5 | update: 2021-11-19 23:29 +0800 6 | --- 7 | 8 | 简单记录一下 9 | ```cpp 10 | #include
20 |
21 | 它有以下的几个特点适合普通用户使用:
22 |
23 | 1. 默认内置安装 uBlock Origin 以阻止脚本/广告,保护隐私和安全。
24 | 2. 没有 “添加到 Pocket” 按钮,减少了被推广打扰的机会。
25 | 3. 默认不启用火狐账户进行云同步,但需要时可以手动开启。
26 | 4. 没有自动更新功能。只能需要时只能重新下载安装,配置会保留。或者使用 LibreWolf Updater 插件简化下载流程。
27 |
28 | 对于在意上网安全的用户,它做了以下几点的改动:
29 |
30 | 1. 移除浏览器内置的遥测功能,不会再与 ```*.telemetry.mozilla.org``` 等相关域名交互上报用户行为数据。
31 | 2. 追踪保护默认设置为“严格”模式,默认就是屏蔽【社交媒体跟踪器、所有窗口中的跨网站 Cookie(包括跟踪性 Cookie)、所有窗口中的跟踪性内容、加密货币挖矿程序和数字指纹跟踪程序】
32 | 3. 默认启用 HTTPS-only 模式。在访问非 HTTPS 的网站时会提醒用户,不会直接访问展示内容。
33 | 4. 默认内置私密搜索供应商,如 Searx、Qwant(DuckDuckGo 被设置为默认搜索引擎)、DuckDuckGo、Brave Search。但对于普通用户而已这几个搜索引擎访问没有日常使用的百度谷歌好,所以在需要时候,需要访问相关地址,在搜索栏或地址栏里手动添加回去。
34 | 5. 支持伪造虚假的屏幕分辨率、时区、语言等,使得网站更难获取用户的环境参数。更多浏览器的隐私保护效果测评,可以访问 https://privacytests.org/ 获取更多测评细节。
35 |
36 | ## 安装
37 |
38 | 访问 Librewolf 浏览器官网,点击首页 Installation 的蓝色按钮即可跳转到对应平台的下载页面。【View all versions and release notes】则可以查阅所有的历史版本以及对应的发布记录,了解相关版本的改动。
39 |
40 | Librewolf 浏览器 Windows 安装包下载地址:点击前往
41 |
42 | Librewolf 浏览器 MacOS 安装包下载地址:点击前往
43 |
44 | 其他 Linux 平台如 Arch、Debian、Gentoo、Fedora 等发行版可以访问 Librewolf 浏览器官网 获取更为详细的指引。
45 |
46 | ---
47 |
48 | **更多阅读**
49 |
50 |
53 |
54 | 例如在搜索「浏览器」这个关键词的时候,如果没有开启广告过滤的话,前三个结果就是广告,而且第二、三个都是些 XXX 传媒出品的内容,派不上用场不说,安装后还有可能给我们的电脑带进来广告弹窗等其他隐患,效率高低立见。
55 |
56 | ### 2.2 不止「百度一下」
57 |
58 | 百度一下已经是大家对网上搜索的代名词了,但网上好用的搜索平台不只百度一个。在搜不到结果的时候不妨换一个网站。
59 |
60 | - 谷歌 Google(收录网站最多的)
61 | - 搜狗 Sogou (还支持搜索微信的内容)
62 | - 必应 Bing
63 |
64 | ### 2.3 下载 APP 获取
65 |
66 | 现在网上的内容更多的被不同的 APP 所瓜分,搜索引擎也不能完全获取到。在需要获取特定垂直内容的时候不妨使用 APP 找。这也是很多人第一反应就想到的。
67 |
68 | - 美食出行 --> 美团大众小红书等
69 | - 租房信息 --> 豆瓣安居客等
70 | - 游戏教程 --> 哔哩哔哩等
71 |
72 | ## 三 怎么找?
73 |
74 | 搜索引擎都有几个通用的命令可以帮助搜索,不妨记下来下次尝试使用~
75 |
76 | ### 3.1 时间范围
77 |
78 | 在搜索引擎输入栏下方,通常会有个设置的小按钮,点击进去可以限制搜索时间范围。这样就可以按时间搜索对应的内容,对于时效性要求比较高的场景来说效果明显。
79 |
80 | ### 3.2 site
81 |
82 | ```site:www.qq.com XXX``` 这样就是限定在 ```qq.com``` 这个网站上搜索 ```XXX``` 的内容。常用在专业性比较强的网站上使用,效果等同于内部搜索。
83 |
84 | ### 3.3 filetype
85 |
86 | filetype 后面跟需要文件的后缀名,这点在搜索电子书的时候特别管用,例如 ```filetype:pdf``` 就是搜索 PDF 文件。
87 |
88 | ### 3.4 双引号 ""
89 |
90 | 用双引号引起来的词语表示在网页内容里是一定相连不能分开搜索的。例如「高效搜索」这样搜的话展示的内容大概率是按「高效」「搜索」的逻辑来的,「"高效搜索"」才会合并起来。
91 |
92 | 可以用在某些固定组合的词语搜索上。
93 |
94 | ### 3.5 减号 -
95 |
96 | 减号表示不要出现某个关键词,剔除无关内容。「网站 -百科」表示搜索包含「网站」但是不包含「百科」的网页。
97 |
98 | ### 3.6 inurl
99 |
100 | inurl 表示网址内一定要包含某个关键词,例如```inurl:os 下载``` 表示网址一定要有```os```这个词,且网页内容里有```下载```。这个方法用的比较少。
101 |
102 | ### 3.7 intitle
103 |
104 | intitle 跟 inurl 有相似的点,只不过限制的范围从网址变成了限制网页标题。这个方法会缩小搜索范围,不太建议使用。
105 |
106 |
107 | ---
108 |
109 | 以上希望能在你搜索的时候提供启示,找到自己想要找到的信息~
110 |
111 |
--------------------------------------------------------------------------------
/special/firefox/version.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Firefox 火狐浏览器版本差异(2025年)
4 | date: 2021-10-30 12:00 +0800
5 | update: 2024-12-26 09:00 +0800
6 | ---
7 |
8 | Firefox 火狐浏览器在 PC 电脑上主要分为 ```Nightly``` --> ```Beta``` --> ```Release``` --> ```ESR``` 四个版本,每个版本都会在上一个版本稳定之后按计划进入下一个版本。由前往后,更新频率逐步降低,但稳定性逐步上升。不同版本的区别除去 Logo 样式上的不同,更多的是为了满足不同的需要,不同版本有不同版本的侧重点。
9 |
10 | > 以下版本均支持安装插件(又称拓展) 拓展推荐 ~
11 |
12 | ## 一、Nlightly 每夜构建版
13 |
14 |
108 |
109 | to respect formatting
14 | }
15 |
16 |
17 | /*
18 | * GitHub style for Pygments syntax highlighter, for use with Jekyll
19 | * Courtesy of GitHub.com
20 | */
21 |
22 | .highlight pre, pre, .highlight .hll { background-color: #f8f8f8; border: 1px solid #ccc; padding: 6px 10px; border-radius: 3px; }
23 | .highlight .c { color: #999988; font-style: italic; }
24 | .highlight .err { color: #a61717; background-color: #e3d2d2; }
25 | .highlight .k { font-weight: bold; }
26 | .highlight .o { font-weight: bold; }
27 | .highlight .cm { color: #999988; font-style: italic; }
28 | .highlight .cp { color: #999999; font-weight: bold; }
29 | .highlight .c1 { color: #999988; font-style: italic; }
30 | .highlight .cs { color: #999999; font-weight: bold; font-style: italic; }
31 | .highlight .gd { color: #000000; background-color: #ffdddd; }
32 | .highlight .gd .x { color: #000000; background-color: #ffaaaa; }
33 | .highlight .ge { font-style: italic; }
34 | .highlight .gr { color: #aa0000; }
35 | .highlight .gh { color: #999999; }
36 | .highlight .gi { color: #000000; background-color: #ddffdd; }
37 | .highlight .gi .x { color: #000000; background-color: #aaffaa; }
38 | .highlight .go { color: #888888; }
39 | .highlight .gp { color: #555555; }
40 | .highlight .gs { font-weight: bold; }
41 | .highlight .gu { color: #800080; font-weight: bold; }
42 | .highlight .gt { color: #aa0000; }
43 | .highlight .kc { font-weight: bold; }
44 | .highlight .kd { font-weight: bold; }
45 | .highlight .kn { font-weight: bold; }
46 | .highlight .kp { font-weight: bold; }
47 | .highlight .kr { font-weight: bold; }
48 | .highlight .kt { color: #445588; font-weight: bold; }
49 | .highlight .m { color: #009999; }
50 | .highlight .s { color: #dd1144; }
51 | .highlight .n { color: #333333; }
52 | .highlight .na { color: teal; }
53 | .highlight .nb { color: #0086b3; }
54 | .highlight .nc { color: #445588; font-weight: bold; }
55 | .highlight .no { color: teal; }
56 | .highlight .ni { color: purple; }
57 | .highlight .ne { color: #990000; font-weight: bold; }
58 | .highlight .nf { color: #990000; font-weight: bold; }
59 | .highlight .nn { color: #555555; }
60 | .highlight .nt { color: navy; }
61 | .highlight .nv { color: teal; }
62 | .highlight .ow { font-weight: bold; }
63 | .highlight .w { color: #bbbbbb; }
64 | .highlight .mf { color: #009999; }
65 | .highlight .mh { color: #009999; }
66 | .highlight .mi { color: #009999; }
67 | .highlight .mo { color: #009999; }
68 | .highlight .sb { color: #dd1144; }
69 | .highlight .sc { color: #dd1144; }
70 | .highlight .sd { color: #dd1144; }
71 | .highlight .s2 { color: #dd1144; }
72 | .highlight .se { color: #dd1144; }
73 | .highlight .sh { color: #dd1144; }
74 | .highlight .si { color: #dd1144; }
75 | .highlight .sx { color: #dd1144; }
76 | .highlight .sr { color: #009926; }
77 | .highlight .s1 { color: #dd1144; }
78 | .highlight .ss { color: #990073; }
79 | .highlight .bp { color: #999999; }
80 | .highlight .vc { color: teal; }
81 | .highlight .vg { color: teal; }
82 | .highlight .vi { color: teal; }
83 | .highlight .il { color: #009999; }
84 | .highlight .gc { color: #999; background-color: #EAF2F5; }
85 |
--------------------------------------------------------------------------------
/_posts/2023-12-31-implementation-linkmic-pk-voiceroom.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "连麦、PK和语音房的实现设计思路"
4 | subtitle: "implementation of linkmic pk and voice room"
5 | description: "连麦、PK和语音房的实现设计思路记录"
6 | date: 2023-12-31 +0800
7 | update: 2024-11-17 12:00 +0800
8 | author: "ypingcn"
9 | header-img: "img/home-bg-Sm5ceH.webp"
10 | header-mask: 0.3
11 | catalog: true
12 | tags:
13 | - 技术
14 | - 后端
15 | - 微服务
16 | ---
17 |
18 | 连麦 PK 是秀场直播中的一个重要核心玩法。而语音房同样包含众多的连麦操作。这三类都是不同的角色在自己位置上的行为。
19 |
20 | > 本文意在对已有功能实现的总结和思考,对比中思考改进点
21 |
22 | 故在此,对这三类场景的数据管理实现上,总结一下相同点与不同点。
23 |
24 | ## 存储位置状态数据
25 |
26 | 首先,PK 可以理解成是连麦上再次叠加的一层玩法,按照这种逻辑,双人 PK 则是需要双人连麦成功后才有的玩法。按照不同的连麦类型可以分成双人连麦和多人连麦,这两种分法,核心的本质在于一场连麦中的人数是```2```还是```N```,这个具体数字只需要在发起时确认即可。为统一讨论实现方案,后续仅讨论多人连麦。
27 |
28 | 其次,语音房是一种包含 8 个人或者 10 个人的位置状态管理,与连麦相比,这个位置信息不需要包含画面相关的信息,取而代之的是说话中的“声纹”。所以连麦和语音房的位置状态数据共同点,至少包含是否有人上座、用户ID的两个基础信息。
29 |
30 | 再者可以按以下逻辑,抽象出相关的信息存储——
31 |
32 | ``` 用户->场次的索引、场次->所有位置信息的数据 ```
33 |
34 | 那么,第一个实现上的差别就产生了,如何存储所有的位置信息并保证其准确性?以下是两个做法
35 |
36 | ### 文档型存储
37 |
38 | 这里的文档型存储,是类比“文档型数据库”的一种说法。将所有位置数据都抽象到同一个 json 或者其他序列化后的文本中,数据库辅以版本号进行管理。每次位置更新,只需要取出对应的版本号和位置数据,更新位置数据后用乐观锁同步到数据库中,同步失败则```有限次```地重复之前步骤重试。
39 |
40 | 连麦会话中的位置信息管理使用了本思路来处理,这样做的好处在于后续可扩展性高,有需要新增的字段数据只需要直接添加,不需要额外的改动。
41 |
42 | #### 数据结构设计
43 |
44 | 1. **位置信息文档**:
45 |
46 | * 用户ID (`user_id`)
47 | * 场次ID (`session_id`)
48 | * 是否有人上座 (`is_occupied`)
49 | * 其他相关信息(如声纹信息、时间戳等)
50 | * 版本号 (`version`):用于乐观锁同步
51 |
52 | 2. **场次文档**:
53 |
54 | * 场次ID (`session_id`)
55 | * 场次名称 (`session_name`)
56 | * 开始时间 (`start_time`)
57 | * 结束时间 (`end_time`)
58 | * 当前版本号 (`version`):用于记录场次的最新版本
59 |
60 | #### 操作流程
61 |
62 | 1. **创建场次**:
63 |
64 | * 在场次文档中插入一条新的记录,并初始化版本号。
65 |
66 | 2. **用户加入场次**:
67 |
68 | * 在位置信息文档中插入一条新的记录,关联用户ID和场次ID,并初始化版本号。
69 |
70 | 3. **更新位置信息**:
71 |
72 | * 读取位置信息文档的当前版本号。
73 | * 更新位置信息文档中的数据。
74 | * 使用乐观锁同步更新到数据库中,即比较版本号是否一致。如果不一致,则重试有限次数。
75 |
76 | 4. **查询位置信息**:
77 |
78 | * 直接读取位置信息文档中的数据,并根据需要关联其他相关信息(如用户信息、场次信息等)。
79 |
80 | #### 优点
81 |
82 | * **可扩展性高**:新增字段数据只需要直接添加到位置信息文档中,不需要额外的改动。
83 | * **实现简单**:相对于关系型存储,文档型存储的实现更为简单直观。
84 | * **性能较好**:对于读多写少的场景,文档型存储的性能表现较好。
85 |
86 | #### 缺点
87 |
88 | * **数据一致性**:由于使用乐观锁进行同步更新,可能存在一定的数据不一致风险。
89 | * **查询效率**:对于复杂查询和数据分析,文档型存储的效率可能不如关系型存储。
90 | * **存储空间**:由于存储的是序列化后的 JSON 数据,相对于关系型存储可能会占用更多的存储空间。
91 |
92 | ### 关系型存储
93 |
94 | 关系型存储则更侧重于结构化数据的存储和管理。在关系型数据库中,可以将位置信息拆分为多个表,例如用户表、场次表和位置信息表,通过外键关联这些表。每次位置更新,需要执行 SQL 语句来更新相关表中的数据,并通过事务来保证数据的一致性。
95 |
96 | 关系型存储的优点在于数据结构清晰,查询效率高,适合复杂查询和数据分析。但是,关系型存储的可扩展性相对较差,新增字段可能需要修改表结构。
97 |
98 | 以下是关系型存储在语音房中的技术细节实现文档:
99 |
100 | ### 关系型存储表结构设计
101 |
102 | 1. 用户表(users)
103 | - user_id (主键)
104 | - username
105 | - email
106 | - ...
107 |
108 | 2. 场次表(sessions)
109 | - session_id (主键)
110 | - session_name
111 | - start_time
112 | - end_time
113 | - ...
114 |
115 | 3. 位置信息表(positions)
116 | - position_id (主键)
117 | - user_id (外键,关联用户表)
118 | - session_id (外键,关联场次表)
119 | - is_occupied (是否有人上座)
120 | - voiceprint (声纹信息)
121 | - ...
122 |
123 | ### 关系型存储操作流程
124 |
125 | 1. 创建场次:插入一条新的记录到场次表中。
126 | 2. 用户加入场次:插入一条新的记录到位置信息表中,并关联用户表和场次表。
127 | 3. 更新位置信息:执行 SQL 语句更新位置信息表中的数据。
128 | 4. 查询位置信息:执行 SQL 语句查询位置信息表中的数据,并关联用户表和场次表。
129 |
130 | ### 关系型存储优缺点
131 |
132 | 优点:
133 | - 数据结构清晰,易于理解和维护。
134 | - 查询效率高,适合复杂查询和数据分析。
135 | - 数据一致性好,通过事务保证数据的一致性。
136 |
137 | 缺点:
138 | - 可扩展性较差,新增字段可能需要修改表结构。
139 | - 相对于文档型存储,关系型存储的性能较低。
140 |
--------------------------------------------------------------------------------
/notes/Python/django-models.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Django 中的 models
4 | update: 2017-07-16 22:01 +0800
5 | ---
6 |
7 | ## 概述
8 |
9 | models 用来创建数据库表。创建后运行以下命令迁移数据方可使用
10 |
11 | ```python
12 | python manage.py makemigrations
13 | python manage.py migrate
14 | ```
15 |
16 | ```python
17 | python manage.py dumpdata appname > appname.json
18 | python manage.py loaddata appname.json
19 | ```
20 |
21 | ## 字段
22 |
23 | 一个 models 的结构大致如下
24 |
25 | ```python
26 | from django.db import models
27 | class test(models.Model):
28 | a1 = models.AutoField(primary_key=True)
29 | a2 = models.CharField(max_length=100)
30 | ```
31 |
32 | 其中的```AutoField``` ``` CharField ``` 就是字段,定义了数据库中存储数据的类型
33 |
34 | django 有丰富的字段可供选择。
35 |
36 | 在 django 的文档中可以查询到更为具体的内容
37 | [《Model field reference | Django documentation | Django》](https://docs.djangoproject.com/en/dev/ref/models/fields/#model-field-types)
38 |
39 | ## 参数
40 |
41 | 上面例子中的```primary_key=True``` ``` max_length=100 ``` 便是对字段进行限制的参数。
42 |
43 | ```
44 | 1.null=True 数据库中该字段可为空
45 | 2.blank=True django 的 admin 添加数据时可留空
46 | 3.YEAR_IN_SCHOOL_CHOICES = (
47 | ('FR', 'Freshman'),
48 | ('SO', 'Sophomore'),
49 | ('JR', 'Junior'),
50 | ('SR', 'Senior'),
51 | ('GR', 'Graduate'),
52 | )
53 | example = models.CharField(choice = YEAR_IN_SCHOOL_CHOICES) 选项
54 | 4.default = 0 默认值为0
55 | 5.primary_key = True 主键
56 | 6.unique = True 不允许重复
57 | ```
58 |
59 | 这些只是个例子,更多解释还是要看文档,filed options 部分 [《Models | Django documentation | Django》](https://docs.djangoproject.com/en/dev/topics/db/models/#field-options)
60 |
61 | ## 表间关系
62 |
63 | 数据表之间可以有以下几个关系
64 |
65 | ```
66 | 一对多:models.ForeignKey(其他表)
67 | 多对多:models.ManyToManyField(其他表)
68 | 一对一:models.ManyToManyField(其他表)
69 | ```
70 |
71 | 创建上跟之前的没有多大的区别,举个例子:
72 |
73 | ````python
74 | class people(models.Model):
75 | name = models.CharField(max_length=100)
76 | age = models.models.IntegerField()
77 |
78 | class boy(models.Model):
79 | n = models.ForeignKey(people)
80 | ````
81 |
82 | ## 数据操作
83 |
84 | ```python
85 | from .models import *
86 | #增
87 | people.objects.get_or_create(name="1")
88 | #删
89 | people.objects.all().delete()
90 | #改
91 | people.objects.filter(name="1").update(name="2")
92 | #查
93 | people.objects.get(name="1") #单条数据
94 | people.objects.filter(name="1") #特定数据,不一定是一条(例子不是很好)
95 | #数据个数
96 | a = people.objects.filter(name="1")
97 | len(a)
98 | people.objects.filter(name="1").count()
99 | #范围
100 | people.objects.filter(age__range=[0,100])
101 | #包含
102 | people.objects.filter(name__contains="1")
103 | #排序
104 | people.objects.all().order_by('-age') #从大到小排序,要从小到大排则去掉负号
105 | #其他
106 | startswith istartswith endswith iendswith
107 | ```
108 |
109 | ## 管理
110 |
111 | 在相应文件夹中的 ```admin.py``` 编辑好内容,就可以在管理界面中管理数据
112 |
113 | ```python
114 | from django.contrib import admin
115 |
116 | # Register your models here.
117 |
118 | from import models
119 |
120 | admin.site.register(models.people)
121 | ```
122 |
123 | 如果显示的是 xxx objects,可以这样弄使得数据更容易理解
124 |
125 | ```python
126 | class test(models.Model):
127 | #python2
128 | def __unicode__(self):
129 | return self.name
130 | #python3
131 | def __str__(self):
132 | return self.name
133 | ```
134 |
135 | ## 总结
136 |
137 | django 的文档挺齐全的,上面也只是对我自己学习上的一个整理。
138 |
139 | 参考:
140 |
141 | [Django documentation | Django documentation | Django](https://docs.djangoproject.com/)
142 |
143 | [Django中的页面管理后台](https://www.cnblogs.com/zknublx/p/5944779.html)
144 |
--------------------------------------------------------------------------------
/notes/Https/LetsEncrypt.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Let's Encrypt 使用记录
4 | date: 2017-07-15 21:30 +0800
5 | update: 2021-11-19 22:56 +0800
6 | ---
7 |
8 | 随着网络技术的发展,原有的网络传输设计也遇到了各种问题。使用 HTTP 传输无法保证中间内容不会被第三方修改,所以便诞生了基于 HTTP 的 HTTPS 协议。多了一层虽然会给服务端增加额外的开销,但这对于用户而言是值得的,加上 HTTPS 是个明智的选择。各方都在鼓励网站向 HTTPS 方向进行改造,搜索引擎也对 HTTPS 的网站给予不同程度的加分。
9 |
10 | HTTPS 需要安装相关的证书,付费免费都能找到相应的服务商。而其中最有名的便是 Let's Encrypt 了,免费且能满足 HTTPS 的使用需求,连 Github Page 等服务都使用了 Let's Encrypt 的证书。这家的证书是使用一个叫 Certbot 的程序生成的。Certbot 是 Let's Encrypt 的官方工具。
11 |
12 | 下面便是 Certbot 相关的安装使用记录——
13 |
14 | ## 安装
15 |
16 | 在网上找到的大部分是从源代码编译开始用的,找到一个 Certbot ,是用 PPA 装的软件,方便不少。
17 |
18 | https://certbot.eff.org/
19 |
20 | 以我自己的配置来说(Ubuntu 16.04 + Nginx),安装的命令是这样的:
21 |
22 | ```
23 | $ sudo apt-get update
24 | $ sudo apt-get install software-properties-common
25 | $ sudo add-apt-repository ppa:certbot/certbot
26 | $ sudo apt-get update
27 | $ sudo apt-get install python-certbot-nginx
28 | ```
29 |
30 | 具体命令,在上面的链接中正确选择好就会显示。
31 |
32 | ## 相关文件生成
33 |
34 | 运行 ``` sudo letsencrypt certonly ```
35 |
36 | 提示选择验证的方式。
37 |
38 | ```
39 | How would you like to authenticate with the ACME CA?
40 | 1: Spin up a temporary webserver (standalone)
41 | 2: Place files in webroot directory (webroot)
42 | Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
43 | ```
44 |
45 | 因为是个人向的网站,没有太多可用性的要求,便选择 1 。(standalone 和 webroot 的区别在于,standalone 是用服务器的 80 / 443 端口验证的,需要暂停所在机器的服务,而 webroot 是在网站根目录下生成一个特殊的文件夹,通过 Certbot 的官方服务器发出请求,判断是否能验证成功 )
46 |
47 | 之后终端中便会提示要求输入域名。
48 |
49 | ```Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):```
50 |
51 |
52 | 输入且验证成功后,如出现类似于以下内容就是正确生成证书了。
53 |
54 | ```
55 | IMPORTANT NOTES:
56 | - Congratulations! Your certificate and chain have been saved at
57 | /etc/letsencrypt/live/domain.com/fullchain.pem. Your cert will
58 | expire on 2017-10-13. To obtain a new or tweaked version of this
59 | certificate in the future, simply run certbot again. To
60 | non-interactively renew *all* of your certificates, run "certbot
61 | renew"
62 | - If you like Certbot, please consider supporting our work by:
63 |
64 | Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
65 | Donating to EFF: https://eff.org/donate-le
66 |
67 | ```
68 |
69 | 生成2048位 DH parameters:
70 |
71 | ```
72 | sudo openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048
73 | ```
74 |
75 | ## 修改 Nginx 配置
76 |
77 | 在 /etc/nginx/sites-enabled 下新建文件,添加以下内容
78 |
79 | ```
80 | server {
81 | listen 443 ssl;
82 | server_name domain.com;
83 | ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
84 | ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
85 | ssl_dhparam /etc/ssl/certs/dhparams.pem;
86 | ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-A ES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-S HA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS- AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-S HA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC 3-SHA';
87 | ssl_prefer_server_ciphers on;
88 | }
89 | ```
90 |
91 | 重启 Nginx 后即可生效,完成 HTTPS 证书的部署。
92 |
93 |
--------------------------------------------------------------------------------
/_posts/2022-10-14-user-attribute-service.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "简化开发逻辑的用户属性服务设计"
4 | subtitle: "User attribute service implement for microservices"
5 | description: "简化开发逻辑的用户属性服务设计,支持快速迭代上线减少编写重复代码"
6 | date: 2022-10-14 +0800
7 | update: 2022-11-03 20:30 +0800
8 | author: "ypingcn"
9 | header-img: "img/home-bg-Sm5ceH.webp"
10 | header-mask: 0.3
11 | catalog: true
12 | tags:
13 | - 技术
14 | - 后端
15 | - 微服务
16 | ---
17 |
18 | ## 一、背景
19 |
20 | 在实际业务场景中,有很多功能是支持用户自行设置决定开启关闭的。针对每个单独的设置分别编写代码是一种重复的劳动,可以把这部分的逻辑抽象出来减少重复开发。
21 |
22 | 同样的服务端针对不同用户也会有不同的业务属性,如果每个属性只会有单一的KV逻辑的话,单独的数据操作代码也可以抽象出来提前封装好。
23 |
24 | ## 二、接口设计
25 |
26 | 数据管理上用 UID+Biz 为主键,用户传入的 KEY 为二级主键进行数据管理。
27 |
28 | 最终的接口设计如下,主要是实现增删改查接口,增和改接口合并为 SET 接口支持同时处理两类。所有接口支持弱条件过滤,SET 接口支持判断旧值符合要求后再更新。
29 |
30 | 设计对内接口和对外接口,以便对用户权限进行约束管理。
31 |
32 | ```protobuffer
33 | // 划分场景
34 | struct UserAttributeBiz
35 | {
36 | kTEST = 1,
37 | };
38 | // 操作类似
39 | struct UserAttributeOpType
40 | {
41 | kSTRING = 1, // 简单处理字符串类型(直接覆盖)
42 | kNUMBER = 2, // 简单处理数字类型(直接覆盖)
43 | kNUMBER_ADD = 3, // 数字类型累加(负数为减)
44 | };
45 | // 属性值
46 | struct UserAttribute
47 | {
48 | 0 optional string sKey;
49 | 1 optional string sStrValue; // 字符串类型值,默认为空
50 | 2 optional long lNumValue; // 数字类型值,默认为0
51 | 3 optional long lTimestampSec; // 最后更新时间,设置时都不填
52 | // 如无必要,客户端调用设置接口时不支持、不设置以下后续字段
53 | 4 optional int iOpType = 0; // see alse @UserAttributeOpType
54 | 5 optional int iHasOldStrValue = false; // 是否有旧值,SET/DEL 的时候填值将作为条件,GET 暂时用不到
55 | 6 optional string sOldStrValue;
56 | 7 optional long lExpireTimestamp = 0; // 失效时间(时间戳),设置时都不填
57 | };
58 | // 获取接口
59 | struct GetUserAttributeReq
60 | {
61 | 0 optional User tUser;
62 | 1 optional int iBiz = 0;
63 | 2 optional vector vKeys; // 服务端留空则为获取全部。客户端禁止留空
64 | };
65 | struct GetUserAttributeRsp
66 | {
67 | 0 optional int iCode;
68 | 1 optional string sMessage;
69 | 2 optional vector vItems;
70 | };
71 | // 设置接口
72 | struct SetUserAttributeReq
73 | {
74 | 0 optional User tUser;
75 | 1 optional int iBiz = 0;
76 | 2 optional vector vItems;
77 | 3 optional int iCheckKey = 1; // 检查 key 是否符合配置的内容。服务端有效,客户端必须开启。
78 | 4 optional int iFetchNew = 0; // 返回更新后的最新值
79 | };
80 |
81 | struct SetUserAttributeRsp
82 | {
83 | 0 optional int iCode;
84 | 1 optional string sMessage;
85 | 2 optional vector vItems;
86 | };
87 | // 删除接口
88 | struct DelUserAttributeReq
89 | {
90 | 0 optional User tUser;
91 | 1 optional int iBiz = 0;
92 | 2 optional vector vItems; // 留空则删除全部
93 | 3 optional int iCheckKey = 1; // 检查 key 是否符合配置的内容
94 | };
95 | struct DelUserAttributeRsp
96 | {
97 | 0 optional int iCode;
98 | 1 optional string sMessage;
99 | // TODO 返回删除条数??
100 | };
101 | ```
102 |
103 | 同样结合之前博客提到的缓存应用,对于一致性要求不高的场景可以再封装一层合并查询+缓存的中间组件,提供给业务进行调用。组件实现的缓存 KEY 可以定义为 UID+BIZ+KEY 三个维度,多个 KEY 则拆分为不同缓存对象。
104 |
105 | 实际应用上,直播及其相关场景中缓存组件能有 15% 到 60% 不等的命中率,削峰效果良好。
106 |
107 | ## 三、优化点
108 |
109 | 1. 力度更小的限制,目前实现的逻辑只实现了哪些业务 ID 的值对外开放 + 限制 KEY 的取值,没有约束 VALUE 的取值。
110 | 2. 支持更多灵活的 KV 取值判断逻辑,例如正则等。
111 | 3. 支持配置 KEY 在没有设置的时候返回默认值,不再默认返回空值。
112 | 4. 底层数据存储支持按不同的业务 ID 存储到不同的地方,实现底层数据隔离与安全,也方便在不同业务中的快速部署和迁移。
113 |
--------------------------------------------------------------------------------
/_posts/2022-12-04-retirement-pension-plan.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "追「个人养老金」热点?不如多了解观望看看"
4 | subtitle: "Retirement pension plan"
5 | description: "个人养老金"
6 | date: 2022-12-04 +0800
7 | update: 2023-06-04 16:00 +0800
8 | author: "ypingcn"
9 | header-img: "img/home-bg-Sm5ceH.webp"
10 | header-mask: 0.3
11 | catalog: true
12 | tags:
13 | - 生活
14 | ---
15 |
16 | 最近有一个很火的话题便是个人养老金了,银行渠道的红包开户大力推广叠加「养老」的焦虑,个人养老金俨然成为最近的热点话题。年轻人对于养老问题都有提前规划的意识和规划(详见《这届年轻人,不到30岁就思考养老的事了》 - 腾讯新闻),那么个人养老金这项制度对于年轻人养老是否有所帮助呢?下面是我最近关于「个人养老金」的观察分析总结,在此与各位分享下。
17 |
18 | ## 何为「个人养老金」?
19 |
20 | 对于这个问题首先引用一段比较正式的文字来解释「个人养老金」项目
21 |
22 | > 个人养老金是指政府政策支持、个人自愿参加、市场化运营、实现养老保险补充功能的制度。个人养老金实行个人账户制,缴费完全由参加人个人承担,自主选择购买符合规定的储蓄存款、理财产品、商业养老保险、公募基金等金融产品,实行完全积累,按照国家有关规定享受税收优惠政策。
23 |
24 | 很明显「个人养老金帐号」一个能享受国家税收优惠,旨在为养老设计的专用帐号,参与人按需自愿参加、自主选择购买相关产品。
25 |
26 | 从目前已经公布的细节,「个人养老金」项目有以下几个特点:
27 |
28 | 1. 目前仅有 36 个先行城市(地区)可以开通账户,可以购买的产品有「储蓄存款、理财产品、商业养老保险、公募基金」四类,与现有基本养老保险相比较是两笔钱,本质上还是一个**「```个人投资独立账户```」**,并没有任何保本保收益的承诺。
29 |
30 | 2. 每个人每年能存入 12000 元,并作为个人所得税专项附加扣除额度(类似于现有的子女教育、住房贷款利息、住房租金和赡养老人等)享受后续税收返还。资金仅能在**「```达到退休年龄```」**这种长期的时间后取出来,对应的税率是 3%。所以对于不需要纳税/个人所得对应税率在3%的人,参与这个计划的意义不大。
31 |
32 | 3. 对于年轻人群体而言选择「公募基金」更为适合,但现有品种只是各种养老目标基金,缺少国债、不同指数基金的选择,品种单一缺少分散风险的有效手段。
33 |
34 | > 后续相关信息的更新,会放在 《财经文章收藏》
35 | >
36 | > 个人养老金可买的公募基金相关信息的更新,会放在 《中国公募基金发展大事记》
37 | >
38 | > 欢迎访问。
39 |
40 | ## 作为养老第三支柱改变个人观念
41 |
42 | 个人养老金也不是什么新鲜事,早已是养老的三大支柱之一:
43 |
44 | - 第一支柱是政府主导的基本养老保险。截止 2022 年,基本养老保险已覆盖近 10 亿人。
45 | - 第二支柱是企业年金,主要是经济发达地区的企业自行设立的一个养老补充计划。2021年末,全国有 11.75 万户企业建立企业年金,参加职工 2875 万人。相对于第一支柱而言,能享受到第二支柱的人数是相对小部分。
46 | - 第三支柱是个人养老金,主要是个人的资金自行投资规划。
47 |
48 | 作为养老第三支柱的「个人养老金」,更多是一种理念上的改变和制度上的约束。对于我个人而言,```税收抵扣```+```银行开户红包```的吸引力有限,流动性差这点也比较劝退。但个人养老这件事上能引导个人从更长期限角度上来规划资金使用,为资金使用明确一个目标和相对期限,做一件长期模糊但又在正确方向上的事情。
49 |
50 | 如果对自己自控力有信心的人,自己进行投资理财的计划已经是一份「个人养老金」了。不放心自己的人群,选择加入也是个好的选择,「个人养老金」从制度上“逆人性”地限制了资金的取出,投资期限也大幅延长,用税收优惠来慢慢培养长期的习惯。同样遵循「好资产 + 好价格 + 长期持有 = 慢慢增长」的原则来打理自己的金钱,为未来做保障。
51 |
52 | 本质上而言「个人养老金」是一种现行基本养老保险的补充,对于以下人群参加个人养老金计划的意义不大:
53 |
54 | - 不需要纳税/年度个人所得在 13.6 万享受不到减税优惠的人群。
55 | - 相信个人投资能力更强并且能真正长期实现的人群。
56 | - 已有完善的养老计划的人群(如企业年金和商业保险足够用)
57 | - 因为只能在退休后取出来,所以现在对资金流动性要求较高的人群不适合参加(如 20 多岁刚开始工作需要花钱的地方多时)
58 |
59 | ## 养老金替代率
60 |
61 | 养老金替代率是指退休以后领的养老金占之前工作时收入的比例。这个比例对于维持退休后的生活水平而言至关重要。
62 |
63 | 举个例子而言,退休前每个月收入是 1 万,退休后领取养老金是 9000,那么替代率就是 90% ,这样子下来对于你后续生活质量而言不会特别大。而且人性而言是由奢入俭是非常困难的,替代率越低带来消极的影响会越大。
64 |
65 | 现如今已退休一代人的养老金替代率是在国际平均水平以上,甚至还能出现退休工资倒挂先前工作收入的情况。但现在这代年轻人由于```统筹账户+人口结构变化```等因素,后续年轻人的养老金替代率会明显低于当前,所以越早准备越好,不能单指望退休后靠第一支柱过日子。
66 |
67 | ## 构建自己的被动收入
68 |
69 | 对于年轻人而言,父母养老问题来得更为迫切一点。有一句话说得好,“经济基础决定上层建筑”,物质条件会影响很多事情,所以趁年轻需要提前打好物质基础。
70 |
71 | 上班是工业革命以来最主流的收入方式,那除去上班以外如何构建自己的“睡后收入”,利用好每个人最宝贵的时间呢,我看到这样的一句话或许能对你有所启发。
72 |
73 | ```全面学习(认知杠杆)* 终身学习(时间杠杆)* 投资理财(财务杠杆) => 被动收入(人生杠杆)```
74 |
75 | 或许「个人养老金」这项能作为一个财务杠杆,在时间的积累下打下更好的物质基础吧。
76 |
77 | > 更多参考资料
78 |
79 | 《E54 个人养老金账户有必要开吗?太有了|养老那些事儿 02》
80 |
81 | 《E65 我到底要不要开个人养老金账户?听完这期就懂了|我们和养老的距离 05》
82 |
83 | 《「个人养老金」来了,我要参与吗?》
84 |
85 |
86 |
--------------------------------------------------------------------------------
/notes/C/apue11-thread.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 第十一章 线程
4 | date: 2017-09-25 20:18 +0800
5 | update: 2021-11-25 21:36 +0800
6 | ---
7 |
8 | 线程相关,主要是 pthread 里的函数
9 |
10 | ## 线程
11 |
12 | ```cpp
13 | #include
14 |
15 | int pthread_equal(pthread_t __thread1, pthread_t __thread2)
16 | pthread_t pthread_self()
17 | int pthread_create(pthread_t *restrict __newthread, const pthread_attr_t *restrict __attr, void *(*__start_routine)(void *), void *restrict __arg)
18 | void pthread_exit(void *__retval)
19 | int pthread_join(pthread_t __th, void **__thread_return)
20 | int pthread_cancel(pthread_t __th)
21 | void pthread_cleanup_push(routine, arg)
22 | void pthread_cleanup_pop(int )
23 | ```
24 |
25 | pthread_self() 返回线程本身的信息
26 |
27 | pthread_create 接口中的函数参数分别对应 进程号、进程属性【NULL 后面讲】、开始的函数、函数参数
28 |
29 | pthread_join 获取线程中执行结果的返回值
30 |
31 | pthread_cancel 取消进程的其他线程,成功返回 0 ,反之是错误编号
32 |
33 | pthread_cleanup_push 安排退出时需要调用的函数
34 |
35 | ## 互斥量
36 |
37 | ```cpp
38 | int pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr)
39 | int pthread_mutex_destory(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr)
40 | int pthread_mutex_lock(pthread_mutex_t *__mutex)
41 | int pthread_mutex_trylock(pthread_mutex_t *__mutex)
42 | int pthread_mutex_unlock(pthread_mutex_t *__mutex)
43 | int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,const struct timespec *restrict tsptr);
44 | ```
45 |
46 | pthread_mutex_init 第二个参数使用NULL的默认参数,也可以直接赋值 PTHREAD_MUTEX_INITIALIZER
47 | pthread_mutex_destory 销毁互斥量
48 | pthread_mutex_timedlock 达到指定时间不加锁互斥量,并返回ETIMEOUT
49 |
50 | ### 读写锁
51 |
52 | ```cpp
53 | int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr); //读写锁
54 | int pthread_rwlock_destory(pthread_rwlock_t * rwlock)
55 | int pthread_rdlock(pthread_rwlock_t * rwlock)
56 | int pthread_wrlock(pthread_rwlock_t * rwlock)
57 | int pthread_unlock(pthread_rwlock_t * rwlock)
58 | int pthread_rwlock_timedrdlock(pthread_rwlock_t * restrict rwlock,const struct timespec * restrict tsptr)
59 |
60 | int pthread_rwlock_timedwlock(pthread_rwlock_t * restrict rwlock,const struct timespec * restrict tsptr)
61 | ```
62 |
63 | pthread_rwlock_timedrdlock 和 pthread_rwlock_timedwlock 都是带超时的读写锁,其余函数没有超时的逻辑。
64 |
65 | ### 条件变量
66 |
67 | ```cpp
68 | int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);
69 | int pthread_cond_destory(pthread_cond_t * cond)
70 | int pthread_cond_wait(pthread_cond_t *restrict __cond, pthread_mutex_t *restrict __mutex)
71 | int pthread_cond_timedwait(pthread_cond_t *restrict __cond, pthread_mutex_t *restrict __mutex, const struct timespec *restrict __abstime)
72 | int pthread_cond_signal(pthread_cond_t *__cond)
73 | int pthread_cond_broadcast(pthread_cond_t *__cond)
74 | ```
75 |
76 | ### 自旋锁
77 |
78 | 自旋锁可以在线程不希望在重新调度上花费太多的时间的场景下使用
79 | ```cpp
80 | int pthread_spin_init(pthread_spinlock_t * lock,int pshared)
81 | // 第二个参数 PTHREAD_PROCESS_PRIVATE 只能被初始化该锁的进程访问 PTHREAD_PROCESS_SHARED 用于同步该进程和其他进程中的线程
82 | int pthread_spin_destory(pthread_spinlock_t * lock)
83 | int pthread_spin_lock(pthread_spinlock_t * lock)
84 | int pthread_spin_trylock(pthread_spinlock_t * lock)
85 | int pthread_spin_unlock(pthread_spinlock_t * lock)
86 | ```
87 |
88 | ### 屏障
89 |
90 | 允许所有线程等待直到所有合作的线程都达到某一点
91 | 【在init时指定n+1个等待,其中n是线程数。而在每个线程执行函数的首部调用wait()。这样100个pthread_create()结束后所有线程都停下来等待最后一个wait()函数被调用。这个wait()由主进程在它觉得合适的时候调用就好。最后这个wait()就是鸣响的起跑枪。】
92 |
93 | ```cpp
94 | int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned count);
95 | int pthread_barrier_wait(pthread_barrier_t *barrier);
96 | int pthread_barrier_destroy(pthread_barrier_t *barrier);
97 | ```
98 |
99 | pthread_barrier_init 中由 count 参数指定等待的线程数
--------------------------------------------------------------------------------
/special/firefox/mercury.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Mercury 浏览器资源汇总(2025年)
4 | description: 号称比原版 Firefox 浏览器性能优化 8%-20% 的 Mercury 浏览器,新一代高效安全的浏览器选择
5 | date: 2025-08-17 15:00 +0800
6 | update: 2025-11-14 10:30 +0800
7 | ---
8 |
9 | 根据官网说明,Mercury 浏览器【官网】是一款着重编译优化的 Firefox 火狐浏览器分支,并且集成了来自 LibreWolf、Waterfox 等多款优秀浏览器的隐私/安全性特性改动。
10 |
11 | ## 亮点
12 |
13 | - Compiler optimizations include AVX, AES, LTO and PGO.
14 | - 编译器优化包括 AVX、AES、LTO 和 PGO。
15 | - Disable all telemetry and reporting.
16 | - 禁用所有遥测和报告。
17 | - Remove all debugging constructs and enable hardening by default.
18 | - 移除所有调试结构,并默认启用加固功能。
19 | - Enable backspace to go back, and GPU acceleration by default.
20 | - 默认启用退格键回退功能和 GPU 加速。
21 | - Enable Do Not Track and Global Privacy Control.
22 | - 启用“勿追踪”和“全球隐私控制”。
23 | - Disable Pocket, highlights, and suggested content on the new tab page.
24 | - 禁用新标签页中的 Pocket、高亮和建议内容。
25 | - Restore top bar to ~ESR78 state with home button and developer button.
26 | - 恢复顶部栏至 ESR78 状态,包含主页按钮和开发者按钮。
27 | - Allow installing unsigned extensions.
28 | - 允许安装未签名的扩展。
29 | - Branding changes 品牌更改
30 | - Enable JPEG XL by default
31 | - 默认启用 JPEG XL
32 | - Implemented performance tweaks from BetterFox.
33 | - 实施了 BetterFox 提供的一些性能优化。
34 | - Disabled "Normandy", a component that allows Mozilla to alter extension configurations at will remotely. (bleh wtf is that)
35 | - 禁用了“Normandy”,这是一个允许 Mozilla 远程随意更改扩展配置的组件。(真是烦人,这是什么)
36 |
37 | Mercury 浏览器着重于改进易用性和增强隐私/安全性的补丁。基于原生 Firefox,在性能、安全性和易用性方面做进一步的优化,其中许多来自于 LibreWolf、Waterfox、FireDragon、PlasmaFox、Ghostery 和 GNU IceCat。
38 |
39 | Mercury 浏览器在基准测试和不同操作系统上相比原生 Firefox 可提高 8%-20%的性能。
40 |
41 | ## 编译器优化方式对比
42 |
43 | 1. AVX(Advanced Vector Extensions):向量指令集优化
44 | 2. AES(Advanced Encryption Standard):加密指令集优化
45 | 3. LTO(Link-Time Optimization):链接时全局优化
46 | 4. PGO(Profile-Guided Optimization):Profile引导的动态优化
47 |
48 | | 优化类型 | 核心目标 | 依赖条件 | 适用场景 |
49 | | ---------- | -------------------------- | ---------------------------- | ---------------------- |
50 | | AVX | 利用向量指令提升数据并行性能 | CPU支持AVX指令集 | 科学计算、多媒体处理 |
51 | | AES | 利用硬件指令加速加密解密 | CPU支持AES指令集 | 加密库、安全协议 |
52 | | LTO | 跨文件全局优化 | 编译器支持LTO | 大型项目、跨文件调用频繁 |
53 | | PGO | 基于运行时反馈的动态优化 | 可收集真实运行场景的profile | 服务器应用、桌面程序 |
54 |
55 | ## 下载方式
56 |
57 | 访问【官网】,找到【Releases (Linux & Windows) 】的下载入口,根据 Windows 、MacOS 或 Linux 等操作系统选择下载~
58 |
59 | ## 提醒
60 |
61 | 个人开发者因精力有限,所开发浏览器往往更新频率低,甚至存在断更风险,其功能迭代、bug修复及安全补丁无法及时跟进,可能影响使用稳定性与安全性,建议谨慎将 Mercury 浏览器作为主力浏览器使用。
62 |
63 | 截止 2025 年 08 月 18 日,作者 Alex313031 最近一次更新 Mercury 浏览器时间已经是 2024 年 09 月 17 日,间隔时间接近一年。
64 |
65 | ---
66 |
67 | **更多阅读**
68 |
69 |
70 |
73 |
74 | -
75 |
77 | 下一篇
78 | 《Firefox 火狐浏览器设置安全 DNS (DoH)》
79 |
80 |
81 | -
82 |
84 | 下一篇
85 | 《Firefox 火狐浏览器版本差异》
86 |
87 |
88 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/wiki/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 帮助 FAQ
4 | update: 2025-08-17 15:00 +0800
5 | description: 博客的 FAQ 页面,记录博客所有模块的入口和常见问题的解答,希望能及时提供帮助。
6 | linkeddata: {"@context":"http://schema.org","@type":"ItemList","numberOfItems":"9","itemListElement":[{"@type":"ListItem","position":1,"url":"https://blog.ypingcn.com/wiki/about/"},{"@type":"ListItem","position":2,"url":"https://blog.ypingcn.com/wiki/guestbook/"},{"@type":"ListItem","position":3,"url":"https://blog.ypingcn.com/wiki/copywriting-guidelines/"},{"@type":"ListItem","position":4,"url":"https://blog.ypingcn.com/special/firefox/resource/"},{"@type":"ListItem","position":5,"url":"https://blog.ypingcn.com/special/firefox/addons/"},{"@type":"ListItem","position":6,"url":"https://blog.ypingcn.com/special/firefox/version/"},{"@type":"ListItem","position":7,"url":"https://blog.ypingcn.com/special/firefox/theme/"},{"@type":"ListItem","position":8,"url":"https://blog.ypingcn.com/special/firefox/librewolf/"},{"@type":"ListItem","position":9,"url":"https://blog.ypingcn.com/special/fund/year-book/"}]}
7 | not_show_copyright: true
8 | not_show_ad: true
9 | ---
10 |
11 | 欢迎来到帮助 与 FAQ 页面!本页汇总了网站所有模块的入口和常见问题的解答。
12 |
13 | 如果是使用电脑浏览器访问本页面,可以使用 ```Ctrl + F```快捷键搜索所需要的帮助。
14 |
15 | ## 关于
16 |
17 | # @关于本站
18 |
19 | # @留言联系
20 |
21 | ------
22 |
23 | ## 博客
24 |
25 | # @最新更新
26 |
27 | ------
28 |
29 | ## 知识库
30 |
31 | # @笔记目录
32 |
33 | # @LCTT 翻译记录
34 |
35 | # @中文排版指北
36 |
37 | ------
38 |
39 | ## 专题
40 |
41 | ### Firefox 火狐浏览器
42 |
43 | # @Firefox 火狐浏览器插件推荐
44 |
45 | # @Firefox 火狐浏览器设置安全 DNS (DoH) ~
46 |
47 | # @Firefox 火狐浏览器【国际版】与【谋智中国版】的区别
48 |
49 | # @Floorp 浏览器 ~
50 |
51 | # @Librewolf 浏览器 ~
52 |
53 | # @Waterfox 浏览器 ~
54 |
55 | # @Zen 浏览器 ~
56 |
57 | # @Mercury 浏览器 ~
58 |
59 | # @Firefox 火狐浏览器资源汇总
60 |
61 | # @Firefox 火狐浏览器主题美化 ~
62 |
63 | # @Firefox Trains,一个查看 Firefox 火狐浏览器不同渠道最新版本的网站 ~
64 |
65 | # @Firefox 火狐浏览器版本差异
66 |
67 | # @Firefox 火狐浏览器相关网站汇总 ~
68 |
69 | ### 基金
70 |
71 | # @中国公募基金发展大事记
72 |
73 | ### KPOP
74 |
75 | #《12月24日》- d.ear
76 |
77 | #《Ah Puh》- IU
78 |
79 | #《Drama》- IU
80 |
81 | #《Eight》- IU x SUGA
82 |
83 | #《被遗忘的季节》- IU
84 |
85 | #《你的意义》- IU
86 |
87 | #《秋日思绪》- Jannabi
88 |
89 | #《致犹豫的恋人们》- Jannabi
90 |
91 | #《November Rain》- Jannabi
92 |
93 | #《좋은 사람 있으면 소개시켜줘 》- Joy
94 |
95 | #《面具》- 安七炫
96 |
97 | #《摇篮曲》- Jukjae(郑宰阮)
--------------------------------------------------------------------------------
/js/animatescroll.min.js:
--------------------------------------------------------------------------------
1 | /* Coded by Ramswaroop */
2 | (function(e){e.easing["jswing"]=e.easing["swing"];e.extend(e.easing,{def:"easeOutQuad",swing:function(t,n,r,i,s){return e.easing[e.easing.def](t,n,r,i,s)},easeInQuad:function(e,t,n,r,i){return r*(t/=i)*t+n},easeOutQuad:function(e,t,n,r,i){return-r*(t/=i)*(t-2)+n},easeInOutQuad:function(e,t,n,r,i){if((t/=i/2)<1)return r/2*t*t+n;return-r/2*(--t*(t-2)-1)+n},easeInCubic:function(e,t,n,r,i){return r*(t/=i)*t*t+n},easeOutCubic:function(e,t,n,r,i){return r*((t=t/i-1)*t*t+1)+n},easeInOutCubic:function(e,t,n,r,i){if((t/=i/2)<1)return r/2*t*t*t+n;return r/2*((t-=2)*t*t+2)+n},easeInQuart:function(e,t,n,r,i){return r*(t/=i)*t*t*t+n},easeOutQuart:function(e,t,n,r,i){return-r*((t=t/i-1)*t*t*t-1)+n},easeInOutQuart:function(e,t,n,r,i){if((t/=i/2)<1)return r/2*t*t*t*t+n;return-r/2*((t-=2)*t*t*t-2)+n},easeInQuint:function(e,t,n,r,i){return r*(t/=i)*t*t*t*t+n},easeOutQuint:function(e,t,n,r,i){return r*((t=t/i-1)*t*t*t*t+1)+n},easeInOutQuint:function(e,t,n,r,i){if((t/=i/2)<1)return r/2*t*t*t*t*t+n;return r/2*((t-=2)*t*t*t*t+2)+n},easeInSine:function(e,t,n,r,i){return-r*Math.cos(t/i*(Math.PI/2))+r+n},easeOutSine:function(e,t,n,r,i){return r*Math.sin(t/i*(Math.PI/2))+n},easeInOutSine:function(e,t,n,r,i){return-r/2*(Math.cos(Math.PI*t/i)-1)+n},easeInExpo:function(e,t,n,r,i){return t==0?n:r*Math.pow(2,10*(t/i-1))+n},easeOutExpo:function(e,t,n,r,i){return t==i?n+r:r*(-Math.pow(2,-10*t/i)+1)+n},easeInOutExpo:function(e,t,n,r,i){if(t==0)return n;if(t==i)return n+r;if((t/=i/2)<1)return r/2*Math.pow(2,10*(t-1))+n;return r/2*(-Math.pow(2,-10*--t)+2)+n},easeInCirc:function(e,t,n,r,i){return-r*(Math.sqrt(1-(t/=i)*t)-1)+n},easeOutCirc:function(e,t,n,r,i){return r*Math.sqrt(1-(t=t/i-1)*t)+n},easeInOutCirc:function(e,t,n,r,i){if((t/=i/2)<1)return-r/2*(Math.sqrt(1-t*t)-1)+n;return r/2*(Math.sqrt(1-(t-=2)*t)+1)+n},easeInElastic:function(e,t,n,r,i){var s=1.70158;var o=0;var u=r;if(t==0)return n;if((t/=i)==1)return n+r;if(!o)o=i*.3;if(u
2 |
49 |
101 |
--------------------------------------------------------------------------------
/notes/SQL/syntax.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: SQL 基础语法
4 | update: 2016-11-19 10:36 +0800
5 | ---
6 |
7 | SQL 的基础语法(select/insert/update/delete ...)
8 |
9 | 参考资料
10 |
11 | w3school [SQL教程](http://www.w3school.com.cn/sql/index.asp)
12 |
13 | SQL语句大小写不敏感。
14 |
15 |
16 | ## Basic
17 |
18 | ```
19 | SELECT column FROM table
20 | ```
21 |
22 | ### select
23 |
24 | ```
25 | SELECT DISTINCT column FROM table
26 |
27 | SELECT column FROM table WHERE column operator value
28 |
29 | SELECT column FROM table WHERE 1 AND 2 (WHERE 1 OR 2)
30 |
31 | SELECT column FROM table ORDER BY column
32 |
33 | SELECT column FROM table LIMIT number(MySQL)
34 |
35 | SELECT column FROM table WHERE column LIKE pattern (% _ [charlist] [^charlist])
36 |
37 | SELECT column FROM table WHERE column IN (value1,value2,...)
38 |
39 | SELECT column FROM table WHERE column BETWEEN value1 AND value2
40 |
41 | SELECT column FROM table AS alias_name(表的别名)
42 | SELECT column AS alias_name FROM table(列的别名)
43 |
44 | SELECT column INTO new_table [IN external_database] FROM old_table
45 | ```
46 |
47 | ### insert
48 |
49 | ```
50 | INSERT INTO table VALUES (v1.v2...)
51 | INSERT INTO table (column1,column2,...) VALUES (v1,v2,...)
52 | ```
53 |
54 | ### update
55 |
56 | ```
57 | UPDATE table SET column = new_value WHERE column = value
58 | ```
59 |
60 | ### delete
61 |
62 | ```
63 | DELETE FROM table WHERE column = value
64 | ```
65 |
66 | ### union
67 |
68 | ```
69 | SELECT column1 FROM table1 UNION SELECE column2 FROM table2(元素不重复)
70 | SELECT column2 FROM table1 UNION ALL SELECT column2 FROM table2(元素可以重复)
71 | ```
72 |
73 | ### create
74 |
75 | ```
76 | CREATE DATABASE name
77 | CREATE TABLE name( c1 type,c2 type,c3 type,...)
78 | ```
79 |
80 | ## Join
81 |
82 | ```
83 | (INNER) JOIN: 如果表中有至少一个匹配,则返回行
84 | LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
85 | RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
86 | FULL JOIN: 只要其中一个表中存在匹配,就返回行
87 |
88 | SELECT column FROM table1 INNER JOIN table2 ON table1.column = table2.column
89 | SELECT column FROM table1 LEFT JOIN table2 ON table1.column = table2.column
90 | SELECT column FROM table1 RIGHT JOIN table2 ON table1.column = table2.column
91 | SELECT column FROM table1 FULL JOIN table2 ON table1.column = table2.column
92 | ```
93 |
94 | ## Constraint
95 |
96 | ### not null
97 |
98 | ```
99 | CREATE TABLE name( c1 type NOT NULL,c2 type,c3 type,...)
100 | ```
101 |
102 | ### unique
103 |
104 | ```
105 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,UNIQUE(c1) ) (MySQL)
106 | CREATE TABLE name( c1 type,c2,type,c3 type,... ,CONSTRAINT constraint_name UNIQUE(c1,c2) ) (MySQL)
107 | ALTER TABLE table ADD UNIQUE(column)
108 | ALTER TABLE table ADD CONSTRAINT constraint_name UNIQUE(c1,c2)
109 | ALTER TABLE table DROP INDEX constraint_name (MySQL)
110 | ```
111 |
112 | ### primary key
113 |
114 | ```
115 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,PRIMARY KEY(c1) ) (MySQL)
116 | CREATE TABLE name( c1 type,c2,type,c3 type,... ,CONSTRAINT constraint_name PRIMARY KEY(c1,c2) ) (MySQL)
117 | ALTER TABLE table ADD PRIMARY KEY(column)
118 | ALTER TABLE table ADD CONSTRAINT constraint_name PRIMARY KEY(c1,c2)
119 | ALTER TABLE table DROP PRIMARY KEY(MySQL)
120 | ```
121 |
122 | ### foreign key
123 |
124 | ```
125 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,FOREIGN KEY(c1) REFERENCE table2(column) ) (MySQL)
126 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,CONSTRAINT constraint_name FOREIGN KEY(c1) REFERENCE table2(column) ) (MySQL)
127 | ALTER TABLE table ADD FOREIGN KEY (column) REFERENCE table2(column)
128 | ALTER TABLE table ADD CONSTRAINT constraint_name FOREIGN KEY (column) REFERENCE table2(column)
129 | ALTER TABLE table DROP FOREIGN KEY constraint_name (MySQL)
130 | ```
131 |
132 | ### check
133 |
134 | ```
135 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,CHECK(expression) ) (MySQL)
136 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,CONSTRAINT constraint_name CHECK(expression) ) (MySQL)
137 | ALTER TABLE table ADD CHECK(expression)
138 | ALTER TABLE table ADD CONSTRAINT constraint_name CHECK(expression)
139 | ALTER TABLE table DROP CHECK constraint_name (MySQL)
140 | ```
141 |
142 | ### default
143 |
144 | ```
145 | CREATE TABLE name( c1 type,c2 type,c3 type,... ,cn type DEFAULT 'value' ) (MySQL)
146 | ALTER TABLE table ALTER column SET DEFAULT 'value' (MySQL)
147 | ALTER TABLE table ALTER column DROP DEFAULT (MySQL)
148 | ```
149 |
--------------------------------------------------------------------------------