沉冰浮水https://www.wdssmq.com/置百丈玄冰而崩裂,掷须臾池水而漂摇。「代码片段」两段略奇怪的 JS 代码https://www.wdssmq.com/post/20160621482.html<blockquote> <p>2024-03-13:</p> <p>又研究了一段不明所以的代码,然后想起来之前也搞过一段,就合并在一起了,然后发现当年那段迷惑程度要高不少。。</p> </blockquote> <!--more--> <p><strong>数组中按间隔提取元素:</strong></p> <pre><code class="language-js">(() =&gt; { const allNum = 21; const perNum = 4; /** * @param {int} all 元素总数 * @param {int} per 用于将 all 先分成 per 个一组 * @param {int} offset 通过计算决定从第几个元素开始取,大于等于 0,上不设限 * @returns {string} 返回一个字符串,每 per 个元素换行 */ function fnPickArr(all, per, offset = 0) { const rltArr = []; // const chunkNum = Math.floor(all / per); // ↑ floor 为向下取整,会出现取到 per + 1 个元素的情况 const chunkNum = Math.ceil(all / per); // ↑ ceil 为向上取整,与 floor 相反,会出现取到 per - 1 个元素的情况 // 本质上就是每隔 chunkNum - 1 个元素取一次,两次取余判断 for (let i = 0; i &lt; all; i++) { if (i % chunkNum === offset % chunkNum) { // rltArr[i] = &quot;*&quot;; rltArr[i] = i % per + 1; } else { rltArr[i] = &quot;#&quot;; } } // 遍历 rltArr,拼接为字符,每 per 个元素换行 let rltStr = &quot;&quot;; for (let i = 0; i &lt; rltArr.length; i++) { rltStr += rltArr[i]; if ((i + 1) % per === 0) { rltStr += &quot;\n&quot;; } } return rltStr; } for (let i = 0; i &lt; 6; i++) { console.log(fnPickArr(allNum, perNum, i)); } })(); </code></pre> <p>「- -」「- -」「- -」</p> <p><strong>在研究缓存失效时间时开的一个脑洞,,虽然不是很清楚有什么实用价值:</strong></p> <pre><code class="language-js">(() =&gt; { let m; let lstM; let lstN; for (let n = 0; n &lt;= 50; n++) { if (!m) { m = n + 5; lstN = n - 1; } if (m &lt;= n) { if (n !== 11 &amp;&amp; n !== 12 &amp;&amp; n !== 21) { // if (1 == 1) { fnLog([m - n, m, n, n - lstN, &quot;do some thing&quot;]); lstM = m; m = n + n - lstN; lstN = n + n - lstM; } else { fnLog([m - n, m, n, n - lstN, &quot;skip&quot;]); } } else { fnLog([m - n, m, n, n - lstN]); } } // ---------------------------- function fnLog(n) { if (Object.prototype.toString.call(n) === &quot;[object Array]&quot;) { a = n.join(&quot; , &quot;); } // document.getElementById(&quot;debug&quot;).innerHTML += a + &quot;&lt;br /&gt;&quot;; console.log(a); } })(); </code></pre> <!--2663--><!--2663--> Wed, 13 Mar 2024 21:08:10 +0800「折腾」GM_脚本 + CF Workers KV 半自动收集 B 用户投稿转为 RSShttps://www.wdssmq.com/post/20120519803.html<h2>一</h2> <p>终于还是尝试了这种方式什么的。。。</p> <!--more--> <p>有借助 RSSHub 订阅 B 站用户投稿和番剧更新,几年来整体还算稳定,想着万一反爬变严了就干脆用 <code>GM_脚本</code> 直接从浏览器里抓取数据到远程存储的方式来实现,,然后 2023-12 开始终于发生了。。。</p> <p>就结果来说,本文所述方案的代码已经基本完成了,但是终究是不能自动运行,然后定位上也和标准的 RSS 需求不太一样,,大概还是要研究下给 RSSHub 配置 cookie 。。。</p> <h2>二</h2> <p>关于功能定位,对于部分 up 主,会希望能把历史投稿也看一遍,然而总量上就会很多,采取了基于时间和条目序号分页的方案,以 m 天划分周期,当前周期内输出固定的 n 条数据这样,,具体看代码吧。。。</p> <blockquote> <p>wdssmq/later-url-cf: 使用 Cloudflare Workers KV 存储服务收集网址并以 RSS 输出;</p> <p><a href="https://github.com/wdssmq/later-url-cf" title="wdssmq/later-url-cf: 使用 Cloudflare Workers KV 存储服务收集网址并以 RSS 输出;">https://github.com/wdssmq/later-url-cf</a></p> <p>userscript/packages/later-url at main · wdssmq/userscript</p> <p><a href="https://github.com/wdssmq/userscript/tree/main/packages/later-url#readme" title="userscript/packages/later-url at main · wdssmq/userscript">https://github.com/wdssmq/userscript/tree/main/packages/later-url#readme</a></p> </blockquote> <h2>三</h2> <blockquote> <p>Bilibili2RSS - 为你喜爱的任意 B 站「番剧」添加 RSS 更新通知[Web] - 小众软件</p> <p><a href="https://www.appinn.com/bilibili2rss/" title="Bilibili2RSS - 为你喜爱的任意 B 站「番剧」添加 RSS 更新通知[Web] - 小众软件">https://www.appinn.com/bilibili2rss/</a></p> <p>↑ 当时的代码并没有保留……</p> </blockquote> <p>2017 年的时候拿 PHP 写过一个订阅 B 站番剧更新的工具,后来知道 RSSHub 的存在;</p> <p>RSSHub 最早也是需要针对特定番剧添加到一条订阅到阅读器,所以 PR 提交了一条「用户追番列表」的路由;</p> <blockquote> <p>增加:用户追番列表 by wdssmq · Pull Request #2735 · DIYgod/RSSHub</p> <p><a href="https://github.com/DIYgod/RSSHub/pull/2735" title="增加:用户追番列表 by wdssmq · Pull Request #2735 · DIYgod/RSSHub">https://github.com/DIYgod/RSSHub/pull/2735</a></p> <p>↑ 标记了「反爬严格」但是大概还能用?</p> </blockquote> <p><code>然后果然不太懂 Github 的 PR/ISSUE 搜索功能.jpg</code></p> <p>RSSHub 的问题是,官方站可能被针对性反爬,自建维护更新又比较麻烦,所以选用了对多个 RSSHub 实例进行反代的方式;</p> <blockquote> <p>wdssmq/proxy_rsshub: 使用 GitHub Actions 反代 RSSHub + 多实例轮询</p> <p><a href="https://github.com/wdssmq/proxy_rsshub" title="wdssmq/proxy_rsshub: 使用 GitHub Actions 反代 RSSHub + 多实例轮询">https://github.com/wdssmq/proxy_rsshub</a></p> <p>↑ 这个可能不符合 GitHub Actions 的使用条款,所以用了一段时间后就停用了。。</p> <p>wdssmq/rsshub-cf: Cloudflare Worker 反代 RSSHub</p> <p><a href="https://github.com/wdssmq/rsshub-cf" title="wdssmq/rsshub-cf: Cloudflare Worker 反代 RSSHub">https://github.com/wdssmq/rsshub-cf</a></p> <p>↑ 本来这个方案相对靠谱,然而 B 站强化了一波反爬。。。</p> </blockquote><!--1239--> Thu, 04 Jan 2024 11:03:24 +0800「代码片段」JavaScript 数组的 reduce() 方法https://www.wdssmq.com/post/20231130787.html<p>刷贴吧时看到的一个需求示例,让 AI 写了下用的 reduce() 方法,之前只是大概知道有这么个东西,姑且借这个例子加深下印象。</p> <!--more--> <h2>文档</h2> <blockquote> <p>Array.prototype.reduce() - JavaScript | MDN</p> <p><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce" title="Array.prototype.reduce() - JavaScript | MDN">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce</a></p> </blockquote> <h2>代码案例</h2> <pre><code class="language-js">(() =&gt; { const data = [ { k: &quot;a&quot;, v: 1 }, { k: &quot;a&quot;, v: 1 }, { k: &quot;a&quot;, v: 2 }, { k: &quot;a&quot;, v: 3 }, { k: &quot;b&quot;, v: 3 }, { k: &quot;b&quot;, v: 3 }, { k: &quot;b&quot;, v: 2 }, { k: &quot;c&quot;, v: 2 }, { k: &quot;c&quot;, v: 1 }, { k: &quot;c&quot;, v: 1 }, ]; /* 转换成如下格式 [ { k: &quot;a&quot;, v: [1, 2, 3] }, { k: &quot;b&quot;, v: [3, 2] }, { k: &quot;c&quot;, v: [2, 1] } ]; */ const result = data.reduce((acc, cur) =&gt; { const { k, v } = cur; const index = acc.findIndex(item =&gt; item.k === k); if (index === -1) { acc.push({ k, v: [v] }); } else { acc[index].v.push(v); // 去重,AI 还是会时不时无视一些明明显式声明的要求。。- - acc[index].v = [...new Set(acc[index].v)]; } return acc; }, []); console.log(result); })(); </code></pre> <h2>结束</h2> <p>虽然有点水,但是好像也没啥好说的。。</p> <p>一些其他文章:</p> <ul> <li><a href="https://www.wdssmq.com/post/20210529408.html" title="「代码片段」JavaScript 队列执行异步任务_电脑网络_沉冰浮水">「代码片段」JavaScript 队列执行异步任务_电脑网络_沉冰浮水</a></li> <li><a href="https://www.wdssmq.com/post/20170313538.html" title="「备忘」JavaScript 错误提示及解决!_电脑网络_沉冰浮水">「备忘」JavaScript 错误提示及解决!_电脑网络_沉冰浮水</a></li> <li><a href="https://www.wdssmq.com/post/20190701815.html" title="「代码片段」当网页元素可见时……_电脑网络_沉冰浮水">「代码片段」当网页元素可见时……_电脑网络_沉冰浮水</a></li> </ul><!--1027--> Sat, 16 Dec 2023 11:13:22 +0800「VPS」DesiVPS 2023 黑五促销https://www.wdssmq.com/post/20220219378.html<!-- 2022-03-31-AD-DesiVPS-Cheap-VPS.md --> <h3>写在前边</h3> <p>所以说,他们家的活动推送就略晚什么的。。</p> <p>不过正纠结今年要不要续费前一台,账单时间是 12 月 17, <code>1.5 GB / 25 GB</code>,年付 19.50 刀……</p> <p>这次的重心也是 NVME SSD,同样价格的话硬盘就比较小什么的。。</p> <!--more--> <blockquote> <p>之前的促销条目好像还可以买? <code>2 GB / 40 GB</code>,看付 25 刀,以硬盘空间来说要更划算?</p> <p>「VPS」DesiVPS 23 年四月优惠丨可选中文 win 系统_广告慎入_沉冰浮水</p> <p><a href="https://www.wdssmq.com/post/20100211992.html" title="「VPS」DesiVPS 23 年四月优惠丨可选中文 win 系统_广告慎入_沉冰浮水">https://www.wdssmq.com/post/20100211992.html</a></p> </blockquote> <!-- ### 一些过往 话说从 14 年开始就在用博客所在的这家服务商 —— | 期间 | 价格 | 周期 | | ----------------------- | ------- | ---- | | 2014/07/11 ~ 2017/06/17 | 18 RMB | 月付 | | 2018/01/06 ~ 今天 | 208 RMB | 年付 | 中间好像因为 18 块那台不太给力同时新开了台,但是消费记录里不知道为什么没有体现; 18 块的一开始舍不得丢还多续了几个月; --> <h3>注册链接</h3> <p>[ShortSth:DesiVPS][/ShortSth]</p> <p>[ShortSth:主机云][/ShortSth]「主要站点就放在这家」</p> <h3>配置信息</h3> <blockquote> <p>此处内容发布于 2023-12-02,请注意信息是否失效;</p> </blockquote> <!-- vps --> <p><strong>优惠码:</strong></p> <p><code>BLACK10</code> ← 使用此优惠码可额外获得 10% 优惠(购买 + 续费);</p> <p><strong>共同配置:</strong></p> <ul> <li>1 个 IPv6 地址</li> <li>10 GBPS 端口</li> <li>每年 3 次 IP 更换</li> <li>每月一个快照备份</li> <li>机房好像都是圣何塞(San Jose)</li> </ul> <p><strong>Linux VPS:</strong></p> <p>1GB KVM VPS 10GBPS</p> <ul> <li>1 CPU Cores</li> <li>1 GB RAM</li> <li>15 GB NVME SSD</li> <li>1 IPv4 Address</li> <li>1.5 TB bandwidth</li> </ul> <p>价格: <code>$17/year</code>(约 ¥121.36/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=198">https://clients.desivps.com/cart.php?a=add&amp;pid=198</a></p> <hr /> <p>2GB KVM VPS 10GBPS</p> <ul> <li>1 CPU Cores</li> <li>2 GB RAM</li> <li>30 GB NVME SSD</li> <li>1 IPv4 Address</li> <li>3 TB bandwidth</li> </ul> <p>价格: <code>$33/year</code>(约 ¥235.57/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=199">https://clients.desivps.com/cart.php?a=add&amp;pid=199</a></p> <hr /> <p>3GB KVM VPS 10GBPS</p> <ul> <li>2 CPU Cores</li> <li>3 GB RAM</li> <li>45 GB NVME SSD</li> <li>2 IPv4 Address</li> <li>4.5 TB bandwidth</li> </ul> <p>价格: <code>$49/year</code>(约 ¥349.79/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=200">https://clients.desivps.com/cart.php?a=add&amp;pid=200</a></p> <hr /> <p>4GB KVM VPS 10GBPS</p> <ul> <li>2 CPU Cores</li> <li>4 GB RAM</li> <li>60 GB NVME SSD</li> <li>2 IPv4 Address</li> <li>6 TB bandwidth</li> </ul> <p>价格: <code>$65/year</code>(约 ¥464.01/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=201">https://clients.desivps.com/cart.php?a=add&amp;pid=201</a></p> <hr /> <p>5GB KVM VPS 10GBPS</p> <ul> <li>3 CPU Cores</li> <li>5 GB RAM</li> <li>75 GB NVME SSD</li> <li>3 IPv4 Address</li> <li>7.5 TB bandwidth</li> </ul> <p>价格: <code>$81/year</code>(约 ¥578.23/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=202">https://clients.desivps.com/cart.php?a=add&amp;pid=202</a></p> <hr /> <p>6GB KVM VPS 10GBPS</p> <ul> <li>3 CPU Cores</li> <li>6 GB RAM</li> <li>90 GB NVME SSD</li> <li>3 IPv4 Address</li> <li>9 TB bandwidth</li> </ul> <p>价格: <code>$97/year</code>(约 ¥692.44/年)</p> <p>购买链接: <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=203">https://clients.desivps.com/cart.php?a=add&amp;pid=203</a></p> <p><strong>Windows OS:</strong></p> <p>提供中文版 Windows Server 2012 或 2016,同样可更换 IP 及一个快照备份;</p> <p>就比较贵,大概给下配置信息及 pid;</p> <ul> <li> <p>1 core CPU / 2 GB RAM / 30 GB SSD / 1000Mbps port / 1 IP address / 2.5 TB bandwidth / <code>$8/month or $88/year</code> / <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=171">购买:pid=171</a></p> </li> <li> <p>2 core CPU / 4 GB RAM / 60 GB SSD / 1000Mbps port / 2 IP address / 5.0 TB bandwidth / <code>$16/month or $176/year</code> / <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=172">购买:pid=172</a></p> </li> <li> <p>3 core CPU / 6 GB RAM / 90 GB SSD / 1000Mbps port / 2 IP address / 7.5 TB bandwidth / <code>$24/month or $264/year</code> / <a href="https://clients.desivps.com/cart.php?a=add&amp;pid=173">购买:pid=173</a></p> </li> </ul> <!-- /vps --> <h3>网络信息</h3> <ul> <li>San Jose, CA, USA</li> <li>Test IP: <code>139.28.232.5</code></li> <li>Test File: <code>http://139.28.232.5/100MB.bin</code></li> <li>Looking Glass: <code>https://lg.desivps.com</code></li> </ul> <!-- ### 服务器信息 - CPU E5-2660 v3 - 128 GB DDR4 RAM - 2 TB NVMe SSD (Raid-1) - 1 GBPS Network port --> <!-- ---------------- --> <!-- [ShortSth:主机云][/ShortSth] --> <!-- [ShortSth:DesiVPS][/ShortSth] --> <!-- [ShortSth:RackNerdVPS][/ShortSth] --> <!-- [ShortSth:VultrVPS][/ShortSth] --> <!-- [ShortSth:HostNamaste][/ShortSth] --> <!-- [ShortSth:aff][/ShortSth] --><!--1034--> Sat, 02 Dec 2023 11:31:09 +0800「折腾」Vue 简单的状态管理实践https://www.wdssmq.com/post/20220810247.html<p>正式接触 Vue.js 也两年多了,实际写过的项目好像也就 4 个?「基于 Vite」</p> <!-- 2021-07-08 --> <p>另外还试过 mpvue 和 taro 写小程序 —— 同样的功能需求,用两个框架加 Vue 分别实现了一遍;</p> <!--more--> <p>最早写作为 Z-BlogPHP 主题的 <a href="https://gitee.com/wdssmq/vite_zbp_vue_TestType" title="基于 Z-BlogPHP API 的博客主题;Vue 3 + Vite;">vite_zbp_vue_TestType</a> 项目时,使用了 Vuex 管理状态,后来官方推荐换 Pinia,然而一直懒得更新,实际上两者具体使用上的区别也还没了解清楚;再然后,以这个项目来说,可能不用专门的状态管理大概也可以?</p> <blockquote> <p>用响应式 API 做简单状态管理 | Vue.js</p> <p><a href="https://cn.vuejs.org/guide/scaling-up/state-management.html#simple-state-management-with-reactivity-api" title="用响应式 API 做简单状态管理 | Vue.js">https://cn.vuejs.org/guide/scaling-up/state-management.html#simple-state-management-with-reactivity-api</a></p> </blockquote> <p>然后目前的第四个项目是一个集成 DPlayer 的在线视频播放器,作品 + 分集切换的实现就需要用到状态管理,算是一个很恰当的实践;</p> <p>下边是实现思路的讲解 ——</p> <p>· 封装一个 store 对象用于全局状态管理;</p> <p>· 对于状态属性的读写,以及和 localStorage 的交互,封装为相应方法;</p> <pre><code class="language-ts">// store.ts // 引入响应式 API 和 localStorage 的封装 import { reactive } from 'vue' import { useStorage } from '@vueuse/core' // 省略了一些类型定义和具体方法的实现 const lsStore = useStorage('lsStore', { lst_work: 0 } as TypeLsStore) export const store = reactive({ // 当前剧集信息 work_id: 0, work_name: '', work_ep: 1, work_ep_time: 0, work_ep_max: 0, // 剧集列表 work_list: [] as TypeData['items'], // 初始化 init: (list: TypeData['items']) =&gt; { // 写入剧集列表 store.work_list = list // 切换到上次播放的作品 store.changeWork(lsStore.value.lst_work) }, // 作品切换 changeWork: (id: number) =&gt; { }, // 剧集切换 changeEp: (ep: number) =&gt; { }, // 判断并读取上次播放记录,第几集的第几秒 getProg: () =&gt; { }, // 写入播放记录 setProg: () =&gt; { lsStore.value[store.work_id] = { lst_ep: store.work_ep, lst_ep_time: store.work_ep_time, } }, }) </code></pre> <p>· 只有一个 App.vue 页面,所以不需要路由;</p> <pre><code class="language-html">&lt;script setup lang=&quot;ts&quot;&gt; // 引入 API 和状态管理对象 import { computed } from 'vue' import { store } from './base/store' // 其他组件、数据处理等 // ... // 初始化状态 store.init(data.items) // 分页切换后,将新的“页码”更新到 store function pageChange(type: string, page: number) { if (type === 'ep') { store.changeEp(page) } else if (type === 'works') { store.changeWork(page - 1) } } // ↑ 分页组件内绑定点击事件,向上传递给父组件内监听函数,更新 store 状态后把切换效果渲染回分页组件; // ↑ 这里可以在分页组件内直接更新 store 状态,切换函数放在分页组件自身,具体取舍看实际需要; // dplayer 组件内有自动续播及时间进度记录之类的,所以就选择了直接更新 store 状态; // 作品分页信息 const worksPageInfo = computed(() =&gt; { return { name: '作品列表', type: 'works', page: store.work_id + 1, items: store.work_list, } }) // 分集翻页信息 const epPageInfo = computed(() =&gt; { return { name: '分集列表', page: store.work_ep, type: 'ep', total: store.work_list[store.work_id].maxP, } }) // 当「状态」变化时,会重新获取视频数据,以及上边的分页信息 const dplayerInfo = computed(() =&gt; { return buildDplayerInfo(data as TypeData, store.work_id, store.work_ep) }) &lt;/script&gt; &lt;!-- ↓↓ computed 封装的数据更新时,会触发相应的组件重新渲染 ↓↓ --&gt; &lt;template&gt; &lt;!-- 视频播放器调用 --&gt; &lt;dplayer :dplayerInfo=&quot;dplayerInfo&quot;&gt;&lt;/dplayer&gt; &lt;!-- 分集翻页 --&gt; &lt;pagebar :pageInfo=&quot;epPageInfo&quot; @page-change=&quot;pageChange&quot;&gt;&lt;/pagebar&gt; &lt;!-- 作品列表分页 --&gt; &lt;pagebar :pageInfo=&quot;worksPageInfo&quot; @page-change=&quot;pageChange&quot;&gt;&lt;/pagebar&gt; &lt;/template&gt; </code></pre> <p>「- -」「- -」「- -」「- -」「- -」「- -」「- -」「- -」</p> <p>然后这个 Vue DPlayer 项目写在了私有 Git 里,有兴趣的加 QQ 群下载吧……</p> <p>· 各种 QQ 群</p> <blockquote> <p><strong>咸鱼自习室: <code>576621997</code></strong></p> <p><strong>我的咸鱼心: <code>189574683</code></strong></p> </blockquote> <p>· 作品信息</p> <blockquote> <h3>Vue 集成 DPlayer | 作品 + 分集切换</h3> <p><code>Vite + Vue3 + TypeScript + DPlayer</code>;</p> <p>针对每部作品记录播放进度(localStorage);</p> </blockquote> <p>· 附图</p> <p><img alt="001.png" src="https://img.wdssmq.com/_posts/2023-11-23-Vue-State-Simple/001.png" title="001.png" /></p> <p><img alt="002.png" src="https://img.wdssmq.com/_posts/2023-11-23-Vue-State-Simple/002.png" title="002.png" /></p><!--84--> Thu, 23 Nov 2023 15:12:04 +0800「VPS」RackNerd 2023 年黑五特价https://www.wdssmq.com/post/20231112097.html<h3>注册链接</h3> <p>[ShortSth:RackNerdVPS][/ShortSth] ← 本文主要介绍的服务商</p> <p>[ShortSth:aff][/ShortSth] ← 这里会随机一条</p> <!--more--> <h3>配置信息</h3> <blockquote> <p>此处内容发布于 2023-11-16,请注意信息是否失效;</p> </blockquote> <p><strong>Linux VPS</strong></p> <p>768 MB KVM VPS</p> <ul> <li>1 vCPU Core</li> <li>15 GB Pure SSD Storage</li> <li>768 MB RAM</li> <li>1000 GB Monthly Transfer</li> <li>1 Gbps Network Port</li> <li>Full Root Admin Access</li> <li>1 Dedicated IPv4 Address</li> <li>KVM / SolusVM Control Panel</li> <li>FREE Clientexec License</li> <li>Available in: SJC, SEA, DAL, CHI, ATL, NY, ASH</li> </ul> <p>价格:<code>$10.18/YEAR</code> (约<code>¥73.88/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=792" title="768 MB KVM VPS">点击这里</a></p> <hr /> <p>2GB KVM VPS</p> <ul> <li>1 vCPU Core</li> <li>30 GB Pure SSD Storage</li> <li>2 GB RAM</li> <li>2500 GB Monthly Transfer</li> <li>1 Gbps Network Port</li> <li>Full Root Admin Access</li> <li>1 Dedicated IPv4 Address</li> <li>KVM / SolusVM Control Panel</li> <li>FREE Clientexec License</li> <li>Available in: LAX, SJC, SEA, DAL, CHI, ATL, NY, ASH</li> </ul> <p>价格:<code>$16.98/YEAR</code> (约<code>¥123.22/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=793" title="2GB KVM VPS">点击这里</a></p> <hr /> <p>2.5GB KVM VPS</p> <ul> <li>2 vCPU Cores</li> <li>50 GB Pure SSD Storage</li> <li>2.5 GB RAM</li> <li>5000 GB Monthly Transfer</li> <li>1 Gbps Network Port</li> <li>Full Root Admin Access</li> <li>1 Dedicated IPv4 Address</li> <li>KVM / SolusVM Control Panel</li> <li>FREE Clientexec License</li> <li>Available in: LAX, SJC, SEA, DAL, CHI, ATL, NY, ASH</li> </ul> <p>价格:<code>$25.49/YEAR</code> (约<code>¥184.98/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=794" title="2.5GB KVM VPS">点击这里</a></p> <hr /> <p>4GB KVM VPS</p> <ul> <li>2 vCPU Cores</li> <li>80 GB Pure SSD Storage</li> <li>4 GB RAM</li> <li>8000 GB Monthly Transfer</li> <li>1 Gbps Network Port</li> <li>Full Root Admin Access</li> <li>1 Dedicated IPv4 Address</li> <li>KVM / SolusVM Control Panel</li> <li>FREE Clientexec License</li> <li>Available in: LAX, SJC, SEA, DAL, CHI, ATL, NY, ASH</li> </ul> <p>价格:<code>$38.88/YEAR</code> (约<code>¥282.15/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=795" title="4GB KVM VPS">点击这里</a></p> <hr /> <p>4.5GB KVM VPS</p> <ul> <li>4 vCPU Cores</li> <li>115 GB Pure SSD Storage</li> <li>4.5 GB RAM</li> <li>10,000 GB Monthly Transfer</li> <li>1 Gbps Network Port</li> <li>Full Root Admin Access</li> <li>1 Dedicated IPv4 Address</li> <li>KVM / SolusVM Control Panel</li> <li>FREE Clientexec License</li> <li>Available in: LAX, SJC, SEA, DAL, CHI, ATL, NY, ASH</li> </ul> <p>价格:<code>$52.49/YEAR</code> (约<code>¥380.92/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=796" title="4.5GB KVM VPS">点击这里</a></p> <p><strong>Ryzen NVMe VPS</strong></p> <blockquote> <p>比较贵的机型,只有纽约机房;</p> </blockquote> <p>1.5GB Ryzen NVMe VPS</p> <ul> <li>1 vCPU AMD Ryzen Core</li> <li>30 GB NVMe Storage</li> <li>1.5 GB RAM</li> <li>2500 GB Monthly Transfer</li> </ul> <p>价格:<code>$19.00/YEAR</code> (约<code>¥137.88/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=797" title="1.5GB Ryzen NVMe VPS">点击这里</a></p> <hr /> <p>2GB Ryzen NVMe VPS</p> <ul> <li>2 vCPU AMD Ryzen Cores</li> <li>40 GB NVMe Storage</li> <li>2 GB RAM</li> <li>4000 GB Monthly Transfer</li> </ul> <p>价格:<code>$29.00/YEAR</code> (约<code>¥210.45/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=798" title="2GB Ryzen NVMe VPS">点击这里</a></p> <hr /> <p>3GB Ryzen NVMe VPS</p> <ul> <li>2 vCPU AMD Ryzen Cores</li> <li>55 GB NVMe Storage</li> <li>3 GB RAM</li> <li>6000 GB Monthly Transfer</li> </ul> <p>价格:<code>$45.00/YEAR</code> (约<code>¥326.56/年</code>)</p> <p>购买:<a href="https://my.racknerd.com/aff.php?aff=7293&amp;pid=799" title="3GB Ryzen NVMe VPS">点击这里</a></p><!--749--> Thu, 16 Nov 2023 12:28:07 +0800「水坑」并没有图的技能树图谱https://www.wdssmq.com/post/20230914731.html<p>大概算是「关于沉冰浮水」的延伸:<a href="https://www.wdssmq.com/guestbook.html" title="留言本 / 关于">留言本 / 关于</a>;</p> <blockquote> <p>为什么叫「水坑」见: <a href="/post/20200617652.html" title="「水坑」系列教程索引">「水坑」系列教程索引</a></p> <p>「水坑」系列文章列表: <a href="/tag/GesF-Force/" title="Tag: GesF-Force">/tag/GesF-Force/</a></p> </blockquote> <!--more--> <ul> <li> <p>系统</p> <ul> <li>[ ] Window</li> <li>[ ] Linux / WSL</li> </ul> </li> <li> <p>基础工具</p> <ul> <li>[X] Git</li> <li>[X] VSCode</li> </ul> </li> <li> <p>语言环境</p> <ul> <li>[X] HTML + CSS + JavaScript</li> <li>[ ] Node.js <strong>|</strong> Vue.js / GM_Script / Astro / TypeScript / Sass / Less</li> <li>[ ] PHP <strong>|</strong> Z-BlogPHP 应用开发</li> <li>[ ] Python</li> </ul> </li> <li> <p>环境部署</p> <ul> <li>[ ] Docker / Docker Compose <strong>|</strong> Node.js / PHP / MySQL / Nginx|Apache</li> <li>[ ] LNMP/LAMP/LNMPA <strong>|</strong> PHP / MySQL / Nginx|Apache</li> <li>[ ] IIS <strong>|</strong> PHP / ASP / MySQL</li> <li>[ ] 宝塔面板 <strong>|</strong> PHP 相关环境部署,Node.js 和 Docker 之类的也可以</li> </ul> </li> </ul><!--845--> Wed, 18 Oct 2023 13:16:54 +0800「笔记」各种碎片信息「2023-10-07」https://www.wdssmq.com/post/20230223818.html<p>一些零碎的笔记,之后可能会再添加内容;「2023-10-07」</p> <!--more--> <h2>2023-10-07</h2> <p>TITLE: VSCode 格式化 JS 代码时的函数括号前的空格问题</p> <p>TAG: <code>#VSCode</code> <code>#JavaScript</code> <code>#Format</code></p> <p>BODY:</p> <p>默认情况下,VSCode 按下边的结果格式化 JS 代码:</p> <pre><code class="language-js">// 具名函数,默认不加空格 function fnNamed() { console.log('fnNamed') } // 匿名函数,默认加空格 const fnAnonymous = function () { console.log('fnAnonymous') } // 异步箭头函数,默认加空格 const fnAsyncArrow = async () =&gt; { console.log('fnAsyncArrow') } </code></pre> <p>虽然不知道为什么,就不太喜欢匿名函数的那个空格 - -,所以想把它去掉;</p> <p><strong>· VSCode 配置:</strong></p> <p>快捷键 <code>ctrl + ,</code> 打开设置,搜索 <code>Insert Space Before Function</code>,会有五个选项,取消下边选项的勾选即可:</p> <blockquote> <p>JavaScript &gt; Format: Insert Space After Function Keyword For Anonymous Functions<br /> [ ] 定义匿名函数的函数关键字后面的空格处理。</p> </blockquote> <p>对应的 JSON 配置如下:</p> <pre><code class="language-json">{ &quot;javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions&quot;: false } </code></pre> <p>然而问题是,只对 JS 有效???</p> <p><strong>· ESLint 配置:</strong></p> <pre><code class="language-js">{ 'rules': { // 函数圆括号之前的空格要求 'space-before-function-paren': [ 1, { 'named': 'never', // ↓ 预想是设置为 never,但是 VSCode 总是给加上 (╯﹏╰) 'anonymous': 'always', 'asyncArrow': 'always', // ↑ 其实三个选项的默认值都是 always,可以看情况省略 }, ], } } </code></pre> <!-- 「- -」 --> <h2>2023-10-08</h2> <p>TITLE: TypeScript 中「类型定义的命名空间」使用</p> <p>TAG: <code>#TypeScript</code> <code>#VSCode</code> <code>#命名空间</code></p> <p>BODY:</p> <p><code>@types/dplayer - npm</code></p> <p>https://www.npmjs.com/package/@types/dplayer?activeTab=code</p> <pre><code class="language-ts">// d.ts export as namespace DPlayer; export default class DPlayer { } // 导入姿势 1 import DPlayer from 'dplayer' // 导入姿势 2 import DPlayerX from 'dplayer' // import type DPlayer from 'dplayer' </code></pre> <p>姿势 1 好像是可以使用的,但是感觉有些不好区分(图 1、2);</p> <p><strong>图 3 是能找到命名空间,但是仍然提示未定义,就感觉和理解不太一样,虽然可以使用 <code>/* global DPlayer */</code> 屏蔽提示;</strong></p> <p>所以目前探索出来的结论:</p> <ul> <li><code>import XXX from</code> 可以作为「值」使用,存在类型定义时可以用作「类型」,作为「值」或「类型」均不需要和导出名相同;</li> <li><code>import type XXX from</code> 不能作为「值」使用,用作「类型」时不需要和导出名相同;</li> <li>对于「命名空间」,我这儿是用三斜线指定导入了 <code>@types/dplayer</code>,但是去掉好像还是能找到,好像也没其他专门的导入语法?<ul> <li>上边两种 <code>import</code> 导入均可以与「命名空间」同名,此时可以按使用方式识别为「命名空间」,同时消除 eslint 的 <code>no-undef</code> 提示;</li> </ul> </li> </ul> <p>感觉就是 ts 和 eslint 没能配合好,,,可以使用下边方式之一来应对:</p> <ol> <li>使用与「命名空间」同名的 <code>import</code> 导入,理解之后好像也还行;</li> <li>为「命名空间」指定 <code>/* global XXX */</code> 以屏蔽 eslint 提示;</li> <li>不使用「命名空间」,直接使用 <code>import</code> 导入其下的具体类型;</li> </ol> <p><img alt="001.png" src="https://s2.loli.net/2023/10/08/X3VZdkK9rWs8Lul.png" /></p> <p>↑ 图 1</p> <p><img alt="002.png" src="https://s2.loli.net/2023/10/08/X1Bs53KWtPJIjhp.png" /></p> <p>↑ 图 2</p> <p><img alt="003.png" src="https://s2.loli.net/2023/10/08/dYCiA5XhSwFKn8N.png" /></p> <p>↑ 图 3</p> <h2>2023-10-31 <span id="2023-10-31">#</span></h2> <p>TITLE: 各种关注水水的姿势</p> <p>TAG: <code>#社交平台</code> <code>#求关注</code> <code>#互联网</code></p> <p>BODY:</p> <p>《<a href="https://www.wdssmq.com/guestbook.html" title="留言本 / 关于">留言本 / 关于</a>》里有列出各种平台账号,姑且打算作为「<strong>收取报酬</strong>」或者「<strong>抵扣</strong>」的形式,虽然还是希望能直接打钱……</p> <p>包括必做任务在内共计完成 4 项即可,某一站点有多个可选项操作时任意一项均可,原则上同一站点只算一次;</p> <p><strong>当前必做任务:</strong></p> <ul> <li>FeedsPub 订阅</li> <li>B 站硬币数 2 枚</li> </ul> <p><strong>任务列表:</strong></p> <ol> <li>GitHub<ul> <li>链接:<a href="https://github.com/wdssmq" title="wdssmq (沉冰浮水)">https://github.com/wdssmq</a></li> <li>操作:关注(Follow) <code>or</code> 点赞(Star)</li> </ul> </li> <li>FeedsPub<ul> <li>链接:<a href="https://feeds.pub/feed/https%3A%2F%2Fwww.wdssmq.com%2Ffeed.php" title="沉冰浮水">https://feeds.pub/feed/https%3A%2F%2Fwww.wdssmq.com%2Ffeed.php</a></li> <li>操作:<strong>注册并订阅(Follow)</strong></li> </ul> </li> <li>哔哩哔哩<ul> <li>链接:<a href="https://space.bilibili.com/44744006" title="沉冰浮水的个人空间_哔哩哔哩_bilibili">https://space.bilibili.com/44744006</a></li> <li>操作:关注 <code>or</code> <strong>投币</strong> <code>or</code> 充电</li> </ul> </li> <li>知乎<ul> <li>链接:<a href="https://www.zhihu.com/people/wdssmq" title="沉冰浮水 - 知乎">https://www.zhihu.com/people/wdssmq</a></li> <li>操作:关注</li> </ul> </li> <li>贴吧<ul> <li>链接:<a href="https://tieba.baidu.com/home/main?un=沉冰浮水" title="沉冰浮水的贴吧">https://tieba.baidu.com/home/main?un=沉冰浮水</a></li> <li>操作:关注</li> </ul> </li> </ol> <!-- 「列表」文本信息类平台账号汇总_列表纪事_沉冰浮水 https://www.wdssmq.com/post/20201030387.html --><!--764--> Sat, 07 Oct 2023 18:22:42 +0800WebDav 折腾「其二」之 rclonehttps://www.wdssmq.com/post/20100203443.html<h2>前言</h2> <p>离上一篇已经 3 个月了,简单说就是买了台 NAT 的 VPS,然后在如何利用这个问题上考虑了下对接网盘 WebDav 这个方向,虽然折腾是折腾,实际折腾完也没有然后了……</p> <!--more--> <blockquote> <p>VPS 服务商的推广链接:[ShortSth:iHostART][/ShortSth]</p> <p>网盘链接:<a href="https://infini-cloud.net/" title="InfiniCLOUD">https://infini-cloud.net/</a> 推荐码:<code>L2M3H</code></p> <p>查看同系列的其他文章 ——</p> <p>WebDav_沉冰浮水:<a href="https://www.wdssmq.com/tag/WebDav/" title="WebDav_沉冰浮水">https://www.wdssmq.com/tag/WebDav/</a></p> </blockquote> <h2>rclone</h2> <p>Rclone:</p> <p><a href="https://rclone.org/" title="Rclone">https://rclone.org/</a></p> <h3>rclone 安装</h3> <pre><code class="language-bash"># rclone VERSION=v1.63.1 mkdir -p ~/tmp/rclone &amp;&amp; cd ~/tmp/rclone wget https://downloads.rclone.org/${VERSION}/rclone-${VERSION}-linux-amd64.zip unzip rclone-${VERSION}-linux-amd64.zip cd rclone-${VERSION}-linux-amd64 # 复制到 /usr/local/bin/ cp rclone /usr/local/bin/ # 添加执行权限 chmod +x /usr/local/bin/rclone wget https://downloads.rclone.org/v1.63.1/rclone-v1.62.2-linux-amd64.zip unzip rclone-v1.62.2-linux-amd64.zip cd rclone-v1.62.2-linux-amd64 # 复制到 /usr/local/bin/ cp rclone /usr/local/bin/ # 添加执行权限 chmod +x /usr/local/bin/rclone </code></pre> <h3>rclone 配置</h3> <pre><code class="language-bash"># 执行命令后,根据提示进行配置 rclone config # 2023/05/24 12:29:07 NOTICE: Config file &quot;/root/.config/rclone/rclone.conf&quot; not found - using defaults # No remotes found, make a new one? # n) New remote # s) Set configuration password # q) Quit config # n/s/q&gt; n # ↑ 新建一个 remote # ----------------- # Enter name for new remote. # name&gt; Terdav # ↑ 输入 remote 名称 # ----------------- # Option Storage. # Type of storage to configure. # Choose a number from below, or type in your own value. # Storage&gt; 46 # ↑ 这一步会给出 OneDrive,Dropbox 等网盘的选项,这里选择 46,即 WebDav # ----------------- # Option url. # URL of http host to connect to. # E.g. https://example.com. # Enter a value. # url&gt; https://lsv.teracloud.jp/dav/ # ↑ 输入 WebDav 的地址,这里是 InfiniCLOUD 的地址 # ----------------- # Option vendor. # Name of the WebDAV site/service/software you are using. # Choose a number from below, or type in your own value. # Press Enter to leave empty. # vendor&gt; 5 # ↑ 这一步会给出一些 WebDav 的选项,这里选择 5,即 Other site/service or software # Option user. # User name. # In case NTLM authentication is used, the username should be in the format 'Domain\User'. # Enter a value. Press Enter to leave empty. # user&gt; username # ↑ 输入用户名 # ----------------- # Option pass. # Password. # Choose an alternative below. Press Enter for the default (n). # y) Yes, type in my own password # g) Generate random password # n) No, leave this optional password blank (default) # y/g/n&gt; y # ↑ 是否需要密码,这里选择 y # ----------------- # Enter the password: # password: passwordpassword # ↑ 输入密码 # ----------------- # Option bearer_token. # Bearer token instead of user/pass (e.g. a Macaroon). # Enter a value. Press Enter to leave empty. # bearer_token&gt; # ↑ 这里直接回车,鉴权方式不是 Bearer Token # ----------------- # Edit advanced config? # y) Yes # n) No (default) # y/n&gt; n # ↑ 是否编辑高级配置,这里选择 n # ----------------- # Configuration complete. # Options: # - type: webdav # - url: https://lsv.teracloud.jp/dav/ # - vendor: other # - user: wdmbts # - pass: *** ENCRYPTED *** # Keep this &quot;Terdav&quot; remote? # y) Yes this is OK (default) # e) Edit this remote # d) Delete this remote # y/e/d&gt; y # ↑ 会输出配置信息供确认 # ----------------- </code></pre> <h3>rclone 使用</h3> <p>注:<code>Terdav</code> 是上一步配置的 remote 名称</p> <pre><code class="language-bash"># 列出远程的顶级目录 rclone lsd Terdav: # 列出全部文件 rclone ls Terdav: mkdir ~/tmp/rclone-test # 写入 Hello World 及格式化的时间到文件 2023-08-28T16:39:51+08:00 echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-test/for-test.txt # 上传本地文件夹到远程,表示路径的参数交换则是下载 rclone copy -P ~/tmp/rclone-test Terdav:rclone-test # 注:-P / --progress 标志会显示传输进度 # ------------------------------------- # ---------------- # 重要: rclone sync 是单向同步,会删除「只存在于目标端」的文件; # 重要: rclone sync 是单向同步,会删除「只存在于目标端」的文件; # ---------------- mkdir ~/tmp/rclone-sync # 同步本地文件夹到远程,--interactive 表示交互式同步,对每个要处理的文件进行提示 echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-sync/for-sync.txt rclone sync --interactive -P ~/tmp/rclone-sync Terdav:rclone-sync # 同步本地文件夹到远程,--dry-run 表示模拟运行 echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-sync/for-sync.txt rclone sync --dry-run -P ~/tmp/rclone-sync Terdav:rclone-sync # 注:可以使用 --exclude _gsdata_/** 排除 GoodSync 生成的 _gsdata_ 文件夹 # ------------------------------------- # 双向同步功能目前仍为「实验性」 mkdir ~/tmp/rclone-sync # 结论:在 WebDav 场景下确实没法用的样子?会提示 modification time support is missing echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-sync/for-sync.txt rclone bisync -P --resync ~/tmp/rclone-sync Terdav:rclone-sync --exclude _gsdata_/** # 两个本地文件夹测试 mkdir ~/tmp/rclone-sync-2 # -1, --resync 用于初始化同步,两边的文件都会被同步到对方 rclone bisync -P --resync ~/tmp/rclone-sync ~/tmp/rclone-sync-2 --exclude _gsdata_/** # 仅同步距离上次同步后修改的文件 echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-sync/for-sync.txt rclone bisync -P ~/tmp/rclone-sync ~/tmp/rclone-sync-2 --exclude _gsdata_/** # 注:--remove-empty-dirs 参数用于清理空文件夹 </code></pre> <h3>rclone 挂载</h3> <p>好像可以将远程 WebDav 挂载到本地;</p> <p>一、首先过程中遇到一些报错及解决方法:</p> <pre><code class="language-bash"># 安装 fuse ,系统为 Debian apt install fuse # Fatal error: failed to mount FUSE fs: fusermount: exec: &quot;fusermount3&quot;: executable file not found in $PATH # 好像用的机子环境比较特殊, mknod -m 666 /dev/fuse c 10 229 # update-rc.d -f udev disable # mount helper error: fusermount3: fuse device not found, try 'modprobe fuse' first </code></pre> <p>二、挂载</p> <pre><code class="language-bash"># 创建一个挂载点,保持为空文件夹 mkdir -p ~/tmp/rclone-mount # 挂载,--daemon 表示后台运行(守护进程),仅在 Linux 下有效 rclone mount Terdav:rclone-mount ~/tmp/rclone-mount --daemon # 直接写入文件 echo &quot;Hello World $(date --rfc-3339=seconds)&quot; &gt; ~/tmp/rclone-mount/for-mount.txt </code></pre> <p>三、重启后自动挂载</p> <p>占位</p> <h2>结语</h2> <p>最理想的使用还是双向同步,然而并不能用;</p> <p>GoodSync 到是可以用,然而是收费的,虽然之前不知道为什么领到了一年的免费授权……</p> <p>所以下一篇将会介绍一下 GoodSync 在 Linux 下的使用。</p><!--29--> Mon, 28 Aug 2023 16:39:51 +0800关于 GitHub 的 OpenGraph 接口https://www.wdssmq.com/post/20230223986.html<p>GitHub 的 OpenGraph 接口,可以用来生成图形化展示 Git 库信息,包括仓库和 issues ,但是好像没有针对用户页的接口。</p> <!--more--> <blockquote> <p>下边地址可以订阅我的 GitHub 动态,包括公开仓库和 issues:</p> <p><a href="https://github.com/wdssmq.atom" title="GitHub Public Timeline Feed Of wdssmq">https://github.com/wdssmq.atom</a></p> </blockquote> <p>实际 <code>token</code> 部分是一个长串,然后可随意更改,或许是针对私有库的?</p> <p>repo:<code>https://opengraph.githubassets.com/token/wdssmq/GesF-Note</code></p> <p>issues: <code>https://opengraph.githubassets.com/token/wdssmq/GesF-Note/issues/1</code></p> <p><img alt="wdssmq/GesF-Note" src="https://opengraph.githubassets.com/token/wdssmq/GesF-Note" /></p> <p><img alt="wdssmq/GesF-Note/issues/1" src="https://opengraph.githubassets.com/token/wdssmq/GesF-Note/issues/1" /></p> <p>用户页实际用的是头像 ——</p> <pre><code class="language-html">&lt;meta property=&quot;og:image&quot; content=&quot;https://avatars.githubusercontent.com/u/8186642?v=4?s=400&quot; /&gt; &lt;meta property=&quot;og:image:alt&quot; content=&quot;置百丈玄冰而崩裂,掷须臾池水而漂摇。. wdssmq has 84 repositories available. Follow their code on GitHub.&quot; /&gt; &lt;meta property=&quot;og:site_name&quot; content=&quot;GitHub&quot; /&gt; &lt;meta property=&quot;og:type&quot; content=&quot;profile&quot; /&gt; &lt;meta property=&quot;og:title&quot; content=&quot;wdssmq - Overview&quot; /&gt; &lt;meta property=&quot;og:url&quot; content=&quot;https://github.com/wdssmq&quot; /&gt; &lt;meta property=&quot;og:description&quot; content=&quot;置百丈玄冰而崩裂,掷须臾池水而漂摇。. wdssmq has 84 repositories available. Follow their code on GitHub.&quot; /&gt; &lt;meta property=&quot;profile:username&quot; content=&quot;wdssmq&quot; /&gt; </code></pre><!--708--> Mon, 21 Aug 2023 18:03:38 +0800