[{"content":"简介 总有朋友问怎么免费翻墙。\n虽说已经介绍了warp，wireguard。\n但是我也没找到合适的无感翻墙，即旁路有翻墙，全局无感翻墙。\nsing-box还是不会写配置文件。\n但是最近发现了cf的trojan，openclash又支持这个协议，还是回到老路吧。\ncloudflare跑个trojan，openwrt跑个openclash吧。\n一：openwrt 怎么刷就不说了。\n二：openclash Releases · vernesong/OpenClash (github.com)\n安装说明 请先安装好这些依赖: 1 2 3 #iptables opkg update opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base 1 2 3 #nftables opkg update opkg install coreutils-nohup bash dnsmasq-full curl ca-certificates ipset ip-full libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base 启动前请先在插件设置页面的版本更新标签下确认 内核编译版本，您也可以手动下载 Clash内核 后解压到 /etc/openclash/core/文件夹 检查版本 根据openclash的说明，要区分一下iptables nftables，这个说的其实是有点晦涩了，iptables 对应 firewall3 ，nftables 对应 firewall4.\n可以在软件包检查：\n搜索fiwewall，或tables，都可以 移除dnsmasq 手动删除一下这个配置文件/etc/config/dhcp\n执行安装命令 opkg update opkg install ipk install 这个包并不在openwrt库内，所以得手动安装。\n让我找个github加速器：\n1 2 3 # Release # 假设下载链接为 https://github.com/A/A/releases/download/1.0/1.0.tar.gz wget https://hub.fgit.cf/A/A/releases/download/1.0/1.0.tar.gz https://github.com/vernesong/OpenClash/releases/download/v0.46.011-beta/luci-app-openclash_0.46.011-beta_all.ipk\n不行，在线下载都失败，\nhttps://sciproxy.com/github.com/vernesong/OpenClash/releases/download/v0.46.011-beta/luci-app-openclash_0.46.011-beta_all.ipk\n手动下载一个吧，然后上传安装。\n内核 首次打开luci-app-openclash，将提示下载内核，下载吧。\n还有加速器，爽歪歪。随便选一个。\n加速器居然还测速，更爽了 。\n看看日志：\n暂时安装就到这里 。\nCloudFlare 老好人朋友，我都怕把它嫖出问题来。\n第一代serverless脚本\nzizifn/edgetunnel: Running V2ray inside edge/serverless runtime (github.com)\n第二代trojan脚本\nyonggekkk/Cloudflare_vless_trojan: Cloudflare代理脚本\n第二代自动订阅的脚本\ncmliu/edgetunnel: 在原版的基础上修改了显示 VLESS 配置信息转换为订阅内容。\n创建workers 就简单的workers吧，pages连接git，怕你们不会。\n随便换个名称，部署后再修改代码。\n编辑代码 贴上大佬的代码，记得换第七行UUID,随便找个在线生成一下。如果提示错误，就用v2rayN生成一个。\nmirror.ghproxy.com/https://raw.githubusercontent.com/cmliu/edgetunnel/main/_worker.js\n绑定域名 都被墙了，绑自己的域名吧。\n访问 使用自定义域名访问，如上图示例试 worker-steep.jackadam.top/uuid。就能看到你的地址了。\n使用 这个就简单了，clash，sing-box，都提供了订阅地址。\n在对应客户端订阅即可。\n如果想无感翻墙，放入路由器，我是没搞定sing-box，所以还是用了老方法 openclash，订阅clash订阅。\n","date":"2024-06-01T21:52:46+08:00","permalink":"https://example.com/p/cloudflare-open-clash/","title":"CloudFlare \u0026 open clash"},{"content":"简介： 最近总是用cloudflare的WARP。使用的是wireguard客户端，使用warp的节点。\n介绍一下使用要点吧。\n安装： 简单点，可以直接安装wireguard客户端，但是默认客户端是在线安装模式，又被墙了，那么就下载离线安装包把。\nWireGuard for Windows Downloads\n我也转一下吧，方便菜鸟。\nMsi install for amd64 Msi install for arm64\nMsi install for x86\n创建节点 WARP客户端现在可以不装了，直接replit在线生成节点挺好的。\n生成的还正是wireguard配置文件。\nmisaka-blog (MisakaNo の 小破站) - Replit 他家好几个脚本呢，都是在线的。\n下面是生成wireguard的脚本\nwarpgo-profile-generator - Replit\nwgcf-profile-generator - Replit\nfork \u0026amp; run 就能获取。记得选免费账户，1.\n这个域名估计墙了，得优选一下IP。\n优选IP yonggekkk/warp-yg: warp多功能一键脚本，查看VPS本地IP、netflix、chatgpt(网页与客户端)是否解锁等情况、endpoint对端优选IP等功能，VPS平台与Replit平台无限生成warp配置文件 (github.com)\n这里有勇哥的win端自选IP脚本，优选以后，替换配置文件的Endpoint。\n使用wireguard 导入隧道文件 *.conf\n刚才获取的信息，保存为 任意文件名.conf，导入进去，连接即可。\n或者手机也装wireguard，直接扫描二维码，链接即可。\n分流 lmc999/auto-add-routes: China Route for VPN (github.com)\n这里有大佬做了分流脚本，可以配合wireguard来使用。 不做分流，你连路由器都无法访问，更别说内网的服务了。 必须分流。\n","date":"2024-02-28T10:16:19+08:00","permalink":"https://example.com/p/wireguard%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/","title":"wireguard使用方法"},{"content":"主流翻墙方法： 基础知识： 节点： 翻墙出去，简单的道理就是，不允许你去访问google，但是允许你访问cloudflare，而cloudflare和google之间是不受限制的，那么你就可以通过cloudflare去访问google，cloudflare就是节点，代替你去访问受限资源的服务器。\n机场： 确实不是每个人都能看懂建立节点的教程，即使有免费的cloudflare，大部分人也不会建立节点，代建节点，保证服务，出售流量的网站，就叫机场。他租用服务器，建好节点，供用户使用。\n订阅： 由于GWF经常升级，屏蔽各个服务器，加上节点大量使用流量，造成节点的稳定性一直不是特别高，自建的会好一些，还有封IP，换IP等操作，小白用户使用机场时，如何快速便捷的获取节点更新信息，就产生了订阅，一个订阅地址，可以直接获取最新的节点信息，这就是订阅。\nCF： cloudflare的简称，大好人呀，最近各种东西，都是他家的免费服务。我薅的不厉害，就是用WARP，或者WireGuard使用WARP节点。\nVLESS 一种代理协议，是你和节点之间通信的协议。已经有大神将vless改写到cloudflare的Wroker,pages里面了。\n一：单机使用 主流的单机使用有很多软件可以使用，我在用的比较多的就是WARP，WireGuard。当然也有CF VLESS我没怎么用。\nWARP最简单了，直接访问1.1.1.1 — The free app that makes your Internet faster.，下载客户端，自动注册生成，就可以用了。当然可能连不上，就需要一个优选IP。\nyonggekkk/warp-yg: warp多功能一键脚本，查看VPS本地IP、netflix、chatgpt(网页与客户端)是否解锁等情况、endpoint对端优选IP等功能，VPS平台与Replit平台无限生成warp配置文件 (github.com)\n当然了，使用WARP节点，是全局代理，非常不方便，即使本地局域网，都要代理出去，所以有了这个：\nlmc999/auto-add-routes: China Route for VPN (github.com)\n强制路由表，指定的一些IP地址，域名会被指定为默认路由，其他的才走代理节点。\n还有clash，v2rayN，Wireguard，sing-box(暂时没有官方windows客户端。)\n二：服务器使用 甬哥侃侃侃ygkkk / CFwarp · GitLab\n这是安装脚本，比手动安装方便多了。\n二：旁路由 一般就是openwrt+***各种软件，我比较喜欢clash系列，openclash用着也不错。\n常见的有passwall，ss，ssr，openclash，shellclash……\n三：透明网关 透明网关就是主路由直接安装各种软件。\n四：研究方向 目前看自从clash删库一次以后，sing-box貌似越来越火了，那么能否使用sing-box做透明网关呢？\nsing-box，windows的第三方客户端哪个好用呢？\n","date":"2024-02-25T21:34:46+08:00","permalink":"https://example.com/p/gwf%E4%B8%BB%E6%B5%81%E7%A0%B4%E8%A7%A3%E6%96%B9%E6%B3%95/","title":"GWF主流破解方法"},{"content":"Cloudflare Todo VUE D1 简介： 最近一直在尝试用vue框架做个小程序，后来发现到处实名备案……\n无奈，整H5吧，还是老伙计cloudflare，先做todo。\n创建vue项目 安装node.js\n安装vscode\n打开vscode的终端，进入一个方便的目录，运行下面的命令创建vue项目，随便选即可。\nnpm create vue@latest\n随便选吧，根据提示的绿色代码，逐行执行，即可启动一个默认的vue项目。\n项目名称就是你的项目主目录。以后说的命令都将在你的项目主目录执行。\n访问5173即可。也可以按着ctrl点击这里的地址。\n看来你搞定了。\n安装wrangler Install/Update Wrangler · Cloudflare Workers docs\nnpm install wrangler --save-dev\n这个是cloudfalre的官方工具，除了它，别的不好用啊。\n测试通过wrangler启动vue测试模式。\n编辑package.json,如果你用的是vscode，会看到一个调试按钮，很方便的，刚才vue提示你的最后一条命令是啥？？npm run dev。dev就在这里，我们其实是去执行了dev后面的命令。可以在这里直接点击调试，然后选择dev。\n在最后一行添加\n\u0026quot;wrangler-dev\u0026quot;: \u0026quot;wrangler pages dev -- vite --host\u0026quot;\n记得json格式，上面一行还要添加一个引文半角逗号\u0026quot;,\u0026quot;\n用调试按钮启动它试试看，多了一个8788端口的地址。\n访问8788，一切如只使用vue一样。证明你的项目可以跑在cloudflare pages上了。\n创建数据库 顺便介绍drizzle。\n安装 1 2 npm i drizzle-orm npm i -D drizzle-kit 数据表设置 创建文件：src/schema/todos.ts\n1 2 3 4 5 6 7 8 import { sql } from \u0026#34;drizzle-orm\u0026#34;; import { text, integer, sqliteTable } from \u0026#34;drizzle-orm/sqlite-core\u0026#34;; const todos = sqliteTable(\u0026#39;todos\u0026#39;, { id: integer(\u0026#39;id\u0026#39;, { mode: \u0026#39;number\u0026#39; }).primaryKey({ autoIncrement: true }), textModifiers: text(\u0026#39;text_modifiers\u0026#39;).notNull().default(sql`CURRENT_TIMESTAMP`), intModifiers: integer(\u0026#39;int_modifiers\u0026#39;, { mode: \u0026#39;boolean\u0026#39; }).notNull().default(false), }); drizzle设置 创建配置文件drizzle.config.ts\n1 2 3 4 5 6 7 8 9 10 import type { Config } from \u0026#34;drizzle-kit\u0026#34;; export default { schema: \u0026#34;./src/schema/*\u0026#34;, out: \u0026#34;./drizzle\u0026#34;, driver: \u0026#34;d1\u0026#34;, dbCredentials: { wranglerConfigPath: \u0026#34;wrangler.toml\u0026#34;, dbName: \u0026#34;taro-d1\u0026#34;, }, } satisfies Config; 生成命令 \u0026quot;db:generate\u0026quot;:\u0026quot;drizzle-kit generate:sqlite\u0026quot;,\n将生成命令配置进package.json\n生成1tables，一个sql指令文件\n创建数据库 \u0026lt;d1todo\u0026gt; 执行命令 wrangler d1 create \u0026lt;DATABASE_NAME\u0026gt; 配置 创建配置文件wrangler.config.ts 内容是上一步的结果，就红色部分粘贴过来即可。 增加一行： migrations_dir = \u0026quot;drizzle\u0026quot; 这行配置是使用我们drizzle来自动生成迁移文件。wrangler没有监听声明和自动生成功能。 推送数据库 命令 wrangler d1 migrations apply \u0026lt;DATABASE_NAME\u0026gt; [OPTIONS] 将推送命令配置进package.json options可以选填 \u0026ndash;local，本地模式 1 2 3 4 \u0026#34;DB:generate\u0026#34;:\u0026#34;drizzle-kit generate:sqlite\u0026#34;, \u0026#34;DB:apply-local\u0026#34;:\u0026#34;wrangler d1 migrations apply d1todo --local\u0026#34;, \u0026#34;DB:apply-remote\u0026#34;:\u0026#34;wrangler d1 migrations apply d1todo\u0026#34;, \u0026#34;wrangler-dev\u0026#34;: \u0026#34;wrangler pages dev -- vite --host\u0026#34; 表结构而已，我两个都推了。\n测试 一个简单的命令 SELECT name FROM sqlite_master WHERE type='table' order by name d1执行命令 wrangler d1 execute \u0026lt;DATABASE_NAME\u0026gt; [OPTIONS] 完整命令：wrangler d1 execute d1todo --command=\u0026quot;SELECT name FROM sqlite_master WHERE type='table' order by name\u0026quot; 本地数据库命令：wrangler d1 execute d1todo --command=\u0026quot;SELECT name FROM sqlite_master WHERE type='table' order by name\u0026quot; --local 相信你也看出来\u0026ndash;local了， FUNCTIONS 这个是pages的一个功能，有着特殊的路由解析规则，似乎应该优先于我们编写的代码。\nFunctions · Cloudflare Pages docs\n创建文件functions/api/helloworld.ts\n1 2 3 export function onRequest(context) { return new Response(\u0026#34;Hello, world!\u0026#34;) } 测试一下，运行 wrangler-dev\n访问：127.0.0.1:8788/api/helloworld\n仅仅返回 Hello, world!\n好吧，我们继续测试\n创建functions\\api\\gettables.ts文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 import { D1Database } from \u0026#39;@cloudflare/workers-types/experimental\u0026#39;; /** * Environment variables type definition. */ export interface Env { DB: D1Database; } export const onRequestGet: PagesFunction\u0026lt;Env\u0026gt; = async (context) =\u0026gt; { return new Response(JSON.stringify(await getAll(context.env))); }; const getAll = (env: Env) =\u0026gt; env.DB.prepare(`select name FROM sqlite_master WHERE type=\u0026#39;table\u0026#39; order by name`).all(); 有了新导入，需要安装一下：npm install @cloudflare/workers-types\n访问：127.0.0.1:8788/api/gettables\n可以看到和我们直接命令执行的一样了。\n这将是我们连接D1数据库的第一步。\n有了这样的接口，怎么写vue就不在本文讨论了。\nFUNCTIONS(drizzleORM) 为了使用ORM，还得用functions。\n创建文件 functions\\api\\drizzle.ts\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 //导入模型定义 import { todos } from \u0026#39;../../src/schema/todos\u0026#39;; //导入ORM import { drizzle } from \u0026#39;drizzle-orm/d1\u0026#39;; import { eq } from \u0026#39;drizzle-orm\u0026#39;; //配置DB数据类型，TS需要 export interface Env { DB: D1Database; } //使用orm进行查询 //select全部 // export const onRequestGet: PagesFunction\u0026lt;Env\u0026gt; = async (context) =\u0026gt; { // const db = drizzle(context.env.DB); // const result = await db.select().from(todos).all(); // return Response.json(result); // }; //select 部分字段，并使用自定义字段名 // export const onRequestGet: PagesFunction\u0026lt;Env\u0026gt; = async (context) =\u0026gt; { // const db = drizzle(context.env.DB); // const result = await db.select({ // id: todos.id, // textModifiers: todos.textModifiers, // }).from(todos) // return Response.json(result); // }; //query查询 //columns是列参数，默认是true，只需要设置false即可。 //where是查询条件，eq就是等于的意思。更多运算符：https://orm.drizzle.team/docs/operators export const onRequestGet: PagesFunction\u0026lt;Env\u0026gt; = async (context) =\u0026gt; { const db = drizzle(context.env.DB, { schema: { todos } }); const result = await db.query.todos.findMany({ columns: { id: false, textModifiers: true, intModifiers: true, }, where: eq(todos.intModifiers, true) }); return Response.json(result); }; 简单写了两个，需要的时候查手册https://orm.drizzle.team/docs/operators\n部署 推送到github，在cloudflare部署一个pages，\n绑定数据库\n在这个pages中 设置\u0026ndash;函数\u0026ndash;D1 数据库绑定 添加数据库绑定\n告警 打开gettables.ts时，还是有红色报警的，所以问题可能出在这个告警上。\n抄来的一个配置文件，可以解决这个问题。\n创建functions/tsconfig.json\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { \u0026#34;compilerOptions\u0026#34;: { \u0026#34;baseUrl\u0026#34;: \u0026#34;..\u0026#34;, \u0026#34;module\u0026#34;: \u0026#34;esnext\u0026#34;, \u0026#34;target\u0026#34;: \u0026#34;esnext\u0026#34;, \u0026#34;lib\u0026#34;: [\u0026#34;esnext\u0026#34;], \u0026#34;alwaysStrict\u0026#34;: true, \u0026#34;strict\u0026#34;: true, \u0026#34;preserveConstEnums\u0026#34;: true, \u0026#34;moduleResolution\u0026#34;: \u0026#34;node\u0026#34;, \u0026#34;sourceMap\u0026#34;: true, \u0026#34;esModuleInterop\u0026#34;: true, \u0026#34;types\u0026#34;: [\u0026#34;@cloudflare/workers-types\u0026#34;], \u0026#34;paths\u0026#34;: { \u0026#34;@/*\u0026#34;: [\u0026#34;src/*\u0026#34;], \u0026#34;*\u0026#34;: [ \u0026#34;node_modules/*\u0026#34;, \u0026#34;*\u0026#34; ], } } } 这样就没有那个告警了。TS也不是很熟悉，就先这样吧。\n感谢https://github.com/jim60105/simple-poll-system.git\n基本是这里学了点皮毛。\n","date":"2024-02-21T13:48:58+08:00","permalink":"https://example.com/p/cloudflare-todo-vue-d1/","title":"Cloudflare Todo VUE D1"},{"content":"简介： 习惯了orm，还是准备为vue项目使用orm，为了支持cloudflareD1，找到了drizzle-orm。\n安装： Drizzle ORM - SQLite\n1 2 npm i drizzle-orm npm i -D drizzle-kit Install/Update Wrangler · Cloudflare Workers docs\n1 npm install wrangler --save-dev 创建数据库： Get started · Cloudflare D1 docs\n登录cloudflare 1 npx wrangler login 创建数据库：\n数据库名 taro-d1\n1 npx wrangler d1 create taro-d1 将红框内的复制出来，写入wrangler.toml配置文件\n创建ORM数据关系映射 Drizzle-kit - 快速入门\n配置文件： Drizzle ORM - Configuration\n根目录创建drizzle.config.ts\n配置schema：模型定义\n配置out：迁移文件目录\n1 2 3 4 5 import type { Config } from \u0026#34;drizzle-kit\u0026#34;; export default { schema: \u0026#34;./src/schema/*\u0026#34;, out: \u0026#34;./drizzle\u0026#34;, } satisfies Config; Drizzle ORM - 配置参考\n还有一些其他的参数需要配置\n先配置一个DB凭证，注意绿色，配置文件为wrangler.toml，读取数据库名d1-test，我用的是taro-d1，最终配置文件会改的。\n再配置一个驱动\n最终配置：\n1 2 3 4 5 6 7 8 9 10 import type { Config } from \u0026#34;drizzle-kit\u0026#34;; export default { schema: \u0026#34;./src/schema/*\u0026#34;, out: \u0026#34;./drizzle\u0026#34;, driver: \u0026#34;d1\u0026#34;, dbCredentials: { wranglerConfigPath: \u0026#34;wrangler.toml\u0026#34;, dbName: \u0026#34;taro-d1\u0026#34;, }, } satisfies Config; 创建数据库结构 刚才我们的配置文件是按例子3写的，所以继续创建users.ts\nDrizzle ORM - SQLite数据类型\n1 2 3 4 5 6 7 8 9 10 11 12 //src/schema/users.ts import { text, integer, sqliteTable } from \u0026#34;drizzle-orm/sqlite-core\u0026#34;; export const user = sqliteTable(\u0026#34;user\u0026#34;, { id: integer(\u0026#34;id\u0026#34;, { mode: \u0026#34;number\u0026#34; }).primaryKey({ autoIncrement: true }), name: text(\u0026#34;name\u0026#34;), email: text(\u0026#34;email\u0026#34;), password: text(\u0026#34;password\u0026#34;), role: text(\u0026#34;role\u0026#34;).$type\u0026lt;\u0026#34;admin\u0026#34; | \u0026#34;customer\u0026#34;\u0026gt;(), createdAt: integer(\u0026#34;id\u0026#34;, { mode: \u0026#34;timestamp_ms\u0026#34; }), updatedAt: integer(\u0026#34;id\u0026#34;, { mode: \u0026#34;timestamp_ms\u0026#34; }), }); 迁移（数据库版本升级） Drizzle ORM - List of commands\nMigrations · Cloudflare D1 docs\n其实Drizzle暂时还不支持D1的推送，但是wrangler也不支持跟踪创建迁移文件。结合用吧。\n配置package.json，添加\u0026quot;scripts\u0026quot;脚本如下，红线标记的taro-d1，是创建数据库时的数据库名。\ngenerate，创建迁移文件是由drizzle-kit来完成的，刚才创建的drizzle.config.tz，已经配置了监听的数据库结构，输出路径，数据库驱动类型。\ndrop，也是由drizzle-kit来完成，用来删除迁移文件，虽然可能用不上，但是我们有本地调试，未git上传部署时还是可以用一用的。\npush，是由wrangler来完成，为了方便本地调试，我创建了本地和远程两条命令，区别只是\u0026ndash;local。\n继续配置：\n修改wrangler.tom 增加的两行是\nmigrations_table，迁移记录的表名，要有跟踪记录才能知道哪条迁移文件没有被执行。\nmigrations_dir，迁移记录的目录，所有的迁移文件都在这个文件夹，我们是用drizzle-kit来生成的迁移文件，就指定为一致的drizzle了。\n执行一下试试吧。\n","date":"2024-02-03T08:13:24+08:00","permalink":"https://example.com/p/taro_vue_note__02_%E6%95%B0%E6%8D%AE%E5%BA%93orm/","title":"Taro_vue_note__02_数据库orm"},{"content":"简介： 本来想着用低代码平台，钉钉宜搭、微信云微搭，结果发现微信云微搭只有4小时访问时间，钉钉宜搭又不符合马化腾培养的中国网民（全民微信QQ）。\n又想贴近国人的使用习惯，还是微信小程序吧。再看微信小程序，要服务器，省点心用宜搭又没办法调用硬件拍照。最终只剩下一条路：小程序+服务器。\n主流的几个小程序框架、几个主流的nodejs框架，最终选择了taro+vue的组合。铁公鸡还得找服务器，好人cloudflare提供了pages、D1、R2一堆各种各样的免费服务，量大管饱，非营运的量基本都给你免费了。\n安装： 安装及使用 | Taro 文档 (jd.com)\n1 2 3 4 npm install -g @tarojs/cli taro init myApp #创建myApp目录，根据提示完成即可 cd myApp npm install 安装就这么多，后面根据进度添加依赖包。\n测试： 观察package.json\n暂时关注cloudflare的部署，调试H5即可。\n运行以后看到\u0026quot;Hello world\u0026quot;就算成功了。\n部署: cloudflare pages有两种部署方式：git 或wrangler，我们优先使用git，版本管理可回退。\n创建项目并上传即可。vscode非常方便，提交，发布即可。\ncloudflare创建应用程序，选择pages，连接到Git，选你刚创建的项目。\n构建命令npm run build:h5,输出目录dist即可。\n构建完成后访问，也可以看到hello world。\n","date":"2024-02-03T07:13:24+08:00","permalink":"https://example.com/p/taro_vue_note_01_%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/","title":"Taro_vue_note_01_环境部署"},{"content":"简介： D1数据库是cloudflare提供的一个无服务器模式的数据库，基于sqlite，也够用，绑个信用卡，自己的app就能用了，够你自己折腾的，要啥自行车啊？\nCloudflare D1 · Cloudflare D1 docs\n习惯了python的orm，在vue也想用orm，找到一个毛毛雨。\nDrizzle ORM - next gen TypeScript ORM.\nts？上一篇是js，重建一个项目吧，选一下ts支持。\n安装包 Drizzle其实是3个工具包：ORM , Kit , Studio\n分别是ORM模型映射工具，Kit 数据库版本管理工具 ，Studio 可视化数据库管理工具。\n对比python，那就是 sqlalchemy模型映射工具 alembia数据库版本管理\nPHP : phpdbadmin 不管哪里跑的可视化管理工具\n不管了，全安装再说。\n毛毛雨ORM - SQLite (drizzle.team)\n我们试用的D1，说是sqlite，就这个吧。在项目文件夹运行。\n1 2 npm i drizzle-orm @libsql/client npm i -D drizzle-kit 还有cf的cli包。\n1 npm install wrangler --save-dev 检查package.json,安装正常。\n创建D1数据库 1 wrangler d1 create \u0026lt;DATABASE_NAME\u0026gt; 执行sql创建表结构 ","date":"2024-01-01T02:00:00+08:00","permalink":"https://example.com/p/vue_d1_cloudflare_pages/","title":"Vue_D1_Cloudflare_pages"},{"content":"简介： cloudflare真是大好人啊。免费的workers，pages，D1数据库，R2存储。\n不搞点什么真对不起垃圾佬的称号。\n安装node Node.js (nodejs.org) 下载安装\n检查各版本，就是装好了。\n初始化vue项目 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 npm create vue@latest Vue.js - The Progressive JavaScript Framework √ 请输入项目名称： ... vue_on_cloudflare_workers √ 是否使用 TypeScript 语法？ ... 否 / 是 √ 是否启用 JSX 支持？ ... 否 / 是 √ 是否引入 Vue Router 进行单页面应用开发？ ... 否 / 是 √ 是否引入 Pinia 用于状态管理？ ... 否 / 是 √ 是否引入 Vitest 用于单元测试？ ... 否 / 是 √ 是否要引入一款端到端（End to End）测试工具？ » 不需要 √ 是否引入 ESLint 用于代码质量检测？ ... 否 / 是 正在构建项目 D:\\VueTest\\vue_on_cloudflare_workers... 项目构建完成，可执行以下命令： cd vue_on_cloudflare_workers npm install npm run dev 试运行 刚才组后三行命令，逐个输入即可。\n访问“http://localhost:5173”即可访问\n上传github 我的vscode已经登录github，可以直接提交发布，写个名字就好了。\n不会的话，就手动上传吧。\n创建pages 登录cloudflare，创建pages,连接git，选择刚才的项目，模板选vue。\n点击访问站点即可尝试访问了。\n当然有墙，需要自定义域名才能自由访问。\n自定义域名 点击你的pages名字，自定义域设置一下吧。\n","date":"2024-01-01T01:00:00+08:00","permalink":"https://example.com/p/vue_on_cloudflare_pages/","title":"Vue_On_Cloudflare_pages"},{"content":"简介： vue是一个中国流行的js框架，看了不少教程都是vue+js，而且版本还老一些，导致我创建的vue+ts根本没办法运行，一直报错，干脆摸索着自己也写一下吧。毕竟vuejs.org，也写的vue+js或许是没更新吧。\n\u0026lt;script setup\u0026gt; 老的写法：\n如果不启用TS，可以去掉 lang=\u0026ldquo;ts\u0026rdquo;\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 \u0026lt;script lang=\u0026#34;ts\u0026#34;\u0026gt; export default{ data() { return { msg: \u0026#39;Hello Vue!\u0026#39; } } } \u0026lt;/script\u0026gt; \u0026lt;template\u0026gt; \u0026lt;img alt=\u0026#34;Vue logo\u0026#34; class=\u0026#34;logo\u0026#34; src=\u0026#34;./assets/logo.svg\u0026#34; width=\u0026#34;125\u0026#34; height=\u0026#34;125\u0026#34; /\u0026gt; \u0026lt;div\u0026gt; {{ msg }} \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;style scoped\u0026gt;\u0026lt;/style\u0026gt; 新写法：\nscript添加了一个 setup\n1 2 3 4 5 6 7 8 9 10 11 12 13 \u0026lt;script setup lang=\u0026#34;ts\u0026#34;\u0026gt; const msg = \u0026#34;hello world.\u0026#34; \u0026lt;/script\u0026gt; \u0026lt;template\u0026gt; \u0026lt;img alt=\u0026#34;Vue logo\u0026#34; class=\u0026#34;logo\u0026#34; src=\u0026#34;./assets/logo.svg\u0026#34; width=\u0026#34;125\u0026#34; height=\u0026#34;125\u0026#34; /\u0026gt; \u0026lt;div\u0026gt; {{ msg }} \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;style scoped\u0026gt;\u0026lt;/style\u0026gt; 据说是这样的演变\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 \u0026lt;script lang=\u0026#34;ts\u0026#34;\u0026gt; export default { setup() { const msg = \u0026#34;hello\u0026#34; return { msg } } } \u0026lt;/script\u0026gt; \u0026lt;template\u0026gt; \u0026lt;img alt=\u0026#34;Vue logo\u0026#34; class=\u0026#34;logo\u0026#34; src=\u0026#34;./assets/logo.svg\u0026#34; width=\u0026#34;125\u0026#34; height=\u0026#34;125\u0026#34; /\u0026gt; \u0026lt;div\u0026gt; {{ msg }} \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;style scoped\u0026gt;\u0026lt;/style\u0026gt; ","date":"2024-01-01T00:00:00+08:00","permalink":"https://example.com/p/vue_01/","title":"Vue_01"},{"content":"简介： 总是优选优选，烦了，能否自动优选IP呢？\n当然可以。\n项目： 目前找到两个项目用于优选IP\nXIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度，获取最快 IP ！当然也支持其他 CDN / 网站 IP ~ (github.com)\nbadafans/better-cloudflare-ip: 查找适合自己当前网络环境的优选cloudflare anycast IP (github.com)\nXIU2的项目是编译过的，badafans的项目是sh的，根据自己喜好来选择吧。\nXIU2的项目目前测速是0，需要修改脚本，\n1 2 -url https://cf.xiu2.xyz/url 指定测速地址；延迟测速(HTTPing)/下载测速时使用的地址，默认地址不保证可用性，建议自建； XIU2的项目有个优选ip写host的脚本\n我就做缝合怪吧。\nbadafans的项目测试结果好看啊，20Mbps，XIU2的项目测速结果只有3-4，也不研究了。\n改badafans的项目 其实只有一个cf.sh是需要修改的。\n注释掉启动输入，后面有默认值的。\n1 2 # read -p \u0026#34;请设置期望的带宽大小(默认最小1,单位 Mbps):\u0026#34; bandwidth # read -p \u0026#34;请设置RTT测试进程数(默认10,最大50):\u0026#34; tasknum 设置菜单选项，注释一行，定义一行。\n1 2 # read -p \u0026#34;请选择菜单(默认0): \u0026#34; menu menu=2 将结果写入文件newip.txt\n1 2 3 echo \u0026#34;优选IP $anycast\u0026#34; echo \u0026#34;$anycast yuming.yuming.yuming\u0026#34; \u0026gt; newip.txt echo \u0026#34;公网IP $publicip\u0026#34; 增加两个function\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 function check(){ # 检查当前IP文件是否存在，不存在就创建一个 while true do if [[ ! -e \u0026#34;nowip.txt\u0026#34; ]]; then echo -e \u0026#34;该脚本的作用为 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。\u0026#34; echo -e \u0026#34;第一次使用，请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。\u0026#34; read -e -p \u0026#34;输入该 Cloudflare CDN IP 并回车（后续不再需要该步骤）：\u0026#34; NOWIP if [[ ! -z \u0026#34;${NOWIP}\u0026#34; ]]; then echo ${NOWIP} \u0026gt; nowip.txt break else echo \u0026#34;该 IP 不能是空！\u0026#34; fi else break fi done } function changeip(){ # 根据当前IP，新找到的ip，更新本地host文件 NOWIP=$(head -1 nowip.txt) NEWIP=$(head -1 newip.txt) echo ${NEWIP} \u0026gt; nowip.txt echo -e \u0026#34;\\n旧 IP 为 ${NOWIP}\\n新 IP 为 ${NEWIP}\\n\u0026#34; echo \u0026#34;开始备份 Hosts 文件（hosts_backup）...\u0026#34; \\cp -f ${hostfile} /etc/hosts_backup echo -e \u0026#34;开始替换...\u0026#34; sed -i \u0026#39;s/\u0026#39;${NOWIP}\u0026#39;/\u0026#39;${NEWIP}\u0026#39;/g\u0026#39; ${hostfile} echo -e \u0026#34;完成...\u0026#34; } 修改bettercloudflareip函数\n头部，检查当前IP文件，配置host文件，停止clash\n1 2 3 4 5 function bettercloudflareip(){ check hostfile=/etc/vless.hosts # 停止openclash服务，避免影响测速结果 /etc/init.d/openclash stop 尾部更新IP,重启clash\n1 2 3 4 5 6 7 8 9 10 11 12 echo \u0026#34;设置带宽 $bandwidth Mbps\u0026#34; echo \u0026#34;实测带宽 $realbandwidth Mbps\u0026#34; echo \u0026#34;峰值速度 $max kB/s\u0026#34; echo \u0026#34;往返延迟 $avgms 毫秒\u0026#34; echo \u0026#34;数据中心 $colo\u0026#34; echo \u0026#34;总计用时 $[$endtime-$starttime] 秒\u0026#34; changeip # 重新启动一下dnsmasq，免得DNS缓存生效慢。 /etc/init.d/dnsmasq restart # 重新启动openclash服务 /etc/init.d/openclash start } 配置自动执行 crontab -e\n1 * */10 * * * cd root; cf.sh 完整代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 #!/bin/bash # better-cloudflare-ip function bettercloudflareip(){ hostfile=/etc/vless.hosts # 停止openclash服务，避免影响测速结果 /etc/init.d/openclash stop # read -p \u0026#34;请设置期望的带宽大小(默认最小1,单位 Mbps):\u0026#34; bandwidth # read -p \u0026#34;请设置RTT测试进程数(默认10,最大50):\u0026#34; tasknum if [ -z \u0026#34;$bandwidth\u0026#34; ] then bandwidth=1 fi if [ $bandwidth -eq 0 ] then bandwidth=1 fi if [ -z \u0026#34;$tasknum\u0026#34; ] then tasknum=10 fi if [ $tasknum -eq 0 ] then echo \u0026#34;进程数不能为0,自动设置为默认值\u0026#34; tasknum=10 fi if [ $tasknum -gt 50 ] then echo \u0026#34;超过最大进程限制,自动设置为最大值\u0026#34; tasknum=50 fi speed=$[$bandwidth*128*1024] starttime=$(date +%s) cloudflaretest realbandwidth=$[$max/128] endtime=$(date +%s) echo \u0026#34;从服务器获取详细信息\u0026#34; unset temp if [ \u0026#34;$ips\u0026#34; == \u0026#34;ipv4\u0026#34; ] then if [ $tls == 1 ] then temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) else temp=($(curl -x $anycast:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) fi else if [ $tls == 1 ] then temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) else temp=($(curl -x [$anycast]:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) fi fi if [ $(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | grep colo= | wc -l) == 0 ] then publicip=获取超时 colo=获取超时 else publicip=$(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | grep ip= | cut -f 2- -d\u0026#39;=\u0026#39;) colo=$(grep -w \u0026#34;($(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | grep colo= | cut -f 2- -d\u0026#39;=\u0026#39;))\u0026#34; colo.txt | awk -F\u0026#34;-\u0026#34; \u0026#39;{print $1}\u0026#39;) fi clear echo \u0026#34;优选IP $anycast\u0026#34; echo \u0026#34;$anycast\u0026#34; \u0026gt; newip.txt echo \u0026#34;公网IP $publicip\u0026#34; if [ $tls == 1 ] then echo \u0026#34;支持端口 443 2053 2083 2087 2096 8443\u0026#34; else echo \u0026#34;支持端口 80 8080 8880 2052 2082 2086 2095\u0026#34; fi echo \u0026#34;设置带宽 $bandwidth Mbps\u0026#34; echo \u0026#34;实测带宽 $realbandwidth Mbps\u0026#34; echo \u0026#34;峰值速度 $max kB/s\u0026#34; echo \u0026#34;往返延迟 $avgms 毫秒\u0026#34; echo \u0026#34;数据中心 $colo\u0026#34; echo \u0026#34;总计用时 $[$endtime-$starttime] 秒\u0026#34; check changeip # 重新启动一下dnsmasq，免得DNS缓存生效慢。 /etc/init.d/dnsmasq restart # 重新启动openclash服务 /etc/init.d/openclash start } function rtthttps(){ avgms=0 n=1 for ip in `cat rtt/$1.txt` do while true do if [ $n -le 3 ] then rsp=$(curl --resolve $domain:443:$ip https://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) if [ $(echo $rsp | awk -F_ \u0026#39;{print $2}\u0026#39;) != 200 ] then avgms=0 n=1 break else avgms=$[$(echo $rsp | awk -F_ \u0026#39;{printf (\u0026#34;%d\\n\u0026#34;,$1*1000000)}\u0026#39;)+$avgms] n=$[$n+1] fi else avgms=$[$avgms/3000] if [ $avgms -lt 10 ] then echo 00$avgms $ip \u0026gt;\u0026gt; rtt/$1.log elif [ $avgms -ge 10 ] \u0026amp;\u0026amp; [ $avgms -lt 100 ] then echo 0$avgms $ip \u0026gt;\u0026gt; rtt/$1.log else echo $avgms $ip \u0026gt;\u0026gt; rtt/$1.log fi avgms=0 n=1 break fi done done rm -rf rtt/$1.txt } function rtthttp(){ avgms=0 n=1 for ip in `cat rtt/$1.txt` do while true do if [ $n -le 3 ] then if [ $(echo $ip | grep : | wc -l) == 0 ] then rsp=$(curl -x $ip:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) else rsp=$(curl -x [$ip]:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) fi if [ $(echo $rsp | awk -F_ \u0026#39;{print $2}\u0026#39;) != 200 ] then avgms=0 n=1 break else avgms=$[$(echo $rsp | awk -F_ \u0026#39;{printf (\u0026#34;%d\\n\u0026#34;,$1*1000000)}\u0026#39;)+$avgms] n=$[$n+1] fi else avgms=$[$avgms/3000] if [ $avgms -lt 10 ] then echo 00$avgms $ip \u0026gt;\u0026gt; rtt/$1.log elif [ $avgms -ge 10 ] \u0026amp;\u0026amp; [ $avgms -lt 100 ] then echo 0$avgms $ip \u0026gt;\u0026gt; rtt/$1.log else echo $avgms $ip \u0026gt;\u0026gt; rtt/$1.log fi avgms=0 n=1 break fi done done rm -rf rtt/$1.txt } function speedtesthttps(){ rm -rf log.txt speed.txt curl --resolve $domain:443:$1 https://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 \u0026gt; log.txt 2\u0026gt;\u0026amp;1 cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep -v \u0026#39;k\\|M\u0026#39; \u0026gt;\u0026gt; speed.txt for i in `cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep k | sed \u0026#39;s/k//g\u0026#39;` do k=$i k=$[$k*1024] echo $k \u0026gt;\u0026gt; speed.txt done for i in `cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep M | sed \u0026#39;s/M//g\u0026#39;` do i=$(echo | awk \u0026#39;{print \u0026#39;$i\u0026#39;*10 }\u0026#39;) M=$i M=$[$M*1024*1024/10] echo $M \u0026gt;\u0026gt; speed.txt done max=0 for i in `cat speed.txt` do if [ $i -ge $max ] then max=$i fi done rm -rf log.txt speed.txt echo $max } function speedtesthttp(){ rm -rf log.txt speed.txt if [ $(echo $1 | grep : | wc -l) == 0 ] then curl -x $1:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 \u0026gt; log.txt 2\u0026gt;\u0026amp;1 else curl -x [$1]:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 \u0026gt; log.txt 2\u0026gt;\u0026amp;1 fi cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep -v \u0026#39;k\\|M\u0026#39; \u0026gt;\u0026gt; speed.txt for i in `cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep k | sed \u0026#39;s/k//g\u0026#39;` do k=$i k=$[$k*1024] echo $k \u0026gt;\u0026gt; speed.txt done for i in `cat log.txt | tr \u0026#39;\\r\u0026#39; \u0026#39;\\n\u0026#39; | awk \u0026#39;{print $NF}\u0026#39; | sed \u0026#39;1,3d;$d\u0026#39; | grep M | sed \u0026#39;s/M//g\u0026#39;` do i=$(echo | awk \u0026#39;{print \u0026#39;$i\u0026#39;*10 }\u0026#39;) M=$i M=$[$M*1024*1024/10] echo $M \u0026gt;\u0026gt; speed.txt done max=0 for i in `cat speed.txt` do if [ $i -ge $max ] then max=$i fi done rm -rf log.txt speed.txt echo $max } function cloudflaretest(){ while true do while true do rm -rf rtt rtt.txt log.txt speed.txt mkdir rtt echo \u0026#34;正在生成 $ips\u0026#34; unset temp if [ \u0026#34;$ips\u0026#34; == \u0026#34;ipv4\u0026#34; ] then n=0 iplist=100 while true do for i in `awk \u0026#39;BEGIN{srand()} {print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; $filename | sort -n | awk \u0026#39;{print $2} NR==\u0026#39;$iplist\u0026#39; {exit}\u0026#39; | awk -F\\. \u0026#39;{print $1\u0026#34;.\u0026#34;$2\u0026#34;.\u0026#34;$3}\u0026#39;` do temp[$n]=$(echo $i.$(($RANDOM%256))) n=$[$n+1] done if [ $n -ge $iplist ] then break fi done while true do if [ $(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u | wc -l) -ge $iplist ] then break else for i in `awk \u0026#39;BEGIN{srand()} {print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; $filename | sort -n | awk \u0026#39;{print $2} NR==\u0026#39;$[$iplist-$(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u | wc -l)]\u0026#39; {exit}\u0026#39; | awk -F\\. \u0026#39;{print $1\u0026#34;.\u0026#34;$2\u0026#34;.\u0026#34;$3}\u0026#39;` do temp[$n]=$(echo $i.$(($RANDOM%256))) n=$[$n+1] done fi done else n=0 iplist=100 while true do for i in `awk \u0026#39;BEGIN{srand()} {print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; $filename | sort -n | awk \u0026#39;{print $2} NR==\u0026#39;$iplist\u0026#39; {exit}\u0026#39; | awk -F: \u0026#39;{print $1\u0026#34;:\u0026#34;$2\u0026#34;:\u0026#34;$3}\u0026#39;` do temp[$n]=$(echo $i:$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2)))) n=$[$n+1] done if [ $n -ge $iplist ] then break fi done while true do if [ $(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u | wc -l) -ge $iplist ] then break else for i in `awk \u0026#39;BEGIN{srand()} {print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; $filename | sort -n | awk \u0026#39;{print $2} NR==\u0026#39;$[$iplist-$(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u | wc -l)]\u0026#39; {exit}\u0026#39; | awk -F: \u0026#39;{print $1\u0026#34;:\u0026#34;$2\u0026#34;:\u0026#34;$3}\u0026#39;` do temp[$n]=$(echo $i:$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2))):$(printf \u0026#39;%x\\n\u0026#39; $(($RANDOM*2+$RANDOM%2)))) n=$[$n+1] done fi done fi ipnum=$(echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u | wc -l) if [ $tasknum == 0 ] then tasknum=1 fi if [ $ipnum -lt $tasknum ] then tasknum=$ipnum fi n=1 for i in `echo ${temp[@]} | sed -e \u0026#39;s/ /\\n/g\u0026#39; | sort -u` do echo $i\u0026gt;\u0026gt;rtt/$n.txt if [ $n == $tasknum ] then n=1 else n=$[$n+1] fi done n=1 while true do if [ $tls == 1 ] then rtthttps $n \u0026amp; else rtthttp $n \u0026amp; fi if [ $n == $tasknum ] then break else n=$[$n+1] fi done while true do n=$(ls rtt | grep txt | wc -l) if [ $n -ne 0 ] then echo \u0026#34;$(date +\u0026#39;%H:%M:%S\u0026#39;) 等待RTT测试结束,剩余进程数 $n\u0026#34; else echo \u0026#34;$(date +\u0026#39;%H:%M:%S\u0026#39;) RTT测试完成\u0026#34; break fi sleep 1 done n=$(ls rtt | grep log | wc -l) if [ $n == 0 ] then echo \u0026#34;当前所有IP都存在RTT丢包\u0026#34; echo \u0026#34;继续新的RTT测试\u0026#34; else cat rtt/*.log \u0026gt; rtt.txt status=0 echo \u0026#34;待测速的IP地址\u0026#34; cat rtt.txt | sort | awk \u0026#39;{print $2\u0026#34; 往返延迟 \u0026#34;$1\u0026#34; 毫秒\u0026#34;}\u0026#39; for i in `cat rtt.txt | sort | awk \u0026#39;{print $1\u0026#34;_\u0026#34;$2}\u0026#39;` do avgms=$(echo $i | awk -F_ \u0026#39;{print $1}\u0026#39;) ip=$(echo $i | awk -F_ \u0026#39;{print $2}\u0026#39;) echo \u0026#34;正在测试 $ip\u0026#34; if [ $tls == 1 ] then max=$(speedtesthttps $ip) else max=$(speedtesthttp $ip) fi if [ $max -ge $speed ] then status=1 anycast=$ip max=$[$max/1024] echo \u0026#34;$ip 峰值速度 $max kB/s\u0026#34; rm -rf rtt rtt.txt break else max=$[$max/1024] echo \u0026#34;$ip 峰值速度 $max kB/s\u0026#34; fi done if [ $status == 1 ] then break fi fi done break done } function singlehttps(){ read -p \u0026#34;请输入需要测速的IP: \u0026#34; ip read -p \u0026#34;请输入需要测速的端口(默认443): \u0026#34; port if [ -z \u0026#34;$ip\u0026#34; ] then echo \u0026#34;未输入IP\u0026#34; fi if [ -z \u0026#34;$port\u0026#34; ] then port=443 fi echo \u0026#34;正在测速 $ip 端口 $port\u0026#34; speed_download=$(curl --resolve $domain:$port:$ip https://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\\. \u0026#39;{printf (\u0026#34;%d\\n\u0026#34;,$1/1024)}\u0026#39;) } function singlehttp(){ read -p \u0026#34;请输入需要测速的IP: \u0026#34; ip read -p \u0026#34;请输入需要测速的端口(默认80): \u0026#34; port if [ -z \u0026#34;$ip\u0026#34; ] then echo \u0026#34;未输入IP\u0026#34; fi if [ -z \u0026#34;$port\u0026#34; ] then port=80 fi echo \u0026#34;正在测速 $ip 端口 $port\u0026#34; if [ $(echo $ip | grep : | wc -l) == 0 ] then speed_download=$(curl -x $ip:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\\. \u0026#39;{printf (\u0026#34;%d\\n\u0026#34;,$1/1024)}\u0026#39;) else speed_download=$(curl -x [$ip]:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\\. \u0026#39;{printf (\u0026#34;%d\\n\u0026#34;,$1/1024)}\u0026#39;) fi } function datacheck(){ clear echo \u0026#34;如果这些下面这些文件下载失败,可以手动访问网址下载保存至同级目录\u0026#34; echo \u0026#34;https://www.baipiao.eu.org/cloudflare/colo 另存为 colo.txt\u0026#34; echo \u0026#34;https://www.baipiao.eu.org/cloudflare/url 另存为 url.txt\u0026#34; echo \u0026#34;https://www.baipiao.eu.org/cloudflare/ips-v4 另存为 ips-v4.txt\u0026#34; echo \u0026#34;https://www.baipiao.eu.org/cloudflare/ips-v6 另存为 ips-v6.txt\u0026#34; while true do if [ ! -f \u0026#34;colo.txt\u0026#34; ] then echo \u0026#34;从服务器下载数据中心信息 colo.txt\u0026#34; curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/colo -o colo.txt elif [ ! -f \u0026#34;url.txt\u0026#34; ] then echo \u0026#34;从服务器下载测速文件地址 url.txt\u0026#34; curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/url -o url.txt elif [ ! -f \u0026#34;ips-v4.txt\u0026#34; ] then echo \u0026#34;从服务器下载IPV4数据 ips-v4.txt\u0026#34; curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v4 -o ips-v4.txt elif [ ! -f \u0026#34;ips-v6.txt\u0026#34; ] then echo \u0026#34;从服务器下载IPV6数据 ips-v6.txt\u0026#34; curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v6 -o ips-v6.txt else break fi done } function check(){ # 检查当前IP文件是否存在，不存在就创建一个 while true do if [[ ! -e \u0026#34;nowip.txt\u0026#34; ]]; then echo -e \u0026#34;该脚本的作用为 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。\u0026#34; echo -e \u0026#34;第一次使用，请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。\u0026#34; read -e -p \u0026#34;输入该 Cloudflare CDN IP 并回车（后续不再需要该步骤）：\u0026#34; NOWIP if [[ ! -z \u0026#34;${NOWIP}\u0026#34; ]]; then echo ${NOWIP} \u0026gt; nowip.txt break else echo \u0026#34;该 IP 不能是空！\u0026#34; fi else break fi done } function changeip(){ # 根据当前IP，新找到的ip，更新本地host文件 NOWIP=$(head -1 nowip.txt) NEWIP=$(head -1 newip.txt) echo ${NEWIP} \u0026gt; nowip.txt echo -e \u0026#34;\\n旧 IP 为 ${NOWIP}\\n新 IP 为 ${NEWIP}\\n\u0026#34; echo \u0026#34;开始备份 Hosts 文件（hosts_backup）...\u0026#34; \\cp -f ${hostfile} /etc/hosts_backup echo -e \u0026#34;开始替换...\u0026#34; sed -i \u0026#39;s/\u0026#39;${NOWIP}\u0026#39;/\u0026#39;${NEWIP}\u0026#39;/g\u0026#39; ${hostfile} echo -e \u0026#34;完成...\u0026#34; } datacheck url=$(sed -n \u0026#39;1p\u0026#39; url.txt) domain=$(echo $url | cut -f 1 -d\u0026#39;/\u0026#39;) file=$(echo $url | cut -f 2- -d\u0026#39;/\u0026#39;) clear while true do echo \u0026#34;1. IPV4优选(TLS)\u0026#34; echo \u0026#34;2. IPV4优选\u0026#34; echo \u0026#34;3. IPV6优选(TLS)\u0026#34; echo \u0026#34;4. IPV6优选\u0026#34; echo \u0026#34;5. 单IP测速(TLS)\u0026#34; echo \u0026#34;6. 单IP测速\u0026#34; echo \u0026#34;7. 清空缓存\u0026#34; echo \u0026#34;8. 更新数据\u0026#34; echo -e \u0026#34;0. 退出\\n\u0026#34; # read -p \u0026#34;请选择菜单(默认0): \u0026#34; menu menu=2 if [ -z \u0026#34;$menu\u0026#34; ] then menu=0 fi if [ $menu == 0 ] then clear echo \u0026#34;退出成功\u0026#34; break fi if [ $menu == 1 ] then ips=ipv4 filename=ips-v4.txt tls=1 bettercloudflareip break fi if [ $menu == 2 ] then ips=ipv4 filename=ips-v4.txt tls=0 bettercloudflareip break fi if [ $menu == 3 ] then ips=ipv6 filename=ips-v6.txt tls=1 bettercloudflareip break fi if [ $menu == 4 ] then ips=ipv6 filename=ips-v6.txt tls=0 bettercloudflareip break fi if [ $menu == 5 ] then singlehttps clear echo \u0026#34;$ip 平均速度 $speed_download kB/s\u0026#34; fi if [ $menu == 6 ] then singlehttp clear echo \u0026#34;$ip 平均速度 $speed_download kB/s\u0026#34; fi if [ $menu == 7 ] then rm -rf rtt rtt.txt log.txt speed.txt clear echo \u0026#34;缓存已经清空\u0026#34; fi if [ $menu == 8 ] then rm -rf colo.txt url.txt ips-v4.txt ips-v6.txt datacheck clear fi done ","date":"2023-12-20T20:10:00+08:00","permalink":"https://example.com/p/cloudflare%E4%BC%98%E9%80%89/","title":"Cloudflare优选"},{"content":"warp warp是cloudflare提供的一个匿名VPN服务，IP地址每秒都在变化，几乎是无限流量。最近用的就是它了，但是全局，访问国内也慢了。\n访问https://1.1.1.1，或者https://cloudflarewarp.com就可以下载多平台客户端了。\nopenclash 前端时间一直用的一个VPN，特点是策略分流，可以自己写策略。 https://github.com/vernesong/OpenClash 核心是clash，支持的协议也挺多的，meta内核可以支持vless，也可以支持warp。\nwireGuard https://www.wireguard.com 支持warp 对我而言也是比较新的一个工具。\n2023 年 3 月末有知情人士向p3terx博主透露 Cloud­flare WARP 未来将会采用私有协议并逐步放弃对原版 Wire­Guard 的兼容，通过抓包分析新版客户端也得到了初步的证实。所以最终无论怎么折腾都只会是短暂的狂欢，原版 Wire­Guard 访问 WARP 网络最终可能会成为历史。\n似乎快结束了。\ncloudflare vless cloudflare也提供了workers做反代，常见的有代理github加速，翻墙临时访问，现在终于有大神使用JS，实现了workers vless节点。 https://github.com/zizifn/edgetunnel 在workers里面直接搭建vless节点，不用再找vpn了。\ncloudflare workers sub https://github.com/vfarid/v2ray-worker-sub 貌似伊朗人做的，将订阅服务器放在wokers里面。 将js放入worker的代码中，访问时翻译一下阿拉伯文，就知道怎么订阅了。\n订阅优化 https://github.com/andatoshiki/toshiki-proxypool https://github.com/ssrlive/proxypool 基于go语言订阅，然后去重测速分类重新生成订阅的工具。 省的你自己去v2rayN里面测速了。\n食用方法 域名 绕来绕去，想白嫖就绕不开cloudflare，但是： workers的域名workers.dev被墙了，需要自己的域名，但是freenom已经不能注册了。而且ga，ml貌似都被收回了。需要自己注册一个。最近免费的有eu.org,还有个日本送的，xyz，top也挺便宜。\nwarp 一般我是在windows上使用warp，下载对应客户端后，安装，有一个warp优选的批处理。https://github.com/yonggekkk/warp-yg clone下来可以有效提高warp的链接速度。 fscarmen / warp · GitLab 这里有脚本。没找到脚本安装时，很辛苦的。\ncloudflare vless https://github.com/zizifn/edgetunnel 部署js后，需要绑定自己的域名。测试失败。\n","date":"2023-12-09T20:10:00+08:00","permalink":"https://example.com/p/%E7%BF%BB%E5%A2%99%E7%9A%84%E4%B8%80%E4%BA%9B%E6%96%B9%E6%B3%95/","title":"翻墙的一些方法"},{"content":"简介： git是目前世界上最流行的版本库管理程序，也促成了最大的开源软件中心github。\n常用的就不记了，记几个不常用，掌握不熟练的。\n长期使用简单的提交推送，发现错了怎么办？\n回退 命令行操作： 1 2 3 4 5 6 $ git reset --hard HEAD^ 回退到上个版本 $ git reset --hard HEAD~3 回退到前3次提交之前，以此类推，回退到n次提交之前 $ git reset --hard commit_id 退到/进到 指定commit的sha码 #强推到远程，更新回退后的远程仓库： $ git push origin HEAD --force 小乌龟操作： 版本库浏览器\u0026ndash;版本（HEAD）\u0026ndash;选择一个历史版本（右键）\u0026ndash;重置\u0026rsquo;main\u0026rsquo;到此版本\n一般选择硬重置。丢弃本地所有更改。\n推送\u0026ndash;勾选（强制覆盖所有）\nVScode操作： 没找到vscode的强制推送，得敲命令或者小乌龟。\n创建分支： 命令行 1 2 3 4 5 6 $ git branch dev #创建dev分支 $ git checkout dev #切换到dev分支 $ git checkout -b dev #创建并切换到dev分支 $ git branch #列出所有分支 小乌龟操作： 切换/检出\u0026ndash;勾选创建新分支\u0026ndash;右侧写名字dev\nVScode操作： 合并分支： 命令行操作： 先切换回main分支，然后合并dev分支。 切换回main分支：git checkout main 合并某分支到当前分支：git merge dev\n小乌龟操作： 先切换/检出到main主分支，然后选择dev分支合并\nVScode操作： 这里选择合并，再选择dev。\n删除分支： 命令行操作： 先切换回main分支，才可以删除dev分支 切换回main分支：git checkout main 删除分支：git branch -d dev\n小乌龟操作： TortoiseGit删除分支 选中Switch/Checkout选项卡 点选如图master后三个点小按钮“…” 选择remote下的要删除的分支 点击删除一路确认就可以同步删除远程仓库的分支\nVScode操作： 似乎并没有推送，还得小乌龟方便。\n","date":"2023-12-08T09:14:58+08:00","permalink":"https://example.com/p/git%E6%93%8D%E4%BD%9C/","title":"git操作"},{"content":"hugo+stack搭建笔记 下载安装hugo： Releases · gohugoio/hugo (github.com)\nhugo_extended_0.120.4_windows-amd64.zip\n一般下载extended版本。解压后就一个hugo.exe可用，也没必要配置什么系统变量，直接复制到D盘吧。\n新建hugo 本例目录hugo_blog\n1 hugo new site hugo_blog 当然，你也可以先创建仓库，clone下来，用force参数，在已存在的目录创建hugo\n1 hugo new site hugo_blog --force 安装模板 进入hugo目录，添加子模块\n1 git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack 复制模板例子 themes\\hugo-theme-stack\\exampleSite 这里是模板示例，将这里的文件全部复制到hugo_blog目录\n启动hugo 将刚才D盘的hugo.exe也复制进hugo_blog目录\n删除hugo_blog目录的hugo.toml配置文件，我们使用模板示例时，配置文件不在这里，会冲突，删了就好。\n在hugo_blog目录直接运行\n1 hugo server http://localhost:1313\n访问看看吧。\n创建分类菜单 创建content\\page\\categories\\index.md\n1 2 3 4 5 6 7 8 9 10 title: 分类 date: 2019-05-28 layout: \u0026#34;categories\u0026#34; slug: \u0026#34;categories\u0026#34; menu: main: name: 分类 weight: -90 params: icon: categories 创建标签菜单 创建content\\page\\tags\\index.md\n1 2 3 4 5 6 7 8 9 10 title: tags date: 2019-05-28 layout: \u0026#34;tags\u0026#34; slug: \u0026#34;tags\u0026#34; menu: main: name: 标签 weight: -90 params: icon: tag 修改头像 创建 assets\\img\\avatar.png\n修改标题 修改config.yaml\ntitle: 你想要的标题\n修改副标题 修改config.yaml\nsidebar:\nsubtitle: 你需要的副标题 修改github 修改config.yaml\n1 2 3 4 5 6 7 8 9 menu: main: [] social: - identifier: github name: GitHub url: https://github.com/jackadam1981 params: icon: brand-github 修改twitter 修改config.yaml，没有twitter，就注释掉了\n1 2 3 4 5 6 7 8 menu: main: [] # - identifier: twitter # name: Twitter # url: https://twitter.com # params: # icon: brand-twitter 删除语言 默认设置多语言，我这水平不够，只留中文吧。\n修改config.yaml\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 languageCode: zh-cn DefaultContentLanguage: zh-cn # languages: # en: # languageName: English # title: Example Site # weight: 1 # params: # description: Example description # zh-cn: # languageName: 中文 # title: 演示站点 # weight: 2 # params: # description: 演示说明 # ar: # languageName: عربي # languagedirection: rtl # title: موقع تجريبي # weight: 3 # params: # description: وصف تجريبي 修改日期格式 修改config.yaml\n1 2 3 4 5 dateFormat: #published: Jan 02, 2006 published: 2006-01-02 #lastUpdated: Jan 02, 2006 15:04 MST lastUpdated: 2006-01-02 23:04 +8 创建favicon.ico 创建/static/favicon.ico\n编辑config.yaml\n1 2 3 4 5 6 params: mainSections: - post featuredImageField: image rssFullContent: true favicon: /favicon.ico #这行 创建新文章 在终端输入命令创建\npowershell命令：\n1 .\\hugo.exe new post/202402/taro_vue_note.md CMD命令\n1 hugo new post/202402/taro_vue_note.md 修改新文章模板 修改文件：archetypes\\default.md\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 title: \u0026#34;{{ replace .Name \u0026#34;-\u0026#34; \u0026#34; \u0026#34; | title }}\u0026#34; #标题 description: #描述、副标题 date: {{ .Date }} #自动生成日期 image: #图片 math: #是否开启公式 license: #许可协议 hidden: false #隐藏 comments: true #评论 categories: - Test - 测试 tags: - Test - 测试 draft: false #草稿 修改图片渲染模板 这步比较重要，我就在这里卡了2天，23年12月写了点文章，在vscode预览挺好的。上传也没注意。\n最近又写了两篇，发现图片渲染不正确，路径缺失，hugo编译静态后，图片路径并不在文档相对路径。\nHow to use render-image.html to customize the rendering image path - support - HUGO (gohugo.io)\n创建layouts\\_default\\_markup\\render-image.html\n1 2 3 \u0026lt;p class=\u0026#34;md__image\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;/{{ path.Dir page.File }}/{{ .Destination | safeURL }}\u0026#34; alt=\u0026#34;{{ .Text }}\u0026#34; {{ with .Title }} title=\u0026#34;{{ . }}\u0026#34; {{ end }} /\u0026gt; \u0026lt;/p\u0026gt; Markdown 渲染钩子 |雨 果 (gohugo.io)\n在src路径中添加了 /{{ path.Dir page.File }}/\n终于全部解决，可以愉快的写博客了。\n","date":"2023-12-04T20:10:00+08:00","permalink":"https://example.com/p/hugo-stack%E6%90%AD%E5%BB%BA%E7%AC%94%E8%AE%B0/","title":"hugo+stack搭建笔记"},{"content":"Emoji can be enabled in a Hugo project in a number of ways.\nThe emojify function can be called directly in templates or Inline Shortcodes.\nTo enable emoji globally, set enableEmoji to true in your site\u0026rsquo;s configuration and then you can type emoji shorthand codes directly in content files; e.g.\n🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:\nThe Emoji cheat sheet is a useful reference for emoji shorthand codes.\nN.B. The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g.\n1 2 3 .emoji { font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols; } ","date":"2019-03-05T00:00:00Z","image":"https://example.com/p/emoji-support/the-creative-exchange-d2zvqp3fpro-unsplash_huf941de4769045cdfa8c9ee7036519a2a_35369_120x120_fill_q75_box_smart1.jpg","permalink":"https://example.com/p/emoji-support/","title":"Emoji Support"}]