├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── .vscode └── extensions.json ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── update_files.js ├── web ├── index.html ├── public │ ├── favicon.ico │ ├── opml.xml │ └── rss.xml ├── src │ ├── App.vue │ ├── assets │ │ ├── base.css │ │ ├── data.json │ │ ├── github.png │ │ ├── logo.png │ │ └── opml.json │ ├── components │ │ ├── BlogInfoCard.vue │ │ └── SummaryCard.vue │ └── main.js └── vite.config.js ├── workers-site ├── .cargo-ok ├── .gitignore ├── index.js ├── package-lock.json └── package.json └── wrangler.toml /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | on: 3 | schedule: 4 | - cron: "0 4,16 * * *" 5 | workflow_dispatch: 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | node-version: 12 | - 23.x 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v4 16 | with: 17 | # 令 GitHub 在 git clone 和 git checkout 后「忘记」使用的 credentials。 18 | # 如果之后需要以另外的身份(如你的 GitHub Bot)执行 git push 操作时(如部署到 GitHub Pages),必须设置为 false。 19 | persist-credentials: false 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | # 缓存 node_modules,缓存机制参见 GitHub 文档:https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows 25 | - name: Cache node_modules 26 | uses: actions/cache@v4 # 使用 GitHub 官方的缓存 Action。 27 | env: 28 | cache-name: blogroll-node-modules 29 | with: 30 | path: node_modules 31 | key: ${{ runner.os }}-${{ matrix.node-version }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替 32 | # Wrangler 在构建时会在 workers-site 目录下执行 npm i,因此也要缓存这里的 node_modules 33 | - name: Cache workers-site/node_modules 34 | uses: actions/cache@v4 35 | env: 36 | cache-name: workers-site-node-modules 37 | with: 38 | path: workers-site/node_modules 39 | key: ${{ runner.os }}-${{ matrix.node-version }}-${{ env.cache-name }}-${{ hashFiles('workers-site/package-lock.json') }} 40 | - run: npm i # 执行 Blogroll 的依赖安装 41 | - run: npm run update # 相当于 node update_files.js,从 Seatable 更新数据到 README.md 42 | env: 43 | SEATABLE_API_TOKEN: ${{ secrets.SEATABLE_API_TOKEN }} 44 | - name: Commit and push if README.md changed 45 | env: 46 | DEPLOY_REPO: git@github.com:nju-lug/blogroll.git 47 | DEPLOY_BRANCH: main 48 | SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} 49 | run: | 50 | if [ -n "$(git status --porcelain README.md)" ]; then 51 | git config --local user.email "github-actions[bot]@users.noreply.github.com" 52 | git config --local user.name "github-actions[bot]" 53 | git add README.md 54 | git commit -m "update README.md from github actions" 55 | mkdir -p ~/.ssh 56 | echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa 57 | chmod 600 ~/.ssh/id_rsa 58 | ssh-keyscan github.com >> ~/.ssh/known_hosts 59 | git push $DEPLOY_REPO HEAD:$DEPLOY_BRANCH 60 | else 61 | echo "No changes detected" 62 | fi 63 | - run: npm run gen # 相当于 node index.js,生成 opml.xml,opml.json 和 data.json 64 | - run: npm run build 65 | - name: Deploy to Cloudflare Workers 66 | uses: cloudflare/wrangler-action@v3 67 | with: 68 | apiToken: ${{ secrets.CF_WORKERS_TOKEN }} # 前一步设置的 Secrets 的名称 69 | # Wrangler Action 也支持使用传统的 Global API Token + Email 的鉴权方式,但不推荐 70 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar", "johnsoncodehk.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Nanjing University Linux Users Group 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NJU-LUG Blogroll 2 | 3 | 南京大学 [Linux User Group](https://git.nju.edu.cn/nju-lug/lug-introduction) 收集的同学们的 Blog。 4 | 5 | 6 | ## 聚合页面 7 | 8 | [聚合页面](https://blogroll.njulug.org/) 自动聚合这个 `README.md` 文件的表格中的所有 RSS 源,并以用户友好的方式显示出来。 9 | 10 | 欢迎在线浏览:https://blogroll.njulug.org/ 11 | 12 | 聚合页面使用 Vue 框架编写,每天定时 0 点和 12 点,会通过 GitHub Action 自动集成和部署到 Cloudflare 上。 13 | 14 | 聚合页面由 [@OrangeX4](https://github.com/OrangeX4) 和 [@Do1e](https://github.com/Do1e) 维护,如发现页面上有任何 Bug,欢迎在本 Repo 中提出 Issues。 15 | 16 | 17 | ## 聚合 RSS 订阅 18 | 19 | 我们也制作了一个聚合 RSS,欢迎来订阅: 20 | 21 | https://blogroll.njulug.org/rss.xml 22 | 23 | 使用该RSS订阅的Telegram频道: 24 | 25 | https://t.me/NJULUG_Blogroll 26 | 27 | 28 | ## FAQ 29 | 30 | > 萌新也可以加 Blog 列表么? 31 | 32 | 能。只要是南京大学的同学和校友都欢迎。 33 | 34 | > 有些 Blog 太久没更新或失效了,怎么办? 35 | 36 | 联系[@Do1e i@do1e.cn](mailto:i@do1e.cn)进行删除,同时我们也会通过 Github Action 的自动更新中的 Log 来判断是否失效。 37 | 38 | 39 | ## 添加/编辑方式 40 | 41 | 填写表单:[https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/](https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/) 42 | 43 | 编辑表单:[https://table.nju.edu.cn/dtable/collection-tables/36161685-5d74-4d48-928f-b6b40174da28](https://table.nju.edu.cn/dtable/collection-tables/36161685-5d74-4d48-928f-b6b40174da28)。如果是之前在README中填写的,可重新[填写表单](https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/),保证`Name`字段一致即可。 44 | 45 | 如果无 RSS 源,可以使用 `---` 代替,聚合页面将不会抓取,仅展示HTML链接。 46 | 47 | ## Lists 48 | 49 | | Name | RSS | HTML | 50 | | -- | -- | -- | 51 | | OrangeX4's Blog | https://blog.orangex4.workers.dev/atom.xml | https://blog.orangex4.workers.dev/ | 52 | | Do1e | https://www.do1e.cn/feed | https://www.do1e.cn | 53 | | Idealclover's Blog | https://idealclover.top/feed | https://idealclover.top/ | 54 | | Cmj's Blog | https://blog.caomingjun.com/atom.xml | https://blog.caomingjun.com/ | 55 | | Mexii's Blog | https://blog.mexii.dev/atom.xml | https://blog.mexii.dev/ | 56 | | LadderOperator's Blog | https://ladderoperator.top/index.xml | https://ladderoperator.top | 57 | | Antares's Blog | https://chr.fan/feed | https://chr.fan | 58 | | lyc8503's Blog | https://blog.lyc8503.net/atom.xml | https://blog.lyc8503.net/ | 59 | | YeungYeah 的乱写地 | https://scottyeung.top/atom.xml | https://scottyeung.top/ | 60 | | yaoge123's Blog | https://www.yaoge123.com/blog/feed | https://www.yaoge123.com/ | 61 | | 南雍随笔 | https://ydjsir.com.cn/atom.xml | https://ydjsir.com.cn/ | 62 | | Kevinpro's Blog | --- | https://www.yuque.com/kevinpro | 63 | | Domon | https://www.domon.cn/rss/ | https://www.domon.cn | 64 | | 极东魔术昼寝结社 | https://blog.jaoushingan.com/atom.xml | https://blog.jaoushingan.com | 65 | | Chivalric Gong | --- | https://gmy-acoustics.github.io/ | 66 | | Persvadisto's Blog | https://persvadisto.github.io/atom.xml | https://persvadisto.github.io/ | 67 | | Yukino's Blog | https://02hyc.github.io/Blog/index.xml | https://02hyc.github.io/Blog/ | 68 | | The 0x26A1 Bay | https://igns.top/index.xml | https://igns.top/ | 69 | | jjl9807's blog | https://blog.jjl9807.com/feed/ | https://blog.jjl9807.com/ | 70 | 71 | 72 | ## OPML 73 | 74 | `opml.xml` 地址:https://blogroll.njulug.org/opml.xml 75 | 76 | 你可以使用 `opml.xml` 文件在 Inoreader 里持续订阅,或在 Feedly 下载之后导入。 77 | 78 | > OPML(英语:Outline Processor Markup Language)意为“大纲处理标记语言”,是一种基于 XML 上的文件保存格式。目前流行的应用方式为收集博客或播客的 RSS 来源,整理成单一可交换的 OPML 格式的订阅列表,让用户便于转移自己的订阅项目。 79 | > 80 | > -- Wikipedia 81 | 82 | 83 | ## See Also 84 | 85 | - https://github.com/tuna/blogroll 86 | - https://github.com/NUAA-Open-Source/BlogRoll 87 | - https://github.com/timqian/chinese-independent-blogs 88 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // 文件读取包 2 | const fs = require('fs'); 3 | // 引入 RSS 解析第三方包 4 | const Parser = require('rss-parser'); 5 | const parser = new Parser(); 6 | // 引入 RSS 生成器 7 | const RSS = require('rss'); 8 | 9 | // 相关配置 10 | const opmlXmlContentTitle = 'NJU-LUG Blogroll'; 11 | const readmeMdPath = './README.md'; 12 | const opmlJsonPath = './web/src/assets/opml.json'; 13 | const dataJsonPath = './web/src/assets/data.json'; 14 | const maxDataJsonItemsNumber = 40; // 保存前四十项 15 | const opmlXmlPath = './web/public/opml.xml'; 16 | const rssXmlPath = './web/public/rss.xml'; 17 | const opmlXmlContentOp = '\n \n ' + opmlXmlContentTitle + '\n \n \n\n'; 18 | const opmlXmlContentEd = '\n \n'; 19 | 20 | // 解析 README 中的表格,转为 JSON 21 | const pattern = /\| *([^\|]*) *\| *(http[^\|]*|---) *\| *(http[^\|]*|---) *\|/g; 22 | const readmeMdContent = fs.readFileSync(readmeMdPath, { encoding: 'utf-8' }); 23 | // 生成 opml.json 24 | const opmlJson = []; 25 | let resultArray; 26 | while ((resultArray = pattern.exec(readmeMdContent)) !== null) { 27 | opmlJson.push({ 28 | title: resultArray[1].trim(), 29 | xmlUrl: resultArray[2].trim(), 30 | htmlUrl: resultArray[3].trim() 31 | }); 32 | } 33 | // 保存 opml.json 和 opml.xml 34 | fs.writeFileSync(opmlJsonPath, JSON.stringify(opmlJson, null, 2), { encoding: 'utf-8' }); 35 | const opmlXmlContent = opmlXmlContentOp 36 | + opmlJson.map((lineJson) => ` \n`).join('') 37 | + opmlXmlContentEd; 38 | fs.writeFileSync(opmlXmlPath, opmlXmlContent, { encoding: 'utf-8' }); 39 | 40 | // 异步处理 41 | (async () => { 42 | 43 | try { 44 | // 获取服务器 IP 地址 45 | const response = await fetch('https://ipapi.do1e.cn/get-ip'); 46 | const ipData = await response.json(); 47 | console.log(ipData); 48 | } catch (err) { 49 | console.log(err); 50 | } 51 | 52 | // 用于存储各项数据 53 | const dataJson = []; 54 | 55 | for (const lineJson of opmlJson) { 56 | 57 | try { 58 | 59 | // 读取 RSS 的具体内容 60 | if (!lineJson.xmlUrl.startsWith('http')) { 61 | continue; 62 | } 63 | const feed = await parser.parseURL(lineJson.xmlUrl); 64 | 65 | // 数组合并 66 | dataJson.push.apply(dataJson, feed.items.filter((item) => item.title && item.content && item.pubDate).map((item) => { 67 | const pubDate = new Date(item.pubDate); 68 | return { 69 | name: lineJson.title, 70 | xmlUrl: lineJson.xmlUrl, 71 | htmlUrl: lineJson.htmlUrl, 72 | title: item.title, 73 | link: item.link, 74 | summary: item.summary ? item.summary : item.content, 75 | pubDate: pubDate, 76 | pubDateYYMMDD: pubDate.toISOString().split('T')[0] 77 | } 78 | })); 79 | 80 | } catch (err) { 81 | 82 | // 网络超时,进行 Log 报告 83 | console.log(err); 84 | console.log("-------------------------"); 85 | console.log("xmlUrl: " + lineJson.xmlUrl); 86 | console.log("-------------------------"); 87 | 88 | } 89 | } 90 | 91 | // 按时间顺序排序 92 | dataJson.sort((itemA, itemB) => itemA.pubDate < itemB.pubDate ? 1 : -1); 93 | // 默认为保存前 n 项的数据, 并保证不超过当前时间 94 | const curDate = new Date(); 95 | const dataJsonSliced = dataJson.filter((item) => item.pubDate <= curDate).slice(0, Math.min(maxDataJsonItemsNumber, dataJson.length)); 96 | fs.writeFileSync(dataJsonPath, JSON.stringify(dataJsonSliced, null, 2), { encoding: 'utf-8' }); 97 | 98 | // 生成 RSS 文件 99 | var feed = new RSS({ 100 | title: 'NJU-LUG Blogroll', 101 | description: '南京大学 Linux User Group 收集同学和校友们的 Blog', 102 | feed_url: 'https://blogroll.njulug.org/rss.xml', 103 | site_url: 'https://blogroll.njulug.org/', 104 | image_url: 'https://blogroll.njulug.org/assets/logo.56c0d74c.png', 105 | docs: 'https://blogroll.njulug.org/', 106 | managingEditor: 'NJU-LUG', 107 | webMaster: 'NJU-LUG', 108 | copyright: '2022 NJU-LUG', 109 | language: 'cn', 110 | pubDate: dataJson[0].pubDate, 111 | ttl: '60', 112 | }); 113 | 114 | for (let item of dataJsonSliced) { 115 | feed.item({ 116 | title: item.title, 117 | description: item.summary, 118 | url: item.link, // link to the item 119 | author: item.name, // optional - defaults to feed author property 120 | date: item.pubDate.toISOString(), // any format that js Date can parse. 121 | }); 122 | } 123 | 124 | // 保存 rss.xml 文件 125 | const rssXmlContent = feed.xml(); 126 | fs.writeFileSync(rssXmlPath, rssXmlContent, { encoding: 'utf-8' }); 127 | 128 | })(); 129 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blogroll", 3 | "version": "2.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "blogroll", 9 | "version": "2.0.0", 10 | "dependencies": { 11 | "rss": "^1.2.2", 12 | "rss-parser": "^3.12.0", 13 | "seatable-api": "^1.0.42", 14 | "vue": "^3.2.29" 15 | }, 16 | "devDependencies": { 17 | "@vitejs/plugin-vue": "^2.1.0", 18 | "vite": "^2.7.13" 19 | } 20 | }, 21 | "node_modules/@babel/parser": { 22 | "version": "7.17.0", 23 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", 24 | "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", 25 | "bin": { 26 | "parser": "bin/babel-parser.js" 27 | }, 28 | "engines": { 29 | "node": ">=6.0.0" 30 | } 31 | }, 32 | "node_modules/@babel/runtime": { 33 | "version": "7.20.13", 34 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", 35 | "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", 36 | "dependencies": { 37 | "regenerator-runtime": "^0.13.11" 38 | }, 39 | "engines": { 40 | "node": ">=6.9.0" 41 | } 42 | }, 43 | "node_modules/@vitejs/plugin-vue": { 44 | "version": "2.2.0", 45 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.2.0.tgz", 46 | "integrity": "sha512-wXigM1EwN2G7rZcwG6kLk9ivvIMhx2363tCEvMBiXcTu5nePM/12hUPVzPb83Uugt6U+zom1gTpJopi/Ow/jwg==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=12.0.0" 50 | }, 51 | "peerDependencies": { 52 | "vite": "^2.5.10", 53 | "vue": "^3.2.25" 54 | } 55 | }, 56 | "node_modules/@vue/compiler-core": { 57 | "version": "3.2.31", 58 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", 59 | "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", 60 | "dependencies": { 61 | "@babel/parser": "^7.16.4", 62 | "@vue/shared": "3.2.31", 63 | "estree-walker": "^2.0.2", 64 | "source-map": "^0.6.1" 65 | } 66 | }, 67 | "node_modules/@vue/compiler-dom": { 68 | "version": "3.2.31", 69 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", 70 | "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", 71 | "dependencies": { 72 | "@vue/compiler-core": "3.2.31", 73 | "@vue/shared": "3.2.31" 74 | } 75 | }, 76 | "node_modules/@vue/compiler-sfc": { 77 | "version": "3.2.31", 78 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", 79 | "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", 80 | "dependencies": { 81 | "@babel/parser": "^7.16.4", 82 | "@vue/compiler-core": "3.2.31", 83 | "@vue/compiler-dom": "3.2.31", 84 | "@vue/compiler-ssr": "3.2.31", 85 | "@vue/reactivity-transform": "3.2.31", 86 | "@vue/shared": "3.2.31", 87 | "estree-walker": "^2.0.2", 88 | "magic-string": "^0.25.7", 89 | "postcss": "^8.1.10", 90 | "source-map": "^0.6.1" 91 | } 92 | }, 93 | "node_modules/@vue/compiler-ssr": { 94 | "version": "3.2.31", 95 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", 96 | "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", 97 | "dependencies": { 98 | "@vue/compiler-dom": "3.2.31", 99 | "@vue/shared": "3.2.31" 100 | } 101 | }, 102 | "node_modules/@vue/reactivity": { 103 | "version": "3.2.31", 104 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", 105 | "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", 106 | "dependencies": { 107 | "@vue/shared": "3.2.31" 108 | } 109 | }, 110 | "node_modules/@vue/reactivity-transform": { 111 | "version": "3.2.31", 112 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", 113 | "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", 114 | "dependencies": { 115 | "@babel/parser": "^7.16.4", 116 | "@vue/compiler-core": "3.2.31", 117 | "@vue/shared": "3.2.31", 118 | "estree-walker": "^2.0.2", 119 | "magic-string": "^0.25.7" 120 | } 121 | }, 122 | "node_modules/@vue/runtime-core": { 123 | "version": "3.2.31", 124 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", 125 | "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", 126 | "dependencies": { 127 | "@vue/reactivity": "3.2.31", 128 | "@vue/shared": "3.2.31" 129 | } 130 | }, 131 | "node_modules/@vue/runtime-dom": { 132 | "version": "3.2.31", 133 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", 134 | "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", 135 | "dependencies": { 136 | "@vue/runtime-core": "3.2.31", 137 | "@vue/shared": "3.2.31", 138 | "csstype": "^2.6.8" 139 | } 140 | }, 141 | "node_modules/@vue/server-renderer": { 142 | "version": "3.2.31", 143 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", 144 | "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", 145 | "dependencies": { 146 | "@vue/compiler-ssr": "3.2.31", 147 | "@vue/shared": "3.2.31" 148 | }, 149 | "peerDependencies": { 150 | "vue": "3.2.31" 151 | } 152 | }, 153 | "node_modules/@vue/shared": { 154 | "version": "3.2.31", 155 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", 156 | "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" 157 | }, 158 | "node_modules/asynckit": { 159 | "version": "0.4.0", 160 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 161 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 162 | }, 163 | "node_modules/axios": { 164 | "version": "1.7.9", 165 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", 166 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", 167 | "dependencies": { 168 | "follow-redirects": "^1.15.6", 169 | "form-data": "^4.0.0", 170 | "proxy-from-env": "^1.1.0" 171 | } 172 | }, 173 | "node_modules/combined-stream": { 174 | "version": "1.0.8", 175 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 176 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 177 | "dependencies": { 178 | "delayed-stream": "~1.0.0" 179 | }, 180 | "engines": { 181 | "node": ">= 0.8" 182 | } 183 | }, 184 | "node_modules/csstype": { 185 | "version": "2.6.19", 186 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", 187 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" 188 | }, 189 | "node_modules/dayjs": { 190 | "version": "1.10.7", 191 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", 192 | "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" 193 | }, 194 | "node_modules/delayed-stream": { 195 | "version": "1.0.0", 196 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 197 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 198 | "engines": { 199 | "node": ">=0.4.0" 200 | } 201 | }, 202 | "node_modules/entities": { 203 | "version": "2.2.0", 204 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 205 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 206 | "funding": { 207 | "url": "https://github.com/fb55/entities?sponsor=1" 208 | } 209 | }, 210 | "node_modules/esbuild": { 211 | "version": "0.14.21", 212 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz", 213 | "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==", 214 | "dev": true, 215 | "hasInstallScript": true, 216 | "bin": { 217 | "esbuild": "bin/esbuild" 218 | }, 219 | "engines": { 220 | "node": ">=12" 221 | }, 222 | "optionalDependencies": { 223 | "esbuild-android-arm64": "0.14.21", 224 | "esbuild-darwin-64": "0.14.21", 225 | "esbuild-darwin-arm64": "0.14.21", 226 | "esbuild-freebsd-64": "0.14.21", 227 | "esbuild-freebsd-arm64": "0.14.21", 228 | "esbuild-linux-32": "0.14.21", 229 | "esbuild-linux-64": "0.14.21", 230 | "esbuild-linux-arm": "0.14.21", 231 | "esbuild-linux-arm64": "0.14.21", 232 | "esbuild-linux-mips64le": "0.14.21", 233 | "esbuild-linux-ppc64le": "0.14.21", 234 | "esbuild-linux-riscv64": "0.14.21", 235 | "esbuild-linux-s390x": "0.14.21", 236 | "esbuild-netbsd-64": "0.14.21", 237 | "esbuild-openbsd-64": "0.14.21", 238 | "esbuild-sunos-64": "0.14.21", 239 | "esbuild-windows-32": "0.14.21", 240 | "esbuild-windows-64": "0.14.21", 241 | "esbuild-windows-arm64": "0.14.21" 242 | } 243 | }, 244 | "node_modules/esbuild-android-arm64": { 245 | "version": "0.14.21", 246 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz", 247 | "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==", 248 | "cpu": [ 249 | "arm64" 250 | ], 251 | "dev": true, 252 | "optional": true, 253 | "os": [ 254 | "android" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/esbuild-darwin-64": { 261 | "version": "0.14.21", 262 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz", 263 | "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==", 264 | "cpu": [ 265 | "x64" 266 | ], 267 | "dev": true, 268 | "optional": true, 269 | "os": [ 270 | "darwin" 271 | ], 272 | "engines": { 273 | "node": ">=12" 274 | } 275 | }, 276 | "node_modules/esbuild-darwin-arm64": { 277 | "version": "0.14.21", 278 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz", 279 | "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==", 280 | "cpu": [ 281 | "arm64" 282 | ], 283 | "dev": true, 284 | "optional": true, 285 | "os": [ 286 | "darwin" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/esbuild-freebsd-64": { 293 | "version": "0.14.21", 294 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz", 295 | "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==", 296 | "cpu": [ 297 | "x64" 298 | ], 299 | "dev": true, 300 | "optional": true, 301 | "os": [ 302 | "freebsd" 303 | ], 304 | "engines": { 305 | "node": ">=12" 306 | } 307 | }, 308 | "node_modules/esbuild-freebsd-arm64": { 309 | "version": "0.14.21", 310 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz", 311 | "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==", 312 | "cpu": [ 313 | "arm64" 314 | ], 315 | "dev": true, 316 | "optional": true, 317 | "os": [ 318 | "freebsd" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/esbuild-linux-32": { 325 | "version": "0.14.21", 326 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz", 327 | "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==", 328 | "cpu": [ 329 | "ia32" 330 | ], 331 | "dev": true, 332 | "optional": true, 333 | "os": [ 334 | "linux" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/esbuild-linux-64": { 341 | "version": "0.14.21", 342 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz", 343 | "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "optional": true, 349 | "os": [ 350 | "linux" 351 | ], 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/esbuild-linux-arm": { 357 | "version": "0.14.21", 358 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz", 359 | "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==", 360 | "cpu": [ 361 | "arm" 362 | ], 363 | "dev": true, 364 | "optional": true, 365 | "os": [ 366 | "linux" 367 | ], 368 | "engines": { 369 | "node": ">=12" 370 | } 371 | }, 372 | "node_modules/esbuild-linux-arm64": { 373 | "version": "0.14.21", 374 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz", 375 | "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==", 376 | "cpu": [ 377 | "arm64" 378 | ], 379 | "dev": true, 380 | "optional": true, 381 | "os": [ 382 | "linux" 383 | ], 384 | "engines": { 385 | "node": ">=12" 386 | } 387 | }, 388 | "node_modules/esbuild-linux-mips64le": { 389 | "version": "0.14.21", 390 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz", 391 | "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==", 392 | "cpu": [ 393 | "mips64el" 394 | ], 395 | "dev": true, 396 | "optional": true, 397 | "os": [ 398 | "linux" 399 | ], 400 | "engines": { 401 | "node": ">=12" 402 | } 403 | }, 404 | "node_modules/esbuild-linux-ppc64le": { 405 | "version": "0.14.21", 406 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz", 407 | "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==", 408 | "cpu": [ 409 | "ppc64" 410 | ], 411 | "dev": true, 412 | "optional": true, 413 | "os": [ 414 | "linux" 415 | ], 416 | "engines": { 417 | "node": ">=12" 418 | } 419 | }, 420 | "node_modules/esbuild-linux-riscv64": { 421 | "version": "0.14.21", 422 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz", 423 | "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==", 424 | "cpu": [ 425 | "riscv64" 426 | ], 427 | "dev": true, 428 | "optional": true, 429 | "os": [ 430 | "linux" 431 | ], 432 | "engines": { 433 | "node": ">=12" 434 | } 435 | }, 436 | "node_modules/esbuild-linux-s390x": { 437 | "version": "0.14.21", 438 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz", 439 | "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==", 440 | "cpu": [ 441 | "s390x" 442 | ], 443 | "dev": true, 444 | "optional": true, 445 | "os": [ 446 | "linux" 447 | ], 448 | "engines": { 449 | "node": ">=12" 450 | } 451 | }, 452 | "node_modules/esbuild-netbsd-64": { 453 | "version": "0.14.21", 454 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz", 455 | "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==", 456 | "cpu": [ 457 | "x64" 458 | ], 459 | "dev": true, 460 | "optional": true, 461 | "os": [ 462 | "netbsd" 463 | ], 464 | "engines": { 465 | "node": ">=12" 466 | } 467 | }, 468 | "node_modules/esbuild-openbsd-64": { 469 | "version": "0.14.21", 470 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz", 471 | "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==", 472 | "cpu": [ 473 | "x64" 474 | ], 475 | "dev": true, 476 | "optional": true, 477 | "os": [ 478 | "openbsd" 479 | ], 480 | "engines": { 481 | "node": ">=12" 482 | } 483 | }, 484 | "node_modules/esbuild-sunos-64": { 485 | "version": "0.14.21", 486 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz", 487 | "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==", 488 | "cpu": [ 489 | "x64" 490 | ], 491 | "dev": true, 492 | "optional": true, 493 | "os": [ 494 | "sunos" 495 | ], 496 | "engines": { 497 | "node": ">=12" 498 | } 499 | }, 500 | "node_modules/esbuild-windows-32": { 501 | "version": "0.14.21", 502 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz", 503 | "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==", 504 | "cpu": [ 505 | "ia32" 506 | ], 507 | "dev": true, 508 | "optional": true, 509 | "os": [ 510 | "win32" 511 | ], 512 | "engines": { 513 | "node": ">=12" 514 | } 515 | }, 516 | "node_modules/esbuild-windows-64": { 517 | "version": "0.14.21", 518 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz", 519 | "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==", 520 | "cpu": [ 521 | "x64" 522 | ], 523 | "dev": true, 524 | "optional": true, 525 | "os": [ 526 | "win32" 527 | ], 528 | "engines": { 529 | "node": ">=12" 530 | } 531 | }, 532 | "node_modules/esbuild-windows-arm64": { 533 | "version": "0.14.21", 534 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz", 535 | "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==", 536 | "cpu": [ 537 | "arm64" 538 | ], 539 | "dev": true, 540 | "optional": true, 541 | "os": [ 542 | "win32" 543 | ], 544 | "engines": { 545 | "node": ">=12" 546 | } 547 | }, 548 | "node_modules/estree-walker": { 549 | "version": "2.0.2", 550 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 551 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 552 | }, 553 | "node_modules/follow-redirects": { 554 | "version": "1.15.9", 555 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 556 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 557 | "funding": [ 558 | { 559 | "type": "individual", 560 | "url": "https://github.com/sponsors/RubenVerborgh" 561 | } 562 | ], 563 | "engines": { 564 | "node": ">=4.0" 565 | }, 566 | "peerDependenciesMeta": { 567 | "debug": { 568 | "optional": true 569 | } 570 | } 571 | }, 572 | "node_modules/form-data": { 573 | "version": "4.0.1", 574 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 575 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 576 | "dependencies": { 577 | "asynckit": "^0.4.0", 578 | "combined-stream": "^1.0.8", 579 | "mime-types": "^2.1.12" 580 | }, 581 | "engines": { 582 | "node": ">= 6" 583 | } 584 | }, 585 | "node_modules/fsevents": { 586 | "version": "2.3.2", 587 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 588 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 589 | "dev": true, 590 | "hasInstallScript": true, 591 | "optional": true, 592 | "os": [ 593 | "darwin" 594 | ], 595 | "engines": { 596 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 597 | } 598 | }, 599 | "node_modules/function-bind": { 600 | "version": "1.1.1", 601 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 602 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 603 | "dev": true 604 | }, 605 | "node_modules/has": { 606 | "version": "1.0.3", 607 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 608 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 609 | "dev": true, 610 | "dependencies": { 611 | "function-bind": "^1.1.1" 612 | }, 613 | "engines": { 614 | "node": ">= 0.4.0" 615 | } 616 | }, 617 | "node_modules/is-core-module": { 618 | "version": "2.8.1", 619 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 620 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 621 | "dev": true, 622 | "dependencies": { 623 | "has": "^1.0.3" 624 | }, 625 | "funding": { 626 | "url": "https://github.com/sponsors/ljharb" 627 | } 628 | }, 629 | "node_modules/magic-string": { 630 | "version": "0.25.7", 631 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 632 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 633 | "dependencies": { 634 | "sourcemap-codec": "^1.4.4" 635 | } 636 | }, 637 | "node_modules/mime-db": { 638 | "version": "1.25.0", 639 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz", 640 | "integrity": "sha1-wY29fHOl2/b0SgJNwNFloeexw5I=", 641 | "engines": { 642 | "node": ">= 0.6" 643 | } 644 | }, 645 | "node_modules/mime-types": { 646 | "version": "2.1.13", 647 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz", 648 | "integrity": "sha1-4HqqnGxrmnyjASxpADrSWjnpKog=", 649 | "dependencies": { 650 | "mime-db": "~1.25.0" 651 | }, 652 | "engines": { 653 | "node": ">= 0.6" 654 | } 655 | }, 656 | "node_modules/nanoid": { 657 | "version": "3.2.0", 658 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 659 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 660 | "bin": { 661 | "nanoid": "bin/nanoid.cjs" 662 | }, 663 | "engines": { 664 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 665 | } 666 | }, 667 | "node_modules/path-parse": { 668 | "version": "1.0.7", 669 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 670 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 671 | "dev": true 672 | }, 673 | "node_modules/picocolors": { 674 | "version": "1.0.0", 675 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 676 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 677 | }, 678 | "node_modules/postcss": { 679 | "version": "8.4.6", 680 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 681 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 682 | "dependencies": { 683 | "nanoid": "^3.2.0", 684 | "picocolors": "^1.0.0", 685 | "source-map-js": "^1.0.2" 686 | }, 687 | "engines": { 688 | "node": "^10 || ^12 || >=14" 689 | }, 690 | "funding": { 691 | "type": "opencollective", 692 | "url": "https://opencollective.com/postcss/" 693 | } 694 | }, 695 | "node_modules/proxy-from-env": { 696 | "version": "1.1.0", 697 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 698 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 699 | }, 700 | "node_modules/regenerator-runtime": { 701 | "version": "0.13.11", 702 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 703 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 704 | }, 705 | "node_modules/resolve": { 706 | "version": "1.22.0", 707 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 708 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 709 | "dev": true, 710 | "dependencies": { 711 | "is-core-module": "^2.8.1", 712 | "path-parse": "^1.0.7", 713 | "supports-preserve-symlinks-flag": "^1.0.0" 714 | }, 715 | "bin": { 716 | "resolve": "bin/resolve" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/ljharb" 720 | } 721 | }, 722 | "node_modules/rollup": { 723 | "version": "2.67.2", 724 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz", 725 | "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==", 726 | "dev": true, 727 | "bin": { 728 | "rollup": "dist/bin/rollup" 729 | }, 730 | "engines": { 731 | "node": ">=10.0.0" 732 | }, 733 | "optionalDependencies": { 734 | "fsevents": "~2.3.2" 735 | } 736 | }, 737 | "node_modules/rss": { 738 | "version": "1.2.2", 739 | "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz", 740 | "integrity": "sha1-UKFpiHYTgTOnT5oF0r3I240nqSE=", 741 | "dependencies": { 742 | "mime-types": "2.1.13", 743 | "xml": "1.0.1" 744 | } 745 | }, 746 | "node_modules/rss-parser": { 747 | "version": "3.12.0", 748 | "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", 749 | "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==", 750 | "dependencies": { 751 | "entities": "^2.0.3", 752 | "xml2js": "^0.4.19" 753 | } 754 | }, 755 | "node_modules/sax": { 756 | "version": "1.2.4", 757 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 758 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 759 | }, 760 | "node_modules/seatable-api": { 761 | "version": "1.0.42", 762 | "resolved": "https://registry.npmjs.org/seatable-api/-/seatable-api-1.0.42.tgz", 763 | "integrity": "sha512-zooM+8AbYywvhoaeo4D4SmzTddBcfeCQH8wUFF0/M+1mCDupmavozpjwKL0/+A6saeUvV7/yvFc5wFP7UKv1eQ==", 764 | "dependencies": { 765 | "@babel/runtime": "7.20.13", 766 | "axios": "~1.7.*", 767 | "dayjs": "1.10.7" 768 | } 769 | }, 770 | "node_modules/source-map": { 771 | "version": "0.6.1", 772 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 773 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 774 | "engines": { 775 | "node": ">=0.10.0" 776 | } 777 | }, 778 | "node_modules/source-map-js": { 779 | "version": "1.0.2", 780 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 781 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 782 | "engines": { 783 | "node": ">=0.10.0" 784 | } 785 | }, 786 | "node_modules/sourcemap-codec": { 787 | "version": "1.4.8", 788 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 789 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 790 | }, 791 | "node_modules/supports-preserve-symlinks-flag": { 792 | "version": "1.0.0", 793 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 794 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 795 | "dev": true, 796 | "engines": { 797 | "node": ">= 0.4" 798 | }, 799 | "funding": { 800 | "url": "https://github.com/sponsors/ljharb" 801 | } 802 | }, 803 | "node_modules/vite": { 804 | "version": "2.8.1", 805 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz", 806 | "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==", 807 | "dev": true, 808 | "dependencies": { 809 | "esbuild": "^0.14.14", 810 | "postcss": "^8.4.6", 811 | "resolve": "^1.22.0", 812 | "rollup": "^2.59.0" 813 | }, 814 | "bin": { 815 | "vite": "bin/vite.js" 816 | }, 817 | "engines": { 818 | "node": ">=12.2.0" 819 | }, 820 | "optionalDependencies": { 821 | "fsevents": "~2.3.2" 822 | }, 823 | "peerDependencies": { 824 | "less": "*", 825 | "sass": "*", 826 | "stylus": "*" 827 | }, 828 | "peerDependenciesMeta": { 829 | "less": { 830 | "optional": true 831 | }, 832 | "sass": { 833 | "optional": true 834 | }, 835 | "stylus": { 836 | "optional": true 837 | } 838 | } 839 | }, 840 | "node_modules/vue": { 841 | "version": "3.2.31", 842 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", 843 | "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", 844 | "dependencies": { 845 | "@vue/compiler-dom": "3.2.31", 846 | "@vue/compiler-sfc": "3.2.31", 847 | "@vue/runtime-dom": "3.2.31", 848 | "@vue/server-renderer": "3.2.31", 849 | "@vue/shared": "3.2.31" 850 | } 851 | }, 852 | "node_modules/xml": { 853 | "version": "1.0.1", 854 | "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", 855 | "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" 856 | }, 857 | "node_modules/xml2js": { 858 | "version": "0.4.23", 859 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 860 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 861 | "dependencies": { 862 | "sax": ">=0.6.0", 863 | "xmlbuilder": "~11.0.0" 864 | }, 865 | "engines": { 866 | "node": ">=4.0.0" 867 | } 868 | }, 869 | "node_modules/xmlbuilder": { 870 | "version": "11.0.1", 871 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 872 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 873 | "engines": { 874 | "node": ">=4.0" 875 | } 876 | } 877 | }, 878 | "dependencies": { 879 | "@babel/parser": { 880 | "version": "7.17.0", 881 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", 882 | "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" 883 | }, 884 | "@babel/runtime": { 885 | "version": "7.20.13", 886 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", 887 | "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", 888 | "requires": { 889 | "regenerator-runtime": "^0.13.11" 890 | } 891 | }, 892 | "@vitejs/plugin-vue": { 893 | "version": "2.2.0", 894 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.2.0.tgz", 895 | "integrity": "sha512-wXigM1EwN2G7rZcwG6kLk9ivvIMhx2363tCEvMBiXcTu5nePM/12hUPVzPb83Uugt6U+zom1gTpJopi/Ow/jwg==", 896 | "dev": true, 897 | "requires": {} 898 | }, 899 | "@vue/compiler-core": { 900 | "version": "3.2.31", 901 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", 902 | "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", 903 | "requires": { 904 | "@babel/parser": "^7.16.4", 905 | "@vue/shared": "3.2.31", 906 | "estree-walker": "^2.0.2", 907 | "source-map": "^0.6.1" 908 | } 909 | }, 910 | "@vue/compiler-dom": { 911 | "version": "3.2.31", 912 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", 913 | "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", 914 | "requires": { 915 | "@vue/compiler-core": "3.2.31", 916 | "@vue/shared": "3.2.31" 917 | } 918 | }, 919 | "@vue/compiler-sfc": { 920 | "version": "3.2.31", 921 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", 922 | "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", 923 | "requires": { 924 | "@babel/parser": "^7.16.4", 925 | "@vue/compiler-core": "3.2.31", 926 | "@vue/compiler-dom": "3.2.31", 927 | "@vue/compiler-ssr": "3.2.31", 928 | "@vue/reactivity-transform": "3.2.31", 929 | "@vue/shared": "3.2.31", 930 | "estree-walker": "^2.0.2", 931 | "magic-string": "^0.25.7", 932 | "postcss": "^8.1.10", 933 | "source-map": "^0.6.1" 934 | } 935 | }, 936 | "@vue/compiler-ssr": { 937 | "version": "3.2.31", 938 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", 939 | "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", 940 | "requires": { 941 | "@vue/compiler-dom": "3.2.31", 942 | "@vue/shared": "3.2.31" 943 | } 944 | }, 945 | "@vue/reactivity": { 946 | "version": "3.2.31", 947 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", 948 | "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", 949 | "requires": { 950 | "@vue/shared": "3.2.31" 951 | } 952 | }, 953 | "@vue/reactivity-transform": { 954 | "version": "3.2.31", 955 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", 956 | "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", 957 | "requires": { 958 | "@babel/parser": "^7.16.4", 959 | "@vue/compiler-core": "3.2.31", 960 | "@vue/shared": "3.2.31", 961 | "estree-walker": "^2.0.2", 962 | "magic-string": "^0.25.7" 963 | } 964 | }, 965 | "@vue/runtime-core": { 966 | "version": "3.2.31", 967 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", 968 | "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", 969 | "requires": { 970 | "@vue/reactivity": "3.2.31", 971 | "@vue/shared": "3.2.31" 972 | } 973 | }, 974 | "@vue/runtime-dom": { 975 | "version": "3.2.31", 976 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", 977 | "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", 978 | "requires": { 979 | "@vue/runtime-core": "3.2.31", 980 | "@vue/shared": "3.2.31", 981 | "csstype": "^2.6.8" 982 | } 983 | }, 984 | "@vue/server-renderer": { 985 | "version": "3.2.31", 986 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", 987 | "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", 988 | "requires": { 989 | "@vue/compiler-ssr": "3.2.31", 990 | "@vue/shared": "3.2.31" 991 | } 992 | }, 993 | "@vue/shared": { 994 | "version": "3.2.31", 995 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", 996 | "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" 997 | }, 998 | "asynckit": { 999 | "version": "0.4.0", 1000 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1001 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 1002 | }, 1003 | "axios": { 1004 | "version": "1.7.9", 1005 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", 1006 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", 1007 | "requires": { 1008 | "follow-redirects": "^1.15.6", 1009 | "form-data": "^4.0.0", 1010 | "proxy-from-env": "^1.1.0" 1011 | } 1012 | }, 1013 | "combined-stream": { 1014 | "version": "1.0.8", 1015 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1016 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1017 | "requires": { 1018 | "delayed-stream": "~1.0.0" 1019 | } 1020 | }, 1021 | "csstype": { 1022 | "version": "2.6.19", 1023 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", 1024 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" 1025 | }, 1026 | "dayjs": { 1027 | "version": "1.10.7", 1028 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", 1029 | "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" 1030 | }, 1031 | "delayed-stream": { 1032 | "version": "1.0.0", 1033 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1034 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 1035 | }, 1036 | "entities": { 1037 | "version": "2.2.0", 1038 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 1039 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" 1040 | }, 1041 | "esbuild": { 1042 | "version": "0.14.21", 1043 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz", 1044 | "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==", 1045 | "dev": true, 1046 | "requires": { 1047 | "esbuild-android-arm64": "0.14.21", 1048 | "esbuild-darwin-64": "0.14.21", 1049 | "esbuild-darwin-arm64": "0.14.21", 1050 | "esbuild-freebsd-64": "0.14.21", 1051 | "esbuild-freebsd-arm64": "0.14.21", 1052 | "esbuild-linux-32": "0.14.21", 1053 | "esbuild-linux-64": "0.14.21", 1054 | "esbuild-linux-arm": "0.14.21", 1055 | "esbuild-linux-arm64": "0.14.21", 1056 | "esbuild-linux-mips64le": "0.14.21", 1057 | "esbuild-linux-ppc64le": "0.14.21", 1058 | "esbuild-linux-riscv64": "0.14.21", 1059 | "esbuild-linux-s390x": "0.14.21", 1060 | "esbuild-netbsd-64": "0.14.21", 1061 | "esbuild-openbsd-64": "0.14.21", 1062 | "esbuild-sunos-64": "0.14.21", 1063 | "esbuild-windows-32": "0.14.21", 1064 | "esbuild-windows-64": "0.14.21", 1065 | "esbuild-windows-arm64": "0.14.21" 1066 | } 1067 | }, 1068 | "esbuild-android-arm64": { 1069 | "version": "0.14.21", 1070 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz", 1071 | "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==", 1072 | "dev": true, 1073 | "optional": true 1074 | }, 1075 | "esbuild-darwin-64": { 1076 | "version": "0.14.21", 1077 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz", 1078 | "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==", 1079 | "dev": true, 1080 | "optional": true 1081 | }, 1082 | "esbuild-darwin-arm64": { 1083 | "version": "0.14.21", 1084 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz", 1085 | "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==", 1086 | "dev": true, 1087 | "optional": true 1088 | }, 1089 | "esbuild-freebsd-64": { 1090 | "version": "0.14.21", 1091 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz", 1092 | "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==", 1093 | "dev": true, 1094 | "optional": true 1095 | }, 1096 | "esbuild-freebsd-arm64": { 1097 | "version": "0.14.21", 1098 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz", 1099 | "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==", 1100 | "dev": true, 1101 | "optional": true 1102 | }, 1103 | "esbuild-linux-32": { 1104 | "version": "0.14.21", 1105 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz", 1106 | "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==", 1107 | "dev": true, 1108 | "optional": true 1109 | }, 1110 | "esbuild-linux-64": { 1111 | "version": "0.14.21", 1112 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz", 1113 | "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==", 1114 | "dev": true, 1115 | "optional": true 1116 | }, 1117 | "esbuild-linux-arm": { 1118 | "version": "0.14.21", 1119 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz", 1120 | "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==", 1121 | "dev": true, 1122 | "optional": true 1123 | }, 1124 | "esbuild-linux-arm64": { 1125 | "version": "0.14.21", 1126 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz", 1127 | "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==", 1128 | "dev": true, 1129 | "optional": true 1130 | }, 1131 | "esbuild-linux-mips64le": { 1132 | "version": "0.14.21", 1133 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz", 1134 | "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==", 1135 | "dev": true, 1136 | "optional": true 1137 | }, 1138 | "esbuild-linux-ppc64le": { 1139 | "version": "0.14.21", 1140 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz", 1141 | "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==", 1142 | "dev": true, 1143 | "optional": true 1144 | }, 1145 | "esbuild-linux-riscv64": { 1146 | "version": "0.14.21", 1147 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz", 1148 | "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==", 1149 | "dev": true, 1150 | "optional": true 1151 | }, 1152 | "esbuild-linux-s390x": { 1153 | "version": "0.14.21", 1154 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz", 1155 | "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==", 1156 | "dev": true, 1157 | "optional": true 1158 | }, 1159 | "esbuild-netbsd-64": { 1160 | "version": "0.14.21", 1161 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz", 1162 | "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==", 1163 | "dev": true, 1164 | "optional": true 1165 | }, 1166 | "esbuild-openbsd-64": { 1167 | "version": "0.14.21", 1168 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz", 1169 | "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==", 1170 | "dev": true, 1171 | "optional": true 1172 | }, 1173 | "esbuild-sunos-64": { 1174 | "version": "0.14.21", 1175 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz", 1176 | "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==", 1177 | "dev": true, 1178 | "optional": true 1179 | }, 1180 | "esbuild-windows-32": { 1181 | "version": "0.14.21", 1182 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz", 1183 | "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==", 1184 | "dev": true, 1185 | "optional": true 1186 | }, 1187 | "esbuild-windows-64": { 1188 | "version": "0.14.21", 1189 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz", 1190 | "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==", 1191 | "dev": true, 1192 | "optional": true 1193 | }, 1194 | "esbuild-windows-arm64": { 1195 | "version": "0.14.21", 1196 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz", 1197 | "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==", 1198 | "dev": true, 1199 | "optional": true 1200 | }, 1201 | "estree-walker": { 1202 | "version": "2.0.2", 1203 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1204 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1205 | }, 1206 | "follow-redirects": { 1207 | "version": "1.15.9", 1208 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 1209 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" 1210 | }, 1211 | "form-data": { 1212 | "version": "4.0.1", 1213 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 1214 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 1215 | "requires": { 1216 | "asynckit": "^0.4.0", 1217 | "combined-stream": "^1.0.8", 1218 | "mime-types": "^2.1.12" 1219 | } 1220 | }, 1221 | "fsevents": { 1222 | "version": "2.3.2", 1223 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1224 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1225 | "dev": true, 1226 | "optional": true 1227 | }, 1228 | "function-bind": { 1229 | "version": "1.1.1", 1230 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1231 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1232 | "dev": true 1233 | }, 1234 | "has": { 1235 | "version": "1.0.3", 1236 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1237 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1238 | "dev": true, 1239 | "requires": { 1240 | "function-bind": "^1.1.1" 1241 | } 1242 | }, 1243 | "is-core-module": { 1244 | "version": "2.8.1", 1245 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1246 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1247 | "dev": true, 1248 | "requires": { 1249 | "has": "^1.0.3" 1250 | } 1251 | }, 1252 | "magic-string": { 1253 | "version": "0.25.7", 1254 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 1255 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 1256 | "requires": { 1257 | "sourcemap-codec": "^1.4.4" 1258 | } 1259 | }, 1260 | "mime-db": { 1261 | "version": "1.25.0", 1262 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz", 1263 | "integrity": "sha1-wY29fHOl2/b0SgJNwNFloeexw5I=" 1264 | }, 1265 | "mime-types": { 1266 | "version": "2.1.13", 1267 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz", 1268 | "integrity": "sha1-4HqqnGxrmnyjASxpADrSWjnpKog=", 1269 | "requires": { 1270 | "mime-db": "~1.25.0" 1271 | } 1272 | }, 1273 | "nanoid": { 1274 | "version": "3.2.0", 1275 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1276 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" 1277 | }, 1278 | "path-parse": { 1279 | "version": "1.0.7", 1280 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1281 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1282 | "dev": true 1283 | }, 1284 | "picocolors": { 1285 | "version": "1.0.0", 1286 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1287 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1288 | }, 1289 | "postcss": { 1290 | "version": "8.4.6", 1291 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 1292 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 1293 | "requires": { 1294 | "nanoid": "^3.2.0", 1295 | "picocolors": "^1.0.0", 1296 | "source-map-js": "^1.0.2" 1297 | } 1298 | }, 1299 | "proxy-from-env": { 1300 | "version": "1.1.0", 1301 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1302 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1303 | }, 1304 | "regenerator-runtime": { 1305 | "version": "0.13.11", 1306 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 1307 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 1308 | }, 1309 | "resolve": { 1310 | "version": "1.22.0", 1311 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1312 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1313 | "dev": true, 1314 | "requires": { 1315 | "is-core-module": "^2.8.1", 1316 | "path-parse": "^1.0.7", 1317 | "supports-preserve-symlinks-flag": "^1.0.0" 1318 | } 1319 | }, 1320 | "rollup": { 1321 | "version": "2.67.2", 1322 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz", 1323 | "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==", 1324 | "dev": true, 1325 | "requires": { 1326 | "fsevents": "~2.3.2" 1327 | } 1328 | }, 1329 | "rss": { 1330 | "version": "1.2.2", 1331 | "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz", 1332 | "integrity": "sha1-UKFpiHYTgTOnT5oF0r3I240nqSE=", 1333 | "requires": { 1334 | "mime-types": "2.1.13", 1335 | "xml": "1.0.1" 1336 | } 1337 | }, 1338 | "rss-parser": { 1339 | "version": "3.12.0", 1340 | "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", 1341 | "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==", 1342 | "requires": { 1343 | "entities": "^2.0.3", 1344 | "xml2js": "^0.4.19" 1345 | } 1346 | }, 1347 | "sax": { 1348 | "version": "1.2.4", 1349 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1350 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1351 | }, 1352 | "seatable-api": { 1353 | "version": "1.0.42", 1354 | "resolved": "https://registry.npmjs.org/seatable-api/-/seatable-api-1.0.42.tgz", 1355 | "integrity": "sha512-zooM+8AbYywvhoaeo4D4SmzTddBcfeCQH8wUFF0/M+1mCDupmavozpjwKL0/+A6saeUvV7/yvFc5wFP7UKv1eQ==", 1356 | "requires": { 1357 | "@babel/runtime": "7.20.13", 1358 | "axios": "~1.7.*", 1359 | "dayjs": "1.10.7" 1360 | } 1361 | }, 1362 | "source-map": { 1363 | "version": "0.6.1", 1364 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1365 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1366 | }, 1367 | "source-map-js": { 1368 | "version": "1.0.2", 1369 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1370 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1371 | }, 1372 | "sourcemap-codec": { 1373 | "version": "1.4.8", 1374 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1375 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 1376 | }, 1377 | "supports-preserve-symlinks-flag": { 1378 | "version": "1.0.0", 1379 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1380 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1381 | "dev": true 1382 | }, 1383 | "vite": { 1384 | "version": "2.8.1", 1385 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz", 1386 | "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==", 1387 | "dev": true, 1388 | "requires": { 1389 | "esbuild": "^0.14.14", 1390 | "fsevents": "~2.3.2", 1391 | "postcss": "^8.4.6", 1392 | "resolve": "^1.22.0", 1393 | "rollup": "^2.59.0" 1394 | } 1395 | }, 1396 | "vue": { 1397 | "version": "3.2.31", 1398 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", 1399 | "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", 1400 | "requires": { 1401 | "@vue/compiler-dom": "3.2.31", 1402 | "@vue/compiler-sfc": "3.2.31", 1403 | "@vue/runtime-dom": "3.2.31", 1404 | "@vue/server-renderer": "3.2.31", 1405 | "@vue/shared": "3.2.31" 1406 | } 1407 | }, 1408 | "xml": { 1409 | "version": "1.0.1", 1410 | "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", 1411 | "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" 1412 | }, 1413 | "xml2js": { 1414 | "version": "0.4.23", 1415 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1416 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1417 | "requires": { 1418 | "sax": ">=0.6.0", 1419 | "xmlbuilder": "~11.0.0" 1420 | } 1421 | }, 1422 | "xmlbuilder": { 1423 | "version": "11.0.1", 1424 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1425 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1426 | } 1427 | } 1428 | } 1429 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blogroll", 3 | "version": "2.0.0", 4 | "scripts": { 5 | "dev": "cd web && vite", 6 | "update": "node update_files.js", 7 | "gen": "node index.js", 8 | "build": "cd web && vite build", 9 | "preview": "cd web && vite preview --port 5050" 10 | }, 11 | "dependencies": { 12 | "rss": "^1.2.2", 13 | "rss-parser": "^3.12.0", 14 | "seatable-api": "^1.0.42", 15 | "vue": "^3.2.29" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-vue": "^2.1.0", 19 | "vite": "^2.7.13" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /update_files.js: -------------------------------------------------------------------------------- 1 | // 文件读取包 2 | const fs = require('fs'); 3 | // 引入 SeaTableAPI 4 | const { Base } = require('seatable-api'); 5 | // exit函数 6 | const { exit } = require('process'); 7 | 8 | // 相关配置 9 | const seatableToken = process.env.SEATABLE_API_TOKEN; 10 | const readmeMdPath = './README.md'; 11 | // 读取 README.md 12 | const readmeMdContent = fs.readFileSync(readmeMdPath, { encoding: 'utf-8' }); 13 | 14 | // 解析 SeaTable 中的表格,转为 JSON 15 | async function parseSeaTableToJson() { 16 | const seatableBase = new Base({ 17 | server: "https://table.nju.edu.cn", 18 | APIToken: seatableToken 19 | }); 20 | try { 21 | await seatableBase.auth(); 22 | } catch (err) { 23 | console.log('Seatable API Token 无效,请检查环境变量 SEATABLE_API_TOKEN 是否正确设置。'); 24 | exit(1); 25 | } 26 | const tables = await seatableBase.getTables(); 27 | const rows = await seatableBase.listRows(tables[0]['name']); 28 | const rows_reverse = rows.reverse(); 29 | var opmlJson = []; 30 | rows_reverse.forEach(row => { 31 | // 根据Name去重并保留最后一个 32 | if (row['Name'] && !(opmlJson.find((item) => item.title === row['Name']))) { 33 | if (opmlJson.find((item) => item.htmlUrl === row['HTML'])) { 34 | return; 35 | } 36 | opmlJson.push({ 37 | title: row['Name'], 38 | xmlUrl: row['RSS'], 39 | htmlUrl: row['HTML'] 40 | }); 41 | } 42 | }); 43 | return opmlJson.reverse(); 44 | } 45 | 46 | 47 | (async () => { 48 | // 从 SeaTable 中读取数据 49 | const opmlJson = await parseSeaTableToJson(); 50 | 51 | // 更新 README.md 中的表格内容 52 | const tableStart = readmeMdContent.indexOf('| -- | -- | -- |') + 22; 53 | const tableEnd = readmeMdContent.indexOf('## OPML') - 2; 54 | const tableContent = opmlJson.map((lineJson) => `| ${lineJson.title} | ${lineJson.xmlUrl} | ${lineJson.htmlUrl} |`).join('\n') + '\n'; 55 | const newReadmeMdContent = readmeMdContent.slice(0, tableStart) + tableContent + readmeMdContent.slice(tableEnd); 56 | fs.writeFileSync(readmeMdPath, newReadmeMdContent, { encoding: 'utf-8' }); 57 | })(); 58 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Blogroll | NJU-LUG 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/opml.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | NJU-LUG Blogroll 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/public/rss.xml: -------------------------------------------------------------------------------- 1 | <![CDATA[NJU-LUG Blogroll]]>https://blogroll.njulug.org/https://blogroll.njulug.org/assets/logo.56c0d74c.pngNJU-LUG Blogrollhttps://blogroll.njulug.org/RSS for NodeThu, 17 Feb 2022 06:49:52 GMTWed, 31 Dec 2098 16:00:00 GMThttps://blogroll.njulug.org/60<![CDATA[为 Hexo 博客中的 Markdown 添加卡片式链接支持]]> 2 | 为 Hexo 博客中的 Markdown 添加卡片式链接支持 3 | 4 |

我写了一个 Hexo 插件,可以使用现有 Markdown 语法将链接转换为卡片式链接(网页卡片).

5 |

这个插件的 GitHub 地址在这里:

6 |

OrangeX4/hexo-link-card - GitHubhttps://github.com/OrangeX4/hexo-link-card

7 |

卡片式链接的优点:

8 |
    9 |
  1. 在移动互联网的时代,有许多人通过智能手机浏览文章,通过卡片式链接打开新页面对他们更友好;
  2. 10 |
  3. 旧式的链接显示方式不够明显,很容易导致人们忽视了这是一条链接,卡片式链接能够突出显示,不容易被他人忽略;
  4. 11 |
  5. 许多平台,例如 Bilibili,知乎,微信公众号等平台,均有将链接转换为卡片式链接的功能,如果能在书写 Markdown 阶段,就将卡片式链接的书写考虑进去,能给后续发布带来很大的便利。
  6. 12 |
]]>
https://blog.orangex4.cool/post/hexo-link-card/https://blog.orangex4.cool/post/hexo-link-card/Wed, 09 Feb 2022 16:00:00 GMT
<![CDATA[VSCode 通过 Remote - SSH 远程连接腾讯云服务器]]> 13 | VSCode 通过 Remote - SSH 远程连接腾讯云服务器 14 | 15 |

每当我切换到一个新环境,例如新电脑、新系统时,总是会忘记如何配置 VSCode 中的 Remote - SSH,也就很难连上腾讯云服务器进行开发。

16 |

所以我特意将配置的步骤写成一篇博文,记录如下。

17 |

18 | 20 |

]]>
https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/Mon, 07 Feb 2022 16:00:00 GMT
<![CDATA[Cloudflare Tunnel 速度测试]]>2021年4月,Cloudflare 宣布其旗下的服务 Cloudflare Tunnel 免费开放Cloudflare Tunnel 可以在服务器和 Cloudflare 全球网络之间建立连接,使得服务器在不打开任何防火墙入站规则(甚至可以没有公网IP)的情况下得以被公网访问。这一技术可以应用于内网穿透、保护服务器安全性等领域。

21 |

网络上已经有很多关于 Cloudflare Tunnel 的使用教程,但截至本文章发布,我并没有找到延迟和速度测试。因此我自己分别对上海和香港的服务器进行了测试并发布在这里。

]]>
https://blog.caomingjun.com/cloudflare-tunnel-speedtest/https://blog.caomingjun.com/cloudflare-tunnel-speedtest/Sun, 06 Feb 2022 11:23:00 GMT
<![CDATA[Pico Neo 3 开箱体验 - XR 或许已经走出了最低谷]]>https://idealclover.top/archives/630/https://idealclover.top/archives/630/Fri, 04 Feb 2022 11:30:00 GMT<![CDATA[杂记 | 2021年终总结]]>https://blog.typoverflow.me/index.php/archives/34/https://blog.typoverflow.me/index.php/archives/34/Wed, 26 Jan 2022 13:42:00 GMT<![CDATA[2021折腾总结]]>在刚刚过去的 2021 年,我在课内课外都折腾了不少东西(主要是在下半年)。其实这其中的许多东西都值得写一篇博客记录,但是我自从创建网站之后就比较忙,没有写,于是在这篇文章做一个总结。可能未来会补上那些博客。

]]>
https://blog.caomingjun.com/my2021/https://blog.caomingjun.com/my2021/Sun, 23 Jan 2022 11:36:40 GMT
<![CDATA[AIO Ep10. 使用群晖 QuickConnect 访问内网任意 / 第三方 TCP 服务]]>群晖的 QuickConnect 是群晖自带的一项内网穿透功能, 通过某宝的洗白服务, 自建的黑群晖也可以使用 QuickConnect 来进行内网穿透.

24 |

QuickConnect 与群晖自家的应用搭配使用很方便, 可以实现内外网的无缝切换, 只需要填入 QuickConnect ID 即可.

25 |

缺点是 QuickConnect 功能只能在群晖官方的 APP 上使用, 而群晖的很多 APP 实际使用体验很差, 缺失很多最基本的功能.

26 |

AIO Ep.9 中提到了使用 ipv6 DDNS 的方式, 这篇有关 n1 盒子的文章中展示了配置透明代理访问内网任意服务的方式. 但这种方法在目前 ipv6 尚未全面普及的时候仍有不便.(很多 Wi-Fi 不支持或默认未开启 ipv6, 必须使用热点共享.)

27 |

最终经过搜索和实验我找到了使用 QuickConnect 代理所有应用流量的方法, 可以节约自己搭建反向代理或购买反向代理的费用.(白嫖到榨干它) 整理记录在此.

28 | 29 | ]]>
https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/Fri, 21 Jan 2022 15:18:34 GMT
<![CDATA[关于 SOP(同源策略) / CORS(跨源资源共享) / CSRF(跨站请求伪造) 的一些认识]]>同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI主机名端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

32 |

跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。

33 |

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

34 | 35 | ]]>
https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/Thu, 20 Jan 2022 03:54:55 GMT
<![CDATA[Windows 下的实用工具 PowerToys 推荐]]>来安利一下这个非常强大的软件 PowerToys.

38 |

PowerToys 是微软官方和开源社区共同维护的一组实用工具.

39 |

包含了 Explorer markdown/pdf/svg 预览, 屏幕取色, PowerToys Run(快速启动), 正则文件重命名, 快捷键映射, 图像大小调整, 快速定位鼠标, 保持唤醒等一系列十分实用的功能.

40 | 41 | ]]>
https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/Thu, 20 Jan 2022 03:38:25 GMT
<![CDATA[2022的Flags]]>https://blog.typoverflow.me/index.php/archives/32/https://blog.typoverflow.me/index.php/archives/32/Sat, 15 Jan 2022 05:21:00 GMT<![CDATA[高速旋转球体的物理动画模拟(虚幻4实现)]]> 42 |

GitHub仓库 地址 前几天突发奇想,虚幻4里有没有办法模拟出乒乓球在真实世界的运动规律呢(比如下旋的回弹,上旋加速等)? 据我 ...

43 |

The post 高速旋转球体的物理动画模拟(虚幻4实现) appeared first on α-Lyrae.

44 | ]]>
https://chr.fan/ue4-ball/https://chr.fan/ue4-ball/Sat, 01 Jan 2022 15:36:33 GMT
<![CDATA[GAMES101学习笔记]]> 45 |

GAMES101课后作业仓库 博客的LaTeX支持真的差得离谱……符号过大,格式也不太好看,可能以后会比较少在博客上写数学相关的东 ...

46 |

The post GAMES101学习笔记 appeared first on α-Lyrae.

47 | ]]>
https://chr.fan/games101/https://chr.fan/games101/Sat, 01 Jan 2022 15:27:59 GMT
<![CDATA[观影记录]]>https://blog.typoverflow.me/index.php/archives/14/https://blog.typoverflow.me/index.php/archives/14/Sun, 26 Dec 2021 15:59:00 GMT<![CDATA[南大印象]]>https://blog.typoverflow.me/index.php/archives/4/https://blog.typoverflow.me/index.php/archives/4/Sat, 25 Dec 2021 08:53:00 GMT<![CDATA[从 Wordpress 切换至 Hugo]]>https://ladderoperator.top/post/hello_hugo/https://ladderoperator.top/post/hello_hugo/Mon, 13 Dec 2021 00:00:00 GMT<![CDATA[H110m + QNCT 的 OpenCore MacOS Big Sur 黑苹果尝试]]>0x00 前言

去年苹果发布了搭载 M1 芯片的 MacBook, 随后新一代的 Mac mini 和 iMac 也使用了 Arm 架构的 M1 芯片. M1 Pro 和 M1 Max 让 M1 完全取代 Intel 芯片成为可能.

50 |

目前的趋势是 M1 将会全面取代 x86 的 Intel CPU, 在技术层面上黑苹果会困难到几乎不可能. 同时黑苹果的价格优势也变得不再显著. 可能不过几年, “黑苹果”的技术就会淹没在历史的潮流中.

51 |

所以趁着这最后的辉煌, 我也来尝试体验一下 Hackintosh.

52 | 53 | ]]>
https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/Mon, 29 Nov 2021 01:26:37 GMT
<![CDATA[Windows 下 TUN 全局透明代理的设置]]>某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.

56 |

这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.

57 |

还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.

58 |

上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.

59 |

可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理则会更加方便.

60 | 61 | ]]>
https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/Wed, 17 Nov 2021 12:15:09 GMT
<![CDATA[Arch踩坑记录]]> 62 |

不定期更新遇到的新问题,仅做记录,仅限我的笔记本上可以如下解决问题 无声音,No input or output devices ...

63 |

The post Arch踩坑记录 appeared first on α-Lyrae.

64 | ]]>
https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/Sat, 23 Oct 2021 09:49:36 GMT
<![CDATA[解决Android Studio下flutter使用签名构建失败的问题]]>https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/Thu, 14 Oct 2021 02:53:58 GMT<![CDATA[N1 盒子刷 Armbian 配置为软路由 & AP 方案记录]]>每一场泡沫破碎的背后, 是一茬韭菜的哭泣, 更是一群垃圾佬的狂欢(大雾)~~

67 | 68 | ]]>
https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/Thu, 30 Sep 2021 05:52:22 GMT
<![CDATA[用python编写网页更新提醒程序]]>https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/Wed, 29 Sep 2021 07:16:56 GMT<![CDATA[urllib3 1.26与代理冲突问题解决]]>https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/Tue, 28 Sep 2021 03:19:59 GMT<![CDATA[电子手写笔记解决方案 - iPlay 30(附刷机过程)]]>开始读大学, 准备寻找一种电子手写笔记的解决方案~

71 |

简单搜索了一下, 找到了以下几种方案.

72 |
    73 |
  • 手写之后拍照上传

    74 |

    优点: 无需专用设备, 书写手感好, 几乎无成本. 缺点: 麻烦低效, 要携带纸笔.

    75 |
  • 76 |
  • 数位板

    77 |

    优点: 低成本, 低延时. 缺点: 手眼不同步. 携带电脑和板, 重.

    78 |
  • 79 |
  • 数位屏

    80 |

    优点: 看着屏写, 手眼同步, 低延时. 缺点: 携带电脑和屏, 重. 数位屏较贵.

    81 |
  • 82 |
  • 支持手写笔的平板

    83 |

    优点: 手眼同步, 课后平板还能用于其他用处. 缺点: 手写延时高, 贵.

    84 |
  • 85 |
  • 普通平板加被动电容笔

    86 |

    优点: 便宜的一塌糊涂. 缺点: 基本就是垃圾.

    87 |
  • 88 |
89 | 90 | ]]>
https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/Mon, 27 Sep 2021 02:58:31 GMT
<![CDATA[简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算]]> 91 | 简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算 92 | 93 | 94 |

95 | 简介

96 | 97 |

Latex Sympy Calculator 是一款 VSCode 插件, 它能够帮助你在 VSCode 写 Latex 或 Markdown 的时候, 一键计算 Latex 书写的数学公式.

98 |

99 | 101 |

102 |

当前支持的功能:

103 |
    104 |
  1. 算术: 加 (+), 减 (-), 点乘 (·), 叉乘 (×), 除法 (/), 乘方 (^), 绝对值 (|x|), 开方 (√), 虚数 (i)…
  2. 105 |
  3. 字母表: 英文字母 a - z, A - Z, 希腊字母 α - ω, 下标 (x_1), 重音符 (ā)…
  4. 106 |
  5. 常见函数: 最大公约数 (gcd), 最小公倍数 (lcm), 下界 (floor), 上届 (ceil), 最大值 (max), 最小值 (min), 取对数 (log), 自然对数 (ln), 指数 (exp), 三角函数 (sin, cos, tan, csc, sec, cot, arcsin, sinh, arsinh)…
  6. 107 |
  7. 微积分: 求极限 (limnlim_{n\to\infty}), 求导/求微分 (ddx(x2+x)\frac{d}{dx}(x^2+x)), 求积分 (xdx\int xdx)…
  8. 108 |
  9. 线性代数: 矩阵 (Matrix), 行列式 (Determinant), 转置 (Transpose), 求逆 (Inverse), 初等变换 (Elementary Transformation)…
  10. 109 |
  11. 关系符: 大于 (>), 小于 (<), 大于等于 (≥), 小于等于 (≤), 相等 (=)…
  12. 110 |
  13. 其他: 二项式…
  14. 111 |
112 |

当然, 实际上还有很多其他的功能, 只要是 Python Sympy 包支持的运算, 都可以通过这个插件来实现.

113 |

通过这个插件, 你就不再需要一字一句地将 Latex 转译成其他语言, 然后用 Matlab 或 MMA 等数学软件进行科学计算了. 简单的 符号推导, 矩阵运算, 微积分, 科学计算, 完全可以利用这个插件来实现.

114 |

如果你也在 VSCode 中用 LatexMarkdown 写数学公式, 那么这就是你 必备的 VSCode 科学计算插件.

115 |

插件的 GitHub 页面.

116 |

latex2sympy2 包的 Github 页面.

]]>
https://blog.orangex4.cool/post/latex-sympy-calculator/https://blog.orangex4.cool/post/latex-sympy-calculator/Fri, 17 Sep 2021 16:00:00 GMT
<![CDATA[为自己搭建 RSS 订阅提醒服务]]> 117 | 为自己搭建 RSS 订阅提醒服务 118 | 119 | 120 |

121 | 缘由

122 | 123 |

自己一直苦于关注的信息源太杂, 每次想要查看新的信息, 都得打开一堆网站和 APP (如别人的博客, Github, 微博, 知乎, B站之类的). 为了改善自己的订阅体验, 在 @Mexii 的帮助下, 我开始研究如何给自己搭建一个体验良好的 RSS 订阅提醒服务.

124 |

最终的解决方案如下:

125 |
    126 |
  • Inkrss (开源项目, RSS 订阅提醒的核心, 使用免费的 Cloudflare Workers)
  • 127 |
  • Vercel (免费的 Serverless 云函数服务, 能够免费托管 NodeJS, Python 代码)
  • 128 |
  • 企业微信 Server 酱 (免费开通企业微信, 然后使用 Server 酱进行信息提醒)
  • 129 |
  • RssHub (为了更好的体验, 需要托管在自建的服务器中, 需要服务器)
  • 130 |
131 |

大致效果如下:

132 |

133 | 135 |

]]>
https://blog.orangex4.cool/post/inkrss-for-self/https://blog.orangex4.cool/post/inkrss-for-self/Fri, 17 Sep 2021 16:00:00 GMT
<![CDATA[尝试自己动手维修坏掉的 Orange Pi~ Part. 2]]>时隔一年又一个月, 由于最近硬件价格实在是比较魔幻, 更加舍不得把我角落里吃灰已久 Orange Pi PC 2 扔掉了. 毕竟同样使用全志 H5 Soc 的 Orange Pi Zero Plus 小板现在都超过它当时的价格了.

138 |

正好最近心血来潮升级了 电烙铁, 可调电源, 万用表等一系列工具, 所以就来继续尝试看看维修. :P

139 |

维修的上一段尝试在 这里.

140 | 141 | ]]>
https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/Fri, 17 Sep 2021 07:36:51 GMT
<![CDATA[《提问的智慧》和《别像弱智一样提问》读后感]]>https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/Sun, 12 Sep 2021 15:07:04 GMT<![CDATA[Hp 39gs 图形科学计算器硬件魔改 48gii 小记]]>高中期间学校要求竞赛使用的计算器是 卡西欧 991 CNX, 可是它功能太少, 很多数学计算都不能进行. 学校又不允许带手机.

144 |

于是只能转向”古老”的科学计算器, 发现了一款性价比很高的科学计算器 – HP 39gs.

145 |

HP 39gs 这款机器现在某宝涨价到近 80r 了, 我当时咸鱼入手的时候只要 50r, 之前好像还只要 20-30r,

146 |

HP 39gs 本身功能也不是特别多, 可能比起卡西欧只多了绘图和编程的功能.

147 |

但是 HP 39gs 和支持 CAS 的 HP 48gii 只差了按键印刷和 一块 Flash 而已. 魔改之后计算器大概就变成了一个简陋版 Matlab 了. 可玩性增强很多.

148 | 149 | ]]>
https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/Fri, 10 Sep 2021 06:27:22 GMT
<![CDATA[zsh配置]]>https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/Thu, 09 Sep 2021 03:07:54 GMT<![CDATA[个人博客建立过程记录]]>https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/Thu, 09 Sep 2021 01:37:34 GMT<![CDATA[在提问之前]]> 150 | 在提问之前 151 | 152 |

阅读《提问的智慧》有感.

153 |

每一个人, 特别是学计算机的人, 都要学会通过 STFW 和 RTFM 独立解决问题. 这是由多方原因决定的.

]]>
https://blog.orangex4.cool/post/before-asking-questions/https://blog.orangex4.cool/post/before-asking-questions/Tue, 07 Sep 2021 16:00:00 GMT
<![CDATA[在 Markdown 中书写伪代码]]> 154 | 在 Markdown 中书写伪代码 155 | 156 | 157 |

158 | 0. 想法来源

159 | 160 |

最近上算法课需要书写伪代码, 但伪代码一般都是通过 Latex 书写的, 但我又不想专门为了它去写 Latex, 所以就开始考虑如何在 Markdown 中书写伪代码.

161 |

根据 “Atwood’s Law” 原则:

162 |
163 |

Any application that can be written in JavaScript, will eventually be written in JavaScript.

164 |

任何可以用 JavaScript 来写的应用, 最终都将用 JavaScript 来写.

165 |
166 |

我再次将目光投向前端, 寻找符合前端思想的解决方案.

167 |

最终我选定了 VSCode + Markdown Preview Enhanced + pseudocode.js 的组合.

168 |

(缺点是不能在 VSCode 中实时预览, 这个问题的主要原因是我不想再次魔改和维护别人写的插件了.)

169 |

大概效果:

170 |

171 | 173 |

]]>
https://blog.orangex4.cool/post/markdown-pseudocode/https://blog.orangex4.cool/post/markdown-pseudocode/Thu, 02 Sep 2021 16:00:00 GMT
<![CDATA[Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序]]> 174 |

声明:本人不会提供任何解密lpk文件的程序。本文仅仅是技术向的探讨、经验分享。 如果您认为本文侵犯了您的权益,请联系我,我会立刻删 ...

175 |

The post Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序 appeared first on α-Lyrae.

176 | ]]>
https://chr.fan/lpk-decrypt/https://chr.fan/lpk-decrypt/Tue, 31 Aug 2021 20:45:13 GMT
<![CDATA[生成含有使用者备用名称 (SAN) 的 SSL 证书, 解决 Chrome 和 Okhttp HTTPS 报错]]>之前设置了 ipv6 DDNS, 可以从外网访问到家里 AIO 上的 http 服务器.

179 |

由于只是自己使用, 就打算使用自签名证书. 但按照网上教程生成的证书导入 Chrome 后报错 ERR_CERT_COMMON_NAME_INVALID, 在 OkHttp 中报错Hostname xxx is not verified.

180 |

查阅资料发现是生成的证书没有 SAN 的缘故, 网上生成 SAN 自签名证书的教程很多都有问题, 最终找到一种可行的方法, 记录在此.

181 | 182 | ]]>
https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/Sun, 29 Aug 2021 06:58:09 GMT
<![CDATA[AIO Ep9. 群晖 ipv6 阿里 DDNS 设置]]>初探 ipv6 & 群晖 ipv6 DDNS 的设置.

185 | 186 | ]]>
https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/Tue, 24 Aug 2021 01:43:33 GMT
<![CDATA[AIO Ep8. 记一次 ESXi 黑群晖失联排查]]>黑群晖不定时失联, 排查故障过程记录.

189 | 190 | ]]>
https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/Mon, 23 Aug 2021 14:48:40 GMT
<![CDATA[AIO Ep7. 硬件的一些更改]]>Hpe Gen10+ 有点令我失望… 后闲鱼出手改用自己组装的整机.

193 | 194 | ]]>
https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/Mon, 23 Aug 2021 04:26:52 GMT
<![CDATA[AIO Ep6. ESXi 黑群晖设置时的一些小技巧和踩的坑]]>如题. 主要是归类一些我参考的教程.

197 | 198 | ]]>
https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/Fri, 13 Aug 2021 02:39:32 GMT
<![CDATA[AIO Ep5. 我的服务器的软件结构]]>基础的 ESXi 已经装好了, 先来概括一下软件上的安排.

201 | 202 | ]]>
https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/Thu, 12 Aug 2021 16:09:47 GMT
<![CDATA[Hexo 部署到 OSS 国内访问加速]]>博客本来使用了 Netlify + 国内阿里 CDN 加速.

205 |

但没想到… Netlify 的源站实在是太慢了. 慢到返回一个 304 都能等到 504 Gateway Time-out.

206 |

既然都已经备案了, 还是要想办法让国内访问快一点.

207 |

所以打算利用 Github Actions 将网站再部署到 OSS 上, 再用 CDN 加速.

208 |

同时由于国内评论发表需要审核, 使用 Valine (Valine-Admin) 替换了 Gitalk, 支持手动审核.

209 | 210 | ]]>
https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/Thu, 12 Aug 2021 15:56:44 GMT
-------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 42 | 43 | 55 | 56 | 59 | -------------------------------------------------------------------------------- /web/src/assets/base.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | overflow-x: hidden; 4 | color: #2c323c; 5 | background-color: #f6f6f6; 6 | font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif, Arial; 7 | } 8 | 9 | html body table td, html body table th { 10 | border: 1px solid #d6d6d6; 11 | padding: 6px 13px; 12 | } 13 | 14 | html body table th { 15 | font-weight: bold; 16 | color: #000; 17 | } 18 | 19 | td { 20 | display: table-cell; 21 | vertical-align: inherit; 22 | } 23 | 24 | th { 25 | display: table-cell; 26 | vertical-align: inherit; 27 | font-weight: bold; 28 | text-align: -internal-center; 29 | } 30 | 31 | thead { 32 | display: table-header-group; 33 | vertical-align: middle; 34 | border-color: inherit; 35 | } 36 | 37 | html body table { 38 | margin: 10px 0 15px 0; 39 | border-collapse: collapse; 40 | border-spacing: 0; 41 | display: block; 42 | width: 100%; 43 | overflow: auto; 44 | word-break: normal; 45 | word-break: keep-all; 46 | } 47 | 48 | blockquote { 49 | margin: 20px auto; 50 | color: #555555; 51 | padding: 3px 3px 3px 12px; 52 | border-left: 8px solid #84b3ff; 53 | position: relative; 54 | background: #f0f0f0; 55 | } 56 | 57 | code { 58 | font-family: Menlo,Monaco,Consolas,'Courier New',monospace; 59 | background-color: #f0f0f0; 60 | border-radius: 3px; 61 | padding: 3px; 62 | } 63 | 64 | pre code { 65 | background-color: transparent; 66 | } 67 | 68 | img { 69 | max-width: 100%; 70 | max-height: 100%; 71 | object-fit: cover; 72 | } 73 | 74 | ::-webkit-scrollbar { 75 | width: 5px; 76 | background-color: transparent; 77 | } 78 | 79 | ::-webkit-scrollbar-track { 80 | border-radius: 5px; 81 | margin: 5px 0; 82 | background-color: transparent; 83 | } 84 | 85 | ::-webkit-scrollbar-thumb { 86 | border-radius: 5px; 87 | background-color: rgba(175, 175, 175, 0.75); 88 | } 89 | 90 | ::-webkit-scrollbar-thumb:hover { 91 | border-radius: 5px; 92 | background-color: rgba(100, 100, 100, 0.85); 93 | } 94 | 95 | a { 96 | color: #3273dc; 97 | text-decoration: none; 98 | } 99 | 100 | a:hover { 101 | color: #2c323c; 102 | } 103 | 104 | #logo-left { 105 | flex-grow: 1; 106 | display: flex; 107 | align-items: center; 108 | } 109 | 110 | #logo-right { 111 | display: flex; 112 | align-items: center; 113 | padding-right: 5px; 114 | } 115 | 116 | #logo { 117 | height: 35px; 118 | width: 35px; 119 | } 120 | 121 | #logo-github { 122 | height: 30px; 123 | width: 30px; 124 | } 125 | 126 | #logo-text { 127 | padding: 0 10px; 128 | color: #444950; 129 | font-size: large; 130 | font-weight: bold; 131 | } 132 | 133 | #header { 134 | -webkit-box-shadow: 0 1px 3px rgb(18 18 18 / 10%); 135 | box-shadow: 0 1px 3px rgb(18 18 18 / 10%); 136 | z-index: 100; 137 | overflow: hidden; 138 | background: #fff; 139 | margin-bottom: 20px; 140 | } 141 | 142 | #header-inner { 143 | width: 1200px; 144 | padding-left: 30px; 145 | height: 50px; 146 | margin: auto; 147 | display: flex; 148 | align-items: center; 149 | } 150 | 151 | #container { 152 | margin: auto; 153 | width: 1200px; 154 | overflow: hidden; 155 | } 156 | 157 | #main { 158 | float: left; 159 | width: 70%; 160 | } 161 | 162 | #sidebar { 163 | -webkit-box-shadow: 0 1px 3px rgb(18 18 18 / 10%); 164 | box-shadow: 0 1px 3px rgb(18 18 18 / 10%); 165 | border-radius: 5px; 166 | background-color: #fff; 167 | float: right; 168 | width: 30%; 169 | } 170 | 171 | #sidebar-content { 172 | margin: 20px 30px; 173 | } 174 | 175 | /* 适配窄框 */ 176 | @media (max-width: 1200px) { 177 | 178 | #container { 179 | width: 100%; 180 | } 181 | 182 | #header-inner { 183 | width: 100%; 184 | } 185 | 186 | #logo-right { 187 | padding-right: 45px; 188 | } 189 | 190 | #main { 191 | float: none; 192 | width: auto; 193 | } 194 | 195 | #sidebar { 196 | float: none; 197 | display: none; 198 | } 199 | } 200 | 201 | -------------------------------------------------------------------------------- /web/src/assets/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "OrangeX4's Blog", 4 | "xmlUrl": "https://orangex4.cool/atom.xml", 5 | "htmlUrl": "https://orangex4.cool/", 6 | "title": "为 Hexo 博客中的 Markdown 添加卡片式链接支持", 7 | "link": "https://blog.orangex4.cool/post/hexo-link-card/", 8 | "summary": "

\n 为 Hexo 博客中的 Markdown 添加卡片式链接支持

\n \n

我写了一个 Hexo 插件,可以使用现有 Markdown 语法将链接转换为卡片式链接(网页卡片).

\n

这个插件的 GitHub 地址在这里:

\n

OrangeX4/hexo-link-card - GitHubhttps://github.com/OrangeX4/hexo-link-card

\n

卡片式链接的优点:

\n
    \n
  1. 在移动互联网的时代,有许多人通过智能手机浏览文章,通过卡片式链接打开新页面对他们更友好;
  2. \n
  3. 旧式的链接显示方式不够明显,很容易导致人们忽视了这是一条链接,卡片式链接能够突出显示,不容易被他人忽略;
  4. \n
  5. 许多平台,例如 Bilibili,知乎,微信公众号等平台,均有将链接转换为卡片式链接的功能,如果能在书写 Markdown 阶段,就将卡片式链接的书写考虑进去,能给后续发布带来很大的便利。
  6. \n
", 9 | "pubDate": "2022-02-09T16:00:00.000Z", 10 | "pubDateYYMMDD": "2022-02-09" 11 | }, 12 | { 13 | "name": "OrangeX4's Blog", 14 | "xmlUrl": "https://orangex4.cool/atom.xml", 15 | "htmlUrl": "https://orangex4.cool/", 16 | "title": "VSCode 通过 Remote - SSH 远程连接腾讯云服务器", 17 | "link": "https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/", 18 | "summary": "

\n VSCode 通过 Remote - SSH 远程连接腾讯云服务器

\n \n

每当我切换到一个新环境,例如新电脑、新系统时,总是会忘记如何配置 VSCode 中的 Remote - SSH,也就很难连上腾讯云服务器进行开发。

\n

所以我特意将配置的步骤写成一篇博文,记录如下。

\n

\n \"\"\n

", 19 | "pubDate": "2022-02-07T16:00:00.000Z", 20 | "pubDateYYMMDD": "2022-02-07" 21 | }, 22 | { 23 | "name": "Cmj's Blog", 24 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 25 | "htmlUrl": "https://blog.caomingjun.com/", 26 | "title": "Cloudflare Tunnel 速度测试", 27 | "link": "https://blog.caomingjun.com/cloudflare-tunnel-speedtest/", 28 | "summary": "

2021年4月,Cloudflare 宣布其旗下的服务 Cloudflare Tunnel 免费开放Cloudflare Tunnel 可以在服务器和 Cloudflare 全球网络之间建立连接,使得服务器在不打开任何防火墙入站规则(甚至可以没有公网IP)的情况下得以被公网访问。这一技术可以应用于内网穿透、保护服务器安全性等领域。

\n

网络上已经有很多关于 Cloudflare Tunnel 的使用教程,但截至本文章发布,我并没有找到延迟和速度测试。因此我自己分别对上海和香港的服务器进行了测试并发布在这里。

", 29 | "pubDate": "2022-02-06T11:23:00.000Z", 30 | "pubDateYYMMDD": "2022-02-06" 31 | }, 32 | { 33 | "name": "Idealclover's Blog", 34 | "xmlUrl": "https://idealclover.top/feed", 35 | "htmlUrl": "https://idealclover.top/", 36 | "title": "Pico Neo 3 开箱体验 - XR 或许已经走出了最低谷", 37 | "link": "https://idealclover.top/archives/630/", 38 | "summary": "“字节跳动 50 亿元收购 pico,宣布进军元宇宙”这成为了同事,会不会给点优惠啊,翠翠这么想着,结果就有了内部员工福利——原来 2599 的 Pico Neo 3 只要 1599,甚至到手写...", 39 | "pubDate": "2022-02-04T11:30:00.000Z", 40 | "pubDateYYMMDD": "2022-02-04" 41 | }, 42 | { 43 | "name": "Typoverflow's Blog", 44 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/", 45 | "htmlUrl": "https://blog.typoverflow.me/", 46 | "title": "杂记 | 2021年终总结", 47 | "link": "https://blog.typoverflow.me/index.php/archives/34/", 48 | "summary": "写在前面在2021年最后的那一个月里,开始重新打理自己的博客,也终于有时间好好思考一下过去的一年自己做了些什么事。总感觉2020年年初开始时间真的过得飞快,也不知道到底是因为生活到了一定的阶段后...", 49 | "pubDate": "2022-01-26T13:42:00.000Z", 50 | "pubDateYYMMDD": "2022-01-26" 51 | }, 52 | { 53 | "name": "Cmj's Blog", 54 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 55 | "htmlUrl": "https://blog.caomingjun.com/", 56 | "title": "2021折腾总结", 57 | "link": "https://blog.caomingjun.com/my2021/", 58 | "summary": "

在刚刚过去的 2021 年,我在课内课外都折腾了不少东西(主要是在下半年)。其实这其中的许多东西都值得写一篇博客记录,但是我自从创建网站之后就比较忙,没有写,于是在这篇文章做一个总结。可能未来会补上那些博客。

", 59 | "pubDate": "2022-01-23T11:36:40.000Z", 60 | "pubDateYYMMDD": "2022-01-23" 61 | }, 62 | { 63 | "name": "lyc8503's Blog", 64 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 65 | "htmlUrl": "https://blog.lyc8503.site/", 66 | "title": "AIO Ep10. 使用群晖 QuickConnect 访问内网任意 / 第三方 TCP 服务", 67 | "link": "https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/", 68 | "summary": "\n \n

群晖的 QuickConnect 是群晖自带的一项内网穿透功能, 通过某宝的洗白服务, 自建的黑群晖也可以使用 QuickConnect 来进行内网穿透.

\n

QuickConnect 与群晖自家的应用搭配使用很方便, 可以实现内外网的无缝切换, 只需要填入 QuickConnect ID 即可.

\n

缺点是 QuickConnect 功能只能在群晖官方的 APP 上使用, 而群晖的很多 APP 实际使用体验很差, 缺失很多最基本的功能.

\n

AIO Ep.9 中提到了使用 ipv6 DDNS 的方式, 这篇有关 n1 盒子的文章中展示了配置透明代理访问内网任意服务的方式. 但这种方法在目前 ipv6 尚未全面普及的时候仍有不便.(很多 Wi-Fi 不支持或默认未开启 ipv6, 必须使用热点共享.)

\n

最终经过搜索和实验我找到了使用 QuickConnect 代理所有应用流量的方法, 可以节约自己搭建反向代理或购买反向代理的费用.(白嫖到榨干它) 整理记录在此.

\n \n ", 69 | "pubDate": "2022-01-21T15:18:34.000Z", 70 | "pubDateYYMMDD": "2022-01-21" 71 | }, 72 | { 73 | "name": "lyc8503's Blog", 74 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 75 | "htmlUrl": "https://blog.lyc8503.site/", 76 | "title": "关于 SOP(同源策略) / CORS(跨源资源共享) / CSRF(跨站请求伪造) 的一些认识", 77 | "link": "https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/", 78 | "summary": "\n \n

同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI主机名端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

\n

跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。

\n

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

\n \n ", 79 | "pubDate": "2022-01-20T03:54:55.000Z", 80 | "pubDateYYMMDD": "2022-01-20" 81 | }, 82 | { 83 | "name": "lyc8503's Blog", 84 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 85 | "htmlUrl": "https://blog.lyc8503.site/", 86 | "title": "Windows 下的实用工具 PowerToys 推荐", 87 | "link": "https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/", 88 | "summary": "\n \n

来安利一下这个非常强大的软件 PowerToys.

\n

PowerToys 是微软官方和开源社区共同维护的一组实用工具.

\n

包含了 Explorer markdown/pdf/svg 预览, 屏幕取色, PowerToys Run(快速启动), 正则文件重命名, 快捷键映射, 图像大小调整, 快速定位鼠标, 保持唤醒等一系列十分实用的功能.

\n \n ", 89 | "pubDate": "2022-01-20T03:38:25.000Z", 90 | "pubDateYYMMDD": "2022-01-20" 91 | }, 92 | { 93 | "name": "Typoverflow's Blog", 94 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/", 95 | "htmlUrl": "https://blog.typoverflow.me/", 96 | "title": "2022的Flags", 97 | "link": "https://blog.typoverflow.me/index.php/archives/32/", 98 | "summary": "可惜第一个月就开始摸了[goal title=\"在学\"][item progress=\"1%\"] cpp guidelines [/item][item progress=\"41%\"] cs14...", 99 | "pubDate": "2022-01-15T05:21:00.000Z", 100 | "pubDateYYMMDD": "2022-01-15" 101 | }, 102 | { 103 | "name": "Antares's Blog", 104 | "xmlUrl": "https://chr.fan/feed", 105 | "htmlUrl": "https://chr.fan", 106 | "title": "高速旋转球体的物理动画模拟(虚幻4实现)", 107 | "link": "https://chr.fan/ue4-ball/", 108 | "summary": "
\"\"
\n

GitHub仓库 地址 前几天突发奇想,虚幻4里有没有办法模拟出乒乓球在真实世界的运动规律呢(比如下旋的回弹,上旋加速等)? 据我 ...

\n

The post 高速旋转球体的物理动画模拟(虚幻4实现) appeared first on α-Lyrae.

\n", 109 | "pubDate": "2022-01-01T15:36:33.000Z", 110 | "pubDateYYMMDD": "2022-01-01" 111 | }, 112 | { 113 | "name": "Antares's Blog", 114 | "xmlUrl": "https://chr.fan/feed", 115 | "htmlUrl": "https://chr.fan", 116 | "title": "GAMES101学习笔记", 117 | "link": "https://chr.fan/games101/", 118 | "summary": "
\"\"
\n

GAMES101课后作业仓库 博客的LaTeX支持真的差得离谱……符号过大,格式也不太好看,可能以后会比较少在博客上写数学相关的东 ...

\n

The post GAMES101学习笔记 appeared first on α-Lyrae.

\n", 119 | "pubDate": "2022-01-01T15:27:59.000Z", 120 | "pubDateYYMMDD": "2022-01-01" 121 | }, 122 | { 123 | "name": "Typoverflow's Blog", 124 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/", 125 | "htmlUrl": "https://blog.typoverflow.me/", 126 | "title": "观影记录", 127 | "link": "https://blog.typoverflow.me/index.php/archives/14/", 128 | "summary": "观影记录", 129 | "pubDate": "2021-12-26T15:59:00.000Z", 130 | "pubDateYYMMDD": "2021-12-26" 131 | }, 132 | { 133 | "name": "Typoverflow's Blog", 134 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/", 135 | "htmlUrl": "https://blog.typoverflow.me/", 136 | "title": "南大印象", 137 | "link": "https://blog.typoverflow.me/index.php/archives/4/", 138 | "summary": "南大印象", 139 | "pubDate": "2021-12-25T08:53:00.000Z", 140 | "pubDateYYMMDD": "2021-12-25" 141 | }, 142 | { 143 | "name": "LadderOperator's Blog", 144 | "xmlUrl": "https://ladderoperator.top/index.xml", 145 | "htmlUrl": "https://ladderoperator.top", 146 | "title": "从 Wordpress 切换至 Hugo", 147 | "link": "https://ladderoperator.top/post/hello_hugo/", 148 | "summary": "由于某次 Wordpress 差点崩没了的经历,细思恐极,觉得文章应该有个比较好的备份模式。故 (花了快半年) 决定切换到 Hugo! 这也是我的第", 149 | "pubDate": "2021-12-13T00:00:00.000Z", 150 | "pubDateYYMMDD": "2021-12-13" 151 | }, 152 | { 153 | "name": "lyc8503's Blog", 154 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 155 | "htmlUrl": "https://blog.lyc8503.site/", 156 | "title": "H110m + QNCT 的 OpenCore MacOS Big Sur 黑苹果尝试", 157 | "link": "https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/", 158 | "summary": "\n \n

0x00 前言

去年苹果发布了搭载 M1 芯片的 MacBook, 随后新一代的 Mac mini 和 iMac 也使用了 Arm 架构的 M1 芯片. M1 Pro 和 M1 Max 让 M1 完全取代 Intel 芯片成为可能.

\n

目前的趋势是 M1 将会全面取代 x86 的 Intel CPU, 在技术层面上黑苹果会困难到几乎不可能. 同时黑苹果的价格优势也变得不再显著. 可能不过几年, “黑苹果”的技术就会淹没在历史的潮流中.

\n

所以趁着这最后的辉煌, 我也来尝试体验一下 Hackintosh.

\n \n ", 159 | "pubDate": "2021-11-29T01:26:37.000Z", 160 | "pubDateYYMMDD": "2021-11-29" 161 | }, 162 | { 163 | "name": "lyc8503's Blog", 164 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 165 | "htmlUrl": "https://blog.lyc8503.site/", 166 | "title": "Windows 下 TUN 全局透明代理的设置", 167 | "link": "https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/", 168 | "summary": "\n \n

某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.

\n

这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.

\n

还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.

\n

上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.

\n

可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理则会更加方便.

\n \n ", 169 | "pubDate": "2021-11-17T12:15:09.000Z", 170 | "pubDateYYMMDD": "2021-11-17" 171 | }, 172 | { 173 | "name": "Antares's Blog", 174 | "xmlUrl": "https://chr.fan/feed", 175 | "htmlUrl": "https://chr.fan", 176 | "title": "Arch踩坑记录", 177 | "link": "https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/", 178 | "summary": "
\"\"
\n

不定期更新遇到的新问题,仅做记录,仅限我的笔记本上可以如下解决问题 无声音,No input or output devices ...

\n

The post Arch踩坑记录 appeared first on α-Lyrae.

\n", 179 | "pubDate": "2021-10-23T09:49:36.000Z", 180 | "pubDateYYMMDD": "2021-10-23" 181 | }, 182 | { 183 | "name": "Cmj's Blog", 184 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 185 | "htmlUrl": "https://blog.caomingjun.com/", 186 | "title": "解决Android Studio下flutter使用签名构建失败的问题", 187 | "link": "https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/", 188 | "summary": "解决Android Studio下flutter使用签名构建失败的问题", 189 | "pubDate": "2021-10-14T02:53:58.000Z", 190 | "pubDateYYMMDD": "2021-10-14" 191 | }, 192 | { 193 | "name": "lyc8503's Blog", 194 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 195 | "htmlUrl": "https://blog.lyc8503.site/", 196 | "title": "N1 盒子刷 Armbian 配置为软路由 & AP 方案记录", 197 | "link": "https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/", 198 | "summary": "\n \n

每一场泡沫破碎的背后, 是一茬韭菜的哭泣, 更是一群垃圾佬的狂欢(大雾)~~

\n \n ", 199 | "pubDate": "2021-09-30T05:52:22.000Z", 200 | "pubDateYYMMDD": "2021-09-30" 201 | }, 202 | { 203 | "name": "Cmj's Blog", 204 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 205 | "htmlUrl": "https://blog.caomingjun.com/", 206 | "title": "用python编写网页更新提醒程序", 207 | "link": "https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/", 208 | "summary": "用python编写网页更新提醒程序,在HTML、RSS、网盘分享链接更新时提醒", 209 | "pubDate": "2021-09-29T07:16:56.000Z", 210 | "pubDateYYMMDD": "2021-09-29" 211 | }, 212 | { 213 | "name": "Cmj's Blog", 214 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 215 | "htmlUrl": "https://blog.caomingjun.com/", 216 | "title": "urllib3 1.26与代理冲突问题解决", 217 | "link": "https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/", 218 | "summary": "python出现ValueError: check_hostname requires server_hostname,如何在不回退urllib3且保持代理打开的情况下解决问题?", 219 | "pubDate": "2021-09-28T03:19:59.000Z", 220 | "pubDateYYMMDD": "2021-09-28" 221 | }, 222 | { 223 | "name": "lyc8503's Blog", 224 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 225 | "htmlUrl": "https://blog.lyc8503.site/", 226 | "title": "电子手写笔记解决方案 - iPlay 30(附刷机过程)", 227 | "link": "https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/", 228 | "summary": "\n \n

开始读大学, 准备寻找一种电子手写笔记的解决方案~

\n

简单搜索了一下, 找到了以下几种方案.

\n\n \n ", 229 | "pubDate": "2021-09-27T02:58:31.000Z", 230 | "pubDateYYMMDD": "2021-09-27" 231 | }, 232 | { 233 | "name": "OrangeX4's Blog", 234 | "xmlUrl": "https://orangex4.cool/atom.xml", 235 | "htmlUrl": "https://orangex4.cool/", 236 | "title": "简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算", 237 | "link": "https://blog.orangex4.cool/post/latex-sympy-calculator/", 238 | "summary": "

\n 简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算

\n \n\n

\n 简介

\n \n

Latex Sympy Calculator 是一款 VSCode 插件, 它能够帮助你在 VSCode 写 Latex 或 Markdown 的时候, 一键计算 Latex 书写的数学公式.

\n

\n \"\"\n

\n

当前支持的功能:

\n
    \n
  1. 算术: 加 (+), 减 (-), 点乘 (·), 叉乘 (×), 除法 (/), 乘方 (^), 绝对值 (|x|), 开方 (√), 虚数 (i)…
  2. \n
  3. 字母表: 英文字母 a - z, A - Z, 希腊字母 α - ω, 下标 (x_1), 重音符 (ā)…
  4. \n
  5. 常见函数: 最大公约数 (gcd), 最小公倍数 (lcm), 下界 (floor), 上届 (ceil), 最大值 (max), 最小值 (min), 取对数 (log), 自然对数 (ln), 指数 (exp), 三角函数 (sin, cos, tan, csc, sec, cot, arcsin, sinh, arsinh)…
  6. \n
  7. 微积分: 求极限 (limnlim_{n\\to\\infty}limn), 求导/求微分 (ddx(x2+x)\\frac{d}{dx}(x^2+x)dxd(x2+x)), 求积分 (xdx\\int xdxxdx)…
  8. \n
  9. 线性代数: 矩阵 (Matrix), 行列式 (Determinant), 转置 (Transpose), 求逆 (Inverse), 初等变换 (Elementary Transformation)…
  10. \n
  11. 关系符: 大于 (>), 小于 (<), 大于等于 (≥), 小于等于 (≤), 相等 (=)…
  12. \n
  13. 其他: 二项式…
  14. \n
\n

当然, 实际上还有很多其他的功能, 只要是 Python Sympy 包支持的运算, 都可以通过这个插件来实现.

\n

通过这个插件, 你就不再需要一字一句地将 Latex 转译成其他语言, 然后用 Matlab 或 MMA 等数学软件进行科学计算了. 简单的 符号推导, 矩阵运算, 微积分, 科学计算, 完全可以利用这个插件来实现.

\n

如果你也在 VSCode 中用 LatexMarkdown 写数学公式, 那么这就是你 必备的 VSCode 科学计算插件.

\n

插件的 GitHub 页面.

\n

latex2sympy2 包的 Github 页面.

", 239 | "pubDate": "2021-09-17T16:00:00.000Z", 240 | "pubDateYYMMDD": "2021-09-17" 241 | }, 242 | { 243 | "name": "OrangeX4's Blog", 244 | "xmlUrl": "https://orangex4.cool/atom.xml", 245 | "htmlUrl": "https://orangex4.cool/", 246 | "title": "为自己搭建 RSS 订阅提醒服务", 247 | "link": "https://blog.orangex4.cool/post/inkrss-for-self/", 248 | "summary": "

\n 为自己搭建 RSS 订阅提醒服务

\n \n\n

\n 缘由

\n \n

自己一直苦于关注的信息源太杂, 每次想要查看新的信息, 都得打开一堆网站和 APP (如别人的博客, Github, 微博, 知乎, B站之类的). 为了改善自己的订阅体验, 在 @Mexii 的帮助下, 我开始研究如何给自己搭建一个体验良好的 RSS 订阅提醒服务.

\n

最终的解决方案如下:

\n\n

大致效果如下:

\n

\n \"\"\n

", 249 | "pubDate": "2021-09-17T16:00:00.000Z", 250 | "pubDateYYMMDD": "2021-09-17" 251 | }, 252 | { 253 | "name": "lyc8503's Blog", 254 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 255 | "htmlUrl": "https://blog.lyc8503.site/", 256 | "title": "尝试自己动手维修坏掉的 Orange Pi~ Part. 2", 257 | "link": "https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/", 258 | "summary": "\n \n

时隔一年又一个月, 由于最近硬件价格实在是比较魔幻, 更加舍不得把我角落里吃灰已久 Orange Pi PC 2 扔掉了. 毕竟同样使用全志 H5 Soc 的 Orange Pi Zero Plus 小板现在都超过它当时的价格了.

\n

正好最近心血来潮升级了 电烙铁, 可调电源, 万用表等一系列工具, 所以就来继续尝试看看维修. :P

\n

维修的上一段尝试在 这里.

\n \n ", 259 | "pubDate": "2021-09-17T07:36:51.000Z", 260 | "pubDateYYMMDD": "2021-09-17" 261 | }, 262 | { 263 | "name": "Cmj's Blog", 264 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 265 | "htmlUrl": "https://blog.caomingjun.com/", 266 | "title": "《提问的智慧》和《别像弱智一样提问》读后感", 267 | "link": "https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/", 268 | "summary": "计算机系统基础课的实验课要求阅读《提问的智慧》和《别像弱智一样提问》这两篇文章,并写一篇不少于800字的读后感。作为记录,我把读后感也发在博客里。", 269 | "pubDate": "2021-09-12T15:07:04.000Z", 270 | "pubDateYYMMDD": "2021-09-12" 271 | }, 272 | { 273 | "name": "lyc8503's Blog", 274 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 275 | "htmlUrl": "https://blog.lyc8503.site/", 276 | "title": "Hp 39gs 图形科学计算器硬件魔改 48gii 小记", 277 | "link": "https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/", 278 | "summary": "\n \n

高中期间学校要求竞赛使用的计算器是 卡西欧 991 CNX, 可是它功能太少, 很多数学计算都不能进行. 学校又不允许带手机.

\n

于是只能转向”古老”的科学计算器, 发现了一款性价比很高的科学计算器 – HP 39gs.

\n

HP 39gs 这款机器现在某宝涨价到近 80r 了, 我当时咸鱼入手的时候只要 50r, 之前好像还只要 20-30r,

\n

HP 39gs 本身功能也不是特别多, 可能比起卡西欧只多了绘图和编程的功能.

\n

但是 HP 39gs 和支持 CAS 的 HP 48gii 只差了按键印刷和 一块 Flash 而已. 魔改之后计算器大概就变成了一个简陋版 Matlab 了. 可玩性增强很多.

\n \n ", 279 | "pubDate": "2021-09-10T06:27:22.000Z", 280 | "pubDateYYMMDD": "2021-09-10" 281 | }, 282 | { 283 | "name": "Cmj's Blog", 284 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 285 | "htmlUrl": "https://blog.caomingjun.com/", 286 | "title": "zsh配置", 287 | "link": "https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/", 288 | "summary": "我的zsh配置", 289 | "pubDate": "2021-09-09T03:07:54.000Z", 290 | "pubDateYYMMDD": "2021-09-09" 291 | }, 292 | { 293 | "name": "Cmj's Blog", 294 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 295 | "htmlUrl": "https://blog.caomingjun.com/", 296 | "title": "个人博客建立过程记录", 297 | "link": "https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/", 298 | "summary": "基于Hexo+Github+Cloudflare Pages建立个人博客", 299 | "pubDate": "2021-09-09T01:37:34.000Z", 300 | "pubDateYYMMDD": "2021-09-09" 301 | }, 302 | { 303 | "name": "OrangeX4's Blog", 304 | "xmlUrl": "https://orangex4.cool/atom.xml", 305 | "htmlUrl": "https://orangex4.cool/", 306 | "title": "在提问之前", 307 | "link": "https://blog.orangex4.cool/post/before-asking-questions/", 308 | "summary": "

\n 在提问之前

\n \n

阅读《提问的智慧》有感.

\n

每一个人, 特别是学计算机的人, 都要学会通过 STFW 和 RTFM 独立解决问题. 这是由多方原因决定的.

", 309 | "pubDate": "2021-09-07T16:00:00.000Z", 310 | "pubDateYYMMDD": "2021-09-07" 311 | }, 312 | { 313 | "name": "OrangeX4's Blog", 314 | "xmlUrl": "https://orangex4.cool/atom.xml", 315 | "htmlUrl": "https://orangex4.cool/", 316 | "title": "在 Markdown 中书写伪代码", 317 | "link": "https://blog.orangex4.cool/post/markdown-pseudocode/", 318 | "summary": "

\n 在 Markdown 中书写伪代码

\n \n\n

\n 0. 想法来源

\n \n

最近上算法课需要书写伪代码, 但伪代码一般都是通过 Latex 书写的, 但我又不想专门为了它去写 Latex, 所以就开始考虑如何在 Markdown 中书写伪代码.

\n

根据 “Atwood’s Law” 原则:

\n
\n

Any application that can be written in JavaScript, will eventually be written in JavaScript.

\n

任何可以用 JavaScript 来写的应用, 最终都将用 JavaScript 来写.

\n
\n

我再次将目光投向前端, 寻找符合前端思想的解决方案.

\n

最终我选定了 VSCode + Markdown Preview Enhanced + pseudocode.js 的组合.

\n

(缺点是不能在 VSCode 中实时预览, 这个问题的主要原因是我不想再次魔改和维护别人写的插件了.)

\n

大概效果:

\n

\n \"\"\n

", 319 | "pubDate": "2021-09-02T16:00:00.000Z", 320 | "pubDateYYMMDD": "2021-09-02" 321 | }, 322 | { 323 | "name": "Antares's Blog", 324 | "xmlUrl": "https://chr.fan/feed", 325 | "htmlUrl": "https://chr.fan", 326 | "title": "Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序", 327 | "link": "https://chr.fan/lpk-decrypt/", 328 | "summary": "
\"\"
\n

声明:本人不会提供任何解密lpk文件的程序。本文仅仅是技术向的探讨、经验分享。 如果您认为本文侵犯了您的权益,请联系我,我会立刻删 ...

\n

The post Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序 appeared first on α-Lyrae.

\n", 329 | "pubDate": "2021-08-31T20:45:13.000Z", 330 | "pubDateYYMMDD": "2021-08-31" 331 | }, 332 | { 333 | "name": "lyc8503's Blog", 334 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 335 | "htmlUrl": "https://blog.lyc8503.site/", 336 | "title": "生成含有使用者备用名称 (SAN) 的 SSL 证书, 解决 Chrome 和 Okhttp HTTPS 报错", 337 | "link": "https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/", 338 | "summary": "\n \n

之前设置了 ipv6 DDNS, 可以从外网访问到家里 AIO 上的 http 服务器.

\n

由于只是自己使用, 就打算使用自签名证书. 但按照网上教程生成的证书导入 Chrome 后报错 ERR_CERT_COMMON_NAME_INVALID, 在 OkHttp 中报错Hostname xxx is not verified.

\n

查阅资料发现是生成的证书没有 SAN 的缘故, 网上生成 SAN 自签名证书的教程很多都有问题, 最终找到一种可行的方法, 记录在此.

\n \n ", 339 | "pubDate": "2021-08-29T06:58:09.000Z", 340 | "pubDateYYMMDD": "2021-08-29" 341 | }, 342 | { 343 | "name": "lyc8503's Blog", 344 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 345 | "htmlUrl": "https://blog.lyc8503.site/", 346 | "title": "AIO Ep9. 群晖 ipv6 阿里 DDNS 设置", 347 | "link": "https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/", 348 | "summary": "\n \n

初探 ipv6 & 群晖 ipv6 DDNS 的设置.

\n \n ", 349 | "pubDate": "2021-08-24T01:43:33.000Z", 350 | "pubDateYYMMDD": "2021-08-24" 351 | }, 352 | { 353 | "name": "lyc8503's Blog", 354 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 355 | "htmlUrl": "https://blog.lyc8503.site/", 356 | "title": "AIO Ep8. 记一次 ESXi 黑群晖失联排查", 357 | "link": "https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/", 358 | "summary": "\n \n

黑群晖不定时失联, 排查故障过程记录.

\n \n ", 359 | "pubDate": "2021-08-23T14:48:40.000Z", 360 | "pubDateYYMMDD": "2021-08-23" 361 | }, 362 | { 363 | "name": "lyc8503's Blog", 364 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 365 | "htmlUrl": "https://blog.lyc8503.site/", 366 | "title": "AIO Ep7. 硬件的一些更改", 367 | "link": "https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/", 368 | "summary": "\n \n

Hpe Gen10+ 有点令我失望… 后闲鱼出手改用自己组装的整机.

\n \n ", 369 | "pubDate": "2021-08-23T04:26:52.000Z", 370 | "pubDateYYMMDD": "2021-08-23" 371 | }, 372 | { 373 | "name": "lyc8503's Blog", 374 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 375 | "htmlUrl": "https://blog.lyc8503.site/", 376 | "title": "AIO Ep6. ESXi 黑群晖设置时的一些小技巧和踩的坑", 377 | "link": "https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/", 378 | "summary": "\n \n

如题. 主要是归类一些我参考的教程.

\n \n ", 379 | "pubDate": "2021-08-13T02:39:32.000Z", 380 | "pubDateYYMMDD": "2021-08-13" 381 | }, 382 | { 383 | "name": "lyc8503's Blog", 384 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 385 | "htmlUrl": "https://blog.lyc8503.site/", 386 | "title": "AIO Ep5. 我的服务器的软件结构", 387 | "link": "https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/", 388 | "summary": "\n \n

基础的 ESXi 已经装好了, 先来概括一下软件上的安排.

\n \n ", 389 | "pubDate": "2021-08-12T16:09:47.000Z", 390 | "pubDateYYMMDD": "2021-08-12" 391 | }, 392 | { 393 | "name": "lyc8503's Blog", 394 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 395 | "htmlUrl": "https://blog.lyc8503.site/", 396 | "title": "Hexo 部署到 OSS 国内访问加速", 397 | "link": "https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/", 398 | "summary": "\n \n

博客本来使用了 Netlify + 国内阿里 CDN 加速.

\n

但没想到… Netlify 的源站实在是太慢了. 慢到返回一个 304 都能等到 504 Gateway Time-out.

\n

既然都已经备案了, 还是要想办法让国内访问快一点.

\n

所以打算利用 Github Actions 将网站再部署到 OSS 上, 再用 CDN 加速.

\n

同时由于国内评论发表需要审核, 使用 Valine (Valine-Admin) 替换了 Gitalk, 支持手动审核.

\n \n ", 399 | "pubDate": "2021-08-12T15:56:44.000Z", 400 | "pubDateYYMMDD": "2021-08-12" 401 | } 402 | ] -------------------------------------------------------------------------------- /web/src/assets/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/src/assets/github.png -------------------------------------------------------------------------------- /web/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/src/assets/logo.png -------------------------------------------------------------------------------- /web/src/assets/opml.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "OrangeX4's Blog", 4 | "xmlUrl": "https://orangex4.cool/atom.xml", 5 | "htmlUrl": "https://orangex4.cool/" 6 | }, 7 | { 8 | "title": "Idealclover's Blog", 9 | "xmlUrl": "https://idealclover.top/feed", 10 | "htmlUrl": "https://idealclover.top/" 11 | }, 12 | { 13 | "title": "Typoverflow's Blog", 14 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/", 15 | "htmlUrl": "https://blog.typoverflow.me/" 16 | }, 17 | { 18 | "title": "Cmj's Blog", 19 | "xmlUrl": "https://blog.caomingjun.com/atom.xml", 20 | "htmlUrl": "https://blog.caomingjun.com/" 21 | }, 22 | { 23 | "title": "Mexii's Blog", 24 | "xmlUrl": "https://blog.mexii.one/atom.xml", 25 | "htmlUrl": "https://blog.mexii.one/" 26 | }, 27 | { 28 | "title": "LadderOperator's Blog", 29 | "xmlUrl": "https://ladderoperator.top/index.xml", 30 | "htmlUrl": "https://ladderoperator.top" 31 | }, 32 | { 33 | "title": "Antares's Blog", 34 | "xmlUrl": "https://chr.fan/feed", 35 | "htmlUrl": "https://chr.fan" 36 | }, 37 | { 38 | "title": "lyc8503's Blog", 39 | "xmlUrl": "https://blog.lyc8503.site/atom.xml", 40 | "htmlUrl": "https://blog.lyc8503.site/" 41 | } 42 | ] -------------------------------------------------------------------------------- /web/src/components/BlogInfoCard.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 33 | 34 | -------------------------------------------------------------------------------- /web/src/components/SummaryCard.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | 21 | 68 | -------------------------------------------------------------------------------- /web/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /web/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [vue()], 9 | resolve: { 10 | alias: { 11 | '@': fileURLToPath(new URL('./src', import.meta.url)) 12 | } 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /workers-site/.cargo-ok: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/workers-site/.cargo-ok -------------------------------------------------------------------------------- /workers-site/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | worker 3 | -------------------------------------------------------------------------------- /workers-site/index.js: -------------------------------------------------------------------------------- 1 | import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler' 2 | 3 | /** 4 | * The DEBUG flag will do two things that help during development: 5 | * 1. we will skip caching on the edge, which makes it easier to 6 | * debug. 7 | * 2. we will return an error message on exception in your Response rather 8 | * than the default 404.html page. 9 | */ 10 | const DEBUG = false 11 | 12 | addEventListener('fetch', event => { 13 | try { 14 | event.respondWith(handleEvent(event)) 15 | } catch (e) { 16 | if (DEBUG) { 17 | return event.respondWith( 18 | new Response(e.message || e.toString(), { 19 | status: 500, 20 | }), 21 | ) 22 | } 23 | event.respondWith(new Response('Internal Error', { status: 500 })) 24 | } 25 | }) 26 | 27 | async function handleEvent(event) { 28 | const url = new URL(event.request.url) 29 | let options = {} 30 | 31 | /** 32 | * You can add custom logic to how we fetch your assets 33 | * by configuring the function `mapRequestToAsset` 34 | */ 35 | // options.mapRequestToAsset = handlePrefix(/^\/docs/) 36 | 37 | try { 38 | if (DEBUG) { 39 | // customize caching 40 | options.cacheControl = { 41 | bypassCache: true, 42 | }; 43 | } 44 | const page = await getAssetFromKV(event, options); 45 | 46 | // allow headers to be altered 47 | const response = new Response(page.body, page); 48 | 49 | response.headers.set("X-XSS-Protection", "1; mode=block"); 50 | response.headers.set("X-Content-Type-Options", "nosniff"); 51 | response.headers.set("X-Frame-Options", "DENY"); 52 | response.headers.set("Referrer-Policy", "unsafe-url"); 53 | response.headers.set("Feature-Policy", "none"); 54 | 55 | return response; 56 | 57 | } catch (e) { 58 | // if an error is thrown try to serve the asset at 404.html 59 | if (!DEBUG) { 60 | try { 61 | let notFoundResponse = await getAssetFromKV(event, { 62 | mapRequestToAsset: req => new Request(`${new URL(req.url).origin}/404.html`, req), 63 | }) 64 | 65 | return new Response(notFoundResponse.body, { ...notFoundResponse, status: 404 }) 66 | } catch (e) {} 67 | } 68 | 69 | return new Response(e.message || e.toString(), { status: 500 }) 70 | } 71 | } 72 | 73 | /** 74 | * Here's one example of how to modify a request to 75 | * remove a specific prefix, in this case `/docs` from 76 | * the url. This can be useful if you are deploying to a 77 | * route on a zone, or if you only want your static content 78 | * to exist at a specific path. 79 | */ 80 | function handlePrefix(prefix) { 81 | return request => { 82 | // compute the default (e.g. / -> index.html) 83 | let defaultAssetKey = mapRequestToAsset(request) 84 | let url = new URL(defaultAssetKey.url) 85 | 86 | // strip the prefix from the path for lookup 87 | url.pathname = url.pathname.replace(prefix, '/') 88 | 89 | // inherit all other props from the default request 90 | return new Request(url.toString(), defaultAssetKey) 91 | } 92 | } -------------------------------------------------------------------------------- /workers-site/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worker", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@cloudflare/kv-asset-handler": { 8 | "version": "0.1.2", 9 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.2.tgz", 10 | "integrity": "sha512-otES1gV5mEhNh82p/sJERPMMrC7UOLV2JyfKf4e3EX1TmMkZ3N8IDGAqRNsoRU8UYTO7wc83I7pH1p4ozAdgMQ==", 11 | "requires": { 12 | "mime": "^2.5.2" 13 | } 14 | }, 15 | "mime": { 16 | "version": "2.5.2", 17 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 18 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /workers-site/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "worker", 4 | "version": "1.0.0", 5 | "description": "A template for kick starting a Cloudflare Workers project", 6 | "main": "index.js", 7 | "author": "Ashley Lewis ", 8 | "license": "MIT", 9 | "dependencies": { 10 | "@cloudflare/kv-asset-handler": "~0.1.2" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "blogroll" 2 | type = "webpack" 3 | account_id = "8b594a098b4be5946860cee0cf79f104" 4 | workers_dev = true 5 | # route = "blogroll.njulug.org/*" 6 | zone_id = "cd50d75141e3c6095863f20a0edfc0e7" 7 | compatibility_date = "2024-11-19" 8 | 9 | [site] 10 | bucket = "./web/dist" 11 | entry-point = "workers-site" 12 | --------------------------------------------------------------------------------