准备搞个升降桌
很早就想搞个升降电脑桌了,不过不是买成品,而是自己 diy,说是 diy 其实就是买电动桌腿和桌板,自己组装。 这次终于不偷懒了,桌腿已下单快到了,但是桌板还没挑。什么材质什么价格才合适呢?头痛。 昨天找了一个商家发样品了,准备白橡木和红橡木之间选一个,阻挡我的应该只有价格。淘宝那个商家偏贵,拼多多找的一家,同尺寸红橡木差了几百块。真难挑。 待续。 我刚记录完,快递小哥就打电话来了,说有一件升降桌腿到了,放在门口了。好吧,这腿子估计要在家晾一段时间。
很早就想搞个升降电脑桌了,不过不是买成品,而是自己 diy,说是 diy 其实就是买电动桌腿和桌板,自己组装。 这次终于不偷懒了,桌腿已下单快到了,但是桌板还没挑。什么材质什么价格才合适呢?头痛。 昨天找了一个商家发样品了,准备白橡木和红橡木之间选一个,阻挡我的应该只有价格。淘宝那个商家偏贵,拼多多找的一家,同尺寸红橡木差了几百块。真难挑。 待续。 我刚记录完,快递小哥就打电话来了,说有一件升降桌腿到了,放在门口了。好吧,这腿子估计要在家晾一段时间。
之前为了方便管理服务器,使用了宝塔,其免费功能就已经能够满足我的需求了。后来虽知道 1Panel 这款开源的面板,但一直没想着去试试,这两天看同事也在用,今天我也就使用它替换了宝塔。 1Panel 的界面,ui 是最吸引我的,更符合现代化的样式设计,比宝塔界面更清爽的感觉,当然可能有人觉得宝塔的样式更清爽,因人而异。截一张概览图: 1Panel 的功能,类似宝塔,没有具体比较两者的功能数量差异,对我目前而言都够用。不过 1Panel 的功能都是免费的,宝塔不少功能都要收费,单这一点,1Panel 更胜一筹。再一个就是 1Panel 的应用商店更丰富,很多好玩实用的,比如青龙,AList 这样的工具,都可以一键安装。目前商店里一共有 85 个软件,基本涵盖各方面应用,这一点宝塔也比不过。期待后续上架更多的应用。商店截图: 目前刚用,感觉良好。后面有新的内容再更新。
本文主要阐述前端框架中的运行时和编译时的区别。首先说明本文内容参考书籍 《Vue.js 设计与实现》,并加以自己的理解创作。有错误的地方还请指出。 运行时 运行时就是指代码实际执行时的阶段。前端代码是在浏览器中执行的,换言之,如果一个框架的代码可以直接在浏览器中执行,那它就是一个纯运行时的框架。 举个例子,假设我们设计了一个框架,它提供一个 Render 函数,用户使用时,为该函数提供一个描述 DOM 树形结构的参数对象,然后 Render 函数根据该对象递归地将数据渲染成 DOM 元素。假设规定要传入的对象结构如下: const obj = { tag: "div", children: [ { tag: "span", children: "hello world!", }, ], }; 对象中有两个属性:tag 代表标签名称,children 可以是数组(代表子节点)也可以是文本(代表文本子节点)。然后实现 Render 函数: function Render(obj, root) { const el = document.createElement(obj.tag); if (typeof obj.children === "string") { const text = document.createTextNode(obj.children); el.appendChild(text); } else if (obj.children) { obj.children.forEach((child) => Render(child, el)); } root.appendChild(el); } 现在可以在浏览器环境中调用 Render 函数:...
本文简单记录一下 any 和 unknown 的区别。 相同点:any 和 unknown 可以是任何类的父类,即任何类型的变量都可以赋值给 any 类型的变量或者 unknown 类型的变量,例: // any let anyVal: any; anyVal = 1; anyVal = "hello"; anyVal = true; anyVal = null; anyVal = undefined; anyVal = []; anyVal = {}; anyVal = function () {}; // unknown let unknownVal: unknown; unknownVal = 1; unknownVal = "hello"; unknownVal = true; unknownVal = null; unknownVal = undefined; unknownVal = []; unknownVal = {}; unknownVal = function () {}; 不同点...
之前写过一篇 通过 Github Actions 实现 Hugo 博客的自动构建部署,现在感觉部署脚本写的有点复杂了,所以重新写了一个脚本,简化了不少,内容如下: name: Auto Deploy on: push: branches: - main pull_request: jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true # Fetch Hugo themes (true OR recursive) fetch-depth: 0 - name: Setup Hugo uses: peaceiris/actions-hugo@v2 with: hugo-version: "0.110.0" extended: true - name: Build run: hugo --minify - name: Rsync Deployments Action uses: Burnett01/rsync-deployments@5.2.1 with: switches: -avzr --delete path: ./public/ remote_path: # 填服务器部署目录 remote_host: # 填服务器IP地址 remote_port: # 填端口号,一般就是 22 remote_user: # 填服务器用户名 remote_key: ${{ secrets....