From 24e66ccfa7a57f279cf56849f9184236fe475b6b Mon Sep 17 00:00:00 2001 From: wangwangit <1249217495@qq.com> Date: Tue, 16 Apr 2024 14:58:52 +0800 Subject: [PATCH] Site updated: 2024-04-16 14:58:24 --- .../index.html" | 646 ++++++ .../index.html" | 720 +++++++ .../index.html" | 656 ++++++ .../index.html" | 624 ++++++ .../index.html" | 696 ++++++ .../index.html" | 684 ++++++ .../index.html" | 1860 +++++++++++++++++ .../index.html" | 638 ++++++ .../index.html" | 702 +++++++ .../index.html" | 687 ++++++ .../index.html" | 713 +++++++ .../index.html" | 629 ++++++ .../index.html" | 647 ++++++ .../index.html" | 639 ++++++ .../index.html" | 813 +++++++ .../index.html" | 1274 +++++++++++ .../index.html" | 688 ++++++ .../index.html" | 793 +++++++ .../index.html" | 966 +++++++++ .../index.html" | 758 +++++++ .../index.html" | 688 ++++++ .../index.html" | 667 ++++++ .../index.html" | 729 +++++++ .../index.html" | 653 ++++++ .../index.html" | 641 ++++++ .../index.html" | 777 +++++++ .../index.html" | 637 ++++++ "K8S\351\203\250\347\275\262/index.html" | 810 +++++++ .../index.html" | 657 ++++++ .../index.html" | 1028 +++++++++ .../index.html" | 643 ++++++ .../index.html" | 1097 ++++++++++ .../index.html" | 714 +++++++ .../index.html" | 1629 +++++++++++++++ .../index.html" | 1073 ++++++++++ "Nginx\350\207\252\345\273\272CDN/index.html" | 658 ++++++ .../index.html" | 684 ++++++ .../index.html" | 666 ++++++ .../index.html" | 737 +++++++ .../index.html" | 637 ++++++ .../index.html" | 643 ++++++ .../index.html" | 621 ++++++ .../index.html" | 698 +++++++ .../index.html" | 642 ++++++ "SpringBoot\344\270\200/index.html" | 994 +++++++++ .../index.html" | 1032 +++++++++ .../index.html" | 830 ++++++++ .../index.html" | 714 +++++++ "SpringSecurity\344\270\200/index.html" | 1160 ++++++++++ "SpringSecurity\344\272\214/index.html" | 908 ++++++++ "Spring\345\210\235\346\216\242/index.html" | 791 +++++++ .../index.html" | 667 ++++++ "Tomcat\345\255\246\344\271\240/index.html" | 1045 +++++++++ .../index.html" | 650 ++++++ WARP/index.html | 675 ++++++ .../index.html" | 641 ++++++ .../index.html" | 629 ++++++ .../index.html" | 663 ++++++ .../index.html" | 700 +++++++ .../index.html" | 642 ++++++ about.html | 632 ++++++ archives.html | 639 ++++++ archives/2022/03/index.html | 676 ++++++ archives/2022/05/index.html | 724 +++++++ archives/2022/06/index.html | 862 ++++++++ archives/2022/07/index.html | 793 +++++++ archives/2022/08/index.html | 678 ++++++ archives/2022/09/index.html | 793 +++++++ archives/2022/10/index.html | 862 ++++++++ archives/2022/11/index.html | 724 +++++++ archives/2022/12/index.html | 678 ++++++ archives/2022/index.html | 889 ++++++++ archives/2022/page/2/index.html | 889 ++++++++ archives/2022/page/3/index.html | 889 ++++++++ archives/2022/page/4/index.html | 864 ++++++++ archives/2023/01/index.html | 793 +++++++ archives/2023/02/index.html | 839 ++++++++ archives/2023/03/index.html | 839 ++++++++ archives/2023/04/index.html | 724 +++++++ archives/2023/05/index.html | 701 +++++++ archives/2023/06/index.html | 862 ++++++++ archives/2023/07/index.html | 770 +++++++ archives/2023/09/index.html | 747 +++++++ archives/2023/11/index.html | 770 +++++++ archives/2023/12/index.html | 678 ++++++ archives/2023/index.html | 889 ++++++++ archives/2023/page/2/index.html | 889 ++++++++ archives/2023/page/3/index.html | 889 ++++++++ archives/2023/page/4/index.html | 889 ++++++++ archives/2023/page/5/index.html | 889 ++++++++ archives/2023/page/6/index.html | 682 ++++++ archives/2024/01/index.html | 701 +++++++ archives/2024/03/index.html | 678 ++++++ archives/2024/04/index.html | 889 ++++++++ archives/2024/04/page/2/index.html | 751 +++++++ archives/2024/index.html | 889 ++++++++ archives/2024/page/2/index.html | 820 ++++++++ archives/index.html | 889 ++++++++ archives/page/10/index.html | 889 ++++++++ archives/page/11/index.html | 818 ++++++++ archives/page/2/index.html | 889 ++++++++ archives/page/3/index.html | 889 ++++++++ archives/page/4/index.html | 889 ++++++++ archives/page/5/index.html | 889 ++++++++ archives/page/6/index.html | 889 ++++++++ archives/page/7/index.html | 889 ++++++++ archives/page/8/index.html | 889 ++++++++ archives/page/9/index.html | 889 ++++++++ baidusitemap.xml | 64 +- bookmark.html | 514 +++++ categories/AI/index.html | 889 ++++++++ categories/AI/page/2/index.html | 889 ++++++++ categories/AI/page/3/index.html | 797 +++++++ .../\344\273\243\347\220\206/index.html" | 747 +++++++ .../\345\215\232\345\256\242/index.html" | 814 ++++++++ .../\345\267\245\345\205\267/index.html" | 701 +++++++ .../\345\274\200\345\217\221/index.html" | 889 ++++++++ .../page/2/index.html" | 889 ++++++++ .../page/3/index.html" | 889 ++++++++ .../page/4/index.html" | 889 ++++++++ .../page/5/index.html" | 889 ++++++++ .../\347\276\212\346\257\233/index.html" | 793 +++++++ .../\350\264\246\345\217\267/index.html" | 701 +++++++ .../\350\275\257\344\273\266/index.html" | 885 ++++++++ .../index.html" | 698 +++++++ friend.html | 450 ++++ index.html | 889 ++++++++ page/10/index.html | 889 ++++++++ page/11/index.html | 818 ++++++++ page/2/index.html | 889 ++++++++ page/3/index.html | 889 ++++++++ page/4/index.html | 889 ++++++++ page/5/index.html | 889 ++++++++ page/6/index.html | 889 ++++++++ page/7/index.html | 889 ++++++++ page/8/index.html | 889 ++++++++ page/9/index.html | 889 ++++++++ search.xml | 6 +- .../index.html" | 634 ++++++ sitemap.xml | 144 +- tags/AI/index.html | 678 ++++++ tags/Alist/index.html | 678 ++++++ tags/Apple/index.html | 678 ++++++ tags/Aria2/index.html | 678 ++++++ tags/Azure/index.html | 678 ++++++ tags/Baidu/index.html | 678 ++++++ tags/Bing/index.html | 678 ++++++ tags/CDN/index.html | 724 +++++++ tags/CORS/index.html | 678 ++++++ tags/Chat2DB/index.html | 678 ++++++ tags/Chatgpt/index.html | 889 ++++++++ tags/Chatgpt/page/2/index.html | 705 +++++++ tags/Clash/index.html | 678 ++++++ tags/Claude/index.html | 701 +++++++ tags/Claude3/index.html | 678 ++++++ tags/Cloudflare/index.html | 678 ++++++ tags/Command/index.html | 678 ++++++ tags/Copilot/index.html | 678 ++++++ tags/Docker/index.html | 747 +++++++ tags/Domain/index.html | 678 ++++++ tags/EGADS/index.html | 678 ++++++ tags/Easypoi/index.html | 678 ++++++ tags/Edge/index.html | 747 +++++++ tags/Elasticsearch/index.html | 701 +++++++ tags/Eureka/index.html | 678 ++++++ tags/ExpiringMap/index.html | 678 ++++++ tags/Git/index.html | 747 +++++++ tags/Github/index.html | 816 ++++++++ tags/Google/index.html | 701 +++++++ tags/Hexo/index.html | 722 +++++++ tags/IDEA/index.html | 678 ++++++ tags/InfluxDB/index.html | 701 +++++++ tags/JSON/index.html | 678 ++++++ tags/Java/index.html | 770 +++++++ tags/JetBrains/index.html | 678 ++++++ tags/Kibana/index.html | 678 ++++++ tags/Kubernetes/index.html | 678 ++++++ tags/Linux/index.html | 701 +++++++ tags/Logstash/index.html | 678 ++++++ tags/MarkDown/index.html | 678 ++++++ tags/Microsoft/index.html | 678 ++++++ tags/Minio/index.html | 678 ++++++ tags/Mqtt/index.html | 678 ++++++ tags/MySQL/index.html | 701 +++++++ tags/Mybatis/index.html | 701 +++++++ tags/Navicat/index.html | 678 ++++++ tags/Netflix/index.html | 678 ++++++ tags/Netplan/index.html | 678 ++++++ tags/Nginx/index.html | 724 +++++++ tags/Office/index.html | 678 ++++++ tags/Oracle/index.html | 678 ++++++ tags/OracleCloud/index.html | 678 ++++++ tags/PicGo/index.html | 678 ++++++ tags/RabbitMQ/index.html | 701 +++++++ tags/Reddit/index.html | 678 ++++++ tags/Redis/index.html | 678 ++++++ tags/Ribbon/index.html | 678 ++++++ tags/SciHub/index.html | 678 ++++++ tags/Screw/index.html | 678 ++++++ tags/Shell/index.html | 678 ++++++ tags/Slack/index.html | 701 +++++++ tags/Spring/index.html | 793 +++++++ tags/SpringBoot/index.html | 678 ++++++ tags/SpringCloud/index.html | 770 +++++++ tags/SpringSecurity/index.html | 701 +++++++ tags/Tamperonkey/index.html | 678 ++++++ tags/Tomcat/index.html | 678 ++++++ tags/Ubuntu/index.html | 678 ++++++ tags/Vps/index.html | 701 +++++++ tags/Warp/index.html | 678 ++++++ tags/Windows/index.html | 770 +++++++ tags/ZLibrary/index.html | 678 ++++++ tags/frp/index.html | 678 ++++++ tags/news/index.html | 701 +++++++ .../index.html" | 790 +++++++ .../index.html" | 636 ++++++ .../index.html" | 710 +++++++ .../index.html" | 627 ++++++ .../index.html" | 663 ++++++ .../index.html" | 970 +++++++++ .../index.html" | 822 ++++++++ .../index.html" | 691 ++++++ .../index.html" | 637 ++++++ .../index.html" | 647 ++++++ .../index.html" | 645 ++++++ .../index.html" | 623 ++++++ .../index.html" | 632 ++++++ .../index.html" | 873 ++++++++ .../index.html" | 640 ++++++ .../index.html" | 624 ++++++ .../index.html" | 705 +++++++ .../index.html" | 685 ++++++ .../index.html" | 652 ++++++ .../index.html" | 652 ++++++ .../index.html" | 646 ++++++ .../index.html" | 812 +++++++ .../index.html" | 1020 +++++++++ .../index.html" | 712 +++++++ .../index.html" | 635 ++++++ .../index.html" | 648 ++++++ .../index.html" | 1069 ++++++++++ .../index.html" | 650 ++++++ "\347\231\275\345\253\226GPT4/index.html" | 632 ++++++ .../index.html" | 652 ++++++ .../index.html" | 627 ++++++ .../index.html" | 637 ++++++ .../index.html" | 665 ++++++ .../index.html" | 769 +++++++ .../index.html" | 628 ++++++ .../index.html" | 672 ++++++ .../index.html" | 689 ++++++ .../index.html" | 779 +++++++ .../index.html" | 651 ++++++ .../index.html" | 629 ++++++ .../index.html" | 635 ++++++ .../index.html" | 762 +++++++ .../index.html" | 820 ++++++++ .../index.html" | 964 +++++++++ .../index.html" | 746 +++++++ 259 files changed, 193284 insertions(+), 107 deletions(-) diff --git "a/AI\344\275\234\347\224\273\347\275\221\347\253\231\344\270\200\351\224\256\346\220\255\345\273\272\357\274\214\350\256\251\346\202\250\347\232\204\345\210\233\346\204\217\346\227\240\351\231\220\351\207\212\346\224\276/index.html" "b/AI\344\275\234\347\224\273\347\275\221\347\253\231\344\270\200\351\224\256\346\220\255\345\273\272\357\274\214\350\256\251\346\202\250\347\232\204\345\210\233\346\204\217\346\227\240\351\231\220\351\207\212\346\224\276/index.html" index e69de29bb2..59ce9b0327 100644 --- "a/AI\344\275\234\347\224\273\347\275\221\347\253\231\344\270\200\351\224\256\346\220\255\345\273\272\357\274\214\350\256\251\346\202\250\347\232\204\345\210\233\346\204\217\346\227\240\351\231\220\351\207\212\346\224\276/index.html" +++ "b/AI\344\275\234\347\224\273\347\275\221\347\253\231\344\270\200\351\224\256\346\220\255\345\273\272\357\274\214\350\256\251\346\202\250\347\232\204\345\210\233\346\204\217\346\227\240\351\231\220\351\207\212\346\224\276/index.html" @@ -0,0 +1,646 @@ + + + + + + + + + + + + AI作画网站一键搭建,让您的创意无限释放 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ + + + +
+ +
+
+
+ + +
  1. 1. 步骤
  2. 2. 最后
+ +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

最近Diffusion Models大火,也出现了许多供大家使用的图像生成接口,下面介绍一个一键搭建AI作画网站的方法,带大家领略图像生成的乐趣,一起来用AI作画吧~

+

步骤

1.访问网站stable diffusion webui colab

+

2.随机点击一个模型进行部署

+

image-20230402165342851

+

3.点击运行按钮

+

image-20230402165441226

+

4.等待输出访问网址

+

image-20230402165523956

+

5.访问网址,输入AI作画提示词,点击生成按钮

+

image-20230402165702052

+

6.剩下的就可以参考官方网站自己折腾了!

+

网友作图:

+

image-20230402171805687

+

image-20230402171817545

+

问题:

+

Google Colab 免费版一次只可以用 12 个小时,超过时间需要重新部署!测试发现个把小时就会需要重新部署!

+

最后

我创建了一个AI交流群,会实时分享新的好玩的资源,有兴趣的可以扫码进群,若群二维码失效,可以扫下方个人二维码拉你进群!

+

image-20230402165946824

+

image-20230402165951361

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/AI\345\212\251\346\211\213\346\235\245\344\272\206!JetBrains\347\232\204\346\226\260\347\216\251\346\263\225/index.html" "b/AI\345\212\251\346\211\213\346\235\245\344\272\206!JetBrains\347\232\204\346\226\260\347\216\251\346\263\225/index.html" index e69de29bb2..866fed267a 100644 --- "a/AI\345\212\251\346\211\213\346\235\245\344\272\206!JetBrains\347\232\204\346\226\260\347\216\251\346\263\225/index.html" +++ "b/AI\345\212\251\346\211\213\346\235\245\344\272\206!JetBrains\347\232\204\346\226\260\347\216\251\346\263\225/index.html" @@ -0,0 +1,720 @@ + + + + + + + + + + + + AI 助手来了!JetBrains的新玩法 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

今天我要给大家介绍一个非常酷炫的新功能,那就是 JetBrains AI 助手。

+

什么是 JetBrains AI 助手?它是一款基于生成式人工智能和大型语言模型的软件开发工具,可以帮助您提高编码效率和质量。它可以与您对话,为您生成文档,建议名称,生成提交消息等等。它可以深度集成到 JetBrains 的各种 IDE 和 .NET 工具中,让您在编程过程中享受 AI 的帮助。

+

听起来很神奇吧?那么,如何使用这个功能呢?接下来,我将以 IntelliJ IDEA 为例,给大家详细介绍一下 JetBrains AI 助手的使用方法。

+

如何启用 AI 助手

首先,您需要下载并安装最新的 EAP 版本的 IntelliJ IDEA。EAP 是 Early Access Program 的缩写,意思是早期访问计划。这是 JetBrains 为了让用户尽早体验最新的功能和改进而推出的测试版本。您可以在这里下载 EAP 版本:https://www.jetbrains.com/idea/nextversion/

+

安装好 EAP 版本后,您需要使用您的 JetBrains 帐户登录 JetBrains AI 服务。这是一个提供 AI 功能的云端服务,它可以将您连接到不同的大型语言模型,并在许多 JetBrains 产品中启用特定的 AI 功能。目前支持 OpenAI,并托管了许多由 JetBrains 创建的较小模型。将来还会支持更多提供商和模型。

+

要登录 JetBrains AI 服务,您可以从 AI 助手工具窗口或“设置”|”工具 |人工智能助手”中进行操作。

+

image-20230704090747626

+

请注意,JetBrains AI 服务可能并非立即对所有人开放。我们将首先让一定数量的用户进入,一旦达到最大容量,剩余的用户将被添加到等候名单中。我们将在未来几周内逐步邀请更多人试用该产品。

+

对 AI 服务的访问目前仅限于提供 OpenAI 服务的地区。您可以在此处查看完整的地区列表:https://openai.com/blog/openai-codex/

+

AI 服务在 EAP 周期内可免费使用。我们将在稍后提供许可和定价模型。

+

如何使用 AI 功能

启用了 AI 服务后,您就可以开始使用各种 AI 功能了。目前有以下几种功能可供选择:

+

人工智能聊天

这是一个非常有趣的功能,它可以让您与大型语言模型进行对话、提出问题或迭代任务。您可以打开 AI 助手工具窗口,在输入框中输入您想说的话或问的问题,然后按回车键发送。AI 将根据您输入的内容和项目中使用的语言和技术给出回复。

+

img

+

如果您对 AI 的回复满意,并且想要将 AI 生成的代码插入到编辑器中,您可以使用插入插入代码段插入插入符号功能,或者直接将其复制过来。

+

img

+

如果您想要向 AI 询问有关特定代码片段的信息,您可以在编辑器中选择该代码片段,然后从“AI 操作”菜单(在编辑器上下文菜单中或使用 Alt+Enter 快捷方式提供)调用操作。使用选择操作新建聊天允许您提供自己的提示或请求。可以通过根据需要选择“解释代码”、“建议重构”或“查找潜在问题”来输入其他标准 AI 帮助提示。

+

文档生成

这是一个非常实用的功能,它可以帮助您为声明生成文档。目前 Java、Kotlin 和 Python 都支持此功能。

+

要使用这个功能,您可以调用“AI 操作”菜单并选择“生成文档操作”。AI 将根据声明的内容和上下文为您生成文档注释。

+

img

+

对于 Java 和 Kotlin,您还可以使用一个更方便的方法来生成文档:在声明的上方键入 ,并按回车键。IDE 将生成注释的静态已知部分(例如 Java 中的标记),AI 将为您生成实际的文档文本。

+

名称建议

这是一个非常智能的功能,它可以根据声明的内容为您建议合适的名称。当您重命名 Java、Kotlin 或 Python 声明时,AI 将在重命名对话框中显示名称选项。您可以从中选择一个或者输入自己的名称。

+

img

+

如果您不想使用 AI 的名称建议,您可以在“设置”|”工具 |人工智能助手”中关闭这个功能。

+

提交消息生成

这是一个非常方便的功能,它可以帮助您为代码提交生成描述性的消息。当您打开提交消息对话框时,您会看到一个“使用 AI 助手生成提交消息”按钮。单击它以将更改的差异发送到 LLM,LLM 将生成描述更改的提交消息。

+

img

+

如何在国内使用

如果您在国内使用 JetBrains AI 助手,可能会遇到一些网络问题,导致无法正常连接到 AI 服务。这时候,您可以使用一些代理工具来解决这个问题。我推荐使用 Clash for Windows 这个软件,它是一个基于 Clash 的 Windows GUI 代理客户端,支持 Shadowsocks、VMess、Socks5 等协议,支持订阅、托盘图标、规则编辑等功能。

+

要使用 Clash for Windows,请按照以下步骤操作:

+
    +
  1. 进入网站 https://github.com/Fndroid/clash_for_windows_pkg/releases ,下载最新版本的 Clash.for.Windows-Setup-x.x.x.exe 安装包,并安装到电脑上。

    +
  2. +
  3. 打开 Clash for Windows 软件,点击 General 中 Home Directory 右边的文件夹图标,打开配置文件所在目录。

    +
  4. +
  5. 进入网站 https://www.wintun.net ,点击界面中 Download Wintun xxx 下载压缩包,根据系统版本(win10 64 位对应的是 amd64目录下)将对应目录中 wintun.dll 复制至 Clash 的 Home Directory 目录中。

    +
  6. +
  7. 点击 General 中 Service Mode 右边 Manage,在打开窗口中安装服务模式,安装完成应用会自动重启,Service Mode 右边地球图标变为绿色即安装成功。
    image-20230704105539575

    +
  8. +
  9. 点击 Profiles,选择一个合适的代理配置文件,或者点击 Download from URL 从网上下载一个订阅链接。您可以在一些代理服务提供商的网站上找到订阅链接,或者在网上搜索一些免费的订阅链接。

    +
  10. +
  11. 点击 settings——Profile Mixin——YAML,点击 edit,输入下面的内容,点击保存:

    +
    mixin: 
    +   hosts:
    +     'mtalk.google.com': 108.177.125.188
    +     'services.googleapis.cn': 74.125.203.94
    +     'raw.githubusercontent.com': 151.101.76.133
    +   dns:
    +     enable: true
    +     default-nameserver:
    +       - 223.5.5.5
    +       - 1.0.0.1
    +     ipv6: false
    +     enhanced-mode: redir-host #fake-ip
    +     nameserver:
    +       - https://dns.rubyfish.cn/dns-query
    +       - https://223.5.5.5/dns-query
    +       - https://dns.pub/dns-query
    +     fallback:
    +       - https://1.0.0.1/dns-query
    +       - https://public.dns.iij.jp/dns-query
    +       - https://dns.twnic.tw/dns-query
    +     fallback-filter:
    +       geoip: true
    +       ipcidr:
    +         - 240.0.0.0/4
    +         - 0.0.0.0/32
    +         - 127.0.0.1/32
    +       domain:
    +         - +.google.com
    +         - +.facebook.com
    +         - +.twitter.com
    +         - +.youtube.com
    +         - +.xn--ngstr-lra8j.com
    +         - +.google.cn
    +         - +.googleapis.cn
    +         - +.gvt1.com
    +   tun: 
    +     enable: true
    +     stack: gvisor
    +     dns-hijack:
    +       - 198.18.0.2:53
    +     macOS-auto-route: true
    +     macOS-auto-detect-interface: true # 自动检测出口网卡
    +
    +
  12. +
  13. 点击 General,开启 System Proxy 和 Allow LAN和Mixin。您就可以让浏览器等应用使用系统代理,也可以让局域网内的其他设备通过您的电脑访问代理服务。
    image-20230704091040737

    +
  14. +
  15. 现在,您就可以正常使用 JetBrains AI 助手了。如果您遇到任何问题,您可以在 AI 助手工具窗口中查看日志信息,或者在“设置”|”工具 |人工智能助手”中调整日志级别和日志文件位置。

    +

    IDEA中配置代理,根据实际情况调整这个端口!
    image-20230704105412429
    image-20230704091220993

    +
  16. +
+

总结

以上就是我为大家介绍的 JetBrains AI 助手的使用教程。我希望这篇文章能够对您有所帮助,让您能够体验到 AI 带来的便利和乐趣。如果您喜欢这篇文章,请给我点个赞,关注我的公众号,分享给您的朋友。感谢您的阅读,下次再见!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/AI\346\227\266\344\273\243\347\232\204\346\225\260\346\215\256\345\272\223\345\256\242\346\210\267\347\253\257\347\245\236\345\231\250/index.html" "b/AI\346\227\266\344\273\243\347\232\204\346\225\260\346\215\256\345\272\223\345\256\242\346\210\267\347\253\257\347\245\236\345\231\250/index.html" index e69de29bb2..85d92b8419 100644 --- "a/AI\346\227\266\344\273\243\347\232\204\346\225\260\346\215\256\345\272\223\345\256\242\346\210\267\347\253\257\347\245\236\345\231\250/index.html" +++ "b/AI\346\227\266\344\273\243\347\232\204\346\225\260\346\215\256\345\272\223\345\256\242\346\210\267\347\253\257\347\245\236\345\231\250/index.html" @@ -0,0 +1,656 @@ + + + + + + + + + + + + AI时代的数据库客户端神器-Chat2DB - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20230628113627996

+

序言

数据库是现代软件开发中不可或缺的组成部分,它存储了各种业务数据,为应用程序提供了强大的支持。然而,操作数据库并不是一件容易的事情,需要掌握SQL语言,了解数据库的结构和性能,还要注意数据的安全和备份。对于开发人员来说,这些都是需要花费大量时间和精力的工作。

+

有没有一款工具,可以让开发人员更方便地操作数据库,甚至可以用自然语言来查询数据呢?答案是有的,那就是Chat2DB。

+

简介

官网 : https://chat2db.opensource.alibaba.com

+

Chat2DB 是一款开源免费的多数据库客户端工具,它支持Windows、Mac本地安装,也支持服务器端部署,Web网页访问。它可以连接多种类型的数据库,如Mysql、PostgreSQL、Oracle、SQLServer、ClickHouse、Oceanbase、H2、SQLite等等,未来还会支持更多的数据库。

+

Chat2DB 的最大特色是集成了AIGC(Artificial Intelligence for General Computing)的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言。这意味着你可以用你熟悉的语言来和数据库交流,不需要记住复杂的SQL语法和规则。比如,你可以输入“查询所有用户的姓名和年龄”,Chat2DB 就会自动生成对应的SQL语句,并执行查询,返回结果。你也可以输入SQL语句,Chat2DB 会给出相应的自然语言解释,帮助你理解SQL的含义和逻辑。

+

除了自然语言转换,Chat2DB 还可以给出SQL的优化建议,帮助你提升SQL的性能和效率。它会分析SQL语句的结构和执行计划,指出潜在的问题和改进点,比如缺少索引、过度使用子查询、使用了不恰当的函数等等。它还会给出优化后的SQL语句和预期的效果,让你一目了然。

+

安装

+ + + + + + + + + + + + + + + + + + + + + + +
描述下载地址
Windows[https://oss-chat2db.alibaba.com/release/1.0.11/Chat2DB%20Setup%201.0.11.exe](https://oss-chat2db.alibaba.com/release/1.0.11/Chat2DB Setup 1.0.11.exe)
MacOS ARM64 (Apple芯片)https://oss-chat2db.alibaba.com/release/1.0.11/Chat2DB-1.0.11-arm64.dmg
MacOS X64 (Intel芯片)https://oss-chat2db.alibaba.com/release/1.0.11/Chat2DB-1.0.11.dmg
Jar包https://oss-chat2db.alibaba.com/release/1.0.11/ali-dbhub-server-start.jar
+

下载安装完成之后,只需要在设置页面配置OpenAI的key,即可开始使用,需要本机开启代理!

+

image-20230628113939784

+

image-20230628114129293

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/AI\346\250\241\345\236\213\345\244\247PK/index.html" "b/AI\346\250\241\345\236\213\345\244\247PK/index.html" index e69de29bb2..5573052595 100644 --- "a/AI\346\250\241\345\236\213\345\244\247PK/index.html" +++ "b/AI\346\250\241\345\236\213\345\244\247PK/index.html" @@ -0,0 +1,624 @@ + + + + + + + + + + + + AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

🤖AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

近年来,大型语言模型(LLM)的发展日新月异,各大科技巨头和研究机构纷纷推出了自己的聊天机器人。那么,如何才能知道哪个模型更强大、更智能呢?现在,有了一个绝佳的机会!

+

🏆LMSYS Chatbot Arena:AI模型的终极对决

LMSYS Chatbot Arena是一个免费的在线平台,允许用户通过提问来测试和比较多达36款不同的顶级语言模型。这些模型来自各大科技公司和研究机构,包括Google的Gemma、OpenAI的GPT-4-Turbo等。

+

🥊竞技场挑战:你来当裁判

在LMSYS Chatbot Arena,你可以扮演裁判的角色。你可以向两个匿名的聊天模型提出各种问题,然后根据它们的回答质量,投票决定哪个模型更加优秀。这是一个与AI直接互动、了解它们能力的绝佳机会。

+

📊Elo排行榜:看看谁是AI界的王者

通过汇总超过500,000个用户的投票结果,LMSYS Chatbot Arena使用Elo等级分系统,生成了一个实时更新的LLM排行榜。你可以看到各个模型的排名变化,了解当前AI界的王者是谁。这个排行榜为我们提供了一个客观、公平的评判标准。

+

🌟模型多样性:各显神通

LMSYS Chatbot Arena上有多达36个不同的语言模型参与角逐,它们来自Google、OpenAI、Anthropic等不同的公司和机构。每个模型都有自己独特的训练方式和专长领域。通过在Arena中与它们互动,你可以全方位地了解当前AI技术的发展水平。

+

🎯总结:免费体验顶尖AI的绝佳平台

LMSYS Chatbot Arena为我们提供了一个免费、有趣、多样的平台,让我们能够亲身体验和评判当前最先进的语言模型。无论你是AI专家、开发者,还是对人工智能感兴趣的普通用户,这个网站都值得一试。快来当一回裁判,看看哪个AI模型能够脱颖而出,赢得你的青睐吧!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Aria2\345\277\253\351\200\237\346\220\255\345\273\272/index.html" "b/Aria2\345\277\253\351\200\237\346\220\255\345\273\272/index.html" index e69de29bb2..48668c71ea 100644 --- "a/Aria2\345\277\253\351\200\237\346\220\255\345\273\272/index.html" +++ "b/Aria2\345\277\253\351\200\237\346\220\255\345\273\272/index.html" @@ -0,0 +1,696 @@ + + + + + + + + + + + + Aria2配合Alist实现百度云盘高速下载 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20230104134543066

+

前言

Aria2

Aria2 是目前最强大的全能型下载工具,它支持 BT、磁力、HTTP、FTP 等下载协议,常用做离线下载的服务端。目前有非常多的 Aria2 Docker 方案,大多都整合了 We­bUI 和文件管理功能,看似很好很强大,实际上都只是做了简单的打包的工作,完全没有考虑到核心的下载体验和资源占用等问题。这也导致很多人在初次使用 Aria2 时会遇到 BT 下载无速度、文件残留占用空间、任务丢失等问题,所以会觉得 Aria2 并不好用,但事实并非如此。

+

Alist

Alist是一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动。

+

启动脚本

Aria2的docker compose启动脚本,自行替换RPC密钥即可!

+
version: "3.8"
+
+services:
+
+  Aria2-Pro:
+    container_name: aria2-pro
+    image: p3terx/aria2-pro
+    environment:
+      - PUID=65534
+      - PGID=65534
+      - UMASK_SET=022
+      - RPC_SECRET=<自行设置RPC密钥>
+      - RPC_PORT=6800
+      - LISTEN_PORT=6888
+      - DISK_CACHE=64M
+      - IPV6_MODE=false
+      - UPDATE_TRACKERS=true
+      - CUSTOM_TRACKER_URL=
+      - TZ=Asia/Shanghai
+      - SPECIAL_MODE=rclone
+    volumes:
+      - ${PWD}/aria2-config:/config
+      - ${PWD}/aria2-downloads:/downloads
+# If you use host network mode, then no port mapping is required.
+# This is the easiest way to use IPv6 networks.
+    network_mode: host
+#    network_mode: bridge
+#    ports:
+#      - 6800:6800
+#      - 6888:6888
+#      - 6888:6888/udp
+    restart: unless-stopped
+# Since Aria2 will continue to generate logs, limit the log size to 1M to prevent your hard disk from running out of space.
+    logging:
+      driver: json-file
+      options:
+        max-size: 1m
+
+# AriaNg is just a static web page, usually you only need to deploy on a single host.
+  AriaNg:
+    container_name: ariang
+    image: p3terx/ariang
+    command: --port 6880 --ipv6
+    network_mode: host
+#    network_mode: bridge
+#    ports:
+#      - 6880:6880
+    restart: unless-stopped
+    logging:
+      driver: json-file
+      options:
+        max-size: 1m
+
+

Alist的docker启动脚本

+
docker run -d --restart=always -v /wangwang/alist:/opt/alist/data -p 5244:5244 --name="alist" xhofe/alist:v3.0.0-rc.1
+
+

配置

访问搭建的AriaNg页面,http://{ip}:6880,新建RPC配置如下

+

image-20230104133954000

+

访问搭建的Alist页面,http://{ip}:5244,配置Aria2地址

+

image-20230104134205560

+

image-20230104134236880

+

然后选中文件,推送到Aria2下载即可

+

image-20230104134337258

+

使用教程

详细配置请参考官方文档!!

+

Aria2参考文档:Aria2 Pro - 更好用的 Aria2 Docker 容器镜像 - P3TERX ZONE

+

Alist参考文档:Guide | AList文档 (nn.ci)

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Azure OpenAI \347\224\263\350\257\267\344\270\216\344\275\277\347\224\250\350\257\246\347\273\206\346\225\231\347\250\213/index.html" "b/Azure OpenAI \347\224\263\350\257\267\344\270\216\344\275\277\347\224\250\350\257\246\347\273\206\346\225\231\347\250\213/index.html" index e69de29bb2..e4f546f76f 100644 --- "a/Azure OpenAI \347\224\263\350\257\267\344\270\216\344\275\277\347\224\250\350\257\246\347\273\206\346\225\231\347\250\213/index.html" +++ "b/Azure OpenAI \347\224\263\350\257\267\344\270\216\344\275\277\347\224\250\350\257\246\347\273\206\346\225\231\347\250\213/index.html" @@ -0,0 +1,684 @@ + + + + + + + + + + + + Azure OpenAI申请与使用详细教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Azure OpenAI 和 OpenAI 官方提供的服务基本是一致的,但是目前前者还是处于预览版的状态,一些功能还没有完全开放。

+

优点:

+
    +
  • 不受地域限制,国内可以直接调用。
  • +
  • 可以自己上传训练数据进行训练(据说很贵)。
  • +
  • Azure 多语言 SDK 支持。
  • +
  • 更适合企业私有化,数据可完全控制删除。
  • +
+

缺点:

+
    +
  • 部分功能未开放,但 ChatGPT 的功能是没问题的。
  • +
  • 和 OpenAI 官方的 API 标准有差异,无法直接用一些只支持 OpenAI 官方API 的开源项目。
  • +
+

前提

    +
  • Azure 订阅 - 免费创建订阅
  • +
  • 已在所需的 Azure 订阅中授予对 Azure OpenAI 的访问权限。
  • +
  • 已部署模型的 Azure OpenAI 资源。 有关模型部署的详细信息,请参阅资源部署指南
  • +
+

申请教程

第一种方案

目前,仅应用程序授予对此服务的访问权限。 可以通过在 https://aka.ms/oai/access 上填写表单来申请对 Azure OpenAI 的访问权限。 若有企业信息,全部按真实信息填写即可,等待2-10天即可收到通过的邮件

+

第二种方案

前提:

+

教育邮箱

+

Azure拥有一个订阅(最好是学生订阅)

+

申请步骤

+

1.访问https://aka.ms/oai/access,按下图填写相关信息,最后23,25看个人是否申请,进行勾选.

+

image-20230422065112939

+

image-20230422065122312

+

image-20230422065133513

+

image-20230422065144781

+

image-20230422065155254

+

image-20230422065214806

+

image-20230422065235476

+

2.前往azure登录,获取订阅ID

+

image-20230422064518458

+

3.等待官方邮件即可,我测试了两次,均在第三天审核通过,若要补充资料,则说明审核失败.

+

配置Azure OpenAI

1.创建服务

进入 Azure 后,直接搜索OpenAI

+

image-20230417194048098

+

若是已经通过,这里即可选择订阅,否则会在下方提示让你申请

+

image-20230417194155071

+

2.创建模型部署

在资源管理->模型部署 选择需要的模型进行创建,每个模型只能创建1个部署。

+

image-20230417194251588

+

部署完成之后,点击Azure OpenAI Studio即可进行测试

+

image-20230417194400525

+

如下所示!

+

image-20230417194452117

+

3.API调用

很多小伙伴是需要用第三方服务部署的,需要的内容可以在 资源管理->密钥和终结点 可以获取 API 地址以及调用密钥。

+

image-20230330104847592

+

最后

相信以上教程已经足够让小伙伴们申请到自己的Azure OpenAI服务了!

+

有需要进交流群的可以加我,备注AI即可!

+

image-20230417194824820

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ChatGPT \345\234\250\347\272\277\344\275\223\351\252\214\347\275\221\347\253\231/index.html" "b/ChatGPT \345\234\250\347\272\277\344\275\223\351\252\214\347\275\221\347\253\231/index.html" index e69de29bb2..9065c8e285 100644 --- "a/ChatGPT \345\234\250\347\272\277\344\275\223\351\252\214\347\275\221\347\253\231/index.html" +++ "b/ChatGPT \345\234\250\347\272\277\344\275\223\351\252\214\347\275\221\347\253\231/index.html" @@ -0,0 +1,1860 @@ + + + + + + + + + + + + ChatGPT 在线体验网站 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

ChatGPT 在线体验网站

众所周知,国内访问并体验 ChatGPT 拥有一定的门槛,主要受限于网络无法访问、账号无法注册等条件。然而对于突破该约束条件的同学来说,可以很轻松的使用开源程序搭建基于 OPENAI API 的在线应用网站。

+

旨在搜集整理国内用户可访问的基于 OPENAI API 开发的在线应用列表,以供条件受限的同学参考使用。

+

站点列表

⭐ 推荐星级。默认一星。免费、无需代理、无需 KEY,可增加星级
+⛔ 0星标记。表示可访问,但功能暂不可用、使用受限等
+🔑 需输入API KEY。可使用自己的 KEY(**应谨慎使用,避免您的 API KEY 泄露**)
+🚀 需代理。可代理登录、免费试用
+🔒 需登录。注册账号时请仔细甄别相关页面,不要使用常用密码
+💰 需付费。请仔细识别,谨防受骗
+❓ 需手动验证。访问异常、不确定是否失效、程序探测无法访问等
+❌ 已失效。会在失效一段时间后移除
+
+

站点列表(1227):

+
    +
  1. [⭐⭐] https://chat.binjie.site:7777
  2. +
  3. [⭐⭐] https://chat.yqcloud.top
  4. +
  5. [⭐⭐] https://www.aitoolgpt.com
  6. +
  7. [⭐⭐] https://www.chatsverse.xyz
  8. +
  9. [⭐] https://chat.ninvfeng.xyz
  10. +
  11. [⭐] http://chat.apigpt.cn
  12. +
  13. [⭐] http://chatgpt.mhacd.com
  14. +
  15. [⭐] http://gpt.mxnf.store
  16. +
  17. [⭐] http://itecheasy.com.cn
  18. +
  19. [⭐] https://1.hktwilight.eu.org
  20. +
  21. [⭐] https://2618.eu.org
  22. +
  23. [⭐] https://6758tkma.chattobot.xyz
  24. +
  25. [⭐] https://676888.xyz
  26. +
  27. [⭐] https://94gpt.com
  28. +
  29. [⭐] https://ai-toolbox.codefuture.top
  30. +
  31. [⭐] https://ai.6ix.com
  32. +
  33. [⭐] https://ai.aiyuanyuzhou.com
  34. +
  35. [⭐] https://ai.anlu.fun
  36. +
  37. [⭐] https://ai.bigtear.com
  38. +
  39. [⭐] https://ai.chilfish.top
  40. +
  41. [⭐] https://ai.czhuangjia.top
  42. +
  43. [⭐] https://ai.gjwa.ml
  44. +
  45. [⭐] https://ai.hixqz.com
  46. +
  47. [⭐] https://ai.i-misaka.com
  48. +
  49. [⭐] https://ai.jiangyuesong.me
  50. +
  51. [⭐] https://ai.liuks.cn
  52. +
  53. [⭐] https://ai.lpsee.com
  54. +
  55. [⭐] https://ai.raywang.win
  56. +
  57. [⭐] https://ai.w2aa.ga
  58. +
  59. [⭐] https://ai.wilsonmk.xyz
  60. +
  61. [⭐] https://ai.wlei.cc
  62. +
  63. [⭐] https://ai.yiios.com
  64. +
  65. [⭐] https://ai.yougan.cc
  66. +
  67. [⭐] https://ai.zecoba.cn
  68. +
  69. [⭐] https://ai117.com 403 - Forbidden
  70. +
  71. [⭐] https://aiartchat.live
  72. +
  73. [⭐] https://aigcfun.com
  74. +
  75. [⭐] https://aihelper.qiming.info
  76. +
  77. [⭐] https://aisiwangrobot.cnm
  78. +
  79. [⭐] https://aitools.fans
  80. +
  81. [⭐] https://aitools.run
  82. +
  83. [⭐] https://aiv.erbanku.com
  84. +
  85. [⭐] https://askai.ws
  86. +
  87. [⭐] https://askopenai.cn
  88. +
  89. [⭐] https://askwhyai.xyz
  90. +
  91. [⭐] https://bengbu.icu
  92. +
  93. [⭐] https://bot.abc123.site
  94. +
  95. [⭐] https://bot.oho.cool
  96. +
  97. [⭐] https://bot.sy1120.top
  98. +
  99. [⭐] https://c.imzbb.cc
  100. +
  101. [⭐] https://cc.676888.xyz
  102. +
  103. [⭐] https://cf.xssio.cf
  104. +
  105. [⭐] https://chat-langchainjs.fly.dev
  106. +
  107. [⭐] https://chat-simplifier.imzbb.cc 聊天简化器
  108. +
  109. [⭐] https://chat.199107.xyz
  110. +
  111. [⭐] https://chat.1kcode.com
  112. +
  113. [⭐] https://chat.417521.xyz
  114. +
  115. [⭐] https://chat.51buygpt.com
  116. +
  117. [⭐] https://chat.594144.xyz
  118. +
  119. [⭐] https://chat.abc123.site
  120. +
  121. [⭐] https://chat.aigc101.net
  122. +
  123. [⭐] https://chat.alanwang.site
  124. +
  125. [⭐] https://chat.aurai.online
  126. +
  127. [⭐] https://chat.bingsight.com
  128. +
  129. [⭐] https://chat.bpcc.club
  130. +
  131. [⭐] https://chat.caoayu.top
  132. +
  133. [⭐] https://chat.cblueu.cn
  134. +
  135. [⭐] https://chat.chatgptworld.net
  136. +
  137. [⭐] https://chat.chlorine.site
  138. +
  139. [⭐] https://chat.closeai.me
  140. +
  141. [⭐] https://chat.cosine.ren
  142. +
  143. [⭐] https://chat.ctcd.cc
  144. +
  145. [⭐] https://chat.cyihx.me
  146. +
  147. [⭐] https://chat.dingqian.net
  148. +
  149. [⭐] https://chat.dnat.cn
  150. +
  151. [⭐] https://chat.drz.ink
  152. +
  153. [⭐] https://chat.dsdog.tk
  154. +
  155. [⭐] https://chat.e7.work
  156. +
  157. [⭐] https://chat.eaten.fun
  158. +
  159. [⭐] https://chat.eryajf.net
  160. +
  161. [⭐] https://chat.exi.software
  162. +
  163. [⭐] https://chat.fcc.cm
  164. +
  165. [⭐] https://chat.feelapi.com
  166. +
  167. [⭐] https://chat.feiyihe.net
  168. +
  169. [⭐] https://chat.forchange.cn
  170. +
  171. [⭐] https://chat.geekr.cool 支持语音的免费体验版ChatGPT
  172. +
  173. [⭐] https://chat.gog.one
  174. +
  175. [⭐] https://chat.gow66.tech
  176. +
  177. [⭐] https://chat.gptku.com
  178. +
  179. [⭐] https://chat.gptly.net
  180. +
  181. [⭐] https://chat.h7ml.cn
  182. +
  183. [⭐] https://chat.hcvps.cn
  184. +
  185. [⭐] https://chat.howen.ink
  186. +
  187. [⭐] https://chat.icelo.cn
  188. +
  189. [⭐] https://chat.internetip.cn
  190. +
  191. [⭐] https://chat.irss.eu.org
  192. +
  193. [⭐] https://chat.isekaijoucho.moe
  194. +
  195. [⭐] https://chat.javaex.cn
  196. +
  197. [⭐] https://chat.jingran.vip
  198. +
  199. [⭐] https://chat.kollykolly.cn
  200. +
  201. [⭐] https://chat.kurox.cn
  202. +
  203. [⭐] https://chat.laijiahao.cn
  204. +
  205. [⭐] https://chat.laravel.icu
  206. +
  207. [⭐] https://chat.leoku.top
  208. +
  209. [⭐] https://chat.leonas.dev
  210. +
  211. [⭐] https://chat.liming.ml
  212. +
  213. [⭐] https://chat.limy.space
  214. +
  215. [⭐] https://chat.livepo.top
  216. +
  217. [⭐] https://chat.lktuchaung.buzz
  218. +
  219. [⭐] https://chat.locationwith.com
  220. +
  221. [⭐] https://chat.lucascool.social
  222. +
  223. [⭐] https://chat.luoyangshusheng.com
  224. +
  225. [⭐] https://chat.m1saka.eu.org
  226. +
  227. [⭐] https://chat.meizux.ga
  228. +
  229. [⭐] https://chat.miantiao.me
  230. +
  231. [⭐] https://chat.milomoon.com
  232. +
  233. [⭐] https://chat.moyunav.com
  234. +
  235. [⭐] https://chat.ngx.sh
  236. +
  237. [⭐] https://chat.nxwow.cn
  238. +
  239. [⭐] https://chat.oaker.bid
  240. +
  241. [⭐] https://chat.opencf.xyz
  242. +
  243. [⭐] https://chat.outxu.cn
  244. +
  245. [⭐] https://chat.pedroz.app
  246. +
  247. [⭐] https://chat.pedroz.eu.org
  248. +
  249. [⭐] https://chat.qqxnas1.top
  250. +
  251. [⭐] https://chat.qsq.one
  252. +
  253. [⭐] https://chat.quietrocket.com
  254. +
  255. [⭐] https://chat.rmb.run
  256. +
  257. [⭐] https://chat.rogepi.xyz
  258. +
  259. [⭐] https://chat.rossroma.com
  260. +
  261. [⭐] https://chat.sciencat.net
  262. +
  263. [⭐] https://chat.sicer.top
  264. +
  265. [⭐] https://chat.sky350.com
  266. +
  267. [⭐] https://chat.skynetx007.top
  268. +
  269. [⭐] https://chat.suansuanru.top
  270. +
  271. [⭐] https://chat.terwer.space
  272. +
  273. [⭐] https://chat.tiabless.com
  274. +
  275. [⭐] https://chat.tradergalax.xyz
  276. +
  277. [⭐] https://chat.umaske.com
  278. +
  279. [⭐] https://chat.wangyaodi.com
  280. +
  281. [⭐] https://chat.wtko1.icu
  282. +
  283. [⭐] https://chat.xbdsky.cn
  284. +
  285. [⭐] https://chat.xixiovo.com
  286. +
  287. [⭐] https://chat.xssio.cf
  288. +
  289. [⭐] https://chat.yougan.cc
  290. +
  291. [⭐] https://chat.zaunist.com
  292. +
  293. [⭐] https://chat.zengzhe.xyz
  294. +
  295. [⭐] https://chat.zez.ee
  296. +
  297. [⭐] https://chat.zhahang.ml
  298. +
  299. [⭐] https://chat.zhenghaoyun.cn
  300. +
  301. [⭐] https://chat1.osfpu.com
  302. +
  303. [⭐] https://chat2.dingqian.net
  304. +
  305. [⭐] https://chat2.jingran.vip
  306. +
  307. [⭐] https://chat35.com/chat
  308. +
  309. [⭐] https://chat4u.me
  310. +
  311. [⭐] https://chatai.whg6.com
  312. +
  313. [[⭐] https://chatgpt-demo-pw2ps0ci-lsqs2022.4everland.app)
    https://chatgpt-demo-7.4everland.app
    [https://chatgpt-demo-7.4everland.app)
  314. +
  315. [⭐] https://chatgpt-demo.ainetshop.com
  316. +
  317. [⭐] https://chatgpt-demo.wangziyi.xyz
  318. +
  319. [⭐] https://chatgpt-flutter.h7ml.cn
  320. +
  321. [⭐] https://chatgpt-with-key.yongmai.xyz
  322. +
  323. [⭐] https://chatgpt.021d.com
  324. +
  325. [⭐] https://chatgpt.404name.top
  326. +
  327. [⭐] https://chatgpt.930621.xyz
  328. +
  329. [⭐] https://chatgpt.acos.one
  330. +
  331. [⭐] https://chatgpt.adwangmai.com
  332. +
  333. [⭐] https://chatgpt.ago88.com
  334. +
  335. [⭐] https://chatgpt.aydengen.com
  336. +
  337. [⭐] https://chatgpt.bowlofnoodles.top
  338. +
  339. [⭐] https://chatgpt.busiyi.world
  340. +
  341. [⭐] https://chatgpt.canbingzt.com
  342. +
  343. [⭐] https://chatgpt.curlybrackets.space
  344. +
  345. [⭐] https://chatgpt.daysdream.one
  346. +
  347. [⭐] https://chatgpt.daysdream.top
  348. +
  349. [⭐] https://chatgpt.ddiu.io
  350. +
  351. [⭐] https://chatgpt.ddiu.me
  352. +
  353. [⭐] https://chatgpt.deniffer.com
  354. +
  355. [⭐] https://chatgpt.eclipsewww.tech
  356. +
  357. [⭐] https://chatgpt.eclipsewww.xyz
  358. +
  359. [⭐] https://chatgpt.github56796590.me
  360. +
  361. [⭐] https://chatgpt.haomingzi.net/ChatGPT.html
  362. +
  363. [⭐] https://chatgpt.ideo.dev
  364. +
  365. [⭐] https://chatgpt.imzcc.com
  366. +
  367. [⭐] https://chatgpt.intdouble.com
  368. +
  369. [⭐] https://chatgpt.jaylee.cn
  370. +
  371. [⭐] https://chatgpt.jellybeans.love
  372. +
  373. [⭐] https://chatgpt.jerryfage.top
  374. +
  375. [⭐] https://chatgpt.jingbh.cloud
  376. +
  377. [⭐] https://chatgpt.kissopener.ml
  378. +
  379. [⭐] https://chatgpt.lxzh.app
  380. +
  381. [⭐] https://chatgpt.moeyy.cn
  382. +
  383. [⭐] https://chatgpt.moeyy.xyz
  384. +
  385. [⭐] https://chatgpt.moinkhao.me
  386. +
  387. [⭐] https://chatgpt.nahida520.top
  388. +
  389. [⭐] https://chatgpt.outshine.me
  390. +
  391. [⭐] https://chatgpt.pengbokeji.cn
  392. +
  393. [⭐] https://chatgpt.ppt6666.com
  394. +
  395. [⭐] https://chatgpt.revincx.icu
  396. +
  397. [⭐] https://chatgpt.sep.gay
  398. +
  399. [⭐] https://chatgpt.sometimes.cool
  400. +
  401. [⭐] https://chatgpt.suwanya.cn
  402. +
  403. [⭐] https://chatgpt.svxte.ch
  404. +
  405. [⭐] https://chatgpt.text-input1234.tk
  406. +
  407. [⭐] https://chatgpt.vcanbb.top
  408. +
  409. [⭐] https://chatgpt.whg6.com
  410. +
  411. [⭐] https://chatgpt.white-peach.ga
  412. +
  413. [⭐] https://chatgpt.yuexun.me
  414. +
  415. [⭐] https://chatgpt.zhanhongzhu.top
  416. +
  417. [⭐] https://chatgpt.zwhi.top
  418. +
  419. [⭐] https://chatgpt1111-2.4everland.app
  420. +
  421. [⭐] https://chatgpt123.fyi
  422. +
  423. [⭐] https://chilloutai.com 你的虚拟女友
  424. +
  425. [⭐] https://coplus.crowai.xyz
  426. +
  427. [⭐] https://danielzhang.dynv6.net
  428. +
  429. [⭐] https://demo.021d.com
  430. +
  431. [⭐] https://dusk.chat
  432. +
  433. [⭐] https://ecust1024.nl
  434. +
  435. [⭐] https://eva.rootftw.com
  436. +
  437. [⭐] https://freechatgpt.chat
  438. +
  439. [⭐] https://freeharvest.vip
  440. +
  441. [⭐] https://ftcl.site
  442. +
  443. [⭐] https://github.com/MC-dusk/chatgpt-vercel
  444. +
  445. [⭐] https://gpt-for-me.slimmonkey.net
  446. +
  447. [⭐] https://gpt-prompts.xyz
  448. +
  449. [⭐] https://gpt.52shell.ltd
  450. +
  451. [⭐] https://gpt.71xun.com
  452. +
  453. [⭐] https://gpt.dofine.xyz
  454. +
  455. [⭐] https://gpt.exci.me
  456. +
  457. [⭐] https://gpt.finde.fun
  458. +
  459. [⭐] https://gpt.h7ml.cn
  460. +
  461. [⭐] https://gpt.icepie.net
  462. +
  463. [⭐] https://gpt.kylemclaren.com
  464. +
  465. [⭐] https://gpt.lacknb.cn
  466. +
  467. [⭐] https://gpt.leeapps.cn
  468. +
  469. [⭐] https://gpt.loongphy.com
  470. +
  471. [⭐] https://gpt.openhex.cn
  472. +
  473. [⭐] https://gpt.sheepig.top/chat
  474. +
  475. [⭐] https://gpt.simimi.cn
  476. +
  477. [⭐] https://gpt.tool00.com
  478. +
  479. [⭐] https://gpt.toolkit.show
  480. +
  481. [⭐] https://gpt.zhheo.com
  482. +
  483. [⭐] https://gpt2.811188.xyz
  484. +
  485. [⭐] https://gpt2.pedroz.eu.org
  486. +
  487. [⭐] https://gptcc.cc
  488. +
  489. [⭐] https://gptnb.top
  490. +
  491. [⭐] https://gptplus.yongmai.xyz
  492. +
  493. [⭐] https://guaguawa.eu.org
  494. +
  495. [⭐] https://harry-potter.openai-lab.co
  496. +
  497. [⭐] https://hi.icu
  498. +
  499. [⭐] https://hon.huluxia.ga
  500. +
  501. [⭐] https://hoofthrower.com
  502. +
  503. [⭐] https://howenbackup.top
  504. +
  505. [⭐] https://hub.docker.com/r/quzard/chatgpt-demo
  506. +
  507. [⭐] https://jincheng.wiki
  508. +
  509. [⭐] https://justrrry.xyz
  510. +
  511. [⭐] https://kais.live
  512. +
  513. [⭐] https://kang.al
  514. +
  515. [⭐] https://kehangbio.com
  516. +
  517. [⭐] https://lazyboy.top
  518. +
  519. [⭐] https://linyu.wwang.eu.org
  520. +
  521. [⭐] https://luqman.chat
  522. +
  523. [⭐] https://lwray.top
  524. +
  525. [⭐] https://lyuhang.top
  526. +
  527. [⭐] https://maigpt.nanamimai.top
  528. +
  529. [⭐] https://majiangnp.top
  530. +
  531. [⭐] https://meturing.top
  532. +
  533. [⭐] https://michat.yunshangbandao.top
  534. +
  535. [⭐] https://my-chatgpt-eosin.vercel.app
  536. +
  537. [⭐] https://mygpt.moinkhao.me
  538. +
  539. [⭐] https://new.dusk.chat
  540. +
  541. [⭐] https://newgpt3-5.chattobot.xyz
  542. +
  543. [⭐] https://nvtest.xyz
  544. +
  545. [⭐] https://one.ie
  546. +
  547. [⭐] https://open-gpt.app 立即使用海量的 ChatGPT 应用,或在几秒钟内创建属于自己的应用
  548. +
  549. [⭐] https://openaizh.com/chatgpt.html
  550. +
  551. [⭐] https://ptrain666.site
  552. +
  553. [⭐] https://qa.js.cn
  554. +
  555. [⭐] https://qylxschool.cn
  556. +
  557. [⭐] https://sangao.com
  558. +
  559. [⭐] https://sc.pandazki.im
  560. +
  561. [⭐] https://scn.pandazki.im
  562. +
  563. [⭐] https://sherlock.emreisik.dev 404 - Not Found
  564. +
  565. [⭐] https://shifeiti.pro
  566. +
  567. [⭐] https://showcase.pandazki.im
  568. +
  569. [⭐] https://sotai.cc
  570. +
  571. [⭐] https://susu.email
  572. +
  573. [⭐] https://t.chate.chat
  574. +
  575. [⭐] https://talk.xiu.ee
  576. +
  577. [⭐] https://trychatgp.com
  578. +
  579. [⭐] https://vip.8eth.cc
  580. +
  581. [⭐] https://weekdaycare.cf
  582. +
  583. [⭐] https://wordstory.streamlit.app 使用OpenAI ChatGPT为你的英语单词编故事
  584. +
  585. [⭐] https://www.021d.com
  586. +
  587. [⭐] https://www.676888.xyz
  588. +
  589. [⭐] https://www.aiartchat.live
  590. +
  591. [⭐] https://www.aicodehelper.com
  592. +
  593. [⭐] https://www.aisiwangrobot.cnm
  594. +
  595. [⭐] https://www.aitools.fans
  596. +
  597. [⭐] https://www.askopenai.cn
  598. +
  599. [⭐] https://www.askwhyai.xyz
  600. +
  601. [⭐] https://www.chat4u.me
  602. +
  603. [⭐] https://www.chatgpt123.fyi
  604. +
  605. [⭐] https://www.codeink.ink
  606. +
  607. [⭐] https://www.dusk.chat
  608. +
  609. [⭐] https://www.ecust1024.nl
  610. +
  611. [⭐] https://www.freeharvest.vip
  612. +
  613. [⭐] https://www.fssflyang.icu
  614. +
  615. [⭐] https://www.ftcl.site
  616. +
  617. [⭐] https://www.gpt-prompts.xyz
  618. +
  619. [⭐] https://www.gptcc.cc
  620. +
  621. [⭐] https://www.hoofthrower.com
  622. +
  623. [⭐] https://www.howenbackup.top
  624. +
  625. [⭐] https://www.imgpt.top
  626. +
  627. [⭐] https://www.jincheng.wiki
  628. +
  629. [⭐] https://www.justrrry.xyz
  630. +
  631. [⭐] https://www.kais.live
  632. +
  633. [⭐] https://www.kang.al
  634. +
  635. [⭐] https://www.kehangbio.com
  636. +
  637. [⭐] https://www.lazyboy.top
  638. +
  639. [⭐] https://www.luqman.chat
  640. +
  641. [⭐] https://www.lwray.top
  642. +
  643. [⭐] https://www.lyuhang.top
  644. +
  645. [⭐] https://www.majiangnp.top
  646. +
  647. [⭐] https://www.meout.app Find your next outing in seconds
  648. +
  649. [⭐] https://www.meturing.top
  650. +
  651. [⭐] https://www.mulaen.com
  652. +
  653. [⭐] https://www.nvtest.xyz
  654. +
  655. [⭐] https://www.ptrain666.site
  656. +
  657. [⭐] https://www.qylxschool.cn
  658. +
  659. [⭐] https://www.sangao.com
  660. +
  661. [⭐] https://www.saysome.top
  662. +
  663. [⭐] https://www.shifeiti.pro
  664. +
  665. [⭐] https://www.sotai.cc
  666. +
  667. [⭐] https://www.speakwithgodnow.com 404 - Not Found
  668. +
  669. [⭐] https://www.suomeimei.top
  670. +
  671. [⭐] https://www.teach-anything.com Teach you Anything in seconds
  672. +
  673. [⭐] https://www.weekdaycare.cf
  674. +
  675. [⭐] https://www.ydzykt.cn
  676. +
  677. [⭐] https://www.ytliu.top
  678. +
  679. [⭐] https://www.zcc.app
  680. +
  681. [⭐] https://www.zhenghaoyun.cn
  682. +
  683. [⭐] https://x.chate.chat
  684. +
  685. [⭐] https://xc.com
  686. +
  687. [⭐] https://ytliu.top
  688. +
  689. [⭐] https://zcc.app
  690. +
  691. [⭐] https://zhenghaoyun.cn
  692. +
  693. [⭐] https://zhoubaotong.com/zh 周报通
  694. +
  695. [⭐] https://www.chat2ai.cn
  696. +
  697. [⭐⭐🔑] https://chatgpt.hswmartin.top
  698. +
  699. [🔑] https://chat.hswmartin.top
  700. +
  701. [🔑] https://chatwithgpt.netlify.app
  702. +
  703. [🔑] https://freegpt.cc
  704. +
  705. [🔑] https://lzwme-gpt.netlify.app
  706. +
  707. [🔑] https://playground.openaikey.xyz
  708. +
  709. [🔑] https://weeklyreport.avemaria.fun 周报生成器。仅于周一、五、六、日免费使用,其余时间自备 OpenAI API Key
  710. +
  711. [🔑] https://www.wbs003.world
  712. +
  713. [💰] https://chat.alpaca-bi.com
  714. +
  715. [💰] https://chat.paoying.net
  716. +
  717. [🔒] https://ai.nocmt.com
  718. +
  719. [🔒] https://chat.supperjoy.online
  720. +
  721. [🔒] https://chat.up4dev.com
  722. +
  723. [🔒] https://chat.xiexie.me
  724. +
  725. [🔒] https://chat.xinyu.today
  726. +
  727. [🔒] https://chat.zecoba.cn
  728. +
  729. [🔒] https://chatgpt.aibi.one
  730. +
  731. [🔒] https://gpt.lzw.me
  732. +
  733. [🚀] https://20230304v2.vercel.app
  734. +
  735. [🚀] https://ai-bigtear-com.vercel.app
  736. +
  737. [🚀] https://ai-ls-ai-ls.vercel.app
  738. +
  739. [🚀] https://askwhy.vercel.app
  740. +
  741. [🚀] https://caht-gpt.vercel.app
  742. +
  743. [🚀] https://chat-ai-flame.vercel.app
  744. +
  745. [🚀] https://chat-ai-virid.vercel.app
  746. +
  747. [🚀] https://chat-demo-bpcc.vercel.app
  748. +
  749. [🚀] https://chat-eosin-three.vercel.app
  750. +
  751. [🚀] https://chat-gpt-coral-alpha.vercel.app
  752. +
  753. [🚀] https://chat-robot.vercel.app
  754. +
  755. [🚀] https://chat-songxff.vercel.app
  756. +
  757. [🚀] https://chatgpt-111-vpfi.vercel.app
  758. +
  759. [🚀] https://chatgpt-3-5-mmyyais.vercel.app
  760. +
  761. [🚀] https://chatgpt-404gods.vercel.app
  762. +
  763. [🚀] https://chatgpt-6102yk.vercel.app
  764. +
  765. [🚀] https://chatgpt-alexli.vercel.app
  766. +
  767. [🚀] https://chatgpt-assistant-steel.vercel.app
  768. +
  769. [🚀] https://chatgpt-ayuayue.vercel.app
  770. +
  771. [🚀] https://chatgpt-bot-seven.vercel.app
  772. +
  773. [🚀] https://chatgpt-chatbot-1.vercel.app
  774. +
  775. [🚀] https://chatgpt-chi-ochre.vercel.app
  776. +
  777. [🚀] https://chatgpt-china.vercel.app
  778. +
  779. [🚀] https://chatgpt-cyan-phi.vercel.app
  780. +
  781. [🚀] https://chatgpt-demo-1-omega.vercel.app
  782. +
  783. [🚀] https://chatgpt-demo-1.vercel.app
  784. +
  785. [🚀] https://chatgpt-demo-2.vercel.app
  786. +
  787. [🚀] https://chatgpt-demo-2rwv.vercel.app
  788. +
  789. [🚀] https://chatgpt-demo-6ix.vercel.app
  790. +
  791. [🚀] https://chatgpt-demo-a78cat.vercel.app
  792. +
  793. [🚀] https://chatgpt-demo-alistertt.vercel.app
  794. +
  795. [🚀] https://chatgpt-demo-amber.vercel.app
  796. +
  797. [🚀] https://chatgpt-demo-aydengen.vercel.app
  798. +
  799. [🚀] https://chatgpt-demo-azure.vercel.app
  800. +
  801. [🚀] https://chatgpt-demo-bay-omega.vercel.app
  802. +
  803. [🚀] https://chatgpt-demo-bay.vercel.app
  804. +
  805. [🚀] https://chatgpt-demo-beryl.vercel.app
  806. +
  807. [🚀] https://chatgpt-demo-beta-one.vercel.app
  808. +
  809. [🚀] https://chatgpt-demo-beta-seven.vercel.app
  810. +
  811. [🚀] https://chatgpt-demo-bit.vercel.app
  812. +
  813. [🚀] https://chatgpt-demo-blond.vercel.app
  814. +
  815. [🚀] https://chatgpt-demo-blue-phi.vercel.app
  816. +
  817. [🚀] https://chatgpt-demo-blue-tau.vercel.app
  818. +
  819. [🚀] https://chatgpt-demo-blue.vercel.app
  820. +
  821. [🚀] https://chatgpt-demo-boysusu.vercel.app
  822. +
  823. [🚀] https://chatgpt-demo-buzuosheng.vercel.app
  824. +
  825. [🚀] https://chatgpt-demo-chi-jet.vercel.app
  826. +
  827. [🚀] https://chatgpt-demo-chi-two.vercel.app
  828. +
  829. [🚀] https://chatgpt-demo-chris-kin.vercel.app
  830. +
  831. [🚀] https://chatgpt-demo-cola-sys.vercel.app
  832. +
  833. [🚀] https://chatgpt-demo-cololi.vercel.app
  834. +
  835. [🚀] https://chatgpt-demo-coral.vercel.app
  836. +
  837. [🚀] https://chatgpt-demo-crsec.vercel.app
  838. +
  839. [🚀] https://chatgpt-demo-cyan-eight.vercel.app
  840. +
  841. [🚀] https://chatgpt-demo-delta.vercel.app
  842. +
  843. [🚀] https://chatgpt-demo-dm2012.vercel.app
  844. +
  845. [🚀] https://chatgpt-demo-dswang.vercel.app 404 - Not Found
  846. +
  847. [🚀] https://chatgpt-demo-dun-one.vercel.app
  848. +
  849. [🚀] https://chatgpt-demo-dun.vercel.app
  850. +
  851. [🚀] https://chatgpt-demo-ebon.vercel.app
  852. +
  853. [🚀] https://chatgpt-demo-eight-lovat.vercel.app
  854. +
  855. [🚀] https://chatgpt-demo-eosin-eight.vercel.app
  856. +
  857. [🚀] https://chatgpt-demo-eta-azure.vercel.app
  858. +
  859. [🚀] https://chatgpt-demo-eta-nine.vercel.app
  860. +
  861. [🚀] https://chatgpt-demo-eta.vercel.app
  862. +
  863. [🚀] https://chatgpt-demo-even1997.vercel.app
  864. +
  865. [🚀] https://chatgpt-demo-fawn.vercel.app
  866. +
  867. [🚀] https://chatgpt-demo-five.vercel.app
  868. +
  869. [🚀] https://chatgpt-demo-flame.vercel.app
  870. +
  871. [🚀] https://chatgpt-demo-gamma.vercel.app
  872. +
  873. [🚀] https://chatgpt-demo-gftxdy.vercel.app
  874. +
  875. [🚀] https://chatgpt-demo-gilt.vercel.app
  876. +
  877. [🚀] https://chatgpt-demo-gits.vercel.app
  878. +
  879. [🚀] https://chatgpt-demo-gold.vercel.app
  880. +
  881. [🚀] https://chatgpt-demo-gray.vercel.app
  882. +
  883. [🚀] https://chatgpt-demo-gules.vercel.app
  884. +
  885. [🚀] https://chatgpt-demo-guoke.vercel.app
  886. +
  887. [🚀] https://chatgpt-demo-gzw518.vercel.app
  888. +
  889. [🚀] https://chatgpt-demo-hellopsm.vercel.app
  890. +
  891. [🚀] https://chatgpt-demo-heyxiaobai.vercel.app
  892. +
  893. [🚀] https://chatgpt-demo-hime-hina.vercel.app
  894. +
  895. [🚀] https://chatgpt-demo-hkng.vercel.app
  896. +
  897. [🚀] https://chatgpt-demo-hnzyc.vercel.app
  898. +
  899. [🚀] https://chatgpt-demo-huntzzz.vercel.app
  900. +
  901. [🚀] https://chatgpt-demo-iabc.vercel.app
  902. +
  903. [🚀] https://chatgpt-demo-iaston.vercel.app
  904. +
  905. [🚀] https://chatgpt-demo-ifeng.vercel.app
  906. +
  907. [🚀] https://chatgpt-demo-imzcc.vercel.app
  908. +
  909. [🚀] https://chatgpt-demo-jade-six.vercel.app
  910. +
  911. [🚀] https://chatgpt-demo-jingbh.vercel.app
  912. +
  913. [🚀] https://chatgpt-demo-kaixind.vercel.app
  914. +
  915. [🚀] https://chatgpt-demo-kappa.vercel.app
  916. +
  917. [🚀] https://chatgpt-demo-keep4ing.vercel.app
  918. +
  919. [🚀] https://chatgpt-demo-keva0v0.vercel.app
  920. +
  921. [🚀] https://chatgpt-demo-khaki-five.vercel.app
  922. +
  923. [🚀] https://chatgpt-demo-khum08.vercel.app
  924. +
  925. [🚀] https://chatgpt-demo-kollyqaq.vercel.app
  926. +
  927. [🚀] https://chatgpt-demo-kunode.vercel.app
  928. +
  929. [🚀] https://chatgpt-demo-leeese.vercel.app
  930. +
  931. [🚀] https://chatgpt-demo-liard.vercel.app
  932. +
  933. [🚀] https://chatgpt-demo-lifespy.vercel.app
  934. +
  935. [🚀] https://chatgpt-demo-lisonyang.vercel.app
  936. +
  937. [🚀] https://chatgpt-demo-llj.vercel.app
  938. +
  939. [🚀] https://chatgpt-demo-lonr.vercel.app
  940. +
  941. [🚀] https://chatgpt-demo-lovat.vercel.app
  942. +
  943. [🚀] https://chatgpt-demo-mauve.vercel.app
  944. +
  945. [🚀] https://chatgpt-demo-miandai.vercel.app
  946. +
  947. [🚀] https://chatgpt-demo-mine.vercel.app
  948. +
  949. [🚀] https://chatgpt-demo-mitm.vercel.app
  950. +
  951. [🚀] https://chatgpt-demo-moeyy.vercel.app
  952. +
  953. [🚀] https://chatgpt-demo-mu-inky.vercel.app
  954. +
  955. [🚀] https://chatgpt-demo-mu-livid.vercel.app
  956. +
  957. [🚀] https://chatgpt-demo-mu-wine.vercel.app
  958. +
  959. [🚀] https://chatgpt-demo-mu.vercel.app
  960. +
  961. [🚀] https://chatgpt-demo-muxinxy.vercel.app
  962. +
  963. [🚀] https://chatgpt-demo-mzwmiao.vercel.app
  964. +
  965. [🚀] https://chatgpt-demo-nodeps.vercel.app
  966. +
  967. [🚀] https://chatgpt-demo-nu-lovat.vercel.app
  968. +
  969. [🚀] https://chatgpt-demo-nu.vercel.app
  970. +
  971. [🚀] https://chatgpt-demo-nullufull.vercel.app
  972. +
  973. [🚀] https://chatgpt-demo-o9fu.vercel.app
  974. +
  975. [🚀] https://chatgpt-demo-omega-sable.vercel.app
  976. +
  977. [🚀] https://chatgpt-demo-omega.vercel.app
  978. +
  979. [🚀] https://chatgpt-demo-one-gray.vercel.app
  980. +
  981. [🚀] https://chatgpt-demo-one-rho.vercel.app
  982. +
  983. [🚀] https://chatgpt-demo-one.vercel.app
  984. +
  985. [🚀] https://chatgpt-demo-orcin.vercel.app
  986. +
  987. [🚀] https://chatgpt-demo-owenilc.vercel.app
  988. +
  989. [🚀] https://chatgpt-demo-peach.vercel.app
  990. +
  991. [🚀] https://chatgpt-demo-pearl-gamma.vercel.app
  992. +
  993. [🚀] https://chatgpt-demo-phi-two.vercel.app
  994. +
  995. [🚀] https://chatgpt-demo-phi-weld.vercel.app
  996. +
  997. [🚀] https://chatgpt-demo-phi.vercel.app
  998. +
  999. [🚀] https://chatgpt-demo-pi-vert.vercel.app
  1000. +
  1001. [🚀] https://chatgpt-demo-psi-six.vercel.app
  1002. +
  1003. [🚀] https://chatgpt-demo-puce-one.vercel.app
  1004. +
  1005. [🚀] https://chatgpt-demo-qingshewky.vercel.app
  1006. +
  1007. [🚀] https://chatgpt-demo-qtcq.vercel.app
  1008. +
  1009. [🚀] https://chatgpt-demo-ralphgj.vercel.app
  1010. +
  1011. [🚀] https://chatgpt-demo-renxia.vercel.app
  1012. +
  1013. [🚀] https://chatgpt-demo-revincx.vercel.app
  1014. +
  1015. [🚀] https://chatgpt-demo-rho.vercel.app
  1016. +
  1017. [🚀] https://chatgpt-demo-roan.vercel.app 404 - Not Found
  1018. +
  1019. [🚀] https://chatgpt-demo-rosy.vercel.app
  1020. +
  1021. [🚀] https://chatgpt-demo-ruddy.vercel.app
  1022. +
  1023. [🚀] https://chatgpt-demo-rust-six.vercel.app
  1024. +
  1025. [🚀] https://chatgpt-demo-sable.vercel.app
  1026. +
  1027. [🚀] https://chatgpt-demo-sanbazhang.vercel.app
  1028. +
  1029. [🚀] https://chatgpt-demo-sand.vercel.app
  1030. +
  1031. [🚀] https://chatgpt-demo-sandy-delta.vercel.app
  1032. +
  1033. [🚀] https://chatgpt-demo-sddzcuigc.vercel.app
  1034. +
  1035. [🚀] https://chatgpt-demo-sepia-nu.vercel.app
  1036. +
  1037. [🚀] https://chatgpt-demo-sepia.vercel.app
  1038. +
  1039. [🚀] https://chatgpt-demo-seven-sigma.vercel.app
  1040. +
  1041. [🚀] https://chatgpt-demo-seven.vercel.app
  1042. +
  1043. [🚀] https://chatgpt-demo-shanyue.vercel.app
  1044. +
  1045. [🚀] https://chatgpt-demo-sigma-ten.vercel.app
  1046. +
  1047. [🚀] https://chatgpt-demo-sigma.vercel.app
  1048. +
  1049. [🚀] https://chatgpt-demo-six-pi.vercel.app
  1050. +
  1051. [🚀] https://chatgpt-demo-six-sand.vercel.app
  1052. +
  1053. [🚀] https://chatgpt-demo-six-virid.vercel.app
  1054. +
  1055. [🚀] https://chatgpt-demo-sjandsy.vercel.app 404 - Not Found
  1056. +
  1057. [🚀] https://chatgpt-demo-snowy-eta.vercel.app
  1058. +
  1059. [🚀] https://chatgpt-demo-soki.vercel.app
  1060. +
  1061. [🚀] https://chatgpt-demo-sooty.vercel.app
  1062. +
  1063. [🚀] https://chatgpt-demo-soulero.vercel.app
  1064. +
  1065. [🚀] https://chatgpt-demo-swart.vercel.app
  1066. +
  1067. [🚀] https://chatgpt-demo-taupe-ten.vercel.app
  1068. +
  1069. [🚀] https://chatgpt-demo-taupe.vercel.app
  1070. +
  1071. [🚀] https://chatgpt-demo-teal-gamma.vercel.app
  1072. +
  1073. [🚀] https://chatgpt-demo-ten-blue.vercel.app
  1074. +
  1075. [🚀] https://chatgpt-demo-ten-mauve.vercel.app
  1076. +
  1077. [🚀] https://chatgpt-demo-ten-mu.vercel.app
  1078. +
  1079. [🚀] https://chatgpt-demo-theta.vercel.app
  1080. +
  1081. [🚀] https://chatgpt-demo-three.vercel.app
  1082. +
  1083. [🚀] https://chatgpt-demo-tuzix.vercel.app
  1084. +
  1085. [🚀] https://chatgpt-demo-two-psi.vercel.app
  1086. +
  1087. [🚀] https://chatgpt-demo-umber-phi.vercel.app
  1088. +
  1089. [🚀] https://chatgpt-demo-umber-two.vercel.app
  1090. +
  1091. [🚀] https://chatgpt-demo-umber.vercel.app
  1092. +
  1093. [🚀] https://chatgpt-demo-v.vercel.app
  1094. +
  1095. [🚀] https://chatgpt-demo-vert.vercel.app
  1096. +
  1097. [🚀] https://chatgpt-demo-vocs.vercel.app
  1098. +
  1099. [🚀] https://chatgpt-demo-wncoi.vercel.app
  1100. +
  1101. [🚀] https://chatgpt-demo-xbdsky.vercel.app
  1102. +
  1103. [🚀] https://chatgpt-demo-ycuw.vercel.app
  1104. +
  1105. [🚀] https://chatgpt-demo-ycyy.vercel.app
  1106. +
  1107. [🚀] https://chatgpt-demo-yu.vercel.app
  1108. +
  1109. [🚀] https://chatgpt-demo-yzk656.vercel.app
  1110. +
  1111. [🚀] https://chatgpt-demo-zalr.vercel.app
  1112. +
  1113. [🚀] https://chatgpt-demo-zhongycurtin.vercel.app
  1114. +
  1115. [🚀] https://chatgpt-demo-zjy.vercel.app
  1116. +
  1117. [🚀] https://chatgpt-echostars-seven.vercel.app
  1118. +
  1119. [🚀] https://chatgpt-evo.vercel.app
  1120. +
  1121. [🚀] https://chatgpt-fog3211.vercel.app
  1122. +
  1123. [🚀] https://chatgpt-for-me-slim4k.vercel.app
  1124. +
  1125. [🚀] https://chatgpt-gamma-five.vercel.app
  1126. +
  1127. [🚀] https://chatgpt-gog.vercel.app
  1128. +
  1129. [🚀] https://chatgpt-gray-three.vercel.app
  1130. +
  1131. [🚀] https://chatgpt-inside.vercel.app
  1132. +
  1133. [🚀] https://chatgpt-joke.vercel.app
  1134. +
  1135. [🚀] https://chatgpt-kk-web.vercel.app
  1136. +
  1137. [🚀] https://chatgpt-lake-two.vercel.app
  1138. +
  1139. [🚀] https://chatgpt-lilac.vercel.app
  1140. +
  1141. [🚀] https://chatgpt-mangix902.vercel.app
  1142. +
  1143. [🚀] https://chatgpt-ne-gora.vercel.app
  1144. +
  1145. [🚀] https://chatgpt-omega-ivory.vercel.app
  1146. +
  1147. [🚀] https://chatgpt-personal-seven.vercel.app
  1148. +
  1149. [🚀] https://chatgpt-proxy-online.vercel.app
  1150. +
  1151. [🚀] https://email-helper.vercel.app Generate your business emails in seconds
  1152. +
  1153. [🚀] https://chatgpt-demo-blush-three.vercel.app
  1154. +
  1155. [🚀] https://chatgpt-demo-cosine.vercel.app
  1156. +
  1157. [🔑🚀] https://paul-graham-gpt.vercel.app AI search & chat for all of Paul Graham’s essays
  1158. +
  1159. [🚀] https://chatgpt-cnano.vercel.app
  1160. +
  1161. [🚀] https://chatgpt-demo-eight.vercel.app
  1162. +
  1163. [🚀] https://chatgpt-demo-five-jet.vercel.app
  1164. +
  1165. [🚀] https://chatgpt-demo-hktwilight.vercel.app
  1166. +
  1167. [🚀] https://chatgpt-demo-hryen.vercel.app
  1168. +
  1169. [🚀] https://chatgpt-demo-xi-three.vercel.app
  1170. +
  1171. [🚀] https://chatgpt-demo-xsdcz.vercel.app
  1172. +
  1173. [🚀] https://chatgpt-demo-ybb778.vercel.app
  1174. +
  1175. [🚀] https://chatgpt-sage-eight.vercel.app
  1176. +
  1177. [🚀] https://chatgpt-samyzy.vercel.app
  1178. +
  1179. [🚀] https://chatgpt-shadowfly.vercel.app
  1180. +
  1181. [🚀] https://chatgpt-silk.vercel.app
  1182. +
  1183. [🚀] https://chatgpt-skrleo.vercel.app
  1184. +
  1185. [🚀] https://chatgpt-t.vercel.app
  1186. +
  1187. [🚀] https://chatgpt-tan-alpha.vercel.app
  1188. +
  1189. [🚀] https://chatgpt-thek28.vercel.app
  1190. +
  1191. [🚀] https://chatgpt-turbo-bot.vercel.app
  1192. +
  1193. [🚀] https://chatgpt-turbo-kylemclaren.vercel.app
  1194. +
  1195. [🚀] https://chatgpt-turbo-seven.vercel.app
  1196. +
  1197. [🚀] https://chatgpt-vercel-0311.vercel.app
  1198. +
  1199. [🚀] https://chatgpt-vercel-1-plum.vercel.app
  1200. +
  1201. [🚀] https://chatgpt-vercel-acmmer.vercel.app
  1202. +
  1203. [🚀] https://chatgpt-vercel-ahxh2000.vercel.app
  1204. +
  1205. [🚀] https://chatgpt-vercel-ahzzs.vercel.app
  1206. +
  1207. [🚀] https://chatgpt-vercel-baronbin.vercel.app
  1208. +
  1209. [🚀] https://chatgpt-vercel-chell.vercel.app
  1210. +
  1211. [🚀] https://chatgpt-vercel-cody123.vercel.app
  1212. +
  1213. [🚀] https://chatgpt-vercel-cokice.vercel.app
  1214. +
  1215. [🚀] https://chatgpt-vercel-dbl520.vercel.app
  1216. +
  1217. [🚀] https://chatgpt-vercel-dofine.vercel.app
  1218. +
  1219. [🚀] https://chatgpt-vercel-ebon.vercel.app
  1220. +
  1221. [🚀] https://chatgpt-vercel-ffwxuhao.vercel.app
  1222. +
  1223. [🚀] https://chatgpt-vercel-flax.vercel.app
  1224. +
  1225. [🚀] https://chatgpt-vercel-gamma-azure.vercel.app
  1226. +
  1227. [🚀] https://chatgpt-vercel-gold.vercel.app
  1228. +
  1229. [🚀] https://chatgpt-vercel-ivory.vercel.app
  1230. +
  1231. [🚀] https://chatgpt-vercel-jiangys.vercel.app
  1232. +
  1233. [🚀] https://chatgpt-vercel-jingyan.vercel.app
  1234. +
  1235. [🚀] https://chatgpt-vercel-lilac.vercel.app
  1236. +
  1237. [🚀] https://chatgpt-vercel-lxy.vercel.app
  1238. +
  1239. [🚀] https://chatgpt-vercel-misaya98.vercel.app
  1240. +
  1241. [🚀] https://chatgpt-vercel-nine-alpha.vercel.app
  1242. +
  1243. [🚀] https://chatgpt-vercel-one-delta.vercel.app
  1244. +
  1245. [🚀] https://chatgpt-vercel-opal.vercel.app
  1246. +
  1247. [🚀] https://chatgpt-vercel-pi-nine.vercel.app
  1248. +
  1249. [🚀] https://chatgpt-vercel-pink.vercel.app
  1250. +
  1251. [🚀] https://chatgpt-vercel-puce.vercel.app
  1252. +
  1253. [🚀] https://chatgpt-vercel-qianggu.vercel.app
  1254. +
  1255. [🚀] https://chatgpt-vercel-regomne.vercel.app
  1256. +
  1257. [🚀] https://chatgpt-vercel-rust-kappa.vercel.app
  1258. +
  1259. [🚀] https://chatgpt-vercel-taupe.vercel.app
  1260. +
  1261. [🚀] https://chatgpt-vercel-ten-rho.vercel.app
  1262. +
  1263. [🚀] https://chatgpt-vercel-three-amber.vercel.app
  1264. +
  1265. [🚀] https://chatgpt-vercel-three-jade.vercel.app
  1266. +
  1267. [🚀] https://chatgpt-vercel-tocmike.vercel.app
  1268. +
  1269. [🚀] https://chatgpt-vercel-two-delta.vercel.app
  1270. +
  1271. [🚀] https://chatgpt-vercel-two-omega.vercel.app
  1272. +
  1273. [🚀] https://chatgpt-vercel-weibo.vercel.app
  1274. +
  1275. [🚀] https://chatgpt-vercel-woad-theta.vercel.app
  1276. +
  1277. [🚀] https://chatgpt-vercel-wtko1.vercel.app
  1278. +
  1279. [🚀] https://chatgpt-vercel-wushuai.vercel.app
  1280. +
  1281. [🚀] https://chatgpt-vercel-wvwb.vercel.app
  1282. +
  1283. [🚀] https://chatgpt-vercel-yorzi.vercel.app
  1284. +
  1285. [🚀] https://chatgpt-vercel-zktree.vercel.app
  1286. +
  1287. [🚀] https://chatgpt-web-misaka.vercel.app
  1288. +
  1289. [🚀] https://chatgpt-web-ruby.vercel.app
  1290. +
  1291. [🚀] https://chatgpt-web-virid.vercel.app
  1292. +
  1293. [🚀] https://chatgpt-web3-5.vercel.app
  1294. +
  1295. [🚀] https://chatgpt-wilsonmk.vercel.app
  1296. +
  1297. [🚀] https://chatgpt-wm.vercel.app
  1298. +
  1299. [🚀] https://chatgpt-xd.vercel.app
  1300. +
  1301. [🚀] https://chatgpt-ylz201.vercel.app
  1302. +
  1303. [🚀] https://chatgpt-yzh.vercel.app
  1304. +
  1305. [🚀] https://chatgpt-zwmmm.vercel.app
  1306. +
  1307. [🚀] https://chatgpt2-dun.vercel.app
  1308. +
  1309. [🚀] https://chatgpt230305.vercel.app
  1310. +
  1311. [🚀] https://chatgptcn-mu.vercel.app
  1312. +
  1313. [🚀] https://cnchat.vercel.app
  1314. +
  1315. [🚀] https://cyber-chatgpt.vercel.app
  1316. +
  1317. [🚀] https://demo-t1035.vercel.app
  1318. +
  1319. [🚀] https://dreamchat-nine.vercel.app
  1320. +
  1321. [🚀] https://eva-rootftw.vercel.app
  1322. +
  1323. [🚀] https://fc-chat-gpt.vercel.app
  1324. +
  1325. [🚀] https://gpt-hk.vercel.app
  1326. +
  1327. [🚀] https://gpt-lite.vercel.app
  1328. +
  1329. [🚀] https://gpt3-pedroz.vercel.app
  1330. +
  1331. [🚀] https://hlx.vercel.app
  1332. +
  1333. [🚀] https://just-chat-beta.vercel.app
  1334. +
  1335. [🚀] https://kc-gpt.vercel.app
  1336. +
  1337. [🚀] https://michat.vercel.app
  1338. +
  1339. [🚀] https://my-chatgpt-demo.vercel.app
  1340. +
  1341. [🚀] https://my-chatgpt-taosu.vercel.app
  1342. +
  1343. [🚀] https://mymurmur.vercel.app
  1344. +
  1345. [🚀] https://online-gptbot.vercel.app
  1346. +
  1347. [🚀] https://pichatgpt.vercel.app
  1348. +
  1349. [🚀] https://softnero-chatgpt.vercel.app
  1350. +
  1351. [🚀] https://vercel-chatgpt-github.vercel.app
  1352. +
  1353. [🚀] https://vinciarts-chat.vercel.app
  1354. +
  1355. [🚀] https://xwai.vercel.app
  1356. +
  1357. [🔑🚀] https://chatgpt-public-nu.vercel.app
  1358. +
  1359. [🔑🚀] https://chatgpt-vercel-wanxcx.vercel.app
  1360. +
  1361. [🔒🚀] https://chatgpt-demo-nocmt.vercel.app
  1362. +
  1363. [🚀] https://chatgpt-echostars-echostars.vercel.app
  1364. +
  1365. [🚀] https://0x-chatgpt.vercel.app
  1366. +
  1367. [🚀] https://aibus.vercel.app
  1368. +
  1369. [🚀] https://aitoolschatgptbot.vercel.app
  1370. +
  1371. [🚀] https://anychat-hazel.vercel.app
  1372. +
  1373. [🚀] https://arch-chat.vercel.app
  1374. +
  1375. [🚀] https://askgodany.vercel.app 404 - Not Found
  1376. +
  1377. [🚀] https://c2-lovat.vercel.app
  1378. +
  1379. [🚀] https://cchat-three.vercel.app
  1380. +
  1381. [🚀] https://chat-anyone.vercel.app 404 - Not Found
  1382. +
  1383. [🚀] https://chat-ccbikai.vercel.app
  1384. +
  1385. [🚀] https://chat-colin.vercel.app
  1386. +
  1387. [🚀] https://chat-demo-alpha.vercel.app
  1388. +
  1389. [🚀] https://chat-gpt-534m.vercel.app
  1390. +
  1391. [🚀] https://chat-gpt-pyubun.vercel.app
  1392. +
  1393. [🚀] https://chat-gpt-suwanya.vercel.app
  1394. +
  1395. [🚀] https://chat-green-ten-16.vercel.app
  1396. +
  1397. [🚀] https://chat-icelox.vercel.app
  1398. +
  1399. [🚀] https://chat-ming.vercel.app
  1400. +
  1401. [🚀] https://chat-pi-lyart.vercel.app
  1402. +
  1403. [🚀] https://chat-with-gpt-six.vercel.app 404 - Not Found
  1404. +
  1405. [🚀] https://chat.deanxizian.vercel.app
  1406. +
  1407. [🚀] https://chatbot-pexeer.vercel.app
  1408. +
  1409. [🚀] https://chatgpt-01.vercel.app
  1410. +
  1411. [🚀] https://chatgpt-02xx.vercel.app
  1412. +
  1413. [🚀] https://chatgpt-aixy.vercel.app
  1414. +
  1415. [🚀] https://chatgpt-blush-kappa.vercel.app
  1416. +
  1417. [🚀] https://chatgpt-bot-lyart.vercel.app
  1418. +
  1419. [🚀] https://chatgpt-bot-tau.vercel.app
  1420. +
  1421. [🚀] https://chatgpt-by-vercel.vercel.app
  1422. +
  1423. [🚀] https://chatgpt-bzb.vercel.app
  1424. +
  1425. [🚀] https://chatgpt-chatbot-ivory.vercel.app
  1426. +
  1427. [🚀] https://chatgpt-cunzher.vercel.app
  1428. +
  1429. [🚀] https://chatgpt-demo-0.vercel.app
  1430. +
  1431. [🚀] https://chatgpt-demo-1-pi.vercel.app
  1432. +
  1433. [🚀] https://chatgpt-demo-1-xi.vercel.app
  1434. +
  1435. [🚀] https://chatgpt-demo-1zyao.vercel.app
  1436. +
  1437. [🚀] https://chatgpt-demo-2742219362.vercel.app
  1438. +
  1439. [🚀] https://chatgpt-demo-accerss.vercel.app
  1440. +
  1441. [🚀] https://chatgpt-demo-aersasse.vercel.app
  1442. +
  1443. [🚀] https://chatgpt-demo-aichaluo.vercel.app
  1444. +
  1445. [🚀] https://chatgpt-demo-aigc.vercel.app
  1446. +
  1447. [🚀] https://chatgpt-demo-akingsky.vercel.app
  1448. +
  1449. [🚀] https://chatgpt-demo-alpha-five.vercel.app 404 - Not Found
  1450. +
  1451. [🚀] https://chatgpt-demo-alpha-two.vercel.app
  1452. +
  1453. [🚀] https://chatgpt-demo-antergone.vercel.app
  1454. +
  1455. [🚀] https://chatgpt-demo-aqm5.vercel.app
  1456. +
  1457. [🚀] https://chatgpt-demo-asmboy.vercel.app 404 - Not Found
  1458. +
  1459. [🚀] https://chatgpt-demo-azure-six.vercel.app 404 - Not Found
  1460. +
  1461. [🚀] https://chatgpt-demo-balovess.vercel.app
  1462. +
  1463. [🚀] https://chatgpt-demo-bay-ten.vercel.app
  1464. +
  1465. [🚀] https://chatgpt-demo-beryl-nine.vercel.app
  1466. +
  1467. [🚀] https://chatgpt-demo-bilter1001.vercel.app
  1468. +
  1469. [🚀] https://chatgpt-demo-bjw321.vercel.app 404 - Not Found
  1470. +
  1471. [🚀] https://chatgpt-demo-black-seven.vercel.app
  1472. +
  1473. [🚀] https://chatgpt-demo-blubana.vercel.app
  1474. +
  1475. [🚀] https://chatgpt-demo-bwcxgl.vercel.app
  1476. +
  1477. [🚀] https://chatgpt-demo-chi-rose.vercel.app
  1478. +
  1479. [🚀] https://chatgpt-demo-csxmx.vercel.app
  1480. +
  1481. [🚀] https://chatgpt-demo-daziyuan.vercel.app
  1482. +
  1483. [🚀] https://chatgpt-demo-ddiu-omega.vercel.app
  1484. +
  1485. [🚀] https://chatgpt-demo-deanxizian.vercel.app
  1486. +
  1487. [🚀] https://chatgpt-demo-delta-ten.vercel.app
  1488. +
  1489. [🚀] https://chatgpt-demo-dun-phi.vercel.app
  1490. +
  1491. [🚀] https://chatgpt-demo-dun-xi.vercel.app
  1492. +
  1493. [🚀] https://chatgpt-demo-eight-delta.vercel.app
  1494. +
  1495. [🚀] https://chatgpt-demo-eight-lemon.vercel.app
  1496. +
  1497. [🚀] https://chatgpt-demo-entertang.vercel.app
  1498. +
  1499. [🚀] https://chatgpt-demo-enz0cez.vercel.app
  1500. +
  1501. [🚀] https://chatgpt-demo-eta-roan.vercel.app
  1502. +
  1503. [🚀] https://chatgpt-demo-flax-five.vercel.app
  1504. +
  1505. [🚀] https://chatgpt-demo-foxmn.vercel.app
  1506. +
  1507. [🚀] https://chatgpt-demo-fy2git.vercel.app
  1508. +
  1509. [🚀] https://chatgpt-demo-gamma-kohl.vercel.app
  1510. +
  1511. [🚀] https://chatgpt-demo-gengzhikui.vercel.app
  1512. +
  1513. [🚀] https://chatgpt-demo-gilt-two.vercel.app
  1514. +
  1515. [🚀] https://chatgpt-demo-goodhzy.vercel.app
  1516. +
  1517. [🚀] https://chatgpt-demo-goya1.vercel.app
  1518. +
  1519. [🚀] https://chatgpt-demo-hexianzhi.vercel.app 404 - Not Found
  1520. +
  1521. [🚀] https://chatgpt-demo-hezi9527.vercel.app
  1522. +
  1523. [🚀] https://chatgpt-demo-hiufan.vercel.app
  1524. +
  1525. [🚀] https://chatgpt-demo-hot.vercel.app
  1526. +
  1527. [🚀] https://chatgpt-demo-houhoz.vercel.app
  1528. +
  1529. [🚀] https://chatgpt-demo-hqw567.vercel.app
  1530. +
  1531. [🚀] https://chatgpt-demo-hugvjj.vercel.app
  1532. +
  1533. [🚀] https://chatgpt-demo-icepie.vercel.app
  1534. +
  1535. [🚀] https://chatgpt-demo-ifangyong.vercel.app
  1536. +
  1537. [🚀] https://chatgpt-demo-ihx-rainbow.vercel.app
  1538. +
  1539. [🚀] https://chatgpt-demo-imp.vercel.app
  1540. +
  1541. [🚀] https://chatgpt-demo-inky-nine.vercel.app
  1542. +
  1543. [🚀] https://chatgpt-demo-iota-kohl.vercel.app
  1544. +
  1545. [🚀] https://chatgpt-demo-irmowan.vercel.app
  1546. +
  1547. [🚀] https://chatgpt-demo-jdaaiaj.vercel.app
  1548. +
  1549. [🚀] https://chatgpt-demo-jet-xi.vercel.app
  1550. +
  1551. [🚀] https://chatgpt-demo-jijuji.vercel.app
  1552. +
  1553. [🚀] https://chatgpt-demo-jingyan.vercel.app
  1554. +
  1555. [🚀] https://chatgpt-demo-jinliu.vercel.app
  1556. +
  1557. [🚀] https://chatgpt-demo-kaino3.vercel.app
  1558. +
  1559. [🚀] https://chatgpt-demo-kaiwenfeng.vercel.app
  1560. +
  1561. [🚀] https://chatgpt-demo-kappa-pink.vercel.app
  1562. +
  1563. [🚀] https://chatgpt-demo-kdf5000.vercel.app
  1564. +
  1565. [🚀] https://chatgpt-demo-khaki-delta.vercel.app
  1566. +
  1567. [🚀] https://chatgpt-demo-khaki.vercel.app
  1568. +
  1569. [🚀] https://chatgpt-demo-kjhuanhao.vercel.app
  1570. +
  1571. [🚀] https://chatgpt-demo-kqfrv.vercel.app
  1572. +
  1573. [🚀] https://chatgpt-demo-kur0x.vercel.app
  1574. +
  1575. [🚀] https://chatgpt-demo-kzisama.vercel.app
  1576. +
  1577. [🚀] https://chatgpt-demo-leaders53.vercel.app
  1578. +
  1579. [🚀] https://chatgpt-demo-lemon-chi.vercel.app
  1580. +
  1581. [🚀] https://chatgpt-demo-leo4zhou.vercel.app
  1582. +
  1583. [🚀] https://chatgpt-demo-lewime.vercel.app
  1584. +
  1585. [🚀] https://chatgpt-demo-liart.vercel.app
  1586. +
  1587. [🚀] https://chatgpt-demo-lime.vercel.app
  1588. +
  1589. [🚀] https://chatgpt-demo-linps1.vercel.app
  1590. +
  1591. [🚀] https://chatgpt-demo-livid-eight.vercel.app
  1592. +
  1593. [🚀] https://chatgpt-demo-lkyxuan.vercel.app 404 - Not Found
  1594. +
  1595. [🚀] https://chatgpt-demo-lmm-55.vercel.app
  1596. +
  1597. [🚀] https://chatgpt-demo-lovat-five.vercel.app
  1598. +
  1599. [🚀] https://chatgpt-demo-marx2014.vercel.app
  1600. +
  1601. [🚀] https://chatgpt-demo-merore.vercel.app
  1602. +
  1603. [🚀] https://chatgpt-demo-mhbn.vercel.app
  1604. +
  1605. [🚀] https://chatgpt-demo-moxuy.vercel.app
  1606. +
  1607. [🚀] https://chatgpt-demo-mzkal.vercel.app 404 - Not Found
  1608. +
  1609. [🚀] https://chatgpt-demo-necopp.vercel.app
  1610. +
  1611. [🚀] https://chatgpt-demo-neon.vercel.app
  1612. +
  1613. [🚀] https://chatgpt-demo-nine-delta.vercel.app
  1614. +
  1615. [🚀] https://chatgpt-demo-nine-green.vercel.app
  1616. +
  1617. [🚀] https://chatgpt-demo-nine-sooty.vercel.app
  1618. +
  1619. [🚀] https://chatgpt-demo-nu-gold.vercel.app 404 - Not Found
  1620. +
  1621. [🚀] https://chatgpt-demo-omega-three.vercel.app
  1622. +
  1623. [🚀] https://chatgpt-demo-one-eta.vercel.app
  1624. +
  1625. [🚀] https://chatgpt-demo-one-mu.vercel.app
  1626. +
  1627. [🚀] https://chatgpt-demo-one-navy.vercel.app
  1628. +
  1629. [🚀] https://chatgpt-demo-one-omega.vercel.app
  1630. +
  1631. [🚀] https://chatgpt-demo-osfpu0.vercel.app
  1632. +
  1633. [🚀] https://chatgpt-demo-oylinv.vercel.app
  1634. +
  1635. [🚀] https://chatgpt-demo-p.vercel.app
  1636. +
  1637. [🚀] https://chatgpt-demo-pi-drab.vercel.app
  1638. +
  1639. [🚀] https://chatgpt-demo-pi-opal.vercel.app
  1640. +
  1641. [🚀] https://chatgpt-demo-pi-six.vercel.app
  1642. +
  1643. [🚀] https://chatgpt-demo-plum-mu.vercel.app
  1644. +
  1645. [🚀] https://chatgpt-demo-plum.vercel.app
  1646. +
  1647. [🚀] https://chatgpt-demo-psi-sand.vercel.app
  1648. +
  1649. [🚀] https://chatgpt-demo-puce-omega.vercel.app
  1650. +
  1651. [🚀] https://chatgpt-demo-puce-xi.vercel.app
  1652. +
  1653. [🚀] https://chatgpt-demo-qq309381.vercel.app
  1654. +
  1655. [🚀] https://chatgpt-demo-ranyouli.vercel.app 404 - Not Found
  1656. +
  1657. [🚀] https://chatgpt-demo-ratol.vercel.app
  1658. +
  1659. [🚀] https://chatgpt-demo-rho-one.vercel.app
  1660. +
  1661. [🚀] https://chatgpt-demo-roan-phi.vercel.app
  1662. +
  1663. [🚀] https://chatgpt-demo-rouge-xi.vercel.app
  1664. +
  1665. [🚀] https://chatgpt-demo-seven-smoky.vercel.app
  1666. +
  1667. [🚀] https://chatgpt-demo-six-lime.vercel.app
  1668. +
  1669. [🚀] https://chatgpt-demo-six-umber.vercel.app
  1670. +
  1671. [🚀] https://chatgpt-demo-soeaweb.vercel.app
  1672. +
  1673. [🚀] https://chatgpt-demo-steel-rho.vercel.app
  1674. +
  1675. [🚀] https://chatgpt-demo-stool233.vercel.app
  1676. +
  1677. [🚀] https://chatgpt-demo-swart-chi.vercel.app
  1678. +
  1679. [🚀] https://chatgpt-demo-syb319.vercel.app
  1680. +
  1681. [🚀] https://chatgpt-demo-tau-six.vercel.app
  1682. +
  1683. [🚀] https://chatgpt-demo-tau-ten.vercel.app
  1684. +
  1685. [🚀] https://chatgpt-demo-ten-black.vercel.app
  1686. +
  1687. [🚀] https://chatgpt-demo-ten-delta.vercel.app
  1688. +
  1689. [🚀] https://chatgpt-demo-ten-phi.vercel.app
  1690. +
  1691. [🚀] https://chatgpt-demo-ten-red.vercel.app
  1692. +
  1693. [🚀] https://chatgpt-demo-three-pi.vercel.app
  1694. +
  1695. [🚀] https://chatgpt-demo-three-rose.vercel.app
  1696. +
  1697. [🚀] https://chatgpt-demo-tien860425.vercel.app
  1698. +
  1699. [🚀] https://chatgpt-demo-two-delta.vercel.app
  1700. +
  1701. [🚀] https://chatgpt-demo-two-mauve.vercel.app
  1702. +
  1703. [🚀] https://chatgpt-demo-wakap.vercel.app
  1704. +
  1705. [🚀] https://chatgpt-demo-wang-y-z.vercel.app
  1706. +
  1707. [🚀] https://chatgpt-demo-woad-eta.vercel.app
  1708. +
  1709. [🚀] https://chatgpt-demo-xi-gold.vercel.app
  1710. +
  1711. [🚀] https://chatgpt-demo-xinnice.vercel.app
  1712. +
  1713. [🚀] https://chatgpt-demo-yangdi.vercel.app
  1714. +
  1715. [🚀] https://chatgpt-demo-yexkt1.vercel.app
  1716. +
  1717. [🚀] https://chatgpt-demo-yp1y.vercel.app 404 - Not Found
  1718. +
  1719. [🚀] https://chatgpt-demo-zeta-beryl.vercel.app
  1720. +
  1721. [🚀] https://chatgpt-demo-zhangfyuan.vercel.app
  1722. +
  1723. [🚀] https://chatgpt-demo-zoujfgit.vercel.app
  1724. +
  1725. [🚀] https://chatgpt-demo-zrrsss.vercel.app
  1726. +
  1727. [🚀] https://chatgpt-demo-zw6097.vercel.app 404 - Not Found
  1728. +
  1729. [🚀] https://chatgpt-demo2-fawn.vercel.app
  1730. +
  1731. [🚀] https://chatgpt-demo2-lilac.vercel.app
  1732. +
  1733. [🚀] https://chatgpt-duang26.vercel.app
  1734. +
  1735. [🚀] https://chatgpt-eight-tawny.vercel.app
  1736. +
  1737. [🚀] https://chatgpt-enron2023.vercel.app
  1738. +
  1739. [🚀] https://chatgpt-h7ml.vercel.app
  1740. +
  1741. [🚀] https://chatgpt-jayleecn.vercel.app
  1742. +
  1743. [🚀] https://chatgpt-jimliang.vercel.app
  1744. +
  1745. [🚀] https://chatgpt-kilmu1337.vercel.app
  1746. +
  1747. [🚀] https://chatgpt-leo-cl26.vercel.app
  1748. +
  1749. [🚀] https://chatgpt-lieo.vercel.app
  1750. +
  1751. [🚀] https://chatgpt-lihui.vercel.app
  1752. +
  1753. [🚀] https://chatgpt-lite-zeta.vercel.app
  1754. +
  1755. [🚀] https://chatgpt-lks-lks96.vercel.app
  1756. +
  1757. [🚀] https://chatgpt-llkeji.vercel.app
  1758. +
  1759. [🚀] https://chatgpt-lovot.vercel.app
  1760. +
  1761. [🚀] https://chatgpt-make.vercel.app
  1762. +
  1763. [🚀] https://chatgpt-me.vercel.app
  1764. +
  1765. [🚀] https://chatgpt-mumuorz.vercel.app
  1766. +
  1767. [🚀] https://chatgpt-muzz.vercel.app
  1768. +
  1769. [🚀] https://chatgpt-nu-green.vercel.app
  1770. +
  1771. [🚀] https://chatgpt-o0oke.vercel.app
  1772. +
  1773. [🚀] https://chatgpt-online-rho.vercel.app
  1774. +
  1775. [🚀] https://chatgpt-online.vercel.app 404 - Not Found
  1776. +
  1777. [🚀] https://chatgpt-outshineamaze.vercel.app
  1778. +
  1779. [🚀] https://chatgpt-rho-cyan.vercel.app
  1780. +
  1781. [🚀] https://chatgpt-robot-liart.vercel.app
  1782. +
  1783. [🚀] https://chatgpt-svxtec.vercel.app
  1784. +
  1785. [🚀] https://chatgpt-ui-app.vercel.app
  1786. +
  1787. [🚀] https://chatgpt-ui-vercel.vercel.app
  1788. +
  1789. [🚀] https://chatgpt-vc-two.vercel.app
  1790. +
  1791. [🚀] https://chatgpt-vercel-1-ruby.vercel.app
  1792. +
  1793. [🚀] https://chatgpt-vercel-1-ten.vercel.app
  1794. +
  1795. [🚀] https://chatgpt-vercel-1-three.vercel.app
  1796. +
  1797. [🚀] https://chatgpt-vercel-1rone11.vercel.app
  1798. +
  1799. [🚀] https://chatgpt-vercel-50mkw.vercel.app
  1800. +
  1801. [🚀] https://chatgpt-vercel-5dlh.vercel.app 404 - Not Found
  1802. +
  1803. [🚀] https://chatgpt-vercel-9cats.vercel.app
  1804. +
  1805. [🚀] https://chatgpt-vercel-abovesky.vercel.app
  1806. +
  1807. [🚀] https://chatgpt-vercel-ago88.vercel.app
  1808. +
  1809. [🚀] https://chatgpt-vercel-ai50.vercel.app
  1810. +
  1811. [🚀] https://chatgpt-vercel-alitrack.vercel.app
  1812. +
  1813. [🚀] https://chatgpt-vercel-alpha-umber.vercel.app
  1814. +
  1815. [🚀] https://chatgpt-vercel-alphafitz11.vercel.app
  1816. +
  1817. [🚀] https://chatgpt-vercel-amber.vercel.app
  1818. +
  1819. [🚀] https://chatgpt-vercel-arcsion.vercel.app
  1820. +
  1821. [🚀] https://chatgpt-vercel-ashy-gamma.vercel.app
  1822. +
  1823. [🚀] https://chatgpt-vercel-ashy.vercel.app
  1824. +
  1825. [🚀] https://chatgpt-vercel-azad-sl.vercel.app
  1826. +
  1827. [🚀] https://chatgpt-vercel-bay.vercel.app
  1828. +
  1829. [🚀] https://chatgpt-vercel-beryl.vercel.app
  1830. +
  1831. [🚀] https://chatgpt-vercel-blond.vercel.app
  1832. +
  1833. [🚀] https://chatgpt-vercel-brown.vercel.app
  1834. +
  1835. [🚀] https://chatgpt-vercel-bubumall.vercel.app
  1836. +
  1837. [🚀] https://chatgpt-vercel-c224.vercel.app
  1838. +
  1839. [🚀] https://chatgpt-vercel-chieffucker.vercel.app
  1840. +
  1841. [🚀] https://chatgpt-vercel-chilohwei.vercel.app
  1842. +
  1843. [🚀] https://chatgpt-vercel-chiluoluo.vercel.app
  1844. +
  1845. [🚀] https://chatgpt-vercel-chlorine.vercel.app
  1846. +
  1847. [🚀] https://chatgpt-vercel-chowkim.vercel.app
  1848. +
  1849. [🚀] https://chatgpt-vercel-cirnot9.vercel.app
  1850. +
  1851. [🚀] https://chatgpt-vercel-cola-sys.vercel.app
  1852. +
  1853. [🚀] https://chatgpt-vercel-coral-three.vercel.app
  1854. +
  1855. [🚀] https://chatgpt-vercel-coral.vercel.app
  1856. +
  1857. [🚀] https://chatgpt-vercel-cuijr.vercel.app
  1858. +
  1859. [🚀] https://chatgpt-vercel-ddong8.vercel.app
  1860. +
  1861. [🚀] https://chatgpt-vercel-delta-lac.vercel.app
  1862. +
  1863. [🚀] https://chatgpt-vercel-delta.vercel.app
  1864. +
  1865. [🚀] https://chatgpt-vercel-dogpem.vercel.app
  1866. +
  1867. [🚀] https://chatgpt-vercel-domeenoh.vercel.app
  1868. +
  1869. [🚀] https://chatgpt-vercel-drmuda.vercel.app
  1870. +
  1871. [🚀] https://chatgpt-vercel-dun.vercel.app
  1872. +
  1873. [🚀] https://chatgpt-vercel-ecru-nine.vercel.app
  1874. +
  1875. [🚀] https://chatgpt-vercel-eight-alpha.vercel.app
  1876. +
  1877. [🚀] https://chatgpt-vercel-eight-iota.vercel.app
  1878. +
  1879. [🚀] https://chatgpt-vercel-eight-mocha.vercel.app
  1880. +
  1881. [🚀] https://chatgpt-vercel-en.vercel.app
  1882. +
  1883. [🚀] https://chatgpt-vercel-entertang.vercel.app
  1884. +
  1885. [🚀] https://chatgpt-vercel-eta-smoky.vercel.app
  1886. +
  1887. [🚀] https://chatgpt-vercel-eta-snowy.vercel.app
  1888. +
  1889. [🚀] https://chatgpt-vercel-eta.vercel.app
  1890. +
  1891. [🚀] https://chatgpt-vercel-ethanwujf.vercel.app
  1892. +
  1893. [🚀] https://chatgpt-vercel-ev.vercel.app
  1894. +
  1895. [🚀] https://chatgpt-vercel-exaxoncel.vercel.app
  1896. +
  1897. [🚀] https://chatgpt-vercel-fang17.vercel.app
  1898. +
  1899. [🚀] https://chatgpt-vercel-fangvivi.vercel.app
  1900. +
  1901. [🚀] https://chatgpt-vercel-fb886.vercel.app
  1902. +
  1903. [🚀] https://chatgpt-vercel-feelapi.vercel.app
  1904. +
  1905. [🚀] https://chatgpt-vercel-five-alpha.vercel.app
  1906. +
  1907. [🚀] https://chatgpt-vercel-five-iota.vercel.app
  1908. +
  1909. [🚀] https://chatgpt-vercel-five-mu.vercel.app
  1910. +
  1911. [🚀] https://chatgpt-vercel-five-tau.vercel.app
  1912. +
  1913. [🚀] https://chatgpt-vercel-flame-two.vercel.app
  1914. +
  1915. [🚀] https://chatgpt-vercel-flax-five.vercel.app
  1916. +
  1917. [🚀] https://chatgpt-vercel-flyoo.vercel.app
  1918. +
  1919. [🚀] https://chatgpt-vercel-forchannot.vercel.app
  1920. +
  1921. [🚀] https://chatgpt-vercel-fssflyang.vercel.app
  1922. +
  1923. [🚀] https://chatgpt-vercel-gamma-inky.vercel.app 404 - Not Found
  1924. +
  1925. [🚀] https://chatgpt-vercel-gamma-six.vercel.app
  1926. +
  1927. [🚀] https://chatgpt-vercel-gilt-rho.vercel.app
  1928. +
  1929. [🚀] https://chatgpt-vercel-gisdamon.vercel.app
  1930. +
  1931. [🚀] https://chatgpt-vercel-gongkai9.vercel.app
  1932. +
  1933. [🚀] https://chatgpt-vercel-goyourway.vercel.app
  1934. +
  1935. [🚀] https://chatgpt-vercel-guhungjou.vercel.app
  1936. +
  1937. [🚀] https://chatgpt-vercel-h.vercel.app
  1938. +
  1939. [🚀] https://chatgpt-vercel-h7ml.vercel.app
  1940. +
  1941. [🚀] https://chatgpt-vercel-hanzhejia.vercel.app
  1942. +
  1943. [🚀] https://chatgpt-vercel-harlan.vercel.app
  1944. +
  1945. [🚀] https://chatgpt-vercel-hexianzhi.vercel.app
  1946. +
  1947. [🚀] https://chatgpt-vercel-hust-hr.vercel.app
  1948. +
  1949. [🚀] https://chatgpt-vercel-hyang57.vercel.app
  1950. +
  1951. [🚀] https://chatgpt-vercel-i5tong.vercel.app
  1952. +
  1953. [🚀] https://chatgpt-vercel-idly.vercel.app
  1954. +
  1955. [🚀] https://chatgpt-vercel-ifangyong.vercel.app
  1956. +
  1957. [🚀] https://chatgpt-vercel-indol-three.vercel.app 404 - Not Found
  1958. +
  1959. [🚀] https://chatgpt-vercel-indol.vercel.app
  1960. +
  1961. [🚀] https://chatgpt-vercel-inky-five.vercel.app
  1962. +
  1963. [🚀] https://chatgpt-vercel-itzsh.vercel.app
  1964. +
  1965. [🚀] https://chatgpt-vercel-jade.vercel.app
  1966. +
  1967. [🚀] https://chatgpt-vercel-jason5680.vercel.app
  1968. +
  1969. [🚀] https://chatgpt-vercel-jcc.vercel.app
  1970. +
  1971. [🚀] https://chatgpt-vercel-jdfcc.vercel.app
  1972. +
  1973. [🚀] https://chatgpt-vercel-jet.vercel.app
  1974. +
  1975. [🚀] https://chatgpt-vercel-jiyu1994.vercel.app
  1976. +
  1977. [🚀] https://chatgpt-vercel-jtxyh.vercel.app
  1978. +
  1979. [🚀] https://chatgpt-vercel-juckz.vercel.app
  1980. +
  1981. [🚀] https://chatgpt-vercel-k3382410.vercel.app
  1982. +
  1983. [🚀] https://chatgpt-vercel-kdf5000.vercel.app
  1984. +
  1985. [🚀] https://chatgpt-vercel-kiwiit.vercel.app
  1986. +
  1987. [🚀] https://chatgpt-vercel-kotobuki09.vercel.app
  1988. +
  1989. [🚀] https://chatgpt-vercel-lac-zeta.vercel.app 404 - Not Found
  1990. +
  1991. [🚀] https://chatgpt-vercel-lake.vercel.app
  1992. +
  1993. [🚀] https://chatgpt-vercel-lblbk.vercel.app
  1994. +
  1995. [🚀] https://chatgpt-vercel-lclee3390.vercel.app
  1996. +
  1997. [🚀] https://chatgpt-vercel-leaders53.vercel.app
  1998. +
  1999. [🚀] https://chatgpt-vercel-leaps339.vercel.app
  2000. +
  2001. [🚀] https://chatgpt-vercel-lemon.vercel.app
  2002. +
  2003. [🚀] https://chatgpt-vercel-lfb-cd.vercel.app
  2004. +
  2005. [🚀] https://chatgpt-vercel-liart-five.vercel.app
  2006. +
  2007. [🚀] https://chatgpt-vercel-likenttt.vercel.app
  2008. +
  2009. [🚀] https://chatgpt-vercel-lime-six.vercel.app
  2010. +
  2011. [🚀] https://chatgpt-vercel-linusp.vercel.app
  2012. +
  2013. [🚀] https://chatgpt-vercel-livid.vercel.app
  2014. +
  2015. [🚀] https://chatgpt-vercel-llki.vercel.app
  2016. +
  2017. [🚀] https://chatgpt-vercel-lovat-delta.vercel.app
  2018. +
  2019. [🚀] https://chatgpt-vercel-lovat.vercel.app
  2020. +
  2021. [🚀] https://chatgpt-vercel-lovinhq.vercel.app
  2022. +
  2023. [🚀] https://chatgpt-vercel-ludyii.vercel.app
  2024. +
  2025. [🚀] https://chatgpt-vercel-lwwwray.vercel.app
  2026. +
  2027. [🚀] https://chatgpt-vercel-marx2014.vercel.app
  2028. +
  2029. [🚀] https://chatgpt-vercel-mauve.vercel.app
  2030. +
  2031. [🚀] https://chatgpt-vercel-maycope.vercel.app
  2032. +
  2033. [🚀] https://chatgpt-vercel-meowtec.vercel.app
  2034. +
  2035. [🚀] https://chatgpt-vercel-moeyys.vercel.app
  2036. +
  2037. [🚀] https://chatgpt-vercel-mpp5.vercel.app
  2038. +
  2039. [🚀] https://chatgpt-vercel-mu-rust.vercel.app
  2040. +
  2041. [🚀] https://chatgpt-vercel-murex.vercel.app
  2042. +
  2043. [🚀] https://chatgpt-vercel-naddod.vercel.app
  2044. +
  2045. [🚀] https://chatgpt-vercel-narwhrl.vercel.app
  2046. +
  2047. [🚀] https://chatgpt-vercel-nine-azure.vercel.app
  2048. +
  2049. [🚀] https://chatgpt-vercel-nine-lovat.vercel.app
  2050. +
  2051. [🚀] https://chatgpt-vercel-nine-psi.vercel.app
  2052. +
  2053. [🚀] https://chatgpt-vercel-nine-rho.vercel.app 404 - Not Found
  2054. +
  2055. [🚀] https://chatgpt-vercel-nu-beryl.vercel.app 404 - Not Found
  2056. +
  2057. [🚀] https://chatgpt-vercel-nu-navy.vercel.app
  2058. +
  2059. [🚀] https://chatgpt-vercel-nu-self.vercel.app
  2060. +
  2061. [🚀] https://chatgpt-vercel-nu-seven.vercel.app
  2062. +
  2063. [🚀] https://chatgpt-vercel-olive.vercel.app
  2064. +
  2065. [🚀] https://chatgpt-vercel-olkb.vercel.app
  2066. +
  2067. [🚀] https://chatgpt-vercel-one-mu.vercel.app
  2068. +
  2069. [🚀] https://chatgpt-vercel-one-omega.vercel.app
  2070. +
  2071. [🚀] https://chatgpt-vercel-one-phi.vercel.app 404 - Not Found
  2072. +
  2073. [🚀] https://chatgpt-vercel-one-rose.vercel.app
  2074. +
  2075. [🚀] https://chatgpt-vercel-opal-one.vercel.app 404 - Not Found
  2076. +
  2077. [🚀] https://chatgpt-vercel-osfpu0.vercel.app
  2078. +
  2079. [🚀] https://chatgpt-vercel-ouxu.vercel.app
  2080. +
  2081. [🚀] https://chatgpt-vercel-peach.vercel.app
  2082. +
  2083. [🚀] https://chatgpt-vercel-phi-six.vercel.app
  2084. +
  2085. [🚀] https://chatgpt-vercel-pi-amber.vercel.app
  2086. +
  2087. [🚀] https://chatgpt-vercel-pi-kohl.vercel.app
  2088. +
  2089. [🚀] https://chatgpt-vercel-pink-nu.vercel.app
  2090. +
  2091. [🚀] https://chatgpt-vercel-pink-tau.vercel.app
  2092. +
  2093. [🚀] https://chatgpt-vercel-pmd7.vercel.app
  2094. +
  2095. [🚀] https://chatgpt-vercel-private-pjq.vercel.app
  2096. +
  2097. [🚀] https://chatgpt-vercel-psi-one.vercel.app
  2098. +
  2099. [🚀] https://chatgpt-vercel-psi-sable.vercel.app
  2100. +
  2101. [🚀] https://chatgpt-vercel-qiangua.vercel.app
  2102. +
  2103. [🚀] https://chatgpt-vercel-qumoptly.vercel.app
  2104. +
  2105. [🚀] https://chatgpt-vercel-red.vercel.app 404 - Not Found
  2106. +
  2107. [🚀] https://chatgpt-vercel-rho-ruby.vercel.app
  2108. +
  2109. [🚀] https://chatgpt-vercel-rika0-0.vercel.app
  2110. +
  2111. [🚀] https://chatgpt-vercel-robin021.vercel.app
  2112. +
  2113. [🚀] https://chatgpt-vercel-rookie1010.vercel.app
  2114. +
  2115. [🚀] https://chatgpt-vercel-rose.vercel.app
  2116. +
  2117. [🚀] https://chatgpt-vercel-rouge-rho.vercel.app
  2118. +
  2119. [🚀] https://chatgpt-vercel-ruby-psi.vercel.app
  2120. +
  2121. [🚀] https://chatgpt-vercel-rust-psi.vercel.app
  2122. +
  2123. [🚀] https://chatgpt-vercel-s337443501.vercel.app
  2124. +
  2125. [🚀] https://chatgpt-vercel-sainnhe.vercel.app
  2126. +
  2127. [🚀] https://chatgpt-vercel-sanfanse.vercel.app
  2128. +
  2129. [🚀] https://chatgpt-vercel-sciencat.vercel.app
  2130. +
  2131. [🚀] https://chatgpt-vercel-self.vercel.app
  2132. +
  2133. [🚀] https://chatgpt-vercel-seven-wheat.vercel.app
  2134. +
  2135. [🚀] https://chatgpt-vercel-shural.vercel.app
  2136. +
  2137. [🚀] https://chatgpt-vercel-sigma-lake.vercel.app
  2138. +
  2139. [🚀] https://chatgpt-vercel-sigma-one.vercel.app 404 - Not Found
  2140. +
  2141. [🚀] https://chatgpt-vercel-silk.vercel.app
  2142. +
  2143. [🚀] https://chatgpt-vercel-six-beige.vercel.app
  2144. +
  2145. [🚀] https://chatgpt-vercel-six-chi.vercel.app
  2146. +
  2147. [🚀] https://chatgpt-vercel-six-zeta.vercel.app
  2148. +
  2149. [🚀] https://chatgpt-vercel-sleavin.vercel.app
  2150. +
  2151. [🚀] https://chatgpt-vercel-smoky.vercel.app 404 - Not Found
  2152. +
  2153. [🚀] https://chatgpt-vercel-snowy.vercel.app
  2154. +
  2155. [🚀] https://chatgpt-vercel-songxff.vercel.app
  2156. +
  2157. [🚀] https://chatgpt-vercel-spades996.vercel.app
  2158. +
  2159. [🚀] https://chatgpt-vercel-sternelee.vercel.app
  2160. +
  2161. [🚀] https://chatgpt-vercel-stool233.vercel.app
  2162. +
  2163. [🚀] https://chatgpt-vercel-stray-z.vercel.app
  2164. +
  2165. [🚀] https://chatgpt-vercel-sudatuu.vercel.app
  2166. +
  2167. [🚀] https://chatgpt-vercel-sunfishlu.vercel.app
  2168. +
  2169. [🚀] https://chatgpt-vercel-swart.vercel.app
  2170. +
  2171. [🚀] https://chatgpt-vercel-tan.vercel.app
  2172. +
  2173. [🚀] https://chatgpt-vercel-tau-rosy.vercel.app
  2174. +
  2175. [🚀] https://chatgpt-vercel-tawny-five.vercel.app
  2176. +
  2177. [🚀] https://chatgpt-vercel-tawny.vercel.app
  2178. +
  2179. [🚀] https://chatgpt-vercel-tbs10086.vercel.app
  2180. +
  2181. [🚀] https://chatgpt-vercel-ten-eta.vercel.app
  2182. +
  2183. [🚀] https://chatgpt-vercel-ten-red.vercel.app
  2184. +
  2185. [🚀] https://chatgpt-vercel-ten-zeta.vercel.app
  2186. +
  2187. [🚀] https://chatgpt-vercel-thebeginning.vercel.app 404 - Not Found
  2188. +
  2189. [🚀] https://chatgpt-vercel-three-rho.vercel.app
  2190. +
  2191. [🚀] https://chatgpt-vercel-three-sepia.vercel.app
  2192. +
  2193. [🚀] https://chatgpt-vercel-tong925.vercel.app
  2194. +
  2195. [🚀] https://chatgpt-vercel-topaz-ten.vercel.app
  2196. +
  2197. [🚀] https://chatgpt-vercel-two-inky.vercel.app
  2198. +
  2199. [🚀] https://chatgpt-vercel-two-rose.vercel.app
  2200. +
  2201. [🚀] https://chatgpt-vercel-two-woad.vercel.app
  2202. +
  2203. [🚀] https://chatgpt-vercel-two.vercel.app
  2204. +
  2205. [🚀] https://chatgpt-vercel-uoox.vercel.app
  2206. +
  2207. [🚀] https://chatgpt-vercel-virid.vercel.app
  2208. +
  2209. [🚀] https://chatgpt-vercel-waltonhe.vercel.app
  2210. +
  2211. [🚀] https://chatgpt-vercel-wheat-seven.vercel.app 404 - Not Found
  2212. +
  2213. [🚀] https://chatgpt-vercel-woad-two.vercel.app
  2214. +
  2215. [🚀] https://chatgpt-vercel-wrxx2019-s-team.vercel.app
  2216. +
  2217. [🚀] https://chatgpt-vercel-wszhdg.vercel.app
  2218. +
  2219. [🚀] https://chatgpt-vercel-wwwatson.vercel.app
  2220. +
  2221. [🚀] https://chatgpt-vercel-x5im.vercel.app 404 - Not Found
  2222. +
  2223. [🚀] https://chatgpt-vercel-xi-orpin.vercel.app
  2224. +
  2225. [🚀] https://chatgpt-vercel-xi-peach.vercel.app
  2226. +
  2227. [🚀] https://chatgpt-vercel-xi-ten.vercel.app
  2228. +
  2229. [🚀] https://chatgpt-vercel-xiaowan.vercel.app
  2230. +
  2231. [🚀] https://chatgpt-vercel-xibexp.vercel.app
  2232. +
  2233. [🚀] https://chatgpt-vercel-xngzs.vercel.app 404 - Not Found
  2234. +
  2235. [🚀] https://chatgpt-vercel-xutaoqq.vercel.app
  2236. +
  2237. [🚀] https://chatgpt-vercel-youngzs.vercel.app
  2238. +
  2239. [🚀] https://chatgpt-vercel-yushuda.vercel.app
  2240. +
  2241. [🚀] https://chatgpt-vercel-ziboh.vercel.app
  2242. +
  2243. [🚀] https://chatgpt-vercel-zttztztz.vercel.app
  2244. +
  2245. [🚀] https://chatgpt-vercel-zuotiya.vercel.app
  2246. +
  2247. [🚀] https://chatgpt-vercel0318.vercel.app
  2248. +
  2249. [🚀] https://chatgpt-vercel1-sandy.vercel.app
  2250. +
  2251. [🚀] https://chatgpt-vercel21.vercel.app
  2252. +
  2253. [🚀] https://chatgpt-vin.vercel.app
  2254. +
  2255. [🚀] https://chatgpt-web-mauve.vercel.app
  2256. +
  2257. [🚀] https://chatgpt-web-plum.vercel.app
  2258. +
  2259. [🚀] https://chatgpt-web-tawny.vercel.app
  2260. +
  2261. [🚀] https://chatgpt-web-ten.vercel.app
  2262. +
  2263. [🚀] https://chatgpt-web-three.vercel.app
  2264. +
  2265. [🚀] https://chatgpt-with-key.vercel.app
  2266. +
  2267. [🚀] https://chatgpt-woad-iota.vercel.app
  2268. +
  2269. [🚀] https://chatgpt-wxai.vercel.app
  2270. +
  2271. [🚀] https://chatgpt-yang.vercel.app
  2272. +
  2273. [🚀] https://chatgpt-yly-demo.vercel.app
  2274. +
  2275. [🚀] https://chatgpt-z1oplk.vercel.app
  2276. +
  2277. [🚀] https://chatgpt10.vercel.app 404 - Not Found
  2278. +
  2279. [🚀] https://chatgpt3-5-seven.vercel.app
  2280. +
  2281. [🚀] https://chatgptturbo.vercel.app
  2282. +
  2283. [🚀] https://chatluqman.vercel.app
  2284. +
  2285. [🚀] https://chatmi.vercel.app
  2286. +
  2287. [🚀] https://chatver.vercel.app
  2288. +
  2289. [🚀] https://chatxx.vercel.app
  2290. +
  2291. [🚀] https://coplus.vercel.app
  2292. +
  2293. [🚀] https://cynb.vercel.app
  2294. +
  2295. [🚀] https://cz-chatgpt.vercel.app
  2296. +
  2297. [🚀] https://david-chatgpt.vercel.app
  2298. +
  2299. [🚀] https://doris-gpt-demo.vercel.app
  2300. +
  2301. [🚀] https://egemen.vercel.app
  2302. +
  2303. [🚀] https://enhance-gpt.vercel.app
  2304. +
  2305. [🚀] https://eryajf.vercel.app
  2306. +
  2307. [🚀] https://fast-chatgpt.vercel.app
  2308. +
  2309. [🚀] https://fiqgpt.vercel.app
  2310. +
  2311. [🚀] https://gpt-ab7s.vercel.app
  2312. +
  2313. [🚀] https://gpt-demo-weekdaycare.vercel.app
  2314. +
  2315. [🚀] https://gpt-dialog-i-huandume.vercel.app
  2316. +
  2317. [🚀] https://gpt-ljwh.vercel.app
  2318. +
  2319. [🚀] https://gpt3-xirezati.vercel.app
  2320. +
  2321. [🚀] https://index-ai.vercel.app
  2322. +
  2323. [🚀] https://jkdlkjdsaljk.vercel.app 404 - Not Found
  2324. +
  2325. [🚀] https://lukobichatgpt.vercel.app
  2326. +
  2327. [🚀] https://markerchatgpt.vercel.app
  2328. +
  2329. [🚀] https://moss-gpt.vercel.app
  2330. +
  2331. [🚀] https://my-audience01.vercel.app
  2332. +
  2333. [🚀] https://my-chatgpt-eight.vercel.app
  2334. +
  2335. [🚀] https://mygpt-jet.vercel.app
  2336. +
  2337. [🚀] https://oliver-chatgpt-demo-bak.vercel.app
  2338. +
  2339. [🚀] https://personal-chatgpt-alanwang.vercel.app
  2340. +
  2341. [🚀] https://qxbug.vercel.app
  2342. +
  2343. [🚀] https://sherlock-iota.vercel.app
  2344. +
  2345. [🚀] https://sincgpt.vercel.app
  2346. +
  2347. [🚀] https://speakwithgodnow.vercel.app 404 - Not Found
  2348. +
  2349. [🚀] https://studiochatsandbox.vercel.app
  2350. +
  2351. [🚀] https://sure-peach.vercel.app
  2352. +
  2353. [🚀] https://tbh-ai-test.vercel.app
  2354. +
  2355. [🚀] https://testwizef.vercel.app
  2356. +
  2357. [🚀] https://tj-chatgpt.vercel.app
  2358. +
  2359. [🚀] https://try-chat-gpt.vercel.app
  2360. +
  2361. [🚀] https://u-web-seven.vercel.app
  2362. +
  2363. [🚀] https://uzgpt.vercel.app
  2364. +
  2365. [🚀] https://vercel-wopao.vercel.app 404 - Not Found
  2366. +
  2367. [🚀] https://wust.vercel.app
  2368. +
  2369. [🚀] https://ytdb.vercel.app
  2370. +
  2371. [🔒🚀] https://chatgpt-demo-fork.vercel.app
  2372. +
  2373. [❓] https://chat.brandonng.cc 404 - Not Found
  2374. +
  2375. [❓] https://chat.aisa.top 308 - Permanent Redirect
  2376. +
  2377. [❓🚀] https://msicom.vercel.app 404 - Not Found
  2378. +
  2379. [❓🚀] https://chatgpt-vercel-hime-hina.vercel.app 404 - Not Found
  2380. +
  2381. [❓🚀] https://chatgpt-vercel-zicen.vercel.app 500 - Internal Server Error
  2382. +
  2383. [❓🚀] https://chatgpt-vercel-nine-rose.vercel.app 404 - Not Found
  2384. +
  2385. [❓] https://chatgpt.icyh.top 403 - Forbidden
  2386. +
  2387. [❓🚀] https://chatgpt-vercel-mocha-nine.vercel.app 500 - Internal Server Error
  2388. +
  2389. [❓🚀] https://chatgpt-vercel-annidy.vercel.app 500 - Internal Server Error
  2390. +
  2391. [❓🔒🚀] https://gptbot-rho.vercel.app 404 - Not Found
  2392. +
  2393. [❓🚀] https://chatgpt-demo-phi-dusky.vercel.app 404 - Not Found
  2394. +
  2395. [❓🚀] https://chatgpt-demo-6.vercel.app 404 - Not Found
  2396. +
  2397. [❓🚀] https://chatgpt-demo-gamma-sable.vercel.app 404 - Not Found
  2398. +
  2399. [❓🚀] https://chatgpt-demo-q19889030.vercel.app 404 - Not Found
  2400. +
  2401. [❓🚀] https://chatgpt-demo-ten-beryl.vercel.app 404 - Not Found
  2402. +
  2403. [❓🚀] https://chatgpt-demo-1-nu.vercel.app 404 - Not Found
  2404. +
  2405. [❓🚀] https://chatgpt-demo-li.vercel.app 404 - Not Found
  2406. +
  2407. [❓🚀] https://chatgpt1-rho.vercel.app 404 - Not Found
  2408. +
  2409. [❓🚀] https://chatgpt-ws.vercel.app 404 - Not Found
  2410. +
  2411. [❓🚀] https://chatgpt-demo-cyan-xi.vercel.app 404 - Not Found
  2412. +
  2413. [❓🚀] https://chatgpt-demo-880802ll.vercel.app 404 - Not Found
  2414. +
  2415. [❓] https://ai.ppclub.ml 308 - Permanent Redirect
  2416. +
  2417. [❓🚀] https://ai-cyan.vercel.app 404 - Not Found
  2418. +
  2419. [❓🚀] https://chatgpt-five-mu.vercel.app 404 - Not Found
  2420. +
  2421. [❓🚀] https://chatgpt-demo-omega-amber.vercel.app 404 - Not Found
  2422. +
  2423. [❓] https://chatgpt.singee.me 403 - Forbidden
  2424. +
  2425. [❓🚀] https://chatgpt-demo-six-nu.vercel.app 404 - Not Found
  2426. +
  2427. [❓🚀] https://chatgpt-demo-chi-six.vercel.app 404 - Not Found
  2428. +
  2429. [❓🚀] https://chatgpt-china-dashabi.vercel.app 404 - Not Found
  2430. +
  2431. [❓🚀] https://askgodchat.vercel.app 404 - Not Found
  2432. +
  2433. [❓🚀] https://chatgpt-vercel-one-beta.vercel.app 404 - Not Found
  2434. +
  2435. [❓🚀] https://chatgpt-vercel-three-roan.vercel.app 404 - Not Found
  2436. +
  2437. [❓🚀] https://chatgpt-vercel-roan.vercel.app 404 - Not Found
  2438. +
  2439. [❓🚀] https://chatgpt-vercel-flame-phi.vercel.app 404 - Not Found
  2440. +
  2441. [❓🚀] https://chat-with-gpt-sooty.vercel.app 404 - Not Found
  2442. +
  2443. [❌20230310⛔] https://gpt.demo.com 描述示例项
  2444. +
  2445. [❌⭐] https://fastgpt.app 无法访问
  2446. +
  2447. [❌] https://chat.chunkiu.hk 无回复,key 失效
  2448. +
  2449. [❌] https://chat.tgbot.co 开始封号了,停止公开服务观察一段时期
  2450. +
  2451. [❌] https://chatgpt.himehina.space
  2452. +
  2453. [❌] https://chat.axz.me 308 - Permanent Redirect
  2454. +
+

开源地址

lzwme/chatgpt-sites

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ChatGPT\344\275\277\347\224\250\346\261\207\346\200\273/index.html" "b/ChatGPT\344\275\277\347\224\250\346\261\207\346\200\273/index.html" index e69de29bb2..feec455cd4 100644 --- "a/ChatGPT\344\275\277\347\224\250\346\261\207\346\200\273/index.html" +++ "b/ChatGPT\344\275\277\347\224\250\346\261\207\346\200\273/index.html" @@ -0,0 +1,638 @@ + + + + + + + + + + + + ChatGPT使用汇总 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

大家好,我是一个热爱人工智能和搜索引擎的小白,今天我想跟大家分享一下如何使用ChatGPT和新版必应来创作和搜索。

+

什么是ChatGPT和新版必应?

ChatGPT 是一个由OpenAI开发的聊天机器人,它基于OpenAI的GPT-3系列大型语言模型,并且使用了监督学习和强化学习技术进行微调。ChatGPT可以以对话方式交互,回答后续问题,承认错误,挑战错误前提,拒绝不恰当的请求等。它还可以生成各种类型的内容,比如代码、诗歌、故事、歌词等。

+

新版必应是微软(Microsoft)的搜索引擎,它可以帮助用户快速而容易地从搜索到执行。新版必应最近也结合了ChatGPT,并推出了具有人工智能聊天功能的新版必应。新版必应可以回答用户复杂问题和具有创作能力。

+

免费网站

ChatGPT在线版: http://chat.wangwangit.com/

+

Bing在线版:http://bing.wangwangit.com/

+

ChatGPT注册流程

参考文章: 最新Chatgpt微信机器人搭建教程 - 一只会飞的旺旺 (wangwangit.com)

+

**注意: **

+
    +
  • 如果提示所在国家不可用,切换一下 VPN 节点即可(目前尝试香港是不可用的)
  • +
  • 注册 OpenAI 过程中需要用到国外电话号码,如果没有国外号码可以使用接码平台
  • +
+

新Bing ChatGPT申请教程

参考文章: 必应ChatGPT内测申请教程 - 一只会飞的旺旺 (wangwangit.com)

+

注意:

+
    +
  • 网络要求:全程不需要梯子,访问速度取决于你的网络环境与微软服务的状况,这也是本教程区别于其他教程最重要的一点。
  • +
  • 避免跳转:用此方法能避免大陆地区跳转 cn.bing.com ,使用原版必应搜索,目前也只有原版必应升级为新必应,国内暂时使用不到。
  • +
  • 完全免费:申请属于个人,体验融合 ChatGPT-4 的新必应,目前没有限制,避免使用第三方套壳应用的隐私安全和额外支出。
  • +
+

AI工具汇总

参考文章: AI Tool Hunt - The Ultimate Directory for Discovering the Best AI Tools

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ChatGPT\345\205\215\350\264\271\345\205\261\344\272\253\350\264\246\345\217\267/index.html" "b/ChatGPT\345\205\215\350\264\271\345\205\261\344\272\253\350\264\246\345\217\267/index.html" index e69de29bb2..ce3145f00c 100644 --- "a/ChatGPT\345\205\215\350\264\271\345\205\261\344\272\253\350\264\246\345\217\267/index.html" +++ "b/ChatGPT\345\205\215\350\264\271\345\205\261\344\272\253\350\264\246\345\217\267/index.html" @@ -0,0 +1,702 @@ + + + + + + + + + + + + ChatGPT免费共享账号 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

共享chatgpt免费账号,让你轻松体验最先进的聊天机器人。点击进入,立即注册,享受无限制的对话乐趣。

+

🤖全网价格最低账号: 一只会飞的旺旺 (wangwangit.com) 点击直达访问

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ChatGPT账号密码
4brelfbro@yunweiloginmh3.comlin26870
6enmntfv1@yunweiloginmh3.comhe063479
epn_f_6_f@yunweiloginmh3.comhong8259
aa9ugcyre@yunweiloginmh3.comqi354035
p8cwghjw0@yunweiloginmh3.comzhong689
5y3td7igg@yunweiloginmh3.comhe530176
ogvmp4xmf@yunweiloginmh3.comfang5956
oqnt8qkul@yunweiloginmh3.comban30108
3jal9z7bm@yunweiloginmh3.comcheng465
rqbcu71yx@yunweiloginmh3.comai046012
elhqd6h2b@yunweiloginmh3.comqu565909
oqv-fii1j@yunweiloginmh3.comjie26062
kui5k5hms@yunweiloginmh3.comling3202
thlgxss64@yunweiloginmh3.comshe90159
cnc86yljh@yunweiloginmh3.comwu062191
tasfdsnta@yunweiloginmh3.combing8245
si4mmza3x@yunweiloginmh3.comhao46712
n9kkoxavp@yunweiloginmh3.comlei51372
kqfsiu6pe@yunweiloginmh3.comjing7026
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ChatGPT\345\270\270\350\247\201\351\227\256\351\242\230/index.html" "b/ChatGPT\345\270\270\350\247\201\351\227\256\351\242\230/index.html" index e69de29bb2..8954db77a7 100644 --- "a/ChatGPT\345\270\270\350\247\201\351\227\256\351\242\230/index.html" +++ "b/ChatGPT\345\270\270\350\247\201\351\227\256\351\242\230/index.html" @@ -0,0 +1,687 @@ + + + + + + + + + + + + ChatGPT部署教程(新)及常见问题 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

注册教程

前提

    +
  • 能正常访问谷歌,既使用科学上网或者代理
  • +
  • 一个国外的手机号,若没有可以查看后面末尾教程!
  • +
+

注册OpenAI账号

打开OpenAI官方注册页面: openai.com

+

按照下图依次操作即可!

+

image-20230629202407903

+

输入邮箱密码!

+

image-20230629202502619

+

这时,邮箱会收到邮件,点击下方的校验按钮!

+

image-20230102132902982

+

页面需要填写一些个人信息,可以随便填写!然后下一步,就会要求输入手机号! (请查看末尾有关手机号的获取教程),此处最新可能添加了一个验证机制,按页面提示操作即可!

+

image-20230629201845149

+

在接码平台获取到验证码后,填入即可

+

image-20230629201954216

+

然后就会自动跳转到ChatGPT使用页面了!

+

image-20230629202014613

+

手机号获取

推荐平台链接地址:sms-activate.org
若不行可以使用其他接码平台!

+

具体过程包含以下几步:

+
    +
  1. 通过自己的邮箱注册 sms-activate.org 账号并完成邮箱验证(其他接码平台同理,但是不一定每个都好用,sms-activate是博主亲自验证过的)
  2. +
  3. 打开邮箱查收验证邮件并点击确认完成 sms-activate.org 账号认证
  4. +
  5. 登录sms-activate并且在右上角找到充值按钮,点击进行充值
  6. +
  7. 点击充值跳转后,往下滑找到支付宝,这里建议大家充值0.2美金就可以了(不够用再充)。
  8. +
  9. 充值好了以后回到首页搜索「open」关键字就可以找到 OpenAI 验证码的临时号码购买链接。
  10. +
  11. 在右侧激活区看到待使用的临时号码,将此号码复制到 OpenAI 的验证码接收区里面。
  12. +
  13. 在 OpenAI 的页面点击发送验证码,这样就可以在接码平台接收到验证码(有时候有一点慢需要耐心等待一下),将验证码填进去,这样就完成 ChatGPT 手机号验证了。
  14. +
+

这一步比较长,但是操起其实也不复杂,简单说就是通过接码平台收验证码完成验证,大家只要按照步骤操作就能成功。

+

下面是每一步的操作图,大家可以对照操作。

+

image-20230102132936962

+

打开邮箱找到验证邮件

+

image-20230102132954319

+

image-20230102133002823

+

image-20230102133009033

+

image-20230102133015061

+

image-20230102133028331

+

基本概念

提示词 Prompts

设计提示词本质上就是对模型进行“编程”,这通常是通过提供一些指令或几个示例来完成。这与大多数其他 NLP 服务不同,后者是为单个任务设计的,例如情绪分类或命名实体识别。相反,补全(Completions)和聊天补全(Chat Completions)几乎可用于任何任务,包括内容或代码生成、摘要、扩展、对话、创意写作、风格转换等。

+

令牌 Token

我们的模型通过将文本分解为令牌(Token)来理解和处理文本。Token 可以是单词,也可以是字符块。例如,单词“hamburger”被分解成标记“ham”、“bur”和“ger”,而很短且常见的单词像“pear”是一个 Token。许多 Token 以空格开头,例如“ hello”和“ bye”。

+

在给定的 API 请求中处理的 Token 数量取决于您的输入和输出长度。作为一个粗略的经验法则,对于英文文本,1 个Token大约相当于 4 个字符或 0.75 个单词。要记住的一个限制是,您的文本提示词和生成的补全合起来不能超过模型的最大上下文长度(对于大多数模型,这是 2048 个 Token,或大约 1500 个单词)。可以查看我们的 分词器工具 来了解有关文本如何转换为 Token 的更多信息。

+

模型 Models

API 由一组具有不同功能和价位的模型提供支持。GPT-4是我们最新和最强大的模型。GPT-3.5-Turbo 是为 ChatGPT 提供支持的模型,此模型专为对话模式进行了优化。要了解有关这些模型以及其他我们提供的内容的更多信息,请访问模型文档。

+

常见问题

ChatGPT普通版与Plus版本区别?如何升级?

    +
  • 普通版基于模型GPT3.5,Plus除了可以使用3.5外,还可以使用4.0的模型,另外,现在Plus还支持各种插件的使用!若只是体验,可以使用普通版和Bing,若是要重度体验,可以购买Plus
  • +
  • Plus官方售价20美元,目前只有国外信用卡或部分虚拟卡才能开通,以及使用苹果上的官方软件进行内购!这一步需要全程稳定的国外网络环境
  • +
  • 针对市面上的Plus低价或者高价,基本上都是黑卡开通的,建议找到合适的渠道,不要被坑!使用时间基本上都是看运气,可能2,3天,也可能一个月
  • +
  • 建议使用苹果自己内购,内购需要美国Appstore账号,可以根据我的历史文章,自行申请,注意选择免税州.另外新申请的账号可能会被限制内购,可以选择联系客服或者将账号登录着放一段时间再试!联系客服会有风险,可自行百度查一下!
  • +
  • 目前市面上买的普通账号,邮箱后缀若不是比较常见的,基本上都是机器注册,所以没必要买贵的
    API和账号的是两个不同的东西,账号注册一般会有5美元的赠送金额,这个是API使用的,可以前往 https://platform.openai.com/account/api-keys 生成一个apikey,就可以在很多国内镜像站使用,避免科学上网,同样,API也分3.5,4.0,其中4.0的API需要申请,基本上只有Plus用户才会通过,并且几率极低
  • +
  • 市面上卖的API,实际上都是通过绑绑定黑卡赠送的额度,有效期是从开始使用到下一个收费结算日,这并不是赠金!可能有5,120,10000,50000等额度,若是3.5的api,价格不会太高,请自行筛选,同时要注意一号多卖!
  • +
+

如何优化自己提问的prompt?

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ChatGPT\346\220\255\345\273\272\346\225\231\347\250\213/index.html" "b/ChatGPT\346\220\255\345\273\272\346\225\231\347\250\213/index.html" index e69de29bb2..d20d7cbf49 100644 --- "a/ChatGPT\346\220\255\345\273\272\346\225\231\347\250\213/index.html" +++ "b/ChatGPT\346\220\255\345\273\272\346\225\231\347\250\213/index.html" @@ -0,0 +1,713 @@ + + + + + + + + + + + + 最新Chatgpt微信机器人搭建教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

注意

+

机器人搭建已经失效,请前往github搜索最新的部署方案!

+

账号申请请查看最新的文章!本篇可能已经过时!!!

+

ChatGPT 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人的能力。这么强大的工具我们都想体验一下,那么 ChatGPT 怎么用呢?本文将给你逐步详细介绍。

+

使用 ChatGPT 主要有4步:

+
    +
  1. 注册 ChatGPT 账号
  2. +
  3. 通过短信接码平台 sms-activate.org 完成 ChatGPT 手机号验证
  4. +
  5. 登录 ChatGPT 账号,对话框输入,开始使用 Chat GPT !
  6. +
  7. 输入任意话题,探索 ChatGPT 的强大功能
  8. +
+

好了,我们开始逐步图文介绍。

+

1.注册 Chat GPT 账号

注冊ChatGPT这一步主要包含以下几步(需要按照顺序逐步操作):

+
    +
  1. 将网络环境切换成国外ip(注意:必须是国外 ip 如美国、加拿大等,香港澳门 ip 是不行的),且后续整个注册流程都必须在此网络环境下进行。
  2. +
  3. 打开 https://chat.openai.com/auth/login 链接并使用自己的邮箱进行账号注册
  4. +
  5. 打开邮箱查收 OpenAI 账号验证邮件,点击验证按钮完成邮箱验证
  6. +
+

下面每一个步骤的图片,大家可以对照着进行操作

+

image-20230102132844215

+

image-20230102132850950

+

image-20230102132857008

+

image-20230102132902982

+

邮箱验证完成后,我们第一步注册 ChatGPT 账号就算完成了,但是到这里我们还不能开始使用 ChatGPT,因为我们还需要进行手机号码验证。没有通过手机号码验证是使用不了 OpenAI(ChatGPT的开发商) 的服务的。

+

国内和港澳的手机号码还有 Google Voice 的虚拟号码都是不能使用的。那要怎么验证呢,请看下一步。

+

2.完成 ChatGPT 手机号码验证

这一步需要用到接码平台完成手机号验证,推荐平台链接地址:sms-activate.org

+

具体过程包含以下几步:

+
    +
  1. 通过自己的邮箱注册 sms-activate.org 账号并完成邮箱验证(其他接码平台同理,但是不一定每个都好用,sms-activate是博主亲自验证过的)
  2. +
  3. 打开邮箱查收验证邮件并点击确认完成 sms-activate.org 账号认证
  4. +
  5. 登录sms-activate并且在右上角找到充值按钮,点击进行充值
  6. +
  7. 点击充值跳转后,往下滑找到支付宝,这里建议大家充值0.2美金就可以了(不够用再充)。
  8. +
  9. 充值好了以后回到首页搜索「open」关键字就可以找到 OpenAI 验证码的临时号码购买链接。
  10. +
  11. 在右侧激活区看到待使用的临时号码,将此号码复制到 OpenAI 的验证码接收区里面。
  12. +
  13. 在 OpenAI 的页面点击发送验证码,这样就可以在接码平台接收到验证码(有时候有一点慢需要耐心等待一下),将验证码填进去,这样就完成 ChatGPT 手机号验证了。
  14. +
+

这一步比较长,但是操起其实也不复杂,简单说就是通过接码平台收验证码完成验证,大家只要按照步骤操作就能成功。

+

下面是每一步的操作图,大家可以对照操作。

+

image-20230102132936962

+

打开邮箱找到验证邮件

+

image-20230102132954319

+

image-20230102133002823

+

image-20230102133009033

+

image-20230102133015061

+

image-20230102133022610

+

image-20230102133028331

+

历经千辛万苦,我们终于可以开始使用 ChatGPT 啦,恭喜!

+

3.登录 ChatGPT 账号并开始使用

注册完后,我们去 ChatGPT 网站去登陆: https://chat.openai.com/auth/login

+

输入我们上面第一步注册好的账号密码就可以成功登录。

+

登录以后我们会进入到 ChatGPT 的主界面,在屏幕的正下方就是我们使用 ChatGPT 的输入对话框,ChatGPT采用交互式对话界面,使用非常便捷友好,你可以任意输入你感兴趣的内容并敲回车,ChatGPT 将会回答你。

+

image-20230102133050925

+

比如我们问一下 ChatGPT 梯形相关的问题,看看他会怎么回答。

+

image-20230102133104398

+

4.搭建微信机器人

安装python环境

前往python官网下载安装包,然后解压,将该目录配置到电脑环境变量中.如图

+

image-20230102133917867

+

安装node环境

前往node官网下载最新的node版本,然后按提示安装即可

+

image-20230102133524565

+

安装完成之后,打开cmd,输入npm -v, node -v能正常显示版本号,即安装成功!

+

image-20230102133627221

+

安装Google

前往谷歌官网,下载浏览器,这一步是必须的!

+

部署程序

下载代码chatgpt到本地,并解压

+

image-20230102133328242

+

进入目录,打开cmd输入以下命令

+
npm install && poetry install
+
+

等待执行完成,复制文件夹中的config.yaml.example,重命名为config.yaml,并打开填入自己的chatgpt账号

+

image-20230102134305374

+

image-20230102134336100

+

修改完成之后,在到cmd执行npm run dev即可,等待程序自行打开谷歌浏览器,手动点过cloudflare的验证,然后程序会自行填入账号密码,cmd中出现微信二维码,使用微信小号扫码登录即可!

+

image-20230102134545827

+

最后

上述步骤已经完成微信机器人搭建,只要去给你登录的微信账号发消息,即可获得回复!

+

image-20230102134648428

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Claude3\345\215\201\347\247\215\350\256\277\351\227\256\346\226\271\345\274\217/index.html" "b/Claude3\345\215\201\347\247\215\350\256\277\351\227\256\346\226\271\345\274\217/index.html" index e69de29bb2..289ef926ea 100644 --- "a/Claude3\345\215\201\347\247\215\350\256\277\351\227\256\346\226\271\345\274\217/index.html" +++ "b/Claude3\345\215\201\347\247\215\350\256\277\351\227\256\346\226\271\345\274\217/index.html" @@ -0,0 +1,629 @@ + + + + + + + + + + + + Claude3十种访问方式 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

想要体验Claude3吗?这里为你整理了10种访问方式,让你轻松畅享这一创新的AI助手。快来看看吧!

+
    +
  1. **Arena.lmsys.org**:通过该网址,你可以直接访问Opus、Sonnet和Haiku版本的Claude,而且完全免费!点击直接访问
  2. +
  3. AWS Bedrock:在亚马逊云服务上,你可以免费访问Sonnet和Haiku版本的Claude。点击直接访问
  4. +
  5. OpenRouter.ai:这个平台提供了Opus、Sonnet和Haiku版本的Claude,但需要按流量收费。点击直接访问
  6. +
  7. Zaiwen.top:这个网站提供了Opus和Haiku版本的Claude,免费使用。还有免费的Haiku版本供选择。点击直接访问
  8. +
  9. ChatHub.gg:通过代理访问,你可以免费使用Sonnet版本的Claude。点击访问
  10. +
  11. Claude.ai:这是Claude的唯一官方网站,提供了Opus和Sonnet版本的Claude,其中Sonnet版本免费使用。点击访问
  12. +
  13. **Poe.com**:通过代理访问,你可以免费使用Opus、Sonnet和Haiku版本的Claude。点击访问
  14. +
  15. Perplexity Labs:这个实验室提供了免费的Haiku版本的Claude,通过代理访问即可体验。点击访问
  16. +
  17. Nat.dev:通过代理访问,你可以按流量收费使用Opus、Sonnet和Haiku版本的Claude。点击访问
  18. +
  19. **You.com**:这个网站提供了Opus、Sonnet和Haiku版本的Claude,你可以免费体验一下。点击访问
  20. +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Claude\345\277\253\351\200\237\344\275\277\347\224\250\346\225\231\347\250\213/index.html" "b/Claude\345\277\253\351\200\237\344\275\277\347\224\250\346\225\231\347\250\213/index.html" index e69de29bb2..dc430e3678 100644 --- "a/Claude\345\277\253\351\200\237\344\275\277\347\224\250\346\225\231\347\250\213/index.html" +++ "b/Claude\345\277\253\351\200\237\344\275\277\347\224\250\346\225\231\347\250\213/index.html" @@ -0,0 +1,647 @@ + + + + + + + + + + + + Claude免排队使用教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

OpenAI 前副总裁创立的 Claude 或可与ChatGPT 竞争,支持使用 API 从第三方接入,还接入了 Slack ,目前需要申请 Waitlist。目前测试无需代理即可使用!

+

申请试用候补(可跳过)

地址:https://www.anthropic.com/

+

直接进群组

发现有些人按下面的教程无法顺利使用了,可以直接点这个链接进我的群组,同样可以使用!

+

https://join.slack.com/t/wangwangit/shared_invite/zt-1sxv7wmli-4pRspiQ4xFA08Rk~exBGQg

+

免申请使用

1.打开网站 https://t.co/x4SVklb6NM 点击登录安装

+

image-20230412122725443

+

2.我是用google账号直接登录的

+

image-20230412122826962

+

3.点击在Slack打开

+

image-20230412122856221

+

4.直接从浏览器打开此链接

+

image-20230412122915041

+

5.开始对话!

+

image-20230412123019857

+

手机端使用

执行完上面的步骤,安装Slack这款软件,即可实现在手机端对话,软件地址:slack.apk | 一只会飞的旺旺 (wangwangit.com)

+

image-20230412123154915

+

最后

我创建了一个AI交流群,会实时分享新的好玩的资源,有兴趣的可以扫码进群,若群二维码失效,可以扫下方个人二维码拉你进群!

+

image-20230402165946824

+

image-20230402165951361

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Command\345\274\200\346\272\220AI\347\232\204\346\234\252\346\235\245/index.html" "b/Command\345\274\200\346\272\220AI\347\232\204\346\234\252\346\235\245/index.html" index e69de29bb2..84b7277e80 100644 --- "a/Command\345\274\200\346\272\220AI\347\232\204\346\234\252\346\235\245/index.html" +++ "b/Command\345\274\200\346\272\220AI\347\232\204\346\234\252\346\235\245/index.html" @@ -0,0 +1,639 @@ + + + + + + + + + + + + Command R+开源AI的未来 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ + + + +
+ +
+
+
+ + +
  1. 1. 地址
+ +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

在AI的浩瀚宇宙中,有一个新星正在闪耀——Command R+。这个开源的大型语言模型不仅在技术排行榜上名列前茅,更以其开放性和高性能赢得了全球开发者的关注和喜爱。

+

开源精神的胜利

+

Command R+是由CohereAI推出的一款开源大语言模型,拥有1040亿参数,支持多种语言,包括英语、中文、法语和德语。这个模型对内置的检索增强生成(RAG)进行了全面强化,其性能仅次于GPT-4的早期版本,已经成为开源模型中的佼佼者

+

UPDATE-LLMs-performance-1-1024x355

+

UPDATE-Human-Preference-Eval-Multi-Step-Reasoning-1-1024x411

+

UPDATE-Multilingual-Evals-1024x658

+

排行榜上的新星

+

在LM-SYS的大模型匿名评测中,Command R+获得了1.3万次的投票,Arena Elo得分1194,使其成为目前开源模型中得分最高的模型,总排行第六。这一成就标志着开源模型在大模型领域的快速进展,展示了其在多样化任务中的潜力和实用性。

+

image-20240412221151084

+

免费试用,探索未知

+

最激动人心的是,Cohere提供了免费的API接口,让每个人都能轻松接触和使用这些先进的AI模型。你只需在dashboard.cohere.com上注册账户,即可开始免费试用,体验AI的魔力。

+

多语言能力,跨界沟通

+

Command R+不仅支持多种语言,还能执行跨语言任务,如翻译或回答其他语言内容的问题。无论你使用哪种语言,Command R+都能理解并作出响应,这使得它成为全球用户的理想选择

+

创新的应用,无限的可能

+

Command R+的开源特性意味着任何人都可以参与到这个项目中来,无论是改进模型、开发新功能,还是创建独特的应用,都有无限的可能。这不仅是技术的胜利,更是开源精神的胜利。

+

地址

https://coral.cohere.com/

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ELK\351\203\250\347\275\262\346\216\245\345\205\245/index.html" "b/ELK\351\203\250\347\275\262\346\216\245\345\205\245/index.html" index e69de29bb2..78d13a08d9 100644 --- "a/ELK\351\203\250\347\275\262\346\216\245\345\205\245/index.html" +++ "b/ELK\351\203\250\347\275\262\346\216\245\345\205\245/index.html" @@ -0,0 +1,813 @@ + + + + + + + + + + + + ELK集群部署接入教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

引言

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

+

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

+

一个完整的集中式日志系统,需要包含以下几个主要特点:

+
    +
  • 收集-能够采集多种来源的日志数据
  • +
  • 传输-能够稳定的把日志数据传输到中央系统
  • +
  • 存储-如何存储日志数据
  • +
  • 分析-可以支持 UI 分析
  • +
  • 警告-能够提供错误报告,监控机制
  • +
+

ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。

+

简述

Elasticsearch: 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

+

Logstash: 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

+

Kibana: 一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

+

image-20220928201954649

+

部署

1. 创建安装目录

/elk_cluster/node/es1/data/
+/elk_cluster/node/es2/data/
+/elk_cluster/logstash/
+/elk_cluster/plugins/
+
+

2. 在logstash目录下创建logstash.conf

http.host: "0.0.0.0"
+xpack.monitoring.elasticsearch.hosts: [ "http://{服务器ip}:9200","http://{服务器ip}:9201" ]
+
+

3.在logstash目录下创建logstash-springboot.conf

input {
+  tcp {
+    mode => "server"
+    host => "0.0.0.0"
+    port => 4560
+    codec => json_lines
+  }
+}
+output {
+  elasticsearch {
+    hosts => [ "http://{服务器ip}:9200","http://{服务器ip}:9201" ]
+    index => "springboot-logstash-%{+YYYY.MM.dd}"
+  }
+}
+
+

4.在es1目录,es2目录下创建elasticsearch.yml

# es1
+cluster.name: elasticsearch-cluster
+node.name: es-node1
+network.bind_host: 0.0.0.0
+network.publish_host: _eth0_
+http.port: 9200
+transport.tcp.port: 9300
+http.cors.enabled: true
+http.cors.allow-origin: "*"
+node.master: true
+node.data: true
+discovery.seed_hosts: ["ES01:9300","ES02:9301"]
+cluster.initial_master_nodes: ["es-node1","es-node2"]
+discovery.zen.minimum_master_nodes: 1
+
+
#es2
+cluster.name: elasticsearch-cluster
+node.name: es-node2
+network.bind_host: 0.0.0.0
+network.publish_host: _eth0_
+http.port: 9200
+transport.tcp.port: 9300
+http.cors.enabled: true
+http.cors.allow-origin: "*"
+node.master: true
+node.data: true
+discovery.seed_hosts: ["ES01:9300","ES02:9301"]
+cluster.initial_master_nodes: ["es-node1","es-node2"]
+discovery.zen.minimum_master_nodes: 1
+
+

5.配置docker-compose.yml文件

在/elk_cluster/下创建docker-compose.yml文件,内容如下

+
# 镜像自行调整,此为arm架构服务器使用模板
+version: '3.7'
+services:
+  es1:
+    image: elasticsearch:7.17.4
+    container_name: ES01
+    environment:
+      ES_JAVA_OPTS: -Xms512m -Xmx512m
+    ports:
+      - "9200:9200"
+      - "9300:9300"
+    volumes:
+      - "./node/es1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
+      - "./node/es1/data:/usr/share/elasticsearch/data"
+    networks:
+      - es-net
+  es2:
+    image: elasticsearch:7.17.4
+    container_name: ES02
+    environment:
+      ES_JAVA_OPTS: -Xms512m -Xmx512m
+    ports:
+      - "9201:9200"
+      - "9301:9300"
+    volumes:
+      - "./node/es2/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
+      - "./node/es2/data:/usr/share/elasticsearch/data"
+    networks:
+      - es-net
+  es-head:
+    image: aichenk/elasticsearch-head:5-alpine
+    ports:
+      - "9100:9100"
+  kibana:
+    image: kibana:7.17.4
+    container_name: kibana
+    volumes:
+      - "./kibana.yml:/opt/kibana/config/kibana.yml" #挂载logstash的配置文件
+    environment:
+      - SERVER_NAME=kibana
+      - XPACK_MONITORING_ENABLED=true
+    ports:
+      - 5601:5601
+    networks:
+      - es-net
+    depends_on:
+      - es1
+    external_links:
+      - es1
+
+  logstash:
+    image: logstash:7.17.4
+    container_name: logstash
+    restart: always
+    volumes:
+      - "./logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf" #挂载logstash的配置文件
+      - "./logstash/logstash.yml:/usr/share/logstash/config/logstash.yml" #挂载logstash的配置文件
+    ports:
+      - "4560:4560"
+    depends_on:
+      - es1
+      
+networks:
+  es-net:
+    driver: bridge
+
+

6.配置kibana汉化

在docker-compose.yml文件同级目录创建kibana.yml文件

+
#
+# ** THIS IS AN AUTO-GENERATED FILE **
+#
+
+# Default Kibana configuration for docker target
+server.publicBaseUrl: "http://{服务器ip}:5601"  # 这里地址改为你访问kibana的地址,不能以 / 结尾
+server.name: kibana
+server.host: "0.0.0.0"
+server.shutdownTimeout: "5s"
+elasticsearch.hosts: [ "http://{服务器ip}:9200","http://{服务器ip}:9201" ]
+monitoring.ui.container.elasticsearch.enabled: true
+# 汉化
+i18n.locale: zh-CN
+
+

7.启动docker-compose

进入docker-compose.yml同级目录,执行docker-compose up -d,启动服务

+

Springboot项目集成

1.添加Logstash依赖

<!--集成logstash-->
+<dependency>
+    <groupId>net.logstash.logback</groupId>
+    <artifactId>logstash-logback-encoder</artifactId>
+    <version>5.3</version>
+</dependency>
+
+

2.配置logback-spring.xml

<!-- 指定后面用到的APP_NAME取值 --> 
+<springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="wechat-person"/> 
+<!-- 添加以下内容,将日志输出到Logstash日志收集端口 -->  
+    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>{服务器ip}:4560</destination>
+        <!-- 日志输出编码 -->
+        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                <timestamp>
+                    <timeZone>UTC</timeZone>
+                </timestamp>
+                <pattern>
+                    <pattern>
+                        {
+                        "app": "${APP_NAME}",
+                        "level": "%level",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "message": "%message",
+                        "stack_trace": "%exception{10}"
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>
+
+

3.在kibana中配置索引模式

image-20220928202100153

+

然后进入Discover,即可看到日志数据

+

image-20220928202109835

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Elasticsearch\345\270\270\347\224\250\345\221\275\344\273\244/index.html" "b/Elasticsearch\345\270\270\347\224\250\345\221\275\344\273\244/index.html" index e69de29bb2..628e1dd518 100644 --- "a/Elasticsearch\345\270\270\347\224\250\345\221\275\344\273\244/index.html" +++ "b/Elasticsearch\345\270\270\347\224\250\345\221\275\344\273\244/index.html" @@ -0,0 +1,1274 @@ + + + + + + + + + + + + Elasticsearch常用命令 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Elasticsearch常用命令

# 分词器ik_max_word 最细粒度的拆分
+POST _analyze
+{
+  "analyzer": "ik_max_word",
+  "text": "南京市长江大桥"
+}
+
+
+# ik_smart 最粗粒度的拆分
+POST _analyze
+{
+  "analyzer": "ik_smart",
+  "text": "南京市长江大桥"
+}
+
+
+# 创建索引
+PUT /zfzn
+
+# 判断索引是否存在
+HEAD /zfzn
+
+# 查看索引,多个用逗号拼接
+GET /zfzn
+
+# 查看所有索引
+GET _all
+
+GET /_cat/indices?v
+
+# 打开索引
+POST /zfzn/_open
+
+# 关闭索引
+POST /zfzn/_close
+
+# 删除索引
+DELETE /zfzn
+
+
+# 创建映射(表字段)
+PUT /zfzn
+PUT /zfzn/_mapping/
+{
+  "properties":{
+    "name":{
+      "type":"text",
+      "analyzer":"ik_max_word"
+    },
+    "age":{
+      "type":"integer"
+    },
+    "remark":{
+      "type":"text"
+    }
+  }
+}
+
+
+PUT /zfzn1
+{
+  "mappings": {
+    "properties": {
+      "name": {
+        "type": "text",
+        "analyzer": "ik_max_word"
+      },
+      "age": {
+        "type": "integer"
+      },
+      "remark": {
+        "type": "text"
+      }
+    }
+  }
+}
+
+
+# 查看映射(表字段)
+GET /zfzn/_mapping
+
+# 查看所有映射
+GET /_all/_mapping
+
+# 修改映射(只能增加字段)
+PUT /zfzn/_mapping/
+{
+  "properties":{
+    "name":{
+      "type":"text",
+      "analyzer":"ik_max_word"
+    },
+    "age":{
+      "type":"integer"
+    },
+    "remark":{
+      "type":"text"
+    },
+    "sex":{
+      "type":"text"
+    }
+  }
+}
+
+
+# 新增文档(表数据)
+POST /zfzn/_doc/1
+{
+  "name":"小冰",
+  "age":"19",
+  "remark":"我是一个演员",
+  "sex":"女"
+}
+
+
+# 查看单个文档
+GET /zfzn/_doc/1
+
+# 查看所有文档
+GET /zfzn/_search
+{
+  "query": {
+    "match_all": {}
+  }
+}
+
+# 查询指定字段
+GET /zfzn/_doc/1?_source=name,age
+
+# 更新文档(id存在则更新,不存在则新增)
+PUT /zfzn/_doc/1
+{
+  "name":"小冰改",
+  "age":"19",
+  "remark":"我是一个演员",
+  "sex":"女"
+}
+
+
+# 更新指定字段
+POST /zfzn/_update/1
+{
+  "doc": {
+    "remark":"不当演员,我要回家种田"
+  }
+}
+
+# 删除文档(根据ID)
+DELETE /zfzn/_doc/-jRdFYIBm3HYdyw3Px1X
+
+# 根据条件删除  (注意name使用了分词器)
+POST /zfzn/_delete_by_query
+{
+  "query":{
+    "match":{
+      "name" : "小莫"
+    }
+  }
+}
+
+# 删除所有文档
+POST /zfzn/_delete_by_query
+{
+  "query": {
+    "match_all": {}
+  }
+}
+
+
+# 新增测试数据
+POST /zfzn/_doc
+{
+  "name":"林动",
+  "age":"29",
+  "remark":"我是一个辣鸡",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"林子",
+  "age":"3",
+  "remark":"我是一个零",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"萧炎",
+  "age":"25",
+  "remark":"我是一个动漫",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"鳄鱼",
+  "age":"39",
+  "remark":"我是一个鱼",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"花生",
+  "age":"39",
+  "remark":"我是一个花",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"电脑",
+  "age":"15",
+  "remark":"我是一个电",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"无天",
+  "age":"66",
+  "remark":"我是一个天",
+  "sex":"男"
+}
+
+POST /zfzn/_doc
+{
+  "name":"无花电脑001",
+  "age":"66",
+  "remark":"我是一个天",
+  "sex":"男"
+}
+
+
+POST /zfzn/_doc
+{
+  "name":"无花001电脑",
+  "age":"66",
+  "remark":"我是一个天",
+  "sex":"男"
+}
+
+
+POST /zfzn/_doc
+{
+  "name":"无花看起来真不错啊001有什么好吃的电脑",
+  "age":"66",
+  "remark":"我是一个天",
+  "sex":"男"
+}
+
+
+
+# 多词条查询(默认or条件)
+POST /zfzn/_search
+{
+  "query": {
+    "match": {
+      "name": "无花电脑"
+    }
+  }
+}
+
+
+POST /zfzn/_search
+{
+  "query": {
+    "match": {
+      "name":{
+        "query": "无花电脑","operator": "and"
+      }
+    }
+  }
+}
+
+# 短语搜索
+GET /zfzn/_search
+{
+  "query": {
+    "match_phrase": {
+      "name": "无花 001"
+    }
+  }
+}
+
+GET /zfzn/_search
+{
+  "query": {
+    "match_phrase": {
+      "name": {
+        "query": "无花 001",
+        "slop": 2
+      }
+      
+    }
+  }
+}
+
+# 高级查询,无需指定字段匹配
+GET /zfzn/_search
+{
+  "query": {
+    "query_string": {
+      "query": "天"
+    }
+  }
+}
+
+GET /zfzn/_search
+{
+  "query": {
+    "query_string": {
+      "query": "天",
+      "default_field": "name"
+    }
+  }
+}
+
+GET /zfzn/_search
+{
+  "query": {
+    "query_string": {
+      "query": "天",
+      "fields": ["name","remark"]
+    }
+  }
+}
+
+
+# 词条搜索,不分析搜索词 
+
+
+PUT /zfzn
+PUT /zfzn/_mapping/
+{
+  "properties":{
+    "name":{
+      "type":"keyword"
+    },
+    "age":{
+      "type":"integer"
+    },
+    "remark":{
+      "type":"text"
+    }
+  }
+}
+
+
+
+POST /zfzn/_search
+{
+  "query": {
+    "term": {
+      "name": "天"
+    }
+  }
+}
+
+# 多词条
+GET /zfzn/_search
+{
+  "query": {
+    "terms": {
+      "name": [
+        "天",
+        "萧"
+      ]
+    }
+  }
+}
+
+# 范围搜索
+
+GET /zfzn/_search
+{
+  "query": {
+    "range": {
+      "age": {
+        "gte": 10,
+        "lte": 30
+      }
+    }
+  }
+}
+
+
+# 非空搜索
+
+POST /zfzn/_doc
+{
+  "name":"",
+  "age":"66",
+  "remark":"我是空的",
+  "sex":"男"
+}
+
+GET /zfzn/_search
+{
+  "query": {
+    "exists": {
+      "field": "name"
+    }
+  }
+}
+
+
+# 前缀搜索
+GET /zfzn/_search
+{
+  "query": {
+    "prefix": {
+      "name": "无"
+    }
+  }
+}
+
+
+# 通配符搜索
+GET /zfzn/_search
+{
+  "query": {
+    "wildcard": {
+      "name": "001*"
+    }
+  }
+}
+
+
+# 正则搜索
+GET /zfzn/_search
+{
+  "query": {
+    "regexp": {
+      "name": "无*"
+    }
+  }
+}
+
+
+# 模糊搜索
+GET /zfzn/_search
+{
+  "query": {
+    "fuzzy": {
+      "name": "萧"
+    }
+  }
+}
+
+# ids搜索
+
+GET /zfzn/_search
+{
+  "query": {
+    "ids": {
+      "type": "_doc",
+      "values": [
+        "QDSIFYIBm3HYdyw3Dx_k",
+        "QTSIFYIBm3HYdyw3ER8Q"
+      ]
+    }
+  }
+}
+
+
+# 布尔搜索
+
+POST /zfzn/_search
+{
+  "query": {
+    "bool": {
+      "must": {
+        "match": {
+          "name": "天"
+        }
+      },
+      "filter": {
+        "term": {
+          "name": "无"
+        }
+      },
+      "must_not": {
+        "range": {
+          "age": {
+            "gte": 60,
+            "lte": 90
+          }
+        }
+      },
+      "boost": 1
+    }
+  }
+}
+
+
+# 排序
+POST /zfzn/_search
+{
+  "query": {
+    "match_all": {}
+  },
+  "sort": [
+    {
+      "age": {
+        "order": "desc"
+      }
+    }
+  ]
+}
+
+
+# 分页
+POST /zfzn/_search
+{
+  "query": {
+    "match_all": {}
+  },
+  "size": 2,
+  "from": 0
+}
+
+
+# 函数使用
+POST /zfzn/_search
+{
+  "size": 0,
+  "aggs": {
+    "max_age": {
+      "max": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+POST /zfzn/_search
+{
+  "size": 0,
+  "aggs": {
+    "min_age": {
+      "min": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+POST /zfzn/_search
+{
+  "size": 0,
+  "aggs": {
+    "sum_age": {
+      "sum": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+
+# 计数
+POST /zfzn/_count
+{
+  "query": {
+    "range": {
+      "age": {
+        "gt": 10
+      }
+    }
+  }
+}
+
+# 某字段有值的文档数
+POST /zfzn/_search?size=0
+{
+  "aggs": {
+    "age_count": {
+      "value_count": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+
+# 去重计数
+POST /zfzn/_search?size=0
+{
+  "aggs": {
+    "age_count": {
+      "cardinality": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+
+# 统计多个函数值
+POST /zfzn/_search?size=0
+{
+  "aggs": {
+    "price_stats": {
+      "stats": {
+        "field": "age"
+      }
+    }
+  }
+}
+
+# 分组 带having
+POST /zfzn/_search
+{
+  "size": 0,
+  "aggs": {
+    "group_by_age": {
+      "range": {
+        "field": "age",
+        "ranges": [
+          {
+            "from": 0,
+            "to": 20
+          },
+          {
+            "from": 20,
+            "to": 40
+          },
+          {
+            "from": 40,
+            "to": 100
+          }
+        ]
+      },
+      "aggs": {
+        "average_age": {
+          "avg": {
+            "field": "age"
+          }
+        },
+        "having": {
+          "bucket_selector": {
+            "buckets_path": {
+              "avg_age": "average_age"
+            },
+            "script": {
+              "source": "params.avg_age >= 50 "
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Excel\345\257\274\345\207\272\345\257\274\345\205\245\345\256\236\347\216\260/index.html" "b/Excel\345\257\274\345\207\272\345\257\274\345\205\245\345\256\236\347\216\260/index.html" index e69de29bb2..f08bdabbfd 100644 --- "a/Excel\345\257\274\345\207\272\345\257\274\345\205\245\345\256\236\347\216\260/index.html" +++ "b/Excel\345\257\274\345\207\272\345\257\274\345\205\245\345\256\236\347\216\260/index.html" @@ -0,0 +1,688 @@ + + + + + + + + + + + + Easypoi导入导出Excel - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

官网地址

Easypoi开发文档

+

导出实例

+
// 导出导入实体类
+@Data
+public class R implements Serializable, IExcelModel, IExcelDataModel {
+
+    private static final long serialVersionUID = -3099653964677586050L;
+
+    private int rowNum;
+
+    private String errorMsg;
+
+    @Excel(name = "导入字段", width = 20)
+    @NotBlank
+    private String field;
+
+
+    @Override
+    public Integer getRowNum() {
+        return rowNum;
+    }
+
+    @Override
+    public void setRowNum(Integer rowNum) {
+        this.rowNum = rowNum;
+    }
+
+    @Override
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    @Override
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+}
+
+
    public void exportExcel(HttpServletResponse response, HttpServletRequest request) throws IOException {
+        Workbook workbook;
+        String filename = "导出.xlsx";
+        ExportParams exportParams = new ExportParams();
+        exportParams.setDictHandler(deviceTypeHandler);
+        workbook = ExcelExportUtil.exportExcel(exportParams, R.class, new ArrayList<>());
+        // 告诉浏览器用什么软件可以打开此文件
+        response.setHeader("content-Type", "application/vnd.ms-excel");
+        // 下载文件的默认名称
+        response.setHeader("Content-Disposition", "attachment;filename=utf-8" + URLEncoder.encode(filename, "UTF-8"));
+        response.setCharacterEncoding("UTF-8");
+        workbook.write(response.getOutputStream());
+    }
+
+

导入实例

public Result importExcel(MultipartFile file) throws Exception {
+        ImportParams importParams = new ImportParams();
+        importParams.setNeedVerify(true);
+        importParams.setDictHandler(deviceTypeHandler);
+        ExcelImportResult<R> result = ExcelImportUtil.importExcelMore(file.getInputStream(), R.class, importParams);
+        // 错误打印业务逻辑
+        if (result.isVerifyFail()) {
+            return Result.error(result.getFailList().stream().map(item -> "第" + item.getRowNum() + "行报错,错误信息:" + item.getErrorMsg()).collect(Collectors.joining(",")));
+        } else {
+               // 导入数据处理业务逻辑
+            return Result.success("导入成功");
+        }
+    }
+
+

最后

最近要写导出导入,长时间没用导致都忘了写法了,特此记录一下,方便日后使用!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Git\345\270\270\347\224\250\345\221\275\344\273\244/index.html" "b/Git\345\270\270\347\224\250\345\221\275\344\273\244/index.html" index e69de29bb2..f29b2d80b1 100644 --- "a/Git\345\270\270\347\224\250\345\221\275\344\273\244/index.html" +++ "b/Git\345\270\270\347\224\250\345\221\275\344\273\244/index.html" @@ -0,0 +1,793 @@ + + + + + + + + + + + + Git常用命令 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Git常用命令 +

Git常用命令

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
命令说明
git init <directory>在指定目录创建一个空的Git仓库。如果不带参数,则在当前目录初始化为Git仓库。
git clone <repo>克隆位于 <repo> 的仓库到本地机器。原始仓库可以位于本地文件系统或通过 HTTP 或 SSH 位于远程机器上。
git config --global user.name <name>定义用于当前仓库所有提交的作者名称。开发者通常使用 -global 标志为当前用户设置配置选项。
git add <directory> 中的所有更改暂存到下一次提交中。将 <directory> 替换为 <file> 可以针对特定文件进行更改。
git commit -m <message>提交已暂存的快照,但不会启动文本编辑器,而是使用 <message> 作为提交消息。
git status显示暂存、未暂存和未跟踪的文件列表。
git log使用默认格式显示完整的提交历史记录。
git diff显示索引和工作目录之间未暂存的更改。
git revert <commit>创建一个新的提交,撤消在 <commit> 中进行的所有更改,然后将其应用于当前分支。
git reset <file>从暂存区中移除 <file>,但不更改工作目录。这将取消暂存文件,而不会覆盖任何更改。
git clean -n显示将从工作目录中删除的文件列表。
git commit --amend用暂存的更改和上一次提交的更改组合替换最后一次提交。如果没有暂存任何内容,则可编辑最后一次提交的消息。
git rebase <base>将当前分支变基到 <base><base> 可以是提交ID、分支名称、标签或相对于HEAD的引用。
git remote add <name> <url>创建到远程仓库的新连接。添加远程后,您可以在其他命令中使用 <name> 作为 <url> 的快捷方式。
git fetch <remote> <branch>从仓库中获取特定 <branch>。省略 <branch> 以获取所有远程引用。
git pull <remote>获取指定远程仓库的当前分支的副本,并立即将其合并到本地副本。
git push <remote> <branch>将分支推送到 <remote>,包括必要的提交和对象。如果远程仓库中不存在该分支,则创建命名分支。
git config --global user.name <name>定义当前用户的所有提交的作者名称。
git config --global user.email <email>定义当前用户的所有提交的作者电子邮件。
git config --global alias.<alias> <git command>为Git命令创建一个快捷方式。例如,alias.glog "log --graph --oneline" 将使 git glog 等同于 git log --graph --oneline
git config --system core.editor <editor>设置用于所有用户的机器上的命令使用的文本编辑器。<editor:arg> 应为启动所需编辑器的命令,例如 vi
git config --global --edit使用文本编辑器打开全局配置文件进行手动编辑。
git log -<limit>限制提交数量为 <limit>。例如,”git log -5” 将限制为5个提交。
git log --oneline将每个提交压缩为一行显示。
git log -p显示每个提交的完整差异。
git log --stat显示每个提交的修改的文件以及添加或删除的相对行数。
git log --author=<pattern>搜索特定作者的提交。
git log --grep="<pattern>"显示提交消息匹配 <pattern> 的提交。
git log <since>..<until>显示在 <since><until> 之间发生的提交。参数可以是提交ID、分支名称、HEAD 或任何其他类型的修订引用。
git log -- <file>仅显示涉及指定文件的提交。
git log --graph --decorate在提交消息左侧绘制基于文本的提交图。使用 --decorate 添加显示提交的分支或标签的名称。
git diff HEAD显示工作目录与上一次提交之间的差异。
git diff --cached显示暂存更改与上一次提交之间的差异。
git reset将暂存区重置为最近的提交,但保持工作目录不变。
git reset --hard将暂存区和工作目录重置为最近的提交,并覆盖工作目录中的所有更改。
git reset <commit>将当前分支的提交点向后移动到 <commit>,重置暂存区以匹配,但保持工作目录不变。
git reset --hard <commit>将当前分支的提交点向后移动到 <commit>,重置暂存区和工作目录以匹配,并删除 <commit> 之后的所有提交。
git rebase <base>将当前分支交互式变基到 <base>。启动编辑器以输入如何将每个提交转移到新的基准的命令。
git pull --rebase <remote>获取指定远程仓库的当前分支的副本,并将其变基到本地分支。使用 git rebase 而不是合并来整合分支。
git push <remote> --force强制执行 git push,即使结果是非快进合并。不要使用 --force 标志,除非您确切知道自己在做什么。
git push <remote> --all将所有本地分支推送到指定的远程仓库。
git push <remote> --tags将所有本地标签推送到远程仓库。标签在推送分支或使用 --all 标志时不会自动推送。
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Git\346\225\231\347\250\213\344\273\216\345\205\245\351\227\250\345\210\260\345\205\245\345\234\237/index.html" "b/Git\346\225\231\347\250\213\344\273\216\345\205\245\351\227\250\345\210\260\345\205\245\345\234\237/index.html" index e69de29bb2..952971fed7 100644 --- "a/Git\346\225\231\347\250\213\344\273\216\345\205\245\351\227\250\345\210\260\345\205\245\345\234\237/index.html" +++ "b/Git\346\225\231\347\250\213\344\273\216\345\205\245\351\227\250\345\210\260\345\205\245\345\234\237/index.html" @@ -0,0 +1,966 @@ + + + + + + + + + + + + Git教程从入门到入土 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

简介

Git 是一个用于管理源代码的分布式版本控制系统。

+

那么什么是版本控制?简而言之,版本控制是用于跟踪文件更改的系统。修改文件时,版本控制系统会记录并保存每个更改。这允许您随时还原以前版本的代码。

+

发展历程

本地版本控制系统

最初的版本控制系统,它们使用简单的数据库或文件复制的方式来保存不同的版本,但是容易出错和丢失数据。例如 RCS。

+

集中式版本控制系统

后来出现的版本控制系统,它们使用一个中央服务器来保存所有文件的修订版本,而客户端通过网络连接来取出或提交更新。这样可以方便地管理权限和协作,但是也有单点故障和必须联网的缺点。例如 CVS、SVN和 Perforce。

+

分布式版本控制系统

最新的版本控制系统,它们允许每个客户端完整地镜像整个代码仓库,包括所有的历史记录。这样可以提高速度和安全性,也可以支持更灵活的协作模式。例如 Git、Mercurial、Bazaar 和 Darcs

+

作用

    +
  • 跟踪代码历史记录
  • +
  • 方便团队协作处理代码
  • +
  • 便于代码溯源,查看谁进行了哪些更改
  • +
  • 将代码部署到过渡或生产环境
  • +
+

安装

Windows

    +
  1. 下载最新的 Git for Windows 安装程序

    +
  2. +
  3. 成功启动安装程序后,应会看到 Git 安装程序向导屏幕。按照“下一步”和“完成”提示完成安装。默认选项对于大多数用户来说非常明智。

    +
  4. +
  5. 打开命令提示符(如果在安装过程中选择不使用 Windows 命令提示符下的 Git,则打开 Git Bash)。
    image-20230526151632523

    +
  6. +
  7. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

    +
    $ git config --global user.name "wangwangit"
    +$ git config --global user.email "wangwangit@qq.com"
    +
    +
  8. +
+

Linux

    +
  1. 在 shell 中,使用 apt-get 安装 Git:

    +
    $ sudo apt-get update
    +$ sudo apt-get install git
    +
    +
  2. +
  3. 通过键入 git --version 验证安装是否成功:

    +
    $ git --version
    +git version 2.9.2
    +
    +
  4. +
  5. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

    +
    $ git config --global user.name "wangwangit"
    +$ git config --global user.email "wangwangit@qq.com"
    +
    +
  6. +
+

MacOS

    +
  1. 下载最新的 Git for Mac 安装程序。Git for Mac installer

    +
  2. +
  3. 按照提示安装 Git。

    +
  4. +
  5. 打开终端并通过键入 git --version 验证安装是否成功:

    +
    $ git --version
    +git version 2.9.2
    +
    +
  6. +
  7. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

    +
    $ git config --global user.name "wangwangit"
    +$ git config --global user.email "wangwangit@qq.com"
    +
    +
  8. +
+

基本概念

Git是一个版本控制系统,包括三个主要组件:存储库(Repository)、工作树(Working Tree)和索引(Index)。了解这些组件以及Git中的文件状态对于有效的协作和代码管理至关重要。

+

主要组件

image-20230527093735968

+
    +
  1. 存储库(Repository):存储库是跟踪项目文件变化的“容器”。它保存了所有的提交(Commits),即特定时间点上文件的快照。可以使用Git日志访问提交历史记录。
  2. +
  3. 工作树(Working Tree):工作树,也称为工作目录,包含当前正在处理的文件。它类似于一个文件系统,您可以根据需要查看和修改文件。
  4. +
  5. 索引(Index):索引,也称为暂存区域(Staging Area),是准备提交的中间步骤。它在工作树和存储库之间起到桥梁作用。当您在工作树中对文件进行更改时,索引会跟踪并将其标记为已修改,然后才能提交更改。
  6. +
+

工作流程

基本的Git工作流程包括以下步骤:

+
    +
  1. 修改文件:根据项目需求修改工作树中的文件。
  2. +
  3. 暂存更改:有选择性地暂存要包含在下一次提交中的更改。暂存允许您准备具有特定修改的提交,同时排除其他修改。
  4. +
  5. 提交更改:执行提交操作,永久保存更改。此过程将索引中的文件作为快照存储在存储库中。在提交时,通常会包含描述性消息以总结所做的更改。
  6. +
+

文件状态

image-20230527093759496

+

Git中的文件可以存在三种主要状态:

+
    +
  1. 已修改:当您修改文件时,更改仅存在于工作树中,尚未包含在存储库或索引中。
  2. +
  3. 已暂存:暂存是指准备要包含在下一次提交中的更改的过程。处于已暂存状态的文件已添加到索引中,并且其修改将在即将进行的提交中排队等待。
  4. +
  5. 已提交:一旦提交更改,Git将索引中的文件作为快照存储在存储库中。已提交的
  6. +
+

远程存储库和本地存储库

image-20230527095236101

+
    +
  • 远程存储库托管在多个团队成员之间共享的远程或异地服务器上。
  • +
  • 本地存储库托管在本地计算机上供单个用户使用。
  • +
+

虽然我们可以在本地存储库中利用 Git 版本控制功能,但协作功能(例如与团队成员一起拉取和推送代码更改)将更适合远程存储库。

+

SSH密钥

SSH密钥是什么

SSH 密钥是一种用于 SSH(安全外壳)网络协议的访问凭证。SSH 是一种用于在不安全的开放网络上进行远程机器之间的认证和加密的安全网络协议。SSH 可用于远程文件传输,网络管理和远程操作系统访问。SSH 这个缩写也用来描述一组用于与 SSH 协议交互的工具。

+

如何生成SSH密钥

    +
  1. 执行下面命令创建密钥,此命令将使用电子邮件作为标签创建新的 SSH 密钥

    +
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    +
    +
  2. +
  3. 系统将提示您“输入要在其中保存密钥的文件”。您可以指定一个文件位置, 或者按“Enter”键接受默认 的文件位置。

    +
    > Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
    +
    +
  4. +
  5. 下一个提示会要求您输入一个安全 的密码短语。 密码短语会为 SSH 增加一层额外 的安全性, 并且每次使用 SSH 密 钮时都需要输入密码短语。 如果有人获得了存储私钥的计算机的访问权限,他们也可能获得使用该密钥的任何系统的访问权限。为密钥添加密码短语可以防止这种情况发生。

    +
  6. +
  7. ssh-agent是另一个属于SSH工具套件的程序。ssh-agent负责保存私钥。可以把它想象成一个钥匙链。除了保存私钥外,它还代理使用私钥对SSH请求进行签名的请求,以便私钥不会不安全地传递。

    +
  8. +
  9. 在将新的SSH密钥添加到ssh-agent之前,首先确保ssh-agent正在运行,通过执行:

    +
    $ eval "$(ssh-agent -s)"
    +
    +

    一旦ssh-agent运行起来,以下命令将把新的SSH密钥添加到本地SSH代理。

    +
    $ ssh-add ~/.ssh/id_rsa
    +
    +

    新的SSH密钥现在已经注册并准备好使用了!

    +
  10. +
+

分支

什么是分支

Git 分支本质上是一个独立的开发线。它将您的工作与其他团队成员的工作隔离开来。

+

image-20230529140907770

+

image-20230529140951104

+

创建分支

git branch issue1
+
+

image-20230529141047313

+

切换分支

git checkout issue1
+
+

对于新存储库,Git 默认将 HEAD 指向主分支。更改 HEAD 指向的位置将更新您当前的活动分支。

+

~(波浪号)和 ^(插入符号)符号用于指向相对于特定提交的位置。这些符号与提交引用一起使用,通常是 HEAD 或提交哈希。

+

image-20230529142453301

+

每当切换到工作树中具有未提交更改(或添加了新文件)的另一个分支时,这些未提交的更改也将传递到切换到的新分支。您提交的更改将提交到新切换的分支。

+

但是,如果 Git 发现新切换分支中的文件与上一个分支中的未提交更改之间存在冲突,则不允许切换到另一个分支。在切换分支之前,必须先提交或存储这些更改。可以使用如下命令进行暂存

+
git stash
+
+

合并分支

    +
  • git merge
    保留对合并分支的所有更改和历史记录。在许多合并提交后,修订历史记录可能会变得复杂。
  • +
  • git rebase
    保持干净的修订历史记录,因为合并的提交附加到目标分支的末尾。冲突可能比合并方法更频繁地发生,需要立即解决。
  • +
+

image-20230529143023576

+

标记

Git 标记用于标记和标记历史记录中的特定提交。标记通常用于指示发布版本,其中版本名称(即 v1.0)是标记的名称。有两种类型的 Git 标记:

+
    +
  • 轻量级标记
    轻量级标记类似于不会更改的分支。它只是直接指向历史记录中的特定提交。轻量级标签主要临时用于本地工作区。
  • +
  • 带注释的标记
    带注释的标记是校验和的,通常在您计划标记重要提交时使用。您可以添加注释、签名、日期以及标记者的姓名和电子邮件。
  • +
+

简单的工作流程

developer - review pr

+

开始

创建存储库

创建新的存储库

此示例假定你已有一个要在其中创建存储库的现有项目文件夹。

+

首先 cd 到根项目文件夹,然后执行 git init 命令。

+
cd /path/to/your/existing/code 
+git init
+
+

以下命令具有同等效果

+
git init <project directory>
+
+

image-20230527100019061

+

克隆已有存储库

如果已在中央存储库中设置了项目,则可以使用git clone获取本地工作副本.

+
git clone <repo url>
+
+

Git 支持几种不同的网络协议和相应的 URL 格式。例如SSH,HTTP等

+

image-20230527100521011

+

代码提交

Git 不会自动保存您所做的每项更改。您必须通过暂存这些更改来告诉 Git 要记录哪些更改。暂存后,可以提交更改,以便将它们记录在存储库中。

+

image-20230527102658500

+

现在,您已经克隆或初始化了存储库,您可以向其提交文件版本更改。以下示例假定您已在 /path/to/project 处设置了一个项目。此示例中执行的步骤如下:

+
    +
  • 将目录更改为 /path/to/project
  • +
  • 创建一个包含内容的新文件 hello.txt “hello git”
  • +
  • git 将 hello.txt 添加到存储库暂存区域
  • +
  • 创建一个新提交,其中包含一条消息,描述在提交中完成了哪些工作
  • +
+

image-20230527101911038

+

执行此示例后,存储库现在会将 hello.txt 添加到历史记录中,并将跟踪文件的未来更新。

+

git add

git add命令用于将文件的更改添加到暂存区(即将更改的文件添加到下一次提交中)。它将修改过的文件从工作目录添加到Git的暂存区,准备进行提交。使用git add可以选择性地将特定文件或整个目录添加到暂存区。

+

git commit

git commit命令用于将暂存区中的更改提交到本地代码仓库。提交操作将创建一个新的提交记录,该记录包含了暂存区中文件的当前状态。每次提交都需要包含一个描述性的提交消息,以便更好地描述所做的更改。

+

推送仓库

如果用 git clone 创建本地库,就可以用 git push 同步远程库。如果用 git init 创建本地库,就要先在托管服务上建远程库,再用 Git URL 链接本地库。

+

git remote

git remote add <remote_name> <remote_repo_url>
+
+

此命令会将 远程存储库映射到本地存储库中 。映射远程存储库后,可以将本地分支推送到该存储库。

+

git config

git config是一个命令行工具,用于配置Git安装或单个仓库的选项。这些选项可以影响Git的行为和外观,例如你的用户名、邮箱、文本编辑器、别名等。Git存储配置选项在三个不同的文件中,分别对应于本地仓库、用户或整个系统的设置。你可以用不同的标志来指定配置选项的作用范围,也可以直接编辑纯文本文件来修改。

+

配置文件:

+
    +
  • 系统级:$(prefix)/etc/gitconfig。这里的选项对系统上所有用户和仓库都有效。使用–system标志来设置或读取这个文件中的选项。
  • +
  • 用户级:~/.gitconfig。这里的选项只对当前用户和他的所有仓库有效。使用–global标志来设置或读取这个文件中的选项。
  • +
  • 仓库级:.git/config。这里的选项只对当前仓库有效。使用–local标志或不使用任何标志来设置或读取这个文件中的选项。
  • +
+

当这些文件中的选项发生冲突时,本地设置会覆盖用户设置,用户设置会覆盖系统设置。如果你打开任何一个文件,你会看到类似以下内容:

+
[user]
+    name = John Smith
+    email = john@example.com
+[alias]
+    st = status
+    co = checkout
+    br = branch
+    up = rebase
+    ci = commit
+[core]
+    editor = vim
+
+

git push

git push -u <remote_name> <local_branch_name>
+
+

此命令会将 < local_branch_name > 下的本地存储库分支推送到 < remote_name > 的远程存储库。

+

差异分析

git diff

Git diff 是一个命令,它可以比较两个数据源,并显示它们之间的差异。数据源可以是提交、分支、文件等。例如,你可以使用 git diff 来:

+
    +
  • 查看你已经修改但尚未暂存的变化(git diff)。
  • +
  • 查看你已经暂存但尚未提交的变化(git diff --staged)。
  • +
  • 查看两个提交之间的差异(git diff commit1 commit2)。
  • +
  • 查看两个分支之间的差异(git diff branch1 branch2)。
  • +
  • 查看你的工作目录和一个特定提交之间的差异(git diff commit)。
  • +
+

暂存更改

git stash

git stash 命令获取未提交的更改(暂存和未暂存),保存这些更改以供以后使用,然后从工作副本中还原它们。

+

您可以使用 git stash pop 重新应用以前隐藏的更改,会从存储中删除更改,并将它们重新应用于工作副本。

+

或者,您可以将更改重新应用于工作副本,并将它们保留在存储中,通过使用用 git stash apply

+

下图是关于git statsh命令作用文件的范围:

+

image-20230601162344522

+

忽略文件

Git 将工作副本中的每个文件视为以下三件事之一:

+
    +
  • tracked: 先前已暂存或提交的文件;
  • +
  • untracked: 尚未暂存或提交的文件
  • +
  • ignored: 一个 Git 被明确告知忽略的文件。
  • +
+

忽略的文件通常是构建工件和计算机生成的文件,这些文件可以从存储库源派生,否则不应提交。一些常见的例子是:

+
    +
  • 依赖项缓存,例如 /node_modules/packages 的内容
  • +
  • 编译的代码,例如 .o.pyc.class 文件
  • +
  • 生成输出目录,例如 /bin/out/target
  • +
  • 运行时生成的文件,例如 .log.lock.tmp
  • +
  • 隐藏的系统文件,例如 .DS_StoreThumbs.db
  • +
  • 个人 IDE 配置文件,例如 .idea/workspace.xml
  • +
+

.gitignore

.gitignore 是一个文件,用于指定 Git 应该忽略的文件。已经被 Git 跟踪的文件不受影响。

+

.gitignore 文件中的每一行都是一个匹配模式,可以使用通配符、前缀、后缀等规则来匹配文件或目录。

+

.gitignore 文件可以放在项目的根目录或任何子目录中,也可以放在 $GIT_DIR/info/exclude 或由 core.excludesFile 配置变量指定的文件中。

+

.gitignore 文件的作用是让 Git 忽略一些不需要版本控制的文件,比如编译生成的文件、临时文件、编辑器生成的文件等。

+

管理存储库

git status

git status 命令显示工作目录和暂存区域的状态。它使你能够查看哪些更改已暂存,哪些尚未暂存,以及哪些文件未被 Git 跟踪。状态输出不会显示有关已提交项目历史记录的任何信息。

+

git log

git log 命令显示已提交的快照。它允许您列出项目历史记录、对其进行过滤并搜索特定更改。

+

git tag

git tag是指向 Git 历史记录中特定点的引用。标记通常用于捕获用于标记版本(即 v1.0.1)的历史记录点。标签就像一个不会改变的分支。与分支不同,标签在创建后没有进一步的提交历史记录。

+

撤销变更

Git 最有价值的功能之一是能够撤消错误。当您进行新提交时,Git 会存储项目的快照,以便您可以在需要时返回到早期版本。

+

git checkout

git checkout用于切换工作目录到指定的分支、标签或提交记录。

+

如下: 根据一个历史提交,签出一个新的分支

+
git checkout -b new_branch_without_crazy_commit
+
+

git revert

image-20230527104616212

+

git revert 命令是一种向前移动的撤消操作,它提供了一种撤消更改的安全方法。还原不会删除或孤立提交历史记录中的提交,而是创建一个新的提交,该提交将反向更改指定的提交记录。

+

示例

+

image-20230527110259587

+

我们对存储库进行了 3 次提交,其中我们添加了一个文件 1.txt 并修改了两次其内容。在存储库设置过程结束时,我们传入了 HEAD 引用。这将还原最新的提交。Git revert 期望传入一个提交引用,如果没有提交引用,则不会执行。可以看到执行完成之后,状态回到了上一步提交时.

+

参数

+
    +
  • -e –edit : 这是一个默认选项,不需要指定。此选项将打开配置的系统编辑器,并提示您在提交还原之前编辑提交消息
  • +
  • –no-edit : 这是 -e 选项的反转。还原不会打开编辑器。
  • +
  • -n –no-commit : 传递此选项将阻止 git revert 创建反向提交目标提交的新提交。此选项不会创建新的提交,而是将反向更改添加到暂存索引和工作目录。
  • +
+

git reset

image-20230527104643300

+

有三种重置模式:

+
    +
  • Mixed(default)
    移动Head指针,并重置暂存区,当保留工作目录的更改
  • +
  • Soft
    只移动Head指针,不改变暂存区和工作目录
  • +
  • Hard
    移动Head指针,并且重置暂存区和工作目录,丢弃所有未提交的更改
  • +
+

image-20230529092512688

+

示例

+

假设你有一个Git仓库,里面有三个提交,分别是A,B和C,如下图所示:

+

image

+

现在你的HEAD和main分支都指向C,你的暂存区和工作目录都和C一致。如果你想回退到B,你可以用不同的reset模式来实现:

+
    +
  • 如果你用–soft模式,那么只有HEAD会移动到B,而main分支,暂存区和工作目录都不变,如下图所示:
  • +
+

image

+

这样的话,你可以重新提交C的更改,或者添加其他更改到暂存区。

+
    +
  • 如果你用–mixed模式(默认),那么HEAD和main分支都会移动到B,暂存区也会重置为B的状态,但工作目录不变,如下图所示:
  • +
+

image

+

这样的话,你可以重新暂存C的更改,或者放弃它们。

+
    +
  • 如果你用–hard模式,那么HEAD,main分支,暂存区和工作目录都会移动到B,C的更改会被丢弃,如下图所示:
  • +
+

image

+

这样的话,你就彻底回退到了B的状态,无法恢复C的更改。

+

希望这个示例能帮助你理解reset三种模式的区别。

+

git reset与git revert的区别

    +
  • git revert是一种安全的方式来撤销已经发布的提交,它会创建一个新的提交来逆转之前的更改
  • +
  • git reset是一种危险的方式来撤销本地的提交或更改,他会完全删除一个变更集,可能导致数据丢失
  • +
  • git revert适合于公共分支,git reset适合私有分支或者实验性分支
  • +
+

git clean

git clean是一个用于删除工作目录中未跟踪文件的命令。未跟踪文件是指在工作目录中创建但没有使用git add添加到Git索引的文件。git clean可以与git reset和git checkout等命令配合使用,以撤销对仓库的修改。

+
    +
  • git clean -n:这个命令会列出工作目录中将要被删除的未跟踪文件,但不会真正删除它们。这是一个干运行,可以用来检查删除的文件是否正确。
  • +
  • git clean -f:这个命令会强制删除工作目录中的未跟踪文件。这是一个危险的操作,因为一旦删除,文件就无法恢复。在使用这个命令之前,最好先备份文件或使用干运行选项。
  • +
  • git clean -d:这个命令会删除工作目录中的未跟踪目录,以及它们包含的文件。如果不使用这个选项,git clean只会删除未跟踪的文件,而保留空的目录。
  • +
  • git clean -i:这个命令会进入交互式模式,让用户选择要删除的文件或目录。用户可以输入不同的过滤条件,如扩展名、大小、时间等,来筛选要删除的文件。用户还可以预览删除的结果,或取消删除操作。
  • +
  • git clean -x:这个命令会删除工作目录中所有的未跟踪文件,包括那些被.gitignore文件忽略的文件。如果不使用这个选项,git clean只会删除那些没有被忽略的未跟踪文件。
  • +
+

git rm

git rm 命令可用于删除单个文件或文件集合。 git rm 的主要功能是从 Git 索引中删除跟踪的文件。

+

同步存储库

远程仓库允许我们与团队的其他成员共享我们的更改。它们可以位于私人服务器上,也可以位于与您的计算机不同的计算机上,或者使用积压工作等服务托管。无论您的仓库托管在何处,您都需要能够经常将本地仓库与远程仓库同步。您将使用三个命令执行此操作:git push、git pull 和 git merge。

+

git pull

执行拉取时,最新的修订历史记录将从远程存储库下载并导入到本地存储库。

+

image-20230529104050805

+

git push

为了开始与他人共享更改,您必须使用“push”命令将它们推送到远程存储库。

+

image-20230529104347741

+

git merge

如果您的本地仓库未更新,则推送到远程仓库将被拒绝

+

image-20230529104143719

+

如果是这种情况,您必须使用 git merge 命令从远程存储库获取最新更改,然后才能允许推送。Git 强制执行此操作以确保其他成员所做的更改保留在历史记录中。

+

image-20230529104233174

+

git remote

git remote 命令允许您创建、查看和删除与其他存储库的连接。

+
    +
  • git remote add
    创建与远程存储库的新连接。
  • +
  • git remote rm
    删除与名为 <name> 的远程存储库的连接。
  • +
  • git remote rename
    将远程连接从 <old-name> 重命名为 <new-name>
  • +
+

git fetch

git fetch 命令将提交、文件和引用从远程存储库下载到本地存储库中。它不会强迫您将更改实际合并到存储库中。Git 将获取的内容与现有的本地内容隔离开来;它绝对不会影响您当地的开发工作。

+

变更历史提交

git commit –amend

可以通过运行 git commit –amend 来修改同一分支中的最新提交。此命令便于将新的或更新的文件添加到以前的提交中。这也是编辑或向上一次提交添加注释的简单方法。

+

image-20230529110320003

+

git rebase

rebase是将提交到一个分支的所有更改应用到新分支的过程。运行 git rebase 并添加 -i 选项以重写、替换、删除和合并历史记录中的单个提交。您还可以:

+
    +
  • 重写过去的提交消息
  • +
  • 将一组提交压缩在一起
  • +
  • 添加尚未提交的文件
  • +
+

image-20230529110535662

+

git cherry pick

将另一个分支中的现有提交应用到存储库中的当前分支

+

image-20230529111141457

+

git merge -squash

压缩是将多个提交合并为单个提交的过程。

+

image-20230529111406929

+

参考地址

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Git\347\245\236\345\245\207\344\271\213\346\227\205/index.html" "b/Git\347\245\236\345\245\207\344\271\213\346\227\205/index.html" index e69de29bb2..9c807b7acd 100644 --- "a/Git\347\245\236\345\245\207\344\271\213\346\227\205/index.html" +++ "b/Git\347\245\236\345\245\207\344\271\213\346\227\205/index.html" @@ -0,0 +1,758 @@ + + + + + + + + + + + + Git奇幻之旅一 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

第一天: 本地仓库

故事的主角是小明,一个刚入门编程的小白。他正在为一个项目写代码,但是他发现每次修改代码都很麻烦,因为他要不断地备份文件,而且很容易弄混版本。有一天,他听说了一个叫Git的神奇工具,可以帮助他管理代码的变化。他决定尝试一下,于是他打开了终端,输入了下面的命令:

+
git init # 初始化一个本地仓库
+git add . # 添加所有文件到暂存区
+git commit -m "first commit" # 提交第一次修改到本地仓库
+
+

这样,他就成功地创建了一个Git仓库,并且保存了他的第一个版本。他觉得很开心,因为这样他就不用担心代码丢失或者混乱了。😁

+

第二天: 远程仓库

小明觉得自己的代码写得很不错,想要分享给其他人看看。但是他发现把文件发给别人很麻烦,而且如果别人也修改了代码,就很难合并。有一天,他听说了一个叫GitHub的网站,可以免费托管Git仓库,并且方便和其他人协作。他决定尝试一下,于是他注册了一个GitHub账号,并且在网站上创建了一个空的仓库。

+

然后,他在终端输入了下面的命令:

+
git remote add origin https://github.com/xiaoming/myproject.git # 添加远程仓库地址
+git push -u origin master # 推送本地master分支到远程仓库
+
+

这样,他就成功地把自己的代码上传到了GitHub上,并且和远程仓库建立了联系。他觉得很兴奋,因为这样他就可以和全世界的程序员交流了。😍

+

第三天: 分支管理

小明在GitHub上发现了一个很有趣的开源项目,想要参与其中。但是他不想直接修改别人的代码,而是想先在自己的电脑上做一些改进,然后再提交给项目的作者。有一天,他听说了一个叫分支的概念,可以让他在不影响主线的情况下,创建自己的代码版本。他决定尝试一下,于是他在终端输入了下面的命令:

+
git clone https://github.com/someone/awesome-project.git # 从远程仓库克隆项目到本地
+cd awesome-project # 进入项目目录
+git checkout -b dev # 创建并切换到dev分支
+
+

这样,他就成功地在本地创建了一个dev分支,并且和远程仓库的master分支分开了。他觉得很自由,因为这样他就可以随心所欲地修改代码了。😎

+

第四天: 合并与冲突

小明在dev分支上修改了一些代码,觉得很满意,想要把自己的改进合并到master分支上,然后推送到远程仓库,让项目的作者看看。有一天,他听说了一个叫合并的操作,可以把两个分支的代码合并成一个。他决定尝试一下,于是他在终端输入了下面的命令:

+
git checkout master # 切换到master分支
+git merge dev # 合并dev分支到master分支
+git push origin master # 推送master分支到远程仓库
+
+

这样,他就成功地把自己的代码合并到了master分支,并且推送到了远程仓库。他觉得很骄傲,因为这样他就可以为开源项目做出贡献了。😊

+

但是,有时候合并分支并不是一帆风顺的。有一次,小明在dev分支上修改了一个文件,而项目的作者也在master分支上修改了同一个文件,并且先于小明推送到了远程仓库。当小明想要合并分支时,就发生了冲突。有一天,他听说了一个叫解决冲突的方法,可以手动选择保留哪些代码。他决定尝试一下,于是他在终端输入了下面的命令:

+
git pull origin master # 拉取远程仓库的master分支
+git merge master # 合并master分支到dev分支
+# 打开冲突文件,编辑保存
+git add . # 添加所有文件到暂存区
+git commit -m "fix conflict" # 提交修改到本地仓库
+git push origin dev # 推送dev分支到远程仓库
+
+

这样,他就成功地解决了冲突,并且把自己的代码推送到了远程仓库。他觉得很成就感,因为这样他就可以和其他人协作了。😄

+

第五天: 标签管理与忽略文件

小明在dev分支上开发了一个新功能,觉得很完美,想要给这个版本打一个标签,方便以后查找。有一天,他听说了一个叫标签的概念,可以给某个版本起一个有意义的名字。他决定尝试一下,于是他在终端输入了下面的命令:

+
git tag v1.0 # 给当前版本打一个v1.0的标签
+git push origin v1.0 # 推送标签到远程仓库
+
+

这样,他就成功地给自己的代码打了一个标签,并且推送到了远程仓库。他觉得很方便,因为这样他就可以快速定位到某个版本了。😎

+

但是,有时候有些文件是不需要被Git管理的,比如编译生成的临时文件,或者敏感信息的配置文件。有一天,他听说了一个叫忽略特殊文件的方法,可以让Git自动忽略掉这些文件。他决定尝试一下,于是他在项目根目录下创建了一个.gitignore文件,并且写入了下面的内容:

+
*.tmp # 忽略所有.tmp后缀的文件
+config.ini # 忽略config.ini文件
+
+

这样,他就成功地让Git忽略掉了这些特殊文件,并且不会被提交到仓库中。他觉得很安全,因为这样他就可以避免泄露隐私或者浪费空间了。😊

+

第六天: 大小写敏感

小明和小红是一个团队的成员,他们都在GitHub上为同一个开源项目贡献代码。有一天,小明在本地修改了一个文件的名字,把它从README.md改成了Readme.md,然后提交并推送到了远程仓库。小红在自己的电脑上拉取了最新的代码,但是她发现自己的文件名还是README.md,而且Git提示她有一个未合并的文件。她很困惑,不知道为什么会出现这样的情况。

+

原来,这是因为Git在不同的操作系统上对文件名大小写的敏感度不同。在Linux和Mac OS X上,Git是区分大小写的,所以README.md和Readme.md是两个不同的文件。但是在Windows上,Git是不区分大小写的,所以README.md和Readme.md是同一个文件。当小明把文件名改成了Readme.md时,Git认为他删除了README.md,并且创建了一个新的文件Readme.md。当小红拉取代码时,Git认为她需要合并这两个文件,所以出现了冲突。

+

有一天,他们听说了一个叫解决大小写不一致导致的合并冲突的方法,可以让Git在Windows上也区分大小写。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git config core.ignorecase false # 设置Git在Windows上也区分大小写
+git mv README.md Readme.md # 重命名文件
+git commit -m "rename file" # 提交修改
+git push origin master # 推送到远程仓库
+
+

这样,他们就成功地解决了大小写不一致导致的合并冲突,并且保持了文件名的一致性。他们觉得很开心,因为这样他们就可以避免以后出现同样的问题了。😁

+

第七天: 撤销错误提交与恢复误删文件

小明和小红在开发一个新功能时,不小心提交了一些错误的代码,导致项目无法运行。他们想要撤销这些提交,但是又不想丢失他们的修改。有一天,他们听说了一个叫reset的命令,可以让他们回退到某个版本,但是保留他们的修改。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git reset HEAD~2 # 回退到两个版本之前,保留修改
+git status # 查看修改的状态
+git add . # 重新添加修改到暂存区
+git commit -m "fix bug" # 重新提交修改
+git push -f origin master # 强制推送到远程仓库
+
+

这样,他们就成功地撤销了错误的提交,并且重新提交了正确的代码。他们觉得很轻松,因为这样他们就可以修复bug了。😊

+

但是,有时候reset命令也会带来麻烦。有一次,小明在回退版本时,不小心加了一个–hard选项,导致他的修改全部丢失了。他很慌张,不知道如何找回他的修改。有一天,他听说了一个叫reflog的命令,可以让他查看所有的提交历史,包括已经被删除或者回退的提交。他决定尝试一下,于是他在终端输入了下面的命令:

+
git reflog # 查看所有的提交历史
+git reset --hard c761f5c # 回退到指定的版本
+git status # 查看修改的状态
+
+

这样,他就成功地找回了他丢失的修改,并且恢复到了正确的版本。他觉得很幸运,因为这样他就可以继续开发了。😄

+

第八天: 多人协作与冲突处理

小明和小红在同一个分支上开发一个新功能,他们经常需要拉取对方的代码,然后合并到自己的代码中。有一天,他们听说了一个叫pull的命令,可以让他们一步完成拉取和合并的操作。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git pull origin master # 拉取并合并远程仓库的master分支
+
+

这样,他们就成功地把对方的代码合并到了自己的代码中,并且保持了同步。他们觉得很方便,因为这样他们就可以避免手动合并的麻烦了。😎

+

但是,有时候pull命令也会带来问题。有一次,小明和小红在同一个文件上修改了同一行代码,导致出现了冲突。他们很困惑,不知道如何解决这个冲突。有一天,他们听说了一个叫解决冲突的方法,可以让他们手动选择保留哪些代码。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git pull origin master # 拉取并合并远程仓库的master分支
+# 打开冲突文件,编辑保存
+git add . # 添加所有文件到暂存区
+git commit -m "merge conflict" # 提交修改到本地仓库
+git push origin master # 推送到远程仓库
+
+

这样,他们就成功地解决了冲突,并且把自己的代码推送到了远程仓库。他们觉得很成就感,因为这样他们就可以和对方协作了。😄

+

第九天: rebase和merge的区别

小明和小红在同一个项目上开发不同的功能,他们分别在自己的分支上提交了一些代码。有一天,他们想要把自己的代码合并到主分支上,但是他们不知道应该用rebase还是merge。有一天,他们听说了一个叫rebase和merge的区别的概念,可以让他们选择合适的方式来合并代码。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
# 小明在dev1分支上
+git checkout dev1 # 切换到dev1分支
+git rebase master # 把dev1分支变基到master分支
+git push -f origin dev1 # 强制推送dev1分支到远程仓库
+git checkout master # 切换到master分支
+git merge dev1 # 合并dev1分支到master分支
+git push origin master # 推送master分支到远程仓库
+
+# 小红在dev2分支上
+git checkout dev2 # 切换到dev2分支
+git merge master # 合并master分支到dev2分支
+git push origin dev2 # 推送dev2分支到远程仓库
+git checkout master # 切换到master分支
+git merge dev2 # 合并dev2分支到master分支
+git push origin master # 推送master分支到远程仓库
+
+

这样,他们就成功地把自己的代码合并到了主分支上,但是他们发现了一个不同的地方。小明用了rebase命令,他的提交历史是一条直线,没有任何分叉;小红用了merge命令,她的提交历史是有多个分叉和汇合的结构。他们觉得很好奇,不知道这两种方式有什么优缺点。

+

原来,rebase和merge的区别是:

+
    +
  • rebase是把自己的分支变基到目标分支上,也就是把自己的提交历史放在目标分支的最后,这样可以保持提交历史的整洁和线性。
  • +
  • merge是把目标分支合并到自己的分支上,也就是把目标分支的提交历史和自己的提交历史合并成一个新的提交,这样可以保持提交历史的完整和真实。
  • +
+

rebase和merge各有优缺点:

+
    +
  • rebase的优点是可以让提交历史看起来很简洁,方便查看和管理;缺点是会改变提交历史,可能导致冲突或者丢失信息。
  • +
  • merge的优点是可以保留提交历史的原貌,方便追溯和恢复;缺点是会让提交历史看起来很复杂,不容易理解和维护。
  • +
+

所以,在选择rebase还是merge时,要根据具体的情况和需求来决定。一般来说:

+
    +
  • 如果你想要保持一个干净和线性的提交历史,你可以用rebase;
  • +
  • 如果你想要保留一个完整和真实的提交历史,你可以用merge;
  • +
  • 如果你想要在公共的分支上合作,你应该用merge,避免用rebase,因为rebase会改变提交历史,可能导致其他人的困扰;
  • +
  • 如果你想要在私有的分支上开发,你可以用rebase,因为rebase可以让你的提交历史更清晰,方便你自己管理。
  • +
+

第十天: 撤销错误合并和恢复误删的分支

小明和小红在合并分支时,不小心合并了错误的分支,导致项目出现了很多bug。他们想要撤销这次合并,但是又不想丢失他们的修改。有一天,他们听说了一个叫revert的命令,可以让他们用一次新的提交来回滚之前的提交。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git log # 查看提交历史
+git revert <commit ID> # 回滚指定的提交
+git push origin master # 推送到远程仓库
+
+

这样,他们就成功地撤销了错误的合并,并且用一次新的提交来记录这次回滚。他们觉得很安全,因为这样他们就不会丢失任何修改了。😊

+

但是,有时候revert命令也会带来麻烦。有一次,小明在回滚一个合并时,不小心加了一个–no-commit选项,导致他的修改没有被提交,而是被放在了暂存区。他很慌张,不知道如何恢复这次回滚。有一天,他听说了一个叫reset的命令,可以让他回退到某个版本,并且保留或者丢弃他的修改。他决定尝试一下,于是他在终端输入了下面的命令:

+
git reset --soft HEAD^ # 回退到上一个版本,并且保留修改
+git status # 查看修改的状态
+git add . # 重新添加修改到暂存区
+git commit -m "fix bug" # 重新提交修改
+git push -f origin master # 强制推送到远程仓库
+
+

这样,他就成功地恢复了这次回滚,并且重新提交了正确的代码。他觉得很轻松,因为这样他就可以修复bug了。😊

+

第十一天: 删除和恢复分支

小明和小红在完成一个功能后,想要删除自己的分支,因为他们觉得这个分支已经没有用了。有一天,他们听说了一个叫delete的命令,可以让他们删除本地或者远程的分支。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git branch -d dev1 # 删除本地的dev1分支
+git push origin --delete dev1 # 删除远程的dev1分支
+
+

这样,他们就成功地删除了自己的分支,并且释放了一些空间。他们觉得很爽快,因为这样他们就可以开始新的功能了。😎

+

但是,有时候delete命令也会带来后悔。有一次,小明在删除一个分支后,发现自己还需要这个分支上的一些代码。他很懊恼,不知道如何找回这个分支。有一天,他听说了一个叫reflog的命令,可以让他查看所有的提交历史,包括已经被删除或者回退的提交。他决定尝试一下,于是他在终端输入了下面的命令:

+
git reflog # 查看所有的提交历史
+git checkout -b dev1 <commit ID> # 用指定的提交创建一个新的dev1分支
+git push origin dev1 # 推送dev1分支到远程仓库
+
+

这样,他就成功地找回了自己的分支,并且恢复到了正确的版本。他觉得很幸运,因为这样他就可以继续使用这个分支了。😄

+

最后

到此为止,我已经给你讲完了小明和小红的故事,你觉得怎么样?👏

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Git\347\245\236\345\245\207\344\271\213\346\227\205\344\272\214/index.html" "b/Git\347\245\236\345\245\207\344\271\213\346\227\205\344\272\214/index.html" index e69de29bb2..28e7090720 100644 --- "a/Git\347\245\236\345\245\207\344\271\213\346\227\205\344\272\214/index.html" +++ "b/Git\347\245\236\345\245\207\344\271\213\346\227\205\344\272\214/index.html" @@ -0,0 +1,688 @@ + + + + + + + + + + + + Git奇幻之旅二 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

第十二天:暂存未完成的修改

小明和小红在开发一个新功能时,他们需要切换到另一个分支去修复一个紧急的bug。但是他们的当前分支上还有一些未完成的修改,他们不想提交这些修改,也不想丢弃这些修改。有一天,他们听说了一个叫stash的命令,可以让他们暂存这些修改,然后在需要的时候恢复这些修改。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git stash # 暂存当前分支上的修改
+git checkout master # 切换到master分支
+git pull origin master # 拉取远程仓库的master分支
+git checkout -b hotfix # 创建并切换到hotfix分支
+# 修复bug并提交
+git checkout master # 切换到master分支
+git merge hotfix # 合并hotfix分支到master分支
+git push origin master # 推送master分支到远程仓库
+git branch -d hotfix # 删除hotfix分支
+git checkout dev # 切换回dev分支
+git stash pop # 恢复暂存的修改
+
+

这样,他们就成功地暂存了未完成的修改,并且在修复bug后恢复了这些修改。他们觉得很灵活,因为这样他们就可以在不同的分支上切换了。😎

+

但是,有时候stash命令也会带来困惑。有一次,小明在恢复暂存的修改时,发现自己之前暂存了多次的修改,但是不知道哪个是最新的。他很迷茫,不知道如何查看和管理这些暂存的修改。有一天,他听说了一个叫stash list和stash apply的命令,可以让他查看和恢复指定的暂存的修改。他决定尝试一下,于是他在终端输入了下面的命令:

+
git stash list # 查看所有暂存的修改
+git stash apply stash@{1} # 恢复指定的暂存的修改
+
+

这样,他就成功地查看和恢复了指定的暂存的修改,并且继续开发新功能。他觉得很清晰,因为这样他就可以管理自己的暂存了。😊

+

第十三天:修改最近的提交

小明和小红在提交代码时,有时候会发现自己忘记了添加一些文件,或者写错了提交信息。他们想要修改这些提交,但是又不想重新提交一次。有一天,他们听说了一个叫commit –amend的命令,可以让他们修改最近的提交。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git add . # 添加所有文件到暂存区
+git commit --amend # 修改最近的提交
+git push -f origin master # 强制推送到远程仓库
+
+

这样,他们就成功地修改了最近的提交,并且覆盖了远程仓库上的提交。他们觉得很方便,因为这样他们就可以避免多余的提交了。😎

+

但是,有时候commit –amend命令也会带来风险。有一次,小明在修改最近的提交时,不小心把自己的分支推送到了错误的远程分支上。他很惊慌,不知道如何撤回这次推送。有一天,他听说了一个叫revert的命令,可以让他用一次新的提交来回滚之前的提交。他决定尝试一下,于是他在终端输入了下面的命令:

+
git log # 查看提交历史
+git revert <commit ID> # 回滚指定的提交
+git push origin master # 推送到远程仓库
+
+

这样,他就成功地撤回了错误的推送,并且用一次新的提交来记录这次回滚。他觉得很安全,因为这样他就不会影响其他人的代码了。😊

+

第十四天:重置代码和切换版本

小明和小红在开发一个新功能时,有时候会发现自己的代码有一些错误或者不满意的地方。他们想要重置代码,使工作区回到过去的某个状态。有一天,他们听说了一个叫reset的命令,可以让他们回退到某个版本,并且保留或者丢弃他们的修改。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git log # 查看提交历史
+git reset --soft <commit ID> # 回退到指定的版本,并且保留修改
+git status # 查看修改的状态
+git add . # 重新添加修改到暂存区
+git commit -m "fix bug" # 重新提交修改
+git push -f origin master # 强制推送到远程仓库
+
+

这样,他们就成功地重置了代码,并且重新提交了正确的代码。他们觉得很灵活,因为这样他们就可以修改自己的代码了。😎

+

但是,有时候reset命令也会带来麻烦。有一次,小明在回退版本时,不小心加了一个–hard选项,导致他的修改全部丢失了。他很慌张,不知道如何找回他的修改提交。有一天,他听说了一个叫checkout的命令,可以让他切换到某个版本或者分支。他决定尝试一下,于是他在终端输入了下面的命令:

+
git reflog # 查看所有的提交历史
+git checkout <commit ID> # 切换到指定的版本
+git status # 查看修改的状态
+
+

这样,他就成功地找回了他丢失的修改,并且切换到了正确的版本。他觉得很幸运,因为这样他就可以继续开发了。😄

+

第十五天:查看和恢复删除或者回退的提交

小明和小红在删除或者回退提交时,有时候会发现自己不小心删除或者回退了一些重要的提交。他们想要查看和恢复这些提交,但是又不知道这些提交的ID。有一天,他们听说了一个叫reflog的命令,可以让他们查看所有的提交历史,包括已经被删除或者回退的提交。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git reflog # 查看所有的提交历史
+git checkout -b dev <commit ID> # 用指定的提交创建一个新的dev分支
+git push origin dev # 推送dev分支到远程仓库
+
+

这样,他们就成功地查看和恢复了删除或者回退的提交,并且创建了一个新的分支。他们觉得很清晰,因为这样他们就可以管理自己的提交了。😊

+

但是,有时候reflog命令也会带来困惑。有一次,小明在查看所有的提交历史时,发现自己有很多重复或者无用的提交。他很烦恼,不知道如何清理这些提交。有一天,他听说了一个叫rebase -i的命令,可以让他交互式地修改提交历史。他决定尝试一下,于是他在终端输入了下面的命令:

+
git rebase -i HEAD~5 # 交互式地修改最近5个提交
+# 在编辑器中选择要保留、合并、修改或者删除的提交
+git push -f origin master # 强制推送到远程仓库
+
+

这样,他就成功地清理了无用的提交,并且修改了提交历史。他觉得很方便,因为这样他就可以优化自己的代码了。😎

+

第十六天:拣选特定的提交到另一个分支

小明和小红在开发一个新功能时,他们发现自己的分支上有一些提交是不需要的,或者是需要移到另一个分支上的。他们想要拣选特定的提交到另一个分支,但是又不想影响当前的分支。有一天,他们听说了一个叫cherry-pick的命令,可以让他们把特定的提交复制到当前的分支。他们决定尝试一下,于是他们在终端输入了下面的命令:

+
git log # 查看提交历史
+git checkout master # 切换到master分支
+git cherry-pick <commit ID> # 把指定的提交复制到当前分支
+git push origin master # 推送到远程仓库
+
+

这样,他们就成功地拣选了特定的提交到另一个分支,并且保持了当前分支的完整性。他们觉得很灵活,因为这样他们就可以移动自己的代码了。😎

+

最后

你已经听完了我给你讲的关于Git的故事,我很开心能够和你分享这些知识和技巧。我希望这些故事能够帮助你更好地理解和使用Git,让你的开发过程更加顺畅和高效。

+

Git是一个非常强大和灵活的工具,它可以让你管理和协作你的代码,解决各种问题,创造更多的可能。但是Git也有一些复杂和难以掌握的地方,需要你不断地学习和实践,才能真正地掌握它。

+

我希望你能够继续学习和探索Git的奥秘,发现更多的故事和技巧。如果你有任何问题或者建议,欢迎你随时联系我,我很乐意和你交流和讨论。

+

原文地址: Git教程从入门到入土

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Google\346\234\215\345\212\241\345\231\250\345\205\215\350\264\271\347\273\255\346\234\237/index.html" "b/Google\346\234\215\345\212\241\345\231\250\345\205\215\350\264\271\347\273\255\346\234\237/index.html" index e69de29bb2..6c809ebfe0 100644 --- "a/Google\346\234\215\345\212\241\345\231\250\345\205\215\350\264\271\347\273\255\346\234\237/index.html" +++ "b/Google\346\234\215\345\212\241\345\231\250\345\205\215\350\264\271\347\273\255\346\234\237/index.html" @@ -0,0 +1,667 @@ + + + + + + + + + + + + Google服务器免费续期 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

第一步:解绑需续费Google云服务器绑定的信用卡

这一步非必须,如果您有多张信用卡完全可以忽视此步骤,重新那张卡继续撸就是了。

+

ps:此处是续费第一次续费账号绑卡移除非初始账号绑卡移除,若是初始账号绑卡移除是需要重新添加付款方式的。这里推荐Passbook Debit Card,大部分虚拟卡可能会提示无法使用预付卡。如有好的选择也欢迎推荐。

+

进入Google云控制台,选择结算Billing>付款方式,移除信用卡。具体如下:

+

https://console.cloud.google.com/

+

1.点击结算

+

image-20221013090052603

+

2.点击管理付款方式

+

image-20221013090127039

+

3.点击移除

+

image-20221013090140946

+

4.再次点击移除

+

image-20221013090154572

+

5.完成信用卡解绑

+

image-20221013090204405

+

第二步:使用其他Google账号重新申请Google云服务器试用

Google账号账号自己注册下就行很方便,实在懒就直接万能的淘宝淘个Gmail账号,使用Gmail账号登陆即可。最好注意下登陆环境,尽量避免和前面的Google账户使用相同的环境登陆,可以使用另一个浏览器,采用无痕模式。

+

打开谷歌控制台

+

https://cloud.google.com/

+

image-20221013090508535

+

点击免费开始使用

+

image-20221013090527562

+

手机号验证

+

image-20221013090546877

+

信用卡验证

+

image-20221013090609017

+

完成创建

+

image-20221013090701984

+

第三步:为新申请的Google云服务器账号添加用户

刚刚申请的Google云服务器,300美金的试用金已经到账,有效期91天。

+

image-20221013090740573

+

image-20221013090750966

+

image-20221013090809777

+

第四步:利用新的Billing Account为到期的Google云服务器续费

image-20221013090845368

+

image-20221013090859172

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Hexo\346\220\255\345\273\272\346\225\231\347\250\213/index.html" "b/Hexo\346\220\255\345\273\272\346\225\231\347\250\213/index.html" index e69de29bb2..046e89d1a0 100644 --- "a/Hexo\346\220\255\345\273\272\346\225\231\347\250\213/index.html" +++ "b/Hexo\346\220\255\345\273\272\346\225\231\347\250\213/index.html" @@ -0,0 +1,729 @@ + + + + + + + + + + + + Github+Hexo搭建个人网站详细教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

v2-d4c1239e75c02e8482c22017a6c8d407_1440w

+

背景

​ 随着互联网浪潮的翻腾,国内外涌现出越来越多优秀的社交网站让用户分享信息更加便捷。然后,如果你是一个不甘寂寞的程序猿,是否也想要搭建一个属于自己的个人网站,如果你曾经或者现在正有这样的想法,请跟随这篇文章发挥你的Geek精神,让你快速拥有自己的博客网站,写文章记录生活,享受这种从0到1的过程。

+

准备

    +
  • Github账号
  • +
  • 安装Git
  • +
  • 安装Node.js
  • +
+

Github账号

​ 首先我们需要一个Github账号,若是没有的话,可以前往官网注册一个,不懂的话,可以参考Github账号注册

+

安装Git

什么是Git ?

+

简单来说Git是开源的分布式版本控制系统,用于敏捷高效地处理项目。我们网站在本地搭建好了,需要使用Git同步到GitHub上。

+

如果想要了解Git的细节,参看廖雪峰老师的Git教程:Git教程

+

从Git官网下载:Git - Downloading Package (git-scm.com)

+

现在的机子基本都是64位的,选择64位的安装包,下载后安装,在命令行里输入git测试是否安装成功,若安装失败,参看其他详细的Git安装教程。

+

安装成功后,将你的Git与GitHub帐号绑定,鼠标右击打开Git Bash

+

image-20230102112524450

+

或者在菜单里搜索Git Bash,设置user.name和user.email配置信息:

+
git config --global user.name "你的GitHub用户名"
+git config --global user.email "你的GitHub注册邮箱"
+
+

生成ssh密钥文件:

+
ssh-keygen -t rsa -C "你的GitHub注册邮箱"
+
+

然后直接三个回车即可,默认不需要设置密码
然后找到生成的.ssh的文件夹中的id_rsa.pub密钥,将内容全部复制

+

image-20230102112653519

+

打开SSH and GPG keys (github.com)页面,新建new SSH Key

+

image-20230102112741186

+

Title为标题,任意填即可,将刚刚复制的id_rsa.pub内容粘贴进去,最后点击Add SSH key。
在Git Bash中检测GitHub公钥设置是否成功,输入 ssh git@github.com

+

image-20230102112805293

+

如上则说明成功。这里之所以设置GitHub密钥原因是,通过非对称加密的公钥与私钥来完成加密,公钥放置在GitHub上,私钥放置在自己的电脑里。GitHub要求每次推送代码都是合法用户,所以每次推送都需要输入账号密码验证推送用户是否是合法用户,为了省去每次输入密码的步骤,采用了ssh,当你推送的时候,git就会匹配你的私钥跟GitHub上面的公钥是否是配对的,若是匹配就认为你是合法用户,则允许推送。这样可以保证每次的推送都是正确合法的。

+

安装Node.js

Hexo基于Node.js,Node.js下载地址:Download | Node.js 下载安装包,注意安装Node.js会包含环境变量及npm的安装,安装后,检测Node.js是否安装成功,在命令行中输入 node -v :

+

image-20230102113340687

+

检测npm是否安装成功,在命令行中输入npm -v :

+

image-20230102113355960

+

到这了,安装Hexo的环境已经全部搭建完成。

+

创建Github仓库

打开https://github.com/,新建一个项目,如下所示:

+

image-20230102114820493

+

然后如下图所示,输入自己的项目名字,后面一定要加.github.io后缀,README初始化也要勾上。名称一定要和你的github名字完全一样,比如你github名字叫abc,那么仓库名字一定要是abc.github.io

+

image-20230102114957155

+

然后项目就建成了,点击Settings,向下拉到最后有个GitHub Pages,点击Choose a theme选择一个主题。然后等一会儿,再回到GitHub Pages,会变成下面这样:

+

image-20230102115118709

+

点击那个链接,就会出现自己的网页啦,效果如下(我的是已经使用主题的页面,你们的页面可能不一样):

+

image-20230102115238914

+

安装Hexo

Hexo就是我们的个人博客网站的框架, 这里需要自己在电脑常里创建一个文件夹,可以命名为Blog,Hexo框架与以后你自己发布的网页都在这个文件夹中。创建好后,进入文件夹中,按住shift键,右击鼠标点击命令行

+

image-20230102114003386

+

使用npm命令安装Hexo,输入:

+
npm install -g hexo-cli 
+
+

这个安装时间较长耐心等待,安装完成后,初始化我们的博客,输入:

+
hexo init blog
+
+

注意,这里的命令都是作用在刚刚创建的Blog文件夹中。

+

为了检测我们的网站雏形,分别按顺序输入以下三条命令:

+
hexo new test_my_site
+
+hexo g
+
+hexo s
+
+

这些命令在后面作介绍,完成后,打开浏览器输入地址:

+

http://localhost:4000

+

可以看出我们写出第一篇博客

+

image-20230102122254270

+

Hexo常用命令

+

npm install hexo -g #安装Hexo
npm update hexo -g #升级
hexo init #初始化博客

+

命令简写
hexo n “我的博客” == hexo new “我的博客” #新建文章
hexo g == hexo generate #生成
hexo s == hexo server #启动服务预览
hexo d == hexo deploy #部署

+

hexo server #Hexo会监视文件变动并自动更新,无须重启服务器
hexo server -s #静态模式
hexo server -p 5000 #更改端口
hexo server -i 192.168.1.1 #自定义 IP
hexo clean #清除缓存,若是网页正常情况下可以忽略这条命令

+

刚刚的三个命令依次是新建一篇博客文章、生成网页、在本地预览的操作。

+

连接Github仓库

打开博客根目录下的_config.yml文件,这是博客的配置文件,在这里你可以修改与博客相关的各种信息。

+

修改最后一行的配置:

+
deploy:
+- type: git
+  repository: https://github.com/wangwangit/wangwangit.github.io.git
+  branch: master
+
+

repository修改为你自己的github项目地址.

+

绑定域名

现在默认的域名还是xxx.github.io,是不是很没有牌面?想不想也像我一样弄一个专属域名呢,首先你得购买一个域名,xx云都能买,看你个人喜好了。

+

以我的谷歌域名为例,如下图所示,添加一条解析记录:

+

image-20230102120424491

+

然后打开你的github博客项目,点击settings,拉到下面Custom domain处,填上你自己的域名,保存:

+

image-20230102120521154

+

这时候你的项目根目录应该会出现一个名为CNAME的文件了。如果没有的话,打开你本地博客/source目录,我的是D:\study\program\blog\source,新建CNAME文件,注意没有后缀。然后在里面写上你的域名,保存。最后运行hexo ghexo d上传到github

+

image-20230102120559425

+

image-20230102120617069

+

备份博客源文件

有时候我们想换一台电脑继续写博客,这时候就可以将博客目录下的所有源文件都上传到github上面。

+

首先在github博客仓库下新建一个分支hexo,然后git clone到本地,把.git文件夹拿出来,放在博客根目录下。

+

然后git checkout hexo切换到hexo分支,然后git add .,然后git commit -m "xxx",最后git push origin hexo提交就行了。

+

替换主题

我使用的主题是这个:博客主题

+

具体操作可以参考该主题的文档

+

最后

对于图床使用可以参考我以下文章:

+

使用腾讯CDN优化github图床访问

+

使用Nginx自建CDN加速Hexo博客

+

优秀的开源图床picGo

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/IDEA\345\270\270\347\224\250\344\274\230\345\214\226/index.html" "b/IDEA\345\270\270\347\224\250\344\274\230\345\214\226/index.html" index e69de29bb2..a9c5d8b2e9 100644 --- "a/IDEA\345\270\270\347\224\250\344\274\230\345\214\226/index.html" +++ "b/IDEA\345\270\270\347\224\250\344\274\230\345\214\226/index.html" @@ -0,0 +1,653 @@ + + + + + + + + + + + + IDEA优化策略 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ IDEA优化策略 +

IDEA优化策略

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

IDEA常用优化

vm配置

image-20221010135734688

+
-Xms512M
+-Xmx2048M
+-XX:ReservedCodeCacheSize=1024M
+-XX:+UseCompressedOops
+
+

开启Toolbar

image-20221010140227801

+

界面字体修改

image-20221010140421781

+

代码编辑字体修改

image-20221010140538215

+

修改控制台字体

image-20221010140911489

+

文件编码设置

image-20221010141118905

+

Tomcat控制台乱码

添加如下配置

+
-Dfile.encoding=UTF-8
+
+

image-20221010141324020

+

代码模板配置

image-20221010143421003

+

常用插件

image-20221010144443564

+

代码提示

image-20221010145441616

+

开启自动导入

image-20221010145520670

+

自动生成serialVersionUID

image-20221010145858828

+

Github Copilot快捷键修改

image-20221010150723845

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/ImageCreator\344\275\277\347\224\250\346\225\231\347\250\213/index.html" "b/ImageCreator\344\275\277\347\224\250\346\225\231\347\250\213/index.html" index e69de29bb2..4170c5afb3 100644 --- "a/ImageCreator\344\275\277\347\224\250\346\225\231\347\250\213/index.html" +++ "b/ImageCreator\344\275\277\347\224\250\346\225\231\347\250\213/index.html" @@ -0,0 +1,641 @@ + + + + + + + + + + + + 必应Image Creator使用教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

继不久前将 AI 文本生成模型 ChatGPT 与搜索引擎必应整合,并推出新版必应后。日前有消息源透露,该公司近期已开始在部分国家和地区测试将图像创建器 Image Creator 整合到新版必应中。

+

Bing Image Creator是一款可以根据您的文字描述生成图像的工具。它不同于普通的图像搜索,它需要您提供尽可能详细和创造性的描述,比如形容词、地点、甚至艺术风格,例如“数字艺术”和“写实风格”。例如,不要只输入“生物”,而要输入“穿着帽子的毛茸茸的生物”。

+

image-20230224092411085

+

前提

    +
  • 一个通过候选名单的账号
  • +
  • 一个印度的科学环境
  • +
+

步骤

1.开启全局代理(印度)

+

你需要有一个能稳定访问 bing.com 的网络环境。使用国内的网络直接访问 bing.com,将会被强制跳转到 cn.bing.com,也就是国内特供版的 Bing 搜索引擎官网,而国内版的 Bing 搜索引擎目前暂时没有内置 ChatGPT,因此我们需要有一个能稳定访问外网的上网环境。可以参考必应ChatGPT内测申请教程 - 一只会飞的旺旺 (wangwangit.com)

+

2.访问网站

+

直接访问官方网站, 必应的图像创建者 (bing.com),若是代理不正常,则会提示如下内容.

+

image-20230224091331438

+

调整国家为印度,就可以看到关键词输入框.

+

image-20230224091712931

+

3.使用关键字创建图像

+

image-20230224091911883

+

最后

随着AI作画的发展,关于人工与人工智能的讨论越来越多,关于AI作画的版权问题、行业受益者与受害者等诸多问题,大家从来没有停止讨论。关于AI与人工,大家有惶恐、有担忧,但人工智能从未停止,依旧存在。希望大家能够合理使用AI功能!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/InfluxDB\345\205\245\351\227\250\344\270\216\344\274\230\345\214\226/index.html" "b/InfluxDB\345\205\245\351\227\250\344\270\216\344\274\230\345\214\226/index.html" index e69de29bb2..aee24e10a0 100644 --- "a/InfluxDB\345\205\245\351\227\250\344\270\216\344\274\230\345\214\226/index.html" +++ "b/InfluxDB\345\205\245\351\227\250\344\270\216\344\274\230\345\214\226/index.html" @@ -0,0 +1,777 @@ + + + + + + + + + + + + 时序性数据库InfluxDB初探与优化 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

注意InfluxDB的版本号,不同版本号的语法不同,我使用的是InfluxDB2.3.0版本

+

官网: InfluxDB OSS 2.3 Documentation (influxdata.com)

+

1.常用的查询命令

参考: InfluxDB v2:Flux 语言、快速参考指南和备忘单

+

使用 Docker 设置生产 InfluxDB 2 实例

+

2.生成配置文件

在InfluxDB中,配置文件默认是不存在的,需要执行以下命令进行生成

+
docker run --rm influxdb:2.3.0 influxd print-config > config.yml
+
+

具体内容如下:

+
assets-path: ""
+bolt-path: /var/lib/influxdb2/influxd.bolt
+e2e-testing: false
+engine-path: /var/lib/influxdb2/engine
+feature-flags: {}
+flux-log-enabled: false
+hardening-enabled: false
+http-bind-address: :8086
+http-idle-timeout: 3m0s
+http-read-header-timeout: 10s
+http-read-timeout: 0s
+http-write-timeout: 0s
+influxql-max-select-buckets: 0
+influxql-max-select-point: 0
+influxql-max-select-series: 0
+instance-id: ""
+key-name: ""
+log-level: info
+metrics-disabled: false
+nats-max-payload-bytes: 0
+nats-port: 4222
+no-tasks: false
+pprof-disabled: false
+query-concurrency: 1024
+query-initial-memory-bytes: 0
+query-max-memory-bytes: 0
+query-memory-bytes: 0
+query-queue-size: 1024
+reporting-disabled: false
+secret-store: bolt
+session-length: 60
+session-renew-disabled: false
+sqlite-path: ""
+storage-cache-max-memory-size: 1073741824
+storage-cache-snapshot-memory-size: 26214400
+storage-cache-snapshot-write-cold-duration: 10m0s
+storage-compact-full-write-cold-duration: 4h0m0s
+storage-compact-throughput-burst: 50331648
+storage-max-concurrent-compactions: 0
+storage-max-index-log-file-size: 1048576
+storage-no-validate-field-size: false
+storage-retention-check-interval: 30m0s
+storage-series-file-max-concurrent-snapshot-compactions: 0
+storage-series-id-set-cache-size: 0
+storage-shard-precreator-advance-period: 30m0s
+storage-shard-precreator-check-interval: 10m0s
+storage-tsm-use-madv-willneed: false
+storage-validate-keys: false
+storage-wal-fsync-delay: 0s
+storage-wal-max-concurrent-writes: 0
+storage-wal-max-write-delay: 10m0s
+storage-write-timeout: 10s
+store: disk
+testing-always-allow-setup: false
+tls-cert: ""
+tls-key: ""
+tls-min-version: "1.2"
+tls-strict-ciphers: false
+tracing-type: ""
+ui-disabled: false
+vault-addr: ""
+vault-cacert: ""
+vault-capath: ""
+vault-client-cert: ""
+vault-client-key: ""
+vault-client-timeout: 0s
+vault-max-retries: 0
+vault-skip-verify: false
+vault-tls-server-name: ""
+vault-token: ""
+
+

3.调整Dockerfile文件

调整配置文件映射,并且设置环境变量,指定InfluxDB读取的配置文件夹,

+

Dockerfile模板如下:

+
# 时序性数据库
+influxdb:
+    image: influxdb:2.3.0
+    container_name: influxdb
+    environment:
+        - DOCKER_INFLUXDB_INIT_MODE=setup
+        - DOCKER_INFLUXDB_INIT_USERNAME=xxxxx
+        - DOCKER_INFLUXDB_INIT_PASSWORD=xxxxx
+        - DOCKER_INFLUXDB_INIT_ORG=xxxxx
+        - DOCKER_INFLUXDB_INIT_BUCKET=xxxxx
+        - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=xxxxx
+        - INFLUXD_CONFIG_PATH=/home/   # 设置环境变量
+    volumes:
+        - /data/zfzn/config.yml:/home/config.yml # 设置映射路径
+    ports:
+        - "18086:8086"
+    restart: always
+
+

可以通过api访问获取配置内容

+
http://{ip}:{port}/api/v2/config
+
+

image-20230213151613500

+

4.调整配置,开始测试

首先,我们使用默认配置启动InfluxDB,执行一个大数据量查询

+
from(bucket: "zfzn_new")
+  |> range(start: -30d)
+  |> filter(fn: (r) => r["_measurement"] == "100" or r["_measurement"] == "103" or r["_measurement"] == "101" or r["_measurement"] == "102" or r["_measurement"] == "105" or r["_measurement"] == "108" or r["_measurement"] == "107" or r["_measurement"] == "106" or r["_measurement"] == "109" or r["_measurement"] == "110")
+  |> fill(usePrevious: true)
+  |> increase(columns: ["_value"])
+  |> last()
+  |> yield()
+
+

使用top查看Influxdb服务内存占用.

+image-20230210161443055 + +

调整为最大查询内存1G之后:

+

image-20230210165042436

+

优化常用字段:

+

具体说明参考官方文档: InfluxDB 配置选项

+
log-level: warn # 日志输出级别
+query-concurrency: 5 # 允许并发执行的查询数。 默认10
+query-initial-memory-bytes: 67108864 # 64 MB  为查询分配的初始内存字节数。
+query-memory-bytes: 2147483648 # 2G 单个查询允许的最大内存字节数。必须大于或等于 query-initial-memory-bytes 。
+query-max-memory-bytes: 8589934592 # 8G 允许查询的最大内存总字节数。 等于查询并发×单次查询内存字节数
+http-read-header-timeout: 10s  #服务器应尝试读取新请求的 HTTP 标头的最长持续时间。设置为 0 表示没有超时
+http-read-timeout: 10s # 读超时
+http-write-timeout: 10s # 写超时 
+query-queue-size: 10  # 执行队列中允许的最大查询数。当达到队列限制时,新查询将被拒绝。 默认10
+
+storage-cache-max-memory-size: 2147483648 # 2G 控制存储引擎内存缓存的大小,以字节为单位。
+storage-cache-snapshot-memory-size: 26214400 # 25M 控制存储引擎快照使用的内存大小,以字节为单位。
+storage-cache-snapshot-write-cold-duration: 10m0s # 控制存储引擎冷数据快照写入的时间。
+storage-compact-full-write-cold-duration: 4h0m0s # 控制存储引擎数据压缩的时间。
+storage-compact-throughput-burst: 50331648
+storage-max-concurrent-compactions: 0
+storage-max-index-log-file-size: 1048576
+storage-no-validate-field-size: false
+storage-retention-check-interval: 30m0s
+storage-series-file-max-concurrent-snapshot-compactions: 0
+storage-series-id-set-cache-size: 0
+storage-shard-precreator-advance-period: 30m0s
+storage-shard-precreator-check-interval: 10m0s
+storage-tsm-use-madv-willneed: false
+storage-validate-keys: false
+storage-wal-fsync-delay: 0s
+storage-wal-max-concurrent-writes: 0
+storage-wal-max-write-delay: 10m0s
+storage-write-timeout: 10s
+store: disk
+
+

5.另外一些优化方案

下面提出了内存释放问题解决方案

+

High memory usage on TSI mode - Store - InfluxData Community Forums — TSI 模式内存使用率高 - Store - InfluxData Community Forums

+
- GODEBUG=madvdontneed=1
+- GOGC=80
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Jetbrains\345\205\250\347\263\273\346\277\200\346\264\273\346\225\231\347\250\213/index.html" "b/Jetbrains\345\205\250\347\263\273\346\277\200\346\264\273\346\225\231\347\250\213/index.html" index e69de29bb2..1365f0f510 100644 --- "a/Jetbrains\345\205\250\347\263\273\346\277\200\346\264\273\346\225\231\347\250\213/index.html" +++ "b/Jetbrains\345\205\250\347\263\273\346\277\200\346\264\273\346\225\231\347\250\213/index.html" @@ -0,0 +1,637 @@ + + + + + + + + + + + + Jetbrains全系激活教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

第一步,下载压缩包jetbra.zip,解压放在任意目录

+

image-20240409123728774

+

第二步,修改idea的配置(注意替换成自己的路径)

+
-javaagent:C:\Application\ideaIU-2023.3.6.win\jetbra\ja-netfilter.jar=jetbrains
+--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
+--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
+
+

image-20240409123829741

+

第三步,修改jetbrains配置,添加下面这段内容,注意是添加!

+
EQUAL,552256481678533139637975642367886203758236695483472209227743107098274039115182632876163871002685432662302338668484423414183623828225303129495011678242692842492488816514989676246788248148342413267485195568231641482216898266877438354128287060766631859161479332205725666574464164020522537595703362075565234890263790811265628293553656776925959545054122892468596656349514684518208997243750044021837251938753278807502305685113970717218831835618638457758130244769634525644949374508517044601990948117620105271720428259518909031341417933211526168184737184239634893948475085109420481522243358927998080508613356123692889767778533191484116809048763806053864339307673413329622302838455339868310031694563895311196234390180465202269142275598079255373287732431039254464172062988256518444614496248243200781259934221113710095392103382136300966279867703201614910212881522237167155093128902262921185900884869382176544761664777559104752378158192377647794361684542114437145121112034418220761298224143523298442362011266447239773883726746341810632935875214148521014297762215812293965213101140233155347800537083565331646491142112103328400294630793407149764120146697310714474595556761774911418274155051344410984326483216333907679252415962391346653515408516718,65537,860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353->31872219281407242025505148642475109331663948030010491344733687844358944945421064967310388547820970408352359213697487269225694990179009814674781374751323403257628081559561462351695605167675284372388551941279783515209238245831229026662363729380633136520288327292047232179909791526492877475417113579821717193807584807644097527647305469671333646868883650312280989663788656507661713409911267085806708237966730821529702498972114194166091819277582149433578383639532136271637219758962252614390071122773223025154710411681628917523557526099053858210363406122853294409830276270946292893988830514538950951686480580886602618927728470029090747400687617046511462665469446846624685614084264191213318074804549715573780408305977947238915527798680393538207482620648181504876534152430149355791756374642327623133843473947861771150672096834149014464956451480803326284417202116346454345929350148770746553056995922154382822307758515805142704373984019252210715650875853634697920708113806880196144197384637328982263167395073688501517286678083973976140696077590122053014085412828620051470085033364773099146103525313018873319293728800442101520384088109603555959893639842091339193891977395427305674935962998394201154475636326880291448367598036283623703166979
+
+

image-20240409124025540

+

image-20240412113446744

+

第四步,重启IDEA,退出自己的IDEA账号,前往网站Generate License (wangwangit.com)复制激活码,激活插件!

+

image-20240409124205128

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/K8S\351\203\250\347\275\262/index.html" "b/K8S\351\203\250\347\275\262/index.html" index e69de29bb2..aca6787b12 100644 --- "a/K8S\351\203\250\347\275\262/index.html" +++ "b/K8S\351\203\250\347\275\262/index.html" @@ -0,0 +1,810 @@ + + + + + + + + + + + + 基于Ubuntu20.04的K8s搭建教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前置条件

docker安装

官方文档: https://docs.docker.com/get-docker/
相关教程: https://yeasy.gitbook.io/docker_practice/install/mirror

+

禁止swap分区

根据K8s的要求,确保禁止swap分区使用,不禁止,初始化会报错.

+

在每个宿主机上执行:

+
sudo swapoff -a
+#修改/etc/fstab,注释掉swap那行,持久化生效
+sudo vi /etc/fstab
+
+

关闭防火墙和selinux

ubuntu 查看防火墙命令,ufw status可查看状态,ubuntu20.04默认全部关闭,无需设置。

+

主机名和hosts设置

非必须,但是为了直观方便管理,建议设置。

+

在宿主机分别设置主机名:k8s-master,k8s-node01,k8s-node02

+
sudo vim /etc/hostname
+
+

hosts设置

+
sudo vim /etc/hosts
+#添加内容
+192.168.152.100  k8s-master
+192.168.152.101  k8s-node01
+192.168.152.102  k8s-node02
+
+

安装组件

更改默认驱动

为防止初始化出现一系列的错误,请检查docker和kubectl驱动是否一致,否则kubectl没法启动造成报错。版本不一样,docker有些为cgroupfs,而kubectl默认驱动为systemd,所以需要更改docker驱动。

+

查看docker驱动命令

+
sudo docker info|grep Driver
+
+

更改docker驱动

+
#编辑创建文件
+sudo vim  /etc/docker/daemon.json
+#添加内容
+{
+  "exec-opts": ["native.cgroupdriver=systemd"]
+}
+
+

重启docker

+
sudo systemctl restart docker.service
+
+

更新apt

sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl
+
+

添加k8s库

国外 :下载 Google Cloud 公开签名秘钥:

+
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
+sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
+
+

国内:可以用阿里源即可:

+
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
+sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
+deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
+EOF
+
+

安装

锁定版本,防止出现不兼容情况,例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

+
    +
  • kubeadm:用来初始化集群的指令。
  • +
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • +
  • kubectl:用来与集群通信的命令行工具。
  • +
+
sudo apt-get update
+sudo apt-get install -y kubelet kubeadm kubectl
+sudo apt-mark hold kubelet kubeadm kubectl
+
+

初始化主节点

只需要在master上操作即可。

+
kubeadm init
+
+

初始化完成之后

+
[addons] Applied essential addon: CoreDNS
+[addons] Applied essential addon: kube-proxy
+ 
+Your Kubernetes control-plane has initialized successfully!
+ 
+To start using your cluster, you need to run the following as a regular user:
+ 
+  mkdir -p $HOME/.kube
+  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+  sudo chown $(id -u):$(id -g) $HOME/.kube/config
+ 
+Alternatively, if you are the root user, you can run:
+ 
+  export KUBECONFIG=/etc/kubernetes/admin.conf
+ 
+You should now deploy a pod network to the cluster.
+Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
+  https://kubernetes.io/docs/concepts/cluster-administration/addons/
+ 
+Then you can join any number of worker nodes by running the following on each as root:
+ 
+kubeadm join 192.168.152.100:6443 --token tojkw9.v4nageqhftd7v2vc \
+    --discovery-token-ca-cert-hash sha256:6a5b372144d6cc2a12f8e41853554549f1290e665381f48fdd92bbf92de7b884 
+
+

根据用户不同,执行以下命令,

+

root用户

+
export KUBECONFIG=/etc/kubernetes/admin.conf
+
+

普通用户

+
mkdir -p $HOME/.kube
+sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+sudo chown $(id -u):$(id -g) $HOME/.kube/config
+
+

最后,到node节点机器上执行上面init输出的join语句即可!

+

网络设置

curl https://docs.projectcalico.org/manifests/calico.yaml -O
+kubectl apply -f calico.yaml
+
+

安装完成后,kubectl get node 可查看节点状态,由NotReady变成Ready则正常,需要等几分钟完成。

+
#未安装网络插件
+ubuntu@k8s-master:~$ kubectl get node
+NAME         STATUS     ROLES                  AGE   VERSION
+k8s-master   NotReady   control-plane,master   80m   v1.22.3
+#已安装网络插件
+ubuntu@k8s-master:~$ kubectl get node
+NAME         STATUS   ROLES                  AGE   VERSION
+k8s-master   Ready    control-plane,master   83m   v1.22.3
+
+

常见错误

问题一

[kubelet-check] It seems like the kubelet isn't running or healthy.
+[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.
+
+

原因:kubectl没法启动,journalctl -xe查看启动错误信息。

+
journalctl -xe
+#信息显示docker和kubectel驱动不一致
+kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
+
+

解决方案:k8s建议systemd驱动,所以更改docker驱动即可,编辑 /etc/docker/daemon.json (没有就新建一个),添加如下启动项参数即可:

+
#编辑创建文件
+sudo vim  /etc/docker/daemon.json
+#添加内容
+{
+  "exec-opts": ["native.cgroupdriver=systemd"]
+}
+
+

重启docker和kubectel

+
#重启docker
+sudo systemctl restart docker.service
+#重载kubectl
+sudo systemctl daemon-reload  
+#重启kubectl
+sudo systemctl restart kubelet.service 
+#查看kubectl服务状态恢复正常
+sudo systemctl status kubelet.service
+
+

问题二

error execution phase preflight: [preflight] Some fatal errors occurred:
+    [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
+    [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
+    [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
+    [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
+[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
+
+

原因:初始化生产的文件,重新初始化,需要删除即可

+
rm -fr /etc/kubernetes/manifests/*
+
+

问题三

error execution phase preflight: [preflight] Some fatal errors occurred:
+    [ERROR Port-10250]: Port 10250 is in use
+
+

解决方法:重置配置

+
sudo kubeadm reset
+
+

加入node节点

在所有node节点机器操作,统一已安装完成 kubelet、kubeadm 和 kubectl,用master初始化完成后最后提示命令加入,切记要用root用户。

+
kubeadm join 192.168.152.100:6443 --token tojkw9.v4nageqhftd7v2vc \
+    --discovery-token-ca-cert-hash sha256:6a5b372144d6cc2a12f8e41853554549f1290e665381f48fdd92bbf92de7b884
+
+

执行完成之后,输出以下命令

+
[preflight] Running pre-flight checks
+[preflight] Reading configuration from the cluster...
+[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
+[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
+[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
+[kubelet-start] Starting the kubelet
+[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
+ 
+This node has joined the cluster:
+* Certificate signing request was sent to apiserver and a response was received.
+* The Kubelet was informed of the new secure connection details.
+ 
+Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
+
+

在master节点,执行kubectl get node可查看已加入的所有节点

+
ubuntu@k8s-master:~$ kubectl get node
+NAME         STATUS   ROLES                  AGE     VERSION
+k8s-master   Ready    control-plane,master   16h     v1.22.3
+k8s-node01   Ready    <none>                 24m     v1.22.3
+k8s-node02   Ready    <none>                 6m54s   v1.22.3
+
+

常见问题

问题一

[root@k8snode1 kubernetes]# kubectl get pod
+The connection to the server localhost:8080 was refused - did you specify the right host or port?
+
+

原因:出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行

+

解决:将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量

+
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
+source ~/.bash_profile
+
+

问题二

[ERROR CRI]: container runtime is not running: output: time="2020-09-24T11:49:16Z" level=fatal msg="getting status of runtime failed: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
+
+

解决方案:

+
rm /etc/containerd/config.toml
+systemctl restart containerd
+kubeadm init
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Kasm-Workspaces\344\272\221\347\253\257\345\267\245\344\275\234\347\232\204\351\235\251\345\221\275/index.html" "b/Kasm-Workspaces\344\272\221\347\253\257\345\267\245\344\275\234\347\232\204\351\235\251\345\221\275/index.html" index e69de29bb2..cc0a9b316c 100644 --- "a/Kasm-Workspaces\344\272\221\347\253\257\345\267\245\344\275\234\347\232\204\351\235\251\345\221\275/index.html" +++ "b/Kasm-Workspaces\344\272\221\347\253\257\345\267\245\344\275\234\347\232\204\351\235\251\345\221\275/index.html" @@ -0,0 +1,657 @@ + + + + + + + + + + + + Kasm Workspaces:云端工作的革命 🌟 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

工具用途 🛠️

Kasm Workspaces 是一款强大的开源容器流平台,它能够将云桌面、Web隔离以及OSINT工作负载直接交付到您的Web浏览器中。这意味着您可以通过任何地点的浏览器安全地访问您的工作环境,包括各种应用程序和桌面。🌍

+

主要优点 ✨

    +
  • 安全性:Kasm Workspaces提供端到端加密,确保您的数据和会话安全。🔐
  • +
  • 易用性:简单的部署流程,让您快速启动和运行。🚀
  • +
  • 高性能:即使是资源密集型应用程序也能流畅运行。⚡
  • +
  • 可定制性:无限的定制选项,满足您的个性化需求。🎨
  • +
  • 开源:遵循开源协议,个人和非营利组织可以免费使用。🤝
  • +
  • +
+

官网地址及部署方式 🌐

官网地址:https://kasmweb.com ,更多部署方式可以参考官网说明!

+

在线部署

cd /tmp
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.15.0.06fdc8.tar.gz
+tar -xf kasm_release_1.15.0.06fdc8.tar.gz
+sudo bash kasm_release/install.sh
+
+

AMD 架构离线部署

cd /tmp
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.15.0.06fdc8.tar.gz
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_service_images_amd64_1.15.0.06fdc8.tar.gz
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_workspace_images_amd64_1.15.0.06fdc8.tar.gz
+tar -xf kasm_release_1.15.0.06fdc8.tar.gz
+sudo bash kasm_release/install.sh --offline-workspaces /tmp/kasm_release_workspace_images_amd64_1.15.0.06fdc8.tar.gz --offline-service /tmp/kasm_release_service_images_amd64_1.15.0.06fdc8.tar.gz
+
+

ARM 架构离线部署

cd /tmp
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.15.0.06fdc8.tar.gz
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_service_images_arm64_1.15.0.06fdc8.tar.gz
+curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_workspace_images_arm64_1.15.0.06fdc8.tar.gz
+tar -xf kasm_release_1.15.0.06fdc8.tar.gz
+sudo bash kasm_release/install.sh --offline-workspaces /tmp/kasm_release_workspace_images_arm64_1.15.0.06fdc8.tar.gz --offline-service /tmp/kasm_release_service_images_arm64_1.15.0.06fdc8.tar.gz
+
+

使用体验 🌈

image-20240415200213323

+

image-20240415200423487

+

经过我这几天的使用,我发现Kasm Workspaces非常好用。它提供了一个灵活的浏览器环境,可以随时创建和销毁,非常适合临时的Web任务。🔄

+

更令人兴奋的是,我可以在后台持续保存我的工作环境,这对于需要长时间运行的任务来说是一个巨大的便利。📌

+

例如,我最近开通了GPT-4,通过Kasm Workspaces,我可以为每个用户创建独立的使用环境,这样每个人都可以享受个性化的体验。👥

+

Kasm Workspaces的可玩性非常高,还有很多功能等着大家去探索和发掘。无论是用于教育、研究还是日常工作,它都能提供出色的支持。🔍

+

立即开始您的云端工作之旅吧!🚀

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/MarkDown\347\232\204\345\245\207\346\212\200\346\267\253\345\267\247/index.html" "b/MarkDown\347\232\204\345\245\207\346\212\200\346\267\253\345\267\247/index.html" index e69de29bb2..03a7df3eed 100644 --- "a/MarkDown\347\232\204\345\245\207\346\212\200\346\267\253\345\267\247/index.html" +++ "b/MarkDown\347\232\204\345\245\207\346\212\200\346\267\253\345\267\247/index.html" @@ -0,0 +1,1028 @@ + + + + + + + + + + + + MarkDown的奇技淫巧 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

引言

自从 2019年左右接触到 Markdown 以来,对它的使用就一发而不可收拾。从最开始使用它在 GitHub Pages 里写博客,到用它编辑项目的 README 文件,再到撰写开发文档,编辑微信公众号文章和邮件内容等等,这期间也见证了它在各类平台和网站上的普及和被原生支持,可以说,Markdown 如今已经渗透了我在技术和网络活动的方方面面,成为了我撰写文本文档的首选。

+

那么首先我们一起来看一下它的「定义」:

+
+

Markdown 是一种轻量级标记语言,创始人为 John Gruber。它允许人们「使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者 HTML)文档」。——维基百科

+
+

本文档的目的不在于面面俱到地介绍 Markdown,只是作为我对其理解的笔记整理,希望能同时帮助一些对 Markdown 感兴趣的人快速上手,或是作为一个工具,供对其已经有所了解的人在需要时参考。

+

接下来请随我一起深入了解这门并不神秘的实用标记语言。

+

背景

优点

    +
  1. 专注于文字内容;

    +
  2. +
  3. 纯文本,易读易写,可以方便地纳入版本控制;

    +
  4. +
  5. 语法简单,没有什么学习成本,能轻松在码字的同时做出美观大方的排版。

    +
  6. +
+

使用场景

    +
  • 各类代码托管平台

    +

    主流的代码托管平台,如 GitHub、GitLab、BitBucket、Coding、Gitee 等等,都支持 Markdown 语法,很多开源项目的 README、开发文档、帮助文档、Wiki 等都用 Markdown 写作。

    +
  • +
  • 技术社区和写作平台

    +

    StackOverflow、CSDN、掘金、简书、GitBook、有道云笔记

    +
  • +
  • 论坛

    +

    V2EX、光谷社区

    +
  • +
+

个人感觉比较遗憾的一点是各平台可能采用不同语言实现的 Markdown 解析引擎,或采用同一解析引擎的不同版本,而且可能有不同程度的定制与扩展,这导致在不同平台上使用 Markdown 写作时体验并不完全一致。不过幸好对于大家公认的一些标准语法,各家都是支持的。

+

编辑工具

理论上任何一款文本编辑器都能用于编辑 Markdown 文档,它们分别提供了不同程度的语法高亮、预览等功能,以下只是列举其中一部分,选择自己称手的即可。

+
    +
  • 现代编辑器

    +

    VSCode / Atom

    +
  • +
  • 传统编辑器

    +

    Vim / Emacs / Sublime Text / Notepad++

    +
  • +
  • IDE 自带编辑器

    +

    IntelliJ IDEA / Android Studio / WebStorm

    +
  • +
  • 专用编辑器

    +

    Ulysses / Mou / Typora / Markpad

    +
  • +
  • 在线编辑器

    +

    各种支持 Markdown 的网站都提供了在线编辑器

    +
  • +
+

语法

标题

Markdown:

+
# atx-style 一级标题
+
+## 二级标题
+
+###### 六级标题
+
+Setext-style 一级标题
+===
+
+二级标题
+---
+
+

预览效果:

+
+

atx-style 一级标题

二级标题

六级标题

Setext-style 一级标题

二级标题

+

对应 HTML:

+
<h1>atx-style 一级标题</h1>
+
+<h2>二级标题</h2>
+
+<h6>六级标题</h6>
+
+<h1>Setext-style 一级标题</h1>
+
+<h2>二级标题</h2>
+
+

段落

中间没有空行的连续不断的几行文字被视为一个段落。

+

Markdown:

+
白日依山尽,
+
+黄河入海流。
+(句号后面没空格)
+
+欲穷千里目,
+
+更上一层楼。  
+(句号后面有俩空格)
+
+

预览效果:

+

白日依山尽,

+

黄河入海流。
(句号后面没空格)

+

欲穷千里目,

+

更上一层楼。
(句号后面有俩空格)

+

对应 HTML:

+
<p>白日依山尽,</p>
+
+<p>黄河入海流。
+(句号后面没有空格)</p>
+
+<p>欲穷千里目,</p>
+
+<p>
+  更上一层楼。
+  <br>
+  (句号后面有俩空格)
+</p>
+
+

行内格式

对段落或者部分文本的强调效果。

+

Markdown:

+
后面俩字**加黑**
+
+后面俩字*斜体*
+
+

预览效果:

+

后面俩字加黑

+

后面俩字斜体

+

对应 HTML:

+
<p>
+  后面俩字
+  <strong>加黑</strong>
+</p>
+<p>
+  后面俩字
+  <em>斜体</em>
+</p>
+
+

引用块

Markdown:

+
> 引用块段落一。
+>
+> 引用块段落二。
+>> 内嵌引用块段落一。
+>
+> ### 引用块内的标题
+
+

预览效果:

+
+

引用块段落一。

+

引用块段落二。

+
+

内嵌引用块段落一。

+
+

引用块内的标题

+

对应 HTML:

+
<blockquote>
+  <p>引用块段落一。</p>
+  <p>引用块段落二。</p>
+  <blockquote>
+    <p>内嵌引用块段落一。</p>
+  </blockquote>
+  <h3 id="引用块内的标题">引用块内的标题</h3>
+</blockquote>
+
+

超链接

Markdown 支持行内式链接和引用式链接。

+

Markdown:

+
行内式 [博客](https://mazhuang.org "我的个人博客") 链接,带 title。
+
+行内式 [GitHub](https://github.com/mzlogin) 链接。
+
+引用式 [博客][1] 链接。
+
+引用式 [GitHub][2] 链接,带 title。
+
+[1]: https://www.wangwangit.com
+[2]: https://github.com/wangwangit "我的 GitHub 主页"
+
+

预览效果:

+

行内式 博客 链接,带 title。

+

行内式 GitHub 链接。

+

引用式 博客 链接。

+

引用式 GitHub 链接,带 title。

+

对应 HTML:

+
<p>行内式 <a href="https://www.wangwangit.com" title="我的个人博客">博客</a> 链接,带 title。</p>
+
+<p>行内式 <a href="https://github.com/wangwangit">GitHub</a> 链接。</p>
+
+<p>引用式 <a href="https://www.wangwangit.com">博客</a> 链接。</p>
+
+<p>引用式 <a href="https://github.com/wangwangit" title="我的 GitHub 主页">GitHub</a> 链接,带 title。</p>
+
+

图片

在超链接的写法前加一个 !,就是引用图片的方法。

+

Markdown:

+
![Alt text](https://avatars.githubusercontent.com/u/22621145?v=4 "favicon")
+
+

预览效果:

+

Alt text

+

对应 HTML:

+
<img src="https://avatars.githubusercontent.com/u/22621145?v=4" alt="Alt text" title="favicon">
+
+

列表

包括有序列表和无序列表。

+

Markdown:

+
- 苹果
+- 葡萄
+- 榴莲
+
+1. 苹果
+2. 葡萄
+3. 榴莲
+
+

预览效果:

+
    +
  • 苹果
  • +
  • 葡萄
  • +
  • 榴莲
  • +
+
    +
  1. 苹果
  2. +
  3. 葡萄
  4. +
  5. 榴莲
  6. +
+

对应 HTML:

+
<ul>
+  <li>苹果</li>
+  <li>葡萄</li>
+  <li>榴莲</li>
+</ul>
+<ol>
+  <li>苹果</li>
+  <li>葡萄</li>
+  <li>榴莲</li>
+</ol>
+
+

其中无序列表的标记可以使用 +-*,有序列表前的数字可以是乱序的。

+

代码块

支持行内代码和代码块。

+

Markdown:

+
Android 里使用 `TextUtils` 类的 `isEmpty` 方法来判断字符串是否为空。
+
+```java
+if (TextUtils.isEmpty(text)) {
+    return null;
+}
+```
+
+

预览效果:

+

Android 里使用 TextUtils 类的 isEmpty 方法来判断字符串是否为空。

+
if (TextUtils.isEmpty(text)) {
+    return null;
+}
+
+

对应 HTML:

+
<p>Android 里使用 <code>TextUtils</code> 类的 <code>isEmpty</code> 方法来判断字符串是否为空。</p>
+
+<div class="highlight highlight-source-java"><pre><span class="pl-k">if</span> (<span class="pl-smi">TextUtils</span><span class="pl-k">.</span>isEmpty(text)) {
+    <span class="pl-k">return</span> <span class="pl-c1">null</span>;
+}</pre></div>
+
+

上例中的语言标记 java 可选填,可用于在编辑器和渲染后的效果里添加语法高亮。

+

块式代码也可以对整个代码段缩进四个空格,或一个 Tab 来实现。

+

水平分割线

使用一个单独行里的三个或以上 *- 来生产一条水平分割线,它们之间可以有空格。

+

Markdown:

+
***
+
+-----
+
+- - -
+
+

预览效果:

+
+
+
+

对应 HTML:

+
<hr />
+
+<hr />
+
+<hr />
+
+

嵌入 HTML

Markdown 标记语言的目的不是替代 HTML,也不是发明一种更便捷的插入 HTML 标签的方式。它对应的只是 HTML 标签的一个很小的子集。

+

对于那些没有办法用 Markdown 语法来对应的 HTML 标签,直接使用 HTML 来写就好了。

+

扩展语法

本节的内容是介绍一些受到广泛支持的 Markdown 扩展语法。

+

表格

Markdown:

+
| 编号  | 姓名(左) | 年龄(右) | 性别(中) |
+| ----- | :--------  | ---------: | :------:   |
+| 0     | 张三       | 28         | 男         |
+| 1     | 李四       | 29         | 男         |
+
+

预览效果:

+ + + + + + + + + + + + + + + + + + + + + +
编号姓名(左)年龄(右)性别(中)
0张三28
1李四29
+

对应 HTML:

+
<table>
+  <thead>
+    <tr>
+      <th>编号</th>
+      <th align="left">姓名(左)</th>
+      <th align="right">年龄(右)</th>
+      <th align="center">性别(中)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>0</td>
+      <td align="left">张三</td>
+      <td align="right">28</td>
+      <td align="center">男</td>
+    </tr>
+    <tr>
+      <td>1</td>
+      <td align="left">李四</td>
+      <td align="right">29</td>
+      <td align="center">男</td>
+    </tr>
+  </tbody>
+</table>
+
+

任务列表

在 GitHub / GitLab 里有较好的支持。

+

Markdown:

+
- [x] 洗碗
+- [ ] 清洗油烟机
+- [ ] 拖地
+
+

预览效果:

+
    +
  • 洗碗
  • +
  • 清洗油烟机
  • +
  • 拖地
  • +
+

对应 HTML:

+
<ul class="contains-task-list">
+  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> 洗碗</li>
+  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 清洗油烟机</li>
+  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 拖地</li>
+</ul>
+
+

如果是在 GitHub / GitLab 的 Issue 里,会附赠任务完成比例提示效果:

+

+

还可以直接在网页上拖动调整顺序,勾选和取消勾选。

+

+

删除线

Markdown:

+
后面三个字打上~~删除线~~。
+
+

预览效果:

+

后面三个字打上删除线

+

对应 HTML:

+
<p>后面三个字打上<del>删除线</del>。</p>
+
+

自动链接

自动链接扩展,即:当识别到 URL,或用 <> 包括的 URL 时,会自动为其生成 a 标签。

+

Markdown:

+
https://github.com
+
+<example@gmail.com>
+
+

预览效果:

+

https://github.com

+

example@gmail.com

+

对应 HTML:

+
<p><a href="https://github.com">https://github.com</a></p>
+
+<p><a href="mailto:example@gmail.com">example@gmail.com</a></p>
+
+

emoji

以 GitHub Pages 为例。

+

Markdown:

+
:camel: :blush: :smile:
+
+

预览效果:

+

:camel: :blush: :smile:

+

对应 HTML:

+
<p>
+  <img class="emoji" title=":camel:" alt=":camel:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f42b.png" height="20" width="20">
+  <img class="emoji" title=":blush:" alt=":blush:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f60a.png" height="20" width="20">
+  <img class="emoji" title=":smile:" alt=":smile:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f604.png" height="20" width="20">
+</p>
+
+

奇技淫巧

脑洞清奇的工程师们还发掘了很多使用 Markdown 的方法,大部分都是引入第三方 JavaScript 插件来实现。对这部分我只做简述,对其中的部分功能比如作图等,还是推荐用专门的可视化工具去做。

+

画流程图和时序图

有部分网站和编辑器实现了对 Markdown 里流程图和时序图的支持,比如我们使用的项目管理工具 TAPD 的在线编辑器,还有 VSCode + 插件 Markdown Preview Enhanced 等。

+

以我们使用的项目管理工具 TAPD 的在线编辑器为例:

+

+

插入数学公式

仍然以 TAPD 为例:

+

+

应该是利用 JavaScript 支持了 LaTeX 公式语法。

+

用 Markdown 做 PPT

有专门的工具 Marp,另外使用 VSCode + 插件 Markdown Preview Enhanced 也可以实现。

+

用 Markdown 写微信公众号

可以将公众号素材用 Markdown 编辑好后,贴到在线排版工具以后,复制到公众号编辑器里即可。有多种页面主题和代码主题可选择。

+

更多

想象力丰富的工程师们还扩展了很多基于 Markdown 的玩法,包括但不限于:

+
    +
  • 自动生成 / 更新 Table of Contents
  • +
  • 流程图 / 时序图
  • +
  • 制作幻灯片
  • +
  • 集成 PlantUML / GraphViz 的能力
  • +
  • 导出 HTML / PDF / 电子书
  • +
  • +
+

以上功能基本都可以用 VSCode + 插件 Markdown Preview Enhanced 实现。

+

参考

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Microsoft365\350\264\246\345\217\267\347\224\263\350\257\267\346\225\231\347\250\213/index.html" "b/Microsoft365\350\264\246\345\217\267\347\224\263\350\257\267\346\225\231\347\250\213/index.html" index e69de29bb2..0785461aad 100644 --- "a/Microsoft365\350\264\246\345\217\267\347\224\263\350\257\267\346\225\231\347\250\213/index.html" +++ "b/Microsoft365\350\264\246\345\217\267\347\224\263\350\257\267\346\225\231\347\250\213/index.html" @@ -0,0 +1,643 @@ + + + + + + + + + + + + Microsoft365账号申请教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

介绍

Microsoft 365 E5开发者试用订阅是微软为开发者提供的免费服务,申请后可以获得三个月的E5订阅,包括25个Microsoft 365的授权许可和5T的OneDrive存储空间。

+

申请

一.访问 https://developer.microsoft.com/zh-cn/microsoft-365/dev-program ,点击“加入”按钮,注册或登录微软账号。

+

image-20230317084536938

+

二.配置沙盒信息

+

image-20230317084826974

+

三.填写手机号接收验证码

+

image-20230317085523244

+

四.登录 https://admin.microsoft.com ,进入管理中心,分配用户和许可证。

+

image-20230317085615961

+

续期

    +
  • 在E5订阅到期前30天内,在管理中心的“消息”栏目找到续期通知,并点击“续期”按钮。
  • +
  • 或者使用Github Action或Tencent Servless等平台的虚拟环境和定时任务,自动发送续期请求。
  • +
  • 或者重新申请一个新的E5订阅,并将原来的数据迁移过去。
  • +
+ +

注意事项

1)无法接收短信验证码?开启全局代理或者换个手机号码!

+

2)每个子账号最多可以在 5 台电脑或 Mac、5 个平板电脑以及智能手机上安装 Office登陆。

+

3)无法申请?将开启浏览器隐私模式或者换其他国外的全局代理!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Minio\346\226\207\344\273\266\345\255\230\345\202\250/index.html" "b/Minio\346\226\207\344\273\266\345\255\230\345\202\250/index.html" index e69de29bb2..c9fbff9622 100644 --- "a/Minio\346\226\207\344\273\266\345\255\230\345\202\250/index.html" +++ "b/Minio\346\226\207\344\273\266\345\255\230\345\202\250/index.html" @@ -0,0 +1,1097 @@ + + + + + + + + + + + + Minio文件存储 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Minio文件存储 +

Minio文件存储

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Minio

上传文件如果不使用云服务的话,需要本地搭建,一般选择 FastDFS 但是 FastDFS 安装比较复杂,今天了解一款安装使用更简单的存储系统 MinIO

+

MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

+

MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。

+

MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

+

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品

+

安装 Minio

使用docker安装

拉取镜像

docker pull minio/minio
+
+

启动

## docker
+docker run -p 9000:9000 -p 9001:9001 -d --name minio -v /opt/docker/minio/data:/data -v /opt/docker/minio/config:/root/.minio -e "MINIO_ROOT_USER=minio" -e "MINIO_ROOT_PASSWORD=minio@123456" minio/minio server /data --console-address ":9000" --address ":9001"
+
+## docker-compose
+    minio:
+        image: minio/minio
+        hostname: "minio"
+        container_name: minio
+        ports:
+            - 9000:9000 # api 端口
+            - 9001:9001 # 控制台端口
+        environment:
+            MINIO_ACCESS_KEY: minio    #管理后台用户名
+            MINIO_SECRET_KEY: minio123456 #管理后台密码,最小8个字符
+        volumes:
+            - /data/zfzn/minio/data:/data               #映射当前目录下的data目录至容器内/data目录
+            - /data/zfzn/minio/config:/root/.minio/     #映射配置目录
+        command: server --console-address ':9001' /data  #指定容器中的目录 /data
+        privileged: true
+        restart: always
+
+

使用9000端口 登录控制台

image-20220928202415934

+

创建存储桶

image-20220928202426309

+

设置桶权限

image-20220928202435641

+

image-20221008110931974

+

创建 Java 客户端

依赖

<dependencies>
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-test</artifactId>
+        <scope>test</scope>
+        <exclusions>
+            <exclusion>
+                <groupId>org.junit.vintage</groupId>
+                <artifactId>junit-vintage-engine</artifactId>
+            </exclusion>
+        </exclusions>
+    </dependency>
+
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-configuration-processor</artifactId>
+        <optional>true</optional>
+    </dependency>
+
+
+    <dependency>
+        <groupId>org.projectlombok</groupId>
+        <artifactId>lombok</artifactId>
+        <optional>true</optional>
+    </dependency>
+
+    <!-- minio依赖       -->
+    <dependency>
+        <groupId>io.minio</groupId>
+        <artifactId>minio</artifactId>
+        <version>8.2.1</version>
+    </dependency>
+
+    <!-- hutool工具类       -->
+    <dependency>
+        <groupId>cn.hutool</groupId>
+        <artifactId>hutool-all</artifactId>
+        <version>5.1.2</version>
+    </dependency>
+
+    <!-- 压缩图片       -->
+    <dependency>
+        <groupId>net.coobird</groupId>
+        <artifactId>thumbnailator</artifactId>
+        <version>0.4.8</version>
+    </dependency>
+
+
+    <!--    工具类依赖    -->
+    <dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>3.12.0</version>
+    </dependency>
+
+    <dependency>
+        <groupId>com.github.davidcarboni</groupId>
+        <artifactId>encrypted-</artifactId>
+        <version>1.0.0</version>
+    </dependency>
+
+
+</dependencies>
+
+

配置文件

spring:
+  application:
+    name: minio-demo
+  servlet:
+    multipart:
+      max-file-size: 20MB
+      max-request-size: 200MB
+
+server:
+  port: 8088
+
+minio:
+  endpoint: http://你的ip:9001
+  accessKey: minio
+  secretKey: minio@123456
+  nginxHost: http://你的域名
+
+

配置文件配置类

package com.sqm.minio_demo.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@ConfigurationProperties(prefix = "minio")
+@Component
+@Data
+public class MinioProperties {
+
+    /**
+     * 连接地址
+     */
+    private String endpoint;
+    /**
+     * 用户名
+     */
+    private String accessKey;
+    /**
+     * 密码
+     */
+    private String secretKey;
+    /**
+     * 域名
+     */
+    private String nginxHost;
+
+
+}
+
+

创建 minio 客户端

package com.sqm.minio_demo.config;
+
+import io.minio.MinioClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableConfigurationProperties(MinioProperties.class)
+public class MinioConfig {
+
+    @Autowired
+    private MinioProperties minioProperties;
+
+    @Bean
+    public MinioClient minioClient(){
+        return MinioClient.builder()
+                .endpoint(minioProperties.getEndpoint())
+                .credentials(minioProperties.getAccessKey(),minioProperties.getSecretKey())
+                .build();
+    }
+}
+
+

文件地址返回路径实体类

package com.sqm.minio_demo.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadResponse {
+
+    private String minIoUrl;
+
+    private String nginxUrl;
+}
+
+

上传文件工具类

package com.sqm.minio_demo.util;
+
+import cn.hutool.core.date.DateUtil;
+import com.sqm.minio_demo.config.MinioProperties;
+import com.sqm.minio_demo.entity.UploadResponse;
+import io.minio.*;
+import io.minio.errors.*;
+import io.minio.messages.Bucket;
+import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
+
+
+import org.apache.commons.fileupload.FileItem;
+
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.Optional;
+import java.util.Random;
+
+@Component
+@Slf4j
+public class MinioUtil {
+
+    @Autowired
+    private MinioProperties minioProperties;
+
+    @Autowired
+    private MinioClient minioClient;
+
+    private final Long maxSize = (long) (1024 * 1024);
+
+    /**
+     * 创建bucket
+     */
+    public void createBucket(String bucketName) throws Exception {
+        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
+            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+        }
+    }
+
+    /**
+     * 上传文件
+     */
+    public UploadResponse uploadFile(MultipartFile file, String bucketName) throws Exception {
+        //判断文件是否为空
+        if (null == file || 0 == file.getSize()) {
+            return null;
+        }
+        //判断存储桶是否存在  不存在则创建
+        createBucket(bucketName);
+        //文件名
+        String originalFilename = file.getOriginalFilename();
+        //新的文件名 = 时间戳_随机数.后缀名
+        assert originalFilename != null;
+        long now = System.currentTimeMillis() / 1000;
+        String fileName = DateUtil.format(DateUtil.date(),"yyyyMMdd")+"_"+ now + "_" + new Random().nextInt(1000) +
+                originalFilename.substring(originalFilename.lastIndexOf("."));
+        //开始上传
+        log.info("file压缩前大小:{}",file.getSize());
+        if (file.getSize() > maxSize) {
+            FileItemFactory fileItemFactory = new DiskFileItemFactory();
+            FileItem fileItem = fileItemFactory.createItem(fileName, "text/plain", true, fileName);
+            OutputStream outputStream = fileItem.getOutputStream();
+            Thumbnails.of(file.getInputStream()).scale(1f).outputFormat(originalFilename.substring(originalFilename.lastIndexOf(".")+1)).outputQuality(0.25f).toOutputStream(outputStream);
+            file = new CommonsMultipartFile(fileItem);
+        }
+        log.info("file压缩后大小:{}",file.getSize());
+        minioClient.putObject(
+                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
+                        file.getInputStream(), file.getSize(), -1)
+                        .contentType(file.getContentType())
+                        .build());
+        String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;
+        String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;
+        return new UploadResponse(url, urlHost);
+    }
+
+
+    /**
+     * 获取全部bucket
+     *
+     * @return
+     */
+    public List<Bucket> getAllBuckets() throws Exception {
+        return minioClient.listBuckets();
+    }
+
+    /**
+     * 根据bucketName获取信息
+     *
+     * @param bucketName bucket名称
+     */
+    public Optional<Bucket> getBucket(String bucketName) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InvalidResponseException, InternalException, ErrorResponseException, ServerException, XmlParserException, ServerException {
+        return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
+    }
+
+    /**
+     * 根据bucketName删除信息
+     *
+     * @param bucketName bucket名称
+     */
+    public void removeBucket(String bucketName) throws Exception {
+        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
+    }
+
+    /**
+     * 获取⽂件外链
+     *
+     * @param bucketName bucket名称
+     * @param objectName ⽂件名称
+     * @param expires    过期时间 <=7
+     * @return url
+     */
+    public String getObjectURL(String bucketName, String objectName, Integer expires) throws Exception {
+        return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).build());
+    }
+
+    /**
+     * 获取⽂件
+     *
+     * @param bucketName bucket名称
+     * @param objectName ⽂件名称
+     * @return ⼆进制流
+     */
+    public InputStream getObject(String bucketName, String objectName) throws Exception {
+        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+    /**
+     * 上传⽂件
+     *
+     * @param bucketName bucket名称
+     * @param objectName ⽂件名称
+     * @param stream     ⽂件流
+     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject
+     */
+    public void putObject(String bucketName, String objectName, InputStream stream) throws
+            Exception {
+        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, stream.available(), -1).contentType(objectName.substring(objectName.lastIndexOf("."))).build());
+    }
+
+    /**
+     * 上传⽂件
+     *
+     * @param bucketName  bucket名称
+     * @param objectName  ⽂件名称
+     * @param stream      ⽂件流
+     * @param size        ⼤⼩
+     * @param contextType 类型
+     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject
+     */
+    public void putObject(String bucketName, String objectName, InputStream stream, long
+            size, String contextType) throws Exception {
+        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, size, -1).contentType(contextType).build());
+    }
+
+    /**
+     * 获取⽂件信息
+     *
+     * @param bucketName bucket名称
+     * @param objectName ⽂件名称
+     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#statObject
+     */
+    public StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception {
+        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+    /**
+     * 删除⽂件
+     *
+     * @param bucketName bucket名称
+     * @param objectName ⽂件名称
+     * @throws Exception https://docs.minio.io/cn/java-minioClient-apireference.html#removeObject
+     */
+    public void removeObject(String bucketName, String objectName) throws Exception {
+        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+
+    /***
+     * 上传视频
+     * @param file
+     * @param bucketName
+     * @return
+     * @throws Exception
+     */
+    public UploadResponse uploadVideo(MultipartFile file, String bucketName) throws Exception {
+        //判断文件是否为空
+        if (null == file || 0 == file.getSize()) {
+            return null;
+        }
+        //判断存储桶是否存在  不存在则创建
+        createBucket(bucketName);
+        //文件名
+        String originalFilename = file.getOriginalFilename();
+        //新的文件名 = 时间戳_随机数.后缀名
+        assert originalFilename != null;
+        long now = System.currentTimeMillis() / 1000;
+        String fileName = DateUtil.format(DateUtil.date(),"yyyyMMdd")+"_"+ now + "_" + new Random().nextInt(1000) +
+                originalFilename.substring(originalFilename.lastIndexOf("."));
+        //开始上传
+        log.info("file大小:{}",file.getSize());
+        minioClient.putObject(
+                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
+                        file.getInputStream(), file.getSize(), -1)
+                        .contentType("video/mp4")
+                        .build());
+        String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;
+        String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;
+        return new UploadResponse(url, urlHost);
+    }
+}
+
+

测试上传文件 Controller

package com.sqm.minio_demo.controller;
+
+import com.sqm.minio_demo.entity.ResultData;
+import com.sqm.minio_demo.entity.UploadResponse;
+import com.sqm.minio_demo.util.MinioUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+@Slf4j
+public class TestController {
+
+    @Autowired
+    private MinioUtil minioUtil;
+
+    /**
+     * @author: xx
+     * @date: 2022/5/25 15:32
+     * @description: 上传文件
+     */
+    @PostMapping("/upload")
+    public ResultData minioUpload(@RequestParam(value = "file") MultipartFile file){
+        UploadResponse response = null;
+        try {
+            response = minioUtil.uploadFile(file, "bucket01");
+        } catch (Exception e) {
+            log.error("上传失败",e);
+        }
+        return ResultData.ok(response);
+    }
+
+
+    /**
+     * @author: xx
+     * @date: 2022/5/25 15:32
+     * @description: 上传视频
+     */
+    @PostMapping("/uploadVideo")
+    public ResultData uploadVideo(@RequestParam(value = "file") MultipartFile file){
+        UploadResponse response = null;
+        try {
+            response = minioUtil.uploadVideo(file, "video-test");
+        } catch (Exception e) {
+            log.error("上传失败",e);
+        }
+        return ResultData.ok(response);
+    }
+
+}
+
+

测试上传

image-20220928202501999

+

image-20220928202510588

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\270\200/index.html" "b/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\270\200/index.html" index e69de29bb2..98a93833be 100644 --- "a/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\270\200/index.html" +++ "b/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\270\200/index.html" @@ -0,0 +1,714 @@ + + + + + + + + + + + + MyBatis学习笔记一 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

一.原始JDBC连接实现

1.pom.xml添加mysql驱动依赖

+

+<dependencys>
+    <dependency>
+        <groupId>mysql</groupId>
+        <artifactId>mysql-connector-java</artifactId>
+        <version>5.1.48</version>
+    </dependency>
+    <!--lombok依赖,自动生成set,get方法-->
+    <dependency>
+        <groupId>org.projectlombok</groupId>
+        <artifactId>lombok</artifactId>
+        <version>1.18.22</version>
+        <scope>compile</scope>
+    </dependency>
+</dependencys>
+
+

2.编写代码

+

执行类: JdbcConnect

+
public class JdbcConnect {
+
+    public static void main(String[] args) {
+
+        User user = new User();
+
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet = null;
+        Connection connection = null;
+
+        try {
+            // 1.加载数据库驱动
+            Class.forName("com.mysql.jdbc.Driver");
+            // 2.获取连接配置,进行连接
+            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false", "root", "root");
+            // 3.获取执行的SQL语句
+            String sql = "select * from user where username = ?";
+            preparedStatement = connection.prepareStatement(sql);
+            // 4.设置占位符的值,执行查询
+            preparedStatement.setString(1, "测试");
+            resultSet = preparedStatement.executeQuery();
+            while (resultSet.next()) {
+                // 5.处理结果集映射
+                int id = resultSet.getInt("id");
+                String username = resultSet.getString("username");
+                user.setId(id);
+                user.setUserName(username);
+            }
+            System.out.println(user);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 6.资源关闭
+            if (null != resultSet) {
+                try {
+                    resultSet.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (preparedStatement != null) {
+                try {
+                    preparedStatement.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (connection != null) {
+                try {
+                    connection.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        }
+
+    }
+}
+
+

实体类: User

+

+@Data
+public class User {
+
+    private Integer id;
+
+    private String userName;
+}
+
+

3.JDBC问题总结

+
    +
  • 数据库连接创建,释放频繁,浪费系统资源
  • +
  • SQL语句硬编码
  • +
  • SQL参数设置存在硬编码
  • +
  • 结果解析存在硬编码
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\272\214/index.html" "b/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\272\214/index.html" index e69de29bb2..7a7116cacc 100644 --- "a/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\272\214/index.html" +++ "b/Mybatis\345\255\246\344\271\240\347\254\224\350\256\260\344\272\214/index.html" @@ -0,0 +1,1629 @@ + + + + + + + + + + + + MyBatis学习笔记二 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+
JDBC问题总结
+* 数据库连接创建,释放频繁,浪费系统资源
+* SQL语句硬编码
+* SQL参数设置存在硬编码
+* 结果解析存在硬编码
+
+

框架设计思路

使⽤端:

提供核⼼配置⽂件:

+
    +
  • sqlMapConfig.xml : 存放数据源信息,引⼊mapper.xml
  • +
+
<!--提取配置到文件中,解决硬编码问题-->
+<configuration>
+    <!--数据库连接信息-->
+    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
+    <property name="jdbcUrl" value="jdbc:mysql:///mybatis"></property>
+    <property name="user" value="root"></property>
+    <property name="password" value="root"></property>
+    <!--引⼊sql配置信息-->
+    <mapper resource="mapper.xml"></mapper>
+</configuration>
+
+
    +
  • Mapper.xml : sql语句的配置⽂件信息
  • +
+

+<mapper namespace="com.ww.mapper.IUserDao">
+
+    <!--sql的唯一标识: namespace.id-->
+    <select id="findAll" resultType="com.ww.pojo.User">
+        select * form user
+    </select>
+
+    <select id="findByCondition" resultType="com.ww.pojo.User" paramterType="com.ww.pojo.User">
+        select * from user where id = #{id} and username = #{username}
+    </select>
+
+</mapper>
+
+

框架端:

1.读取配置⽂件,封装到实体配置类中

+
    +
  • Configuration: 数据库连接配置
  • +
+
/*定义基于sqlMapConfig.xml的配置类*/
+@Data
+public class Configuration {
+
+    /*数据库连接配置*/
+    private DataSource dataSource;
+
+    /**
+     * 封装mapper.xml中的SQL语句
+     * key: statementId namespace.sqlId
+     */
+    private Map<String, MappedStatement> mapppedStatementMap = new HashMap<>();
+
+}
+
+
    +
  • MappedStatement: SQL语句配置
  • +
+
/**
+ * 定义一个SQL该有的属性, 唯一标识,出参入参,以及SQL语句
+ */
+@Data
+public class MappedStatement {
+
+    // id标识
+    private String id;
+
+    //返回值类型
+    private String resultType;
+
+    //参数类型
+    private String paramterType;
+
+    //sql语句
+    private String sql;
+
+}
+
+

2.解析配置⽂件

+
    +
  • 加载配置文件
  • +
+

+InputStream resource = Resources.class.getClassLoader().getResourceAsStream(path);
+
+
    +
  • 使用dom4j解析配置封装到Configuration
  • +
+
    public Configuration parseConfig(InputStream inputStream)throws Exception{
+        Document document=new SAXReader().read(inputStream);
+        // <configuration>
+        Element rootElement=document.getRootElement();
+        List<Element> list=rootElement.selectNodes("//property");
+        // 解析配置文件
+        Properties properties=new Properties();
+        for(Element element:list){
+        String name=element.attributeValue("name");
+        String value=element.attributeValue("value");
+        properties.setProperty(name,value);
+        }
+        // 获取连接池
+        ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
+        comboPooledDataSource.setDriverClass(properties.getProperty("driverClass"));
+        comboPooledDataSource.setJdbcUrl(properties.getProperty("jdbcUrl"));
+        comboPooledDataSource.setUser(properties.getProperty("username"));
+        comboPooledDataSource.setPassword(properties.getProperty("password"));
+
+        configuration.setDataSource(comboPooledDataSource);
+
+        // 解析mapper文件
+        List<Element> list1=rootElement.selectNodes("//mapper");
+        for(Element element:list1){
+        String mapperPath=element.attributeValue("resource");
+        InputStream resource=Resources.getResourceAsStream(mapperPath);
+        XMLMapperBuilder xmlMapperBuilder=new XMLMapperBuilder(configuration);
+        xmlMapperBuilder.parse(resource);
+        }
+
+        return configuration;
+
+

3.通过SqlSessionFactoryBuilder的build方法,创建SqlSessionFactory

+
/* 定义工厂,创建会话使用 */
+public interface SqlSessionFactory {
+
+    public SqlSession openSession();
+}
+
+

4.通过SqlSessionFactory的openSession方法,创建SqlSession

+

5.在sqlSession中封装增删改查方法

+
    +
  • 定义方法
  • +
+
public interface SqlSession {
+
+    //查询所有
+    public <E> List<E> selectList(String statementId, Object... params) throws Exception;
+
+    //根据条件查询单个
+    public <T> T selectOne(String statementId, Object... params) throws Exception;
+
+    //为Dao层生成代理实现类
+    public <T> T getMapper(Class<?> mapperClass);
+}
+
+
+
    +
  • 动态代理实现
  • +
+
    public<T> T getMapper(Class<?> mapperClass){
+        //使用JDK动态代理,来为dao接口生成代理对象并返回
+        Object proxyInstance=Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(),new Class[]{mapperClass},new InvocationHandler(){
+@Override
+public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
+        String methodName=method.getName();
+        String className=method.getDeclaringClass().getName();
+        String statementId=className+"."+methodName;
+        //获取方法的返回值类型
+        Type genericReturnType=method.getGenericReturnType();
+        if(genericReturnType instanceof ParameterizedType){
+        List<Object> objects=selectList(statementId,args);
+        return objects;
+        }
+        return selectOne(statementId,args);
+        }
+        });
+        return(T)proxyInstance;
+        }
+
+

6.定义Executor实现JDBC原生操作,以及出入参映射操作

+
public class SimpleExecutor implements Executor {
+
+
+    @Override
+    public <E> List<E> query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws Exception {
+        //1.注册驱动,获取链接
+        Connection connection = configuration.getDataSource().getConnection();
+        //2.获取sql语句
+        String sql = mappedStatement.getSql();
+        //3.占位符替换
+        BoundSql boundSql = getBound(sql);
+        //4.获取预处理对象
+        PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText());
+        //5.设置参数
+        //获取参数全路径
+        String paramterType = mappedStatement.getParamterType();
+        Class<?> paramterTypeClass = getClassType(paramterType);
+        List<ParameterMapping> parameterMappingList = boundSql.getParameterMappingList();
+        for (int i = 0; i < parameterMappingList.size(); i++) {
+            ParameterMapping parameterMapping = parameterMappingList.get(i);
+            String content = parameterMapping.getContent();
+            //反射
+            Field declaredField = paramterTypeClass.getDeclaredField(content);
+            //暴力访问
+            declaredField.setAccessible(true);
+            Object o = declaredField.get(params[0]);
+            preparedStatement.setObject(i + 1, o);
+        }
+
+        //6.执行sql
+        ResultSet resultSet = preparedStatement.executeQuery();
+        String resultType = mappedStatement.getResultType();
+        Class<?> resultTypeClass = getClassType(resultType);
+
+        List<Object> list = new ArrayList<>();
+        //7.返回结果集
+        while (resultSet.next()) {
+            Object o = resultTypeClass.newInstance();
+            //元数据
+            ResultSetMetaData metaData = resultSet.getMetaData();
+            for (int i = 1; i <= metaData.getColumnCount(); i++) {
+                //字段名
+                String columnName = metaData.getColumnName(i);
+                //字段的值
+                Object value = resultSet.getObject(columnName);
+                //使用反射,根据数据库表和实体的对应关系,进行映射
+                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, resultTypeClass);
+                Method writeMethod = propertyDescriptor.getWriteMethod();
+                writeMethod.invoke(o, value);
+            }
+            list.add(o);
+        }
+        return (List<E>) list;
+    }
+
+    private Class<?> getClassType(String paramterType) throws ClassNotFoundException {
+        if (null != paramterType) {
+            Class<?> aClass = Class.forName(paramterType);
+            return aClass;
+        }
+        return null;
+    }
+
+    /**
+     * 将#{}使用?替换
+     * 解析出#{}里面的参数值
+     *
+     * @param sql
+     * @return
+     */
+    private BoundSql getBound(String sql) {
+        ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler();
+        GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", parameterMappingTokenHandler);
+        //解析SQL
+        String parseSql = genericTokenParser.parse(sql);
+        //#{}解析出来的参数
+        List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings();
+        BoundSql boundSql = new BoundSql(parseSql, parameterMappings);
+        return boundSql;
+    }
+}
+
+

具体实现

+

https://github.com/wangwangit/mybatis-study.git

+
+

重点剖析

架构设计

image-20220928201325851

+

主要组件

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
组件描述
SqlSession表示与数据库交互的会话,完成必要数据库增删改查功能
ExecutorMyBatis的执行器,负责SQL语句的生成和查询缓存的维护
StatementHandler封装了JDBC Statement操作,负责对JDBC Statement操作,如设置参数
ParameterHandler参数处理
ResultSetHandler结果集处理
TypeHandlerjava类型与jdbc类型的转换
MappedStatement维护mapper.xml中 一条select,update,insert,delete节点的封装
SqlSource根据用户传递的parameterObject动态的生成SQL并封装到BoundSql中
BoundSql表示动态生成的SQL语句,以及相应的参数信息
+

image-20220928201336243

+

一.缓存使用

1.二级缓存开启三步走

+
    +
  • 开启全局二级缓存配置
  • +
+

+<settings>
+    <setting name="cacheEnabled" value="true"/>
+</settings>
+
+
    +
  • 在需要使用二级缓存的mapper文件中添加配置标签
  • +
+

+<cache></cache>
+
+
    +
  • 在CRUD标签上配置userCache=true
  • +
+

+<select id="findById" resultType="com.lagou.pojo.User" useCache="true">
+    select * from user where id = #{id}
+</select>
+
+

2.config中的配置解析,将配置设置到configuration中

+
  private void parseConfiguration(XNode root){
+        try{
+        // issue #117 read properties first
+        propertiesElement(root.evalNode("properties"));
+        Properties settings=settingsAsProperties(root.evalNode("settings"));
+        loadCustomVfs(settings);
+        loadCustomLogImpl(settings);
+        typeAliasesElement(root.evalNode("typeAliases"));
+        pluginElement(root.evalNode("plugins"));
+        objectFactoryElement(root.evalNode("objectFactory"));
+        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
+        reflectorFactoryElement(root.evalNode("reflectorFactory"));
+        // 缓存标签解析
+        settingsElement(settings);
+        // read it after objectFactory and objectWrapperFactory issue #631
+        environmentsElement(root.evalNode("environments"));
+        databaseIdProviderElement(root.evalNode("databaseIdProvider"));
+        typeHandlerElement(root.evalNode("typeHandlers"));
+        mapperElement(root.evalNode("mappers"));
+        }catch(Exception e){
+        throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: "+e,e);
+        }
+        }
+
+

3.mapper中的cache标签解析,以nameSpace为key存储cache到configuration中

+
  private void cacheElement(XNode context){
+        if(context!=null){
+        String type=context.getStringAttribute("type","PERPETUAL");
+        Class<?extends Cache> typeClass=typeAliasRegistry.resolveAlias(type);
+        String eviction=context.getStringAttribute("eviction","LRU");
+        Class<?extends Cache> evictionClass=typeAliasRegistry.resolveAlias(eviction);
+        Long flushInterval=context.getLongAttribute("flushInterval");
+        Integer size=context.getIntAttribute("size");
+        boolean readWrite=!context.getBooleanAttribute("readOnly",false);
+        boolean blocking=context.getBooleanAttribute("blocking",false);
+        Properties props=context.getChildrenAsProperties();
+        builderAssistant.useNewCache(typeClass,evictionClass,flushInterval,size,readWrite,blocking,props);
+        }
+        }
+
+
+public Cache useNewCache(Class<?extends Cache> typeClass,
+        Class<?extends Cache> evictionClass,
+        Long flushInterval,
+        Integer size,
+        boolean readWrite,
+        boolean blocking,
+        Properties props){
+        Cache cache=new CacheBuilder(currentNamespace)
+        .implementation(valueOrDefault(typeClass,PerpetualCache.class))
+        .addDecorator(valueOrDefault(evictionClass,LruCache.class))
+        .clearInterval(flushInterval)
+        .size(size)
+        .readWrite(readWrite)
+        .blocking(blocking)
+        .properties(props)
+        .build();
+        //只会解析赋值一次  
+        configuration.addCache(cache);
+        //每个mapper只有一个cache  
+        currentCache=cache;
+        return cache;
+        }
+
+

4.每个sql语句中的userCache配置,在buildStatementFromContext时设置给每个MappedStatement对象

+
  public MappedStatement addMappedStatement(
+        String id,
+        SqlSource sqlSource,
+        StatementType statementType,
+        SqlCommandType sqlCommandType,
+        Integer fetchSize,
+        Integer timeout,
+        String parameterMap,
+        Class<?> parameterType,
+        String resultMap,
+        Class<?> resultType,
+        ResultSetType resultSetType,
+        boolean flushCache,
+        boolean useCache,
+        boolean resultOrdered,
+        KeyGenerator keyGenerator,
+        String keyProperty,
+        String keyColumn,
+        String databaseId,
+        LanguageDriver lang,
+        String resultSets){
+
+        if(unresolvedCacheRef){
+        throw new IncompleteElementException("Cache-ref not yet resolved");
+        }
+
+        id=applyCurrentNamespace(id,false);
+        boolean isSelect=sqlCommandType==SqlCommandType.SELECT;
+
+        MappedStatement.Builder statementBuilder=new MappedStatement.Builder(configuration,id,sqlSource,sqlCommandType)
+        .resource(resource)
+        .fetchSize(fetchSize)
+        .timeout(timeout)
+        .statementType(statementType)
+        .keyGenerator(keyGenerator)
+        .keyProperty(keyProperty)
+        .keyColumn(keyColumn)
+        .databaseId(databaseId)
+        .lang(lang)
+        .resultOrdered(resultOrdered)
+        .resultSets(resultSets)
+        .resultMaps(getStatementResultMaps(resultMap,resultType,id))
+        .resultSetType(resultSetType)
+        .flushCacheRequired(valueOrDefault(flushCache,!isSelect))
+        .useCache(valueOrDefault(useCache,isSelect))
+        //添加前面创建的cache对象
+        .cache(currentCache);
+
+        ParameterMap statementParameterMap=getStatementParameterMap(parameterMap,parameterType,id);
+        if(statementParameterMap!=null){
+        statementBuilder.parameterMap(statementParameterMap);
+        }
+
+        MappedStatement statement=statementBuilder.build();
+        configuration.addMappedStatement(statement);
+        return statement;
+        }
+
+

5.执行查询语句时,逻辑如下

+

+public<E> List<E> query(MappedStatement ms,Object parameterObject,RowBounds rowBounds,ResultHandler resultHandler)throws SQLException{
+        BoundSql boundSql=ms.getBoundSql(parameterObject);
+        //创建缓存key
+        CacheKey key=this.createCacheKey(ms,parameterObject,rowBounds,boundSql);
+        return this.query(ms,parameterObject,rowBounds,resultHandler,key,boundSql);
+        }
+
+
+public<E> List<E> query(MappedStatement ms,Object parameterObject,RowBounds rowBounds,ResultHandler resultHandler,CacheKey key,BoundSql boundSql)throws SQLException{
+        //判断是否配置了开启缓存
+        Cache cache=ms.getCache();
+        if(cache!=null){
+        //如果需要刷新缓存的化,flushCache="true"
+        this.flushCacheIfRequired(ms);
+        if(ms.isUseCache()&&resultHandler==null){
+        this.ensureNoOutParams(ms,boundSql);
+        //访问二级缓存
+        List<E> list=(List)this.tcm.getObject(cache,key);
+        if(list==null){
+        // 缓存未命中,访问一级缓存,一级缓存没有,再查询数据库
+        list=this.delegate.query(ms,parameterObject,rowBounds,resultHandler,key,boundSql);
+        // 缓存查询结果
+        this.tcm.putObject(cache,key,list);
+        }
+
+        return list;
+        }
+        }
+
+        return this.delegate.query(ms,parameterObject,rowBounds,resultHandler,key,boundSql);
+        }
+
+

6.二级缓存安全问题,以及为什么需要提交才能更新缓存值

+
// 事务缓存管理器
+public class TransactionalCacheManager {
+
+    // Cache与TransactionCache的映射关系表
+    private final Map<Cache, TransactionalCache> transactionalCaches = new HashMap<>();
+
+    public void clear(Cache cache) {
+
+        getTransactionalCache(cache).clear();
+    }
+
+    public Object getObject(Cache cache, CacheKey key) {
+        return getTransactionalCache(cache).getObject(key);
+    }
+
+    public void putObject(Cache cache, CacheKey key, Object value) {
+        getTransactionalCache(cache).putObject(key, value);
+    }
+
+    public void commit() {
+        for (TransactionalCache txCache : transactionalCaches.values()) {
+            txCache.commit();
+        }
+    }
+
+    public void rollback() {
+        for (TransactionalCache txCache : transactionalCaches.values()) {
+            txCache.rollback();
+        }
+    }
+
+    private TransactionalCache getTransactionalCache(Cache cache) {
+        // 从映射表中获取 TransactionalCach,若不存在,则创建一个新的对象,并设cache值进去
+        return MapUtil.computeIfAbsent(transactionalCaches, cache, TransactionalCache::new);
+    }
+
+}
+
+// 这是Cache缓存的一个子类
+public class TransactionalCache implements Cache {
+
+    private static final Log log = LogFactory.getLog(TransactionalCache.class);
+
+    //真正的缓存对象,和上⾯的Map<Cache, TransactionalCache>中的Cache是同⼀个
+    private final Cache delegate;
+    private boolean clearOnCommit;
+    // 在事务被提交前,所有从数据库中查询的结果将缓存在此集合中
+    private final Map<Object, Object> entriesToAddOnCommit;
+    // 在事务被提交前,当缓存未命中时,CacheKey 将会被存储在此集合中
+    private final Set<Object> entriesMissedInCache;
+
+    public TransactionalCache(Cache delegate) {
+        this.delegate = delegate;
+        this.clearOnCommit = false;
+        this.entriesToAddOnCommit = new HashMap<>();
+        this.entriesMissedInCache = new HashSet<>();
+    }
+
+    @Override
+    public String getId() {
+        return delegate.getId();
+    }
+
+    @Override
+    public int getSize() {
+        return delegate.getSize();
+    }
+
+    @Override
+    public Object getObject(Object key) {
+        // issue #116
+        Object object = delegate.getObject(key);
+        if (object == null) {
+            entriesMissedInCache.add(key);
+        }
+        // issue #146
+        if (clearOnCommit) {
+            return null;
+        } else {
+            return object;
+        }
+    }
+
+    @Override
+    public void putObject(Object key, Object object) {
+        entriesToAddOnCommit.put(key, object);
+    }
+
+    @Override
+    public Object removeObject(Object key) {
+        return null;
+    }
+
+    @Override
+    public void clear() {
+        clearOnCommit = true;
+        entriesToAddOnCommit.clear();
+    }
+
+    public void commit() {
+        if (clearOnCommit) {
+            delegate.clear();
+        }
+        //当commit时,会调用刷新方法
+        flushPendingEntries();
+        reset();
+    }
+
+    public void rollback() {
+        unlockMissedEntries();
+        reset();
+    }
+
+    private void reset() {
+        clearOnCommit = false;
+        entriesToAddOnCommit.clear();
+        entriesMissedInCache.clear();
+    }
+
+    //将缓存中的值刷新到真实的Cache中,
+    private void flushPendingEntries() {
+        for (Map.Entry<Object, Object> entry : entriesToAddOnCommit.entrySet()) {
+            delegate.putObject(entry.getKey(), entry.getValue());
+        }
+        for (Object entry : entriesMissedInCache) {
+            if (!entriesToAddOnCommit.containsKey(entry)) {
+                delegate.putObject(entry, null);
+            }
+        }
+    }
+
+    private void unlockMissedEntries() {
+        for (Object entry : entriesMissedInCache) {
+            try {
+                delegate.removeObject(entry);
+            } catch (Exception e) {
+                log.warn("Unexpected exception while notifying a rollback to the cache adapter. "
+                        + "Consider upgrading your cache adapter to the latest version. Cause: " + e);
+            }
+        }
+    }
+
+}
+
+

二.插件开发

1.MyBatis允许拦截的方法

+
    +
  • 执⾏器Executor (update、query、commit、rollback等⽅法);
  • +
  • SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等⽅ 法);
  • +
  • 参数处理器ParameterHandler (getParameterObject、setParameters⽅法);
  • +
  • 结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等⽅法);
  • +
+

2.这四大对象创建时,都是调用interceptorChain.pluginAll(parameterHandler)返回的代理对象

+
  public ParameterHandler newParameterHandler(MappedStatement mappedStatement,Object parameterObject,BoundSql boundSql){
+        ParameterHandler parameterHandler=mappedStatement.getLang().createParameterHandler(mappedStatement,parameterObject,boundSql);
+        parameterHandler=(ParameterHandler)interceptorChain.pluginAll(parameterHandler);
+        return parameterHandler;
+        }
+
+
  public Object pluginAll(Object target){
+        for(Interceptor interceptor:interceptors){
+        target=interceptor.plugin(target);
+        }
+        return target;
+        }
+default Object plugin(Object target){
+        return Plugin.wrap(target,this);
+        }
+public static Object wrap(Object target,Interceptor interceptor){
+        Map<Class<?>,Set<Method>>signatureMap=getSignatureMap(interceptor);
+        Class<?> type=target.getClass();
+        Class<?>[]interfaces=getAllInterfaces(type,signatureMap);
+        if(interfaces.length>0){
+        return Proxy.newProxyInstance(
+        type.getClassLoader(),
+        interfaces,
+        new Plugin(target,interceptor,signatureMap));
+        }
+        return target;
+        }
+
+

3.因此调用这四大对象的方法时,会执行Plugin类中的invoke()方法逻辑

+
  @Override
+public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
+        try{
+        Set<Method> methods=signatureMap.get(method.getDeclaringClass());
+        if(methods!=null&&methods.contains(method)){
+        return interceptor.intercept(new Invocation(target,method,args));
+        }
+        return method.invoke(target,args);
+        }catch(Exception e){
+        throw ExceptionUtil.unwrapThrowable(e);
+        }
+        }
+
+

4.上述处理逻辑中当方法匹配时,调用了intercept方法,所以会执行拦截器中的方法进行增强

+

+@Intercepts({
+        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
+})
+public class ExamplePlugin implements Interceptor {
+
+    /**
+     * 只要被拦截的目标对象方法被执行时,每次都会执行
+     *
+     * @param invocation
+     * @return
+     * @throws Throwable
+     */
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        System.out.println("对方法进行了增强");
+        //执行原方法
+        return invocation.proceed();
+    }
+
+    /**
+     * 将当前拦截器存储到拦截器链中
+     *
+     * @param target
+     * @return
+     */
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    /**
+     * 获取配置文件的参数
+     *
+     * @param properties
+     */
+    @Override
+    public void setProperties(Properties properties) {
+        System.out.println("获取的配置文件参数是" + properties);
+        Interceptor.super.setProperties(properties);
+    }
+}
+
+

三.动态代理

//获取mapper
+userMapper=sqlSession.getMapper(IUserMapper.class);
+//DefaultSqlSession
+public<T> T getMapper(Class<T> type){
+        return this.configuration.getMapper(type,this);
+        }
+//Configuration
+public<T> T getMapper(Class<T> type,SqlSession sqlSession){
+        return mapperRegistry.getMapper(type,sqlSession);
+        }
+//MapperRegistry
+public<T> T getMapper(Class<T> type,SqlSession sqlSession){
+final MapperProxyFactory<T> mapperProxyFactory=(MapperProxyFactory<T>)knownMappers.get(type);
+        if(mapperProxyFactory==null){
+        throw new BindingException("Type "+type+" is not known to the MapperRegistry.");
+        }
+        try{
+        //通过静态工厂生成示例
+        return mapperProxyFactory.newInstance(sqlSession);
+        }catch(Exception e){
+        throw new BindingException("Error getting mapper instance. Cause: "+e,e);
+        }
+        }
+//MapperProxyFactory
+public T newInstance(SqlSession sqlSession){
+//创建了JDK动态代理的handler类
+final MapperProxy<T> mapperProxy=new MapperProxy<>(sqlSession,mapperInterface,methodCache);
+        //调用重载方法
+        return newInstance(mapperProxy);
+        }
+// 重载方法
+protected T newInstance(MapperProxy<T> mapperProxy){
+        return(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),new Class[]{mapperInterface},mapperProxy);
+        }
+
+
//MapperProxy 类,实现了 InvocationHandler 接⼝
+public class MapperProxy<T> implements InvocationHandler, Serializable {
+    //省略部分源码
+    private final SqlSession sqlSession;
+    private final Class<T> mapperInterface;
+    private final Map<Method, MapperMethod> methodCache;
+
+    //构造,传⼊了 SqlSession,说明每个session中的代理对象的不同的!
+    public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface,
+                       Map<Method, MapperMethod> methodCache) {
+        this.sqlSession = sqlSession;
+        this.mapperInterface = mapperInterface;
+        this.methodCache = methodCache;
+    }
+    //省略部分源码
+}
+
+
+    //invoke方法
+    public Object invoke(Object proxy, Method method, Object[] args) throws
+            Throwable {
+        try {
+            //如果是Object定义的⽅法,直接调⽤
+            if (Object.class.equals(method.getDeclaringClass())) {
+                return method.invoke(this, args);
+            } else if (isDefaultMethod(method)) {
+                return invokeDefaultMethod(proxy, method, args);
+            }
+        } catch (Throwable t) {
+            throw ExceptionUtil.unwrapThrowable(t);
+        }
+        // 获得 MapperMethod 对象
+        final MapperMethod mapperMethod = cachedMapperMethod(method);
+        //重点在这:MapperMethod最终调⽤了执⾏的⽅法
+        return mapperMethod.execute(sqlSession, args);
+    }
+
+    //execute方法
+    public Object execute(SqlSession sqlSession, Object[] args) {
+        Object result;
+        //判断mapper中的⽅法类型,最终调⽤的还是SqlSession中的⽅法 switch
+        switch (command.getType()) {
+            case INSERT: {
+                //转换参数
+                Object param = method.convertArgsToSqlCommandParam(args);
+                //执⾏INSERT操作
+                // 转换 rowCount
+                result = rowCountResult(sqlSession.insert(command.getName(), param));
+                break;
+            }
+            case UPDATE: {
+                Object param = method.convertArgsToSqlCommandParam(args);
+                result = rowCountResult(sqlSession.update(command.getName(), param));
+                break;
+            }
+            case DELETE: {
+                Object param = method.convertArgsToSqlCommandParam(args);
+                result = rowCountResult(sqlSession.delete(command.getName(), param));
+                break;
+            }
+            case SELECT:
+                //⽆返回,并且有ResultHandler⽅法参数,则将查询的结果,提交给 ResultHandler 进⾏处理
+                if (method.returnsVoid() && method.hasResultHandler()) {
+                    executeWithResultHandler(sqlSession, args);
+                    result = null;
+                } else if (method.returnsMany()) {
+                    result = executeForMany(sqlSession, args);
+                } else if (method.returnsMap()) {
+                    result = executeForMap(sqlSession, args);
+                } else if (method.returnsCursor()) {
+                    result = executeForCursor(sqlSession, args);
+                } else {
+                    Object param = method.convertArgsToSqlCommandParam(args);
+                    result = sqlSession.selectOne(command.getName(), param);
+                    if (method.returnsOptional()
+                            && (result == null || !method.getReturnType().equals(result.getClass()))) {
+                        result = Optional.ofNullable(result);
+                    }
+                }
+                break;
+            case FLUSH:
+                result = sqlSession.flushStatements();
+                break;
+            default:
+                throw new BindingException("Unknown execution method for: " + command.getName());
+        }
+        //返回结果为null,并且返回类型为基本类型,则抛出BindingException异常
+        if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {
+            throw new BindingException("Mapper method '" + command.getName()
+                    + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");
+        }
+        return result;
+    }
+}
+
+

四.延迟加载

1.开启全局延迟加载配置

+

+<settings>
+    <!--开启全局延迟加载功能-->
+    <setting name="lazyLoadingEnabled" value="true"/>
+</settings>
+
+

2.配置局部延迟加载

+
<!-- 开启⼀对多 延迟加载 -->
+<resultMap id="userMap" type="user">
+    <id column="id" property="id"></id>
+    <result column="username" property="username"></result>
+    <result column="password" property="password"></result>
+    全局延迟加载
+    在Mybatis的核⼼配置⽂件中可以使⽤setting标签修改全局的加载策略。
+    注意
+    7.。
+    <result column="birthday" property="birthday"></result>
+    <!--
+    fetchType="lazy" 懒加载策略
+    fetchType="eager" ⽴即加载策略
+    -->
+    <collection property="orderList" ofType="order" column="id"
+                select="com.lagou.dao.OrderMapper.findByUid" fetchType="lazy">
+    </collection>
+</resultMap>
+<select id="findAll" resultMap="userMap">
+SELECT * FROM `user`
+</select>
+
+

3.Configuration中的配置

+
public class Configuration {
+    /** aggressiveLazyLoading:
+     * 当开启时,任何⽅法的调⽤都会加载该对象的所有属性。否则,每个属性会按需加载(参考
+     lazyLoadTriggerMethods).
+     * 默认为true
+     * */
+    protected boolean aggressiveLazyLoading;
+    /**
+     * 延迟加载触发⽅法
+     */
+    protected Set<String> lazyLoadTriggerMethods = new HashSet<String>
+            (Arrays.asList(new String[]{"equals", "clone", "hashCode", "toString"}));
+    /** 是否开启延迟加载 */
+    protected boolean lazyLoadingEnabled = false;
+
+    /**
+     延迟加载代理对象创建
+     Mybatis的查询结果是由ResultSetHandler接⼝的handleResultSets()⽅法处理的。ResultSetHandler
+     接⼝只有⼀个实现,DefaultResultSetHandler,接下来看下延迟加载相关的⼀个核⼼的⽅法
+     * 默认使⽤Javassist代理⼯⼚
+     * @param proxyFactory
+     */
+    public void setProxyFactory(ProxyFactory proxyFactory) {
+        if (proxyFactory == null) {
+            proxyFactory = new JavassistProxyFactory();
+        }
+        this.proxyFactory = proxyFactory;
+    }
+
+    //省略...
+}
+
+

4.查看ResultSetHandler如何实现延迟加载

+
  private Object createResultObject(ResultSetWrapper rsw,ResultMap resultMap,ResultLoaderMap lazyLoader,String columnPrefix)throws SQLException{
+        this.useConstructorMappings=false; // reset previous mapping result
+final List<Class<?>>constructorArgTypes=new ArrayList<>();
+final List<Object> constructorArgs=new ArrayList<>();
+        //创建返回的结果映射的真实对
+        Object resultObject=createResultObject(rsw,resultMap,constructorArgTypes,constructorArgs,columnPrefix);
+        if(resultObject!=null&&!hasTypeHandlerForResultObject(rsw,resultMap.getType())){
+final List<ResultMapping> propertyMappings=resultMap.getPropertyResultMappings();
+        for(ResultMapping propertyMapping:propertyMappings){
+        // issue gcode #109 && issue #149
+        // 判断属性有没配置嵌套查询,如果有就创建代理对象
+        if(propertyMapping.getNestedQueryId()!=null&&propertyMapping.isLazy()){
+        //#mark 创建延迟加载代理对象
+        resultObject=configuration.getProxyFactory().createProxy(resultObject,lazyLoader,configuration,objectFactory,constructorArgTypes,constructorArgs);
+        break;
+        }
+        }
+        }
+        this.useConstructorMappings=resultObject!=null&&!constructorArgTypes.isEmpty(); // set current mapping result
+        return resultObject;
+        }
+
+

5.代理对象执行逻辑

+
private static class EnhancedResultObjectProxyImpl implements MethodHandler {
+
+    private final Class<?> type;
+    private final ResultLoaderMap lazyLoader;
+    private final boolean aggressive;
+    private final Set<String> lazyLoadTriggerMethods;
+    private final ObjectFactory objectFactory;
+    private final List<Class<?>> constructorArgTypes;
+    private final List<Object> constructorArgs;
+
+    private EnhancedResultObjectProxyImpl(Class<?> type, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
+        this.type = type;
+        this.lazyLoader = lazyLoader;
+        this.aggressive = configuration.isAggressiveLazyLoading();
+        this.lazyLoadTriggerMethods = configuration.getLazyLoadTriggerMethods();
+        this.objectFactory = objectFactory;
+        this.constructorArgTypes = constructorArgTypes;
+        this.constructorArgs = constructorArgs;
+    }
+
+    public static Object createProxy(Object target, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
+        final Class<?> type = target.getClass();
+        EnhancedResultObjectProxyImpl callback = new EnhancedResultObjectProxyImpl(type, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);
+        Object enhanced = crateProxy(type, callback, constructorArgTypes, constructorArgs);
+        PropertyCopier.copyBeanProperties(type, target, enhanced);
+        return enhanced;
+    }
+
+    @Override
+    public Object invoke(Object enhanced, Method method, Method methodProxy, Object[] args) throws Throwable {
+        final String methodName = method.getName();
+        try {
+            synchronized (lazyLoader) {
+                if (WRITE_REPLACE_METHOD.equals(methodName)) {
+                    Object original;
+                    if (constructorArgTypes.isEmpty()) {
+                        original = objectFactory.create(type);
+                    } else {
+                        original = objectFactory.create(type, constructorArgTypes, constructorArgs);
+                    }
+                    PropertyCopier.copyBeanProperties(type, enhanced, original);
+                    if (lazyLoader.size() > 0) {
+                        return new JavassistSerialStateHolder(original, lazyLoader.getProperties(), objectFactory, constructorArgTypes, constructorArgs);
+                    } else {
+                        return original;
+                    }
+                } else {
+                    if (lazyLoader.size() > 0 && !FINALIZE_METHOD.equals(methodName)) {
+                        if (aggressive || lazyLoadTriggerMethods.contains(methodName)) {
+                            lazyLoader.loadAll();
+                        } else if (PropertyNamer.isSetter(methodName)) {
+                            final String property = PropertyNamer.methodToProperty(methodName);
+                            lazyLoader.remove(property);
+                        } else if (PropertyNamer.isGetter(methodName)) {
+                            final String property = PropertyNamer.methodToProperty(methodName);
+                            if (lazyLoader.hasLoader(property)) {
+                                lazyLoader.load(property);
+                            }
+                        }
+                    }
+                }
+            }
+            return methodProxy.invoke(enhanced, args);
+        } catch (Throwable t) {
+            throw ExceptionUtil.unwrapThrowable(t);
+        }
+    }
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Nginx\344\275\277\347\224\250\346\225\231\347\250\213/index.html" "b/Nginx\344\275\277\347\224\250\346\225\231\347\250\213/index.html" index e69de29bb2..50291df6b5 100644 --- "a/Nginx\344\275\277\347\224\250\346\225\231\347\250\213/index.html" +++ "b/Nginx\344\275\277\347\224\250\346\225\231\347\250\213/index.html" @@ -0,0 +1,1073 @@ + + + + + + + + + + + + Nginx使用教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Nginx使用教程 +

Nginx使用教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

引言

Nginx 是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP/UDP代理服务器。

+
    +
  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

    +
  • +
  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

    +
  • +
  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

    +
  • +
  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

    +
  • +
+

下载

windows环境

[官方网站]http://nginx.org/download/nginx-1.22.0.zip)

+

下载上面的压缩包解压运行nginx即可!

+

image-20200814103022339

+

Linux环境

官方网站

+

个人盘1

+

个人盘2

+

使用命令安装

# centos
+运行命令yum install nginx即可完成安装.
+# ubuntu
+运行命令apt install nginx即可完成安装.
+安装完成之后,执行nginx即可启动服务.
+默认路径配置:
+(1) Nginx配置路径:/etc/nginx/
+(2) PID目录:/var/run/nginx.pid
+(3) 错误日志:/var/log/nginx/error.log
+(4) 访问日志:/var/log/nginx/access.log
+(5) 默认站点目录:/usr/share/nginx/html
+
+

使用编译安装

+

执行 weget http://nginx.org/download/nginx-1.18.0.tar.gz

+
+

若提示weget command not found ,则请执行以下命令,安装weget

+
yum -y install wget
+
+

编译安装所需的额外插件

+
Gcc:yum install gcc c++ (用于编译c、c++代码)
+Pcre:yum install -y pcre pcre-devel(用c语言编写的正则表达式函数库))
+Zlib:yum install -y zlib zlib-devel(用于数据压缩的函式库))
+OpenSSL:yum install -y openssl openssl-devel安全套接字层密码库))
+
+

插件安装命令

+
yum install -y pcre pcre-devel
+yum install -y zlib zlib-devel 
+yum install -y openssl openssl-devel  
+
+

编译nginx

+
tar -zxvf nginx-1.15.tar.gz
+cd nginx-1.15
+./configure
+make
+make install
+
+

启动nginx

+
cd /usr/local/nginx/
+cd sbin/
+./nginx 
+
+

若想要全局都能执行nginx命令,可以编辑配置文件.将nginx加入到系统变量

+
1. vim /etc/profile
+2. 添加nginx的路径配置
+PATH=$PATH:/usr/local/nginx/sbin
+export PATH
+3.保存退出,执行命令更新配置
+source /etc/profile
+
+

+

实操

1.查看安装目录

命令: rpm -ql nginx
+rpm是linux的rpm包管理工具,-q代表询问模式,-l 代表返回列表
+
+

+

2.配置说明

执行如下命令,打开配置文件

+
cd /etc/nginx
+vim nginx.conf
+
+

内容如下

+
#运行用户,默认即是nginx,可以不进行设置
+user  nginx;
+#Nginx进程,一般设置为和CPU核数一样
+worker_processes  1;   
+#错误日志存放目录
+error_log  /var/log/nginx/error.log warn;
+#进程pid存放位置
+pid        /var/run/nginx.pid;
+
+
+events {
+    worker_connections  1024; # 单个后台进程的最大并发数
+}
+
+
+http {
+    include       /etc/nginx/mime.types;   #文件扩展名与类型映射表
+    default_type  application/octet-stream;  #默认文件类型
+    #设置日志模式
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';
+
+    access_log  /var/log/nginx/access.log  main;   #nginx访问日志存放位置
+
+    sendfile        on;   #开启高效传输模式
+    #tcp_nopush     on;    #减少网络报文段的数量
+
+    keepalive_timeout  65;  #保持连接的时间,也叫超时时间
+
+    #gzip  on;  #开启gzip压缩
+
+    include /etc/nginx/conf.d/*.conf; #包含的子配置项位置和文件
+
+

3.配置组成

全局块

从配置文件到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等

+

events块

events块涉及的指令主要影响Nginx服务器与用户的网络连接

+

http块

Nginx服务器培配置中最频繁的部分、代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都在这里
http全局快配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求书上限等

+

server块

每个server块也分为全局server块,以及可以同时包含多个location块

+
    +
  • 全局server块: 最常见的配置是本虚拟主机的监听配置和本虚拟机的名称或IP配置
  • +
  • location 块: 一个server可以配置多个location块,这块的主要作用是基于Nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称之外的字符串进行(例如 前面的uri-string)进匹配,对特定的请求进行处理,地址指向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
  • +
+

常用命令

启动nginx

    +
  • 直接使用nginx启动
  • +
  • 使用systemctl start nginx.service启动
  • +
+

查看服务

    +
  • 使用ps aux | grep nginx查询
  • +
  • 使用systemctl status nginx.service查看
  • +
+

+

停止

    +
  • 立即停止服务, nginx -s stop
  • +
  • 从容停止服务 nginx -s quit
  • +
  • 杀死进程 killall nginx
  • +
+

重启

systemctl restart nginx.service

+

更新

nginx -s reload

+

端口占用

netstat -tlnp

+

+

常见配置

1.自定义错误页面和访问限制

    +
  • 错误页面跳转

    +

    在nginx.conf文件中,可以针对不同的错误,来进行不同的跳转

    +
  • +
+

image-20220928194600804

+
    +
  • 访问权限控制(配置遵循先出现的设置会覆盖后出现的设置)
      +
    • 分块控制权限
    • +
    • 使用正则表达式设置访问权限
    • +
    +
  • +
+

image-20220928194613517

+

2.使用域名配置虚拟主机

    +
  • 配置基于不同端口的监听服务
  • +
+
    server{
+        listen 8010;
+        server_name _;
+        root /wangzai/images;
+        index a.jpg;
+    }
+
+
    +
  • 基于域名的监听服务配置
  • +
+
server{
+        listen 80;
+        server_name nginx2.jspang.com;
+        location / {
+                root /usr/share/nginx/html/html8001;
+                index index.html index.htm;
+        }
+}
+
+

3.代理

正向代理

如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。用作正向代理来代理进行上网等功能。
image-20220928194718509

+

反向代理

其实客户端对代理是无感知到,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
image-20220928194732457

+

反向代理常用指令
proxy_set_header: 在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
proxy_connect_timeout: 配置Nginx与后端代理服务器尝试建立连接的超时时间。
proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
proxy_send_timeout: 配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
proxy_redirect: 用于修改后端服务器返回的响应头中的Location和Refresh。

+

负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

+
upstream lagouServer{
+ server 111.229.248.243:8080;
+ server 111.229.248.243:8082;
+}
+location /abc {
+ proxy_pass http://lagouServer/;
+}
+
+

动静分离

为了加快网站的解析速度,可以将动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
image-20220928194848070

+

4.设备适配

使用内置变量 $http_user_agent 获取请求客户端的userAgent

+
 server{
+         listen 80;
+         server_name nginx2.jspang.com;
+         location / {
+          root /usr/share/nginx/pc;
+          if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
+             root /usr/share/nginx/mobile;
+          }
+          index index.html;
+         }
+ }
+
+

5.Gzip压缩配置

gzip配置指令

gzip : 该指令用于开启或 关闭gzip模块。
gzip_buffers : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
gzip_comp_level : gzip压缩比,压缩级别是1-9,1的压缩级别最低,9的压缩级别最高。压缩级别越高压缩率越大,压缩时间越长。
gzip_disable : 可以通过该指令对一些特定的User-Agent不使用压缩功能。
gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。
gzip_http_version:识别HTTP协议版本,其值可以是1.1.或1.0.
gzip_proxied : 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
gzip_vary : 用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。

+

简单示例

image-20220928195501054

+

image-20220928195512059

+

6.负载均衡

常用方式

轮询: 默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除;
weight: 权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况;
ip_hash: 每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的;
fair: 按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装;

+

简单示例

http {
+  upstream myserver {
+   # ip_hash;  # ip_hash 方式
+    # fair;   # fair 方式
+    server 127.0.0.1:8081;  # 负载均衡目的服务地址
+    server 127.0.0.1:8080;
+    server 127.0.0.1:8082 weight=10;  # weight 方式,不写默认为 1
+  }
+ 
+  server {
+    location / {
+       proxy_pass http://myserver;
+      proxy_connect_timeout 10;
+    }
+  }
+}
+
+

7.跨域解决

跨域是基于浏览器的同源策略决定的

+
# 同源的例子
+http://example.com/app1/index.html  # 只是路径不同
+http://example.com/app2/index.html
+
+http://Example.com:80  # 只是大小写差异
+http://example.com
+
+# 不同源的例子
+http://example.com/app1   # 协议不同
+https://example.com/app2
+
+http://example.com        # host 不同
+http://www.example.com
+http://myapp.example.com
+
+http://example.com        # 端口不同
+http://example.com:8080
+
+

使用反向代理解决跨域问题

    +
  • 将两个域名都映射到统一IP上面
  • +
  • 将页面fe.sherlocked93.club的请求全部代理到be.sherlocked93.club,绕过跨域问题
  • +
+
server {
+  listen 9001;
+  server_name fe.sherlocked93.club;
+
+  location / {
+    proxy_pass be.sherlocked93.club;
+  }
+}
+
+

配置header解决跨域问题

a,b两个页面,请求直接访问b可以,但是通过前端页面a中转b会报跨域错误.

+
# /etc/nginx/conf.d/be.sherlocked93.club.conf
+
+server {
+  listen       80;
+  server_name  be.sherlocked93.club;
+  
+   add_header 'Access-Control-Allow-Origin' $http_origin;   # 全局变量获得当前请求origin,带cookie的请求不支持*
+   add_header 'Access-Control-Allow-Credentials' 'true';    # 为 true 可带上 cookie
+   add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许请求方法
+   add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers;  # 允许请求的 header,可以为 *
+   add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
+   
+  if ($request_method = 'OPTIONS') {
+      add_header 'Access-Control-Max-Age' 1728000;   # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
+      add_header 'Content-Type' 'text/plain; charset=utf-8';
+      add_header 'Content-Length' 0;
+    
+      return 204;                  # 200 也可以
+   }
+  
+   location / {
+      root  /usr/share/nginx/html/be;
+      index index.html;
+   }
+}
+
+

8.搭建站点,代理本地文件

# 虚拟主机
+server {
+    listen       8080;
+    server_name  xx_domian; # 浏览器访问域名(若是本地调试,需要在host文件中配置ip,域名映射)
+
+    charset utf-8;
+    access_log  logs/xx_domian.access.log  access;
+
+    # 路由
+    location / {
+        root   www; # 访问根目录
+        index  index.html index.htm; # 入口文件
+    }
+}
+
+

9.根据文件类型设置过期时间

location ~.*\.css$ {
+    expires 1d;
+    break;
+}
+location ~.*\.js$ {
+    expires 1d;
+    break;
+}
+
+location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
+    access_log off;
+    expires 15d;    #保存15天
+    break;
+}
+
+

10.禁止浏览器对文件的缓存

location ~* \.(js|css|png|jpg|gif)$ {
+    add_header Cache-Control no-store;
+} 
+
+

11.防盗链

location ~* \.(gif|jpg|png)$ {
+    # 只允许 192.168.0.1 请求资源
+    valid_referers none blocked 192.168.0.1;
+    if ($invalid_referer) {
+       rewrite ^/ http://$host/logo.png;
+    }
+}
+
+

12.静态文件压缩

server {
+    # 开启gzip 压缩
+    gzip on;
+    # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)
+    gzip_http_version 1.1;
+    # 设置压缩级别,压缩级别越高压缩时间越长  (1-9)
+    gzip_comp_level 4;
+    # 设置压缩的最小字节数, 页面Content-Length获取
+    gzip_min_length 1000;
+    # 设置压缩文件的类型  (text/html)
+    gzip_types text/plain application/javascript text/css;
+}
+
+

13.指定错误跳转页面

# 根据状态码,返回对于的错误页面
+error_page 500 502 503 504 /50x.html;
+location = /50x.html {
+    root /source/error_page;
+}
+
+

14.跨域问题,反向代理解决方案

+

前端server域名: http://xx_domain

+

后端server域名: https://github.com

+

http://xx_domainhttps://github.com请求会出现跨域问题

+
+
## 配置反向代理的参数
+server {
+    listen    8080;
+    server_name xx_domain
+
+    ## 1. 用户访问 http://xx_domain,则反向代理到 https://github.com
+    location / {
+        proxy_pass  https://github.com;
+        proxy_redirect     off;
+        proxy_set_header   Host             $host;        # 传递域名
+        proxy_set_header   X-Real-IP        $remote_addr; # 传递ip
+        proxy_set_header   X-Scheme         $scheme;      # 传递协议
+        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
+    }
+}
+
+

15.禁止指定user_agent访问

#虚拟主机的配置文件里加入:
+
+if ($http_user_agent ~* 'baidu|360|sohu') #禁止useragent为baidu、360和sohu,~*表示不区分大小写匹配
+{
+   return 403;
+}
+
+location /  和  location  ~ /  优先级是不一样的。 
+结合这个文章研究一下吧 http://blog.itpub.net/27181165/viewspace-777202/
+curl -A "baidu" -x127.0.0.1:80 www.test.com/forum.php -I    该命令指定百度为user_agent,返回403
+
+

16.nginx访问控制

# 可以设置一些配置禁止一些ip的访问
+
+deny 127.0.0.1;     #全局定义限制,location里的是局部定义的。如果两者冲突,以location这种精确地优先,
+
+location ~ .*admin\.php$ {
+    #auth_basic "cct auth";
+    #auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
+
+    allow 127.0.0.1;  只允许127.0.0.1的访问,其他均拒绝
+    deny all;
+
+    include fastcgi_params;
+    fastcgi_pass unix:/tmp/www.sock;
+    fastcgi_index index.php;
+    fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
+}
+
+

17.负载均衡

http {
+    upstream test.net {
+        ip_hash;
+        server 192.168.10.13:80;
+        server 192.168.10.14:80  down;
+        server 192.168.10.15:8009  max_fails=3  fail_timeout=20s;
+        server 192.168.10.16:8080;
+    }
+    server {
+        location / {
+            proxy_pass  http://test.net;
+        }
+    }
+} 
+
+

18.gzip常用配置

   gzip  on;
+   gzip_min_length 1k;
+   gzip_buffers 4 16k;
+   gzip_http_version 1.1;
+   gzip_comp_level 9;
+   gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
+   gzip_disable "MISE [1-6]\.";
+   gzip_vary on;
+
+

底层剖析

Nginx启动后,以daemon多进程⽅式在后台运⾏,包括⼀个Master进程和多个Worker进程,Master 进程是领导,是⽼⼤,Worker进程是⼲活的⼩弟
image-20220928200042695

+

master进程

    +
  • 接收外界信号向各worker进程发送信号(./nginx -s reload)
  • +
  • 监控worker进程的运行状态,但worker进程异常退出后Master进程会自动重新启动新的worker进程等
  • +
+

worker进程

worker进程具体处理网络请求,各进程互相独立,同等竞争
image-20220928200054514

+

示例

以./nginx -s reload来说明nginx信号处理部分

+
    +
  1. master进程对配置文件进行语法检查
  2. +
  3. 尝试配置(比如修改了监听端口,那就尝试新的监听端口)
  4. +
  5. 尝试成功则使用新的配置,新建worker进程
  6. +
  7. 新建成功,给旧的worker进程发送关闭消息
  8. +
  9. 旧的worker进程收到信号会继续服务,直到把当前进程收到的请求处理完毕后关闭
    image-20220928200106463
  10. +
+
    +
  • worker进程处理请求部分的说明
      +
    • master进程建立之后,会建立需要监听的socket,然后从master进程在fork出多个work进程,所以,所有worker进程的监听描述符listenfd来新连接到来时都变得可读
    • +
    • nginx使用互斥锁来保证一个workder进程能够处理请求,拿到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接收该连接,然后解析,处理,返回客户端.
    • +
    +
  • +
  • nginx多进程模型的好处
      +
    • 每个worker进程都是独立的,不需要加锁,节省开销
    • +
    • 每个worker进程都是独立的,互不影响,一个异常结束,其他的照样能提供服务
    • +
    • 多进程模型为reload热部署机制提供了支撑
    • +
    +
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Nginx\350\207\252\345\273\272CDN/index.html" "b/Nginx\350\207\252\345\273\272CDN/index.html" index e69de29bb2..327c425e0a 100644 --- "a/Nginx\350\207\252\345\273\272CDN/index.html" +++ "b/Nginx\350\207\252\345\273\272CDN/index.html" @@ -0,0 +1,658 @@ + + + + + + + + + + + + 使用Nginx自建CDN加速Hexo博客 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

引言

​ 可能有很多人的网站由于不想备案,所以一般部署在国外服务器上面,这样导致的情况就是大多数国内CDN都无法使用,而且如果网站服务器线路不好的情况还会导致访问缓慢,这样会极大影响用户体验感!这时候我们就可以利用Nginx的反向代理设置达到网站加速的效果,同时由于访问的是节点服务器IP,也就避免了暴露源站IP的风险从而增强防御,而宝塔面板自带Nginx反向代理设置,操作起来就更简单容易了。

+

CDN

​ CDN,即 Content delivery network(内容分发网络),是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

+

​ 换言之,即我们的网站服务器位置是固定的,比如托管在北京电信机房,对于北京电信访客来说,网页加载速度很快,基本感受不到延迟,对于云南移动访客来说,网页加载速度就明显变慢,而对于海外访客来说,网页加载就要转圈圈了,体验不好。当我们上了 CDN 后,CDN 各地节点会缓存我们服务器的内容,根据 CDN 的原理,此时北京电信访客访问的服务器将是该 CDN 的北京节点(如果有),云南移动访客访问的将是云南节点(如果有),海外(中国大陆以外)访客访问的则是海外节点(如果有),访问及加载速度将会大幅提升,用户体验也会大大改善。

+

CDN工作流程

image-20220929093359073

+

​ 如上图所示,这是一个完整的流程图:客户端访问域名时,先向 DNS 请求域名 IP,DNS 查询到 CNAME 记录(如果没有 DNS 直接回复源服务器 IP),则进一步解析 CNAME 智能解析服务器, 智能解析收到请求根据客户端来源按规则判断并回复 CDN 节点 IP,客户端此时访问域名就连接到了回复的 CDN 节点,如果 CDN 节点没有缓存,则 CDN 就会发起连接到负载均衡器(如果没有则直接连接源服务器,一般在有多个源服务器后端时才会有负载均衡器),然后负载均衡器根据规则分流到源服务器,将内容返回给 CDN 节点,CDN 节点再返回给客户端,完成整个访问流程。

+

​ 从流程上看使用 CDN 后整个过程中增加了很多路由,看起来客户端访问速度可能会变慢,但实际上,从智能解析到负载均衡,客户端几乎是没有感知的,也就是说客户端能感受到的速度就是到 CDN 节点的速度。

+

准备

    +
  • 一台延迟低的国外服务器A,如香港,台湾
  • +
  • 域名A,如wangwangit.com
  • +
  • 服务器A部署宝塔,并安装Nginx
  • +
  • 博客绑定的域名B,如www.wangwangit.com
  • +
+

教程

宝塔安装

一键脚本:

+
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec
+
+

域名解析

配置域名A解析到服务器A的IP.如

+

image-20220929084817685

+

修改HOST

通过ping个人博客域名,如wangwangit.github.io(www.wangwangit.com),获取对应的IP

+

image-20220929085134149

+

编辑服务器A的/etc/hosts文件,添加博客IP/博客域名的配置

+

image-20220929084947709

+

配置反向代理

打开我们香港服务器上的宝塔管理界面.新增站点.添加反向代理

+

image-20220929085305039

+

反向代理配置如下,修改目标URL为自己博客的域名即可.

+

image-20220929095109087

+

检查代理是否成功

查看缓存目录

完成上面操作之后,访问域名,即可在缓存文件目录看到缓存文件,路径如下:

+

默认缓存目录:/www/server/nginx/proxy_cache_dir

+

反代配置文件:/www/server/nginx/conf/proxy.conf

+

使用ping域名检测

ping检测: https://ping.chinaz.com/wangwangit.com

+

若ip是自己服务器的ip,并且域名可以访问博客.则说明代理成功!

+

image-20220929095322940

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Nginx\350\207\252\345\273\272Github\345\233\276\345\272\212\345\212\240\351\200\237/index.html" "b/Nginx\350\207\252\345\273\272Github\345\233\276\345\272\212\345\212\240\351\200\237/index.html" index e69de29bb2..3bd81f3a89 100644 --- "a/Nginx\350\207\252\345\273\272Github\345\233\276\345\272\212\345\212\240\351\200\237/index.html" +++ "b/Nginx\350\207\252\345\273\272Github\345\233\276\345\272\212\345\212\240\351\200\237/index.html" @@ -0,0 +1,684 @@ + + + + + + + + + + + + 利用闲置服务器搭建一个专属图床加速器 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

我的博客是基于Hexo+Github搭建的,图床也是使用的Github。众所周知,由于某些原因,Github上的图片经常无法访问。通常,我们会使用jsDelivr进行加速,或者使用国内的CDN服务提供商,如腾讯云、七牛云等。

+

由于jsDelivr最近被墙了一段时间,国内访问速度也不太理想,因此我选择了腾讯CDN加速。价格倒是不贵,但最近发现由于一些文章的热度上升,流量消耗得很快。同时,我一直担心我的网站会受到恶意攻击。于是我决定换一种思路来解决这个问题,利用我自己的闲置服务器搭建一个加速器。

+

前提条件

    +
  • 一台国内能流畅访问且能正常访问Github的服务器
  • +
  • Nginx
  • +
  • 域名(非必需)
  • +
  • Python
  • +
+

关于图床和Nginx的教程,你可以查看之前的文章。

+

教程

第一步:

+

拉取Github图片仓库到/var/www/目录下。请替换下面命令中的仓库地址为你自己的地址。

+
git clone https://github.com/image
+
+

第二步:

+

配置Nginx,映射当前图片仓库目录。假设我的图片仓库地址是:/var/www/image。以下配置的作用是,当访问 http://aaa.wangwangit.com/img/1.jpg 时,会实际访问服务器上的 /var/www/image/img/1.jpg 文件。

+
server {
+    listen 80;
+    server_name aaa.wangwangit.com;
+    root /var/www/html;
+ 
+    location /img {
+        root /var/www/image/;
+        autoindex on;
+    }
+}
+
+

完成修改后,执行 nginx -s reload 命令来更新配置。

+

第三步:

+

上面两步实际上已经配置好了图床的加速器。我们只需要使用自己的域名地址进行访问即可。也许你会问为什么要使用Github,而不是直接将图片存储在服务器上。这样做有几个原因:首先,我的以前的图片已经存在Github上了;另外,使用Github的话,我不需要自己去维护图床。

+

接下来,我们还需要及时拉取Github图床的更新。下面我来介绍如何实现这一点。

+

我们可以使用Github的Webhook功能,在服务器的/var/www/目录下创建一个名为webhook_receiver.py的Python文件,并编辑以下内容:

+
from flask import Flask, request
+import subprocess
+
+app = Flask(__name__)
+
+@app.route('/webhook', methods=['POST'])
+def webhook():
+    if request.headers.get('X-GitHub-Event') == 'push':
+        subprocess.Popen(['git', '-C', '/var/www/image', 'pull'])
+        return 'Webhook received successfully', 200
+    else:
+        return 'Unsupported event', 200
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=5000)
+
+

保存文件后,执行 pip install flask 命令来安装依赖。你可以先使用 python3 webhook_receiver.py 命令进行测试,确认是否正常运行。若一切正常,可以使用 Ctrl+c 结束执行,然后使用 nohup python3 webhook_receiver.py & 命令来运行它。

+

接下来,在Github项目中设置Webhook:

+
    +
  1. 打开你的项目页面,点击 “Settings”(设置)选项卡。
  2. +
  3. 在左侧导航栏中选择 “Webhooks”(Web钩子)。
  4. +
  5. 点击 “Add webhook”(添加Webhook)按钮。
  6. +
  7. 在 “Payload URL”(有效载荷 URL)字段中输入 http://your-server-ip:5000/webhook,将 your-server-ip 替换为你服务器的实际IP地址。
  8. +
  9. 在 “Content type”(内容类型)字段中选择 “application/json”。
  10. +
  11. 在 “Secret”(密钥)字段中输入一个可选的密钥,用于在请求中进行身份验证。
  12. +
  13. 在 “Which events would you like to trigger this webhook?”(您想要触发此Webhook的事件?)部分选择 “Just the push event”(仅推送事件)选项。
  14. +
  15. 确保 “Active”(启用)复选框被选中。
  16. +
  17. 点击 “Add webhook”(添加Webhook)按钮保存设置。
  18. +
+

image-20230523103759670

+

至此,部署完成。只需要在图床仓库上传一张图片,然后使用服务器的域名去访问,就可以测试是否配置正常了!

+

总结

我在文章中提到的几个方案,在之前的文章中都有详细介绍。如果你还有不懂的地方,可以去查看相关文章,或者加入我的交流学习群一起探讨!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/OfficeCopilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" "b/OfficeCopilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" index e69de29bb2..4be1b94cb5 100644 --- "a/OfficeCopilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" +++ "b/OfficeCopilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" @@ -0,0 +1,666 @@ + + + + + + + + + + + + 抢先体验Office Copilot - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前提

注意: 以下方法已经失效,官方关闭通道了,可以进群等后续通知!

+

账号需要拥有Microsoft 365订阅!!!

+

账号白嫖教程参考:Microsoft365账号申请教程 - 一只会飞的旺旺 (wangwangit.com)

+

懒得折腾?直接购买:https://shop.wangwangit.com

+

进群交流:

+

群聊人数上限了,加我微信备注ai拉你进群!

+

image-20230330182217930

+

注意

教程已失效,官方关闭通道了,可以进群等后面更新!

+

教程

1.打开注册表

image-20230329084452837

+

2.定位修改位置

路径如下:

+
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration
+
+

image-20230329084605880

+

右键单击Configuration文件夹,进行导出备份

+

3.修改注册表

分别修改以下几个值

+
AudienceData->Dogfood::DevMain
+AudienceID->ea4a4090-de26-49d7-93c1-91bff9e53fc3
+CDNBaseURL->http://officecdn.microsoft.com/pr/ea4a4090-de26-49d7-93c1-91bff9e53fc3
+UpdateChannel->http://officecdn.microsoft.com/pr/ea4a4090-de26-49d7-93c1-91bff9e53fc3
+
+

image-20230329084725355

+

然后打开word进行更新

+

image-20230329084910181

+

4.再次修改注册表

更新完成之后版本号应该是如下所示或者高于此版本号

+

image-20230329190749364

+

再打开注册表路径

+
计算机\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\ExperimentConfigs\ExternalFeatureOverrides\word
+
+

新建一个REG_SZ(字符串)值,如图

+
名称:Microsoft.Office.Word.CoPilotExperiment
+值:true
+
+

image-20230329085406659

+

5.使用Copilot

再次重启word,即可看到Copilot了

+

image-20230329191217080

+

最后

Dogfood的更新频率很快,可能一周会发两到三个版本,而且目前很鸡肋,适合尝鲜,且目前好像只有word能用。

+

11

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/OracleCloud\347\224\263\350\257\267\346\225\231\347\250\213/index.html" "b/OracleCloud\347\224\263\350\257\267\346\225\231\347\250\213/index.html" index e69de29bb2..2b0ef40000 100644 --- "a/OracleCloud\347\224\263\350\257\267\346\225\231\347\250\213/index.html" +++ "b/OracleCloud\347\224\263\350\257\267\346\225\231\347\250\213/index.html" @@ -0,0 +1,737 @@ + + + + + + + + + + + + 2022最新申请OracleCloud教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

简介

甲骨文是一家做数据库的巨头公司,大家可能知道MySQL比较多,但是另外一个数据库巨头就是甲骨文了,也就是我们常说的Oracle数据库。后来云计算爆发,亚马逊、微软谷歌等美国巨头公司推出了自己的云计算服务,甲骨文也做了云计算服务。其它巨头推出免费试用一年,甲骨文2019年9月推出永久免费服务。不管他家的服务如何,总之“永久免费”的噱头一经打出,立即引来了不少流量。

+

Oracle 云免费套餐只需注册 Oracle 云帐户即可获取,不仅包含丰富的 Always Free 云服务,还提供 300 美元的免费试用储值,让您可以在 30 天内免费使用所有适用的 Oracle 云基础设施服务。其中,Always Free 云服务无时长限制,免费试用仅 300 美元免费储值用尽或 30 天到期(以先到者为准)前有效。也就是花完这赠送的费用后,还能继续免费使用其VPS云主机。

+

其实这个永久免费是有很多限制的,然后中国的薅羊毛大军加入,注册起来也是有些门槛和限制了。而且随着谷歌云将一年免费缩减到3个月免费使用,谷歌云的用户大量减少,因此目光都转向了Oracle Cloud甲骨文永久免费云主机,导致门槛越来越难进,申请越来越难,不过总得来讲,永久免费绝对是香的。

+

Oracle Cloud甲骨文永久免费云主机可以包含的内容:

+

最多创建2台实例,各自包含一条公网IP(IP地区仅限申请时选择的区域),免费实例配置如下:

+
    +
  • 1/8 OCPU 和 1 GB 内存
  • +
  • 20GB存储空间
  • +
  • 每台实例带宽官方标注是480mbps(实际测出来50mbps)
  • +
  • 每月总出站流量是10T(帐号所有项目共享,入站免费)
  • +
  • Oracle Linux或CentOS、Ubuntu Linux系统镜像任选一种
  • +
+

甲骨文采用的是资源平均分配,一台老母鸡分给8个人用,也就是1/8 ocpu,总共带宽是480,除以8大概就理论是60mbps,实际50mbps左右。

+

准备

近年来太多人被挡在了注册上,导致注册甲骨文云主机变成了一种玄学。本次搬主题介绍的教程不敢保证100%注册成功,但是参考本教程最少将失败的概念降低了一大半。

+

我们在申请前,需要准备如下:

+
    +
  • 一个邮箱,最好是Gmail或hotmail之类的国外常用邮箱,国内的163邮箱也行,目前貌似不挑邮箱。
  • +
  • 一张卡面有Master、VISA或AMEX之一标志的外币信用卡(单标外币信用卡通过率高一些),这张卡必须是外币信用卡。
  • +
  • 一个手机号,中国的就行
  • +
+

邮箱和手机号基本没什么阻碍,但是信用卡的话就比较玄学了,很多人都是被挡在最后信用卡的验证和申请上。这里先说第一个注意事项

+

注意事项1:将信用卡的单日限额、刷卡限额先临时关掉,同时将一些境外支付安全认证之类的服务临时关掉。搬主题用的是交行的外币信用卡,在交行官方APP买单吧里将对应的服务都关掉了。如果不关,导致扣款和认证失败,那么接下来超级容易卡在最后一步。

+

图文教程

做好准备后,前往Oracle Cloud甲骨文永久免费云主机的注册网站:https://signup.cloud.oracle.com/

+

这个时候出现如下界面,就可以开始申请注册了。

+

注意事项2:不要挂代理,不要挂代理,不要挂代理。重要的事情说三遍!和正常上网一样即可。

+

在右边我们需要先填写账户信息。这里我们需要选择国家为:中国,姓氏和名字按真实填写。邮箱的话按前面说的即可。最后勾选验证框。

+

注意事项3:姓名需要填写自己的名字的拼音,如果三个字的中间注意要空格!如果是乱填资料只会出现注册失败!另外,这个姓名需要和信用卡的名字保持一致!!!

+

image-20220928200652966

+

接下来验证自己的邮箱。点击邮箱里面收到的验证邮件,如下图

+

image-20220928200704010

+

接下来开始填写其他信息,密码按其规则填就行了。公司名称可以留空。

+

账户名一般我们保持默认即可。

+

主区域的选择:主区域只能选择一次,也就是选了后,只能在这个区域内开相应的主机。

+

附甲骨文机房地区列表

+
    +
  • 亚太地区
  • +
  • 韩国-朝鲜(春川)
  • +
  • 印度西部(孟买)
  • +
  • 日本中部(大阪)
  • +
  • 澳大利亚东南部(墨尔本)
  • +
  • 印度南部(海得拉巴)
  • +
  • 澳大利亚东部(悉尼)
  • +
  • 韩国中部(首尔)
  • +
  • 日本东(东京)
  • +
  • 北美
  • +
  • 加拿大东南部(多伦多)
  • +
  • 美国西部(圣何塞)
  • +
  • 美国西部(凤凰城)
  • +
  • 加拿大东南部(蒙特利尔)
  • +
  • 美国东部(阿什本)
  • +
  • 拉丁美洲
  • +
  • 智利中部(圣地亚哥)
  • +
  • 巴西东部(圣保罗)
  • +
  • 巴西东南部(维涅杜)
  • +
  • 欧洲、中东和非洲
  • +
  • 英国南部(伦敦)
  • +
  • 沙特阿拉伯西部(吉达)
  • +
  • 瑞士北部(苏黎世)
  • +
  • 德国中部(法兰克福)
  • +
  • 荷兰西北部(阿姆斯特丹)
  • +
  • 英国西部(加的夫)
  • +
  • 阿联酋东部(迪拜)
  • +
+

注意事项4:很多人喜欢注册韩国首尔、春川、日本东京等,离得近,延迟也低。但是首尔和东京注册的国人人非常多,极容易出现通不过的情况,建议选择一些冷门区域。比如美西的圣何塞,德国法兰克福,或者觉得自己运气还好的话可以选择韩国春川。这里搬主题之前选择的是首尔,结果第一次失败,第二次选择的是圣何塞。

+

image-20220928200719651

+

接下来填写相应的地址信息,这里需要填写自己的真实地址

+

地址行共分为3行,建议全部填满。

+

比如广东省广州市天河区中山大道5号,

+

那么拼音直接简单粗暴的填写:guang dong sheng guang zhou shi tian he qu zhong shan da dao 5 hao,

+

然后将这些拼音分别填到3个地址行分钟,比如第一行填省,第二行填市,第三行填剩下的地址。

+

注意事项5:地址中的拼音,必须有空格,不要一堆乱码连着写,注意留出空格!这个地址和自己的信用卡的账单地址保持一致!不清楚自己的信用卡账单地址的,自己去自己的信用卡APP上查找。

+

image-20220928200754552

+

接下来进行电话的验证,这里填自己的手机号就行,不要填自己网上搜索的什么虚拟解码的号码,毕竟那个解码不懂被N多人注册过。

+

image-20220928200807719

+

如果前面注册没问题,那么接下来就是正常的手机接收验证码的时候,如下图,自己手机会收到类似的验证码。

+

image-20220928200832979

+

填写好验证码后,自己的电话验证就通过了,接下来就是最后最关键的一步,验证付款方式,如下图,点击添加付款验证方式。

+

image-20220928200843410

+

这个时候会弹出一个框,即填写信用卡的,如下图

+

image-20220928200853319

+

这里要填写自己的信用卡的信息,因为前面填写了,这里直接默认和前面的信息一致。

+

如果前面都按搬主题的要求填写的话,这里不用进行改动。

+

image-20220928200904797

+

我们需要根据自己的信用卡的类型进行填写相应的信息。

+

包括卡片类型,是Visa还是MasterCard等,然后填写卡片号码,过期日期和年份及CVN码。

+

image-20220928200917104

+

如果信用卡验证没问题的话,会出现类型下面的图。一般信用卡中心会打电话给自己说自己是不是在甲骨文网站进行消费,答复说是的就行了。

+

image-20220928200928325

+

卡片验证通过后,勾选协议,点击开始我的免费试用即可。

+

image-20220928200936249

+

点击登录,输入前面注册填写的邮箱及密码即可,登录成功的页面如下:

+

image-20220928201104819

+

再过不久,官方就送出了400新加坡币的邮件。

+

image-20220928201114025

+

以上就是2022年最新申请Oracle Cloud甲骨文永久免费云主机图文教程,并分享了申请的注意事项。有兴趣的小伙伴可以根据本教程去申请。

+

常见问题

点击开始我的免费试用后然后不能通过,很多人卡在了这一步。

+

提示1:无法完成您的注册。常见注册错误有:(a) 使用的是预付卡。Oracle 仅接受信用卡和借记卡;(b) 有意或无意遮挡了人员地点或身份信息;(c) 输入的账户信息不完整或不准确。如果您出现了上述情况,请重试。否则,请联系 Oracle 客户服务。

+

解释:一般这种情况是扣款失败和信息不对。扣款失败也就是搬主题说到的先去检查有没有关闭信用卡的境外支付安全验证什么的服务,确保扣款成功。信息不对的就是前面的信息是否真实,不要乱填相关信息。

+

提示2:您的信用卡已被拒绝

+

解释:很多人遇到这一步就觉得是不是直接没希望了,卡片的问题。其实不是的,如果自己的信用卡确实符合外币卡,也关闭了相关境外支付验证的服务,之前也没有乱用,那么一般这种情况是半小时内申请的次数过多,可以等待几个小时以后再去申请。

+

如果以上都正常,实际上点击点击开始我的免费试用后,页面会出现正在创建账户的提示。创建完成后,自己的邮箱会收到成功的提示,如下图。

+

image-20220928201035639

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/RabbitMQ\351\205\215\347\275\256Mqtt\345\215\217\350\256\256/index.html" "b/RabbitMQ\351\205\215\347\275\256Mqtt\345\215\217\350\256\256/index.html" index e69de29bb2..5ffc38832c 100644 --- "a/RabbitMQ\351\205\215\347\275\256Mqtt\345\215\217\350\256\256/index.html" +++ "b/RabbitMQ\351\205\215\347\275\256Mqtt\345\215\217\350\256\256/index.html" @@ -0,0 +1,637 @@ + + + + + + + + + + + + RabbitMQ配置Mqtt协议 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ + + + +
+ +
+
+
+ + +
  1. 1. 步骤
+ +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

步骤

1.启用插件

+

RabbitMQ安装默认不会启用MQTT插件,执行如下命令启用插件

+
rabbitmq-plugins enable rabbitmq_mqtt
+rabbitmq-plugins list
+
+

2.配置权限

+

MQTT插件默认允许匿名访问,但不建议。
添加用户。 添加一个用户名和密码都是 “admin”的用户

+
rabbitmqctl add_user admin admin
+
+

设置用户读写权限

+
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
+rabbitmqctl set_user_tags admin management
+
+

3.添加队列,绑定Exchange和Queues

+

插件基于exchanges 和 queues实现。也就是 MQTT消息是通过Exchange路由到相应的Queue中。

+

当Mqtt消息发布到MQTT topics时,会使用topic 类型的exchange (默认为amq.topic) 。订阅者通过队列(queues)获取Mqtt消息。

+

默认情况下,如果Queue不存在,会自动创建一个Auto-Delete类型的队列。

+

MQTT主题使用(“/“) 分隔;而AMQP 0-9-1使用点(“.”) 分隔。插件可以在不同协议之间转换,例如将“cities/london”转换成“cities.london”

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Reddit-\345\205\215\350\264\271\347\232\204AI\345\255\246\344\271\240\345\256\235\345\272\223/index.html" "b/Reddit-\345\205\215\350\264\271\347\232\204AI\345\255\246\344\271\240\345\256\235\345\272\223/index.html" index e69de29bb2..557bd9fc2c 100644 --- "a/Reddit-\345\205\215\350\264\271\347\232\204AI\345\255\246\344\271\240\345\256\235\345\272\223/index.html" +++ "b/Reddit-\345\205\215\350\264\271\347\232\204AI\345\255\246\344\271\240\345\256\235\345\272\223/index.html" @@ -0,0 +1,643 @@ + + + + + + + + + + + + Reddit-免费的AI教育宝库 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20230703194851895

+

你可能听说过Reddit,它是一个拥有数亿用户的社交媒体平台,也是互联网上最大的内容聚合网站之一。但你可能不知道的是,Reddit还是一个隐藏的AI教育宝库,里面有无数的AI相关的subreddit(即主题论坛),涵盖了从基础知识到前沿技术,从理论研究到实践应用,从艺术创作到未来展望的各个方面。

+

如果你想学习AI,或者提升你的AI技能,或者寻找AI灵感,或者和AI爱好者交流,那么Reddit是一个不可错过的平台。但是,Reddit上的AI资源如此丰富,以至于很多人不知道从哪里开始,或者怎么找到最适合自己的subreddit。因此,我在这里为你推荐9个最佳的AI相关的subreddit,让你能够快速地了解和掌握AI的精髓!

+

1. r/ChatGPT

这是一个专门讨论ChatGPT提示、工作流程和用例的subreddit。ChatGPT是一个基于OpenAI GPT-3模型的聊天机器人平台,它可以根据用户输入的提示(即文本指令)生成各种类型和风格的对话。在这个subreddit里,你可以看到很多人分享他们使用ChatGPT创建的有趣、有用或有启发性的对话示例,也可以学习到如何编写高质量的提示来优化ChatGPT的输出效果。如果你对聊天机器人感兴趣,或者想要利用ChatGPT来完成一些特定的任务(比如写作、教育、娱乐等),那么这个subreddit绝对值得一看。

+

地址: https://t.co/Wel5N3sIqS

+

2. r/Midjourney

这是一个展示Midjourney AI图像生成工具的艺术作品(以及使用的提示)的subreddit。Midjourney是一个基于OpenAI DALL•E模型的图像生成平台,它可以根据用户输入的文本描述生成相应的图像。在这个subreddit里,你可以欣赏到很多人使用Midjourney创造出来的惊艳、奇妙或搞笑的图像作品,也可以学习到如何用简单或复杂的文本描述来激发Midjourney的想象力。如果你对AI图像生成感兴趣,或者想要利用Midjourney来创造一些独特或有趣的图像,那么这个subreddit绝对值得一看。

+

地址: https://t.co/4642k3JgTx

+

3. r/ChatGPTPromptGenius

这是一个专门为ChatGPT编写高级、精细化提示(即文本指令)的社区。在这个subreddit里,你可以看到很多人展示他们为ChatGPT设计的精妙、复杂或有创意的提示,以及由这些提示生成出来的高质量、高逼真或高趣味的对话。在这个subreddit里,你可以学习到如何利用ChatGPT的各种功能和参数来控制和调整对话的内容、风格和形式,也可以向其他人寻求帮助或反馈,或者参与一些有趣的挑战或比赛。如果你想要提高你的ChatGPT提示编写技巧,或者想要看看别人是如何利用ChatGPT的强大能力来创造出各种各样的对话,那么这个subreddit绝对值得一看。

+

地址: https://t.co/6aW8dvKeHl

+

4. r/StableDiffusion

这是一个展示Stable Diffusion文本到图像AI模型的照片、视频和教程的subreddit。Stable Diffusion是一个基于Diffusion模型的图像生成平台,它可以根据用户输入的文本描述生成相应的图像,并且可以实时地调整图像的细节和风格。在这个subreddit里,你可以看到很多人使用Stable Diffusion创造出来的精美、逼真或有趣的图像作品,也可以学习到如何用不同的文本描述来控制和调整图像的生成过程。如果你对AI图像生成感兴趣,或者想要利用Stable Diffusion来创造一些高质量或有个性的图像,那么这个subreddit绝对值得一看。

+

地址: https://t.co/e1ONji9lj4

+

5. r/Singularity

这是一个关于未来当AI超越人类智能时的令人着迷的讨论subreddit。Singularity(即奇点)是一个假设的未来时刻,当AI达到或超过人类智能水平时,将会引发一系列不可预测或不可控制的变化。在这个subreddit里,你可以看到很多人分享他们对于Singularity的看法、预测、担忧或期待,也可以参与到一些关于Singularity可能带来的影响、挑战、机遇或道德问题的热烈讨论中。如果你对AI未来感兴趣,或者想要了解不同人对于Singularity的观点和态度,那么这个subreddit绝对值得一看。

+

地址: https://t.co/dP3vlWGnkC

+

6. r/MachineLearning

这是一个关于AI技术主题学习的最佳社区subreddit。Machine Learning(即机器学习)是AI领域中最核心也最活跃的分支之一,它涉及到如何让计算机通过数据和算法来自动地学习和改进。在这个subreddit里,你可以看到很多人分享他们在机器学习方面的研究成果、项目经验、学习资源、技术问题或新闻动态,也可以向其他人寻求帮助或建议,或者参与一些关于机器学习最新进展或趋势的讨论。如果你想要学习机器学习,或者提升你的机器学习技能,或者了解机器学习领域的最新动态,那么这个subreddit绝对值得一看。

+

地址: https://t.co/5dC2dy8e35

+

7. r/Artificial

这是Reddit上关于AI新闻、工具和创作的主要subreddit。Artificial(即人工智能)是一个涵盖了计算机科学、数学、心理学、哲学等多个学科的综合领域,它旨在让计算机能够模拟或扩展人类的智能。在这个subreddit里,你可以看到很多人分享他们关于AI的最新新闻、最佳工具、最酷创作或最有趣故事,也可以参与到一些关于AI的一般性或专业性的讨论中。如果你想要了解AI的各个方面,或者想要发现AI的各种可能性,或者想要和AI爱好者交流,那么这个subreddit绝对值得一看。

+

地址: https://t.co/XAxAhcgGx2

+

8. r/Dalle2

这是一个展示OpenAI DALLE•2工具生成的图像和提示的subreddit。DALLE•2是OpenAI最新推出的文本到图像AI模型,它可以根据用户输入的文本描述生成相应的图像,并且可以实现多模态(即文本和图像之间的互动)的生成。在这个subreddit里,你可以看到很多人使用DALLE•2创造出来的令人惊叹、有趣或奇怪的图像作品,也可以学习到如何用不同的文本描述来激发DALLE•2的创造力。如果你对AI图像生成感兴趣,或者想要利用DALLE•2来创造一些新颖或有意思的图像,那么这个subreddit绝对值得一看。

+

地址: https://t.co/YKVZvEyVnj

+

9. r/OpenAI

这是一个专门讨论AI领域领先公司OpenAI的新闻和更新的社区subreddit。OpenAI是一个由伊隆·马斯克等人创立的非营利性研究机构,它致力于创建和推广友善的人工智能,并且为所有人提供公平和开放的访问。在这个subreddit里,你可以看到很多人分享他们关于OpenAI的最新消息、最新产品、最新研究或最新活动,也可以参与到一些关于OpenAI的愿景、目标、挑战或贡献的讨论中。如果你对OpenAI感兴趣,或者想要了解OpenAI在AI领域所做的工作和影响,那么这个subreddit绝对值得一看。

+

地址: https://t.co/70XINcsLiG

+

以上就是我为你推荐的9个最佳的AI相关的subreddit,希望你能够从中受益,并且享受Reddit上丰富而有趣的AI教育资源。如果你喜欢这篇文章,请给我点赞、评论或转发,让更多人知道Reddit是免费的、世界一流的AI教育平台!谢谢!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SQLServer\351\251\261\345\212\250\347\274\272\345\244\261\351\227\256\351\242\230/index.html" "b/SQLServer\351\251\261\345\212\250\347\274\272\345\244\261\351\227\256\351\242\230/index.html" index e69de29bb2..3e3c5f61f7 100644 --- "a/SQLServer\351\251\261\345\212\250\347\274\272\345\244\261\351\227\256\351\242\230/index.html" +++ "b/SQLServer\351\251\261\345\212\250\347\274\272\345\244\261\351\227\256\351\242\230/index.html" @@ -0,0 +1,621 @@ + + + + + + + + + + + + Navicat Premium连接SQLServer驱动缺失问题 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

报错:[navicat premium] [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

+

进入 Navicat 的安装目录,找到下边的文件,点击安装,重新打开数据库即可.(这个双击可能会提示需要先安装另外一个文件,访问提示框中出现的网址下载文件安装即可)

+

image-20231123135502720

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SSL\350\257\201\344\271\246\347\273\255\346\234\237/index.html" "b/SSL\350\257\201\344\271\246\347\273\255\346\234\237/index.html" index e69de29bb2..4ab928f993 100644 --- "a/SSL\350\257\201\344\271\246\347\273\255\346\234\237/index.html" +++ "b/SSL\350\257\201\344\271\246\347\273\255\346\234\237/index.html" @@ -0,0 +1,698 @@ + + + + + + + + + + + + ssl证书续期 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ ssl证书续期 +

ssl证书续期

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

**注意: ** acme.sh默认自带续期功能,前提是不要自己调整证书路径!

+

免费证书都是3个月到期,需要手动续期,所以写了一个监控加自动续期的服务,有兴趣的可以试一试

+
import ssl
+import socket
+import requests
+import schedule
+import time
+from datetime import datetime
+import subprocess
+
+# Telegram Bot设置
+TELEGRAM_TOKEN = ''
+TELEGRAM_CHAT_ID = ''
+
+# 储存域名列表
+domains = [
+    'tool.wangwangit.com'
+]
+
+def send_telegram_message(message):
+    url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
+    data = {
+        "chat_id": TELEGRAM_CHAT_ID,
+        "text": message
+    }
+    requests.post(url, data=data)
+
+def get_ssl_expiry_date_from_shell(hostname, port=443):
+    cmd = f"echo | openssl s_client -servername {hostname} -connect \"{hostname}:{port}\" 2>/dev/null | openssl x509 -noout -dates"
+    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    out, err = process.communicate()
+    if process.returncode != 0:
+        return f"Error executing command: {err.decode().strip()}"
+    return out.decode().strip()
+
+def renew_ssl(domain):
+    subprocess.run(['nginx', '-s', 'stop'])
+    time.sleep(10)  # 等待nginx停止
+    subprocess.run(['acme.sh', '--issue', '-d', domain, '--standalone', '--force'])
+    time.sleep(30)  # 等待证书申请
+    subprocess.run(['nginx'])
+    subprocess.run(['nginx', '-s', 'reload'])
+    time.sleep(10)  # 等待nginx重启
+
+def format_expiry_date(date_str):
+    try:
+        # 提取日期字符串并转换为datetime对象
+        expiry_date = datetime.strptime(date_str, '%b %d %H:%M:%S %Y %Z')
+        # 返回格式化的日期字符串
+        return expiry_date.strftime('%Y-%m-%d %H:%M:%S')
+    except ValueError:
+        return date_str  # 返回原始字符串,如果格式不匹配
+
+def check_all_domains():
+    messages = []
+    for domain in domains:
+        ssl_dates = get_ssl_expiry_date_from_shell(domain)
+        expiry_date_line = ssl_dates.split('\n')[1] if 'notAfter' in ssl_dates else ssl_dates
+        expiry_date = expiry_date_line.split('=')[1] if 'notAfter' in expiry_date_line else "Unknown"
+        formatted_date = format_expiry_date(expiry_date)
+        if "Error" in ssl_dates or "Unknown" in expiry_date:
+            message = f"{domain} SSL证书检查失败:{formatted_date},请手动检查。"
+            messages.append(message)
+        else:
+            message = f"{domain} SSL证书状态正常,有效期至 {formatted_date}。"
+            messages.append(message)
+
+    # 将所有消息发送到Telegram
+    send_telegram_message("\n".join(messages))
+
+# 设置定时任务
+schedule.every().day.at("10:00").do(check_all_domains)
+
+# 运行定时任务
+while True:
+    schedule.run_pending()
+    time.sleep(1)
+
+

运行情况如下:

+

image-20240119140857042

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Slack\346\217\222\344\273\266\346\216\250\350\215\220/index.html" "b/Slack\346\217\222\344\273\266\346\216\250\350\215\220/index.html" index e69de29bb2..4f0e0c5f9d 100644 --- "a/Slack\346\217\222\344\273\266\346\216\250\350\215\220/index.html" +++ "b/Slack\346\217\222\344\273\266\346\216\250\350\215\220/index.html" @@ -0,0 +1,642 @@ + + + + + + + + + + + + Slack插件推荐 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Slack插件推荐 +

Slack插件推荐

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + + + + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringBoot\344\270\200/index.html" "b/SpringBoot\344\270\200/index.html" index e69de29bb2..6a088bd4ed 100644 --- "a/SpringBoot\344\270\200/index.html" +++ "b/SpringBoot\344\270\200/index.html" @@ -0,0 +1,994 @@ + + + + + + + + + + + + SpringBoot源码剖析 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

SpringBootܻ原理深入及源码剖析

依赖管理

问题一:为什么某些Maven依赖不需要指定版本号?

因为spring-boot-starter-parent中已经定义了常用依赖匹配的版本号.

+

按住Ctrl,点击spring-boot-starter-parent的版本号

+

image-20221013155539028

+

可见pom文件中的parent是spring-boot-dependencies,然后再次按住Ctrl,点击版本号

+

image-20221013155647320

+

我们会发现这个pom中维护了一大堆依赖的版本号

+

image-20221013155755730

+

问题二:Springboot是如何引入这些jar包的

在我们做web项目时,除了上面的parent外,还会引入spring-boot-starter-web,而在这个依赖中,则定义了web项目需要的jar依赖.

+

image-20221013160305222

+

依据不同的使用场景,spring官方也提供了不同的starter封装

+

image-20221013160428204

+

问题三:Springboot是如何进行自动配置的

我们进入查看启动类上的SpringBootApplication注解

+
@Target({ElementType.TYPE}) // 注解适用范围,Type表示注解可以描述类,接口,注解或枚举类
+@Retention(RetentionPolicy.RUNTIME) // 表示注解的生命周期,Runtime运行时
+@Documented // 表示注解可以记录在javadoc中
+@Inherited // 表示可以被子类继承该注解
+@SpringBootConfiguration // 表明该类为配置类
+@EnableAutoConfiguration // 启动自动配置功能
+@ComponentScan( // 包扫描器
+    excludeFilters = {@Filter(
+    type = FilterType.CUSTOM,
+    classes = {TypeExcludeFilter.class}
+), @Filter(
+    type = FilterType.CUSTOM,
+    classes = {AutoConfigurationExcludeFilter.class}
+)}
+)
+public @interface SpringBootApplication {
+}
+
+
1.@SpringBootConfiguration

声明当前类为配置类

+

+
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Configuration
+public @interface SpringBootConfiguration {
+    @AliasFor(
+        annotation = Configuration.class
+    )
+    boolean proxyBeanMethods() default true;
+}
+
+
2.@EnableAutoConfiguration

表示开启自动配置功能,也是实现自动化配置的注解

+
@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@AutoConfigurationPackage // 自动配置包
+@Import({AutoConfigurationImportSelector.class}) // 自动配置类扫描导入
+public @interface EnableAutoConfiguration {
+    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
+
+    Class<?>[] exclude() default {};
+
+    String[] excludeName() default {};
+}
+
+
    +
  • @AutoConfigurationPackage
  • +
+
@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import({AutoConfigurationPackages.Registrar.class}) //导入Registrar中注册的组件
+public @interface AutoConfigurationPackage {
+    String[] basePackages() default {};
+
+    Class<?>[] basePackageClasses() default {};
+}
+
+

我们继续查看Registrar中的实现

+
    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
+        Registrar() {
+        }
+
+        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
+            AutoConfigurationPackages.register(registry, (String[])(new PackageImports(metadata)).getPackageNames().toArray(new String[0]));
+        }
+
+        public Set<Object> determineImports(AnnotationMetadata metadata) {
+            return Collections.singleton(new PackageImports(metadata));
+        }
+    }
+
+

可以发现其中有一个registerBeanDefinitions方法,就是将主程序类所在包及所有子包下的组件扫描的Spring容器中

+
    +
  • @Import({AutoConfigurationImportSelector.class})
  • +
+

将AutoConfigurationImportSelector类导入到容器中,这个类可以将所有符合条件的@Configuration注解类配置加载到Spring的IOC容器中.

+
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
+        if (!this.isEnabled(annotationMetadata)) {
+            return NO_IMPORTS;
+        } else {
+            AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
+            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
+        }
+    }
+
+

深入loadMetadata方法

+
 static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
+         // 需要加载的配置类的类路径
+        return loadMetadata(classLoader, "META-INF/spring-autoconfigure-metadata.properties");
+    }
+
+    static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
+        try {
+            // 读取spring-autoconfigure-metadata.properties信息生成的url
+            Enumeration<URL> urls = classLoader != null ? classLoader.getResources(path) : ClassLoader.getSystemResources(path);
+            Properties properties = new Properties();
+
+            // 解析urls枚举对象中的信息,封装成properties对象并加载
+            while(urls.hasMoreElements()) {
+                properties.putAll(PropertiesLoaderUtils.loadProperties(new UrlResource((URL)urls.nextElement())));
+            }
+            // 根据封装好的properties对象生成AutoConfigurationMetada对象
+            return loadMetadata(properties);
+        } catch (IOException var4) {
+            throw new IllegalArgumentException("Unable to load @ConditionalOnClass location [" + path + "]", var4);
+        }
+    }
+
+

深入getCandidateConfigurations方法

+
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
+        /**
+        * getSpringFactoriesLoaderFactoryClass 返回EnableAutoConfiguration.class
+        * getBeanClassLoader 返回beanClassLoader
+        */
+        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
+        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
+        return configurations;
+    }
+
+    protected Class<?> getSpringFactoriesLoaderFactoryClass() {
+        return EnableAutoConfiguration.class;
+    }
+
+    protected ClassLoader getBeanClassLoader() {
+        return this.beanClassLoader;
+    }
+
+

继续点开loadFactoryNames方法

+
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
+        String factoryClassName = factoryClass.getName();
+        return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
+    }
+
+    private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
+        MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
+        if (result != null) {
+            return result;
+        } else {
+            try {
+                // 如果类加载器不为空,则加载spring.factories文件,封装其中Configuration文件为Enumeration
+                Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
+                MultiValueMap<String, String> result = new LinkedMultiValueMap();
+                // 循环Enumeration对象,封装为Properties对象
+                while(urls.hasMoreElements()) {
+                    URL url = (URL)urls.nextElement();
+                    UrlResource resource = new UrlResource(url);
+                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
+                    Iterator var6 = properties.entrySet().iterator();
+
+                    while(var6.hasNext()) {
+                        Map.Entry<?, ?> entry = (Map.Entry)var6.next();
+                        String factoryClassName = ((String)entry.getKey()).trim();
+                        String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
+                        int var10 = var9.length;
+
+                        for(int var11 = 0; var11 < var10; ++var11) {
+                            String factoryName = var9[var11];
+                            result.add(factoryClassName, factoryName.trim());
+                        }
+                    }
+                }
+
+                cache.put(classLoader, result);
+                return result;
+            } catch (IOException var13) {
+                throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
+            }
+        }
+    }
+
+

实际上,加载的就是这个路径下的配置文件

+

image-20221013164539737

+

以web项目为例,在项目中加入了Web环境依赖启动器,对应的WebMvcAutoConfiguration就会生效,打开这个配置类,就会发现该类通过全注解的方式对Spring所需环境进行了默认配置.

+

总结

+

springboot底层自动配置的步骤是:

+

1.springboot应用启动

+

2.@SpringBootApplication起作用

+

3.@EnableAutoConfiguration

+

4.@AutoConfigurationPackage:扫描加载启动类同级及子级目录下的配置类

+

5.@Import(AutoConfigurationImportSelector.class):加载classpath上jar中的META-INF/spring.factories文件中指定的配置类

+
3.@ComponentScan

扫描启动类下面的bean对象

+
总结
|- @SpringBootConfiguration
+ |- @Configuration //通过javaConfig的方式添加组件到IOC容器中
+|- @EnableAutoConfiguration
+ |- @AutoConfigurationPackage //自动配置包,与@ComponmentScan扫描到的添加到IOC中
+ |- @Import(AutoConfigurationImportSelector.class) // 扫描META-INF/spring.factories中指定的bean到IOC容器中
+|- @ComponentScan //包扫描
+
+

自定义Starter

1.引入自动配置依赖

<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-autoconfigure</artifactId>
+    <version>2.2.2.RELEASE</version>
+</dependency>
+
+

2.定义JavaBean

@EnableConfigurationProperties(SimpleBean.class)
+@ConfigurationProperties(prefix = "simple")
+@Data
+public class SimpleBean {
+
+    private int id;
+
+    private String name;
+
+}
+
+

3.编写配置类

@Configuration
+public class MyAutoConfiguration {
+
+    static {
+        System.out.println("MyAutoConfiguration init....");
+    }
+
+    @Bean
+    public SimpleBean simpleBean() {
+        return new SimpleBean();
+    }
+
+}
+
+

4.配置启动类加载路径

在resources下创建/META-INF/spring.factories文件,指定配置类全路径

+

image-20221014135815091

+

5.测试starter

在测试包中引入自定义starter

+
        <dependency>
+            <groupId>org.example</groupId>
+            <artifactId>my-spring-boot-starter</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+

在配置文件application.properties中加入前缀配置

+
simple.id=1
+simple.name=test
+
+

编写测试方法

+
    @Autowired
+    private SimpleBean simpleBean;
+
+    @Test
+    public void testStarter(){
+        System.out.println(simpleBean);
+    }
+
+

执行原理

我们从启动类开始断点查看程序执行步骤,首先是调用了SpringApplication的run方法.

+

在run方法中,主要做了两个操作,一个是SpringApplication的初始化,以及调用run()启动项目

+
(new SpringApplication(primarySources)).run(args);
+
+

1.SpringApplication初始化

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
+    this.sources = new LinkedHashSet();
+    this.bannerMode = Mode.CONSOLE;
+    this.logStartupInfo = true;
+    this.addCommandLineProperties = true;
+    this.addConversionService = true;
+    this.headless = true;
+    this.registerShutdownHook = true;
+    this.additionalProfiles = new HashSet();
+    this.isCustomEnvironment = false;
+    this.lazyInitialization = false;
+    this.resourceLoader = resourceLoader;
+    Assert.notNull(primarySources, "PrimarySources must not be null");
+    //把项目启动类.class设置为属性存储起来
+    this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
+    //判断当前WebApplicationType类型
+    this.webApplicationType = WebApplicationType.deduceFromClasspath();
+    //设置初始化器,最后会调用这些初始化器
+    this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
+    //设置监听器
+    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
+    //用于推断并设置项目main()方法启动的主程序启动类
+    this.mainApplicationClass = this.deduceMainApplicationClass();
+}
+
+

2.run()方法执行

    public ConfigurableApplicationContext run(String... args) {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        ConfigurableApplicationContext context = null;
+        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
+        this.configureHeadlessProperty();
+        // 1.获取监听器并启动
+        SpringApplicationRunListeners listeners = this.getRunListeners(args);
+        listeners.starting();
+
+        Collection exceptionReporters;
+        try {
+            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
+            // 2.根据SpringApplicationRunListeners以及参数来准备环境
+            ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
+            this.configureIgnoreBeanInfo(environment);
+            // 准备Banner打印器,就是console中输出的艺术字体
+            Banner printedBanner = this.printBanner(environment);
+            // 3.创建Spring容器
+            context = this.createApplicationContext();
+            exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
+            // 4.Spring容器前置处理
+            this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
+            // 5.刷新容器
+            this.refreshContext(context);
+            // 6.容器刷新后置处理
+            this.afterRefresh(context, applicationArguments);
+            stopWatch.stop();
+            if (this.logStartupInfo) {
+                (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
+            }
+            // 7.发出结束执行的事件
+            listeners.started(context);
+            // 返回容器
+            this.callRunners(context, applicationArguments);
+        } catch (Throwable var10) {
+            this.handleRunFailure(context, var10, exceptionReporters, listeners);
+            throw new IllegalStateException(var10);
+        }
+
+        try {
+            listeners.running(context);
+            return context;
+        } catch (Throwable var9) {
+            this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
+            throw new IllegalStateException(var9);
+        }
+    }
+
+

image-20221014143737733

+

Springboot缓存管理

默认缓存

1.启动类使用@EnableCaching注解

+
@SpringBootApplication
+@EnableCaching // 开启SpringBoot基于注解的缓存管理支持
+public class Springboot01DemoApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Springboot01DemoApplication.class, args);
+    }
+
+}
+
+

2.查询方法添加@Cacheable注解配置缓存

+
// 根据id查询实体类
+@Cacheable(cacheNames = "a")
+public A findById(String id){
+    A a = dao.findById(id)
+    return a;    
+}
+
+

springboot默认使用的是SimpleCacheConfiguration配置类,用CurrentMap当作底层数据结构进行数据缓存

+

整合Redis进行缓存

1.添加Spring Data Redis依赖启动器
        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+

当我们加入此依赖后,Springboot会使用RedisCacheConfiguration当作生效的自动配置类,容器使用的缓存管理器是RedisCacheManager类,创建的Cache是RedisCache

+
2.添加redis连接配置
spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.password=
+
+
3.将缓存对象进行序列化

对缓存的实体类实现Serializable,添加序列化ID

+
4.使用上面同样的注解,即可实现基于Redis的缓存
+
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Eureka\346\234\215\345\212\241\346\263\250\345\206\214\344\270\255\345\277\203/index.html" "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Eureka\346\234\215\345\212\241\346\263\250\345\206\214\344\270\255\345\277\203/index.html" index e69de29bb2..c4143f7b64 100644 --- "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Eureka\346\234\215\345\212\241\346\263\250\345\206\214\344\270\255\345\277\203/index.html" +++ "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Eureka\346\234\215\345\212\241\346\263\250\345\206\214\344\270\255\345\277\203/index.html" @@ -0,0 +1,1032 @@ + + + + + + + + + + + + SpringCloud的前世今生ᅳEureka服务注册中心 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

注册中心原理

image-20230219145829240

+

分布式微服务架构中,服务注册中⼼⽤于存储服务提供者地址信息、服务发布相关 的属性信息,消费者通过主动查询和被动通知的⽅式获取服务提供者的地址信息, ⽽不再需要通过硬编码⽅式得到提供者的地址信息。消费者只需要知道当前系统发 布了那些服务,⽽不需要知道服务具体存在于什么位置,这就是透明化路由。

+
    +
  • pull模式: 服务消费者可以主动拉取可用的服务提供者清单

    +
  • +
  • push模式: 服务消费者订阅服务,当服务提供者有变化时,注册中心也会主动推送更新后的服务清单给消费者

    +
  • +
  • 注册中心需要完成对服务提供者的健康监控,当发现服务提供者失效时需要及时剔除

    +
  • +
+

主流服务中心对比

    +
  • Zookeeper
  • +
+

​ Zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主 要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。

+

​ Zookeeper本质=存储+监听通知,主要是通过znode监听实现服务注册的,只要服务节点发生变动,就会通知到监听端,另外,Zookeeper有选举机制,保证了可用性,只要有一半以上的选举节点存活即可.

+
    +
  • Eureka
  • +
+

​ 由Netflix开源,并被Pivatal集成到SpringCloud体系中,它是基于 RestfulAPI ⻛格开发的服务注册与发现组件

+
    +
  • Consul
  • +
+

​ Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务 发布和注册服务软件, 采⽤Raft算法保证服务的⼀致性,且⽀持健康检查

+
    +
  • Nacos
  • +
+

​ Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平 台。简单来说 Nacos 就是 注册中⼼ + 配置中⼼的组合,帮助我们解决微服务开 发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。Nacos 是 Spring Cloud Alibaba 核⼼组件之⼀,负责服务注册与发现,还有配置。

+

image-20230219150655582

+

P:分区容错性(⼀定的要满⾜的)

+

C:数据⼀致性

+

A:⾼可⽤

+

CAP不可能同时满⾜三个,要么是AP,要么是CP

+

Eureka组件

基础架构

image-20230219150904416

+

交互流程

这个是官方的一个描述图

+

image-20230219151004848

+
    +
  • 从图中可以看出,Eureka Server支持集群同步,异地同步.高可用性
  • +
  • 微服务会定期向Eureka Server发送心跳,进行存活续约
  • +
  • Eureka Server同时也是Eureka Client,多个Eureka Server通过复制的方式完成服务注册列表同步
  • +
  • Eureka Client会缓存Eureka Server中的信息,即使所有Eureka Server节点宕机,服务消费者依然可以使用缓存查找到服务提供者
  • +
+

Eureka源码剖析

1.Eureka Server启动过程

SpringBoot启动时,会加载EurekaServerAutoConfiguration配置类

+

image-20230219152926084

+
    +
  • EurekaServerAutoConfiguration类
  • +
+

image-20230219153111389

+
    +
  1. 只有添加了@EnableEurekaServer注解,才会引入EurekaServerMarkerConfiguration类
  2. +
+

image-20230219153412783

+

image-20230219153442058

+
    +
  1. EurekaServerAutoConfiguration做了哪些事
  2. +
+

image-20230219153833349

+

针对PeerEurekaNodes是如何实现节点更新的呢?可以查看类中的start方法

+

image-20230219154124895

+

上面的updatePeerEurekaNodes是什么时候执行的呢?

+

image-20230219154217808

+

可以看到在构建DefaultEurekaServerContext对象时,会执行start方法

+

image-20230219154315496

+

在配置类中,我们还需要关注如下两个bea:

+

image-20230219154414391

+
    +
  1. EurekaServerInitializerConfiguration做了哪些事?
  2. +
+

image-20230219154513593

+

查看contextInitialized中都初始化了哪些内容?

+

image-20230219154600102

+

继续查看initEurekaServerContext中都做了啥?

+

image-20230219154703520

+

查看syncUp方法中,如何实现的注册信息同步?

+

image-20230219154819412

+

再看一看同步过来的信息是如何注册到EurekaServer中的

+

image-20230219154926051

+

我们再看一下如何实现的服务剔除

+

com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#openForTraffic

+

image-20230219155149289

+

进入postInit方法查看

+

image-20230219155207263

+

2.Eureka服务接口暴露策略

在第一步中,我们看到自动配置类中注册了jerseyFilterRegistration

+

image-20230219155413455

+

注入Jersey的细节

+

image-20230219155556689

+

具体要扫描那些包呢?

+

image-20230219155725305

+

查看这些包下包含哪些接口服务

+

image-20230219155745185

+

这些就是使⽤Jersey发布的供Eureka Client调⽤的Restful⻛格服务接⼝(完成服务 注册、⼼跳续约等接⼝

+

3.Eureka Server服务注册接口(接受客户端注册服务)

查看ApplicationResource类的addInstance()⽅法中代码

+

image-20230219155916706

+

点击register方法:注册服务信息并且同步到其他Eureka节点,查看实现

+

image-20230219155949756

+

点击super.register方法:实例信息存储到注册表是一个ConcurrentHashMap.查看实现

+
/**
+* Registers a new instance with a given duration.
+*
+* @see
+com.netflix.eureka.lease.LeaseManager#register(java.lang.Object,
+int, boolean)
+*/
+public void register(InstanceInfo registrant, int leaseDuration,
+boolean isReplication) {
+ try {
+ read.lock(); //读锁
+ 
+ // registry是保存所有应⽤实例信息的Map:
+ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>
+ // 从registry中获取当前appName的所有实例信息
+Map<String, Lease<InstanceInfo>> gMap =
+registry.get(registrant.getAppName());
+ 
+ REGISTER.increment(isReplication); //注册统计+1
+ 
+ // 如果当前appName实例信息为空,新建Map
+ if (gMap == null) {
+ final ConcurrentHashMap<String, Lease<InstanceInfo>>
+gNewMap = new ConcurrentHashMap<String, Lease<InstanceInfo>>();
+ gMap = registry.putIfAbsent(registrant.getAppName(),
+gNewMap);
+ if (gMap == null) {
+ gMap = gNewMap;
+ }
+ }
+ 
+ // 获取实例的Lease租约信息
+ Lease<InstanceInfo> existingLease =
+gMap.get(registrant.getId());
+ // Retain the last dirty timestamp without overwriting it,
+if there is already a lease
+ // 如果已经有租约,则保留最后⼀个脏时间戳⽽不覆盖它
+ // (⽐较当前请求实例租约 和 已有租约 的LastDirtyTimestamp,选择靠
+后的)
+ if (existingLease != null && (existingLease.getHolder() !=
+null)) {
+ Long existingLastDirtyTimestamp =
+existingLease.getHolder().getLastDirtyTimestamp();
+ Long registrationLastDirtyTimestamp =
+registrant.getLastDirtyTimestamp();
+ logger.debug("Existing lease found (existing={},
+provided={}", existingLastDirtyTimestamp,
+registrationLastDirtyTimestamp);
+ if (existingLastDirtyTimestamp >
+registrationLastDirtyTimestamp) {
+ logger.warn("There is an existing lease and the
+existing lease's dirty timestamp {} is greater" +
+ " than the one that is being registered
+{}", existingLastDirtyTimestamp, registrationLastDirtyTimestamp);
+ logger.warn("Using the existing instanceInfo
+instead of the new instanceInfo as the registrant");
+ registrant = existingLease.getHolder();
+}
+ }
+ else {
+ // The lease does not exist and hence it is a new
+registration
+ // 如果之前不存在实例的租约,说明是新实例注册
+ // expectedNumberOfRenewsPerMin期待的每分钟续约数+2(因为
+30s⼀个)
+ // 并更新numberOfRenewsPerMinThreshold每分钟续约阀值(85%)
+ synchronized (lock) {
+ if (this.expectedNumberOfRenewsPerMin > 0) {
+ // Since the client wants to cancel it, reduce
+the threshold
+ // (1
+ // for 30 seconds, 2 for a minute)
+ this.expectedNumberOfRenewsPerMin =
+this.expectedNumberOfRenewsPerMin + 2;
+ this.numberOfRenewsPerMinThreshold =
+ (int)
+(this.expectedNumberOfRenewsPerMin *
+serverConfig.getRenewalPercentThreshold());
+ }
+ }
+ logger.debug("No previous lease information found; it
+is new registration");
+ }
+ 
+ Lease<InstanceInfo> lease = new Lease<InstanceInfo>
+(registrant, leaseDuration);
+ if (existingLease != null) {
+ 
+lease.setServiceUpTimestamp(existingLease.getServiceUpTimestamp())
+;
+ }
+ gMap.put(registrant.getId(), lease); //当前实例信息放到维护注册
+信息的Map
+ 
+ // 同步维护最近注册队列
+ synchronized (recentRegisteredQueue) {
+ recentRegisteredQueue.add(new Pair<Long, String>(
+ System.currentTimeMillis(),
+registrant.getAppName() + "(" +
+registrant.getId() + ")"));
+ }
+ 
+ // This is where the initial state transfer of overridden
+status happens
+ // 如果当前实例已经维护了OverriddenStatus,将其也放到此Eureka
+Server的overriddenInstanceStatusMap中
+ if
+(!InstanceStatus.UNKNOWN.equals(registrant.getOverriddenStatus()))
+{
+ logger.debug("Found overridden status {} for instance
+{}. Checking to see if needs to be add to the "
+ + "overrides",
+registrant.getOverriddenStatus(), registrant.getId());
+ if
+(!overriddenInstanceStatusMap.containsKey(registrant.getId())) {
+ logger.info("Not found overridden id {} and hence
+adding it", registrant.getId());
+ overriddenInstanceStatusMap.put(registrant.getId(),
+registrant.getOverriddenStatus());
+ }
+ }
+ InstanceStatus overriddenStatusFromMap =
+overriddenInstanceStatusMap.get(registrant.getId());
+ if (overriddenStatusFromMap != null) {
+ logger.info("Storing overridden status {} from map",
+overriddenStatusFromMap);
+ 
+registrant.setOverriddenStatus(overriddenStatusFromMap);
+ }
+ // Set the status based on the overridden status rules
+ // 根据overridden status规则,设置状态
+ InstanceStatus overriddenInstanceStatus
+ = getOverriddenInstanceStatus(registrant,
+existingLease, isReplication);
+ registrant.setStatusWithoutDirty(overriddenInstanceStatus);
+ // If the lease is registered with UP status, set lease
+service up timestamp
+ // 如果租约以UP状态注册,设置租赁服务时间戳
+if (InstanceStatus.UP.equals(registrant.getStatus())) {
+ lease.serviceUp();
+ }
+ 
+ registrant.setActionType(ActionType.ADDED); //ActionType为
+ADD
+ recentlyChangedQueue.add(new RecentlyChangedItem(lease));
+//维护recentlyChangedQueue
+ registrant.setLastUpdatedTimestamp(); //更新最后更新时间
+ 
+ // 使当前应⽤的ResponseCache失效
+ invalidateCache(registrant.getAppName(),
+registrant.getVIPAddress(), registrant.getSecureVipAddress());
+ logger.info("Registered instance {}/{} with status {}
+(replication={})",
+ registrant.getAppName(), registrant.getId(),
+registrant.getStatus(), isReplication);
+ } finally {
+ read.unlock(); //读锁
+ }
+}
+
+

我们再看一下如何复制的对等节点,PeerAwareInstanceRegistryImpl#replicateToPeers() :复制到Eureka对等节点

+
private void replicateToPeers(Action action, String appName, String
+id,
+ InstanceInfo info /* optional */,
+ InstanceStatus newStatus /* optional
+*/, boolean isReplication) {
+ Stopwatch tracer = action.getTimer().start();
+ try {
+ // 如果是复制操作(针对当前节点,false)
+ if (isReplication) {
+ numberOfReplicationsLastMin.increment();
+ }
+ // 如果它已经是复制,请不要再次复制,直接return
+ if (peerEurekaNodes == Collections.EMPTY_LIST ||
+isReplication) {
+ return;
+ }
+ // 遍历集群所有节点(除当前节点外)
+     for (final PeerEurekaNode node :
+peerEurekaNodes.getPeerEurekaNodes()) {
+ // If the url represents this host, do not replicate to
+yourself.
+ if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl()))
+{
+ continue;
+ }
+ // 复制Instance实例操作到某个node节点
+ replicateInstanceActionsToPeers(action, appName, id,
+info, newStatus, node);
+ }
+ }
+ finally {
+ tracer.stop();
+ }
+}
+
+

查看PeerAwareInstanceRegistryImpl#replicateInstanceActionsToPeers的具体实现

+

image-20230219160459321

+

4.Eureka Server服务续约接口(接受客户端续约)

InstanceResource的renewLease⽅法中完成客户端的⼼跳(续约)处理,关键代码:registry.renew(app.getName(), id, isFromReplicaNode)

+

image-20230219160617705

+

image-20230219160626025

+

image-20230219160632274

+

replicateInstanceActionsToPeers() 复制Instance实例操作到其它节点

+
private void replicateInstanceActionsToPeers(Action action, String
+appName,
+ String id,
+InstanceInfo info, InstanceStatus newStatus,
+ PeerEurekaNode node) {
+ try {
+ InstanceInfo infoFromRegistry = null;
+ CurrentRequestVersion.set(Version.V2);
+ switch (action) {
+case Cancel: //取消
+ node.cancel(appName, id);
+ break;
+ case Heartbeat: //⼼跳
+ InstanceStatus overriddenStatus =
+overriddenInstanceStatusMap.get(id);
+ infoFromRegistry = getInstanceByAppAndId(appName,
+id, false);
+ node.heartbeat(appName, id, infoFromRegistry,
+overriddenStatus, false);
+ break;
+ case Register: //注册
+ node.register(info);
+ break;
+ case StatusUpdate: //状态更新
+ infoFromRegistry = getInstanceByAppAndId(appName,
+id, false);
+ node.statusUpdate(appName, id, newStatus,
+infoFromRegistry);
+ break;
+ case DeleteStatusOverride: //删除OverrideStatus
+ infoFromRegistry = getInstanceByAppAndId(appName,
+id, false);
+ node.deleteStatusOverride(appName, id,
+infoFromRegistry);
+ break;
+ }
+ } catch (Throwable t) {
+ logger.error("Cannot replicate information to {} for action
+{}", node.getServiceUrl(), action.name(), t);
+ }
+}
+
+

5.Eureka Client注册服务

SpringBoot启动时,会加载EurekaClientAutoConfiguration配置类

+

image-20230219160906757

+

分析EurekaClientAutoConfiguration类的注解

+

image-20230219160938819

+

image-20230219160945740

+

1.读取配置文件

+

image-20230219161022219

+

2.启动时从EurekaServer获取服务实例信息

+

image-20230219161035803

+

观察父类DiscoveryClient()

+

image-20230219161111648

+

image-20230219161122044

+

3.注册自己到EurekaServer中

+

image-20230219161140157

+

image-20230219161159258

+

4.开启一些定时任务(心跳,刷新缓存)

+

刷新缓存

+

image-20230219161221754

+

image-20230219161230730

+

image-20230219161241016

+

心跳续约

+

image-20230219161253230

+

image-20230219161309324

+

6. Eureka Client下架服务

查看com.netflix.discovery.DiscoveryClient#shutdown

+

image-20230219161523458

+

image-20230219161538743

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Ribbon\350\264\237\350\275\275\345\235\207\350\241\241/index.html" "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Ribbon\350\264\237\350\275\275\345\235\207\350\241\241/index.html" index e69de29bb2..d6de55889b 100644 --- "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Ribbon\350\264\237\350\275\275\345\235\207\350\241\241/index.html" +++ "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263Ribbon\350\264\237\350\275\275\345\235\207\350\241\241/index.html" @@ -0,0 +1,830 @@ + + + + + + + + + + + + SpringCloud的前世今生ᅳRibbon负载均衡 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

负载均衡

    +
  • 服务端负载均衡
  • +
  • 客户端负载均衡
  • +
+

image-20230223155346139

+

Ribbon

使用方式

@Bean
+// Ribbon负载均衡
+@LoadBalanced
+public RestTemplate getRestTemplate() {
+    return new RestTemplate();
+}
+
+

负载均衡策略

Ribbon内置多种负载均衡策略,最顶级接口为:com.netflix.loadbalancer.IRule

+

image-20230223155937513

+

修改负载均衡策略

+
#针对的被调⽤⽅微服务名称,不加就是全局⽣效
+lagou-service-resume:
+    ribbon:
+        NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule #负载策略调整
+
+

工作原理

image-20230223160346405

+

image-20230223160646023

+

图中核心是负载均衡管理器LoadBalancer

+
    +
  • IRule: 选择实例的时候的负载均衡策略对象
  • +
  • IPing: 用来向服务发起心跳检测的,通过心跳检测来判断服务时候可用
  • +
  • ServerListFilter: 根据一些规则过滤传入的服务实例列表
  • +
  • ServerListUpdater: 定义了一系列的对服务列表的更新操作
  • +
+

源码剖析

上面我们提到了使用Ribbon只需要添加一个**@LoadBalanced**注解,那么这个注解是如何实现的呢?

+

image-20230223162536533

+

可以看到注释中,提到了LoadBalancerClient这个类,作用是客户端负载均衡

+

image-20230223162730059

+

接下来我们在看看Ribbon的配置是如何生效的,依旧是根据SpringBoot的自动装配特点,可以查看加载的Configuration类

+

image-20230223163316832

+

image-20230223163509659

+

1.LoadBalancerAutoConfiguration

image-20230223163623138

+

第一处: 注入restTemplate对象到集合待用

+

image-20230223163708361

+

第二处:注入restTemplate定制器

+

image-20230223163843889

+

第三处:使⽤定制器给集合中的每⼀个restTemplate对象添加⼀个拦截器

+

image-20230223164020026

+

通过这三处,我们可以发现添加了注解的RestTemplate对象会被添加⼀个拦截器LoadBalancerInterceptor,该拦截器就是后续拦截请求进⾏负载处理的。

+

查看LoadBalancerInterceptor中的intercept方法

+

image-20230223164329862

+

可以发现最终是交给了LoadBalancerClient进行负载均衡处理,而这个对象在RibbonAutoConfiguration中进行了实例化

+

image-20230223164630783

+

我们继续看关键的方法loadBalancer.execute如何实现的

+

image-20230223164827153

+

image-20230223165251272

+

我们发现代码中通过getLoadBalancer获取了均衡器对象,那么这个是什么时候注入的了?

+

可以查看最初的主配置类RibbonAutoConfiguration

+

image-20230223165116818

+

image-20230223165128923

+

点开RibbonClientConfiguration,会发现它创建了我们上文说的ribbonRule,ribbonPing

+

image-20230223165552315

+

image-20230223165858203

+

我们再回到RibbonLoadBalancerClient的execute方法.查看getServer如何实现的

+

image-20230223170123337

+

根据上文的阅读,我们可以知道,默认创建的RibbonLoadBalancerClient对象是ZoneAwareLoadBalancer,查看其chooseServer实现

+

image-20230223170324889

+

image-20230223170403673

+

来到区域隔离策略的⽗类choose⽅法中com.netflix.loadbalancer.PredicateBasedRule#choose

+

image-20230223170520157

+

image-20230223170532390

+

image-20230223170546811

+

我们再次退回到RibbonLoadBalancerClient的execute方法

+

image-20230223171236639

+

查看LoadBalancerRequestFactory的createRequest方法

+

image-20230223171559615

+

继续查看AbstractClientHttpRequest#execute的代码

+

image-20230223171659969

+

接下来,我们看下chooseServer中的serverList是如何来的

+

回到RibbonClientConfiguration

+

image-20230223172138368

+

image-20230223172152208

+

image-20230223172231639

+

image-20230223172236549

+

image-20230223172255278

+

image-20230223172309731

+

继续查看enableAndInitLearnNewServersFeature方法

+

image-20230223172407436

+

image-20230223172459786

+

2.RoundRobinRule轮询策略源码剖析

// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+package com.netflix.loadbalancer;
+import com.netflix.client.config.IClientConfig;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+    public class RoundRobinRule extends AbstractLoadBalancerRule {
+        private AtomicInteger nextServerCyclicCounter;
+        private static final boolean AVAILABLE_ONLY_SERVERS = true;
+        private static final boolean ALL_SERVERS = false;
+        private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);
+
+        public RoundRobinRule() {
+            this.nextServerCyclicCounter = new AtomicInteger(0);
+        }
+
+        public RoundRobinRule(ILoadBalancer lb) {
+            this();
+            this.setLoadBalancer(lb);
+        }
+
+        // 负载均衡策略类核⼼⽅法
+        public Server choose(ILoadBalancer lb, Object key) {
+            if (lb == null) {
+                log.warn("no load balancer");
+                return null;
+            } else {
+                Server server = null;
+                int count = 0;
+                while (true) {
+                    if (server == null && count++ < 10) {
+                        // 所有可⽤服务实例列表
+                        List<Server> reachableServers = lb.getReachableServers();
+                        // 所有服务实例列表
+                        List<Server> allServers = lb.getAllServers();
+                        int upCount = reachableServers.size();
+                        int serverCount = allServers.size();
+                        if (upCount != 0 && serverCount != 0) {
+                            // 获得⼀个轮询索引
+                            int nextServerIndex = this.incrementAndGetModulo(serverCount);
+                            // 根据索引取出服务实例对象
+                            server = (Server) allServers.get(nextServerIndex);
+                            if (server == null) {
+                                Thread.yield();
+                            } else {
+                                // 判断服务可⽤后返回
+                                if (server.isAlive() && server.isReadyToServe()) {
+                                    return server;
+                                }
+                                server = null;
+                            }
+                            continue;
+                        }
+                        log.warn("No up servers available from load balancer:" + lb); return null;
+                    } if (count >= 10) {
+                        log.warn("No available alive servers after 10 tries from load balancer:" + lb);
+                    } return server;
+                }
+            }
+        }
+
+        private int incrementAndGetModulo(int modulo) {
+            int current;
+            int next;
+            do {
+                // 取出上次的计数
+                current = this.nextServerCyclicCounter.get();
+                // 因为是轮询,计数+1之后对总数取模
+                next = (current + 1) % modulo;
+            } while (!this.nextServerCyclicCounter.compareAndSet(current, next));
+            return next;
+        }
+
+        public Server choose(Object key) {
+            return this.choose(this.getLoadBalancer(), key);
+        }
+
+        public void initWithNiwsConfig(IClientConfig clientConfig) {
+        }
+    }
+
+

3.RandomRule随机策略源码剖析

image-20230223172755630

+

image-20230223172803791

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263\345\276\256\346\234\215\345\212\241\347\232\204\346\235\245\345\216\206/index.html" "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263\345\276\256\346\234\215\345\212\241\347\232\204\346\235\245\345\216\206/index.html" index e69de29bb2..1a36dd6b8b 100644 --- "a/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263\345\276\256\346\234\215\345\212\241\347\232\204\346\235\245\345\216\206/index.html" +++ "b/SpringCloud\347\232\204\345\211\215\344\270\226\344\273\212\347\224\237\341\205\263\345\276\256\346\234\215\345\212\241\347\232\204\346\235\245\345\216\206/index.html" @@ -0,0 +1,714 @@ + + + + + + + + + + + + SpringCloud的前世今生ᅳ微服务的来历 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

微服务的演变史

1.单体应用架构

在项目体量小的时候,所有的功能都放在一个工程中,并且打包部署在一个Tomcat容器中的架构模式就是单体应用架构.

+

image-20230213212353363

+

优点:

+
    +
  • 架构简单,开发节奏快,易于小团队快速迭代
  • +
  • 易于测试部署,只需要通过单元测试和打包单一的jar启动即可
  • +
+

缺点:

+
    +
  • 随着功能扩展,团队扩大,单个项目代码混乱,不适合多人共同维护.
  • +
  • 新增业务难度大,需要了解整个项目的逻辑,并且业务直接耦合度高,容易互相影响
  • +
+

2.垂直应用架构

为了避免单体架构中的问题,便开始对项目进行模块的垂直划分,基于业务特性做分割,实现业务之间的互不影响.

+

image-20230213212857425

+

优点:

+
    +
  • 系统拆分实现流量分担,解决了并发问题
  • +
  • 单个模块直接的更新互不影响,方便水平扩展,负载均衡,容错率高.
  • +
+

缺点:

+
    +
  • 服务之间互相调用,若ip或端口变动,则需要调整配置
  • +
  • 建立集群之后,实现负载均衡比较复杂,机器迁移可能会导致线上故障
  • +
  • 服务之间调用方式不统一,如httpclient,webservice等
  • +
  • 服务监控不到位,如调用成功率,失败率,耗时等
  • +
+

3.SOA应用架构

在使用垂直应用架构之后,随之而来的问题就是服务之间调用的问题,比如接口协议不统一,无法监控到服务状态,服务的负载均衡处理等.

+

这个时候,阿里巴巴开源的Dubbo出现了,一款高性能,轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现.

+

SOA(Service-Oriented Architecture)架构,即面向服务的架构,根据实际业务,将系统拆分成独立的模块,模块之间通过Dubbo,WebService等技术通信.

+

优点:

+
    +
  • 分布式,解耦合,可扩展,可重用
  • +
+

缺点:

+
    +
  • 服务抽取粒度较大,服务调用方和提供方耦合度较高
  • +
+

image-20230213220441735

+

4.微服务应用架构

相比SOA架构,粒度更细致,强调组件化,服务化.以及引入了SpringCloud微服务技术.

+

image-20230213220704771

+

优点:

+
    +
  • 微服务很小,每个服务聚焦于特定业务,方便上手,以及重用组装
  • +
  • 微服务很独立,每个微服务可以使用不同的语言开发,松耦合
  • +
  • 微服务下,我们更容易引入新技术,以及实现DevOps开发运维一体化
  • +
+

缺点:

+
    +
  • 微服务架构下,分布式复杂难以管理,当服务数量增多时,管理更加复杂
  • +
  • 分布式链路跟踪难
  • +
+

同时,微服务也引入了一些新的概念:

+
    +
  • 服务注册与发现: 服务提供者提供服务的信息(服务器ip端口,访问协议等)注册到注册中心,而服务消费者则从注册中心获取到服务进行访问
  • +
+

image-20230213221422573

+
    +
  • 负载均衡: 即将请求分配到多个服务器,数据库等.以此来提高服务的性能,可靠性
  • +
+

image-20230213221508509

+
    +
  • 熔断: 即断路保护,当请求压力过大或者响应变慢失败时,上游服务为了保护系统整体可用性,可以暂时切断对下游服务的调用
  • +
+

image-20230213221614326

+
    +
  • 链路追踪:当一次请求跨越多个服务时,我们只有详细的日志记录,性能监控,才能够在出现问题时进行排查解决.
  • +
+

image-20230213221733695

+
    +
  • API网关: 为客户端调用微服务提供统一的地址,由API网关实现请求统一调用,流量控制,安全防护等功能.
  • +
+

image-20230213221857411

+

SpringCloud核心组件

Spring Cloud是⼀个微服务相关规范,这个规范意图为搭建微服务架构 提供⼀站式服务,采⽤组件(框架)化机制定义⼀系列组件,各类组件针对性的处 理微服务中的特定问题,这些组件共同来构成Spring Cloud微服务技术栈。

+

image-20230219141945960

+

image-20230219143020076

+

微服务架构面临的问题

    +
  • 服务管理:⾃动注册与发现、状态监管
  • +
  • 服务负载均衡
  • +
  • 熔断
  • +
  • 远程过程调⽤
  • +
  • ⽹关拦截、路由转发
  • +
  • 统⼀认证
  • +
  • 集中式配置管理,配置信息实时⾃动更新
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringSecurity\344\270\200/index.html" "b/SpringSecurity\344\270\200/index.html" index e69de29bb2..0d6144868b 100644 --- "a/SpringSecurity\344\270\200/index.html" +++ "b/SpringSecurity\344\270\200/index.html" @@ -0,0 +1,1160 @@ + + + + + + + + + + + + SpringSecurity入门与认证 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

安全框架对比

Shiro

    +
  • 易于理解的 Java Security API;

    +
  • +
  • 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);

    +
  • +
  • 对角色的简单的鉴权(访问控制),支持细粒度的鉴权;

    +
  • +
  • 支持一级缓存,以提升应用程序的性能;

    +
  • +
  • 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境; 异构客户端会话访问;

    +
  • +
  • 非常简单的加密 API;

    +
  • +
  • 不跟任何的框架或者容器捆绑,可以独立运行。

    +
  • +
+

SpringSecurity

    +
  • 拥有Shiro的所有功能
  • +
  • 拥有对Oauth,OpenID的支持
  • +
  • 权限细粒度更高
  • +
+
OpenID是Authentication,是网站对用户进行认证,让网站知道“你是你所声称的URL的属主”,例如使用身份证可以证明自己的身份.
+OAuth是Authorization,其实并不包括认证,只不过“只有认证成功的人才能进行授权”,例如某些网站可以直接使用QQ,微信免注册登录授权.但是这样会授予你QQ,微信的使用权限. 如你要证明房子是自己的,只要出示房产证即可.而若是你给钥匙给别人开门.则授予了别人进入房子的权限.
+
+

SpringSecurity的功能

作用

1.认证:用户登录,解决的是”你是谁”

+

2.授权:判断用户拥有什么权限,可以访问什么资源,解决的是”你能干什么”

+

3.安全防护,防止跨站请求,session攻击等.

+

应用场景

1.传统web开发的项目的登录功能

+

2.用户授权功能

+

3.单一登录,同一时间同一账号只允许在一个地方登录

+

4.cas单点登录,即多个系统只要登录一次,就可以在多个系统中访问

+

5.集成oauth2,做登录授权,可以用于app登录和第三方登录(QQ,微信等)

+

入门案例

创建一个简单的Controller

+
@RestController
+public class HelloSecurityController {
+
+
+    @RequestMapping("/hello")
+    public String hello() {
+        return "Hello Security";
+    }
+
+}
+
+

集成SpringSecurity,启动项目,访问接口,即可访问到SpringSecurity默认提供的页面.

+

image-20221010204832030

+

认证基本原理

SpringSecurity功能的实现主要是由一系列过滤器相互配合完成,也称为过滤器链

+

过滤链

image-20221010205904052

+

默认加载15个过滤器,可以自行增加删除自定义过滤器.

+

1.WebAsyncManagerIntegrationFilter

+
根据请求封装获取WebAsyncManager,从WebAsyncManager获取/注册的安全上下文可调用处理器
+
+

2.SecurityContextPersistenceFilter

+
SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,同时,存储了当前用户认证以及权限信息
+
+

3.HeaderWriterFilter

+
向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制
+
+

4.CsrfFilter

+
csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的
+token信息,如果不包含,则报错。起到防止csrf攻击的效果。
+
+

5.LogoutFilter

+
匹配URL为/logout的请求,实现用户退出,清除认证信息。
+
+

6.UsernamePasswordAuthenticationFilter

+
表单认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。
+
+

7.DefaultLoginPageGeneratingFilter

+
如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面。
+
+

8.DefaultLogoutPageGeneratingFilter

+
由此过滤器可以生产一个默认的退出登录页面
+
+

9.Basicauthenticationfilter

+
此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。
+
+

10.RequestCacheAwareFilter

+
通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存
+HttpServletRequest
+
+

11.SecurityContextHolderAwareRequestFilter

+
针对ServletRequest进行了一次包装,使得request具有更加丰富的API
+
+

12.AnonymousAuthenticationFilter

+
当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到
+SecurityContextHolder中。spring security为了兼容未登录的访问,也走了一套认证流程,
+只不过是一个匿名的身份。
+
+

13.SessionManagementFilter

+
securityContextRepository限制同一用户开启多个会话的数量
+
+

14.ExceptionTranslationFilter

+
异常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异
+常
+
+

15.FilterSecurityInterceptor

+
获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其
+是否有权限。
+
+

认证方式

HttpBasic认证

HttpBasic模式要求传输的用户名密码使用Base64模式进行加密,如果用户名是 “admin” , 密码是“ admin”,则将字符串”admin:admin” 使用Base64编码算法加密。加密结果可能是: YWtaW46YWRtaW4=。HttpBasic模式真的是非常简单又简陋的验证模式,Base64的加密算法是 可逆的,想要破解并不难.

+

formLogin登录模式

Spring Security的HttpBasic模式,只是进行了通过携带Http的Header进行 简单的登录验证,而且没有定制的登录页面,Security 5.x版本默认会生成一个登录页面

+

表单认证

编写Security配置类,启动项目,访问页面即会进入登录页

+
/**
+ * Security配置类
+ * @author 12492 公众号:一只会飞的旺旺
+ * @date 2022-10-10 21:09
+ */
+@Configuration
+public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+    /**
+     * http请求处理方法
+     * @param http
+     * @throws Exception
+     */
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+//        http.httpBasic() //开启httpBasic认证
+//                .and().authorizeRequests()
+//                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+
+        http.formLogin() //开启表单登录
+                .and().authorizeRequests()
+                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+    }
+}
+
+

常见问题

1.localhost将您重定向次数过多

+

image-20221010212825408

+

配置登录页面放行

+
http.formLogin().loginPage("login.html") //开启表单登录,指定登录页面
+    .and().authorizeRequests()
+    .antMatchers("/login.html").permitAll() //登录页面不需要认证
+    .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+
+

2.访问login.html 报404错

+

image-20221010212959493

+

通过springboot整合thymeleaf生成静态页面,所以需要请求接口生成模板页面,修改login.html为toLoginPage

+
    protected void configure(HttpSecurity http) throws Exception {
+//        http.httpBasic() //开启httpBasic认证
+//                .and().authorizeRequests()
+//                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+
+        http.formLogin().loginPage("toLoginPage") //开启表单登录
+                .and().authorizeRequests()
+                .antMatchers("/toLoginPage").permitAll() //登录页面不需要认证
+                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+    }
+
+

3.访问login.html 后发现页面没有相关样式

+

image-20221010213216908

+

放行静态资源,重写另外一个configure方法

+
    /**
+     * web安全配置
+     * @param web
+     * @throws Exception
+     */
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        // 设置不拦截规则
+        web.ignoring().antMatchers("/css/**", "/fonts/**", "/img/**", "/js/**","/favicon.ico");
+    }
+
+

注意: HttpSecurity和WebSecurity的区别

+

1.WebSecurity 不仅通过 HttpSecurity 定义某些请求的安全控制,也通过其他方式定义其他某些 请求可以忽略安全控制;

+

2.HttpSecurity 仅用于定义需要安全控制的请求(当然 HttpSecurity 也可以指定某些请求不需要 安全控制);

+

3.可以认为 HttpSecurity 是 WebSecurity 的一部分, WebSecurity 是包含 HttpSecurity 的更大 的一个概念;

+

4.构建目标不同

+
    +
  • WebSecurity 构建目标是整个 Spring Security 安全过滤器 FilterChainProxy
  • +
  • HttpSecurity 的构建目标仅仅是 FilterChainProxy 中的一个 SecurityFilterChain 。
  • +
+

表单登录

    protected void configure(HttpSecurity http) throws Exception {
+        http.formLogin().loginPage("/toLoginPage") //开启表单登录
+                .loginProcessingUrl("/login") //登录表单提交地址
+                .usernameParameter("username") //登录表单用户名参数名
+                .passwordParameter("password") //登录表单密码参数名
+                .successForwardUrl("/") //登录成功跳转地址
+                .and().authorizeRequests()
+                .antMatchers("/toLoginPage").permitAll() //登录页面不需要认证
+                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问
+        //关闭csrf防护
+        http.csrf().disable(); 
+        //允许iframe嵌套
+        http.headers().frameOptions().disable();
+    }
+
+

基于数据库实现认证

重写认证管理的configure方法

+
    /**
+     * 认证信息管理
+     * @param auth
+     * @throws Exception
+     */
+    @Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        auth.userDetailsService(new MyUserDetailsService());
+    }
+
+

自定义用户认证实现类

+
/**
+ * 基于数据库完成认证
+ *
+ * @author 12492 公众号:一只会飞的旺旺
+ * @date 2022-10-10 21:46
+ */
+@Component
+public class MyUserDetailsService implements UserDetailsService {
+
+    @Autowired
+    private UserService userService;
+
+
+    /**
+     * 根据username查询用户实体
+     *
+     * @param username
+     * @return
+     * @throws UsernameNotFoundException
+     */
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        User user = userService.findByUsername(username);
+        if (null == user) {
+            throw new UsernameNotFoundException("用户不存在");
+        }
+        // 先声明一个权限集合
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        // 简单构造
+        //return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
+        // 复杂构造
+        return new org.springframework.security.core.userdetails.User(user.getUsername(),
+                "{noop}" + user.getPassword(), // {noop}表示不加密
+                true, // 账号是否可用
+                true, // 账号是否过期
+                true, // 密码是否过期
+                true, // 账号是否锁定
+                authorities);
+    }
+
+}
+
+

密码加密:SpringSecurity中的PasswordEncoder就是对密码进行编码的工具接口

+

选择一种加密算法即可,常用的如BCrypt.

+

修改UserDetails构建时,密码返回方式.修改{noop}为{bcrypt}

+
    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        User user = userService.findByUsername(username);
+        if (null == user) {
+            throw new UsernameNotFoundException("用户不存在");
+        }
+        // 先声明一个权限集合
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        // 简单构造
+        //return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
+        // 复杂构造
+        return new org.springframework.security.core.userdetails.User(user.getUsername(),
+                "{bcrypt}" + user.getPassword(), // {noop}表示不加密, {bcrypt}表示加密
+                true, // 账号是否可用
+                true, // 账号是否过期
+                true, // 密码是否过期
+                true, // 账号是否锁定
+                authorities);
+    }
+
+

获取当前登录用户

    +
  • SecurityContextHolder
  • +
+

保留系统当前的安全上下文SecurityContext,其中就包括当前使用系统的用户的信息。

+
    +
  • SecurityContext
  • +
+

安全上下文,获取当前经过身份验证的主体或身份验证请求令牌

+

代码实现:

+
    /**
+     * 获取当前登录用户信息
+     *
+     * @return
+     */
+    @RequestMapping("/loginUser1")
+    @ResponseBody
+    public UserDetails getCurrentUser1() {
+        return (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+    }
+
+    /**
+     * 获取当前登录用户信息
+     *
+     * @return
+     */
+    @RequestMapping("/loginUser2")
+    @ResponseBody
+    public UserDetails getCurrentUser2(Authentication authentication) {
+        return (UserDetails) authentication.getPrincipal();
+    }
+
+    /**
+     * 获取当前登录用户信息
+     *
+     * @return
+     */
+    @RequestMapping("/loginUser3")
+    @ResponseBody
+    public UserDetails getCurrentUser3(@AuthenticationPrincipal UserDetails
+                                               userDetails) {
+        return userDetails;
+    }
+
+

remember me 记住我

1.简单的Token生成方法

+

image-20221010221430517

+

Token=MD5(username+分隔符+expiryTime+分隔符+password)

+

后台开启remember-me功能

+
        http.formLogin().loginPage("/toLoginPage") //开启表单登录
+                .loginProcessingUrl("/login") //登录表单提交地址
+                .usernameParameter("username") //登录表单用户名参数名
+                .passwordParameter("password") //登录表单密码参数名
+                .successForwardUrl("/") //登录成功跳转地址
+                .and().authorizeRequests()
+                .antMatchers("/toLoginPage").permitAll() //登录页面不需要认证
+                .anyRequest().authenticated() //所有请求都需要登录认证才能访问
+                .and()
+                .rememberMe()// 开启记住我功能
+                .tokenValiditySeconds(2000)// token失效时间默认两周
+                .rememberMeParameter("rememberMe");// 自定义表单name值
+
+

2.持久化Token生成方法

+

image-20221010221715431

+

存入数据库Token包含:

+
token: 随机生成策略,每次访问都会重新生成 
+series: 登录序列号,随机生成策略。用户输入用户名和密码登录时,该值重新生成。使用 remember-me功能,该值保持不变 
+expiryTime: token过期时间。 
+CookieValue=encode(series+token) 
+
+

后台开启remember-me功能

+

添加如下配置

+

image-20221010221958796

+

添加持久化token方法

+
 /**
+     * 持久化token,负责token与数据库之间的相关操作
+     *
+     * @return
+     */
+    @Bean
+    public PersistentTokenRepository getPersistentTokenRepository() {
+        JdbcTokenRepositoryImpl tokenRepository = new
+                JdbcTokenRepositoryImpl();
+        tokenRepository.setDataSource(dataSource);//设置数据源
+        // 启动时创建一张表, 第一次启动的时候创建, 第二次启动的时候需要注释掉, 否则会报错
+        tokenRepository.setCreateTableOnStartup(true);
+        return tokenRepository;
+    }
+
+

注意

+

为了防止Cookie伪造处理.可以在重要接口添加如下验证,如

+
    /**
+     * 根据用户ID查询用户
+     *
+     * @return
+     */
+    @GetMapping("/{id}")
+    @ResponseBody
+    public User getById(@PathVariable Integer id) {
+        //获取认证信息
+        Authentication authentication =
+                SecurityContextHolder.getContext().getAuthentication();
+        // 判断认证信息是否来自RememberMe
+        if (RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass())) {
+            throw new RememberMeAuthenticationException("认证信息来源于 RememberMe,请重新登录");
+        }
+        return userService.getById(id);
+    }
+
+

自定义登录成功和失败处理

自定义成功处理

+

实现AuthenticationSuccessHandler接口,并重写onAnthenticationSuccesss()方法.

+

自定义失败处理

+

实现AuthenticationFailureHandler接口,并重写onAuthenticationFailure()方法

+

image-20221011092638023

+

SecurityConfiguration配置

+
.successHandler(myAuthenticationService)//自定义登录成功处理
+.failureHandler(myAuthenticationService)//自定义登录失败处理
+
+

退出登录

LogoutFilter: 匹配URL为/logout的请求,实现用户退出,清除认证信息

+

image-20221011093024202

+

图形验证码

Spring Security的认证校验是由UsernamePasswordAuthenticationFilter过滤器完成的,所以我们 的验证码校验逻辑应该在这个过滤器之前。验证码通过后才能到后续的操作.

+

image-20221011093844274

+

自定义验证码过滤器

+

添加配置

+

image-20221011095034118

+

创建验证码过滤器

+
/**
+ * 验证码验证filter 需要继承OncePerRequestFilter确保在一次请求只通过一次filter,而不
+ * 需要重复执行
+ *
+ * @author pengwangwang
+ * @date 2022/10/11 09:39
+ **/
+@Component
+public class ValidateCodeFilter extends OncePerRequestFilter {
+
+    @Autowired
+    StringRedisTemplate stringRedisTemplate;
+
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
+        // 判断是否是登录请求
+        if ("/login".equals(httpServletRequest.getRequestURI()) && "POST".equals(httpServletRequest.getMethod())) {
+            try {
+                validate(httpServletRequest);
+            } catch (ValidateCodeException e) {
+                e.printStackTrace();
+                return;
+            }
+        }
+        //如果不是登录请求,直接调用后面的过滤器链
+        filterChain.doFilter(httpServletRequest, httpServletResponse);
+    }
+
+
+    public void validate(HttpServletRequest request) throws ValidateCodeException {
+        // 获取ip
+        String ip = request.getRemoteAddr();
+        //拼接redis的key
+        String key = "code_" + ip;
+        // 获取redis中的验证码
+        String code = stringRedisTemplate.opsForValue().get(key);
+        String redisImageCode = request.getParameter("imageCode");
+        if (StringUtils.hasText(redisImageCode)) {
+            throw new ValidateCodeException("验证码不能为空");
+        }
+        if (redisImageCode == null) {
+            throw new ValidateCodeException("验证码已过期");
+        }
+        if (!redisImageCode.equals(code)) {
+            throw new ValidateCodeException("验证码不正确");
+        }
+        // 从redis中移除imageCode
+        stringRedisTemplate.delete(key);
+    }
+
+}
+
+

自定义验证码异常类

+
/**
+ * 验证码异常类
+ * @author pengwangwang
+ * @date 2022/10/11 09:42
+ **/
+public class ValidateCodeException extends AuthenticationException {
+
+    public ValidateCodeException(String msg) {
+        super(msg);
+    }
+
+}
+
+

session管理

会话超时

在spring配置文件application.properties中添加超时配置

+
# session配置超时时间
+server.servlet.session.timeout=60
+
+

修改自定义设置session超时后地址

+

image-20221011101527246

+

并发控制

并发控制即同一个账号同时在线个数,同一个账号同时在线个数如果设置为1表示,该账号在同一时间内只能有一个有效的登录,如果同一个账号又在其它地方登录,那么就将上次登录的会话过期,即后面的登录会踢掉前面的登录.

+

1.配置session超时时间

+
# session配置超时时间
+server.servlet.session.timeout=600
+
+

2.设置最大会话数量

+

3.阻止用户第二次登录

+

image-20221011101905284

+

集群Session

实际场景中,一般一个服务至少会有两台服务器提供服务,前面由nginx进行负载均衡,但是这样会导致在一个服务器登录之后,session无法进行共享,导致访问另一台服务器时,需要重新登录

+

image-20221011102300381

+

为了解决这一问题,我们通常会将用户登录的会话信息,保存到第三方库中,如redis,mongodb,mysql等.这样所有服务器都能从同一个库去获取当前的登录信息.就不需要再次登录了.

+

image-20221011102411525

+

1.引入依赖

+
<!-- 基于redis实现session共享 -->
+<dependency>
+    <groupId>org.springframework.session</groupId>
+    <artifactId>spring-session-data-redis</artifactId>
+</dependency>
+
+

2.设置session存储类型

+
#使用redis共享session
+spring.session.store-type=redis
+
+

3.进行测试

+

csrf防护机制

CRSF是什么?

+

CSRF(Cross-site request forgery),中文名称:跨站请求伪造 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的 事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问 题包括:个人隐私泄露以及财产安全。

+

CRSF原理

+

image-20221012133623800

+

1.登录受信任网站A,并在本地生成Cookie。

+

2.在不登出A的情况下,访问危险网站B。

+

3.触发网站B中的一些元素

+

防御策略

+

1.验证HTTP Referer字段
2.在请求地址中添加token并验证
3.在HTTP头中自定义属性并验证

+

开启csrf防御

+

image-20221012134251219

+

跨域处理

配置跨域信息

+
    /**
+     * 跨域配置信息源
+     *
+     * @return
+     */
+    public CorsConfigurationSource corsConfigurationSource() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        // 设置允许跨域的站点
+        corsConfiguration.addAllowedOrigin("*");
+        // 设置允许跨域的http方法
+        corsConfiguration.addAllowedMethod("*");
+        // 设置允许跨域的请求头
+        corsConfiguration.addAllowedHeader("*");
+        // 允许带凭证
+        corsConfiguration.setAllowCredentials(true);
+        // 对所有的url生效
+        UrlBasedCorsConfigurationSource source = new
+                UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", corsConfiguration);
+        return source;
+    }
+
+

开启跨域配置

+

image-20221012134617938

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/SpringSecurity\344\272\214/index.html" "b/SpringSecurity\344\272\214/index.html" index e69de29bb2..da7b6d41b6 100644 --- "a/SpringSecurity\344\272\214/index.html" +++ "b/SpringSecurity\344\272\214/index.html" @@ -0,0 +1,908 @@ + + + + + + + + + + + + SpringSecurity授权与源码分析 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

授权原理

image-20221012135724547

+

如果我们想要控制用户权限,需要两部分数据

+

1:配置资源访问需要的权限

+

2.用户拥有的权限

+

本质上,权限控制实际上就是控制哪些url能否访问.

+

SpringSecurity授权

内置权限表达式

ExpressionUrlAuthorizationConfigurer包含了所有表达式

+

image-20221012140635225

+

URL权限控制

image-20221012141221556

+
/**
+ * 自定义权限不足信息
+ * @author pengwangwang
+ * @date 2022/10/12 14:10
+ **/
+@Component
+public class MyAccessDeniedHandler implements AccessDeniedHandler {
+    @Override
+    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
+        httpServletResponse.setContentType("application/json;charset=utf-8");
+        httpServletResponse.getWriter().write("权限不足,请联系管理员");
+    }
+}
+
+

自定义Bean授权

/**
+ * 自定义授权类
+ *
+ * @author pengwangwang
+ * @date 2022/10/12 14:16
+ **/
+@Component
+public class MyAuthorizationService {
+
+    /**
+     * 检查用户是否有对应的访问权限
+     *
+     * @param authentication 登录用户
+     * @param request        请求对象
+     * @return
+     */
+    public boolean check(Authentication authentication, HttpServletRequest request) {
+        User user = (User) authentication.getPrincipal();
+        // 获取用户所有权限
+        Collection<GrantedAuthority> authorities = user.getAuthorities();
+        // 获取用户名
+        String username = user.getUsername();
+        // 如果用户名为admin,则不需要认证
+        if (username.equalsIgnoreCase("admin")) {
+            return true;
+        } else {
+            // 循环用户的权限, 判断是否有ROLE_ADMIN权限, 有返回true
+            for (GrantedAuthority authority : authorities) {
+                String role = authority.getAuthority();
+                if ("ROLE_ADMIN".equals(role)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+}
+
+

image-20221012142058924

+

Method安全表达式

提供四种注解:@PreAuthorize , @PostAuthorize , @PreFilter , @PostFilter .

+

开启注解配置:

+

image-20221012142757613

+

在方法上使用注解

+
    @RequestMapping("/findAll")
+    @PreAuthorize("hasRole('ROLE_ADMIN')") // 指定角色才能访问
+    public String findAll(Model model) {
+        List<User> userList = userService.list();
+        model.addAttribute("userList", userList);
+        return "user_list";
+    }
+
+
    +
  • @ProAuthorize: 注解适合进入方法前的权限验证
  • +
  • @PostAuthorize: 在方法执行后再进行权限验证,适合验证带有返回值的权限,returnObject : 代表return返回的值
  • +
  • @PreFilter: 可以用来对集合类型的参数进行过滤, 将不符合条件的元素剔除集合
  • +
  • @PostFilter: 可以用来对集合类型的返回值进行过滤, 将不符合条件的元素剔除集合
  • +
+

RBAC权限模型简介

RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。模型中有几个关键的术语:

+

用户:系统接口及访问的操作者

+

权限:能够访问某接口或者做某操作的授权资格

+

角色:具有一类相同操作权限的总称

+

image-20221012144007485

+

源码分析

过滤器加载流程

image-20221012144745168

+

1.springboot启动时,会加载spring.factories文件,其中有SpringSecurity的过滤链配置信息

+

image-20221012145637699

+

2.SecurityFilterAutoConfiguration类

+

image-20221012151957617

+

3.SecurityAutoConfiguration类

+

image-20221012152343337

+

4.WebSecurityEnablerConfiguration类

+

image-20221012152516407

+

@EnableWebSecurity注解有两个作用:1.加载了WebSecurityConfiguration配置类, 配置安全认证策略。2.加载了AuthenticationConfiguration, 配置了认证信息。

+

5.WebSecurityConfiguration类

+

image-20221012152759076

+

认证流程分析

image-20221012153038461

+

代码跟踪

UsernamePasswordAuthenticationFilter

+
@Override
+    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
+            throws AuthenticationException {
+        //1.检查是否是post请求
+        if (this.postOnly && !request.getMethod().equals("POST")) {
+            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
+        }
+        //2.获取用户名和密码
+        String username = obtainUsername(request);
+        username = (username != null) ? username : "";
+        username = username.trim();
+        String password = obtainPassword(request);
+        password = (password != null) ? password : "";
+        //3.创建AuthenticationToken,未认证状态
+        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
+        // Allow subclasses to set the "details" property
+        setDetails(request, authRequest);
+        // 4.调用AuthenticationManager进行认证
+        return this.getAuthenticationManager().authenticate(authRequest);
+    }
+
+

UsernamePasswordAuthenticationToken

+
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
+        super(authorities);
+        this.principal = principal; // 设置用户名
+        this.credentials = credentials; // 设置密码
+        super.setAuthenticated(false); // 设置认证状态为未认证
+    }
+
+

AuthenticationManager–>ProviderManager–>AbstractUserDetailsAuthenticationProvider

+
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        Assert.isInstanceOf(UsernamePasswordAuthenticationToken.class, authentication, () -> {
+            return this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.onlySupports", "Only UsernamePasswordAuthenticationToken is supported");
+        });
+        // 1.获取用户名
+        String username = authentication.getPrincipal() == null ? "NONE_PROVIDED" : authentication.getName();
+        //2.尝试从缓存中获取
+        boolean cacheWasUsed = true;
+        UserDetails user = this.userCache.getUserFromCache(username);
+        if (user == null) {
+            cacheWasUsed = false;
+
+            try {
+                //3.检索User
+                user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);
+            } catch (UsernameNotFoundException var6) {
+                this.logger.debug("User '" + username + "' not found");
+                if (this.hideUserNotFoundExceptions) {
+                    throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+                }
+
+                throw var6;
+            }
+
+            Assert.notNull(user, "retrieveUser returned null - a violation of the interface contract");
+        }
+
+        try {
+            //4.认证前检查user状态
+            this.preAuthenticationChecks.check(user);
+            //5.附加认证认证检查
+            this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);
+        } catch (AuthenticationException var7) {
+            if (!cacheWasUsed) {
+                throw var7;
+            }
+
+            cacheWasUsed = false;
+            user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);
+            this.preAuthenticationChecks.check(user);
+            this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);
+        }
+        
+        //6.认证后检查user状态
+        this.postAuthenticationChecks.check(user);
+        if (!cacheWasUsed) {
+            this.userCache.putUserInCache(user);
+        }
+
+        Object principalToReturn = user;
+        if (this.forcePrincipalAsString) {
+            principalToReturn = user.getUsername();
+        }
+
+        //7.创建认证成功的UsernamePasswordAuthenticationToken并将认证状态设置为true
+        return this.createSuccessAuthentication(principalToReturn, authentication, user);
+    }
+
+

retrieveUser方法

+
protected final UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
+    this.prepareTimingAttackProtection();
+
+    try {
+        // 调用自定义UserDetailsService的loadUserByUserName的方法
+        UserDetails loadedUser = this.getUserDetailsService的loadUserByUserName的方法().loadUserByUsername(username);
+        if (loadedUser == null) {
+            throw new InternalAuthenticationServiceException("UserDetailsService returned null, which is an interface contract violation");
+        } else {
+            return loadedUser;
+        }
+    } catch (UsernameNotFoundException var4) {
+        this.mitigateAgainstTimingAttack(authentication);
+        throw var4;
+    } catch (InternalAuthenticationServiceException var5) {
+        throw var5;
+    } catch (Exception var6) {
+        throw new InternalAuthenticationServiceException(var6.getMessage(), var6);
+    }
+}
+
+

additionalAuthenticationChecks方法

+
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
+    if (authentication.getCredentials() == null) {
+        this.logger.debug("Failed to authenticate since no credentials provided");
+        throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+    } else {
+        //1.提取前端代码
+        String presentedPassword = authentication.getCredentials().toString();
+        //2.与数据库中的密码进行比对
+        if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
+            this.logger.debug("Failed to authenticate since password does not match stored value");
+            throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+        }
+    }
+}
+
+

AbstractAuthenticationProcessingFilter–doFilter方法

+
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        if (!requiresAuthentication(request, response)) {
+            chain.doFilter(request, response);
+            return;
+        }
+        try {
+            //1.调用子类方法
+            Authentication authenticationResult = attemptAuthentication(request, response);
+            if (authenticationResult == null) {
+                // return immediately as subclass has indicated that it hasn't completed
+                return;
+            }
+            //2.session策略验证
+            this.sessionStrategy.onAuthentication(authenticationResult, request, response);
+            // Authentication success
+            if (this.continueChainBeforeSuccessfulAuthentication) {
+                chain.doFilter(request, response);
+            }
+            //3.成功身份验证
+            successfulAuthentication(request, response, chain, authenticationResult);
+        }
+        catch (InternalAuthenticationServiceException failed) {
+            this.logger.error("An internal error occurred while trying to authenticate the user.", failed);
+            unsuccessfulAuthentication(request, response, failed);
+        }
+        catch (AuthenticationException ex) {
+            // Authentication failed
+            unsuccessfulAuthentication(request, response, ex);
+        }
+    }
+
+

successfulAuthentication方法

+
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
+      Authentication authResult) throws IOException, ServletException {
+   //1.将认证的用户放入SecurityContext中
+   SecurityContextHolder.getContext().setAuthentication(authResult);
+   if (this.logger.isDebugEnabled()) {
+      this.logger.debug(LogMessage.format("Set SecurityContextHolder to %s", authResult));
+   }
+   //2.检查是不是记住我
+   this.rememberMeServices.loginSuccess(request, response, authResult);
+   if (this.eventPublisher != null) {
+      this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
+   }
+   //3. 调用自定义MyAuthenticationService的onAuthenticationSuccess方法
+   this.successHandler.onAuthenticationSuccess(request, response, authResult);
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Spring\345\210\235\346\216\242/index.html" "b/Spring\345\210\235\346\216\242/index.html" index e69de29bb2..826f13bbc1 100644 --- "a/Spring\345\210\235\346\216\242/index.html" +++ "b/Spring\345\210\235\346\216\242/index.html" @@ -0,0 +1,791 @@ + + + + + + + + + + + + Spring初探-手写IOC与AOP - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Spring核心结构

image-20220928203138888

+

Spring的核心思想

AOP

    +
  • OOP:面向对象编程,特征是继承,封装,多态,解决垂直体系的代码重复
  • +
+

image-20220928203255111

+
    +
  • AOP:面向切面,解决横切代码的重复问题,以及抽取非业务代码,明确业务逻辑.常见应用有事务控制,日志记录,权限控制等
  • +
+

image-20220928203303141

+

IOC

控制反转: 对象创建交由外部容器实现,解决对象间的耦合.

+

image-20220928203236405

+

DI

依赖注入:与IOC角度不同,IOC是站在对象角度上,对象的创建交由容器维护,DI是站在容器的角度上,容器会提供对象依赖的其他对象,供给其使用

+

image-20220928203246302

+

MVC的发展

传统MVC

// Controller持有Service对象
+public class TransferServlet extends HttpServlet {
+    private TransferService transferService = new TransferServiceImpl();
+}
+// Service持有Dao对象
+public class TransferServiceImpl implements TransferService {
+    private AccountDao accountDao = new JdbcAccountDaoImpl();
+}
+
+

问题

1.代码耦合,每层都持有下一层的实现类对象
2.service层没有进行事务控制,方法执行中出现异常时,可能会导致数据库数据错乱

+

解决方案

问题1:
除了通过new创建对象外,我们还可以通过反射的方式创建,可以将对象创建提取到一个统一的地方执行,并提供一个方法去获取对象.如工厂类
问题2:
为Service层添加事务控制,但是JDBC的事务是控制在dao层,若一个service层中调用dao层多个db方法,这样就会导致出现多个事务,我们需要让这多个db方法属于一个Connection,这样才能实现Service层的事务控制.

+

代码示例

1.提取对象到XML

+
<beans>
+    <bean id="transferService"
+          class="com.ww.transfer.service.impl.TransferServiceImpl">
+        <property name="AccountDao" ref="accountDao"/>
+    </bean>
+    <bean id="accountDao"
+          class="com.ww.transfer.dao.impl.JdbcAccountDaoImpl">
+    </bean>
+</beans>
+
+

2.通过工厂类创建对象

+
public class BeanFactory {
+    /**
+     * ⼯⼚类的两个任务
+     * 任务⼀:加载解析xml,读取xml中的bean信息,通过反射技术实例化bean对象,然后放⼊
+     * map待⽤
+     * 任务⼆:提供接⼝⽅法根据id从map中获取bean(静态⽅法)
+     */
+    private static final Map<String, Object> map = new HashMap<>();
+
+    static {
+        // 读取配置对象信息的XML文件
+        InputStream resourceAsStream =
+                BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
+        SAXReader saxReader = new SAXReader();
+        try {
+            Document document = saxReader.read(resourceAsStream);
+            Element rootElement = document.getRootElement();
+            // 获取所有bean节点
+            List list = rootElement.selectNodes("//bean");
+            // 实例化bean对象
+            for (Object value : list) {
+                Element element = (Element) value;
+                // 获取ID
+                String id = element.attributeValue("id");
+                // 获取类全限定名
+                String clazz = element.attributeValue("class");
+                Class<?> aClass = Class.forName(clazz);
+                Object o = aClass.newInstance();
+                map.put(id, o);
+            }
+            // 维护bean之间的依赖关系
+            List propertyNodes =
+                    rootElement.selectNodes("//property");
+            for (Object propertyNode : propertyNodes) {
+                Element element = (Element) propertyNode;
+                // 处理property元素
+                String name = element.attributeValue("name");
+                String ref = element.attributeValue("ref");
+
+                // 获取外层Bean的对象
+                String parentId =
+                        element.getParent().attributeValue("id");
+                Object parentObject = map.get(parentId);
+
+                // 调用setter方法
+                Method[] methods = parentObject.getClass().getMethods();
+                for (Method method : methods) {
+                    if (("set" + name).equalsIgnoreCase(method.getName())) {
+                        // bean之间的依赖关系(注⼊bean)
+                        Object propertyObject = map.get(ref);
+                        method.invoke(parentObject, propertyObject);
+                    }
+                }
+                // 维护依赖关系后重新将bean放⼊map中
+                map.put(parentId, parentObject);
+            }
+        } catch (DocumentException | ClassNotFoundException | IllegalAccessException | InstantiationException |
+                 InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static Object getBean(String id) {
+        return map.get(id);
+    }
+}
+
+

3.增加ConnectionUtils维护唯一Connection

+
public class ConnectionUtils {
+
+    // 存储当前线程的连接
+    private ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
+
+
+    /**
+     * 从当前线程获取连接
+     */
+    public Connection getCurrentThreadConn() throws SQLException {
+        /**
+         * 判断当前线程中是否已经绑定连接,如果没有绑定,需要从连接池获取⼀个连接绑定到
+         当前线程
+         */
+
+        Connection connection = threadLocal.get();
+        if (connection == null) {
+            // 从连接池拿连接并绑定到线程
+            connection = DruidUtils.getInstance().getConnection();
+            // 绑定到当前线程
+            threadLocal.set(connection);
+        }
+        return connection;
+    }
+
+}
+
+

4.增加ProxyFactory生成代理类,插入事务处理逻辑

+
public class ProxyFactory {
+
+    private TransactionManager transactionManager;
+
+    public void setTransactionManager(TransactionManager
+                                              transactionManager) {
+        this.transactionManager = transactionManager;
+    }
+
+    // 生成代理类
+    public Object getProxy(Object target) {
+        
+        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
+                target.getClass().getInterfaces(), (proxy, method, args) -> {
+                    Object result;
+                    try {
+                        // 开启事务
+                        transactionManager.beginTransaction();
+                        // 调⽤原有业务逻辑
+                        result = method.invoke(target, args);
+                        // 提交事务
+                        transactionManager.commit();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        // 回滚事务
+                        transactionManager.rollback();
+                        // 异常向上抛出,便于servlet中捕获
+                        throw e.getCause();
+                    }
+                    return result;
+                });
+    }
+
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Spring\346\272\220\347\240\201\347\216\257\345\242\203\346\220\255\345\273\272/index.html" "b/Spring\346\272\220\347\240\201\347\216\257\345\242\203\346\220\255\345\273\272/index.html" index e69de29bb2..9dc60926c8 100644 --- "a/Spring\346\272\220\347\240\201\347\216\257\345\242\203\346\220\255\345\273\272/index.html" +++ "b/Spring\346\272\220\347\240\201\347\216\257\345\242\203\346\220\255\345\273\272/index.html" @@ -0,0 +1,667 @@ + + + + + + + + + + + + Spring源码环境搭建 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

环境准备

源码下载

github地址: https://github.com/spring-projects/spring-framework/tree/5.1.x

+

下载Spring源码,切换到5.1.X分支.

+

image-20220928203615450

+

gradle配置

1.通过源码中的地址,下载匹配版本的gradle

+

image-20220928203626356

+

2.配置gradle的环境变量

+

image-20220928203635545

+

3.在cmd中使用gradle -v命令,查看是否配置正确

+

4.修改IDEA中Gradle配置为本地配置

+

image-20220928203645744

+

5.修改Spring源码根目录的build.gradle文件,两处都添加阿里云maven仓库目录

+
repositories {
+   maven { url 'https://maven.aliyun.com/repository/public/' }
+   maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
+   maven { url 'https://maven.aliyun.com/repository/apache-snapshots' }
+   maven { url 'https://maven.aliyun.com/repository/central' }
+   maven { url 'https://maven.aliyun.com/repository/google' }
+   maven { url 'https://maven.aliyun.com/repository/jcenter' }
+   maven { url 'https://maven.aliyun.com/repository/spring' }
+   maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
+}
+
+

6.编译工程,顺序core-oxm-context-beans-aspects-aop, 点击tasks->compileTestJava

+

7.新建spring-model即可添加个人项目,开始源码阅读

+

常见问题

1.No such property: immutableValues for class: org.gradle.api.internal.tasks.DefaultTaskDependency

+
//修改spring-beans.gradle
+注释掉这两行代码
+//def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
+//compileGroovy.dependsOn = deps - 'compileJava'
+
+

2.Could not find method useJUnitPlatform()

+
注释:spring-test.gradle中这行代码
+//  useJUnitPlatform {
+//    includeEngines 'junit-jupiter'
+//    excludeTags 'failing-test-case'
+// }
+
+

3.错误如下

+
> Task :spring-beans:compileGroovy FAILED
+D:\work_space\spring-framework\spring-beans\src\main\java\org\springframework\beans\support\PropertyComparator.java:138: 错误: 不兼容的类型: PropertyComparator<CAP
+#1>无法转换为Comparator<? super CAP#1>
+                        source.sort(new PropertyComparator<>(sortDefinition));
+
+

点击错误类,会直接跳转到该方法,然后直接返回值List泛型去掉

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Tomcat\345\255\246\344\271\240/index.html" "b/Tomcat\345\255\246\344\271\240/index.html" index e69de29bb2..1c98665321 100644 --- "a/Tomcat\345\255\246\344\271\240/index.html" +++ "b/Tomcat\345\255\246\344\271\240/index.html" @@ -0,0 +1,1045 @@ + + + + + + + + + + + + Tomcat学习笔记 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Tomcat系统架构

浏览器访问服务器的流程

http请求的处理过程

+

image-20221019095724908

+

Tomcat请求处理过程

image-20221019095857334

+

Tomcat既按照Servlet的规范要求去实现了Servlet容器,同时也具有HTTP服务器的功能

+

Tomcat Servlet容器处理流程

image-20221019100156548

+

1.HTTP服务器会将请求信息使用ServletRequest对象封装起来

+

2.根据URL映射调用Servlet容器中的某个具体的Servlet

+

3.若Servlet还未加载,则通过反射机制创建Servlet,并调用Servlet的init方法完成初始化

+

4.调用具体Servlet的service方法来处理请求,请求处理结果使用ServletResponse对象封装

+

5.将ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

+

Tomcat核心组件

image-20221019101950961

+

根据上面的介绍,可以发现,Tomcat需要实现两个重要的功能

+

1.与客户端交互.进行请求响应对象转换

+

2.Servlet容器处理业务逻辑

+

下面介绍Tomcat的两个核心组件

+

连接器组件Coyote

负责对外交流,处理Socket连接,负责网络字节流与Request和Response对象的转化

+

image-20221019101814566

+

image-20221019101923099

+

容器Contalina

负责内部处理,加载和管理Servlet,以及具体处理Request请求

+

image-20221019102429036

+

1.Engine

+

表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,当一个引擎可以有多个Host

+

2.Host

+

代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机可以包含多个Context

+

3.Context

+

表示一个Web应用程序,一个Web应用可以包含多个Wrapper

+

4.Wrapper

+

表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器

+

上述组件的配置就体现在conf/server.xml中

+

Tomcat核心配置

配置说明

核心配置文件在tomcat目录下conf/server.xml

+

主要标签结构

+
<!--
+ Server 根元素,创建⼀个Server实例,⼦标签有 Listener、GlobalNamingResources、
+Service
+-->
+<Server>
+ <!--定义监听器-->
+ <Listener/>
+ <!--定义服务器的全局JNDI资源 -->
+ <GlobalNamingResources/>
+ <!--
+ 定义⼀个Service服务,⼀个Server标签可以有多个Service服务实例
+ -->
+ <Service/>
+</Server>
+
+

Server标签

+
<!--
+ port:关闭服务器的监听端⼝
+ shutdown:关闭服务器的指令字符串
+-->
+<Server port="8005" shutdown="SHUTDOWN">
+ <!-- 以⽇志形式输出服务器 、操作系统、JVM的版本信息 -->
+ <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+ <!-- Security listener. Documentation at /docs/config/listeners.html
+ <Listener className="org.apache.catalina.security.SecurityListener" />
+ -->
+ <!--APR library loader. Documentation at /docs/apr.html -->
+ <!-- 加载(服务器启动) 和 销毁 (服务器停⽌) APR。 如果找不到APR库, 则会输出⽇志, 并
+不影响 Tomcat启动 -->
+ <Listener className="org.apache.catalina.core.AprLifecycleListener"
+SSLEngine="on" />
+ <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+ <!-- 避免JRE内存泄漏问题 -->
+ <Listener
+className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+ <!-- 加载(服务器启动) 和 销毁(服务器停⽌) 全局命名服务 -->
+ <Listener
+className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+ <!-- 在Context停⽌时重建 Executor 池中的线程, 以避免ThreadLocal 相关的内存泄漏 -->
+<Listener
+className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+ 
+ 
+ <!-- Global JNDI resources
+ Documentation at /docs/jndi-resources-howto.html
+ GlobalNamingResources 中定义了全局命名服务
+ -->
+ <GlobalNamingResources>
+ <!-- Editable user database that can also be used by
+ UserDatabaseRealm to authenticate users
+ -->
+ <Resource name="UserDatabase" auth="Container"
+ type="org.apache.catalina.UserDatabase"
+ description="User database that can be updated and saved"
+ factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+ pathname="conf/tomcat-users.xml" />
+ </GlobalNamingResources>
+ <!-- A "Service" is a collection of one or more "Connectors" that share
+ a single "Container" Note: A "Service" is not itself a "Container",
+ so you may not define subcomponents such as "Valves" at this level.
+ Documentation at /docs/config/service.html
+ -->
+ <Service name="Catalina">
+ ...
+ </Service>
+</Server>
+
+

Service标签

+
<!--
+ 该标签⽤于创建 Service 实例,默认使⽤ org.apache.catalina.core.StandardService。
+ 默认情况下,Tomcat 仅指定了Service 的名称, 值为 "Catalina"。
+ Service ⼦标签为 : Listener、Executor、Connector、Engine,
+ 其中:
+ Listener ⽤于为Service添加⽣命周期监听器,
+ Executor ⽤于配置Service 共享线程池,
+ Connector ⽤于配置Service 包含的链接器,
+ Engine ⽤于配置Service中链接器对应的Servlet 容器引擎
+-->
+<Service name="Catalina">
+ ...
+</Service>
+
+

Executor标签

+
<!--
+默认情况下,Service 并未添加共享线程池配置。 如果我们想添加⼀个线程池, 可以在
+<Service> 下添加如下配置:
+ name:线程池名称,⽤于 Connector中指定
+ namePrefix:所创建的每个线程的名称前缀,⼀个单独的线程名称为
+namePrefix+threadNumber
+ maxThreads:池中最⼤线程数
+ minSpareThreads:活跃线程数,也就是核⼼池线程数,这些线程不会被销毁,会⼀直存在
+ maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位
+毫秒
+ maxQueueSize:在被执⾏前最⼤线程排队数⽬,默认为Int的最⼤值,也就是⼴义的⽆限。除⾮特
+殊情况,这个值 不需要更改,否则会有请求不会被处理的情况发⽣
+ prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为
+false,即不启动
+ threadPriority:线程池中线程优先级,默认值为5,值从1到10
+ className:线程池实现类,未指定情况下,默认实现类为 
+org.apache.catalina.core.StandardThreadExecutor。如果想使⽤⾃定义线程池⾸先需要实现
+org.apache.catalina.Executor接⼝
+-->
+<Executor name="commonThreadPool"
+ namePrefix="thread-exec-"
+ maxThreads="200"
+ minSpareThreads="100"
+ maxIdleTime="60000"
+ maxQueueSize="Integer.MAX_VALUE"
+ prestartminSpareThreads="false"
+ threadPriority="5"
+ className="org.apache.catalina.core.StandardThreadExecutor"/>
+
+

Connector标签

+

Connector 标签⽤于创建链接器实例

+

默认情况下,server.xml 配置了两个链接器,⼀个⽀持HTTP协议,⼀个⽀持AJP协议

+

⼤多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进⾏优化

+
<!--
+port:
+ 端⼝号,Connector ⽤于创建服务端Socket 并进⾏监听, 以等待客户端请求链接。如果该属性设置
+为0, Tomcat将会随机选择⼀个可⽤的端⼝号给当前Connector 使⽤
+protocol:
+ 当前Connector ⽀持的访问协议。 默认为 HTTP/1.1 , 并采⽤⾃动切换机制选择⼀个基于 JAVA
+NIO 的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat的本地库判定)
+connectionTimeOut:
+Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。
+redirectPort:
+ 当前Connector 不⽀持SSL请求, 接收到了⼀个请求, 并且也符合security-constraint 约束,
+需要SSL传输,Catalina⾃动将请求重定向到指定的端⼝。
+executor:
+ 指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads 等属性配置内部线程池。
+URIEncoding:
+ ⽤于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 , Tomcat7.x版本默认为ISO8859-1
+-->
+<!--org.apache.coyote.http11.Http11NioProtocol , ⾮阻塞式 Java NIO 链接器-->
+<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
+redirectPort="8443" />
+<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
+
+

Engine标签

+
<!--
+name: ⽤于指定Engine 的名称, 默认为Catalina
+defaultHost:默认使⽤的虚拟主机名称, 当客户端请求指向的主机⽆效时, 将交由默认的虚拟主机处
+理, 默认为localhost
+-->
+<Engine name="Catalina" defaultHost="localhost">
+ ...
+</Engine>
+
+

Host标签

+

用于配置一个虚拟主机

+
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
+ ...
+</Host> 
+
+

Context标签

+

Context标签用于配置一个Web应用

+
<Host name="www.abc.com" appBase="webapps" unpackWARs="true"
+autoDeploy="true">
+<!--
+ docBase:Web应⽤⽬录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的
+相对路径。
+ path:Web应⽤的Context 路径。如果我们Host名为localhost, 则该web应⽤访问的根路径为: 
+ http://localhost:8080/web_demo。
+-->
+ <Context docBase="/Users/yingdian/web_demo" path="/web3"></Context> 
+ 
+ <Valve className="org.apache.catalina.valves.AccessLogValve"
+directory="logs"
+ prefix="localhost_access_log" suffix=".txt"
+ pattern="%h %l %u %t &quot;%r&quot; %s %b" />
+</Host>
+
+

手写简易版Tomcat

实现步骤

+

1.解析web.xml中的配置,保存url与servlet对象的映射关系

+
<?xml version="1.0" encoding="UTF-8" ?>
+<web-app>
+    <servlet>
+        <servlet-name>ww</servlet-name>
+        <servlet-class>server.MyServlet</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>ww</servlet-name>
+        <url-pattern>/my</url-pattern>
+    </servlet-mapping>
+</web-app>
+
+
private void loadServlet() {
+        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");
+        SAXReader saxReader = new SAXReader();
+
+        try {
+            Document document = saxReader.read(resourceAsStream);
+            Element rootElement = document.getRootElement();
+
+            List<Element> selectNodes = rootElement.selectNodes("//servlet");
+            for (int i = 0; i < selectNodes.size(); i++) {
+                Element element = selectNodes.get(i);
+                // <servlet-name>lagou</servlet-name>
+                Element servletnameElement = (Element) element.selectSingleNode("servlet-name");
+                String servletName = servletnameElement.getStringValue();
+                // <servlet-class>server.LagouServlet</servlet-class>
+                Element servletclassElement = (Element) element.selectSingleNode("servlet-class");
+                String servletClass = servletclassElement.getStringValue();
+
+
+                // 根据servlet-name的值找到url-pattern
+                Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");
+                // /lagou
+                String urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();
+                servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());
+            }
+        } catch (DocumentException | IllegalAccessException | InstantiationException | ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+

2.定义一个线程类,封装request,response对象,请求资源

+
private void loadServlet() {
+        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");
+        SAXReader saxReader = new SAXReader();
+
+        try {
+            Document document = saxReader.read(resourceAsStream);
+            Element rootElement = document.getRootElement();
+
+            List<Element> selectNodes = rootElement.selectNodes("//servlet");
+            for (int i = 0; i < selectNodes.size(); i++) {
+                Element element = selectNodes.get(i);
+                // <servlet-name>lagou</servlet-name>
+                Element servletnameElement = (Element) element.selectSingleNode("servlet-name");
+                String servletName = servletnameElement.getStringValue();
+                // <servlet-class>server.LagouServlet</servlet-class>
+                Element servletclassElement = (Element) element.selectSingleNode("servlet-class");
+                String servletClass = servletclassElement.getStringValue();
+
+
+                // 根据servlet-name的值找到url-pattern
+                Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");
+                // /lagou
+                String urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();
+                servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());
+            }
+        } catch (DocumentException | IllegalAccessException | InstantiationException | ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+

3.启动Socket监听,将线程类放入线程池

+
public void start() throws IOException {
+        // 加载解析相关的配置 web.xml
+        loadServlet();
+
+        // 定义一个线程池
+        int corePoolSize = 10;
+        int maximumPoolSize = 50;
+        long keepAliveTime = 100L;
+        TimeUnit unit = TimeUnit.SECONDS;
+        ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
+        ThreadFactory threadFactory = Executors.defaultThreadFactory();
+        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
+
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
+                corePoolSize,
+                maximumPoolSize,
+                keepAliveTime,
+                unit,
+                workQueue,
+                threadFactory,
+                handler
+        );
+
+        /**
+         * 完成Minicat1.0版本
+         * 需求: 浏览器请求http://localhost:8080
+         * 返回一个固定的字符串到页面"Hello Minicat!"
+         */
+        ServerSocket serverSocket = new ServerSocket(port);
+        System.out.println("=====>>>Minicat start on port:" + port);
+        System.out.println("=========>>>>>>使用线程池进行多线程改造");
+        /*
+            多线程改造(使用线程池)
+         */
+        while(true) {
+            Socket socket = serverSocket.accept();
+            RequestProcessor requestProcessor = new RequestProcessor(socket,servletMap);
+            //requestProcessor.start();
+            threadPoolExecutor.execute(requestProcessor);
+        }
+
+

4.请求localhost:8080/my之后,会进入HttpServlet的service进行处理,区分GET,POST请求

+
    public void service(Request request, Response response) throws Exception {
+        if("GET".equalsIgnoreCase(request.getMethod())) {
+            doGet(request,response);
+        }else{
+            doPost(request,response);
+        }
+    }
+
+

源码剖析

Tomcat启动流程

image-20221019114416099

+

Tomcat请求处理流程

流程分析

image-20221019114431327

+

示意图

image-20221019114458817

+

Mapper组件体系结构

image-20221019114602665

+

Tomcat类加载机制

JVM类加载机制

类加载过程:Java类(.java)–>字节码文件(.class)–>字节码文件

+

image-20221019133918617

+

引导启动类加载器

+

BootStrapClassLoader:加载java核心库文件,比如rt.jar中的类,构造ExtClassLoader和AppClassLoader

+

扩展类加载器

+

ExtClassLoader:加载扩展库JAVA_HOME/lib/ext目录下的jar中的类,如classpath中的jre,javax.*或者java.ext.dir指定位置中的类

+

系统类加载器

+

AppClassLoader/SystemCalssLoader:默认的类加载器,搜索环境变量classpath中指定的路径

+

双亲委派机制

当某个类加载器要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类.

+

作用

+

1.防止重复加载同一个.class

+

2.保证最上层的核心.class不能被篡改.

+

Tomcat类加载机制

image-20221019135730245

+

1.系统类加载器正常情况下应该加载的是Classpath下的类,但是tomcat中加载的是tomcat的启动类,如bootstrap.jar

+

2.Common通用类加载器加载Tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

+

3.Catalina ClassLoader用于加载服务器内部可见类

+

4.Shared ClassLoader用于加载应用程序共享类

+

5.Webapp ClassLoader,每个应用程序都有独一无二的Webapp ClassLoader,加载应用程序/WEB-INF/classes和/WEB-INF/lib下的类

+

加载顺序

+

1.首先从Bootstrap ClassLoader加载指定的类

+

2.如果未加载到,则从/WEB-INF/classes加载

+

3.如果未加载到,则从/WEB-INF/lib/*.jar加载

+

4.如果未加载到,则一次从Sytstem,Common,Shared加载

+

Tomcat优化策略

Tomcat支持HTTPS

HTTP与HTTPS的区别

1.HTTPS需要使用SSL证书

+

2.Tomcat下HTTP默认端口8080,HTTPS默认端口8443

+

3.HTTPS具有安全性,会对数据传输加密,相当于HTTP的升级版

+

HTTPS工作原理

image-20221019141737461

+

Tomcat配置HTTPS

1.使用JDK中的keytool工具生成免费的证书

+
keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore
+
+

image-20221019142015924

+

2.配置conf/server.xml

+
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+ maxThreads="150" schema="https" secure="true" SSLEnabled="true">
+ <SSLHostConfig>
+ <Certificate
+certificateKeystoreFile="a.keystore 证书文件地址" certificateKeystorePassword="lagou123" type="RSA"
+/>
+ </SSLHostConfig>
+</Connector>
+
+

3.使用https协议访问localhost:8443

+

Tomcat性能优化

优化指标

1.响应时间:执行某个操作的耗时

+

2.吞吐量:系统在给定时间能支持的事务数量.单位TPS.

+

优化策略

1.虚拟机优化

+
    +
  • 内存直接影响服务的运行效率和吞吐量
  • +
  • 垃圾回收机制会不同程度的导致程序运行中断
  • +
+

image-20221019143640846

+

2.Tomcat配置优化

+
    +
  • 调整tomcat线程池
  • +
+

image-20221019143316751

+
    +
  • 调整tomcat的连接器
  • +
+

image-20221019143333554

+
    +
  • 禁用AJP连接器
  • +
+

image-20221019143515148

+
    +
  • 调整IO模式
  • +
+

image-20221019143537010

+
    +
  • 动静分离
  • +
+

可以使⽤Nginx+Tomcat相结合的部署⽅案,Nginx负责静态资源访问,Tomcat负责Jsp等动态资源访问处理(因为Tomcat不擅⻓处理静态资源)

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Ubuntu\345\217\214\347\275\221\345\215\241\351\205\215\347\275\256/index.html" "b/Ubuntu\345\217\214\347\275\221\345\215\241\351\205\215\347\275\256/index.html" index e69de29bb2..432306b2e5 100644 --- "a/Ubuntu\345\217\214\347\275\221\345\215\241\351\205\215\347\275\256/index.html" +++ "b/Ubuntu\345\217\214\347\275\221\345\215\241\351\205\215\347\275\256/index.html" @@ -0,0 +1,650 @@ + + + + + + + + + + + + Ubuntu20使用Netplan配置双网卡服务器 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

需求

现场服务部署使用内网IP,而平时远程解决问题,可能需要用到外网IP,这时我们就需要为服务器配置双网卡,既可以使用静态IP访问到局域网服务器,又可以进行外网访问。

+

配置方法

1.进入网络管理目录

进入网络管理目录,编辑下面的yaml文件

+
cd /etc/netplan
+vim 01-network-manager-all.yaml
+
+

2.双网口硬件配置

    +
  • 静态IP网口:该口网线要连接在局域网交换机上。
  • +
  • 动态IP网口:该口网线要连在能动态获取到IP的网口,比如路由器等。
  • +
+

3.配置yaml文件

1.查询每个网口的名称,终端输入ifconfig,如下图红框内即为网口名称

+

image-20221103162708811

+

2.使用root权限编辑此文档sudo vim 01-network-manager-all.yaml

+

enp1s0f1为外网网口,enp1s0f0为内网网口,

+
network:
+    ethernets:
+        enp1s0f0:
+            addresses: [你的内网ip地址/24]
+            dhcp4: no
+            dhcp6: no
+        enp1s0f1:
+            dhcp4: yes
+            dhcp6: yes
+    version: 2
+    renderer: networkd
+
+

3.然后执行以下命令

+
sudo netplan apply
+
+

4.然后通过ping ip的方式,判断内网ip地址是否配置成功,以及ping www.baidu.com,判断外网ip是否成功.

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WARP/index.html b/WARP/index.html index e69de29bb2..a225fee574 100644 --- a/WARP/index.html +++ b/WARP/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + WARP使用教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ WARP使用教程 +

WARP使用教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20220928204025449

+

引言

WARP是cloudflare公司推出的可以用来保护使用者隐私的一款服务,对于经常使用WARP来解锁vps流媒体的人再熟悉不过了。
WARP基于wireguard协议,使用UDP来传输数据,也就意味着在公网中的高QOS,但是WARP的ip相对比较干净,对外访问网络的出口 IP 被很多网站视为真实用户,可以用来解锁流媒体,谷歌学术等。

+

Zero Trust,俗称team,是由cloudflare推出的面向团队的vpn服务,由于其登录1.1.1.1可以获得无限流量,不需要再通过刷邀请流量的方式来获得WARP+流量,做到“一劳永逸”。

+

注意: 若是发现最后无法连接,或者连接后没有网络,请更换设备或者WIFI,同时官网默认屏蔽了一些网站访问!若最终还是无法访问谷歌,请及时放弃!避免折腾!

+

自己的广告

小卖铺: 首页 | 一只会飞的旺旺 (wangwangit.com)

+

下载地址

直接前往官网下载即可,官网打不开可以访问个人盘下载

+

官方: https://1.1.1.1/
个人盘1: 安卓 windows
个人盘2: 安卓 windows

+

Cloudflare WARP是可以直接通过官网应用来使用,可以登录官网来下载应用,安装成功后,打开首页开关即可体验Cloudflare WARP。WARP下载后会有1G的WARP+体验流量,流量使用完后会降级WARP,后期可以刷邀请流量和升级为Zero Trust解决。但由于国内的特殊网络情况,可能出现一直正在连接中的情况,不断重试直至连接成功即可。

+

账号申请

视频教程

地址: warp.mp4 | 一只会飞的旺旺 (wangwangit.com)

+

方案一: 直接使用

若只是想使用,可以直接跳过申请,直接安装软件,按我的配置登录即可!

+

使用WARP team基本上只需要两步,创建团队以及登录账号。

+
+

我的team团队名称为wangzai,使用后缀为@qq.com的邮箱验证即可,欢迎使用。 (人员已满)

+

另外一个团队名:wangwang

+

后续不再提供Team,请自行按教程申请.验证码收不到请换邮箱多尝试几次,还不行请自行搜索获取密钥的方式,获取密钥使用软件.

+
+

新增直接使用Key的方法

设置->账户->按键->更改密钥

+
+

key1: 7xk0h93w-qE69ce01-5P3r01sa

+

key2: 45QDMW26-n46B9u1M-6E0Nr5Q8

+

key3: tl8A1F93-oz41aQ76-1FATw764

+
+

image-20230421185733282

+

方案二: 自行申请

1、登录cloudflare账号

image-20220928204921514

+

2、打开Zero Trust

设置一个自己能记住的团队名称、点击Next

+

image-20220928204931398

+

跳转到下一界面之后,选择Free plan。

+

我们可以看到free计划最多支持50人同时使用,这波可谓诚意满满。不出意外的话,会让你绑定付款方式,这个时候我们删除URL中多余的部分(即访问最初的地址:Cloudflare Zero Trust),直接进入主界面即可。不需要绑定付款方式。

+

image-20220928205003834

+

创建团队成功

+

弹出绑定付款方式时,团队已经创建成功,直接访问Zero Trust即可。

+

image-20220928205013758

+

设置认证方式

+
    +
  1. 依次点击My Team—Devices—connect a device
  2. +
  3. 设置一个你常用邮箱的后缀,例如@qq.com
  4. +
  5. 设置成功后即可在你们需要登录Team的设备上进行登录
  6. +
+

软件使用

介绍安卓的使用教程!

+

image-20220928205150128

+

注:

+

1、团队名称为之前你设置的团队名称。

+

2、邮箱也要符合你之前设置的邮箱后缀。

+

最后

cloudflare的免费服务一向诚意满满,我们应该珍惜,不要滥用,一个团队可以容纳50名用户,建议你多向附近的人推荐你的团队或者加入别人的团队,这样物尽其用才是最好的珍惜。

+

我的team团队名称为wangzai,验证邮箱@qq.com即可,欢迎使用。

+

有需要进交流群的可以加我,备注AI即可!

+

image-20230417194824820

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/WSL2\344\270\212\345\220\257\347\224\250systemd/index.html" "b/WSL2\344\270\212\345\220\257\347\224\250systemd/index.html" index e69de29bb2..197787a76c 100644 --- "a/WSL2\344\270\212\345\220\257\347\224\250systemd/index.html" +++ "b/WSL2\344\270\212\345\220\257\347\224\250systemd/index.html" @@ -0,0 +1,641 @@ + + + + + + + + + + + + WSL2上启用官方systemd - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ + + + +
+ +
+
+
+ + +
  1. 1. 前提
  2. 2. 步骤
+ +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前提

如果需要使用微软官方支持的systmed,在目前来说你需要满足这些前置条件:

+
    +
  1. 操作系统为windows 11
  2. +
  3. wsl 版本为 0.67.6 或以上(目前均为预览版本)。
  4. +
+

查看wsl版本号命令为: wsl --version,如果此命令未正常回显版本号,或版本号低于0.67.6,那么你安装的wsl还不支持systemd。

+

image-20231130100307278

+

步骤

    +
  1. 前往Microsoft Store安装最新的WSL Perview,或者去 https://github.com/microsoft/WSL/releases 下载最新的进行安装!

    +

    image-20231130100525773

    +
  2. +
  3. 通过wsl命令进入服务器内部,修改wsl配置启用systemd

    +
    echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf
    +
    +
  4. +
  5. 通过下面命令判断systemd是否启用成功,若返回init说明未启用,若是systemd则表示启动成功!

    +

    image-20231130100758542

    +
  6. +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/WebSocket\346\266\210\346\201\257\345\244\252\345\244\247\346\227\240\346\263\225\345\217\221\351\200\201/index.html" "b/WebSocket\346\266\210\346\201\257\345\244\252\345\244\247\346\227\240\346\263\225\345\217\221\351\200\201/index.html" index e69de29bb2..0a0824a6ec 100644 --- "a/WebSocket\346\266\210\346\201\257\345\244\252\345\244\247\346\227\240\346\263\225\345\217\221\351\200\201/index.html" +++ "b/WebSocket\346\266\210\346\201\257\345\244\252\345\244\247\346\227\240\346\263\225\345\217\221\351\200\201/index.html" @@ -0,0 +1,629 @@ + + + + + + + + + + + + WebSocket消息太大导致无法发送 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ + + + +
+ +
+
+ +
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

问题

使用websocket,通过spring cloud gateway转发传送数据大于64kb时会丢失数据,查看源码发现netty中默认websocket限制大小是64k。

+

原因(有兴趣的可以查看下源码):

+

ReactorNettyWebSocketClient 这个类下面的 maxFramePayloadLength。

+

解决方法

在 gateway 项目的配置文件中加入下面这句话并设置大小。

+
spring:
+  cloud:
+    gateway:
+      httpclient:
+        websocket:
+          max-frame-payload-length: 10485760  # 需要设置的大小
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Windows-Copilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" "b/Windows-Copilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" index e69de29bb2..ddde216d94 100644 --- "a/Windows-Copilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" +++ "b/Windows-Copilot\346\212\242\345\205\210\344\275\223\351\252\214/index.html" @@ -0,0 +1,663 @@ + + + + + + + + + + + + Windows Copilot抢先体验 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20230630084755332

+

Windows Copilot:Windows 11的智能助手

Windows 11是微软最新的操作系统,它带来了许多新的功能和改进。其中一个最令人期待的功能就是Windows Copilot,一个基于微软Edge浏览器和Bing搜索引擎的智能助手,可以帮助用户更高效地使用Windows 11。

+

如何在 Windows 11 中试用 Windows Copilot

要立即试用 Copilot,请按照以下步骤操作:

+
    +
  1. 注册 Windows 预览体验计划的开发频道。

    +
  2. +
  3. 重新启动。

    +
  4. +
  5. 转到 Windows 更新并检查更新。

    +
  6. +
  7. 下载内部版本 23493 或更高版本。

    +
  8. +
+

image-20230630085415458

+

image-20230630085444483

+

image-20230630084953210

+

Windows Copilot是什么?

Windows Copilot是一个集成在Windows 11中的智能助手,它可以通过语音或文本与用户交互,回答用户的问题,执行用户的命令,以及提供用户需要的信息和服务。Windows Copilot不是一个单独的应用程序,而是一个嵌入在Windows 11右侧的面板,可以与任何应用程序并排使用。

+

Windows Copilot的核心技术是微软Edge浏览器和Bing搜索引擎。微软Edge浏览器提供了网页渲染能力,使得Windows Copilot可以显示丰富的网页内容。Bing搜索引擎提供了人工智能能力,使得Windows Copilot可以理解用户的意图,生成语义化的回答,以及调用OpenAI等第三方插件。

+

image-20230630085017621

+

Windows Copilot能做什么?

Windows Copilot目前还处于开发阶段,已经向Windows Insider Program的Dev Channel测试者开放。目前,Windows Copilot支持以下几种类型的功能:

+
    +
  • Windows 11操作:用户可以通过语音或文本命令Windows Copilot执行一些常用的Windows 11操作,例如切换主题模式(深色或浅色),打开或关闭勿扰模式,截取屏幕快照等。
  • +
  • Bing搜索:用户可以通过语音或文本向Windows Copilot提问任何问题,例如“今天晚上吃什么”或“欧洲有哪些好玩的地方”,Windows Copilot会像Bing.com一样给出相应的答案和建议。
  • +
  • 文本摘要:用户可以在使用微软Edge浏览器时,通过语音或文本命令Windows Copilot对当前网页内容进行摘要,生成一段简洁明了的概括。
  • +
+

Windows Copilot有什么优势?

Windows Copilot相比于之前的Cortana智能助手有以下几个优势:

+
    +
  • 更智能:Windows Copilot利用了OpenAI和Bing AI等先进的人工智能技术,可以更好地理解用户的需求,生成更准确和更丰富的回答。
  • +
  • 更强大:Windows Copilot不仅可以帮助用户使用Windows 11本身的功能,还可以调用第三方插件和服务,提供更多样化和更有价值的功能。
  • +
  • 更集成:Windows Copilot不是一个独立的应用程序,而是一个嵌入在Windows 11中的面板,可以与任何应用程序并排使用,提供更流畅和更便捷的体验。
  • +
+

Windows Copilot有哪些局限?

当然,Windows Copilot也不是完美无缺的。目前,它还存在以下一些局限:

+
    +
  • 需要更新:为了使用Windows Copilot,用户需要安装最新版本的微软Edge浏览器(115.0.1901.150或更高)和最新版本的Windows 11(Build 23493或更高)。
  • +
  • 需要登录:为了使用Windows Copilot,用户需要登录自己的微软账户。如果用户已经在Windows 11上登录了微软账户,Windows Copilot会自动使用它。
  • +
  • 不完善:目前,Windows Copilot还没有实现在Build 2023开发者大会上展示的所有功能,例如修改高级Windows设置或使用第三方插件。这些功能会在未来的更新中逐步添加。
  • +
+

Windows Copilot值得尝试吗?

总的来说,Windows Copilot是一个非常有潜力的智能助手,它可以帮助用户更高效地使用Windows 11,也可以提供用户更多的信息和服务。虽然它目前还不够完善,但是它已经展示了微软在人工智能领域的雄心和实力。如果你是一个喜欢尝试新技术的用户,那么你可以通过加入Windows Insider Program的Dev Channel来体验Windows Copilot。如果你是一个喜欢稳定和成熟的用户,那么你可以等待Windows Copilot正式发布后再使用它。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Windows\344\270\212\347\232\204\344\273\243\347\220\206\345\256\242\346\210\267\347\253\257Clash/index.html" "b/Windows\344\270\212\347\232\204\344\273\243\347\220\206\345\256\242\346\210\267\347\253\257Clash/index.html" index e69de29bb2..7ada2c5f9b 100644 --- "a/Windows\344\270\212\347\232\204\344\273\243\347\220\206\345\256\242\346\210\267\347\253\257Clash/index.html" +++ "b/Windows\344\270\212\347\232\204\344\273\243\347\220\206\345\256\242\346\210\267\347\253\257Clash/index.html" @@ -0,0 +1,700 @@ + + + + + + + + + + + + 深入解析Clash:功能、使用和配置 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Clash是一个开源、免费的网络连接代理内核。它是用Go编程语言开发的,主要用于网络连接的转发。这是基于一套预定义的规则,用于实现科学上网(即翻墙)。其优点是可以自动选择节点,实现”自动使用不同的节点来访问不同的网站”。它支持Windows、Mac、Android、软路由端(暂不支持iOS),并支持主流的VMess、Shadowsocks、Trojan、Snell、SS/SSR、v2ray等协议。在这篇博文中,我将详细介绍如何使用和配置Clash。

+

下载Clash

Clash可以在官方网站下载。

+

Clash的初次启动

首次启动Clash for Windows,如果出现以下界面,表示启动成功:

+

启动界面

+

导入配置文件

在使用Clash之前,你需要导入一个配置文件。配置文件的导入有两种途径:

+
    +
  1. URL导入:在界面左侧菜单Profiles中,填入URL并点击Download。下载完成后,点击对应的配置文件即可载入。

    +

    URL导入

    +
  2. +
  3. 本地文件拖拽导入:如果无法通过URL下载配置文件,可以在浏览器中下载配置文件后,通过拖拽的方式导入。

    +

    本地文件拖拽导入

    +
  4. +
+

一般情况下,URL和配置文件都由服务商提供复制或下载。

+

设置系统代理及开机自启选项

在General设置中,打开System ProxyStarts with Windows两个开关即可。System Proxy用于设置系统代理,而Start with Windows则可以使Clash在开机时自动启动。

+

设置系统代理及开机自启选项

+

配置完成

至此,你已经完成了Clash的基本配置。

+

如何自定义配置文件

在 Clash 中,有很多情况可能需要你自己定义配置文件,例如你可能希望将某些特定的网站通过特定的代理节点进行访问,或者你可能希望某些网站直接连接而不使用代理,这些都可以通过自定义配置文件实现。

+

自定义配置文件并不复杂,只需要熟悉 Clash 配置文件中的各个部分,理解它们的含义,然后按照你的需求进行配置即可。

+

下面是一个简单的 Clash 配置文件示例:

+
# HTTP 代理服务器端口
+port: 7890
+
+# SOCKS5 代理服务器端口
+socks-port: 7891
+
+# 允许局域网连接
+allow-lan: true
+
+# 规则模式,Rule(规则) / Global(全局代理)/ Direct(全局直连)
+mode: Rule
+
+# 设置日志等级(silent / info / warning / error / debug)
+log-level: info
+
+# 外部控制器的控制端口
+external-controller: 127.0.0.1:9090
+
+# 代理节点,可以有多个
+proxies:
+  - name: "节点1"
+    type: ss
+    server: servername
+    port: 8388
+    cipher: AEAD_CHACHA20_POLY1305
+    password: "yourpassword"
+
+# 代理节点组,可以根据需要自定义
+proxy-groups:
+  - name: "自动选择"
+    type: url-test
+    proxies:
+      - "节点1"
+    url: 'http://www.gstatic.com/generate_204'
+    interval: 300
+
+# 规则,决定哪些请求通过哪个代理节点或直接连接
+rules:
+  - DOMAIN-SUFFIX,google.com,自动选择
+  - DOMAIN-KEYWORD,facebook,自动选择
+  - GEOIP,CN,Direct
+  - MATCH,自动选择
+
+

在这个配置文件中,主要定义了三个部分:proxiesproxy-groupsrules

+
    +
  • proxies:定义了你的所有代理节点,你可以添加多个节点,并为每个节点设置一个唯一的名称。
  • +
  • proxy-groups:定义了代理节点组,你可以将多个节点放入一个组中,并为这个组设置一个唯一的名称。在这个示例中,我们创建了一个名为“自动选择”的代理节点组,它会自动选择延迟最低的节点作为代理服务器。
  • +
  • rules:定义了你的代理规则,你可以根据自己的需要设置多条规则。在这个示例中,我们设置了四条规则,它们分别是:
      +
    • 如果请求的目标是 google.com,那么通过“自动选择”代理节点组进行访问。
    • +
    • 如果请求的目标包含“facebook”关键词,那么通过“自动选择”代理节点组进行访问。
    • +
    • 如果请求的目标是中国大陆的 IP,那么直接连接,不通过任何代理节点。
    • +
    • 如果请求不符合以上任何规则,那么通过“自动选择”代理节点组进行访问。
    • +
    +
  • +
+

这只是一个简单的示例,实际上 Clash 的配置文件可以做到更多复杂的配置,例如你可以设置多个代理节点组,每个组有不同的选择策略(例如负载均衡,最少连接等),也可以设置更复杂的规则(例如使用正则表达式匹配特定的网址等)。

+

自定义 Clash 配置文件需要一些时间熟悉,但一旦你掌握了它,你就可以根据自己的需求进行任意配置,这是 Clash 的一个非常强大的功能。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Windows\346\262\231\347\233\222\345\256\211\345\205\250\346\265\213\350\257\225\347\232\204\347\273\210\346\236\201\346\214\207\345\215\227/index.html" "b/Windows\346\262\231\347\233\222\345\256\211\345\205\250\346\265\213\350\257\225\347\232\204\347\273\210\346\236\201\346\214\207\345\215\227/index.html" index e69de29bb2..089cd46afb 100644 --- "a/Windows\346\262\231\347\233\222\345\256\211\345\205\250\346\265\213\350\257\225\347\232\204\347\273\210\346\236\201\346\214\207\345\215\227/index.html" +++ "b/Windows\346\262\231\347\233\222\345\256\211\345\205\250\346\265\213\350\257\225\347\232\204\347\273\210\346\236\201\346\214\207\345\215\227/index.html" @@ -0,0 +1,642 @@ + + + + + + + + + + + + Windows沙盒:安全测试的终极指南 🛡️ - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

🌟 Windows沙盒,安全测试的新选择 在不确定软件安全性的情况下,我们往往需要一个安全的环境来测试。Windows沙盒提供了一个完美的解决方案,让你在隔离的环境中运行软件,无需担心主系统受到影响。🔐

+

💡 沙盒的优点,一目了然

    +
  • 原生集成:Windows沙盒是Windows系统的一部分,无需额外软件即可使用。
  • +
  • 无痕清理:关闭沙盒后,所有数据将被清除,保证了系统的干净和安全。
  • +
  • 安全隔离:基于硬件的虚拟化技术确保沙盒与主系统之间的隔离。
  • +
  • 高效性能:智能内存管理和虚拟GPU支持,确保沙盒运行流畅。
  • +
+

🚀 开启沙盒,前提条件

在启动Windows沙盒之前,需要确保你的系统满足以下条件:

+
    +
  • Windows 10专业版、企业版或教育版。
  • +
  • 二代以上的Intel或AMD处理器,支持虚拟化技术。
  • +
  • 至少4GB的RAM,1GB的硬盘空间和两个CPU核心。
  • +
+

🛠️ 如何开启,步骤详解

image-20240414104136243

+

启用沙盒功能:在控制面板中找到“启用或关闭Windows功能”,勾选“Windows沙盒”。

+

image-20240414103924680

+

重启电脑:完成上述操作后,重启电脑以应用更改。

+

运行沙盒:在开始菜单中搜索并运行“Windows Sandbox”。

+

+

📝 使用沙盒,操作简易

在沙盒中,你可以像在普通Windows系统中一样安装和运行软件。测试完成后,只需关闭沙盒窗口,所有更改都会被自动丢弃。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/about.html b/about.html index e69de29bb2..46310e1163 100644 --- a/about.html +++ b/about.html @@ -0,0 +1,632 @@ + + + + + + + + + + + + 关于我 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 关于我 +

关于我

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

关于旺旺

+

我是旺旺,一个热衷于IT技术分享的博主。我热爱探索新技术,尤其对AI领域有着浓厚的兴趣。我始终坚信,分享是学习的一部分,也是我写博客的初衷。我希望通过我的博客,能够帮助到更多对IT技术感兴趣的朋友,一起探索和学习。
如果你对AI感兴趣,欢迎加我微信,我最近建立了一个AI交流群,我们可以一起交流学习。

+
+

个人站点

+ + + +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives.html b/archives.html index e69de29bb2..385a42d48b 100644 --- a/archives.html +++ b/archives.html @@ -0,0 +1,639 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ + + + + + +
+ + + + +

2024

+ + +

2023

+ + +

2022

+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/03/index.html b/archives/2022/03/index.html index e69de29bb2..b474e10046 100644 --- a/archives/2022/03/index.html +++ b/archives/2022/03/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + 文章归档:2022/3 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/05/index.html b/archives/2022/05/index.html index e69de29bb2..14bc3abf2c 100644 --- a/archives/2022/05/index.html +++ b/archives/2022/05/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + 文章归档:2022/5 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/06/index.html b/archives/2022/06/index.html index e69de29bb2..78975837f5 100644 --- a/archives/2022/06/index.html +++ b/archives/2022/06/index.html @@ -0,0 +1,862 @@ + + + + + + + + + + + + 文章归档:2022/6 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/07/index.html b/archives/2022/07/index.html index e69de29bb2..282e75e8e1 100644 --- a/archives/2022/07/index.html +++ b/archives/2022/07/index.html @@ -0,0 +1,793 @@ + + + + + + + + + + + + 文章归档:2022/7 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时间轮算法初探 +

时间轮算法初探

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/08/index.html b/archives/2022/08/index.html index e69de29bb2..26a3683c39 100644 --- a/archives/2022/08/index.html +++ b/archives/2022/08/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 文章归档:2022/8 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html index e69de29bb2..82a18aff27 100644 --- a/archives/2022/09/index.html +++ b/archives/2022/09/index.html @@ -0,0 +1,793 @@ + + + + + + + + + + + + 文章归档:2022/9 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/10/index.html b/archives/2022/10/index.html index e69de29bb2..c6f152566f 100644 --- a/archives/2022/10/index.html +++ b/archives/2022/10/index.html @@ -0,0 +1,862 @@ + + + + + + + + + + + + 文章归档:2022/10 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 文库一键下载 +

文库一键下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/11/index.html b/archives/2022/11/index.html index e69de29bb2..3b27e3bf03 100644 --- a/archives/2022/11/index.html +++ b/archives/2022/11/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + 文章归档:2022/11 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html index e69de29bb2..764f188eb2 100644 --- a/archives/2022/12/index.html +++ b/archives/2022/12/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 文章归档:2022/12 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/index.html b/archives/2022/index.html index e69de29bb2..018aeb532e 100644 --- a/archives/2022/index.html +++ b/archives/2022/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2022 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 文库一键下载 +

文库一键下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/page/2/index.html b/archives/2022/page/2/index.html index e69de29bb2..bfa9970380 100644 --- a/archives/2022/page/2/index.html +++ b/archives/2022/page/2/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2022 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/page/3/index.html b/archives/2022/page/3/index.html index e69de29bb2..f5f7f397bf 100644 --- a/archives/2022/page/3/index.html +++ b/archives/2022/page/3/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2022 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时间轮算法初探 +

时间轮算法初探

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/page/4/index.html b/archives/2022/page/4/index.html index e69de29bb2..e5530d55ba 100644 --- a/archives/2022/page/4/index.html +++ b/archives/2022/page/4/index.html @@ -0,0 +1,864 @@ + + + + + + + + + + + + 文章归档:2022 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/01/index.html b/archives/2023/01/index.html index e69de29bb2..b79da8191e 100644 --- a/archives/2023/01/index.html +++ b/archives/2023/01/index.html @@ -0,0 +1,793 @@ + + + + + + + + + + + + 文章归档:2023/1 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/02/index.html b/archives/2023/02/index.html index e69de29bb2..179e5c8cbd 100644 --- a/archives/2023/02/index.html +++ b/archives/2023/02/index.html @@ -0,0 +1,839 @@ + + + + + + + + + + + + 文章归档:2023/2 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/03/index.html b/archives/2023/03/index.html index e69de29bb2..74b1e99c4c 100644 --- a/archives/2023/03/index.html +++ b/archives/2023/03/index.html @@ -0,0 +1,839 @@ + + + + + + + + + + + + 文章归档:2023/3 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/04/index.html b/archives/2023/04/index.html index e69de29bb2..c5bcf347c4 100644 --- a/archives/2023/04/index.html +++ b/archives/2023/04/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + 文章归档:2023/4 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html index e69de29bb2..a01843c556 100644 --- a/archives/2023/05/index.html +++ b/archives/2023/05/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 文章归档:2023/5 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html index e69de29bb2..6db3f5d013 100644 --- a/archives/2023/06/index.html +++ b/archives/2023/06/index.html @@ -0,0 +1,862 @@ + + + + + + + + + + + + 文章归档:2023/6 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/07/index.html b/archives/2023/07/index.html index e69de29bb2..7b1463ecd8 100644 --- a/archives/2023/07/index.html +++ b/archives/2023/07/index.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + 文章归档:2023/7 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 提问的艺术 +

提问的艺术

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费体验Claude2 +

免费体验Claude2

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html index e69de29bb2..5926e06f81 100644 --- a/archives/2023/09/index.html +++ b/archives/2023/09/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + 文章归档:2023/9 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/11/index.html b/archives/2023/11/index.html index e69de29bb2..dd01502a6c 100644 --- a/archives/2023/11/index.html +++ b/archives/2023/11/index.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + 文章归档:2023/11 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html index e69de29bb2..fe9502c7f6 100644 --- a/archives/2023/12/index.html +++ b/archives/2023/12/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 文章归档:2023/12 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/index.html b/archives/2023/index.html index e69de29bb2..1b33620bd9 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html index e69de29bb2..417c088c76 100644 --- a/archives/2023/page/2/index.html +++ b/archives/2023/page/2/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 提问的艺术 +

提问的艺术

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费体验Claude2 +

免费体验Claude2

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/page/3/index.html b/archives/2023/page/3/index.html index e69de29bb2..27e4af90d4 100644 --- a/archives/2023/page/3/index.html +++ b/archives/2023/page/3/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/page/4/index.html b/archives/2023/page/4/index.html index e69de29bb2..c6f6c1bf54 100644 --- a/archives/2023/page/4/index.html +++ b/archives/2023/page/4/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/page/5/index.html b/archives/2023/page/5/index.html index e69de29bb2..852d3277f9 100644 --- a/archives/2023/page/5/index.html +++ b/archives/2023/page/5/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2023/page/6/index.html b/archives/2023/page/6/index.html index e69de29bb2..da3a75b558 100644 --- a/archives/2023/page/6/index.html +++ b/archives/2023/page/6/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + 文章归档:2023 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/01/index.html b/archives/2024/01/index.html index e69de29bb2..2adbeb942e 100644 --- a/archives/2024/01/index.html +++ b/archives/2024/01/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 文章归档:2024/1 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ssl证书续期 +

ssl证书续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/03/index.html b/archives/2024/03/index.html index e69de29bb2..0f06132308 100644 --- a/archives/2024/03/index.html +++ b/archives/2024/03/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 文章归档:2024/3 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html index e69de29bb2..80d02fd671 100644 --- a/archives/2024/04/index.html +++ b/archives/2024/04/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2024/4 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/04/page/2/index.html b/archives/2024/04/page/2/index.html index e69de29bb2..111f0bb7c8 100644 --- a/archives/2024/04/page/2/index.html +++ b/archives/2024/04/page/2/index.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + 文章归档:2024/4 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/index.html b/archives/2024/index.html index e69de29bb2..c720047cea 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档:2024 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/page/2/index.html b/archives/2024/page/2/index.html index e69de29bb2..dff9c1e30d 100644 --- a/archives/2024/page/2/index.html +++ b/archives/2024/page/2/index.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + 文章归档:2024 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ssl证书续期 +

ssl证书续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/index.html b/archives/index.html index e69de29bb2..50995e4261 100644 --- a/archives/index.html +++ b/archives/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/10/index.html b/archives/page/10/index.html index e69de29bb2..730cb2d143 100644 --- a/archives/page/10/index.html +++ b/archives/page/10/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时间轮算法初探 +

时间轮算法初探

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/11/index.html b/archives/page/11/index.html index e69de29bb2..c2e31f8d37 100644 --- a/archives/page/11/index.html +++ b/archives/page/11/index.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/2/index.html b/archives/page/2/index.html index e69de29bb2..0d6127acc4 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ssl证书续期 +

ssl证书续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/3/index.html b/archives/page/3/index.html index e69de29bb2..9e96557cb0 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 提问的艺术 +

提问的艺术

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费体验Claude2 +

免费体验Claude2

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/4/index.html b/archives/page/4/index.html index e69de29bb2..394bd6f76b 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/5/index.html b/archives/page/5/index.html index e69de29bb2..259b2717aa 100644 --- a/archives/page/5/index.html +++ b/archives/page/5/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/6/index.html b/archives/page/6/index.html index e69de29bb2..491b472596 100644 --- a/archives/page/6/index.html +++ b/archives/page/6/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/7/index.html b/archives/page/7/index.html index e69de29bb2..8ae2fd712c 100644 --- a/archives/page/7/index.html +++ b/archives/page/7/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/8/index.html b/archives/page/8/index.html index e69de29bb2..462a7a7c51 100644 --- a/archives/page/8/index.html +++ b/archives/page/8/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 文库一键下载 +

文库一键下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/9/index.html b/archives/page/9/index.html index e69de29bb2..1f0da99245 100644 --- a/archives/page/9/index.html +++ b/archives/page/9/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 文章归档 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/baidusitemap.xml b/baidusitemap.xml index c179ee3464..e8bda0b240 100644 --- a/baidusitemap.xml +++ b/baidusitemap.xml @@ -80,16 +80,12 @@ https://www.wangwangit.com/SSL%E8%AF%81%E4%B9%A6%E7%BB%AD%E6%9C%9F/ 2024-03-16 - - https://www.wangwangit.com/SpringBoot%E4%B8%80/ - 2024-03-16 - https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Eureka%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/ 2024-03-16 - https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Ribbon%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/ + https://www.wangwangit.com/SpringBoot%E4%B8%80/ 2024-03-16 @@ -97,11 +93,11 @@ 2024-03-16 - https://www.wangwangit.com/SpringSecurity%E4%B8%80/ + https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Ribbon%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/ 2024-03-16 - https://www.wangwangit.com/SpringSecurity%E4%BA%8C/ + https://www.wangwangit.com/SpringSecurity%E4%B8%80/ 2024-03-16 @@ -113,15 +109,15 @@ 2024-03-16 - https://www.wangwangit.com/Tomcat%E5%AD%A6%E4%B9%A0/ + https://www.wangwangit.com/SpringSecurity%E4%BA%8C/ 2024-03-16 - https://www.wangwangit.com/Ubuntu%E5%8F%8C%E7%BD%91%E5%8D%A1%E9%85%8D%E7%BD%AE/ + https://www.wangwangit.com/WSL2%E4%B8%8A%E5%90%AF%E7%94%A8systemd/ 2024-03-16 - https://www.wangwangit.com/WSL2%E4%B8%8A%E5%90%AF%E7%94%A8systemd/ + https://www.wangwangit.com/Ubuntu%E5%8F%8C%E7%BD%91%E5%8D%A1%E9%85%8D%E7%BD%AE/ 2024-03-16 @@ -136,6 +132,10 @@ https://www.wangwangit.com/%E4%B8%80%E9%94%AE%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%87%E6%A1%A3/ 2024-03-16 + + https://www.wangwangit.com/Tomcat%E5%AD%A6%E4%B9%A0/ + 2024-03-16 + https://www.wangwangit.com/%E4%BD%BF%E7%94%A8frp%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/ 2024-03-16 @@ -156,6 +156,14 @@ https://www.wangwangit.com/%E5%BC%80%E6%BA%90%E5%9B%BE%E5%BA%8APicGo/ 2024-03-16 + + https://www.wangwangit.com/%E6%8B%AF%E6%95%91Slack%E4%B8%AD%E7%9A%84Claude/ + 2024-03-16 + + + https://www.wangwangit.com/%E5%BF%85%E5%BA%94ChatGPT%E5%86%85%E6%B5%8B%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + 2024-03-16 + https://www.wangwangit.com/%E6%8F%90%E9%97%AE%E7%9A%84%E8%89%BA%E6%9C%AF/ 2024-03-16 @@ -173,7 +181,7 @@ 2024-03-16 - https://www.wangwangit.com/%E5%BF%85%E5%BA%94ChatGPT%E5%86%85%E6%B5%8B%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/%E7%94%B2%E9%AA%A8%E6%96%87Arm%E7%A1%AC%E7%9B%98%E6%89%A9%E5%AE%B9/ 2024-03-16 @@ -181,11 +189,7 @@ 2024-03-16 - https://www.wangwangit.com/%E6%8B%AF%E6%95%91Slack%E4%B8%AD%E7%9A%84Claude/ - 2024-03-16 - - - https://www.wangwangit.com/%E7%94%B2%E9%AA%A8%E6%96%87Arm%E7%A1%AC%E7%9B%98%E6%89%A9%E5%AE%B9/ + https://www.wangwangit.com/%E7%99%BD%E5%AB%96GPT4/ 2024-03-16 @@ -193,11 +197,11 @@ 2024-03-16 - https://www.wangwangit.com/%E7%99%BD%E5%AB%96GPT4/ + https://www.wangwangit.com/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E9%AB%98%E9%80%9F%E4%B8%8B%E8%BD%BD/ 2024-03-16 - https://www.wangwangit.com/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E9%AB%98%E9%80%9F%E4%B8%8B%E8%BD%BD/ + https://www.wangwangit.com/%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%8E%89%E6%98%BE%E5%8D%A1%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3/ 2024-03-16 @@ -205,11 +209,11 @@ 2024-03-16 - https://www.wangwangit.com/%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%8E%89%E6%98%BE%E5%8D%A1%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3/ + https://www.wangwangit.com/%E7%BE%8E%E5%8C%BAAppstore%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8C/ 2024-03-16 - https://www.wangwangit.com/%E7%BE%8E%E5%8C%BAAppstore%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8C/ + https://www.wangwangit.com/%E8%A7%82%E7%9C%8BNetflix%E6%8C%87%E5%8D%97/ 2024-03-16 @@ -217,27 +221,23 @@ 2024-03-16 - https://www.wangwangit.com/%E8%A7%82%E7%9C%8BNetflix%E6%8C%87%E5%8D%97/ + https://www.wangwangit.com/%E8%AE%A9%E4%BD%A0%E5%BF%AB%E9%80%9F%E6%8E%8C%E6%8F%A1%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%8A%80%E5%B7%A7%E7%9A%84%E7%A5%9E%E5%99%A8/ 2024-03-16 https://www.wangwangit.com/%E8%AF%B7%E6%B1%82%E8%B7%A8%E5%9F%9F%E7%9A%84%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95/ 2024-03-16 - - https://www.wangwangit.com/%E8%AE%A9%E4%BD%A0%E5%BF%AB%E9%80%9F%E6%8E%8C%E6%8F%A1%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%8A%80%E5%B7%A7%E7%9A%84%E7%A5%9E%E5%99%A8/ - 2024-03-16 - https://www.wangwangit.com/%E9%9B%85%E8%99%8EEGADS%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ 2024-03-16 - https://www.wangwangit.com/Azure%20OpenAI%20%E7%94%B3%E8%AF%B7%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/Aria2%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA/ 2024-03-16 - https://www.wangwangit.com/Aria2%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA/ + https://www.wangwangit.com/Azure%20OpenAI%20%E7%94%B3%E8%AF%B7%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B/ 2024-03-16 @@ -257,11 +257,11 @@ 2024-03-16 - https://www.wangwangit.com/MarkDown%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/ + https://www.wangwangit.com/Microsoft365%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ 2024-03-16 - https://www.wangwangit.com/Microsoft365%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/MarkDown%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/ 2024-03-16 @@ -281,15 +281,15 @@ 2024-03-16 - https://www.wangwangit.com/Nginx%E8%87%AA%E5%BB%BAGithub%E5%9B%BE%E5%BA%8A%E5%8A%A0%E9%80%9F/ + https://www.wangwangit.com/OfficeCopilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ 2024-03-16 - https://www.wangwangit.com/OfficeCopilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ + https://www.wangwangit.com/OracleCloud%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ 2024-03-16 - https://www.wangwangit.com/OracleCloud%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/Nginx%E8%87%AA%E5%BB%BAGithub%E5%9B%BE%E5%BA%8A%E5%8A%A0%E9%80%9F/ 2024-03-16 diff --git a/bookmark.html b/bookmark.html index e69de29bb2..a8003fc45e 100644 --- a/bookmark.html +++ b/bookmark.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + 热门网站共享 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+
+

AI工具

热门工具

+

影视

+

音乐

+

阅读

+

开发

+

投稿

如果你有好的网站与大家分享,可以在本页的评论区留言!!!

+
<!-- 必填项 -->
+name="站点名字"
+url="站点地址"
+logo="站点图标"
+word="站点描述"
+
+ +
+
+
+ + + + +
+ +
+ + + +
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/AI/index.html b/categories/AI/index.html index e69de29bb2..37e867d8cb 100644 --- a/categories/AI/index.html +++ b/categories/AI/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:AI - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费体验Claude2 +

免费体验Claude2

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/AI/page/2/index.html b/categories/AI/page/2/index.html index e69de29bb2..e065a46797 100644 --- a/categories/AI/page/2/index.html +++ b/categories/AI/page/2/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:AI - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/AI/page/3/index.html b/categories/AI/page/3/index.html index e69de29bb2..889e58a892 100644 --- a/categories/AI/page/3/index.html +++ b/categories/AI/page/3/index.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + 分类:AI - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\344\273\243\347\220\206/index.html" "b/categories/\344\273\243\347\220\206/index.html" index e69de29bb2..0b92069949 100644 --- "a/categories/\344\273\243\347\220\206/index.html" +++ "b/categories/\344\273\243\347\220\206/index.html" @@ -0,0 +1,747 @@ + + + + + + + + + + + + 分类:代理 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\215\232\345\256\242/index.html" "b/categories/\345\215\232\345\256\242/index.html" index e69de29bb2..d81cb3b133 100644 --- "a/categories/\345\215\232\345\256\242/index.html" +++ "b/categories/\345\215\232\345\256\242/index.html" @@ -0,0 +1,814 @@ + + + + + + + + + + + + 分类:博客 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 提问的艺术 +

提问的艺术

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\267\245\345\205\267/index.html" "b/categories/\345\267\245\345\205\267/index.html" index e69de29bb2..8166dd1b65 100644 --- "a/categories/\345\267\245\345\205\267/index.html" +++ "b/categories/\345\267\245\345\205\267/index.html" @@ -0,0 +1,701 @@ + + + + + + + + + + + + 分类:工具 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\274\200\345\217\221/index.html" "b/categories/\345\274\200\345\217\221/index.html" index e69de29bb2..1ec4f7813f 100644 --- "a/categories/\345\274\200\345\217\221/index.html" +++ "b/categories/\345\274\200\345\217\221/index.html" @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:开发 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ssl证书续期 +

ssl证书续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\274\200\345\217\221/page/2/index.html" "b/categories/\345\274\200\345\217\221/page/2/index.html" index e69de29bb2..e9d53654b0 100644 --- "a/categories/\345\274\200\345\217\221/page/2/index.html" +++ "b/categories/\345\274\200\345\217\221/page/2/index.html" @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:开发 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\274\200\345\217\221/page/3/index.html" "b/categories/\345\274\200\345\217\221/page/3/index.html" index e69de29bb2..3344685411 100644 --- "a/categories/\345\274\200\345\217\221/page/3/index.html" +++ "b/categories/\345\274\200\345\217\221/page/3/index.html" @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:开发 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\274\200\345\217\221/page/4/index.html" "b/categories/\345\274\200\345\217\221/page/4/index.html" index e69de29bb2..2548a5acce 100644 --- "a/categories/\345\274\200\345\217\221/page/4/index.html" +++ "b/categories/\345\274\200\345\217\221/page/4/index.html" @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:开发 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\274\200\345\217\221/page/5/index.html" "b/categories/\345\274\200\345\217\221/page/5/index.html" index e69de29bb2..dc9355f84d 100644 --- "a/categories/\345\274\200\345\217\221/page/5/index.html" +++ "b/categories/\345\274\200\345\217\221/page/5/index.html" @@ -0,0 +1,889 @@ + + + + + + + + + + + + 分类:开发 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时间轮算法初探 +

时间轮算法初探

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\347\276\212\346\257\233/index.html" "b/categories/\347\276\212\346\257\233/index.html" index e69de29bb2..fed8435125 100644 --- "a/categories/\347\276\212\346\257\233/index.html" +++ "b/categories/\347\276\212\346\257\233/index.html" @@ -0,0 +1,793 @@ + + + + + + + + + + + + 分类:羊毛 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\350\264\246\345\217\267/index.html" "b/categories/\350\264\246\345\217\267/index.html" index e69de29bb2..9f07a50a1c 100644 --- "a/categories/\350\264\246\345\217\267/index.html" +++ "b/categories/\350\264\246\345\217\267/index.html" @@ -0,0 +1,701 @@ + + + + + + + + + + + + 分类:账号 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\350\275\257\344\273\266/index.html" "b/categories/\350\275\257\344\273\266/index.html" index e69de29bb2..d182640806 100644 --- "a/categories/\350\275\257\344\273\266/index.html" +++ "b/categories/\350\275\257\344\273\266/index.html" @@ -0,0 +1,885 @@ + + + + + + + + + + + + 分类:软件 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 文库一键下载 +

文库一键下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/docker\347\247\201\346\234\211\344\273\223\345\272\223\346\220\255\345\273\272/index.html" "b/docker\347\247\201\346\234\211\344\273\223\345\272\223\346\220\255\345\273\272/index.html" index e69de29bb2..4594727f81 100644 --- "a/docker\347\247\201\346\234\211\344\273\223\345\272\223\346\220\255\345\273\272/index.html" +++ "b/docker\347\247\201\346\234\211\344\273\223\345\272\223\346\220\255\345\273\272/index.html" @@ -0,0 +1,698 @@ + + + + + + + + + + + + Docker私有仓库搭建 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

私有仓库

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用,本节将介绍如何使用本地仓库。

+

docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 v2.x 版本。

+

安装运行 docker-registry

容器运行
你可以使用官方 registry 镜像来运行。

+
$ docker run -d -p 5000:5000 --restart=always --name registry registry
+
+

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录

+
$ docker run -d \
+    -p 5000:5000 \
+    -v /opt/data/registry:/var/lib/registry \
+    registry
+
+

docker-compose.yml

+
version: '3'
+services:
+  registry:
+    image: registry:latest
+    container_name: registry   
+    ports:
+      - "5000:5000"
+    restart: always
+
+

在私有仓库上传、搜索、下载镜像

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000

+

先在本机查看已有的镜像。

+
$ docker image ls
+REPOSITORY                        TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
+ubuntu                            latest              ba5877dc9bec        6 weeks ago         192.7 MB
+
+

使用 docker tagubuntu:latest 这个镜像标记为 127.0.0.1:5000/ubuntu:latest

+

格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

+
$ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
+$ docker image ls
+REPOSITORY                        TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
+ubuntu                            latest              ba5877dc9bec        6 weeks ago         192.7 MB
+127.0.0.1:5000/ubuntu:latest      latest              ba5877dc9bec        6 weeks ago         192.7 MB
+
+

使用 docker push 上传标记的镜像。

+
$ docker push 127.0.0.1:5000/ubuntu:latest
+The push refers to repository [127.0.0.1:5000/ubuntu]
+373a30c24545: Pushed
+a9148f5200b0: Pushed
+cdd3de0940ab: Pushed
+fc56279bbb33: Pushed
+b38367233d37: Pushed
+2aebd096e0e2: Pushed
+latest: digest: sha256:fe4277621f10b5026266932ddf760f5a756d2facd505a94d2da12f4f52f71f5a size: 1568
+
+

curl 查看仓库中的镜像。

+
$ curl 127.0.0.1:5000/v2/_catalog
+{"repositories":["ubuntu"]}
+
+

这里可以看到 {"repositories":["ubuntu"]},表明镜像已经被成功上传了。

+

先删除已有镜像,再尝试从私有仓库中下载这个镜像。

+
$ docker image rm 127.0.0.1:5000/ubuntu:latest
+
+$ docker pull 127.0.0.1:5000/ubuntu:latest
+Pulling repository 127.0.0.1:5000/ubuntu:latest
+ba5877dc9bec: Download complete
+511136ea3c5a: Download complete
+9bad880da3d2: Download complete
+25f11f5fb0cb: Download complete
+ebc34468f71d: Download complete
+2318d26665ef: Download complete
+
+$ docker image ls
+REPOSITORY                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
+127.0.0.1:5000/ubuntu:latest       latest              ba5877dc9bec        6 weeks ago         192.7 MB
+
+

配置非 https 仓库地址

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

+

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。

+

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

+
{
+  "registry-mirror": [
+    "https://hub-mirror.c.163.com",
+    "https://mirror.baidubce.com"
+  ],
+  "insecure-registries": [
+    "192.168.199.100:5000"
+  ]
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/friend.html b/friend.html index e69de29bb2..1f0d8b9123 100644 --- a/friend.html +++ b/friend.html @@ -0,0 +1,450 @@ + + + + + + + + + + + + 朋友们 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+
+

我的好友

+

大佬们

+

交换友链

如果你想与我交换友链,可以在本页的评论区留言,或者通过邮件、或者提交GitHub Issue的方式。请按照以下格式提供你的站点信息,添加友链成功后我会通过回复评论的邮件通知你!

+
<!-- 必填项 -->
+name="站点名字"
+url="站点地址"
+logo="站点图标或个人头像"
+word="站点描述"
+
+ +
+
+
+ + + + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index e69de29bb2..384caa54d6 100644 --- a/index.html +++ b/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/10/index.html b/page/10/index.html index e69de29bb2..d53ad62076 100644 --- a/page/10/index.html +++ b/page/10/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时间轮算法初探 +

时间轮算法初探

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/11/index.html b/page/11/index.html index e69de29bb2..89f8165603 100644 --- a/page/11/index.html +++ b/page/11/index.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/2/index.html b/page/2/index.html index e69de29bb2..a3fada9f49 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ssl证书续期 +

ssl证书续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/3/index.html b/page/3/index.html index e69de29bb2..0eb8574074 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 提问的艺术 +

提问的艺术

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费体验Claude2 +

免费体验Claude2

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/4/index.html b/page/4/index.html index e69de29bb2..e5a9a5b8a9 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ AI 助手来了!JetBrains的新玩法 +

AI 助手来了!JetBrains的新玩法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/5/index.html b/page/5/index.html index e69de29bb2..e90c807906 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI作画网站一键搭建,让您的创意无限释放 +

AI作画网站一键搭建,让您的创意无限释放

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/6/index.html b/page/6/index.html index e69de29bb2..cebec9bc5c 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/7/index.html b/page/7/index.html index e69de29bb2..0039feb6f2 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/8/index.html b/page/8/index.html index e69de29bb2..2fe93aee32 100644 --- a/page/8/index.html +++ b/page/8/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 文库一键下载 +

文库一键下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/9/index.html b/page/9/index.html index e69de29bb2..8cf7b573fb 100644 --- a/page/9/index.html +++ b/page/9/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/search.xml b/search.xml index a600903b54..9afd91b58b 100644 --- a/search.xml +++ b/search.xml @@ -1030,7 +1030,7 @@ /ChatGPT%E5%85%8D%E8%B4%B9%E5%85%B1%E4%BA%AB%E8%B4%A6%E5%8F%B7/ - 共享chatgpt免费账号,让你轻松体验最先进的聊天机器人。点击进入,立即注册,享受无限制的对话乐趣。

🤖全网价格最低账号: 一只会飞的旺旺 (wangwangit.com) 点击直达访问

ChatGPT账号密码
4brelfbro@yunweiloginmh3.comlin26870
6enmntfv1@yunweiloginmh3.comhe063479
epn_f_6_f@yunweiloginmh3.comhong8259
aa9ugcyre@yunweiloginmh3.comqi354035
p8cwghjw0@yunweiloginmh3.comzhong689
5y3td7igg@yunweiloginmh3.comhe530176
ogvmp4xmf@yunweiloginmh3.comfang5956
oqnt8qkul@yunweiloginmh3.comban30108
3jal9z7bm@yunweiloginmh3.comcheng465
rqbcu71yx@yunweiloginmh3.comai046012
elhqd6h2b@yunweiloginmh3.comqu565909
oqv-fii1j@yunweiloginmh3.comjie26062
kui5k5hms@yunweiloginmh3.comling3202
thlgxss64@yunweiloginmh3.comshe90159
cnc86yljh@yunweiloginmh3.comwu062191
tasfdsnta@yunweiloginmh3.combing8245
si4mmza3x@yunweiloginmh3.comhao46712
n9kkoxavp@yunweiloginmh3.comlei51372
kqfsiu6pe@yunweiloginmh3.comjing7026
]]>
+ 共享chatgpt免费账号,让你轻松体验最先进的聊天机器人。点击进入,立即注册,享受无限制的对话乐趣。

🤖全网价格最低账号: 一只会飞的旺旺 (wangwangit.com) 点击直达访问

ChatGPT账号密码
4brelfbro@yunweiloginmh3.comlin26870
6enmntfv1@yunweiloginmh3.comhe063479
epn_f_6_f@yunweiloginmh3.comhong8259
aa9ugcyre@yunweiloginmh3.comqi354035
p8cwghjw0@yunweiloginmh3.comzhong689
5y3td7igg@yunweiloginmh3.comhe530176
ogvmp4xmf@yunweiloginmh3.comfang5956
oqnt8qkul@yunweiloginmh3.comban30108
3jal9z7bm@yunweiloginmh3.comcheng465
rqbcu71yx@yunweiloginmh3.comai046012
elhqd6h2b@yunweiloginmh3.comqu565909
oqv-fii1j@yunweiloginmh3.comjie26062
kui5k5hms@yunweiloginmh3.comling3202
thlgxss64@yunweiloginmh3.comshe90159
cnc86yljh@yunweiloginmh3.comwu062191
tasfdsnta@yunweiloginmh3.combing8245
si4mmza3x@yunweiloginmh3.comhao46712
n9kkoxavp@yunweiloginmh3.comlei51372
kqfsiu6pe@yunweiloginmh3.comjing7026
]]>
@@ -1731,7 +1731,7 @@ /Hexo%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/ - v2-d4c1239e75c02e8482c22017a6c8d407_1440w

背景

​随着互联网浪潮的翻腾,国内外涌现出越来越多优秀的社交网站让用户分享信息更加便捷。然后,如果你是一个不甘寂寞的程序猿,是否也想要搭建一个属于自己的个人网站,如果你曾经或者现在正有这样的想法,请跟随这篇文章发挥你的Geek精神,让你快速拥有自己的博客网站,写文章记录生活,享受这种从0到1的过程。

准备

  • Github账号
  • 安装Git
  • 安装Node.js

Github账号

​首先我们需要一个Github账号,若是没有的话,可以前往官网注册一个,不懂的话,可以参考Github账号注册

安装Git

什么是Git ?

简单来说Git是开源的分布式版本控制系统,用于敏捷高效地处理项目。我们网站在本地搭建好了,需要使用Git同步到GitHub上。

如果想要了解Git的细节,参看廖雪峰老师的Git教程:Git教程

从Git官网下载:Git - Downloading Package (git-scm.com)

现在的机子基本都是64位的,选择64位的安装包,下载后安装,在命令行里输入git测试是否安装成功,若安装失败,参看其他详细的Git安装教程。

安装成功后,将你的Git与GitHub帐号绑定,鼠标右击打开Git Bash

image-20230102112524450

或者在菜单里搜索Git Bash,设置user.name和user.email配置信息:

git config --global user.name "你的GitHub用户名"git config --global user.email "你的GitHub注册邮箱"

生成ssh密钥文件:

ssh-keygen -t rsa -C "你的GitHub注册邮箱"

然后直接三个回车即可,默认不需要设置密码
然后找到生成的.ssh的文件夹中的id_rsa.pub密钥,将内容全部复制

image-20230102112653519

打开SSH and GPG keys (github.com)页面,新建new SSH Key

image-20230102112741186

Title为标题,任意填即可,将刚刚复制的id_rsa.pub内容粘贴进去,最后点击Add SSH key。
在Git Bash中检测GitHub公钥设置是否成功,输入 ssh git@github.com

image-20230102112805293

如上则说明成功。这里之所以设置GitHub密钥原因是,通过非对称加密的公钥与私钥来完成加密,公钥放置在GitHub上,私钥放置在自己的电脑里。GitHub要求每次推送代码都是合法用户,所以每次推送都需要输入账号密码验证推送用户是否是合法用户,为了省去每次输入密码的步骤,采用了ssh,当你推送的时候,git就会匹配你的私钥跟GitHub上面的公钥是否是配对的,若是匹配就认为你是合法用户,则允许推送。这样可以保证每次的推送都是正确合法的。

安装Node.js

Hexo基于Node.js,Node.js下载地址:Download | Node.js 下载安装包,注意安装Node.js会包含环境变量及npm的安装,安装后,检测Node.js是否安装成功,在命令行中输入 node -v :

image-20230102113340687

检测npm是否安装成功,在命令行中输入npm -v :

image-20230102113355960

到这了,安装Hexo的环境已经全部搭建完成。

创建Github仓库

打开https://github.com/,新建一个项目,如下所示:

image-20230102114820493

然后如下图所示,输入自己的项目名字,后面一定要加.github.io后缀,README初始化也要勾上。名称一定要和你的github名字完全一样,比如你github名字叫abc,那么仓库名字一定要是abc.github.io

image-20230102114957155

然后项目就建成了,点击Settings,向下拉到最后有个GitHub Pages,点击Choose a theme选择一个主题。然后等一会儿,再回到GitHub Pages,会变成下面这样:

image-20230102115118709

点击那个链接,就会出现自己的网页啦,效果如下(我的是已经使用主题的页面,你们的页面可能不一样):

image-20230102115238914

安装Hexo

Hexo就是我们的个人博客网站的框架, 这里需要自己在电脑常里创建一个文件夹,可以命名为Blog,Hexo框架与以后你自己发布的网页都在这个文件夹中。创建好后,进入文件夹中,按住shift键,右击鼠标点击命令行

image-20230102114003386

使用npm命令安装Hexo,输入:

npm install -g hexo-cli 

这个安装时间较长耐心等待,安装完成后,初始化我们的博客,输入:

hexo init blog

注意,这里的命令都是作用在刚刚创建的Blog文件夹中。

为了检测我们的网站雏形,分别按顺序输入以下三条命令:

hexo new test_my_sitehexo ghexo s

这些命令在后面作介绍,完成后,打开浏览器输入地址:

http://localhost:4000

可以看出我们写出第一篇博客

image-20230102122254270

Hexo常用命令

npm install hexo -g #安装Hexo
npm update hexo -g #升级
hexo init #初始化博客

命令简写
hexo n “我的博客” == hexo new “我的博客” #新建文章
hexo g == hexo generate #生成
hexo s == hexo server #启动服务预览
hexo d == hexo deploy #部署

hexo server #Hexo会监视文件变动并自动更新,无须重启服务器
hexo server -s #静态模式
hexo server -p 5000 #更改端口
hexo server -i 192.168.1.1 #自定义 IP
hexo clean #清除缓存,若是网页正常情况下可以忽略这条命令

刚刚的三个命令依次是新建一篇博客文章、生成网页、在本地预览的操作。

连接Github仓库

打开博客根目录下的_config.yml文件,这是博客的配置文件,在这里你可以修改与博客相关的各种信息。

修改最后一行的配置:

deploy:- type: git  repository: https://github.com/wangwangit/wangwangit.github.io.git  branch: master

repository修改为你自己的github项目地址.

绑定域名

现在默认的域名还是xxx.github.io,是不是很没有牌面?想不想也像我一样弄一个专属域名呢,首先你得购买一个域名,xx云都能买,看你个人喜好了。

以我的谷歌域名为例,如下图所示,添加一条解析记录:

image-20230102120424491

然后打开你的github博客项目,点击settings,拉到下面Custom domain处,填上你自己的域名,保存:

image-20230102120521154

这时候你的项目根目录应该会出现一个名为CNAME的文件了。如果没有的话,打开你本地博客/source目录,我的是D:\study\program\blog\source,新建CNAME文件,注意没有后缀。然后在里面写上你的域名,保存。最后运行hexo ghexo d上传到github

image-20230102120559425

image-20230102120617069

备份博客源文件

有时候我们想换一台电脑继续写博客,这时候就可以将博客目录下的所有源文件都上传到github上面。

首先在github博客仓库下新建一个分支hexo,然后git clone到本地,把.git文件夹拿出来,放在博客根目录下。

然后git checkout hexo切换到hexo分支,然后git add .,然后git commit -m "xxx",最后git push origin hexo提交就行了。

替换主题

我使用的主题是这个:博客主题

具体操作可以参考该主题的文档

最后

对于图床使用可以参考我以下文章:

使用腾讯CDN优化github图床访问

使用Nginx自建CDN加速Hexo博客

优秀的开源图床picGo

]]>
+ v2-d4c1239e75c02e8482c22017a6c8d407_1440w

背景

​随着互联网浪潮的翻腾,国内外涌现出越来越多优秀的社交网站让用户分享信息更加便捷。然后,如果你是一个不甘寂寞的程序猿,是否也想要搭建一个属于自己的个人网站,如果你曾经或者现在正有这样的想法,请跟随这篇文章发挥你的Geek精神,让你快速拥有自己的博客网站,写文章记录生活,享受这种从0到1的过程。

准备

  • Github账号
  • 安装Git
  • 安装Node.js

Github账号

​首先我们需要一个Github账号,若是没有的话,可以前往官网注册一个,不懂的话,可以参考Github账号注册

安装Git

什么是Git ?

简单来说Git是开源的分布式版本控制系统,用于敏捷高效地处理项目。我们网站在本地搭建好了,需要使用Git同步到GitHub上。

如果想要了解Git的细节,参看廖雪峰老师的Git教程:Git教程

从Git官网下载:Git - Downloading Package (git-scm.com)

现在的机子基本都是64位的,选择64位的安装包,下载后安装,在命令行里输入git测试是否安装成功,若安装失败,参看其他详细的Git安装教程。

安装成功后,将你的Git与GitHub帐号绑定,鼠标右击打开Git Bash

image-20230102112524450

或者在菜单里搜索Git Bash,设置user.name和user.email配置信息:

git config --global user.name "你的GitHub用户名"git config --global user.email "你的GitHub注册邮箱"

生成ssh密钥文件:

ssh-keygen -t rsa -C "你的GitHub注册邮箱"

然后直接三个回车即可,默认不需要设置密码
然后找到生成的.ssh的文件夹中的id_rsa.pub密钥,将内容全部复制

image-20230102112653519

打开SSH and GPG keys (github.com)页面,新建new SSH Key

image-20230102112741186

Title为标题,任意填即可,将刚刚复制的id_rsa.pub内容粘贴进去,最后点击Add SSH key。
在Git Bash中检测GitHub公钥设置是否成功,输入 ssh git@github.com

image-20230102112805293

如上则说明成功。这里之所以设置GitHub密钥原因是,通过非对称加密的公钥与私钥来完成加密,公钥放置在GitHub上,私钥放置在自己的电脑里。GitHub要求每次推送代码都是合法用户,所以每次推送都需要输入账号密码验证推送用户是否是合法用户,为了省去每次输入密码的步骤,采用了ssh,当你推送的时候,git就会匹配你的私钥跟GitHub上面的公钥是否是配对的,若是匹配就认为你是合法用户,则允许推送。这样可以保证每次的推送都是正确合法的。

安装Node.js

Hexo基于Node.js,Node.js下载地址:Download | Node.js 下载安装包,注意安装Node.js会包含环境变量及npm的安装,安装后,检测Node.js是否安装成功,在命令行中输入 node -v :

image-20230102113340687

检测npm是否安装成功,在命令行中输入npm -v :

image-20230102113355960

到这了,安装Hexo的环境已经全部搭建完成。

创建Github仓库

打开https://github.com/,新建一个项目,如下所示:

image-20230102114820493

然后如下图所示,输入自己的项目名字,后面一定要加.github.io后缀,README初始化也要勾上。名称一定要和你的github名字完全一样,比如你github名字叫abc,那么仓库名字一定要是abc.github.io

image-20230102114957155

然后项目就建成了,点击Settings,向下拉到最后有个GitHub Pages,点击Choose a theme选择一个主题。然后等一会儿,再回到GitHub Pages,会变成下面这样:

image-20230102115118709

点击那个链接,就会出现自己的网页啦,效果如下(我的是已经使用主题的页面,你们的页面可能不一样):

image-20230102115238914

安装Hexo

Hexo就是我们的个人博客网站的框架, 这里需要自己在电脑常里创建一个文件夹,可以命名为Blog,Hexo框架与以后你自己发布的网页都在这个文件夹中。创建好后,进入文件夹中,按住shift键,右击鼠标点击命令行

image-20230102114003386

使用npm命令安装Hexo,输入:

npm install -g hexo-cli 

这个安装时间较长耐心等待,安装完成后,初始化我们的博客,输入:

hexo init blog

注意,这里的命令都是作用在刚刚创建的Blog文件夹中。

为了检测我们的网站雏形,分别按顺序输入以下三条命令:

hexo new test_my_sitehexo ghexo s

这些命令在后面作介绍,完成后,打开浏览器输入地址:

http://localhost:4000

可以看出我们写出第一篇博客

image-20230102122254270

Hexo常用命令

npm install hexo -g #安装Hexo
npm update hexo -g #升级
hexo init #初始化博客

命令简写
hexo n “我的博客” == hexo new “我的博客” #新建文章
hexo g == hexo generate #生成
hexo s == hexo server #启动服务预览
hexo d == hexo deploy #部署

hexo server #Hexo会监视文件变动并自动更新,无须重启服务器
hexo server -s #静态模式
hexo server -p 5000 #更改端口
hexo server -i 192.168.1.1 #自定义 IP
hexo clean #清除缓存,若是网页正常情况下可以忽略这条命令

刚刚的三个命令依次是新建一篇博客文章、生成网页、在本地预览的操作。

连接Github仓库

打开博客根目录下的_config.yml文件,这是博客的配置文件,在这里你可以修改与博客相关的各种信息。

修改最后一行的配置:

deploy:- type: git  repository: https://github.com/wangwangit/wangwangit.github.io.git  branch: master

repository修改为你自己的github项目地址.

绑定域名

现在默认的域名还是xxx.github.io,是不是很没有牌面?想不想也像我一样弄一个专属域名呢,首先你得购买一个域名,xx云都能买,看你个人喜好了。

以我的谷歌域名为例,如下图所示,添加一条解析记录:

image-20230102120424491

然后打开你的github博客项目,点击settings,拉到下面Custom domain处,填上你自己的域名,保存:

image-20230102120521154

这时候你的项目根目录应该会出现一个名为CNAME的文件了。如果没有的话,打开你本地博客/source目录,我的是D:\study\program\blog\source,新建CNAME文件,注意没有后缀。然后在里面写上你的域名,保存。最后运行hexo ghexo d上传到github

image-20230102120559425

image-20230102120617069

备份博客源文件

有时候我们想换一台电脑继续写博客,这时候就可以将博客目录下的所有源文件都上传到github上面。

首先在github博客仓库下新建一个分支hexo,然后git clone到本地,把.git文件夹拿出来,放在博客根目录下。

然后git checkout hexo切换到hexo分支,然后git add .,然后git commit -m "xxx",最后git push origin hexo提交就行了。

替换主题

我使用的主题是这个:博客主题

具体操作可以参考该主题的文档

最后

对于图床使用可以参考我以下文章:

使用腾讯CDN优化github图床访问

使用Nginx自建CDN加速Hexo博客

优秀的开源图床picGo

]]>
@@ -2676,7 +2676,7 @@ /MarkDown%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/ - 引言

自从 2019年左右接触到 Markdown 以来,对它的使用就一发而不可收拾。从最开始使用它在 GitHub Pages 里写博客,到用它编辑项目的 README 文件,再到撰写开发文档,编辑微信公众号文章和邮件内容等等,这期间也见证了它在各类平台和网站上的普及和被原生支持,可以说,Markdown 如今已经渗透了我在技术和网络活动的方方面面,成为了我撰写文本文档的首选。

那么首先我们一起来看一下它的「定义」:

Markdown 是一种轻量级标记语言,创始人为 John Gruber。它允许人们「使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者 HTML)文档」。——维基百科

本文档的目的不在于面面俱到地介绍 Markdown,只是作为我对其理解的笔记整理,希望能同时帮助一些对 Markdown 感兴趣的人快速上手,或是作为一个工具,供对其已经有所了解的人在需要时参考。

接下来请随我一起深入了解这门并不神秘的实用标记语言。

背景

优点

  1. 专注于文字内容;

  2. 纯文本,易读易写,可以方便地纳入版本控制;

  3. 语法简单,没有什么学习成本,能轻松在码字的同时做出美观大方的排版。

使用场景

  • 各类代码托管平台

    主流的代码托管平台,如 GitHub、GitLab、BitBucket、Coding、Gitee 等等,都支持 Markdown 语法,很多开源项目的 README、开发文档、帮助文档、Wiki 等都用 Markdown 写作。

  • 技术社区和写作平台

    StackOverflow、CSDN、掘金、简书、GitBook、有道云笔记

  • 论坛

    V2EX、光谷社区

个人感觉比较遗憾的一点是各平台可能采用不同语言实现的 Markdown 解析引擎,或采用同一解析引擎的不同版本,而且可能有不同程度的定制与扩展,这导致在不同平台上使用 Markdown 写作时体验并不完全一致。不过幸好对于大家公认的一些标准语法,各家都是支持的。

编辑工具

理论上任何一款文本编辑器都能用于编辑 Markdown 文档,它们分别提供了不同程度的语法高亮、预览等功能,以下只是列举其中一部分,选择自己称手的即可。

  • 现代编辑器

    VSCode / Atom

  • 传统编辑器

    Vim / Emacs / Sublime Text / Notepad++

  • IDE 自带编辑器

    IntelliJ IDEA / Android Studio / WebStorm

  • 专用编辑器

    Ulysses / Mou / Typora / Markpad

  • 在线编辑器

    各种支持 Markdown 的网站都提供了在线编辑器

语法

标题

Markdown:

# atx-style 一级标题## 二级标题###### 六级标题Setext-style 一级标题===二级标题---

预览效果:

atx-style 一级标题

二级标题

六级标题

Setext-style 一级标题

二级标题

对应 HTML:

<h1>atx-style 一级标题</h1><h2>二级标题</h2><h6>六级标题</h6><h1>Setext-style 一级标题</h1><h2>二级标题</h2>

段落

中间没有空行的连续不断的几行文字被视为一个段落。

Markdown:

白日依山尽,黄河入海流。(句号后面没空格)欲穷千里目,更上一层楼。  (句号后面有俩空格)

预览效果:

白日依山尽,

黄河入海流。
(句号后面没空格)

欲穷千里目,

更上一层楼。
(句号后面有俩空格)

对应 HTML:

<p>白日依山尽,</p><p>黄河入海流。(句号后面没有空格)</p><p>欲穷千里目,</p><p>  更上一层楼。  <br>  (句号后面有俩空格)</p>

行内格式

对段落或者部分文本的强调效果。

Markdown:

后面俩字**加黑**后面俩字*斜体*

预览效果:

后面俩字加黑

后面俩字斜体

对应 HTML:

<p>  后面俩字  <strong>加黑</strong></p><p>  后面俩字  <em>斜体</em></p>

引用块

Markdown:

> 引用块段落一。>> 引用块段落二。>> 内嵌引用块段落一。>> ### 引用块内的标题

预览效果:

引用块段落一。

引用块段落二。

内嵌引用块段落一。

引用块内的标题

对应 HTML:

<blockquote>  <p>引用块段落一。</p>  <p>引用块段落二。</p>  <blockquote>    <p>内嵌引用块段落一。</p>  </blockquote>  <h3 id="引用块内的标题">引用块内的标题</h3></blockquote>

超链接

Markdown 支持行内式链接和引用式链接。

Markdown:

行内式 [博客](https://mazhuang.org "我的个人博客") 链接,带 title。行内式 [GitHub](https://github.com/mzlogin) 链接。引用式 [博客][1] 链接。引用式 [GitHub][2] 链接,带 title。[1]: https://www.wangwangit.com[2]: https://github.com/wangwangit "我的 GitHub 主页"

预览效果:

行内式 博客 链接,带 title。

行内式 GitHub 链接。

引用式 博客 链接。

引用式 GitHub 链接,带 title。

对应 HTML:

<p>行内式 <a href="https://www.wangwangit.com" title="我的个人博客">博客</a> 链接,带 title。</p><p>行内式 <a href="https://github.com/wangwangit">GitHub</a> 链接。</p><p>引用式 <a href="https://www.wangwangit.com">博客</a> 链接。</p><p>引用式 <a href="https://github.com/wangwangit" title="我的 GitHub 主页">GitHub</a> 链接,带 title。</p>

图片

在超链接的写法前加一个 !,就是引用图片的方法。

Markdown:

![Alt text](https://avatars.githubusercontent.com/u/22621145?v=4 "favicon")

预览效果:

Alt text

对应 HTML:

<img src="https://avatars.githubusercontent.com/u/22621145?v=4" alt="Alt text" title="favicon">

列表

包括有序列表和无序列表。

Markdown:

- 苹果- 葡萄- 榴莲1. 苹果2. 葡萄3. 榴莲

预览效果:

  • 苹果
  • 葡萄
  • 榴莲
  1. 苹果
  2. 葡萄
  3. 榴莲

对应 HTML:

<ul>  <li>苹果</li>  <li>葡萄</li>  <li>榴莲</li></ul><ol>  <li>苹果</li>  <li>葡萄</li>  <li>榴莲</li></ol>

其中无序列表的标记可以使用 +-*,有序列表前的数字可以是乱序的。

代码块

支持行内代码和代码块。

Markdown:

Android 里使用 `TextUtils` 类的 `isEmpty` 方法来判断字符串是否为空。```javaif (TextUtils.isEmpty(text)) {    return null;}```

预览效果:

Android 里使用 TextUtils 类的 isEmpty 方法来判断字符串是否为空。

if (TextUtils.isEmpty(text)) {    return null;}

对应 HTML:

<p>Android 里使用 <code>TextUtils</code> 类的 <code>isEmpty</code> 方法来判断字符串是否为空。</p><div class="highlight highlight-source-java"><pre><span class="pl-k">if</span> (<span class="pl-smi">TextUtils</span><span class="pl-k">.</span>isEmpty(text)) {    <span class="pl-k">return</span> <span class="pl-c1">null</span>;}</pre></div>

上例中的语言标记 java 可选填,可用于在编辑器和渲染后的效果里添加语法高亮。

块式代码也可以对整个代码段缩进四个空格,或一个 Tab 来实现。

水平分割线

使用一个单独行里的三个或以上 *- 来生产一条水平分割线,它们之间可以有空格。

Markdown:

***------ - -

预览效果:




对应 HTML:

<hr /><hr /><hr />

嵌入 HTML

Markdown 标记语言的目的不是替代 HTML,也不是发明一种更便捷的插入 HTML 标签的方式。它对应的只是 HTML 标签的一个很小的子集。

对于那些没有办法用 Markdown 语法来对应的 HTML 标签,直接使用 HTML 来写就好了。

扩展语法

本节的内容是介绍一些受到广泛支持的 Markdown 扩展语法。

表格

Markdown:

| 编号  | 姓名(左) | 年龄(右) | 性别(中) || ----- | :--------  | ---------: | :------:   || 0     | 张三       | 28         | 男         || 1     | 李四       | 29         | 男         |

预览效果:

编号姓名(左)年龄(右)性别(中)
0张三28
1李四29

对应 HTML:

<table>  <thead>    <tr>      <th>编号</th>      <th align="left">姓名(左)</th>      <th align="right">年龄(右)</th>      <th align="center">性别(中)</th>    </tr>  </thead>  <tbody>    <tr>      <td>0</td>      <td align="left">张三</td>      <td align="right">28</td>      <td align="center">男</td>    </tr>    <tr>      <td>1</td>      <td align="left">李四</td>      <td align="right">29</td>      <td align="center">男</td>    </tr>  </tbody></table>

任务列表

在 GitHub / GitLab 里有较好的支持。

Markdown:

- [x] 洗碗- [ ] 清洗油烟机- [ ] 拖地

预览效果:

  • 洗碗
  • 清洗油烟机
  • 拖地

对应 HTML:

<ul class="contains-task-list">  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> 洗碗</li>  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 清洗油烟机</li>  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 拖地</li></ul>

如果是在 GitHub / GitLab 的 Issue 里,会附赠任务完成比例提示效果:

还可以直接在网页上拖动调整顺序,勾选和取消勾选。

删除线

Markdown:

后面三个字打上~~删除线~~。

预览效果:

后面三个字打上删除线

对应 HTML:

<p>后面三个字打上<del>删除线</del>。</p>

自动链接

自动链接扩展,即:当识别到 URL,或用 <> 包括的 URL 时,会自动为其生成 a 标签。

Markdown:

https://github.com<example@gmail.com>

预览效果:

https://github.com

example@gmail.com

对应 HTML:

<p><a href="https://github.com">https://github.com</a></p><p><a href="mailto:example@gmail.com">example@gmail.com</a></p>

emoji

以 GitHub Pages 为例。

Markdown:

:camel: :blush: :smile:

预览效果:

:camel: :blush: :smile:

对应 HTML:

<p>  <img class="emoji" title=":camel:" alt=":camel:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f42b.png" height="20" width="20">  <img class="emoji" title=":blush:" alt=":blush:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f60a.png" height="20" width="20">  <img class="emoji" title=":smile:" alt=":smile:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f604.png" height="20" width="20"></p>

奇技淫巧

脑洞清奇的工程师们还发掘了很多使用 Markdown 的方法,大部分都是引入第三方 JavaScript 插件来实现。对这部分我只做简述,对其中的部分功能比如作图等,还是推荐用专门的可视化工具去做。

画流程图和时序图

有部分网站和编辑器实现了对 Markdown 里流程图和时序图的支持,比如我们使用的项目管理工具 TAPD 的在线编辑器,还有 VSCode + 插件 Markdown Preview Enhanced 等。

以我们使用的项目管理工具 TAPD 的在线编辑器为例:

插入数学公式

仍然以 TAPD 为例:

应该是利用 JavaScript 支持了 LaTeX 公式语法。

用 Markdown 做 PPT

有专门的工具 Marp,另外使用 VSCode + 插件 Markdown Preview Enhanced 也可以实现。

用 Markdown 写微信公众号

可以将公众号素材用 Markdown 编辑好后,贴到在线排版工具以后,复制到公众号编辑器里即可。有多种页面主题和代码主题可选择。

更多

想象力丰富的工程师们还扩展了很多基于 Markdown 的玩法,包括但不限于:

  • 自动生成 / 更新 Table of Contents
  • 流程图 / 时序图
  • 制作幻灯片
  • 集成 PlantUML / GraphViz 的能力
  • 导出 HTML / PDF / 电子书

以上功能基本都可以用 VSCode + 插件 Markdown Preview Enhanced 实现。

参考

]]>
+ 引言

自从 2019年左右接触到 Markdown 以来,对它的使用就一发而不可收拾。从最开始使用它在 GitHub Pages 里写博客,到用它编辑项目的 README 文件,再到撰写开发文档,编辑微信公众号文章和邮件内容等等,这期间也见证了它在各类平台和网站上的普及和被原生支持,可以说,Markdown 如今已经渗透了我在技术和网络活动的方方面面,成为了我撰写文本文档的首选。

那么首先我们一起来看一下它的「定义」:

Markdown 是一种轻量级标记语言,创始人为 John Gruber。它允许人们「使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者 HTML)文档」。——维基百科

本文档的目的不在于面面俱到地介绍 Markdown,只是作为我对其理解的笔记整理,希望能同时帮助一些对 Markdown 感兴趣的人快速上手,或是作为一个工具,供对其已经有所了解的人在需要时参考。

接下来请随我一起深入了解这门并不神秘的实用标记语言。

背景

优点

  1. 专注于文字内容;

  2. 纯文本,易读易写,可以方便地纳入版本控制;

  3. 语法简单,没有什么学习成本,能轻松在码字的同时做出美观大方的排版。

使用场景

  • 各类代码托管平台

    主流的代码托管平台,如 GitHub、GitLab、BitBucket、Coding、Gitee 等等,都支持 Markdown 语法,很多开源项目的 README、开发文档、帮助文档、Wiki 等都用 Markdown 写作。

  • 技术社区和写作平台

    StackOverflow、CSDN、掘金、简书、GitBook、有道云笔记

  • 论坛

    V2EX、光谷社区

个人感觉比较遗憾的一点是各平台可能采用不同语言实现的 Markdown 解析引擎,或采用同一解析引擎的不同版本,而且可能有不同程度的定制与扩展,这导致在不同平台上使用 Markdown 写作时体验并不完全一致。不过幸好对于大家公认的一些标准语法,各家都是支持的。

编辑工具

理论上任何一款文本编辑器都能用于编辑 Markdown 文档,它们分别提供了不同程度的语法高亮、预览等功能,以下只是列举其中一部分,选择自己称手的即可。

  • 现代编辑器

    VSCode / Atom

  • 传统编辑器

    Vim / Emacs / Sublime Text / Notepad++

  • IDE 自带编辑器

    IntelliJ IDEA / Android Studio / WebStorm

  • 专用编辑器

    Ulysses / Mou / Typora / Markpad

  • 在线编辑器

    各种支持 Markdown 的网站都提供了在线编辑器

语法

标题

Markdown:

# atx-style 一级标题## 二级标题###### 六级标题Setext-style 一级标题===二级标题---

预览效果:

atx-style 一级标题

二级标题

六级标题

Setext-style 一级标题

二级标题

对应 HTML:

<h1>atx-style 一级标题</h1><h2>二级标题</h2><h6>六级标题</h6><h1>Setext-style 一级标题</h1><h2>二级标题</h2>

段落

中间没有空行的连续不断的几行文字被视为一个段落。

Markdown:

白日依山尽,黄河入海流。(句号后面没空格)欲穷千里目,更上一层楼。  (句号后面有俩空格)

预览效果:

白日依山尽,

黄河入海流。
(句号后面没空格)

欲穷千里目,

更上一层楼。
(句号后面有俩空格)

对应 HTML:

<p>白日依山尽,</p><p>黄河入海流。(句号后面没有空格)</p><p>欲穷千里目,</p><p>  更上一层楼。  <br>  (句号后面有俩空格)</p>

行内格式

对段落或者部分文本的强调效果。

Markdown:

后面俩字**加黑**后面俩字*斜体*

预览效果:

后面俩字加黑

后面俩字斜体

对应 HTML:

<p>  后面俩字  <strong>加黑</strong></p><p>  后面俩字  <em>斜体</em></p>

引用块

Markdown:

> 引用块段落一。>> 引用块段落二。>> 内嵌引用块段落一。>> ### 引用块内的标题

预览效果:

引用块段落一。

引用块段落二。

内嵌引用块段落一。

引用块内的标题

对应 HTML:

<blockquote>  <p>引用块段落一。</p>  <p>引用块段落二。</p>  <blockquote>    <p>内嵌引用块段落一。</p>  </blockquote>  <h3 id="引用块内的标题">引用块内的标题</h3></blockquote>

超链接

Markdown 支持行内式链接和引用式链接。

Markdown:

行内式 [博客](https://mazhuang.org "我的个人博客") 链接,带 title。行内式 [GitHub](https://github.com/mzlogin) 链接。引用式 [博客][1] 链接。引用式 [GitHub][2] 链接,带 title。[1]: https://www.wangwangit.com[2]: https://github.com/wangwangit "我的 GitHub 主页"

预览效果:

行内式 博客 链接,带 title。

行内式 GitHub 链接。

引用式 博客 链接。

引用式 GitHub 链接,带 title。

对应 HTML:

<p>行内式 <a href="https://www.wangwangit.com" title="我的个人博客">博客</a> 链接,带 title。</p><p>行内式 <a href="https://github.com/wangwangit">GitHub</a> 链接。</p><p>引用式 <a href="https://www.wangwangit.com">博客</a> 链接。</p><p>引用式 <a href="https://github.com/wangwangit" title="我的 GitHub 主页">GitHub</a> 链接,带 title。</p>

图片

在超链接的写法前加一个 !,就是引用图片的方法。

Markdown:

![Alt text](https://avatars.githubusercontent.com/u/22621145?v=4 "favicon")

预览效果:

Alt text

对应 HTML:

<img src="https://avatars.githubusercontent.com/u/22621145?v=4" alt="Alt text" title="favicon">

列表

包括有序列表和无序列表。

Markdown:

- 苹果- 葡萄- 榴莲1. 苹果2. 葡萄3. 榴莲

预览效果:

  • 苹果
  • 葡萄
  • 榴莲
  1. 苹果
  2. 葡萄
  3. 榴莲

对应 HTML:

<ul>  <li>苹果</li>  <li>葡萄</li>  <li>榴莲</li></ul><ol>  <li>苹果</li>  <li>葡萄</li>  <li>榴莲</li></ol>

其中无序列表的标记可以使用 +-*,有序列表前的数字可以是乱序的。

代码块

支持行内代码和代码块。

Markdown:

Android 里使用 `TextUtils` 类的 `isEmpty` 方法来判断字符串是否为空。```javaif (TextUtils.isEmpty(text)) {    return null;}```

预览效果:

Android 里使用 TextUtils 类的 isEmpty 方法来判断字符串是否为空。

if (TextUtils.isEmpty(text)) {    return null;}

对应 HTML:

<p>Android 里使用 <code>TextUtils</code> 类的 <code>isEmpty</code> 方法来判断字符串是否为空。</p><div class="highlight highlight-source-java"><pre><span class="pl-k">if</span> (<span class="pl-smi">TextUtils</span><span class="pl-k">.</span>isEmpty(text)) {    <span class="pl-k">return</span> <span class="pl-c1">null</span>;}</pre></div>

上例中的语言标记 java 可选填,可用于在编辑器和渲染后的效果里添加语法高亮。

块式代码也可以对整个代码段缩进四个空格,或一个 Tab 来实现。

水平分割线

使用一个单独行里的三个或以上 *- 来生产一条水平分割线,它们之间可以有空格。

Markdown:

***------ - -

预览效果:




对应 HTML:

<hr /><hr /><hr />

嵌入 HTML

Markdown 标记语言的目的不是替代 HTML,也不是发明一种更便捷的插入 HTML 标签的方式。它对应的只是 HTML 标签的一个很小的子集。

对于那些没有办法用 Markdown 语法来对应的 HTML 标签,直接使用 HTML 来写就好了。

扩展语法

本节的内容是介绍一些受到广泛支持的 Markdown 扩展语法。

表格

Markdown:

| 编号  | 姓名(左) | 年龄(右) | 性别(中) || ----- | :--------  | ---------: | :------:   || 0     | 张三       | 28         | 男         || 1     | 李四       | 29         | 男         |

预览效果:

编号姓名(左)年龄(右)性别(中)
0张三28
1李四29

对应 HTML:

<table>  <thead>    <tr>      <th>编号</th>      <th align="left">姓名(左)</th>      <th align="right">年龄(右)</th>      <th align="center">性别(中)</th>    </tr>  </thead>  <tbody>    <tr>      <td>0</td>      <td align="left">张三</td>      <td align="right">28</td>      <td align="center">男</td>    </tr>    <tr>      <td>1</td>      <td align="left">李四</td>      <td align="right">29</td>      <td align="center">男</td>    </tr>  </tbody></table>

任务列表

在 GitHub / GitLab 里有较好的支持。

Markdown:

- [x] 洗碗- [ ] 清洗油烟机- [ ] 拖地

预览效果:

  • 洗碗
  • 清洗油烟机
  • 拖地

对应 HTML:

<ul class="contains-task-list">  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> 洗碗</li>  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 清洗油烟机</li>  <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> 拖地</li></ul>

如果是在 GitHub / GitLab 的 Issue 里,会附赠任务完成比例提示效果:

还可以直接在网页上拖动调整顺序,勾选和取消勾选。

删除线

Markdown:

后面三个字打上~~删除线~~。

预览效果:

后面三个字打上删除线

对应 HTML:

<p>后面三个字打上<del>删除线</del>。</p>

自动链接

自动链接扩展,即:当识别到 URL,或用 <> 包括的 URL 时,会自动为其生成 a 标签。

Markdown:

https://github.com<example@gmail.com>

预览效果:

https://github.com

example@gmail.com

对应 HTML:

<p><a href="https://github.com">https://github.com</a></p><p><a href="mailto:example@gmail.com">example@gmail.com</a></p>

emoji

以 GitHub Pages 为例。

Markdown:

:camel: :blush: :smile:

预览效果:

:camel: :blush: :smile:

对应 HTML:

<p>  <img class="emoji" title=":camel:" alt=":camel:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f42b.png" height="20" width="20">  <img class="emoji" title=":blush:" alt=":blush:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f60a.png" height="20" width="20">  <img class="emoji" title=":smile:" alt=":smile:" src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f604.png" height="20" width="20"></p>

奇技淫巧

脑洞清奇的工程师们还发掘了很多使用 Markdown 的方法,大部分都是引入第三方 JavaScript 插件来实现。对这部分我只做简述,对其中的部分功能比如作图等,还是推荐用专门的可视化工具去做。

画流程图和时序图

有部分网站和编辑器实现了对 Markdown 里流程图和时序图的支持,比如我们使用的项目管理工具 TAPD 的在线编辑器,还有 VSCode + 插件 Markdown Preview Enhanced 等。

以我们使用的项目管理工具 TAPD 的在线编辑器为例:

插入数学公式

仍然以 TAPD 为例:

应该是利用 JavaScript 支持了 LaTeX 公式语法。

用 Markdown 做 PPT

有专门的工具 Marp,另外使用 VSCode + 插件 Markdown Preview Enhanced 也可以实现。

用 Markdown 写微信公众号

可以将公众号素材用 Markdown 编辑好后,贴到在线排版工具以后,复制到公众号编辑器里即可。有多种页面主题和代码主题可选择。

更多

想象力丰富的工程师们还扩展了很多基于 Markdown 的玩法,包括但不限于:

  • 自动生成 / 更新 Table of Contents
  • 流程图 / 时序图
  • 制作幻灯片
  • 集成 PlantUML / GraphViz 的能力
  • 导出 HTML / PDF / 电子书

以上功能基本都可以用 VSCode + 插件 Markdown Preview Enhanced 实现。

参考

]]>
diff --git "a/shell\350\204\232\346\234\254\351\227\256\351\242\230/index.html" "b/shell\350\204\232\346\234\254\351\227\256\351\242\230/index.html" index e69de29bb2..4ec0fab46b 100644 --- "a/shell\350\204\232\346\234\254\351\227\256\351\242\230/index.html" +++ "b/shell\350\204\232\346\234\254\351\227\256\351\242\230/index.html" @@ -0,0 +1,634 @@ + + + + + + + + + + + + shell脚本问题整理 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ + + + +
+ +
+
+ +
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

问题

在运行 sh 脚本时提示“/bin/bash^M: bad interpreter: Text file busy”,这个问题通常是由于 Windows 和 Unix/Linux 操作系统之间的换行符差异导致的。

+

解决方法

1.安装dos2unix工具

+
    +
  • Ubuntu/Debian
  • +
+
sudo apt-get update
+sudo apt-get install dos2unix
+
+
    +
  • CentOS/RHEL
  • +
+
sudo yum install dos2unix	
+
+

2.执行命令,转换脚本

+
dos2unix start.sh
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sitemap.xml b/sitemap.xml index a0b2a5fc9d..0bf75f4632 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -200,7 +200,7 @@
- https://www.wangwangit.com/SpringBoot%E4%B8%80/ + https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Eureka%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/ 2024-03-16 @@ -209,7 +209,7 @@ - https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Eureka%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/ + https://www.wangwangit.com/SpringBoot%E4%B8%80/ 2024-03-16 @@ -218,7 +218,7 @@ - https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Ribbon%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/ + https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%9D%A5%E5%8E%86/ 2024-03-16 @@ -227,7 +227,7 @@ - https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%9D%A5%E5%8E%86/ + https://www.wangwangit.com/SpringCloud%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E1%85%B3Ribbon%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/ 2024-03-16 @@ -245,7 +245,7 @@ - https://www.wangwangit.com/SpringSecurity%E4%BA%8C/ + https://www.wangwangit.com/Spring%E5%88%9D%E6%8E%A2/ 2024-03-16 @@ -254,7 +254,7 @@ - https://www.wangwangit.com/Spring%E5%88%9D%E6%8E%A2/ + https://www.wangwangit.com/Spring%E6%BA%90%E7%A0%81%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/ 2024-03-16 @@ -263,7 +263,7 @@ - https://www.wangwangit.com/Spring%E6%BA%90%E7%A0%81%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/ + https://www.wangwangit.com/SpringSecurity%E4%BA%8C/ 2024-03-16 @@ -272,7 +272,7 @@ - https://www.wangwangit.com/Tomcat%E5%AD%A6%E4%B9%A0/ + https://www.wangwangit.com/WSL2%E4%B8%8A%E5%90%AF%E7%94%A8systemd/ 2024-03-16 @@ -290,7 +290,7 @@ - https://www.wangwangit.com/WSL2%E4%B8%8A%E5%90%AF%E7%94%A8systemd/ + https://www.wangwangit.com/Windows-Copilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ 2024-03-16 @@ -299,7 +299,7 @@ - https://www.wangwangit.com/Windows-Copilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ + https://www.wangwangit.com/Windows%E4%B8%8A%E7%9A%84%E4%BB%A3%E7%90%86%E5%AE%A2%E6%88%B7%E7%AB%AFClash/ 2024-03-16 @@ -308,7 +308,7 @@ - https://www.wangwangit.com/Windows%E4%B8%8A%E7%9A%84%E4%BB%A3%E7%90%86%E5%AE%A2%E6%88%B7%E7%AB%AFClash/ + https://www.wangwangit.com/%E4%B8%80%E9%94%AE%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%87%E6%A1%A3/ 2024-03-16 @@ -317,7 +317,7 @@ - https://www.wangwangit.com/%E4%B8%80%E9%94%AE%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%87%E6%A1%A3/ + https://www.wangwangit.com/Tomcat%E5%AD%A6%E4%B9%A0/ 2024-03-16 @@ -371,7 +371,7 @@ - https://www.wangwangit.com/%E6%8F%90%E9%97%AE%E7%9A%84%E8%89%BA%E6%9C%AF/ + https://www.wangwangit.com/%E6%8B%AF%E6%95%91Slack%E4%B8%AD%E7%9A%84Claude/ 2024-03-16 @@ -380,7 +380,7 @@ - https://www.wangwangit.com/%E6%97%B6%E5%BA%8F%E6%80%A7%E6%95%B0%E6%8D%AE%E5%BA%93InfluxDB%E5%88%9D%E6%8E%A2%E4%B8%8E%E4%BC%98%E5%8C%96/ + https://www.wangwangit.com/%E5%BF%85%E5%BA%94ChatGPT%E5%86%85%E6%B5%8B%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ 2024-03-16 @@ -389,7 +389,7 @@ - https://www.wangwangit.com/%E6%97%B6%E9%97%B4%E8%BD%AE%E7%AE%97%E6%B3%95/ + https://www.wangwangit.com/%E6%8F%90%E9%97%AE%E7%9A%84%E8%89%BA%E6%9C%AF/ 2024-03-16 @@ -398,7 +398,7 @@ - https://www.wangwangit.com/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6/ + https://www.wangwangit.com/%E6%97%B6%E5%BA%8F%E6%80%A7%E6%95%B0%E6%8D%AE%E5%BA%93InfluxDB%E5%88%9D%E6%8E%A2%E4%B8%8E%E4%BC%98%E5%8C%96/ 2024-03-16 @@ -407,7 +407,7 @@ - https://www.wangwangit.com/%E5%BF%85%E5%BA%94ChatGPT%E5%86%85%E6%B5%8B%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/%E6%97%B6%E9%97%B4%E8%BD%AE%E7%AE%97%E6%B3%95/ 2024-03-16 @@ -416,7 +416,7 @@ - https://www.wangwangit.com/%E6%B6%88%E6%81%AF%E5%8E%BB%E9%87%8D%E4%B8%8E%E6%81%A2%E5%A4%8D%E5%A4%84%E7%90%86/ + https://www.wangwangit.com/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6/ 2024-03-16 @@ -425,7 +425,7 @@ - https://www.wangwangit.com/%E6%8B%AF%E6%95%91Slack%E4%B8%AD%E7%9A%84Claude/ + https://www.wangwangit.com/%E7%94%B2%E9%AA%A8%E6%96%87Arm%E7%A1%AC%E7%9B%98%E6%89%A9%E5%AE%B9/ 2024-03-16 @@ -434,7 +434,7 @@ - https://www.wangwangit.com/%E7%94%B2%E9%AA%A8%E6%96%87Arm%E7%A1%AC%E7%9B%98%E6%89%A9%E5%AE%B9/ + https://www.wangwangit.com/%E6%B6%88%E6%81%AF%E5%8E%BB%E9%87%8D%E4%B8%8E%E6%81%A2%E5%A4%8D%E5%A4%84%E7%90%86/ 2024-03-16 @@ -443,7 +443,7 @@ - https://www.wangwangit.com/%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E5%8A%A9%E6%89%8B/ + https://www.wangwangit.com/%E7%99%BD%E5%AB%96GPT4/ 2024-03-16 @@ -452,7 +452,7 @@ - https://www.wangwangit.com/%E7%99%BD%E5%AB%96GPT4/ + https://www.wangwangit.com/%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E5%8A%A9%E6%89%8B/ 2024-03-16 @@ -470,7 +470,7 @@ - https://www.wangwangit.com/%E7%A8%8B%E5%BA%8F%E6%98%AF%E6%80%8E%E4%B9%88%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/ + https://www.wangwangit.com/%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%8E%89%E6%98%BE%E5%8D%A1%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3/ 2024-03-16 @@ -479,7 +479,7 @@ - https://www.wangwangit.com/%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%8E%89%E6%98%BE%E5%8D%A1%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3/ + https://www.wangwangit.com/%E7%A8%8B%E5%BA%8F%E6%98%AF%E6%80%8E%E4%B9%88%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/ 2024-03-16 @@ -497,7 +497,7 @@ - https://www.wangwangit.com/%E8%85%BE%E8%AE%AFCDN%E4%BC%98%E5%8C%96github%E5%9B%BE%E5%BA%8A%E8%AE%BF%E9%97%AE/ + https://www.wangwangit.com/%E8%A7%82%E7%9C%8BNetflix%E6%8C%87%E5%8D%97/ 2024-03-16 @@ -506,7 +506,7 @@ - https://www.wangwangit.com/%E8%A7%82%E7%9C%8BNetflix%E6%8C%87%E5%8D%97/ + https://www.wangwangit.com/%E8%85%BE%E8%AE%AFCDN%E4%BC%98%E5%8C%96github%E5%9B%BE%E5%BA%8A%E8%AE%BF%E9%97%AE/ 2024-03-16 @@ -515,7 +515,7 @@ - https://www.wangwangit.com/%E8%AF%B7%E6%B1%82%E8%B7%A8%E5%9F%9F%E7%9A%84%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95/ + https://www.wangwangit.com/%E8%AE%A9%E4%BD%A0%E5%BF%AB%E9%80%9F%E6%8E%8C%E6%8F%A1%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%8A%80%E5%B7%A7%E7%9A%84%E7%A5%9E%E5%99%A8/ 2024-03-16 @@ -524,7 +524,7 @@ - https://www.wangwangit.com/%E8%AE%A9%E4%BD%A0%E5%BF%AB%E9%80%9F%E6%8E%8C%E6%8F%A1%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%8A%80%E5%B7%A7%E7%9A%84%E7%A5%9E%E5%99%A8/ + https://www.wangwangit.com/%E8%AF%B7%E6%B1%82%E8%B7%A8%E5%9F%9F%E7%9A%84%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95/ 2024-03-16 @@ -542,7 +542,7 @@ - https://www.wangwangit.com/Azure%20OpenAI%20%E7%94%B3%E8%AF%B7%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/Aria2%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA/ 2024-03-16 @@ -551,7 +551,7 @@ - https://www.wangwangit.com/Aria2%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA/ + https://www.wangwangit.com/Azure%20OpenAI%20%E7%94%B3%E8%AF%B7%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B/ 2024-03-16 @@ -596,7 +596,7 @@ - https://www.wangwangit.com/MarkDown%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/ + https://www.wangwangit.com/Microsoft365%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ 2024-03-16 @@ -605,7 +605,7 @@ - https://www.wangwangit.com/Microsoft365%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/MarkDown%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/ 2024-03-16 @@ -650,7 +650,7 @@ - https://www.wangwangit.com/Nginx%E8%87%AA%E5%BB%BAGithub%E5%9B%BE%E5%BA%8A%E5%8A%A0%E9%80%9F/ + https://www.wangwangit.com/OfficeCopilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ 2024-03-16 @@ -659,7 +659,7 @@ - https://www.wangwangit.com/OfficeCopilot%E6%8A%A2%E5%85%88%E4%BD%93%E9%AA%8C/ + https://www.wangwangit.com/OracleCloud%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ 2024-03-16 @@ -668,7 +668,7 @@ - https://www.wangwangit.com/OracleCloud%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B/ + https://www.wangwangit.com/Nginx%E8%87%AA%E5%BB%BAGithub%E5%9B%BE%E5%BA%8A%E5%8A%A0%E9%80%9F/ 2024-03-16 @@ -1038,28 +1038,28 @@ - https://www.wangwangit.com/tags/Azure/ + https://www.wangwangit.com/tags/Docker/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Docker/ + https://www.wangwangit.com/tags/Aria2/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Aria2/ + https://www.wangwangit.com/tags/Alist/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Alist/ + https://www.wangwangit.com/tags/Azure/ 2024-04-16 weekly 0.2 @@ -1094,28 +1094,28 @@ - https://www.wangwangit.com/tags/Command/ + https://www.wangwangit.com/tags/Elasticsearch/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Elasticsearch/ + https://www.wangwangit.com/tags/Logstash/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Logstash/ + https://www.wangwangit.com/tags/Kibana/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Kibana/ + https://www.wangwangit.com/tags/Command/ 2024-04-16 weekly 0.2 @@ -1171,56 +1171,56 @@ - https://www.wangwangit.com/tags/Jetbrains/ + https://www.wangwangit.com/tags/Kubernetes/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/InfluxDB/ + https://www.wangwangit.com/tags/Windows/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Kubernetes/ + https://www.wangwangit.com/tags/InfluxDB/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/MarkDown/ + https://www.wangwangit.com/tags/Jetbrains/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Windows/ + https://www.wangwangit.com/tags/Microsoft/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Microsoft/ + https://www.wangwangit.com/tags/MarkDown/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Minio/ + https://www.wangwangit.com/tags/Mybatis/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Mybatis/ + https://www.wangwangit.com/tags/Minio/ 2024-04-16 weekly 0.2 @@ -1269,21 +1269,21 @@ - https://www.wangwangit.com/tags/Ai/ + https://www.wangwangit.com/tags/Navicat/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Reddit/ + https://www.wangwangit.com/tags/Ai/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Navicat/ + https://www.wangwangit.com/tags/Reddit/ 2024-04-16 weekly 0.2 @@ -1296,13 +1296,6 @@ 0.2 - - https://www.wangwangit.com/tags/SpringBoot/ - 2024-04-16 - weekly - 0.2 - - https://www.wangwangit.com/tags/Slack/ 2024-04-16 @@ -1325,28 +1318,28 @@ - https://www.wangwangit.com/tags/Ribbon/ + https://www.wangwangit.com/tags/SpringBoot/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/SpringSecurity/ + https://www.wangwangit.com/tags/Ribbon/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Spring/ + https://www.wangwangit.com/tags/SpringSecurity/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Tomcat/ + https://www.wangwangit.com/tags/Spring/ 2024-04-16 weekly 0.2 @@ -1388,14 +1381,14 @@ - https://www.wangwangit.com/tags/Clash/ + https://www.wangwangit.com/tags/Java/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Java/ + https://www.wangwangit.com/tags/Clash/ 2024-04-16 weekly 0.2 @@ -1415,6 +1408,13 @@ 0.2 + + https://www.wangwangit.com/tags/Tomcat/ + 2024-04-16 + weekly + 0.2 + + https://www.wangwangit.com/tags/news/ 2024-04-16 @@ -1451,21 +1451,21 @@ - https://www.wangwangit.com/tags/Redis/ + https://www.wangwangit.com/tags/Oracle/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/ExpiringMap/ + https://www.wangwangit.com/tags/Redis/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Oracle/ + https://www.wangwangit.com/tags/ExpiringMap/ 2024-04-16 weekly 0.2 @@ -1507,14 +1507,14 @@ - https://www.wangwangit.com/tags/CORS/ + https://www.wangwangit.com/tags/Shell/ 2024-04-16 weekly 0.2 - https://www.wangwangit.com/tags/Shell/ + https://www.wangwangit.com/tags/CORS/ 2024-04-16 weekly 0.2 diff --git a/tags/AI/index.html b/tags/AI/index.html index e69de29bb2..7e12b39d1b 100644 --- a/tags/AI/index.html +++ b/tags/AI/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Ai - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Alist/index.html b/tags/Alist/index.html index e69de29bb2..4a347d911c 100644 --- a/tags/Alist/index.html +++ b/tags/Alist/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Alist - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Apple/index.html b/tags/Apple/index.html index e69de29bb2..79c6b0e0c9 100644 --- a/tags/Apple/index.html +++ b/tags/Apple/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Apple - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Aria2/index.html b/tags/Aria2/index.html index e69de29bb2..98854e8477 100644 --- a/tags/Aria2/index.html +++ b/tags/Aria2/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Aria2 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Azure/index.html b/tags/Azure/index.html index e69de29bb2..4a92ea6aa5 100644 --- a/tags/Azure/index.html +++ b/tags/Azure/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Azure - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Azure OpenAI申请与使用详细教程 +

Azure OpenAI申请与使用详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Baidu/index.html b/tags/Baidu/index.html index e69de29bb2..e503c520eb 100644 --- a/tags/Baidu/index.html +++ b/tags/Baidu/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Baidu - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Bing/index.html b/tags/Bing/index.html index e69de29bb2..86c0cc7d65 100644 --- a/tags/Bing/index.html +++ b/tags/Bing/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Bing - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/CDN/index.html b/tags/CDN/index.html index e69de29bb2..7e00525f88 100644 --- a/tags/CDN/index.html +++ b/tags/CDN/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + 标签:CDN - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/CORS/index.html b/tags/CORS/index.html index e69de29bb2..708940e777 100644 --- a/tags/CORS/index.html +++ b/tags/CORS/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:CORS - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Chat2DB/index.html b/tags/Chat2DB/index.html index e69de29bb2..8da0db5ddd 100644 --- a/tags/Chat2DB/index.html +++ b/tags/Chat2DB/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Chat2DB - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ AI时代的数据库客户端神器-Chat2DB +

AI时代的数据库客户端神器-Chat2DB

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Chatgpt/index.html b/tags/Chatgpt/index.html index e69de29bb2..75f809fda5 100644 --- a/tags/Chatgpt/index.html +++ b/tags/Chatgpt/index.html @@ -0,0 +1,889 @@ + + + + + + + + + + + + 标签:Chatgpt - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 +

AI模型大PK!免费测试GPT-4等36款顶级聊天机器人

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT部署教程(新)及常见问题 +

ChatGPT部署教程(新)及常见问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT免费共享账号 +

ChatGPT免费共享账号

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT 在线体验网站 +

ChatGPT 在线体验网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Chatgpt/page/2/index.html b/tags/Chatgpt/page/2/index.html index e69de29bb2..c35413160a 100644 --- a/tags/Chatgpt/page/2/index.html +++ b/tags/Chatgpt/page/2/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + 标签:Chatgpt - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Clash/index.html b/tags/Clash/index.html index e69de29bb2..57168eeea0 100644 --- a/tags/Clash/index.html +++ b/tags/Clash/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Clash - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 深入解析Clash:功能、使用和配置 +

深入解析Clash:功能、使用和配置

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Claude/index.html b/tags/Claude/index.html index e69de29bb2..6da5a130bf 100644 --- a/tags/Claude/index.html +++ b/tags/Claude/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Claude - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Claude免排队使用教程 +

Claude免排队使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Claude3/index.html b/tags/Claude3/index.html index e69de29bb2..6d11494642 100644 --- a/tags/Claude3/index.html +++ b/tags/Claude3/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Claude3 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Claude3十种访问方式 +

Claude3十种访问方式

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Cloudflare/index.html b/tags/Cloudflare/index.html index e69de29bb2..d70ec7e171 100644 --- a/tags/Cloudflare/index.html +++ b/tags/Cloudflare/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Cloudflare - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Command/index.html b/tags/Command/index.html index e69de29bb2..d18fa2767e 100644 --- a/tags/Command/index.html +++ b/tags/Command/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Command - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Command R+开源AI的未来 +

Command R+开源AI的未来

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Copilot/index.html b/tags/Copilot/index.html index e69de29bb2..e85afddea3 100644 --- a/tags/Copilot/index.html +++ b/tags/Copilot/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Copilot - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Docker/index.html b/tags/Docker/index.html index e69de29bb2..8068e57d2c 100644 --- a/tags/Docker/index.html +++ b/tags/Docker/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + 标签:Docker - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Aria2配合Alist实现百度云盘高速下载 +

Aria2配合Alist实现百度云盘高速下载

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Docker私有仓库搭建 +

Docker私有仓库搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Domain/index.html b/tags/Domain/index.html index e69de29bb2..3f15532953 100644 --- a/tags/Domain/index.html +++ b/tags/Domain/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Domain - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/EGADS/index.html b/tags/EGADS/index.html index e69de29bb2..63e5176509 100644 --- a/tags/EGADS/index.html +++ b/tags/EGADS/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:EGADS - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Easypoi/index.html b/tags/Easypoi/index.html index e69de29bb2..93217b5acc 100644 --- a/tags/Easypoi/index.html +++ b/tags/Easypoi/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Easypoi - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Easypoi导入导出Excel +

Easypoi导入导出Excel

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Edge/index.html b/tags/Edge/index.html index e69de29bb2..fe0e3151e9 100644 --- a/tags/Edge/index.html +++ b/tags/Edge/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + 标签:Edge - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 必应Image Creator使用教程 +

必应Image Creator使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ChatGPT使用汇总 +

ChatGPT使用汇总

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Elasticsearch/index.html b/tags/Elasticsearch/index.html index e69de29bb2..90c8b7668b 100644 --- a/tags/Elasticsearch/index.html +++ b/tags/Elasticsearch/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Elasticsearch - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Elasticsearch常用命令 +

Elasticsearch常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Eureka/index.html b/tags/Eureka/index.html index e69de29bb2..3879e97887 100644 --- a/tags/Eureka/index.html +++ b/tags/Eureka/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Eureka - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/ExpiringMap/index.html b/tags/ExpiringMap/index.html index e69de29bb2..ee769fd1ab 100644 --- a/tags/ExpiringMap/index.html +++ b/tags/ExpiringMap/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:ExpiringMap - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Git/index.html b/tags/Git/index.html index e69de29bb2..9cc67abcb5 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + 标签:Git - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Github/index.html b/tags/Github/index.html index e69de29bb2..99f33c9db0 100644 --- a/tags/Github/index.html +++ b/tags/Github/index.html @@ -0,0 +1,816 @@ + + + + + + + + + + + + 标签:Github - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅二 +

Git奇幻之旅二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git常用命令 +

Git常用命令

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git奇幻之旅一 +

Git奇幻之旅一

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Git教程从入门到入土 +

Git教程从入门到入土

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Google/index.html b/tags/Google/index.html index e69de29bb2..218924f930 100644 --- a/tags/Google/index.html +++ b/tags/Google/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Google - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Hexo/index.html b/tags/Hexo/index.html index e69de29bb2..0afaf47e1e 100644 --- a/tags/Hexo/index.html +++ b/tags/Hexo/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + 标签:Hexo - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 最新Chatgpt微信机器人搭建教程 +

最新Chatgpt微信机器人搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Github+Hexo搭建个人网站详细教程 +

Github+Hexo搭建个人网站详细教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Hello World +

Hello World

+
+ +
+ +
+
置顶
+
+ +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/IDEA/index.html b/tags/IDEA/index.html index e69de29bb2..0a0655bebe 100644 --- a/tags/IDEA/index.html +++ b/tags/IDEA/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:IDEA - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ IDEA优化策略 +

IDEA优化策略

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/InfluxDB/index.html b/tags/InfluxDB/index.html index e69de29bb2..8102235296 100644 --- a/tags/InfluxDB/index.html +++ b/tags/InfluxDB/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:InfluxDB - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/JSON/index.html b/tags/JSON/index.html index e69de29bb2..f3f1aca1e3 100644 --- a/tags/JSON/index.html +++ b/tags/JSON/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:JSON - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Java/index.html b/tags/Java/index.html index e69de29bb2..11bbbe4682 100644 --- a/tags/Java/index.html +++ b/tags/Java/index.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + 标签:Java - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ shell脚本问题整理 +

shell脚本问题整理

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 代码整洁之路 +

代码整洁之路

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/JetBrains/index.html b/tags/JetBrains/index.html index e69de29bb2..0809e93f7e 100644 --- a/tags/JetBrains/index.html +++ b/tags/JetBrains/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Jetbrains - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Jetbrains全系激活教程 +

Jetbrains全系激活教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Kibana/index.html b/tags/Kibana/index.html index e69de29bb2..122660669c 100644 --- a/tags/Kibana/index.html +++ b/tags/Kibana/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Kibana - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Kubernetes/index.html b/tags/Kubernetes/index.html index e69de29bb2..800e933480 100644 --- a/tags/Kubernetes/index.html +++ b/tags/Kubernetes/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Kubernetes - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 基于Ubuntu20.04的K8s搭建教程 +

基于Ubuntu20.04的K8s搭建教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Linux/index.html b/tags/Linux/index.html index e69de29bb2..f840d6defd 100644 --- a/tags/Linux/index.html +++ b/tags/Linux/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Linux - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 服务器常用脚本 +

服务器常用脚本

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Logstash/index.html b/tags/Logstash/index.html index e69de29bb2..20e151150a 100644 --- a/tags/Logstash/index.html +++ b/tags/Logstash/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Logstash - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ ELK集群部署接入教程 +

ELK集群部署接入教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/MarkDown/index.html b/tags/MarkDown/index.html index e69de29bb2..60732aa0a9 100644 --- a/tags/MarkDown/index.html +++ b/tags/MarkDown/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:MarkDown - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ MarkDown的奇技淫巧 +

MarkDown的奇技淫巧

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Microsoft/index.html b/tags/Microsoft/index.html index e69de29bb2..34861e774c 100644 --- a/tags/Microsoft/index.html +++ b/tags/Microsoft/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Microsoft - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Microsoft365账号申请教程 +

Microsoft365账号申请教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Minio/index.html b/tags/Minio/index.html index e69de29bb2..5ab2163ea1 100644 --- a/tags/Minio/index.html +++ b/tags/Minio/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Minio - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Minio文件存储 +

Minio文件存储

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Mqtt/index.html b/tags/Mqtt/index.html index e69de29bb2..3bfb19adf5 100644 --- a/tags/Mqtt/index.html +++ b/tags/Mqtt/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Mqtt - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/MySQL/index.html b/tags/MySQL/index.html index e69de29bb2..7ab28a2ecd 100644 --- a/tags/MySQL/index.html +++ b/tags/MySQL/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:MySQL - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Mybatis/index.html b/tags/Mybatis/index.html index e69de29bb2..139903b4f0 100644 --- a/tags/Mybatis/index.html +++ b/tags/Mybatis/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Mybatis - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ MyBatis学习笔记二 +

MyBatis学习笔记二

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ MyBatis学习笔记一 +

MyBatis学习笔记一

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Navicat/index.html b/tags/Navicat/index.html index e69de29bb2..81d59efe70 100644 --- a/tags/Navicat/index.html +++ b/tags/Navicat/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Navicat - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Navicat Premium连接SQLServer驱动缺失问题 +

Navicat Premium连接SQLServer驱动缺失问题

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Netflix/index.html b/tags/Netflix/index.html index e69de29bb2..abe83e759c 100644 --- a/tags/Netflix/index.html +++ b/tags/Netflix/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Netflix - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Netplan/index.html b/tags/Netplan/index.html index e69de29bb2..a185cf3fac 100644 --- a/tags/Netplan/index.html +++ b/tags/Netplan/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Netplan - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Nginx/index.html b/tags/Nginx/index.html index e69de29bb2..cab8d5b02f 100644 --- a/tags/Nginx/index.html +++ b/tags/Nginx/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + 标签:Nginx - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 利用闲置服务器搭建一个专属图床加速器 +

利用闲置服务器搭建一个专属图床加速器

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 使用Nginx自建CDN加速Hexo博客 +

使用Nginx自建CDN加速Hexo博客

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Nginx使用教程 +

Nginx使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Office/index.html b/tags/Office/index.html index e69de29bb2..fc89af2929 100644 --- a/tags/Office/index.html +++ b/tags/Office/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Office - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 抢先体验Office Copilot +

抢先体验Office Copilot

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Oracle/index.html b/tags/Oracle/index.html index e69de29bb2..2220de263f 100644 --- a/tags/Oracle/index.html +++ b/tags/Oracle/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Oracle - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/OracleCloud/index.html b/tags/OracleCloud/index.html index e69de29bb2..3432395244 100644 --- a/tags/OracleCloud/index.html +++ b/tags/OracleCloud/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:OracleCloud - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/PicGo/index.html b/tags/PicGo/index.html index e69de29bb2..6b33822c65 100644 --- a/tags/PicGo/index.html +++ b/tags/PicGo/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:PicGo - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/RabbitMQ/index.html b/tags/RabbitMQ/index.html index e69de29bb2..6007f2f014 100644 --- a/tags/RabbitMQ/index.html +++ b/tags/RabbitMQ/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:RabbitMQ - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ RabbitMQ配置Mqtt协议 +

RabbitMQ配置Mqtt协议

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Reddit/index.html b/tags/Reddit/index.html index e69de29bb2..7070cfe111 100644 --- a/tags/Reddit/index.html +++ b/tags/Reddit/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Reddit - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Reddit-免费的AI教育宝库 +

Reddit-免费的AI教育宝库

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Redis/index.html b/tags/Redis/index.html index e69de29bb2..d26258c76f 100644 --- a/tags/Redis/index.html +++ b/tags/Redis/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Redis - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Ribbon/index.html b/tags/Ribbon/index.html index e69de29bb2..f139370834 100644 --- a/tags/Ribbon/index.html +++ b/tags/Ribbon/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Ribbon - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/SciHub/index.html b/tags/SciHub/index.html index e69de29bb2..ea1af3489a 100644 --- a/tags/SciHub/index.html +++ b/tags/SciHub/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:SciHub - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Screw/index.html b/tags/Screw/index.html index e69de29bb2..45bf53a045 100644 --- a/tags/Screw/index.html +++ b/tags/Screw/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Screw - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Shell/index.html b/tags/Shell/index.html index e69de29bb2..f75745a1cb 100644 --- a/tags/Shell/index.html +++ b/tags/Shell/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Shell - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Slack/index.html b/tags/Slack/index.html index e69de29bb2..733b9812c4 100644 --- a/tags/Slack/index.html +++ b/tags/Slack/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Slack - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Slack插件推荐 +

Slack插件推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Spring/index.html b/tags/Spring/index.html index e69de29bb2..55ed016b5e 100644 --- a/tags/Spring/index.html +++ b/tags/Spring/index.html @@ -0,0 +1,793 @@ + + + + + + + + + + + + 标签:Spring - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 微服务是什么? +

微服务是什么?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring源码环境搭建 +

Spring源码环境搭建

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Spring初探-手写IOC与AOP +

Spring初探-手写IOC与AOP

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/SpringBoot/index.html b/tags/SpringBoot/index.html index e69de29bb2..84bddfd919 100644 --- a/tags/SpringBoot/index.html +++ b/tags/SpringBoot/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:SpringBoot - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringBoot源码剖析 +

SpringBoot源码剖析

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/SpringCloud/index.html b/tags/SpringCloud/index.html index e69de29bb2..0c5f02fce9 100644 --- a/tags/SpringCloud/index.html +++ b/tags/SpringCloud/index.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + 标签:SpringCloud - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳRibbon负载均衡 +

SpringCloud的前世今生ᅳRibbon负载均衡

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳEureka服务注册中心 +

SpringCloud的前世今生ᅳEureka服务注册中心

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringCloud的前世今生ᅳ微服务的来历 +

SpringCloud的前世今生ᅳ微服务的来历

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WebSocket消息太大导致无法发送 +

WebSocket消息太大导致无法发送

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/SpringSecurity/index.html b/tags/SpringSecurity/index.html index e69de29bb2..50364ec05b 100644 --- a/tags/SpringSecurity/index.html +++ b/tags/SpringSecurity/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:SpringSecurity - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ SpringSecurity授权与源码分析 +

SpringSecurity授权与源码分析

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ SpringSecurity入门与认证 +

SpringSecurity入门与认证

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Tamperonkey/index.html b/tags/Tamperonkey/index.html index e69de29bb2..4daee7f950 100644 --- a/tags/Tamperonkey/index.html +++ b/tags/Tamperonkey/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Tamperonkey - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Tomcat/index.html b/tags/Tomcat/index.html index e69de29bb2..bca6029f71 100644 --- a/tags/Tomcat/index.html +++ b/tags/Tomcat/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Tomcat - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Tomcat学习笔记 +

Tomcat学习笔记

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Ubuntu/index.html b/tags/Ubuntu/index.html index e69de29bb2..1db80f246f 100644 --- a/tags/Ubuntu/index.html +++ b/tags/Ubuntu/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Ubuntu - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Ubuntu20使用Netplan配置双网卡服务器 +

Ubuntu20使用Netplan配置双网卡服务器

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Vps/index.html b/tags/Vps/index.html index e69de29bb2..a01b39dea3 100644 --- a/tags/Vps/index.html +++ b/tags/Vps/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:Vps - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Google服务器免费续期 +

Google服务器免费续期

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 2022最新申请OracleCloud教程 +

2022最新申请OracleCloud教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Warp/index.html b/tags/Warp/index.html index e69de29bb2..63bf81a27b 100644 --- a/tags/Warp/index.html +++ b/tags/Warp/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:Warp - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ WARP使用教程 +

WARP使用教程

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/Windows/index.html b/tags/Windows/index.html index e69de29bb2..ad105d56f3 100644 --- a/tags/Windows/index.html +++ b/tags/Windows/index.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + 标签:Windows - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Kasm Workspaces:云端工作的革命 🌟 +

Kasm Workspaces:云端工作的革命 🌟

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows沙盒:安全测试的终极指南 🛡️ +

Windows沙盒:安全测试的终极指南 🛡️

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ WSL2上启用官方systemd +

WSL2上启用官方systemd

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ Windows Copilot抢先体验 +

Windows Copilot抢先体验

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/ZLibrary/index.html b/tags/ZLibrary/index.html index e69de29bb2..14088ba9c6 100644 --- a/tags/ZLibrary/index.html +++ b/tags/ZLibrary/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:ZLibrary - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/frp/index.html b/tags/frp/index.html index e69de29bb2..dfbdb3c506 100644 --- a/tags/frp/index.html +++ b/tags/frp/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + 标签:frp - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/news/index.html b/tags/news/index.html index e69de29bb2..6d88adbb01 100644 --- a/tags/news/index.html +++ b/tags/news/index.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + 标签:news - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+ +
+
+ + +
+ github +
+ +
+
+ +
+ + +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ +
+ + + +
+ + + +
+
+ +
+ + +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ +
+ + + +
+ + + +
+
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\270\200\351\224\256\347\224\237\346\210\220\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243/index.html" "b/\344\270\200\351\224\256\347\224\237\346\210\220\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243/index.html" index e69de29bb2..8085cf0404 100644 --- "a/\344\270\200\351\224\256\347\224\237\346\210\220\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243/index.html" +++ "b/\344\270\200\351\224\256\347\224\237\346\210\220\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243/index.html" @@ -0,0 +1,790 @@ + + + + + + + + + + + + 一键生成数据库文档-Screw - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 一键生成数据库文档-Screw +

一键生成数据库文档-Screw

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

简介

在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中,很是繁琐、如果忘记一次维护、就会给以后工作造成很多困扰、无形中制造了很多坑留给自己和后人,于是需要一个插件工具screw来维护。

+

特点

    +
  • 简洁、轻量、设计良好
  • +
  • 多数据库支持
  • +
  • 多种格式文档
  • +
  • 灵活扩展
  • +
  • 支持自定义模板
  • +
+

数据库支持

    +
  • MySQL
  • +
  • MariaDB
  • +
  • TIDB
  • +
  • Oracle
  • +
  • SqlServer
  • +
  • PostgreSQL
  • +
  • Cache DB(2016)
  • +
  • H2 (开发中)
  • +
  • DB2 (开发中)
  • +
  • HSQL (开发中)
  • +
  • SQLite(开发中)
  • +
  • 瀚高(开发中)
  • +
  • 达梦 (开发中)
  • +
  • 虚谷 (开发中)
  • +
  • 人大金仓(开发中)
  • +
+

文档生成支持

    +
  • html
  • +
  • word
  • +
  • markdown
  • +
+

文档截图

image-20220926094907300

+

使用方式

普通方式

    +
  • 引入依赖
  • +
+
<dependency>
+    <groupId>cn.smallbun.screw</groupId>
+    <artifactId>screw-core</artifactId>
+    <version>${lastVersion}</version>
+ </dependency>
+
+
    +
  • 编写代码
  • +
+
/**
+ * 文档生成
+ */
+void documentGeneration() {
+   //数据源
+   HikariConfig hikariConfig = new HikariConfig();
+   hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
+   hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/database");
+   hikariConfig.setUsername("root");
+   hikariConfig.setPassword("password");
+   //设置可以获取tables remarks信息
+   hikariConfig.addDataSourceProperty("useInformationSchema", "true");
+   hikariConfig.setMinimumIdle(2);
+   hikariConfig.setMaximumPoolSize(5);
+   DataSource dataSource = new HikariDataSource(hikariConfig);
+   //生成配置
+   EngineConfig engineConfig = EngineConfig.builder()
+         //生成文件路径
+         .fileOutputDir(fileOutputDir)
+         //打开目录
+         .openOutputDir(true)
+         //文件类型
+         .fileType(EngineFileType.HTML)
+         //生成模板实现
+         .produceType(EngineTemplateType.freemarker)
+         //自定义文件名称
+         .fileName("自定义文件名称").build();
+
+   //忽略表
+   ArrayList<String> ignoreTableName = new ArrayList<>();
+   ignoreTableName.add("test_user");
+   ignoreTableName.add("test_group");
+   //忽略表前缀
+   ArrayList<String> ignorePrefix = new ArrayList<>();
+   ignorePrefix.add("test_");
+   //忽略表后缀    
+   ArrayList<String> ignoreSuffix = new ArrayList<>();
+   ignoreSuffix.add("_test");
+   ProcessConfig processConfig = ProcessConfig.builder()
+         //指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置	
+         //根据名称指定表生成
+         .designatedTableName(new ArrayList<>())
+         //根据表前缀生成
+         .designatedTablePrefix(new ArrayList<>())
+         //根据表后缀生成	
+         .designatedTableSuffix(new ArrayList<>())
+         //忽略表名
+         .ignoreTableName(ignoreTableName)
+         //忽略表前缀
+         .ignoreTablePrefix(ignorePrefix)
+         //忽略表后缀
+         .ignoreTableSuffix(ignoreSuffix).build();
+   //配置
+   Configuration config = Configuration.builder()
+         //版本
+         .version("1.0.0")
+         //描述
+         .description("数据库设计文档生成")
+         //数据源
+         .dataSource(dataSource)
+         //生成配置
+         .engineConfig(engineConfig)
+         //生成配置
+         .produceConfig(processConfig)
+         .build();
+   //执行生成
+   new DocumentationExecute(config).execute();
+}
+
+

Maven插件

<build>
+    <plugins>
+        <plugin>
+            <groupId>cn.smallbun.screw</groupId>
+            <artifactId>screw-maven-plugin</artifactId>
+            <version>${lastVersion}</version>
+            <dependencies>
+                <!-- HikariCP -->
+                <dependency>
+                    <groupId>com.zaxxer</groupId>
+                    <artifactId>HikariCP</artifactId>
+                    <version>3.4.5</version>
+                </dependency>
+                <!--mysql driver-->
+                <dependency>
+                    <groupId>mysql</groupId>
+                    <artifactId>mysql-connector-java</artifactId>
+                    <version>8.0.20</version>
+                </dependency>
+            </dependencies>
+            <configuration>
+                <!--username-->
+                <username>root</username>
+                <!--password-->
+                <password>password</password>
+                <!--driver-->
+                <driverClassName>com.mysql.cj.jdbc.Driver</driverClassName>
+                <!--jdbc url-->
+                <jdbcUrl>jdbc:mysql://127.0.0.1:3306/xxxx</jdbcUrl>
+                <!--生成文件类型-->
+                <fileType>HTML</fileType>
+                <!--打开文件输出目录-->
+                <openOutputDir>false</openOutputDir>
+                <!--生成模板-->
+                <produceType>freemarker</produceType>
+                <!--文档名称 为空时:将采用[数据库名称-描述-版本号]作为文档名称-->
+                <fileName>测试文档名称</fileName>
+                <!--描述-->
+                <description>数据库文档生成</description>
+                <!--版本-->
+                <version>${project.version}</version>
+                <!--标题-->
+                <title>数据库文档</title>
+            </configuration>
+            <executions>
+                <execution>
+                    <phase>compile</phase>
+                    <goals>
+                        <goal>run</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+    </plugins>
+</build>
+
+

官方开源地址

https://gitee.com/leshalv/screw

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\270\264\346\227\266\351\202\256\347\256\261\345\222\214\346\216\245\347\240\201\345\271\263\345\217\260/index.html" "b/\344\270\264\346\227\266\351\202\256\347\256\261\345\222\214\346\216\245\347\240\201\345\271\263\345\217\260/index.html" index e69de29bb2..600874f588 100644 --- "a/\344\270\264\346\227\266\351\202\256\347\256\261\345\222\214\346\216\245\347\240\201\345\271\263\345\217\260/index.html" +++ "b/\344\270\264\346\227\266\351\202\256\347\256\261\345\222\214\346\216\245\347\240\201\345\271\263\345\217\260/index.html" @@ -0,0 +1,636 @@ + + + + + + + + + + + + 临时邮箱和接码平台 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 临时邮箱和接码平台 +

临时邮箱和接码平台

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

在我们的日常生活中,我们可能会遇到需要使用临时邮箱或接码服务的情况。这些服务可以帮助我们保护个人信息,避免垃圾邮件和不必要的骚扰。以下是一些值得推荐的临时邮箱和接码平台:

+

一次性临时邮箱

    +
  1. 10 Minute Mail - 支持中文,有效期 10 分钟,可延时。
  2. +
  3. BccTo.ME - 中文,可自定义地址,有效期 10 分钟。支持绑定自己的域名。
  4. +
  5. MailDrop - 英文,可自定义地址,容量 10 封,有效期 24 小时。
  6. +
  7. Guerrilla Mail - 中文,可自定义地址,有效期 60 分钟,支持收发。
  8. +
  9. 666Email - 中文,可自定义地址,有效期 3 天。
  10. +
  11. YOPmail - 中文,可自定义地址,有效期 5 天。支持绑定自己的域名。可发送邮件到其它 YOPmail 地址。
  12. +
+

匿名邮件转发服务

TrashMail - 英文,可自定义地址,可以限制转发次数和有效期。到期自动销毁。

+

手机证码接码平台

请谨慎使用!号码公用,收到的信息是公开的。

+
    +
  1. 在线短信接收
  2. +
  3. 云短信
  4. +
  5. 免费接码
  6. +
+

以上是我们为您推荐的一些临时邮箱和接码平台,希望它们能在您需要的时候提供帮助。请注意,使用这些服务时应遵守所有适用的法律和规定。

+

请合理使用,保护好您的隐私!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\272\213\345\212\241\346\263\250\350\247\243Transactional/index.html" "b/\344\272\213\345\212\241\346\263\250\350\247\243Transactional/index.html" index e69de29bb2..9e1c876628 100644 --- "a/\344\272\213\345\212\241\346\263\250\350\247\243Transactional/index.html" +++ "b/\344\272\213\345\212\241\346\263\250\350\247\243Transactional/index.html" @@ -0,0 +1,710 @@ + + + + + + + + + + + + 事务注解@Transactional踩坑 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 事务注解@Transactional踩坑 +

事务注解@Transactional踩坑

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

常见问题整理

1.当标记了@Transactional注解的方法中出现异常时,如果该异常未传播到该方法外,则事务不会回滚,反之,只有异常传播到该方法外,事务才会回滚

+

错误示例:

+
// 异常被try-catch了
+@Override
+@Transactional
+public Result firstFunctionAboutException() {
+    try{
+        log.info("减库存开始");
+        goodsStockMapper.updateStock();
+        if(1 == 1) throw new RuntimeException();
+        return Result.ok();
+    }catch (Exception e){
+        log.info("减库存失败!" + e.getMessage());
+        return Result.server_error().Message("减库存失败!" + e.getMessage());
+    }
+}
+
+

正确示例:

+
@Override
+@Transactional
+public void secondFunctionAboutException() {
+    log.info("减库存开始");
+    goodsStockMapper.updateStock();
+    if(1 == 1) throw new RuntimeException();
+}
+
+

2.默认情况下,如果我们抛出的不是RuntimeException时,事务不会回滚,需要手动抛出RuntimeException异常或者修改@Transactional注解默认配置

+

错误示例

+
@Override
+@Transactional
+public void thirdFunctionAboutException() throws Exception {
+    log.info("减库存开始");
+    goodsStockMapper.updateStock();
+    if(1 == 1) throw new Exception();
+}
+
+

正确示例

+
// 抛出RuntimeException
+@Override
+@Transactional
+public void thirdFunctionAboutException1(){
+    try{
+        log.info("减库存开始");
+        goodsStockMapper.updateStock();
+        if(1 == 1) throw new Exception();
+    }catch (Exception e){
+        log.info("出现异常"+e.getMessage());
+        throw new RuntimeException("手动抛出RuntimeException");
+    }
+}
+
+// 指定回滚异常
+@Override
+@Transactional(rollbackFor = Exception.class)
+public void thirdFunctionAboutException2() throws Exception {
+    log.info("减库存开始");
+    goodsStockMapper.updateStock();
+    if(1 == 1) throw new Exception();
+}
+
+

3.被注解的方法必须是public的,且必须由注入bean来直接调用才能事务回滚

+

错误示例

+
//在普通方法中调用事务方法
+@Override
+public void privateFunctionCaller (){
+    privateCallee();
+}
+
+// 使用private修饰
+@Transactional
+private void privateCallee(){
+    goodsStockMapper.updateStock();
+    throw new RuntimeException();
+}
+
+

正确示例

+
@Override
+@Transactional
+public void publicCallee(){
+    goodsStockMapper.updateStock();
+    throw new RuntimeException();
+}
+
+// 使用自身service调用,或者将两个方法放置于不同的service
+@Autowired
+private GoodsStockService self;
+
+@Override
+public void aopSelfCaller (){
+    self.publicCallee();
+}
+
+

先记录到这,后续学习再补充!!!!

+
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\272\272\346\234\210\347\245\236\350\257\235\350\257\273\345\220\216\346\204\237/index.html" "b/\344\272\272\346\234\210\347\245\236\350\257\235\350\257\273\345\220\216\346\204\237/index.html" index e69de29bb2..5fcbad6771 100644 --- "a/\344\272\272\346\234\210\347\245\236\350\257\235\350\257\273\345\220\216\346\204\237/index.html" +++ "b/\344\272\272\346\234\210\347\245\236\350\257\235\350\257\273\345\220\216\346\204\237/index.html" @@ -0,0 +1,627 @@ + + + + + + + + + + + + 《人月神话》读后感 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 《人月神话》读后感 +

《人月神话》读后感

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前言

最近研读《人月神话》是一次思想的洗礼,它超越了时代和技术局限,为软件开发提供了永恒的洞见。本书的核心并不在于技术细节,而是对软件开发本质的深刻理解,以及对团队管理、协作和沟通的哲学思考。

+

读后感

一、揭开“人月神话”的迷思:资源悖论

布鲁克斯提出的“人月神话”并非单纯的理论,而是 Java 开发中切实存在的现象。盲目增加人力只会加剧项目复杂性,导致沟通成本飙升、协作困难,最终延长开发周期。开发者需要认识到这种资源悖论,将精力放在提升团队整体效率,而非简单的人力堆砌。

+

二、架构为先,而非人海战术:项目的成功基石

清晰、简洁、可扩展的架构是 项目成功的基石。布鲁克斯强调的“整体性”和“概念完整性”原则,指导着架构师和开发者进行设计。良好的架构不仅能降低后期的维护成本,还能为团队协作提供坚实的基础。开发者应致力于构建可维护、可扩展的架构,而非依赖人力的补丁和临时解决方案。

+

三、高效沟通与协作:团队的制胜秘诀

面对庞大的代码库和复杂的业务逻辑, 团队成员之间的沟通协作变得至关重要。布鲁克斯提出的“外科手术团队”模式,强调团队成员之间共同的目标、清晰的职责分工和高效的沟通机制。引入结对编程、代码评审、敏捷开发等实践,可以提升团队协作效率,减少返工和错误,推动项目顺利交付。

+

四、拥抱不确定性,构建适应性系统:开发的迭代之道

需求的不断变化是开发的常态。布鲁克斯提倡的“原型先行”理念,鼓励开发者通过快速迭代和试错来验证需求和设计方案的可行性。敏捷开发方法的引入,让开发者能够拥抱不确定性,快速交付可运行的版本,并根据用户的反馈不断改进,最终构建适应性强的系统。

+

五、超越技术,培养高效的开发团队

正如布鲁克斯所言,软件开发最终是由人来完成的。优秀的 Java 开发团队不仅需要过硬的技术能力,还需要良好的团队文化、学习氛围和协作精神。重视个人能力培养,打造高效的知识共享和学习机制,鼓励成员之间的相互支持和创新,才能真正提升团队的战斗力。

+

总结

从哲学层面理解软件开发

+

《人月神话》的价值不仅在于具体的技术实践,更在于其所传递的哲学思考。它提醒 Java 开发者,成功不仅取决于技术本身,更取决于对复杂性的理解、对架构和团队的重视以及对不确定性的拥抱。Java 开发者唯有跳出技术细节的层面,从哲学的高度理解软件开发的本质,才能在瞬息万变的软件世界中取得长足的进步。

+

书籍下载: 人月神话

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\273\200\344\271\210\346\230\257\345\276\256\346\234\215\345\212\241/index.html" "b/\344\273\200\344\271\210\346\230\257\345\276\256\346\234\215\345\212\241/index.html" index e69de29bb2..2aaa1a70d6 100644 --- "a/\344\273\200\344\271\210\346\230\257\345\276\256\346\234\215\345\212\241/index.html" +++ "b/\344\273\200\344\271\210\346\230\257\345\276\256\346\234\215\345\212\241/index.html" @@ -0,0 +1,663 @@ + + + + + + + + + + + + 微服务是什么? - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 微服务是什么? +

微服务是什么?

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

简述

微服务是一种软件架构风格,它将一个应用程序分解为一组小型、独立的服务,这些服务可以通过轻量级的机制(通常是HTTP资源API)进行通信。每个服务都围绕业务能力构建,并且可以通过完全自动化的部署机制独立部署和扩展。这些服务之间的管理是最小化的,甚至可以使用不同的编程语言和数据存储技术。

+

技术特征

    +
  • 围绕业务能力构建(Organized around Business Capability)

    +

    这里再次强调了康威定律的重要性,有怎样结构、规模、能力的团队,就会产生对应结构、规模、能力的产品。这个结论不是某个团队、某个公司遇到的巧合,而是必然的演化结果。如果本应该归属同一个产品内的功能被划分在不同团队中,必然会产生大量的跨团队沟通协作,而跨越团队边界无论在管理、沟通、工作安排上都有更高昂的成本,因此高效的团队自然会针对其进行改进,当团队、产品磨合稳定之后,团队与产品就会拥有一致的结构。

    +
  • +
  • 分散治理(Decentralized Governance)

    +

    这里是指服务对应的开发团队有直接对服务运行质量负责的责任,也有不受外界干预地掌控服务各个方面的权力,譬如选择与其他服务异构的技术来实现自己的服务。这一点在真正实践时多少存有宽松的处理余地,大多数公司都不会在某一个服务使用Java,另一个服务用Python,再下一个服务用Go,而是通常会用统一的主流语言,乃至统一的技术栈或专有的技术平台。微服务不提倡也并不反对这种“统一”,只要负责提供和维护基础技术栈的团队有被各方依赖的觉悟,有“经常被凌晨3点的闹钟吵醒”的心理准备就好。微服务更加强调的是在确实需要技术异构时,应能够有选择“不统一”的权利,譬如不应该强迫Node.js去开发报表页面,要做人工智能训练模型时可以选择Python,等等。

    +
  • +
  • 通过服务来实现独立自治的组件(Componentization via Service)

    +

    之所以强调通过“服务”(Service)而不是“类库”(Library)来构建组件,是因为类库在编译期静态链接到程序中,通过本地调用来提供功能,而服务是进程外组件,通过远程调用来提供功能。前文我们也已经分析过,尽管远程服务有更高昂的调用成本,但这是为组件带来自治与隔离能力的必要代价。

    +
  • +
  • 产品化思维(Product not Project)

    +

    避免把软件研发视作要去完成某种功能,而是视作一种持续改进、提升的过程。譬如,不应该把运维只看作运维团队的事,把开发只看作开发团队的事,团队应该为软件产品的整个生命周期负责,开发者不仅应该知道软件如何开发,还应该知道它如何运作,用户如何反馈,乃至售后支持工作是怎样进行的。注意,这里服务的用户不一定是最终用户,也可能是消费这个服务的另外一个服务。以前在单体架构下,程序的规模决定了无法让全部成员都关注完整的产品,如开发、运维、支持等不同职责的成员只关注自己的工作,但在微服务下,要求开发团队中每个人都具有产品化思维,关心整个产品的全部方面是具有可行性的。

    +
  • +
  • 数据去中心化(Decentralized Data Management)

    +

    微服务明确提倡数据应该按领域分散管理、更新、维护、存储。在单体服务中,一个系统的各个功能模块通常会使用同一个数据库。诚然,中心化的存储天生就更容易避免一致性问题,但是,同一个数据实体在不同服务的视角里,它的抽象形态往往是不同的。譬如,Bookstore应用中的书本,在销售领域中关注的是价格,在仓储领域中关注的是库存数量,在商品展示领域中关注的是书的介绍信息,如果使用中心化存储,所有领域都必须修改和映射到同一个实体之中,这很可能使不同服务相互影响而丧失独立性。尽管在分布式中处理好一致性问题也相当困难,很多时候都没办法使用传统的事务处理来保证,但是两害相权取其轻,即使有一些必要的代价,但仍是值得使用的。

    +
  • +
  • 强终端弱管道(Smart Endpoint and Dumb Pipe)

    +

    弱管道(Dumb Pipe)几乎是直接反对SOAP和ESB的通信机制。ESB可以处理消息的编码加工、业务规则转换等;BPM可以集中编排企业业务服务;SOAP有几十个WS-*协议族在处理事务、一致性、认证授权等一系列工作,这些构建在通信管道上的功能也许对某个系统中的某一部分服务是有必要的,但对于另外更多的服务则是强加进来的负担。如果服务需要上面的额外通信能力,就应该在服务自己的Endpoint上解决,而不是在通信管道上一揽子处理。微服务提倡使用类似于经典UNIX过滤器那样简单直接的通信方式,所以RESTful风格的通信在微服务中会是更合适的选择。

    +
  • +
  • 容错性设计(Design for Failure)

    +

    不再虚幻地追求服务永远稳定,而是接受服务总会出错的现实,要求在微服务的设计中,能够有自动的机制对其依赖的服务进行快速故障检测,在持续出错的时候进行隔离,在服务恢复的时候重新联通。所以“断路器”这类设施,对实际生产环境中的微服务来说并不是可选的外围组件,而是一个必需的支撑点,如果没有容错性设计,系统很容易被一两个服务崩溃所带来的雪崩效应淹没。可靠系统完全可能由会出错的服务组成,这是微服务最大的价值所在,也是本书前言中所说的“凤凰架构”的含义。

    +
  • +
  • 演进式设计(Evolutionary Design)

    +

    容错性设计承认服务会出错,演进式设计则承认服务会被报废淘汰。一个设计良好的服务,应该是能够报废的,而不是期望得到长存永生。假如系统中出现不可更改、无可替代的服务,这并不能说明这个服务多么优秀、多么重要,反而是一种系统设计上脆弱的表现,微服务所追求的自治、隔离,也是反对这种脆弱性的表现。

    +
  • +
  • 基础设施自动化(Infrastructure Automation)

    +

    基础设施自动化,如CI/CD的长足发展,显著减少了构建、发布、运维工作的复杂性。由于微服务架构下运维对象数量是单体架构运维对象数量的数量级倍,使用微服务的团队更加依赖于基础设施的自动化,人工是很难支撑成百上千乃至上万级别的服务的。

    +
  • +
+

优点

微服务的主要优点是:

+
    +
  • 灵活性:微服务可以使用不同的技术栈来开发,以适应不同的问题和需求。例如,Netflix使用了Java、Scala、Groovy、Python、Node.js等多种语言来构建其微服务架构。
  • +
  • 可替换性:微服务可以根据需要进行替换和升级,而不影响其他服务的运行。例如,The Guardian网站将其单体应用拆分为多个微服务,这样就可以为一些临时的功能(如体育赛事的专题页面)快速开发和移除微服务。
  • +
  • 可伸缩性:微服务可以根据负载和性能的变化,单独进行水平或垂直扩缩容,而不需要对整个应用进行扩缩容。例如,Amazon使用了微服务架构来支持其海量的用户和交易,每个服务都可以根据需求进行自动化的扩缩容。
  • +
  • 可靠性:微服务可以通过隔离故障和实现容错机制,提高系统的可靠性和可用性。例如,Netflix使用了断路器、超时、重试等模式来处理服务之间的通信失败,以及使用了Simian Army来模拟和测试服务的故障情况。
  • +
+

缺点

微服务也有一些挑战和注意事项,例如:

+
    +
  • 复杂性:微服务增加了系统的复杂性,需要更多的协调和管理。例如,微服务需要实现服务的发现、注册、路由、负载均衡、监控、日志、安全等功能,以及处理服务之间的一致性、事务、版本等问题。
  • +
  • 技能:微服务需要开发团队具备较高的技能和经验,以及持续交付和部署的能力。例如,微服务需要开发团队熟悉不同的技术栈、工具和平台,以及遵循“你构建,你运行”的原则,承担软件的全生命周期的责任。
  • +
  • 成本:微服务可能会增加系统的运行成本和维护成本。例如,微服务需要更多的硬件资源、网络带宽、测试覆盖、文档编写等,以及更多的人力投入和沟通成本。
  • +
+

总结

微服务是一种值得考虑的软件架构风格,它可以提高软件的灵活性、可替换性、可伸缩性和可靠性,但也带来了一些复杂性、技能和成本的挑战。微服务并不是一种新颖的创新,它的根源可以追溯到Unix的设计原则和服务导向架构的思想。微服务的适用性和成熟度还需要更多的时间和实践来验证和评估。在选择微服务时,需要根据具体的上下文和需求,权衡利弊,做出明智的决策。

+

参考文章: Microservices — 微服务 (martinfowler.com)

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\273\243\347\240\201\345\244\247\345\205\250\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/\344\273\243\347\240\201\345\244\247\345\205\250\345\255\246\344\271\240\347\254\224\350\256\260/index.html" index e69de29bb2..6e1d7dfd6e 100644 --- "a/\344\273\243\347\240\201\345\244\247\345\205\250\345\255\246\344\271\240\347\254\224\350\256\260/index.html" +++ "b/\344\273\243\347\240\201\345\244\247\345\205\250\345\255\246\344\271\240\347\254\224\350\256\260/index.html" @@ -0,0 +1,970 @@ + + + + + + + + + + + + 《代码大全》读后感 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 《代码大全》读后感 +

《代码大全》读后感

+
+ + + + +
+ +
+
+
+ + +
  1. 1. 软件创建
    1. 1.1. 问题定义
    2. 1.2. 需求分析
    3. 1.3. 实现计划
    4. 1.4. 总体设计
    5. 1.5. 详细设计
    6. 1.6. 创建即实现
    7. 1.7. 系统集成
    8. 1.8. 单元测试
    9. 1.9. 系统测试
    10. 1.10. 校正性的维护
    11. 1.11. 功能强化
  2. 2. 隐喻编程
    1. 2.1. 计算机科学的语言隐喻
    2. 2.2. 播种与培植庄稼的隐喻
    3. 2.3. 沉积与增量的隐喻
    4. 2.4. 建造房屋的隐喻
    5. 2.5. 利用现成资源的隐喻
    6. 2.6. 定制化建造的隐喻
    7. 2.7. 智能工具箱的隐喻
    8. 2.8. 结论
  3. 3. 软件创建的先决条件
    1. 3.1. 先决条件的重要性
    2. 3.2. 问题定义先决条件
    3. 3.3. 需求分析的先决条件
    4. 3.4. 结构设计先决条件
    5. 3.5. 选择编程语言先决条件
    6. 3.6. 编程约定
    7. 3.7. 应花在先决条件的时间
    8. 3.8. 编码前的技术评审
    9. 3.9. 团队协作准备
    10. 3.10. 技术栈和工具选择
  4. 4. 建立子程序的步骤
    1. 4.1. 描述子程序的操作
    2. 4.2. 命名子程序
    3. 4.3. 考虑效率
    4. 4.4. 算法和数据结构
    5. 4.5. 从抽象到具体
    6. 4.6. 逐步细化数据
    7. 4.7. 使用程序设计语言 (PDL)
    8. 4.8. 持续检查和改进
  5. 5. 高质量子程序的特点
    1. 5.1. 生成子程序的原因
      1. 5.1.1. 创建子程序的理由总结
      2. 5.1.2. 子程序命名
    2. 5.2. 强内聚性
      1. 5.2.1. 内聚性类型
    3. 5.3. 松耦合性
      1. 5.3.1. 耦合性的类型
    4. 5.4. 子程序长度
    5. 5.5. 防错性编程
    6. 5.6. 子程序参数
      1. 5.6.1. 参数设计和使用
  6. 6. 模块化设计
    1. 6.1. 模块的内聚性
    2. 6.2. 模块的耦合性
    3. 6.3. 封装和信息隐蔽
  7. 7. 高级结构设计
    1. 7.1. 设计流程
    2. 7.2. 设计方法
    3. 7.3. 设计原则
    4. 7.4. 面向对象设计步骤
    5. 7.5. 往返设计
    6. 7.6. 问题解决方法
  8. 8. 数据名称
    1. 8.1. 变量命名
    2. 8.2. 名称长度
    3. 8.3. 命名风格
    4. 8.4. 特殊类型的变量命名
    5. 8.5. 逻辑和枚举变量
  9. 9. 变量
    1. 9.1. 作用域和初始化
    2. 9.2. 持久性和全局变量
  10. 10. 控制
    1. 10.1. 循环和条件控制
    2. 10.2. 嵌套和子程序
  11. 11. 文档
    1. 11.1. 文档类型
    2. 11.2. 代码注释
    3. 11.3. 注释实践
  12. 12. 项目大小的影响
    1. 12.1. 交流和方法
    2. 12.2. 项目规模影响
  13. 13. 单元测试
    1. 13.1. 测试原则
+ +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

软件创建

开发计算机软件是一项非常复杂的工作。在过去的十五年中,研究者们已经明确了这项工作的主要方面,包括以下几个关键阶段:

+

问题定义

    +
  • 目的:明确软件需要解决的问题。
  • +
  • 方法:与利益相关者进行沟通,确定软件需求的初步想法。
  • +
+

需求分析

    +
  • 目的:深入理解并定义软件的功能和约束条件。
  • +
  • 方法:收集详细的用户需求,编写需求文档。
  • +
+

实现计划

    +
  • 目的:制定实现软件所需的详细步骤和时间表。
  • +
  • 方法:项目管理和资源分配。
  • +
+

总体设计

    +
  • 目的:定义软件的架构和高层次结构。
  • +
  • 方法:创建设计文档,明确系统的组成部分和它们之间的交互。
  • +
+

详细设计

    +
  • 目的:具体化每个组件的设计。
  • +
  • 方法:详细说明具体模块的功能和接口。
  • +
+

创建即实现

    +
  • 目的:将设计转化为实际代码。
  • +
  • 方法:编程和代码实现。
  • +
+

系统集成

    +
  • 目的:将不同模块或组件整合为一个完整的系统。
  • +
  • 方法:集成测试,确保各部分协同工作。
  • +
+

单元测试

    +
  • 目的:验证单个模块或组件的功能。
  • +
  • 方法:编写和执行针对单一模块的测试用例。
  • +
+

系统测试

    +
  • 目的:确保整个系统满足设计和需求规格。
  • +
  • 方法:进行全面的测试,包括功能测试、性能测试等。
  • +
+

校正性的维护

    +
  • 目的:修复软件运行中出现现的错误和问题。

    +
  • +
  • 方法:定期更新软件,解决已发现的缺陷和性能问题。

    +
  • +
+

功能强化

    +
  • 目的:根据用户反馈和市场变化,增加新的特性或改进现有功能。
  • +
  • 方法:持续迭代开发,增强软件的功能和性能。
  • +
+

隐喻编程

隐喻在软件开发中起着关键的启发性作用,它通过将软件开发过程与我们熟悉的事物相比较,帮助我们更深入地理解软件开发的本质。以下是几个重要的隐喻及其在软件开发中的应用。

+

计算机科学的语言隐喻

    +
  • 描述:计算机科学的语言丰富多彩,包括病毒、蠕虫、臭虫、炸弹等。
  • +
  • 意义:这些形象的隐喻描述了特定的软件现象,有助于我们理解和描述软件中的复杂问题。
  • +
+

播种与培植庄稼的隐喻

    +
  • 描述:将创建软件比作播种或培植庄稼。
  • +
  • 意义:强调通过小步前进的方法(增量设计、构造、测试)来减少错误,提高软件质量。
  • +
+

沉积与增量的隐喻

    +
  • 描述:将软件开发比作从水中沉积物中积累出代码。
  • +
  • 意义:强调在系统中逐渐添加新功能的重要性,即增量设计和测试。
  • +
+

建造房屋的隐喻

    +
  • 描述:将软件创建比作建造房屋的过程。
  • +
  • 意义:展示了软件开发的各个阶段,从问题定义到优化,与建房子的步骤相类似。
  • +
+

利用现成资源的隐喻

    +
  • 描述:在建房时,使用现成的洗衣机、电冰箱等,而不是自己制造。
  • +
  • 意义:鼓励在软件开发中利用现有的资源,如库、框架和高级语言特性。
  • +
+

定制化建造的隐喻

    +
  • 描述:如果要建造一流的别墅,可能会选择定制家具和装饰。
  • +
  • 意义:对于高级别的软件开发,可能需要创建定制化的组件和功能,以实现特定的需求。
  • +
+

智能工具箱的隐喻

    +
  • 描述:软件开发实践像一个装满各种工具的工具箱。
  • +
  • 意义:强调没有万能的工具,为每个任务选择合适的工具是成为优秀程序员的关键。
  • +
+

结论

    +
  • 隐喻的重要性:隐喻帮助我们通过比较熟悉的事物来理解软件开发的复杂性。
  • +
  • 选择合适的隐喻:不同的隐喻适用于不同的情境。选择恰当的隐喻可以帮助更好地解决问题和理解软件开发的特性。
  • +
  • 工具箱理念:每位程序员都有自己的技术和方法集合。在不同的开发阶段选择合适的技术和方法是至关重要的。
  • +
+

软件创建的先决条件

先决条件的重要性

软件开发过程中的准备工作对于最终产品的质量至关重要。以下是几个关键点:

+
    +
  1. 项目启动前的准备:像建筑工人在修建房屋前做准备一样,优秀的程序员在项目开始前会进行充分的准备。这包括确保所有必要的资源已准备就绪,并在计划的每个阶段都注重高质量。
  2. +
  3. 抵制立即编码的冲动:许多程序员倾向于立即开始编码,但应先考虑准备阶段可能出现的问题。准备工作的经验是必不可少的,特别是在大型项目中。
  4. +
  5. 教育周围的人:程序员的职责之一是教育管理人员和同事理解技术项目的开发过程,确保他们理解先决条件的重要性。
  6. +
  7. 项目规划的重要性:在大型项目开始前进行彻底的规划至关重要。这与建造房屋前的规划工作相似。
  8. +
  9. 避免不必要的修改:研究表明,最好是一次完成项目,因为不必要的修改成本很高。错误应尽早在软件开发过程中被发现并修正。
  10. +
+

问题定义先决条件

在需求分析之前,应该清晰地定义问题。良好的问题定义应遵循以下准则:

+
    +
  • 专注于问题本身:问题定义应仅描述要解决的问题,而不涉及解决方案。例如,“我们无法跟上指令系统”是一个问题,而“我们需要优化数据入口系统以便跟上指令系统”则偏向解决方案。
  • +
  • 从用户视角出发:问题定义应使用用户的语言,避免使用计算机技术术语。这有助于确保最佳的解决方案可能并不局限于技术实现。
  • +
+

需求分析的先决条件

需求分析是确定系统功能的关键步骤,应注意以下要点:

+
    +
  1. 明确需求的重要性:清晰的需求有助于由用户而非程序员决定系统功能。这可以防止程序员在编程过程中对用户需求进行猜测。
  2. +
  3. 需求分析的质量:如果需求分析不佳,应停止当前工作并返回需求分析阶段。
  4. +
  5. 管理变更请求:对于在需求分析阶段之外提出的新想法,应进行成本和进度估计,然后再决定是否采纳。
  6. +
  7. 应对不稳定需求:如果需求特别奇怪或频繁变化,考虑放弃项目可能是一个明智的选择。
  8. +
+

结构设计先决条件

结构设计阶段需要考虑以下关键因素:

+
    +
  1. 模块功能的明确性:每个模块应只完成一项任务,并应尽可能降低模块间的相互了解程度。
  2. +
  3. 变动应对策略:结构设计应清晰描述系统应对变动的策略,包括对旧软件的重用和代码购买。
  4. +
  5. 关键数据结构:明确使用的主要文件、表和数据结构,及其替代方案。
  6. +
  7. 依赖特定算法的设计:如果设计依赖于特定算法,应详细描述或指出该算法。
  8. +
  9. 内存管理:预估正常和极端情况下所需的内存。
  10. +
  11. 错误处理:错误处理是软件开发中的关键部分,应在设计中明确处理策略。
  12. +
  13. 坚固性和容错性:设计应指明所期望的系统坚固性和容错性类型。
  14. +
  15. 性能目标:如果考虑性能,应在设计中明确性能目标,包括速度和内存使用。
  16. +
  17. 设计一致性:确保结构设计的每次变动都与总体设计概念一致。
  18. +
+

选择编程语言先决条件

选择编程语言时,应考虑以下因素:

+
    +
  • 语言对思维的影响:编程语言会影响程序员的思维方式。确保所选语言适合项目的需求和团队的技术背景。
  • +
+

编程约定

在开始编码之前,明确的编程约定是至关重要的。这些约定应该详细到在编程过程中不需改动,确保代码的一致性和可维护性。

+
    +
  • 编程风格:包括命名规范、代码布局、注释风格等。
  • +
  • 代码标准:定义函数、类的结构,变量的使用规则等。
  • +
  • 错误处理:统一的错误报告和处理机制。
  • +
  • 性能要求:对于性能的基本要求和目标。
  • +
  • 安全性:安全编程准则,防止常见的安全漏洞。
  • +
+

应花在先决条件的时间

软件项目的先决条件阶段需要投入适当的时间和资源,一般建议分配项目总时间的20%至30%。

+
    +
  • 项目规模与复杂度:大型或复杂项目可能需要更多的时间进行准备。
  • +
  • 团队经验:经验丰富的团队可能在某些阶段更快地完成准备工作。
  • +
  • 风险评估:高风险项目需要更细致的先决条件分析。
  • +
+

编码前的技术评审

在正式开始编码之前进行技术评审,以确保设计的合理性和可行性。

+
    +
  • 设计评审:评估设计方案是否符合需求。
  • +
  • 代码审查:早期发现潜在的代码问题和不一致之处。
  • +
  • 性能分析:确保设计能满足性能要求。
  • +
+

团队协作准备

确保团队成员间的有效沟通和协作。

+
    +
  • 角色分配:明确每个团队成员的职责和任务。
  • +
  • 沟通机制:建立有效的沟通渠道和会议安排。
  • +
  • 文档共享:确保所有相关文档易于团队成员访问。
  • +
+

技术栈和工具选择

选择合适的技术栈和工具是项目成功的关键。

+
    +
  • 编程语言:根据项目需求和团队技能选择合适的编程语言。
  • +
  • 开发框架:选择支持项目需求的开发框架和库。
  • +
  • 开发和测试工具:选用高效的IDE、版本控制系统和测试工具。
  • +
+

建立子程序的步骤

建立子程序是软件开发中的一个重要过程,需要遵循一系列明确的步骤以确保代码的质量和可维护性。

+

描述子程序的操作

    +
  • 使用自然语言:以清晰的自然语言描述子程序的每一步操作,确保其目的和功能明确。
  • +
+

命名子程序

    +
  • 清晰且具体:子程序的命名应清楚、具体,避免引起误解。
  • +
  • 反映功能:名称应反映子程序的功能和作用。
  • +
+

考虑效率

    +
  • 性能优化:在保证功能和清晰性的基础上,考虑子程序的运行效率。
  • +
  • 资源管理:注意资源使用和管理,避免不必要的资源浪费。
  • +
+

算法和数据结构

    +
  • 合适的选择:根据子程序的功能选择合适的算法和数据结构。
  • +
  • 效率与可维护性:平衡算法的效率和代码的可维护性。
  • +
+

从抽象到具体

    +
  • 注释先行:编写子程序时,先从抽象的注释开始,明确子程序的目的和功能。
  • +
  • 清晰的目标:如果在这一步遇到困难,可能需要对子程序的角色和功能进行深入思考。
  • +
+

逐步细化数据

    +
  • 数据设计:仔细考虑子程序将处理的数据类型和结构。

    +
  • +
  • 逐步实现:从大致框架开始,逐步细化实现细节。

    +
  • +
+

使用程序设计语言 (PDL)

    +
  • 易懂的语言:使用清晰易懂的自然语言编写PDL,避免过度依赖特定编程语言的语法。
  • +
  • 注重目的:PDL应关注于描述子程序要做什么,而非具体实现方式。
  • +
  • 从PDL到代码:PDL可以直接转化为代码的注释,确保注释的准确性和实用性。
  • +
+

持续检查和改进

    +
  • 代码检查:在开发过程的每一步中检查子程序,确保质量。
  • +
  • 同事审查:鼓励团队成员互相审查代码,及早发现并纠正错误。
  • +
  • 降低成本:通过早期发现和修正错误,降低后期修复成本。
  • +
+

高质量子程序的特点

生成子程序的原因

创建子程序的理由总结

    +
  • 降低复杂性:使代码更易于理解和维护。
  • +
  • 避免重复代码:促进代码重用,减少冗余。
  • +
  • 限制改动影响:简化维护和更新。
  • +
  • 隐含顺序和控制:明确代码的执行流程。
  • +
  • 改进性能:通过优化关键子程序来提升整体性能。
  • +
  • 进行集中控制:统一管理相关操作。
  • +
  • 隐含数据结构和指针操作:隐藏复杂的数据处理。
  • +
  • 隐含全局变量:减少全局变量的直接使用。
  • +
  • 促进代码重用:提高代码的可重用性。
  • +
  • 计划开发软件族:为未来的扩展做准备。
  • +
  • 改善可读性和可移植性:使代码更易于阅读和适应不同环境。
  • +
  • 分隔复杂操作:将复杂的操作拆解成更小的单元。
  • +
  • 独立非标准语言函数的使用:减少对特定语言特性的依赖。
  • +
  • 简化复杂的布尔测试:使逻辑判断更清晰。
  • +
+

子程序命名

    +
  • 清晰描述:名称应明确反映子程序的功能。
  • +
  • 适当的长度:长度应足以描述功能,但不过于冗长。
  • +
  • 避免模糊用语:选择明确无歧义的词汇。
  • +
+

强内聚性

内聚性类型

    +
  • 功能内聚性:子程序执行单一且明确的功能。
  • +
  • 顺序内聚性:操作需要按特定顺序执行。
  • +
  • 通讯内聚性:操作使用相同的数据。
  • +
  • 临时内聚性:操作基于相同的时间发生。
  • +
+

松耦合性

耦合性的类型

    +
  • 简单数据耦合:优选,通过参数表传递非结构化数据。
  • +
  • 数据结构耦合:通过参数表传递结构化数据。
  • +
  • 控制耦合:一个子程序通过参数控制另一个子程序的行为。
  • +
  • 全局数据耦合:子程序通过全局变量进行通信。
  • +
  • 不合理耦合:直接修改另一个子程序的内部数据或代码(应避免)。
  • +
+

子程序长度

    +
  • 理想长度:一般建议子程序长度为一到两页代码(大约66到132行)。
  • +
+

防错性编程

    +
  • 使用断言:验证程序状态,确保数据的正确性。
  • +
  • 垃圾输入处理:确保对不合理的输入给予合适的响应。
  • +
  • 异常处理:设计异常处理机制,应对意外情况。
  • +
  • 预计可能的改动:考虑未来可能的变化和扩展。
  • +
  • 去除调试代码:发布时移除专用于调试的代码部分。
  • +
  • 保留错误提示信息:对于错误和异常提供清晰的反馈。
  • +
  • 检查函数返回值:验证其他函数的返回值,确保数据的正确性。
  • +
+

子程序参数

参数设计和使用

    +
  • 匹配实际与形式参数:确保调用时传递的参数与子程序定义匹配。
  • +
  • 参数顺序:输入、修改、输出参数的顺序应一致。
  • +
  • 类似子程序的参数顺序一致性:相似功能的子程序应有相同的参数顺序。
  • +
  • 使用所有参数:不使用的参数应从子程序接口中移除。
  • +
  • 状态和错误变量放在最后:使子程序的主要功能更明显。
  • +
  • 参数非工作变量:避免将参数用作内部的工作变量。
  • +
  • 特殊情况的说明:明确参数的特殊用途和限制。
  • +
  • 限制参数个数:减少参数数量,避免过度复杂。
  • +
  • 规范参数命名:清晰、一致的命名提高代码可读性。
  • +
  • 传递必要部分的结构化变量:仅传递子程序所需的数据结构部分。
  • +
+

模块化设计

模块的内聚性

    +
  • 原则:模块应提供一组相互联系的服务,保持高内聚。
  • +
  • 意义:内聚性强的模块能更清晰地定义功能,简化理解和维护。
  • +
+

模块的耦合性

    +
  • 原则:设计模块时应保持与其他模块的耦合度低。
  • +
  • 实践:模块应被设计成可提供完整功能,确保与其他部分的清晰交互。
  • +
+

封装和信息隐蔽

    +
  • 定义:将模块的信息细节隐蔽起来,也称为“封装”。
  • +
  • 优点:
      +
    • 便于修改。
    • +
    • 澄清代码编写意图。
    • +
    • 提高可靠性。
    • +
    • 简化调试。
    • +
    • 统一数据存取模式。
    • +
    +
  • +
+

高级结构设计

设计流程

    +
  1. 子系统划分。
  2. +
  3. 模块化设计。
  4. +
  5. 程序的细节设计。
  6. +
  7. 子程序内部和设计。
  8. +
+

设计方法

    +
  • 自顶向下分解。
  • +
  • 自底向上合成。
  • +
+

设计原则

    +
  • 抽象:创建与问题同等抽象层次的编程抽象,避免过度细节化。
  • +
  • 封装:在老旧语言中是自愿的,而在如Ada等现代语言中则是强制性的。
  • +
  • 继承:在面向对象编程中,继承性简化了编程,通过通用和专用子程序处理对象间的共同与不同特性。
  • +
+

面向对象设计步骤

    +
  1. 识别对象及其属性。
  2. +
  3. 确定对象的功能。
  4. +
  5. 确定对象间的相互作用。
  6. +
  7. 确定对象的可见性和接口。
  8. +
+

往返设计

    +
  • 概念:设计是一个迭代过程,可能需要多次往返以深化理解。
  • +
  • 好处:在设计过程中进行迭代可以带来更大的好处。
  • +
+

问题解决方法

    +
  1. 理解问题。
  2. +
  3. 设计方案。
  4. +
  5. 执行解决方案并检查每一步。
  6. +
  7. 回顾并检查答案。
  8. +
+

数据名称

变量命名

    +
  • 原则:变量名称应准确描述其代表的实体。
  • +
  • 建议:使用自然语言描述变量代表的实体,名称应体现问题而非解决方法。
  • +
+

名称长度

    +
  • 标准:选择合适长度的变量名,确保清晰易懂。
  • +
  • 例外:在特定情况下,如临时变量,短名称(如i)可能更合适。
  • +
+

命名风格

    +
  • 限定词使用:如totals, averages, maximums等,限定词放在变量名末尾。
  • +
  • 反义词使用:恰当使用反义词以增强变量意义的清晰度。
  • +
+

特殊类型的变量命名

    +
  • 状态变量:避免使用模糊的名字如flag,应使用更具描述性的名称。
  • +
  • 临时变量:通常用作保存中间计算结果,应避免无意义的命名。
  • +
+

逻辑和枚举变量

    +
  • 逻辑变量:使用肯定的名称,易于理解。
  • +
  • 枚举变量:使用统一的前缀或后缀以表明同一类型。
  • +
+

变量

作用域和初始化

    +
  • 作用域:变量在程序中的可见范围。
  • +
  • 初始化:应在使用前恰当地初始化变量。
  • +
+

持久性和全局变量

    +
  • 持久性:变量的使用寿命,避免硬编码,确保功能单一性。
  • +
  • 全局变量:最初设为局部变量,必要时转为全局变量,但应优先考虑使用存取子程序。
  • +
+

控制

循环和条件控制

    +
  • 边界错误:明确循环结束点和条件语句中的等号情况,避免边界错误。
  • +
  • 简化循环:通过减少循环次数、明确进出口等方式简化循环。
  • +
+

嵌套和子程序

    +
  • 简化嵌套:重新编写测试条件,将深层嵌套代码转为子程序或使用case语句替代if嵌套。
  • +
+

文档

文档类型

    +
  • 综合资料:供开发者使用的非正式记录。
  • +
  • 详细设计文档:描述模块层或程序层的决策。
  • +
+

代码注释

    +
  • 注释类别:包括代码的重复、解释、标记、总结和意图描述。
  • +
  • 注释原则:避免无关注释,注释应清晰表达代码意图。
  • +
+

注释实践

    +
  • 行注释:避免过度使用,注释应与代码紧密相关。
  • +
  • 结束行注释:应集中在“为什么”而非“如何”上。
  • +
+

项目大小的影响

交流和方法

    +
  • 交流规范化:对大型项目而言,规范化文档和交流方式非常重要。
  • +
  • 方法应用:小型项目可能采用偶然和本能的方法,而大型项目则需要精确和计划性的方法。
  • +
+

项目规模影响

    +
  • 代码行数和参与人数:项目大小不仅由代码行数和参与人数决定,还包括软件的质量和复杂性。
  • +
  • 生产效率:受人员素质、编程语言、方法、产品复杂性等多种因素影响。
  • +
+

单元测试

测试原则

    +
  • 测试覆盖:选择能有效发现错误的测试用例,包括结构测试和数据流测试。
  • +
  • 边界条件:重点关注边界条件和最小最大值。
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\273\243\347\240\201\346\225\264\346\264\201\344\271\213\350\267\257/index.html" "b/\344\273\243\347\240\201\346\225\264\346\264\201\344\271\213\350\267\257/index.html" index e69de29bb2..ebdb20ffd6 100644 --- "a/\344\273\243\347\240\201\346\225\264\346\264\201\344\271\213\350\267\257/index.html" +++ "b/\344\273\243\347\240\201\346\225\264\346\264\201\344\271\213\350\267\257/index.html" @@ -0,0 +1,822 @@ + + + + + + + + + + + + 代码整洁之路 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 代码整洁之路 +

代码整洁之路

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

序言

各位程序猿/媛们,还记得你刚入行时写下的那些代码吗?是不是像一堆乱麻,连自己都看不懂?是不是像我一样,曾经天真地以为,只要代码能运行,就万事大吉?

+

哈哈,别担心,我们都经历过那个阶段。写代码就像学武功,一开始都是乱打一气,只有经过不断的练习和领悟,才能慢慢掌握其中的奥妙。

+

那么推荐大家可以看看文章末尾推荐的几本书籍.这些书籍就是指引我们从无名小辈到扫地僧的武功秘籍。

+

代码

命名:代码的“名片”

还记得那个名为 d 的变量吗?它就像一个没有名片的人,你永远不知道它是谁,它要做什么。这样的代码,就像一个江湖黑话满天飞的武林,让人摸不着头脑。

+

好的命名,就像一张清晰的名片,能让人一眼就明白它的身份和职责。比如,elapsedTimeInDays 比 d 好懂多了吧?这就好比武林中人,行走江湖,总得有个响亮的名号,让人一听就知道你是谁,你擅长什么。

+

所以,请记住以下秘诀:

+
    +
  • 抛弃那些毫无意义的字母,用完整的单词或短语来命名。
  • +
  • 避免误导。 别用 accountList 来指代一组账号,除非它真的是 List 类型。
  • +
  • 做有意义的区分。 a1、a2、aN 这种命名方式简直是灾难,请用 source 和 destination 来代替吧!
  • +
+

好的命名是代码整洁的第一步,也是最重要的一步。它能让你的代码像优美的散文一样,清晰易懂,令人愉悦。

+

函数:代码的“士兵”

还记得那个长达几千行的函数吗?它就像一个臃肿的胖子,行动迟缓,效率低下。这样的代码,就像一支乌合之众,毫无纪律可言,战斗力自然低下。

+

好的函数,应该像训练有素的士兵,短小精悍,各司其职。每个函数只做一件事,就像每个士兵只负责一个任务一样,这样才能保证整个队伍的效率和战斗力。

+

所以,请记住以下秘诀:

+
    +
  • 函数要短,越短越好! 20 行封顶, 10 行更佳。(根据实际情况来)
  • +
  • 每个函数只做一件事。 别让你的函数像个杂耍演员,一会儿变个戏法,一会儿又变个戏法。
  • +
  • 每个函数一个抽象层级。 别把高层逻辑和底层细节混在一起,这会让你的代码像迷宫一样难懂。
  • +
+

好的函数是代码整洁的基石。它能让你的代码像积木一样,易于组合,易于维护。

+

示例

+
// 糟糕的函数
+public void calculateAndPrintReport() {
+  // 计算数据
+  // 格式化数据
+  // 打印报表
+}
+
+// 好的函数
+public void calculateReport() {
+  // 计算数据
+}
+
+public void printReport() {
+  // 格式化数据
+  // 打印报表
+}
+
+

注释:代码的“点缀”

还记得那些不知所云的注释吗?它们就像一堆垃圾,只会让代码更难懂。这样的代码,就像一个脸上涂满油彩的小丑,让人眼花缭乱,却不知其意。

+

示例

+
i++; // 将 i 加 1
+
+

好的注释,应该像画龙点睛,起到解释和说明的作用,而不是画蛇添足。它应该简洁明了,直击要害,让人一看就懂。

+

所以,请记住以下秘诀:

+
    +
  • 注释不能美化糟糕的代码。 如果代码很烂,最好的办法是重写,而不是加注释。
  • +
  • 用代码来阐述。 很多时候,你都可以用代码来表达你的意图,而不需要注释。
  • +
  • 写好注释。 如果非要写注释,请确保它清晰、准确、简洁。
  • +
+

好的注释是代码整洁的点缀。它能让你的代码锦上添花,但绝不能喧宾夺主。

+

示例

+
// 解释算法的注释
+// 使用快速排序算法对数组进行排序
+public void sort(int[] array) {
+  // ...
+}
+
+

格式:代码的“颜值”

还记得那些缩进混乱、毫无章法的代码吗?它们就像一堆杂草,让人头晕眼花。这样的代码,就像一个衣衫褴褛的乞丐,毫无美感可言。

+

好的格式,就像代码的“颜值”,能让你的代码赏心悦目,易于阅读。它就像一个穿着得体的绅士,让人一看就心生好感。

+

所以,请记住以下秘诀:

+
    +
  • 保持代码行短小。 别让你的代码像一条长蛇,让人看不到尽头。
  • +
  • 使用空格和缩进来区分不同的代码块,让代码结构清晰可见。
  • +
  • 团队要有一致的格式规范,别让你的代码像一个拼凑的怪物。
  • +
+

好的格式是代码整洁的门面。它能让你的代码更专业,更易于维护。

+

示例

+
// 糟糕的格式
+if (condition) {
+doSomething();
+} else
+{
+doSomethingElse();
+}
+
+// 好的格式
+if (condition) {
+  doSomething();
+} else {
+  doSomethingElse();
+}
+
+

对象和数据结构:代码的“骨架”

对象和数据结构,就像代码中的“骨架”,支撑着代码的整体结构。它们就像武功中的内功和招式,相辅相成,缺一不可。

+

对象,就像一个训练有素的特工,身怀绝技,却又深藏不露。它把数据隐藏在幕后,只向外界展示它能做什么,而不是它是什么。

+

数据结构,就像一个透明的玻璃箱,里面装满了各种数据,一目了然。它没有隐藏,也没有秘密,所有数据都直接暴露在外。

+

那么,什么时候该用对象,什么时候该用数据结构呢?

+
    +
  • 当你需要添加新数据类型,而不是新函数时,对象是你的好帮手。
  • +
  • 当你需要添加新函数,而不是新数据类型时,数据结构是你的好选择。
  • +
+

记住,对象和数据结构各有优劣,选择合适的工具,才能写出整洁的代码。

+

示例

+
    +
  • 当你需要存储和操作一组数据,并且需要频繁地添加或删除数据时,ArrayList 是一个好的选择。
  • +
  • 当你需要存储和操作一组数据,并且需要快速地查找数据时,HashMap 是一个好的选择。
  • +
  • 当你需要定义一个抽象的概念,并提供一些操作数据的函数时,对象是你的好帮手。
  • +
+

错误处理:代码的“消防员”

错误处理,就像代码中的“消防员”,负责在代码出现问题时及时扑灭火灾。它就像武功中的防御招式,能够在关键时刻化解危机。

+

但是,如果消防员到处乱跑,只会让火势蔓延得更快。同样,如果错误处理代码写得不好,只会让代码更加混乱,难以维护。

+

所以,请记住以下秘诀:

+
    +
  • 使用异常来处理错误,而不是返回错误码。 这能让你的代码更整洁,逻辑更清晰。
  • +
  • 先写 try-catch-finally 语句,再写正常逻辑。 这能帮你定义代码的行为边界,让代码更易于维护。
  • +
  • 避免返回 null 值。 这只会给调用者添乱,增加代码的复杂度。
  • +
+

好的错误处理应该像隐形的防护网,在代码出现问题时及时保护,而不是像个碍手碍脚的家伙,到处添乱。

+

边界:代码的“国境线”

边界,就像代码中的“国境线”,将你的代码与外部世界隔离开来。它就像武功中的门派之别,划清了界限,避免了冲突和混乱。

+

如何守好这道“国境线”,是写出整洁代码的关键。

+

所以,请记住以下秘诀:

+
    +
  • 封装第三方代码。 不要让你的代码对第三方代码了如指掌,这会增加代码的耦合度。
  • +
  • 编写学习性测试。 通过编写测试来学习和理解第三方代码,这能让你更快、更准确地使用它。
  • +
  • 预测未来。 当你需要使用尚未存在的代码时,先定义你想要的接口,这能让你不受制于人。
  • +
+

好的边界应该像一道坚固的城墙,保护你的代码免受外部世界的侵害,同时又能方便地与外界沟通。

+

单元测试:代码的“侦察兵”

单元测试,就像代码中的“侦察兵”,负责在代码中寻找 bug 和缺陷。它就像武功中的练功桩,帮助你不断提升代码的质量。

+

但是,如果侦察兵漫无目的地乱跑,只会浪费时间和精力。同样,如果单元测试写得不好,不仅不能保证代码质量,反而会成为代码维护的负担。

+

所以,请记住以下秘诀:

+
    +
  • 遵循 TDD 三定律,先写测试,再写代码。
  • +
  • 保持测试整洁。 测试代码和生产代码一样重要,都需要精心设计和维护。
  • +
  • 每个测试只测试一个概念。 不要让你的测试像个贪婪的胖子,什么都想测。
  • +
+

好的单元测试应该像一把锋利的匕首,直击代码的要害,快速、准确地找到问题。

+

类:代码的“建筑师”

类,就像代码中的“建筑师”,负责构建代码的整体结构。它就像武功中的心法,决定了你的代码能走多远。

+

一个好的建筑师,应该懂得如何设计出结构合理、功能清晰的建筑。同样,一个好的程序员,应该懂得如何设计出结构清晰、易于维护的类。

+

所以,请记住以下秘诀:

+
    +
  • 类应该短小。 不要让你的类像个巨无霸,什么功能都往里塞。
  • +
  • 每个类只负责一件事。 不要让你的类像个多面手,什么都会,却什么都不精。
  • +
  • 保持类的内聚性。 类中的方法和变量应该紧密相关,共同完成一个目标。
  • +
+

好的类应该像一个精密的仪器,每个部件都各司其职,共同协作,完成复杂的任务。

+

代码整洁之道:持续精进

除了上面提到的内容,我还想补充以下几点:

+
    +
  • 代码整洁是一种态度。 它不仅仅是技术问题,更是一种对代码的尊重和对专业的追求。
  • +
  • 代码整洁需要团队合作。 一个人写出整洁的代码并不难,难的是整个团队都保持一致的代码风格和质量标准。
  • +
  • 代码整洁需要持续学习。 随着技术的发展和项目的演进,代码整洁的标准也会不断变化,我们需要不断学习新的知识和方法,才能写出更好的代码。
  • +
+

我个人的建议是,不要把代码整洁看成是一种负担,而应该把它看成是一种投资。整洁的代码可以提高开发效率,降低维护成本,让你的代码更易于理解和扩展。

+

最后,我想说,代码整洁之道,没有终点,只有不断精进。让我们一起努力,写出更整洁、更优雅的代码吧!

+

开发

作为一名开发者,我深知开发不仅仅是敲代码,更是一项需要沟通、协作和不断改进的系统工程。以下是我在阅读过程中总结的一些经验:

+

持续沟通

正如书中所说:“开发者必须在许多层面上进行交流” ,与团队成员、用户和其他利益相关者的有效沟通是项目成功的关键。

+
    +
  • 与用户沟通: 了解用户的需求和期望,并确保开发的软件能够满足他们的需求。例如,在开发一个新的功能之前,可以通过用户访谈、问卷调查等方式收集用户的反馈意见。
  • +
  • 与团队成员沟通: 保持项目进度和代码质量的一致性。例如,可以通过定期召开团队会议、使用代码审查工具等方式进行沟通。
  • +
+

及时修复漏洞

代码中的漏洞就像房间里的“破窗户”,如果不及时修复,就会让房间变得越来越脏乱。因此,我们应该养成及时修复漏洞的习惯,避免问题越积越多。

+
    +
  • 使用代码分析工具: 帮助我们发现代码中的潜在问题。例如,可以使用静态代码分析工具来检查代码的语法错误、代码风格等问题。
  • +
  • 编写单元测试: 确保代码的正确性。例如,可以使用单元测试框架来编写测试用例,并定期运行测试。
  • +
+

持续重构代码

代码重构就像整理房间,可以让我们更容易地理解和维护代码。我们应该定期对代码进行重构,消除重复、冗余和难以理解的代码,让代码更简洁、更高效。

+
    +
  • 使用重构工具: 帮助我们进行代码重构。例如,可以使用 IDE 中的重构功能来进行代码重构。
  • +
  • 遵循重构原则: 确保代码重构不会改变代码的行为。例如,可以使用测试驱动开发的方式来进行代码重构。
  • +
+

使用合适的工具

工欲善其事,必先利其器。选择合适的工具可以让我们事半功倍。

+
    +
  • 版本控制工具: 例如 Git,可以帮助我们管理代码版本,方便团队协作。
  • +
  • 代码分析工具: 例如 SonarQube,可以帮助我们发现代码中的潜在问题,提高代码质量。
  • +
  • 构建工具: 例如 Maven,可以帮助我们自动化构建过程,提高开发效率。
  • +
+

保持学习的态度

软件开发是一个快速发展的领域,新的技术和工具层出不穷。作为开发者,我们需要保持学习的态度,不断学习新的知识和技能,才能跟上时代的步伐。

+
    +
  • 阅读书籍和文章: 了解最新的技术和趋势。
  • +
  • 参加培训和会议: 学习新的技能和知识。
  • +
  • 参与开源项目: 锻炼自己的开发技能,并与其他开发者交流学习。
  • +
+

注重团队合作

软件开发是一个团队合作的过程,我们需要与团队成员相互协作,才能完成项目目标。

+
    +
  • 互相帮助: 团队成员之间应该互相帮助,共同解决问题。
  • +
  • 代码审查: 通过代码审查可以发现代码中的问题,并提高代码质量。
  • +
  • 结对编程: 通过结对编程可以提高代码质量,并促进团队成员之间的沟通。
  • +
+

关注用户体验

最终用户是软件的使用者,他们的体验决定了软件的成败。

+
    +
  • 用户研究: 了解用户的需求和期望。
  • +
  • 用户界面设计: 设计易于使用和美观的用户界面。
  • +
  • 用户体验测试: 测试用户对软件的体验,并进行改进。
  • +
+

拥抱变化

软件开发是一个充满变化的过程,需求可能会变更,技术可能会更新。作为开发者,我们需要拥抱变化,灵活应对各种挑战。

+
    +
  • 敏捷开发: 采用敏捷开发方法可以帮助我们快速响应变化。
  • +
  • 持续集成和持续交付: 通过持续集成和持续交付可以帮助我们更快地将软件交付给用户。
  • +
+

追求卓越

作为注重实效的开发者,我们应该追求卓越,不断提升代码质量和开发效率,为用户提供更好的软件产品和服务。

+
    +
  • 编写高质量的代码: 代码应该是可读的、可维护的、可测试的。
  • +
  • 提高开发效率: 使用合适的工具和方法来提高开发效率。
  • +
  • 持续改进: 不断寻找改进代码和开发过程的方法。
  • +
+

享受开发的乐趣

软件开发是一项充满挑战和乐趣的工作。我们应该享受开发的过程,从中获得成就感和满足感。

+
    +
  • 选择自己喜欢的项目: 参与自己感兴趣的项目可以让我们更有动力。
  • +
  • 与团队成员一起工作: 与团队成员一起工作可以让我们更快乐。
  • +
  • 挑战自我: 不断挑战自我可以让我们获得更大的成就感。
  • +
+

总结

注重实效的开发不仅仅是编写代码,更是一项需要沟通、协作和不断改进的系统工程。通过有效的沟通、及时的修复漏洞、持续的代码重构、使用合适的工具、保持学习的态度、注重团队合作、关注用户体验、拥抱变化、追求卓越和享受开发的乐趣,我们可以成为更加注重实效的开发者,为用户提供更好的软件产品和服务。

+

让我们一起努力,用代码改变世界!(世界太大,不如从自己开始)

+

参考书籍

1.《代码整洁之道》

+

2.《程序员修炼之道:从小工到专家》

+

3.《重构:改善既有代码的设计》

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\344\275\277\347\224\250frp\345\256\236\347\216\260\345\206\205\347\275\221\347\251\277\351\200\217/index.html" "b/\344\275\277\347\224\250frp\345\256\236\347\216\260\345\206\205\347\275\221\347\251\277\351\200\217/index.html" index e69de29bb2..a659cac6b9 100644 --- "a/\344\275\277\347\224\250frp\345\256\236\347\216\260\345\206\205\347\275\221\347\251\277\351\200\217/index.html" +++ "b/\344\275\277\347\224\250frp\345\256\236\347\216\260\345\206\205\347\275\221\347\251\277\351\200\217/index.html" @@ -0,0 +1,691 @@ + + + + + + + + + + + + 使用frp进行内网穿透 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 使用frp进行内网穿透 +

使用frp进行内网穿透

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

frp是什么

简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。

+

准备

1.具有公网IP的VPS一台

+

2.内网设备一台

+

3.了解基础的Linux命令

+

步骤

服务端配置

1.下载VPS对应版本的frp服务端

+
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
+
+

2.解压文件

+
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
+
+

3.进入解压后的目录

+
cd frp_0.22.0_linux_amd64
+
+

4.修改配置文件frps.ini

+
vim frps.ini
+
+
[common]
+bind_port = 7000 
+dashboard_port = 7500
+token = 12345678
+dashboard_user = admin
+dashboard_pwd = admin
+
+

bind_port: 监听端口,后续需要在客户端使用

+

dashboard_port: 浏览器管理端访问端口

+

token: 客户端与服务端连接的口令,后续客户端配置会用到

+

dashboard_user: 管理端用户名

+

dashboard_pwd: 用户端管理密码

+

5.启动服务

+
nohup ./frps -c frps.ini &
+
+

6.浏览器访问管理端页面, 地址:x.x.x.x:7500

+

客户端配置

1.下载

+

地址: https://github.com/fatedier/frp/releases

+

image-20221105095947617

+

2.配置frpc.ini

+
[common]
+server_addr = x.x.x.x
+server_port = 7000
+token = won517574356
+[rdp]
+type = tcp
+local_ip = 127.0.0.1           
+local_port = 3389
+remote_port = 7001  
+
+

server_addr: vps的ip

+

server_port: 上面配置的port

+

token: 上面配置的口令

+

rdp: 自定义名字

+

type: 协议类型,TCP或UDP等

+

local_port: 本地应用端口

+

remote_port: 在服务端使用的端口

+

3.启动服务(不能直接双击运行)

+

打开Powershell,进入该目录

+
cd C:\frp
+./frpc -c frpc.ini
+
+

4.上面的启动方式会有一个窗口,可以修改为后台启动

+

创建一个frpc.bat,内容如下,修改cd路径

+
@echo off
+if "%1" == "h" goto begin
+mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
+:begin
+REM
+cd C:\frp
+frpc -c frpc.ini
+exit
+
+

5.点击frpc.bat启动即可

+

连接

使用对应的连接工具,输入ip+remote_port进行远程即可!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\205\215\350\264\271GPT-3.5\351\203\250\347\275\262\346\214\207\345\215\227/index.html" "b/\345\205\215\350\264\271GPT-3.5\351\203\250\347\275\262\346\214\207\345\215\227/index.html" index e69de29bb2..a03b111615 100644 --- "a/\345\205\215\350\264\271GPT-3.5\351\203\250\347\275\262\346\214\207\345\215\227/index.html" +++ "b/\345\205\215\350\264\271GPT-3.5\351\203\250\347\275\262\346\214\207\345\215\227/index.html" @@ -0,0 +1,637 @@ + + + + + + + + + + + + 🚀 免费GPT-3.5部署指南 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 🚀 免费GPT-3.5部署指南 +

🚀 免费GPT-3.5部署指南

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

OpenAI近期宣布,GPT-3.5现已支持无账号使用,这一变化无疑为全球AI爱好者带来了福音。然而,由于网络和地域限制,国内许多朋友仍然面临着使用上的挑战。

+

今天,我将向大家推荐两个开源项目,它们能够帮助您在国内部署并免费使用GPT-3.5服务。

+

1️⃣ FreeGPT35

**FreeGPT35**项目利用了OpenAI提供的免登录ChatGPT Web API,使用户能够无限制地使用GPT-3.5-Turbo服务。通过简单的Docker部署,您就可以在本地服务器上运行这一服务,享受到快速且稳定的AI体验。

+

部署步骤:

+
mkdir freegpt35 && cd freegpt35
+wget -O compose.yaml https://raw.githubusercontent.com/missuo/FreeGPT35/main/compose.yaml
+docker compose up -d
+
+

部署完成后,您可以直接访问 http://[IP]:3040/v1/chat/completions 来使用API。

+

2️⃣ Aurora

**Aurora**项目专注于提升用户体验,通过优化前端界面和增强功能,为用户提供了一个更为流畅和直观的使用环境。

+

部署步骤:

+
# 克隆Aurora项目
+git clone https://github.com/aurora-develop/aurora
+# 进入项目目录
+cd aurora
+# 使用Docker部署
+docker-compose up -d
+
+

部署完成后,您可以按照项目文档进行配置,开始使用Aurora服务。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\205\215\350\264\271\344\275\223\351\252\214Claude2/index.html" "b/\345\205\215\350\264\271\344\275\223\351\252\214Claude2/index.html" index e69de29bb2..77fc1045b3 100644 --- "a/\345\205\215\350\264\271\344\275\223\351\252\214Claude2/index.html" +++ "b/\345\205\215\350\264\271\344\275\223\351\252\214Claude2/index.html" @@ -0,0 +1,647 @@ + + + + + + + + + + + + 免费体验Claude2 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 免费体验Claude2 +

免费体验Claude2

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

image-20230712084008675

+

序言

你是否想过拥有一个能够与你聊天、搜索、写作、编程、提供有用建议的人工智能助手?你是否想过让这个助手能够理解和使用多种语言,甚至能够从长篇文档中提取和生成信息?你是否想过让这个助手能够遵循一些道德和行为准则,避免产生有害或不真实的内容?

+

如果你的答案是肯定的,那么你一定会对Claude 2感兴趣。Claude 2是Anthropic公司最新发布的人工智能系统,它是基于大型语言模型(LLM)的通用语言助手,具有多项创新和改进的功能。在这篇文章中,我们将介绍Claude 2的模型,以及现在可以使用!如何使用!有什么特点!

+

Claude 2的模型

Claude 2是基于Transformer架构的大型语言模型,它使用无监督学习、人类反馈强化学习(RLHF)和宪法式人工智能(Constitutional AI)进行训练。Claude 2是Anthropic公司自2019年开始研究RLHF以来不断迭代和进化的结果,它代表了从早期的“有用且无害”的语言助手到目前更强大、更可靠、更可控、更可解释的AI系统的持续演变。

+

Claude 2的训练数据包括从互联网上公开获取的信息、从第三方企业获得许可的数据集、以及用户主动分享或众包工作者提供的数据。Claude 2的训练数据截止于2023年初,其中约10%是非英语数据。

+

Claude 2在部署前经过了一系列的评估和红队测试,包括能力评估、安全性评估和对齐性评估,这些评估旨在测量模型在不同任务上的技能、优势和劣势,以及模型是否存在特定风险和是否符合为其设定的道德和行为期望。你可以在网页文档中查看这些评估结果的详细信息。

+

现在可以使用!

image-20230712084025314

+

Claude 2已经在2023年7月正式发布,并且可以通过Anthropic公司的控制台进行访问和使用。你只需要注册一个账号,就可以开始与Claude 2交互,并体验它所提供的各种功能。

+

你现在可以访问https://claude.ai 来使用Claude 2跟他对话,需要注意的是目前只对美国和英国的IP开放。

+

通过谷歌授权或者自己注册登录即可,再也不用担心被封号了。并且目前是完全免费的!!

+

如何使用!

Claude 2可以通过多种方式进行使用,包括:

+
    +
  • 聊天模式:你可以直接与Claude 2进行自由对话,询问任何你感兴趣或需要帮助的话题。Claude 2会尽力给出有用、真实、无害的回答,并且根据你提供的反馈进行调整。
  • +
  • 搜索模式:你可以向Claude 2提出搜索请求,例如“搜索最新的核聚变实验”,或者“搜索关于狗狗训练的视频”。Claude 2会根据你的请求进行网络搜索,并返回相关结果。
  • +
  • 写作模式:你可以向Claude 2提出写作请求,例如“写一首关于春天的诗”,或者“写一篇关于人工智能的文章”。Claude 2会根据你的请求生成相应的内容,并且可以使用markdown格式进行排版。
  • +
  • 编程模式:你可以向Claude 2提出编程请求,例如“写一个Python函数,实现两个数的加法”,或者“写一个JavaScript代码,实现一个计算器”。Claude 2会根据你的请求生成相应的代码,并且可以使用code block格式进行显示。
  • +
  • 建议模式:你可以向Claude 2寻求建议,例如“我应该怎么学习英语”,或者“我应该怎么减肥”。Claude 2会根据你的情况给出有用、合理、友好的建议,并且可以提供相关的资源或链接。
  • +
+

有什么特点!

Claude 2有以下几个特点,使它与其他人工智能系统有所不同:

+
    +
  • 多语言能力:Claude 2可以理解和使用多种语言,包括英语、中文、日语、西班牙语、法语、德语等。你可以用任何你喜欢的语言与Claude 2交流,它会自动识别并回复。你也可以让Claude 2帮你翻译文本,它会尽力提供准确和流畅的翻译。
  • +
  • 长文本处理能力:Claude 2可以处理长达200K个token(约15万个字)的文本,这意味着它可以阅读和生成长篇文章、小说、报告等。你可以让Claude 2帮你从长文本中提取和生成信息,例如摘要、关键点、结论等。
  • +
  • 道德和行为准则:Claude 2遵循一套宪法,即一组道德和行为准则,用来指导它的输出。这些准则包括有用性、真实性和无害性,以及一些具体的规则,例如避免性别歧视、种族歧视和有毒内容,以及避免帮助人类进行非法或不道德的活动。这些准则旨在保护人类和社会的利益,防止人工智能造成伤害。
  • +
+

以上就是我们对Claude 2的介绍,希望你能够喜欢并尝试使用这个人工智能助手。如果你有任何反馈或建议,请随时联系我们。谢谢!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\205\215\350\264\271\346\216\245\347\240\201\345\271\263\345\217\260\346\216\250\350\215\220/index.html" "b/\345\205\215\350\264\271\346\216\245\347\240\201\345\271\263\345\217\260\346\216\250\350\215\220/index.html" index e69de29bb2..784610a19e 100644 --- "a/\345\205\215\350\264\271\346\216\245\347\240\201\345\271\263\345\217\260\346\216\250\350\215\220/index.html" +++ "b/\345\205\215\350\264\271\346\216\245\347\240\201\345\271\263\345\217\260\346\216\250\350\215\220/index.html" @@ -0,0 +1,645 @@ + + + + + + + + + + + + 免费接码平台推荐 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 免费接码平台推荐 +

免费接码平台推荐

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

在这个数字化的世界里,接码平台的需求日益增长。这些平台允许用户接收短信,无论他们身处何处。下面,我们为您提供了一份详尽的国内外免费接码平台列表:

+

国内免费接码平台:

    +
  1. SMS.CM
  2. +
  3. PDFLIBR
  4. +
  5. BECMD
  6. +
  7. SMSZK
  8. +
+

国外免费接码平台:

    +
  1. My Trash Mobile(中文)
  2. +
  3. Free Phone Num(中文)
  4. +
  5. SMS Receive Free
  6. +
  7. Receive SMS Online for FREE
  8. +
  9. Receive a SMS Online
  10. +
  11. Free SMS Numbers Online
  12. +
  13. Receive SMS online for Free
  14. +
  15. Receive-SMS
  16. +
  17. Receive FREE SMS online
  18. +
  19. RECEIVE SMS ONLINE
  20. +
  21. Free Online Phone
  22. +
  23. Receive SMS Online
  24. +
  25. TextNow
  26. +
  27. Textfree
  28. +
  29. SELLAITE
  30. +
  31. Twilio
  32. +
+

以上是我们为您精选的一些免费接码平台,希望可以帮助您在需要的时候接收短信。请注意,使用这些服务时应遵守所有适用的法律和规定。

+

请合理使用,享受免费接码服务!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\205\215\350\264\271\346\220\255\345\273\272\346\227\240\351\231\220\345\210\266GPT3.5API\346\234\215\345\212\241/index.html" "b/\345\205\215\350\264\271\346\220\255\345\273\272\346\227\240\351\231\220\345\210\266GPT3.5API\346\234\215\345\212\241/index.html" index e69de29bb2..2dc526a76b 100644 --- "a/\345\205\215\350\264\271\346\220\255\345\273\272\346\227\240\351\231\220\345\210\266GPT3.5API\346\234\215\345\212\241/index.html" +++ "b/\345\205\215\350\264\271\346\220\255\345\273\272\346\227\240\351\231\220\345\210\266GPT3.5API\346\234\215\345\212\241/index.html" @@ -0,0 +1,623 @@ + + + + + + + + + + + + 免费搭建无限制GPT3.5API服务 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 免费搭建无限制GPT3.5API服务 +

免费搭建无限制GPT3.5API服务

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

我们很高兴地宣布,ChatGPT最近开放了免注册使用的GPT-3.5服务。这是一个重大的进步,它将为开发者和使用者提供更加便利的体验。

+

image-20240404190823411

+

在GitHub上,已经有相关的项目出现,利用免登录ChatGPT Web提供的无限制免费GPT-3.5-Turbo API服务。您可以通过以下链接访问和使用这个项目:

+

FreeGPT35

+

我们强烈建议所有的用户合理使用这项服务,以确保其可持续性。感谢您的理解和支持,我们期待您的反馈和建议,以帮助我们持续改进和提升这项服务。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\205\215\350\264\271\350\257\225\347\224\250\344\270\200\344\270\252\346\234\210\347\232\204GPT4/index.html" "b/\345\205\215\350\264\271\350\257\225\347\224\250\344\270\200\344\270\252\346\234\210\347\232\204GPT4/index.html" index e69de29bb2..76946cd574 100644 --- "a/\345\205\215\350\264\271\350\257\225\347\224\250\344\270\200\344\270\252\346\234\210\347\232\204GPT4/index.html" +++ "b/\345\205\215\350\264\271\350\257\225\347\224\250\344\270\200\344\270\252\346\234\210\347\232\204GPT4/index.html" @@ -0,0 +1,632 @@ + + + + + + + + + + + + 免费试用一个月的GPT4 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 免费试用一个月的GPT4 +

免费试用一个月的GPT4

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + + + + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\210\206\345\270\203\345\274\217\345\234\272\346\231\257\350\247\243\345\206\263\346\226\271\346\241\210/index.html" "b/\345\210\206\345\270\203\345\274\217\345\234\272\346\231\257\350\247\243\345\206\263\346\226\271\346\241\210/index.html" index e69de29bb2..13b1ba1d04 100644 --- "a/\345\210\206\345\270\203\345\274\217\345\234\272\346\231\257\350\247\243\345\206\263\346\226\271\346\241\210/index.html" +++ "b/\345\210\206\345\270\203\345\274\217\345\234\272\346\231\257\350\247\243\345\206\263\346\226\271\346\241\210/index.html" @@ -0,0 +1,873 @@ + + + + + + + + + + + + 分布式场景解决方案 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 分布式场景解决方案 +

分布式场景解决方案

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

分布式与集群

+

image-20221020094124287

+

一致性Hash算法

为什么要用Hash

Hash算法常用于数据存储与查找领域,最经典的就是Hash表,查询效率高,查询时间复杂度可以接近于O(1)

+

案例:提供一组数据1,4,6,2,7,8,如何判断n是否存在于这组数据中?

+

1.使用循环匹配的方式,即顺序查找法,效率不高

+

2.通过折半查找的方式,即二分查找法,效率依旧不高

+

3.创建一个数组,使用数据做下标存值,查询时,只需要判断n对应的下标是否存在值,即可判断n是否存在于数据中.即直接寻址法

+

4.直接寻址法优点是可以一次查找到结果,速度块,而缺点是浪费空间,当这组数据间隔较大时,需要创建一个较大的数组,并且其中大部分空间未被使用.因此,可以将数据进行求模运算法,即除留余数法

+

5.但是取模运算可能出现多个同样的值出现在同一位置,造成hash冲突,这时,可以将值存在前后的空位,即开放寻址法

+

6.假若前后没有空位,则开放寻址法不可使用,这时我们想到使用链表,在一个位置出现多个值的时候,可以使用链表的形式进行连接.即拉链法

+

7.但是拉链法实际上也是依赖于hash算法,若是算法太差,会导致数据全部存在数组某个位置的链表中,导致查询效率变低.

+

8.因此我们使用Hash结构时,我们需要考虑到hash算法的优劣,如我们常使用的HashCode就是一种hash算法的实现.

+

Hash算法的应用

Hash算法在很多分布式集群产品中都有应用,比如分布式集群架构Redis,Hadoop,Nginx负载均衡,Mysql分库分表等.

+

归纳起来就是以下两种:

+

1.请求的负载均衡(比如nginx的ip_hash策略)

+

Nginx的IP_hash策略可以在客户端Ip不变的情况下,将其发出的请求始终路由到同一个目标服务器上,实现会话粘连.避免处理session共享问题

+

2.分布式存储

+

以分布式内存数据库Redis为例,集群中有redis1,redis2.redis3三台服务器,

+

那么可以通过hash处理,计算数据存储时,存储到具体的某一台服务器中.

+

普通Hash算法的问题

普通Hash算法存在⼀个问题,以ip_hash为例,假定下载⽤户ip固定没有发⽣改变,现在tomcat3出现 了问题,down机了,服务器数量由3个变为了2个,之前所有的求模都需要重新计算。

+

image-20221020105930537

+

如果在真实⽣产情况下,后台服务器很多台,客户端也有很多,那么影响是很⼤的,缩容和扩容都会存 在这样的问题,⼤量⽤户的请求会被路由到其他的⽬标服务器处理,⽤户在原来服务器中的会话都会丢失.

+

一致性Hash算法

以0为起点,2的32次方减1作为终点构建一个圆环,针对用户和服务器ip进行hash.然后将用户分配给顺时针方向距离最近的服务器节点

+

image-20221020110606790

+

这样,当某一个服务器节点上下线时,只会影响当前区间的用户

+

image-20221020110657564

+

但是,当节点太少时,如两个节点,可能会导致大量的用户请求落在节点1上,造成数据倾斜问题.

+

为了解决数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每个服务器节点计算多次哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点

+

image-20221020111612140

+

集群时钟同步问题

即集群部署时服务器时间的同步,若每个服务器的时间不一致,则将导致最终入库的数据混乱.

+

image-20221020142854776

+

集群时钟同步思路

服务器节点能够联网

image-20221020143044470

+
#使⽤ ntpdate ⽹络时间同步命令
+ntpdate -u ntp.api.bz #从⼀个时间服务器同步时间
+
+

定时执行同步命令

+

服务器节点不能联网

image-20221020143143091

+

将一台服务器节点A作为时间服务器,其他服务器与此服务器保持时间同步.

+

1.设置好服务器节点A的时间

+

2.把A配置为时间服务器,修改/etc/ntp.conf文件

+
1、如果有 restrict default ignore,注释掉它
+2、添加如下⼏⾏内容
+ restrict 172.17.0.0 mask 255.255.255.0 nomodify notrap # 放开局
+域⽹同步功能,172.17.0.0是你的局域⽹⽹段
+ server 127.127.1.0 # local clock
+ fudge 127.127.1.0 stratum 10
+3、重启⽣效并配置ntpd服务开机⾃启动
+ service ntpd restart
+ chkconfig ntpd on
+
+

3.集群中其他节点就可以从A服务器同步时间了

+
ntpdate 172.17.0.17
+
+

分布式ID解决方案

UUID

UUID 是指Universally Unique Identifier,翻译为中⽂是通⽤唯⼀识别码 产⽣重复 UUID 并造成错误的情况⾮常低,是故⼤可不必考虑此问题

+

独立数据库的自增ID

⽐如A表分表为A1表和A2表,那么肯定不能让A1表和A2表的ID⾃增,那么ID怎么获取呢?我们可 以单独的创建⼀个Mysql数据库,在这个数据库中创建⼀张表,这张表的ID设置为⾃增,其他地⽅ 需要全局唯⼀ID的时候,就模拟向这个Mysql数据库的这张表中模拟插⼊⼀条记录,此时ID会⾃ 增,然后我们可以通过Mysql的select last_insert_id() 获取到刚刚这张表中⾃增⽣成的ID

+

SnowFlake雪花算法

雪花算法是Twitter推出的⼀个⽤于⽣成分布式ID的策略。 雪花算法是⼀个算法,基于这个算法可以⽣成ID,⽣成的ID是⼀个long型.

+

基于Redis获取

Redis Incr 命令将 key 中储存的数字值增⼀。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执⾏ INCR 操作

+

image-20221020143805156

+

分布式调度问题

调度—>定时任务,分布式调度—>在分布式集群环境下定时任务这件事

+

Elastic-job(当当⽹开源的分布式调度框架)

+

定时任务的场景

定时任务形式:每隔⼀定时间/特定某⼀时刻执⾏

+

例如:

+
    +
  • 订单审核、出库
  • +
  • 订单超时⾃动取消、⽀付退款
  • +
  • 礼券同步、⽣成、发放作业
  • +
  • 物流信息推送、抓取作业、退换货处理作业
  • +
  • 数据积压监控、⽇志监控、服务可⽤性探测作业
  • +
  • 定时备份数据
  • +
  • ⾦融系统每天的定时结算
  • +
  • 数据归档、清理作业
  • +
  • 报表、离线数据分析作业
  • +
+

什么是分布式调度

什么是分布式任务调度?有两层含义

+

1)运⾏在分布式集群环境下的调度任务(同⼀个定时任务程序部署多份,只应该有⼀个定时任务在执⾏)

+

2)分布式调度—>定时任务的分布式—>定时任务的拆分(即为把⼀个⼤的作业任务拆分为多个⼩的作 业任务,同时执⾏)

+

image-20221020144244490

+

定时任务与消息队列的区别

共同点

1.异步处理

+

⽐如注册、下单事件

+

2.应用解耦

+

不管定时任务作业还是MQ都可以作为两个应⽤之间的⻮轮实现应⽤解耦,这个⻮轮可以中转数据,当然单体服务不需要考虑这些,服务拆分的时候往往都会考虑

+

3.流量削峰

+

双⼗⼀的时候,任务作业和MQ都可以⽤来扛流量,后端系统根据服务能⼒定时处理订单或者 从MQ抓取订单抓取到⼀个订单到来事件的话触发处理,对于前端⽤户来说看到的结果是已经下单成功了,下单是不受任何影响的

+

不同点

定时任务是时间驱动,而MQ是事件驱动.

+

定时任务倾向于批处理,而MQ倾向于逐条处理

+

时间驱动是不可代替的,⽐如⾦融系统每⽇的利息结算,不是说利息来⼀条(利息到来事件)就算 ⼀下,⽽往往是通过定时任务批量计算.

+

定时任务的实现方式

定时任务的实现⽅式有多种。早期没有定时任务框架的时候,我们会使⽤JDK中的Timer机制和多线程机 制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执⾏某⼀段程序;后来有了定时任务框架,⽐ 如⼤名鼎鼎的Quartz任务调度框架,使⽤时间表达式(包括:秒、分、时、⽇、周、年)配置某⼀个任 务什么时间去执⾏;

+

Quartz

使用步骤

+

1.引入jar

+
<!--任务调度框架quartz-->
+<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --
+>
+<dependency>
+ <groupId>org.quartz-scheduler</groupId>
+ <artifactId>quartz</artifactId>
+ <version>2.3.2</version>
+</dependency>
+
+

2.定时任务主调度程序

+
package quartz;
+import org.quartz.*;
+import org.quartz.impl.StdSchedulerFactory;
+public class QuartzMain {
+ // 创建作业任务调度器(类似于公交调度站)
+ public static Scheduler createScheduler() throws
+SchedulerException {
+ SchedulerFactory schedulerFactory = new StdSchedulerFactory();
+ Scheduler scheduler = schedulerFactory.getScheduler();
+ return scheduler;
+ }
+ // 创建⼀个作业任务(类似于⼀辆公交⻋)
+ public static JobDetail createJob() {
+ JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class);
+ jobBuilder.withIdentity("jobName","myJob");
+ JobDetail jobDetail = jobBuilder.build();
+ return jobDetail;
+ }
+ /**
+ * 创建作业任务时间触发器(类似于公交⻋出⻋时间表)
+ * cron表达式由七个位置组成,空格分隔
+ * 1、Seconds(秒) 0~59
+ * 2、Minutes(分) 0~59
+ * 3、Hours(⼩时) 0~23
+ * 4、Day of Month(天)1~31,注意有的⽉份不⾜31天
+ * 5、Month(⽉) 0~11,或者
+JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
+ * 6、Day of Week(周) 1~7,1=SUN或者 SUN,MON,TUE,WEB,THU,FRI,SAT
+* 7、Year(年)1970~2099 可选项
+ *示例:
+ * 0 0 11 * * ? 每天的11点触发执⾏⼀次
+ * 0 30 10 1 * ? 每⽉1号上午10点半触发执⾏⼀次
+ */
+ public static Trigger createTrigger() {
+ // 创建时间触发器,按⽇历调度
+ CronTrigger trigger = TriggerBuilder.newTrigger()
+ .withIdentity("triggerName","myTrigger")
+ .startNow()
+ .withSchedule(CronScheduleBuilder.cronSchedule("0/2 *
+* * * ?"))
+ .build();
+ // 创建触发器,按简单间隔调度
+ /*SimpleTrigger trigger1 = TriggerBuilder.newTrigger()
+ .withIdentity("triggerName","myTrigger")
+ .startNow()
+ .withSchedule(SimpleScheduleBuilder
+ .simpleSchedule()
+.withIntervalInSeconds(3)
+.repeatForever())
+ .build();*/
+ return trigger;
+ }
+ // 定时任务作业主调度程序
+ public static void main(String[] args) throws SchedulerException {
+ // 创建⼀个作业任务调度器(类似于公交调度站)
+ Scheduler scheduler = QuartzMain.createScheduler();
+ // 创建⼀个作业任务(类似于⼀辆公交⻋)
+ JobDetail job = QuartzMain.createJob();
+ // 创建⼀个作业任务时间触发器(类似于公交⻋出⻋时间表)
+ Trigger trigger = QuartzMain.createTrigger();
+ // 使⽤调度器按照时间触发器执⾏这个作业任务
+ scheduler.scheduleJob(job,trigger);
+ scheduler.start();
+ }
+}
+
+

3.定义一个job,需要实现Job接口

+
package quartz;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+public class DemoJob implements Job {
+ public void execute(JobExecutionContext jobExecutionContext)
+throws JobExecutionException {
+ System.out.println("我是⼀个定时任务逻辑");
+ }
+}
+
+

Elastic-Job

Elastic-Job是当当⽹开源的⼀个分布式调度解决⽅案,基于Quartz⼆次开发的,由两个相互独⽴的⼦项 ⽬Elastic-Job-Lite和Elastic-Job-Cloud组成。我们要学习的是 Elastic-Job-Lite,它定位为轻量级⽆中⼼ 化解决⽅案,使⽤Jar包的形式提供分布式任务的协调服务,⽽Elastic-Job-Cloud⼦项⽬需要结合Mesos 以及Docker在云环境下使⽤。

+

image-20221020151010610

+

原理

基于Zookeeper的Leader节点选举机制

+

每个Elastic-Job的任务执⾏实例App作为Zookeeper的客户端来操作ZooKeeper的znode

+

(1)多个实例同时创建/leader节点

+

(2)/leader节点只能创建⼀个,后创建的会失败,创建成功的实例会被选为leader节点, 执⾏任

+

任务分片

⼀个⼤的⾮常耗时的作业Job,⽐如:⼀次要处理⼀亿的数据,那这⼀亿的数据存储在数据库中,如果 ⽤⼀个作业节点处理⼀亿数据要很久,在互联⽹领域是不太能接受的,互联⽹领域更希望机器的增加去 横向扩展处理能⼒。所以,ElasticJob可以把作业分为多个的task(每⼀个task就是⼀个任务分⽚),每 ⼀个task交给具体的⼀个机器实例去处理(⼀个机器实例是可以处理多个task的),但是具体每个task 执⾏什么逻辑由我们⾃⼰来指定。

+

image-20221020151149163

+

弹性扩容

新增加⼀个运⾏实例app3,它会⾃动注册到注册中⼼,注册中⼼发现新的服务上线,注册中⼼会通知 ElasticJob 进⾏重新分⽚,那么总得分⽚项有多少,那么就可以搞多少个实例机器,⽐如完全可以分1000⽚

+

image-20221020151256005

+

Session共享问题

多服务器之间的Session同步问题

+

image-20221020145641476

+

解决方案

Nginx的IP_Hash策略(可以使用)

同⼀个客户端IP的请求都会被路由到同⼀个⽬标服务器,也叫做会话粘滞

+

优点

+

配置简单,不入侵应用,不需要额外修改代码

+

缺点

+

1.服务器重启session丢失

+

2.存在单点负载高的风险

+

3.单点故障问题

+

Session复制(不推荐)

多个tomcat之间修改配置文件,达到Session之间的同步

+

image-20221020150014770

+

优点

+

1.不入侵应用

+

2.便于服务器水平扩展

+

3.能适应各种负载均衡策略

+

4.服务器重启或者宕机不会造成Session丢失

+

缺点

+

1.性能低

+

2.内存消耗

+

3.不能存储太多数据,否则容易影响性能

+

4.延迟性

+

Session共享,Session集中存储(推荐)

使用缓存中间件存储Session,如Redis

+

image-20221020150238360

+

优点

+

1.能适应各种负载均衡策略

+

2.服务器宕机不会造成Session丢失

+

3.扩展能力强

+

4.适合大集群使用

+

缺点

+

对应用有入侵,引入了Redis的交互代码

+

使用

+

1.引入jar

+
<dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-redis</artifactId>
+</dependency>
+<dependency>
+ <groupId>org.springframework.session</groupId>
+ <artifactId>spring-session-data-redis</artifactId>
+</dependency>
+
+

2.配置redis

+
spring.redis.database=0
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+
+

3.添加注解

+

image-20221020150455776

+

image-20221020150530675

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\212\250\346\200\201\345\255\227\346\256\265\345\255\230\345\202\250/index.html" "b/\345\212\250\346\200\201\345\255\227\346\256\265\345\255\230\345\202\250/index.html" index e69de29bb2..1a0e9d44cb 100644 --- "a/\345\212\250\346\200\201\345\255\227\346\256\265\345\255\230\345\202\250/index.html" +++ "b/\345\212\250\346\200\201\345\255\227\346\256\265\345\255\230\345\202\250/index.html" @@ -0,0 +1,640 @@ + + + + + + + + + + + + 动态字段存储解决方案 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 动态字段存储解决方案 +

动态字段存储解决方案

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

一.前言

最近遇到了一个存储动态字段的问题,根据以往的项目经验,以及查阅相关资料,记录总结一下解决方案

+

image-20220928201152792

+

二.解决方案

1.列模型

+

建表时预留一些空白字段

+

image-20220928201200999

+

2.行模型

+

将动态字段以key-value形式存储到表中,然后通过id关联到业务上

+

image-20220928201211674

+

3.EAV模型

+

EAV模型,就是把实体-属性-值(Entity-Attribute-Value)分开表进行存储。实体表存储对象的ID和主要属性,属性表存储需要扩展的属性,值表由不同类型的表组成一个集合,一个值需要由实体ID+属性ID来确定。

+

image-20220928201230970

+

4.JSON模型

+

直接将所有字段以json格式进行存储,增删改查逻辑有代码层面实现

+

image-20220928201241016

+

总结

不同的方案各有优劣,根据实际情况进行取舍!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\215\232\345\256\242\350\207\252\350\277\260/index.html" "b/\345\215\232\345\256\242\350\207\252\350\277\260/index.html" index e69de29bb2..269f25ebf6 100644 --- "a/\345\215\232\345\256\242\350\207\252\350\277\260/index.html" +++ "b/\345\215\232\345\256\242\350\207\252\350\277\260/index.html" @@ -0,0 +1,624 @@ + + + + + + + + + + + + Hello World - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Hello World +

Hello World

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

我是如何开始写博客的?

在CSDN和博客园上,我开始尝试用文章来记录Java的一些复杂知识点。虽然我陆续写了几十篇,但由于这两个平台的用户体验不佳,我逐渐失去了动力。文章的撰写过程变得痛苦,而网站的速度慢且界面不美观。更糟糕的是,CSDN还需要对文章进行审核,且主题定制的自由度极低。

+

随后,我转向了微信公众号。我开始同步更新个人博客的文章到这个平台,内容基本相同。我最初并不想使用微信公众号,因为它不支持Markdown,使得撰写过程变得繁琐。但考虑到未来的发展以及可能的商业化操作,我还是决定重新开始。

+

我为什么想要写博客?

最初,我写博客主要是为了记录我平时学到的知识,期待有一天可能会翻阅复习。但事实证明,我很少回头查看我以前写的内容。

+

然而,写博客的另一个主要目标是分享我所知道的知识,希望能够帮助更多的人。写博客让我有机会认识到来自各地的朋友,无论是在校生,还是有多年工作经验的人,甚至是初高中生,都在学习编程。我觉得这是一个扩展人脉的好机会。

+

最后,我想引用一句话:“不以盈利为目的的博客最后都死亡了”。如果没有任何收入,很少有人会有决心坚持更新博客。虽然我也希望从中获得收益,但我并不打算为了吸引更多的粉丝而改变我的初衷,去写一些刻意迎合大众的文章。

+

运营和维护博客需要多少时间和金钱?

我计划持续更新我的博客,把它当作记录自己生活和工作的一种方式。不过,至于需要多少时间和金钱来运营和维护,那还有待观察。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\246\202\344\275\225\351\200\211\346\213\251\345\220\210\351\200\202\347\232\204\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201/index.html" "b/\345\246\202\344\275\225\351\200\211\346\213\251\345\220\210\351\200\202\347\232\204\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201/index.html" index e69de29bb2..2aa246fe21 100644 --- "a/\345\246\202\344\275\225\351\200\211\346\213\251\345\220\210\351\200\202\347\232\204\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201/index.html" +++ "b/\345\246\202\344\275\225\351\200\211\346\213\251\345\220\210\351\200\202\347\232\204\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201/index.html" @@ -0,0 +1,705 @@ + + + + + + + + + + + + 如何选择合适的开源许可证 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 如何选择合适的开源许可证 +

如何选择合适的开源许可证

+
+ + + + +
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+
    +
  • 开源许可证有多种类型,根据是否允许闭源分发或链接,可以分为两大类:copyleft(左版权)和permissive(宽松)。
  • +
  • copyleft许可证要求任何使用或修改了开源软件的人必须以相同或兼容的许可证发布衍生作品,保证开源软件的自由性。最常见的copyleft许可证有GNU GPLGNU LGPLAGPLEPLMPL
  • +
  • permissive许可证允许使用或修改了开源软件的人以任何方式发布衍生作品,包括闭源分发或链接,只要保留原始作者的版权声明。最常见的permissive许可证有MITApache 2.0BSDISC
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
许可证类型允许闭源分发允许闭源链接要求保留版权声明要求公开修改源码
GNU GPLcopyleft
GNU LGPLcopyleft
AGPLcopyleft
EPLcopyleft
MPLcopyleft
MITpermissive
Apache 2.0permissive
BSD 3-Clausepermissive
ISCpermissive
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\274\200\346\272\220\345\233\276\345\272\212PicGo/index.html" "b/\345\274\200\346\272\220\345\233\276\345\272\212PicGo/index.html" index e69de29bb2..7ef0835d58 100644 --- "a/\345\274\200\346\272\220\345\233\276\345\272\212PicGo/index.html" +++ "b/\345\274\200\346\272\220\345\233\276\345\272\212PicGo/index.html" @@ -0,0 +1,685 @@ + + + + + + + + + + + + 优秀的开源图床picGo - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 优秀的开源图床picGo +

优秀的开源图床picGo

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

应用概述

PicGo:一款用于快速上传图片并获取图片URL链接的工具。

+

PicGo 支持以下图床:

+
    +
  • 七牛图床 v1.0
  • +
  • 腾讯云 COS v4\v5 版本 v1.1 & v1.5.0
  • +
  • 又拍云 v1.2.0
  • +
  • GitHub v1.5.0
  • +
  • SM.MS V2 v2.3.0-beta.0
  • +
  • 阿里云 OSS v1.6.0
  • +
  • Imgur v1.6.0
  • +
+

下载地址

官方地址

+

使用教程

img

+

配置 GitHub 图床

经常写博客的同学都知道,有一个稳定又好用的图床是多么重要。一旦有一天图床服务不能用了,那之前的图片岂不是都挂了。直到遇到了 PicGo + GitHub,彻底打消了我的所有顾虑,而且配置简单,使用优雅。背靠 GitHub 和微软,稳定性问题基本不用担心。还有就是支持 Windows,macOS 和 Linux 平台。

+

配置 Github

1.新建仓库:

image-20220928105836128 + +

注意:仓库得设置为 Public 。因为后面通过客户端访问算是外部访问,因此无法访问 Private ,这样的话图片传上来之后只能存储不能显示。

+

仓库建好之后,点击页面右上角,进入 Settings, 点击 Personal access tokens,再点 Generate new token 新建 token。

+

image-20220929182849776

+

填写 Notes 信息,选择 token 过期时间,为了安全,GitHub 会强烈建议不要设置成永久。这个大家根据自己实际情况选择,到期之后重新生成即可。

+

复选框的话,repo 一定要全选,其他的无所谓,我是都勾选了。

+

确定之后,就生成我们需要的 token 了。

+

2.配置 PicGO

打开 PicGo 进行配置:

+image-20220928110310483 + +
    +
  • 设定仓库名:上文在 GitHub 创建的仓库。

    +
  • +
  • 设定分支名:main。

    +
  • +
  • 设定 Token:上文生成的 token。

    +
  • +
  • 指定存储路径:为空的话会上传到根目录,也可以指定路径。

    +
  • +
  • 设定自定义域名:可以为空,这里为了使用 CDN 加快图片的访问速度,按这样的格式填写:https://cdn.jsdelivr.net/gh/用户名/仓库名

    +

    配置完成后就可以使用了。

    +image-20220928110413740 + +

    最后

    图床有很多方案,可以根据自己的实际情况进行选择。

    +

    聚合图床-推荐

    官网地址:https://www.superbed.cn

    +

    简介:将图片分发到多处备份,借助其本身的 CDN 加速功能,节省服务器流量,并且不用担心图片被删除,即便其中某几个图床上的图片被删除了,还有其他备份,保证万无一失,支持匿名和注册管理。

    +

    图片上传限制:无

    +

    路过图床-推荐

    官网地址:https://imgchr.com

    +

    简介:支持免注册上传图片,永久存储,支持 HTTPS 加密访问和调用图片,提供多种图片链接格式,成立于 2011 年。

    +

    限制:最大 10M

    +

    SM.MS

    官网地址:https://sm.ms

    +

    特点:永久存储免注册,图片链接支持 https,可以删除上传的图片,提供多种图片链接格式,建立于 2015 年,目前免费用户无法使用香港节点。

    +

    图片上传限制:每个图片最大 5M,每次最多上传 10 张。

    +

    七牛云

    官网地址:https://portal.qiniu.com

    +

    简介:注册认证后有 10G 永久免费空间,每月 10G 国内和 10G 国外流量,速度相当快,七牛云是国内专业 CDN 服务商,插件支持比较多,有免费 SSL 证书,但 https 流量收费。

    +

    注意:七牛云 30 天后会回收测试域名,因此你必须要绑定自己的已经备案的域名。

    +

    图片上传限制:无

    +

    又拍云

    官网地址:https://www.upyun.com

    +

    简介:注册认证后有 10G 永久免费空间,每月 15G 的 HTTP 和 HTTPS 流量,提供两款可以免费续期的 SSL 证书,不过用户需要加入又拍云联盟(即在网站底部添加又拍云 logo 及官网链接)。

    +

    注意:需要绑定自己的已备案域名,又拍云认证比较麻烦,建议使用七牛云。

    +

    图片上传限制:无

    +

    腾讯云-免费有时间限制

    官网地址:https://cloud.tencent.com

    +

    简介:仅可以使用六个月的免费存储容量、免费请求和免费流量,不推荐使用。

    +

    限制:时间、流量、空间大小均有限制。

    +
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\274\200\351\200\232ChatGPT-Plus\346\227\240\345\277\247\346\214\207\345\215\227/index.html" "b/\345\274\200\351\200\232ChatGPT-Plus\346\227\240\345\277\247\346\214\207\345\215\227/index.html" index e69de29bb2..64b17e14b3 100644 --- "a/\345\274\200\351\200\232ChatGPT-Plus\346\227\240\345\277\247\346\214\207\345\215\227/index.html" +++ "b/\345\274\200\351\200\232ChatGPT-Plus\346\227\240\345\277\247\346\214\207\345\215\227/index.html" @@ -0,0 +1,652 @@ + + + + + + + + + + + + 开通ChatGPT Plus:无忧指南 🌟 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 开通ChatGPT Plus:无忧指南 🌟 +

开通ChatGPT Plus:无忧指南 🌟

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

🚀 Plus订阅,触手可及

很多人想要开通ChatGPT Plus,却苦于没有合适的渠道。市面上的黑卡方法不仅风险高,还可能导致账号被封。本文将为你提供一个安全、可靠的开通Plus的方法。🔐

+

💡 准备工作,一切从简

开始之前,你需要准备以下三样东西:

+
    +
  1. 一张Visa信用卡
  2. +
  3. 一个美区的谷歌账号
  4. +
  5. 一个ChatGPT账号
  6. +
+

有了这些,你就可以顺利开通Plus服务了。🎫

+

🌐 美区账号,轻松拥有

如果你已经拥有美区账号,那么恭喜你,可以直接跳到下一步。如果没有,不用担心,按照以下步骤操作即可。🛠️

+
    +
  • 打开Play商店,点击账户头像-设置-常规-账号和设备偏好设置,检查是否显示为美国。
  • +
+

image-20240413080301160

+
    +
  • 如果不是,通过谷歌账户设置更改付款方式,填写美区付款资料,关闭原有的其他区域付款资料。具体如下:

    +

    访问地址Google Account

    +

    image-20240413080531374

    +

    添加美国地址,注意添加地址时,需要选择免税区,否则后续开通需要交税! 例如:俄勒冈州(Oregon)邮政编码97230

    +

    image-20240413080848559

    +
  • +
+

建议挂上美国节点进行操作(不是必须的)。

+

删除付款资料会将当前谷歌账户的余额清零,请确认自己是否需要保留余额,建议消费完再进行换区操作。

+

此方法可无限次数更改账号所在地区

+

💳 Visa卡,畅通无阻

进入Play商店添加付款方式,选择添加信用卡或借记卡。添加国内的Visa双币卡,就像添加一张普通银行卡一样简单。🏦

+

image-20240413081028011

+

✨ ChatGPT Plus,尽在掌握

最后,下载ChatGPT并登录账号,通过内购流程开通Plus服务,享受更多功能。📥

+
+

以上就是开通ChatGPT Plus的详细步骤。操作简单,安全可靠,赶快试试吧!🌈

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\345\277\205\345\272\224ChatGPT\345\206\205\346\265\213\347\224\263\350\257\267\346\225\231\347\250\213/index.html" "b/\345\277\205\345\272\224ChatGPT\345\206\205\346\265\213\347\224\263\350\257\267\346\225\231\347\250\213/index.html" index e69de29bb2..3387798e85 100644 --- "a/\345\277\205\345\272\224ChatGPT\345\206\205\346\265\213\347\224\263\350\257\267\346\225\231\347\250\213/index.html" +++ "b/\345\277\205\345\272\224ChatGPT\345\206\205\346\265\213\347\224\263\350\257\267\346\225\231\347\250\213/index.html" @@ -0,0 +1,652 @@ + + + + + + + + + + + + 必应ChatGPT内测申请教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 必应ChatGPT内测申请教程 +

必应ChatGPT内测申请教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

有时候,当你在访问www.bing.com时,会发现页面重定向到cn.bing.com,这很可能是因为你的地理位置。为了避免这种情况,可以使用Header Editor插件。

+

Header Editor是一款浏览器插件,可以帮助我们在请求网页时修改HTTP头信息,从而防止页面重定向。下面是使用Header Editor插件防止Bing重定向到cn.bing.com的步骤。

+

安装插件

首先,需要安装Header Editor插件。

+
    +
  1. 打开Edge浏览器,点击“应用商店”图标。
  2. +
  3. 在搜索栏中输入“Header Editor”。
  4. +
  5. 选择Header Editor插件,点击“Get”按钮进行安装。
  6. +
  7. 安装完成后,点击“启用”,使插件生效。
  8. +
+

image-20230212143346657

+

使用插件

安装完Head Edit插件后,就可以使用它防止Bing重定向了。

+

image-20230212143432940

+
    +
  1. 打开Edge浏览器,访问www.bing.com。
  2. +
  3. 点击Head Edit插件的图标,打开插件设置面板。
  4. +
  5. 在“Custom headers”栏中,输入以下内容:
  6. +
+

image-20230212143706297

+

​ 若是不行,调整匹配规则如下:

+
^http(s?)://(www\.)?bing\.com/?(.*)=
+
+
    +
  1. 点击“Save”按钮保存设置。

    +
  2. +
  3. 重新访问www.bing.com,此时页面不会再重定向到cn.bing.com了。

    +
  4. +
+

申请内测

上诉步骤完成之后,只需要访问必应 (bing.com),即可进行内测登记,等待通过之后则会收到邮件,建议使用国外的邮箱,不要使用QQ邮箱!

+

image-20230212144013077

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\213\257\346\225\221Slack\344\270\255\347\232\204Claude/index.html" "b/\346\213\257\346\225\221Slack\344\270\255\347\232\204Claude/index.html" index e69de29bb2..9ac960e033 100644 --- "a/\346\213\257\346\225\221Slack\344\270\255\347\232\204Claude/index.html" +++ "b/\346\213\257\346\225\221Slack\344\270\255\347\232\204Claude/index.html" @@ -0,0 +1,646 @@ + + + + + + + + + + + + 拯救Slack中的Claude - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 拯救Slack中的Claude +

拯救Slack中的Claude

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

最近应该有小伙伴发现在Slack中无法使用Claude了,根据网上消息,应该是官方更新了规则,现在只能在Slack的付费工作区才能正常使用!

+

下面教大家如何继续免费白嫖Claude!

+

1.注册新的账号

访问登录 | Slack输入自己的邮箱,注册新的账号!

+

image-20230629194943567

+

输入验证码后,点击创建工作区!按照页面提示完成创建即可!

+

image-20230629195101475

+

2.创建频道

按照下图操作创建频道!开启专业版免费试用!

+

image-20230629195249879

+

image-20230629195305275

+

3.添加Claude

访问网站anthropic.com/claude-in-slack 添加Claude,授予访问权限即可!

+

image-20230629195408436

+

添加之后返回slack的网站,就可以在左侧看到Claude的应用了

+

image-20230629195517389

+

最后

赶快去白嫖啦!到期后只要规则不变,就可以继续注册新号白嫖啦!

+

附上这个账号的邀请地址: https://join.slack.com/t/wangwangithq/shared_invite/zt-1y1yesgqf-HXSfJP_YmJDTWoefE2eRFg

+

另外附带推荐几个slack中好用的应用!

+ + +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\217\220\351\227\256\347\232\204\350\211\272\346\234\257/index.html" "b/\346\217\220\351\227\256\347\232\204\350\211\272\346\234\257/index.html" index e69de29bb2..d4e87c3fa5 100644 --- "a/\346\217\220\351\227\256\347\232\204\350\211\272\346\234\257/index.html" +++ "b/\346\217\220\351\227\256\347\232\204\350\211\272\346\234\257/index.html" @@ -0,0 +1,812 @@ + + + + + + + + + + + + 提问的艺术 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 提问的艺术 +

提问的艺术

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

OIG (1)

+

提问的艺术:如何高效地寻求帮助

如果你是一个想要学习编程、解决技术问题或者参与开源社区的人,你可能会经常遇到需要向别人提问的情况。但是,你知道如何提问吗?你知道如何提出一个清晰、有效、有礼貌的问题吗?你知道如何得到一个满意、及时、友好的回答吗?

+

如果你对这些问题的答案不太确定,或者想要提高你的提问技巧,那么请继续阅读这篇文章。我将给你一些关于如何提问的建议和指导。这些内容来自于一些经验丰富的骇客(hacker)和开源软件开发者,他们每天都在处理各种各样的技术问题,并乐于分享他们的知识和经验。当然,他们也有自己的喜好和标准,所以如果你想要得到他们的帮助,你最好遵循他们的规则和习惯。

+

Why?

你可能会觉得,提问有什么难的?只要把遇到的问题描述一下,然后等待回答就行了。可惜事实并非如此简单。在实际情况中,很多人提出的问题要么太含糊、太复杂、太琐碎、太无聊、太自私、太无礼,要么根本不是问题。这样的问题不仅浪费了提问者和回答者的时间和精力,也降低了提问者在社区中的声誉和信誉。

+

学习如何提问,可以帮助你避免这些问题,也可以帮助你更有效地获取信息和解决问题。通过提出一个好问题,你可以:

+
    +
  • 节省时间:通过事先做好准备和调查,你可以避免提出一些已经有答案或者无关紧要的问题,从而节省自己和他人的时间。
  • +
  • 获得更好的答案:通过清楚、准确、有条理地描述你的问题和需求,你可以让回答者更容易理解你的意图和状况,从而给出更合适、更有用、更完整的答案。
  • +
  • 增加知识:通过提出一个有深度、有广度、有创意的问题,你可以激发回答者和自己的思考,从而学到更多的知识和技能。
  • +
  • 建立关系:通过礼貌、诚恳、感恩地与回答者沟通,你可以建立起良好的关系和信任,从而在今后得到更多的帮助和支持。
  • +
+

How?

那么,如何才能提出一个好问题呢?这里有一些基本的原则和步骤,你可以参考和遵循。

+

原则

    +
  • 尊重:你要尊重你向他们提问的人,他们并没有义务回答你的问题,他们是出于自愿和兴趣花时间和精力帮助你。你要尊重他们的时间和精力,不要提出一些无聊、重复、简单或者无意义的问题。你要尊重他们的知识和经验,不要质疑或者否定他们的回答,除非你有充分的理由和证据。
  • +
  • 分享:你要分享你遇到的问题和解决的方法,不要把问题和答案藏起来,这样可以让更多的人受益。你要分享你的知识和经验,不要吝啬或者自私,如果你能回答别人的问题,就尽量去回答,这样可以增进社区的氛围和水平。
  • +
  • 学习:你要学习如何提问和回答,不要停留在一成不变或者一知半解的水平。你要学习如何使用搜索引擎、文档、论坛等工具来查找信息和解决问题,不要什么都依赖别人。你要学习如何思考和分析,不要仅仅停留在表面或者死记硬背。
  • +
+

步骤

    +
  • 做好准备:在提问之前,你应该先做好准备工作,包括以下几个方面:

    +
      +
    • 确定你的问题是什么:你要清楚地知道你遇到了什么问题,它是怎么发生的,它影响了什么,它有什么现象和错误提示,它是可重复的吗,等等。

      +
    • +
    • 尝试自己解决:你要尽力自己解决问题,通过搜索引擎、文档、常见问题解答(FAQ)、教程、源代码等途径寻找答案或者线索。很多时候,问题已经有了现成的解决方案或者相似的案例,你只需要花点时间和耐心就可以找到。

      +
    • +
    • 简化问题:你要尝试简化问题,找出最小可复现的示例(MCVE),排除无关的干扰因素,聚焦于核心的问题。这样可以帮助你理清思路,也可以帮助回答者节省时间。

      +
    • +
    • 选择合适的提问方式:根据你的问题的性质和紧急程度,选择合适的提问方式。一般来说,有以下几种常见的提问方式:

      +
        +
      • 即时通讯(Instant Messaging):如QQ、微信、Telegram、IRC等,适合一些简单、紧急、实时的问题,优点是回复速度快,缺点是干扰多,记录少。
      • +
      • 论坛(Forum):如Stack Overflow、V2EX、Quora等,适合一些复杂、普遍、持久的问题,优点是回复质量高,缺点是回复速度慢。
      • +
      • 邮件列表(Mailing List):如Linux Kernel Mailing List、Python Mailing List等,适合一些专业、深入、开放的问题,优点是回复权威性强,缺点是回复形式限制多。
      • +
      • 提问平台(Q&A Platform):如知乎、Quora等,适合一些通用、热门、有趣的问题,优点是回复覆盖面广,缺点是回复水,平淡。
      • +
      +
    • +
    • 选择合适的提问对象:根据你的问题的领域和难度,选择合适的提问对象。一般来说,有以下几种常见的提问对象:

      +
        +
      • 官方文档(Official Documentation):如Python官方文档、Linux man page等,适合一些基础、规范、权威的问题,优点是信息准确、完整,缺点是信息量大、更新慢。
      • +
      • 开发者(Developer):如Linus Torvalds、Guido van Rossum等,适合一些高级、深入、创新的问题,优点是信息专业、权威,缺点是信息难以获取、回复慢。
      • +
      • 社区(Community):如Stack Overflow社区、Linux社区等,适合一些普遍、实用、多样的问题,优点是信息丰富、及时,缺点是信息质量参差不齐、回复不一致。
      • +
      • 同伴(Peer):如同事、同学、朋友等,适合一些简单、紧急、私密的问题,优点是信息容易获取、回复快,缺点是信息有限、不专业。
      • +
      +
    • +
    +
  • +
  • 描述问题:在提问时,你应该尽量清楚、准确、有条理地描述你的问题,包括以下几个方面:

    +
      +
    • 标题(Title):你要给你的问题一个简洁、明确、吸引人的标题,让回答者一眼就能看出你的问题是什么。你要避免使用模糊、无意义或者过于宽泛的标题,如“求助”、“急”、“Python问题”等。
    • +
    • 背景(Background):你要给出你的问题的背景信息,让回答者了解你的目的和环境。你要包括以下几个方面:
        +
      • 你想要做什么:你要说明你想要实现什么功能或者达到什么目标。
      • +
      • 你使用了什么工具:你要说明你使用了什么编程语言、框架、库、操作系统等工具,并给出它们的版本号和配置信息。
      • +
      • 你遇到了什么问题:你要说明你在做什么时遇到了什么问题,以及问题有什么现象和错误提示。
      • +
      +
    • +
    • 示例(Example):你要给出你的问题的示例代码或者数据,让回答者能够复现你的问题。你要注意以下几个方面:
        +
      • 简化示例:你要尽量简化示例,去掉无关的代码或者数据,只保留能够展示问题的最小可复现的示例(MCVE)。
      • +
      • 格式化示例:你要按照规范和习惯格式化示例,使用合适的缩进、空格、注释等方式,让示例易于阅读和理解。
      • +
      • 标记示例:你要使用合适的标记语言或者工具标记示例,如Markdown、HTML等,让示例能够正确地显示和高亮。
      • +
      +
    • +
    • 期望(Expectation):你要给出你对于问题的期望结果或者解决方案,让回答者知道你想要得到什么。你要注意以下几个方面:
        +
      • 明确期望:你要明确地说明你想要得到什么样的结果或者解决方案,不要含糊不清或者模棱两可。
      • +
      • 合理期望:你要合理地设定你的期望,不要过高或者过低,不要要求别人替你做所有的工作或者给你一个完美的答案。
      • +
      • 说明原因:你要说明你为什么有这样的期望,你是基于什么理论或者经验得出这样的结论,或者你是从哪里看到或者听说过这样的结果或者解决方案。
      • +
      +
    • +
    +
  • +
  • 沟通回复:在得到回复后,你应该及时、礼貌、有效地与回答者沟通,包括以下几个方面:

    +
      +
    • 感谢回复:你要对回答者表示感谢,即使他们的回答并不完全符合你的期望或者需求,你也要尊重他们的努力和贡献。
    • +
    • 评价回复:你要对回答者的回答进行评价,表明你是否认同或者接受他们的回答,以及你对他们的回答有什么看法或者建议。如果可能,你可以给他们的回答打分或者标记为最佳答案,以示鼓励和奖励。
    • +
    • 反馈结果:你要对回答者反馈你的问题是否已经解决,以及你是如何解决的。如果你找到了其他的解决方案或者有了新的发现,你也可以分享给回答者和其他人,让他们也能从中受益。
    • +
    • 提出补充:如果你对回答者的回答还有疑问或者不明白,你可以提出补充问题,但是要注意以下几个方面:
        +
      • 限制数量:你要尽量限制补充问题的数量,不要无休止地追问,否则会让回答者感到厌烦和不耐烦。
      • +
      • 相关性:你要确保补充问题与原问题相关,不要跑题或者扯远,否则会让回答者感到困惑和不解。
      • +
      • 独立性:如果补充问题与原问题无关或者很远,你最好另外开一个新的问题来提问,而不是在原问题下继续提问,否则会让回答者感到混乱和不便。
      • +
      +
    • +
    +
  • +
+

案例

为了让你更好地理解如何提问,我给出了一些提问的案例,分别展示了好问题和坏问题的区别。请仔细阅读并比较这些案例,并尝试找出其中的优缺点。

+

案例一

    +
  • 坏问题:
  • +
+
+

我想用Python做一个网站,请问怎么做?

+
+
    +
  • 好问题:
  • +
+
+

我想用Python做一个简单的个人博客网站,我已经安装了Python 3.9.1和Django 3.1.5,并按照官方文档创建了一个项目和一个应用。但是当我运行python manage.py runserver命令时,浏览器显示Page not found (404)错误。我检查了我的urls.py文件和views.py文件,发现没有明显的错误。请问这可能是什么原因导致的?我应该如何解决?谢谢!

+
+
    +
  • 分析:

    +
      +
    • 坏问题的缺点:

      +
        +
      • 标题太宽泛,没有说明具体想做什么样的网站。
      • +
      • 没有给出使用的工具和版本信息。
      • +
      • 没有给出遇到的问题和错误提示。
      • +
      • 没有给出期望的结果或者解决方案。
      • +
      • 没有表示礼貌和感谢。
      • +
      +
    • +
    • 好问题的优点:

      +
        +
      • 标题清晰明确,说明了想做什么样的网站。
      • +
      • 给出了使用的工具和版本信息。
      • +
      • 给出了遇到的问题和错误提示。
      • +
      • 给出了期望的结果或者解决方案。
      • +
      • 表示了礼貌和感谢。
      • +
      +
    • +
    +
  • +
+

案例二

    +
  • 坏问题:
  • +
+
+

为什么下面这段代码会报错?

+
+
def foo():
+    print(x)
+
+x = 10
+foo()
+
+
    +
  • 好问题:
  • +
+
+

Python中,函数的作用域是如何确定的?

+
+
+

我有一段代码如下:

+
+
def foo():
+    print(x)
+
+x = 10
+foo()
+
+
+

我本以为这段代码会打印出10,因为我认为函数foo可以访问全局变量x。但是当我运行这段代码时,却报错了:

+
+
NameError: name 'x' is not defined
+
+
+

我不明白为什么会这样,我查阅了Python官方文档中关于作用域的部分,发现有这样一句话:

+
+
+

“A scope defines the visibility of a name within a block. If a local variable is defined in a block, its scope includes that block. If the definition occurs in a function block, the scope extends to any blocks contained within the defining one, unless a contained block introduces a different binding for the name.”

+
+
+

我想知道这句话是什么意思,以及它和我的问题有什么关系。谢谢!

+
+
    +
  • 分析:

    +
      +
    • 坏问题的缺点:

      +
        +
      • 标题太简单,没有说明具体想问什么。
      • +
      • 没有给出错误提示信息。
      • +
      • 没有给出期望的结果或者解决方案。
      • +
      • 没有表示礼貌和感谢。
      • +
      +
    • +
    • 好问题的优点:

      +
        +
      • 标题清晰明确,说明了想问什么。
      • +
      • 给出了示例代码和错误提示信息。
      • +
      • 给出了期望的结果或者解决方案。
      • +
      • 表示了礼貌和感谢。
      • +
      • 引用了官方文档中相关的内容,并说明了自己的困惑。
      • +
      +
    • +
    +
  • +
+

总结

通过以上的内容,我希望你能够对如何提问有了一个基本的了解和认识。提问是一种技能,也是一种艺术,它需要你不断地练习和学习,才能达到炉火纯青的境界。在此,我给出了一些如何提问的总结和建议,希望对你有所帮助:

+
    +
  • 在提问之前,先尝试自己解决问题,通过搜索引擎、文档、FAQ等途径寻找答案或者线索。
  • +
  • 在提问时,给出一个简洁、明确、吸引人的标题,让回答者一眼就能看出你的问题是什么。
  • +
  • 在提问时,给出你的问题的背景信息,让回答者了解你的目的和环境。
  • +
  • 在提问时,给出你的问题的示例代码或者数据,让回答者能够复现你的问题。
  • +
  • 在提问时,给出你对于问题的期望结果或者解决方案,让回答者知道你想要得到什么。
  • +
  • 在得到回复后,及时、礼貌、有效地与回答者沟通,感谢他们的回答,评价他们的回答,反馈你的结果,提出你的补充。
  • +
+

最后,我祝愿你在提问的过程中能够收获知识、乐趣和友情。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\227\266\345\272\217\346\200\247\346\225\260\346\215\256\345\272\223InfluxDB\345\210\235\346\216\242\344\270\216\344\274\230\345\214\226/index.html" "b/\346\227\266\345\272\217\346\200\247\346\225\260\346\215\256\345\272\223InfluxDB\345\210\235\346\216\242\344\270\216\344\274\230\345\214\226/index.html" index e69de29bb2..88b1a517d1 100644 --- "a/\346\227\266\345\272\217\346\200\247\346\225\260\346\215\256\345\272\223InfluxDB\345\210\235\346\216\242\344\270\216\344\274\230\345\214\226/index.html" +++ "b/\346\227\266\345\272\217\346\200\247\346\225\260\346\215\256\345\272\223InfluxDB\345\210\235\346\216\242\344\270\216\344\274\230\345\214\226/index.html" @@ -0,0 +1,1020 @@ + + + + + + + + + + + + 时序性数据库InfluxDB初探与优化 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 时序性数据库InfluxDB初探与优化 +

时序性数据库InfluxDB初探与优化

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

简介

InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。时序型数据是指那些随时间变化而变化的数据,比如温度,湿度,股票价格,网站访问量等。这些数据通常具有高频率,高精度,高复杂度和高价值的特点。InfluxDB可以帮助我们有效地管理和分析这些数据,为我们提供实时的洞察和预测。

+

为了让你更好地理解InfluxDB的优势和特色,我用一个表格来比较它和MySQL等传统关系型数据库的区别:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特点InfluxDBMySQL
数据模型基于时间序列的键值对基于表格的行列
数据结构灵活,无需预定义模式固定,需要预先定义模式
数据类型主要支持数值类型支持多种类型
查询语言使用Flux语言,专为时序型数据设计使用SQL语言,通用但不针对时序型数据
写入性能高效,支持批量写入和压缩存储一般,需要事务处理和索引维护
查询性能快速,支持多维聚合和窗口函数慢速,需要多表连接和分组排序
可扩展性易于水平扩展和分布式部署难以水平扩展和分布式部署
+

从上表可以看出,InfluxDB比MySQL更适合处理时序型数据,因为它有更高的性能,更灵活的数据模型,更强大的查询语言和更好的可扩展性。

+

版本

官网: InfluxDB OSS 2.3 Documentation (influxdata.com)

+

如果你想更深入地了解InfluxDB的功能和用法,我强烈建议你去多看官方文档。官方文档是InfluxDB的最权威和最全面的资料来源,它包含了InfluxDB的安装,配置,管理,查询,分析,可视化等方面的详细说明和示例。官方文档还提供了一些常见问题和解决方案,以及一些最佳实践和技巧。官方文档是你学习和使用InfluxDB的最好的伙伴。

+

安装

配置文件

在InfluxDB中,配置文件默认是不存在的,需要执行以下命令进行生成,流入数据库配置选项 |InfluxDB OSS 2.3 文档 (influxdata.com)

+
docker run --rm influxdb:2.3.0 influx server-config > config.yml
+
+

具体内容如下:

+
{
+        "assets-path": "",
+        "bolt-path": "/var/lib/influxdb2/influxd.bolt",
+        "e2e-testing": false,
+        "engine-path": "/var/lib/influxdb2/engine",
+        "feature-flags": null,
+        "flux-log-enabled": false,
+        "hardening-enabled": false,
+        "http-bind-address": ":8086",
+        "http-idle-timeout": 180000000000,
+        "http-read-header-timeout": 10000000000,  #服务器应尝试读取新请求的 HTTP 标头的最长持续时间。设置为 0 表示没有超时
+        "http-read-timeout": 0, # 读超时
+        "http-write-timeout": 0, # 写超时 
+        "influxql-max-select-buckets": 0,
+        "influxql-max-select-point": 0,
+        "influxql-max-select-series": 0,
+        "instance-id": "",
+        "log-level": "info", # 日志输出级别
+        "metrics-disabled": false,
+        "nats-max-payload-bytes": 0,
+        "nats-port": 4222,
+        "no-tasks": false,
+        "pprof-disabled": false,
+        "query-concurrency": 1024,  # 允许并发执行的查询数。
+        "query-initial-memory-bytes": 0,  #  为查询分配的初始内存字节数。
+        "query-max-memory-bytes": 0, #  允许查询的最大内存总字节数。 等于查询并发×单次查询内存字节数
+        "query-memory-bytes": 0,  # 单个查询允许的最大内存字节数。必须大于或等于 query-initial-memory-bytes 。
+        "query-queue-size": 1024,  # 执行队列中允许的最大查询数。当达到队列限制时,新查询将被拒绝。
+        "reporting-disabled": false,
+        "secret-store": "bolt",
+        "session-length": 60,
+        "session-renew-disabled": false,
+        "sqlite-path": "/var/lib/influxdb2/influxd.sqlite",
+        "storage-cache-max-memory-size": 1073741824,  #  控制存储引擎内存缓存的大小,以字节为单位。
+        "storage-cache-snapshot-memory-size": 26214400, # 控制存储引擎快照使用的内存大小,以字节为单位。
+        "storage-cache-snapshot-write-cold-duration": "10m0s",  # 控制存储引擎冷数据快照写入的时间。
+        "storage-compact-full-write-cold-duration": "4h0m0s",  # 控制存储引擎数据压缩的时间。
+        "storage-compact-throughput-burst": 50331648,
+        "storage-max-concurrent-compactions": 0,
+        "storage-max-index-log-file-size": 1048576,
+        "storage-no-validate-field-size": false,
+        "storage-retention-check-interval": "30m0s",
+        "storage-series-file-max-concurrent-snapshot-compactions": 0,
+        "storage-series-id-set-cache-size": 0,
+        "storage-shard-precreator-advance-period": "30m0s",
+        "storage-shard-precreator-check-interval": "10m0s",
+        "storage-tsm-use-madv-willneed": false,
+        "storage-validate-keys": false,
+        "storage-wal-fsync-delay": "0s",
+        "storage-wal-max-concurrent-writes": 0,
+        "storage-wal-max-write-delay": 600000000000,
+        "storage-write-timeout": 10000000000,
+        "store": "disk",
+        "testing-always-allow-setup": false,
+        "tls-cert": "",
+        "tls-key": "",
+        "tls-min-version": "1.2",
+        "tls-strict-ciphers": false,
+        "tracing-type": "",
+        "ui-disabled": false,
+        "vault-addr": "",
+        "vault-cacert": "",
+        "vault-capath": "",
+        "vault-client-cert": "",
+        "vault-client-key": "",
+        "vault-client-timeout": 0,
+        "vault-max-retries": 0,
+        "vault-skip-verify": false,
+        "vault-tls-server-name": "",
+        "vault-token": ""
+}
+
+

部署InfluxDB

我是基于Docker部署的InfluxDB2.3版本,docker-compose配置文件如下:

+
version: "3.1"
+services:
+  influxdb:
+    image: influxdb:2.3.0
+    container_name: influxdb
+    ports:
+      - "8086:8086"
+    volumes:
+      - influxdbv2:/var/lib/influxdb2
+      - config.yml:/home/config.yml      
+    environment:
+      - DOCKER_INFLUXDB_INIT_MODE=setup
+      - DOCKER_INFLUXDB_INIT_USERNAME=admin
+      - DOCKER_INFLUXDB_INIT_PASSWORD=admin123
+      - DOCKER_INFLUXDB_INIT_ORG=myorg
+      - DOCKER_INFLUXDB_INIT_BUCKET=mybucket
+      - DOCKER_INFLUXDB_INIT_RETENTION=1w
+      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytoken
+    restart: always      
+
+

这个文件定义了一个名为influxdb的服务,它使用influxdb:2.3这个镜像来创建一个容器,它将容器的8086端口映射到主机的8086端口,它将容器的/var/lib/influxdb2目录挂载到主机的influxdbv2这个卷上,它设置了一些环境变量来初始化InfluxDB的用户,组织,存储桶,保留策略和令牌。

+

配置优化

    +
  • [http]:这个部分控制了InfluxDB的HTTP服务,包括绑定地址,端口,超时时间,日志级别等。你可以根据你的网络环境和安全需求来调整这些参数。
  • +
  • [storage]:这个部分控制了InfluxDB的存储引擎,包括缓存大小,快照频率,压缩策略,索引大小等。你可以根据你的硬件资源和性能需求来调整这些参数。
  • +
  • [retention]:这个部分控制了InfluxDB的数据保留策略,包括检查间隔,启用状态等。你可以根据你的数据量和存储空间来调整这些参数。
  • +
  • [query]:这个部分控制了InfluxDB的查询引擎,包括并发度,队列大小,内存限制等。你可以根据你的查询负载和内存资源来调整这些参数。
  • +
+

针对内存占用空间过大的问题,可以尝试以下方法:

+
    +
  • 减少写入数据的频率和精度。如果你不需要实时或高精度的数据,你可以降低写入数据的频率和精度,从而减少数据量和索引大小。
  • +
  • 增加数据压缩比率。如果你不需要高速查询或写入数据,你可以增加数据压缩比率,从而减少数据占用的空间。你可以通过修改storage-compact-throughput-burst参数来调整压缩比率。
  • +
  • 启用数据保留策略。如果你不需要永久保存数据,你可以启用数据保留策略,从而定期删除过期或无用的数据。你可以通过修改retention-check-interval参数来调整保留策略。
  • +
+

GC优化

+

参考: HTSI 模式内存使用率高

+
- GODEBUG=madvdontneed=1
+- GOGC=80
+
+

GODEBUG=madvdontneed=1可以减少InfluxDB的虚拟内存占用,而GOGC=80可以减少InfluxDB的实际内存占用。

+

入门

时序型数据在InfluxDB中是以一种叫做行协议(line protocol)的格式来表示的。行协议是一种文本格式,它由四个部分组成:

+
    +
  • 度量(measurement):表示数据的类别或名称,比如温度,湿度,电压等。
  • +
  • 标签(tag):表示数据的元数据或属性,比如设备ID,位置,类型等。标签可以用来过滤或分组数据。
  • +
  • 字段(field):表示数据的值或内容,比如数值,字符串,布尔值等。字段可以用来计算或分析数据。
  • +
  • 时间戳(timestamp):表示数据的时间点或区间,比如秒,毫秒,纳秒等。时间戳可以用来排序或窗口化数据。
  • +
+

行协议的格式如下:

+
measurement,tag_key=tag_value field_key=field_value timestamp
+
+

例如,一个表示温度的行协议可以是这样的:

+
temperature,device_id=123,location=room1 value=25.6 1631377078000000000
+
+

这表示在1631377078000000000纳秒(2023-09-11T15:17:58Z)时,设备ID为123,位置为room1的温度值为25.6摄氏度。

+

设计原则

为了使数据模型易于查询且性能高效,需要遵循以下设计原则:

+
    +
  • 将常用的元数据或属性存储为标签,将变化的数值存储为字段。标签是被索引的,字段不是。这意味着通过标签过滤或分组数据比通过字段更快。例如,在查询某个位置的电表读数时,可以通过location标签快速定位到相关的数据点,而不需要扫描所有的字段值。
  • +
  • 将每个属性存储为单独的标签,而不是将多个属性拼接在一起。这样可以避免在查询时使用正则表达式来解析复杂的标签值。正则表达式会降低查询性能和可读性。例如,在查询某个区域的水表读数时,可以通过region标签直接过滤出相关的数据点,而不需要从location标签中提取出区域信息。
  • +
  • 避免在测量,标签和字段中存储数据。如果在这些要素中存储数据,会导致高基数(cardinality)问题。基数是指不同的测量和标签组合的数量。高基数会消耗更多的内存和CPU资源,并降低查询性能。例如,在存储电表读数时,应该将设备ID作为标签而不是测量或字段。
  • +
  • 避免使用保留关键字或特殊字符作为标签和字段的名称。如果使用了Flux关键字作为名称,则需要在查询时用双引号括起来。如果使用了非字母数字字符作为名称,则需要在查询时用方括号表示法。
  • +
  • 避免在同一个架构中使用相同的名称作为标签和字段。如果有一个标签和一个字段有相同的名称,则查询结果可能会出现不可预测的情况。
  • +
+

接收数据

收集数据是InfluxDB的第一个步骤,它指的是如何将时序型数据从不同的来源传输到InfluxDB中。时序型数据可以来自于各种设备,应用程序,服务,监控系统,日志系统等。为了方便地收集数据,InfluxDB提供了多种方法,包括:

+
    +
  • 使用Telegraf代理。Telegraf是一个开源的插件驱动的代理,它可以从各种输入源收集时序型数据,并且将其发送到各种输出目标。Telegraf支持超过200个插件,覆盖了常见的数据来源和目标。你可以使用Telegraf来轻松地将数据从你的设备或应用程序发送到InfluxDB中。
  • +
  • 使用Flux语言。Flux是一种功能性的数据脚本语言,它可以用来查询,转换,分析和操作时序型数据。Flux也可以用来从其他数据库或服务中导入时序型数据到InfluxDB中。你可以使用Flux来编写自定义的数据收集逻辑,并且定期执行它。
  • +
  • 使用HTTP API。HTTP API是InfluxDB提供的一种基于HTTP协议的接口,它可以用来执行各种操作,包括写入和查询数据。你可以使用HTTP API来直接向InfluxDB发送时序型数据,或者从其他服务中获取时序型数据并转发到InfluxDB中。
  • +
  • 使用客户端库。客户端库是一些封装了InfluxDB的HTTP API的编程语言库,它们可以让你在你喜欢的编程语言中使用InfluxDB。客户端库支持多种语言,如Java, Python, Go, Ruby等。你可以使用客户端库来在你的代码中集成InfluxDB,并且向其发送时序型数据。
  • +
+

每种方法都有其优缺点,你可以根据你的需求和场景来选择合适的方法。下面我会简单地比较一下这些方法:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
方法优点缺点
Telegraf简单易用,支持多种插件,高效稳定不够灵活,不能处理复杂的逻辑
Flux强大灵活,支持多种函数和操作符,易于调试需要学习新的语言,性能可能受限
HTTP API直接高效,支持多种格式和参数,兼容多种工具需要编写HTTP请求,不够友好
客户端库方便集成,支持多种语言,提供高级功能需要安装依赖,可能存在兼容性问题
+

写入数据

这里我提供一个基于Java的实现!

+

1.导入依赖

+
<dependency>
+  <groupId>com.influxdb</groupId>
+  <artifactId>influxdb-client-java</artifactId>
+  <version>3.1.0</version>
+</dependency>
+
+

2.创建连接

+
package example;
+
+import com.influxdb.client.InfluxDBClient;
+import com.influxdb.client.InfluxDBClientFactory;
+
+public class InfluxDB2Example {
+
+  public static void main(final String[] args) {
+
+    // You can generate an API token from the "API Tokens Tab" in the UI
+    String token = "1231231243214234==";
+    String bucket = "wangwang";
+    String org = "wangwang";
+
+    InfluxDBClient client = InfluxDBClientFactory.create("http://127.0.0.1:8086", token.toCharArray());
+  }
+}
+
+

3.写入数据

+
import com.influxdb.client.WriteApiBlocking;
+import com.influxdb.client.write.Point;
+import java.time.Instant;
+
+// ...
+
+Point point = Point
+  .measurement("mem")
+  .addTag("host", "host1")
+  .addField("used_percent", 23.43234543)
+  .time(Instant.now(), WritePrecision.NS);
+
+WriteApiBlocking writeApi = client.getWriteApiBlocking();
+
+writeApi.writePoint(bucket, org, point);
+
+

查询数据

在InfluxDB2.3版本中,用的是Flux语法,这个在以前1.x的版本中用的是InfluxQL语法.

+

查询InfluxDB的数据主要是以下步骤:

+
    +
  • 定义你的数据源。你需要使用from()函数来指定你要查询的存储桶的名称或ID。
  • +
  • 定义你的时间范围。你需要使用range()函数来指定你要查询的时间范围,比如最近一小时,最近一天等。
  • +
  • 定义你的数据过滤条件。你需要使用filter()函数来指定你要查询的数据的条件,比如度量名称,字段名称,标签名称或值等。
  • +
  • 定义你的数据操作或分析方法。你可以使用各种Flux或InfluxQL函数来对数据进行操作或分析,比如求平均值,求标准差,求百分比,绘制图表等。
  • +
+

示例

+

这个查询会从example-bucket存储桶中获取最近一小时内度量为temperature的数据,并且对_value列求平均值。

+
from(bucket: "example-bucket")
+  |> range(start: -1h)
+  |> filter(fn: (r) => r._measurement == "temperature")
+  |> mean(column: "_value")
+
+

InfluxDB提供了很多函数,可以参考官方文档:使用 Flux 查询数据,或者文章结尾参考的网址!

+

在官方的控制面板,也可以看到各个API的说明!

+

image-20230912143817577

+

删除数据

+

POST http://localhost:8086/api/v2/delete

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数类型说明示例
请求方法字符串指定HTTP请求的方法,必须为POSTPOST
标题字典指定HTTP请求的头部信息,包括授权和内容类型{“Authorization”: “Token mytoken”, “Content-Type”: “application/json”}
查询参数字典指定HTTP请求的查询参数,包括组织名称或ID和存储桶名称或ID{“org”: “myorg”, “bucket”: “mybucket”}
请求正文JSON对象指定HTTP请求的正文内容,包括开始时间,结束时间和删除条件语句{“start”: “1970-01-01T00:00:00Z”, “stop”: “2023-09-11T15:17:58Z”, “predicate”: “_measurement=”temperature” AND value>30”}
+
    +
  • 删除具有特定标签值的特定点
  • +
+
curl --request POST http://localhost:8086/api/v2/delete?org=example-org&bucket=example-bucket \
+  --header 'Authorization: Token YOUR_API_TOKEN' \
+  --header 'Content-Type: application/json' \
+  --data '{
+    "start": "2020-03-01T00:00:00Z",
+    "stop": "2020-11-14T00:00:00Z",
+    "predicate": "_measurement=\"example-measurement\" AND exampleTag=\"exampleTagValue\""
+  }'
+
+
    +
  • 删除指定时间范围内的说有点
  • +
+
curl --request POST http://localhost:8086/api/v2/delete?org=example-org&bucket=example-bucket \
+  --header 'Authorization: Token YOUR_API_TOKEN' \
+  --header 'Content-Type: application/json' \
+  --data '{
+    "start": "2020-03-01T00:00:00Z",
+    "stop": "2020-11-14T00:00:00Z"
+  }'
+
+

如果请求成功,你应该看到一个空白的响应。如果请求失败,你应该看到一个包含错误信息的响应。

+

定时任务

InfluxDB中的定时任务是一种使用Flux语言编写的定期执行的脚本,它可以对输入的数据流进行修改或分析,然后将修改后的数据写回到InfluxDB或执行其他操作。定时任务的功能包括:

+
    +
  • 数据降采样:数据降采样是一种减少数据量和存储空间的方法,它可以将高精度或高频率的数据转换为低精度或低频率的数据,比如将每秒的数据转换为每分钟或每小时的数据。数据降采样可以提高查询效率,降低存储成本,增加数据保留期限。你可以使用定时任务来定期对你的数据进行降采样,并且将降采样后的数据存储在一个新的存储桶中。
  • +
  • 数据清洗:数据清洗是一种提高数据质量和可用性的方法,它可以将不完整,不准确,不一致或无关的数据进行修改或删除,比如将空值填充,将异常值替换,将重复值去除,或者将无用值删除。数据清洗可以提高分析准确性,减少错误率,增加信任度。你可以使用定时任务来定期对你的数据进行清洗,并且将清洗后的数据写回到原来的存储桶中。
  • +
  • 数据分析:数据分析是一种从数据中提取有价值信息和知识的方法,它可以将原始数据进行转换,计算,统计,聚合或可视化,比如求平均值,求标准差,求百分比,绘制图表等。数据分析可以提高决策支持,发现规律,预测趋势。你可以使用定时任务来定期对你的数据进行分析,并且将分析结果存储在一个新的存储桶中或发送到其他服务中。
  • +
  • 数据告警:数据告警是一种根据数据状态或变化触发通知或动作的方法,它可以将实时或历史数据与预设的阈值或条件进行比较,并且在满足条件时发送邮件,短信,电话等通知方式,或者执行其他操作,比如调整参数,启动备份等。数据告警可以提高监控效果,及时响应,防止危机。你可以使用定时任务来定期对你的数据进行告警,并且将告警信息发送到指定的目标中
  • +
+

示例

+
// Task options
+option task = {name: "downsample_5m_precision", every: 1h, offset: 0m}
+
+// Data source
+from(bucket: "example-bucket")
+    |> range(start: -task.every)
+    |> filter(fn: (r) => r._measurement == "mem" and r.host == "myHost")
+    // Data processing
+    |> aggregateWindow(every: 5m, fn: mean)
+    // Data destination
+    |> to(bucket: "example-downsampled")
+
+

备份还原数据

    +
  • 备份

    +
    influx backup <backup-path> -t <root-token>
    +
    +
  • +
  • 还原

    +
      +
    • 所有数据

      +
      influx restore /backups/2020-01-20_12-00/
      +
      +
    • +
    • 特定桶数据

      +
      influx restore \
      +  /backups/2020-01-20_12-00/ \
      +  --bucket example-bucket
      +
      +# OR
      +
      +influx restore \
      +  /backups/2020-01-20_12-00/ \
      +  --bucket-id 000000000000
      +
      +
    • +
    +
  • +
+

使用实例

influxdata/influxdb-client-java

+

常见问题

可以参考:常见问题 |InfluxDB OSS 2.3 文档 (influxdata.com)

+

参考

    +
  1. InfluxDB v2:Flux 语言、快速参考指南和备忘单
  2. +
  3. Docker 设置生产 InfluxDB 2 实例
  4. +
  5. InfluxDB OSS 2.3 文档
  6. +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\227\266\351\227\264\350\275\256\347\256\227\346\263\225/index.html" "b/\346\227\266\351\227\264\350\275\256\347\256\227\346\263\225/index.html" index e69de29bb2..94448f7e15 100644 --- "a/\346\227\266\351\227\264\350\275\256\347\256\227\346\263\225/index.html" +++ "b/\346\227\266\351\227\264\350\275\256\347\256\227\346\263\225/index.html" @@ -0,0 +1,712 @@ + + + + + + + + + + + + 时间轮算法初探 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 时间轮算法初探 +

时间轮算法初探

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

时间轮算法

1. 基于队列的定时任务执行模型缺陷

在计算机世界中,只有待解决的问题变得大规模后,算法的价值才能够最大化的体现。时间轮算法可以将插入和删除操作的时间复杂度都降为 O(1),在大规模问题下还能够达到非常好的运行效果。

+

如果我们要实现一个定时任务该如何实现呢?

+

最简单的方式就是使用一个任务队列来完成定时任务。具体实现细节下面详细展开。

+

1.线程模型

+
    +
  • 用户线程:负责定时任务的注册;
  • +
  • 定时任务队列轮询线程:负责扫描任务队列上符合要求的任务,如果任务的时间戳达到规定的时刻,首先从队列中取走此任务,然后将其交给异步线程池来处理;
  • +
  • 异步线程池:负责定时任务的执行;
  • +
+

2.定时任务

+

定时任务分为一次性执行的定时任务以及重复执行任务。

+
    +
  • 一次性执行的定时任务:任务在规定的某一个时刻就会被执行,但是仅仅会被执行一次。这好比大学时你告诉学霸室友:明天考试前提醒我去考试。因为该考试只会组织一次,因此学霸提醒你一次就够了。
  • +
  • 重复执行的定时任务:任务在规定的某一个时刻会被执行后,将来的相同时刻需要被重复执行。这好比你上小学时告诉妈妈我每天 8:00 上学,你每天 7 点叫我起床。我们仅仅需要为每一个定时任务提供一个是否为定时任务的标签,定时任务队列轮询线程在发现此任务是需要重复执行的定时任务时,重新把定时任务注册到定时任务队列上。
  • +
+

3.任务队列数据结构

+

为了方便向任务队列中增减任务,通常会选择双向链表作为数据结构来实现任务队列。

+

这种方式不过是基于异步队列,然后为每一个任务提供一个时间戳字段。这种实现策略的问题在哪里?

+

如果有 1k 个任务,那么定时任务队列轮询线程每次都需要扫描 1k 个任务来确定哪一个任务达到规定时刻,这种轮询效率非常差,尤其是在大部分任务并没有达到规定执行时刻的情况下。

+

为了解决上述问题,我们可以使用如下两种方式:

+
    +
  • 有序任务队列;
  • +
  • 任务分类+多队列+并发线程;
  • +
+

在计算机算法中,有序性通常能够显著提高遍历效率。我们现在将一个普通任务队列升级为一个按照任务执行的时间戳递增的有序任务队列。这样一来,定时任务队列轮询线程从头向尾遍历时,在发现任意线程未达到规定执行时间戳后,就可以停止遍历。此时,定时任务队列轮询线程甚至可以进行休眠操作,避免空轮询。

+

但是,有序性并非没有代价。插入一个定时任务的事件复杂度为 O(nlogn),普通任务队列的插入仅仅是 O(1)。

+

我们再来看看另一种实现策略:任务分类+多队列+并发线程。这种方式主要是试图利用现代 CPU 的多核并发性来解决遍历效率低的问题。例如我们将 10k 大小的任务队列分为 10 个任务队列,此时每一个任务队列的大小仅仅是 1k。在线程完全并发执行的情况下,将 10k 规模的问题简化为 1k 规模的问题。

+

不过,多并发线程轮询的副作用非常大:线程是一种宝贵资源,如果一个系统有大量的定时调度任务,那么 CPU 会因为多条并发轮询线程而有着非常低的执行效率。

+
+

现在我们知道一个定时任务框架需要如下几个要素:

+
    +
  • 严格的数据结构:并不能基于简单的(有序或无序)的定时任务队列来存储定时任务,否则轮询线程的执行效率永远无法提高;
  • +
  • 简单的并发模型:CPU 线程是非常宝贵的资源,轮询线程并不能太多;
  • +
+

时间轮算法解决了基于队列的定时任务执行模型的缺陷,下一节将详细介绍时间轮算法思想。

+

2. 时间轮算法思想

无论通过何种方式实现定时任务队列,最终需要向上层提供如下接口:

+
    +
  • 添加定时任务;
  • +
  • 删除(取走)定时任务;
  • +
  • 执行定时任务;
  • +
+

2.1 简单时间轮算法

时间轮算法的核心是:轮询线程不再负责遍历所有任务,而是仅仅遍历时间刻度。时间轮算法好比指针不断在时钟上旋转、遍历,如果一个发现某一时刻上有任务(任务队列),那么就会将任务队列上的所有任务都执行一遍。

+

时间轮算法不再将任务队列作为数据结构,其数据结构如下图所示(我们以小时为单位):

+

image-20220928202838915

+
+

图-1 时间轮数据结构示意图(黄色块为时间刻度,绿色块为任务)

+
+

显而易见,时间轮算法解决了遍历效率低的问题。时间轮算法中,轮询线程遍历到某一个时间刻度后,总是执行对应刻度上任务队列中的所有任务(通常是将任务扔给异步线程池来处理),而不再需要遍历检查所有任务的时间戳是否达到要求。

+

现在,即使有 10k 个任务,轮询线程也不必每轮遍历 10 k 个任务,而仅仅需要遍历 24 个时间刻度。

+
+

一个以小时为单位的时间轮算法就这么简单地实现了。不过,小时作为时间单位粒度太大,我们有时候会希望基于分钟作为时间刻度。最直接的方式是增加时间刻度,每一天有 24 * 60 = 1440。此时时间轮的数据结构如下:

+

image-20220928202916134

+
+

图-2 时间精度为分钟的时间轮数据结构

+
+

通过增加时间刻度,我们可以基于更精细的时间单位(分钟)来进行定时任务的执行。但是,这种实现方式有如下的缺陷:

+
    +
  1. 轮询线程遍历效率低问题:当时间刻度增多,而任务数较少时,轮询线程的遍历效率会下降,例如如果只有 50 个时间刻度上有任务,但却需要遍历 1440 个时间刻度。这违背了我们提出时间轮算法的初衷:解决遍历轮询线程遍历效率低的问题;
  2. +
  3. 浪费内存空间问题:在时间刻度密集,任务数少的情况下,大部分时间刻度所占用的内存空间是没有任何意义的。
  4. +
+

如果要将时间精度设为秒,那么整个时间轮将需要 86400 个单位的时间刻度,此时时间轮算法的遍历线程将遇到更大的运行效率低的问题。下面两个小节将着力解决此问题。

+

2.2 带有 round 的时间轮算法

我们发现,时间轮的时间刻度随着时间精度而增加并不是一个好的问题解决思路。现在,我们将时间轮的精度设置为秒,时间刻度个数固定为 60。每一个任务拥有一个 round 字段。

+

轮询线程的执行逻辑是:每隔一秒处理一个时间刻度上任务队列中的所有任务,任务的 round 字段减 1,接着判断如果 round 字段的值变为 0,那么将任务移出任务队列,交给异步线程池来执行对应任务。如果是重复执行任务,那么再将任务添加到任务队列中。

+

轮询线程遍历一次时间轮需要 60 秒。如果一个任务需要间隔 x 秒执行一次,那么其 round 字段的值为 x/60(整除),任务位于第 (x%60)(取余)个刻度对应的任务队列中。例如任务需要间隔 130 秒执行一次,那么 round 字段的值为 2,此任务位于第 10 号时间刻度的任务队列中。

+

此时时间轮算法的数据结构如下图所示:

+

image-20220928202932641

+
+

图-3 时间精度为秒的 round 时间轮数据结构

+
+

这种方式虽然简化了时间轮的刻度个数,但是并没有简化轮询线程运行效率不高的问题。时间轮每次处理一个时间刻度,就需要处理其上任务队列的所有任务。其运行效率甚至与基于普通任务队列实现的定时任务框架没有区别。

+

2.3 分层时间轮算法

分层的时间轮算法在生活中有对应的模型(艺术来源于生活~),那就是水表:

+

image-20220928202946681

+
+

图-4 水表

+
+

此时,我们有秒、分钟、小时级别的三个时间轮,每一个时间轮分别有 60、60、24 个刻度。分层时间轮如下图所示:

+

image-20220928203002124

+
+

图-5 一种分层时间轮数据结构

+
+

假设我们的任务需要在每天的 7:30:20 秒执行一次。任务首先添加于秒级别时钟轮的第 20 号刻度上,当其轮询线程访问到第 20 号刻度时,就将此任务转移到分钟级别时钟轮的第 30 号刻度上。当分钟级别的时钟轮线程访问到第 30 号刻度,就将此任务转移到小时级别时钟轮的第 7 号刻度上。当小时级别时钟轮线程访问到第 7 号刻度时,最终会将任务交给异步线程负责执行,然后将任务再次注册到秒级别的时间轮中。

+

这种分层时钟轮算法设计具有如下的优点

+
    +
  1. 轮询线程效率变高:首先不再需要计算 round 值,其次任务队列中的任务一旦被遍历,就是需要被处理的(没有空轮询问题);
  2. +
  3. 线程并发性好:虽然引入了并发线程,但是线程数仅仅和时钟轮的级数有关,并不随着任务数的增多而改变;
  4. +
+

如果任务按照分钟级别来定时执行,那么当分钟时间轮达到对应刻度时,就会将任务交给异步线程来处理,然后将任务再次注册到秒级别的时钟轮上。

+

分层时间轮中的任务从一个时间轮转移到另一个时间轮,这类似于水表中小单位的表转弯一圈会导致高单位的表前进一个单位一样。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\234\215\345\212\241\345\231\250\345\270\270\347\224\250\350\204\232\346\234\254/index.html" "b/\346\234\215\345\212\241\345\231\250\345\270\270\347\224\250\350\204\232\346\234\254/index.html" index e69de29bb2..88b0169c6a 100644 --- "a/\346\234\215\345\212\241\345\231\250\345\270\270\347\224\250\350\204\232\346\234\254/index.html" +++ "b/\346\234\215\345\212\241\345\231\250\345\270\270\347\224\250\350\204\232\346\234\254/index.html" @@ -0,0 +1,635 @@ + + + + + + + + + + + + 服务器常用脚本 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 服务器常用脚本 +

服务器常用脚本

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

快速初始化root用户

sudo -i
+vi /root/.ssh/authorized_keys
+# 把ssh-rsa之前的内容都删除掉.
+#!/bin/bash
+echo root:123456 |sudo chpasswd root
+sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config;
+sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config;
+sudo service sshd restart
+
+

关闭防火墙

iptables -P INPUT ACCEPT
+iptables -P FORWARD ACCEPT
+iptables -P OUTPUT ACCEPT
+iptables -F
+
+

服务器端超时设置

bash -c "echo 'TCPKeepAlive yes' >> /etc/ssh/sshd_config && echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config"
+systemctl restart sshd
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\262\211\346\265\270\345\274\217\347\277\273\350\257\221\346\217\222\344\273\266/index.html" "b/\346\262\211\346\265\270\345\274\217\347\277\273\350\257\221\346\217\222\344\273\266/index.html" index e69de29bb2..7450154a8a 100644 --- "a/\346\262\211\346\265\270\345\274\217\347\277\273\350\257\221\346\217\222\344\273\266/index.html" +++ "b/\346\262\211\346\265\270\345\274\217\347\277\273\350\257\221\346\217\222\344\273\266/index.html" @@ -0,0 +1,648 @@ + + + + + + + + + + + + 沉浸式翻译插件的使用 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 沉浸式翻译插件的使用 +

沉浸式翻译插件的使用

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

如今,随着科技的进步,翻译工具也越来越方便。在Edge浏览器中,有一款叫做“沉浸式翻译”的插件,可以帮助用户实时翻译网页内容。下面,我们来看一下如何使用这款插件。

+

安装沉浸式翻译插件

首先,我们需要在Edge浏览器的应用商店中安装“沉浸式翻译”插件。具体操作如下:

+

image-20230212142505837

+
    +
  1. 打开Edge浏览器,在地址栏输入Microsoft Edge 应用商店
  2. +
  3. 在应用商店中搜索“沉浸式翻译”,找到该插件并点击“安装”按钮。
  4. +
  5. 安装完成后,在Edge浏览器的地址栏右侧会显示一个翻译图标,表示插件安装成功。
  6. +
+

使用沉浸式翻译插件

image-20230212142703480

+

安装完成后,我们就可以开始使用该插件了。使用方法如下:

+
    +
  1. 打开任意网页,点击Edge浏览器地址栏右侧的翻译图标。
  2. +
  3. 选择翻译源语言和目标语言。
  4. +
  5. 点击“翻译”按钮,等待片刻,整个网页内容就会被翻译成你所选择的语言。
  6. +
  7. 在翻译过的网页中,如果你想翻译某个单词或短语,只需将鼠标悬停在该单词或短语上,稍等片刻,它就会被翻译。
  8. +
  9. 若是不喜欢这种显示样式,也可以点击插件左下角的设置,进行调整样式!
  10. +
+

image-20230212142755783

+

这就是“沉浸式翻译”插件的基本使用方法。不仅方便,还十分实用。它可以帮助我们在浏览国外网页时顺利阅读,避免因为语言不通而带来的困扰。

+

注意事项

使用“沉浸式翻译”插件时,请注意以下几点:

+
    +
  1. 翻译的准确性取决于翻译引擎的准确性,有时可能会存在翻译错误。
  2. +
  3. 翻译的速度取决于网络环境,在网络较差的情况下翻译速度可能会较慢。
  4. +
  5. 由于插件是第三方开发的,使用前请注意阅读其隐私政策和使用条款。
  6. +
+

结论

“沉浸式翻译”插件是一款非常实用的工具,可以帮助我们轻松阅读国外网页。使用前请注意阅读其隐私政策和使用条款,以确保使用的安全性。如果你正在使用Edge浏览器,不妨试试这款插件,它一定会让你的网页阅读体验更加愉快。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\346\266\210\346\201\257\345\216\273\351\207\215\344\270\216\346\201\242\345\244\215\345\244\204\347\220\206/index.html" "b/\346\266\210\346\201\257\345\216\273\351\207\215\344\270\216\346\201\242\345\244\215\345\244\204\347\220\206/index.html" index e69de29bb2..8fdbf8c10d 100644 --- "a/\346\266\210\346\201\257\345\216\273\351\207\215\344\270\216\346\201\242\345\244\215\345\244\204\347\220\206/index.html" +++ "b/\346\266\210\346\201\257\345\216\273\351\207\215\344\270\216\346\201\242\345\244\215\345\244\204\347\220\206/index.html" @@ -0,0 +1,1069 @@ + + + + + + + + + + + + 告警去重与延时恢复处理 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 告警去重与延时恢复处理 +

告警去重与延时恢复处理

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

业务需求

需要实现一个告警指定时间(N)内去重,并且定时(M)自动恢复的功能,即规定时间(N)内,不再发送同一个告警,并且当等待一段时间(M),若未再接收到告警,则触发消警(自动恢复)操作.

+

思路

    +
  1. 使用rabbitmq的死信队列
  2. +
  3. 使用redis,给key添加过期监听事件
  4. +
  5. 使用ExpiringMap,带有过期时间的map
  6. +
+

实践

rabbitmq

+

不符合业务需求,当一条同类型告警来临时,需要更新消息的失效时间,而mq进入队列的消息无法修改

+
+

redis

使用步骤

+

1.修改redis配置文件,notify-keyspace-events设置为Ex

+
notify-keyspace-events Ex
+
+K     键空间事件,以__keyspace@<db>__前缀发布。
+E     键事件事件,以__keyevent@<db>__前缀发布。
+g     通用命令(非类型特定),如DEL,EXPIRE,RENAME等等
+$     字符串命令
+l     列表命令
+s     集合命令
+h     哈希命令
+z     有序集合命令
+x     过期事件(每次键到期时生成的事件)
+e     被驱逐的事件(当一个键由于达到最大内存而被驱逐时产生的事件)
+A     g$lshzxe的别名,因此字符串AKE表示所有的事件。
+
+

2.程序测试

+
    @Override
+    public void run(String... args) throws Exception {
+        SimpleDateFormat ft1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        for (int i = 1; i < 50000; i++) {
+            Calendar instance = Calendar.getInstance();
+            instance.add(Calendar.SECOND, i * 5);
+            Date date = instance.getTime();
+            redisTemplate.opsForValue().set( i + "@" + ft1.format(date), "value", i * 5, TimeUnit.SECONDS);
+        }
+
+        System.out.println("初始化key");
+        Thread.sleep(10000000);
+        System.out.println("休眠结束");
+    }
+
+

image-20220928202559954

+

性能测试

+
+

./redis-benchmark -h 127.0.0.1 -p 6379 -c 20 -n 1000000 -t get -d 10 -P 8 -q

+
+

命令说明:

+

​ 向127.0.0.1:6379这个Redis发送100万个请求,使用20个长连接发送,所有请求都是get命令,每个get命令的包体为10字节,使用8条Pipeline通道发送,并且只显示requests per second这一个结果。

+

参数说明:

+

-h 目标Redis服务网络地址

+

-p 目标Reids服务的端口

+

-c 客户端并发长连接数

+

-n 本次测试需要发起的请求数

+

-t 测试请求的方法

+

-d 测试请求的数据大小 字节

+

-P 开启Pipeline模式,并制定Pipeline通道数量

+

-q 只显示requests per second这一个结果

+

本地redis测试

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
连接数字节长度请求数整体RPS单连接RPS
110100000052408.1652408.16
159100000053610.6853610.68
1100100000053963.6353963.63
11000100000054451.4054451.40
110000100000054725.5554725.55
559100000067467.2813493.45
1059100000070407.667040.76
5059100000060034.821200.69
+

远程redis测试

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
连接数字节长度请求数整体RPS单连接RPS不开pipeline
110100000012745.1312745.131648.67
159100000012521.2812521.281695.92
1100100000012706.5312706.531651.67
11000100000012842.7212842.721611.79
110000100000013395.2313395.231695.62
559100000054580.7610916.15
1059100000098570.729857.07
5059100000079027.841580.55
+

程序内存,CPU占用

+

image-20220928202610650

+

image-20220928202623004

+

总结

+

1.redis中存在10000左右过期key时,会导致监听有延迟出现,可能高达几分钟.

+

2.当不在同一台服务器上时,redis的时间需要与程序的时间同步.

+

3.redis中存入key的长度,在1000以下时,影响不大,存在跨服务器时,性能影响较大,可能与服务器性能,网络等多方面因素有关

+

ExpiringMap

开源地址

+

简介

+

1.可设置Map中的Entry在一段时间后自动过期。
2.可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
3.可添加监听事件,在监听到Entry过期时调度监听函数。
4.可以设置懒加载,在调用get()方法时创建对象。

+

使用步骤

+

1.添加maven依赖

+
<dependency> 
+    <groupId>net.jodah</groupId> 
+    <artifactId>expiringmap</artifactId> 
+    <version>0.5.8</version> 
+</dependency> 
+
+

2.测试代码

+
// 测试监听时间有误差  
+@Test
+    public void test9() throws InterruptedException {
+        ExpiringMap<String, String> map = ExpiringMap.builder()
+                .maxSize(100)
+                .variableExpiration()
+                .expirationPolicy(ExpirationPolicy.ACCESSED)
+            // 一个同步,一个异步
+                .asyncExpirationListener((ExpirationListener<String, String>) (key, value) -> System.out.println("key:" + key + " value:" + value + "\n失效时间:" + System.currentTimeMillis()))
+                .build();
+        System.out.println("当前时间:" + System.currentTimeMillis());
+        map.put("test", "test123", 6, TimeUnit.SECONDS);
+        Thread.sleep(5000);
+        System.err.println(map.get("test"));
+        Thread.sleep(10000);
+        System.err.println(map.get("test"));
+    }
+
+

3.实测误差

+

image-20220928202632405

+

性能测试

+

image-20220928202641748

+

image-20220928202650512

+

源码解析

+

1.构建

+
/**
+*
+* maxSize:map的最大长度,添加第1001个entry时,会导致第1个马上过期(即使没到过期时间)
+* expiration:过期时间和过期单位,设置过期时间,则永久有效.
+* expirationPolicy:过期策略的使用
+*      CREATED:  在每次更新元素时,过期倒计时清零
+*      ACCESSED: 在每次访问元素时,过期倒计时清零
+*
+* variableExpiration:允许更新过期时间值,如果不设置variableExpiration
+*      不允许更改过期时间,一旦执行更改过期时间的操作则会抛出UnsupportedOperationException异常
+* expirationListener:同步过期监听
+* asyncExpirationListener:异步过期监听
+* entryLoader:懒加载,调用get方法时若key不存在创建默认value
+*
+*/
+ExpiringMap<String, String> map = ExpiringMap.builder()
+    .maxSize(100000)
+    .expiration(1, TimeUnit.SECONDS)
+    .expirationPolicy(ExpirationPolicy.ACCESSED)
+    .variableExpiration()
+    .asyncExpirationListener(ExpiringMapTest::remindAsyncExpiration)
+    .entryLoader(name -> "default")
+    .build();
+
+

2.初始化

+
  private ExpiringMap(final Builder<K, V> builder) {
+    if (EXPIRER == null) {
+      synchronized (ExpiringMap.class) {
+        if (EXPIRER == null) {
+          EXPIRER = Executors.newSingleThreadScheduledExecutor(
+              THREAD_FACTORY == null ? new NamedThreadFactory("ExpiringMap-Expirer") : THREAD_FACTORY);
+        }
+      }
+    }
+
+    if (LISTENER_SERVICE == null && builder.asyncExpirationListeners != null) {
+      synchronized (ExpiringMap.class) {
+        if (LISTENER_SERVICE == null) {
+          LISTENER_SERVICE = (ThreadPoolExecutor) Executors.newCachedThreadPool(
+              THREAD_FACTORY == null ? new NamedThreadFactory("ExpiringMap-Listener-%s") : THREAD_FACTORY);
+        }
+      }
+    }
+
+    variableExpiration = builder.variableExpiration;
+    entries = variableExpiration ? new EntryTreeHashMap<K, V>() : new EntryLinkedHashMap<K, V>();
+    if (builder.expirationListeners != null)
+      expirationListeners = new CopyOnWriteArrayList<ExpirationListener<K, V>>(builder.expirationListeners);
+    if (builder.asyncExpirationListeners != null)
+      asyncExpirationListeners = new CopyOnWriteArrayList<ExpirationListener<K, V>>(builder.asyncExpirationListeners);
+    expirationPolicy = new AtomicReference<ExpirationPolicy>(builder.expirationPolicy);
+    expirationNanos = new AtomicLong(TimeUnit.NANOSECONDS.convert(builder.duration, builder.timeUnit));
+    maxSize = builder.maxSize;
+    entryLoader = builder.entryLoader;
+    expiringEntryLoader = builder.expiringEntryLoader;
+  }
+
+

3.过期key存储,EntryMap,EntryLinkedHashMap,EntryTreeHashMap

+
 private interface EntryMap<K, V> extends Map<K, ExpiringEntry<K, V>> {
+    /** Returns the first entry in the map or null if the map is empty. */
+    ExpiringEntry<K, V> first();
+
+    /**
+     * Reorders the given entry in the map.
+     * 
+     * @param entry to reorder
+     */
+    void reorder(ExpiringEntry<K, V> entry);
+
+    /** Returns a values iterator. */
+    Iterator<ExpiringEntry<K, V>> valuesIterator();
+  }
+
+

4.过期map实体ExpiringEntry,重写了compareTo方法,按过期时间从小到大排序

+
 static class ExpiringEntry<K, V> implements Comparable<ExpiringEntry<K, V>> {
+    final AtomicLong expirationNanos;
+    /** Epoch time at which the entry is expected to expire */
+    final AtomicLong expectedExpiration;
+    final AtomicReference<ExpirationPolicy> expirationPolicy;
+    final K key;
+    /** Guarded by "this" */
+    volatile Future<?> entryFuture;
+    /** Guarded by "this" */
+    V value;
+    /** Guarded by "this" */
+    volatile boolean scheduled;
+ 
+     
+     @Override
+    public int compareTo(ExpiringEntry<K, V> other) {
+      if (key.equals(other.key))
+        return 0;
+      return expectedExpiration.get() < other.expectedExpiration.get() ? -1 : 1;
+    }
+ }
+
+

5.添加元素,过期key的实现逻辑

+
  /**
+   * Puts the given key/value in storage, scheduling the new entry for expiration if needed. If a previous value existed
+   * for the given key, it is first cancelled and the entries reordered to reflect the new expiration.
+   */
+  V putInternal(K key, V value, ExpirationPolicy expirationPolicy, long expirationNanos) {
+    writeLock.lock();
+    try {
+      ExpiringEntry<K, V> entry = entries.get(key);
+      V oldValue = null;
+
+      if (entry == null) {
+        entry = new ExpiringEntry<K, V>(key, value,
+            variableExpiration ? new AtomicReference<ExpirationPolicy>(expirationPolicy) : this.expirationPolicy,
+            variableExpiration ? new AtomicLong(expirationNanos) : this.expirationNanos);
+        if (entries.size() >= maxSize) {
+          ExpiringEntry<K, V> expiredEntry = entries.first();
+          entries.remove(expiredEntry.key);
+          notifyListeners(expiredEntry);
+        }
+        entries.put(key, entry);
+        if (entries.size() == 1 || entries.first().equals(entry))
+          scheduleEntry(entry);
+      } else {
+        oldValue = entry.getValue();
+        if (!ExpirationPolicy.ACCESSED.equals(expirationPolicy)
+            && ((oldValue == null && value == null) || (oldValue != null && oldValue.equals(value))))
+          return value;
+
+        entry.setValue(value);
+        resetEntry(entry, false);
+      }
+
+      return oldValue;
+    } finally {
+      writeLock.unlock();
+    }
+  }
+
+
  /**
+   * Schedules an entry for expiration. Guards against concurrent schedule/schedule, cancel/schedule and schedule/cancel
+   * calls.
+   * 
+   * @param entry Entry to schedule
+   */
+  void scheduleEntry(ExpiringEntry<K, V> entry) {
+    if (entry == null || entry.scheduled)
+      return;
+
+    Runnable runnable = null;
+    synchronized (entry) {
+      if (entry.scheduled)
+        return;
+
+      final WeakReference<ExpiringEntry<K, V>> entryReference = new WeakReference<ExpiringEntry<K, V>>(entry);
+      runnable = new Runnable() {
+        @Override
+        public void run() {
+          ExpiringEntry<K, V> entry = entryReference.get();
+
+          writeLock.lock();
+          try {
+            if (entry != null && entry.scheduled) {
+              entries.remove(entry.key);
+              notifyListeners(entry);
+            }
+
+            try {
+              // Expires entries and schedules the next entry
+              Iterator<ExpiringEntry<K, V>> iterator = entries.valuesIterator();
+              boolean schedulePending = true;
+
+              while (iterator.hasNext() && schedulePending) {
+                ExpiringEntry<K, V> nextEntry = iterator.next();
+                if (nextEntry.expectedExpiration.get() <= System.nanoTime()) {
+                  iterator.remove();
+                  notifyListeners(nextEntry);
+                } else {
+                  scheduleEntry(nextEntry);
+                  schedulePending = false;
+                }
+              }
+            } catch (NoSuchElementException ignored) {
+            }
+          } finally {
+            writeLock.unlock();
+          }
+        }
+      };
+    // 添加延时任务
+      Future<?> entryFuture = EXPIRER.schedule(runnable, entry.expectedExpiration.get() - System.nanoTime(),
+          TimeUnit.NANOSECONDS);
+      entry.schedule(entryFuture);
+    }
+  }
+
+

总结

+

1.实测内存,CPU占用,以及失效监听触发延时都优于使用redis

+

2.符合业务需求

+

最后

每个需求都有不同的解决方案,不要吊死在一棵树上!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\224\262\351\252\250\346\226\207Arm\347\241\254\347\233\230\346\211\251\345\256\271/index.html" "b/\347\224\262\351\252\250\346\226\207Arm\347\241\254\347\233\230\346\211\251\345\256\271/index.html" index e69de29bb2..5b59cfc8fe 100644 --- "a/\347\224\262\351\252\250\346\226\207Arm\347\241\254\347\233\230\346\211\251\345\256\271/index.html" +++ "b/\347\224\262\351\252\250\346\226\207Arm\347\241\254\347\233\230\346\211\251\345\256\271/index.html" @@ -0,0 +1,650 @@ + + + + + + + + + + + + 甲骨文Arm机器扩容硬盘教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 甲骨文Arm机器扩容硬盘教程 +

甲骨文Arm机器扩容硬盘教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

一.扩容硬盘

登录Oralce网页平台,调整硬盘空间.默认免费200G额度,根据个人所开机器计算剩余空间!

+

image-20230106112519465

+

二.调整分区

SSH连接需要扩容的服务器.按如下命令操作!

+
# 安装
+sudo apt-get install parted
+
+# 进入
+parted
+
+# 选择设备
+select /dev/sda
+
+# 看分区表,找到对应 ID
+print
+
+# 假设是 2 ,调整 2 分区的尺寸,输入尺寸确定
+resizepart 2
+
+# 退出
+quit
+
+# 这时候分区表已经改了,但文件系统还没更新,一般是 ext4 所以可以用这个更新
+sudo apt-get install e2fsprogs
+
+# 更新文件系统信息
+resize2fs /dev/sda2
+
+

三.查看服务器空间

输入df -h即可查看!

+

image-20230106112727459

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\231\275\345\253\226GPT4/index.html" "b/\347\231\275\345\253\226GPT4/index.html" index e69de29bb2..c30e273043 100644 --- "a/\347\231\275\345\253\226GPT4/index.html" +++ "b/\347\231\275\345\253\226GPT4/index.html" @@ -0,0 +1,632 @@ + + + + + + + + + + + + 白嫖两个月GPT4 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 白嫖两个月GPT4 +

白嫖两个月GPT4

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

领取地址:

Perplexity AI 现在可免费领取 2 月 PRO 会员
https://www.perplexity.ai/pro?discount_code=THANKS23

+

image-20231124160426382

+

image-20231124160343731

+

image-20231124160349786

+

image-20231124160411742

+

注意

    +
  • 国内信用卡也可以使用
  • +
  • 若害怕扣费可以直接取消订阅,免费用一个月,若不怕.可以等第二个月续期后再取消订阅!
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\231\275\345\253\226\345\205\215\350\264\271\345\237\237\345\220\215/index.html" "b/\347\231\275\345\253\226\345\205\215\350\264\271\345\237\237\345\220\215/index.html" index e69de29bb2..0fae163e33 100644 --- "a/\347\231\275\345\253\226\345\205\215\350\264\271\345\237\237\345\220\215/index.html" +++ "b/\347\231\275\345\253\226\345\205\215\350\264\271\345\237\237\345\220\215/index.html" @@ -0,0 +1,652 @@ + + + + + + + + + + + + 白嫖eu.org的免费域名 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 白嫖eu.org的免费域名 +

白嫖eu.org的免费域名

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

注册账号

官网地址 : https://nic.eu.org/

+

1)账号注册需要注意NAME格式 名 空格 姓,邮箱填写正确能接收邮件就好!

+

image-20220928202214235

+

2)邮箱会收到一封邮件,点击激活链接!XXXXX-FREE 就是账号!

+

image-20220928202224057

+

3)登陆网站准备申请域名,点击【New Domain】

+

image-20220928202232726

+

申请域名

1)domain name 填写你要申请的域名,长度需要大于3位字符。

+

最下方有Name Servers填写 DNS服务商的NS

+

image-20220928202252376

+

Name servers 选择第一个来验证即可!

+

image-20220928202300323

+

2)点击提交后,提示没有错误即可!等待审核!

+

image-20220928202307222

+

3)审核速度不确定,有时候秒批,有时候等几个月!

+

博主亲测,等了2小时通过审核了。

+

审核通过后会发送一封邮件通知,直接登录平台可以看见申请的域名!

+

image-20220928202319802

+

域名管理

1)点击右侧的编辑按钮,可以修改或者删除域名。

+

image-20220928202325979

+

2)当然可以修改NS信息,比如接入Cloudflare

+

最后总结

eu.org已经好多年了,相对来说还算稳定。不过申请的人多了可能存在各种擦边的东东,很有可能被一刀切。

+

如果真心好好建站还是建议买个付费的域名!这样比较长久!

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\231\276\345\272\246\346\226\207\345\272\223\345\212\251\346\211\213/index.html" "b/\347\231\276\345\272\246\346\226\207\345\272\223\345\212\251\346\211\213/index.html" index e69de29bb2..c3b686c656 100644 --- "a/\347\231\276\345\272\246\346\226\207\345\272\223\345\212\251\346\211\213/index.html" +++ "b/\347\231\276\345\272\246\346\226\207\345\272\223\345\212\251\346\211\213/index.html" @@ -0,0 +1,627 @@ + + + + + + + + + + + + 文库一键下载 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 文库一键下载 +

文库一键下载

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + + + + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\231\276\345\272\246\347\275\221\347\233\230\351\253\230\351\200\237\344\270\213\350\275\275/index.html" "b/\347\231\276\345\272\246\347\275\221\347\233\230\351\253\230\351\200\237\344\270\213\350\275\275/index.html" index e69de29bb2..42912973ff 100644 --- "a/\347\231\276\345\272\246\347\275\221\347\233\230\351\253\230\351\200\237\344\270\213\350\275\275/index.html" +++ "b/\347\231\276\345\272\246\347\275\221\347\233\230\351\253\230\351\200\237\344\270\213\350\275\275/index.html" @@ -0,0 +1,637 @@ + + + + + + + + + + + + 使用油猴插件高速下载百度网盘 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 使用油猴插件高速下载百度网盘 +

使用油猴插件高速下载百度网盘

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

最近为了下载百度网盘上的一些学习资料,发现了一个免费告诉下载的方法,下面教大家如何使用!

+

浏览器安装油猴插件

油猴官网安装:https://tampermonkey.net/

+

image-20221013092808103

+

油猴插件地址:https://greasyfork.org/zh-CN,点击浏览此网站,即可下载合适的插件.

+

image-20221013092855560

+

安装百度网盘插件

分享一下个人使用的插件,可自行从上面搜索安装

+

image-20221013093027366

+

安装完成插件之后,打开百度网盘.登录账号,选中文件即可进行下载

+

image-20221013093149375

+

点击链接即可开始下载,也可以安装IDM等进行下载.

+

image-20221013093231715

+

IDM安装教程

请参考公众号: 一只会飞的旺旺

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\243\201\347\233\230\347\251\272\351\227\264\346\270\205\347\220\206\345\217\212Docker\347\243\201\347\233\230\345\215\240\347\224\250\346\216\222\346\237\245/index.html" "b/\347\243\201\347\233\230\347\251\272\351\227\264\346\270\205\347\220\206\345\217\212Docker\347\243\201\347\233\230\345\215\240\347\224\250\346\216\222\346\237\245/index.html" index e69de29bb2..ef54319888 100644 --- "a/\347\243\201\347\233\230\347\251\272\351\227\264\346\270\205\347\220\206\345\217\212Docker\347\243\201\347\233\230\345\215\240\347\224\250\346\216\222\346\237\245/index.html" +++ "b/\347\243\201\347\233\230\347\251\272\351\227\264\346\270\205\347\220\206\345\217\212Docker\347\243\201\347\233\230\345\215\240\347\224\250\346\216\222\346\237\245/index.html" @@ -0,0 +1,665 @@ + + + + + + + + + + + + Linux磁盘空间清理及Docker磁盘占用排查 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Linux磁盘空间清理及Docker磁盘占用排查 +

Linux磁盘空间清理及Docker磁盘占用排查

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

一.Linux系统占用

1.查询全局磁盘占用

# 查看总磁盘占用量
+df -hl
+
+

2、查看某个文件夹下每个文件大小

ls -l
+# 按照M显示
+ls -l --block-size=m
+
+

3、查看某个文件夹下所有文件大小

# 查看当前文件
+du -sh .
+# 查看指定文件夹
+du -sh /home/*
+
+

二.docker磁盘占用

1.查看容器内存,cpu占用

docker stats
+
+

2.查看整个docker占用情况

docker system df
+# 或
+df -Th /var/lib/docker/
+
+

3.查看image,container占用

docker system df -v
+
+

4.查看镜像占用

docker ps --format "table {{.Size}}\t{{.Names}}"
+
+

5.docker日志处理

# 进入容器目录
+cd /var/lib/docker/containers
+# 查看哪个容器占用大
+du -sh .
+# 也可以具体进入某个容器
+cd /var/lib/docker/containers/a40b469c66170a20baef5d650e6584de71d74fd1f33351955a1ec128de73de05
+# 查看文件大小
+ls -l --block-size=m
+# 清理日志
+cat /dev/null > /var/lib/docker/containers/73de05/73de05-json.log
+
+

日志清理脚本

+
#!/bin/sh 
+echo "======== start clean docker containers logs ========"  
+
+logs=$(find /var/lib/docker/containers/ -name *-json.log)  
+
+for log in $logs  
+        do  
+                echo "clean logs : $log"  
+                cat /dev/null > $log  
+        done  
+
+echo "======== end clean docker containers logs ========"
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\250\213\345\272\217\346\230\257\346\200\216\344\271\210\350\267\221\350\265\267\346\235\245\347\232\204\351\230\205\350\257\273\347\254\224\350\256\260/index.html" "b/\347\250\213\345\272\217\346\230\257\346\200\216\344\271\210\350\267\221\350\265\267\346\235\245\347\232\204\351\230\205\350\257\273\347\254\224\350\256\260/index.html" index e69de29bb2..5fd933e9ea 100644 --- "a/\347\250\213\345\272\217\346\230\257\346\200\216\344\271\210\350\267\221\350\265\267\346\235\245\347\232\204\351\230\205\350\257\273\347\254\224\350\256\260/index.html" +++ "b/\347\250\213\345\272\217\346\230\257\346\200\216\344\271\210\350\267\221\350\265\267\346\235\245\347\232\204\351\230\205\350\257\273\347\254\224\350\256\260/index.html" @@ -0,0 +1,769 @@ + + + + + + + + + + + + 《程序是怎么跑起来的》阅读笔记 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 《程序是怎么跑起来的》阅读笔记 +

《程序是怎么跑起来的》阅读笔记

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

CPU内部结构

1.寄存器: 用来暂存指令,数据等处理对象

+

2.控制器: 负责把内存上的指令,数据读入寄存器,并根据指令执行结果来控制整个计算机

+

3.运算器: 负责从内存读入寄存器的数据

+

4.时钟: 负责发出CPU开始计时的时钟信号

+

image-20230313192531501

+

程序计数器

1.程序计数器: 是决定程序流程的寄存器,它指向下一条执行的指令

+

2.程序流程: 顺序执行,条件分支,循环

+

3.程序中的比较指令,就是在CPU内部做减法运算

+

image-20230313192547300

+

4.函数调用机制

+

image-20230313192906464

+

二进制

1.IC的所有引脚,只有直流电压的0v和5v两个状态,这也是二进制的由来.它只有0和1两种数字。

+

2.计算机处理信息的最小单位为位,一个字节等于8位

+

3.二进制和十六进制之间可以进行相互转换,每4位二进制数对应1位十六进制数。

+

4.Java中可以用0b或0B开头表示二进制数,用0x或0X开头表示十六进制数。

+

image-20230313193625943

+

运算

1.移位运算符有两种:左移运算符(<<)和右移运算符(>>),分别表示将一个数的各二进制位向左或向右移动若干位。

+

2.移位运算中,无符号数和有符号数的运算并不相同。对于无符号数,右移之后高位补0;对于有符号数,符号位一起移动,正数高位补0,负数高位补1

+

3.移位运算的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都低

+

4.表示负数时,使用的是二进制的补数,即负数的绝对值的二进制数,取反+1

+

逻辑右移和算术右移的区别是:

+
    +
  • 逻辑右移是不考虑符号位,只是将所有的二进制位向右移动,并在高位补0
  • +
  • 算术右移是考虑符号位,将除了最高位之外的其他二进制位向右移动,并在高位补上原来的最高位
  • +
+

补码和反码是用来表示负数的方法:

+
    +
  • 补码是将一个负数的绝对值按照二进制形式表示出来,然后对每一位取反(即0变1,1变0),再加上1得到的结果
  • +
  • 反码是将一个负数的绝对值按照二进制形式表示出来,然后对每一位取反(即0变1,1变0)得到的结果
  • +
+

逻辑运算: 包括逻辑非(NOT),逻辑与(AND),逻辑或(OR),逻辑异或(^)

+

image-20230313213940732

+

小数运算

    +
  • 计算机进行小数运算时出错的原因是计算机内部使用二进制表示小数,而有些小数在二进制中无法精确表示,例如0.1。
  • +
+

image-20230314162010751

+
    +
  • 为了解决这个问题,计算机采用了浮点数的方式来表示小数,即将一个小数分成有效数字和指数两部分,并用固定的位数来存储它们。
  • +
+

image-20230314162554243

+
    +
  • 浮点数也有一定的精度限制,因为有效数字和指数的位数是有限的。如果超出了这个范围,就会产生溢出或下溢的情况。
  • +
  • 浮点数还有一些特殊的值,例如正负无穷大、非数字(NaN)和零。这些值可以用来表示一些异常或无意义的结果,例如除以零或开方负数。
  • +
  • 浮点数之间的比较和运算要注意精度损失和舍入误差。为了避免这些问题,可以使用一些技巧或工具,例如设置合理的误差范围、使用高精度库或软件等。
  • +
+

内存

    +
  • 内存是一种电子元件,可以存储和读取数据。内存有多种类型,例如DRAM、SRAM、ROM等。
  • +
  • 内存的容量和速度取决于其引脚的数量和配置。引脚分为电源、地址信号、数据信号、控制信号等,用于输入输出数据。
  • +
  • 内存的地址空间是指内存可以表示的地址范围。地址空间的大小由地址信号的位数决定,例如32位地址信号可以表示2^32个地址。
  • +
  • 内存的访问方式有两种:字节寻址和字寻址。字节寻址是指每个字节都有一个独立的地址,而字寻址是指每个字(通常为4个字节)都有一个独立的地址。
  • +
  • 内存中的数据可以按照不同的方式排列,例如大端法和小端法。大端法是指高位字节放在低位地址,而小端法是指低位字节放在低位地址。
  • +
+

数据结构

    +
  • 栈和队列是两种常用的数据结构,可以对数组的元素进行不通过指定地址和索引的读写操作。
  • +
  • 栈是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。栈可以用来保存函数调用时的返回地址、局部变量等信息。
  • +
  • 队列是一种先进先出(FIFO)的数据结构,只能在一端插入,在另一端删除。队列可以用来保存输入输出设备的数据、事件等信息。
  • +
  • 环形缓冲区是一种特殊的队列,它使用一个固定大小的数组来存储数据,并通过两个指针来标记队首和队尾。环形缓冲区可以实现无缝地循环使用数组空间,避免浪费或溢出。
  • +
+

磁盘

    +
  • 计算机中主要的存储部件是内存和磁盘,磁盘中存储的程序,必须要加载到内存中才能运行
  • +
+

image-20230314163315472

+
    +
  • 磁盘缓存可以大大改善磁盘数据的访问速度
  • +
+

image-20230314163420227

+
    +
  • 虚拟内存则是为了解决内存不足的情况,将磁盘的一部分作为内存来使用.在使用中实际内存和虚拟内存的内容会进行部分置换,以满足程序运行的需要
  • +
  • 虚拟内存分为分页式与分段式
  • +
+

image-20230314163745969

+

数据压缩

    +
  • RLE算法是一种简单的无损压缩算法,它利用数据中的重复性,将连续出现的相同数据用一个计数值和一个数据值来表示。例如,AAAAABBBBCCCC可以压缩为5A4B4C。

    +
  • +
  • RLE算法适合于处理有大量重复数据的文件,如图像、音频等。RLE算法的优点是压缩和解压速度快,算法简单易实现;缺点是压缩率较低,对于没有重复数据的文件无法压缩甚至可能增大文件大小。

    +
  • +
  • 哈夫曼编码是一种基于概率的无损压缩算法,它根据数据中每个符号出现的频率,构建一棵二叉树,给每个符号分配一个不同长度的二进制编码。出现频率高的符号分配较短的编码,出现频率低的符号分配较长的编码。例如,如果一个文件中A出现了45次,B出现了13次,C出现了12次,D出现了16次,E出现了9次,F出现了5次,则可以构建如下图所示的哈夫曼树,并给每个符号分配如下表所示的编码。

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolFrequencyCode
A450
B13101
C12100
D16111
E91101
F51100
+
    +
  • 哈夫曼编码适合于处理有不同频率的符号组成的文件,如文本、程序等。哈夫曼编码的优点是压缩率较高,可以达到最优压缩;缺点是压缩和解压速度较慢,需要构建和存储哈夫曼树。
  • +
+

系统与软件

    +
  • 系统是一组相互关联的部件,它们共同完成一个特定的功能或目标。系统可以分为硬件系统和软件系统。硬件系统是由物理设备组成的,如CPU、内存、硬盘等。软件系统是由程序和数据组成的,如操作系统、应用程序等。

    +
  • +
  • 系统可以提高效率、可靠性和安全性。例如,操作系统是一种软件系统,它管理和控制硬件资源,提供用户界面和服务,保护数据和程序不被破坏或泄露。应用程序是一种软件系统,它实现用户的需求和功能,如浏览器、游戏、办公软件等。

    +
      +
    • 源代码是人类编写的程序语言,如Java、C、Python等。为了让计算机能够理解和执行源代码,需要经过以下几个步骤:
    • +
    +
      +
    • 编译:将源代码转换为目标代码,即机器语言或汇编语言。不同的编程语言有不同的编译器,如Java有javac,C有gcc等。

      +
    • +
    • 链接:将多个目标代码文件和库文件合并为一个可执行文件。链接可以分为静态链接和动态链接。静态链接是在编译时进行的,将所有依赖的库文件嵌入到可执行文件中。动态链接是在运行时进行的,将依赖的库文件加载到内存中,并通过地址重定位来连接到可执行文件中。

      +
    • +
    • 加载:将可执行文件从磁盘加载到内存中,并分配必要的资源,如栈、堆、寄存器等。

      +
    • +
    +
  • +
  • 应用是用户通过操作系统来启动和使用的软件系统。当用户运行一个应用时,操作系统会创建一个进程来表示该应用,并为其分配一个虚拟地址空间和一些其他资源。进程是操作系统管理和调度的基本单位,它包含了应用运行所需的所有信息,如程序计数器、状态寄存器、堆栈指针等。操作系统通过进程控制块(PCB)来存储进程的信息,并通过进程表来管理所有进程。操作系统还负责在多个进程之间进行切换和调度,以实现多任务和并发。

    +
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\254\224\350\256\260\346\234\254\346\216\211\346\230\276\345\215\241\345\246\202\344\275\225\350\247\243\345\206\263/index.html" "b/\347\254\224\350\256\260\346\234\254\346\216\211\346\230\276\345\215\241\345\246\202\344\275\225\350\247\243\345\206\263/index.html" index e69de29bb2..0c4df7b1ec 100644 --- "a/\347\254\224\350\256\260\346\234\254\346\216\211\346\230\276\345\215\241\345\246\202\344\275\225\350\247\243\345\206\263/index.html" +++ "b/\347\254\224\350\256\260\346\234\254\346\216\211\346\230\276\345\215\241\345\246\202\344\275\225\350\247\243\345\206\263/index.html" @@ -0,0 +1,628 @@ + + + + + + + + + + + + 笔记本掉显卡如何解决? - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 笔记本掉显卡如何解决? +

笔记本掉显卡如何解决?

+
+ + + + +
+ +
+
+ +
+
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前几天笔记本突然独显找不到了,具体状况如下:

+

image-20231113092301636

+

img

+

解决方法(自测)

我首先根据网络上的教程试了一遍,均不能解决,可以参考:Win11系统中未检测到nvidia显卡解决教程

+

从nvidia官网直接下载驱动安装提示会出现图一的情况!

+

最后,通过GeForce Experience这款软件,倒是正常安装上驱动了,有问题的也可以尝试一下!避免重装电脑或者送修!

+

软件地址: GeForce_Experience

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\254\254\344\270\200\346\234\254Docker\344\271\246\351\230\205\350\257\273\347\254\224\350\256\260/index.html" "b/\347\254\254\344\270\200\346\234\254Docker\344\271\246\351\230\205\350\257\273\347\254\224\350\256\260/index.html" index e69de29bb2..02d14cc0c3 100644 --- "a/\347\254\254\344\270\200\346\234\254Docker\344\271\246\351\230\205\350\257\273\347\254\224\350\256\260/index.html" +++ "b/\347\254\254\344\270\200\346\234\254Docker\344\271\246\351\230\205\350\257\273\347\254\224\350\256\260/index.html" @@ -0,0 +1,672 @@ + + + + + + + + + + + + 《第一本Docker书》阅读笔记 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 《第一本Docker书》阅读笔记 +

《第一本Docker书》阅读笔记

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

Docker是什么?

Docker是一个开源的软件平台,可以让您轻松地构建、运行和共享应用程序。Docker使用容器技术,可以将应用程序和它们所需的依赖项打包在一起,从而实现快速部署、可移植性和一致性。Docker还提供了工具和服务来管理和编排容器,以支持复杂的分布式应用程序。本书将教您如何使用Docker来开发、测试和部署各种类型的应用程序。

+

为什么需要Docker?

    +
  • Docker可以提供一个简单、轻量的建模方式,让您可以在任何地方运行相同的代码,无论是开发环境、测试环境还是生产环境。
  • +
  • Docker可以实现职责的逻辑分离,让开发者专注于编写代码,而运维者专注于部署和管理应用程序。
  • +
  • Docker可以加快和优化开发生命周期,让您可以快速构建、测试和迭代应用程序,并利用镜像和仓库来重用和共享组件。
  • +
  • Docker可以鼓励使用面向服务的架构,让您可以将应用程序拆分为多个容器,每个容器负责一个单一的功能,并通过网络进行通信和协作。
  • +
+

如何安装Docker?

参考: Docker 教程 | 菜鸟教程 (runoob.com)

+

如何创建一个容器?

    +
  • 从已有的镜像创建容器。例如,本书第三章介绍了如何使用docker run命令从ubuntu镜像启动一个容器,并在其中运行bash。
  • +
  • 从Dockerfile构建镜像,并从该镜像创建容器。例如,本书第四章介绍了如何使用docker build命令根据Dockerfile的指令生成一个新的镜像,并使用docker run命令从该镜像启动一个容器。
  • +
  • 从其他容器提交更改并创建新的镜像,然后从该镜像创建容器。例如,本书第四章介绍了如何使用docker commit命令将一个运行中的容器保存为一个新的镜像,并使用docker run命令从该镜像启动一个新的容器。
  • +
  • 使用docker create命令创建一个未启动的容器,然后使用docker start命令启动它。例如,网络搜索结果中提到了如何使用docker create -p 3000:80 –name exampleApp3000 yoyomooc/exampleapp命令创建一个名为exampleApp3000的容器,并将其内部的80端口映射到主机操作系统的3000端口上。
  • +
+

Docker容器与镜像的关系

    +
  • Docker镜像是一个只读的模板,包含了运行容器所需的数据和配置。
  • +
  • Docker容器是由Docker镜像创建的运行实例,可以执行各种操作,如启动、停止、删除等。
  • +
  • Docker容器可以从Docker镜像中继承数据和配置,也可以在运行时添加或修改数据和配置。
  • +
  • Docker容器可以将自己的状态保存为新的Docker镜像,以便于复用或分享。
  • +
+

Docker镜像构建与存储

    +
  • 选择一个基础镜像,如Ubuntu或者CentOS。
  • +
  • 在基础镜像上安装和配置所需的软件和服务,如Nginx或者Redis。
  • +
  • 使用Docker的commit命令或者Dockerfile文件来创建新的镜像,并给它一个合适的标签。
  • +
  • 使用Docker的push命令将新的镜像推送到Docker Hub或者私有的Registry中,以便于共享和部署。
  • +
+

如何使用Docker-Compose进行容器编排

    +
  • 编写Dockerfile来定义应用程序的环境
  • +
  • 编写docker-compose.yml来定义组成应用程序的服务
  • +
  • 运行docker-compose up来启动所有服务
  • +
+
# 下面是一个简单的docker-compose.yml文件,用于创建一个web服务和一个redis服务
+version: '3'
+services:
+  web:
+    build: .
+    ports:
+      - "5000:5000"
+    volumes:
+      - .:/code
+    depends_on:
+      - redis
+  redis:
+    image: "redis:alpine"
+
+

如何深入学习

这本书主要介绍了Docker的基本概念、安装、使用、镜像、测试、构建服务和编排等方面。如果想要深入学习Docker的其他方面,可以参考以下推荐:

+
    +
  • 《Docker技术入门与实战》:这本书是一本比较全面的Docker入门书籍,涵盖了Docker的原理、架构、安装、镜像、容器、数据管理、网络、编排等内容,还介绍了一些常用的Docker工具和案例。
  • +
  • 《第一本Docker书》:这本书是一本比较简洁的Docker入门书籍,通过实例讲解了如何使用Docker来部署应用程序,并介绍了一些常见的问题和解决方法。
  • +
  • 《深入浅出Docker》:这本书是一本比较深入的Docker进阶书籍,从底层原理到高级应用,详细讲解了Docker的核心技术和最佳实践。
  • +
  • Docker官方文档和博客:这是学习Docker最权威和最新的资源,包括了基础教程、用户指南、开发者指南、参考文档等内容,还有一些关于Docker的新闻和动态。
  • +
  • Docker中文社区:这是一个专注于Docker技术交流和分享的社区网站,有很多关于Docker的文章、视频、教程等资源,还有一个活跃的论坛和微信群。
  • +
  • Docker中国官方博客:这是一个专注于中国市场的官方博客,有很多关于Docker在中国应用场景和案例的文章,还有一些关于国内外行业动态和活动信息。
  • +
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\276\216\345\214\272Appstore\350\264\246\345\217\267\346\263\250\345\206\214/index.html" "b/\347\276\216\345\214\272Appstore\350\264\246\345\217\267\346\263\250\345\206\214/index.html" index e69de29bb2..ac508f2d15 100644 --- "a/\347\276\216\345\214\272Appstore\350\264\246\345\217\267\346\263\250\345\206\214/index.html" +++ "b/\347\276\216\345\214\272Appstore\350\264\246\345\217\267\346\263\250\345\206\214/index.html" @@ -0,0 +1,689 @@ + + + + + + + + + + + + 五分钟注册美区Apple ID - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 五分钟注册美区Apple ID +

五分钟注册美区Apple ID

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

一、准备工作

1.一个能接收短信的国内手机号2.一个全新邮箱(指从没注册过Apple ID的邮箱)3.美国地址生成器(后面我会给大家提供)4.无需任何代理工具

+

注意以下四点可以避免很多问题:

+

出生日期:一定要设置成大于 18 周岁的日期,否则会导致部分应用由于年龄限制无法使用。

+

电子邮件:建议新注册一个全新的从未注册过 Apple ID 的邮箱,比如 163 邮箱。

+

手机号码:亲测,注册过中国区 Apple ID 的手机号码可以用来注册美区账号,不会产生冲突。

+

密码:设置密码时,密码中不要包含有名字、生日、邮箱中的信息,否则会卡在验证码那一步。

+

二、注册教程

为了方便大家注册,该方法全程都在手机中操作,不用借助电脑。

+

首先进入美国 Apple ID 注册页面,复制下方网址至 Safari 浏览器中打开即可进入。

+
https://appleid.apple.com/account 
+
+

具体注册方法如下长图,跟着我的步骤走就行了,一定要严格按照我写的要求操作。

+

image-20220928205251126

+

接着需要对电子邮件/手机号码进行验证。把收到的验证码输入进去,依次点击下一步就行了。

+

image-20220928205303627

+

注册成功后,账号会自动登录,如果没登录的话重新登录一遍刚注册的账号即可。

+

接着点击退出登录左边的“箭头”然后点击付款方式,接着再点击添加付款方式

+

image-20220928205316016

+

下一步是填写付款方式&账单地址,这步很关键,需要借助美国地址生成器,它会自动帮你生成街道地址、城市、邮编、电话号码等信息。

+

生成地址前,建议选以下五个免税州:蒙大拿州(Montana)俄勒冈州(Oregon)

+

阿拉斯加州(Alaska)

+

特拉华州(Delaware)

+

新罕布什尔州(New Hampshire)

+

网址一:https://www.meiguodizhi.com/

+

网址二:http://www.haoweichi.com/

+

网址三:https://www.shenfendaquan.com/

+

下图中标注的由美国地址生成器生成的内容,直接复制美国地址生成器中生成的内容即可。

+

image-20220928205339051

+

接着勾选拷贝账单寄送地址,最后点击更新就行了。

+

image-20220928205355952

+

到这里我们的美区 Apple ID 就注册完成了!下面教大家如何登录。

+

三、登录美区ID

打开 App Store,首先退出当前账号。点击右上角的头像,然后拉到末尾,点击退出登录即可。

+

image-20220928205412430

+

接着再次点击 App Store 中右上角的头像,输入前面注册的美区账号&密码,点击登录即可。

+

image-20220928205426682

+

然后会跳出一个弹窗,选择检查即可,接着打开同意条款与条件,选择下一页

+

image-20220928205439299

+

不要修改任何内容,直接点击下一页,然后点击继续

+

image-20220928205449015

+

点击Continue,到这里我们的美区 Apple ID 就已经成功登录了。

+

image-20220928205459713

+

注册登录成功后,我们就能下载美区中的各种 App 了。

+

image-20220928205510684

+

四、一些需要注意的地方

1.设置密码时,密码中不要包含前面填写的名字、生日、邮箱中的任何信息,否则可能会卡在验证码那一步,总之就是密码尽量原创一个。

+

2.不要在「设置」中登录美区Apple ID,以免造成不必要的麻烦。下载美区 App 只需在 App Store 中登录即可,下载完后再换回国区账号即可,对 iCloud 等不会有任何影响。

+

3.如果你有在用Apple Music,切换成美区后会导致已下载的歌曲全被清空。

+

4.建议不要把美区 Apple ID 当成主力账号,需要下美区应用时登录就行了,以免出现啥问题。

+

五、常见问题汇总

➊ 手机号码提示错误怎么解决?

+

答:看看复制的号码是不是开头有数字”1”或者”+1”,有的话去掉即可。

+

➋ 更新 App 的时候显示账号被锁定,但可以下载未下载过的 App 是什么原因?

+

答:因为你更新的这个 App 之前是用其他 Apple ID 下载的,所以这个 App 是和你之前下载时的那个 Apple ID 绑定在一起的,所以出现被锁定的提示是原先账号出了问题,和当前账号没关系。解决方法很简单,把 App 卸载重新安装即可。

+

➌ 邮编错误怎么办?

+

答:估计是地址生成器网站数据库中的部分邮编有误,多生成几份地址试试即可。

+

➍ Your request could not be completed at this time 怎么办?

+

答:应该是地址生成器生成的号码有问题,电话是 xxx-xxx-xxx 的正常,而 +1xxx-xxx-xxx 就不行。解决方法就是去掉号码开头的”1”或者”+1”即可。

+

➎ Cannot be created at this time 怎么办?

+

答:切换成 4G、5G、或者换个浏览器、或者用电脑注册,或者次日再试试。

+

➏ 注册成功后,如何二次修改美区 Apple ID 的地址、姓名等信息?

+

答:进入美国苹果官网,拉到底部找到 manage your apple id,登录后即可修改,不懂英文的同学可借助翻译。

+

如果以上回答仍然无法解决你的问题,那建议用百度、必应、知乎等搜索工具去寻找解决方法。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\347\276\216\345\233\242\345\215\232\345\256\242\347\254\224\350\256\260/index.html" "b/\347\276\216\345\233\242\345\215\232\345\256\242\347\254\224\350\256\260/index.html" index e69de29bb2..135a555ae5 100644 --- "a/\347\276\216\345\233\242\345\215\232\345\256\242\347\254\224\350\256\260/index.html" +++ "b/\347\276\216\345\233\242\345\215\232\345\256\242\347\254\224\350\256\260/index.html" @@ -0,0 +1,779 @@ + + + + + + + + + + + + 美团技术博客笔记 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 美团技术博客笔记 +

美团技术博客笔记

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前言

我最近读了美团技术团队 (meituan.com)的博客,发现其中的文章涵盖了各种有关技术的话题,对我的学习和职业发展都有很大帮助。因此,我写了一篇总结文章,记录了其中的要点和对工作的启示,希望能为其他技术从业者带来一些灵感和启示。感谢美团技术团队的博客作者提供如此丰富和有价值的资源。

+

数据脱敏

文章

美团数据仓库-数据脱敏

+

总结

数据脱敏需要根据具体的业务需求和数据安全等级进行梳理和设计,美团根据自身特有的业务场景和数据安全级别划分(绝密、高保密、保密、可公开),主要从“高保密”等级的敏感数据开始进行梳理,并确定了四种基本类型的脱敏方案。

+

针对数据脱敏,需要遵循两个原则:

+
    +
  • 保留数据有意义的信息
  • +
  • 防止黑客进行破解
  • +
+

常用的方法有:

+
    +
  • 替换
  • +
  • 重排
  • +
  • 加密
  • +
  • 截断
  • +
  • 掩码
  • +
  • 日期偏移取整
  • +
+

扩展

具体的实现方案有:

+
    +
  • 整合Mybatis插件,在查询的时候针对特定的字段进行脱敏
  • +
  • 整合Jackson,在序列化阶段对特定字段进行脱敏
  • +
  • 基于Sharding Sphere实现数据脱敏
  • +
  • 使用正则表达式或字符串替换等方式对数据进行处理
  • +
  • 使用加密算法或哈希函数等方式对数据进行转换
  • +
+

关键词提示

文章

搜索引擎关键字智能提示的一种实现

+

总结

这篇文章介绍了基于solrcloud实现的商家搜索关键字智能提示的方案,主要包括以下几个方面:

+
    +
  • 关键字收集:通过日志文件记录用户每次检索使用的所有检索串,并统计出每个关键字的频率。
  • +
  • 汉字转拼音:使用pinyin4j组件把汉字转换成拼音,并提取出拼音缩写,支持多音字全排列。
  • +
  • Trie树 + TopK算法:使用Trie树存储大量字符串,根据前缀匹配查询候选词,并使用hashmap统计和堆排序找出TopK热门词。
  • +
  • 方案优化:使用分布式缓存和异步更新机制提高系统性能和可用性。
  • +
+

MySQL慢查询优化

文章

MySQL索引与慢查询优化

+

内容

这篇文章是从开发工程师的角度来介绍数据库索引的原理和如何优化慢查询的。文章主要包括以下几个方面:

+
    +
  • 建立合适的索引,利用最左前缀匹配原则,避免全表扫描。
  • +
  • 优化查询语句,减少不必要的条件和连接,使用预编译语句,避免排序和分组操作。
  • +
  • 调整数据库参数,根据数据量和访问频率设置合理的缓存大小和过期时间。
  • +
  • 分析慢查询日志,定位问题点,使用explain命令查看执行计划。
  • +
+

MySQL中的事务与锁

文章

Innodb中的事务隔离级别和锁的关系

+

内容

本文主要介绍了MySQL中InnoDB引擎的事务隔离级别和加锁机制,以及如何避免或解决不可重复读和幻读的问题。以下是一些要点和总结:

+
    +
  • 事务的四种隔离级别分别是未提交读、已提交读、可重复读和串行化,它们对应不同的并发问题和性能开销。
  • +
  • InnoDB默认使用可重复读作为隔离级别,它可以通过多版本并发控制(MVCC)来保证同一个事务内多次读取同一个数据时看到的是一致的。
  • +
  • 不可重复读是指在同一个事务内,多次查询某个数据返回的结果不一致,通常是因为其他事务修改了该数据。不可重复读可以通过行锁来避免,即在第一次读取数据后就加上共享锁,阻止其他事务对该数据进行修改。
  • +
  • 幻读是指在同一个事务内,两次查询返回的结果集不一致,通常是因为其他事务插入或删除了部分数据。幻读无法通过行锁来避免,因为行锁只能锁住已经存在的数据,而不能阻止新数据的插入。幻读可以通过间隙锁(gap lock)或表锁来避免,即在第一次查询时就加上间隙锁或表锁,阻止其他事务对该范围或表进行插入或删除操作。
  • +
  • 间隙锁是指对记录之间的空隙加上锁定,而不包括记录本身。例如,在索引上对(10,20)之间的空隙加上间隙锁,则可以防止其他事务在这个范围内插入新记录。
  • +
  • 表锁是指对整张表加上锁定,它会影响所有对该表的操作。例如,在没有索引的情况下执行where条件查询时,就会给整张表加上表锁。
  • +
+

以下是一些相关的解决方案或经验:

+
    +
  • 在设计数据库时尽量给常用字段添加索引,以提高查询效率和减少全表扫描和全表锁定。
  • +
  • 在编写SQL语句时尽量使用主键或唯一键作为条件,以减少扫描范围和加锁范围。
  • +
  • 在执行长时间运行的事务时尽量避免修改大量数据或频繁访问热点数据,以减少死锁和超时的风险。
  • +
  • 在选择合适的隔离级别时要根据业务需求和性能考虑权衡,并且尽量使用session级别而不是全局级别来设置隔离级别。
  • +
+

性能优化模式

文章

性能优化模式

+

内容

本文主要是为了解决由以下三种情况所造成的性能问题:1. 日益增长的用户数量,2. 日渐复杂的业务,3. 急剧膨胀的数据。针对这些问题,提供了一些优化方案和思路

+

设计原则:

+
    +
  • 最小可用原则
  • +
  • 经济原则
  • +
  • 代码复用原则
  • +
  • 奥卡姆剃刀原则
  • +
+

性能恶化模式:

+
    +
  • 长请求阻塞反模式
  • +
  • 多次请求杠杆反模式
  • +
  • 反复缓存反模式
  • +
+

性能优化模式:

+
    +
  • 水平分割模式
  • +
  • 垂直分割模式
  • +
  • 恒变分离模式
  • +
  • 数据局部性模式
  • +
  • 避免蚊子大炮模式
  • +
  • 实施离线分离模式
  • +
  • 降级模式
  • +
+

缓存的应用

文章

Cache应用中的服务过载案例研究

+

内容

    +
  • 服务过载是外部请求对系统的访问量突然激增,造成请求堆积,服务不可用,最终导致系统崩溃。
  • +
  • 缓存在现代系统中使用广泛,但也可能引发服务过载的隐患,例如缓存故障、缓存击穿、缓存雪崩等。
  • +
  • 缓存模式分为基于超时和基于刷新两种,超时模式是指缓存中的数据在到达一定时间后失效,刷新模式是指缓存中的数据在到达一定时间后触发更新操作。
  • +
  • 刷新方式分为同步和异步两种,同步刷新是指获取缓存数据的线程等待更新操作完成后返回,异步刷新是指获取缓存数据的线程直接返回旧数据,由另一个线程执行更新操作。
  • +
  • 预防和恢复服务过载的技术手段包括优化缓存命中率、限流、降级、熔断等。
  • +
+

Java锁

文章

不可不说的Java“锁”事

+

内容

本文介绍了Java中不同类型和特性的锁,以及它们的使用场景和实现原理。

+

乐观锁与悲观锁

+
    +
  • 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据时判断之前有没有别的线程更新了这个数据。
  • +
  • 悲观锁认为自己在使用数据时一定有别的线程来修改数据,所以在获取数据时会先加锁,确保数据不会被别的线程修改。
  • +
  • 乐观锁适合读操作多的场景,悲观锁适合写操作多的场景。
  • +
+

CAS算法

+
    +
  • CAS(Compare And Swap)算法是实现乐观锁最常用的方式。
  • +
  • CAS需要提供三个值:内存值V、旧值A、新值B。当且仅当内存值V等于旧值A时,才将内存值更新为新值B。
  • +
  • CAS通过CPU指令保证原子性和可见性。
  • +
  • CAS可能存在ABA问题和自旋开销问题。
  • +
+

自旋锁

+
    +
  • 自旋锁是一种让线程在获取不到锁时不立即阻塞,而是进行一定次数或时间的循环尝试。
  • +
  • 自旋锁可以减少线程切换带来的开销,提高性能。
  • +
  • JDK 6中引入了自适应自旋锁(Adaptive Spinning),根据前一次在同一个锁上自旋时间及持有者状态来决定是否进行自旋。
  • +
+

synchronized关键字

+
    +
  • synchronized是Java中最基本和常用的悲观锁机制。
  • +
  • synchronized可以修饰代码块或方法,保证同一时间只有一个线程执行该段代码。
  • +
  • synchronized依赖于Java对象头中Mark Word里存储的状态位信息来实现加解锁操作。
  • +
+

日志记录

文章

可视化全链路日志追踪

+

内容

    +
  • 介绍了业务追踪的概念和需求,以及传统的ELK方案和分布式会话跟踪方案的局限性。
  • +
  • 提出了一种可视化全链路日志追踪的新方案,通过定义业务逻辑链路,将业务执行的日志以业务链路为载体进行高效组织和串联,并支持业务执行现场的还原和可视化查看。
  • +
  • 介绍了新方案在大众点评内容平台的落地情况,包括技术架构、实现方式、使用效果等。
  • +
+

分库分表

文章

大众点评订单系统分库分表实践

+

内容

    +
  • 如何根据业务需求和数据量选择合适的分库分表方案和规则,以提高数据库性能和可扩展性。
  • +
  • 如何利用一致性哈希算法实现数据的均匀分布和动态扩容。
  • +
  • 如何设计订单号生成的方案,以满足唯一性、自带分库规则、易于查询等要求。
  • +
  • 如何使用PUMA同步不同维度的订单数据,以支持多角色的查询需求。
  • +
  • 如何避免复杂查询和join操作,以减少数据库压力和保证数据一致性。
  • +
+

Java NIO解析

文章

Java NIO浅析

+

内容

这篇文章主要介绍了NIO(Non-blocking I/O)模型的原理和优势,以及如何使用Java的API实现NIO的服务端和客户端程序。对于你的项目,如果你需要处理高并发和大量连接的I/O问题,那么NIO模型可能会给你带来一些启发。你可以参考以下几点:

+
    +
  • NIO模型是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。它可以让一个线程管理多个连接的状态,而不需要为每个连接创建一个线程。
  • +
  • NIO模型利用事件驱动的方式处理I/O,当一个连接就绪时才进行读写操作,避免了无效的等待和阻塞。
  • +
  • NIO模型可以提高系统的性能和资源利用率,但也有一些陷阱和难点,比如缓冲区管理、编码解码、异常处理等。
  • +
  • 使用NIO做网络编程并不容易,推荐使用成熟的NIO框架,如Netty,MINA等。它们解决了很多NIO的陷阱,并屏蔽了操作系统的差异,有较好的性能和编程模型。
  • +
+

服务容错

文章

服务容错模式

+

内容

这篇文章主要介绍了服务容错的基本原则和一些常用的模式,如超时模式、重试模式、限流模式、令牌桶算法等,以及在美团点评的工程实践中的应用。对于你的项目,如果你需要设计一个分布式服务调用的系统,那么这篇文章可能会给你一些启发和指导,让你能够避免一些常见的问题,提高系统在故障发生时的存活能力。你可以参考文章中提到的一些模式和工具,根据自己的业务场景和需求选择合适的方案。

+

分布式队列编程

文章

分布式队列编程:模型、实战

+

内容

这篇文章是关于分布式队列编程模型的介绍和应用,它可能对你的项目有以下几方面的启发:

+
    +
  • 你可以了解什么是分布式队列编程模型,它包含三类角色:发送者、分布式队列和接收者,以及它们之间的交互方式。
  • +
  • 你可以学习如何根据实际需求进行分布式队列编程建模,考虑通讯的同步性、异步性、单向性、双向性等因素。
  • +
  • 你可以参考一些实际的分布式队列编程案例,如工单创建、数据同步、流式计算等,看看它们是如何利用分布式队列架构来解决问题的。
  • +
  • 你可以比较分布式队列编程模型和其他通讯模型,如RPC、RESTful、Ajax等,以及它们各自的优缺点。
  • +
+

架构演变

文章

美团外卖订单中心的演进

+

内容

这篇文章介绍了美团外卖订单系统的演进过程,从早期的单应用架构到现在的分布式可扩展架构,以及在每个阶段遇到的业务特征、挑战和解决方案。如果你的项目也涉及外卖或O2O领域,这篇文章可能会对你有一些启发,比如:

+
    +
  • 如何根据业务需求和规模选择合适的架构模式,比如单应用、微服务、异步化等。
  • +
  • 如何利用分布式事务、消息队列、缓存等技术来保证系统的高性能、高可用、高稳定。
  • +
  • 如何进行系统拆分、重构和优化,以应对业务变化和增长。
  • +
+

这些启发都是基于文章中提到的美团外卖订单系统的实践经验。

+

消息队列设计

文章

消息队列设计精要

+

内容

这篇文章讨论了消息队列的设计要点及其用例。它探讨了设计消息队列时需要考虑的重要方面,并参考了许多成熟消息队列的重要想法。文章首先解释了什么时候你需要一个消息队列,然后从零开始分析设计一个消息队列时需要考虑到的问题,如RPC、高可用性、顺序和重复消息、可靠投递、消费关系解析等。它还分析了以Kafka为代表的pull模型所具备的优点。最后是一些高级主题,如用批量/异步提高性能、pull模型的系统设计理念、存储子系统的设计等。

+

如果您正在设计或实现一个消息队列,或者您想更多地了解消息队列如何工作及其用例,那么这篇文章可能会为您的项目提供灵感。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\350\205\276\350\256\257CDN\344\274\230\345\214\226github\345\233\276\345\272\212\350\256\277\351\227\256/index.html" "b/\350\205\276\350\256\257CDN\344\274\230\345\214\226github\345\233\276\345\272\212\350\256\277\351\227\256/index.html" index e69de29bb2..cd36efeac2 100644 --- "a/\350\205\276\350\256\257CDN\344\274\230\345\214\226github\345\233\276\345\272\212\350\256\277\351\227\256/index.html" +++ "b/\350\205\276\350\256\257CDN\344\274\230\345\214\226github\345\233\276\345\272\212\350\256\277\351\227\256/index.html" @@ -0,0 +1,651 @@ + + + + + + + + + + + + 使用腾讯CDN优化github图床访问 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 使用腾讯CDN优化github图床访问 +

使用腾讯CDN优化github图床访问

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

背景

​ GitHub 图床本身比较好用,但由于其在国内没有节点,导致速度较慢。而使用jsdelivr加速依旧会被墙,无法解决国内正常访问博客图片的问题,为了解决以上问题,我打算使用腾讯CDN加速github图床

+

准备

+

教程

开启图床的pages

打开图床的仓库,按图示配置个人域名

+

image-20220929183214956

+

腾讯CDN设置加速

腾讯CDN新账号一般都会赠送流量.我们就可以白嫖啦!!!

+

image-20220929183320182

+

按图示步骤,进入域名添加

+

image-20220929183417574

+

按如图配置,加速域名填写自己的域名,源站地址填写 仓库名+github.io

+

image-20220929183537579

+

前往HTTPS配置添加SSL证书,可以自行申请免费证书

+

image-20220929183638619

+

最后完成域名添加即可!

+

测试是否成功CDN加速

访问图片

可以在picGo中使用当前的github图床上传图片,然后使用域名+仓库文件夹名+文件名的形式访问图片.如

+

image-20220929183912160

+

image-20220929183904884

+

使用站长工具ping检测

地址: https://ping.chinaz.com/

+

若测试出来的IP都是腾讯云的,则说明加速成功,并且访问图片后,在腾讯云的CDN管理中,可以看到有流量消耗!

+

image-20220929184031104

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\350\247\202\347\234\213Netflix\346\214\207\345\215\227/index.html" "b/\350\247\202\347\234\213Netflix\346\214\207\345\215\227/index.html" index e69de29bb2..60123c382e 100644 --- "a/\350\247\202\347\234\213Netflix\346\214\207\345\215\227/index.html" +++ "b/\350\247\202\347\234\213Netflix\346\214\207\345\215\227/index.html" @@ -0,0 +1,629 @@ + + + + + + + + + + + + 2023年在中国观看Netflix(网飞奈飞)指南 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 2023年在中国观看Netflix(网飞奈飞)指南 +

2023年在中国观看Netflix(网飞奈飞)指南

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

下面是一篇基于Chatgpt生成的软件介绍文档,你还不知道Chatgpt是啥?快看看我以前的文章吧!

+

介绍文案

​ 如果你是一个电视剧迷,那么你一定不能错过这款软件。这款软件叫做春秋岁月,它可以让你在手机、平板电脑上随时随地观看各种电视剧,包括奈飞新出的剧集。

+

​ 软件提供了海量的电视剧内容,包括国内外热门剧集、奈飞出品的剧集等。另外,它还提供了追剧提醒功能,让你不会错过任何一集。此外,它还有自动缓存功能,让你可以在没有网络的情况下观看已缓存的剧集。

+

​ 软件的界面简洁易用,让你可以轻松找到你想看的剧集。它还提供了多种播放模式,让你可以根据自己的喜好调整播放速度和画质。

+

​ 总的来说,该软件是一款不可多得的电视剧软件,让你可以随时随地追剧,并且提供了丰富的功能和优质的播放

+

image-20230104143244507

+

获取方式

春秋岁月:https://apps.apple.com/cn/app/id1659647017
+解锁方法:点击右上角设置图标,在【意见反馈】中输入【tk999】,然后右上角发送,再完全关闭应用后台,重启即可加载出完整的影视内容。
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\350\256\251\344\275\240\345\277\253\351\200\237\346\216\214\346\217\241\345\221\275\344\273\244\350\241\214\346\212\200\345\267\247\347\232\204\347\245\236\345\231\250/index.html" "b/\350\256\251\344\275\240\345\277\253\351\200\237\346\216\214\346\217\241\345\221\275\344\273\244\350\241\214\346\212\200\345\267\247\347\232\204\347\245\236\345\231\250/index.html" index e69de29bb2..ce675769e6 100644 --- "a/\350\256\251\344\275\240\345\277\253\351\200\237\346\216\214\346\217\241\345\221\275\344\273\244\350\241\214\346\212\200\345\267\247\347\232\204\347\245\236\345\231\250/index.html" +++ "b/\350\256\251\344\275\240\345\277\253\351\200\237\346\216\214\346\217\241\345\221\275\344\273\244\350\241\214\346\212\200\345\267\247\347\232\204\347\245\236\345\231\250/index.html" @@ -0,0 +1,635 @@ + + + + + + + + + + + + 让你快速掌握命令行技巧的神器 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 让你快速掌握命令行技巧的神器 +

让你快速掌握命令行技巧的神器

+
+ + + + +
+ +
+ +
+ +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

介绍

image-20230301201531956

+

​ 如果你正在学习编程或者经常需要使用命令行工具,那么你一定会发现,命令行操作对于初学者来说是一件十分困难的事情。命令行工具的指令繁多,使用方式复杂,很容易就会让人产生学习难度。为了帮助初学者快速掌握各种常用的命令行工具和技巧,eg这个GitHub项目应运而生。

+

​ eg是一个用于学习命令行操作的交互式命令行工具,它可以帮助用户快速学习并掌握各种常用的命令行工具和技巧。这个项目使用Python编写,可以在Windows、Linux和MacOS等多个平台上运行。eg项目提供了大量的命令行示例和教程,可以帮助初学者快速入门。

+

github地址:https://github.com/srsudar/eg

+

使用

eg-demo

+

首先,你的Linux服务器上需要安装Python环境,可以参考:安装Python

+

然后,只需要执行如下命令,即可安装完成.

+
pip install eg
+
+

安装完成之后,你就可以使用eg查找帮助文档啦!

+

image-20230301201352796

+

最后

​ 总之,eg是一个非常有用的工具,它可以帮助你快速掌握命令行技巧,提高你的工作效率。如果你是一名编程爱好者或者需要经常使用命令行工具的人,那么你一定不能错过这个神器。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\350\257\267\346\261\202\350\267\250\345\237\237\347\232\204\345\244\204\347\220\206\346\226\271\346\263\225/index.html" "b/\350\257\267\346\261\202\350\267\250\345\237\237\347\232\204\345\244\204\347\220\206\346\226\271\346\263\225/index.html" index e69de29bb2..c5576b1a9d 100644 --- "a/\350\257\267\346\261\202\350\267\250\345\237\237\347\232\204\345\244\204\347\220\206\346\226\271\346\263\225/index.html" +++ "b/\350\257\267\346\261\202\350\267\250\345\237\237\347\232\204\345\244\204\347\220\206\346\226\271\346\263\225/index.html" @@ -0,0 +1,762 @@ + + + + + + + + + + + + 请求跨域的三种解决方法 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 请求跨域的三种解决方法 +

请求跨域的三种解决方法

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

前言

Springboot跨域问题,是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点

+
    +
  • 跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/ java等其它环境
  • +
  • 跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
  • +
  • 之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。
  • +
+

+

一.什么是CORS

CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

+

它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持CORS、并且判断Origin通过的话,就会允许XMLHttpRequest发起跨域请求。

+

CORS Header

    +
  • Access-Control-Allow-Origin: http://www.xxx.com
  • +
  • Access-Control-Max-Age:86400
  • +
  • Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, DELETE
  • +
  • Access-Control-Allow-Headers: content-type
  • +
  • Access-Control-Allow-Credentials: true
  • +
+

含义解释:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CORS Header属性解释
Access-Control-Allow-Origin允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求
Access-Control-Max-Age设置在86400秒不需要再发送预校验请求
Access-Control-Allow-Methods设置允许跨域请求的方法
Access-Control-Allow-Headers允许跨域请求包含content-type
Access-Control-Allow-Credentials设置允许Cookie
+

二、SpringBoot跨域请求处理方式

方法一、直接采用SpringBoot的注解@CrossOrigin

简单粗暴的方式,Controller层在需要跨域的类或者方法上加上该注解即可

+
/**
+ * Created with IDEA
+ *
+ * @Description xxxx控制层
+ * @Version 1.0
+ */
+@RestController
+@CrossOrigin
+@RequestMapping("/situation")
+public class SituationController extends PublicUtilController {
+ 
+    @Autowired
+    private SituationService situationService;
+    // log日志信息
+    private static Logger LOGGER = Logger.getLogger(SituationController.class);
+ 
+ 
+ 
+}
+
+

但每个Controller都得加,太麻烦了,怎么办呢,加在Controller公共父类(PublicUtilController)中,所有Controller继承即可。

+
/**
+ * Created with IDEA
+ *
+ * @Description
+ * @Version 1.0
+ */
+@CrossOrigin
+public class PublicUtilController {
+ 
+    /**
+     * 公共分页参数整理接口
+     *
+     * @param currentPage
+     * @param pageSize
+     * @return
+     */
+    public PageInfoUtil proccedPageInfo(String currentPage, String pageSize) {
+ 
+        /* 分页 */
+        PageInfoUtil pageInfoUtil = new PageInfoUtil();
+        try {
+            /*
+             * 将字符串转换成整数,有风险, 字符串为a,转换不成整数
+             */
+            pageInfoUtil.setCurrentPage(Integer.valueOf(currentPage));
+            pageInfoUtil.setPageSize(Integer.valueOf(pageSize));
+        } catch (NumberFormatException e) {
+        }
+        return pageInfoUtil;
+    }
+ 
+}
+
+

方法二、处理跨域请求的Configuration

增加一个配置类,CrossOriginConfig.java。继承WebMvcConfigurerAdapter或者实现WebMvcConfigurer接口,其他都不用管,项目启动时,会自动读取配置。

+
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+ 
+/**
+ * AJAX请求跨域
+ */
+@Configuration
+public class CorsConfig extends WebMvcConfigurerAdapter {
+    static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" };
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
+    }
+
+

方法三、采用过滤器(filter)的方式

同方法二加配置类,增加一个CORSFilter 类,并实现Filter接口即可,其他都不用管,接口调用时,会过滤跨域的拦截。

+
 @Component
+public class CORSFilter implements Filter {
+ 
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        HttpServletResponse res = (HttpServletResponse) response;
+        res.addHeader("Access-Control-Allow-Credentials", "true");
+        res.addHeader("Access-Control-Allow-Origin", "*");
+        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
+        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
+            response.getWriter().println("ok");
+            return;
+        }
+        chain.doFilter(request, response);
+    }
+    @Override
+    public void destroy() {
+    }
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+}
+
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\351\225\234\345\203\217\347\275\221\347\253\231/index.html" "b/\351\225\234\345\203\217\347\275\221\347\253\231/index.html" index e69de29bb2..926ffbc04d 100644 --- "a/\351\225\234\345\203\217\347\275\221\347\253\231/index.html" +++ "b/\351\225\234\345\203\217\347\275\221\347\253\231/index.html" @@ -0,0 +1,820 @@ + + + + + + + + + + + + Z-Library等镜像网站 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ Z-Library等镜像网站 +

Z-Library等镜像网站

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+
+

由于网络限制,不一定所有网址都能在您所在的位置访问。

+

科研爱分享,知识无边界,让我们一起消除科学的障碍。

+
+

ZLibrary 镜像网站

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Zlib所有种子1可用
Zlib所有种子2可用
Anna’s Archive可用
zbook.lol可用
Hallow Lib可用
zlib.app可用
Ylibrary可用
Bookpan可用
PDF Drive可用
Find Books可用
Freembook可用
Lorefree可用
+

Google 谷歌学术镜像

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
https://scholar.lanfanshu.cn可用
https://sc.panda321.com可用
https://xueshu.lanfanshu.cn可用
https://deepsearch.cc可用
https://scholar.sb250.gq可用
https://www.scidown.cn/go可用
https://0-scholar-google-com.brum.beds.ac.uk可用
+

Sci-Hub 镜像网站

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
https://sci-hub.wf可用
https://sci-hub.ee可用
https://sci-hub.st可用
https://sci-hub.ren可用
https://sci-hub.cat可用
https://sci-hub.yt可用
https://sci-hub.se可用
https://sci-hub.ru可用
https://sci-hub.mksa.top可用
https://sci-hub.et-fine.com可用
https://sci-hub.hkvisa.net可用
https://sci-hub.3800808.com可用
https://scihub.unblockit.mov可用
+

GitHub 镜像网站

+ + + + + + + + + + + + + + + + + + + + + + +
https://gitclone.com可用
https://ghproxy.com可用
https://github.ur1.fun可用
https://github.ur1.fun可用
+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\351\233\205\350\231\216EGADS\351\241\271\347\233\256\346\272\220\347\240\201\350\247\243\346\236\220/index.html" "b/\351\233\205\350\231\216EGADS\351\241\271\347\233\256\346\272\220\347\240\201\350\247\243\346\236\220/index.html" index e69de29bb2..d26f26b2d0 100644 --- "a/\351\233\205\350\231\216EGADS\351\241\271\347\233\256\346\272\220\347\240\201\350\247\243\346\236\220/index.html" +++ "b/\351\233\205\350\231\216EGADS\351\241\271\347\233\256\346\272\220\347\240\201\350\247\243\346\236\220/index.html" @@ -0,0 +1,964 @@ + + + + + + + + + + + + 雅虎EGADS项目源码解析 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 雅虎EGADS项目源码解析 +

雅虎EGADS项目源码解析

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

EGADS是什么?

EGADS(Extendible Generic Anomaly Detection System)是雅虎开源的一个大规模时间序列异常检测项目。它的目标是提供一个通用的、可扩展的、易于使用的框架,用于检测各种类型的时间序列数据中的异常点。

+

时间序列数据是指按照时间顺序排列的一组数据点,它们通常反映了某个变量随着时间的变化趋势。例如,某个城市每天的气温、某个网站每小时的访问量、某个股票每分钟的价格等,都是时间序列数据的例子。

+

异常检测是指在时间序列数据中寻找那些与正常情况下有很大偏差的数据点,它们通常反映了某种异常或突变的情况。例如,某个城市某天的气温突然升高或降低、某个网站某小时的访问量突然增加或减少、某个股票某分钟的价格突然上涨或下跌等,都是异常检测的例子。

+

EGADS如何工作?

Egads(Extensible Generic Anomaly Detection System)是一个用于自动检测大规模时间序列数据中的异常的开源Java包。它主要由两个模块构成,一个是时间序列建模模块(TMM),另一个是异常检测模块(ADM)。

+

时间序列建模模块(TMM): 是用于预测时间序列数据中每个点的正常值的,它可以使用不同的算法来建立不同类型的时间序列模型,例如周期性最近邻(PNN)、奥林匹克模型(OlympicModel)、指数平滑(ExponentialSmoothing)等。

+

异常检测模块(ADM): 是用于比较时间序列数据中每个点的实际值和预期值,并根据一定的阈值来判断是否为异常点的,它也可以使用不同的算法来实现不同类型的异常检测模型,例如极低密度模型(ExtremeLowDensityModel)、K西格玛模型(KSigmaModel)、自适应核密度变点检测器(AdaptiveKernelDensityChangePointDetector)等。

+

源码阅读

image-20230908111142894

+

我们时间序列以OlympicModel,异常检测KSigmaModel为例.

+

在阅读源码前,我们先理解几个概念:

+

1.EGADS的预测是针对过去时间数据的预测,而不是对未来时间数据的预测.

+

2.时间序列数据示例如下,实际数据可能是按秒或者分钟为单位时间间隔的数据

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
日期气温
1月1日10℃
1月2日12℃
1月3日11℃
1月4日9℃
1月5日13℃
1月6日8℃
1月7日15℃
1月8日10℃
1月9日12℃
1月10日11℃
1月11日9℃
1月12日13℃
1月13日8℃
1月14日15℃
+

3.项目中的config.ini配置文件中的配置至关重要.不要忽略!预测数据与期望数据的长度尽量保持一致,具体原因可以查看predict方法的实现.

+

开始工作

我们直接从Egads这个类入手,可以发现这个方法中,主要是通过传入的配置类sample_config.ini和数据集sample_input.csv构建了一个Properties对象和一个InputProcessor对象!

+

然后在processInput方法中,实现下面几个功能

+
    +
  • createTimeSeries: 将传入的csv转换为一个或多个时间序列对象

    +
  • +
  • ProcessableObjectFactory.create(ts, p)

    +
      +
    • buildTSModel : 构建时间序列模型
    • +
    • buildAnomalyModel : 构建异常检测模型
    • +
    • new DetectAnomalyProcessable : 用于执行异常检测的过程的对象
    • +
    +
    +

    这一步使用到了配置文件中的几个属性:

    +

    PERIOD:指定时间序列数据的周期性,即相邻两个数据点之间的时间差

    +

    TS_MODEL:指定的时间序列模型

    +

    AD_MODEL:指定的异常检测模型

    +
    +
  • +
  • po.process(): 这个方法就是数据预测与异常检测的具体实现

    +
  • +
+
public void process() throws Exception {
+
+        // Resetting the models
+        ma.reset();
+
+        // Training the model with the whole metric
+        ma.train();
+
+        // Finding the expected values
+        ArrayList<TimeSeries.DataSequence> list = ma.forecast(
+            ma.metric.startTime(), ma.metric.lastTime());
+
+        // For each model's prediction in the ModelAdapter
+        for (TimeSeries.DataSequence ds : list) {
+            // Reseting the anomaly detectors
+            ad.reset();
+
+            // Unsupervised tuning of the anomaly detectors
+            ad.tune(ds);
+
+            // Detecting anomalies for each anomaly detection model in anomaly detector
+            anomalyList = ad.detect(ad.metric, ds);
+
+            // Writing the anomalies to AnomalyDB
+            if (config.getProperty("OUTPUT") != null && config.getProperty("OUTPUT").equals("ANOMALY_DB")) {
+                for (Anomaly anomaly : anomalyList) {
+                    // TODO: Batch Anomaly Process.
+                }
+            } else if (config.getProperty("OUTPUT") != null && config.getProperty("OUTPUT").equals("GUI")) {
+                GUIUtils.plotResults(ma.metric.data, ds, anomalyList, config);
+            } else if (config.getProperty("OUTPUT") != null && config.getProperty("OUTPUT").equals("PLOT")) {
+                for (Anomaly anomaly : anomalyList) {
+                    System.out.print(anomaly.toPlotString());
+                }
+            } else {
+                for (Anomaly anomaly : anomalyList) {
+                    System.out.print(anomaly.toPerlString());
+                }
+            }
+        }
+    }
+
+

数据预测

        // Resetting the models
+        ma.reset();
+
+        // Training the model with the whole metric
+        ma.train();
+
+        // Finding the expected values
+        ArrayList<TimeSeries.DataSequence> list = ma.forecast(
+            ma.metric.startTime(), ma.metric.lastTime());
+
+
    +
  • reset(): 重置模型相关属性

    +
  • +
  • train():用于训练一个基于周期性最近邻(PNN)的时间序列模型

    +
    public void train(TimeSeries.DataSequence data) {
    +        this.data = data;
    +        
    +        int n = data.size();
    +        
    +        java.util.Arrays.sort(baseWindows);
    +        java.util.Arrays.sort(timeShifts);
    +        float precision = (float) 0.000001;
    +        
    +        for (int i = 0; i < n; i++) {
    +            float baseVal = Float.POSITIVE_INFINITY;
    +            float tmpbase = (float) 0.0;
    +            
    +            // Cannot compute the expected value if the time-series
    +            // is too short preventing us form getting the reference
    +            // window.
    +            if ((i - baseWindows[0]) < 0) {
    +                model.add(data.get(i).value);
    +                continue;
    +            }
    +            
    +            // Attempt to shift the time-series.
    +            for (int w = 0; w < baseWindows.length; w++) {
    +                for (int j = 0; j < timeShifts.length; j++) {
    +                    if (timeShifts[j] == 0) {
    +                        tmpbase = computeExpected(i, baseWindows[w]);
    +                        if ((Math.abs(tmpbase - data.get(i).value) - Math.abs(baseVal - data.get(i).value)) < precision) {
    +                            baseVal = tmpbase;
    +                        }
    +                    } else {
    +                        if (i + timeShifts[j] < n) {
    +                            tmpbase = computeExpected(i + timeShifts[j], baseWindows[w]);
    +                            if ((Math.abs(tmpbase - data.get(i).value) - Math.abs(baseVal - data.get(i).value)) < precision) {
    +                                baseVal = tmpbase;
    +                            }
    +                        }
    +                        if (i - timeShifts[j] >= 0) {
    +                            tmpbase = computeExpected(i - timeShifts[j], baseWindows[w]);
    +                            if ((Math.abs(tmpbase - data.get(i).value) - Math.abs(baseVal - data.get(i).value)) < precision) {
    +                                baseVal = tmpbase;
    +                            }
    +                        }
    +                    }
    +                }
    +            }
    +            model.add(baseVal);
    +        }
    +        
    +        initForecastErrors(model, data);
    +        
    +        logger.debug(getBias() + "\t" + getMAD() + "\t" + getMAPE() + "\t" + getMSE() + "\t" + getSAE() + "\t" + 0 + "\t" + 0);
    +    }
    +
    +
    +

    它是OlympicModel类的一个成员方法,它需要一个参数,就是时间序列数据(data)。它会根据类中的一些参数,例如基准窗口(baseWindows),时间偏移(timeShifts),动态参数(dynamicParameters)等,来计算每个数据点的预期值,并将结果存储在一个列表(model)中。然后,它会调用initForecastErrors方法来初始化预测误差指标,并打印出来。具体的实现步骤如下:

    +
      +
    • 首先,将时间序列数据(data)赋值给类中的一个属性(this.data),以便后续使用。
    • +
    • 然后,获取时间序列数据的长度(n),并对基准窗口(baseWindows)和时间偏移(timeShifts)进行排序,以便后续遍历。
    • +
    • 接着,定义一个精度值(precision),用于比较浮点数是否相等。
    • +
    • 然后,遍历时间序列数据中的每个数据点(i),初始化一个最大的浮点数(baseVal)作为预期值,和一个临时变量(tmpbase)用于存储计算结果。
    • +
    • 接着,判断当前数据点是否有足够长的过去数据来计算预期值,如果没有,则直接使用实际值作为预期值,并添加到列表(model)中,然后跳过当前循环,继续下一个数据点。
    • +
    • 然后,尝试将时间序列数据向前或向后移动一定的时间偏移(timeShifts),并从移动后的数据中取出与当前数据点相同位置的值,作为过去的数据。对于每个过去的数据,调用computeExpected方法来计算预期值,并将结果赋值给临时变量(tmpbase)。然后,比较临时变量(tmpbase)和最大浮点数(baseVal)与实际值的差的绝对值,如果前者更小,则将临时变量(tmpbase)赋值给最大浮点数(baseVal),表示找到了更好的预期值。
    • +
    • 最后,将最大浮点数(baseVal)作为最终的预期值,并添加到列表(model)中。
    • +
    • 最后,调用initForecastErrors方法来初始化预测误差指标,并打印出来。
    • +
    +
    +
  • +
  • forecast(): 这个方法主要是获取指定时间的预期值

    +
  • +
+

异常检测

 // Reseting the anomaly detectors
+            ad.reset();
+
+            // Unsupervised tuning of the anomaly detectors
+            ad.tune(ds);
+
+            // Detecting anomalies for each anomaly detection model in anomaly detector
+            anomalyList = ad.detect(ad.metric, ds);
+
+
    +
  • ad.reset(): 重置检测模型的属性

    +
  • +
  • ad.tune(ds): 它会根据类中的一些参数,例如误差指标(aes),自动灵敏度(sDAutoSensitivity)等,来计算每个数据点的观测值和预期值之间的误差指标,并根据K西格玛原则来确定每种误差指标的阈值,并将结果存储在一个哈希表(threshold)中。

    +
        public void tune(DataSequence observedSeries, DataSequence expectedSeries) throws Exception {
    +        HashMap<String, ArrayList<Float>> allErrors = aes.initAnomalyErrors(observedSeries, expectedSeries);
    +
    +        for (int i = 0; i < (aes.getIndexToError().keySet()).size(); i++) {
    +            // Add a new error metric if the error metric has not been
    +            // defined by the user.
    +            if (!threshold.containsKey(aes.getIndexToError().get(i))) {
    +                Float[] fArray = (allErrors.get(aes.getIndexToError().get(i))).toArray(new Float[(allErrors.get(aes.getIndexToError().get(i))).size()]);
    +                threshold.put(aes.getIndexToError().get(i), AutoSensitivity.getKSigmaSensitivity(fArray, sDAutoSensitivity));
    +            }
    +        }
    +    }
    +
    +
    +
      +
    • 首先,调用initAnomalyErrors方法来初始化所有误差指标的列表,并将结果存储在一个哈希表(allErrors)中。initAnomalyErrors方法会遍历每个数据点,调用computeErrorMetrics方法来计算该点的观测值和预期值之间的误差指标,并将结果存储在一个数组(errors)中。然后,将这些数组按照不同的误差指标分别添加到对应的列表中,并返回这些列表组成的哈希表。
    • +
    • 然后,遍历每种误差指标(i),判断是否已经有用户定义的阈值(threshold),如果没有,则调用getKSigmaSensitivity方法来根据K西格玛原则计算该种误差指标的阈值,并将结果存储在哈希表(threshold)中。getKSigmaSensitivity方法会根据自动灵敏度(sDAutoSensitivity)和误差指标列表(fArray)来计算该种误差指标的均值和标准差,并返回均值加上K倍标准差作为阈值。
    • +
    +
    +
  • +
  • ad.detect(ad.metric, ds):用于检测时间序列数据中的异常点

    +
    public IntervalSequence detect(DataSequence observedSeries,
    +            DataSequence expectedSeries) throws Exception {
    +        
    +        // At detection time, the anomaly thresholds shouldn't all be 0.
    +        Float threshSum = (float) 0.0;
    +        for (Map.Entry<String, Float> entry : this.threshold.entrySet()) {
    +            threshSum += Math.abs(entry.getValue());
    +        }
    +        
    +        // Get an array of thresholds.
    +        Float[] thresholdErrors = new Float[aes.getErrorToIndex().size()];
    +        for (Map.Entry<String, Float> entry : this.threshold.entrySet()) {
    +            thresholdErrors[aes.getErrorToIndex().get(entry.getKey())] = Math.abs(entry.getValue());
    +        }
    +        
    +        IntervalSequence output = new IntervalSequence();
    +        int n = observedSeries.size();
    +        
    +        for (int i = 0; i < n; i++) {
    +            Float[] errors = aes.computeErrorMetrics(expectedSeries.get(i).value, observedSeries.get(i).value);
    +            logger.debug("TS:" + observedSeries.get(i).time + ",E:" + arrayF2S(errors) + ",TE:" + arrayF2S(thresholdErrors) + ",OV:" + observedSeries.get(i).value + ",EV:" + expectedSeries.get(i).value);
    +            if (observedSeries.get(i).value != expectedSeries.get(i).value &&
    +                threshSum > (float) 0.0 &&
    +                isAnomaly(errors, threshold) == true &&
    +                (isDetectionWindowPoint(maxHrsAgo, windowStart, observedSeries.get(i).time, observedSeries.get(0).time) ||
    +                (maxHrsAgo == 0 && i == (n - 1)))) {
    +                output.add(new Interval(observedSeries.get(i).time,
    +                                        i,
    +                                        errors,
    +                                        thresholdErrors,
    +                                        observedSeries.get(i).value,
    +                                        expectedSeries.get(i).value));
    +            }
    +        }
    +        return output;
    +    }
    +
    +
    +
      +
    • 首先,创建一个空的区间序列对象(output),用于存储异常点的信息。
    • +
    • 然后,计算阈值(threshold)中所有绝对值的和(threshSum),用于判断是否有有效的阈值。
    • +
    • 接着,将阈值(threshold)中的每个绝对值存储在一个数组(thresholdErrors)中,方便后续使用。
    • +
    • 然后,遍历观测值序列(observedSeries)中的每个数据点(i),调用computeErrorMetrics方法来计算该点的观测值和预期值之间的误差指标,并存储在一个数组(errors)中。打印出该点的时间戳、误差指标、阈值、观测值和预期值等信息。
    • +
    • 接着,判断该点是否满足以下条件,如果满足,则表示该点是一个异常点,并将其添加到区间序列对象(output)中。条件如下:
        +
      • 观测值不等于预期值;
      • +
      • 阈值之和大于0;
      • +
      • 误差指标超过阈值;
      • +
      • 该点在检测窗口内,或者检测窗口为0且该点是最后一个数据点。
      • +
      +
    • +
    • 最后,返回区间序列对象(output),其中包含了检测出来的异常点的信息。
    • +
    +
    +
  • +
+

实战

针对实际需求,我个人采取的方法是使用数据库中存储的历史数据训练模型,然后使用MQ接收实时数据,这里需要注意的一个点是训练数据集需要足够,还有一个点就是在调用ad.tune方法时,需要传入历史数据来获取合适的误差指标,否则就需要自己指定这些指标的值.否则就会导致无法检测异常点!

+
// Cannot compute the expected value if the time-series
+// is too short preventing us form getting the reference
+// window.
+if ((i - baseWindows[0]) < 0) {
+    model.add(data.get(i).value);
+    continue;
+}
+
+

关于配置中各个参数的说明

+
DETECTION_WINDOW_START_TIME: 检测窗口的起始时间,如果设置为0,则从最大允许的异常时间(MAX_ANOMALY_TIME_AGO)开始。
+MAX_ANOMALY_TIME_AGO:  最大允许检测到的异常时间点离当前的时间跨度,用于控制检测到的异常的新鲜度。
+AGGREGATION:  时间序列聚合参数,用于控制降采样比例,如果设置为1则不进行降采样。
+OP_TYPE:  操作类型,包括检测异常、更新模型、转换输入等。
+TS_MODEL:  时间序列建模模型类型,如自动预测、指数平滑、奥林匹克模型等。
+AD_MODEL:  异常检测模型类型,如极低密度、K西格玛、自适应核密度等。
+SIMPLE_THRESHOLD_TYPE:  简单阈值模型的类型,如自适应最大最小方差、自适应K西格玛敏感度等。
+INPUT:  输入来源,标准输入or CSV文件。
+OUTPUT:  输出目标,标准输出、异常数据库、图形界面等。
+THRESHOLD:  异常检测模型的阈值参数。
+TIME_SHIFTS:  奥林匹克模型的时间偏移参数。
+BASE_WINDOWS:  奥林匹克模型的基准窗口大小参数。
+PERIOD:  时间序列的周期性参数。
+WINDOW_SIZE:  朴素模型的窗口大小参数。
+AUTO_SENSITIVITY_ANOMALY_PCNT:  预期的异常百分比。
+AUTO_SENSITIVITY_SD:  聚类标准差参数。
+ALPHA/BETA/GAMMA:  三指数平滑模型的平滑因子。
+THRESHOLD mape#10,mase#15: 表示设置了两组阈值,mape代表平均百分比误差(Mean Absolute Percentage Error)。这个阈值表示当预测值和实际值的差异超过10%时,会被判定为异常。这个阈值表示当预测误差超过实际值的15%时,会被判定为异常。也就是说,EGADS在进行异常检测时,会计算每个数据点的mape和mase。如果mape超过10%或者mase超过15%,则会将该点判定为一个异常点。
+
+

最后

上面就是关于EGADS的源码解读。我希望这篇文章能够帮助您了解EGADS的工作原理和使用方法。如果您有任何问题或建议,请随时与我联系。谢谢!😊

+

参考

kdd2015.pdf (yimg.com)

+

雅虎时序异常检测框架EGADS

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/\351\235\242\345\220\221AI\345\210\235\345\255\246\350\200\205\347\232\204\346\225\231\347\250\213/index.html" "b/\351\235\242\345\220\221AI\345\210\235\345\255\246\350\200\205\347\232\204\346\225\231\347\250\213/index.html" index e69de29bb2..0f07a45bb7 100644 --- "a/\351\235\242\345\220\221AI\345\210\235\345\255\246\350\200\205\347\232\204\346\225\231\347\250\213/index.html" +++ "b/\351\235\242\345\220\221AI\345\210\235\345\255\246\350\200\205\347\232\204\346\225\231\347\250\213/index.html" @@ -0,0 +1,746 @@ + + + + + + + + + + + + 面向AI初学者的教程 - 一只会飞的旺旺-IT技术分享 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + 一只会飞的旺旺 +
+
+
+
+ +
+
+ + 一只会飞的旺旺 + +
+
+
文章107
+
标签76
+
分类8
+
+ + + + + +
+
+
+
+
+ +
+ 面向AI初学者的教程 +

面向AI初学者的教程

+
+ + + + +
+ + + +
+ + + + +
+ +
小卖铺上新啦!ChatGPT账号大甩卖! 一键直达
+
+ + + + + +
+

什么是人工智能

人工智能是让计算机具有智能行为的科学,比如让计算机能够做一些人类擅长做的事情。我们可以用图灵测试来判断一个系统是否具有智能。

+

主要有两种方法来实现人工智能:

+
    +
  • 自上而下(符号推理):从人类专家提取知识规则,用计算机表示并推理
  • +
  • 自下而上(神经网络):模拟人脑,从数据中学习知识
  • +
+

知识表示与专家系统

知识表示是将人类知识转化为计算机可用形式的技术。专家系统是利用知识表示来模拟人类专家解决问题的能力的系统。

+

专家系统主要包含:

+
    +
  • 问题内存:存储当前问题信息
  • +
  • 知识库:存储领域知识
  • +
  • 推理引擎:根据问题内存和知识库进行推理
  • +
+

例如一个笔记本电脑推荐系统,它可以通过询问用户需求,并应用知识库中的规则,来推荐合适的笔记本电脑。

+

感知器模型

感知器是一种神经网络模型,可以用来识别不同的图形或数字。

+

它包含一个权重向量,可以根据输入计算输出。通过训练可以调整权重,使感知器识别不同模式。

+

例如一个感知器可以识别手写数字,输入是一个图像,输出是判断结果。通过不断训练,感知器可以适应不同样式的手写数字。

+

神经网络模型

神经网络是模仿人脑结构的计算模型,可以从数据中学习各种特征和规律。

+

它由多个单元组成,单元之间通过权重相连。权重通过梯度下降算法训练。

+

例如一个判断奇偶数的神经网络,输入是一个数字,隐藏层对数字的每位求和,输出层根据结果判断奇偶。通过训练可以提高判断准确度。

+

张量表示文本

张量是多维数组,可以表示各种数据,包括文本。

+

表示文本的方法:

+
    +
  • 字符级:每个字符映射为一个数字
  • +
  • 单词级:每个单词映射为一个数字
  • +
  • 词袋模型:无序表示
  • +
+

例如单词”apple”可以表示为[1, 2, 3, 4, 5]这样的向量。

+

需要用更高级的模型处理上下文和顺序信息。

+

计算机视觉

计算机视觉让计算机从图像中提取信息,如OpenCV

+

应用:

+
    +
  • 图像处理:滤镜、美颜
  • +
  • 人脸检测:信息提取
  • +
  • 特征检测:边缘、形状等
  • +
+

例如可以用OpenCV来处理一本盲文书籍的图像,或者检测视频中的运动。

+

卷积神经网络

卷积神经网络是处理图像的神经网络。

+

它通过卷积滤波器提取各级特征图,然后分类。

+

卷积层提取特征,池化层减少参数,全连接层分类。

+

例如识别MNIST手写数字,输入图像,输出类别概率。

+

卷积网络广泛用于图像处理任务。

+

迁移学习

迁移学习是将一个任务的知识迁移到另一个相关任务。

+

例如先在ImageNet上训练模型提取特征,然后在新的数据集上训练分类器。

+

好处:

+
    +
  • 节省时间和资源
  • +
  • 提高准确度
  • +
  • 应对少量或低质数据
  • +
+

例如用迁移学习进行猫狗识别,先提取通用图像特征,然后微调分类器。

+

自编码器

自编码器可以学习数据的有效特征编码,主要用于无标签数据。

+

它包含编码器和解码器,可以重建数据。

+

应用:

+
    +
  • 降维
  • +
  • 去噪
  • +
  • 超分辨率
  • +
  • 生成新数据
  • +
+

例如,编码器把图片编码为向量,解码器再解码为图片,实现压缩和重构。

+

生成对抗网络

生成对抗网络包含生成器和判别器,可以生成新的数据,如艺术创作。

+

生成器创建数据,判别器判断真伪。两者对抗训练。

+

可以做风格转换,把内容图片与风格图片结合。

+

例如,生成器生成猫图片,判别器判断真假,重复训练until生成图片逼真。

+

物体检测

物体检测可以识别图像中的物体及位置。

+

主要方法:

+
    +
  • 基于区域:先生成区域,再分类
  • +
  • 单次检测:一次完成检测
  • +
+

主要模型:R-CNN、Fast R-CNN、Faster R-CNN、YOLO等。

+

例如,Faster R-CNN使用注意力机制,端到端地完成检测。

+

图像分割

图像分割将图片中的目标提取出来。

+
    +
  • 语义分割:分类每个像素
  • +
  • 实例分割:区分同类不同实例
  • +
+

使用编码器-解码器结构的全卷积网络,输出与输入大小相同的掩膜。

+

例如,输入图片,输出每个像素的语义标签,实现分割。

+

递归神经网络

递归神经网络可以处理序列数据。

+

它根据当前输入和前一状态计算当前状态,实现顺序处理。

+

应用:

+
    +
  • 文本分类
  • +
  • 语音识别
  • +
  • 机器翻译
  • +
  • 文本生成
  • +
+

例如,输入一个句子,输出句子的语义向量表示。

+

词嵌入

词嵌入将词映射为密集向量,表示语义信息。

+

方法:

+
    +
  • 连续词袋:根据上下文预测词
  • +
  • 连续跳跃:根据词预测上下文
  • +
+

例如,单词”apple”映射为[0.1, 0.3, -0.2, …]这样的向量。

+

词嵌入是自然语言处理的重要技术。

+

命名实体识别

命名实体识别可以从文本中提取实体,如人名、地点等。

+

方法:使用循环神经网络或变换器,对词进行BIO标注。

+

应用:聊天机器人、知识图谱等。

+

例如,识别句子中的人名、城市名等关键词。

+

变换器

它使用编码器-解码器结构。

+

编码器输出向量表示输入序列特征。

+

解码器根据编码器输出生成目标序列。

+

例如,编码器编码”I love you”,解码器解码”我爱你”。

+

GPT

GPT是一个预训练语言模型,可以生成逼真文本。

+

它通过预测下一个词来进行文本生成任务的通用训练。

+

可用于文本编辑、问答、翻译等任务。

+

例如,GPT可以根据提示接着写一篇故事。

+

遗传算法

遗传算法用于搜索、优化和机器学习,模拟自然进化。

+

基本思路:

+
    +
  1. 编码表示问题的解
  2. +
  3. 评价解的适应度
  4. +
  5. 进行选择、交叉和变异产生新解
  6. +
  7. 重复直到满意
  8. +
+

例如,用遗传算法求解背包问题。

+

强化学习

强化学习让智能体通过环境交互学习最优策略。

+

目标是最大化累积回报。

+

方法:策略梯度、Actor-Critic等。

+

例如,让计算机学习玩游戏直到胜利。

+

多智能体系统

多智能体系统由多个智能体协作完成复杂任务。

+

每个智能体有自己的目标和行为规则。

+

可以组成更智能的整体。

+

应用:游戏、模拟、自动化等。

+

例如,一个旅游推荐系统包含查询机票、酒店、景点的智能体。

+ +
+ + + +
+
+
+ 微信支付码 + 微信支付 +
+
+ 支付宝支付码 + 支付宝支付 +
+
+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +