From c6a8bf05a5e5dbed0ab4787937e25036b89e78fd Mon Sep 17 00:00:00 2001 From: Sevichecc <91365763+Sevichecc@users.noreply.github.com> Date: Thu, 18 Aug 2022 03:13:23 +0800 Subject: [PATCH] update post detail --- src/routes/2022-03-03.md | 78 ++ src/routes/2022-03-04-decbin.md | 76 + src/routes/2022-03-06-airtable.md | 115 ++ src/routes/2022-03-07-filter.md | 65 + src/routes/2022-03-07-obsidian-notes1.md | 101 ++ src/routes/2022-03-09-caesar-cipher.md | 116 ++ src/routes/2022-03-09-css-tab.md | 101 ++ src/routes/2022-03-09-typewriter.md | 59 + src/routes/2022-03-10-forty.md | 30 + src/routes/2022-03-11-miniflux-to-pocket.md | 117 ++ src/routes/2022-03-29-12px.md | 52 + src/routes/2022-05-07-vps-init.md | 363 +++++ src/routes/2022-05-25-git.md | 87 ++ .../2022-05-26-write-a-page-template.md | 300 ++++ src/routes/2022-05-30-contabo-oss.md | 88 ++ src/routes/2022-06-10-backtotop.md | 91 ++ src/routes/2022-06-12-cloudflare.md | 129 ++ src/routes/2022-07-13-sql.md | 134 ++ src/routes/2022-07-23-d3.md | 446 ++++++ src/routes/2022-07-27-bin.md | 31 + src/routes/2022-08-12-vue-challenges.md | 1237 +++++++++++++++++ src/routes/argon.md | 67 + src/routes/axure.md | 32 + src/routes/css-fundamental.md | 471 +++++++ src/routes/css-layout.md | 269 ++++ src/routes/flare.md | 140 ++ src/routes/grid.md | 45 + src/routes/halo.md | 275 ++++ src/routes/hover.md | 32 + src/routes/html-basis.md | 141 ++ src/routes/insight.md | 154 ++ src/routes/margin.md | 34 + src/routes/material.md | 23 + src/routes/rem-css.md | 38 + src/routes/vscode.md | 66 + src/routes/用户体验要素1.md | 78 ++ src/routes/用户体验要素2.md | 84 ++ src/routes/用户体验要素3.md | 87 ++ src/routes/设计心理学1-1.md | 75 + src/routes/设计心理学1-2.md | 214 +++ src/routes/设计心理学1-3.md | 137 ++ src/routes/设计心理学1-4.md | 170 +++ src/routes/设计心理学1-5.md | 379 +++++ src/routes/设计心理学1-6.md | 96 ++ src/routes/设计心理学1-7.md | 69 + urara/2022-08-18-lwt/index.md | 42 +- 46 files changed, 7013 insertions(+), 21 deletions(-) create mode 100644 src/routes/2022-03-03.md create mode 100644 src/routes/2022-03-04-decbin.md create mode 100644 src/routes/2022-03-06-airtable.md create mode 100644 src/routes/2022-03-07-filter.md create mode 100644 src/routes/2022-03-07-obsidian-notes1.md create mode 100644 src/routes/2022-03-09-caesar-cipher.md create mode 100644 src/routes/2022-03-09-css-tab.md create mode 100644 src/routes/2022-03-09-typewriter.md create mode 100644 src/routes/2022-03-10-forty.md create mode 100644 src/routes/2022-03-11-miniflux-to-pocket.md create mode 100644 src/routes/2022-03-29-12px.md create mode 100644 src/routes/2022-05-07-vps-init.md create mode 100644 src/routes/2022-05-25-git.md create mode 100644 src/routes/2022-05-26-write-a-page-template.md create mode 100644 src/routes/2022-05-30-contabo-oss.md create mode 100644 src/routes/2022-06-10-backtotop.md create mode 100644 src/routes/2022-06-12-cloudflare.md create mode 100644 src/routes/2022-07-13-sql.md create mode 100644 src/routes/2022-07-23-d3.md create mode 100644 src/routes/2022-07-27-bin.md create mode 100644 src/routes/2022-08-12-vue-challenges.md create mode 100644 src/routes/argon.md create mode 100644 src/routes/axure.md create mode 100644 src/routes/css-fundamental.md create mode 100644 src/routes/css-layout.md create mode 100644 src/routes/flare.md create mode 100644 src/routes/grid.md create mode 100644 src/routes/halo.md create mode 100644 src/routes/hover.md create mode 100644 src/routes/html-basis.md create mode 100644 src/routes/insight.md create mode 100644 src/routes/margin.md create mode 100644 src/routes/material.md create mode 100644 src/routes/rem-css.md create mode 100644 src/routes/vscode.md create mode 100644 src/routes/用户体验要素1.md create mode 100644 src/routes/用户体验要素2.md create mode 100644 src/routes/用户体验要素3.md create mode 100644 src/routes/设计心理学1-1.md create mode 100644 src/routes/设计心理学1-2.md create mode 100644 src/routes/设计心理学1-3.md create mode 100644 src/routes/设计心理学1-4.md create mode 100644 src/routes/设计心理学1-5.md create mode 100644 src/routes/设计心理学1-6.md create mode 100644 src/routes/设计心理学1-7.md diff --git a/src/routes/2022-03-03.md b/src/routes/2022-03-03.md new file mode 100644 index 00000000..e62ea44f --- /dev/null +++ b/src/routes/2022-03-03.md @@ -0,0 +1,78 @@ +--- +title: JavaScript · 判断水仙花数 +summary: 用JavaScript判断水仙花数 +created: 2022-03-03T15:07:14.533Z +categories: + - JavaScript +tags: + - JavaScript +slug: Narcissistic-number-in-JavaScript +lastmod: 2022-04-07T07:20:02.340Z +--- + +题目来源: [“如果”可以“重来” | 百度前端技术学园](http://ife.baidu.com/javascript/if&while.html#%E7%BC%96%E7%A0%81%E4%B8%89) + +## 题目 + +根据用户输入的数据,判断水仙花数(三位数),水仙花数是指一个 n 位数 (n≥3),它的每个位上的数字的 n 次幂之和等于它本身。 + +```html + + +
+ + +``` + +**需求说明** + +- 当点击 `开始判断` 按钮,就执行 `numDaffodils` 函数判断输入的数字是否为水仙花数. +- 如果是,就弹出提示框提示是水仙花数,如果不是,就提示不是水仙花数 +- 例如输入 153,`153=1* 1*1+5*5*5+3*3*3` , 是水仙花数,就提示 153 是水仙花数。 +- 请加入输入判断,必须输入数字,不能输入其他类型。 + +## 解法 + +```html + + +
+ + +``` + +这里有一个坑:从 `` 获取输入内容[^1],因为 `type=text` ,所以输出的是 `string` 而不是 `number`,不能直接用`typeof ==='number'`判断输入的是不是数字 + +## 参考 + +- [learn/task2_3 简单水仙花.html · Homeuh/learn · GitHub](https://github.com/Homeuh/learn/blob/6ed2d79cd6abff09f981c0af21080c38b55b6ef2/out/artifacts/Web0_1_Web_exploded/Task_JS/task2_3%E7%AE%80%E5%8D%95%E6%B0%B4%E4%BB%99%E8%8A%B1.html) + +- [IFE/水仙花数.html · Yaomiaomu/IFE · GitHub](https://github.com/Yaomiaomu/IFE/blob/fed038d6c76b2bf62ee83d6539c927c6fa333b91/JAVASCRIPT/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0.html) + +[^1]: [HTML text input allow only numeric input](https://stackoverflow.com/questions/469357/html-text-input-allow-only-numeric-input) diff --git a/src/routes/2022-03-04-decbin.md b/src/routes/2022-03-04-decbin.md new file mode 100644 index 00000000..754dd785 --- /dev/null +++ b/src/routes/2022-03-04-decbin.md @@ -0,0 +1,76 @@ +--- +title: JavaScript · 十进制数转二进制 +summary: 用JavaScript将十进制数转二进制数 +created: 2022-03-04T14:57:48.683Z +draft: '' +tags: + - JavaScript +categories: + - JavaScript +lastmod: 2022-04-16T12:54:16.167Z +type: default +# changelogs: +# - tag: "20220308" +# summary: +# - 将`push` 改为`unshift` +# - 使用`padding`填充字符串 +# - 修改`binNumber.length >= binBit` +--- + +## 题目 + +来源:[“如果”可以“重来” | 百度前端技术学园](http://ife.baidu.com/javascript/if&while.html#:~:text=opens%20new%20window) + +验证工具:[在线进制转换 | 进制转换器 — 在线工具](https://www.sojson.com/hexconvert.html) + +### Task1 + +实现当点击转化按钮时,将输入的十进制数字转化为二进制,并显示在 `result` 的 `p` 标签内 + +### Task2 + +- 转化显示后的二进制数为 bin-bit 中输入的数字宽度,例如 `dec-number` 为 5 ,`bin-bit` 为 5 ,则转化后数字为 `00101` +- 如果 `bin-bit` 小于转化后的二进制本身位数,则使用原本的位数,如 `dec-number` 为 5 ,`bin-bit` 为 2 ,依然输出 `101` ,但同时在 console 中报个错。 + +## 解法 + +```html + + + +

运算结果

+ +``` diff --git a/src/routes/2022-03-06-airtable.md b/src/routes/2022-03-06-airtable.md new file mode 100644 index 00000000..97e63f81 --- /dev/null +++ b/src/routes/2022-03-06-airtable.md @@ -0,0 +1,115 @@ +--- +title: Airtable · 网页剪藏 +summary: Airtable Web Cilpper设置 +created: 2022-03-06T05:58:29.026Z +categories: + - 实用技巧 +tags: + - 实用技巧 +# layout: post +lastmod: 2022-04-16T12:54:20.049Z +--- + +## 书签这回事 + +上回说到用 [自建网页书签 Flare](https://seviche.cc/blog/flare/) ,今天不小心把 SSH 链接弄坏了(也就是连不上了),因为搭载的服务不多,所以把整个服务器都重装了,Flare 网页书签也炸了。 + +其实搭建之后我没有用过(一次都没有),平时的书签管理主要靠搜索,各个浏览器之间的书签互相导入后,直接在搜索栏搜,如果是常用的网址,我用 Chorme 扩展 [eesel](https://chrome.google.com/webstore/detail/eesel-productivity-at-wor/jffaiidojfhflballoapgofphkadiono) 来解决,它可以列出最近用过的网页,按站点分类,查找起来很方便 + +![essel 书签](https://s2.loli.net/2022/03/06/JuHOINUdjprxV19.png) + +最近还推出了一个新功能,可以通过命令进行一下快捷操作,如创建新的 coda 文件、figma 文件等……有点像 Alfred + +![](https://s2.loli.net/2022/03/06/7ZzGSUrWKR1vm6k.png) + +然后还有一个工具叫 [Omni](https://chrome.google.com/webstore/detail/omni-bookmark-history-tab/mapjgeachilmcbbokkgcbgpbakaaeehi) 可以做类似的事情,它还可以搜收藏夹,但不知道为什么我的 Chrome 用不了这个,所以也一直没用。 + +## 关于 Airtable + +Airtable 是一个多功能的表格应用,它的表格跟 Notion 里的 Database 挺像的,不过功能更多,用来做网页收藏夹 Free Plan 完全够用。基本的操作可以看这个: [真· Airtable 3 分钟菜鸟入门 - 少数派](https://sspai.com/post/44746) ,我没有什么要补充的。 + +从去年开始,我开始用 Airtable 整理我的一些收藏夹。原因如下: + +1. 可以分享的表格链接,移动端网页适配也很好 +2. 提供可嵌入网页(如博客)的 ` + +## 怎么用 Airtable 剪切网页 + +我的收藏夹示例: [Airtable - About Coding](https://airtable.com/shrpftxf6JgRomP2X/tblEvtThXHNBMQ8lW/viwSXGTALloahC10H) + +### 1. 创建表格 + +至少包含三项内容: + +1. URL:用来放网页的链接 +2. LongText:网页描述 +3. Attachment:放网页截图 + +如果需要打开 Markdown 格式支持,需要打开 `Enable rich text formatting` +![](https://s2.loli.net/2022/03/06/7agleEFG5YyNSWU.png) + +也可以增加 Tag 和 Categories 分类等其他内容,下面是我建的示例文件: + +![](https://s2.loli.net/2022/03/06/3IRug7QaOs46vBW.png) + +### 2. 创建 app + +点击右上角的 `App` → 点击 `App an app` → 搜 `Web clipper` +![](https://s2.loli.net/2022/03/06/ldpgQ9weHMJctUf.png) + +点击 `add` 添加应用 + +![](https://s2.loli.net/2022/03/06/v2TPpVXMnt4jYx8.png) + +然后按提示安装 Chrome 拓展,你可以直接在这里安装: [Airtable web clipper](https://chrome.google.com/webstore/detail/airtable-web-clipper/fehcbmngdgagfalpnfphdhojfdcoblgc) + +为剪切动作命名,如直接用表格名字:About Coding +![](https://s2.loli.net/2022/03/06/69YEJzKCX5xntP7.png) + +然后点击 `Add to Extension`, 你会看到它出现在了 Web clipper 里面,不过现在先不用管,点击左上角关掉。![](https://s2.loli.net/2022/03/06/1tiLkpEXqTKJw3o.png) + +### 3. 配置剪切设置 + +在 Web clipper 的设置页面(如下),可以调整表格里面各个单元格对应的网页数据,可以按需设置 + +![](https://s2.loli.net/2022/03/06/6FMhjrZR2NSsqOG.png) + +其中: + +- Page Title:页面标题 +- Page URL:页面链接 +- Selected text:打开 Web Clipper 时选中的文本 +- Meta tag:The field will be prefilled with the value of the matching meta tag. (不知道是什么 +- Text content by CSS selector:用 CSS 选择文本,会返回第一个符合选择器的文本内容,如 `.page-description` +- HTML attribute by CSS selector :结合 HTML 属性选择 + +我的设置是: + +- Name——Page title +- URL——Page URL +- Attachments——none +- Description——Selected Text + +### 4. Web Clipper 剪切 + +配置好后就可以开始使用了。在你需要剪切的网页,打开 Airtable web clipper,也就是先前安装的浏览器拓展,点击相应动作,比如刚才创建的 About Coding(如果这个面板有挡到页面内容,可以用鼠标拖动到别的地方) + +![](https://s2.loli.net/2022/03/06/RTu2xDNn5teqlQP.png) + +在 Attachment 里选择附加图片的来源: +![](https://s2.loli.net/2022/03/06/tyU87WD4jsdBHiN.png) + +Description 里面的内容可以自己写,也可以在打开 Web clipper 之前先选中,打开后会自动填充进去,如图: +![](https://s2.loli.net/2022/03/06/vPLMNaOlkotWV2Y.png) + +最后点击 `Add record` 就完成啦 diff --git a/src/routes/2022-03-07-filter.md b/src/routes/2022-03-07-filter.md new file mode 100644 index 00000000..29415c7c --- /dev/null +++ b/src/routes/2022-03-07-filter.md @@ -0,0 +1,65 @@ +--- +title: JavaScript · 字符串去重 +summary: 编码实现字符串去重 +created: 2022-03-07T13:55:21.090Z +tags: + - JavaScript +categories: + - JavaScript +lastmod: 2022-04-07T07:20:30.550Z +--- + +## 题目 + +来源:[百度前端学院](http://ife.baidu.com/javascript/string.html#%E5%AD%97%E7%AC%A6%E4%B8%B2) + +```js +/* +去掉字符串 str 中,连续重复的地方 +*/ +function removeRepetition(str) { + // do something +} + +// 测试用例 +console.log(removeRepetition('aaa')) // ->a +console.log(removeRepetition('abbba')) // ->aba +console.log(removeRepetition('aabbaabb')) // ->abab +console.log(removeRepetition('')) // -> +console.log(removeRepetition('abc')) // ->abc +``` + +## 解法 + +```js +function removeRepetition(str) { + let strArr = [...str] + const result = strArr.filter((s, i, arr) => s !== arr[i + 1]).join('') + return result +} + +console.log(removeRepetition('aaa')) // ->a +console.log(removeRepetition('abbba')) // ->aba +console.log(removeRepetition('aabbaabb')) // ->abab +console.log(removeRepetition('')) // -> +console.log(removeRepetition('abc')) // ->abc +``` + +如果没有限定条件说是“连续重复”,就可以用 **Set**: + +```js +function removeRepetition(str) { + let strArr = [...new Set(str)] + return strArr.join('') +} +console.log(removeRepetition('aaa')) // ->a +console.log(removeRepetition('abbba')) // ->ab +console.log(removeRepetition('aabbaabb')) // ->ab +console.log(removeRepetition('')) // -> +console.log(removeRepetition('abc')) // ->abc +``` + +## 其他解法 + +- [filter 结合 call Method](https://www.programminghunter.com/article/7794242622/) +- [用 for 循环的两种方式](https://www.cnblogs.com/zyc-zsxbh/p/9327364.html) diff --git a/src/routes/2022-03-07-obsidian-notes1.md b/src/routes/2022-03-07-obsidian-notes1.md new file mode 100644 index 00000000..2730b953 --- /dev/null +++ b/src/routes/2022-03-07-obsidian-notes1.md @@ -0,0 +1,101 @@ +--- +title: Obsidian · 网课学习笔记整理 +summary: 拆分整合的过程 +created: 2022-03-06T16:23:33.118Z +tags: + - Obsidian +categories: + - Obsidian +lastmod: 2022-04-07T07:20:39.933Z +--- + +最近在用 obsidian 做网课学习笔记,感觉还挺好用的。简单记一下我记笔记的一些方法(其实也不算什么方法)需要用到的插件:Image Auto Upload,用来传图片。 + +其实我的记笔记方法很简单,就是不断拆碎重组,方便后面查找。 + +上课时,先按时间顺序书写笔记,就像传统的笔记本一样,上完课后再将那一页笔记拆碎重组到知识结构中。方法论大概是 MOC?就是用索引去整理笔记结构,而不是所处文件夹的层次,这里我们先不做深入探讨。 + +下面以学习 JavaScript 为例子。 + +我近期的笔记目录页面(用 Logseq 发布):[JavaScript](https://javascript-logseq.netlify.app/#/page/javascript) + +## 具体的方法 + +我把几乎所有的笔记都放在一个叫 `Zone` 的文件夹内,常用的会打上星标,或者移到最外层文件夹,新笔记默认放在 `Zone` 文件夹下。 + +### Step1-构建地图 + +MOC 是 Map of Contents,也就是内容地图,所以我们会从构建一张地图出发。刚开始地图不需要太完美,很精细,因为一个不识路的人是没办法认路的,何况是指路、画地图,反正后面也要调整,可以随意一点。 + +我刚开始创建了一个叫 `JavaScript` 的索引页,里面用标题列了几项比较重要的内容,比如 OOP / DOM 之类的,然后在页面最上面列了几项常用的内容: +![](https://s2.loli.net/2022/03/06/ybuxoSJmQGKcAV3.png) + +之后会以这一页内容为目录索引,不断补充和修改,构建自己的知识结构 + +### Step2-写课堂笔记 + +首先需要创建一个空白页面。我用 Obsidian 里自带的插件 `ZK 卡片 ` 创建,可以自动生成时间戳标题,这个功能可以在设置里打开: + +![](https://s2.loli.net/2022/03/06/ZXVqaIcS4xy6Evs.png) + +然后点击左边功能栏就可以创建并打开了 + +![](https://s2.loli.net/2022/03/06/VQZpj96GbzxhO7i.png) + +创建好之后,把这页笔记添加到索引页中,方便后面查找: + +![](https://s2.loli.net/2022/03/06/Xr9CR7dfekTts5M.png) + +然后就可以写课堂笔记了,如果需要在笔记中插入图片,可以使用 Image Auto Upload 这个插件,配合 PicGo 客户端,可以在 Obsidian 里上传图片到图床,非常好用,直接粘贴图片到页面就可以了,具体可以看插件描述。 + +![](https://s2.loli.net/2022/03/06/V8SgsyWqONeYwjB.png) + +记笔记的过程没什么特别的,如果提到了一些我还不了解,以后还想深入的话题,我会用 `[[ ]]` 先标出来, 后面整理笔记的时候看到会留意下。 + +### Step3-重组笔记 + +做完笔记后,将笔记重组。 + +#### 布局 + +先打开三个窗口,布局如下: + +![](https://s2.loli.net/2022/03/06/QwSIsWMHUlbZ71r.png) + +其中课堂笔记和索引页面需要锁定,这样新打开的窗口就会一直在右下角那个地方,将在这个区域编辑笔记内容。 + +#### 结构编辑 + +浏览课堂笔记大纲,看下本节课的知识点应该放在索引里的哪里,知识点之间应该是怎样的关系,在索引里用 `[[]]` 都列出来,简而言之就是画思维导图。我的一个比较粗糙的整理: + +![](https://s2.loli.net/2022/03/06/bHa4rFvRIB58jeT.png) + +这样就可以比较直观地看到哪些内容整理了,哪些没有整理。 + +#### 拆分笔记 + +然后就可以将左边的笔记拆分整合到右边的索引中了,按住快捷键 `CMD`,鼠标点击索引里的链接打开新页面,然后在右下部分复制整理。写完一个知识点后可以不用关闭窗口,按住 `CMD` 然后点击链接,继续在右下窗口编辑笔记。 + +看到索引浅色链接(没有创建页面的)都没了,就基本整理完了,可以再看看课程笔记里有没有要补充的。 + +然后就整理完啦!之后继续补充索引页面就好了……^\_^ + + diff --git a/src/routes/2022-03-09-caesar-cipher.md b/src/routes/2022-03-09-caesar-cipher.md new file mode 100644 index 00000000..e4b07a61 --- /dev/null +++ b/src/routes/2022-03-09-caesar-cipher.md @@ -0,0 +1,116 @@ +--- +title: JavaScript · Caesar Cipher 凯撒加密 +summary: 用JavaScrpit编码实现凯撒加密算法 +created: 2022-03-08T16:01:08.850Z +tags: + - JavaScript +categories: + - JavaScript +lastmod: 2022-04-07T07:20:47.694Z +--- + +## 题目 + +来源:[操作字符串对象 | 百度前端技术学园](http://ife.baidu.com/javascript/string.html#%E5%AD%97%E7%AC%A6%E4%B8%B2) + +编码实现凯撒加密算法,根据输入的偏移量,实现对字符串的加密和解密. + +恺撒加密(Caesar cipher),是一种最简单且最广为人知的替换加密技术。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。 + +例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,以此类推。 + +**需求说明** + +- 点击加密按钮,根据用户输入的偏移量,对明文进行加密,加密后的为密文,显示在密文输入框中 +- 点击解密按钮,根据用户输入的偏移量,对密文进行加密,解密出来的为明文,显示在明文输入框中 + +## 解法 + +- `string.replace` 替换数字 +- 用`.charCodeAt()` 获取字母编码 +- 正则表达式`/[A-Za-z]/g`选择字母 +- 偏移量超过范围的,往反方向偏移 +- 结果验证:[凯撒密码加密/解密 - 一个工具箱 ](http://www.atoolbox.net/Tool.php?Id=778) + +### HTML + +```html + + +
+ +``` + +### JS + +```js +let offsetInput = document.querySelector('input[name=offset]') +let plain = document.querySelector('input[name=plain') +let enc = document.querySelector('input[name=enc]') + +// 加密 +function encrypt() { + let offset = Number(offsetInput.value) + function conver(s) { + let charCode = s.charCodeAt(0) + // 替换大写字母 A-Z:65-90 + if (charCode <= 90 && charCode >= 65) { + return String.fromCharCode(charCode + offset < 90 ? charCode + offset : charCode - offset) + } else { + //替换小写字母 a-z:97-122 + return String.fromCharCode(charCode + offset < 122 ? charCode + offset : charCode - offset) + } + } + enc.value = plain.value.replace(/[A-Za-z]/g, conver) + + // 替换大写字母 A-Z:65-90 + // function transUpper(s) { + // let charCode = s.charCodeAt(); + // return String.fromCharCode( + // charCode + offset <= 90 ? charCode + offset : charCode - offset + // ); + // } + + // //替换小写字母 a-z:97-122 + // function transLower(s) { + // let charCode = s.charCodeAt(); + // return String.fromCharCode( + // charCode + offset <= 122 ? charCode + offset : charCode - offset + // ); + // } + // let encUpper = plain.replace(/[A-Z]/g, transUpper); + // enc.value = encUpper.replace(/[a-z]/g, transLower); +} + +// 解密 +function decrypt() { + let offset = Number(offsetInput.value) + function conver(s) { + let charCode = s.charCodeAt(0) + // 替换大写字母 A-Z:65-90 + if (charCode <= 90 && charCode >= 65) { + return String.fromCharCode(charCode - offset < 65 ? charCode + offset : charCode - offset) + } else { + //替换小写字母 a-z:97-122 + return String.fromCharCode(charCode - offset < 97 ? charCode + offset : charCode - offset) + } + } + plain.value = enc.value.replace(/[A-Za-z]/g, conver) +} +``` + +## 参考 + +- [凯撒密码 javascript](https://blog.csdn.net/dikanjiang6340/article/details/101264748?utm_relevant_index=1) +- [Caesar Cipher in Javascript - Stack Overflow](https://stackoverflow.com/questions/44232645/caesar-cipher-in-javascript?newreg=0a8ff4c05c484b01a7df20821475fb15) diff --git a/src/routes/2022-03-09-css-tab.md b/src/routes/2022-03-09-css-tab.md new file mode 100644 index 00000000..d3b72ed4 --- /dev/null +++ b/src/routes/2022-03-09-css-tab.md @@ -0,0 +1,101 @@ +--- +title: CSS · Tab选项卡 +summary: 一个纯 CSS 实现的 Tab 选项卡 +created: 2022-03-09T07:42:25.299Z +tags: + - CSS +categories: + - CSS +lastmod: 2022-04-07T07:40:02.371Z +--- + +一个纯 CSS 实现的 Tab 选项卡 + +## 原理 + +> 通过隐藏的 `input` 和与之关联的 [label](https://so.csdn.net/so/search?q=label&spm=1001.2101.3001.7020) 点击 `label` 触发 `input` 的 `checked` 状态触发的,再配合使用元素状态的伪类 `:checked `样式就可以实现不同状态的切换,中间的过度效果还可以配合 CSS3 的 `transition`过度效果实现 [^1]。 + +## 代码 + +- `input` 的`name` 都一样,`id`不同 + +### HTML + +```html +
+ + + + + + + + + + + + +
+

THIS IS TAB1 CONTENT

+

Notice the gap between the content and tab after applying background cololr

+
+
+

THIS IS TAB2 CONTENT

+

Notice the gap between the content and tab after applying background cololr

+
+
+

THIS IS TAB3 CONTENT

+

Notice the gap between the content and tab after applying background cololr

+
+
+``` + +### CSS + +```css +/* 隐藏input和tab内容 */ +.tab-frame input, +.tab-content { + display: none; +} + +/* 导航栏样式:未选中时 */ +.tab-frame label { + color: #555; + padding: 10px 20px; + border-bottom: 1px solid #555; + cursor: pointer; + float: left; +} + +/* 导航栏样式:选中时 */ +.tab-frame input:checked + label { + color: #0f71aa; + border: 1px solid #555; + border-bottom: none; + border-radius: 4px 4px 0px 0px; + cursor: default; +} + +/* Tab内容样式 */ +.tab-frame .tab-content { + color: #0f71aa; + font-size: 1.5rem; + font-weight: bold; + padding-top: 40px; + clear: left; +} + +/* 点击的时候显示tab内容,即input checked的时候显示label*/ +.tab-frame input:nth-of-type(1):checked ~ .tab-content:nth-of-type(1), +.tab-frame input:nth-of-type(2):checked ~ .tab-content:nth-of-type(2), +.tab-frame input:nth-of-type(3):checked ~ .tab-content:nth-of-type(3) { + display: block; +} +``` + +## 参考 + +Demo:[Tabs CSS & HTML, no JS & Jquery](https://codepen.io/llgruff/pen/ZGBxOa) + +[^1]: [CSS tab 选项卡 (标签页) 切换](https://blog.csdn.net/baiding1123/article/details/51889201) diff --git a/src/routes/2022-03-09-typewriter.md b/src/routes/2022-03-09-typewriter.md new file mode 100644 index 00000000..4e4d3d33 --- /dev/null +++ b/src/routes/2022-03-09-typewriter.md @@ -0,0 +1,59 @@ +--- +title: JavaScript · 打字机效果生成器 +summary: 用 JavaScript 实现网页打字机效果 +created: 2022-03-08T16:19:05.137Z +tags: + - JavaScript +categories: + - JavaScript +lastmod: 2022-04-07T07:40:27.758Z +--- + +## 题目 + +来源:[百度前端学院](http://ife.baidu.com/javascript/string.html#%E4%BB%BB%E5%8A%A1%E5%9B%9B) + +参照 [打字机效果 DEMO (opens new window)](https://b.bdstatic.com/searchbox/icms/searchbox/img/%E6%89%93%E5%AD%97%E6%9C%BA.gif),实现一个打字机效果生成器 + +**需求说明** + +- 在输入框中输入需要实现打字机效果的文本 +- 实现原理使用定时器间隔一段时间递增地截取字符串的长度 +- 点击 button 实现打字机效果的生成,将文本输出到 id 为 showText 的标签中 + +```html + + + +

+ +``` + +## 解法 + +```html + + + +

+ +``` + +## 参考 + +[How TO - Typing Effect](https://www.w3schools.com/howto/howto_js_typewriter.asp) diff --git a/src/routes/2022-03-10-forty.md b/src/routes/2022-03-10-forty.md new file mode 100644 index 00000000..d97b77d1 --- /dev/null +++ b/src/routes/2022-03-10-forty.md @@ -0,0 +1,30 @@ +--- +title: Forty页面仿写 +summary: 完成 HTML、CSS 代码编写,暂无 JavaScript +created: 2022-03-10T08:38:17.227Z +preview: '' +draft: '' +tags: + - CSS + - HTML +lastmod: 2022-04-07T07:39:48.473Z +--- + +## 题目 + +来源:[百度前端学院|浮动实战任务](http://ife.baidu.com/csspart/floatTask.html) + +通过 HTML 及 CSS 参考[示例图](https://b.bdstatic.com/searchbox/icms/searchbox/img/task1.png)实现页面开发,要求实现效果与示例图基本一致 + +- 页面宽度固定(定宽), 请应用 CSS 浮动以及前几天所学的 CSS 样式来完成页面效果 +- 只需要完成 HTML、CSS 代码编写,不需要写 JavaScript + +## 示例图 + +![](https://s2.loli.net/2022/03/10/V9ZpjQYFvxEDGXJ.jpg) + +## Demo + +https://forty-seviche.netlify.app/ + +耗时:4 小时(还没有做自适应等很多东西……╮( ̄ ▽  ̄"")╭ diff --git a/src/routes/2022-03-11-miniflux-to-pocket.md b/src/routes/2022-03-11-miniflux-to-pocket.md new file mode 100644 index 00000000..9269cee6 --- /dev/null +++ b/src/routes/2022-03-11-miniflux-to-pocket.md @@ -0,0 +1,117 @@ +--- +title: Miniflux · 保存文章到 Pocket 以及 RSS +summary: 将 Miniflux 上的文章到保存到 Pocket/Instapaper,以及 RSS 相关文章和资源 +created: 2022-03-10T16:24:38.663Z +preview: '' +draft: '' +tags: + - RSS + - Miniflux +changelogs: + - tag: '202203011' + summary: + - 添加了`instapaper`的连接方式 + - 添加了Pocket按钮嵌入方式 +lastmod: 2022-04-07T07:38:52.406Z +--- + +将 Miniflux 上的文章到保存到 Pocket/Instapaper,以及 RSS 相关文章和资源 + +Miniflux 文档: [Integration with External Services](https://miniflux.app/docs/services.html) + +## 1. 创建 Pocket Application + +在 [这里](https://getpocket.com/developer/apps/new) 创建一个 Pocket 应用,以获取 Consumer Key + +我的设置如下: + +![](https://s2.loli.net/2022/02/24/yfXLehkWrisS9Hb.png) + +## 2. 获取 Consumer Key 用户密钥 + +在**My Apps**下面找到刚刚创建的应用,复制 Consumer Key: + +![](https://s2.loli.net/2022/02/24/vO4jyhTfBaHRZ6n.png) + +在 Miniflux 后台,设置 → 集成 → Pocket → **Pocket 用户密钥**(第一栏)中 填入刚刚复制的 Consumer key + +## 3. 获取 Access Token 访问密钥 + +填好后,通过通过点击下面的 **连接您的 Pocket 账户** 自动获取 Access Token(访问密钥): + +![](https://s2.loli.net/2022/03/10/tzYeCNksmRaBIFj.png) + +点击链接后按 **授权**。 +![](https://s2.loli.net/2022/03/11/sZOU8tBpjAJW3ol.png) + +这里可能会跳到 `http://localhost/integration/pocket/callback` 然后就无法访问页面了,解决办法很简单,把 `localhost` 改为你的服务器 ip 端口或者 miniflux 所在域名即可,如 `http://miniflux.com/integration/pocket/callback`,按回车会跳回到 miniflux 设置页面。 + +出现这个提醒就连接成功了: +![](https://s2.loli.net/2022/03/11/ktoi3lOGjpQHP9B.png) + +然后就可以点击文章页面的**保存**测试看看。 +![](https://s2.loli.net/2022/03/11/uCBj6IAWxN149Xo.png) + +## 其他 + +### 1.为博客添加 Pocket 收藏按钮 + +在 [此处](https://getpocket.com/publisher/button)复制需要的 Pocket 收藏按钮样式,添加到主题的 layout 里面(具体要看不同主题的设置,wordpress 似乎有内置这功能,我不确定,有三种效果。 + +### 2.用 Fever 同步到 Reeder + +1. 在 Miniflux 中创建 Fever 账户和密码 +2. 在 Reeder 中添加 Fever 账号,其中: + +- server:`https://miniflux 的网址/fever` +- email:Fever 用户名 +- password:就是 Fever 密码 + +### 3.连接到 Instapaper + +官网:[Instapaper](https://www.instapaper.com/) + +用户名为 Instapaper 的登录邮箱,设置好更新下就可以了~ + +## RSS 相关内容 + +来都来了,整理一下最近看过的相关内容,因为隐私问题,长毛象上的嘟文暂时不贴(除了我自己的 + +### 1. Miniflux 搭建 + +- [RSS | RSSHub 搭配 Miniflux,实现订阅自由](https://mantyke.icu/2021/rsshub-miniflux/) +- [Miniflux | 利用 Docker-compose 搭建 RSS 阅读器](https://blog.tantalum.life/posts/build-miniflux-in-docker/#%E6%90%AD%E5%BB%BA%E8%BF%87%E7%A8%8B) +- [Miniflux:自建私有 RSS 订阅工具,可多用户使用](https://www.moerats.com/archives/385/comment-page-1) +- [简易 RSS 阅读器 | Miniflux 2 安装教程](https://www.moewah.com/archives/3157.html) + +### 2. 其他选择 + +- [RSS 服务对比评测](https://type.cyhsu.xyz/2018/05/rss-aggregators-review-2018/) +- [找不到满意的 RSS 服务?你可以自己搭建一个](https://sspai.com/post/57498) +- [用 Tiny Tiny RSS 自建 RSS 服务](https://type.cyhsu.xyz/2017/10/use-ttrss-to-build-a-self-hosted-rss-service/) +- [(另一篇)Tiny Tiny RSS 教程](https://sspai.com/post/42787) +- [(2021) 自建 RSS 阅读器 Tiny Tiny RSS 教程,docker 安装 Awesome TTRSS](https://blog.naibabiji.com/tutorial/tiny-tiny-rss.html) +- [创建一个私有的 rss 订阅工具 Wallabag](https://www.vpslala.com/t/762) + +### 3. RSS 生成 + +- [可能是目前最全的 RSS 源,微信公众号也有!](https://mp.weixin.qq.com/s/K00wWvlAJu4KLbxru9-bXQ) +- [Feed Creator](http://createfeed.fivefilters.org/) +- [根据页面 HTML 生成 RSS 链接](https://social.datalabour.com/@nonsense/107824299041894067) +- [你的专属 RSS 源:在自己的 VPS 上安装 RSSHub](https://sspai.com/post/66451) +- [8 个好用的 WordPress RSS Feed 插件](https://www.wpdaxue.com/wordpress-rss-feed-plugins.html) + +### 4. 看什么 + +- [分享你认为值得订阅的内容 | Notion 小活动 Vol.13](https://www.notion.so/cnotion/Notion-Vol-13-89e51bdb621a4e009e7ec60d1cc58c2f#16368490755248a28efa4c229dc56321) +- [产品沉思录|优质订阅源](https://www.notion.so/ca290ef313804bae8584804440548c80?v=4470668a5078437f816b0273ed042ebf) +- [中文 Newsletter 导航](https://www.notion.so/kfang/Newsletter-68ee46c0a4574f659fb8a873ead438c6) +- [中文独立博客列表](https://github.com/timqian/chinese-independent-blogs) + +#### 5. 关于 RSS + +- [论 RSS 的「复兴」](https://type.cyhsu.xyz/2018/04/on-the-so-called-revival-of-rss/) +- [关于 RSS 协议的一些迷思](https://blog.dylanwu.space/2021/11/30/myth-of-rss.html) +- [是 RSS 复兴的时候了(翻译 )](https://www.fengkx.top/post/translation-of-RSS-revival/) +- [RSS3](https://rss3.io/) +- [拆解 RSS3— 是否可以真正的开启 Web3 社交?](https://mp.weixin.qq.com/s/CYmXvEHSd7idhDHtEe3ehw) diff --git a/src/routes/2022-03-29-12px.md b/src/routes/2022-03-29-12px.md new file mode 100644 index 00000000..08c2bd02 --- /dev/null +++ b/src/routes/2022-03-29-12px.md @@ -0,0 +1,52 @@ +--- +title: CSS · 解决 Chrome 中小于12px的字体不显示的问题 +lastmod: 2022-04-07T07:36:23.629Z +summary: 先用scale总体缩小再补上减少的宽度 +created: 2022-03-29T13:46:29.228Z +tags: + - CSS + - CSS Trick +categories: + - CSS +toc: false +--- + +如设置字体大小为 10.2px + +### HTML + +```html +

+ I am a frontend developer with a particular interest in making things simple and automating daily tasks. I try to keep up with + security and best practices, and am always looking for new things to learn. +

+``` + +### CSS + +```css +p { + color: #dcdcdc; + + /*缩小基准大小,也就是缩小后的字体应该是 10.2px=12px*0.85*/ + font-size: 12px; + + /* 缩小比例 10.2px/12px=0.85 */ + transform: scale(0.85); + + /*设置缩放中心*/ + transform-origin: 0 0; + + /*(1-0.85)+1,补上缩小的宽度,这里可以按视觉效果调整一点*/ + width: 118%; + + /*兼容IE*/ + *font-size: 10.2px; +} +``` + +参考: + +- [css 小于 12px 字体\_MAIMIHO 的博客-CSDN 博客](https://blog.csdn.net/maimiho/article/details/121548769) +- [css 设置字体小于 12px 的方法 - 代码先锋网](https://www.codeleading.com/article/46263149244/) +- [Set CSS font-size less than 12px in webkit browser](https://codepen.io/mjj2000/pen/AYEqwJ) diff --git a/src/routes/2022-05-07-vps-init.md b/src/routes/2022-05-07-vps-init.md new file mode 100644 index 00000000..a2d4de09 --- /dev/null +++ b/src/routes/2022-05-07-vps-init.md @@ -0,0 +1,363 @@ +--- +title: VPS 安全初始化 +created: 2022-05-06 +summary: 上次 VPS 被别人暴力破解了,一哭二闹三重装之后,有了本文 +tags: + - VPS + - Self hosted +--- + +**前情提要:** + +前段时间我所购买的 VPS 服务商 Contabo 发邮件来说,我用 VPS 攻击了其他的服务器,让我快点停止这种行为,要是不改就罚我的钱,但是我并没有在上面装什么奇怪的东西,就只装了一个聊胜于无的 WordPress,手足无措之余在 Mastodon 哀嚎了一下,得到了很多热心网友的帮助,才发现原来我一直在裸奔使用 VPS,什么安全措施都没采取:( + +鉴于 VPS 上本来就没有什么东西,我决定重新初始化机子,本文是初始化的笔记,我的系统是 Ubuntu 20.04,文中提到的 ufw 是内置的,没有额外安装, 有些步骤上有所省略,最好对照着提到的参考文章看。 + +(再次感谢 Allen Zhong、糖喵、南狐、shrik3 等朋友的热心指导 o(≧v≦)o!) + +## 思路 + +下面这两点都是 Contabo 客服发给我的防护建议,用 Deepl 翻译了一下 + +### 日常防护 + +- 检查你的服务器是否有可疑的进程并删除它们(例如使用以下命令:ps aux| grep stealth) +- 检查错误日志,例如/var/log/apache2/error_log,找出是否有任何恶意脚本的错误信息或恶意软件下载的迹象。 +- 攻击者经常在以下目录中安装恶意软件。/tmp/ , /var/tmp/ - 请使用 find /tmp (find /var/tmp) 来检查隐藏的文件。 +- 扫描你的服务器以防止安装的 rootkits。 +- 运行一个防病毒软件,如 ClamAV 或 ClamWin。 + +### 安全检查 + +1. 保持定期备份。 +2. 保持你的整个系统一直是最新的,这意味着你必须定期安装使用的软件包和网络应用程序的更新和补丁。 +3. 安装并运行一个防病毒软件,如 ClamAV 或 ClamWin,以保持你的服务器不受恶意软件侵害。 +4. 设置一个防火墙,关闭所有你不需要的端口,并将 SSH 的 22 或 RDP 的 3389 等默认端口改为其他。 +5. 通过安装一个合适的软件,如 cPHulk 或 Fail2ban,阻止暴力攻击。 +6. 避免使用只在不安全的设置下工作的脚本。 +7. 不要点击电子邮件中的任何可疑附件或链接,或访问不安全的网站。 +8. 使用 SSH-Keys 而不是密码。 + +--- + +最后我将 VPS 里的内容全删了,从 0 出发,下面是具体的操作步骤: + +## 1. 创建新用户 + +参考: [VPS 建站新手上路 - YOLO](https://yolo.blue/vps-hosting-setup/) + +首先用 root 登陆,然后输入 adduser + 用户名 创建新用户,如添加用户`jack` + +```shell +adduser jack +``` + +接着输入两遍密码,其他信息可以按 Enter 留空 + +给这个用户 root 权限: + +```shell +sudo usermod -aG sudo jack +``` + +其他参考: [如何在 Ubuntu 上添加和删除用户 | myfreax](https://www.myfreax.com/how-to-add-and-delete-users-on-ubuntu-18-04/) + +## 2. 配置 SSH-keys + +参考: [给 VPS 配置 SSH 密钥免密登录 - P3TERX ZONE](https://p3terx.com/archives/configure-ssh-keyfree-login-for-vps.html) + +### 本地生成 SSH 密钥对 + +文中提到可以在远端 VPS 上,也可以在本地,这里我选择在本地生成。 + +打开终端,输入 `ssh-keygen` ,连续按四次 Enter (密码设置为空),如果出现了 `overwrite(y/n)?` 就说明之前就有生成了,你可以选择 `y` 重新生成一个,或者就用已有的这个 + +比如: + +```bash +root@p3ter:~# ssh-keygen # 输入命令,按 Enter 键 +Generating public/private rsa key pair. +Enter file in which to save the key (/root/.ssh/id_rsa): # 保存位置,默认就行,按 Enter 键 +Enter passphrase (empty for no passphrase): # 输入密钥密码,按 Enter 键。填写后每次都会要求输入密码,留空则实现无密码登录。 +Enter same passphrase again: # 再次输入密钥密码,按 Enter 键 +Your identification has been saved in /root/.ssh/id_rsa. +Your public key has been saved in /root/.ssh/id_rsa.pub. +The key fingerprint is: +SHA256:GYT9YqBV4gDIgzTYEWFs3oGZjp8FWXArBObfhPlPzIk root@p3ter +The key's randomart image is: ++---[RSA 2048]----+ +|*OO%+ .+o | +|*=@.+++o. | +| *o=.=.... | +|. +.B + +o. | +| . + E *S. | +| o o | +| . | +| | +| | ++----[SHA256]-----+ +``` + +出现那个神秘的矩形就是生成好了 + +### 安装公钥 + +在本地终端: + +```bash +ssh-copy-id -pport user@remote +``` + +`user` 为用户名,`remote` 为 IP 地址,`port` 为端口号。 + +也可以不加端口号: + +```bash +ssh-copy-id user@remote +``` + +然后按要求输入密码,如果是用 root 登陆的,就是用的初始密码,如果是用上面设置的新用户,那就跟之前设置的用户密码一样 + +### 修改权限 + +**登入 VPS **后,在远程终端输入: + +```bash +chmod 600 .ssh/authorized_keys +``` + +### 修改 sshd 配置文件 + +打开配置文件: + +```bash +nano /etc/ssh/sshd_config +``` + +找到下面这两行,并改成这样: + +```bash +PermitRootLogin no +AllowUsers username #如果没有这一行就手动添加 +RSAAuthentication yes #这一行我找不到就没有配置 +PubkeyAuthentication yes +``` + +记得 username 要换成自己设置的名字,也就是上面配置的 jack + +修改完按 Ctrl+o 保存,Enter 确认,Ctrl+X 退出编辑 + +重启 ssh 服务 + +```bash +systemctl reload sshd +``` + +或者 + +```bash +service sshd restart +``` + +### 禁用密码登陆和改端口 + +设置好后,试试看能不能用 ssh 登陆,如果可以,再 `sudo nano /etc/ssh/sshd_config` 修改配置,禁用密码登陆: + +```bash +PasswordAuthentication no +``` + +### 修改默认登陆端口 + +然后改默认登陆端口[^1],应该什么数都可以吧,什么 8080,9080,8888,3141…… + +找到 `Port 22` 这行,在下面加你要开的口 + +```bash + Port 22 + Port 8888 +``` + +加完了之后重启 + +```bash +sudo service sshd restart +``` + +打开防火墙并给你设置的端口放行 + +```bash +sudo ufw allow 8888 +sudo ufw enable +``` + +`sudo ufw status` 查看防火墙状态,比如: + +```bash +Status: active + +To Action From +-- ------ ---- +8888 ALLOW Anywhere +8888 (v6) ALLOW Anywhere (v6) +``` + +然后重新连接一下 VPS,用设置好的端口登陆看看,如果没问题的话重新 `sudo nano /etc/ssh/sshd_config` ,注释掉 `Port 22` 那一行 + +## 3. 安装 ClamAV + +参考: + +- [如何在 Ubuntu 20.04 LTS 上安装 ClamAV - LinuxCapable](https://www.linuxcapable.com/zh-CN/%E5%A6%82%E4%BD%95%E5%9C%A8-ubuntu-20-04-%E4%B8%8A%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8-clamav/) +- [How to Install and Use ClamAV on Ubuntu 20.04](https://linoxide.com/how-to-install-and-use-clamav-on-ubuntu-20-04/) + +### 安装 + +```bash +sudo apt update +sudo apt install clamav clamav-daemon -y +``` + +### 更新病毒数据库 + +先停止 `clamav-freshclam` 服务 + +```bash +sudo systemctl stop clamav-freshclam +``` + +执行更新: + +```bash +sudo freshclam +``` + +启动`clamav-freshclam` 服务 + +```bash +sudo systemctl start clamav-freshclam +``` + +### 开机启动 + +```bash +sudo systemctl is-enabled clamav-freshclam +``` + +### 下载 ClamAV 数据库 + +先关掉 clamav-freshclam 再下载 + +```bash +sudo systemctl stop clamav-freshclam +sudo freshclam +``` + +查看 clamav 的目录和文件的日期 + +```bash +ls /var/lib/clamav/ +``` + +### 限制 Clamscan CPU 使用率 + +**`nice`**:降低 clamscan 的优先级(限制相对 cpu 时间)。 + +```bash +sudo nice -n 15 clamscan +``` + +**`cpulimit`**:限制绝对的 CPU 时间。 +安装 cpulimit + +```bash +sudo apt-get install cpulimit +``` + +使用 cpulimit 来限制 clamscan: + +```bash +cpulimit -z -e clamscan -l 20 & clamscan -ir / +``` + +### 常见 CLI + +```bash +clamscan /home/filename.docx #扫描特定目录或文件 +clamscan --no-summary /home/ #扫描结束时不显示摘要 +clamscan -i / #打印受感染的文件 +clamscan --bell -i /home #警惕病毒检测 +clamscan -r --remove /home/USER #删除受感染的文件 +``` + +### ClamAV 返回码 + +- 0:未发现病毒。 +- 1:发现病毒。 +- 2:发生了一些错误。 + +## 4. 安装 Fail2ban + +安装 fail2ban 以阻止重复登录尝试 + +参考:[准备你的机器 - Mastodon documentation](https://docs.joinmastodon.org/zh-cn/admin/prerequisites/) + +### 准备 + +更新软件包: + +```bash +sudo apt update +sudo apt upgrade -y +``` + +### 安装 + +参考:[如何在 Ubuntu 20.04 上安装和配置 Fail2ban](https://www.myfreax.com/install-configure-fail2ban-on-ubuntu-20-04/) + +```bash +sudo apt install fail2ban +``` + +安装完后将自动启动,可以用`sudo systemctl status fail2ban` 查看运行状态 + +### 修改配置: + +打开`/etc/fail2ban/jail.local`: + +```bash +sudo nano /etc/fail2ban/jail.local +``` + +写入下面的内容,修改邮箱,如果端口改了,也要记得相应修改 + +```text +[DEFAULT] +destemail = your@email.here +sendername = Fail2Ban + +[sshd] +enabled = true +port = 22 + +[sshd-ddos] +enabled = true +port = 22 +``` + +重启 fail2ban: + +```bash +sudo systemctl restart fail2ban +``` + +## 5. SSL 证书相关 + +还没弄明白怎么回事,待更 + +参考: + +- 【[杂谈】防止 SSL 证书泄露你的源站 IP](https://luotianyi.vc/5056.html) +- [WEB 服务器安全指南 - 防止源站 IP 暴露](https://blog.hicasper.com/post/114.html) + +[^1]: [更改 VPS 的默认 SSH 端口 22 – 托尼的博客](https://zhucaidan.xyz/2019/12/281/) diff --git a/src/routes/2022-05-25-git.md b/src/routes/2022-05-25-git.md new file mode 100644 index 00000000..effca0d9 --- /dev/null +++ b/src/routes/2022-05-25-git.md @@ -0,0 +1,87 @@ +--- +title: Git · 常用操作笔记 +created: 2022-05-25 +summary: 每次更新博客进行的操作以及常见错误处理 +tags: + - Git +--- + +**资料:** + +- [GIT CHEAT SHEET](https://education.github.com/git-cheat-sheet-education.pdf) +- [45 个 Git 经典操作场景,专治不会合代码](https://mp.weixin.qq.com/s/BzdgZXyM1UaNCUCXySL9Rw) +- [版本控制(Git) - 计算机教育中缺失的一课](https://missing-semester-cn.github.io/2020/version-control/) +- [战壕里面的 Git(Git In The Trenches)](http://cbx33.github.io/gitt/intro.html) + +## 每次更新博客进行的操作 + +### 1. 追踪所有文件 + +(除了 gitignore 里面的),也可以单独加 + +`git add -A` + +### 2. 提交上传信息 + +`git commit -m '一些信息,如fixed something etc'` + +### 3. push 到 Github + +`git push origin main` + +等待一会儿就好了,如果不行,换个网或者关掉 VPN 看看 + +## 常用 Git 操作 + +- `.gitignore`: 放不想传到 git repo 的文件/文件夹 +- 当内容改动很多的时候,最好开一个 branch +- VSCode 文件后面的字母: + - U:untrack + - M: modified + - A : on track +- 一般不在`main` 或`master` 修改代码,而是开一个 branch,确定好后再 merge +- 下载叫做 pull,上传是 push + +| 命令 | 作用 | +| :----------------------------------------------------------- | ------------------------------------------------- | +| `git config --global user.name 名字` | 设置名字 | +| `git config --global user.email 邮箱` | 设置邮件 | +| `git init` | 初始化 | +| `git add -A` | 追踪所有文件(除了 gitignore 里面的),也可以单独加 | +| `git commit -m` | m 代表信息,后面要写 commit 相关信息 | +| `git status` | 查看 git 状态/信息 | +| `git log` | 查看 commit 日志,按 Q 才可以退出 | +| `git reset hard (commit的id)` | 回到特定版本 | +| `git reset hard --HEAD` | 返回上一次改动 (还没有 commit) | +| `git branch` | 列出现在有的 branch,按 Q 退出 | +| `git branch (branch'name)` | 创建新 branch | +| `git merge (branch'name)` | 合并 branch 到 main | +| `git checkout (branch's name)` | 切换 branch | +| `git remote add origin https://github.com/用户名/仓库名.git` | 链接到 remote repo | +| `git pull` | 拉更新 | +| `git push origin (branch'name)` | push 到 remote repo | + +## 常见问题 + +下面是一些我看过的文章 + +### 版本回滚 + +- [项目中 git 怎么回退到之前的版本 & git 放弃本地修改,强制拉取更新](https://mp.weixin.qq.com/s/MCtCQg7rcokf6IrZVINF4w) +- [Git 学习笔记:版本回退](https://mp.weixin.qq.com/s/98wEvWU6OYVkPauWn-XXng) +- [如果你还不会用 git 回滚代码,那你一定要来看看](https://mp.weixin.qq.com/s/FPiSyeivTKhoAgJmORZFog) + +### 报错处理 + +- [git push 错误 failed to push some refs to 解决方法](https://blog.csdn.net/qq_39416311/article/details/102219428) +- [git 上传忽略 node_modules](https://blog.csdn.net/jiandan1127/article/details/81205530) + +### 博客相关 + +- [GitHub Pages 绑定来自阿里云的域名](https://blog.csdn.net/qq_29232943/article/details/52786603) +- [Hexo 发布到 Github 丢失 readme 和 CNAME 解决方案](https://www.cnblogs.com/LandWind/articles/8269636.html) +- [把 HUGO 博客托管到 GITHUB 上](https://www.freesion.com/article/37111127345/) + +### 其他 + +- [Github 上如何添加 LICENSE 文件?](https://www.cnblogs.com/chenmingjun/p/8555906.html) diff --git a/src/routes/2022-05-26-write-a-page-template.md b/src/routes/2022-05-26-write-a-page-template.md new file mode 100644 index 00000000..56da5280 --- /dev/null +++ b/src/routes/2022-05-26-write-a-page-template.md @@ -0,0 +1,300 @@ +--- +title: 为博客写一个Project showcase 页面 +created: 2022-05-26 +summary: 第一次Pull Request的经历 +tags: + - Svelte + - Open Source +--- + +这两天为博客写了一个 Project 的页面用来放我的作品,这里记录一下我是怎么写(模仿)的,我对 Svelte 语法的了解不多,没有特别深入学习,只是在官方看了下文档和用了下他们的 [交互式教程](https://www.sveltejs.cn/tutorial/basics) ,编码的过程是一边学习一边模仿慢慢摸索的,虽然最终没有 merge 到 repo 中,但我觉得整个过程都蛮兴奋的。 + +既然有了博客,那我肯定是要写一下这个过程的。 + +## 1. 分析需求 + +我想要的是一个独立的 Page,而不是一个 Post 页面,最后把它放在导航栏里面。 +想要有以下这几个功能: + +- 技术栈分类 +- 项目类别筛选 +- 项目展示 + +主要有这些信息的展示: + +- 项目标题 +- 项目图片 +- 项目描述 +- 技术栈 +- 项目类别 + +## 2. 画原型图 + +明确了需求后,参考了几个项目平台的布局,在 [Whimsical](https://whimsical.com/) 上画了原型图如下: +![](https://s2.loli.net/2022/05/26/8kMa6LPrgUEC7Xb.png) + +目前还没有做上面 Tag 的分类功能,之后可能会做吧 + +## 2. 创建组件样式 CSS + +为了统一风格,我在博客现有框架里四处搜寻可用的组件样式,想在这基础上修改,然后我找到了作者 藍 在 Tailwind Play 上的友链组件,感觉很适合,然后就直接在这个 Tailwind Play Demo 上进行了样式修改,不过此时填写的数据都是死数据,后面再进行修改。 + +因为我之前没有怎么用过 Tailwind,所以是一边对照 Tailwind 文档修改的,然后 Tailwind Play 上的代码提示功能真的很新手友好,hover CSS class 的时候会显示具体的 CSS 原始参数,很直观。 + +![](https://s2.loli.net/2022/05/27/lFwQ8T5YUcdjDfe.png) +最后我构建的 Demo 样式如下: +[Tailwind Play](https://play.tailwindcss.com/uQwYojgpuk?layout=horizontal) + +![](https://s2.loli.net/2022/05/27/g5aYxD9mzlqpj6c.png) + +## 4. 编写组件代码 + +整个页面的构建跟 Friend 页面很像,我分析了 Friend 页面所涉及到的代码和结构,然后一点点模仿构建 Project 页面。 + +### 数据 + +首先根据需求确定传入的数据及其格式,以便后面使用 TypeScript 的提示 + +- 参考:`/src/lib/config/friends.ts` +- 新建:`/src/lib/config/projects.ts` + +```ts twoslash title="/src/lib/config/friends.ts" +export interface FriendOld { + // hCard+XFN + id: string // HTML id + rel?: string // XFN, contact / acquaintance / friend + link?: string // URL + html?: string // HTML + title?: string // 标题 + descr?: string // 描述 + avatar?: string // 头像 + name?: string // backwards compatibility +} + +export type Friend = { + id: string // HTML id + rel?: string // XHTML Friends Network + link?: string // URL + html?: string // Custom HTML + + title?: string // 标题 + name?: string // 人名 + avatar?: string // 头像 + descr?: string // 描述 + class?: { + avatar?: string // 头像类名 + img?: string // 图片类名 + } +} + +export const friends: Friend[] = [ + { + id: 'id', + rel: '', + title: '', + name: '', + link: '', + descr: '', + avatar: '' + } +] +``` + +```ts twoslash title="/src/lib/config/projects.ts" +export type Project = { + id: string + name?: string + tags?: string[] + feature?: string + description?: string + img?: string + link?: string +} + +export const projects: Project[] = [ + { + id: 'coach', + name: 'Find a Coach', + tags: ['Vue 3', 'Composition API'], + feature: 'Vue3', + description: + '既然如何, 问题的关键究竟为何? 要想清楚,科学和人文谁更有意义,到底是一种怎么样的存在。 普列姆昌德曾经提到过,希望的灯一旦熄灭,生活刹那间变成了一片黑暗。这启发了我, 那么, 我认为, 总结的来说,', + img: 'https://uneorange.oss-cn-guangzhou.aliyuncs.com/202205251801454.avif', + link: 'https://seviche.cc' + } +] +``` + +### 组件 + +将 CSS 复制进去,并注入数据 + +- 参考:`/src/lib/components/extra/friend.svelte` +- 新建:`/src/lib/components/extra/project.svelte` + +```html title="/src/lib/components/extra/friend.svelte" + + +{#if friend.id === 'footer'} +